Linux Kernel in a Nutshell · Chương 4 · Cấu hình và dựng nhânChapter 4 · Configuring and Building
Mức đọcLevel

Phần I · Dựng nhân · Chương 4Part I · Building the Kernel · Chapter 4

Cấu hình và dựng: hai bước, một công cụ Chọn đồ, rồi lắp máy Configuring and building: two steps, one tool

Đây là chương thực hành trung tâm của Phần I. Mã nguồn đã tải về và giải nén xong; Kroah-Hartman mở chương bằng một câu chia việc rất gọn: bước đầu là cấu hình nhân với các tùy chọn thích hợp, sau đó nhân mới được biên dịch — và cả hai việc đều làm thông qua tiện ích make tiêu chuẩn 1. Toàn bộ chương chỉ là khai triển hai câu ấy.

Bạn đã có mã nguồn rồi. Giờ có hai việc: một là chọn xem cái nhân của bạn gồm những gì, hai là lắp nó lại thành một tệp chạy được. Cả hai việc đều gọi bằng cùng một lệnh tên là make 1. Nhớ nhé: chọn trước, lắp sau.

This is the practical heart of Part I. The source is downloaded and unpacked; Kroah-Hartman opens the chapter by dividing the work very tidily: the first step is to configure the kernel with the appropriate options, and the kernel can then be compiled — both tasks done through the standard make utility 1. The whole chapter is an unpacking of those two sentences.

Chú ý chỗ tinh tế: make ở đây đóng hai vai rất khác nhau. Với make config hay make menuconfig, nó chỉ là bệ phóng cho một chương trình cấu hình — sách in ra dòng scripts/kconfig/conf arch/i386/Kconfig ngay dưới make config, tức make đang chạy một trình đọc ngôn ngữ Kconfig 1. Với make trần, nó mới thật sự là trình quản lý phụ thuộc, biên dịch từng tệp và liên kết ảnh nhân cuối cùng 5. Một cái tên, hai hệ thống con: kconfig và kbuild.

Luận điểm chương 4. Cấu hình nhân sống trong một tệp duy nhất tên .config ở thư mục gốc cây mã nguồn 1. Bạn gần như không bao giờ nên tạo nó từ con số không: hãy lấy một cấu hình dựng sẵn làm nền, rồi sửa những gì máy bạn thật sự cần 1. Sau đó, dựng nhân “đơn giản đến mức chỉ là gõ một lệnh một từ” 5.

Ý chính. Mọi lựa chọn của bạn được ghi vào một tệp tên .config 1. Đừng ngồi trả lời từng câu hỏi từ đầu — hãy lấy bản mẫu có sẵn rồi sửa 1. Xong rồi thì việc dựng chỉ là gõ đúng một từ: make 5. Nhớ nhé: một tệp để nhớ, một lệnh để dựng.

Chapter 4 thesis. The kernel configuration lives in a single file called .config in the top directory of the kernel source tree 1. You should almost never create it from scratch: base it on a pre-built configuration and then change what your machine actually needs 1. After that, building the kernel “is as simple as entering a one-word command” 5.

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

Tạo cấu hình: một tệp, bốn chữ cái, hai lối vào Tệp ghi lại mọi lựa chọn của bạn Creating a configuration: one file, four letters, two routes

Cấu hình nhân được giữ trong một tệp tên .config nằm ở thư mục trên cùng của cây mã nguồn; cây vừa giải nén thì chưa có tệp này, nên phải tạo ra 1. Ông nêu bốn cách tạo: từ con số không, dựa trên “cấu hình mặc định”, lấy từ một nhân đang chạy, hoặc lấy từ nhân của một bản phân phối — và nói rõ chương 4 chỉ bàn hai cách đầu, hai cách sau để dành cho Chương 7 1.

Mọi lựa chọn của bạn được ghi vào một tệp tên .config, nằm ngay trong thư mục mã nguồn. Cây mã mới giải nén thì chưa có tệp đó, nên phải làm ra nó 1. Có bốn cách làm, và chương này chỉ dạy hai cách dễ nhất 1. Nhớ nhé: tất cả nằm trong một tệp duy nhất.

The kernel configuration is kept in a file called .config in the top directory of the kernel source tree; a freshly expanded tree has no .config, so one needs to be created 1. He names four ways to create it: from scratch, based on the “default configuration,” taken from a running kernel, or taken from a distribution kernel release — and says plainly that Chapter 4 covers the first two, leaving the last two to Chapter 7 1.

Dấu chấm ở đầu tên tệp không phải trang trí: trên Unix nó khiến ls giấu tệp đi. Hệ quả rất thực tế — sau một lần make defconfig, bạn gõ ls và không thấy gì thay đổi, dễ tưởng lệnh không chạy. Dùng ls -a. Tài liệu nhân hiện hành còn cho phép đổi hẳn tên tệp này qua biến môi trường KCONFIG_CONFIG, thứ không có trong phạm vi cuốn sách 9.

Tùy chọn cấu hình (configuration option). Một câu hỏi có/không/module về một tính năng của nhân. Sách ghi nhận nhân “chứa gần hai nghìn tùy chọn cấu hình khác nhau”, nên việc bị hỏi từng cái một sẽ rất lâu 1. Đây là con số của dòng nhân 2.6 năm 2006, không phải con số hôm nay.

Tùy chọn là gì. Là một câu hỏi kiểu “có cần thứ này không?”. Năm 2006 sách đếm được gần hai nghìn câu hỏi như thế 1. Nhớ nhé: nhiều quá nên đừng trả lời tay từng câu.

Configuration option. A yes/no/module question about one kernel feature. The book records that the kernel “contains almost two thousand different configuration options,” so being asked about every individual one takes a very long time 1. That is a 2006 figure for the 2.6 series, not a present-day count.

y → dựng thẳng vào nhân
m → dựng thành module, nạp khi cần
n → loại hẳn ra
? → in mô tả ngắn, rồi hỏi lại

y = gắn luôn vào nhân
m = để rời, cần thì nạp
n = bỏ hẳn
? = giải thích rồi hỏi lại

