FHS — Tiêu chuẩn cấu trúc thư mục

FHS — Tiêu chuẩn cấu trúc thư mục

Mở terminal lần đầu, nhiều người gõ cd / rồi ls — và thấy một rừng thư mục lạ: bin, etc, proc, sys, var… Không giống Windows chút nào. Không có ổ C hay ổ


Mở terminal lần đầu, nhiều người gõ cd / rồi ls — và thấy một rừng thư mục lạ: bin, etc, proc, sys, var… Không giống Windows chút nào. Không có ổ C hay ổ D. Tất cả nằm chung trong một cây thư mục duy nhất bắt đầu từ /.

Đây không phải ngẫu nhiên. Mỗi thư mục trong Linux tồn tại vì một lý do cụ thể, được chuẩn hóa bởi Filesystem Hierarchy Standard (FHS). Hiểu được bản đồ này, bạn sẽ biết ngay file config nằm ở đâu, log được lưu chỗ nào, và tại sao /proc lại là công cụ troubleshooting mạnh nhất trên Linux.

FHS — Tiêu chuẩn cấu trúc thư mục

FHS là thỏa thuận chung giữa các distro Linux: dù bạn dùng Ubuntu, Debian, Rocky hay Arch, cấu trúc thư mục đều tuân theo cùng một quy ước. Điều này có nghĩa là kỹ năng navigate trên Ubuntu hoạt động ngay trên server Rocky Linux của production.

Toàn bộ filesystem bắt đầu từ root directory, ký hiệu là / (dấu gạch chéo). Không nhầm với /root — đó là home directory của user root. / là gốc của toàn bộ cây thư mục.

Bản đồ các thư mục quan trọng

/etc — Trái tim cấu hình hệ thống

/etc chứa toàn bộ file cấu hình của hệ thống và các ứng dụng. Tên viết tắt từ “Editable Text Configuration” (theo quy ước hiện đại). Đây là thư mục bạn sẽ vào nhiều nhất khi quản trị server.

/etc/
├── passwd          # Danh sách user (không chứa password thật)
├── shadow          # Password hash (chỉ root đọc được)
├── group           # Danh sách group
├── sudoers         # Ai được quyền sudo gì
├── hostname        # Tên máy
├── hosts           # DNS tĩnh (map domain → IP)
├── resolv.conf     # DNS server
├── fstab           # Cấu hình mount point tự động khi boot
├── crontab         # Scheduled tasks hệ thống
├── ssh/
│   └── sshd_config # Cấu hình SSH server
├── nginx/          # Cấu hình Nginx
└── systemd/        # Unit files của systemd

Quy tắc vàng: Trước khi sửa bất kỳ file nào trong /etc, backup trước:

$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

/var — Dữ liệu thay đổi liên tục

/var (variable) chứa dữ liệu thay đổi thường xuyên trong quá trình hệ thống chạy: log, cache, database, mail queue, lock file.

/var/
├── log/            # Log hệ thống và ứng dụng
│   ├── syslog      # Log chính (Ubuntu/Debian)
│   ├── messages    # Log chính (RHEL/Rocky)
│   ├── auth.log    # Đăng nhập, sudo, SSH
│   ├── kern.log    # Kernel messages
│   └── nginx/      # Access/error log của Nginx
├── www/            # Web root (thường đặt website ở đây)
├── lib/            # State data của ứng dụng
├── cache/          # Cache của các package manager
├── spool/          # Print queue, mail queue
└── run/            # PID files, socket files

Trong DevSecOps, /var/log là nơi đầu tiên bạn kiểm tra khi có sự cố. Bài 8 của series này sẽ đi sâu vào log management.

/proc — Cửa sổ vào kernel đang chạy

/proc là một virtual filesystem — không tồn tại trên ổ đĩa. Kernel tạo ra nó trong RAM và cập nhật real-time. Mỗi process đang chạy có một thư mục con trong /proc với tên là PID của nó.

# Xem thông tin CPU
$ cat /proc/cpuinfo

# Xem RAM
$ cat /proc/meminfo

