Hệ Thống File và FHS: Mọi Thứ Là File

K
Kai··6 min read

Ở Bài 1, ls / cho ta thấy một loạt thư mục. Bài này giải thích chúng: cây thư mục Linux được tổ chức theo một chuẩn (FHS), mỗi thư mục có vai trò rõ ràng. Ta cũng làm rõ một câu hay nghe: "trong Linux, mọi thứ là file".

Cây thư mục bắt đầu từ một gốc

Khác Windows (có nhiều ổ C:, D:...), Linux chỉ có một cây thư mục duy nhất, bắt đầu từ thư mục gốc /. Mọi thứ — ổ đĩa, thiết bị, file — đều nằm đâu đó trong cây này. Theo hier(7), / là "thư mục gốc, nơi cả cây bắt đầu".

Cách bố trí các thư mục tuân theo FHS (Filesystem Hierarchy Standard) — một chuẩn để mọi distro sắp xếp file nhất quán. Nhờ nó, bạn biết tìm file cấu hình ở /etc, log ở /var/log trên bất kỳ distro nào.

/
├── bin   → usr/bin    chương trình cơ bản (ls, cp...)
├── boot               file khởi động: nhân Linux, bootloader
├── dev                file thiết bị (đĩa, terminal...) — "mọi thứ là file"
├── etc                cấu hình hệ thống, riêng của máy này
├── home               thư mục nhà của các user thường
├── lib   → usr/lib    thư viện chia sẻ
├── proc               thông tin tiến trình & nhân (hệ thống file ảo)
├── root               thư mục nhà của user root
├── run                dữ liệu runtime (pid, socket...)
├── sbin  → usr/sbin   lệnh quản trị hệ thống
├── sys                thông tin & điều khiển nhân (ảo)
├── tmp                file tạm, có thể bị xóa bất cứ lúc nào
├── usr                phần mềm & dữ liệu chia sẻ, chỉ-đọc
│   ├── bin            chương trình chính (phần lớn lệnh nằm đây)
│   ├── lib            thư viện
│   └── local          phần mềm cài thêm tại máy này
└── var                dữ liệu thay đổi: log, cache, spool...

Vài thư mục bạn sẽ đụng nhiều nhất

Trích mô tả chính thức từ hier(7), kèm khi nào bạn quan tâm:

  • /etc — "các file cấu hình riêng của máy". Đây là nơi bạn sửa cấu hình dịch vụ (nginx, ssh...). Khi cần đổi cách một phần mềm chạy, thường vào /etc.
  • /var — "các file có thể thay đổi kích thước, như spool và log". Quan trọng nhất: /var/log chứa log hệ thống. Khi gỡ lỗi server, bạn vào đây.
  • /usr — "dữ liệu chia sẻ, chỉ-đọc". /usr/bin chứa phần lớn các lệnh; /usr/local chứa phần mềm bạn tự cài.
  • /home — "thư mục nhà của các user". Mỗi user thường có /home/<tên>; riêng root là /root.
  • /tmp — "file tạm, có thể bị xóa không báo trước". Đừng để gì quan trọng ở đây.
  • /proc/sys — hệ thống file ảo: chúng không nằm trên đĩa, mà do nhân Linux tạo ra để phơi thông tin tiến trình/phần cứng dưới dạng file. Nói ở mục sau.
  • /dev — "file đặc biệt, trỏ tới thiết bị vật lý". Đĩa, terminal, thiết bị... đều là file ở đây.

"Mọi thứ là file" nghĩa là gì

Đây là một trong những ý tưởng nền của Linux/Unix. Không chỉ tài liệu văn bản mới là file — Linux biểu diễn gần như mọi thứ dưới dạng file để bạn đọc/ghi bằng các lệnh quen thuộc.

Thiết bị là file. Xem trong /dev:

ls -l /dev/null /dev/zero /dev/random
crw-rw-rw- 1 root root 1, 3 ... /dev/null
crw-rw-rw- 1 root root 1, 8 ... /dev/random
crw-rw-rw- 1 root root 1, 5 ... /dev/zero

