HỌC BẰNG THỰC HÀNH
← Lộ trình học
01 · Linux Administration

Kiến trúc Linux, cây thư mục và link

Thực hiện trên server của bạn, rồi kiểm tra từng tiêu chí.

Cốt lõi

Vì sao cần học

Khi một dịch vụ lỗi, bạn cần biết tìm cấu hình ở đâu, log ở đâu, binary ở đâu và tiến trình đang thấy gì. Cây thư mục Linux có quy ước rõ ràng (FHS) nên kỹ năng này dùng được trên mọi server. Symlink và hard link xuất hiện ở khắp nơi: /etc/alternatives, unit systemd được enable, và mô hình deploy releases/ + current mà bạn sẽ dùng ở Module 04.

Mục tiêu

  • Phân biệt kernel space và user space, giải thích system call.
  • Biết vai trò các thư mục chính theo FHS và các filesystem ảo /proc, /sys.
  • Giải thích inode và vì sao hard link khác symlink.
  • Dựng mô hình releases/ + current và chuyển phiên bản bằng symlink.

Điều kiện tiên quyết

  • Bài Tạo VM Linux dành riêng cho lab.

Mental model

Kernel và user space. Kernel điều khiển CPU, bộ nhớ, ổ đĩa, mạng. Chương trình của bạn chạy trong user space và chỉ nhờ kernel làm việc qua system call như open, read, write, fork. Khi một lệnh báo Permission denied, chính kernel từ chối system call đó.

Mọi thứ là file. Thiết bị (/dev/vdb), thông tin tiến trình (/proc/<PID>/), tham số kernel (/proc/sys/, /sys/) đều được trình bày như file. /proc và /sys không nằm trên ổ đĩa; kernel tạo nội dung khi bạn đọc.

Thư mụcChứa gì
/etcCấu hình hệ thống, dạng text
/usr/bin, /usr/sbinChương trình do package cài
/usr/localPhần mềm cài tay, ngoài package manager
/optỨng dụng đóng gói riêng, mỗi ứng dụng một thư mục
/srvDữ liệu dịch vụ phục vụ ra ngoài
/var/libTrạng thái của dịch vụ (database, backup)
/var/logLog dạng file
/home, /rootThư mục người dùng
/tmpFile tạm, có thể bị xóa khi reboot
/proc, /sysGiao diện tới kernel

Inode. Tên file chỉ là một mục trong thư mục, trỏ tới inode chứa metadata và dữ liệu. Hard link là thêm một tên trỏ tới cùng inode: hai tên ngang hàng, xóa một tên dữ liệu vẫn còn, không vượt qua filesystem khác. Symlink là một file nhỏ chứa đường dẫn: có thể trỏ sang filesystem khác, có thể "gãy" khi đích bị xóa.

Thực hành (Guided Lab)

1. Nhìn kernel và tiến trình qua /proc

uname -r
cat /proc/cpuinfo | head -5
cat /proc/meminfo | head -3
ls -l /proc/$$/exe /proc/$$/cwd
mount | grep -E ' /proc | /sys '
Giải thích lệnh và tham số
Lệnh / tùy chọnÝ nghĩa
uname -rIn phiên bản kernel; -r là kernel release.
cat ... | head -5Đọc file rồi chỉ hiển thị 5 dòng đầu. head -3 tương tự với 3 dòng; dạng đầy đủ là head -n 5.
ls -l /proc/$$/exe /proc/$$/cwdXem hai symlink của shell hiện tại: executable và thư mục làm việc. $$ là PID của shell.
mountKhông có đối số thì liệt kê các filesystem đang được mount.
grep -E ' /proc | /sys '-E bật biểu thức chính quy mở rộng; dấu | bên trong chuỗi mẫu nghĩa là hoặc, khác dấu pipe giữa hai lệnh.

$$ là PID của shell hiện tại. /proc/$$/exe là symlink tới chương trình shell đang chạy.

2. Dựng hai phiên bản ứng dụng

sudo install -d /opt/kdc-app/releases/v1 /opt/kdc-app/releases/v2 /opt/kdc-app/shared
echo "version=1" | sudo tee /opt/kdc-app/releases/v1/app.txt
echo "version=2" | sudo tee /opt/kdc-app/releases/v2/app.txt
echo "db_host=127.0.0.1" | sudo tee /opt/kdc-app/shared/settings.ini
Giải thích lệnh và tham số