# Xem uptime hệ thống
$ cat /proc/uptime

# Xem tất cả process đang chạy
$ ls /proc | grep -E '^[0-9]+$'

# Xem chi tiết process PID 1234
$ ls /proc/1234/
$ cat /proc/1234/cmdline   # Lệnh đã chạy process này
$ cat /proc/1234/status    # Trạng thái: CPU, RAM, state
$ ls -la /proc/1234/fd/    # File descriptors đang mở

Ứng dụng thực tế: Khi điều tra incident, /proc/[pid]/ cho bạn biết một process đang làm gì, mở file nào, kết nối tới đâu — mà không cần cài thêm tool nào.

/sys — Giao tiếp với hardware và kernel

/sys (sysfs) cũng là virtual filesystem, nhưng thay vì thông tin process, nó expose cấu hình kernel và hardware. Bạn có thể đọc và ghi vào đây để thay đổi hành vi kernel mà không cần reboot.

# Xem danh sách network interface
$ ls /sys/class/net/

# Xem tốc độ link của eth0
$ cat /sys/class/net/eth0/speed

# Bật/tắt IPv6 (không cần reboot)
$ echo 1 | sudo tee /sys/net/ipv6/conf/all/disable_ipv6

# Xem thông tin battery (laptop)
$ cat /sys/class/power_supply/BAT0/capacity

Trong bài Hardening (Bài 9), bạn sẽ dùng /etc/sysctl.conf để thay đổi kernel parameters một cách persistent thông qua /proc/sys.

/tmp — Bãi rác tạm thời

/tmp chứa file tạm thời, bị xóa khi reboot (hoặc theo policy của distro). Bất kỳ user nào cũng có thể ghi vào đây.

# Tạo file tạm để test
$ echo "test" > /tmp/mytest.txt

# Xem policy xóa tự động
$ cat /usr/lib/tmpfiles.d/tmp.conf

⚠️ Lưu ý bảo mật: /tmp là target phổ biến của malware và khai thác privilege escalation. Trong hardening, người ta thường mount /tmp với flag noexec để ngăn chạy binary từ đây.

Các thư mục quan trọng khác

/bin   → Binaries cơ bản (ls, cp, mv...) — link tới /usr/bin trên distro mới
/sbin  → System binaries (fdisk, ifconfig...) — chỉ root dùng
/usr   → User programs: /usr/bin, /usr/lib, /usr/share
/home  → Home directory của các user (/home/richard, /home/deploy)
/root  → Home directory của root user
/boot  → Kernel và bootloader (GRUB)
/dev   → Device files (ổ đĩa, terminal, random...)
/opt   → Software cài thêm từ bên ngoài (không qua package manager)
/mnt   → Mount point tạm thời
/media → Mount point cho USB, CD-ROM
/lib   → Shared libraries (.so files)

Đường dẫn tuyệt đối vs tương đối

Đây là khái niệm quan trọng nhất khi làm việc với filesystem:

Đường dẫn tuyệt đối bắt đầu từ / — luôn chính xác dù bạn đang đứng ở đâu:

$ cat /etc/nginx/nginx.conf      # Luôn tìm đúng file này
$ cd /var/log                    # Luôn vào đúng thư mục này

Đường dẫn tương đối tính từ thư mục hiện tại — ngắn hơn nhưng phụ thuộc vào vị trí bạn đang đứng:

# Đang đứng ở /var
$ cat log/nginx/access.log       # = /var/log/nginx/access.log
$ cd ..                          # Lên /
$ cd ../home/richard             # Từ /var lên / rồi vào /home/richard

# Ký hiệu đặc biệt:
# .   = thư mục hiện tại
# ..  = thư mục cha
# ~   = home directory của user hiện tại

Mẹo thực chiến: Trong script, luôn dùng đường dẫn tuyệt đối để tránh bug khi script chạy từ thư mục khác.

Các lệnh navigate cần biết

# pwd — biết mình đang ở đâu
$ pwd
/home/richard

# ls — liệt kê nội dung
$ ls -la /etc/ssh

