Linux Kernel in a Nutshell · Chương 5 · Cài đặt và khởi độngChapter 5 · Installing and Booting
Mức đọcLevel

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

Đưa nhân vừa dựng vào chỗ máy sẽ tìm nó Đặt nhân mới vào đúng chỗ để máy thấy Putting a built kernel where the machine will look for it

Các chương trước dẫn bạn tới một tệp thực thi cùng những module đã dựng. Kroah-Hartman mở chương 5 bằng đúng câu chuyển ấy: giờ là lúc cài nhân và thử khởi động nó 1. Và ông đặt ngay một ngoại lệ: khác với các chương trước, mọi lệnh trong chương này đều cần chạy với quyền root 1.

Ở các chương trước, bạn đã dựng xong nhân mới. Giờ phải mang nó đặt vào đúng chỗ, rồi bảo máy khởi động bằng nó 1. Chương này là chương duy nhất trong phần đầu sách cần quyền quản trị cho mọi lệnh 1. Nhớ nhé: đến đây mới được mượn quyền lớn.

The previous chapters led you to an executable file and whatever modules you built. Kroah-Hartman opens Chapter 5 on exactly that pivot: it is time to install the kernel and attempt to boot it 1. And he states the exception right away: unlike in the earlier chapters, all of the commands here must be run as the root user 1.

Hãy để ý ranh giới này trùng khít với quy tắc của chương 1: chỉ hai hoặc ba lệnh cài mới cần quyền siêu người dùng, còn tải, giải nén, cấu hình, biên dịch thì không 9. Chương 5 chính là chỗ hai hoặc ba lệnh ấy xuất hiện — không sớm hơn, không nhiều hơn.

Luận điểm chương 5. Việc cài nhân gồm ba việc tách rời — đặt module, đặt ảnh nhân, và báo cho bộ nạp khởi động — và bạn có thể giao cả ba cho make install, hoặc làm từng việc bằng tay để hiểu chúng 23. Dù chọn đường nào, nguyên tắc an toàn không đổi: cài đặt không ghi đè các ảnh nhân cũ, nên nếu nhân mới hỏng, bạn vẫn chọn được nhân cũ lúc khởi động 2.

Ý chính. Cài nhân là ba việc: đặt module, đặt nhân, và báo cho phần mềm khởi động biết. Có thể để máy tự làm cả ba bằng một lệnh, hoặc tự làm tay từng bước 23. Nhớ nhé: nhân cũ không bị xóa, nên lỡ hỏng vẫn quay về được 2.

Chapter 5 thesis. Installing a kernel is three separable jobs — place the modules, place the kernel image, and tell the bootloader — and you can hand all three to make install or do each by hand to understand it 23. Either way the safety principle holds: the installation does not overwrite any older kernel images, so if there is a problem with the new one, the old kernel can still be selected at boot time 2.

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

Mượn quyền root đúng cách — và trả lại ngay Mượn quyền quản trị, rồi trả lại liền Borrowing root correctly — and giving it straight back

Chương mở đầu không bằng một lệnh cài, mà bằng một bài kiểm tra quyền. Ông liệt kê ba cách để chạy lệnh với quyền root: đặt sudo trước mỗi lệnh, dùng su để trở thành root, hoặc thực sự đăng nhập bằng tài khoản root 1. Rồi ông đưa một phép thử nhỏ để biết máy bạn đã có sudo và bạn có quyền dùng nó hay chưa 1.

Chương này bắt đầu bằng việc kiểm tra xem bạn có quyền quản trị không. Có ba cách để có quyền đó: thêm sudo trước lệnh, gõ su, hoặc đăng nhập thẳng bằng tài khoản quản trị 1. Nhớ nhé: thử trước rồi hãy làm.

The chapter does not open with an install command but with a permissions test. He lists three ways to run a command as root: prefixing each command with sudo, using su to become root, or actually logging in as root 1. Then he gives a small probe to find out whether sudo is installed and properly set up for you 1.

sudo và su. Hai cách khác nhau để mượn quyền. Với sudo, mật khẩu bạn nhập có thể là mật khẩu của chính bạn hoặc của quản trị viên — tùy cách sudo được cấu hình 1. Với su, bạn nhập mật khẩu của root và từ đó mọi thứ bạn gõ đều chạy với toàn quyền 1.

Hai cách mượn quyền. sudo cho phép chạy một lệnh với quyền lớn. su biến toàn bộ phiên làm việc thành quyền lớn 1. Nhớ nhé: sudo là mượn từng lần, su là mượn cả buổi.

sudo versus su. Two different ways of borrowing privilege. With sudo, the password you type may be your own or the administrator's, depending on how sudo was set up 1. With su, you type root's password and from then on everything you type runs with full privileges 1.

chương 1–4 → user thường
chương 5     → root
làm ít nhất có thể → exit

4 chương trước → tài khoản thường
chương này     → quyền quản trị
xong việc       → thoát ra ngay

