Chuyển đến nội dung chính (Skip to content)
Mục lục bài viết
Linux Essentials

Linux Essentials 5.4: Các Thư mục và Tệp đặc biệt

Linux Essentials 5.4: Các Thư mục và Tệp đặc biệt

Hiểu thư mục tạm và tệp đặc biệt Linux; thử mktemp, sticky bit, hard link và symlink, kiểm tra đích sau di chuyển và phân biệt liên kết với backup.

Một đường dẫn có thể là chỗ tạm hoặc một tên tham chiếu

Bạn lưu kết quả chẩn đoán trong /tmp, khởi động lại máy rồi không thấy tệp. Ở tình huống khác, bạn di chuyển một shortcut và nó ngừng mở báo cáo. Cả hai đều liên quan tới cách filesystem tổ chức tên và vòng đời dữ liệu, nhưng cần cách kiểm tra khác nhau.

Bài này giúp bạn chọn nơi chứa dữ liệu tạm, dùng mktemp, giải thích sticky bit và phân biệt hard link với symbolic link. Bạn cần hiểu đường dẫn, owner/group và rwx. Khung tham chiếu là 010-160 mục 5.4, trang in 416–434, trang PDF 425–443; đối chiếu 015.4 của 010-200, cập nhật 23/10/2026.

Lab dùng Ubuntu 26.04.1 LTS ARM64 trong container không mạng ngoài và không volume host. ln, readlink thuộc uutils coreutils 0.10.0. Chúng ta kiểm thử quyền của thư mục tạm và hành vi liên kết, chưa chạy thử reboot hoặc dịch vụ dọn dẹp systemd. Đừng coi tồn tại của tệp trong container là bằng chứng chính sách lưu giữ của máy công ty.

/tmp, /var/tmp và /run phục vụ những vòng đời khác nhau

Vị trí Mục đích thường gặp Không nên giả định
/tmp Tệp tạm ngắn hạn Sẽ còn sau reboot hoặc sau tác vụ khác
/var/tmp Tệp tạm có thể cần qua reboot Được giữ vô hạn như kho lưu trữ
/run Dữ liệu runtime của hệ thống/dịch vụ Là thư mục làm việc chung của mọi người

Theo hướng dẫn systemd về thư mục tạm, nơi chứa tạm có thể dùng bộ nhớ qua tmpfs và có chính sách dọn theo tuổi. Cách mount và dung lượng phụ thuộc máy. Chọn nơi đặt tệp lớn cần xem tài nguyên thực tế, không coi /tmp là một vùng đĩa vô hạn.

/var/tmp thường phục vụ dữ liệu tạm bền hơn qua lần khởi động, song vẫn có thể bị dọn. Dữ liệu phải lưu lâu dài cần vị trí được ứng dụng hoặc tổ chức quy định cùng cơ chế sao lưu. Một tệp “chưa bị xóa” không biến vị trí tạm thành nơi lưu báo cáo đáng tin cậy.

Trong hệ thống dùng systemd, tmpfiles.d mô tả việc tạo, điều chỉnh và dọn nhiều loại đối tượng theo cấu hình. Không áp một con số ngày dọn mặc định lên mọi Ubuntu. Distro, quản trị viên và cấu hình dịch vụ có thể thay đổi hành vi. Lab này không kích hoạt lệnh cleanup trên cây hệ thống.

/run chứa dữ liệu sống cùng hệ thống đang chạy, chẳng hạn socket hay thông tin runtime. /run/user liên quan môi trường runtime từng người dùng khi được cung cấp. Không tự đặt dữ liệu cá nhân vào /run bằng root chỉ để vượt lỗi quyền; hãy dùng giao diện mà chương trình hỗ trợ.

Tạo vùng tạm riêng thay vì đoán tên

Trong shell người dùng của lab:

scratch=$(mktemp -d)
ls -ld "$scratch"
printf '%s\n' 'LPI temporary fixture' > "$scratch/result.txt"

Kết quả mong đợi ở lab là thư mục riêng mode 700, người dùng khác không liệt kê được. mktemp -d tạo và trả tên vùng làm việc; không thay nó bằng tên cố định như /tmp/report có thể đã tồn tại hoặc thuộc chương trình khác. Tên khó đoán cũng không thay quyền truy cập đúng.

Giữ biến trong dấu nháy kép khi dùng đường dẫn. Khi xong, chỉ dọn đối tượng của chính phép thử:

rm "$scratch/result.txt"
rmdir "$scratch"

