Linux Kernel in a Nutshell · Chương 11 · Tham chiếu tùy chọn cấu hìnhChapter 11 · Kernel Configuration Option Reference
Mức đọcLevel

Phần III · Tham chiếu nhân · Chương 11Part III · Kernel Reference · Chapter 11

Một bản đồ các tùy chọn, không phải một danh mục đầy đủ Bản đồ các nút bấm trong nhân A map of the options, not a complete catalogue

Chương dài nhất của cuốn sách cũng là chương khiêm tốn nhất về tham vọng. Kroah-Hartman mở đầu bằng đúng một câu định phạm vi: chương này liệt kê những tùy chọn cấu hình quan trọng nhất được đưa ra khi bạn chạy make config hoặc một trong các giao diện đồ họa của nó 1. Không phải tất cả. Ở chương 4 ông đã nói thẳng con số: nhân chứa “gần hai nghìn tùy chọn cấu hình khác nhau” 5 — và chương 11 chỉ chọn ra vài trăm.

Đây là chương dài nhất sách, nhưng nó không cố kể hết. Ông Greg nói rõ: chương này chỉ liệt kê những tùy chọn quan trọng nhất mà bạn gặp khi chạy make config 1. Nhân có gần hai nghìn tùy chọn 5, kể hết thì không nổi. Nhớ nhé: đây là tấm bản đồ rút gọn, không phải cuốn từ điển.

The book's longest chapter is also its most modest in ambition. Kroah-Hartman opens with a single scope-setting sentence: this chapter lists the most important configuration options offered when you run make config or one of its graphical interfaces 1. Not all of them. In Chapter 4 he gave the number plainly: the kernel contains “almost two thousand different configuration options” 5 — and Chapter 11 picks out a few hundred.

Con số ấy là ảnh chụp năm 2006 của dòng nhân 2.6. Tháng 9-2025, LWN dẫn phân tích cho biết nhân 6.16 có 32.468 tùy chọn cấu hình trên kiến trúc x86_64, và số cách tổ hợp chúng là một con số có 6.550 chữ số 21. Nghĩa là khoảng cách giữa “những tùy chọn quan trọng nhất” và “tất cả tùy chọn” đã rộng ra gấp bội kể từ khi sách in — lý do để đọc chương này như một cách đọc, chứ không phải một danh sách để tra.

Luận điểm chương 11. Phần lớn chương này dựa trên tài liệu nằm sẵn trong nhân cho từng tùy chọn cấu hình — do chính các nhà phát triển nhân viết và phát hành theo giấy phép GPL 1. Vì vậy giá trị lâu bền của chương không nằm ở danh sách, mà ở việc dạy bạn đọc chính nguồn ấy: khi sách cũ đi, cây mã nguồn vẫn tự mô tả nó.

Ý chính. Những lời giải thích trong chương này được lấy từ tài liệu có sẵn ngay trong mã nguồn nhân, do người viết nhân soạn 1. Nhớ nhé: học cách đọc tài liệu đó thì bạn không bao giờ lỗi thời.

Chapter 11 thesis. The majority of the chapter is based on the in-kernel documentation for the different configuration options, written by the kernel developers and released under the GPL 1. So the chapter's lasting value is not the list but the reading skill: when the book ages, the source tree still describes itself.

Cụm khái niệm 01Concept cluster 01

Đọc một mục Kconfig: bốn thứ luôn có mặt Một dòng cấu hình gồm những gì Reading a Kconfig entry: four things always present

Chương 11 trình bày mỗi tùy chọn theo đúng một khuôn: cột trái là ký hiệu — EXPERIMENTAL, MODULES, SMP — cột phải là dòng nhắc mà giao diện cấu hình hiển thị, rồi đến đoạn giải thích 1. Khuôn ấy không phải do ông nghĩ ra: nó là hình chiếu của cú pháp Kconfig có thật trong cây mã. Nắm được cú pháp gốc thì bạn đọc được mọi tùy chọn, kể cả những cái ra đời sau khi sách in.

Mỗi mục trong chương có ba phần: cái tên viết hoa, một câu nhắc ngắn, và phần giải thích 1. Ba phần ấy đến thẳng từ mã nguồn nhân. Nhớ nhé: học khuôn này một lần, đọc được tất cả.

Chapter 11 lays out every option in one fixed shape: the symbol on the left — EXPERIMENTAL, MODULES, SMP — the prompt the configuration front end displays on the right, then the explanatory text 1. That shape is not his invention: it is a projection of the real Kconfig syntax in the tree. Learn the underlying syntax and you can read any option, including the ones born after the book went to press.

Tài liệu Kconfig hiện hành mô tả một mục bắt đầu bằng từ khóa config theo sau là ký hiệu, rồi các thuộc tính; các từ khóa khác kết thúc một mục là menuconfig, choice/endchoice, comment, menu/endmenu, if/endif và source 6. Những mục “chọn một trong nhiều” mà bạn thấy ở chương 11 — mô hình chiếm dụng, mô hình bộ nhớ, bộ điều phối vào/ra mặc định — chính là các khối choice, nơi chỉ một mục con được chọn 6.

Kconfig. Ngôn ngữ khai báo mà nhân dùng để mô tả từng tùy chọn: tên, kiểu, điều kiện hiển thị và đoạn trợ giúp. Các tệp Kconfig rải khắp cây mã và được nối lại bằng từ khóa source 6; make menuconfig chỉ là một trình đọc chúng.

Kconfig là gì. Là “ngôn ngữ khai báo nút bấm” của nhân. Mỗi thư mục mã có tệp Kconfig riêng, nối vào nhau bằng source 6. Nhớ nhé: menu bạn thấy là do các tệp ấy sinh ra.

Kconfig. The declarative language the kernel uses to describe each option: name, type, visibility condition and help text. Kconfig files are scattered across the tree and stitched together with the source keyword 6; make menuconfig is merely a reader for them.

config <SYMBOL>
  bool | tristate "dòng nhắc"
  depends on <điều kiện>
  select <ký hiệu khác>
  help ...
→ CONFIG_SYMBOL=y|m|n

tên tùy chọn
+ kiểu (bật/tắt hay có module)
+ cần gì mới hiện ra
+ lời giải thích
→ y (vào nhân) · m (module) · n (bỏ)

config <SYMBOL>
  bool | tristate "prompt"
  depends on <condition>
  select <other symbol>
  help ...