Ký tự c ở đầu nghĩa là "character device" — một thiết bị, không phải file thường. /dev/null là "hố đen" (ghi gì vào cũng biến mất — ta dùng nhiều ở Bài 6), /dev/zero tuôn ra số 0 vô tận, /dev/random tuôn ra dữ liệu ngẫu nhiên. Bạn đọc/ghi chúng như file.

Thông tin tiến trình và phần cứng là file. Hệ thống file ảo /proc cho bạn đọc thông tin nhân như đọc file:

head -3 /proc/cpuinfo      # thông tin CPU
ls /proc/self/             # thông tin tiến trình hiện tại
processor : 0
BogoMIPS  : 48.00
...

/proc/cpuinfo không tồn tại trên đĩa — nhân sinh ra nó mỗi khi bạn đọc. Tương tự, /proc/<pid>/ chứa mọi thông tin của tiến trình có PID đó (nhớ Bài 2 của series Docker: ta đã xem /proc/self/ns/ để thấy namespaces). Đây là lý do "mọi thứ là file" mạnh: chỉ cần biết cat, ls, grep, bạn xem được cả tiến trình lẫn phần cứng.

Loại file: đọc ký tự đầu của ls -l

ls -l cho biết loại của mỗi mục qua ký tự đầu tiên:

ls -l /
lrwxrwxrwx ... bin -> usr/bin     ← l = symbolic link
drwxr-xr-x ... etc                ← d = directory (thư mục)
dr-xr-xr-x ... proc               ← d = directory
crw-rw-rw- ... /dev/null          ← c = character device
-rw-r--r-- ... /etc/hostname      ← - = file thường
  • - file thường
  • d thư mục
  • l liên kết tượng trưng (symlink)
  • c / b thiết bị (character / block)

Để ý bin -> usr/bin: /bin chỉ là một symlink trỏ tới /usr/bin (các distro hiện đại gộp lại). Phần rwx... còn lại là quyền — chủ đề Bài 7.

Lệnh file đoán loại nội dung một file (file /etc/hostname). Ubuntu tối giản không cài sẵn; thêm bằng apt-get install -y file (Bài 11).

Di chuyển: đường dẫn tuyệt đối và tương đối

Có hai cách chỉ tới một file/thư mục:

  • Tuyệt đối — bắt đầu từ gốc /: /usr/bin/ls. Luôn trỏ đúng một nơi, dù bạn đang đứng đâu.
  • Tương đối — tính từ thư mục hiện tại: bin/ls (nếu đang ở /usr).

Vài ký hiệu quan trọng:

  • . thư mục hiện tại
  • .. thư mục cha (lùi một cấp)
  • ~ thư mục nhà của bạn (/root hoặc /home/<tên>)
  • / thư mục gốc

Thử:

cd /usr/share    # đi tới (đường dẫn tuyệt đối)
pwd              # /usr/share
cd ..            # lùi một cấp
pwd              # /usr
cd ./bin         # đi vào bin (tương đối, . là thư mục hiện tại)
pwd              # /usr/bin
cd ~             # về thư mục nhà

cd không kèm gì cũng đưa bạn về ~. cd - quay lại thư mục vừa rời.

🧹 Dọn dẹp

Bài này chỉ đọc/di chuyển, không tạo file, nên không có gì để dọn. Giữ lab linuxlab cho bài sau.

Tổng kết

Linux có một cây thư mục duy nhất từ /, sắp theo chuẩn FHS: /etc cho cấu hình, /var/log cho log, /usr/bin cho lệnh, /home cho user, /proc/dev là hệ thống file ảo phơi thông tin/thiết bị. Triết lý "mọi thứ là file" cho phép bạn đọc cả CPU, tiến trình, thiết bị bằng các lệnh file quen thuộc. Và bạn di chuyển trong cây bằng đường dẫn tuyệt đối/tương đối với ., .., ~.

Bạn đã biết file nằm đâu và xem được chúng. Bài 3 học cách tạo, sao chép, di chuyển, xóa và tìm file — những thao tác bạn làm hằng ngày.