y → build directly into the kernel
m → build as a module, loaded if needed
n → leave entirely out
? → print a brief message, repeat the prompt

  1. make config

    make config — cách cơ bản nhất, và cũng là cách bạn sẽ không dùng make config — hỏi từng câu một make config — the most basic method, and the one you will not use

    Sách gọi đây là “phương pháp cơ bản nhất”: vào thư mục mã nguồn rồi gõ make config 1. Chương trình đi qua mọi tùy chọn và hỏi bạn có bật hay không; lựa chọn hiện ra dưới dạng [Y/m/n/?], trong đó chữ cái viết hoa là mặc định và chỉ cần nhấn Enter để chọn 1. Bốn lựa chọn là y, n, m và ? 1.

    Gõ make config thì máy sẽ hỏi bạn từng thứ một, có bật hay không 1. Trong ngoặc như [Y/m/n/?], chữ in hoa là câu trả lời mặc định — cứ Enter là chọn nó 1. Nhớ nhé: biết cách này để hiểu, đừng dùng nó để làm thật.

    The book calls this “the most basic method”: change into the source directory and type make config 1. The program steps through every configuration option and asks whether you want it; the choices appear in the form [Y/m/n/?], where the capitalized letter is the default and can be selected by just pressing Enter 1. The four choices are y, n, m and ? 1.

    Bạn thấy nó ở đâu. Mỗi khi đọc một bản vá kèm dòng CONFIG_USB_SERIAL=m, bạn đang đọc đúng ba chữ cái ấy được ghi ra tệp. y/m/n không phải giao diện — chúng là nội dung của .config.

    Gặp ở đâu. Khi thấy dòng kiểu CONFIG_USB_SERIAL=m trong tệp cấu hình, đó chính là chữ m bạn đã chọn. Nhớ nhé: chữ cái bạn gõ được lưu lại nguyên vẹn.

    Where you see it. Every time you read a line like CONFIG_USB_SERIAL=m, you are reading those same letters written to disk. y/m/n are not an interface — they are the contents of .config.

    Vì sao có bốn chứ không phải ba

    Ba chữ đầu là trạng thái, chữ thứ tư là trợ giúp: ? in ra một mô tả ngắn rồi lặp lại câu hỏi 1. Đây là điểm khác biệt quan trọng — nó không thay đổi cấu hình, nên gõ nhầm ? hoàn toàn vô hại. Trong menuconfig, cũng đúng văn bản trợ giúp ấy hiện ra khi nhấn phím ?.

    Con số hai nghìn: một mốc 2006

    “Gần hai nghìn tùy chọn” là lý lẽ sách dùng để bác make config 1. Cây mã hôm nay lớn hơn nhiều bậc, và tài liệu nhân hiện hành thậm chí không còn giới thiệu config như một lối vào bình thường — nó liệt kê menuconfig, nconfig, xconfig, gconfig làm “các lệnh cấu hình thay thế” và bảo dùng make help để xem hết 109.

  2. make defconfig

    make defconfig — mượn lựa chọn của người bảo trì make defconfig — lấy bản mẫu sẵn có make defconfig — borrowing the maintainer's answers

    Mỗi phiên bản nhân đi kèm một cấu hình “mặc định”, dựa một cách lỏng lẻo trên những gì người bảo trì kiến trúc đó cho là tùy chọn tốt nhất 2. Sách kể một chi tiết đáng nhớ: trong nhiều trường hợp, đó đơn giản là cấu hình mà chính người bảo trì dùng cho máy cá nhân của mình — và với kiến trúc i386, cấu hình mặc định khớp khá sát với thứ Linus Torvalds dùng trên máy phát triển chính của ông 2.

    Mỗi bản nhân có sẵn một bộ lựa chọn “mặc định” do người phụ trách chọn 2. Thú vị là nhiều khi đó chính là cấu hình họ dùng cho máy riêng — với máy i386, nó gần giống cấu hình máy của Linus Torvalds 2. Nhớ nhé: bạn đang mượn lựa chọn của người rành nhất.

    Every kernel version ships a “default” configuration, loosely based on the defaults the maintainer of that architecture feels are best 2. The book offers a memorable detail: in some cases it is merely the configuration the maintainer himself uses on his personal machines — and for the i386 architecture, the default matches closely what Linus Torvalds uses for his main development machine 2.

    Bạn thấy nó ở đâu. Chạy make defconfig và một lượng lớn tùy chọn sẽ trôi vụt qua màn hình, rồi một tệp .config được ghi ra thư mục nhân 2. Sách nói ngay: nhân “đã được cấu hình thành công, nhưng vẫn nên tùy biến cho máy của bạn để chắc chắn nó chạy đúng” 2.

    Gặp ở đâu. Gõ make defconfig, màn hình chạy vèo một loạt chữ, rồi tệp .config xuất hiện 2. Nhưng chưa xong: vẫn phải sửa cho hợp máy bạn 2. Nhớ nhé: mặc định là điểm xuất phát, không phải đích đến.

    Where you see it. Run make defconfig and a huge number of options scroll quickly by, then a .config file is written into the kernel directory 2. The book immediately adds that the kernel “is now successfully configured, but it should be customized to your machine in order to make sure it will operate correctly” 2.

    Mặc định của kiến trúc nào

    defconfig luôn là mặc định của một kiến trúc cụ thể. Sách cho ví dụ đổi kiến trúc ngay trên dòng lệnh: make ARCH=x86_64 defconfig lấy cấu hình mặc định của x86_64 8. Tài liệu hiện hành mô tả cùng cơ chế — giá trị mặc định lấy từ arch/$ARCH/configs/defconfig hoặc một biến thể theo nền tảng 10.

    Hai lối vào còn lại

    Sách hoãn hai cách kia sang Chương 7 1, nhưng chúng mới là cách phổ biến nhất hôm nay: tài liệu nhân khuyên dùng make localmodconfig, lấy cấu hình của bản phân phối làm nền rồi tắt các module có vẻ thừa — “giảm thời gian biên dịch một cách khổng lồ” — với cảnh báo kèm theo là nó dễ tắt luôn những tính năng bạn chưa dùng kể từ lúc khởi động 11.

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