rmdir ở đây chỉ thành công nếu thư mục rỗng. Nếu còn tệp, đọc lại danh sách và xác nhận chúng thuộc tác vụ trước khi xử lý. Không dùng wildcard rộng để “dọn toàn bộ tmp”. Một chương trình khác có thể vẫn cần dữ liệu đang nằm ở đó.

Lab kiểm tra một tài khoản khác bị từ chối khi liệt kê thư mục riêng. Điều này kiểm chứng quyền của fixture, chưa kiểm chứng mã hóa dữ liệu hoặc chống đọc bởi quản trị viên có quyền cao. Không ghi credential thật vào bài tập chỉ vì mode là 700.

Chọn nơi lưu và quyền theo vòng đời; không dọn cây tạm bằng wildcard rộng.
Hình 1. Chọn nơi lưu và quyền theo vòng đời; không dọn cây tạm bằng wildcard rộng. Mở hình để xem chi tiết.

Sticky bit hạn chế xóa tên, không bảo vệ mọi nội dung

Một thư mục dùng chung có thể cần cho nhiều người tạo tệp. Nếu chỉ cho ghi/search rộng, người dùng có thể tác động mục tên của nhau. Theo inode(7), sticky bit bổ sung điều kiện cho việc xóa hoặc đổi tên, liên quan owner của tệp, owner thư mục và quyền đặc biệt của tiến trình. Nó không thay thế rwx của nội dung.

Trên thư mục, chữ t ở vị trí execute của other biểu thị sticky cùng với x; chữ T biểu thị sticky khi vị trí x ấy không đặt. 1777 gồm bit sticky và quyền 777. Đừng dùng con số này cho mọi thư mục cá nhân: nó phù hợp với một số kiểu thư mục chung, không phải mặc định bảo vệ tài liệu.

Bộ kiểm thử tạo một thư mục mẫu 1777 thuộc root, rồi cho tài khoản A tạo tệp. Tài khoản B không xóa được tên tệp của A. Khi tệp cố ý có mode 666, B vẫn ghi thêm được nội dung. Sau đó A xóa được tệp của mình. Đây là lý do sticky bit không được mô tả là “ngăn người khác sửa tệp”.

Phép thử nằm trong container trống; không sửa mode của /tmp thật. Một thư mục dùng chung cần được quản lý cả quyền nội dung, giới hạn dung lượng và vòng đời. Nếu người dùng báo dữ liệu bị sửa, kiểm tra quyền tệp cùng bối cảnh, không chỉ nhìn chữ t trên thư mục.

Theo link(2), hard link tạo một tên khác cho tệp hiện có. Hai tên cùng tham chiếu một đối tượng; thay nội dung qua một tên được quan sát qua tên còn lại. Chúng không phải hai bản dữ liệu độc lập.

Manual ln GNU mô tả cú pháp tương ứng; lab xác nhận bằng uutils. Trong thư mục riêng của lab:

links=$(mktemp -d)
printf '%s\n' 'first' > "$links/report.txt"
ln "$links/report.txt" "$links/second.txt"
ls -li "$links/report.txt" "$links/second.txt"
printf '%s\n' 'changed' >> "$links/second.txt"
cat "$links/report.txt"

Mong đợi hai tên có cùng số inode trong cùng filesystem và nội dung có cả first lẫn changed. Số inode chỉ có ý nghĩa trong phạm vi filesystem tương ứng. Bộ kiểm thử so cả device và inode, đồng thời xác nhận link count của fixture là 2.

Hard link thông thường không băng qua ranh giới filesystem và không được dùng như cách người dùng tạo liên kết tùy ý tới thư mục. Nếu cần tham chiếu một cây thư mục khác, symbolic link thường phù hợp hơn về mặt tên, nhưng vẫn cần hiểu quyền và đích.

Xóa một tên của fixture chưa làm tên còn lại mất dữ liệu. Theo cơ chế unlink, việc giải phóng còn liên quan số link và file descriptor đang mở. Không suy ra “xóa tên là xóa an toàn nội dung trên thiết bị”. Hard link cũng không phải backup: sự thay đổi hoặc hỏng dữ liệu của cùng đối tượng ảnh hưởng mọi tên.

Theo symlink(7), symbolic link tham chiếu một tên đường dẫn; đích có thể chưa tồn tại. Nó có thể trỏ tới thư mục hoặc vượt filesystem. Các quyền của đích và đường đi vẫn cần được kiểm tra; hình thức lrwxrwxrwx của symlink thông thường trên Linux không có nghĩa mọi người đọc được nội dung đích.