# cd — di chuyển
$ cd /var/log
$ cd ..           # lên /var
$ cd -            # quay lại /var/log (như nút Back)
$ cd ~            # về home

# tree — xem cây thư mục (cần cài: apt install tree)
$ tree /etc/nginx
$ tree -L 2 /var  # chỉ 2 cấp sâu

# find — tìm file theo điều kiện
$ find /etc -name "*.conf"              # tìm file .conf
$ find /var/log -mtime -1              # sửa trong 24h qua
$ find /home -type d -name ".ssh"      # tìm thư mục .ssh
$ find / -perm -4000 2>/dev/null       # tìm file SUID (quan trọng cho SecOps)

# locate — tìm nhanh qua database index
$ sudo updatedb                        # cập nhật database
$ locate sshd_config                   # tìm ngay lập tức

find vs locate: find tìm real-time trên ổ đĩa — chậm hơn nhưng luôn chính xác. locate tìm qua database được index trước — rất nhanh nhưng có thể cũ nếu chưa updatedb.

Đây là phần nhiều người bỏ qua nhưng lại xuất hiện thường xuyên khi debug hoặc thiết kế hệ thống.

Inode là gì?

Mỗi file trên Linux thực ra gồm hai phần tách biệt:

  1. Inode — metadata của file: kích thước, quyền, timestamps, con trỏ đến vị trí data trên ổ đĩa. Không chứa tên file.
  2. Directory entry — ánh xạ giữa tên file và inode number.
# Xem inode number của file
$ ls -li /etc/hosts
131073 -rw-r--r-- 1 root root 221 May 10 09:00 /etc/hosts
# 131073 là inode number

# Xem thông tin inode chi tiết
$ stat /etc/hosts
  File: /etc/hosts
  Size: 221
  Inode: 131073
  Links: 1
  Access: (0644/-rw-r--r--)
  Modify: 2026-05-10 09:00:00

Hard link là một tên file khác trỏ vào cùng một inode. Không tốn thêm dung lượng, không phân biệt “original” hay “link”:

# Tạo hard link
$ ln /etc/hosts /tmp/hosts-hardlink

# Cả hai trỏ vào cùng inode
$ ls -li /etc/hosts /tmp/hosts-hardlink
131073 -rw-r--r-- 2 root root 221 ... /etc/hosts
131073 -rw-r--r-- 2 root root 221 ... /tmp/hosts-hardlink
# Cùng inode 131073, Links count = 2

# Xóa một cái, file vẫn tồn tại qua cái kia
$ rm /tmp/hosts-hardlink
$ cat /etc/hosts   # Vẫn đọc được

Giới hạn của hard link: Không thể tạo hard link xuyên filesystem, không thể hard link thư mục.

Symlink là file đặc biệt chứa đường dẫn đến file/thư mục khác — giống shortcut trên Windows. Có inode riêng.

# Tạo symlink (-s = symbolic)
$ ln -s /etc/nginx/nginx.conf ~/nginx.conf

# Xem symlink
$ ls -la ~/nginx.conf
lrwxrwxrwx 1 richard richard 22 ... nginx.conf -> /etc/nginx/nginx.conf
# Dấu l ở đầu = symlink, -> chỉ đến đích

# Symlink có thể trỏ đến thư mục
$ ln -s /var/log/nginx ~/logs

# Kiểm tra symlink còn valid không
$ readlink -f ~/nginx.conf

Symlink bị “broken” khi file gốc bị xóa hoặc di chuyển — lúc này symlink vẫn tồn tại nhưng trỏ vào khoảng không.

Dùng khi nào?

  • Hard link: Backup, deduplication, khi cần đảm bảo data tồn tại dù một đường dẫn bị xóa.
  • Symlink: Mọi trường hợp còn lại — config, deploy, version switching.
# Pattern phổ biến trong deploy: dùng symlink để switch version
$ ls -la /var/www/
myapp-v1.2.0/    # thư mục thật
myapp-v1.3.0/    # thư mục thật
current -> myapp-v1.3.0/   # symlink — Nginx trỏ vào đây