Sửa cấu hình: ba giao diện, cùng một tệp Ba cửa sổ để bật và tắt Modifying the configuration: three tools, one file

Có ba công cụ cấu hình tương tác: một công cụ chạy trên terminal tên menuconfig, một công cụ đồ họa dựa trên GTK+ tên gconfig, và một công cụ đồ họa dựa trên QT tên xconfig 2. Điều cần nắm là cả ba đọc và ghi cùng một tệp .config; chúng khác nhau ở cách hiển thị, không ở kết quả. Sách nói thẳng rằng gconfig và xconfig “gần như giống hệt nhau, khác biệt duy nhất là bộ công cụ đồ họa dùng để viết chúng” 4.

Có ba cửa sổ để bạn bật/tắt từng thứ: menuconfig chạy trong màn hình chữ, còn gconfig và xconfig là cửa sổ đồ họa 2. Ba cái này chỉ khác nhau ở hình dáng, còn làm ra kết quả y hệt nhau 4. Nhớ nhé: chọn cái nào bạn thấy dễ nhìn nhất.

There are three interactive kernel configuration tools: a terminal-based one called menuconfig, a GTK+-based graphical one called gconfig, and a QT-based graphical one called xconfig 2. The point to hold on to is that all three read and write the same .config; they differ in presentation, not in outcome. The book says as much: gconfig and xconfig are “almost identical, the only difference being the different graphical toolkit with which they are written” 4.

Cũng đáng lưu ý điều sách không hứa: nó chỉ chỉ cho bạn cách chọn tùy chọn bạn muốn đổi, còn việc tìm ra tùy chọn nào cần cho phần cứng của bạn thì để sang Chương 7 2. Đó là ranh giới thật giữa “biết bấm” và “biết chọn”, và nhiều người dựng nhân lần đầu vấp đúng chỗ này.

Phân mục (section) và phân mục con. Cấu hình nhân được chia thành các phân mục, mỗi phân mục chứa các tùy chọn ứng với một chủ đề cụ thể, và bên trong có thể có phân mục con cho các chủ đề chuyên biệt hơn 3. Ví dụ sách dùng: mọi trình điều khiển thiết bị nằm dưới mục chính Device Drivers 3.

Cách sắp xếp. Các lựa chọn được gom thành từng nhóm theo chủ đề, trong nhóm lại có nhóm nhỏ hơn 3. Ví dụ tất cả trình điều khiển thiết bị nằm trong mục Device Drivers 3. Nhớ nhé: giống như thư mục lồng thư mục.

Sections and submenus. The kernel configuration is divided into sections, each containing options for a specific topic, and within those sections there can be subsections for specialized topics 3. The book's example: all kernel device drivers are found under the main menu option Device Drivers 3.

menuconfig
 [*] = bật   [ ] = tắt
 <*> = vào nhân
 <M> = module
 < > = bỏ

[*] có bật
[ ] không bật
<*> gắn vào nhân
<M> để rời
< > bỏ hẳn