chapters 1–4 → normal user
chapter 5     → root
do the minimum → exit

  1. testing sudo

    Phép thử trước khi cần đến Thử quyền trước khi dùng Test the privilege before you need it

    Phép thử của ông rất gọn: chạy sudo ls ~/linux/linux-2.6.17.11/Makefile, nhập mật khẩu, và nếu bạn thấy dòng Makefile hiện ra thì có thể bỏ qua phần còn lại và sang mục kế 1. Nếu sudo chưa được cài hoặc chưa cho bạn quyền, ông chuyển sang su 1.

    Cách thử: gõ lệnh sudo ls xem một tệp trong thư mục nhân. Nếu tên tệp hiện ra là được 1. Nếu không, dùng su thay thế 1. Nhớ nhé: thử bằng một lệnh vô hại trước đã.

    His probe is compact: run sudo ls ~/linux/linux-2.6.17.11/Makefile, enter the password, and if you see the line Makefile, you can skip ahead to the next section 1. If sudo is not installed or is not giving you the rights, he falls back to su 1.

    Bạn thấy nó ở đâu. Đường dẫn ~/linux/linux-2.6.17.11/ trong ví dụ chính là thư mục làm việc mà chương 1 và chương 3 đã dặn tạo dưới thư mục nhà 9; hướng dẫn hiện hành của kernel.org cũng dùng đúng ~/linux/ 4.

    Gặp ở đâu. Thư mục ~/linux/ trong ví dụ là chỗ bạn đã đặt mã nguồn từ chương trước 9, và hướng dẫn mới của kernel.org cũng dùng chỗ đó 4. Nhớ nhé: vẫn là cái sân nhà cũ.

    Where you see it. The path ~/linux/linux-2.6.17.11/ in the example is the working directory Chapters 1 and 3 told you to create in your home 9; today's kernel.org guide uses the very same ~/linux/ 4.

  2. minimum time as root

    Cẩn trọng và làm ít nhất có thể Làm ít thôi rồi thoát ra Be careful, and do only the minimum

    Đoạn về su kết thúc bằng một lời dặn mà đọc nhanh rất dễ lướt qua: hãy rất cẩn trọng khi đang là root, chỉ làm phần tối thiểu cần thiết, rồi thoát khỏi chương trình để trở lại tài khoản thường 1. Đây không phải nghi thức — ở chương 1 ông đã kể lỗi từng xóa tệp trong /dev vì người dùng có quyền siêu người dùng lúc dựng 9.

    Khi đang có quyền quản trị, hãy làm thật ít rồi gõ exit để trở về bình thường 1. Đã có lần lỗi làm mất tệp quan trọng vì người dùng giữ quyền đó quá lâu 9. Nhớ nhé: mượn dao sắc thì cắt xong trả liền.

    The passage on su ends with an instruction that is easy to skim past: be very careful while you are root, do only the minimum needed, then exit the program to continue as your normal user account 1. This is not ritual — in Chapter 1 he recounted bugs that deleted files in /dev because the user held superuser permissions while building 9.

    Vì sao chương này là ngoại lệ

    Ba việc của bước cài — ghi vào /lib/modules/, ghi vào /boot/, và sửa cấu hình bộ nạp khởi động trong /boot/grub/ hoặc /etc/ — đều nằm ngoài thư mục nhà. Không có quyền root thì không ghi được. Ranh giới của ông vì thế là ranh giới của hệ thống tệp, không phải một thói quen tùy ý.

    Ranh giới ấy vẫn còn nguyên

    Hướng dẫn dựng nhân hiện hành của kernel.org giữ đúng mô hình: mọi lệnh git và make chạy trong ~/linux/ bằng tài khoản thường, chỉ riêng bước cài mới là sudo make modules_install install 4. Hai mươi năm, một lệnh sudo.

Cụm khái niệm 02 · “Using a Distribution's Installation Scripts”Concept cluster 02 · “Using a Distribution's Installation Scripts”

Đường tự động: hai lệnh và một chuỗi năm bước Cách nhanh: hai lệnh là xong The automatic path: two commands, five steps

Gần như mọi bản phân phối đều kèm một script tên installkernel mà hệ thống dựng của nhân có thể gọi để tự đặt nhân vào đúng chỗ và sửa bộ nạp khởi động, người dùng không phải làm gì thêm 2. Nếu không tìm thấy script trên máy, ông mách rằng các bản phân phối thường đóng gói nó trong gói tên mkinitrd 2.

Hầu hết bản Linux đều có sẵn một script tên installkernel. Nó tự đặt nhân vào đúng chỗ và tự sửa phần khởi động giúp bạn 2. Không thấy nó thì cài gói tên mkinitrd 2. Nhớ nhé: cứ thử cách này trước.

Almost all distributions ship a script called installkernel that the kernel build system can call to install a built kernel in the proper place and modify the bootloader, so nothing extra is needed from the developer 2. If you cannot find the script on your machine, he notes that distributions usually put it in a package called mkinitrd 2.

Ông cũng nêu ngoại lệ trong một chú thích: Gentoo và các bản phân phối kiểu “dựng từ đầu” cố tình không đi theo quy ước này, vì họ kỳ vọng người dùng tự biết cách cài nhân; những bản ấy có tài liệu riêng nên hãy tra đúng tài liệu của chúng 2. Đây là một mẫu lặp lại trong cả cuốn sách: quy tắc chung kèm danh sách các ngoại lệ được nêu tên.

Hai lệnh, theo đúng thứ tự. Trước hết make modules_install để đặt các module vừa dựng vào /lib/modules/kernel_version, trong đó kernel_version là phiên bản của nhân bạn vừa dựng 2. Sau khi module đã vào chỗ, mới chạy make install để cài ảnh nhân chính 2.

Hai lệnh. Lệnh đầu đặt các module vào thư mục của phiên bản mới; lệnh sau đặt nhân chính 2. Nhớ nhé: module trước, nhân sau — không đảo ngược.