# Deploy version mới: chỉ cần đổi symlink, không downtime
$ ln -sfn /var/www/myapp-v1.4.0 /var/www/current

Mount Points — Filesystem trong Filesystem

Trên Linux, mọi thiết bị lưu trữ đều được “gắn” vào một điểm trong cây thư mục. Đây gọi là mount point. Ổ đĩa thứ hai không xuất hiện như ổ D — nó được mount vào /data hoặc /mnt/disk2.

# Xem tất cả filesystem đang được mount
$ mount | column -t

# Xem dạng gọn hơn
$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      ext4       50G   12G   36G  25% /
/dev/sda2      ext4      200G   80G  108G  43% /data
tmpfs          tmpfs     3.9G     0  3.9G   0% /dev/shm

# Xem mount points dạng cây
$ findmnt

/etc/fstab — Mount tự động khi boot

File /etc/fstab định nghĩa filesystem nào được mount tự động mỗi khi boot:

$ cat /etc/fstab
# <device>    <mount point>  <type>  <options>        <dump> <pass>
UUID=abc123   /              ext4    defaults           0      1
UUID=def456   /data          ext4    defaults,noatime   0      2
UUID=ghi789   /boot          ext4    defaults           0      2
tmpfs         /tmp           tmpfs   nodev,nosuid,noexec 0     0

Chú ý cột optionsnodev,nosuid,noexec trên /tmp là hardening cơ bản: không cho phép device file, SUID, và chạy binary từ /tmp.

# Mount thủ công (tạm thời, không lưu qua reboot)
$ sudo mount /dev/sdb1 /mnt/usb

# Unmount
$ sudo umount /mnt/usb

# Mount theo fstab (chỉ cần ghi /mnt/data nếu đã có trong fstab)
$ sudo mount /mnt/data

/proc và /sys trong troubleshooting thực tế

Đây là lý do tại sao hiểu filesystem quan trọng với DevSecOps — bạn có thể debug mà không cần cài thêm tool:

# Server chậm? Xem load average real-time
$ watch -n 1 cat /proc/loadavg

# Tìm process đang mở quá nhiều file (potential file descriptor leak)
$ ls /proc/*/fd | wc -l

# Xem network connections của process PID 1234
$ cat /proc/1234/net/tcp

# Kiểm tra kernel parameters bảo mật
$ cat /proc/sys/net/ipv4/ip_forward         # IP forwarding
$ cat /proc/sys/kernel/randomize_va_space   # ASLR

# Xem memory map của process (useful khi phân tích malware)
$ cat /proc/1234/maps

# Detect process đang chạy từ /tmp (dấu hiệu xấu)
$ ls -la /proc/*/exe 2>/dev/null | grep tmp

Tổng kết

Filesystem Linux không hề ngẫu nhiên — nó là một hệ thống được thiết kế cẩn thận:

  • 🔧 /etc — mọi config đều ở đây, backup trước khi sửa
  • 📋 /var — log, cache, runtime data — nơi đầu tiên kiểm tra khi debug
  • 🔬 /proc — cửa sổ vào kernel, real-time, không cần tool thêm
  • ⚙️ /sys — điều chỉnh kernel và hardware on-the-fly
  • 🗑️ /tmp — tạm thời, mount với noexec trong môi trường production

Hiểu rõ symlink giúp bạn thiết kế deploy pipeline không downtime. Hiểu inode giúp bạn debug những lỗi kỳ lạ khi “file đã xóa mà disk vẫn đầy”. Hiểu mount point giúp bạn thiết kế partition scheme đúng cho server production.

Bài tiếp theo sẽ đi vào Permissions, Users & Groups — hệ thống phân quyền của Linux và tại sao hiểu đúng chmod, SUID, sudo là điều kiện tiên quyết để làm bảo mật.

Biên Tập Viên
Biên Tập Viên

Tác giả tại Pioneer — nền tảng kiến thức thực chiến về Công nghệ & Tài chính.

Bình luận (0)

Chưa có bình luận nào. Hãy là người đầu tiên!