menuconfig
 [*] = on   [ ] = off
 <*> = built in
 <M> = module
 < > = left out

  1. menuconfig

    make menuconfig — bàn phím, dấu ngoặc, và ý nghĩa của chúng make menuconfig — chọn bằng phím mũi tên make menuconfig — the keyboard, the brackets, and what they mean

    Đây là chương trình chạy trên console, cho phép đi lại trong cấu hình bằng các phím mũi tên; khởi động bằng make menuconfig 3. Hướng dẫn di chuyển và ý nghĩa các ký tự được in ngay ở đầu màn hình 3. Hai kiểu ngoặc mang hai ý nghĩa khác nhau: [ ] là tùy chọn có-hoặc-không, còn < > là tùy chọn ba trạng thái — dựng vào nhân (Y), dựng thành module (M), hoặc bỏ hẳn (N) 3.

    Gõ make menuconfig để mở bảng chọn trong cửa sổ chữ, đi lại bằng phím mũi tên 3. Có hai kiểu ô: ô vuông [ ] chỉ có bật hoặc tắt; ô nhọn < > có ba mức — gắn vào nhân, để rời, hoặc bỏ 3. Nhớ nhé: nhìn kiểu ngoặc là biết có mấy lựa chọn.

    This is a console-based program that lets you move around the configuration with the arrow keys; start it with make menuconfig 3. The navigation instructions and the meanings of the different characters are shown at the top of the screen 3. The two bracket styles mean two different things: [ ] marks a yes-or-no option, while < > marks a tri-state — built into the kernel (Y), built as a module (M), or left out altogether (N) 3.

    Bạn thấy nó ở đâu. Sách đi qua một ví dụ cụ thể: vào Device Drivers → Generic Driver Options, rồi nhấn Y cho tùy chọn thứ nhất, N cho thứ hai, M cho thứ ba — chỉ chọn trình điều khiển không cần firmware lúc biên dịch, chặn việc dựng firmware, và dựng trình nạp firmware phía người dùng thành module 3.

    Gặp ở đâu. Sách làm mẫu: vào mục Device Drivers, rồi Generic Driver Options, bấm Y – N – M cho ba dòng đầu 3. Nhớ nhé: bấm chữ cái là đổi trạng thái ngay.

    Where you see it. The book walks a concrete example: enter Device Drivers → Generic Driver Options, then press Y for the first option, N for the second and M for the third — selecting only drivers that need no firmware at compile time, disabling firmware from being built, and building the userspace firmware loader as a module 3.

    Thoát và lưu

    Rời một phân mục con bằng phím Escape, hoặc mũi tên phải rồi Enter 3. Ở menu chính, Escape sẽ hỏi bạn có lưu cấu hình đã đổi hay không: Enter để lưu, hoặc mũi tên phải sang <No> rồi Enter để vứt bỏ mọi thay đổi 3. Đây là chỗ duy nhất trong toàn chương mà một thao tác sai sẽ làm mất việc bạn vừa làm.

    Tên thật của các công cụ

    Tài liệu nhân hiện hành gọi chúng bằng tên chương trình: menuconfig là mconf, xconfig là qconf, gconfig là gconf — và bổ sung một lựa chọn thứ tư mà sách 2006 chưa có, nconfig (tức nconf), “một trình cấu hình dạng văn bản thay thế” 9.

  2. gconfig / xconfig

    gconfig và xconfig — hai khung cửa sổ, hai quy ước ký hiệu Hai cửa sổ đồ họa, ký hiệu khác nhau gconfig and xconfig — two windows, two symbol conventions

    gconfig viết bằng bộ công cụ GTK+ và có màn hình hai khung; xconfig viết bằng bộ công cụ QT và có màn hình ba khung 4. Điểm bẫy nằm ở ký hiệu module: trong gconfig, ô đánh dấu nghĩa là tùy chọn được dựng thẳng vào nhân, còn một gạch ngang qua ô nghĩa là dựng thành module; trong xconfig, tùy chọn dựng thành module hiện ra với một dấu chấm trong ô 4.

    gconfig có hai khung, xconfig có ba khung, dùng chuột để bấm 4. Cẩn thận chỗ này: ở gconfig, ô bị gạch ngang nghĩa là “để rời”; ở xconfig, ô có dấu chấm mới là “để rời” 4. Nhớ nhé: cùng ý nghĩa nhưng vẽ khác nhau.

    gconfig is written with the GTK+ toolkit and has a two-pane screen; xconfig is written with the QT toolkit and has a three-pane screen 4. The trap is the module marking: in gconfig a checked box means the option will be built into the kernel, whereas a line through the box means it will be built as a module; in xconfig, a module is shown with a dot in the box 4.

    Bạn thấy nó ở đâu. Cả hai đều nhắc bạn lưu cấu hình đã đổi khi thoát, và đều cho phép ghi cấu hình ấy ra một tệp khác — nhờ đó bạn có thể tạo nhiều cấu hình khác nhau và giữ song song 4.

    Gặp ở đâu. Khi đóng cửa sổ, cả hai đều hỏi có lưu không, và cho lưu ra tệp tên khác — nên bạn giữ được nhiều bộ cấu hình cùng lúc 4. Nhớ nhé: lưu ra tên khác để không mất bản cũ.

    Where you see it. Both prompt you to save the changed configuration on exit, and both offer to write it out to a different file — which is how you create multiple, differing configurations side by side 4.

    Nhãn “QT”/“GTK+” là nhãn 2006

    Sách viết “QT” và “GTK+” theo cách gọi năm 2006 4. Tài liệu nhân hiện hành mô tả ngắn gọn: make xconfig là “công cụ cấu hình dựa trên Qt”, make gconfig là “công cụ cấu hình dựa trên GTK” 10. Bản chất không đổi; chỉ phiên bản bộ công cụ là đã đi rất xa.

    Chuyển cấu hình sang bản nhân mới

    Ở Chương 6 sách nêu một quy trình quan trọng cho việc dùng lâu dài: khi đã có một cấu hình chạy tốt, thứ duy nhất cần làm khi lên bản mới là cập nhật những tùy chọn vừa được thêm vào — và dùng make oldconfig hoặc make silentoldconfig cho việc đó 12. oldconfig in ra mọi câu hỏi và tự trả lời những gì đã có trong .config, chỉ dừng lại ở tùy chọn mới 12.

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

Dựng nhân: một lệnh một từ Lắp máy: gõ đúng một từ Building the kernel: a one-word command

Sau tất cả công sức cấu hình, phần dựng được sách mô tả bằng một câu: “việc này đơn giản như gõ một lệnh một từ” — make 5. Chạy make khiến hệ thống dựng dùng cấu hình bạn đã chọn để tạo ra một nhân và tất cả các module cần thiết cho cấu hình ấy 5. Trong lúc chạy, make hiển thị tên từng tệp đang được xử lý, kèm mọi cảnh báo hoặc lỗi biên dịch 5.

Phần này ngắn đến bất ngờ: chỉ cần gõ make 5. Máy sẽ tự lắp nhân và tất cả các phần rời cần thiết 5. Màn hình sẽ chạy tên từng tệp — đó là bình thường 5. Nhớ nhé: thấy chữ chạy nghĩa là nó đang làm việc.

After all that configuring, the build itself gets one sentence: “This is as simple as entering a one-word command” — make 5. Running make causes the build system to use the configuration you selected to build a kernel and all the modules needed to support it 5. While it runs, make displays the individual filenames of what is currently happening, along with any build warnings or errors 5.

Câu “tất cả module cần thiết” mang một ghi chú lịch sử mà sách đặt ở chân trang: các bản nhân cũ hơn, trước bản 2.6, còn đòi thêm một bước make modules để dựng mọi module cần thiết; điều đó không còn cần nữa 5. Nếu bạn gặp một hướng dẫn trên mạng bảo phải chạy make modules, rất có thể bạn đang đọc tài liệu viết cho dòng 2.4.

Ảnh nhân (kernel image). Tệp kết quả của việc dựng. Nếu quá trình dựng kết thúc không lỗi, bạn đã tạo thành công một ảnh nhân — nhưng nó còn phải được cài đặt đúng cách trước khi bạn thử khởi động từ nó, và đó là nội dung Chương 5 5.

Kết quả là gì. Là một tệp nhân đã lắp xong. Dựng xong chưa dùng được ngay — còn phải cài đặt đúng chỗ rồi mới khởi động được, việc đó ở Chương 5 5. Nhớ nhé: lắp xong chưa phải là chạy được.

Kernel image. The file the build produces. If the build finished without errors you have successfully created a kernel image — but it still needs to be installed properly before you try to boot from it, which is Chapter 5's subject 5.

$ make
  CC      init/main.o
  HOSTCC  scripts/kallsyms
  ...