Two commands, in this order. First make modules_install places the modules you built into /lib/modules/kernel_version, where kernel_version is the version of the kernel you have just built 2. Only after the modules are in place do you run make install for the main kernel image 2.

# make modules_install
# make install
→ kiểm tra · chép vào /boot · initrd
→ báo bộ nạp · reboot

lệnh 1 · đặt module
lệnh 2 · đặt nhân + sửa menu
→ khởi động lại và chọn nhân mới

# make modules_install
# make install
→ verify · copy to /boot · initrd
→ notify bootloader · reboot

  1. make modules_install

    Module đi trước — vì ramdisk cần chúng Đặt module trước đã Modules first — because the ramdisk needs them

    Thứ tự không phải tùy tiện. Ở bước 3 của chuỗi do make install kích hoạt, mọi ảnh ramdisk khởi tạo cần thiết sẽ được tạo tự động, dùng chính những module vừa được cài ở bước modules_install 2. Đảo ngược thứ tự thì ramdisk được dựng từ một thư mục module chưa tồn tại.

    Phải đặt module trước vì bước sau sẽ lấy chính những module đó để dựng ảnh khởi động tạm 2. Nhớ nhé: làm sai thứ tự thì máy không tìm thấy thứ nó cần.

    The order is not arbitrary. At step 3 of the sequence that make install kicks off, any needed initial ramdisk images are created automatically, using the modules just installed during the modules_install phase 2. Reverse the order and the ramdisk is built from a module directory that does not yet exist.

    Bạn thấy nó ở đâu. Tài liệu initrd của nhân mô tả đúng lý do tồn tại của ảnh này: nhân khởi động với một tập driver biên dịch sẵn tối thiểu, rồi nạp thêm module từ initrd 7.

    Gặp ở đâu. Ảnh khởi động tạm (initrd) giúp nhân nạp thêm module cần thiết ngay lúc bật máy 7. Nhớ nhé: nó là hộp đồ nghề nhân mang theo lúc mới tỉnh dậy.

    Where you see it. The kernel's own initrd documentation states its purpose exactly: the kernel comes up with a minimum set of compiled-in drivers, and additional modules are loaded from initrd 7.

  2. make install

    Năm bước ẩn sau một lệnh Một lệnh, năm việc Five steps hidden behind one command

    Ông liệt kê rõ chuỗi việc mà make install kích hoạt: (1) hệ thống dựng kiểm tra nhân đã được dựng đúng; (2) phần nhân tĩnh được cài vào thư mục /boot, đặt tên theo phiên bản; (3) các ảnh ramdisk cần thiết được tạo tự động; (4) bộ nạp khởi động được báo có nhân mới và mục mới được thêm vào trình đơn thích hợp; (5) xong — bạn có thể khởi động lại và thử nhân mới 2.

    Một lệnh make install làm năm việc: kiểm tra nhân, chép nhân vào /boot, tạo ảnh khởi động tạm, thêm dòng vào trình đơn khởi động, rồi báo là xong 2. Nhớ nhé: một lệnh nhưng năm việc, nên nếu lỗi thì phải hỏi lỗi ở việc nào.

    He spells out the sequence make install kicks off: (1) the build system verifies the kernel was built properly; (2) the static kernel portion is installed into /boot, named after the kernel version; (3) any needed initial ramdisk images are created automatically; (4) the bootloader is notified that a new kernel is present and an entry is added to the appropriate menu; (5) done — you can safely reboot and try the new image 2.

    Bạn thấy nó ở đâu. Hướng dẫn hiện hành của kernel.org rút gọn cả hai lệnh thành một dòng có điều kiện: command -v installkernel && sudo make modules_install install — và cảnh báo rằng trên vài bản phân phối như Arch, dòng này không làm gì cả, khi đó phải cài bằng tay 4.

    Gặp ở đâu. Hướng dẫn mới gộp hai lệnh thành một dòng, nhưng nói rõ trên vài bản Linux như Arch thì dòng đó không làm gì, phải tự cài tay 4. Nhớ nhé: vẫn có chỗ bạn phải tự làm.

    Where you see it. Today's kernel.org guide compresses both commands into one conditional line: command -v installkernel && sudo make modules_install install — and warns that on a few distributions such as Arch this does nothing at all, in which case you must install the kernel manually 4.

    Bước 4 đã đổi hình dạng

    “Báo cho bộ nạp khởi động” năm 2006 nghĩa là ghi thêm một khối vào menu.lst hoặc lilo.conf 2. Trên nhiều hệ thống hiện nay việc đó do kernel-install đảm nhiệm: nó chạy các “plugin” trong /usr/lib/kernel/install.d/ và /etc/kernel/install.d/ để thêm và gỡ ảnh nhân cùng initrd khỏi phân vùng khởi động 6. Khung năm bước của ông vẫn đúng; chỉ bộ máy bên dưới bước 4 là khác.

    Gỡ cũng là một bước

    Sách không bàn tới việc gỡ một nhân đã cài. Tài liệu hiện hành có: xóa thư mục module tương ứng rồi chạy kernel-install -v remove với tên phiên bản, kèm cảnh báo đừng xóa nhân đang chạy vì máy có thể không khởi động được nữa 4.

  3. old kernels kept

    Không ghi đè — lưới an toàn nằm ngay trong quy trình Nhân cũ vẫn còn đó Nothing is overwritten — the safety net is built in

    Câu quan trọng nhất của mục này là câu cuối: việc cài đặt không ghi đè bất kỳ ảnh nhân cũ nào, nên nếu nhân mới có vấn đề, bạn vẫn chọn được nhân cũ lúc khởi động 2. Đó là lý do tên tệp trong /boot luôn mang số phiên bản: mỗi nhân một tên, không ai đè ai.

    Cài nhân mới không xóa nhân cũ 2. Nếu nhân mới không chạy, bật lại máy và chọn nhân cũ là xong. Nhớ nhé: luôn còn đường lùi.

    The most important sentence here is the last one: the installation does not overwrite any older kernel images, so if there is a problem with your new kernel, the old kernel can be selected at boot time 2. That is why filenames in /boot always carry the version number: one name per kernel, none overwriting another.

    Đây là lời khuyên an toàn duy nhất trong chương đến thẳng từ sách, không phải từ trang này.

    This is the one safety guarantee in the chapter that comes straight from the book, not from this page.