Tiếp tục fixture vừa tạo:

mkdir "$links/sub"
ln -s ../report.txt "$links/sub/current"
ls -ld "$links/sub/current"
readlink "$links/sub/current"
cat "$links/sub/current"

readlink trả chuỗi ../report.txt. Đường dẫn tương đối này được hiểu từ thư mục chứa link là sub, nên đi lên một cấp tới report.txt. Nó không được diễn giải từ thư mục hiện tại của terminal mỗi lần mở link.

Bây giờ chỉ di chuyển link:

mv "$links/sub/current" "$links/moved"
readlink "$links/moved"
cat "$links/moved"

Trong fixture mới, nó trỏ sai và cat thất bại vì đường dẫn đích không có. Link vẫn tồn tại, gọi là dangling link. Trên một cây khác, việc di chuyển cũng có thể làm link trỏ tới một tệp khác đang có sẵn, nên “vẫn mở được” chưa chứng minh đúng nội dung.

Hard link thêm tên cho cùng đối tượng; symlink lưu đường dẫn có thể thay đổi ý nghĩa.
Hình 2. Hard link thêm tên cho cùng đối tượng; symlink lưu đường dẫn có thể thay đổi ý nghĩa. Mở hình để xem chi tiết.

Chọn đường dẫn tương đối hay tuyệt đối theo yêu cầu

Đích tuyệt đối neo vào đường dẫn từ root của môi trường. Đích tương đối giữ quan hệ giữa các thành phần khi cả cây được di chuyển cùng nhau. Không có quy tắc rằng luôn dùng tuyệt đối thì link sẽ hoạt động mãi: tệp đích, mount hoặc môi trường vẫn có thể thay đổi.

Nếu đóng gói một cây lab để chuyển chỗ, liên kết tương đối bên trong cây có thể hữu ích. Nếu cần chỉ một nơi cố định do hệ thống quản lý, đường dẫn tuyệt đối có thể rõ hơn. Trước khi tạo, xác định thứ gì được phép thay đổi và kiểm tra sau thao tác chuyển cây.

Xóa symlink bằng đúng tên, không thêm dấu slash ở cuối để vô tình đổi cách công cụ hiểu đối tượng. Trong fixture:

rm "$links/moved"
rm "$links/report.txt"
cat "$links/second.txt"

Tên symlink bị xóa, còn second.txt vẫn đọc được dữ liệu của hard link. Không dùng các tên đã có của bạn để lặp phép thử. Với thao tác đệ quy hoặc công cụ backup, phải đọc chính sách theo symlink của công cụ; không suy từ hành vi cat sang mọi lệnh.

Nhận diện các bit khác mà chưa bật thử

Ngoài sticky, setuid và setgid được biểu diễn bằng các bit đặc biệt. Setuid trên executable có thể ảnh hưởng danh tính hiệu lực; setgid trên thư mục thường liên quan nhóm kế thừa của đối tượng mới. Hiệu lực phụ thuộc kiểu đối tượng, filesystem, mount và policy. Chữ s hay S trên ls cần được đọc cùng vị trí quyền tương ứng.

Bài chỉ giới thiệu để đọc kết quả quyền, không yêu cầu bật setuid cho script, copy binary đặc quyền hoặc đổi bit trên công cụ hệ thống. Các thao tác ấy vượt mục tiêu lab và cần đánh giá riêng. Sticky bit trên thư mục được kiểm thử trực tiếp, còn thực thi setuid/setgid chưa được nghiệm thu ở bài này.

Tự kiểm tra và giới hạn

  1. /var/tmp có phải nơi lưu backup vô hạn không? Không, cần xem policy và nơi lưu bền vững được quy định.
  2. Sticky bit có chặn ghi nội dung tệp 666 không? Không theo phép thử cơ bản của bài.
  3. Hard link có giúp phục hồi nội dung trước khi sửa không? Không, các tên cùng tham chiếu đối tượng.
  4. Vì sao di chuyển symlink có thể đổi đích? Đích tương đối phụ thuộc vị trí link.

Tiêu chí lab gồm quyền thư mục tạm riêng, sticky unlink theo owner, hard link cùng device/inode và nội dung, dangling symlink sau di chuyển, cùng khả năng đọc qua hard link còn lại. Nội dung và hình được biên soạn độc lập theo giáo trình; chưa kiểm thử reboot, tmpfiles cleanup, recovery dữ liệu hoặc policy trên production.

Bài liên quan trong bộ LPI

Tìm hiểu thêm