→ ảnh nhân + module

$ make
  (màn hình chạy tên tệp)
→ có nhân và các phần rời

$ make
  CC      init/main.o
  HOSTCC  scripts/kallsyms
  ...
→ kernel image + modules

  1. build errors are unusual

    Lỗi biên dịch là chuyện rất hiếm — và là chuyện đáng báo Bị lỗi là hiếm, mà hiếm thì nên báo Build errors are very unusual — and worth reporting

    Ông viết một câu vừa trấn an vừa giao việc: “Rất hiếm khi gặp lỗi dựng khi dựng một phiên bản nhân đã phát hành. Nếu bạn gặp, xin hãy báo cho các nhà phát triển nhân Linux để họ sửa” 5. Đây là một trong những chỗ cuốn sách lộ rõ mục đích sâu xa của nó: người dùng dựng nhân cũng là một phần của vòng phản hồi chất lượng.

    Nhân đã phát hành chính thức thì rất hiếm khi dựng bị lỗi. Nếu bạn gặp lỗi, hãy báo cho những người làm nhân để họ sửa 5. Nhớ nhé: gặp lỗi không phải lỗi của bạn — đó là thông tin quý.

    He writes a sentence that both reassures and assigns work: “It is very unusual to get any build errors when building a released kernel version. If you do, please report them to the Linux kernel developers so they can be fixed” 5. This is one of the places the book shows its deeper purpose: a user who builds a kernel is part of the quality feedback loop.

    Bạn thấy nó ở đâu. Phân biệt cho đúng: cảnh báo (warning) trong lúc dựng là bình thường và không chặn quá trình; lỗi (error) mới làm make dừng lại. Sách nói make in ra cả hai 5, nên đừng hoảng khi thấy chữ “warning”.

    Gặp ở đâu. Chữ “warning” chỉ là nhắc nhở, máy vẫn chạy tiếp. Chữ “error” mới làm dừng lại 5. Nhớ nhé: đừng nhầm lời nhắc với lỗi thật.

    Where you see it. Keep the distinction: a warning during the build is normal and does not stop anything; an error is what halts make. The book notes that make prints both 5, so do not panic at the word “warning”.

    Đọc đầu ra dựng

    Các nhãn viết hoa ở đầu mỗi dòng là loại hành động: CC biên dịch một tệp nguồn của nhân, HOSTCC biên dịch một công cụ chạy trên máy dựng (chẳng hạn scripts/kallsyms), GEN sinh tệp, SYMLINK tạo liên kết tượng trưng — sách in nguyên đoạn đầu ra này làm ví dụ 5. Biết đọc nhãn giúp bạn định vị ngay lỗi nằm ở phần nào.

    Khi cần xem lệnh đầy đủ

    Đầu ra gọn ấy cố tình giấu dòng lệnh biên dịch thật. Tài liệu nhân hiện hành khuyên khi gỡ lỗi thì dựng lại với make V=1 để thấy lệnh đầy đủ, và lưu ý rằng lúc đó nên bỏ luôn tùy chọn song song đã dùng trước đó 11.

  2. make help

    Hệ thống dựng biết làm nhiều hơn là dựng Còn nhiều lệnh khác nữa The build system does more than build

    Sách mở phần nâng cao bằng một lời nhắc: hệ thống dựng cho phép làm nhiều việc hơn là chỉ dựng nhân và module; Chương 10 liệt kê đầy đủ, còn để biết cách dùng các tùy chọn nâng cao khác thì xem tài liệu ngay trong nhân, ở thư mục Documentation/kbuild 6. Và có một lệnh tra cứu tại chỗ: chạy make help trong thư mục dựng sẽ in ra phần lớn các đích make thông dụng 13.

    Hệ thống dựng còn làm được nhiều việc khác, không chỉ mỗi việc lắp nhân 6. Muốn xem có những lệnh gì, cứ gõ make help 13. Nhớ nhé: quên lệnh thì hỏi make help.

    The book opens its advanced section with a reminder: the build system lets you do many more things than just build the kernel and modules; Chapter 10 has the full list, and for the other advanced options you should read the in-kernel documentation in the Documentation/kbuild directory 6. And there is a lookup command on the spot: running make help inside the build directory prints out most of the common make targets 13.

    Bạn thấy nó ở đâu. Nhiều đích có thể gộp chung trên một dòng lệnh; ví dụ của sách là make mrproper xconfig — dọn sạch cây mã rồi mở ngay giao diện cấu hình 13.

    Gặp ở đâu. Bạn có thể ghép nhiều việc vào một dòng, ví dụ make mrproper xconfig vừa dọn sạch vừa mở bảng chọn 13. Nhớ nhé: ghép lệnh tiết kiệm thời gian.

    Where you see it. Several targets can be grouped on one command line; the book's example is make mrproper xconfig — clean the tree out, then open the configuration tool 13.

    make help hôm nay

    Lời khuyên này còn nguyên giá trị: tài liệu Kconfig hiện hành cũng bảo “dùng make help để liệt kê mọi đích cấu hình khả dĩ”, vì danh sách đó đã dài thêm đáng kể từ 2006 9.

    Đích thông tin

    Chương 10 phân loại các đích, trong đó có nhóm đích thông tin như kernelrelease và kernelversion — in phiên bản nhân, thường được các script dùng để xác định bản đang dựng 13. Chúng không dựng gì cả; chúng chỉ trả lời câu hỏi “đây là bản nào”.

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

Tùy chọn dựng nâng cao: nhanh hơn, hẹp hơn, khác máy Mẹo: nhanh hơn, gọn hơn, cho máy khác Advanced building options: faster, narrower, elsewhere

Bốn mẹo trong phần này giải quyết bốn nhu cầu rất khác nhau, nhưng đều là tham số truyền cho cùng một lệnh make: -j để dùng hết nhiều bộ xử lý, một đường dẫn hoặc M= để chỉ dựng một phần cây mã, O= để tách nơi chứa mã nguồn khỏi nơi chứa kết quả, và ARCH= cùng CROSS_COMPILE= để dựng cho kiến trúc khác 678.