Cụm khái niệm 03 · “Installing by Hand”Concept cluster 03 · “Installing by Hand”

Đường thủ công: ba lệnh và một script nhỏ Làm tay: ba lệnh, rồi một script The manual path: three commands and a small script

Ông nêu lý do mở mục này rất sòng phẳng: hoặc bản phân phối của bạn không có lệnh installkernel, hoặc bạn chỉ đơn giản muốn tự làm để hiểu các bước liên quan 3. Rồi ông liệt kê đúng những bước ấy, không thêm gì.

Làm tay vì hai lý do: bản Linux của bạn không có script tự động, hoặc bạn muốn hiểu máy đang làm gì 3. Nhớ nhé: lý do thứ hai cũng chính đáng như lý do thứ nhất.

He states the reason for this section plainly: either your distribution does not have an installkernel command, or you simply wish to do the work by hand to understand the steps involved 3. Then he lists exactly those steps, and nothing else.

Ba lệnh của đường thủ công. make modules_install vẫn là bước đầu 3. Sau đó hỏi phiên bản bằng make kernelversion — trong sách trả về 2.6.17.11 3 — rồi chép hai tệp: arch/i386/boot/bzImage thành /boot/bzImage-KERNEL_VERSION, và System.map thành /boot/System.map-KERNEL_VERSION 3.

Ba việc. Cài module. Hỏi xem nhân là phiên bản nào. Chép hai tệp vào thư mục /boot, đặt tên có kèm số phiên bản 3. Nhớ nhé: kèm số phiên bản vào tên thì không đè lên nhân cũ.

The three manual commands. make modules_install is still the first step 3. Then ask for the version with make kernelversion — in the book it returns 2.6.17.11 3 — and copy two files: arch/i386/boot/bzImage to /boot/bzImage-KERNEL_VERSION, and System.map to /boot/System.map-KERNEL_VERSION 3.

# make modules_install
# make kernelversion → 2.6.17.11
# cp arch/i386/boot/bzImage /boot/bzImage-VER
# cp System.map /boot/System.map-VER
→ rồi sửa bộ nạp khởi động

1 · cài module
2 · xem phiên bản
3 · chép 2 tệp vào /boot
4 · sửa trình đơn khởi động