→ CONFIG_SYMBOL=y|m|n

  1. symbol & prompt

    Ký hiệu và dòng nhắc — hai cái tên của cùng một thứ Tên máy và tên người Symbol and prompt — two names for one thing

    Cột trái trong chương 11 là ký hiệu; cột phải là dòng nhắc. Ví dụ IKCONFIG có dòng nhắc “Kernel .config support”, và đoạn trợ giúp cho biết nó nhúng toàn bộ nội dung tệp .config vào chính nhân, có thể trích ra bằng scripts/extract-ikconfig hoặc đọc từ /proc/config.gz của nhân đang chạy 2. Khi tìm kiếm trong menuconfig, bạn gõ ký hiệu; khi đọc menu bằng mắt, bạn thấy dòng nhắc.

    Mỗi tùy chọn có hai tên: tên viết hoa cho máy, và câu tiếng Anh cho người. Ví dụ IKCONFIG hiện ra là “Kernel .config support”, và nó cất bản cấu hình ngay trong nhân để sau này đọc lại qua /proc/config.gz 2. Nhớ nhé: tìm thì tìm theo tên viết hoa.

    The left column in Chapter 11 is the symbol; the right column is the prompt. IKCONFIG, for instance, is prompted as “Kernel .config support”, and its help text explains that it saves the complete .config contents inside the kernel, extractable with scripts/extract-ikconfig or readable from /proc/config.gz on a running kernel 2. You search by symbol; you read menus by prompt.

    Bạn thấy nó ở đâu. Mọi dòng trong tệp .config của bạn đều là CONFIG_<ký hiệu>=y|m hoặc một dòng chú thích “is not set”. Tiền tố CONFIG_ là mặc định và có thể đổi bằng biến môi trường cùng tên 7.

    Gặp ở đâu. Mở tệp .config ra, mỗi dòng là một tùy chọn kèm =y hoặc =m. Nhớ nhé: đó chính là danh sách nút bạn đã bấm.

    Where you see it. Every line in your .config is CONFIG_<symbol>=y|m or an “is not set” comment. The CONFIG_ prefix is the default and can be overridden with an environment variable of the same name 7.

    Ký hiệu đổi tên

    Tài liệu hiện hành cảnh báo rằng các bản nhân mới không chỉ thêm ký hiệu mà còn đổi tên ký hiệu; khi đó dùng lại một .config cũ với make oldconfig không chắc cho ra nhân chạy được 7. Đây chính là lý do một phần chương 11 không còn tra được nguyên văn.

    Công cụ soi khác biệt

    Để thấy ký hiệu mới xuất hiện: make listnewconfig liệt kê từng cái một dòng; hoặc chạy make oldconfig rồi scripts/diffconfig .config.old .config 7.

  2. tristate: y / m / n

    Kiểu — vì sao một số tùy chọn có ba trạng thái Bật, rời, hay bỏ Type — why some options have three states

    Mục MODULES là chìa khóa của cả hệ thống: nó bật khả năng nạp module, và đoạn trợ giúp nói rõ rằng khi chọn nó, nhiều phần của nhân có thể được dựng thành module bằng cách trả lời M thay vì yes — hữu ích nhất cho những tính năng ít dùng và không cần lúc khởi động 2. Nói cách khác: MODULES chính là thứ biến các tùy chọn khác từ hai trạng thái thành ba.

    Có tùy chọn chỉ bật/tắt, có tùy chọn thêm lựa chọn thứ ba là “làm thành mảnh rời”. Mảnh rời đó gọi là module, và nó có được nhờ tùy chọn MODULES 2. Nhớ nhé: thứ ít dùng thì để thành module.

    The MODULES entry is the key to the whole system: it enables loadable module support, and its help text says plainly that with it selected, many parts of the kernel can be built as modules by answering M instead of yes — most useful for infrequently used options not required for booting 2. In other words, MODULES is what turns other options from two-state into three-state.

    Bạn thấy nó ở đâu. Sách nhắc: nếu trả lời có cho MODULES, bạn sẽ phải chạy make modules_install để đặt module vào /lib/modules, nơi các công cụ như modprobe tìm thấy chúng 2.

    Gặp ở đâu. Dùng module thì phải chạy thêm make modules_install để đặt chúng đúng chỗ 2. Nhớ nhé: quên bước này là module không nạp được.

    Where you see it. The book reminds you: if you say yes to MODULES, you will need to run make modules_install to put the modules under /lib/modules where the module tools can find them 2.

    Chỉ-module

    Một thủ thuật Kconfig hiện hành: viết depends on BAR && m để giới hạn một thành phần chỉ được dựng thành module hoặc tắt hẳn, không cho dựng thẳng vào nhân 6.

    Cảnh báo về hệ thống tệp gốc

    Mục EXT2_FS kèm một cảnh báo đóng khung: hệ thống tệp của phân vùng gốc (phân vùng chứa thư mục /) không thể dựng thành module nếu không dùng một quy trình khởi động đặc biệt, nên để nó ở dạng module có thể nguy hiểm 4. Cùng logic ấy áp cho SCSI 3.

  3. depends on / select

    Phụ thuộc — vì sao tùy chọn bạn tìm không hiện ra Vì sao không thấy nút bạn cần Dependencies — why the option you want is not shown

    Có những mục mà đoạn trợ giúp kết bằng đúng một câu: “tự thân nó không làm gì cả, ngoài việc cho phép bạn chọn các tùy chọn khác.” Sách ghi câu ấy cho cả EXPERIMENTAL và EMBEDDED 2, và DEBUG_KERNEL cũng cùng loại 4. Đó là các cổng: tắt cổng thì cả một nhánh menu biến mất, và người mới thường tưởng tùy chọn mình cần “không tồn tại”.

    Một số nút không làm gì cả — chúng chỉ mở khóa cho các nút khác hiện ra. Sách nói vậy về EXPERIMENTAL và EMBEDDED 2, và DEBUG_KERNEL cũng thế 4. Nhớ nhé: không thấy nút cần tìm thì có thể bạn chưa mở cổng.

    Some entries end their help text with exactly one sentence: “on its own, this option does not do anything except allow you to select other options.” The book records that line for both EXPERIMENTAL and EMBEDDED 2, and DEBUG_KERNEL is of the same kind 4. These are gates: close one and a whole menu branch vanishes, and newcomers conclude the option they need “does not exist”.

    Bạn thấy nó ở đâu. Trong menuconfig, nhấn / rồi gõ ký hiệu: màn hình tìm kiếm liệt kê chính xác chuỗi depends on đang chặn nó. Các giao diện xconfig, menuconfig và nconfig đều có sẵn phần trợ giúp nhúng cho việc này 7.

    Gặp ở đâu. Trong màn hình cấu hình, bấm / rồi gõ tên tùy chọn — nó sẽ nói bạn còn thiếu điều kiện gì 7. Nhớ nhé: dùng ô tìm kiếm trước khi kết luận là không có.

    Where you see it. In menuconfig, press / and type the symbol: the search screen lists the exact depends on chain blocking it. The xconfig, menuconfig and nconfig front ends all carry embedded help for this 7.

    select khác depends on

    Tài liệu Kconfig cảnh báo rằng select ép một ký hiệu thành y bất kể phụ thuộc của nó; vì thế khuôn mẫu khuyến nghị là dùng một ký hiệu nội bộ dạng HAVE_* để kiến trúc select, còn phụ thuộc thật thì đặt ở ký hiệu hiển thị 6.

    Phụ thuộc vào trình biên dịch

    Kconfig ngày nay có thể phụ thuộc vào năng lực của trình biên dịch, ví dụ depends on $(cc-option,-fstack-protector); tiền tố khuyến nghị cho các ký hiệu kiểu này là CC_HAS_ 6. Đây là lớp cú pháp hoàn toàn không có trong ảnh chụp 2006 của sách.

  4. help text

    Đoạn trợ giúp — nguồn thật của chương này Phần giải thích đến từ đâu Help text — this chapter's actual source

    Điều làm chương 11 khác mọi chương khác: tác giả nói trước rằng phần lớn nội dung không phải lời ông, mà là tài liệu trong nhân do các nhà phát triển viết, phát hành theo GPL 1. Đọc kỹ sẽ thấy giọng văn đổi liên tục — chỗ thì khô khan như đặc tả, chỗ lại đùa (“tôi nghe nói kể cả không có card âm thanh, bạn vẫn có thể bắt máy kêu nhiều hơn một tiếng bíp bằng cách lập trình loa PC”) 3.

    Chương này phần lớn không phải lời tác giả, mà là lời giải thích có sẵn trong mã nguồn nhân 1. Vì nhiều người viết nên giọng văn rất khác nhau. Nhớ nhé: đó là lý do có chỗ trang nghiêm, có chỗ đùa.

    What sets Chapter 11 apart: the author says up front that most of its content is not his words but the in-kernel documentation written by kernel developers and released under the GPL 1. Read closely and the voice keeps shifting — dry as a spec in places, joking in others (“I'm told that even without a sound card, you can make your computer create more than an occasional beep by programming the PC speaker”) 3.

    Bạn thấy nó ở đâu. Cùng một đoạn trợ giúp ấy vẫn nằm trong cây mã bạn đang có, dưới các tệp Kconfig, và được kết xuất thành tài liệu chính thức tại kernel.org/doc 8.

    Gặp ở đâu. Mở mã nguồn nhân, tìm tệp tên Kconfig — lời giải thích nằm ngay đó, và bản web chính thức ở kernel.org/doc 8. Nhớ nhé: sách cũ thì tra mã nguồn mới.

    Where you see it. That same help text still sits in the tree you have, under the Kconfig files, and is rendered as the official documentation at kernel.org/doc 8.

Cụm khái niệm 02Concept cluster 02

Nhóm lõi: nhân dạng, CPU, bộ nhớ, vào/ra Nhóm lõi: tên nhân, CPU, bộ nhớ, ổ đĩa The core groups: identity, CPU, memory, I/O

Đây là vùng mà một lựa chọn sai không làm hỏng một thiết bị — nó làm hỏng cả lần khởi động. Bốn nhóm dưới đây là bốn quyết định kiến trúc bạn phải đưa ra trước khi chạm đến bất kỳ driver nào: nhân này tên gì, nó thấy mấy CPU, nó quản bộ nhớ ra sao, và nó xếp hàng vào/ra thế nào.

Đây là những lựa chọn lớn nhất. Chọn sai ở đây thì máy không khởi động được, chứ không phải chỉ hỏng một thiết bị. Bốn câu hỏi: nhân tên gì, thấy mấy CPU, quản bộ nhớ kiểu nào, xếp hàng đọc ghi ổ đĩa ra sao. Nhớ nhé: cẩn thận nhất ở vùng này.

This is the region where a wrong choice does not break a device — it breaks the boot. The four groups below are the four architectural decisions you make before touching any driver: what this kernel is called, how many CPUs it sees, how it manages memory, and how it queues I/O.

Nhân dạng nhân (kernel identity). Tập các tùy chọn quyết định nhân tự xưng là gì và mang theo gì về chính mình: LOCALVERSION nối thêm một chuỗi vào cuối số hiệu phiên bản — chuỗi này hiện ra khi bạn gõ uname, và tối đa 64 ký tự 2.

Nhân dạng là gì. Là cách nhân tự giới thiệu. LOCALVERSION cho bạn gắn thêm một mẩu chữ vào tên phiên bản, thấy được khi gõ uname, dài tối đa 64 ký tự 2. Nhớ nhé: đặt tên riêng để khỏi nhầm với nhân của bản phân phối.

Kernel identity. The set of options deciding what the kernel calls itself and what it carries about itself: LOCALVERSION appends an extra string to the end of the kernel version — it shows up when you run uname, and is capped at 64 characters 2.

LOCALVERSION → uname -r
IKCONFIG     → /proc/config.gz
MODULES      → make modules_install
SMP + NR_CPUS → ~8 KB / CPU 2

đặt tên → thấy ở uname
nhúng cấu hình → đọc lại được
bật module → cài thêm một bước
mỗi CPU thêm → tốn ~8 KB 2

LOCALVERSION → uname -r
IKCONFIG     → /proc/config.gz
MODULES      → make modules_install
SMP + NR_CPUS → ~8 KB / CPU 2

  1. SMP · NR_CPUS · SCHED_SMT

    Bao nhiêu CPU — và cái giá của việc đoán thừa Máy bạn có mấy CPU How many CPUs — and the price of over-guessing

    Đoạn trợ giúp của SMP rất thẳng: nếu bạn nói không, nhân vẫn chạy trên cả máy một và nhiều CPU nhưng chỉ dùng một CPU; nếu bạn nói có, nhân chạy trên nhiều — nhưng không phải tất cả — máy một CPU, và trên máy một CPU thì nhân chạy nhanh hơn nếu bạn nói không 2. NR_CPUS đặt trần số CPU, sách ghi dải 2–255 và nói rõ đây thuần túy là chuyện tiết kiệm bộ nhớ: mỗi CPU được hỗ trợ làm ảnh nhân to thêm khoảng 8 KB 2.

    Nếu máy bạn chỉ có một CPU, chọn “không” cho SMP thì nhân chạy nhanh hơn 2. Còn NR_CPUS là số CPU tối đa nhân biết đến — đặt càng cao thì nhân càng to, mỗi CPU thêm khoảng 8 KB 2. Nhớ nhé: đừng khai nhiều hơn máy bạn có.

    SMP's help text is blunt: say no and the kernel runs on both single- and multiprocessor machines but uses only one CPU of a multiprocessor; say yes and it runs on many — but not all — single-processor machines, and on a single-processor machine the kernel runs faster if you say no 2. NR_CPUS sets the ceiling, which the book gives as 2–255, noting the option is purely about saving memory: each supported CPU adds approximately 8 KB to the kernel image 2.

    Bạn thấy nó ở đâu. SCHED_SMT là tùy chọn kề bên: sách mô tả nó cải thiện quyết định của bộ điều phối trên chip Pentium 4 có HyperThreading, đổi lại một chút phí tổn ở vài chỗ 2.

    Gặp ở đâu. Ngay cạnh là SCHED_SMT, dành cho CPU có HyperThreading; nó giúp chia việc khéo hơn, đổi lại tốn thêm chút ít 2. Nhớ nhé: chỉ bật khi CPU thật sự có tính năng đó.

    Where you see it. SCHED_SMT sits right beside it: the book describes it as improving the CPU scheduler's decision-making on Intel Pentium 4 chips with HyperThreading, at the cost of slightly increased overhead in some places 2.

    Ảnh chụp 2006, không phải hiện tại

    Ví dụ “Pentium 4” trong đoạn trợ giúp cho thấy tuổi của văn bản. SMP, NR_CPUS và SCHED_SMT đều vẫn là ký hiệu có thật trong các dòng nhân gần đây theo cơ sở dữ liệu LKDDb 22, nhưng dải giá trị và mô tả đã đổi; hãy đọc lại đoạn trợ giúp trong cây mã của bạn thay vì tin con số 255.

    Còn danh sách họ CPU thì sao

    Sách dành hơn một trang liệt kê các lựa chọn họ vi xử lý dưới M386: 386, 486, 586, Pentium-Classic, Pentium-MMX, Pentium-Pro, Pentium-II/III/4, K6, Athlon… 2. Đây là phần lão hóa nhanh nhất của chương và là ví dụ rõ nhất vì sao bạn nên tra menu thật.

  2. PREEMPT_NONE / _VOLUNTARY / PREEMPT

    Mô hình chiếm dụng — chọn giữa thông lượng và độ trễ Máy chủ mượt việc, hay máy bàn mượt tay Preemption model — throughput versus latency

    Ba mục liền nhau, và sách gán cho mỗi mục một loại máy. PREEMPT_NONE là mô hình truyền thống, hướng tới tối đa hóa thông lượng, thỉnh thoảng có độ trễ dài hơn — chọn nó cho máy chủ hoặc hệ tính toán khoa học 2. PREEMPT_VOLUNTARY thêm các “điểm chiếm dụng tường minh” để giảm độ trễ tái điều phối, đổi lại thông lượng thấp hơn chút ít — chọn cho máy bàn 2. PREEMPT làm mọi mã nhân ngoài vùng tới hạn đều có thể bị chiếm dụng — chọn cho máy bàn hoặc hệ nhúng cần độ trễ cỡ mili-giây 2.

    Ba kiểu, ba loại máy. Kiểu “không chiếm dụng” cho máy chủ: làm được nhiều việc nhưng thỉnh thoảng khựng 2. Kiểu “tự nguyện” cho máy bàn: mượt hơn, chậm hơn tí 2. Kiểu “chiếm dụng đầy đủ” cho máy cần phản ứng cực nhanh 2. Nhớ nhé: mượt tay và làm nhiều việc là hai thứ đánh đổi nhau.

    Three adjacent entries, each assigned a machine class. PREEMPT_NONE is the traditional model geared toward maximising throughput, with occasional longer delays — pick it for a server or scientific/computation system 2. PREEMPT_VOLUNTARY adds more “explicit preemption points” to reduce rescheduling latency at the cost of slightly lower throughput — pick it for a desktop 2. PREEMPT makes all kernel code outside critical sections preemptible — pick it for a desktop or an embedded system with latency requirements in the milliseconds range 2.

    Bạn thấy nó ở đâu. Từ nhân 5.12, lựa chọn này không còn bị đóng cứng lúc biên dịch: bản phát hành ấy thêm tham số khởi động preempt=none|voluntary|full cùng một công tắc trong debugfs để đổi lúc đang chạy, hiện thực bằng vá mã thời gian chạy 17.

    Gặp ở đâu. Ngày nay bạn không cần biên dịch lại để đổi kiểu này: từ nhân 5.12 có thể chọn ngay lúc khởi động bằng preempt= 17. Nhớ nhé: cái sách bảo phải chọn trước, giờ chọn sau cũng được.

    Where you see it. Since kernel 5.12 the choice is no longer frozen at build time: that release added the preempt=none|voluntary|full boot options plus a debugfs switch to change it at runtime, implemented via runtime patching 17.

    Một mục đã biến mất

    Sách còn liệt kê PREEMPT_BKL — “chiếm dụng Khóa Nhân Lớn” — và khuyên nói có nếu dựng cho máy bàn 2. Theo LKDDb, ký hiệu này chỉ tồn tại tới khoảng nhân 2.6.25 22, và bản thân Khóa Nhân Lớn đã bị gỡ hoàn toàn khỏi mã nguồn ở 2.6.39 19. Đây là một tùy chọn chỉ-2006.

    Ký hiệu mới thay chỗ

    Cơ chế chọn-lúc-khởi-động nói trên mang ký hiệu PREEMPT_DYNAMIC, mà LKDDb ghi nhận xuất hiện từ khoảng nhân 5.16 trở đi 22. Một mục mới thay thế một mục cũ — đúng kiểu thay đổi mà make listnewconfig sinh ra để bạn phát hiện 7.

  3. NOHIGHMEM · HIGHMEM4G · HIGHMEM64G

    Bộ nhớ cao — di sản của không gian địa chỉ 32 bit Khi RAM nhiều hơn chỗ chứa địa chỉ High memory — the 32-bit address-space legacy

    Đoạn trợ giúp giải thích mạch lạc một nghịch lý phần cứng: Linux dùng được tới 64 GB RAM vật lý trên hệ x86, nhưng không gian địa chỉ của vi xử lý x86 32 bit chỉ 4 GB — phần RAM vật lý không được ánh xạ thường trực gọi là bộ nhớ cao 2. Quy tắc chọn rất gọn: dưới 1 GB thì tắt (mặc định, hợp với đa số), cho ra kiểu chia 3 GB/1 GB; 1–4 GB thì chọn 4GB; trên 4 GB thì chọn 64GB, bật chế độ PAE của Intel 2.

    Máy 32 bit chỉ “đánh số” được tới 4 GB, nhưng RAM có thể nhiều hơn thế. Phần dôi ra gọi là bộ nhớ cao 2. Dưới 1 GB thì tắt, 1–4 GB chọn 4GB, trên 4 GB chọn 64GB 2. Nhớ nhé: chọn sai ở đây máy có thể không khởi động.

    The help text explains a hardware paradox cleanly: Linux can use up to 64 GB of physical memory on x86, but the address space of a 32-bit x86 processor is only 4 GB — the physical memory not permanently mapped is called high memory 2. The selection rule is terse: under 1 GB, answer off (the default, suitable for most users), giving a 3 GB/1 GB split; between 1 and 4 GB, answer 4GB; above 4 GB, answer 64GB, which turns on Intel PAE mode 2.

    Bạn thấy nó ở đâu. Sách in hẳn một cảnh báo đóng khung: nếu chọn 64GB, nhân sẽ không khởi động trên CPU không hỗ trợ PAE 2. Đây là một trong số ít chỗ trong chương mà hậu quả là máy không lên.

    Gặp ở đâu. Sách cảnh báo in đậm: chọn 64GB mà CPU không hỗ trợ PAE thì máy không khởi động được 2. Nhớ nhé: kiểm tra CPU trước khi chọn.

    Where you see it. The book prints a boxed warning: if you say 64GB, the kernel will not boot on CPUs that don't support PAE 2. It is one of the few places in the chapter where the penalty is a dead machine.

    Mô hình bộ nhớ: ba thành hai

    Sách trình bày ba lựa chọn mô hình bộ nhớ — FLATMEM_MANUAL, DISCONTIGMEM_MANUAL, SPARSEMEM_MANUAL — và khuyên: nếu phân vân giữa sparse và discontiguous thì chọn discontiguous 2. Lời khuyên ấy nay đã hết hiệu lực: mô hình DISCONTIGMEM bị gỡ khỏi nhân ở bản 5.14 10, và tài liệu hiện hành chỉ còn nói tới hai mô hình, FLATMEM và SPARSEMEM 9.

    Vì sao SPARSEMEM thắng

    Tài liệu hiện hành mô tả SPARSEMEM là mô hình linh hoạt nhất và là mô hình duy nhất hỗ trợ các tính năng như cắm nóng/rút nóng bộ nhớ vật lý 9. Đúng chỗ mà sách 2006 ghi là điểm yếu của DISCONTIGMEM 2.

  4. IOSCHED_NOOP / _AS / _DEADLINE / _CFQ

    Bộ điều phối vào/ra — bốn cách xếp hàng cho ổ đĩa Bốn kiểu xếp hàng đọc ghi ổ đĩa I/O schedulers — four ways to queue a disk

    Sách liệt kê bốn: IOSCHED_NOOP tối giản, chỉ gộp và sắp xếp cơ bản, dùng cho thiết bị khối không phải đĩa như thiết bị nhớ 2; IOSCHED_AS — bộ điều phối mặc định ở thời điểm đó — nói chung là lựa chọn tốt nhưng khá lớn và phức tạp, có thể chậm hơn dưới một số tải cơ sở dữ liệu 2; IOSCHED_DEADLINE đơn giản và gọn, thường tốt ngang bộ anticipatory và dưới vài tải cơ sở dữ liệu còn tốt hơn 2; IOSCHED_CFQ cố chia đều băng thông cho mọi tiến trình, hợp với hệ máy bàn 2.

    Ổ đĩa chỉ làm được một việc một lúc, nên nhân phải xếp hàng các yêu cầu. Sách kể bốn kiểu xếp hàng: kiểu tối giản, kiểu “chờ một nhịp”, kiểu “theo hạn chót”, và kiểu “chia đều cho mọi chương trình” 2. Nhớ nhé: kiểu chia đều hợp với máy bàn.

    The book lists four: IOSCHED_NOOP, minimal, doing basic merging and sorting, for non-disk block devices such as memory devices 2; IOSCHED_AS — the default disk scheduler at the time — generally a good choice but quite large and complex, and slower under some database loads 2; IOSCHED_DEADLINE, simple and compact, often as good as anticipatory and better under some database workloads 2; and IOSCHED_CFQ, which tries to distribute bandwidth equally among all processes, suitable for desktop systems 2.

    Bạn thấy nó ở đâu. Không còn ở đâu cả, dưới những cái tên này. Bộ anticipatory bị gỡ ở nhân 2.6.33, với ghi chú “được thay bằng bộ điều phối mặc định, CFQ” 15; rồi toàn bộ tầng khối cũ cùng ba bộ noop, deadline và cfq bị xóa trong một lần dọn dẹp tiến vào nhân 5.0 14.

    Gặp ở đâu. Không gặp nữa. Cả bốn cái tên này đều đã bị gỡ khỏi nhân — cái đầu ở bản 2.6.33 15, ba cái còn lại ở bản 5.0 14. Nhớ nhé: đây là phần cũ nhất của chương.

    Where you see it. Nowhere, under these names. The anticipatory scheduler was removed in 2.6.33, noted as “replaced by the default io scheduler, CFQ” 15; then the whole legacy block layer along with noop, deadline and cfq was deleted in the cleanup that landed in 5.0 14.

    Cái gì thay chỗ

    Bộ kế thừa tinh thần của CFQ là BFQ. Tài liệu nhân hiện hành mô tả BFQ là bộ điều phối chia theo tỷ lệ, phân phối băng thông chứ không chỉ thời gian, giữa các tiến trình hoặc nhóm, và ở cấu hình mặc định nó ưu tiên độ trễ hơn thông lượng 16. Ý niệm “công bằng cho máy bàn” của sách vẫn sống, chỉ mang tên khác.

    Đọc ảnh chụp cho đúng

    Câu “anticipatory là bộ điều phối đĩa mặc định” 2 đúng vào lúc sách in và sai kể từ 2.6.33 15. Khi một câu trong chương 11 nói về mặc định, hãy luôn đọc nó như “mặc định năm 2006”.

  5. SECCOMP · KEXEC

    Hai tùy chọn 2006 đã trở thành hạ tầng Hai cái tên nhỏ, sau này thành lớn Two 2006 options that became infrastructure

    Sách giới thiệu SECCOMP như một tiện ích hẹp: hữu ích cho ứng dụng tính toán cần chạy mã byte không tin cậy; một khi bật qua /proc/pid/seccomp thì không tắt được nữa, và tác vụ chỉ còn được gọi vài lời gọi hệ thống an toàn 2. KEXEC thì được mô tả là “lời gọi hệ thống kexec (thử nghiệm)”: tắt nhân hiện tại và khởi động một nhân khác, giống khởi động lại nhưng độc lập với phần sụn hệ thống — và sách thành thật cảnh báo “đừng ngạc nhiên nếu đoạn mã này ban đầu không chạy được” 2.

    Hai tùy chọn nhỏ trong sách, sau này thành rất quan trọng. SECCOMP nhốt một chương trình lại, chỉ cho nó gọi vài lệnh an toàn, và đã bật thì không tắt được 2. KEXEC cho phép nhảy thẳng sang một nhân khác mà không khởi động lại máy 2. Nhớ nhé: thứ ghi “thử nghiệm” năm 2006 có thể là nền tảng của hôm nay.

    The book introduces SECCOMP as a narrow utility: useful for number-crunching applications that may need to compute untrusted bytecode; once enabled via /proc/pid/seccomp it cannot be disabled, and the task may execute only a few safe syscalls 2. KEXEC is described as “kexec system call (experimental)”: shut down your current kernel and start up another, like a reboot but independent of the system firmware — and the book honestly warns, “do not be surprised if this code does not initially work for you” 2.

    Bạn thấy nó ở đâu. Cả hai ký hiệu vẫn có mặt trong các dòng nhân gần đây theo LKDDb 22 — nhưng vai trò đã khác hẳn những gì đoạn trợ giúp 2006 gợi ý. Đừng suy ra hành vi hiện tại từ mô tả cũ; hãy đọc đoạn trợ giúp trong cây mã của bạn.

    Gặp ở đâu. Hai cái tên này vẫn còn trong nhân ngày nay 22, nhưng chúng đã lớn hơn nhiều so với mô tả trong sách. Nhớ nhé: tên còn, nghĩa đã đổi.

    Where you see it. Both symbols are still present in recent kernel series per LKDDb 22 — but their role is nothing like what the 2006 help text suggests. Do not infer current behaviour from the old description; read the help text in your own tree.

Cụm khái niệm 03Concept cluster 03

Nguồn điện, bus, lưu trữ, hệ thống tệp, gỡ lỗi Điện, cổng cắm, ổ đĩa, tệp, và công cụ soi lỗi Power, buses, storage, filesystems, debugging

Từ trang 130 tới hết chương, sách đi qua các vùng menu lần lượt: quản lý nguồn, PCI và PCMCIA, mạng, lưu trữ, thiết bị nhập, âm thanh, USB, hệ thống tệp, rồi khép lại bằng gỡ lỗi và an ninh 34. Ta không chép lại danh sách — ta lấy từ mỗi vùng một mục mà việc đọc nó dạy được điều gì đó về cách suy nghĩ khi cấu hình.

Phần còn lại của chương đi qua từng khu: điện, cổng cắm, mạng, ổ đĩa, bàn phím chuột, âm thanh, USB, hệ thống tệp, rồi công cụ soi lỗi 34. Ở đây ta chỉ lấy vài ví dụ tiêu biểu. Nhớ nhé: học cách nghĩ, đừng học thuộc danh sách.

From page 130 to the end, the book walks the menu regions in order: power management, PCI and PCMCIA, networking, storage, input devices, sound, USB, filesystems, then closes with debugging and security 34. We do not reproduce the list — we take from each region one entry whose reading teaches something about how to think while configuring.

Cổng menu (menu gate). Một tùy chọn mà cả một nhánh phụ thuộc vào. PM là ví dụ điển hình: bật quản lý nguồn rồi mới chọn được một trong hai chuẩn cạnh tranh — APM hoặc ACPI 3. Tương tự, NET mở đường cho toàn bộ cây mạng, và sách khuyên nói có “trừ khi bạn là chuyên gia và có lý do thật tốt để không” 3.

Cổng menu là gì. Là cái nút mở ra cả một khu. Bật PM mới chọn được kiểu tiết kiệm điện 3; bật NET mới có phần mạng, và sách bảo hầu như ai cũng nên bật 3. Nhớ nhé: tìm cổng trước, tìm nút con sau.

Menu gate. An option a whole branch hangs off. PM is the classic case: enable power management first, then choose between the two competing standards, APM or ACPI 3. Likewise NET opens the entire networking tree, and the book advises saying yes “unless you are an expert with a really good reason not to” 3.

PM   → ACPI → CPU_FREQ → governor
NET  → INET → NETFILTER
SCSI → BLK_DEV_SD → BLK_DEV_MD → BLK_DEV_DM
DEBUG_KERNEL → DEBUG_FS · KPROBES

bật điện → chọn chuẩn → chỉnh tốc độ CPU
bật mạng → chọn giao thức → tường lửa
bật ổ đĩa → gộp RAID → quản lý ổ ảo
bật gỡ lỗi → mở các công cụ soi

PM   → ACPI → CPU_FREQ → governor
NET  → INET → NETFILTER
SCSI → BLK_DEV_SD → BLK_DEV_MD → BLK_DEV_DM
DEBUG_KERNEL → DEBUG_FS · KPROBES

  1. CPU_FREQ · governors

    Điều tốc CPU — tùy chọn không tự làm gì Chỉnh tốc độ CPU cho đỡ tốn điện CPU frequency scaling — the option that does nothing by itself

    Đoạn trợ giúp của CPU_FREQ nói một điều mà người mới hay bỏ sót: driver này không tự động đổi tốc độ xung nhịp; bạn phải bật thêm một governor động sau khi khởi động, hoặc dùng công cụ ở không gian người dùng 3. Rồi sách liệt kê các governor: PERFORMANCE ghim tần số ở mức cao nhất 3; USERSPACE để bạn hoặc một chương trình tự đặt 3; ONDEMAND thăm dò CPU rồi đổi tần số theo mức sử dụng 3; và CONSERVATIVE, giống ondemand nhưng tối ưu cho máy chạy pin, tăng giảm tần số từ tốn thay vì nhảy thẳng lên 100% 3.

    Bật CPU_FREQ thôi thì chưa đủ — nó không tự đổi tốc độ, bạn phải chọn thêm một “người điều khiển” 3. Có loại luôn chạy nhanh nhất, có loại tự nhìn tải mà tăng giảm, có loại tăng giảm từ từ cho máy dùng pin 3. Nhớ nhé: bật cổng rồi phải chọn người lái.

    CPU_FREQ's help text says something beginners miss: this driver does not automatically change the CPU clock speed; you must either enable a dynamic governor after booting or use a userspace tool 3. The book then lists the governors: PERFORMANCE pins the frequency statically to the highest supported 3; USERSPACE lets you or a program set it 3; ONDEMAND polls the CPU and changes frequency based on utilisation 3; and CONSERVATIVE, similar to ondemand but optimised for a battery-powered system, raising and lowering the frequency gracefully rather than jumping to 100 percent 3.

    Bạn thấy nó ở đâu. CPU_FREQ và CPU_FREQ_GOV_ONDEMAND vẫn là ký hiệu hiện hành theo LKDDb 22, nhưng danh sách governor đã dài thêm — ví dụ CPU_FREQ_GOV_SCHEDUTIL chỉ xuất hiện từ khoảng nhân 4.9 22, tức hoàn toàn vắng mặt trong sách.

    Gặp ở đâu. Hai cái tên đầu vẫn còn dùng được hôm nay 22, nhưng có thêm những “người lái” mới mà sách chưa kịp biết 22. Nhớ nhé: danh sách chỉ dài thêm, không ngắn lại.

    Where you see it. CPU_FREQ and CPU_FREQ_GOV_ONDEMAND are still current symbols per LKDDb 22, but the governor list has grown — CPU_FREQ_GOV_SCHEDUTIL, for one, appears only from around kernel 4.9 22, so it is entirely absent from the book.

    Treo máy: hai tên, một khái niệm

    Sách gọi việc ghi ảnh bộ nhớ ra phân vùng trao đổi là SOFTWARE_SUSPEND, và hướng dẫn truyền resume=/dev/swappartition lúc khởi động lần sau 3. Theo LKDDb, ký hiệu ấy chỉ còn thấy tới khoảng 2.6.22, còn HIBERNATION xuất hiện từ 2.6.23 — một lần đổi tên chứ không phải một tính năng mới 20.

    Bốn trạng thái ngủ hôm nay

    Tài liệu hiện hành phân biệt tới bốn trạng thái: suspend-to-idle, standby, suspend-to-RAM và hibernation; ba cái đầu đều nằm dưới CONFIG_SUSPEND, còn hibernation là con đường riêng 23. Cách chia hai nhánh APM/ACPI của sách không còn phản ánh cấu trúc ấy.

  2. IDE · SCSI · SCSI_SATA

    Lưu trữ — vùng lão hóa nhanh nhất của chương Ổ cứng: phần cũ nhất trong sách Storage — the fastest-ageing region of the chapter

    Sách dành nhiều trang cho IDE, kèm cả một bài học lịch sử nhỏ: IDE còn gọi là ATA-1, do Western Digital và Compaq thiết kế năm 1984; ATA là tập cha của IDE; Fast-IDE là ATA-2; EIDE là ATA-3, hỗ trợ đĩa lớn hơn tới 8,4 GB qua chuẩn LBA và bốn đĩa thay vì hai; UDMA/33 là ATA-4 3. Bên cạnh đó là nhánh SCSI, với cảnh báo: đừng biên dịch nó thành module nếu hệ thống tệp gốc nằm trên thiết bị SCSI 3.

    Phần ổ cứng trong sách rất dài và rất cũ. Nó kể cả lịch sử: IDE ra đời năm 1984, rồi lớn dần thành ATA-2, ATA-3, ATA-4 3. Có một lời dặn vẫn đúng: nếu hệ điều hành nằm trên ổ SCSI thì đừng để driver SCSI thành module 3. Nhớ nhé: driver cho ổ chứa hệ điều hành phải nằm sẵn trong nhân.

    The book gives IDE several pages, with a small history lesson attached: IDE is also known as ATA-1, designed by Western Digital and Compaq in 1984; ATA is the superset of the IDE specifications; Fast-IDE is ATA-2; EIDE is ATA-3, supporting larger disks up to 8.4 GB via LBA and four disks instead of two; UDMA/33 is ATA-4 3. Beside it sits the SCSI branch, with a warning: do not compile it as a module if your root filesystem is located on a SCSI device 3.

    Bạn thấy nó ở đâu. Toàn bộ hệ con drivers/ide cũ đã bị xóa khỏi nhân ở bản 5.14, sau khi mọi cấu hình mặc định còn lại được chuyển sang libata 18. Phần cứng PATA vẫn chạy — nhưng qua libata, và tên thiết bị đổi từ kiểu /dev/hda sang kiểu /dev/sda 18.

    Gặp ở đâu. Phần mã IDE cũ đã bị gỡ hẳn ở nhân 5.14 18. Ổ cứng cũ vẫn dùng được, nhưng tên đổi từ /dev/hda thành /dev/sda 18. Nhớ nhé: tên ổ đĩa trong sách đã lỗi thời.

    Where you see it. The entire legacy drivers/ide subsystem was deleted in kernel 5.14, after the remaining defconfigs were switched to libata 18. PATA hardware still works — but through libata, and device names shift from the /dev/hda style to the /dev/sda style 18.

    Một ký hiệu chỉ sống được năm bản

    Sách liệt kê SCSI_SATA trong phần lưu trữ 3. Theo LKDDb, ký hiệu này chỉ tồn tại từ nhân 2.6.13 đến 2.6.18 22 — nghĩa là nó đã biến mất trước cả khi sách lên kệ vào cuối 2006. Một lời nhắc rằng ngay cả ảnh chụp cũng có thể trễ nhịp.

    Hai mục vẫn còn nguyên giá trị

    BLK_DEV_MD gộp nhiều phân vùng thành một thiết bị khối logic, làm RAID 1/4/5 bằng phần mềm 3; BLK_DEV_DM là trình quản lý ổ đĩa mức thấp mà các trình quản lý mức cao như LVM2 dựa lên 3. Cả hai ký hiệu đều còn trong các dòng nhân gần đây theo LKDDb 22.

  3. EXT3_FS · FUSE_FS · CIFS

    Hệ thống tệp — chỗ mô tả già đi chậm nhất Hệ thống tệp: phần bền nhất Filesystems — where the descriptions age slowest

    Mô tả EXT3_FS vẫn đọc được nguyên: nó là phiên bản có nhật ký của ext2; nhật ký nghĩa là bạn không phải chạy fsck sau một lần sập máy, vì nó theo dõi các thay đổi đang diễn ra lúc sập 4. Và một chi tiết đẹp: ngoài phần nhật ký, định dạng trên đĩa của ext3 giống hệt ext2, nên có thể chuyển qua lại giữa hai driver miễn là hệ thống tệp đã được tháo sạch 4. FUSE_FS thì mở ra cả một thể loại: với FUSE, có thể hiện thực một hệ thống tệp đầy đủ chức năng bằng chương trình ở không gian người dùng 4.

    ext3 chính là ext2 có thêm cuốn sổ ghi chép, nên sau khi mất điện không phải dò lại cả ổ 4. Hay ở chỗ: bỏ cuốn sổ đi thì nó lại đúng là ext2 4. Còn FUSE cho phép viết hệ thống tệp bằng chương trình thường, không cần đụng vào nhân 4. Nhớ nhé: phần này trong sách vẫn còn đúng nhiều nhất.

    The EXT3_FS description still reads intact: it is the journaling version of ext2; the journal means you do not have to run fsck after a crash, because it tracks the changes in flight when the system went down 4. And a lovely detail: other than the journal, ext3's on-disk format is identical to ext2, so you can freely switch between the two drivers as long as the filesystem was cleanly unmounted 4. FUSE_FS opens a whole genre: with FUSE it is possible to implement a fully functional filesystem in a userspace program 4.

    Bạn thấy nó ở đâu. Sách liệt kê cả SMB_FS lẫn CIFS, và nói rõ CIFS là kế thừa của giao thức SMB, còn smbfs dùng để truy cập các máy chủ SMB cũ 4. Theo LKDDb, SMB_FS bị dời vào drivers/staging ở 2.6.37–2.6.38 rồi biến mất 19; nhánh còn lại là CIFS.

    Gặp ở đâu. Sách có hai cách nối tới máy Windows: SMB_FS cũ và CIFS mới 4. Cái cũ đã bị bỏ khỏi nhân 19. Nhớ nhé: ngày nay chỉ còn CIFS.

    Where you see it. The book lists both SMB_FS and CIFS, stating plainly that CIFS is the successor to the SMB protocol while smbfs is for older SMB servers 4. Per LKDDb, SMB_FS was moved into drivers/staging for 2.6.37–2.6.38 and then disappeared 19; the surviving branch is CIFS.

    Một tên biến mất rất lặng lẽ

    Sách mô tả INOTIFY là hệ thống thông báo thay đổi tệp thay thế dnotify, theo dõi được cả tệp lẫn thư mục qua một đối tượng fd duy nhất 4. LKDDb cho thấy ký hiệu INOTIFY chỉ còn tới khoảng 2.6.35, trong khi INOTIFY_USER vẫn tiếp tục 22. Tính năng ở lại, cái tên thì không — đúng kiểu bẫy mà make oldconfig im lặng bỏ qua 7.

    Danh sách hệ thống tệp trong sách

    Ngoài ext2/ext3, chương còn có ReiserFS (lưu cả tên tệp lẫn nội dung trong cây cân bằng), JFS (bản chuyển từ IBM), XFS (khởi nguồn trên SGI IRIX, đa luồng hoàn toàn), OCFS2 (hệ thống tệp cụm chia sẻ đĩa), QUOTA và AUTOFS 4. Đáng chú ý: EXT4_FS không có mặt — LKDDb ghi nhận nó xuất hiện từ khoảng nhân 2.6.28 22, tức sau khi sách in.

  4. MAGIC_SYSRQ · DEBUG_KERNEL · SECURITY_SELINUX

    Gỡ lỗi và an ninh — hai mục cuối chương Công cụ cứu máy và khóa máy Debugging and security — the chapter's last entries

    Sách khép chương bằng những công cụ dành cho lúc mọi thứ hỏng. MAGIC_SYSRQ cho bạn chút quyền điều khiển ngay cả khi hệ thống đã sập — xả bộ đệm ra đĩa, khởi động lại ngay, hoặc đổ ra vài thông tin trạng thái — bằng cách giữ phím SysRq (Alt+PrintScreen) rồi nhấn các phím lệnh; và một câu dặn rất thật: “đừng nói có trừ khi bạn thực sự biết cái mẹo này làm gì” 4. PRINTK_TIME chèn thông tin thời gian vào đầu ra thông điệp nhân, hữu ích để tìm các đoạn trễ dài lúc khởi động 4.

    Cuối chương là các công cụ dành cho lúc máy treo. MAGIC_SYSRQ cho bạn ra vài lệnh cấp cứu bằng tổ hợp phím kể cả khi máy đã đứng 4. PRINTK_TIME gắn giờ vào từng dòng thông báo để biết chỗ nào khởi động chậm 4. Nhớ nhé: sách dặn đừng bật SysRq nếu chưa hiểu nó.

    The book closes with tools for when everything breaks. MAGIC_SYSRQ gives you some control over the system even if it has crashed — flush the buffer cache to disk, reboot immediately, or dump status information — by holding SysRq (Alt+PrintScreen) and pressing command keys; with a very honest caveat: “don't say yes unless you really know what this hack does” 4. PRINTK_TIME includes timing information in kernel message output, useful for identifying long delays in startup 4.

    Bạn thấy nó ở đâu. Mục cuối cùng của chương là SECURITY_SELINUX: sách nói nó chọn SELinux của NSA và bạn còn cần thêm một cấu hình chính sách cùng một hệ thống tệp có nhãn 4. Cổng của nó là SECURITY, mục cho phép cấu hình các mô-đun an ninh khác nhau vào nhân 4.

    Gặp ở đâu. Mục cuối sách là SELinux — nhưng bật nó thôi chưa đủ, còn phải có bộ chính sách và hệ thống tệp gắn nhãn 4. Nhớ nhé: an ninh là cả một bộ, không phải một nút.

    Where you see it. The chapter's final entry is SECURITY_SELINUX: the book says it selects NSA Security-Enhanced Linux and that you will also need a policy configuration and a labeled filesystem 4. Its gate is SECURITY, the entry that lets you configure different security modules into your kernel 4.

    Một công cụ đã về hưu

    Sách giới thiệu PROFILING và OPROFILE — hệ thống lấy mẫu toàn hệ thống, gồm cả nhân, module, thư viện và ứng dụng 4. Theo LKDDb, OPROFILE còn tới khoảng nhân 5.11 rồi dừng 22; kernelnewbies ghi nhận việc gỡ oprofile và dcookies trong bản 5.12 17. PROFILING và KPROBES thì vẫn còn 22.

    Mục dễ bị bỏ quên nhất

    DEBUG_FS — hệ thống tệp ảo nơi các nhà phát triển nhân đặt tệp gỡ lỗi 4 — chính là nơi công tắc preempt thời-gian-chạy của nhân 5.12 xuất hiện 17. Một mục vô danh năm 2006 trở thành giao diện điều khiển của một tính năng ra đời mười lăm năm sau.

Cụm khái niệm 04Concept cluster 04

Đọc một ảnh chụp 2006 vào năm nay Sách cũ, nhân mới: đọc sao cho đúng Reading a 2006 snapshot today

Không có câu trả lời chung cho “chương 11 còn đúng không”. Có bốn số phận khác nhau, và việc của bạn là xếp mỗi mục vào đúng ngăn trước khi tin nó: còn nguyên (tên và nghĩa giữ nguyên), đổi tên (khái niệm sống, ký hiệu chết), bị thay (cả cơ chế được viết lại), và biến mất (không còn gì tương ứng). Mỗi ngăn có một cách kiểm tra riêng, và cả bốn đều kết thúc ở cùng một nơi: cây mã bạn đang cầm.

Không thể nói gọn “sách còn đúng” hay “sách sai rồi”. Mỗi mục rơi vào một trong bốn trường hợp: còn nguyên, chỉ đổi tên, bị thay bằng thứ khác, hoặc mất hẳn. Nhớ nhé: cứ tra trong mã nguồn bạn đang có, đừng đoán.

There is no blanket answer to “is Chapter 11 still right”. There are four fates, and your job is to sort each entry before trusting it: intact (name and meaning preserved), renamed (concept alive, symbol dead), replaced (the mechanism itself rewritten), and gone (nothing corresponds). Each has its own check, and all four end in the same place: the tree in your hands.

Có một lý do cấu trúc khiến việc phân loại này không bao giờ xong: số tùy chọn chỉ tăng. Từ “gần hai nghìn” trong sách 5 tới 32.468 tùy chọn trên x86_64 ở nhân 6.16 theo phân tích LWN 21 là hệ số mười sáu trong chưa tới hai thập niên. Không bản in nào theo kịp nhịp đó — nên cuốn sách khôn ngoan khi dạy cách đọc trước khi liệt kê.

Ký hiệu chỉ-2006. Một ký hiệu CONFIG_* có trong sách nhưng không còn trong cây mã hiện hành. Ví dụ đã dẫn ở trên: PREEMPT_BKL, IOSCHED_AS, SCSI_SATA, SMB_FS, EXPERIMENTAL. Dấu hiệu nhận biết nhanh nhất: make menuconfig tìm không ra, và make oldconfig lặng lẽ bỏ dòng đó khỏi .config của bạn.

Ký hiệu chỉ-2006 là gì. Là cái tên có trong sách nhưng không còn trong nhân ngày nay. Cách nhận ra: tìm trong màn hình cấu hình mà không thấy. Nhớ nhé: không thấy thì đừng cố ép nó vào tệp cấu hình.

A 2006-only symbol. A CONFIG_* symbol present in the book but absent from a current tree. The examples above: PREEMPT_BKL, IOSCHED_AS, SCSI_SATA, SMB_FS, EXPERIMENTAL. The quickest tell: make menuconfig cannot find it, and make oldconfig quietly drops the line from your .config.

còn nguyên  → tra menuconfig, thấy
đổi tên     → tra LKDDb, tìm tên kế thừa
bị thay     → đọc docs.kernel.org
biến mất    → tra changelog bản gỡ bỏ

tìm thấy → dùng được
không thấy → xem nó đổi tên thành gì
đổi cơ chế → đọc tài liệu mới
mất hẳn → xem bản nào đã gỡ

intact   → search menuconfig, found
renamed  → check LKDDb for the successor
replaced → read docs.kernel.org
gone     → find the release that removed it

  1. renamed

    Đổi tên — khái niệm sống, ký hiệu chết Cùng một thứ, tên khác Renamed — concept alive, symbol dead

    Ba ví dụ rõ nhất từ chính chương này. SOFTWARE_SUSPEND thành HIBERNATION từ nhân 2.6.23 20. EMBEDDED — mà sách mô tả là “cấu hình các tính năng nhân chuẩn (cho hệ thống nhỏ)”, chỉ nên dùng cho chuyên gia vì rất dễ tạo ra nhân không khởi động nổi 2 — được đổi tên thành EXPERT ở nhân 2.6.38, với dòng nhắc đổi thành “cho người dùng thành thạo” 12. Còn INOTIFY nhường chỗ cho INOTIFY_USER 22.

    Nhiều tùy chọn chỉ đổi tên chứ không mất. “Treo máy ghi ra đĩa” đổi từ SOFTWARE_SUSPEND sang HIBERNATION 20. EMBEDDED đổi thành EXPERT 12. Nhớ nhé: không thấy tên cũ thì đi tìm tên mới, đừng vội kết luận là mất.

    Three clear examples from this very chapter. SOFTWARE_SUSPEND became HIBERNATION as of kernel 2.6.23 20. EMBEDDED — which the book describes as “configure standard kernel features (for small systems)”, recommended only for experts since it is very easy to create a kernel that will not even boot 2 — was renamed to EXPERT in 2.6.38, its prompt changed to “expert users” 12. And INOTIFY gave way to INOTIFY_USER 22.

    Bạn thấy nó ở đâu. Đây đúng là tình huống mà tài liệu Kconfig cảnh báo: bản mới không chỉ thêm ký hiệu mà còn đổi tên chúng, nên dùng lại một .config cũ với make oldconfig không chắc cho ra nhân chạy được 7.

    Gặp ở đâu. Khi bạn mang tệp cấu hình cũ sang nhân mới — tài liệu nhân cảnh báo đúng chuyện này 7. Nhớ nhé: chạy make listnewconfig để xem có gì mới.

    Where you see it. This is exactly the situation the Kconfig documentation warns about: new releases not only introduce symbols but rename them, so reusing an old .config with make oldconfig will not necessarily produce a working kernel 7.

    Đổi tên rồi vẫn còn hậu vận

    Lần đổi tên 2.6.38 không xóa ký hiệu cũ: một EMBEDDED mới được thêm vào, tự động select EXPERT, dành cho các lựa chọn chỉ liên quan tới hệ nhúng 12. Mãi tới 2022 nó mới được đề nghị gỡ hẳn, với lý do gần như không ai còn dùng nó để đặt mặc định khác đi 13.

    Tra cứu vòng đời ký hiệu

    Cơ sở dữ liệu LKDDb công bố dải phiên bản nhân mà mỗi ký hiệu xuất hiện 22 — cách nhanh nhất để biết một mục trong chương 11 thuộc ngăn nào. Đó là nguồn cho mọi khẳng định “còn/không còn” trên trang này.

  2. removed outright

    Biến mất — khi cả một khái niệm bị rút đi Mất hẳn, không có gì thay Gone — when a whole concept is withdrawn

    Mục EXPERIMENTAL mở đầu chương 11 và là mục cuối cùng người đọc hôm nay nên tìm: nó bị gỡ khỏi nhân ở bản 3.9 11. Lý do rất đáng nhớ: thay đổi trong mô hình phát triển nhân cùng sự ra đời của thư mục staging đã khiến nó vô nghĩa — gần như mọi bản phân phối đều bật nó theo mặc định 11. Nói cách khác, một tùy chọn “cảnh báo” mà ai cũng bật thì không còn cảnh báo ai nữa.

    Mục đầu tiên của chương, EXPERIMENTAL, đã bị gỡ khỏi nhân ở bản 3.9 11. Vì sao? Vì ai cũng bật nó, nên nó chẳng còn cảnh báo được ai 11. Nhớ nhé: một lời cảnh báo mà ai cũng bỏ qua thì nên bỏ đi.

    The EXPERIMENTAL entry opens Chapter 11 and is the last one a reader today should go looking for: it was removed from the kernel in 3.9 11. The reason is worth remembering: changes in the kernel development model and the arrival of the staging directory made it obsolete — nearly every distribution enabled it by default 11. A warning switch that everyone flips warns nobody.

    Bạn thấy nó ở đâu. Thói quen thay thế: thay vì một cổng chung, các nhà phát triển nay gắn thẳng nhãn “(EXPERIMENTAL)” vào dòng nhắc của từng tùy chọn 11. Cảnh báo từ toàn cục chuyển thành cục bộ.

    Gặp ở đâu. Ngày nay lời cảnh báo được viết thẳng vào tên từng tùy chọn, thay vì một cái công tắc chung 11. Nhớ nhé: đọc kỹ dòng nhắc.

    Where you see it. The replacement habit: instead of one shared gate, developers now put an “(EXPERIMENTAL)” tag directly in an option's own prompt 11. The warning moved from global to local.

    Ba lần gỡ bỏ đáng nhớ

    Mô hình bộ nhớ DISCONTIGMEM gỡ ở 5.14 10; tầng khối cũ cùng ba bộ điều phối vào/ra gỡ ở 5.0 14; hệ con drivers/ide gỡ ở 5.14 18. Ba lần ấy xóa sổ một tỷ lệ đáng kể các mục trong chương 11 — nhưng không xóa bất kỳ khả năng nào của người dùng: mỗi lần đều có một đường thay thế.

    Vì sao đó là tin tốt

    Xu hướng chung không phải “thêm mãi”: nó là hợp nhất. SPARSEMEM thay hai mô hình 9; libata thay cả một hệ con IDE 18; blk-mq thay bốn bộ điều phối bằng một tập nhỏ hơn 14. Với người cấu hình, ít lựa chọn nhưng đúng đắn hơn là một cải thiện.

  3. still true

    Còn nguyên — phần không hề cũ đi Phần vẫn còn đúng Intact — the part that did not age

    Đáng chú ý là danh sách này dài hơn người ta tưởng. Theo LKDDb, các ký hiệu LOCALVERSION, IKCONFIG, MAGIC_SYSRQ, DEBUG_KERNEL, DEBUG_FS, KPROBES, PRINTK_TIME, AUDIT, NET, USB, SND, INPUT, BLK_DEV_MD, BLK_DEV_DM, FUSE_FS, QUOTA, CPU_FREQ và X86_GENERIC đều vẫn có mặt trong các dòng nhân gần đây 22. Điều già đi là ví dụ (Pentium 4, ZIP drive, Windows 2003), không phải cấu trúc.

    Phần còn đúng nhiều hơn bạn tưởng: rất nhiều tên trong sách vẫn dùng được hôm nay 22. Thứ cũ đi là các ví dụ về phần cứng, chứ không phải cách tổ chức. Nhớ nhé: đọc lấy ý, bỏ qua tên thiết bị đời cũ.

    The list is longer than people expect. Per LKDDb, the symbols LOCALVERSION, IKCONFIG, MAGIC_SYSRQ, DEBUG_KERNEL, DEBUG_FS, KPROBES, PRINTK_TIME, AUDIT, NET, USB, SND, INPUT, BLK_DEV_MD, BLK_DEV_DM, FUSE_FS, QUOTA, CPU_FREQ and X86_GENERIC are all still present in recent kernel series 22. What aged is the examples (Pentium 4, ZIP drives, Windows 2003), not the structure.

    Bạn thấy nó ở đâu. Và một lối tắt mà sách 2006 chưa có: tài liệu nhân hiện hành khuyến nghị make localmodconfig, lấy cấu hình sẵn có làm nền rồi tắt các module có vẻ thừa với máy bạn, “giảm thời gian biên dịch một cách khổng lồ” 24.

    Gặp ở đâu. Ngày nay có lệnh make localmodconfig tự cắt bớt phần máy bạn không dùng, biên dịch nhanh hơn rất nhiều 24. Nhớ nhé: không phải cái gì cũng phải chọn tay.

    Where you see it. And a shortcut the 2006 book did not have: current kernel documentation recommends make localmodconfig, taking an existing config as a base and disabling modules apparently superfluous for your setup, which “will reduce the compile time enormously” 24.

Ba hiểu lầm thường gặpThree common misconceptions

“Chương 11 là danh mục đầy đủ”“Chapter 11 is a complete catalogue”

Hiểu lầm: tra chương 11 là biết hết tùy chọn. Thực tế: chính câu đầu chương nói nó liệt kê những tùy chọn quan trọng nhất 1, trong khi nhân 2.6 đã có gần hai nghìn tùy chọn 5 và nhân 6.16 có 32.468 tùy chọn trên x86_64 21.

Myth: consulting Chapter 11 tells you every option. Fact: its own first sentence says it lists the most important options 1, while the 2.6 kernel already had almost two thousand 5 and kernel 6.16 has 32,468 on x86_64 21.

“Tên còn trong nhân thì mô tả vẫn đúng”“If the symbol survives, the description holds”

Hiểu lầm: tìm thấy ký hiệu trong menuconfig nghĩa là đoạn mô tả 2006 còn dùng được. Thực tế: SECCOMP và KEXEC vẫn tồn tại 22 nhưng vai trò đã khác xa mô tả cũ 2; luôn đọc lại đoạn trợ giúp trong cây mã của bạn 8.

Myth: finding the symbol in menuconfig means the 2006 description still applies. Fact: SECCOMP and KEXEC both survive 22 but their roles are far from the old text 2; always reread the help text in your own tree 8.

“make oldconfig sẽ lo hết”“make oldconfig will handle it”

Hiểu lầm: mang .config cũ sang nhân mới là xong. Thực tế: tài liệu nói rõ rằng bản mới có thể đổi tên ký hiệu, nên make oldconfig không chắc cho ra nhân chạy được; hãy dùng make listnewconfig hoặc scripts/diffconfig để xem thứ đã đổi 7.

Myth: carrying an old .config forward is enough. Fact: the documentation states that new releases may rename symbols, so make oldconfig will not necessarily produce a working kernel; use make listnewconfig or scripts/diffconfig to see what moved 7.

Tự kiểmSelf-check

Tự kiểm khi khép lại phần tham chiếu Tự hỏi mình vài câu Self-check as the reference closes

Chương này không có quy trình để làm theo, nên bài tự kiểm cũng khác: nó đo xem bạn đã có phản xạ tra cứu hay chưa. Hãy mở một cây mã nguồn thật và trả lời bằng thao tác, không bằng trí nhớ.

Chương này không dạy quy trình, nên câu hỏi ở đây là về thói quen tra cứu. Mở mã nguồn thật ra và làm thử. Nhớ nhé: trả lời bằng cách làm, đừng trả lời bằng cách nhớ.

This chapter has no procedure to follow, so the self-check differs: it measures whether you have acquired the lookup reflex. Open a real source tree and answer by doing, not by remembering.

  1. Bạn chỉ ra được bốn phần của một mục Kconfig — ký hiệu, kiểu, phụ thuộc, đoạn trợ giúp — trong một tệp Kconfig thật chưa?

    Mở bất kỳ tệp Kconfig nào trong cây mã; cú pháp đầy đủ và danh sách từ khóa nằm trong tài liệu Kconfig Language 6.

  2. Trong menuconfig, bạn tìm được một tùy chọn đang bị ẩn và đọc ra chuỗi depends on đang chặn nó chứ?

    Các giao diện menuconfig, xconfig và nconfig đều có trợ giúp nhúng cho phần tìm kiếm và điều hướng 7.

  3. Bạn phân biệt được một mục “cổng” (MODULES, PM, NET, DEBUG_KERNEL) với một mục thực sự sinh ra mã?

    Dấu hiệu trong sách: câu “tự thân nó không làm gì cả, ngoài việc cho phép bạn chọn các tùy chọn khác” 2.

  4. Cho một ký hiệu bất kỳ trong chương 11, bạn nói được nó thuộc ngăn nào trong bốn ngăn: còn nguyên, đổi tên, bị thay, biến mất?
  5. Bạn biết chạy lệnh nào để thấy các ký hiệu mới xuất hiện khi nâng cấp cây mã?

    Đáp án: make listnewconfig, hoặc make oldconfig rồi scripts/diffconfig .config.old .config 7.

  1. Bạn mở được một tệp Kconfig thật và chỉ ra đâu là tên, đâu là lời giải thích chưa?
  2. Trong màn hình cấu hình, bạn biết bấm / để tìm một tùy chọn chứ?
  3. Bạn nhận ra được nút nào là “cổng” mở ra cả một khu?
  4. Gặp một cái tên trong sách mà nhân không có, bạn sẽ làm gì tiếp?
  5. Nhớ nhé: trả lời được cả năm câu thì bạn đã có phản xạ tra cứu rồi.
  1. Can you point out the four parts of a Kconfig entry — symbol, type, dependencies, help text — in a real Kconfig file?
  2. In menuconfig, can you find a hidden option and read off the depends on chain blocking it?
  3. Can you tell a “gate” entry (MODULES, PM, NET, DEBUG_KERNEL) from one that actually produces code?

    The book's tell: the sentence “on its own, this option does not do anything except allow you to select other options” 2.

  4. Given any symbol in Chapter 11, can you place it in one of the four bins: intact, renamed, replaced, gone?
  5. Do you know which command shows the symbols that are new since your last tree?

    Answer: make listnewconfig, or make oldconfig followed by scripts/diffconfig .config.old .config 7.

Đọng lạiWhat remains

Chương dài nhất của cuốn sách là chương chóng cũ nhất — và đó chính là bài học của nó. Vì phần lớn nội dung vốn là tài liệu nằm sẵn trong nhân, thứ bạn thực sự học được không phải danh sách, mà là nơi danh sách ấy luôn được cập nhật: cây mã trước mặt bạn.

Chương dài nhất cũng là chương cũ nhanh nhất. Nhưng vì lời giải thích trong đó vốn nằm sẵn trong mã nguồn nhân, bạn chỉ cần học cách mở đúng chỗ là không bao giờ lạc hậu. Nhớ nhé: sách chỉ đường, mã nguồn nói sự thật.

The book's longest chapter is its fastest-ageing one — and that is precisely its lesson. Because most of it was always the in-kernel documentation, what you actually learn is not the list but where that list is always current: the tree in front of you.