Phần này có bốn mẹo, đều là thêm chữ vào sau lệnh make: -j để chạy nhanh hơn, M= để chỉ làm một phần, O= để để kết quả ra chỗ khác, và ARCH= để dựng cho loại máy khác 678. Nhớ nhé: vẫn là make, chỉ thêm chữ phía sau.

The four techniques here answer four very different needs, but all of them are arguments to the same make: -j to use several processors, a path or M= to build only part of the tree, O= to separate source from output, and ARCH= plus CROSS_COMPILE= to build for another architecture 678.

Dựng đa luồng (multithreaded build). Sách nhận xét rằng việc dựng nhân chia nhỏ thành nhiều mẩu giao cho nhiều bộ xử lý rất tốt, nhờ đó tận dụng được toàn bộ sức mạnh của máy nhiều bộ xử lý và giảm đáng kể thời gian dựng 6.

Dựng song song là gì. Là chia việc lắp ra cho nhiều bộ xử lý làm cùng lúc, nên nhanh hơn nhiều 6. Nhớ nhé: nhiều người làm thì xong sớm.

Multithreaded build. The book observes that a kernel build splits into little pieces handed to different processors very well, letting you use the full power of a multiprocessor machine and reduce build time considerably 6.

2 bộ xử lý → make -j4
4 bộ xử lý → make -j8
make -j (không số) → NGUY HIỂM

2 nhân → -j4
4 nhân → -j8
-j trống → đừng dùng