# make modules_install
# make kernelversion → 2.6.17.11
# cp arch/i386/boot/bzImage /boot/bzImage-VER
# cp System.map /boot/System.map-VER
→ then edit the bootloader

  1. bzImage and System.map

    Hai tệp, hai vai trò Hai tệp cần chép Two files, two roles

    Sách chép cả bzImage lẫn System.map, và gắn số phiên bản vào tên cả hai 3. bzImage là phần nhân tĩnh mà bộ nạp khởi động sẽ nạp; System.map là bảng tên ký hiệu tương ứng. Ông không giải thích thêm trong chương này — nhưng việc đặt chúng cạnh nhau, cùng một hậu tố phiên bản, chính là cách giữ cho mỗi nhân có đủ bộ của riêng nó.

    Chép hai tệp: một là nhân, một là bảng tra tên bên trong nhân 3. Cả hai đều được đặt tên kèm số phiên bản. Nhớ nhé: hai tệp phải đi cùng một phiên bản với nhau.

    The book copies both bzImage and System.map, giving both filenames the version suffix 3. bzImage is the static kernel the bootloader will load; System.map is the matching symbol table. He does not elaborate in this chapter — but keeping them side by side under one version suffix is exactly how each kernel keeps its own complete set.

    Bạn thấy nó ở đâu. Đường dẫn arch/i386/boot/bzImage là dấu thời gian: từ nhân 2.6.24, cây arch/i386 và arch/x86_64 được hợp nhất thành arch/x86, và ARCH=i386, ARCH=x86_64 được thay bằng ARCH=x86 8. Trên máy hôm nay, ảnh nằm ở arch/x86/boot/bzImage.

    Gặp ở đâu. Sách viết arch/i386/ vì đó là năm 2006. Từ nhân 2.6.24, thư mục ấy đổi thành arch/x86/ 8. Nhớ nhé: gõ theo sách sẽ không tìm thấy tệp — hãy dùng tên mới.

    Where you see it. The path arch/i386/boot/bzImage is a timestamp: as of kernel 2.6.24 the arch/i386 and arch/x86_64 trees were unified into arch/x86, and ARCH=i386 / ARCH=x86_64 were replaced by ARCH=x86 8. On a machine today the image lives at arch/x86/boot/bzImage.

  2. the install script

    Script nhỏ của tác giả — tự đọc phiên bản khỏi Makefile Script tự làm thay bạn The author's small script — reading the version out of the Makefile

    Ông đưa kèm một script shell “tiện tay” để khỏi phải gõ lại các lệnh trên mỗi lần 3. Script chạy make modules_install, rồi ghép phiên bản từ bốn biến trong Makefile — VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION — tự đoán kiến trúc bằng cách lọc CONFIG_ARCH trong include/linux/autoconf.h, rồi chép bzImage và System.map kèm hậu tố phiên bản 3.

    Ông cho sẵn một script nhỏ làm hết mấy việc trên, để bạn khỏi gõ lại 3. Nó tự đọc số phiên bản và tên kiến trúc từ trong mã nguồn rồi chép tệp giúp bạn 3. Nhớ nhé: script chỉ là mấy lệnh tay gói lại.

    He includes a handy shell script so you need not retype those commands every time 3. It runs make modules_install, assembles the release string from four Makefile variables — VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION — figures out the architecture by grepping CONFIG_ARCH out of include/linux/autoconf.h, then copies bzImage and System.map with the version suffix 3.

    Bốn biến ấy vẫn còn

    Cách ghép VERSION.PATCHLEVEL.SUBLEVEL cộng EXTRAVERSION vẫn là cách Makefile gốc của nhân định nghĩa số phiên bản. Nhưng chi tiết include/linux/autoconf.h mà script dựa vào 3 thì thuộc về cấu trúc cây mã năm 2006 và đã dịch chuyển từ lâu. Đọc script như một mẫu tư duy, đừng chép nguyên xi.

    Cách hỏi phiên bản an toàn hơn

    Bản thân sách đã đưa lệnh gọn hơn ở ngay phía trên script: make kernelversion in ra chuỗi phiên bản của cây mã bạn đang đứng 3. Lệnh này không phụ thuộc vào vị trí tệp autoconf.h, nên bền hơn theo thời gian.

  3. when boot fails

    Khi khởi động hỏng: thường là thiếu ramdisk Máy không lên? Thường thiếu ảnh tạm When the boot fails: usually a missing ramdisk

    Ông chẩn đoán trước giúp bạn: nếu quá trình khởi động không chạy đúng, thường là vì cần một ảnh ramdisk khởi tạo 3. Và lời khuyên của ông ở đây là quay về đường tự động — hãy dùng các bước ở đầu chương, vì script cài của bản phân phối biết cách dựng ramdisk đúng bằng những công cụ cần thiết 3. Ông nói thẳng rằng mỗi bản phân phối làm việc này một kiểu, nên bao quát hết nằm ngoài phạm vi sách 3.

    Nếu máy không khởi động được, phần lớn là do thiếu ảnh khởi động tạm 3. Cách chữa: quay lại dùng cách tự động, vì script của bản Linux biết tạo ảnh đó đúng cách 3. Nhớ nhé: làm tay thất bại thì quay về cách tự động, không có gì xấu hổ.

    He diagnoses it for you in advance: if the boot process does not work properly, it is usually because an initial ramdisk image is needed 3. And his advice is to go back to the automatic path — use the steps at the beginning of the chapter, because the distribution's install scripts know how to build the ramdisk properly with the needed tools 3. He says outright that each distribution does this differently, so covering them all is beyond the scope of the book 3.

    Bạn thấy nó ở đâu. Hướng dẫn hiện hành nêu cùng một chỗ trượt: sau khi cài, nhiều bản phân phối sẽ tự tạo initramfs và thêm mục vào bộ nạp khởi động, nhưng trên một số bản bạn phải tự làm hai bước đó 4.

    Gặp ở đâu. Ngày nay cũng vậy: phần lớn bản Linux tự lo hai bước ấy, một số thì không 4. Nhớ nhé: nhớ kiểm tra xem bản Linux của bạn thuộc nhóm nào.

    Where you see it. The current guide names the same stumbling point: after installing, many distributions will create an initramfs and a bootloader entry for you, but on some you have to take care of these two steps manually 4.

Cụm khái niệm 04 · “Modifying the Bootloader”Concept cluster 04 · “Modifying the Bootloader”

Sửa bộ nạp khởi động: quy trình 2006, đọc bằng mắt hôm nay Sửa phần khởi động: sách cũ, máy mới Editing the bootloader: the 2006 procedure, read with today's eyes

Sách nêu hai bộ nạp khởi động phổ biến của thời điểm ấy — GRUB và LILO — và nhận xét GRUB được dùng nhiều hơn trong các bản phân phối hiện đại, làm vài việc dễ hơn LILO, nhưng LILO thì vẫn còn gặp 5. Cách nhận diện cũng thực dụng: nếu /boot/ có thư mục con grub/ thì bạn dùng GRUB; nếu không, hãy tìm tệp /etc/lilo.conf 5.

Thời đó có hai phần mềm khởi động hay dùng: GRUB và LILO 5. Muốn biết máy dùng cái nào: xem trong /boot/ có thư mục grub/ không; không có thì tìm tệp /etc/lilo.conf 5. Nhớ nhé: mỗi loại sửa một kiểu, đừng làm lẫn.

The book names the two common bootloaders of its moment — GRUB and LILO — noting that GRUB is the more commonly used in modern distributions and does some things a little more easily, but that LILO is still seen as well 5. The identification test is practical: if /boot/ has a grub/ subdirectory you are using GRUB; if not, look for /etc/lilo.conf 5.