install -d tạo các thư mục được liệt kê, không copy file. echo in nội dung, dấu | chuyển nội dung sang sudo tee để ghi file bằng quyền quản trị. tee không có -a sẽ ghi đè file đích.

3. Hard link cho cấu hình dùng chung

sudo ln /opt/kdc-app/shared/settings.ini /opt/kdc-app/releases/v2/settings.ini
ls -li /opt/kdc-app/shared/settings.ini /opt/kdc-app/releases/v2/settings.ini
Giải thích lệnh và tham số

ln <file-nguồn> <tên-mới> tạo hard link. Khi không có -s, hai tên trỏ tới cùng inode. ls -li gộp -l (chi tiết) và -i (in số inode); đây là cách đọc các tùy chọn ngắn được viết liền nhau.

Cột đầu tiên là số inode, giống nhau ở cả hai dòng; cột link count là 2. Sửa một file rồi cat file còn lại để thấy cùng nội dung.

4. Symlink current và chuyển phiên bản

cd /opt/kdc-app
sudo ln -sfn releases/v1 current
cat current/app.txt
sudo ln -sfn releases/v2 current
cat current/app.txt
ls -l current
Giải thích lệnh và tham số

ln -sfn gộp ba tùy chọn: -s tạo symlink, -f thay tên đích đang tồn tại khi có thể, -n không đi vào thư mục được symlink đích trỏ tới. releases/v2 là đường dẫn lưu trong symlink; current là tên symlink được tạo. Kết quả ls -l current cần có current -> releases/v2.

-n thay thế chính symlink thay vì tạo link bên trong thư mục nó trỏ tới. Đổi symlink là thao tác gần như tức thời, nên đây là cách deploy và rollback phổ biến: rollback chỉ là trỏ current về bản cũ.

Symlink tương đối (releases/v2) vẫn đúng khi cả thư mục /opt/kdc-app được chuyển sang chỗ khác. Symlink tuyệt đối thì không.

5. Tìm hiểu thêm

stat /opt/kdc-app/current
readlink -f /opt/kdc-app/current
df -h /opt /proc
Giải thích lệnh và tham số

stat in metadata chi tiết của file/link. readlink -f giải toàn bộ chuỗi symlink thành đường dẫn tuyệt đối chuẩn hóa; -f ở đây không có nghĩa là ghi đè như trong ln. df xem dung lượng filesystem chứa đường dẫn; -h đổi kích thước sang đơn vị dễ đọc như MiB/GiB.

Tự kiểm tra (Verification)

ls -l /opt/kdc-app/current
cat /opt/kdc-app/current/app.txt
ls -li /opt/kdc-app/shared/settings.ini /opt/kdc-app/releases/v2/settings.ini
Giải thích lệnh và tham số

ls -l xem quyền và đích symlink; ls -li thêm số inode (-i) vào định dạng chi tiết (-l) để đối chiếu hai hard link. cat in nội dung file.

Chọn server và bấm Kiểm tra kết quả.

Lỗi thường gặp

  • ln -s releases/v2 current khi current đã là thư mục hoặc symlink tới thư mục: link mới bị tạo bên trong đích. Dùng ln -sfn.
  • Hard link sang filesystem khác: Invalid cross-device link. Dùng symlink.
  • Symlink tương đối được tính từ thư mục chứa symlink, không phải thư mục hiện tại của bạn.

Ghi chú production

  • Một số trình soạn thảo lưu file bằng cách ghi file mới rồi đổi tên, làm hard link tách thành hai inode. Với cấu hình dùng chung giữa các release, symlink an toàn hơn; hard link ở bài này để hiểu inode.
  • Ở Module 04 bạn sẽ deploy theo mô hình releases/ + current và rollback bằng symlink.

Dọn dẹp

Kiểm tra đúng đường dẫn /opt/kdc-app trước khi chạy: dữ liệu bị xóa không được chuyển vào thùng rác.

sudo rm -rf /opt/kdc-app
Giải thích lệnh và tham số

rm xóa file; -r xóa cả thư mục và nội dung bên trong, -f không hỏi xác nhận và không báo lỗi vì file không tồn tại. -rf là hai tùy chọn gộp lại.

Tài liệu chính thức