2 processors → make -j4
4 processors → make -j8
make -j (no number) → DANGEROUS

  1. make -jN

    -j có số — và vì sao -j trống là một cái bẫy Luôn ghi số sau -j -j with a number — and why bare -j is a trap

    Quy tắc của sách rất cụ thể: nên đưa cho -j một con số bằng gấp đôi số bộ xử lý có trong máy — máy hai bộ xử lý thì make -j4, máy bốn bộ xử lý thì make -j8 6. Còn nếu bạn không truyền giá trị nào, hệ thống dựng sẽ tạo một luồng mới cho mỗi thư mục con trong cây nhân, thứ dễ dàng làm máy bạn treo cứng và khiến quá trình dựng lâu hơn nhiều; vì vậy sách khuyên luôn luôn truyền một con số 6.

    Sau chữ -j phải có số. Số đó nên gấp đôi số bộ xử lý: máy 2 nhân thì make -j4, máy 4 nhân thì make -j8 6. Nếu gõ -j mà không có số, máy sẽ mở quá nhiều việc cùng lúc, có thể đơ và còn chậm hơn 6. Nhớ nhé: không bao giờ gõ -j trống.

    The book's rule is concrete: give -j a number corresponding to twice the number of processors in the system — make -j4 on a two-processor machine, make -j8 on a four-processor one 6. If you pass no value at all, the build system creates a new thread for every subdirectory in the kernel tree, which can easily make your machine unresponsive and take much longer to finish; so it recommends you always pass a number 6.

    Bạn thấy nó ở đâu. Con số “gấp đôi” là lời khuyên 2006 cho máy vài bộ xử lý. Tài liệu nhân hiện hành dùng một công thức khác, gọn hơn: make -j $(nproc --all), tức đúng bằng số lõi CPU trong máy 11.

    Gặp ở đâu. Ngày nay tài liệu chính thức thường viết make -j $(nproc --all) — máy tự đếm số lõi giúp bạn 11. Nhớ nhé: để máy tự đếm là an toàn nhất.

    Where you see it. The “twice” figure is 2006 advice for machines with a few processors. Current kernel documentation uses a tidier formula: make -j $(nproc --all), matching every CPU core in the system 11.

    Hai lời khuyên khác nhau, không mâu thuẫn

    Sách 2006 nói “gấp đôi số bộ xử lý” 6; tài liệu hiện hành dùng “bằng số lõi” 11. Chúng đến từ hai bối cảnh khác nhau: năm 2006, “bộ xử lý” thường là một lõi vật lý không có siêu phân luồng, và đĩa cứng quay khiến tác vụ hay phải chờ vào/ra — nhân đôi để lấp chỗ chờ. Máy hiện đại đã đếm sẵn cả lõi luận lý, nên nproc --all đã bao hàm phần bù ấy. Trang này giữ nguyên con số của sách trong phần thân và ghi chú khác biệt ở đây, thay vì chọn im lặng một bên.

    Dựng nhanh bằng cách khác

    Sách cũng chỉ ra rằng việc đổi trình biên dịch có ích ngay cả khi không dựng chéo: distcc và ccache “đều giúp giảm đáng kể thời gian dựng nhân”, dùng qua make CC="ccache gcc", hoặc kết hợp cả hai với make CC="ccache distcc" 8.

  2. M= and a path

    Dựng một phần — và cái bẫy “quên liên kết lại” Chỉ làm một phần thôi Building only a portion — and the relink trap

    Để dựng chọn lọc một thư mục, chỉ cần nêu nó trên dòng lệnh, ví dụ make drivers/usb/serial 7. Nhưng cú pháp này không dựng ra ảnh module cuối cùng trong thư mục đó; muốn vậy phải dùng tham số M=: make M=drivers/usb/serial sẽ dựng mọi tệp cần thiết và liên kết các ảnh module 7. Bạn cũng có thể chỉ đích danh một tệp, chẳng hạn make drivers/usb/serial/visor.ko 7.

    Muốn làm lại chỉ một thư mục thì ghi tên thư mục sau make 7. Nhưng cách đó chưa ra tệp module hoàn chỉnh — muốn có thì thêm M= phía trước, như make M=drivers/usb/serial 7. Hoặc chỉ luôn một tệp, như make drivers/usb/serial/visor.ko 7. Nhớ nhé: làm một phần thì nhanh, nhưng chưa xong hẳn.

    To selectively build one directory, name it on the command line, as in make drivers/usb/serial 7. But that syntax will not build the final module images in that directory; for that you use the M= argument: make M=drivers/usb/serial builds all the needed files and links the final module images 7. You can also name a single file, such as make drivers/usb/serial/visor.ko 7.

    Bạn thấy nó ở đâu. Cái bẫy sách cảnh báo rất đáng nhớ: khi dựng một thư mục đơn lẻ, ảnh nhân cuối cùng không được liên kết lại, nên những thay đổi trong thư mục con sẽ không ảnh hưởng tới ảnh nhân — “điều có lẽ không phải thứ bạn mong muốn”. Hãy chạy một lệnh make trần ở cuối để hệ thống kiểm tra mọi tệp đối tượng đã đổi và liên kết ảnh nhân cho đúng 7.

    Gặp ở đâu. Làm riêng một thư mục thì nhân chính chưa được lắp lại, nên thay đổi của bạn chưa vào nhân. Chạy thêm một lần make trần là xong 7. Nhớ nhé: cuối cùng vẫn phải gõ make một lần.

    Where you see it. The trap the book flags is worth remembering: when you build a single directory, the final kernel image is not relinked, so changes in the subdirectory will not affect it — “which is probably not what you desire”. Run a final plain make so the build system checks all changed object files and does the final link properly 7.

    Khi nào dùng

    Sách đặt kỹ thuật này vào đúng bối cảnh của nó: “khi làm phát triển nhân, đôi khi bạn chỉ muốn dựng một thư mục con cụ thể hoặc một tệp đơn lẻ trong toàn bộ cây nhân” 7. Với người dùng chỉ muốn một cái nhân chạy được, make trần vẫn là lối đi đúng.

    Đường dẫn hay M=?

    Khác biệt duy nhất giữa hai dạng là bước liên kết: dạng đường dẫn trần dựng các tệp đối tượng; dạng M= còn liên kết chúng thành tệp .ko nạp được 7. Nếu bạn định insmod kết quả, bạn cần dạng thứ hai.

  3. O= and ARCH=

    O= tách nguồn khỏi kết quả, ARCH= đổi kiến trúc Để kết quả ra chỗ khác, hoặc dựng cho máy khác O= separates source from output, ARCH= changes architecture

    Đôi khi tiện hơn nếu mã nguồn nằm ở nơi chỉ-đọc — một đĩa CD-ROM, hoặc một hệ quản lý mã nguồn — còn kết quả dựng đặt ở chỗ khác để không làm bẩn cây gốc. Hệ thống dựng xử lý việc này chỉ bằng một tham số O= 7. Ví dụ của sách: mã nguồn nằm ở /mnt/cdrom/linux-2.6.17.11, kết quả đặt vào thư mục cục bộ bằng make O=~/linux/linux-2.6.17.11 7. Với kiến trúc, tham số là ARCH=, và trình biên dịch chéo chỉ định qua CROSS_COMPILE= 8.

    Nếu mã nguồn nằm ở chỗ không cho ghi (như đĩa CD), bạn vẫn dựng được — chỉ cần bảo máy để kết quả ra chỗ khác bằng O= 7. Còn muốn dựng nhân cho loại máy khác thì thêm ARCH=, và nếu cần bộ công cụ riêng thì thêm CROSS_COMPILE= 8. Nhớ nhé: một chữ là đổi được chỗ để, một chữ là đổi được loại máy.

    Sometimes it is easier to keep the source in a read-only location — a CD-ROM, or a source control system — and put the build output elsewhere so the original tree is undisturbed. The build system handles this with the single argument O= 7. The book's example: source on /mnt/cdrom/linux-2.6.17.11, output into your local directory via make O=~/linux/linux-2.6.17.11 7. For architecture the argument is ARCH=, and a cross-compile toolchain is named with CROSS_COMPILE= 8.

    Bạn thấy nó ở đâu. Sách nhấn mạnh một điều dễ quên: O= cũng phải được truyền cho các lệnh cấu hình, để tệp cấu hình được đặt đúng vào thư mục kết quả chứ không phải vào thư mục chứa mã nguồn 7. Tài liệu hiện hành nói cùng một điều gắt hơn: nếu dùng O= thì “phải dùng cho mọi lần gọi make” 10.

    Gặp ở đâu. Nếu đã dùng O= thì phải dùng nó cho tất cả các lệnh, kể cả lệnh cấu hình 710. Nhớ nhé: đã dùng thì dùng cho đều, đừng dùng nửa chừng.

    Where you see it. The book stresses a point that is easy to forget: O= must also be passed to the configuration targets so the config lands in the output directory and not in the directory holding the source 7. Current documentation puts it more strictly: if O=output/dir is used, “it must be used for all invocations of make” 10.

    Dựng chéo: hai ví dụ của sách

    Để lấy cấu hình mặc định của kiến trúc x86_64: make ARCH=x86_64 defconfig. Để dựng toàn bộ nhân bằng bộ công cụ ARM nằm ở /usr/local/bin/: make ARCH=arm CROSS_COMPILE=/usr/local/bin/arm-linux- 8. Lưu ý dấu gạch nối ở cuối — đó là tiền tố tên công cụ, không phải đường dẫn tệp.

    Vì sao dựng chéo hữu ích cả khi không cần

    Sách nêu hai động cơ: cho một máy mạnh dựng nhân giúp một hệ nhúng nhỏ, hoặc đơn giản là kiểm tra thử một bản dựng cho kiến trúc khác để chắc rằng thay đổi trong mã nguồn không làm hỏng thứ gì ngoài dự kiến 8. Động cơ thứ hai là kiểm thử, không phải triển khai.

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

“Cấu hình nhân là phải trả lời hết mọi câu hỏi”“Configuring means answering every question”

Hiểu lầm: phải đi qua make config từ đầu đến cuối. Thực tế: chính sách nói đó là cách “cơ bản nhất” nhưng sẽ “rất lâu” vì gần hai nghìn tùy chọn, và “may thay, có một cách dễ hơn: dựa cấu hình trên một cấu hình đã dựng sẵn” 1. Lấy nền rồi sửa mới là quy trình sách dạy 2.