Cần nói rõ một điều trước khi đi tiếp: “GRUB” trong sách là GRUB Legacy — dòng 0.9x với tệp /boot/grub/menu.lst 5. Dự án GNU nói rõ lý do viết lại: GRUB Legacy trở nên không bảo trì nổi vì mã lộn xộn và những sai lầm thiết kế 10. GRUB 2 dùng tệp khác (grub.cfg), cú pháp khác, và số hiệu phân vùng bắt đầu từ 1 chứ không phải 0 11. LILO thì đã dừng phát triển từ tháng 12 năm 2015, bản cuối là 24.2 ra ngày 22-11-2015 12. Nói cách khác: quy trình trong mục này vẫn dạy bạn điều gì phải xảy ra, nhưng cách gõ thì đã khác.

Bộ nạp khởi động (bootloader). Chương trình chạy trước nhân, đọc một tệp cấu hình liệt kê các nhân có thể chọn, rồi nạp cái bạn chọn. Thêm một nhân mới, với cả GRUB Legacy lẫn LILO, chỉ là thêm một khối vào tệp ấy 513.

Bộ nạp khởi động là gì. Là chương trình chạy trước nhất khi bật máy, đưa ra danh sách nhân để bạn chọn. Thêm nhân mới = thêm một mục vào danh sách 513. Nhớ nhé: nó là cái thực đơn lúc bật máy.

Bootloader. The program that runs before the kernel, reads a configuration file listing the selectable kernels, and loads the one you pick. Adding a new kernel, in both GRUB Legacy and LILO, is just adding one block to that file 513.

2006 · GRUB Legacy → /boot/grub/menu.lst (sửa tay)
2006 · LILO        → /etc/lilo.conf + /sbin/lilo
nay  · GRUB 2      → grub-mkconfig -o grub.cfg
nay  · systemd     → kernel-install

sách 2006 · sửa tệp menu bằng tay
ngày nay  · chạy lệnh cho máy tự sinh
→ cùng mục đích, khác cách gõ

