Phần I · Dựng nhân · Chương 6Part I · Building the Kernel · Chapter 6
Nâng cấp nhân mà không đánh mất cấu hình Lên bản mới mà vẫn giữ nguyên những gì đã chỉnh Upgrading a kernel without losing your configuration
Kroah-Hartman mở chương bằng đúng tình huống ai cũng gặp: bạn đã có một nhân tự dựng chạy hoàn hảo, trừ đúng một chuyện nhỏ mà bạn biết đã được sửa trong bản mới nhất; hoặc một lỗ hổng bảo mật được phát hiện và một bản stable mới vừa ra 1. Dù theo đường nào, bạn cũng đứng trước cùng một nỗi sợ: nâng cấp rồi thì mất hết công sức đã bỏ vào cái cấu hình hoàn hảo kia 1. Cả chương này tồn tại để nói rằng nỗi sợ đó không có cơ sở.
Bạn đã tự làm một cái nhân chạy rất ổn. Rồi có bản mới sửa đúng cái lỗi bạn đang gặp, hoặc có bản vá lỗ hổng bảo mật 1. Bạn muốn lên bản mới nhưng sợ mất hết những gì đã chỉnh 1. Nhớ nhé: chương này cho thấy bạn không mất gì cả.
Kroah-Hartman opens the chapter with the situation everyone eventually meets: you have a custom-built kernel working just wonderfully except for one little thing you know is fixed in the latest release; or a security problem is found and a new stable kernel release is made public 1. Either way you face the same fear: upgrading means losing all the time and effort that went into that perfect kernel configuration 1. This whole chapter exists to show the fear is unfounded.
Chương này khép lại Phần I của sách. Chương 3 dạy lấy mã nguồn, chương 4 dạy cấu hình và dựng, chương 5 dạy cài và khởi động. Chương 6 là chương đầu tiên giả định bạn đã có một nhân của riêng mình — nó không dạy làm lại từ đầu, mà dạy cách di chuyển một cấu hình đã trưởng thành sang một cây mã mới. Đó là kỹ năng bạn sẽ dùng nhiều lần hơn tất cả các chương trước cộng lại.
Luận điểm chương 6. Nâng cấp không phải là dựng lại từ đầu. Chỉ cần năm bước đơn giản để nâng một nhân từ một bản đã dựng trước đó 1, và ba bước đầu — lấy mã mới, áp thay đổi, cấu hình lại dựa trên cấu hình cũ — là toàn bộ nội dung mới của chương; hai bước cuối (dựng và cài) đã được mô tả từ trước 1. Việc đầu tiên, trước mọi lệnh khác, là sao lưu tệp .config 1.
Ý chính. Lên bản mới chỉ cần năm bước, và ba bước đầu là phần mới phải học 1. Hai bước cuối bạn đã biết rồi 1. Nhớ nhé: việc đầu tiên phải làm là chép tệp .config ra chỗ an toàn 1.
Chapter 6 thesis. Upgrading is not rebuilding from scratch. Only five simple steps are needed to upgrade a kernel from a previously built one 1, and the first three — get the new source, apply the changes, reconfigure from the previous configuration — are the whole of what is new here; the last two (build and install) work exactly as described before 1. The very first action, before any command, is to back up the .config file 1.
.configUpgrade, keep your .configpatch -p1 ngay trong thư mục mã nguồn.
Giải nén, rồi chạy một lệnh duy nhất.
Uncompress, then run patch -p1 from inside the source directory.
make oldconfig giữ mọi lựa chọn cũ, chỉ hỏi về tùy chọn mới.
Máy giữ lựa chọn cũ, chỉ hỏi cái nào mới.
make oldconfig keeps every old answer and only asks about new options.
Cụm khái niệm 01 · Trước khi bắt đầuConcept cluster 01 · Before you begin
Sao lưu .config, rồi đếm năm bước
Chép tệp cấu hình ra, rồi đi năm bước
Back up .config, then count five steps
Câu lệnh đầu tiên của chương không phải lệnh nâng cấp mà là lệnh phòng thân. Ông viết thẳng: hãy sao lưu tệp .config trong thư mục mã nguồn, vì bạn đã bỏ thời gian và công sức tạo ra nó và nó cần được giữ lại phòng khi có gì trục trặc trong lúc nâng cấp 1. Ví dụ trong sách là hai lệnh: vào thư mục ~/linux/linux-2.6.17.11 rồi cp .config ../good_config 1.
Lệnh đầu tiên trong chương không phải để nâng cấp, mà để phòng khi hỏng. Ông bảo: chép tệp .config ra ngoài trước đã 1. Trong sách là hai lệnh ngắn, chép nó thành một tệp tên good_config 1. Nhớ nhé: chép ra một bản trước khi động vào bất cứ thứ gì.
The chapter's first command is not an upgrade command but an insurance policy. He says it plainly: back up the .config file in the kernel source directory, because you have spent time and effort creating it and it should be saved in case something goes wrong during the upgrade 1. The book's example is two lines: change into ~/linux/linux-2.6.17.11, then cp .config ../good_config 1.
Để ý chi tiết nhỏ mà có ý: bản sao được đặt ở thư mục cha, ngoài cây mã nguồn. Mọi bước sau đó — áp bản vá, đổi tên thư mục, thậm chí xóa cây mã đi làm lại — đều không chạm tới nó. Nếu đặt bản sao bên trong cây mã, bạn đang cất dù trong chính chiếc máy bay có thể rơi.
Tệp .config. Tệp văn bản trong thư mục gốc cây mã nguồn, ghi lại câu trả lời cho từng tùy chọn cấu hình nhân. Đây là toàn bộ “bản sắc” nhân của bạn; mọi thứ khác đều dựng lại được từ mã nguồn, riêng nó thì không 1.
.config là gì. Là tệp ghi lại mọi lựa chọn bạn đã đặt cho nhân. Mất nó là mất hết công chỉnh 1. Nhớ nhé: đó là tệp quý nhất trong thư mục.
The .config file. A text file at the root of the source tree recording your answer to every kernel configuration option. It is the whole identity of your kernel; everything else can be rebuilt from source, but not this 1.
1 · lấy mã nguồn mới
2 · áp thay đổi lên cây cũ
3 · cấu hình lại từ cấu hình cũ
4 · dựng nhân mới (như chương 4)
5 · cài nhân mới (như chương 5)
1 · tải phần mới
2 · vá vào cây cũ
3 · giữ lại lựa chọn cũ
4 · dựng
5 · cài
1 · get the new source code
2 · apply the changes to the old tree
3 · reconfigure from the previous config
4 · build the new kernel (as in ch. 4)
5 · install it (as in ch. 5)
-
five simple steps
Năm bước — và chỉ ba bước là mới Năm bước, ba bước phải học Five steps — only three of them are new
Ông liệt kê đúng năm bước: lấy mã nguồn mới; áp các thay đổi lên cây mã cũ để đưa nó lên mức mới; cấu hình lại nhân dựa trên cấu hình trước đó; dựng nhân mới; cài nhân mới 1. Rồi ông cắt gọn phạm vi: hai bước cuối hoạt động y như đã mô tả trước đó, nên chương này chỉ bàn ba bước đầu 1.
Năm bước: tải mã mới, vá vào cây cũ, giữ lại cấu hình cũ, dựng, rồi cài 1. Hai bước cuối giống hệt các chương trước nên chương này chỉ nói ba bước đầu 1. Nhớ nhé: bạn chỉ phải học thêm ba việc thôi.
He lists exactly five: get the new source code; apply the changes to the old source tree to bring it up to the newer level; reconfigure the kernel based on the previous configuration; build the new kernel; install it 1. Then he trims the scope: the last two work the same as described before, so the chapter discusses only the first three 1.
Bạn thấy nó ở đâu. Cấu trúc này còn nguyên trong hướng dẫn dựng nhân hiện hành của kernel.org: mục “vòng sau” của tài liệu cũng chỉ gồm lấy mã mới, chỉnh cấu hình cũ cho khớp, rồi dựng và cài như lần đầu 9.
Gặp ở đâu. Hướng dẫn mới của kernel.org cũng chia y hệt: lấy mã mới, chỉnh cấu hình cũ, rồi dựng và cài 9. Nhớ nhé: hai mươi năm sau, nhịp làm việc vẫn thế.
Where you see it. The shape survives in today's kernel.org build guide: its “another round later” section is likewise just get the new code, adjust the existing configuration, then build and install as before 9.
Ví dụ xuyên suốt chương
Sách giả định bạn đã dựng thành công bản 2.6.17.9 và muốn lên bản 2.6.17.11 1. Con số cụ thể thuộc về năm 2006, nhưng hình dạng bài toán — nhảy hai bậc trong cùng một dòng stable — thì không đổi theo thời gian.
Vì sao bước 3 mới là mấu chốt
Bước 1 và 2 chỉ là chuyển mã. Bước 3 mới là chỗ cấu hình của bạn có sống sót hay không. Toàn bộ lời hứa “không mất công sức” của chương nằm ở một lệnh duy nhất ở bước đó, và ta sẽ gặp nó ở cụm khái niệm 04.
-
back up first
Sao lưu — quy tắc rẻ nhất trong cả cuốn sách Chép dự phòng — việc rẻ mà đáng Back up — the cheapest rule in the book
Lý lẽ của ông không phải lý lẽ kỹ thuật mà là lý lẽ kinh tế: tệp ấy tốn thời gian và công sức để tạo ra, nên phải được giữ lại 1. Một lệnh
cpmất chưa tới một giây; dựng lại cấu hình từ trí nhớ có thể mất cả buổi tối.Lý do rất đời thường: tệp đó tốn công làm ra nên phải giữ 1. Chép nó mất một giây, làm lại từ đầu mất cả buổi. Nhớ nhé: việc rẻ mà cứu được nhiều thì cứ làm.
His argument is economic rather than technical: the file took time and effort to create, so it should be saved 1. One
cpcosts under a second; reconstructing a configuration from memory can cost an evening.Bạn thấy nó ở đâu. Chính cây mã nhân cũng giữ thói quen này: khi bạn chạy lại một lệnh cấu hình, tệp cũ được lưu thành
.config.old, và tài liệu Kconfig hiện hành dùng nó để so sánh bằngscripts/diffconfig .config.old .config12.Gặp ở đâu. Bản thân nhân cũng tự giữ bản cũ tên
.config.oldđể bạn đem ra so 12. Nhớ nhé: đến máy cũng biết chép dự phòng.Where you see it. The kernel tree keeps the same habit: re-running a configuration target saves the previous file as
.config.old, and current Kconfig documentation uses it for comparison viascripts/diffconfig .config.old .config12.
Cụm khái niệm 02 · “Download the New Source”Concept cluster 02 · “Download the New Source”
Tải bản vá đúng, không tải lại cả cây mã Tải đúng miếng vá, đừng tải lại cả bộ Download the right patch, not the whole tree
Ông đặt vấn đề từ phía người dùng: các nhà phát triển nhân hiểu rằng người dùng không muốn tải toàn bộ mã nguồn cho mỗi lần cập nhật, vì đó là lãng phí băng thông và thời gian; nên họ cung cấp một bản vá có thể nâng một bản nhân cũ lên bản mới 2. Trên kernel.org, nhấp vào chữ F sẽ tải toàn bộ mã nguồn; nhấp vào chính tên bản phát hành thì tải về tệp vá 2.
Tải lại cả bộ mã cho mỗi lần cập nhật thì phí mạng và phí thời gian, nên người ta làm sẵn “miếng vá” để nâng bản cũ lên bản mới 2. Trên trang kernel.org, bấm vào chữ F là tải cả bộ; bấm vào tên bản phát hành là tải miếng vá 2. Nhớ nhé: bấm nhầm chỗ là tải nhầm thứ.
He frames it from the user's side: the kernel developers realise users do not wish to download the entire source for every update — that would waste bandwidth and time — so they offer a patch that upgrades an older release to a newer one 2. On kernel.org, the F link downloads the full source; clicking the name of the release downloads a patch file instead 2.
Chú thích của ông giải thích luôn cái tên: chương trình gọi là patch vì nó nhận tệp ấy và áp lên cây mã gốc để tạo ra cây mã mới; tệp vá chứa một biểu diễn của những thay đổi cần thiết để dựng lại các tệp mới từ các tệp cũ, và nó đọc được bằng mắt — gồm danh sách các dòng bị bỏ đi, các dòng được thêm vào, kèm một ít ngữ cảnh chỉ ra chỗ cần sửa 2. Chi tiết “đọc được” không phải chuyện vặt: nó có nghĩa bạn luôn có thể mở tệp vá ra xem mình sắp áp cái gì lên máy mình.
Bản vá (patch). Một tệp văn bản mô tả chênh lệch giữa hai phiên bản mã nguồn. Điểm mấu chốt trong sách: một tệp vá nhân chỉ nâng mã nguồn từ đúng một bản phát hành cụ thể lên đúng một bản khác 2 — nó không phải cái chìa vạn năng.
Bản vá là gì. Là tệp ghi phần khác nhau giữa hai phiên bản. Quan trọng: mỗi miếng vá chỉ hợp với đúng một cặp phiên bản 2. Nhớ nhé: vá của bản này không dán được lên bản kia.
Patch. A text file describing the difference between two versions of the source. The key point in the book: a kernel patch file upgrades the source from only one specific release to one other specific release 2 — it is not a universal key.
vá stable : 2.6.17.10 → chỉ áp lên 2.6.17
vá base : 2.6.18 → chỉ áp lên 2.6.17
vá incremental: 2.6.17.9 → 2.6.17.10
→ ưu tiên dùng vá incremental
vá stable → dán lên bản gốc 2.6.17
vá base → dán lên bản gốc trước đó
vá incremental → nhảy từng bậc một
→ nên chọn loại nhảy từng bậc
stable patch : 2.6.17.10 → applies to 2.6.17 only
base patch : 2.6.18 → applies to 2.6.17 only
incremental : 2.6.17.9 → 2.6.17.10
→ prefer the incremental patches
-
which patch applies
Ba loại vá, ba luật áp dụng khác nhau Ba loại vá, ba cách dùng Three kinds of patch, three rules
Sách nêu ba luật rành mạch. Vá stable áp lên bản nền: bản vá 2.6.17.10 chỉ áp được lên bản 2.6.17, không áp được lên 2.6.17.9 hay bất kỳ bản nào khác 2. Vá bản nền chỉ áp lên bản nền trước đó: vá 2.6.18 chỉ áp lên 2.6.17, không áp lên bản 2.6.17.y cuối cùng 2. Vá incremental nâng từ một bản cụ thể lên bản kế tiếp, để nhà phát triển không phải hạ cấp rồi nâng lại chỉ để nhảy từ bản stable này sang bản stable sau 2.
Có ba loại. Vá stable dán lên bản gốc, ví dụ vá 2.6.17.10 chỉ dán được lên 2.6.17 2. Vá bản nền dán lên bản nền trước, ví dụ vá 2.6.18 dán lên 2.6.17 2. Vá incremental nhảy từ bản này sang đúng bản kế tiếp 2. Nhớ nhé: nhìn tên tệp là biết nó dán được lên đâu.
The book gives three crisp rules. Stable kernel patches apply to the base version: the 2.6.17.10 patch applies only to 2.6.17, not to 2.6.17.9 or any other release 2. Base kernel patches apply only to the previous base version: the 2.6.18 patch applies only to 2.6.17, not to the last 2.6.17.y release 2. Incremental patches upgrade from one specific release to the next, so developers need not downgrade and then upgrade just to move from the latest stable release to the following one 2.
Bạn thấy nó ở đâu. Tài liệu nhân hiện hành phát biểu đúng luật ấy bằng phiên bản của thời nay: vá stable thường xếp chồng lên bản 5.x chứ không lên bản stable trước đó, còn vá incremental thì “được áp lên bản stable trước (5.x.y-1)” 7.
Gặp ở đâu. Tài liệu nhân ngày nay vẫn nói y như vậy, chỉ đổi số phiên bản 7. Nhớ nhé: luật cũ vẫn đúng.
Where you see it. Current kernel documentation states the same rules in modern numbers: normal stable patches stack on the base 5.x release rather than the prior stable one, while incremental patches are “applied on top of previous stable kernel (5.x.y-1)” 7.
Vì sao vá stable lại áp lên bản nền
Vì đội stable sinh ra bản vá bằng cách so bản nền với bản stable mới nhất. Hệ quả thực tế: nếu đang ở 5.7.2 và muốn lên 5.7.3 bằng vá stable thường, bạn phải gỡ vá 5.7.2 ra trước rồi mới áp 5.7.3 7. Vá incremental tồn tại chính là để bạn khỏi làm việc đó.
Khuyến nghị của sách
Ông viết rõ: bất cứ khi nào có thể, nên dùng vá incremental để cuộc sống dễ hơn 2. Đây là một trong số ít chỗ trong sách ông đưa ra khuyến nghị dứt khoát thay vì chỉ liệt kê lựa chọn.
-
finding the patch
Tìm tệp vá: thư mục
incrở tầng dưới Miếng vá nằm ở thư mục nào Finding the patch: theincrsubdirectoryMuốn đi từ 2.6.17.9 lên 2.6.17.11, cần hai tệp vá: một từ .9 lên .10, một từ .10 lên .11 3. Vá stable và vá bản nền nằm cùng cấu trúc thư mục với các cây mã chính; riêng vá incremental nằm thấp hơn một tầng, trong thư mục con
incr— cụ thể là/pub/linux/kernel/v2.6/incr3. Sách dùng chương trìnhlftpđể tải, và nói rõ dùng trình FTP nào hay trình duyệt nào cũng được; điều quan trọng chỉ là biết tệp nằm ở đâu 3.Đi từ bản .9 lên bản .11 thì cần hai miếng vá chứ không phải một 3. Miếng vá loại incremental nằm trong thư mục con tên
incr3. Sách tải bằnglftp, nhưng dùng trình duyệt cũng được 3. Nhớ nhé: biết chỗ để tìm mới là điều cần học.Going from 2.6.17.9 to 2.6.17.11 needs two patches: one from .9 to .10, another from .10 to .11 3. Stable and base patches live in the same directory structure as the main source trees, while incremental ones sit one level lower in the
incrsubdirectory — here/pub/linux/kernel/v2.6/incr3. The book downloads them withlftp, noting that any FTP program or a web browser will do; the important thing is knowing where the files are 3.Bạn thấy nó ở đâu. Thư mục
incr/vẫn còn và vẫn được cập nhật cho dòng 6.x hôm nay: kho kernel.org liệt kê các tệp dạngpatch-6.19.9-10.xzngay trong/pub/linux/kernel/v6.x/incr/8. Chỉ định dạng nén đổi từ.bz2sang.xz.Gặp ở đâu. Thư mục
incr/hôm nay vẫn còn, chỉ khác là tệp nén kiểu mới 8. Nhớ nhé: chỗ để vá không đổi, chỉ đuôi tệp đổi.Where you see it. The
incr/directory still exists and is still current for today's 6.x series: kernel.org lists files such aspatch-6.19.9-10.xzunder/pub/linux/kernel/v6.x/incr/8. Only the compression changed, from.bz2to.xz.Trong phiên tải của sách, hai tệp chỉ nặng 2.872 và 7.901 byte 3 — nhỏ hơn cây mã đầy đủ nhiều bậc độ lớn.
In the book's download session the two files weigh just 2,872 and 7,901 bytes 3 — orders of magnitude smaller than the full tree.
-
jumping many versions
Nhảy nhiều bậc: đi lùi rồi đi tới Nhảy xa thì lùi một bước rồi tiến Jumping many versions: go backward, then forward
Chú thích của ông giải một bài toán thực tế: nếu cần nâng qua hơn hai phiên bản, cách tiết kiệm bước là đi lùi rồi đi tới — trong ví dụ này là lùi từ 2.6.17.9 về 2.6.17 rồi tiến thẳng từ 2.6.17 lên 2.6.17.11 3. Hai lệnh thay vì nhiều lệnh, vì đã về tới bản nền thì một tệp vá stable duy nhất đưa bạn tới đích.
Nếu phải nhảy qua nhiều bản, cách gọn là lùi về bản gốc rồi tiến một phát lên bản đích 3. Nhớ nhé: đôi khi lùi một bước lại nhanh hơn.
His footnote solves a practical problem: if you need to upgrade more than two versions, the step-saving route is to go backward and then upgrade forward — here, back from 2.6.17.9 to 2.6.17, then forward from 2.6.17 to 2.6.17.11 3. Two commands instead of many, because once you are at the base release a single stable patch carries you to the target.
Bạn thấy nó ở đâu. Đi lùi chính là áp ngược một bản vá; tài liệu nhân ghi cú pháp là
patch -R -p1 < ../patch-x.y.z7.Gặp ở đâu. Lùi lại nghĩa là gỡ miếng vá ra, thêm chữ
-Rvào lệnh 7. Nhớ nhé: vá dán được thì cũng gỡ được.Where you see it. Going backward is simply reversing a patch; the kernel documentation gives the syntax as
patch -R -p1 < ../patch-x.y.z7.
Cụm khái niệm 03 · “Applying the Patch”Concept cluster 03 · “Applying the Patch”
Áp bản vá — và kiểm chứng bằng Makefile
Dán miếng vá, rồi mở ra xem đúng chưa
Applying the patch — and verifying via the Makefile
Trình tự trong sách gọn tới mức có thể học thuộc: giải nén hai tệp vá bằng bzip2 -dv, vào thư mục mã nguồn, rồi chạy patch -p1 < ../patch-2.6.17.9-10 4. Chương trình in ra từng tệp nó đang vá — Makefile, block/elevator.c, fs/udf/super.c và tiếp tục 4. Sau đó lặp lại đúng như vậy với tệp vá thứ hai để lên mức 2.6.17.11 4.
Làm theo thứ tự: giải nén hai tệp vá, vào thư mục mã nguồn, chạy lệnh patch -p1 với tệp vá thứ nhất 4. Máy sẽ in ra tên từng tệp nó đang sửa 4. Rồi làm y hệt với tệp vá thứ hai 4. Nhớ nhé: vá từng bậc một, đúng thứ tự.
The book's sequence is short enough to memorise: uncompress both patches with bzip2 -dv, change into the source directory, then run patch -p1 < ../patch-2.6.17.9-10 4. The program prints each file it patches — Makefile, block/elevator.c, fs/udf/super.c and on down the list 4. Then you repeat the identical move with the second patch to reach 2.6.17.11 4.
Cái hay của mục này không nằm ở lệnh mà ở vòng kiểm chứng ông cài vào giữa hai lần vá. Sau mỗi lần áp, ông yêu cầu hai việc: xác nhận đầu ra của patch không có lỗi hay cảnh báo nào, rồi mở Makefile ra đọc 4. Đây là thói quen của người từng bị vá hỏng: không tin vào việc lệnh chạy xong mà không kêu, chỉ tin vào bằng chứng.
patch -p1. Tùy chọn -p1 bảo chương trình bỏ đi thành phần đầu tiên trong đường dẫn ghi trong tệp vá. Tệp vá nhân được sinh ra ở thư mục trên cây mã nguồn, nên tên tệp trong đó mang sẵn một cấp thư mục không khớp với máy bạn; -p1 gỡ đúng cấp ấy ra 7.
-p1 nghĩa là gì. Trong tệp vá, mỗi đường dẫn có thừa một cấp thư mục ở đầu. -p1 bảo máy cắt bỏ cấp đó đi cho khớp với máy bạn 7. Nhớ nhé: quên -p1 là máy sẽ hỏi “vá tệp nào?”.
patch -p1. The -p1 flag tells the program to strip the first element of the path from filenames in the patch file. Kernel patches are generated relative to the directory above the source tree, so their filenames carry a leading directory component that will not match your setup; -p1 removes exactly that 7.
$ bzip2 -dv patch-2.6.17.9-10.bz2
$ cd linux-2.6.17.9
$ patch -p1 < ../patch-2.6.17.9-10
$ head -n 5 Makefile # EXTRAVERSION = .10
$ cd .. && mv linux-2.6.17.9 linux-2.6.17.11
giải nén miếng vá
vào thư mục mã nguồn
chạy lệnh vá
mở Makefile xem số phiên bản
đổi tên thư mục cho khớp
$ bzip2 -dv patch-2.6.17.9-10.bz2
$ cd linux-2.6.17.9
$ patch -p1 < ../patch-2.6.17.9-10
$ head -n 5 Makefile # EXTRAVERSION = .10
$ cd .. && mv linux-2.6.17.9 linux-2.6.17.11
-
verify, don't assume
Kiểm chứng: đọc năm dòng đầu của
MakefileMởMakefilexem số phiên bản Verify: read the first five lines of theMakefileÔng đưa ra một phép thử mà ai cũng làm được: chạy
head -n 5 Makefilevà đọc bốn biến ở đầu tệp. Sau lần vá thứ nhất, kết quả phải làVERSION = 2,PATCHLEVEL = 6,SUBLEVEL = 17,EXTRAVERSION = .104. Sau lần vá thứ hai, dòng cuối phải đổi thànhEXTRAVERSION = .114. Một dòng thay đổi là bằng chứng rằng cây mã đã thực sự ở mức bạn nghĩ.Cách kiểm rất dễ: mở năm dòng đầu của tệp
Makefile. Vá xong lần một thì thấyEXTRAVERSION = .10, vá xong lần hai thì thấy.114. Nhớ nhé: nhìn thấy con số đúng mới tin là vá xong.He offers a test anyone can run:
head -n 5 Makefileand read the four variables at the top. After the first patch they must readVERSION = 2,PATCHLEVEL = 6,SUBLEVEL = 17,EXTRAVERSION = .104. After the second, the last line must becomeEXTRAVERSION = .114. One changed line is the evidence that the tree really is at the level you think.Bạn thấy nó ở đâu. Dòng thứ năm trong ví dụ của sách là
NAME=Crazed Snow-Weasel4 — cái tên đùa mà mỗi bản nhân tự đặt cho mình. Nó vô hại, nhưng nhắc bạn rằngMakefilechính là nơi cây mã tự khai báo danh tính.Gặp ở đâu. Dòng thứ năm là một cái tên vui, trong sách là “Crazed Snow-Weasel” 4. Nhớ nhé: mỗi bản nhân đều có biệt danh riêng.
Where you see it. The fifth line in the book's output is
NAME=Crazed Snow-Weasel4 — the joke name each kernel release gives itself. Harmless, but a reminder that theMakefileis where the tree declares its own identity.Khi vá không sạch
Sách chỉ yêu cầu “không có lỗi hay cảnh báo” 4. Tài liệu nhân nói rõ hơn hai dấu hiệu cần biết: đoạn vá phải dịch chỗ mới áp được thì bị báo là áp với fuzz, còn đoạn không áp được sẽ sinh ra tệp
.rej(và.orig); với mã nguồn kernel.org nguyên bản, áp đúng thứ tự thì không thứ nào được phép xuất hiện 7.Lỗi phổ biến nhất
Nếu
patchhỏi lại “File to patch:”, nguyên nhân gần như luôn là quên mất-p1hoặc đang đứng sai thư mục — một số ít bản vá thì lại cần-p07. Gặp câu hỏi đó, hãy dừng lại thay vì gõ bừa một tên tệp. -
rename the directory
Đổi tên thư mục — vệ sinh chống nhầm lẫn Đổi tên thư mục cho khỏi nhầm Rename the directory — hygiene against confusion
Sau khi vá xong, thư mục vẫn mang tên
linux-2.6.17.9trong khi bên trong đã là 2.6.17.11. Ông khuyên quay ra ngoài và đổi tên thư mục theo đúng số phiên bản để tránh nhầm lẫn về sau:mv linux-2.6.17.9 linux-2.6.17.114.Vá xong rồi mà tên thư mục vẫn là số cũ thì dễ nhầm. Ông bảo đổi tên nó theo số mới 4. Nhớ nhé: tên phải nói đúng sự thật bên trong.
After patching, the directory is still named
linux-2.6.17.9while its contents are 2.6.17.11. He advises stepping back out and renaming it to the kernel version number to avoid confusion at a later time:mv linux-2.6.17.9 linux-2.6.17.114.Bạn thấy nó ở đâu. Đây là cùng một nguyên tắc với việc chương 5 đặt tên tệp ảnh nhân theo phiên bản: trong một thư mục có nhiều cây mã, cái tên là thứ duy nhất bạn đọc trước khi gõ
cd.Gặp ở đâu. Cũng giống việc đặt tên tệp nhân theo phiên bản khi cài. Nhớ nhé: đặt tên rõ ràng là cách tự cứu mình sau này.
Where you see it. It is the same principle as naming kernel images by version in Chapter 5: in a directory holding several trees, the name is the only thing you read before typing
cd.
Cụm khái niệm 04 · “Reconfigure the Kernel”Concept cluster 04 · “Reconfigure the Kernel”
Cấu hình lại: make oldconfig giữ lại mọi câu trả lời cũ
Giữ lại lựa chọn cũ, chỉ hỏi cái mới
Reconfiguring: make oldconfig keeps every old answer
Đây là chỗ lời hứa của chương được thực hiện. Trước đây bạn dùng make menuconfig, gconfig hay xconfig để đổi từng tùy chọn; nhưng khi đã có một cấu hình chạy được, việc duy nhất còn cần làm là cập nhật nó với những tùy chọn mới xuất hiện kể từ bản trước — và đó là việc của make oldconfig hoặc make silentoldconfig 5.
Đây là phần quan trọng nhất. Trước kia bạn chỉnh từng mục bằng giao diện menu. Nhưng khi đã có cấu hình chạy tốt rồi, chỉ cần cập nhật thêm mục nào mới thôi — dùng lệnh make oldconfig 5. Nhớ nhé: không phải chỉnh lại từ đầu.
This is where the chapter's promise is kept. Previously you used make menuconfig, gconfig or xconfig to change individual options; but once you have a working configuration, the only thing necessary is to update it with whatever options have been added since the last release — and that is the job of make oldconfig or make silentoldconfig 5.
Cách phát biểu của ông đáng chú ý ở chỗ nó đảo vai: cấu hình không còn là thứ bạn tạo ra mỗi lần nâng cấp, mà là một tài sản bạn mang theo. Công cụ chỉ có nhiệm vụ hòa giải tài sản ấy với một cây mã mới hơn. Đó cũng là lý do tệp .config đáng được sao lưu ở đầu chương: nó là thứ duy nhất trong quy trình không tái tạo được.
oldconfig và silentoldconfig. make oldconfig lấy cấu hình hiện có trong .config và cập nhật nó theo bản nhân mới: nó in ra mọi câu hỏi cấu hình và tự trả lời những câu đã có sẵn trong tệp; gặp tùy chọn mới thì dừng lại và hỏi người dùng 5. make silentoldconfig làm y hệt nhưng không in gì ra màn hình, trừ khi cần hỏi về một tùy chọn mới 5.
Hai lệnh này làm gì. make oldconfig đọc lựa chọn cũ của bạn, tự trả lời những câu đã biết, chỉ dừng lại hỏi khi gặp mục mới 5. make silentoldconfig cũng vậy nhưng im lặng, chỉ lên tiếng khi cần hỏi 5. Nhớ nhé: máy nhớ hộ bạn, bạn chỉ trả lời phần mới.
oldconfig and silentoldconfig. make oldconfig takes the current configuration in .config and updates it for the new release: it prints every configuration question and answers those already handled by the file; when it meets a new option it stops and asks you 5. make silentoldconfig works exactly the same way but prints nothing unless it needs to ask about a new option 5.
.config cũ + mã nguồn mới
↓ make oldconfig
câu đã trả lời → giữ nguyên
câu mới (NEW) → hỏi bạn
= .config mới, không mất gì
cấu hình cũ + mã mới
→ giữ cái cũ
→ hỏi cái mới
= cấu hình mới, vẫn là của bạn
old .config + new source
↓ make oldconfig
answered options → kept
new options (NEW) → asked
= a new .config, nothing lost
-
the quiet case
Trường hợp im lặng — nâng cấp trong dòng stable Khi máy chẳng hỏi gì cả The quiet case — upgrading within a stable series
Ông nêu một quy luật thực nghiệm: thường thì khi nâng cấp giữa các bản stable khác nhau, không có tùy chọn cấu hình mới nào được thêm vào, vì đó vốn là một dòng nhân ổn định 5. Khi ấy không có câu hỏi nào cần trả lời và chương trình chạy trót lọt mà không cần bạn can thiệp 5. Ví dụ đi từ 2.6.17.9 lên 2.6.17.11 chỉ in ra vài dòng, trong đó có dòng cho biết nó đang dùng các giá trị mặc định tìm thấy trong
.config5.Trong cùng một dòng ổn định, thường chẳng có mục cấu hình mới nào cả 5. Nên lệnh chạy một cái là xong, không hỏi gì 5. Nhớ nhé: im lặng ở đây là dấu hiệu tốt.
He states an empirical rule: usually, when upgrading between different stable releases, no new configuration options are added, since this is supposed to be a stable kernel series 5. In that case there are no new questions and the program completes without any need for user intervention 5. Going from 2.6.17.9 to 2.6.17.11 prints only a few lines, among them a note that it is using the defaults found in
.config5.Bạn thấy nó ở đâu. Ranh giới ấy vẫn đúng hôm nay: kernel.org phân biệt rõ mainline — nơi mọi tính năng mới xuất hiện — với stable và longterm, nơi chỉ các bản sửa lỗi được đưa ngược về 10. Tùy chọn cấu hình mới sinh ra ở nhánh đầu, không phải hai nhánh sau.
Gặp ở đâu. Ngày nay vẫn thế: dòng thử nghiệm mới có tính năng mới, còn dòng ổn định chỉ nhận bản sửa lỗi 10. Nhớ nhé: dòng ổn định thì ít bất ngờ.
Where you see it. The boundary still holds: kernel.org distinguishes mainline — “where all new features are introduced” — from stable and longterm, which receive backported fixes only 10. New configuration options are born in the former, not the latter.
-
(NEW)
Dấu
(NEW)— chỗ duy nhất chương trình dừng lại Chữ(NEW)là lúc máy hỏi bạn(NEW)— the one place the program stopsVí dụ thứ hai của ông cho thấy điều gì xảy ra khi một tùy chọn mới xuất hiện. Giữa một loạt câu hỏi trong mục Kernel hacking được tự trả lời, dòng
Mutex debugging, deadlock detection (DEBUG_MUTEXES) [N/y/?] (NEW)hiện ra và chương trình dừng lại chờ bạn chọn 5. Bấmythì nó đi tiếp qua hết phần còn lại 5. Toàn bộ sự can thiệp của con người trong một lần nâng cấp gói gọn ở đó.Khi có mục cấu hình mới, máy sẽ dừng lại và thêm chữ
(NEW)vào cuối dòng 5. Bạn chọn xong là nó chạy tiếp 5. Nhớ nhé: thấy chữ(NEW)là chỗ duy nhất bạn cần nghĩ.His second example shows what happens when a new option appears. Amid a run of Kernel hacking questions being answered automatically, the line
Mutex debugging, deadlock detection (DEBUG_MUTEXES) [N/y/?] (NEW)appears and the program stops for your choice 5. Pressyand it continues through the rest 5. The entire human contribution to an upgrade fits in that one prompt.Bạn thấy nó ở đâu. Ngày nay có cách xem trước danh sách ấy mà không phải trả lời từng câu: tài liệu Kconfig khuyên chép cấu hình cũ vào
.configrồi chạymake listnewconfig, chương trình sẽ liệt kê mọi ký hiệu mới, mỗi dòng một cái 12.Gặp ở đâu. Bây giờ có lệnh
make listnewconfigliệt kê sẵn các mục mới để bạn xem trước 12. Nhớ nhé: xem trước rồi hãy quyết.Where you see it. Today you can preview that list instead of answering question by question: Kconfig documentation suggests copying the old config over
.configand runningmake listnewconfig, after which “the config program will list any new symbols, one per line” 12.Cảnh báo về tên lệnh — tình trạng 2026
make silentoldconfigtrong sách không còn là lệnh dành cho người dùng nữa. Năm 2018 nó được đổi tên thànhsyncconfigvì đã trở thành “chi tiết cài đặt nội bộ”; bản vá giữ lại một bí danh in ra cảnh báo — “thứ bạn muốn có lẽ làoldconfig” — và báo rằngsilentoldconfigsẽ bị gỡ sau Linux 4.19 11.make oldconfigthì vẫn còn nguyên vẹn 12.Một cảnh báo sòng phẳng
Tài liệu Kconfig hiện hành nói thẳng điều sách không nói: dùng một tệp
.configtừng chạy tốt rồi chạymake oldconfig“không nhất thiết tạo ra một nhân chạy được” cho bạn 12. Nâng cấp trong cùng dòng stable thì rủi ro rất thấp; nhảy qua nhiều bản nền thì nên đọc kỹ các tùy chọn mới thay vì bấm qua.
Ba hiểu lầm thường gặpThree common misconceptions
“Nâng cấp thì phải cấu hình lại từ đầu”“Upgrading means reconfiguring from scratch”
Hiểu lầm: mã mới thì cấu hình cũ vứt đi. Thực tế: ông viết cả chương để bác bỏ điều đó — mục tiêu là cập nhật nhân từ bản cũ mà vẫn giữ toàn bộ tùy chọn cấu hình của bản trước 1, và với các lệnh oldconfig bạn không cần dùng tới giao diện đồ họa hay giao diện văn bản cho bất kỳ lần cập nhật nào 5.
Myth: new code means the old configuration is thrown away. Fact: the whole chapter exists to deny it — the goal is to update a kernel from an older version while still retaining all the configuration options from the previous one 1, and with the oldconfig targets you do not need the graphical or text-oriented configuration programs for any new update 5.
“Bản vá nào cũng dán được lên cây mã của tôi”“Any patch will apply to my tree”
Hiểu lầm: tải bản vá mới nhất rồi áp là xong. Thực tế: mỗi tệp vá chỉ nâng từ đúng một bản lên đúng một bản; vá 2.6.17.10 không áp được lên 2.6.17.9 2. Áp sai thì patch sẽ sinh tệp .rej thay vì im lặng làm hỏng 7.
Myth: grab the newest patch and apply it. Fact: each patch file moves you from one specific release to one other; the 2.6.17.10 patch will not apply to 2.6.17.9 2. Applied to the wrong base, patch produces .rej files rather than quietly corrupting the tree 7.
“ketchup là công cụ nên dùng hôm nay”“ketchup is the tool to use today”
Hiểu lầm: sách khuyên dùng ketchup nên cứ cài nó. Thực tế: lời khuyên ấy thuộc về năm 2006 6. Trang phát hành gốc dừng ở bản 0.9.8 ngày 01-05-2006 13, gói Debian bị gỡ khỏi testing cuối 2019 và khỏi unstable giữa 2022 13. Câu trả lời hiện nay là git 79.
Myth: the book recommends ketchup, so install it. Fact: that recommendation belongs to 2006 6. The original release page stops at version 0.9.8, dated 2006-05-01 13, and the Debian package was dropped from testing in late 2019 and from unstable in mid-2022 13. Today's answer is git 79.
Cụm khái niệm 05 · “Can't This Be Automated?”Concept cluster 05 · “Can't This Be Automated?”
Có tự động hóa được không? Câu trả lời 2006 và câu trả lời hôm nay Máy làm hộ được không? Can't this be automated? The 2006 answer and today's
Mục cuối chương chỉ dài một đoạn. Ông nhận xét rằng toàn bộ quy trình — tìm đúng tệp vá, giải nén, rồi áp — trông rất sẵn sàng để tự động hóa; và vì các nhà phát triển nhân vốn thuộc loại thích tự động hóa việc lặp lại, chương trình ketchup đã ra đời để làm tất cả những việc đó, với hướng dẫn chi tiết ở Phụ lục A 6.
Phần cuối chương chỉ có một đoạn ngắn. Ông bảo: mấy bước này lặp đi lặp lại, máy làm hộ được, và đã có chương trình tên ketchup làm việc đó 6. Nhớ nhé: đó là câu trả lời của năm 2006.
The chapter's last section runs to a single paragraph. He observes that the whole process — downloading the proper patch file, uncompressing it, then applying it — seems ripe for automating; and since kernel developers are the type who like to automate repetitive tasks, the ketchup program was created to handle all of it, with the details in Appendix A 6.
Đây là một trong những đoạn lỗi thời nhất của cuốn sách, và đáng đọc chính vì thế. Nó cho thấy năm 2006 vấn đề “theo kịp cây mã nhân” vẫn còn được giải bằng một kịch bản gói quanh wget và patch. Chỉ ít năm sau, chính hạ tầng mà bản thân cuốn sách đã giới thiệu ở Phụ lục A — git, công cụ Linus Torvalds viết cho nhân và là công cụ nhân được phát triển bằng 14 — nuốt trọn bài toán ấy. Cuốn sách đứng đúng ở bản lề của quá trình chuyển đổi đó.
ketchup (bối cảnh lịch sử). Theo Phụ lục A, đây là công cụ dùng để cập nhật hoặc chuyển qua lại giữa các phiên bản cây mã nhân: tìm bản mới nhất, tải và giải nén, vá cây hiện có lên bất kỳ phiên bản nào khác, xử lý các nhánh phát triển và ổn định, tải các tệp vá còn thiếu, và kiểm tra chữ ký GPG của những gì đã tải 6.
ketchup là gì. Là chương trình tự tìm, tự tải, tự vá để đưa cây mã của bạn sang phiên bản bất kỳ, và tự kiểm tra chữ ký của tệp tải về 6. Nhớ nhé: nghe hay, nhưng nó là chuyện của ngày xưa.
ketchup (historical context). Per Appendix A, it was a tool for updating or switching between versions of the kernel source tree: find the latest version, download and uncompress it, patch an existing tree to any other version, handle the development and stable branches, fetch whatever patches are missing, and verify the GPG signatures of what it downloaded 6.
2006 · ketchup -r 2.6 → tự vá lên bản stable mới
hôm nay · git fetch origin
· git checkout --force --detach
· make olddefconfig
ngày xưa: một lệnh ketchup
bây giờ: ba lệnh git + make
→ cùng một kết quả
2006 · ketchup -r 2.6 → auto-patch to newest stable
today · git fetch origin
· git checkout --force --detach
· make olddefconfig
-
ketchup, in its time
ketchup— đúng vào thời của nó, và chỉ thời đó Công cụ của ngày xưaketchup— right for its time, and only thenPhụ lục A trình diễn hai lệnh:
ketchup -r 2.6.16.24tải và mở cây mã ở đúng phiên bản đó rồi đổi tên thư mục theo phiên bản; sau đóketchup -r 2.6tự xác định bản stable mới nhất là 2.6.17.11 và tải các tệp vá cần thiết để tới đó 6. Ông khuyến nghị mạnh việc dùng nó khi tải bất kỳ cây mã nhân nào, vì nó lo hết phần tìm tệp vá đúng chỗ và áp đúng định dạng sau khi kiểm chữ ký 6.Phụ lục A cho thấy chỉ cần hai lệnh: một lệnh tải đúng phiên bản, một lệnh nhảy lên bản mới nhất 6. Ông khen nó tiện vì tự tìm, tự kiểm chữ ký, tự vá 6. Nhớ nhé: đọc để hiểu lịch sử, đừng đi cài nó.
Appendix A demonstrates two commands:
ketchup -r 2.6.16.24downloads and unpacks that exact version and renames the directory to match; thenketchup -r 2.6works out that the newest stable version is 2.6.17.11 and fetches the patches needed to get there 6. He highly recommends using it for downloading any kernel source tree, since it handles finding the right patch on the server and applying it in the proper format after checking the signature 6.Tình trạng hôm nay.
ketchuptừ lâu không còn được bảo trì. Trang phát hành gốc tại selenic.com dừng ởketchup-0.9.8.tar.bz2ngày 01-05-2006; gói Debian bị gỡ khỏi testing ngày 15-12-2019 và khỏi unstable ngày 21-06-2022 13. Hãy đọc mục này như một ghi chép lịch sử, không phải một chỉ dẫn.Bây giờ thì sao. Công cụ này đã bỏ hoang từ lâu: bản cuối cùng từ năm 2006, và Debian đã gỡ nó khỏi kho 13. Nhớ nhé: phần này để biết, không để làm theo.
Status today.
ketchuphas long been unmaintained. The original release page at selenic.com stops atketchup-0.9.8.tar.bz2, dated 2006-05-01, and the Debian package was removed from testing on 2019-12-15 and from unstable on 2022-06-21 13. Read this section as history, not as instruction. -
git, today's answer
git — câu trả lời hiện hành cho cùng câu hỏi Bây giờ người ta dùng git git — today's answer to the same question
Chính tài liệu về vá của nhân nay tự đánh dấu là lỗi thời và nói thẳng rằng bạn gần như chắc chắn sẽ muốn dùng git thay thế 7. Hướng dẫn dựng nhân hiện hành mô tả vòng nâng cấp bằng ba động tác:
git fetchcó giới hạn độ sâu,git checkout --force --detach origin/master, rồimake olddefconfigđể chỉnh tệp cấu hình đã chuẩn bị trước đó cho khớp cây mã mới 9.Tài liệu chính thức nay nói: hãy dùng git thay cho cách vá thủ công 7. Vòng nâng cấp còn ba bước: lấy mã mới, chuyển sang bản mới, rồi cập nhật cấu hình 9. Nhớ nhé: ý tưởng y hệt, công cụ mới hơn.
The kernel's own patching document now marks itself obsolete and says plainly that you will almost certainly want to look at using git instead 7. The current build guide describes the upgrade loop in three moves: a depth-bounded
git fetch,git checkout --force --detach origin/master, thenmake olddefconfigto adjust the configuration file you prepared earlier to the new tree 9.Bạn thấy nó ở đâu. Hai điểm cần chú ý khi dùng cách mới:
git checkout --forcesẽ xóa mọi thay đổi cục bộ của bạn 9, vàolddefconfigtự nhận giá trị mặc định cho tùy chọn mới — muốn tự quyết từng cái thì dùngoldconfig, đúng lệnh mà sách đã dạy 9.Gặp ở đâu. Nhớ hai điều: lệnh
checkout --forcexóa sạch chỉnh sửa cục bộ 9, và nếu muốn tự chọn từng mục mới thì vẫn dùngoldconfignhư sách dạy 9. Nhớ nhé: lệnh cũ trong sách vẫn còn sống.Where you see it. Two things to watch in the modern route:
git checkout --force“will discard any modifications you performed” 9, andolddefconfigsilently takes the default for new options — if you want to set them manually, useoldconfig, the very target the book teaches 9.Điều gì còn nguyên giá trị
Ba luật về loại bản vá, thao tác
patch -p1, phép kiểm bằngMakefile, và lệnhmake oldconfigđều vẫn dùng được nguyên xi. Vá vẫn là cách phân phối thay đổi trong danh sách thư của nhân, và khoincr/vẫn được cập nhật hằng tuần 8.
Tự kiểmSelf-check
Tự kiểm trước khi sang chương 7 Tự hỏi mình vài câu Self-check before Chapter 7
Chương này có lệnh để gõ, nên phần tự kiểm cũng cụ thể hơn. Hãy trả lời trước khi bước sang phần tùy biến.
Chương này có lệnh thật để gõ, nên câu hỏi cũng cụ thể hơn. Nhớ nhé: trả lời được hết thì đi tiếp.
This chapter has real commands in it, so the self-check is more concrete. Answer these before moving into the customization part.
- Việc đầu tiên bạn làm trước khi nâng cấp là gì, và bạn đặt bản sao ở đâu?
Đáp án của sách: sao lưu
.configra ngoài cây mã, ví dụcp .config ../good_config1. - Bạn phân biệt được vá stable, vá bản nền và vá incremental, và nói được mỗi loại áp lên đâu?
Mấu chốt: vá stable và vá bản nền đều áp lên bản nền; chỉ vá incremental mới nối bản stable này với bản stable kế tiếp 2.
- Vì sao lệnh vá luôn có
-p1, và bạn đang đứng ở thư mục nào khi gõ nó? - Sau khi vá, bạn kiểm chứng bằng cách nào mà không cần dựng thử?
Đọc năm dòng đầu
Makefilevà xemEXTRAVERSIONđã đúng chưa 4; đồng thời xác nhận đầu ra củapatchkhông có lỗi nào 4. - Bạn nói được
make oldconfiglàm gì với một tùy chọn đã có và với một tùy chọn mới? - Nếu hôm nay bạn muốn tự động hóa việc này, bạn dùng gì — và vì sao không phải
ketchup?
- Trước khi nâng cấp, bạn phải chép tệp nào ra chỗ an toàn?
- Vì sao không tải lại cả bộ mã nguồn mà chỉ tải miếng vá?
- Đi từ bản .9 lên bản .11 thì cần mấy miếng vá?
- Vá xong, bạn mở tệp nào ra để kiểm tra số phiên bản?
- Lệnh nào giúp bạn giữ lại lựa chọn cũ và chỉ hỏi mục mới?
- Nhớ nhé: trả lời được cả sáu câu thì sang chương 7 được rồi.
- What is the very first thing you do before upgrading, and where does the copy go?
The book's answer: back up
.configoutside the tree, e.g.cp .config ../good_config1. - Can you tell stable, base and incremental patches apart, and say what each applies to?
The key: stable and base patches both apply to the base release; only incremental patches link one stable release to the next 2.
- Why does the patch command always carry
-p1, and which directory are you standing in when you type it? - After patching, how do you verify without building?
Read the first five lines of the
Makefileand checkEXTRAVERSION4, and confirmpatchreported no errors 4. - Can you say what
make oldconfigdoes with an already-answered option, and with a new one? - If you wanted to automate this today, what would you use — and why not
ketchup?
Đọng lạiWhat remains
Nâng cấp một nhân tự dựng không đòi bạn trả lại công sức đã bỏ ra: bạn cập nhật mã nguồn, chứ không cập nhật quyết định của mình. Tệp vá mang mã mới tới,
patch -p1đặt nó vào chỗ, vàmake oldconfigchỉ hỏi bạn đúng những câu chưa từng hỏi.Lên bản mới không có nghĩa là làm lại từ đầu: chỉ mã nguồn đổi, lựa chọn của bạn vẫn còn. Miếng vá mang phần mới đến, và máy chỉ hỏi bạn những mục chưa từng có. Nhớ nhé: chép dự phòng trước, rồi yên tâm nâng cấp.
Upgrading a custom kernel does not ask you to hand back the effort you invested: you update the source, not your decisions. The patch brings the new code,
patch -p1puts it in place, andmake oldconfigasks you only the questions it has never asked before.