Myth: you must walk make config end to end. Fact: the book itself calls it “the most basic method” but says it “will take a very long time” given almost two thousand options, and that “luckily, there is an easier way: base the configuration on a pre-built configuration” 1. Take a base, then edit — that is the workflow it teaches 2.

“menuconfig và xconfig cho kết quả khác nhau”“menuconfig and xconfig give different results”

Hiểu lầm: chọn sai công cụ thì ra nhân khác. Thực tế: cả ba công cụ chỉ là giao diện lên cùng một tệp .config 1; gconfig và xconfig “gần như giống hệt nhau, khác biệt duy nhất là bộ công cụ đồ họa” 4. Thứ khác nhau là ký hiệu hiển thị — gạch ngang ô trong gconfig, dấu chấm trong xconfig 4.

Myth: picking the wrong tool yields a different kernel. Fact: all three are front-ends onto the same .config 1; gconfig and xconfig are “almost identical, the only difference being the different graphical toolkit” 4. What differs is the notation — a line through the box in gconfig, a dot in xconfig 4.

“-j càng lớn càng nhanh”“A bigger -j is always faster”

Hiểu lầm: bỏ số đi để máy chạy hết công suất. Thực tế: make -j không số tạo một luồng cho mỗi thư mục con, “dễ dàng khiến máy bạn không phản hồi và mất nhiều thời gian hơn để hoàn tất” 6. Luôn truyền một con số 6.

Myth: drop the number so the machine runs flat out. Fact: a bare make -j creates a thread for every subdirectory, which “can easily cause your machine to become unresponsive and take a much longer time to complete the build” 6. Always pass a number 6.

Tự kiểmSelf-check

Tự kiểm trước khi sang chương 5 Tự hỏi mình vài câu Self-check before Chapter 5

Khác với Chương 1, chương này có lệnh để gõ thật. Hãy trả lời được các câu sau trước khi chuyển sang cài đặt — vì một cấu hình sai sẽ chỉ lộ ra ở lần khởi động, khi việc sửa đã tốn kém hơn nhiều.

Chương này có lệnh gõ thật rồi. Trả lời được mấy câu dưới đây thì hãy sang phần cài đặt. Nhớ nhé: chọn sai bây giờ, tới lúc khởi động mới biết thì khó sửa hơn.

Unlike Chapter 1, this one has commands you actually type. Be able to answer the following before you move on to installing — a wrong configuration only shows up at boot, when fixing it costs far more.

  1. Bạn chỉ ra được tệp cấu hình nằm ở đâu và tên chính xác của nó?

    Đáp án: .config, ở thư mục trên cùng của cây mã nguồn; cây mới giải nén thì chưa có nó 1. Dấu chấm đầu tên khiến ls thường không hiện nó ra.

  2. Bạn nói được khác biệt giữa y, m và n — và chữ thứ tư ? làm gì?

    Đáp án: dựng thẳng vào nhân / dựng thành module nạp khi cần / loại hẳn; ? in một mô tả ngắn rồi hỏi lại, không đổi gì cả 1.

  3. Bạn chọn được một lối tạo .config phù hợp với hoàn cảnh của mình, thay vì mặc định chạy make config?

    Sách chỉ dạy hai lối trong chương này — từ con số không và từ make defconfig — và hoãn hai lối còn lại (từ nhân đang chạy, từ nhân của bản phân phối) sang Chương 7 1.

  4. Trong menuconfig, bạn phân biệt được [ ] với < > chỉ bằng cách nhìn?

    Đáp án: [ ] là có-hoặc-không; < > là ba trạng thái Y/M/N — * nghĩa là vào nhân, M nghĩa là module, khoảng trắng nghĩa là bỏ 3.

  5. Bạn biết con số nào nên đặt sau -j trên máy của mình, và vì sao không được để trống?

    Sách: gấp đôi số bộ xử lý 6. Tài liệu hiện hành: $(nproc --all) 11. Để trống thì mỗi thư mục con thành một luồng — máy có thể treo 6.

  6. Nếu bạn vừa dựng lại riêng drivers/usb/serial, bước tiếp theo bắt buộc là gì?

    Đáp án: chạy một lệnh make trần, để hệ thống kiểm tra các tệp đối tượng đã đổi và liên kết lại ảnh nhân cuối cùng cho đúng 7.

  1. Tệp ghi lựa chọn của bạn tên là gì, nằm ở đâu?
  2. Chữ y, m, n mỗi chữ nghĩa là gì?
  3. Bạn sẽ lấy bản mẫu nào làm nền, thay vì trả lời từ đầu?
  4. Trong bảng chọn, ô vuông và ô nhọn khác nhau chỗ nào?
  5. Máy bạn có mấy nhân, nên gõ -j mấy?
  6. Nhớ nhé: trả lời được hết thì sang chương 5 cài đặt được rồi.
  1. Can you say where the configuration file lives and its exact name?

    Answer: .config, in the top directory of the source tree; a freshly expanded tree has none 1.

  2. Can you state the difference between y, m and n — and what the fourth choice ? does?
  3. Can you pick a route to a .config that suits your situation, rather than defaulting to make config?
  4. In menuconfig, can you tell [ ] from < > at a glance?
  5. Do you know what number belongs after -j on your machine, and why it must not be empty?

    The book: twice the number of processors 6. Current docs: $(nproc --all) 11.

  6. If you just rebuilt drivers/usb/serial alone, what step is mandatory next?

Đọng lạiWhat remains

Toàn bộ quyền lực của chương này nằm trong một tệp ẩn tên .config và một lệnh một từ. Phần khó không phải là dựng — mà là biết mình muốn gì trước khi dựng.

Cả chương này gói trong một tệp tên .config và một lệnh tên make. Phần khó không phải là gõ lệnh, mà là biết mình cần gì. Nhớ nhé: chọn kỹ rồi hãy lắp.

All the power in this chapter sits in one hidden file called .config and one one-word command. The hard part is not the building — it is knowing what you want before you build.