2006 · GRUB Legacy → /boot/grub/menu.lst (hand-edited)
2006 · LILO        → /etc/lilo.conf + /sbin/lilo
today · GRUB 2      → grub-mkconfig -o grub.cfg
today · systemd     → kernel-install

  1. GRUB · menu.lst

    GRUB Legacy — chép một khối, đổi số phiên bản GRUB — chép một mục rồi sửa số GRUB Legacy — copy a block, change the version

    Với GRUB, tất cả những gì cần làm là sửa tệp /boot/grub/menu.lst; muốn biết đầy đủ cấu trúc tệp thì đọc trang info bằng info grub 5. Cách dễ nhất để thêm mục là chép một mục có sẵn: mỗi dòng bắt đầu bằng từ title định nghĩa một mục nhân mới 5. Chép khối ấy xuống cuối tệp, sửa số phiên bản thành nhân vừa cài; title đặt gì cũng được miễn là duy nhất, nhưng nó hiện trong trình đơn nên hãy đặt cho có nghĩa 13.

    Với GRUB, chỉ cần sửa một tệp tên menu.lst 5. Cách dễ nhất: chép một mục đang có, dán xuống cuối, đổi số phiên bản thành nhân mới 13. Tên mục đặt sao cũng được, miễn là khác các mục kia và bạn đọc hiểu 13. Nhớ nhé: chép cái đang chạy được thì ít sai nhất.

    For GRUB, all you need to do is modify /boot/grub/menu.lst; for the full structure of the file, read the info pages with info grub 5. The easiest way to add an entry is to copy an existing one: each line starting with the word title defines a new kernel entry 5. Add that block at the end of the file and edit the version number to your newly installed kernel; the title does not matter so long as it is unique, but it is displayed in the boot menu, so make it meaningful 13.

    Ngày nay thì sao. Trên GRUB 2, grub.cfg thường được sinh tự động bởi grub-mkconfig, chạy dạng grub-mkconfig -o /boot/grub/grub.cfg 14; nó tự dò các nhân sẵn có và tạo mục trình đơn cho chúng 15. Hành vi của nó được điều khiển qua /etc/default/grub, còn mục tùy biến thì thêm vào /etc/grub.d/40_custom hoặc /boot/grub/custom.cfg 15.

    Ngày nay. Bây giờ bạn không sửa tay tệp menu nữa, mà chạy một lệnh để máy tự sinh ra nó 1415. Muốn chỉnh thì sửa tệp /etc/default/grub 15. Nhớ nhé: sửa tay tệp sinh tự động thì lần sau bị ghi đè.

    Today. On GRUB 2, grub.cfg is typically generated automatically by grub-mkconfig, invoked as grub-mkconfig -o /boot/grub/grub.cfg 14; it discovers available kernels and generates menu entries for them 15. Its behaviour is controlled through /etc/default/grub, and extra custom entries go in /etc/grub.d/40_custom or /boot/grub/custom.cfg 15.

    Ví dụ trong sách, đọc từng dòng

    Tệp menu.lst mẫu lấy từ một hệ Gentoo có timeout 300, default 0, một dòng splashimage, rồi hai khối title cho 2.6.16.11 và 2.6.16; mỗi khối có root (hd0,0) và một dòng kernel trỏ tới ảnh nhân kèm root=/dev/sda2 5. Sau khi thêm, tệp có ba khối, khối thứ ba là 2.6.17.11 13.

    Một quy ước đã đảo

    Chuỗi (hd0,0) trong ví dụ là cú pháp GRUB Legacy. Trong GRUB 2, số hiệu phân vùng bắt đầu từ 1 chứ không phải 0 11. Chép nguyên một dòng từ sách sang máy hiện đại là cách chắc chắn nhất để trỏ nhầm phân vùng.

  2. LILO · lilo.conf

    LILO — thêm khối rồi phải chạy /sbin/lilo LILO — sửa xong phải chạy thêm một lệnh LILO — add the block, then run /sbin/lilo

    Với LILO, bạn sửa /etc/lilo.conf rồi phải chạy lệnh lilo để áp dụng thay đổi 5. Trong tệp, dòng bắt đầu bằng image= định nghĩa một mục nhân; chép một khối như vậy xuống cuối tệp và sửa số phiên bản, với label đặt tùy ý miễn là duy nhất 13. Sau khi lưu, chạy /sbin/lilo để ghi thay đổi ra phần khởi động của đĩa 13.

    Với LILO: sửa tệp /etc/lilo.conf, chép một mục cũ rồi đổi số phiên bản 13. Quan trọng nhất là sau đó phải chạy lệnh /sbin/lilo, nếu không thay đổi không có tác dụng 13. Nhớ nhé: LILO cần thêm một bước mà GRUB không cần.

    With LILO you edit /etc/lilo.conf and then must run the lilo command to apply the changes 5. In the file, a line starting with image= defines a kernel entry; copy such a block to the end of the file and edit the version, with label set to anything unique 13. After saving, run /sbin/lilo to write the configuration changes out to the boot section of the disk 13.

    Ngày nay thì sao. LILO đã dừng phát triển: bản cuối 24.2 phát hành ngày 22-11-2015, và trang chủ dự án không có thông báo nào mới hơn 12. Dự án cũng tự nhận có giới hạn với Btrfs, GPT và RAID 12. Nếu máy bạn thực sự còn dùng LILO thì đó là hệ rất cũ.

    Ngày nay. LILO không còn được phát triển nữa; bản cuối cùng ra năm 2015 12. Nhớ nhé: đọc mục này để hiểu ý tưởng thôi, đừng mong gặp LILO trên máy mới.

    Today. LILO's development has stopped: the final release, 24.2, came out on 22 November 2015, and the project's homepage carries no later announcement 12. The project itself acknowledges limitations with Btrfs, GPT and RAID 12. If your machine really still runs LILO, it is a very old system.

  3. reboot and select

    Khởi động lại, mũi tên xuống, Enter Bật lại máy rồi chọn dòng mới Reboot, arrow down, Enter

    Cả hai nhánh kết thúc giống hệt nhau, và đây là chỗ tính an toàn hiện ra rõ nhất: sau khi lưu, khởi động lại và kiểm tra tên mục nhân mới có xuất hiện trong trình đơn không, dùng mũi tên xuống để chọn nó rồi nhấn Enter để khởi động 13. Nhân cũ vẫn nằm nguyên ngay phía trên trong cùng trình đơn ấy 2.

    Cả hai cách đều kết thúc như nhau: bật lại máy, thấy dòng mới trong danh sách, bấm mũi tên xuống rồi Enter 13. Nếu nhân mới không chạy, chọn lại dòng cũ ở ngay trên 2. Nhớ nhé: đừng xóa dòng cũ đi.

    Both branches end identically, and this is where the safety shows: after saving, reboot and check that the new kernel's title comes up in the boot menu, use the down arrow to highlight it, and press Enter to boot it 13. The old kernel is still sitting right above it in the same menu 2.

    Hình dạng thứ ba, sách chưa có

    Ngoài GRUB 2, nhiều hệ thống hiện nay dùng kernel-install của systemd: nó thêm và gỡ ảnh nhân cùng initrd khỏi phân vùng khởi động (/boot/, /efi/ hoặc /boot/efi/), và làm việc đó qua các plugin trong /usr/lib/kernel/install.d/, sinh mục theo Boot Loader Specification 6. Không có tệp menu nào để bạn chép khối vào.

    Vì sao vẫn nên đọc mục này

    Ba việc không đổi: một ảnh nhân có tên riêng, một mục trong danh sách, và một mục cũ được giữ lại làm đường lùi. Mọi công cụ hiện đại chỉ tự động hóa đúng ba việc ấy — nên khi công cụ tự động trượt, bạn biết phải đi tìm cái gì.

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

“Cứ sửa tay grub.cfg như sách bảo”“Just hand-edit grub.cfg like the book says”

Hiểu lầm: tệp cấu hình GRUB hôm nay cũng sửa tay như menu.lst năm 2006 5. Thực tế: grub.cfg thường do grub-mkconfig sinh ra 15; sửa tay nó sẽ bị ghi đè ở lần sinh kế tiếp. Muốn thêm mục riêng thì dùng /etc/grub.d/40_custom hoặc /boot/grub/custom.cfg; ai thực sự muốn tự viết grub.cfg thì được khuyến khích làm, nhưng phải tắt cơ chế tự chạy grub-mkconfig của bản phân phối 15.

Myth: today's GRUB config is hand-edited just like menu.lst in 2006 5. Fact: grub.cfg is typically generated by grub-mkconfig 15; editing it by hand loses your changes at the next generation. Custom entries belong in /etc/grub.d/40_custom or /boot/grub/custom.cfg; those who genuinely prefer writing grub.cfg directly are encouraged to do so, but must disable any distribution mechanism that runs grub-mkconfig automatically 15.

“Cài nhân mới là thay nhân cũ”“Installing a new kernel replaces the old one”

