Phần I · Dựng nhân · Chương 2Part I · Building the Kernel · Chapter 2
Cần sẵn những gì trước khi gõ lệnh đầu tiên Chuẩn bị đồ nghề trước khi bắt tay What must be in place before the first command
Chương 2 là chương ngắn nhất và thực dụng nhất của cả cuốn sách: nó liệt kê những chương trình bạn cần để cấu hình một nhân, dựng nó, và khởi động thành công 1. Điều đáng chú ý không phải là danh sách, mà là lời dặn đi kèm: hãy tra tệp Documentation/Changes trong chính cây mã nguồn để xác minh số phiên bản cụ thể của từng công cụ, vì chương này viết cho nhân 2.6.18 1.
Chương 2 giống như bảng kê đồ nghề. Muốn tự làm nhân, bạn cần vài chương trình cài sẵn trên máy 1. Ông Greg Kroah-Hartman dặn: đừng tin danh sách in trong sách một cách máy móc, hãy mở tệp Documentation/Changes ngay trong bộ mã nguồn bạn tải về để xem bản mới nhất cần gì 1. Nhớ nhé: danh sách đồ nghề thay đổi theo từng đời nhân.
Chapter 2 is the shortest and most practical chapter in the book: it lists the programs you need to configure a kernel, build it, and successfully boot it 1. What matters is not the list but the instruction attached to it — consult the file Documentation/Changes in the source tree itself to verify the specific version number of each tool, because this chapter was based on the 2.6.18 kernel 1.
Lời dặn ấy chính là thứ khiến chương này không bị lỗi thời cùng với các con số của nó. Tệp Documentation/Changes ngày nay đã chuyển thành Documentation/process/changes.rst và vẫn giữ nguyên chức năng: một bảng “phiên bản tối thiểu” kèm lệnh để tự kiểm tra từng công cụ 6. Phương pháp còn nguyên giá trị; chỉ các con số trong bảng là đã đi rất xa.
Luận điểm chương 2. Chỉ cần ba gói để dựng được một nhân — một trình biên dịch, một trình liên kết, và một công cụ make 2. Danh sách dài phía sau không phải để dựng, mà để dùng cái nhân vừa dựng: nâng nhân lên phiên bản khác phiên bản mà bản phân phối cấp có thể buộc bạn nâng theo một số gói người dùng 3.
Ý chính. Để dựng nhân chỉ cần ba thứ: trình biên dịch, trình liên kết, và make 2. Danh sách dài còn lại là để chạy cái nhân mới, không phải để dựng nó 3. Nhớ nhé: dựng thì ít đồ, dùng thì nhiều đồ.
Chapter 2 thesis. Only three packages are needed to successfully build a kernel: a compiler, a linker, and a make utility 2. The longer list that follows is not for building but for using the kernel you built — upgrading to a kernel different from the one your distribution shipped may require upgrading some of those userspace packages too 3.
ld và bộ hợp dịch đi kèm.
Ghép các mảnh đã dịch lại với nhau.
gcc does not do it all — it needs ld and the assembler alongside.
Cụm khái niệm 01 · “Tools to Build the Kernel”Concept cluster 01 · “Tools to Build the Kernel”
Ba gói, không hơn: trình biên dịch, trình liên kết, và make
Chỉ ba món là dựng được
Three packages, no more: a compiler, a linker, and make
Trước khi liệt kê, ông đưa ra một lối tắt thực tế: phần lớn bản phân phối có sẵn một tùy chọn cài đặt cả cụm gói “kernel hacking”, và nếu bản của bạn có tùy chọn đó thì cài nó dễ hơn nhiều so với đi lùng từng chương trình 2. Sau đó mới đến câu then chốt: chỉ có ba gói cần thiết để dựng thành công một nhân — một trình biên dịch, một trình liên kết, và một công cụ make 2.
Nhiều bản Linux có sẵn một mục cài đặt gom hết công cụ lập trình nhân vào một chỗ; cài mục đó là nhanh nhất 2. Còn nếu muốn cài tay thì chỉ cần ba thứ thôi: trình biên dịch, trình liên kết, và make 2. Nhớ nhé: đừng sợ danh sách dài, ba món là đủ để bắt đầu.
Before the list comes a practical shortcut: most Linux distributions offer an installation option for a range of kernel hacking packages, and if yours does, installing it is far easier than tracking down each individual program 2. Then the key sentence: only three packages are needed in order to successfully build a kernel — a compiler, a linker, and a make utility 2.
Hãy để ý cấu trúc của cả chương: nó gần như là một bảng biểu được viết thành văn xuôi. Mỗi mục lặp lại đúng bốn thông tin — gói này để làm gì, tên gói trong bản phân phối, địa chỉ tải mã nguồn gốc, và phiên bản cũ nhất còn dùng được với nhân 2.6.18, kèm một lệnh để tự kiểm tra. Nhận ra khuôn mẫu ấy thì đọc chương này chỉ mất vài phút, và quan trọng hơn: bạn sẽ đọc được bảng changes.rst hiện hành theo đúng cách đó 6.
Chuỗi công cụ (toolchain). Ba gói này không độc lập mà nối tiếp nhau: make đọc cây mã và quyết định việc, gcc dịch từng tệp C thành mã đối tượng, binutils hợp dịch phần hợp ngữ rồi liên kết tất cả thành một nhân duy nhất 2. Thiếu một mắt xích là cả chuỗi đứng.
Chuỗi công cụ là gì. Ba món nối nhau thành một dây chuyền: make ra lệnh, gcc dịch, binutils ghép lại 2. Nhớ nhé: thiếu một mắt xích là cả dây chuyền dừng.
Toolchain. The three packages are not independent; they chain. make reads the tree and decides the work, gcc compiles each C file into object code, and binutils assembles the assembly parts and links everything into a single kernel 2. Break one link and the chain stops.
với nhân 2.6.18 (2006):
gcc ≥ 3.2
binutils ≥ 2.12
make ≥ 3.79.1
→ hôm nay: 8.1 / 2.30 / 4.0
sách 2006 cần:
gcc 3.2 · binutils 2.12 · make 3.79.1
hôm nay cần:
gcc 8.1 · binutils 2.30 · make 4.0
for the 2.6.18 kernel (2006):
gcc ≥ 3.2
binutils ≥ 2.12
make ≥ 3.79.1
→ today: 8.1 / 2.30 / 4.0
-
compiler · gcc
gcc — và nghịch lý “mới nhất chưa chắc tốt nhất” gcc — bản mới nhất không phải lúc nào cũng hay gcc — and the “newest is not always best” paradox
Nhân Linux viết bằng ngôn ngữ C, kèm một lượng nhỏ hợp ngữ ở vài nơi, và để dựng nó thì phải dùng trình biên dịch gcc 2. Tính đến bản 2.6.18, gcc 3.2 là phiên bản cũ nhất còn dựng ra được một nhân chạy được 2. Rồi đến lời cảnh báo ngược chiều trực giác: lấy bản gcc mới nhất không phải lúc nào cũng là ý hay, vì một số bản gcc mới không dựng nhân đúng cách — trừ khi bạn muốn giúp gỡ lỗi cho chính trình biên dịch, ông khuyên đừng thử 2.
Nhân viết bằng ngôn ngữ C nên phải dùng gcc để dịch 2. Sách nói bản 3.2 là bản cũ nhất còn dùng được với nhân 2.6.18 2. Nhưng lạ ở chỗ: bản gcc mới nhất đôi khi lại dịch sai nhân, nên ông khuyên đừng vội chạy theo bản mới nhất 2. Nhớ nhé: chọn bản đã được thử nhiều, đừng chọn bản mới nhất.
The Linux kernel is written in C, with a small amount of assembly language in some places, and to build it the gcc C compiler must be used 2. As of the 2.6.18 release, gcc 3.2 is the oldest version that can properly build a working kernel 2. Then comes the counterintuitive warning: getting the most recent gcc version is not always a good idea, since some of the newest releases do not build the kernel properly — unless you wish to help debug compiler bugs, he does not recommend trying them 2.
Bạn thấy nó ở đâu. Lệnh kiểm tra trong sách là
gcc --version2 — vẫn đúng nguyên văn cho tới hôm nay: bảng yêu cầu tối thiểu hiện hành liệt kê “GNU C · 8.1 ·gcc --version” 6.Gặp ở đâu. Gõ
gcc --versionđể xem máy bạn đang có bản nào 2. Hai mươi năm sau lệnh vẫn y hệt, chỉ số yêu cầu đổi thành 8.1 6. Nhớ nhé: lệnh kiểm tra thì bền, con số thì không.Where you see it. The check command in the book is
gcc --version2 — still verbatim correct today: the current minimum-requirements table lists “GNU C · 8.1 ·gcc --version” 6.Vì sao “mới nhất” lại rủi ro
Nhân không phải một chương trình C bình thường: nó dựa vào nhiều hành vi mà chuẩn ngôn ngữ bỏ ngỏ, và mỗi bản gcc mới lại tối ưu mạnh tay hơn ở đúng những chỗ đó. Vì thế nhân luôn chạy sau trình biên dịch một khoảng. Sách viết trước khi có lựa chọn nào khác; ngày nay tài liệu nhân còn hỗ trợ chính thức cả Clang/LLVM (bản tối thiểu 17.0.1) như một chuỗi công cụ thay thế 6.
Tải từ nguồn gốc
Nếu muốn tự tải và tự dựng trình biên dịch, sách chỉ thẳng địa chỉ gcc.gnu.org 2. Nhưng ông cũng nói ngay rằng hầu hết bản phân phối đã có gói tên
gccđể cài sẵn — con đường bình thường vẫn là cài từ bản phân phối 2. -
linker · binutils
binutils — mắt xích ít ai để ý binutils — món đồ hay bị quên binutils — the link nobody notices
Ông mở đầu bằng một câu đính chính: trình biên dịch gcc không tự mình làm hết việc biên dịch; nó cần thêm một bộ công cụ gọi là binutils để liên kết và hợp dịch các tệp mã nguồn 2. Gói binutils còn chứa những tiện ích thao tác trên tệp đối tượng theo nhiều cách hữu ích, chẳng hạn xem nội dung một thư viện 2. Với nhân 2.6.18, bản 2.12 là bản cũ nhất còn liên kết được nhân 2.
gcc không làm hết một mình đâu. Nó cần thêm bộ binutils để ghép các mảnh đã dịch lại thành một khối 2. Trong gói đó còn có công cụ để xem bên trong các tệp đã dịch 2. Sách nói bản 2.12 là bản cũ nhất còn dùng được 2. Nhớ nhé: thiếu nó thì dịch xong cũng không ghép được.
He opens with a correction: the C compiler, gcc, does not do all of the compiling on its own; it needs an additional set of tools known as binutils to do the linking and assembling of source files 2. The binutils package also contains useful utilities that manipulate object files in many ways, such as viewing the contents of a library 2. As of the 2.6.18 kernel, release 2.12 is the oldest that can successfully link the kernel 2.
Bạn thấy nó ở đâu. Lệnh kiểm tra là
ld -v2; gói thường mang đúng tênbinutilstrong bản phân phối, và mã nguồn gốc ở gnu.org/software/binutils 2. Bảng hiện hành vẫn dùng đúng lệnh ấy, với mức tối thiểu 2.30 6.Gặp ở đâu. Gõ
ld -vđể xem bản binutils trên máy 2. Hôm nay nhân cần ít nhất bản 2.30 6. Nhớ nhé: một lệnh ngắn là biết ngay.Where you see it. The check command is
ld -v2; the package is usually called, not surprisingly,binutils, with upstream source at gnu.org/software/binutils 2. The current table uses the same command, with a 2.30 minimum 6. -
make
make— người điều phối, và lý do nên lấy bản mớimake— người chỉ huy công trườngmake— the orchestrator, and why newer is better heremakelà công cụ đi khắp cây mã nguồn của nhân để xác định tệp nào cần biên dịch, rồi gọi trình biên dịch cùng các công cụ dựng khác làm phần việc còn lại 2. Nhân đòi hỏi đúng bản GNU củamake2. Với 2.6.18, bản 3.79.1 là bản cũ nhất còn dựng đúng — nhưng ở riêng gói này ông lại khuyên cài bản ổn định mới nhất, vì các bản mới xử lý tệp dựng nhanh hơn 2.makegiống người chỉ huy công trường: nó xem tệp nào đã đổi, tệp nào cần dịch lại, rồi sai gcc làm 2. Phải là bản GNU mới được 2. Ở món này thì bản mới lại tốt hơn: chạy nhanh hơn 2. Nhớ nhé: gcc thì đừng quá mới, cònmakethì cứ mới.makeis the tool that walks the kernel source tree to determine which files need to be compiled, then calls the compiler and the other build tools to do the work 2. The kernel requires the GNU version ofmake2. For 2.6.18, release 3.79.1 is the oldest that builds properly — but for this package he recommends installing the latest stable version, because newer ones process the build files faster 2.Bạn thấy nó ở đâu. Kiểm tra bằng
make --version2; mã nguồn gốc tại gnu.org/software/make 2. Yêu cầu hiện hành đã nhảy sang GNU make 4.0 6.Gặp ở đâu. Gõ
make --version2. Hôm nay cần ít nhất bản 4.0 6. Nhớ nhé: ba lệnh kiểm tra, ba câu trả lời, là xong phần dựng.Where you see it. Check with
make --version2; upstream source at gnu.org/software/make 2. The current requirement has moved to GNU make 4.0 6.Ba gói đã thành nhiều hơn ba
Câu “chỉ ba gói” đúng với năm 2006 và không còn đúng nguyên vẹn hôm nay. Bảng yêu cầu hiện hành còn đòi thêm
bash4.2,bc1.06.95,bison2.0,flex2.5.35,openssl1.0.0,pahole1.26 và Python 3.9 cho những cấu hình nhất định 6. Tinh thần thì vẫn vậy: lõi chuỗi công cụ nhỏ, phần rìa mọc dần theo năm tháng.Ngôn ngữ thứ hai trong nhân
Sách khẳng định nhân là C cộng một ít hợp ngữ 2; điều đó vẫn đúng với phần tuyệt đại đa số cây mã. Nhưng bảng công cụ hiện hành đã liệt kê Rust 1.85.0 và
bindgen0.71.1 như những mục tùy chọn 6 — chúng chỉ cần khi bạn bật phần hỗ trợ Rust, nên phát biểu của sách không bị bác bỏ, chỉ được mở rộng.
Cụm khái niệm 02 · “Tools to Use the Kernel”Concept cluster 02 · “Tools to Use the Kernel”
Công cụ để dùng nhân: nơi việc nâng cấp có thể lan ra Đồ để chạy cái nhân mới Tools to use the kernel: where an upgrade can spread
Mục này mở bằng một câu trấn an rồi thu hẹp ngay: phiên bản nhân đang chạy thường không ảnh hưởng đến ứng dụng người dùng, nhưng có một số ít chương trình mà phiên bản nhân là điều quan trọng 3. Đa số chúng đã nằm sẵn trên máy bạn; vấn đề chỉ nảy sinh khi bạn nâng nhân lên một phiên bản khác với phiên bản đi kèm bản phân phối — lúc ấy vài gói trong số này có thể cũng cần nâng theo để hệ thống chạy đúng 3.
Đổi nhân thường không làm ứng dụng của bạn hỏng. Chỉ một số ít chương trình là bám chặt vào phiên bản nhân 3. Mấy chương trình đó thường đã có sẵn trên máy rồi. Nhưng nếu bạn dùng nhân khác với nhân bản phân phối cấp, có thể phải nâng cấp thêm vài gói 3. Nhớ nhé: đổi nhân đôi khi kéo theo đổi vài món khác.
This section opens with reassurance, then narrows at once: the version of the kernel that is running does not usually affect any user application, but there are a small number of programs for which the kernel version is important 3. Most are already installed on your Linux system; the problem only appears when you upgrade to a kernel different from the one that came with your distribution — then some of these packages may also need upgrading for the system to work properly 3.
Câu này là lời giải thích thầm lặng cho một hiện tượng quen thuộc: vì sao nâng nhân bằng tay đôi khi làm máy không khởi động được trong khi bản thân nhân hoàn toàn lành lặn. Nhân và một nhúm chương trình không gian người dùng có giao diện chung — cách nạp module, nội dung /sys, cách đặt tên thiết bị — và chỉ cần một bên đi trước quá xa là giao diện ấy lệch. Cả mục này thực chất là danh sách các điểm lệch có thể xảy ra.
Không gian người dùng (userspace). Phần hệ thống nằm ngoài nhân. Các gói trong mục này đặc biệt vì chúng nói chuyện trực tiếp với nhân qua những giao diện thay đổi theo phiên bản: nạp module, đọc /sys, gắn phân vùng, đọc bảng tiến trình 35.
Không gian người dùng là gì. Là mọi chương trình chạy bên ngoài nhân. Mấy gói trong phần này khác ở chỗ chúng nói chuyện thẳng với nhân, nên nhân đổi thì chúng cũng phải đổi theo 35. Nhớ nhé: chúng là phiên dịch viên giữa bạn và nhân.
Userspace. Everything outside the kernel. The packages in this section are special because they speak to the kernel directly, across interfaces that change with the version: loading modules, reading /sys, mounting partitions, reading the process table 35.
util-linux ≥ 2.10 · fdformat --version
module-init-tools ≥ 0.9.10 · depmod -V
udev ≥ 081 · udevinfo -V
procps ≥ 3.2.0 · ps --version
pcmciautils ≥ 004 · pccardctl -V
util-linux · gắn ổ đĩa
module-init-tools · nạp module
udev · đặt tên thiết bị
procps · xem tiến trình
pcmciautils · thẻ PCMCIA
util-linux ≥ 2.10 · fdformat --version
module-init-tools ≥ 0.9.10 · depmod -V
udev ≥ 081 · udevinfo -V
procps ≥ 3.2.0 · ps --version
pcmciautils ≥ 004 · pccardctl -V
-
util-linux
util-linux — nơi tính năng mới của nhân cần tay cầm mới util-linux — bộ đồ lặt vặt cho ổ đĩa util-linux — where a new kernel feature needs a new handle
Gói này là một tập hợp các tiện ích nhỏ làm đủ loại việc khác nhau; phần lớn lo việc gắn và tạo phân vùng đĩa, cùng thao tác với đồng hồ phần cứng của máy 3. Với 2.6.18, bản 2.10 là bản cũ nhất còn chạy đúng 3. Nhưng ông khuyến nghị cài bản mới nhất, vì các bản mới hỗ trợ những tính năng mới thêm vào nhân — ông lấy bind mount làm ví dụ: đó là một tùy chọn trong các nhân mới hơn, và cần một bản util-linux mới hơn thì mới hoạt động đúng 3.
Đây là túi đồ lặt vặt: gắn ổ đĩa, chia phân vùng, chỉnh đồng hồ máy 3. Sách nói bản 2.10 là bản cũ nhất còn dùng được 3. Nên lấy bản mới, vì nhân có tính năng mới thì phải có công cụ mới biết cách gọi — ví dụ kiểu gắn thư mục gọi là bind mount 3. Nhớ nhé: nhân mọc tính năng mới thì công cụ phải mọc theo.
The util-linux package is a collection of small utilities that do a wide range of different tasks; most handle the mounting and creation of disk partitions and manipulation of the hardware clock in the system 3. As of 2.6.18, release 2.10 is the oldest that works properly 3. He recommends the latest version anyway, because new versions support new features added to the kernel — his example is bind mounts: an option in newer kernels that needs a newer util-linux to work properly 3.
Bạn thấy nó ở đâu. Sách kiểm tra bằng
fdformat --versionvà chỉ tới kho kernel.org/pub/linux/utils/util-linux 3. Bảng hiện hành vẫn giữ mức tối thiểu ở nhánh 2.10 nhưng đã đổi lệnh kiểm tra sangmount --version6 — vìfdformatgắn với ổ mềm, thứ đã biến mất khỏi máy đời mới.Gặp ở đâu. Ngày xưa kiểm tra bằng
fdformat --version3; hôm nay tài liệu nhân bảo dùngmount --version6. Nhớ nhé: lệnh cũ gắn với ổ đĩa mềm, mà ổ mềm thì không còn nữa.Where you see it. The book checks with
fdformat --versionand points at kernel.org/pub/linux/utils/util-linux 3. The current table keeps the minimum on the 2.10 line but has switched the check command tomount --version6 —fdformatbelongs to floppy drives, which modern machines no longer have.Hai con số hơi khác nhau
Sách ghi mức tối thiểu là “2.10” 3; bảng
changes.rsthiện hành ghi chính xác hơn là “2.10o” 6. Đây không phải mâu thuẫn mà là cùng một nhánh phiên bản được ghi ở hai mức chi tiết. Trong thân bài, trang này theo cách ghi của sách và nêu biến thể ở đây, đúng nguyên tắc không lặng lẽ chọn một con số.Bind mount là gì
Là cách gắn một thư mục đang có vào một vị trí thứ hai trong cây thư mục, để cùng một nội dung xuất hiện ở hai chỗ mà không cần sao chép. Ví dụ ấy được sách chọn rất khéo: nó cho thấy một tính năng thuần túy nằm trong nhân vẫn vô dụng nếu công cụ
mountở phía người dùng chưa biết cú pháp để yêu cầu nó 3. -
module-init-tools
module-init-tools — dấu vết của một cuộc thay đổi tận gốc Bộ nạp module — đã thay hẳn ở đời 2.6 module-init-tools — the trace of a radical change
Gói này cần thiết nếu bạn muốn dùng module nhân — tức những mảnh mã nạp được, có thể thêm vào hoặc gỡ khỏi nhân trong lúc nhân đang chạy 3. Ông giải thích tại sao mọi bản phân phối đều dùng module: để chỉ nạp đúng những trình điều khiển và tùy chọn tương ứng với phần cứng đang có, thay vì buộc phải dựng mọi trình điều khiển vào một khối khổng lồ; module tiết kiệm bộ nhớ vì chỉ nạp phần mã cần để điều khiển máy 3. Quy trình nạp module đã thay đổi tận gốc ở bản 2.6: trình liên kết của module — phần mã phân giải ký hiệu và tính cách ghép các mảnh trong bộ nhớ — nay nằm luôn trong nhân, khiến công cụ phía người dùng trở nên khá nhỏ 3.
Module là mảnh mã có thể lắp vào hoặc tháo ra khỏi nhân ngay khi máy đang chạy 3. Nhờ vậy máy chỉ nạp đúng phần cần cho thiết bị nó có, đỡ tốn bộ nhớ 3. Ở đời nhân 2.6, phần ghép module được dời hẳn vào trong nhân, nên công cụ bên ngoài gọn đi nhiều 3. Nhớ nhé: module giống như ống kính rời — lắp cái nào thì dùng cái đó.
This package is needed if you wish to use kernel modules — loadable chunks of code that can be added to or removed from the kernel while it is running 3. He explains why every distribution uses them: to load only the drivers and options matching the hardware present, instead of being forced to build every possible driver into one large chunk; modules save memory by loading just the code needed to control the machine 3. The module loading process underwent a radical change in the 2.6 release: the module linker — the code that resolves symbols and figures out how to put the pieces together in memory — is now built into the kernel, which makes the userspace tools quite small 3.
Bạn thấy nó ở đâu. Hệ quả rất cụ thể: các bản phân phối cũ có gói tên
modutilskhông chạy đúng với nhân 2.6, và module-init-tools mới là gói bạn cần 3. Bản cũ nhất còn dùng được với 2.6.18 là 0.9.10, kiểm tra bằngdepmod -V3.Gặp ở đâu. Gói cũ tên
modutilskhông chạy với nhân 2.6; phải dùng module-init-tools 3. Gõdepmod -Vđể xem bản nào 3. Nhớ nhé: tên giống nhau chưa chắc là cùng một thứ.Where you see it. The consequence is concrete: older distributions have a package called
modutilsthat does not work properly with the 2.6 kernel, and module-init-tools is what you need instead 3. The oldest version that works with 2.6.18 is 0.9.10, checked withdepmod -V3.Hôm nay tên gói đã đổi lần nữa
Chính module-init-tools cũng đã bị thay thế. Dự án
kmodviết lại toàn bộ các lệnh trên nền thư việnlibkmodlàm bản thay thế cắm-vào-là-chạy, và module-init-tools ngừng phát triển từ năm 2011 7. Bảng yêu cầu hiện hành liệt kê “kmod · 13 ·kmod -V”, không còn dòng module-init-tools nào 6. Mô thức lặp lại đúng như sách mô tả chomodutils.Chặn module bằng danh sách đen
Lý do nên dùng bản mới, theo sách, là những tính năng chỉ có ở bản mới — ông nêu việc đưa module vào danh sách đen để ngăn gói
udevtự động nạp chúng, một tùy chọn có ở bản mới mà bản cũ không có 3. Ví dụ này cho thấy hai gói người dùng cũng ràng buộc lẫn nhau, không chỉ ràng buộc với nhân. -
other tools
udev, procps, pcmciautils — ba món “không bắt buộc mà thiếu là hỏng” Ba món nhỏ mà thiếu là rắc rối udev, procps, pcmciautils — “not required, yet fatal to omit”
Ông xếp ba gói này vào mục “Other Tools” với một mô tả thận trọng: chúng thường không bắt buộc để nhân chạy đúng, nhưng chúng mở đường truy cập tới các loại phần cứng và chức năng khác nhau 5.
udevlà chương trình cho phép Linux có hệ thống đặt tên thiết bị bền vững trong thư mục/dev, đồng thời tạo một/devđộng giống thứ mà hệ tệpdevfscũ (nay đã bị gỡ bỏ) từng cung cấp; gần như mọi bản phân phối đều dùng udev để quản lý/dev, nên nó là bắt buộc để máy khởi động đúng 5. Góiprocpschứa những lệnh quen thuộcpsvàtopcùng nhiều tiện ích quản lý và theo dõi tiến trình 5. Cònpcmciautilslà hệ thống đơn giản hơn thay chopcmcia-csđời cũ, cần có nếu bạn muốn dùng thiết bị PCMCIA 5.Ba món này không bắt buộc để nhân chạy, nhưng thiếu thì mất đường tới phần cứng 5.
udevlo đặt tên cho thiết bị trong thư mục/dev, và gần như bản Linux nào cũng cần nó để khởi động 5.procpschứa lệnhpsvàtopđể xem máy đang chạy gì 5.pcmciautilsdành cho thẻ cắm PCMCIA đời cũ 5. Nhớ nhé: udev là món đừng bao giờ bỏ qua.He files these three under “Other Tools” with a careful description: they are not usually required for the kernel to work properly, but they enable access to different types of hardware and functions 5.
udevis the program that gives Linux a persistent device-naming system in/dev, and a dynamic/devmuch like the one the older (now removed)devfsfilesystem provided; almost all distributions use udev to manage/dev, so it is required to boot the machine properly 5.procpsholds the familiarpsandtopplus many handy tools for managing and monitoring processes 5. Andpcmciautilsis the much simpler system that replaced the olderpcmcia-cs, needed if you want PCMCIA devices to work 5.Bạn thấy nó ở đâu. Ba mức tối thiểu cho 2.6.18 là udev 081, procps 3.2.0, pcmciautils 004, kiểm tra lần lượt bằng
udevinfo -V,ps --versionvàpccardctl -V5. Đáng kinh ngạc là cả ba con số ấy vẫn nguyên vẹn trong bảng hiện hành; chỉ lệnh kiểm tra udev đổi thànhudevadm --version6.Gặp ở đâu. Sách ghi udev 081, procps 3.2.0, pcmciautils 004 5. Hai mươi năm sau, ba con số này vẫn giữ nguyên trong tài liệu nhân 6. Nhớ nhé: không phải con số nào cũng cũ đi.
Where you see it. The three minimums for 2.6.18 are udev 081, procps 3.2.0 and pcmciautils 004, checked with
udevinfo -V,ps --versionandpccardctl -Vrespectively 5. Strikingly, all three numbers still stand in today's table; only udev's check command has changed, toudevadm --version6.Cảnh báo về udev đáng đọc kỹ
Ông nói thẳng mặt trái: udev dựa vào cấu trúc của
/sys, mà cấu trúc ấy vẫn thay đổi theo từng đời nhân; đã có những thay đổi làm hỏng udev tới mức máy không khởi động được 5. Vì udev gắn rất chặt vào quy trình khởi động riêng của từng bản phân phối, ông khuyến nghị mạnh mẽ dùng đúng bản udev đi kèm bản phân phối của bạn 5.Nơi tên gói khác nhau theo bản phân phối
Sách có hai chú thích nhỏ dễ cứu bạn một buổi chiều: một số bản phân phối, đáng chú ý là Debian, gọi
quota-toolslàquota, và gọinfs-utilslànfs-common4. Bài học tổng quát: tên trong sách là tên dự án, còn tên bạn gõ vào trình quản lý gói là tên bản phân phối đặt.
Cụm khái niệm 03 · “Filesystem-Specific Tools”Concept cluster 03 · “Filesystem-Specific Tools”
Công cụ riêng theo hệ tệp: một lát cắt của năm 2006 Mỗi loại ổ đĩa một bộ đồ riêng Filesystem-specific tools: a cross-section of 2006
Cần cả một dải công cụ riêng cho từng hệ tệp để tạo, định dạng, cấu hình và sửa các phân vùng đĩa; gói util-linux có sẵn vài tiện ích loại này, nhưng một số hệ tệp phổ biến có gói riêng chứa các chương trình cần thiết 4. Sáu gói được liệt kê: e2fsprogs, jfsutils, reiserfsprogs, xfsprogs, quota-tools và nfs-utils 4. Đọc lại danh sách ấy hôm nay là đọc một tấm ảnh chụp bối cảnh hệ tệp Linux năm 2006.
Mỗi loại hệ tệp — tức cách sắp xếp dữ liệu trên ổ đĩa — có bộ công cụ riêng để tạo, định dạng và sửa chữa 4. Sách kể sáu bộ: e2fsprogs, jfsutils, reiserfsprogs, xfsprogs, quota-tools, nfs-utils 4. Nhớ nhé: dùng loại ổ nào thì cài bộ đồ của loại đó.
A wide range of tools specific to particular filesystems is necessary to create, format, configure and fix disk partitions; util-linux carries a few of these, but some of the more popular filesystems have separate packages containing the necessary programs 4. Six are listed: e2fsprogs, jfsutils, reiserfsprogs, xfsprogs, quota-tools and nfs-utils 4. Reading that list today is reading a snapshot of the Linux filesystem landscape of 2006.
Hệ tệp (filesystem). Quy ước sắp xếp dữ liệu trên thiết bị lưu trữ. Nhân biết đọc hệ tệp; nhưng việc tạo ra nó, kiểm tra và sửa chữa nó thì do các chương trình ngoài nhân đảm nhiệm — đó là lý do mỗi hệ tệp kéo theo một gói công cụ riêng 4.
Hệ tệp là gì. Là cách dữ liệu được xếp trên ổ đĩa. Nhân biết đọc, nhưng việc tạo và sửa phải nhờ chương trình riêng bên ngoài 4. Nhớ nhé: nhân đọc, công cụ sửa.
Filesystem. The convention for laying data out on a storage device. The kernel knows how to read one; creating, checking and repairing it is handled by programs outside the kernel — which is why each filesystem brings its own tool package 4.
e2fsprogs ≥ 1.29 · tune2fs
jfsutils ≥ 1.1.3 · fsck.jfs -V
reiserfsprogs ≥ 3.6.3 · reiserfsck -V
xfsprogs ≥ 2.6.0 · xfs_db -V
quota-tools ≥ 3.09 · quota -V
nfs-utils ≥ 1.0.5 · showmount --version
ext2/3/4 → e2fsprogs
JFS → jfsutils
ReiserFS → reiserfsprogs
XFS → xfsprogs
hạn mức → quota-tools
NFS → nfs-utils
e2fsprogs ≥ 1.29 · tune2fs
jfsutils ≥ 1.1.3 · fsck.jfs -V
reiserfsprogs ≥ 3.6.3 · reiserfsck -V
xfsprogs ≥ 2.6.0 · xfs_db -V
quota-tools ≥ 3.09 · quota -V
nfs-utils ≥ 1.0.5 · showmount --version
-
e2fsprogs · ext2/ext3/ext4
e2fsprogs — một bộ công cụ cho ba thế hệ hệ tệp Một bộ đồ dùng chung cho ext2, ext3, ext4 e2fsprogs — one toolset for three filesystem generations
Điểm tinh tế nằm ở quan hệ họ hàng: ext3 và ext4 — ở thời điểm sách viết, ext4 còn là thử nghiệm — là những bản nâng cấp của ext2 và được quản lý bằng chính các công cụ ấy; bất kỳ phiên bản gần đây nào của một công cụ dựa trên ext2 cũng làm việc được với hai hệ tệp kia 4. Để làm việc với bất kỳ hệ tệp nào trong ba, bạn phải có gói
e2fsprogs4. Với 2.6.18, bản 1.29 là bản cũ nhất còn chạy đúng, và ông khuyến nghị rất mạnh dùng bản mới nhất để tận dụng các tính năng mới của ext3 và ext4 4.ext3 và ext4 là bản nâng cấp của ext2, nên dùng chung một bộ công cụ 4. Bộ đó tên là
e2fsprogs4. Sách nói bản 1.29 là bản cũ nhất còn dùng được, nhưng nên lấy bản mới nhất 4. Nhớ nhé: cùng một họ thì dùng chung đồ nghề.The subtlety is the family relationship: ext3 and the then-experimental ext4 are upgrades of ext2 and can be managed with the same tools; any recent version of an ext2-based tool works with the other two as well 4. To work with any of these filesystems you must have the
e2fsprogspackage 4. As of 2.6.18, release 1.29 is the oldest that works properly, and he highly recommends the newest version to take advantage of newer ext3 and ext4 features 4.Bạn thấy nó ở đâu. Sách kiểm tra bằng
tune2fsvà chỉ tới e2fsprogs.sourceforge.net 4. Lời dự đoán của ông đã thành hiện thực: ext4 không còn là thử nghiệm, và tài liệu nhân hiện hành mô tả nó như bản nâng cấp của ext3 với các cải tiến về quy mô và độ tin cậy 9. Mức tối thiểu hiện hành đã lên 1.41.4, kiểm tra bằnge2fsck -V6.Gặp ở đâu. Năm 2006 ext4 còn là thử nghiệm 4; ngày nay nó đã là hệ tệp chính thức và rất phổ biến 9. Nhớ nhé: thứ ghi là “thử nghiệm” trong sách cũ có khi giờ đã thành tiêu chuẩn.
Where you see it. The book checks with
tune2fsand points at e2fsprogs.sourceforge.net 4. His forecast came true: ext4 is no longer experimental, and current kernel documentation describes it as an advanced level of ext3 with scalability and reliability enhancements 9. The present minimum is 1.41.4, checked withe2fsck -V6. -
jfsutils · reiserfsprogs · xfsprogs
JFS, ReiserFS, XFS — ba cái tên, ba số phận khác nhau Ba hệ tệp khác, ba bộ đồ khác JFS, ReiserFS, XFS — three names, three fates
Cấu trúc ba mục này giống hệt nhau: muốn dùng JFS của IBM thì phải có
jfsutils, tối thiểu 1.1.3, kiểm tra bằngfsck.jfs -V; muốn dùng ReiserFS thì phải córeiserfsprogs, tối thiểu 3.6.3, kiểm tra bằngreiserfsck -V; muốn dùng XFS của SGI thì phải cóxfsprogs, tối thiểu 2.6.0, kiểm tra bằngxfs_db -V4. Ba dòng giống nhau về hình thức, nhưng hai mươi năm sau chúng đã đi về ba hướng rất khác.Ba hệ tệp khác: JFS của IBM cần
jfsutils, ReiserFS cầnreiserfsprogs, XFS của SGI cầnxfsprogs4. Mỗi bộ có lệnh kiểm tra riêng 4. Nhớ nhé: ba cái tên trong sách cũ, giờ số phận mỗi cái một khác.These three entries share one structure: to use IBM's JFS you must have
jfsutils, minimum 1.1.3, checked withfsck.jfs -V; to use ReiserFS you must havereiserfsprogs, minimum 3.6.3, checked withreiserfsck -V; to use SGI's XFS you must havexfsprogs, minimum 2.6.0, checked withxfs_db -V4. Three identically shaped lines — but twenty years on they have gone in three very different directions.Bạn thấy nó ở đâu. Bảng yêu cầu tối thiểu hiện hành vẫn giữ nguyên
jfsutils1.1.3 vàxfsprogs2.6.0 — đúng bằng con số trong sách — nhưng đã không còn dòngreiserfsprogsnào 6. ReiserFS đã bị gỡ khỏi nhân ở bản 6.13 năm 2025 8.Gặp ở đâu. Hôm nay JFS và XFS vẫn còn, với đúng con số cũ 6; còn ReiserFS đã bị xóa khỏi nhân từ bản 6.13 8. Nhớ nhé: hệ tệp cũng có tuổi thọ.
Where you see it. The current minimum-requirements table still carries
jfsutils1.1.3 andxfsprogs2.6.0 — the very numbers in the book — but has noreiserfsprogsrow at all 6. ReiserFS was removed from the kernel in release 6.13, in 2025 8.Vì sao một hệ tệp biến mất
ReiserFS là hệ tệp có nhật ký đầu tiên được đưa vào nhân chuẩn, từ bản 2.4.1 8. Cộng đồng bàn việc gỡ nó từ đầu năm 2022 vì các vấn đề kỹ thuật cố hữu và tình trạng thiếu người bảo trì, và việc gỡ hoàn tất ở nhân 6.13 năm 2025 8. Đây là ví dụ sống cho lời dặn mở đầu chương: hãy tra bảng trong cây mã bạn đang dùng, đừng tin danh sách in sẵn.
Điều chương này không nói
Danh sách của sách phản ánh đúng năm 2006 và vì thế không có Btrfs hay các hệ tệp sinh sau. Bảng yêu cầu hiện hành đã bổ sung
btrfs-progsvàsquashfs-toolsvào cùng chỗ với các gói cũ 6. Khuôn mẫu “mỗi hệ tệp một gói công cụ” thì không đổi — chỉ danh mục là đổi. -
quota-tools · nfs-utils
quota-tools và nfs-utils — hai chức năng nhân cần người phiên dịch Hạn mức đĩa và chia sẻ qua mạng quota-tools and nfs-utils — two kernel features needing an interpreter
Hai gói cuối không gắn với một định dạng đĩa mà với một chức năng của nhân. Muốn dùng chức năng hạn mức của nhân thì phải có
quota-tools: gói này gồm các chương trình cho phép đặt hạn mức cho người dùng, cung cấp thống kê về lượng hạn mức mà từng người đang dùng, và phát cảnh báo khi ai đó sắp cạn hạn mức khả dụng 4. Muốn dùng hệ tệp NFS cho đúng thì phải cónfs-utils: gói này gồm các chương trình cho phép bạn gắn phân vùng NFS ở phía máy khách, và chạy một máy chủ NFS 4.Hai gói cuối không gắn với ổ đĩa mà gắn với chức năng.
quota-toolsđể đặt hạn mức dung lượng cho từng người dùng và cảnh báo khi sắp hết 4.nfs-utilsđể dùng ổ đĩa chia sẻ qua mạng, cả phía nhận lẫn phía cho 4. Nhớ nhé: nhân có chức năng, nhưng cần công cụ mới gọi ra được.The last two packages attach not to a disk format but to a kernel function. To use the kernel's quota functionality you must have
quota-tools: it includes programs that let you set quotas on users, provide statistics on how much quota different users are consuming, and issue warnings when people get too close to using up their available filesystem quota 4. To use the NFS filesystem properly you must havenfs-utils: it includes programs that let you mount NFS partitions as a client, and run an NFS server 4.Bạn thấy nó ở đâu. Mức tối thiểu là quota-tools 3.09 (
quota -V) và nfs-utils 1.0.5 (showmount --version) 4 — và đây là hai dòng hiếm hoi mà bảng hiện hành giữ nguyên cả con số lẫn lệnh kiểm tra 6. Hãy nhớ hai chú thích về tên gói: Debian gọi chúng làquotavànfs-common4.Gặp ở đâu. Gõ
quota -Vvàshowmount --versionđể kiểm tra 4. Trên Debian, hai gói này mang tên khác:quotavànfs-common4. Nhớ nhé: cùng một phần mềm có thể mang hai cái tên.Where you see it. The minimums are quota-tools 3.09 (
quota -V) and nfs-utils 1.0.5 (showmount --version) 4 — and these are two of the rare rows where today's table keeps both number and command unchanged 6. Remember the package-name footnotes: Debian calls themquotaandnfs-common4.
Ba hiểu lầm thường gặpThree common misconceptions
“Phải cài hết danh sách mới dựng được nhân”“You must install the whole list before building”
Hiểu lầm: chương này là điều kiện cần để biên dịch. Thực tế: chỉ ba gói là cần để dựng thành công một nhân 2; phần còn lại thuộc mục “Tools to Use the Kernel”, tức để chạy nhân đó, và nhiều gói trong đó chỉ cần khi bạn thật sự dùng hệ tệp hoặc phần cứng tương ứng 34.
Myth: this chapter is a precondition for compiling. Fact: only three packages are needed to successfully build a kernel 2; the rest belong to “Tools to Use the Kernel”, i.e. to run it, and many are only needed if you actually use the matching filesystem or hardware 34.
“Cứ cài bản mới nhất cho mọi thứ”“Just install the newest of everything”
Hiểu lầm: mới nhất luôn an toàn nhất. Thực tế: ông khuyên ngược chiều nhau tùy gói — với gcc thì cảnh báo rằng một số bản mới nhất không dựng nhân đúng cách 2, còn với make, util-linux, module-init-tools và e2fsprogs thì khuyến nghị lấy bản mới nhất 234. Riêng udev thì nên dùng đúng bản của bản phân phối 5.
Myth: newest is always safest. Fact: his advice runs in opposite directions per package — for gcc he warns that some of the newest releases do not build the kernel properly 2, while for make, util-linux, module-init-tools and e2fsprogs he recommends the latest 234. For udev specifically, use the version your distribution ships 5.
“Các con số trong sách vẫn dùng được”“The numbers in the book still apply”
Hiểu lầm: cứ chép theo bảng in trong sách. Thực tế: chính ông dặn phải tra Documentation/Changes của cây mã bạn đang dùng, vì chương này dựa trên nhân 2.6.18 1. Tệp ấy nay là Documentation/process/changes.rst, nơi gcc đã lên 8.1 và module-init-tools đã được thay bằng kmod 13 6.
Myth: copy the printed table. Fact: he himself instructs you to consult Documentation/Changes in the tree you are actually using, because this chapter was based on the 2.6.18 kernel 1. That file is now Documentation/process/changes.rst, where gcc has risen to 8.1 and module-init-tools has been replaced by kmod 13 6.
Tự kiểmSelf-check
Tự kiểm trước khi sang chương 3 Tự hỏi mình vài câu Self-check before Chapter 3
Chương này thì có lệnh để gõ — và tất cả đều vô hại, chỉ in ra số phiên bản. Chạy chúng bằng tài khoản thường, ghi lại kết quả, rồi đối chiếu với bảng trong cây mã nguồn bạn sắp tải về.
Chương này có mấy lệnh để gõ thử, đều an toàn vì chỉ hiện số phiên bản. Chạy bằng tài khoản thường thôi. Nhớ nhé: ghi lại kết quả để lát nữa so sánh.
This chapter does have commands to type — all of them harmless, printing only version numbers. Run them as a normal user, write down the results, then compare against the table in the source tree you are about to download.
- Bạn kể được ba gói bắt buộc để dựng nhân, và vai trò riêng của từng gói trong chuỗi?
Đáp án của sách: một trình biên dịch, một trình liên kết, và một công cụ
make2. - Bạn chạy được ba lệnh kiểm tra
gcc --version,ld -v,make --versionvà đọc ra ba con số?Cả ba lệnh đều lấy nguyên từ sách 2 và vẫn là lệnh chuẩn trong bảng yêu cầu hiện hành 6.
- Bạn giải thích được vì sao ông khuyên lấy bản
makemới nhất nhưng lại cảnh báo về bản gcc mới nhất? - Bạn nói được vì sao đổi nhân có thể buộc phải nâng cấp vài gói không gian người dùng, và kể tên một gói như vậy?
Ví dụ rõ nhất trong sách:
modutilsđời cũ không chạy đúng với nhân 2.6, phải thay bằng module-init-tools 3. - Bạn biết mình đang dùng hệ tệp nào, và gói công cụ tương ứng đã có trên máy chưa?
- Bạn biết sẽ mở tệp nào trong cây mã nguồn để lấy bảng phiên bản đúng cho nhân bạn định dựng?
- Ba món cần có để dựng nhân là gì?
- Bạn đã thử gõ
gcc --version,ld -vvàmake --versionchưa? - Vì sao có món nên lấy bản mới, có món thì không?
- Máy bạn đang dùng hệ tệp nào — ext4 hay loại khác?
- Nhớ nhé: trả lời được hết thì sang chương 3 lấy mã nguồn thôi.
- Can you name the three packages required to build a kernel, and each one's role in the chain?
The book's answer: a compiler, a linker, and a make utility 2.
- Can you run
gcc --version,ld -vandmake --versionand read off three numbers?All three commands come straight from the book 2 and remain standard in today's requirements table 6.
- Can you explain why he recommends the newest
makeyet warns against the newest gcc? - Can you say why changing kernels may force a userspace upgrade, and name one such package?
The clearest example in the book: the older
modutilsdoes not work properly with the 2.6 kernel and must be replaced by module-init-tools 3. - Do you know which filesystem you are running, and whether its tool package is installed?
- Do you know which file in the source tree holds the correct version table for the kernel you intend to build?
Đọng lạiWhat remains
Để dựng một nhân, bạn chỉ cần ba gói: một trình biên dịch, một trình liên kết, và
make. Danh sách dài phía sau không phải hàng rào — nó là bản đồ những chỗ mà nhân và phần còn lại của hệ thống chạm vào nhau. Và bài học bền nhất của chương không phải một con số nào, mà là một thói quen: tra bảng phiên bản trong chính cây mã bạn đang dựng.Dựng nhân chỉ cần ba món đồ nghề. Danh sách dài còn lại là để chạy nhân, không phải để làm ra nó. Và điều đáng nhớ nhất không phải con số nào, mà là thói quen mở tệp danh sách trong bộ mã nguồn ra đọc. Nhớ nhé: sách chỉ cách làm, cây mã cho con số.
To build a kernel you need only three packages: a compiler, a linker, and
make. The longer list is not a barrier — it is a map of the places where the kernel and the rest of the system touch. And the chapter's most durable lesson is not a number but a habit: read the version table inside the very tree you are building.