Phần III · Tham chiếu nhân · Chương 10Part III · Kernel Reference · Chapter 10
Toàn bộ danh mục đích make của hệ dựng nhân
Danh sách đầy đủ các “lệnh con” của make
The complete catalogue of kernel build targets
Chương 4 đã dạy bạn những đích make tối thiểu để dựng được một cái nhân. Chương 10 mở rộng ra toàn bộ: Kroah-Hartman viết rằng công cụ buộc mọi thứ lại với nhau trong việc dựng nhân là chương trình make, và bạn truyền cho nó một target — một đích — nói rõ bạn muốn dựng cái gì 1. Hệ dựng nhân còn có “một dải rộng các đích khác”, và chương này liệt kê chúng cùng công dụng của từng cái 1.
Khi dựng nhân, bạn gõ lệnh make kèm theo một từ khóa cho biết bạn muốn làm gì. Từ khóa ấy gọi là “đích” 1. Chương 4 mới dạy vài cái cơ bản; chương 10 này kể ra gần như tất cả 1. Nhớ nhé: một lệnh make, rất nhiều từ khóa đi kèm.
Chapter 4 taught you the minimum set of make targets needed to build a kernel properly. Chapter 10 opens the whole catalogue: Kroah-Hartman writes that the tool that ties together kernel builds is the make program, to which you pass a target specifying what you want to build 1. The kernel build system also has “a wide range of other targets”, and this chapter details them and what they can be used for 1.
Đây là một chương tham chiếu, không phải chương lập luận — chỉ năm trang, chín bảng. Vì thế trang đồng hành này có thể làm điều hiếm hoi: phủ trọn vẹn mọi đích mà sách liệt kê, không bỏ sót cái nào. Đổi lại, người đọc năm 2026 phải mang theo một chiếc kính lọc thời gian: sách viết cho dòng nhân 2.6 năm 2006, nên mỗi đích ở đây cần được đối chiếu với danh sách make help hiện hành 9. Phần lớn còn nguyên; một số đã đổi tên, đổi cơ chế, hoặc biến mất.
Luận điểm chương 10. Mọi đích đều được truyền cho make trên dòng lệnh, và có thể gộp nhiều đích trong một lệnh nếu muốn — ví dụ của ông là make mrproper xconfig 1. Bạn không cần nhớ hết: chạy make help ngay trong thư mục dựng sẽ in ra phần lớn các đích được mô tả trong chương 1.
Ý chính. Tất cả từ khóa đều viết sau chữ make, và bạn được viết nhiều từ khóa một lúc, như make mrproper xconfig 1. Quên thì gõ make help, máy sẽ tự kể ra 1. Nhớ nhé: không cần học thuộc, chỉ cần biết chỗ hỏi.
Chapter 10 thesis. All of these targets are passed to make on the command line, and a number of them can be grouped together if desired — his example is make mrproper xconfig 1. You do not have to memorise them: running make help inside the build directory prints out most of the common targets described in the chapter 1.
kernelrelease, clean, mrproper, menuconfig, oldconfig…
Hỏi phiên bản, xóa đồ cũ, chọn tùy chọn.
kernelrelease, clean, mrproper, menuconfig, oldconfig…
all, vmlinux, modules, modules_install, deb-pkg…
Biên dịch nhân, rồi gói lại để đem đi cài.
all, vmlinux, modules, modules_install, deb-pkg…
htmldocs, bzImage, install, checkstack…
In tài liệu, tạo ảnh khởi động, soi lỗi.
htmldocs, bzImage, install, checkstack…
Cụm khái niệm 01Concept cluster 01
Hỏi trước, dọn sau: đích thông tin và đích dọn dẹp Hỏi phiên bản, rồi xóa đồ cũ Ask first, clean second: informational and cleaning targets
Hai nhóm đích mở đầu chương là hai nhóm ít ai gõ bằng tay nhất — và cũng là hai nhóm dễ gây tai nạn nhất nếu chọn sai. Nhóm thứ nhất chỉ in ra phiên bản nhân, và ông ghi nhận chúng “thường được các kịch bản dùng để xác định phiên bản của nhân đang được dựng” 1. Nhóm thứ hai xóa tệp: ông khuyến nghị dùng chúng “rất mạnh mẽ” để chắc chắn bạn không làm nhiễm bẩn bản dựng mới bằng tệp sót lại từ bản dựng cũ với tùy chọn khác 2.
Nhóm đầu tiên chỉ hỏi máy: “nhân này là phiên bản mấy?” — các kịch bản tự động hay dùng 1. Nhóm thứ hai thì dọn rác: xóa các tệp còn sót từ lần dựng trước, để lần này không bị lẫn lộn 2. Nhớ nhé: hỏi thì vô hại, dọn thì phải nhìn kỹ mình xóa đến đâu.
The two families that open the chapter are the ones you type by hand least often — and the ones most likely to bite if you pick the wrong member. The first merely prints a kernel version, and he notes they “are commonly used by scripts to determine the version of the kernel being built” 1. The second deletes files: their use is “highly recommended” to make sure you don't contaminate new builds with leftover files that may have been built with different options 2.
Đích (target). Một từ khóa bạn viết sau make để nói rõ bạn muốn hệ dựng làm gì. Sách chia chúng thành các loại khác nhau theo từng mục 1; cách chia ấy — thông tin, dọn dẹp, cấu hình, dựng, đóng gói, tài liệu, theo kiến trúc, phân tích — vẫn là cách make help nhóm chúng cho tới ngày nay 9.
“Đích” là gì. Là từ khóa viết sau chữ make để bảo máy làm việc gì. Sách xếp chúng thành từng nhóm 1, và cách xếp nhóm đó đến giờ vẫn còn dùng 9. Nhớ nhé: đích là “việc cần làm”, không phải “tệp cần tạo”.
Target. A keyword you type after make to say what you want the build system to do. The book breaks the targets down into different types by section 1; that same grouping — informational, cleaning, configuration, build, packaging, documentation, architecture-specific, analysis — is still how make help organises them today 9.
make kernelrelease → in phiên bản đầy đủ
make kernelversion → in phiên bản Makefile
make clean → giữ .config
make mrproper → xóa cả .config
make distclean → mrproper + tệp sao lưu
hỏi phiên bản → kernelrelease
dọn nhẹ → clean
dọn sạch → mrproper
dọn sạch hơn → distclean
make kernelrelease → full version string
make kernelversion → Makefile version
make clean → keeps .config
make mrproper → removes .config too
make distclean → mrproper + backup files
-
informational targets
kernelreleasevàkernelversion— hai câu trả lời khác nhau Hai cách hỏi “phiên bản mấy?”kernelreleaseandkernelversion— two different answersBảng 10-1 của sách chỉ có hai dòng.
kernelreleasehiển thị phiên bản nhân hiện tại “như hệ dựng xác định”;kernelversionhiển thị phiên bản “như Makefile chính cho biết”, và khác ở chỗ nó không dùng bất kỳ thông tin phiên bản bổ sung nào dựa trên tùy chọn cấu hình hay các tệplocalversion1. Nói cách khác: cái sau là con số thô, cái trước là con số bạn sẽ thấy tronguname -r.Có hai cách hỏi phiên bản.
kernelversioncho con số gốc ghi trong tệp Makefile.kernelreleasecho con số đầy đủ, có thêm phần đuôi do cấu hình và tệplocalversionthêm vào 1. Nhớ nhé: một cái là số gốc, một cái là số thật khi chạy.Table 10-1 in the book has just two rows.
kernelreleasedisplays the current kernel version “as determined by the build system”;kernelversiondisplays it “as told by the main Makefile”, differing in that it doesn't use any additional version information based on configuration options orlocalversionfiles 1. In other words: the latter is the raw number, the former is the number you will read back fromuname -r.Bạn thấy nó ở đâu. Mọi kịch bản đóng gói nhân đều gọi
kernelreleaseđể đặt tên tệp. Danh sáchmake helphiện hành vẫn giữ cả hai, kèm lời khuyên dùng với cờ-scho gọn, và bổ sung một đích thứ ba làimage_name9.Gặp ở đâu. Các kịch bản tự động dùng nó để đặt tên tệp nhân. Ngày nay vẫn còn cả hai, và có thêm
image_name9. Nhớ nhé: thêm-sđể máy chỉ in kết quả, không in gì khác.Where you see it. Every kernel packaging script calls
kernelreleaseto name its files. The currentmake helplisting still carries both, advises using them with-s, and adds a third informational target,image_name9.Vì sao có hai con số
Nhân cho phép bạn dán một hậu tố riêng vào phiên bản — qua tùy chọn cấu hình hoặc một tệp
localversiontrong cây mã. Chính hậu tố ấy tạo ra khoảng cách giữa hai đích:kernelversioncố tình bỏ qua nó,kernelreleasecố tình mang nó theo 1. Khi hai bản nhân cùng phiên bản gốc nhưng khác cấu hình cùng nằm trên một máy, hậu tố này là thứ duy nhất phân biệt được chúng.Ranh giới 2006 / hôm nay
Hai đích này là phần ổn định nhất của cả chương: hai mươi năm sau chúng vẫn nằm nguyên trong mục “Other generic targets” của
make helpvới đúng vai trò cũ 9. Nếu bạn cần một ví dụ về việc giao diện dòng lệnh của nhân bền đến mức nào, đây là ví dụ ấy. -
cleaning targets
Ba mức dọn:
clean→mrproper→distcleanBa mức dọn, từ nhẹ tới sạch bong Three depths of clean:clean→mrproper→distcleanBa đích này khác nhau ở chỗ chúng xóa bao nhiêu, và ông nói rõ lý do có ba mức: “đôi khi bạn muốn giữ lại những tệp mình đã thay đổi” 2.
cleanxóa phần lớn tệp do hệ dựng sinh ra nhưng giữ cấu hình nhân.mrproperxóa tất cả tệp sinh ra, kể cả cấu hình và một số tệp sao lưu.distcleanlàm mọi thứmrproperlàm, cộng thêm việc xóa một số tệp sao lưu của trình soạn thảo và tệp thừa do vá để lại 2.Ba nút dọn, mạnh dần.
clean: xóa đồ biên dịch, giữ phần bạn đã chọn cấu hình.mrproper: xóa hết, mất luôn cấu hình.distclean: xóa hết, thêm cả tệp sao lưu của trình soạn thảo 2. Nhớ nhé: gõmrproperlà mất tệp.config— sao lưu nó trước đã.The three differ in how much they remove, and he states the reason there are three: “sometimes you want to keep around files you've changed” 2.
cleanremoves most of the files generated by the build system but keeps the kernel configuration.mrproperremoves all generated files, including the configuration and various backup files.distcleandoes everythingmrproperdoes and also removes editor backup and patch leftover files 2.Bạn thấy nó ở đâu. Ví dụ gộp đích của chính ông —
make mrproper xconfig— là mẫu quen thuộc khi bắt đầu một cấu hình hoàn toàn mới 1: xóa sạch trước, rồi mở giao diện chọn lại từ đầu.Gặp ở đâu. Câu lệnh mẫu của sách là
make mrproper xconfig— dọn sạch rồi mở bảng chọn 1. Nhớ nhé: đây là cách bắt đầu lại từ số không.Where you see it. His own grouping example —
make mrproper xconfig— is the familiar pattern for starting a configuration from scratch 1: wipe everything, then open the editor and choose again.Cùng ba đích, mô tả đã tinh hơn
Danh sách
make helphiện hành vẫn đúng ba đích ấy theo đúng thứ tự, nhưng mô tảcleanđã cụ thể hơn: nó giữ lại cấu hình và đủ hạ tầng dựng để còn dựng được module ngoài cây 9. Chi tiết này quan trọng với người dựng driver riêng — sách 2006 chưa nêu.Vì sao tên là “mrproper”
Sách không giải thích cái tên; nó là một quy ước lâu đời của cây mã nhân. Điều đáng nhớ không phải từ nguyên mà là hệ quả: đây là đích duy nhất trong nhóm khiến bạn mất công lao cấu hình. Thói quen an toàn là
cp .config ~/config-backuptrước khi gõ nó — một bước phòng xa do trang này thêm vào, không có trong sách.
Cụm khái niệm 02Concept cluster 02
Đích cấu hình: mười một lối vào cùng một tệp .config
Mười một cách chọn tùy chọn
Configuration targets: eleven doors into one .config
Bảng 10-3 là bảng dài nhất của chương. Ông giới thiệu nó bằng một câu rất gọn: đây là các đích “cho phép nhân được cấu hình theo rất nhiều cách khác nhau” 2. Đọc kỹ sẽ thấy mười một đích ấy tách làm ba họ có tính chất khác hẳn nhau: họ hỏi bạn (bốn giao diện tương tác), họ kế thừa (dựa trên .config sẵn có), và họ sinh tự động (máy tự trả lời hết).
Bảng này dài nhất chương. Ông nói đây là các cách “cấu hình nhân theo rất nhiều kiểu khác nhau” 2. Có thể chia làm ba loại: loại hỏi bạn từng câu, loại lấy lựa chọn cũ làm nền, và loại máy tự điền hết. Nhớ nhé: ba loại, nhưng kết quả đều là một tệp .config.
Table 10-3 is the longest table in the chapter. He introduces it in one tight sentence: these are the targets “that allow the kernel to be configured in a wide range of different ways” 2. Read closely, the eleven split into three families of quite different character: those that ask you (four interactive front-ends), those that inherit (working from an existing .config), and those that generate (the machine answers everything itself).
.config. Tệp văn bản duy nhất ở gốc thư mục dựng, ghi lại câu trả lời cho mọi tùy chọn. Mười một đích trong bảng 10-3 khác nhau ở cách chúng sinh ra hoặc cập nhật tệp này 2 — chứ không khác nhau ở kết quả cuối.
.config là gì. Là tệp ghi lại toàn bộ lựa chọn của bạn. Mười một đích chỉ khác nhau ở cách tạo ra tệp đó 2. Nhớ nhé: mọi con đường đều dẫn về một tệp.
.config. The single text file at the root of the build directory recording the answer to every option. The eleven targets in Table 10-3 differ in how they produce or update that file 2 — not in what they ultimately produce.
hỏi bạn : config menuconfig
xconfig gconfig
kế thừa : oldconfig silentoldconfig
sinh tự động: randconfig defconfig
allmodconfig
allyesconfig allnoconfig
hỏi bạn : config, menuconfig,
xconfig, gconfig
dựa cũ : oldconfig
tự điền : defconfig, allnoconfig…
they ask : config menuconfig
xconfig gconfig
they inherit: oldconfig silentoldconfig
they generate: randconfig defconfig
allmodconfig
allyesconfig allnoconfig
-
interactive configurators
Bốn giao diện:
config,menuconfig,xconfig,gconfigBốn kiểu bảng chọn Four front-ends:config,menuconfig,xconfig,gconfigBốn đích này cùng làm một việc — “cập nhật cấu hình nhân hiện tại” — và chỉ khác ở lớp vỏ.
configdùng một chương trình theo dòng;menuconfigdùng một chương trình menu nền văn bản;xconfigdùng một chương trình đồ họa nền QT;gconfigdùng một chương trình đồ họa nền GTK+ 2.Bốn cái này đều để chọn tùy chọn, chỉ khác cái “mặt tiền”: một cái hỏi từng dòng, một cái hiện menu chữ, hai cái còn lại là cửa sổ đồ họa 2. Nhớ nhé: chọn cái nào cũng được, miễn bạn thấy dễ nhìn.
All four do the same job — “updates the current kernel configuration” — and differ only in their shell.
configuses a line-oriented program;menuconfiga text-based menu program;xconfiga QT-based graphical program;gconfiga GTK+-based graphical program 2.Bạn thấy nó ở đâu. Cả bốn vẫn còn, và đã có thêm người thứ năm:
nconfig, một trình cấu hình nền ncurses, hiện đượcmake helpliệt kê ngay cạnhmenuconfig9. Tài liệu hiện hành cũng nói rõ tên chương trình chạy bên dưới:qconfchoxconfig,mconfchomenuconfig,nconfchonconfig,gconfchogconfig11.Gặp ở đâu. Bốn cái đó vẫn còn dùng được, và nay có thêm
nconfig9. Nhớ nhé:menuconfiglà lựa chọn an toàn nhất cho người mới.Where you see it. All four survive, and a fifth has joined them:
nconfig, an ncurses-menu-based configurator now listed bymake helpright besidemenuconfig9. Current documentation also names the programs underneath:qconfforxconfig,mconfformenuconfig,nconffornconfig,gconfforgconfig11.“QT” của 2006, Qt của hôm nay
Sách viết “QT-based graphical program” 2; danh sách
make helphiện hành viết “a Qt based front-end” 9. Bộ công cụ vẫn là Qt, chỉ có cách viết hoa và số phiên bản thay đổi theo thời gian. Ý nghĩa thực dụng với bạn:xconfigcần các gói phát triển Qt,gconfigcần GTK+ — đó là lý do phổ biến nhất khiến hai đích này báo lỗi trên máy mới cài.Tìm kiếm — thứ sách không nói
Với gần hai nghìn tùy chọn, năng lực tìm quan trọng hơn năng lực duyệt. Tài liệu hiện hành mô tả:
menuconfigtìm bằng phím/và hỗ trợ biểu thức chính quy;nconfigtìm bằng/(không regex) và có SymSearch ở phím F8;xconfigtìm bằng Ctrl-F; còngconfigthì không có lệnh tìm kiếm 11. Riêng điểm cuối đủ để loạigconfigkhỏi danh sách của người mới. -
oldconfig / silentoldconfig
Họ kế thừa:
oldconfigvàsilentoldconfigGiữ lựa chọn cũ, chỉ hỏi cái mới The inheriting family:oldconfigandsilentoldconfigoldconfigcập nhật cấu hình bằng cách dùng chính tệp.confighiện có và chỉ hỏi bạn về những tùy chọn mới vừa được thêm vào nhân 2.silentoldconfiggiống hệt, nhưng “không in gì ra màn hình ngoại trừ khi có một câu hỏi cần được trả lời” 2. Đây là đích bạn sẽ gõ nhiều nhất trong đời nâng cấp nhân: nó là cây cầu đưa lựa chọn cũ sang phiên bản mới.oldconfiggiữ nguyên mọi thứ bạn đã chọn lần trước, chỉ hỏi thêm về những tùy chọn mới xuất hiện 2.silentoldconfigcũng vậy nhưng im lặng hơn 2. Nhớ nhé: nâng cấp nhân thì dùngoldconfig, đừng chọn lại từ đầu.oldconfigupdates the configuration by using the current.configfile and prompting only for new options that have been added to the kernel 2.silentoldconfigis “just like oldconfig, but prints nothing to the screen except when a question needs to be answered” 2. This is the target you will type most often across a life of kernel upgrades: it is the bridge that carries your old answers into a new version.Cảnh báo thời gian.
oldconfigcòn nguyên, nhưngsilentoldconfigđã biến mất khỏi giao diện người dùng. Năm 2018 nó được đổi tên thànhsyncconfigvì cái tên cũ là một nhầm lẫn lịch sử, bị hạ xuống thành chi tiết cài đặt nội bộ, và bản vá có ghi chú rằng tên cũ sẽ bị gỡ sau Linux 4.19 12. Danh sáchmake helphiện hành không còn nhắc tới nó 9.Đã đổi.
oldconfigvẫn dùng được. Cònsilentoldconfigthì không: từ năm 2018 nó đổi tên thànhsyncconfigvà trở thành việc nội bộ của máy 12. Nhớ nhé: thấy lệnh này trong hướng dẫn cũ thì bỏ qua, dùngoldconfig.Time-bound warning.
oldconfigis intact, butsilentoldconfighas disappeared from the user-facing interface. In 2018 it was renamedsyncconfigbecause the old name was a historical misnomer, demoted to an internal implementation detail, and the patch noted the old name would be removed after Linux 4.19 12. The currentmake helplisting no longer mentions it 9.Những người kế nhiệm
Chỗ trống mà
silentoldconfigđể lại đã được lấp bằng các đích rõ ràng hơn trongmake helphôm nay:olddefconfig— “giốngoldconfignhưng đặt các ký hiệu mới về giá trị mặc định mà không hỏi”;listnewconfig— chỉ liệt kê tùy chọn mới; vàhelpnewconfig— liệt kê kèm phần trợ giúp 9. Ba cái này là thứ mà kịch bản tự động ngày nay thực sự dùng.Hai đích chương 1 đã nhắc
localmodconfigvàlocalyesconfig— cập nhật cấu hình bằng cách tắt các module không được nạp, trừ những cái được giữ lại qua biếnLMC_KEEP— không có trong bảng 10-3 của sách 2, nhưng có trongmake helphiện hành 9 và được tài liệu nhân khuyến nghị cho người muốn cắt gọt nhanh 10. Đây là bổ sung rõ rệt nhất vào họ cấu hình kể từ 2006. -
generated configurations
Họ sinh tự động:
defconfig,randconfig, và ba đích “all” Để máy tự điền hết The generating family:defconfig,randconfigand the three “all” targetsNăm đích này không hỏi bạn câu nào.
defconfigsinh cấu hình mới với câu trả lời mặc định cho mọi tùy chọn, lấy từ tệparch/$ARCH/defconfig, trong đó$ARCHlà kiến trúc đang dựng 2.randconfigsinh cấu hình với câu trả lời ngẫu nhiên cho tất cả 2. Ba đích còn lại đi theo cực trị:allmodconfigbật module bất cứ khi nào có thể,allyesconfigđặt mọi tùy chọn thành “có”,allnoconfigđặt mọi tùy chọn thành “không” 2.Năm đích này máy tự trả lời hết, không hỏi bạn.
defconfig: lấy mặc định.randconfig: trả lời bừa.allyesconfig: bật tất.allnoconfig: tắt tất.allmodconfig: cái nào làm module được thì làm 2. Nhớ nhé: mấy cái “all” không dành để chạy máy thật, mà để thử.These five ask you nothing.
defconfiggenerates a new configuration with the default answer for all options, taken from thearch/$ARCH/defconfigfile, where$ARCHis the architecture being built for 2.randconfiggenerates one with random answers to all of the options 2. The remaining three go to the extremes:allmodconfigenables modules wherever possible,allyesconfigsets all options to yes,allnoconfigsets all options to no 2.Bạn thấy nó ở đâu. Đây là nhóm đích của máy kiểm thử, không phải của máy để bàn.
allyesconfigvàrandconfiglà công cụ chính của các hệ thống dựng tự động đi săn lỗi biên dịch. Cả năm vẫn còn trongmake helphôm nay, cùng với các bổ sung nhưalldefconfig,tinyconfig— “cấu hình cái nhân nhỏ nhất có thể” — vàsavedefconfig9.Gặp ở đâu. Các máy chủ kiểm thử tự động hay dùng chúng để tìm lỗi biên dịch. Ngày nay có thêm
tinyconfigđể làm nhân nhỏ nhất có thể 9. Nhớ nhé: nhóm này để thử nghiệm, không để dùng hằng ngày.Where you see it. This is the family of test machines, not desktops.
allyesconfigandrandconfigare staple tools of automated build systems hunting compile errors. All five survive in today'smake help, alongside additions such asalldefconfig,tinyconfig— “configure the tiniest possible kernel” — andsavedefconfig9.Đường dẫn defconfig đã đổi chỗ
Sách chỉ đích danh tệp
arch/$ARCH/defconfig2. Mô tả hiện hành trongmake helpthận trọng hơn và không nêu đường dẫn, chỉ nói “cấu hình mới với mặc định do kiến trúc cung cấp”, đồng thời liệt kê các defconfig riêng theo kiến trúc nhưi386_defconfigvàx86_64_defconfig9. Nếu bạn làm theo sách mà không thấy tệp ở đúng chỗ, đây là lý do.“Có / không / module” — nhắc lại từ chương 4
Ba đích “all” chỉ có nghĩa nếu bạn nhớ mô hình ba trạng thái của một tùy chọn:
ydựng thẳng vào nhân,mdựng thành module,nloại bỏ.allyesconfigđẩy tất cả vềy,allnoconfigvền,allmodconfigvềmkhi có thể 2. Hôm nay còn có cả nhóm đích chuyển đổi giữa ba trạng thái:yes2modconfig,mod2yesconfig,mod2noconfig9. -
KCONFIG_ALLCONFIG
Biến ghi đè: giữ một nền cấu hình “luôn đúng” Một tệp nhỏ ép giữ vài lựa chọn The override variable: keeping a known-good base
Đây là mẹo hay nhất của cả chương, và nó nằm ngoài bảng. Bốn đích
allyesconfig,allmodconfig,allnoconfigvàrandconfigđều tận dụng biến môi trườngKCONFIG_ALLCONFIG: nếu biến ấy trỏ tới một tệp, tệp đó sẽ được dùng làm danh sách các giá trị cấu hình mà bạn yêu cầu phải được đặt cụ thể — nói cách khác, tệp đó ghi đè hành vi bình thường của các đích 3. Ví dụ của ông: một tệp chứaCONFIG_SWAP=yvàCONFIG_DEBUG_FS=y, chạyKCONFIG_ALLCONFIG=../must_be_set make allnoconfig, và kết quả vẫn cóCONFIG_DEBUG_FS=y— thứ lẽ ra không bao giờ được bật bởiallnoconfig3.Bạn có thể viết một tệp nhỏ liệt kê vài lựa chọn bắt buộc phải giữ, rồi chỉ cho
makebiết tệp đó. Kể cả khi bạn bảo “tắt hết”, những dòng trong tệp ấy vẫn được bật 3. Nhớ nhé: đây là cách giữ lại vài thứ sống còn khi dọn sạch mọi thứ khác.This is the chapter's best trick, and it lives outside the table. The
allyesconfig,allmodconfig,allnoconfigandrandconfigtargets all take advantage of theKCONFIG_ALLCONFIGenvironment variable: if it points at a file, that file is used as a list of configuration values you require to be set to a specific value — in other words, the file overrides the normal behavior of the make targets 3. His worked example: a file holdingCONFIG_SWAP=yandCONFIG_DEBUG_FS=y, run asKCONFIG_ALLCONFIG=../must_be_set make allnoconfig, yields a.configthat still containsCONFIG_DEBUG_FS=y— a variable that “would not have normally been set to y otherwise” 3.Bạn thấy nó ở đâu. Nếu biến không được đặt, hệ dựng tự tìm trong thư mục dựng gốc các tệp tên
allmod.config,allno.config,allrandom.config,allyes.config; không thấy cái nào thì cuối cùng nó tìm tệpall.config3. Ông gợi ý dùng cơ chế này để “dựng sẵn một nền cấu hình tốt đã biết, luôn chạy được”, rồi dùng các đích khác để sinh ra những cấu hình thử nghiệm khác nhau 3.Gặp ở đâu. Không cần đặt biến cũng được: cứ để tệp tên
all.configở thư mục gốc là máy tự tìm thấy 3. Nhớ nhé: giữ một “nền an toàn”, rồi thử nghiệm thoải mái bên trên.Where you see it. If the variable is not set, the build system checks the top-level build directory for files named
allmod.config,allno.config,allrandom.config,allyes.config; failing those, it finally looks forall.config3. He suggests using this to “set up a known good base configuration that will always work”, then using the other targets to generate different testing configurations 3.Cơ chế còn nguyên, danh sách dài thêm
Tài liệu Kconfig hiện hành mô tả đúng cơ chế ấy, chỉ mở rộng: biến nay áp dụng cho cả
alldefconfig, và có thể đặt rỗng hoặc bằng1để hệ dựng tự tìm tệpall{yes,mod,no,def,random}.configtương ứng với đích bạn gọi, rồi mới quay vềall.config11. Tên gọi hiện hành cho tệp nhỏ này là miniconfig.Một hạn chế sách không nêu
Tài liệu hiện hành nói rõ điều mà sách để ngỏ: các ký hiệu bạn ép đặt sẵn “vẫn chịu kiểm tra phụ thuộc bình thường” 11. Nghĩa là viết
CONFIG_X=yvào tệp không bảo đảmCONFIG_Xsẽ bật — nếu điều kiện tiên quyết của nó không thỏa, nó vẫn bị tắt. “Yêu cầu” ở đây là yêu cầu có điều kiện.
Ba hiểu lầm thường gặpThree common misconceptions
“Danh sách trong sách là danh sách hiện hành”“The book's list is the current list”
Hiểu lầm: chép bảng trong sách ra là có bộ đích đầy đủ. Thực tế: sách viết năm 2006 cho dòng nhân 2.6. Danh sách make help hôm nay dài hơn nhiều, có cả những mục chưa từng tồn tại khi đó — đích Rust, đích kselftest, đích sbom 9. Nguồn đúng đắn duy nhất là make help chạy trong chính cây mã bạn đang dựng, điều mà chính ông đã dặn 1.
Myth: copy out the book's tables and you have the full target set. Fact: the book was written in 2006 for the 2.6 series. Today's make help listing is far longer, carrying entries that did not exist then — Rust targets, kselftest targets, an sbom target 9. The only authoritative source is make help run in the very tree you are building, which is what he told you to do in the first place 1.
“clean và mrproper chỉ khác nhau về mức độ”“clean and mrproper differ only in degree”
Hiểu lầm: cứ dùng cái mạnh hơn cho chắc. Thực tế: khác nhau về chất. clean giữ cấu hình nhân; mrproper xóa cả cấu hình 2. Với một tệp .config phải mất hàng giờ dò từng tùy chọn, đó là khác biệt giữa “dọn bàn” và “đốt bản thảo”.
Myth: use the stronger one to be safe. Fact: they differ in kind. clean keeps the kernel configuration; mrproper removes it 2. For a .config that took hours of option-by-option work, that is the difference between clearing the desk and burning the manuscript.
“allyesconfig cho cái nhân mạnh nhất”“allyesconfig gives the most capable kernel”
Hiểu lầm: bật hết thì được nhiều tính năng nhất. Thực tế: đây là đích của máy kiểm thử. Nó đặt mọi tùy chọn thành “có” 2, kể cả các tùy chọn gỡ lỗi và các driver xung đột nhau — kết quả là một cái nhân khổng lồ, chậm, và thường không khởi động nổi trên máy thật. Nó tồn tại để biên dịch mọi dòng mã, không phải để chạy.
Myth: turning everything on gives you the most features. Fact: this is a test-machine target. It sets all options to yes 2, including debugging options and mutually hostile drivers — the result is an enormous, slow kernel that often will not boot on real hardware. It exists to compile every line of code, not to run.
Cụm khái niệm 03Concept cluster 03
Dựng cái gì, dựng thế nào, rồi gói lại Biên dịch, rồi đóng gói What to build, how to build it, how to package it
Ba bảng liên tiếp — 10-4, 10-5 và 10-6 — tạo thành trung tâm thực dụng của chương. Bảng đầu là các đích “dựng chính cái nhân theo nhiều cách khác nhau” 4; bảng giữa là các biến môi trường mà ông nói có thể truyền cho make để thay đổi bản dựng, và “có thể chỉ định cho gần như mọi đích” 4; bảng cuối là các đích “đóng gói một cái nhân đã dựng thành một gói độc lập, cài được trên nhiều loại máy khác nhau” 5.
Ba bảng liền nhau: dựng cái gì, chỉnh cách dựng, rồi gói lại để đem đi cài 45. Nhớ nhé: đây là phần bạn sẽ dùng nhiều nhất trong thực tế.
Three consecutive tables — 10-4, 10-5 and 10-6 — form the practical heart of the chapter. The first holds the targets that “build the kernel itself in a variety of ways” 4; the middle one holds the environment variables he says you can pass to make to change the build, and which “can be specified for almost any target” 4; the last holds targets that “package up a built kernel into a standalone package that can be installed on a wide range of different machines” 5.
Đích mặc định. Khi bạn gõ make không kèm gì, hệ dựng chạy đích all — đích “dựng tất cả các đích khác nhau cần thiết để cái nhân này dùng được”, bao gồm cả module lẫn phần tĩnh của nhân 4. Mọi đích khác trong bảng 10-4 đều là cách dựng một phần.
Gõ make suông thì sao? Máy chạy đích all: dựng đủ mọi thứ cần thiết, cả phần lõi lẫn các module 4. Nhớ nhé: make suông là “làm hết”.
The default target. Type bare make and the build system runs all — the target that “builds all of the different targets needed for this kernel to be able to be used”, including both the modules and the static portion of the kernel 4. Every other target in Table 10-4 is a way of building only a part.
make → all
make vmlinux → chỉ phần tĩnh
make modules → chỉ module
make drivers/usb/ → cả thư mục
make drivers/x.ko → một module
make V=1 O=../build → chỉnh cách dựng
make → làm hết
make vmlinux → chỉ phần lõi
make modules → chỉ module
make V=1 → in rõ từng lệnh
make → all
make vmlinux → static part only
make modules → modules only
make drivers/usb/ → a whole directory
make drivers/x.ko → one module
make V=1 O=../build → change how it builds
-
build targets
Bốn đích lớn:
all,vmlinux,modules,modules_installBốn đích chính khi biên dịch The four big ones:all,vmlinux,modules,modules_installBảng 10-4 mở đầu bằng bốn đích bạn sẽ gõ suốt đời.
alldựng mọi thứ cần thiết 4.vmlinuxdựng chỉ phần tĩnh của nhân, không dựng module nạp được nào 4.modulesdựng tất cả module nạp được cho cấu hình này 4.modules_installcài mọi module vào vị trí chỉ định; nếu không chỉ định vị trí nào qua biến môi trường — sách viết làINSTALL_MODULE_PATH— chúng được cài vào thư mục gốc mặc định của máy 4.Bốn lệnh chính:
alllàm hết;vmlinuxchỉ làm phần lõi;moduleschỉ làm các module rời;modules_installchép các module ấy vào máy 4. Nhớ nhé: làm xong module thì phải “install” nó mới vào đúng chỗ.Table 10-4 opens with the four targets you will type for the rest of your life.
allbuilds everything needed 4.vmlinuxbuilds just the static portion of the kernel, not any loadable modules 4.modulesbuilds all the loadable modules for this configuration 4.modules_installinstalls them into the specified location; if none is given through the environment variable — the book prints it asINSTALL_MODULE_PATH— they go into the machine's default root directory 4.Cảnh báo tên biến. Tên đúng của biến ấy trong hệ dựng là
INSTALL_MOD_PATH, không phảiINSTALL_MODULE_PATH: tài liệu hiện hành mô tảINSTALL_MOD_PATHnhư tiền tố thêm vàoMODLIBkhi cần dời vị trí cài, vàmake helpghimodules_installlà “cài mọi module vàoINSTALL_MOD_PATH, mặc định/” 910. Nếu gõ theo sách, biến sẽ bị lờ đi trong im lặng.Chú ý. Sách ghi tên biến hơi khác so với tên thật ngày nay: phải là
INSTALL_MOD_PATH9. Nhớ nhé: gõ sai tên biến thì máy không báo lỗi, chỉ lặng lẽ bỏ qua.Variable-name warning. The build system's actual name for it is
INSTALL_MOD_PATH, notINSTALL_MODULE_PATH: current documentation describesINSTALL_MOD_PATHas a prefix prepended toMODLIBfor build-root relocation, andmake helprecordsmodules_installas “Install all modules to INSTALL_MOD_PATH (default: /)” 910. Typed as the book prints it, the variable is silently ignored.Vì sao
vmlinuxđứng riêngvmlinuxlà cái nhân trần, chưa nén, chưa gói thành ảnh khởi động. Phân biệt nó vớibzImageở mục kiến trúc phía dưới là chìa khóa để đọc hiểu quy trình:vmlinuxlà đầu ra của khâu liên kết,bzImagelà ảnh nén để bộ nạp khởi động đọc 47. Gõmake vmlinuxkhi bạn chỉ muốn biết mã có liên kết được không.Bổ sung từ sau 2006
make helphiện hành thêm vài đích cùng họ mà sách chưa có:modules_prepare— chuẩn bị cây mã để dựng module ngoài cây;vdso_install;headersvàheaders_installđể cài các tệp tiêu đề UAPI cho không gian người dùng 9. Nhómheaders*là thứ các bản phân phối dùng để đóng góilinux-libc-dev. -
partial builds & tags
Dựng một phần, và ba đích cho trình soạn thảo Dựng một mẩu, và giúp trình soạn thảo tìm mã Partial builds, and three targets for your editor
Bạn không phải lúc nào cũng dựng cả cây. Sách cho ba dạng đích “đường dẫn”:
dir/dựng mọi tệp trong thư mục đó và mọi thư mục con bên dưới;dir/file.[o|i|s]dựng chỉ tệp được chỉ định;dir/file.kodựng mọi tệp cần thiết rồi liên kết chúng lại thành module ấy 4. Kèm theo là ba đích phục vụ việc đọc mã:tagsvàTAGSdựng các tệp thẻ mà hầu hết trình soạn thảo thông dụng dùng được khi bạn đang sửa mã nguồn, còncscopedựng một ảnh cscope hữu ích cho việc tìm kiếm trong cây mã — và chỉ cho kiến trúc được chỉ định bởi tệp cấu hình, không phải toàn bộ tệp mã nguồn nhân 4.Không cần dựng cả cây: bạn có thể bảo máy dựng một thư mục, một tệp, hay đúng một module 4. Ngoài ra có ba đích tạo “bản đồ mã nguồn” cho trình soạn thảo nhảy tới định nghĩa hàm 4. Nhớ nhé: sửa một chỗ thì dựng một chỗ, nhanh hơn nhiều.
You do not always have to build the whole tree. The book gives three path-shaped targets:
dir/builds all of the files in that directory and in all subdirectories below it;dir/file.[o|i|s]builds only the specified file;dir/file.kobuilds all the needed files and links them together to form the specified module 4. Alongside sit three reading aids:tagsandTAGSbuild the tag files most common text editors can use while editing the source, andcscopebuilds a cscope image, useful in source tree searches, of the source tree for the architecture specified by the configuration file — not all of the kernel source files 4.Bạn thấy nó ở đâu. Cả sáu vẫn còn trong
make helphôm nay, và danh sách đã dài ra: có thêmdir/file.llcho tệp hợp ngữ LLVM,dir/file.lstcho tệp trộn mã nguồn với hợp ngữ, vàgtagstạo chỉ mục GNU GLOBAL 9.Gặp ở đâu. Các đích này vẫn dùng được, và nay còn nhiều hơn trước 9. Nhớ nhé:
make tagsmột lần là trình soạn thảo của bạn thông minh hẳn lên.Where you see it. All six survive in today's
make help, and the list has grown: there is nowdir/file.llfor LLVM assembly,dir/file.lstfor mixed source/assembly output, andgtagsfor a GNU GLOBAL index 9.Một lỗi in trong chính bảng
Bảng 10-4 kéo sang trang 120 và dòng đầu của phần tiếp là một bản sao: mô tả của
TAGSlặp lại nguyên văn mô tả củatagsở trang trước 4. Thực tế hai đích khác nhau ở định dạng tệp thẻ —tagscho họ vi,TAGScho họ Emacs — nhưng sách không nói ra. Đây là một chỗ trống, không phải một sai sót nghiêm trọng.Vì sao
cscopechỉ lấy một kiến trúcChi tiết “chỉ cho kiến trúc được chỉ định bởi tệp cấu hình” 4 là một quyết định thiết kế có chủ ý: cây mã chứa hàng chục kiến trúc, và một chỉ mục gộp tất cả sẽ đầy các định nghĩa trùng tên không bao giờ cùng được biên dịch. Tài liệu hiện hành cho phép mở rộng lại phạm vi ấy bằng biến
ALLSOURCE_ARCHS, và loại trừ thư mục bằngIGNORE_DIRS10. -
environment variables
Ba biến đổi cách dựng:
V,O,CBa nút chỉnh cách biên dịch Three variables that change the build:V,O,CBảng 10-5 nhỏ nhưng hữu dụng bậc nhất.
V=0bảo hệ dựng chạy yên lặng, chỉ hiện tệp đang được dựng chứ không hiện toàn bộ câu lệnh — và đây là mặc định;V=1bảo nó chạy chi tiết, hiện đầy đủ câu lệnh sinh ra từng tệp 4.O=dirđặt mọi tệp đầu ra, kể cả tệp cấu hình, vào thư mụcdir— điều này cho phép dựng nhân từ một hệ tệp chỉ-đọc và để đầu ra ở nơi khác 4.C=1kiểm tra mọi tệp C sắp được dựng bằng công cụ sparse, thứ phát hiện các lỗi lập trình thường gặp trong mã nguồn nhân;C=2ép kiểm tra mọi tệp C, kể cả tệp không cần dựng lại 4.Ba nút nhỏ mà rất tiện.
V=1: hiện đầy đủ câu lệnh máy đang chạy — cực kỳ hữu ích khi có lỗi.O=thư-mục: để mọi tệp kết quả sang chỗ khác, giữ cây mã sạch.C=1: nhờ công cụ sparse soi lỗi giúp 4. Nhớ nhé: dựng lỗi mà không hiểu vì sao thì thêmV=1.Table 10-5 is small and among the most useful in the book.
V=0tells the build system to run quietly, showing only the file currently being built rather than the entire command — and this is the default;V=1tells it to operate verbosely, showing the full command used to generate each file 4.O=dirplaces all output files, including the kernel configuration files, indir— which allows the kernel to be built from a read-only filesystem with the output placed elsewhere 4.C=1checks all C files about to be built with the sparse tool, which detects common programming errors in kernel source;C=2forces all C files to be checked, even ones that did not need to be built 4.Bạn thấy nó ở đâu. Cả ba còn nguyên ý nghĩa, và
Vđã có thêm mức:V=2nêu lý do một đích phải dựng lại, và hai mức có thể gộp thànhV=129. Danh sách hiện hành cũng bổ sungW=nđể bật các cảnh báo biên dịch bổ sung,M=cho module ngoài cây, vàLLVM=1để dựng bằng Clang/LLVM thay cho GCC 910.Gặp ở đâu. Ba biến này vẫn dùng được y như cũ, và nay có thêm
V=2,W=1, vàLLVM=19. Nhớ nhé: các biến viết trước tên đích cũng được, viết sau cũng được.Where you see it. All three keep their meaning, and
Vhas gained a level:V=2gives the reason a target is being rebuilt, and the two can be combined asV=129. The current listing also addsW=nfor extra build checks,M=for external modules, andLLVM=1to build with Clang/LLVM instead of GCC 910.Địa chỉ của sparse đã đổi
Sách chỉ cho bạn tải sparse qua git từ
git://git.kernel.org/pub/scm/devel/sparse/sparse.git, kèm ảnh chụp hằng đêm ởcodemonkey.org.uk, và bảo đọc tệpDocumentation/sparse.txttrong cây mã 4. Kho git vẫn còn; nhưng tài liệu đã dời — bản hiện hành nằm trong bộ tài liệu dev-tools củadocs.kernel.org, không còn là tệp.txtrời 13. Đây là một trong những đường dẫn “chết” rõ nhất của chương.O=— thói quen đáng tậpDựng ngoài cây với
O=đáng tập thành phản xạ ngay cả khi hệ tệp của bạn ghi được: nó giữ cây mã sạch tuyệt đối, cho phép dựng nhiều cấu hình song song từ cùng một cây, và khiếngit statustrở lại hữu dụng. Tài liệu hiện hành mô tả biến tương đương ở dạng môi trường làKBUILD_OUTPUT10. -
packaging targets
Bảy đích đóng gói: RPM, Debian, và ba loại tarball Gói cái nhân lại để đem đi cài Seven packaging targets: RPM, Debian and three tarballs
Bảng 10-6 liệt kê bảy đích.
rpmdựng nhân trước rồi đóng gói thành một gói RPM cài được.rpm-pkgdựng một gói RPM mã nguồn chứa nhân nền.binrpm-pkgdựng một gói RPM chứa nhân đã biên dịch và các module.deb-pkgdựng một gói Debian chứa nhân đã biên dịch và module.tar-pkg,targz-pkg,tarbz2-pkgdựng tarball — lần lượt là không nén, nén gzip, nén bzip2 — chứa nhân đã biên dịch và các module 5.Bảy cách gói cái nhân vừa dựng xong: hai kiểu cho hệ dùng RPM, một kiểu cho Debian, và ba kiểu tarball nén khác nhau 5. Nhớ nhé: gói lại thì đem sang máy khác cài được, không phải dựng lại từ đầu.
Table 10-6 lists seven.
rpmbuilds the kernel first and then packages it as an installable RPM.rpm-pkgbuilds a source RPM containing the base kernel.binrpm-pkgbuilds an RPM containing a compiled kernel and modules.deb-pkgbuilds a Debian package containing the compiled kernel and modules.tar-pkg,targz-pkgandtarbz2-pkgbuild tarballs — uncompressed, gzip-compressed and bzip2-compressed respectively — containing the compiled kernel and modules 5.Cảnh báo thời gian. Họ này đã nở ra nhiều nhất kể từ 2006 và đổi cả ngữ nghĩa. Trong
make helphiện hành,rpm-pkgdựng cả gói mã nguồn lẫn gói nhị phân — không còn chỉ là gói mã nguồn như sách viết; gói mã nguồn riêng nay làsrcrpm-pkg9. Đíchrpmtrần không còn được liệt kê. Phía Debian tách thànhdeb-pkg,srcdeb-pkg,bindeb-pkg; và danh sách có thêmsnap-pkg,pacman-pkg,dir-pkg,tarxz-pkg,tarzst-pkg9.Đã đổi nhiều. Nhóm này thay đổi nhiều nhất. Ví dụ
rpm-pkgnay làm cả gói mã nguồn lẫn gói cài, khác với mô tả trong sách 9. Nhớ nhé: với nhóm này, hãy tinmake helpchứ đừng tin sách.Time-bound warning. This family has grown the most since 2006 and has changed meaning. In the current
make help,rpm-pkgbuilds both source and binary RPM packages — no longer the source-only package the book describes; the source-only package is nowsrcrpm-pkg9. The barerpmtarget is no longer listed. The Debian side has split intodeb-pkg,srcdeb-pkgandbindeb-pkg; and the list has gainedsnap-pkg,pacman-pkg,dir-pkg,tarxz-pkgandtarzst-pkg9.Vì sao nên đóng gói thay vì
make installMột gói do
deb-pkghaybinrpm-pkgsinh ra đi qua trình quản lý gói của bản phân phối, nên nó có thể được gỡ sạch sẽ, được ghi vào cơ sở dữ liệu gói, và được đem sang máy khác. Cài thẳng bằnginstallthì không có tính chất nào trong ba tính chất ấy. Với người quản trị nhiều máy giống nhau, đây là khác biệt quyết định.Một biến hữu ích sách chưa có
Tài liệu hiện hành mô tả
KBUILD_DEBARCH, cho phép ghi đè phỏng đoán kiến trúc màdeb-pkgthường suy ra từUTS_MACHINEvà, trên một số kiến trúc, từ chính cấu hình nhân — với lưu ý rằng giá trị bạn đưa vào được giả định là một kiến trúc Debian hợp lệ chứ không được kiểm tra 10. Đây là biến bạn cần khi dựng chéo kiến trúc.
Cụm khái niệm 04Concept cluster 04
Trang cuối: tài liệu, kiến trúc, và phân tích Tài liệu, ảnh khởi động, và soi lỗi The last page: documentation, architecture, analysis
Ba bảng cuối cùng gọn đến mức gần như là phụ lục — nhưng chính chúng cho thấy rõ nhất khoảng cách giữa 2006 và hôm nay. Bảng 10-7 là các đích dựng tài liệu nội bộ của nhân “ở nhiều định dạng khác nhau” 6. Bảng 10-8 là các đích riêng của kiến trúc Intel 32-bit, và ông nói rõ mỗi kiến trúc nhân đều có một tập đích riêng của nó 7. Bảng 10-9 là các đích “tốt cho việc tìm mã có vấn đề trong nhân” 8.
Ba bảng cuối rất ngắn: một bảng để in tài liệu, một bảng riêng cho máy Intel 32-bit, một bảng để soi mã có vấn đề 678. Nhớ nhé: đây là ba nhóm đã thay đổi nhiều nhất từ 2006 tới nay.
The last three tables are so compact they read almost as an appendix — yet they show the gap between 2006 and today most clearly. Table 10-7 holds the targets that build the internal kernel documentation “in a variety of different formats” 6. Table 10-8 holds the targets specific to the 32-bit Intel architecture, and he states plainly that each kernel architecture has a set of targets unique to it 7. Table 10-9 holds targets that are “good for trying to find problem code in the kernel” 8.
Đích theo kiến trúc. Không phải đích nào cũng tồn tại ở mọi nơi. Tập đích của arch/x86 khác tập đích của arch/arm64, và make help hiện hành in ra riêng một mục “Architecture-specific targets” đúng cho kiến trúc bạn đang dựng 9 — đúng như nguyên tắc ông nêu năm 2006 7.
Đích riêng của từng loại máy. Mỗi kiến trúc phần cứng có bộ đích riêng 7, và make help chỉ in ra bộ đúng với máy bạn 9. Nhớ nhé: đích của máy này chưa chắc có ở máy kia.
Architecture-specific target. Not every target exists everywhere. The target set of arch/x86 differs from that of arch/arm64, and today's make help prints a separate “Architecture-specific targets” section for whichever architecture you are building 9 — exactly the principle he stated in 2006 7.
2006: xmldocs psdocs pdfdocs
htmldocs mandocs
nay : htmldocs pdfdocs epubdocs
latexdocs texinfodocs
mandocs xmldocs …
mất : psdocs
2006: xmldocs psdocs pdfdocs
htmldocs mandocs
nay : htmldocs pdfdocs epubdocs …
mất : psdocs
2006: xmldocs psdocs pdfdocs
htmldocs mandocs
now : htmldocs pdfdocs epubdocs
latexdocs texinfodocs
mandocs xmldocs …
gone: psdocs
-
documentation targets
Tài liệu: năm đích của DocBook, và thứ đã thay thế chúng In tài liệu nhân ra nhiều định dạng Documentation: five DocBook targets, and what replaced them
Bảng 10-7 có năm dòng:
xmldocsdựng tài liệu nhân thành tệp XML DocBook;psdocsthành tệp PostScript;pdfdocsthành tệp PDF;htmldocsthành tệp HTML;mandocsthành một bộ trang man, sau đó có thể cài bằng đíchinstallmandocs6. Chữ “DocBook” ở dòng đầu chính là dấu niên đại của cả bảng.Năm lệnh để in tài liệu bên trong nhân ra năm định dạng: XML, PostScript, PDF, HTML, và trang man 6. Nhớ nhé: tài liệu nhân nằm sẵn trong mã nguồn, chỉ cần một lệnh để đọc được.
Table 10-7 has five rows:
xmldocsbuilds the kernel documentation as XML DocBook files;psdocsas PostScript;pdfdocsas PDF;htmldocsas HTML;mandocsas a set of manpages, which can then be installed with theinstallmandocstarget 6. The word “DocBook” in that first row is the date stamp on the whole table.Cảnh báo thời gian. Bộ công cụ DocBook đã bị gỡ khỏi nhân trong loạt vá “Get rid of Docbook” của Mauro Carvalho Chehab, hợp nhất vào Linux 4.14; từ đó tài liệu được viết bằng reStructuredText và dựng bằng Sphinx 14. Tài liệu hiện hành hướng dẫn gõ
make htmldocshoặcmake pdfdocs, kết quả nằm ởDocumentation/output15. Ba trong năm đích của sách còn tên:htmldocs,pdfdocs,mandocs,xmldocsvẫn được liệt kê — nhưng nay sinh ra từ ReST, không từ DocBook;psdocsthì đã biến mất 914.Đã đổi. Bộ công cụ cũ (DocBook) đã bị bỏ từ nhân 4.14; nay tài liệu dùng Sphinx 14. Lệnh thông dụng nhất bây giờ là
make htmldocs15. Nhớ nhé: tên lệnh giống, máy bên dưới đã khác hẳn.Time-bound warning. The DocBook toolchain was removed from the kernel by Mauro Carvalho Chehab's “Get rid of Docbook” series, merged for Linux 4.14; since then documentation is written in reStructuredText and built with Sphinx 14. Current documentation tells you to run
make htmldocsormake pdfdocs, with output inDocumentation/output15. Four of the book's five names survive —htmldocs,pdfdocs,mandocsandxmldocsare still listed — but they now come from ReST, not DocBook;psdocsis gone 914.Những đích tài liệu mới
Mục tài liệu trong
make helphiện hành dài gấp đôi bảng 10-7: ngoài các tên cũ còn cóepubdocs,latexdocs,texinfodocs,infodocs,linkcheckdocskiểm tra liên kết ngoài bị hỏng,refcheckdocskiểm tra tham chiếu tới tệp không tồn tại, vàcleandocs9. Có cả biếnSPHINXDIRSđể chỉ dựng tài liệu của một thư mục con — hữu ích khi bạn chỉ quan tâm một hệ con.installmandocs— dấu vết còn lạiĐích
installmandocsmà sách nhắc tới 6 là một phần của cỗ máy DocBook cũ:mandocssinh trang man,installmandocscài chúng vàoINSTALL_MAN_PATH. Nó không còn nằm trong mục tài liệu củamake helphiện hành 9. Đây là ví dụ điển hình của một đích “2006-only”: tên vẫn có thể xuất hiện trong hướng dẫn cũ trên mạng, nhưng gõ vào cây mã hôm nay thì không còn đúng. -
architecture-specific targets
Kiến trúc Intel 32-bit:
bzImage,install, và ba ảnh khởi động Tạo ảnh khởi động cho máy Intel 32-bit Intel:bzImage,installand three boot imagesBảng 10-8 có năm dòng.
bzImagetạo một ảnh nhân đã nén và đặt vào tệparch/i386/boot/bzImage; ông ghi rõ đây là đích mặc định cho bản dựng nhân i386 7.installcài ảnh nhân bằng chương trình/sbin/installkernelriêng của từng bản phân phối — và ông cảnh báo rằng nó không cài các module nhân; việc đó phải làm bằng đíchmodules_install7.bzdisktạo ảnh đĩa mềm khởi động và ghi thẳng ra thiết bị/dev/fd0.fdimagecũng tạo ảnh đĩa mềm nhưng đặt vào tệp, và cần gói mtools có sẵn trên máy.isoimagetạo ảnh khởi động CD-ROM và cần gói syslinux 7.Năm lệnh dành riêng cho máy Intel 32-bit: tạo ảnh nhân nén, cài nhân vào máy, và ba cách làm ảnh khởi động (đĩa mềm ghi thẳng, đĩa mềm thành tệp, và ảnh CD) 7. Nhớ nhé:
make installkhông cài module — phải chạymodules_installnữa 7.Table 10-8 has five rows.
bzImagecreates a compressed kernel image and places it inarch/i386/boot/bzImage; he notes this is the default target for the i386 kernel build 7.installinstalls the kernel image using the distribution-specific/sbin/installkernelprogram — and he warns that this does not install the kernel modules; that must be done withmodules_install7.bzdiskcreates a boot floppy image and writes it to the/dev/fd0device.fdimagecreates one but places it in a file, and requires the mtools package.isoimagecreates a CD-ROM boot image and requires the syslinux package 7.Cảnh báo thời gian. Đường dẫn
arch/i386/không còn tồn tại: hai câyarch/i386vàarch/x86_64đã được Thomas Gleixner và Ingo Molnar hợp nhất thànharch/x86trong Linux 2.6.24, chỉ hơn một năm sau khi sách in 16.make helphiện hành in đúng dòng ấy là “bzImage— Compressed kernel image (arch/x86/boot/bzImage)”, vẫn kèm dấu sao đánh dấu đích mặc định 9.Đã đổi. Thư mục
arch/i386không còn; từ nhân 2.6.24 nó đã gộp vàoarch/x8616. Nhớ nhé: đường dẫn trong sách phải đổii386thànhx86.Time-bound warning. The path
arch/i386/no longer exists: thearch/i386andarch/x86_64trees were merged intoarch/x86by Thomas Gleixner and Ingo Molnar in Linux 2.6.24, barely a year after the book went to press 16. Today'smake helpprints that row as “bzImage— Compressed kernel image (arch/x86/boot/bzImage)”, still marked with the asterisk that denotes the default target 9.Một lỗi in đáng nhớ
Dòng
isoimagecủa bảng 10-8 in đường dẫn làarch/i396/boot/image.iso7 — “i396” là lỗi đánh máy của “i386”, và sách để nguyên như vậy. Nêu ra không phải để bắt lỗi mà để nhắc một nguyên tắc đọc sách tham chiếu: khi một đường dẫn không tồn tại, hãy nghi ngờ cả bản in lẫn thời gian, rồi đối chiếu vớimake help9.Họ ảnh khởi động đã nở ra
Mục kiến trúc x86 trong
make helphiện hành giữfdimagevàisoimage, thêmfdimage144,fdimage288vàhdimage— ảnh đĩa cứng BIOS/EFI;bzdiskvẫn được nhắc tới trong dòng ghi chú về các tham sốFDARGS=vàFDINITRD=9. Đĩa mềm đã chết trong đời thực, nhưng các đích của nó thì chưa. -
analysis targets
Phân tích:
checkstackcòn,namespacecheckmất Hai công cụ soi mã — một cái đã biến mất Analysis:checkstacksurvives,namespacecheckdoes notBảng cuối cùng chỉ có hai dòng, nhưng ông viết hẳn một đoạn dẫn cho chúng: nên tạo một danh sách không gian ngăn xếp khi viết mã mới, để xác định rằng thay đổi của bạn không chiếm quá nhiều ngăn xếp nhân; còn
namespacecheckthì hữu ích để xác định xem thay đổi của bạn có thể thêm ký hiệu vào không gian tên toàn cục của nhân một cách an toàn hay không 8.checkstacksinh danh sách các hàm dùng nhiều không gian ngăn xếp nhất;namespacechecksinh danh sách mọi ký hiệu nhân và không gian tên của chúng — và ông nói thẳng “đây sẽ là một danh sách lớn” 8.Hai công cụ cuối cùng để soi mã: một cái tìm hàm chiếm nhiều bộ nhớ ngăn xếp nhất, một cái liệt kê toàn bộ tên hàm và biến toàn cục 8. Nhớ nhé: đây là công cụ của người viết mã nhân, không phải của người chỉ dựng nhân.
The last table has only two rows, but he writes a full paragraph to introduce them: it is a good idea to create a stack space list when writing new code, to determine that your changes are not taking up too much kernel stack space; and
namespacecheckis useful for determining whether your changes can safely add symbols to the kernel's global namespace 8.checkstackgenerates a list of the functions that use the most kernel stack space;namespacecheckgenerates a list of all kernel symbols and their namespaces — and he says plainly, “This will be a large list” 8.Cảnh báo thời gian.
checkstackvẫn đứng đầu mục “Static analysers” củamake help, nay kèm ngưỡng cấu hình đượcMINSTACKSIZE, mặc định 100 9.namespacecheckthì không còn trong danh sách ấy 9; kịch bảnscripts/namespace.plđứng sau nó bị đề nghị gỡ năm 2020 vì sinh quá nhiều báo động giả — vớiallmodconfignó báo 11.122 tên ký hiệu không có tham chiếu ngoài — và vì phần kiểm tra hữu ích nhất của nó đã trùng với việc trình liên kết làm sẵn 17.Đã đổi.
checkstackvẫn còn 9. Cònnamespacecheckthì không còn nữa: nó báo sai quá nhiều nên bị loại 17. Nhớ nhé: một công cụ báo 11 nghìn cảnh báo thì chẳng ai đọc.Time-bound warning.
checkstackstill heads the “Static analysers” section ofmake help, now with a configurableMINSTACKSIZEthreshold defaulting to 100 9.namespacecheckis no longer in that list 9; thescripts/namespace.plbehind it was proposed for removal in 2020 because it produced too many false positives — underallmodconfigit reported 11,122 unique symbol names with no external reference — and because its most useful check duplicated what the linker already does 17.Mục phân tích đã đông hơn nhiều
Nơi sách có hai đích,
make helphôm nay có tám: ngoàicheckstackcònversioncheck,includecheck,headerdep,coccicheck— kiểm tra bằng Coccinelle,kconfig-sym-check,clang-analyzervàclang-tidy9. Phân tích tĩnh đã đi từ một tiện ích bên lề thành một phần chuẩn mực của quy trình phát triển nhân.Đừng lẫn với “namespace” của module
Nhân hiện đại có một khái niệm namespace hoàn toàn khác —
MODULE_IMPORT_NS, tệpmodules.nsdeps, và đíchmake nsdepsđể “sinh các phụ thuộc không gian tên ký hiệu còn thiếu” 9. Nó thuộc về modpost và không liên quan gì tớinamespacecheckcủa năm 2006 17. Trùng chữ, khác việc.
Tự kiểmSelf-check
Tự kiểm trước khi sang chương 11 Tự hỏi mình vài câu Self-check before Chapter 11
Chương tham chiếu không đòi bạn thuộc lòng. Nó đòi bạn biết nhóm nào chứa cái mình cần, và biết khi nào phải ngừng tin vào sách mà quay ra hỏi make help.
Không cần thuộc hết. Chỉ cần biết tìm ở nhóm nào, và biết khi nào nên hỏi lại máy. Nhớ nhé: nhớ cách tra quan trọng hơn nhớ nội dung.
A reference chapter does not ask you to memorise. It asks you to know which family holds what you need, and to know when to stop trusting the book and ask make help instead.
- Bạn nói được khác biệt giữa
clean,mrpropervàdistcleantheo đúng thứ tự mức độ — và biết cái nào làm mất.config?Đáp án:
cleangiữ cấu hình;mrproperxóa cấu hình;distcleanlàm tất cả những gìmrproperlàm cộng thêm tệp sao lưu của trình soạn thảo và tệp thừa do vá 2. - Trong mười một đích cấu hình, bạn xếp được cái nào hỏi bạn, cái nào kế thừa
.configcũ, và cái nào tự sinh?Bốn giao diện tương tác, hai đích kế thừa, năm đích tự sinh 2 — và bạn biết rằng
silentoldconfignay đã thànhsyncconfig, một chi tiết nội bộ 12. - Bạn giải thích được
KCONFIG_ALLCONFIGdùng để làm gì, và vì sao một dòngCONFIG_X=ytrong tệp đó vẫn có thể không có tác dụng?Vì các ký hiệu ép đặt “vẫn chịu kiểm tra phụ thuộc bình thường” 11: nếu điều kiện tiên quyết không thỏa thì tùy chọn vẫn tắt.
- Sau khi chạy
make installtrên máy Intel, còn đúng một lệnh nữa phải chạy — bạn nói được là lệnh nào và vì sao?make modules_install: ông cảnh báo rõ rằnginstallkhông cài module 7. Đây là cái bẫy phổ biến nhất của cả chương. - Bạn kể được ít nhất ba chỗ trong chương này mà thông tin đã lỗi thời, và nói được cách kiểm chứng?
Ví dụ: DocBook đã bị thay bằng Sphinx từ 4.14 14;
arch/i386đã gộp vàoarch/x86từ 2.6.24 16;rpm-pkgnay dựng cả gói mã nguồn lẫn gói nhị phân 9. Cách kiểm chứng luôn giống nhau: chạymake helptrong chính cây mã của bạn 1.
- Lệnh dọn nào làm mất tệp cấu hình của bạn?
- Muốn giữ lựa chọn cũ khi lên nhân mới thì gõ đích nào?
- Sau
make installcòn phải gõ thêm lệnh gì nữa? - Khi không chắc một đích còn tồn tại không, bạn hỏi ai?
- Nhớ nhé: trả lời được cả bốn câu thì sang chương 11 được rồi.
- Can you rank
clean,mrproperanddistcleanby depth — and say which one loses your.config? - Among the eleven configuration targets, can you sort which ones ask you, which inherit an existing
.config, and which generate one?Four interactive front-ends, two inheriting targets, five generating ones 2 — and you know
silentoldconfighas since becomesyncconfig, an internal detail 12. - Can you explain what
KCONFIG_ALLCONFIGis for, and why aCONFIG_X=yline in that file may still have no effect? - After
make installon an Intel machine, exactly one more command is required — which one, and why?make modules_install: he warns explicitly thatinstalldoes not install the kernel modules 7. - Can you name at least three places where this chapter is now out of date, and say how you would verify each?
Đọng lạiWhat remains
Một chương tham chiếu năm trang dạy bạn hai điều cùng lúc: danh mục các đích
make, và thói quen không tin vào bất kỳ danh mục in nào. Lời dặn hữu ích nhất của cả chương không phải một cái tên đích, mà là câu ông viết ngay trang đầu — hãy chạymake helptrong chính thư mục dựng của bạn.Chương này cho bạn một danh sách các lệnh, và dạy bạn đừng tin danh sách in sẵn. Câu quan trọng nhất là câu đầu tiên: gõ
make helpđể máy tự kể. Nhớ nhé: sách chỉ đường, máy nói sự thật.A five-page reference chapter teaches two things at once: the catalogue of
maketargets, and the habit of not trusting any printed catalogue. The most useful instruction in the chapter is not the name of a target but the line on its first page — runmake helpinside your own build directory.