Chương 5 · Nhân Linux khởi động thế nào Chapter 5 · How the Linux Kernel Boots
Khởi động không phải một khoảnh khắc — nó là một chuỗi bảy bước bạn có thể chỉ tên Bật máy lên không phải một cú bật — nó là bảy bước nối nhau Booting is not a moment — it is a seven-step sequence you can name
Brian Ward mở chương này bằng một lời hứa rất cụ thể: bạn sẽ học cách nhân di chuyển vào bộ nhớ, và nó làm những gì cho tới thời điểm tiến trình người dùng đầu tiên bắt đầu.1 Ông gói toàn bộ quá trình đó vào một bản tóm tắt bảy bước — từ lúc BIOS hoặc firmware nạp một boot loader, cho tới lúc init dựng phần còn lại của hệ thống dậy.1
Khi bạn bấm nút nguồn, máy không “chạy ngay” đâu. Nó đi qua một chuỗi việc, từng việc một, giống như xếp hàng domino. Máy đánh thức một chương trình nhỏ, chương trình nhỏ đó tìm và đánh thức nhân, nhân đánh thức các thiết bị, rồi cuối cùng nhân mở chương trình đầu tiên cho bạn. Nhớ nhé: bật máy là một chuỗi bảy bước, không phải một cú bấm.
Brian Ward opens this chapter with a very concrete promise: you will learn how the kernel moves into memory, and what it does up to the point where the first user process starts.1 He packs that whole span into a seven-step summary — from the machine's BIOS or boot firmware loading a boot loader, through to init setting the rest of the system processes in motion.1
Ward kèm ngay một lời cảnh báo thực tế, và nó giải thích vì sao chương này khó học bằng cách “ngồi nhìn máy khởi động”: hành vi mặc định của nhiều bản phân phối Linux khiến việc nhận diện vài giai đoạn đầu trở nên khó, nếu không nói là bất khả thi, ngay trong lúc chúng diễn ra — nên bạn thường chỉ nhìn rõ được chúng sau khi chúng đã xong và bạn đã đăng nhập.1 Toàn bộ kỹ thuật trong chương — đọc nhật ký nhân, đọc /proc/cmdline, mở dòng lệnh GRUB — đều là cách xem lại một cuốn phim đã chiếu xong.
Luận đề của chương: giữa “bật nguồn” và “màn hình đăng nhập” có một chuỗi giai đoạn rạch ròi; biết gọi tên từng giai đoạn — firmware, boot loader, nhân, gắn hệ thống tập tin gốc, tiến trình người dùng đầu tiên — là điều sẽ trở nên vô giá khi bạn phải sửa lỗi khởi động và hiểu hệ thống như một tổng thể.1
Ý chính: máy khởi động theo từng chặng. Khi máy không lên, bạn không cần đoán mò — bạn chỉ cần hỏi “nó dừng ở chặng nào?”. Nhớ nhé: biết tên từng chặng là biết chỗ để tìm lỗi.
The chapter's thesis: between "power on" and "login prompt" lies a sequence of distinct stages; being able to identify each one — firmware, boot loader, kernel, root filesystem mount, first user process — will prove invaluable in fixing boot problems and understanding the system as a whole.1
init với PID 1
Nhân dựng máy dậy rồi mở chương trình đầu tiên
Initializes devices, mounts the root filesystem, starts init with PID 1
Cụm khái niệm 01 Concept cluster 01
Chuỗi bảy bước, và những thông điệp nhân để lại phía sau Bảy bước, và dấu vết chúng để lại The seven-step chain, and the messages the kernel leaves behind
Ward bắt đầu bằng một cái nhìn đơn giản hoá về quá trình khởi động, rồi nói rõ chương này chỉ bàn vài giai đoạn đầu, tập trung vào boot loader và nhân; phần khởi động không gian người dùng với systemd được để lại cho Chương 6.1 Cách học tốt nhất là đọc lại dấu vết mà nhân đã ghi vào nhật ký.1
Máy khởi động rất nhanh, nhanh tới mức chữ chạy qua màn hình bạn đọc không kịp. Nhưng máy có ghi nhật ký. Ta sẽ mở nhật ký đó ra xem lại. Nhớ nhé: không xem kịp thì xem lại, máy có ghi hết.
Ward starts with a simplified view of the boot process, then says plainly that this chapter covers only the first couple of stages, focusing on the boot loaders and the kernel; the user space start with systemd is left to Chapter 6.1 The best way to study it is to read back the trail the kernel wrote into its journal.1
Định nghĩa. Khởi động (boot) ở đây có nghĩa hẹp và chính xác: quá trình nhân di chuyển vào bộ nhớ và làm việc của nó cho tới thời điểm tiến trình người dùng đầu tiên bắt đầu.1 Điểm kết thúc của “khởi động nhân” chính là bước 5 trong danh sách của Ward: nhân chạy một chương trình tên init với mã tiến trình bằng 1 — và đó là điểm bắt đầu của không gian người dùng.1
Nói đơn giản. “Khởi động” là đoạn từ lúc nhân được đưa vào bộ nhớ cho tới lúc chương trình đầu tiên chạy. Chương trình đầu tiên đó tên là init, và nó mang số 1. Nhớ nhé: init là số 1 — trước nó là nhân, sau nó là tất cả.
Definition. Booting here has a narrow, precise meaning: the process of the kernel moving into memory and doing its work up to the point where the first user process starts.1 The end of "kernel boot" is step 5 in Ward's list: the kernel starts a program called init with a process ID of 1 — and that point is the user space start.1
1. firmware → boot loader
2. boot loader → nhân vào bộ nhớ
3. nhân → thiết bị + trình điều khiển
4. nhân → gắn hệ thống tập tin gốc
5. nhân → init (PID 1)
6. init → các tiến trình hệ thống
7. init → cho bạn đăng nhập
1. máy gọi người mở cửa
2. người mở cửa gọi nhân
3. nhân bật thiết bị
4. nhân mở ổ đĩa gốc
5. nhân gọi init
6. init gọi phần còn lại
7. init mở màn hình đăng nhập
1. firmware → boot loader
2. boot loader → kernel into memory
3. kernel → devices + drivers
4. kernel → mount root filesystem
5. kernel → init (PID 1)
6. init → system processes
7. init → login
-
boot sequence
Chuỗi khởi động — bảy bước, không phải một khoảnh khắc Bảy bước nối nhau The boot sequence — seven steps, not a moment
Bản tóm tắt của Ward đi như sau: BIOS hoặc firmware khởi động nạp và chạy một boot loader; boot loader tìm ảnh nhân trên đĩa, nạp nó vào bộ nhớ rồi khởi động nó; nhân khởi tạo các thiết bị và trình điều khiển; nhân gắn hệ thống tập tin gốc; nhân chạy
initvới PID 1;initđặt phần còn lại của các tiến trình hệ thống vào chuyển động; và tới một lúc nào đó,initkhởi động một tiến trình cho phép bạn đăng nhập, thường ở cuối hoặc gần cuối chuỗi khởi động.1Bảy bước ấy giống một dây chuyền: mỗi người chỉ làm một việc rồi chuyền cho người kế tiếp. Máy gọi người mở cửa, người mở cửa gọi nhân, nhân bật thiết bị, mở ổ đĩa, rồi gọi chương trình số 1. Chương trình số 1 gọi tất cả những chương trình còn lại, cuối cùng mới tới màn hình đăng nhập. Nhớ nhé: mỗi bước chỉ có một nhiệm vụ, và nó chuyền tiếp cho bước sau.
Ward's summary runs like this: the machine's BIOS or boot firmware loads and runs a boot loader; the boot loader finds the kernel image on disk, loads it into memory and starts it; the kernel initializes the devices and its drivers; the kernel mounts the root filesystem; the kernel starts a program called
initwith a process ID of 1;initsets the rest of the system processes in motion; and at some pointinitstarts a process allowing you to log in, usually at or near the end of the boot sequence.1Bạn gặp nó ở đâuWhere you meet it Mỗi khi máy “treo lúc khởi động”, câu hỏi đầu tiên đáng hỏi không phải “hỏng cái gì” mà là “nó dừng ở bước mấy trong bảy bước này”. Khi máy không lên, hãy hỏi: nó đi được tới bước nào rồi? Whenever a machine "hangs on boot", the first useful question is not "what broke" but "which of these seven steps did it stop at".Ranh giới của chương
Ward nói rõ chương 5 bao phủ vài giai đoạn đầu — boot loader và nhân — còn Chương 6 tiếp tục với khởi động không gian người dùng bằng cách mô tả chi tiết systemd, phiên bản
initphổ biến nhất trên các hệ thống Linux.1Vì sao khó quan sát trực tiếp
Hành vi mặc định của nhiều bản phân phối khiến vài giai đoạn đầu khó, nếu không nói là bất khả thi, để nhận diện ngay lúc chúng diễn ra; bạn thường chỉ nhìn rõ được sau khi chúng đã hoàn tất và bạn đã đăng nhập.1
-
startup messages
Thông điệp khởi động — chẩn đoán bị giấu sau màn hình splash Những dòng chữ chạy vụt qua Startup messages — diagnostics hidden behind a splash screen
Các hệ thống Unix truyền thống sinh ra rất nhiều thông điệp chẩn đoán lúc khởi động: trước hết từ nhân, rồi từ các tiến trình và thủ tục khởi tạo mà
initchạy. Nhưng Ward thẳng thắn nhận xét rằng những thông điệp này không đẹp, không nhất quán, và đôi khi thậm chí không mấy hữu ích.1 Tệ hơn, cải tiến phần cứng khiến nhân khởi động nhanh hơn trước rất nhiều; thông điệp vụt qua nhanh đến mức khó thấy chuyện gì đang xảy ra — nên hầu hết bản phân phối hiện tại cố hết sức giấu chẩn đoán khởi động sau màn hình splash và các loại nội dung lấp chỗ.1Ngày xưa máy vừa bật vừa kể lể: “tôi đang tìm ổ đĩa”, “tôi thấy bàn phím rồi”. Bây giờ máy chạy nhanh quá, chữ vụt qua không đọc kịp, nên người ta che lại bằng một bức ảnh đẹp cho đỡ sốt ruột. Chữ vẫn còn đó, chỉ là bị che thôi. Nhớ nhé: chữ không mất, nó chỉ bị bức ảnh che mặt.
Traditional Unix systems produce many diagnostic messages at boot: first from the kernel, then from the processes and initialization procedures that
initstarts. But Ward is blunt that these messages aren't pretty or consistent, and in some cases aren't even very informative.1 Worse, hardware improvements have made the kernel start much faster than before; the messages flash by so quickly it can be difficult to see what's happening — so most current distributions do their best to hide boot diagnostics behind splash screens and other filler.1Bạn gặp nó ở đâuWhere you meet it Màn hình logo mượt mà lúc khởi động chính là “nội dung lấp chỗ” mà Ward nói tới; nó không làm máy nhanh hơn, chỉ làm bạn bớt nhìn thấy. Cái logo đẹp lúc bật máy chính là bức ảnh che chữ. That smooth logo screen at boot is exactly the "filler" Ward describes; it doesn't make the machine faster, it just makes you see less.Sau khi nhân xong việc
Thủ tục khởi động không gian người dùng cũng sinh thông điệp, và chúng khó xem lại hơn vì trên hầu hết hệ thống bạn sẽ không tìm thấy chúng trong một tệp nhật ký duy nhất; các kịch bản khởi động được thiết kế để gửi thông điệp ra console rồi bị xoá sau khi khởi động xong. Ward nói điều này không thành vấn đề trên hệ thống Linux vì systemd bắt lại các thông điệp chẩn đoán lúc khởi động và lúc chạy mà lẽ ra đã ra thẳng console.1
-
journalctl -k
Nhật ký nhân — cách xem lại cuốn phim đã chiếu Mở sổ ghi chép của nhân The kernel journal — replaying a film that already ran
Cách tốt nhất để xem thông điệp chẩn đoán lúc khởi động và lúc chạy của nhân, theo Ward, là lấy nhật ký dành cho nhân bằng lệnh
journalctl: chạyjournalctl -ksẽ hiển thị thông điệp của lần khởi động hiện tại, còn tuỳ chọn-bcho phép bạn xem các lần khởi động trước.12 Nếu máy bạn không có systemd, ông chỉ hai lối thoát: tìm một tệp nhật ký như/var/log/kern.log, hoặc chạydmesgđể xem thông điệp trong vùng đệm vòng của nhân (kernel ring buffer).13Muốn đọc lại những dòng chữ bị che, bạn gõ
journalctl -k. Máy sẽ in ra đúng những gì nhân đã nói lúc khởi động. Nếu máy bạn kiểu cũ, gõdmesgcũng được. Nhớ nhé: journalctl -k là nút “tua lại” của nhân.The best way to view the kernel's boot and runtime diagnostic messages, Ward says, is to retrieve the journal for the kernel with
journalctl: runningjournalctl -kdisplays the messages from the current boot, while the-boption lets you view previous boots.12 If you don't have systemd, he offers two escapes: look for a logfile such as/var/log/kern.log, or rundmesgto view the messages in the kernel ring buffer.13Bạn gặp nó ở đâuWhere you meet it Khi một thiết bị “không được nhận”, dòng nhật ký nhân lúc khởi động thường nói thẳng lý do — trước cả khi bạn kịp đoán. Khi cắm thiết bị mà máy không thấy, hãy mở nhật ký ra đọc. When a device "isn't detected", the kernel's boot log usually states the reason outright — before you have a chance to guess.Hẹn ở chương sau
Ward chỉ dùng
journalctlở đây như một công cụ đọc, và hẹn bàn kỹ về nhật ký (the journal) trong Chương 7.1 -
kernel initialization
Thứ tự khởi tạo — và bài toán phụ thuộc ở giữa Nhân làm việc theo thứ tự Initialization order — and the dependency problem in the middle
Ward liệt kê thứ tự tổng quát mà nhân Linux khởi tạo: kiểm tra CPU, kiểm tra bộ nhớ, dò bus thiết bị, dò thiết bị, thiết lập các hệ thống con phụ trợ (mạng và những thứ tương tự), gắn hệ thống tập tin gốc, rồi khởi động không gian người dùng.1 Hai bước đầu không có gì đáng chú ý, nhưng khi nhân chạm tới thiết bị thì câu hỏi về phụ thuộc nảy sinh: trình điều khiển thiết bị đĩa có thể phụ thuộc vào hỗ trợ bus và hỗ trợ hệ thống con SCSI.1
Nhân làm việc có thứ tự: xem CPU, xem bộ nhớ, tìm các đường nối, tìm thiết bị, bật mạng, mở ổ đĩa gốc, rồi mới gọi chương trình đầu tiên. Rắc rối nằm ở chỗ có thứ phải có trước thì thứ sau mới chạy được — giống như phải có đường thì xe mới đi được. Nhớ nhé: thứ tự quan trọng, vì cái sau cần cái trước.
Ward lists the general order in which the Linux kernel initializes: CPU inspection, memory inspection, device bus discovery, device discovery, auxiliary kernel subsystem setup (networking and the like), root filesystem mount, and user space start.1 The first two steps aren't too remarkable, but when the kernel gets to devices the question of dependencies arises: disk device drivers may depend on bus support and SCSI subsystem support.1
Bạn gặp nó ở đâuWhere you meet it Một máy “không tìm thấy hệ thống tập tin gốc” gần như luôn là một máy thiếu đúng một mô-đun ở bước dò thiết bị. Máy báo “không tìm thấy ổ đĩa gốc” thường là vì thiếu một mảnh trình điều khiển. A machine that "cannot find the root filesystem" is almost always a machine missing exactly one module at the device-discovery step.Vì sao cần initrd
Ward nói nhìn chung bạn không phải lo về phụ thuộc, trừ việc một số thành phần cần thiết có thể là mô-đun nhân nạp được chứ không phải phần của nhân chính; một số máy cần nạp các mô-đun đó trước khi hệ thống tập tin gốc thật sự được gắn. Ông hẹn giải quyết bài toán này và giải pháp chữa cháy bằng hệ thống tập tin RAM ban đầu (initrd) ở Mục 6.7.118
Dấu hiệu nhân sắp trao quyền
Nhân phát ra vài loại thông điệp báo rằng nó đang chuẩn bị khởi động tiến trình người dùng đầu tiên — trong đó có
Freeing unused kernel memoryvàWrite protecting the kernel read-only data. Ward chỉ ra rằng ở đây nhân không chỉ dọn bộ nhớ không dùng, mà còn bảo vệ dữ liệu của chính nó.1 -
Run /init as init process
Lằn ranh — dòng nhật ký nói rằng không gian người dùng đã bắt đầu Dòng chữ báo “xong phần nhân” The boundary — the log line that says user space has started
Sau các thông điệp dọn dẹp bộ nhớ, nếu bạn chạy một nhân đủ mới, bạn sẽ thấy nhân khởi động tiến trình không gian người dùng đầu tiên với dòng
Run /init as init process.1 Muộn hơn nữa, bạn sẽ thấy hệ thống tập tin gốc được gắn và systemd khởi động, tự gửi vài thông điệp của nó vào nhật ký nhân — ví dụ dòngsystemd[1]: Detected architecture x86-64.Tới điểm này, Ward viết, bạn chắc chắn biết rằng không gian người dùng đã bắt đầu.1Trong nhật ký có một dòng đánh dấu “hết phần nhân, bắt đầu phần chương trình”. Thấy dòng đó là bạn biết nửa đầu đã xong trót lọt. Nhớ nhé: tìm dòng nói về init — đó là vạch phân chia.
After the memory-cleanup messages, if you're running a new enough kernel you'll see it start the first user-space process with the line
Run /init as init process.1 Later still you'll see the root filesystem mounted and systemd starting up, sending a few messages of its own to the kernel log — for instancesystemd[1]: Detected architecture x86-64.At this point, Ward writes, you definitely know that user space has started.1Bạn gặp nó ở đâuWhere you meet it Nếu nhật ký của bạn dừng trước dòng này, lỗi nằm ở nhân hoặc ở hệ thống tập tin gốc; nếu nó dừng sau, lỗi thuộc về không gian người dùng — và là chuyện của Chương 6. Nhật ký dừng trước dòng đó thì lỗi ở nhân; dừng sau thì lỗi ở chương trình. If your log stops before this line, the fault lies in the kernel or the root filesystem; if it stops after, the fault belongs to user space — and to Chapter 6.Con số 1
initmang mã tiến trình 1 không phải ngẫu nhiên: nó là tiến trình người dùng đầu tiên nhân tạo ra, nên nó nhận số nhỏ nhất, và mọi tiến trình khác trên máy đều là hậu duệ của nó.1
Cụm khái niệm 02 Concept cluster 02
Tham số nhân: một dòng văn bản, và tất cả những gì nó quyết định Dòng chữ dặn dò nhân Kernel parameters: one line of text, and everything it decides
Khi nhân Linux khởi động, nó nhận một tập tham số nhân dạng văn bản chứa vài chi tiết hệ thống bổ sung. Các tham số này quy định nhiều kiểu hành vi khác nhau — chẳng hạn lượng đầu ra chẩn đoán mà nhân nên sinh ra, và các tuỳ chọn riêng của từng trình điều khiển thiết bị.1
Trước khi chạy, nhân được đưa cho một mẩu giấy dặn dò: “ổ đĩa gốc ở chỗ này nhé”, “đừng nói nhiều quá nhé”. Mẩu giấy đó là tham số nhân. Nhớ nhé: nhân nhận một mẩu giấy dặn dò trước khi làm việc.
When the Linux kernel starts, it receives a set of text-based kernel parameters containing a few additional system details. They specify many different types of behavior — such as how much diagnostic output the kernel should produce, and device driver–specific options.1
Định nghĩa. Tham số nhân hoặc là cờ một từ như ro và quiet, hoặc là cặp khoá=giá trị như vt.handoff=1.1 Bạn xem các tham số đã được truyền cho nhân đang chạy bằng cách đọc tệp /proc/cmdline.16
Nói đơn giản. Tham số có hai kiểu: một từ trơ trọi (như ro), hoặc kiểu “tên bằng giá trị” (như root=…). Muốn xem máy mình đang dùng gì thì gõ cat /proc/cmdline. Nhớ nhé: /proc/cmdline là mẩu giấy dặn dò của máy bạn.
Definition. Kernel parameters are either simple one-word flags such as ro and quiet, or key=value pairs such as vt.handoff=1.1 You view the parameters passed to your currently running kernel by reading the /proc/cmdline file.16
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-…
root=UUID=…
ro quiet splash
vt.handoff=1
gõ: cat /proc/cmdline
→ máy in ra mẩu giấy
root = ổ đĩa gốc
ro = chỉ đọc
quiet = nói ít thôi
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-…
root=UUID=…
ro quiet splash
vt.handoff=1
-
root=
root= — tham số không thể thiếu root= — chỉ cho nhân ổ đĩa gốc root= — the one parameter you cannot omit
Nhiều tham số không quan trọng — Ward lấy ví dụ cờ
splashđể hiện màn hình splash — nhưng một tham số then chốt làroot: nó là vị trí của hệ thống tập tin gốc, và không có nó, nhân không thể thực hiện khởi động không gian người dùng một cách đúng đắn.14Trong mẩu giấy dặn dò, có một dòng bắt buộc phải có:
root=. Nó chỉ cho nhân biết ổ đĩa nào chứa hệ điều hành. Thiếu dòng này thì nhân không biết đi đâu, và máy không lên được. Nhớ nhé: root= là địa chỉ nhà — thiếu nó thì nhân lạc đường.Many parameters are unimportant — Ward's example is the
splashflag for displaying a splash screen — but one that is critical isroot: it is the location of the root filesystem, and without it the kernel cannot properly perform the user space start.14Bạn gặp nó ở đâuWhere you meet it Thông điệp hoảng loạn kiểu “unable to mount root fs” hầu như luôn là mộtroot=trỏ sai chỗ — hoặc một trình điều khiển chưa kịp có mặt để đọc chỗ đó. Máy báo không mở được ổ đĩa gốc thường là do dòng root= trỏ sai. A panic reading "unable to mount root fs" is almost always aroot=pointing at the wrong place — or a driver not yet present to read that place.Ba cách viết
Hệ thống tập tin gốc có thể được chỉ định bằng tệp thiết bị (
root=/dev/sda1), nhưng trên hầu hết hệ thống đương đại có hai lựa chọn phổ biến hơn: một ổ luận lý nhưroot=/dev/mapper/my-system-root, hoặc một UUID nhưroot=UUID=…. Ward nói rõ cả hai lựa chọn sau đều đáng chuộng hơn vì chúng không phụ thuộc vào một ánh xạ thiết bị cụ thể của nhân.1Đối chiếu với tài liệu nhân
Trang
bootparam(7)xác nhậnroot=nằm trong nhóm đối số đặc biệt mà nhân kiểm tra trước tiên, cùng vớiro,rw,debugvàinit.4 -
ro
ro — gắn chỉ đọc để fsck làm việc an toàn ro — mở ổ đĩa ở chế độ chỉ xem ro — mount read-only so fsck can work safely
Tham số
rochỉ thị nhân gắn hệ thống tập tin gốc ở chế độ chỉ đọc khi khởi động không gian người dùng. Ward nhấn mạnh đây là chuyện bình thường: chế độ chỉ đọc bảo đảmfsckcó thể kiểm tra hệ thống tập tin gốc một cách an toàn trước khi bất cứ việc nghiêm trọng nào được thực hiện. Sau khi kiểm tra xong, tiến trình khởi động gắn lại hệ thống tập tin gốc ở chế độ đọc-ghi.15Lúc mới mở ổ đĩa, máy mở ở chế độ “chỉ xem, không sửa”. Lý do rất hợp lý: để một chương trình đi kiểm tra sức khoẻ ổ đĩa trong lúc không ai đụng vào. Kiểm tra xong, máy mới mở lại cho phép ghi. Nhớ nhé: khám sức khoẻ thì bệnh nhân phải nằm yên.
The
roparameter instructs the kernel to mount the root filesystem read-only upon user space start. Ward stresses this is normal: read-only mode ensuresfsckcan check the root filesystem safely before anything serious is attempted. After the check, the bootup process remounts the root filesystem read-write.15Bạn gặp nó ở đâuWhere you meet it Khi một máy hỏng nửa chừng và “rơi” vào shell cứu hộ với hệ thống tập tin gốc chỉ đọc, bạn đang đứng đúng ở khoảnh khắc trước lần gắn lại đọc-ghi. Khi máy lỗi và chỉ cho xem chứ không cho sửa, đó là lúc nó đang ở chế độ ro. When a machine breaks mid-boot and drops into a rescue shell with a read-only root, you are standing exactly at the moment before the read-write remount.Tài liệu nói gì thêm
bootparam(7)mô tả cùng một cơ chế và nói rõ chi tiết mà Ward lướt qua: không tiến trình nào có thể ghi vào các tệp trên hệ thống tập tin đó cho tới khi nó được gắn lại ở chế độ đọc-ghi — ví dụ bằngmount -w -n -o remount /. Tham số đối lậprwgắn ngay ở chế độ đọc-ghi.4Vì sao fsck cần đĩa “đứng yên”
fscksửa cấu trúc siêu dữ liệu trong khi đọc nó; nếu một tiến trình khác ghi song song, công cụ kiểm tra có thể sửa dựa trên một bức ảnh đã lỗi thời và làm hỏng thêm. Trang hướng dẫnfsck(8)cùng cách đọc đó.5 -
unrecognized parameters
Tham số lạ — nhân không vứt đi, nhân chuyển tiếp cho init Chữ nhân không hiểu thì nhân chuyển cho người khác Unknown parameters — the kernel doesn't discard them, it forwards them to init
Đây là chi tiết dễ bỏ sót nhất trong mục này. Khi gặp một tham số nó không hiểu, nhân Linux lưu lại tham số đó, rồi chuyển cho
initkhi thực hiện khởi động không gian người dùng. Ward lấy ví dụ: nếu bạn thêm-svào tham số nhân, nhân chuyển-ssang chương trìnhinitđể báo rằng nó nên khởi động ở chế độ một người dùng (single-user mode).1Nếu trong mẩu giấy có chữ nhân không hiểu, nhân không xé bỏ. Nó cất đi, rồi đưa lại cho chương trình số 1 — biết đâu chương trình đó hiểu. Nhớ nhé: không hiểu thì chuyển tiếp, đừng vứt.
This is the easiest detail in the section to miss. Upon encountering a parameter it doesn't understand, the Linux kernel saves that parameter and later passes it to
initwhen performing the user space start. Ward's example: add-sto the kernel parameters and the kernel passes the-salong to theinitprogram to indicate it should start in single-user mode.1Bạn gặp nó ở đâuWhere you meet it Đây là cơ chế đằng sau mọi mẹo “sửa máy hỏng” kiểu thêm một từ vào dòng GRUB rồi nhấn khởi động. Đây là lý do thêm một chữ vào dòng GRUB có thể cứu một máy hỏng. This is the mechanism behind every "rescue a broken machine" trick that adds a word to the GRUB line and boots.Quy tắc phân loại chính xác
Tài liệu nhân nói rõ hơn Ward một bậc về cách chuyển tiếp: tham số có dấu
=đi vào môi trường củainit, còn các tham số khác được truyền làm đối số dòng lệnh choinit; mọi thứ sau--được truyền làm đối số choinit.7Biến thể
singlebootparam(7)mô tả cùng cơ chế nhưng nêu đối số phổ biến nhất được truyền cho tiến trình init là từsingle, chỉ thị nó khởi động ở chế độ một người dùng và không chạy các dịch vụ thông thường.4 Ward nêu-s; cả hai đều là cách quen thuộc để yêu cầu cùng một chế độ, và cái nào hiệu lực phụ thuộc vào phiên bảninittrên máy bạn — chínhbootparam(7)khuyên tra trang hướng dẫn củainitđang cài để biết nó nhận đối số nào.14 -
bootparam(7)
Tra cứu ở đâu — hai địa chỉ Ward chỉ tên Muốn tra thì tra ở đâu Where to look it up — the two addresses Ward names
Ward đưa hai chỉ dẫn tra cứu rất cụ thể. Nếu bạn quan tâm tới các tham số khởi động cơ bản, trang hướng dẫn
bootparam(7)cho một cái nhìn tổng quan. Còn nếu bạn tìm thứ gì rất cụ thể, hãy xem kernel-params.txt, tệp tham chiếu đi kèm mã nguồn nhân Linux.147Không ai nhớ hết tham số đâu. Có hai cuốn từ điển: một cuốn ngắn là
bootparam(7), một cuốn rất dài đi kèm mã nguồn nhân. Cần thì tra. Nhớ nhé: không cần thuộc, chỉ cần biết tra ở đâu.Ward gives two very specific lookup pointers. If you're interested in the basic boot parameters, the
bootparam(7)manual page gives an overview. If you're looking for something very specific, check kernel-params.txt, a reference file that ships with the Linux kernel.147Bạn gặp nó ở đâuWhere you meet it Mỗi lần một hướng dẫn trên mạng bảo bạn “thêm tham số X vào GRUB”, bạn nên tra X trong một trong hai nguồn này trước khi gõ. Trước khi làm theo hướng dẫn trên mạng, hãy tra xem tham số đó là gì. Every time a guide online tells you to "add parameter X to GRUB", look X up in one of these two sources before you type it.Tệp tham chiếu hôm nay
Tệp mà Ward gọi là kernel-params.txt ngày nay được xuất bản trong tài liệu nhân dưới tên “The kernel's command-line parameters” — danh sách đầy đủ theo từng tham số, kèm ghi chú kiến trúc.7
Một giới hạn đáng biết
Tài liệu đó cũng nêu một ràng buộc thực tế mà Ward không nhắc: số lượng tham số nhân không bị giới hạn, nhưng độ dài của toàn bộ dòng lệnh (bao gồm cả khoảng trắng) thì có giới hạn.7
Cụm khái niệm 03 Concept cluster 03
Boot loader: bài toán “con gà và quả trứng”, và GRUB giải nó thế nào Người mở cửa và thế khó của nó The boot loader: a chicken-and-egg problem, and how GRUB solves it
Công việc của boot loader nghe có vẻ đơn giản: nạp nhân vào bộ nhớ từ đâu đó trên đĩa rồi khởi động nhân với một tập tham số. Nhưng Ward lập tức nói rõ công việc này phức tạp hơn vẻ ngoài, và để thấy vì sao, hãy nhìn hai câu hỏi mà boot loader buộc phải trả lời: nhân ở đâu? và tham số nào nên được truyền cho nhân khi nó khởi động?1
Người mở cửa chỉ phải làm hai việc: tìm nhân, và đưa cho nhân mẩu giấy dặn dò. Nghe dễ, nhưng khó ở chỗ cả hai thứ đó đều nằm trên ổ đĩa — mà lúc đó chưa ai biết cách đọc ổ đĩa cả. Nhớ nhé: chìa khoá nằm trong nhà bị khoá — đó là thế khó.
The boot loader's job sounds simple: load the kernel into memory from somewhere on a disk, then start it with a set of kernel parameters. But Ward says at once that the job is more complicated than it appears, and to see why, look at the two questions the boot loader must answer: where is the kernel? and what kernel parameters should be passed to the kernel when it starts?1
Thế khó. Câu trả lời thường là: nhân và tham số của nó nằm đâu đó trên hệ thống tập tin gốc. Nghe dễ, nhưng — Ward nhắc — bản thân nhân chưa chạy, và chính nhân mới là thứ thường đi xuyên hệ thống tập tin để tìm các tệp cần thiết. Tệ hơn, các trình điều khiển thiết bị của nhân thường dùng để truy cập đĩa cũng chưa sẵn sàng. Ông gọi đây là một kiểu bài toán “con gà hay quả trứng”.1
Nói đơn giản. Muốn đọc ổ đĩa thì cần nhân. Muốn có nhân thì phải đọc ổ đĩa. Vòng luẩn quẩn! Người mở cửa phải thoát ra bằng một lối khác. Nhớ nhé: cần A mới có B, cần B mới có A — phải có lối thứ ba.
The bind. The answers are typically that the kernel and its parameters live somewhere on the root filesystem. That sounds easy, but — Ward reminds you — the kernel itself is not yet running, and it's the kernel that usually traverses a filesystem to find the necessary files. Worse, the kernel device drivers normally used to access the disk are also unavailable. He calls it a kind of "chicken or egg" problem.1
boot loader cần:
1. đọc được đĩa → BIOS/UEFI + LBA
2. đọc được bảng phân vùng
3. đọc được hệ thống tập tin
(chỉ đọc là đủ)
người mở cửa cần:
1. cách đọc đĩa (mượn của máy)
2. biết đĩa chia làm mấy phần
3. biết đọc tên tệp
a boot loader needs:
1. disk access → BIOS/UEFI + LBA
2. to read partition tables
3. to read filesystems
(read-only suffices)
-
LBA
Lối thoát: mượn trình điều khiển của firmware Mượn tay của máy để đọc đĩa The escape: borrow the firmware's driver
Boot loader có cần một trình điều khiển để truy cập đĩa, nhưng không phải trình điều khiển mà nhân dùng. Trên PC, boot loader dùng BIOS truyền thống hoặc UEFI mới hơn để truy cập đĩa.1 Phần cứng đĩa đương đại có firmware cho phép BIOS hoặc UEFI truy cập thiết bị lưu trữ gắn kèm qua Logical Block Addressing (LBA) — một cách phổ quát, đơn giản để lấy dữ liệu từ bất kỳ đĩa nào, nhưng hiệu năng kém.18
Người mở cửa không tự đọc đĩa được, nên nó mượn tay của máy. Cách mượn này chậm, nhưng dùng được với mọi ổ đĩa — mà nó chỉ cần đọc một lần thôi nên chậm cũng không sao. Nhớ nhé: chậm mà chắc, dùng một lần rồi thôi.
A boot loader does need a driver to access the disk, but not the one the kernel uses. On PCs, boot loaders use the traditional BIOS or the newer UEFI to access disks.1 Contemporary disk hardware includes firmware allowing BIOS or UEFI to reach attached storage via Logical Block Addressing (LBA) — a universal, simple way to read data from any disk, but with poor performance.18
Bạn gặp nó ở đâuWhere you meet it Đây là lý do menu GRUB luôn chậm hơn cảm giác của bạn về tốc độ máy: lúc đó máy đang đọc đĩa bằng lối đi phổ quát nhưng chậm. Đó là lý do lúc khởi động ổ đĩa chạy chậm hơn bình thường. This is why the GRUB menu always feels slower than the machine you know: the disk is being read through the universal-but-slow path.Vì sao chậm không thành vấn đề
Ward giải thích: boot loader thường là chương trình duy nhất phải dùng chế độ này để truy cập đĩa; sau khi khởi động, nhân có các trình điều khiển hiệu năng cao của riêng nó.1
Đọc được hệ thống tập tin
Sau khi giải quyết được việc đọc dữ liệu thô, boot loader còn phải tự định vị dữ liệu trên hệ thống tập tin. Hầu hết boot loader phổ biến đọc được bảng phân vùng và có hỗ trợ tích hợp cho truy cập chỉ đọc tới các hệ thống tập tin. Ward lưu ý boot loader Linux không phải lúc nào cũng có khả năng này — và khi chưa có, việc cấu hình boot loader khó hơn nhiều.1
-
boot loader tasks
Bốn khả năng cốt lõi của một boot loader Linux Người mở cửa phải làm được bốn việc The four core abilities of a Linux boot loader
Ward liệt kê chức năng cốt lõi: chọn trong nhiều nhân; chuyển giữa các tập tham số nhân; cho phép người dùng ghi đè và sửa thủ công tên ảnh nhân cùng tham số (ví dụ để vào chế độ một người dùng); và hỗ trợ khởi động các hệ điều hành khác.1 Boot loader đã tiến xa nhiều kể từ khi nhân Linux ra đời — với lịch sử dòng lệnh, hệ thống menu — nhưng một nhu cầu cơ bản luôn không đổi: sự linh hoạt trong việc chọn ảnh nhân và tham số.1
Người mở cửa phải làm được bốn việc: chọn được nhiều nhân khác nhau, đổi được mẩu giấy dặn dò, cho bạn sửa tay lúc cần, và mở được cả hệ điều hành khác. Nhớ nhé: bốn việc, và việc quan trọng nhất là cho bạn quyền chọn.
Ward lists the core functionality: select from multiple kernels; switch between sets of kernel parameters; allow the user to manually override and edit kernel image names and parameters (for example, to enter single-user mode); and provide support for booting other operating systems.1 Boot loaders have advanced considerably since the kernel's inception — command-line history, menu systems — but one basic need has never changed: flexibility in kernel image and parameter selection.1
Bạn gặp nó ở đâuWhere you meet it Danh sách “Advanced options” trong menu GRUB sau một lần cập nhật nhân chính là khả năng thứ nhất đang hiện hình. Danh sách nhiều phiên bản trong menu khởi động chính là khả năng “chọn nhân”. The "Advanced options" list in the GRUB menu after a kernel update is ability number one, made visible.Một nhu cầu đã teo lại
Ward ghi nhận một hiện tượng ông gọi là đáng ngạc nhiên: một số nhu cầu thực ra đã giảm đi. Vì bạn có thể thực hiện khởi động khẩn cấp hoặc phục hồi từ một thiết bị lưu trữ USB, bạn hiếm khi phải lo việc nhập tay tham số nhân hay vào chế độ một người dùng.1
Một quy luật lặp lại
Ông nêu một mô thức chung của lịch sử: nhân thêm tính năng mới (đặc biệt trong công nghệ lưu trữ), rồi boot loader thêm các phiên bản riêng, đơn giản hoá của những tính năng đó để bù lại.1
-
GRUB
GRUB — thế giới riêng có “nhân” và
insmodcủa chính nó GRUB — một thế giới riêng, đừng nhầm với Linux GRUB — a separate world with its own "kernel" andinsmodGRUB là viết tắt của Grand Unified Boot Loader; Ward bàn về GRUB 2, và nhắc rằng có một phiên bản cũ hơn gọi là GRUB Legacy nay không còn được dùng tích cực.19 Điểm gây nhầm lẫn lớn nhất, theo ông, là GRUB không dùng nhân Linux — nhiệm vụ của nó là khởi động nhân. Cấu hình bạn thấy hoàn toàn gồm các tính năng và lệnh nội tại của GRUB, tồn tại trong thế giới riêng của nó: GRUB có “nhân” của riêng mình và lệnh
insmodcủa riêng mình để nạp động các mô-đun GRUB, hoàn toàn độc lập với nhân Linux.1GRUB là tên người mở cửa phổ biến nhất trên Linux. Nó có một điều dễ làm bạn rối: nó dùng nhiều từ giống Linux — cũng có “nhân”, cũng có lệnh
ls, cũng cóinsmod— nhưng đó là đồ của riêng nó, không phải của Linux. Nhớ nhé: cùng tên, khác người.GRUB stands for Grand Unified Boot Loader; Ward covers GRUB 2, noting there is an older version called GRUB Legacy no longer in active use.19 The biggest source of confusion, he says, is that GRUB does not use the Linux kernel — its job is to start the kernel. The configuration you see consists wholly of features and commands internal to GRUB, which exists in its own separate world: GRUB has its own "kernel" and its own
insmodcommand for dynamically loading GRUB modules, completely independent of the Linux kernel.1Bạn gặp nó ở đâuWhere you meet it Khi bạn nhấneở menu GRUB và thấyinsmod ext2, đừng đi tìm mô-đun nhân Linux cùng tên — đó là mô-đun của GRUB. Thấy chữinsmodtrong màn hình GRUB thì đừng đi tìm nó trong Linux. When you presseat the GRUB menu and seeinsmod ext2, don't go hunting for a Linux kernel module of that name — it's GRUB's own.Vào menu bằng cách nào
Ward chỉ cách rất cụ thể: nhấn và giữ
SHIFTkhi màn hình khởi động BIOS lần đầu xuất hiện, hoặcESCnếu hệ thống của bạn dùng UEFI; nếu không, cấu hình boot loader có thể không dừng lại trước khi nạp nhân. Ở menu, nhấneđể xem các lệnh cấu hình của lựa chọn khởi động mặc định, vàcđể vào dòng lệnh GRUB.1Hai chữ “root” khác nhau
Nhầm lẫn lớn nhất, theo Ward, đến từ cách GRUB dùng từ root. Trong cấu hình GRUB,
root=nằm sau tên ảnh nhân của lệnhlinuxlà tham số nhân. Mọi tham chiếurootkhác là GRUB root — thứ chỉ tồn tại bên trong GRUB, và là hệ thống tập tin nơi GRUB tìm các tệp ảnh nhân và ảnh hệ thống tập tin RAM.1 -
(hd0,msdos1)
Dòng lệnh GRUB — lược đồ địa chỉ thiết bị riêng GRUB gọi tên ổ đĩa theo kiểu của nó The GRUB command line — its own device-addressing scheme
GRUB có lược đồ địa chỉ thiết bị riêng: đĩa cứng đầu tiên tìm thấy được đặt tên
hd0, rồihd1, v.v.19 Ward lưu ý việc gán tên thiết bị có thể thay đổi, nhưng may mắn là GRUB có thể tìm UUID trên mọi phân vùng để xác định phân vùng chứa nhân — đó là việc lệnhsearchlàm.1 Tiền tốmsdostrên tên phân vùng cho bạn biết đĩa mang bảng phân vùng MBR; nó sẽ bắt đầu bằnggptnếu là GPT, thứ tìm thấy trên hệ thống UEFI.1GRUB gọi ổ đĩa đầu tiên là
hd0, ổ thứ hai làhd1. Phần bên trong ổ thì thêm tên nữa, ví dụ(hd0,msdos1). Chữmsdoshaygptcho biết đĩa được chia theo kiểu cũ hay kiểu mới. Nhớ nhé: hd0 là ổ đầu tiên, số sau dấu phẩy là phần thứ mấy.GRUB has its own device-addressing scheme: the first hard disk found is named
hd0, thenhd1, and so on.19 Ward notes device name assignments are subject to change, but fortunately GRUB can search all partitions for UUIDs to find the one where the kernel resides — that's what thesearchcommand does.1 Themsdosprefix on a partition tells you the disk carries an MBR partition table; it would begin withgptfor GPT, found on UEFI systems.1Bạn gặp nó ở đâuWhere you meet it Khi máy không khởi động, dòng lệnh GRUB là nơi bạn kiểm chứng giả thuyết “đĩa còn đọc được không” trước khi nghi ngờ bất cứ thứ gì khác. Máy không lên thì vào dòng lệnh GRUB gõlsxem đĩa còn thấy không. When a machine won't boot, the GRUB command line is where you test the hypothesis "is the disk still readable" before suspecting anything else.Hai nghĩa của
lsWard chỉ ra
lstrong GRUB có hai chức năng hoàn toàn khác nhau. Không đối số, nó liệt kê các thiết bị GRUB biết. Với một đường dẫn kết thúc bằng dấu gạch chéo — ví dụls ($root)/— nó liệt kê nội dung của hệ thống tập tin. Ông cũng cho biếtls -lđặc biệt hữu ích vì nó hiển thị UUID của các hệ thống tập tin phân vùng.19Hai biến quan trọng
Lệnh
echo $rootcho biết GRUB root hiện tại. Lệnhsetliệt kê mọi biến GRUB đang đặt; trong số đó, Ward nhấn mạnh$prefix— hệ thống tập tin và thư mục nơi GRUB mong tìm thấy cấu hình và phần hỗ trợ phụ trợ của nó.1 -
grub-mkconfig
Cấu hình — đừng sửa
grub.cfg, hãy sinh ra nó Đừng sửa tay tệp cấu hình Configuration — don't editgrub.cfg, generate itThư mục cấu hình GRUB thường là
/boot/grubhoặc/boot/grub2; nó chứa tệp cấu hình trung tâmgrub.cfg, một thư mục theo kiến trúc nhưi386-pcchứa các mô-đun nạp được với đuôi.mod, cùng vài thứ khác như phông chữ và thông tin bản địa hoá.1 Nguyên tắc của Ward rất dứt khoát: đừng sửa trực tiếpgrub.cfg, vì nó được sinh tự động và hệ thống thỉnh thoảng ghi đè lên nó; thay vào đó hãy dùnggrub-mkconfig(hoặcgrub2-mkconfigtrên Fedora).111Tệp cấu hình của GRUB trông như để bạn sửa, nhưng đừng. Nó được máy viết ra, và lần sau máy sẽ viết lại, xoá hết chữ của bạn. Muốn đổi thì đổi chỗ khác rồi bảo máy viết lại. Nhớ nhé: đừng sửa bản in, hãy sửa bản gốc.
The GRUB configuration directory is usually
/boot/grubor/boot/grub2; it holds the centralgrub.cfg, an architecture-specific directory such asi386-pccontaining loadable modules with a.modsuffix, and a few other items such as fonts and localization data.1 Ward's rule is categorical: don't editgrub.cfgdirectly, because it's automatically generated and the system occasionally overwrites it; usegrub-mkconfiginstead (orgrub2-mkconfigon Fedora).111Bạn gặp nó ở đâuWhere you meet it Mỗi lần bản cập nhật nhân “xoá mất” tuỳ chỉnh khởi động của bạn, đó chính là quy tắc này bị bỏ qua. Cập nhật xong mà mất hết chỉnh sửa — là vì đã sửa nhầm chỗ. Every time a kernel update "erases" your boot tweak, this rule was the one that got skipped.Cấu hình được sinh ra thế nào
Gần như mọi tệp trong
/etc/grub.dlà một kịch bản shell sinh ra một mẩu củagrub.cfg; bản thângrub-mkconfigcũng là một kịch bản shell chạy mọi thứ trong/etc/grub.d. Ward nhấn mạnh điều then chốt: GRUB không chạy các kịch bản này lúc khởi động — ta chạy chúng trong không gian người dùng để sinh ra tệpgrub.cfgmà GRUB sẽ chạy.111Tuỳ chỉnh ở đâu
Câu trả lời ngắn của Ward: đặt tuỳ chỉnh vào một tệp
custom.cfgmới trong thư mục cấu hình GRUB (thường là/boot/grub/custom.cfg). Câu trả lời dài:/etc/grub.dcho hai lựa chọn —40_custom, tệp bạn tự sửa nhưng kém ổn định nhất vì một lần nâng cấp gói nhiều khả năng sẽ phá hỏng thay đổi của bạn; và41_custom, đơn giản hơn, chỉ là một chuỗi lệnh nạpcustom.cfgkhi GRUB khởi động.1 -
grub-install
Cài đặt — khó hơn cấu hình, và nguy hiểm hơn Cài GRUB — việc cần cẩn thận Installation — harder than configuration, and riskier
Ward nói thẳng: cài đặt GRUB phức tạp hơn cấu hình nó, nhưng may mắn là bạn thường không phải lo vì bản phân phối của bạn đã lo hộ. Bạn chỉ cần tự làm khi đang nhân bản hoặc phục hồi một đĩa khởi động được, hoặc chuẩn bị chuỗi khởi động của riêng mình.1 Nhiệm vụ của bạn, ông mô tả, là dựng một phiên bản GRUB đọc được hệ thống tập tin chứa thư mục GRUB, để nó có thể nạp phần còn lại của cấu hình và các mô-đun cần thiết — trên Linux, điều này thường có nghĩa là dựng một phiên bản GRUB với mô-đun
ext2.mod(và có thể cảlvm.mod) được nạp sẵn.1Cài GRUB là việc khó và dễ làm hỏng máy. Bình thường bản Linux bạn dùng đã cài sẵn rồi, bạn không phải làm gì. Chỉ khi tự làm đĩa khởi động bạn mới cần đụng tới. Nhớ nhé: việc này có nút “hỏng máy” — hãy đọc kỹ trước khi gõ.
Ward is blunt: installing GRUB is more involved than configuring it, but fortunately you normally won't have to worry because your distribution handles it. You only do it yourself when duplicating or restoring a bootable disk, or preparing your own boot sequence.1 Your task, as he frames it, is to construct a version of GRUB capable of reading the filesystem that contains the GRUB directory, so it can load the rest of its configuration and any required modules — on Linux this usually means building a GRUB with its
ext2.modmodule (and possiblylvm.mod) preloaded.1Bạn gặp nó ở đâuWhere you meet it Khôi phục một máy “mất boot loader” sau khi cài song song một hệ điều hành khác — đó gần như luôn là một lần chạygrub-install. Cài Windows xong mất Linux — thường phải chạy lại grub-install. Recovering a machine that "lost its boot loader" after installing another OS alongside is almost always onegrub-installrun.Ba thứ phải biết trước
Bạn (hoặc trình cài đặt) phải xác định: thư mục GRUB đích như hệ thống đang chạy nhìn thấy nó (thường là
/boot/grub); thiết bị hiện tại của đĩa GRUB đích; và — với khởi động UEFI — điểm gắn hiện tại của phân vùng hệ thống EFI (thường là/boot/efi).110Lời cảnh báo của tác giả
Ward đặt một cảnh báo in đậm quanh lệnh
grub-install /dev/sda: cài GRUB sai cách có thể phá vỡ chuỗi khởi động của hệ thống, nên đừng xem nhẹ lệnh này; nếu lo, hãy tìm hiểu cách sao lưu MBR bằngdd, sao lưu thư mục GRUB đang cài, và bảo đảm bạn có kế hoạch khởi động khẩn cấp.1Đĩa ngoài và UEFI
Để cài lên một thiết bị bên ngoài hệ thống hiện tại, bạn phải nêu rõ thư mục GRUB trên thiết bị đó như hệ thống hiện tại đang thấy — ví dụ
grub-install --boot-directory=/mnt/boot /dev/sdc. Với UEFI, ngoài việc chép boot loader vào chỗ, bạn còn phải “thông báo” nó cho firmware — tức lưu cấu hình loader vào NVRAM — bằng lệnhefibootmgr;grub-installtự chạy lệnh này nếu nó có sẵn.112
Cụm khái niệm 04 Concept cluster 04
MBR, UEFI, secure boot — và chín bước GRUB thật sự đi qua Hai kiểu khởi động, và chín bước của GRUB MBR, UEFI, secure boot — and the nine steps GRUB really takes
Để hiểu boot loader như GRUB làm việc ra sao, Ward khảo sát cách một máy PC khởi động khi bạn bật nó lên. Vì phải đối phó với nhiều điểm bất cập của cơ chế khởi động PC truyền thống, các lược đồ nạp khởi động có vài biến thể — nhưng có hai lược đồ chính: MBR và UEFI.1
Máy PC có hai kiểu khởi động: kiểu cũ và kiểu mới. Kiểu cũ nhét mã khởi động vào một góc rất chật trên đĩa. Kiểu mới thì để hẳn một ngăn riêng, rộng rãi, có tên tệp đàng hoàng. Nhớ nhé: kiểu cũ chật chội, kiểu mới có ngăn riêng.
To understand how boot loaders such as GRUB work, Ward surveys how a PC boots when you turn it on. Because they must address the many inadequacies of traditional PC boot mechanisms, boot loading schemes have several variations — but there are two main ones: MBR and UEFI.1
Định nghĩa. Khởi động MBR dựa vào một vùng nhỏ 441 byte trong MBR mà BIOS của PC nạp và thực thi sau khi tự kiểm tra bật nguồn (POST). Khởi động UEFI thì luôn có một hệ thống tập tin VFAT đặc biệt gọi là phân vùng hệ thống EFI (ESP), chứa một thư mục tên EFI.113
Nói đơn giản. Kiểu cũ: một mẩu mã tí xíu nhét ở đầu đĩa. Kiểu mới: một ngăn đĩa riêng, trong đó các tệp khởi động nằm ngay ngắn theo tên. Nhớ nhé: cũ là mẩu giấy nhét khe cửa, mới là ngăn tủ có nhãn.
Definition. MBR boot rests on a small area of 441 bytes inside the MBR that the PC BIOS loads and executes after its Power-On Self-Test (POST). UEFI boot always has a special VFAT filesystem called the EFI System Partition (ESP), containing a directory named EFI.113
MBR: BIOS → 512B từ MBR
→ phần còn lại giữa MBR
và phân vùng đầu tiên
UEFI: firmware → ESP (VFAT)
→ /EFI/<tên>/*.efi
kiểu cũ: máy đọc đầu đĩa
→ rồi đọc tiếp chỗ trống kế bên
kiểu mới: máy mở ngăn riêng
→ chạy tệp có đuôi .efi
MBR: BIOS → 512B from MBR
→ rest between MBR
and first partition
UEFI: firmware → ESP (VFAT)
→ /EFI/<name>/*.efi
-
MBR boot
Khởi động MBR — 441 byte, và một boot loader nhiều tầng Kiểu cũ: chỗ chật nên phải chia làm nhiều đoạn MBR boot — 441 bytes, and a multistage boot loader
Ngoài thông tin phân vùng đã mô tả ở Chương 4, MBR còn có một vùng nhỏ 441 byte mà BIOS nạp và thực thi sau POST. Ward nhận xét thẳng: không may là không gian này không đủ để chứa gần như bất kỳ boot loader nào, nên cần thêm không gian — kết quả là cái đôi khi được gọi là boot loader nhiều tầng (multistage boot loader). Trong trường hợp này, mẩu mã đầu tiên trong MBR không làm gì khác ngoài việc nạp phần còn lại của mã boot loader; các mẩu còn lại thường được nhét vào khoảng trống giữa MBR và phân vùng đầu tiên trên đĩa.114
Chỗ dành cho mã khởi động ở đầu đĩa bé xíu — chỉ vừa vài trăm chữ. Không đủ để chứa cả người mở cửa. Nên người ta chia làm hai: mẩu đầu chỉ biết đi gọi mẩu sau, và mẩu sau nằm ở khoảng trống kế bên. Nhớ nhé: chỗ chật thì chia làm hai đoạn.
In addition to the partition information described in Chapter 4, the MBR includes a small area of 441 bytes that the PC BIOS loads and executes after POST. Ward is direct: unfortunately this space is inadequate to house almost any boot loader, so additional space is necessary — resulting in what is sometimes called a multistage boot loader. The initial piece of code in the MBR does nothing other than load the rest of the boot loader code; the remaining pieces are usually stuffed into the space between the MBR and the first partition on the disk.114
Bạn gặp nó ở đâuWhere you meet it Đây là lý do một trình cài đặt hệ điều hành khác có thể “ăn mất” GRUB của bạn chỉ bằng cách ghi vào đúng vùng đó. Vì mã nằm ở chỗ ai cũng ghi được nên nó dễ bị ghi đè mất. This is why another OS installer can "eat" your GRUB simply by writing into that same area.Điểm yếu Ward chỉ ra
Ông nói thẳng cách làm này không an toàn lắm, vì bất cứ thứ gì cũng có thể ghi đè lên mã ở đó — nhưng hầu hết boot loader vẫn làm vậy, kể cả phần lớn các bản cài GRUB.1
Khi đĩa dùng GPT nhưng khởi động bằng BIOS
Lược đồ nhét mã sau MBR không hoạt động với đĩa phân vùng GPT dùng BIOS để khởi động, vì thông tin GPT nằm chính trong vùng sau MBR (GPT để nguyên MBR truyền thống cho tương thích ngược). Giải pháp chữa cháy cho GPT là tạo một phân vùng nhỏ gọi là BIOS boot partition với UUID đặc biệt
21686148-6449-6E6F-744E-656564454649, để toàn bộ mã boot loader có chỗ cư trú.115441 hay 446? Một con số có tranh cãi
Ward viết 441 byte, và đó là con số trang này dùng trong phần thân.1 Các mô tả cấu trúc MBR khác thường nói vùng mã mồi rộng 446 byte — tức toàn bộ 512 byte trừ 64 byte bảng phân vùng và 2 byte chữ ký — hoặc 440 byte khi MBR hiện đại dành thêm 6 byte cho chữ ký đĩa và một trường bỏ trống.14 Khác biệt nằm ở chỗ đếm mấy byte cuối, không ở bản chất lập luận: dù 440, 441 hay 446 thì vùng ấy vẫn quá chật để chứa một boot loader hoàn chỉnh.
-
ESP
Khởi động UEFI — mã khởi động cuối cùng cũng là tệp Kiểu mới: mã khởi động là một tệp bình thường UEFI boot — boot code that is finally a file
Nhà sản xuất PC và các công ty phần mềm nhận ra BIOS PC truyền thống bị giới hạn nghiêm trọng, nên họ phát triển một thứ thay thế gọi là Extensible Firmware Interface (EFI). Chuẩn hiện hành là Unified EFI (UEFI), bao gồm các tính năng như shell tích hợp và khả năng đọc bảng phân vùng cùng điều hướng hệ thống tập tin; lược đồ phân vùng GPT là một phần của chuẩn UEFI.116 Ward nói khởi động trên hệ thống UEFI khác hẳn MBR, và phần lớn là dễ hiểu hơn nhiều: thay vì mã khởi động thực thi nằm ngoài một hệ thống tập tin, luôn có một hệ thống tập tin VFAT đặc biệt — ESP — thường được gắn trên hệ thống Linux của bạn tại
/boot/efi.113Kiểu mới dễ hiểu hơn nhiều: máy có hẳn một ngăn đĩa riêng, bên trong có thư mục tên
EFI, và mỗi người mở cửa có một thư mục con với tệp đuôi.efi. Muốn xem thì mở/boot/efira là thấy. Nhớ nhé: kiểu mới thì mã khởi động cũng chỉ là một tệp có tên.PC manufacturers and software companies realized the traditional PC BIOS was severely limited, so they developed a replacement called Extensible Firmware Interface (EFI). The current standard is Unified EFI (UEFI), which includes features such as a built-in shell and the ability to read partition tables and navigate filesystems; the GPT partitioning scheme is part of the UEFI standard.116 Ward says booting on UEFI systems is radically different from MBR, and for the most part much easier to understand: rather than executable boot code residing outside a filesystem, there's always a special VFAT filesystem — the ESP — usually mounted on your Linux system at
/boot/efi.113Bạn gặp nó ở đâuWhere you meet it Bạn có thểls /boot/efi/EFIngay bây giờ trên một máy UEFI và đọc bằng mắt thường danh sách mọi hệ điều hành máy đó biết khởi động. Gõls /boot/efi/EFIlà thấy danh sách hệ điều hành máy biết mở. You canls /boot/efi/EFIright now on a UEFI machine and read, in plain sight, every operating system it knows how to boot.Cấu trúc bên trong ESP
Mỗi boot loader có định danh riêng và một thư mục con tương ứng — chẳng hạn
efi/microsoft,efi/apple,efi/ubuntuhayefi/grub. Tệp boot loader có đuôi.efivà nằm trong một trong các thư mục con đó, cùng các tệp hỗ trợ khác; nếu đi khám phá, bạn có thể thấy những tệp nhưgrubx64.efi(phiên bản EFI của GRUB) vàshimx64.efi.113 -
secure boot
Secure boot — chữ ký số, cái shim, và giá phải trả Secure boot — máy chỉ mở cửa cho người có giấy tờ Secure boot — digital signatures, the shim, and the trade-off
Ward gọi đây là một vấn đề mới hơn ảnh hưởng tới các bản cài Linux. Khi kích hoạt, cơ chế UEFI này đòi hỏi mọi boot loader phải được ký số bởi một thẩm quyền đáng tin thì mới chạy được. Microsoft đã yêu cầu các nhà cung cấp phần cứng xuất xưởng Windows 8 trở lên phải dùng secure boot; kết quả là nếu bạn thử cài một boot loader chưa ký trên những hệ thống này, firmware sẽ từ chối loader và hệ điều hành sẽ không nạp.116
Máy mới có một khoá an toàn: nó chỉ chịu mở cửa cho người mở cửa nào có “giấy tờ” hợp lệ. Các bản Linux lớn đều xin giấy tờ rồi nên không sao. Chỉ người tự làm người mở cửa mới thấy phiền. Nhớ nhé: có giấy tờ thì qua cổng, không có thì bị chặn.
Ward calls this a newer problem affecting Linux installations. When active, this UEFI mechanism requires any boot loader to be digitally signed by a trusted authority in order to run. Microsoft has required hardware vendors shipping Windows 8 and later to use secure boot; the result is that if you try to install an unsigned boot loader on these systems, the firmware will reject the loader and the operating system won't load.116
Bạn gặp nó ở đâuWhere you meet it Tệpshimx64.efibạn thấy trong ESP không phải rác — nó chính là mảnh giải quyết bài toán chữ ký này. Tệp tên shim trong ngăn EFI chính là “người cầm giấy tờ” đi trước. Thatshimx64.efiin your ESP isn't junk — it's the piece that solves this signature problem.Vì sao các bản phân phối lớn không gặp vấn đề
Ward giải thích: các bản phân phối Linux lớn không có vấn đề với secure boot vì chúng đi kèm boot loader đã ký, thường dựa trên phiên bản UEFI của GRUB. Thường có một shim nhỏ đã ký nằm giữa UEFI và GRUB; UEFI chạy shim, và shim lần lượt thực thi GRUB.117
Cái giá của nó
Ông cân bằng hai phía. Bảo vệ khỏi việc khởi động phần mềm trái phép là tính năng quan trọng nếu máy bạn không ở trong môi trường đáng tin hoặc cần đáp ứng yêu cầu bảo mật nhất định — một số bản phân phối còn đi xa hơn, đòi hỏi toàn bộ chuỗi khởi động (kể cả nhân) phải được ký. Nhưng có bất lợi, đặc biệt với người đang thử nghiệm dựng boot loader của riêng mình. Bạn có thể lách bằng cách tắt secure boot trong thiết lập UEFI — tuy nhiên cách này không gọn với hệ thống khởi động kép, vì Windows sẽ không chạy nếu secure boot không bật.1
-
chainloading
Chainloading — GRUB nạp một boot loader khác Chuyền tay: GRUB gọi người mở cửa khác Chainloading — GRUB loading another boot loader
UEFI làm cho việc hỗ trợ nạp các hệ điều hành khác tương đối dễ, vì bạn có thể cài nhiều boot loader trong phân vùng EFI. Nhưng kiểu MBR cũ hơn không hỗ trợ chức năng này, và ngay cả khi có UEFI, bạn vẫn có thể có một phân vùng riêng mang boot loader kiểu MBR mà bạn muốn dùng. Thay vì cấu hình và chạy một nhân Linux, GRUB có thể nạp và chạy một boot loader khác trên một phân vùng cụ thể của đĩa — Ward gọi đó là chainloading.19
Đôi khi GRUB không tự mở cửa mà gọi một người mở cửa khác tới làm hộ — ví dụ để mở Windows. Việc chuyền tay đó gọi là chainloading. Nhớ nhé: không làm được thì gọi người khác làm.
UEFI makes supporting other operating systems relatively easy, because you can install multiple boot loaders in the EFI partition. But the older MBR style does not support this, and even with UEFI you may still have an individual partition carrying an MBR-style boot loader you want to use. Instead of configuring and running a Linux kernel, GRUB can load and run a different boot loader on a specific partition of your disk — Ward calls this chainloading.19
Bạn gặp nó ở đâuWhere you meet it Mục “Windows Boot Manager” trong menu GRUB trên một máy khởi động kép thường chính là một mục chainloading. Dòng “Windows” trong menu khởi động chính là chuyền tay. The "Windows Boot Manager" entry in a dual-boot GRUB menu is typically exactly a chainloading entry.Cách viết một mục chainload
Bạn tạo một mục menu mới trong cấu hình GRUB (dùng một trong các cách ở phần sinh tệp cấu hình). Ví dụ của Ward cho một bản cài Windows trên phân vùng thứ ba: nạp mô-đun
chainvàntfs, đặtset root=(hd0,3), rồi gọichainloader +1.1 -
how GRUB works
Chín bước — và câu hỏi “lõi GRUB nằm ở đâu” Chín bước GRUB đi, và chỗ nó cất mình Nine steps — and the question "where is the GRUB core"
Ward khép lại phần GRUB bằng một chuỗi chín bước: BIOS hoặc firmware khởi tạo phần cứng và tìm mã khởi động trên các thiết bị theo thứ tự boot; nó nạp và thực thi mã tìm thấy — đây là nơi GRUB bắt đầu; lõi GRUB nạp; lõi khởi tạo, và tới điểm này GRUB đã truy cập được đĩa và hệ thống tập tin; GRUB nhận diện phân vùng khởi động của nó và nạp cấu hình ở đó; GRUB cho người dùng một cơ hội thay đổi cấu hình; sau một khoảng chờ hoặc một thao tác của người dùng, GRUB thực thi cấu hình; trong lúc thực thi, GRUB có thể nạp thêm mã (mô-đun) trong phân vùng khởi động, một số có thể đã được nạp sẵn; và cuối cùng GRUB thực thi lệnh
bootđể nạp và chạy nhân theo lệnhlinuxtrong cấu hình.1GRUB đi qua chín bước: máy tìm nó, nó tự dựng mình dậy, nó đọc được đĩa, nó tìm cấu hình, nó cho bạn vài giây để sửa, rồi nó chạy nhân. Nhớ nhé: GRUB cũng phải tự dựng mình dậy trước khi dựng nhân dậy.
Ward closes the GRUB discussion with a nine-step sequence: the BIOS or firmware initializes the hardware and searches its boot-order storage devices for boot code; it loads and executes the code it finds — this is where GRUB begins; the GRUB core loads; the core initializes, and at this point GRUB can access disks and filesystems; GRUB identifies its boot partition and loads a configuration there; GRUB gives the user a chance to change the configuration; after a timeout or user action, GRUB executes the configuration; in the course of doing so it may load additional code (modules) in the boot partition, some of which may be preloaded; and finally GRUB executes a
bootcommand to load and execute the kernel as specified by the configuration'slinuxcommand.1Bạn gặp nó ở đâuWhere you meet it Thông điệp lỗi kiểuerror: unknown filesystemvới dấu nhắcgrub rescue>là bước 4 thất bại — lõi đã chạy nhưng chưa đọc được hệ thống tập tin. Thấy dấu nhắcgrub rescue>nghĩa là GRUB dậy được nhưng chưa đọc được đĩa. Anerror: unknown filesystemwith agrub rescue>prompt is step 4 failing — the core ran, but couldn't read the filesystem.Ba chỗ lõi GRUB có thể nằm
Ward nói bước 3 và 4 có thể phức tạp vì những bất cập của cơ chế khởi động PC truyền thống, và câu hỏi lớn nhất là “lõi GRUB ở đâu”. Có ba khả năng cơ bản: nhét một phần giữa MBR và đầu phân vùng đầu tiên; trong một phân vùng thông thường; hoặc trong một phân vùng khởi động đặc biệt — phân vùng khởi động GPT, ESP, hay nơi khác.1
512 byte đầu tiên
Trong mọi trường hợp trừ khi bạn có UEFI/ESP, BIOS của PC nạp 512 byte từ MBR, và đó là nơi GRUB bắt đầu. Mẩu nhỏ này — dẫn xuất từ
boot.imgtrong thư mục GRUB — chưa phải là lõi, nhưng nó chứa vị trí bắt đầu của lõi và nạp lõi từ điểm đó.114Khi có ESP thì đơn giản hơn nhiều
Nếu bạn có ESP, lõi GRUB nằm ở đó dưới dạng một tệp; firmware có thể điều hướng ESP và thực thi trực tiếp toàn bộ GRUB hoặc bất kỳ trình nạp hệ điều hành nào nằm ở đó. Ward thêm: bạn có thể có một shim trong ESP nằm ngay trước GRUB để xử lý secure boot, nhưng ý tưởng vẫn thế.117
Đính chính Corrections
Ba ngộ nhận mà người đọc lần đầu hay mắc Ba chỗ hay hiểu nhầm Three misconceptions first readers hit
Phần này thuộc mức đọc Đầy đủ: nó đối chiếu điều người đọc thường nghĩ với điều bản văn thật sự nói.
Phần này hơi khó, bạn có thể bỏ qua và quay lại sau. Nhớ nhé: hiểu chậm mà chắc vẫn hơn.
This block belongs to the Đầy đủ (full) reading level: it sets what readers usually assume against what the text actually says.
“GRUB chạy trên Linux, nên insmod trong GRUB là insmod của Linux”
"GRUB runs on Linux, so insmod in GRUB is Linux's insmod"
Ngộ nhận: các lệnh quen mắt trong cấu hình GRUB — insmod, ls, “kernel” — là các lệnh của hệ thống Linux.
Bản văn nói: GRUB không dùng nhân Linux — nhiệm vụ của nó là khởi động nhân. Cấu hình bạn thấy hoàn toàn gồm tính năng và lệnh nội tại của GRUB, tồn tại trong thế giới riêng của nó. GRUB có “nhân” của riêng mình và lệnh insmod của riêng mình để nạp động các mô-đun GRUB, hoàn toàn độc lập với nhân Linux; nhiều lệnh GRUB trông giống lệnh shell Unix, thậm chí có cả ls.1
Misconception: the familiar-looking commands in a GRUB configuration — insmod, ls, "kernel" — are Linux system commands.
The text says: GRUB doesn't use the Linux kernel — its job is to start the kernel. The configuration you see consists wholly of features and commands internal to GRUB, which exists in its own separate world. GRUB has its own "kernel" and its own insmod for dynamically loading GRUB modules, completely independent of the Linux kernel; many GRUB commands resemble Unix shell commands, there is even an ls.1
“Mọi chữ root trong cấu hình GRUB nói về cùng một thứ”
"Every root in a GRUB configuration means the same thing"
Ngộ nhận: cấu hình GRUB nhắc root nhiều lần vì nó lặp lại cùng một thông tin.
Bản văn nói: Ward viết rằng phần lớn nhầm lẫn đến từ cách GRUB dùng từ root. Trong cấu hình GRUB, chữ root nằm sau tên ảnh nhân của lệnh linux là tham số nhân — hệ thống tập tin gốc của hệ thống bạn. Mọi tham chiếu root khác là GRUB root: thứ chỉ tồn tại bên trong GRUB, là hệ thống tập tin nơi GRUB tìm các tệp ảnh nhân và ảnh hệ thống tập tin RAM.1 Trong ví dụ của ông, GRUB root trước hết được đặt thành một thiết bị riêng của GRUB (hd0,msdos1) làm giá trị mặc định, rồi lệnh search tìm một UUID cụ thể và nếu thấy thì đặt lại GRUB root thành phân vùng đó.1
Misconception: a GRUB configuration mentions root repeatedly because it is restating one piece of information.
The text says: Ward writes that by far the most confusion comes from GRUB's use of the word root. In a GRUB configuration, the root that appears after the image name of the linux command is a kernel parameter — your system's root filesystem. Every other reference to root is the GRUB root: something that exists only inside GRUB, the filesystem where GRUB looks for the kernel and RAM filesystem image files.1 In his example the GRUB root is first set to a GRUB-specific device (hd0,msdos1) as a default, then a search command looks for a particular UUID and, on finding it, sets the GRUB root to that partition.1
“Nhân bỏ qua những tham số nó không hiểu” "The kernel discards parameters it doesn't understand"
Ngộ nhận: một tham số lạ trên dòng khởi động thì vô hại vì nhân sẽ lờ nó đi.
Bản văn nói: khi gặp một tham số nó không hiểu, nhân Linux lưu lại tham số đó và sau đó chuyển cho init lúc khởi động không gian người dùng — ví dụ -s được chuyển sang init để báo khởi động ở chế độ một người dùng.1 Tài liệu nhân nói rõ thêm cơ chế: tham số có dấu = đi vào môi trường của init, các tham số khác thành đối số dòng lệnh của init.7 Nghĩa là một từ gõ nhầm trên dòng GRUB không biến mất — nó có thể đổi hành vi của tiến trình số 1.
Misconception: a stray parameter on the boot line is harmless because the kernel will ignore it.
The text says: upon encountering a parameter it doesn't understand, the Linux kernel saves it and later passes it to init during the user space start — for example, -s is passed to init to indicate single-user mode.1 The kernel documentation spells out the mechanism further: parameters with = go into init's environment, others are passed as command line arguments to init.7 Which means a mistyped word on the GRUB line does not vanish — it can change the behaviour of process number 1.
Tự kiểm tra Self-check
Bạn đã kể được chuỗi khởi động chưa? Thử trả lời xem nào Can you narrate the boot chain yet?
Trả lời bằng lời của bạn, không tra sách. Nếu một câu khiến bạn ngập ngừng, đó chính là giai đoạn khởi động bạn nên đọc lại.
Thử trả lời miệng thôi, không cần giở lại. Câu nào bí thì quay lại đọc phần đó nhé. Nhớ nhé: chỗ bí chính là chỗ cần học.
Answer in your own words, without looking back. Whichever question makes you hesitate points at the boot stage you should reread.
-
Kể lại chuỗi khởi động bảy bước của Ward, và chỉ ra bước nào là điểm bắt đầu của không gian người dùng.
Gợi ý sâu hơn: nói thêm chương nào của sách nhận trách nhiệm cho phần sau điểm đó.
-
Bạn dùng lệnh nào để xem lại thông điệp chẩn đoán của nhân từ lần khởi động hiện tại — và nếu máy không có systemd thì dùng gì thay thế?
Gợi ý sâu hơn: tuỳ chọn nào cho phép xem các lần khởi động trước?
-
Vì sao tham số
rootlà then chốt, và ba cách viết giá trị của nó khác nhau ra sao?Gợi ý sâu hơn: vì sao hai cách viết bằng ổ luận lý và bằng UUID lại đáng chuộng hơn tệp thiết bị?
-
Nhân làm gì với một tham số nó không nhận ra?
Gợi ý sâu hơn: tham số có dấu
=và tham số không có được xử lý khác nhau thế nào? -
Bài toán “con gà hay quả trứng” của boot loader là gì, và nó thoát ra bằng cách nào?
Gợi ý sâu hơn: LBA đánh đổi cái gì lấy cái gì, và vì sao đánh đổi đó chấp nhận được?
-
Trong một cấu hình GRUB, làm sao bạn phân biệt được chữ
rootnào là tham số nhân và chữ nào là GRUB root?Gợi ý sâu hơn: lệnh
searchlàm gì với GRUB root? -
Vì sao không nên sửa trực tiếp
grub.cfg, và bạn nên đặt tuỳ chỉnh ở đâu?Gợi ý sâu hơn:
40_customvà41_customkhác nhau ở điểm nào? -
Khởi động MBR và khởi động UEFI khác nhau ở chỗ nào về nơi cất mã khởi động?
Gợi ý sâu hơn: phân vùng hệ thống EFI dùng loại hệ thống tập tin nào, và thường được gắn ở đâu trên Linux?
-
Secure boot yêu cầu điều gì, và cái shim giải quyết vấn đề đó thế nào?
Gợi ý sâu hơn: vì sao tắt secure boot lại không gọn với hệ thống khởi động kép?
-
Chainloading là gì, và
chainloader +1nạp cái gì?Gợi ý sâu hơn: vì sao UEFI làm việc hỗ trợ nhiều hệ điều hành dễ hơn kiểu MBR?
Bật máy lên thì máy đi qua mấy bước? Kể được ba bước là tốt rồi.
Muốn đọc lại những dòng chữ chạy vụt qua lúc khởi động, bạn gõ lệnh gì?
Dòng
root=trong mẩu giấy dặn dò dùng để làm gì?GRUB là ai, và nó làm việc gì?
Máy PC có hai kiểu khởi động — kể tên và nói chúng khác nhau chỗ nào.
-
Recite Ward's seven-step boot sequence, and identify which step is the user space start.
-
Which command shows the kernel's diagnostic messages from the current boot — and what do you use instead without systemd?
-
Why is the
rootparameter critical, and how do its three notations differ? -
What does the kernel do with a parameter it doesn't recognize?
-
What is the boot loader's "chicken or egg" problem, and how does it escape?
-
In a GRUB configuration, how do you tell which
rootis a kernel parameter and which is the GRUB root? -
Why shouldn't you edit
grub.cfgdirectly, and where should customizations go? -
How do MBR boot and UEFI boot differ in where the boot code lives?
-
What does secure boot require, and how does the shim resolve it?
-
What is chainloading, and what does
chainloader +1load?
Khép lại chương Closing the chapter
Boot loader phải trả lời hai câu hỏi — nhân ở đâu, và tham số nào đi cùng nó — trong lúc chính thứ biết đọc đĩa vẫn chưa chạy.1 Đó là lý do cả chương này tồn tại; và khi một máy không lên, việc nhận diện từng giai đoạn của quá trình khởi động sẽ là vô giá.1
Người mở cửa phải tìm nhân và đưa cho nhân mẩu giấy dặn dò, trong lúc chưa ai biết đọc ổ đĩa cả. Khi máy không lên, hãy hỏi nó dừng ở chặng nào. Nhớ nhé: biết tên từng chặng là biết chỗ để tìm.
The boot loader must answer two questions — where is the kernel, and what parameters go with it — while the very thing that knows how to read a disk is not yet running.1 That is why this chapter exists; and when a machine won't come up, being able to identify each stage of the boot process proves invaluable.1