Hiểu lầm: cài xong là mất nhân đang chạy, nên rủi ro cao. Thực tế: sách nói rõ việc cài không ghi đè bất kỳ ảnh nhân cũ nào, và nhân cũ vẫn chọn được lúc khởi động 2. Rủi ro thật sự nằm ở chỗ khác: tài liệu hiện hành cảnh báo đừng xóa nhân đang chạy, vì điều đó có thể làm máy không khởi động được 4.

Myth: installing replaces the kernel you are running, so it is risky. Fact: the book states that the installation does not overwrite any older kernel images and the old kernel can still be selected at boot 2. The real risk is elsewhere: current documentation warns against deleting the kernel you are running, as that might render the system unbootable 4.

“Máy không lên thì nhân dựng sai”“If it won't boot, the build was wrong”

Hiểu lầm: khởi động thất bại nghĩa là cấu hình hoặc biên dịch có lỗi. Thực tế: ông chẩn đoán khác — thường là vì thiếu một ảnh ramdisk khởi tạo, và cách chữa là quay về dùng script cài của bản phân phối vì chúng biết dựng ramdisk đúng cách 3. Tài liệu hiện hành xác nhận cùng chỗ trượt ấy 4.

Myth: a failed boot means the configuration or the compile was wrong. Fact: his diagnosis is different — it is usually because an initial ramdisk image is needed, and the fix is to fall back on the distribution's install scripts, which know how to build the ramdisk properly 3. Current documentation confirms the same stumbling point 4.

Tự kiểmSelf-check

Tự kiểm trước khi khởi động lại Tự hỏi mình trước khi bật lại máy Self-check before you reboot

Khác các chương trước, chương này để lại một hệ quả vật lý: lần khởi động tới sẽ khác. Hãy trả lời được những câu dưới đây trước khi gõ reboot.

Chương này khác các chương trước: làm xong là lần bật máy tới sẽ khác. Nhớ nhé: trả lời hết mấy câu dưới rồi hãy bật lại máy.

Unlike the earlier chapters, this one leaves a physical consequence: your next boot will be different. Be able to answer the following before you type reboot.

  1. Bạn đã chạy make modules_install trước make install chưa?

    Thứ tự này quan trọng vì bước tạo ramdisk dùng chính các module vừa cài 2.

  2. Trong /boot có tệp nhân mang đúng số phiên bản của nhân bạn vừa dựng không, và nhân cũ có còn nguyên ở đó không?

    Sách đảm bảo việc cài không ghi đè ảnh nhân cũ 2 — nhưng nếu bạn làm tay, chính bạn chịu trách nhiệm đặt tên khác.

  3. Máy bạn dùng bộ nạp khởi động nào, và bạn đã kiểm bằng cách nhìn vào /boot/ hay /etc/lilo.conf chưa?

    Nếu là hệ hiện đại, nhiều khả năng đó là GRUB 2 với grub.cfg sinh tự động 15, hoặc một sơ đồ dựa trên kernel-install 6 — không phải menu.lst của sách.

  4. Mục nhân cũ có còn trong trình đơn khởi động để bạn quay về nếu nhân mới không lên không?
  5. Nếu máy không khởi động được, bạn biết nghi ngờ điều gì đầu tiên?

    Đáp án của sách: thường là thiếu ảnh ramdisk khởi tạo, và cách chữa là dùng script cài của bản phân phối 3.

  6. Bạn đã thoát khỏi phiên root sau khi xong chưa?
  1. Bạn đã cài module trước rồi mới cài nhân chưa?
  2. Trong /boot đã có tệp nhân mới, và nhân cũ vẫn còn chứ?
  3. Máy bạn dùng phần mềm khởi động nào?
  4. Trình đơn khởi động còn dòng nhân cũ để quay về không?
  5. Máy không lên thì bạn nghi ngờ cái gì trước?
  6. Nhớ nhé: xong việc thì thoát khỏi quyền quản trị ngay.
  1. Did you run make modules_install before make install?

    The order matters because the ramdisk step uses the modules just installed 2.

  2. Does /boot hold a kernel file carrying your new kernel's version, with the old one still intact beside it?
  3. Which bootloader does your machine use, and did you check by looking in /boot/ or for /etc/lilo.conf?

    On a modern system it is most likely GRUB 2 with an auto-generated grub.cfg 15, or a kernel-install-based scheme 6 — not the book's menu.lst.

  4. Is the old kernel entry still in the boot menu, so you can fall back if the new one fails?
  5. If the machine does not boot, what do you suspect first?

    The book's answer: usually a missing initial ramdisk image, fixed by using the distribution's install scripts 3.

  6. Have you exited your root session now that you are done?

Đọng lạiWhat remains

Cài một nhân chỉ là ba việc rất nhỏ — đặt module, đặt ảnh nhân, thêm một dòng vào trình đơn — nhưng chúng là ba việc duy nhất trong cả phần đầu cuốn sách cần bạn mượn quyền root. Đổi lại, quy trình tặng bạn một thứ hiếm trong kỹ thuật: một đường lùi vẫn còn nguyên ngay bên cạnh.

Cài nhân chỉ có ba việc nhỏ, nhưng là ba việc duy nhất cần quyền quản trị. Bù lại, nhân cũ vẫn còn đó để bạn quay về. Nhớ nhé: giữ đường lùi thì thử nghiệm mới an toàn.

Installing a kernel is only three small jobs — place the modules, place the image, add one line to the menu — yet they are the only jobs in the whole first part of the book that require you to borrow root. In return, the procedure gives you something rare in engineering: a way back, still intact, right beside you.