101.2 Bài 1
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
101 Kiến trúc Hệ thống |
Mục tiêu: |
101.2 Khởi động Hệ thống |
Bài: |
1 trên 1 |
Giới thiệu
Để quản lý một máy tính, thành phần chính của hệ điều hành — tức hạt nhân — phải được tải bởi một chương trình có tên là trình tải khởi động. Bản thân chương trình này sẽ được tải bởi phần sụn được cài đặt sẵn như BIOS hoặc UEFI. Trình tải khởi động có thể được tùy chỉnh để chuyển các tham số cho hạt nhân (chẳng hạn như phân vùng nào chứa hệ thống tệp gốc hoặc hệ điều hành sẽ thực thi ở chế độ nào). Sau khi được tải, hạt nhân sẽ tiếp tục quá trình khởi động để xác định và cấu hình phần cứng. Cuối cùng, hạt nhân sẽ gọi lên tiện ích chịu trách nhiệm khởi động và quản lý các dịch vụ của hệ thống.
Note
|
Trên một số bản phân phối Linux, các lệnh được thực hiện trong bài học này có thể sẽ yêu cầu quyền gốc. |
BIOS hay UEFI
Các quy trình được thực hiện bởi các máy x86 để chạy trình tải khởi động đều sẽ khác nhau dù chúng sử dụng BIOS hay UEFI. BIOS (viết tắt của Basic Input/Output System - Hệ thống Đầu vào/Đầu ra Cơ bản) là một chương trình được lưu trữ trong một chip bộ nhớ cố định được gắn vào bo mạch chủ và sẽ được thực thi mỗi khi ta bật máy tính. Loại chương trình này được gọi là phần sụn và vị trí lưu trữ của nó sẽ tách biệt với các thiết bị lưu trữ khác mà hệ thống có thể có. BIOS giả định rằng 440 byte đầu tiên trong thiết bị lưu trữ đầu tiên — theo thứ tự được xác định trong tiện ích cấu hình BIOS — sẽ là giai đoạn đầu tiên của trình tải khởi động (bootloader, hay còn được gọi là bootstrap). 512 byte đầu tiên của thiết bị lưu trữ được gọi là MBR (Bản ghi Khởi động Chính) của thiết bị lưu trữ sử dụng lược đồ phân vùng DOS tiêu chuẩn và còn chứa cả bảng phân vùng bên cạnh giai đoạn đầu tiên của trình tải khởi động. Nếu MBR không chứa dữ liệu chính xác, hệ thống sẽ không thể khởi động trừ khi ta sử dụng một phương pháp thay thế.
Nói chung, các bước trước khi vận hành để khởi động hệ thống được trang bị BIOS là:
-
Tiến trình POST (power-on self-test - tự kiểm tra khi bật nguồn) sẽ được thực thi để xác định các lỗi phần cứng đơn giản ngay khi bật nguồn máy.
-
BIOS sẽ kích hoạt các thành phần cơ bản để tải hệ thống như đầu ra video, bàn phím và phương tiện lưu trữ.
-
BIOS sẽ tải giai đoạn đầu tiên của trình tải khởi động từ MBR (440 byte đầu tiên của thiết bị đầu tiên như được xác định trong tiện ích cấu hình BIOS).
-
Giai đoạn đầu tiên của trình tải khởi động sẽ gọi giai đoạn thứ hai của trình tải khởi động chịu trách nhiệm trình bày các tùy chọn khởi động và tải hạt nhân.
UEFI (viết tắt của Unified Extensible Firmware Interface - Giao diện Phần sụn Mở rộng Hợp nhất) khác với BIOS ở một số điểm trọng yếu. Giống như BIOS, UEFI cũng là một phần sụn nhưng nó có thể xác định các phân vùng và đọc nhiều hệ thống tệp được tìm thấy trong đó. UEFI không dựa vào MBR mà chỉ tính đến các cài đặt được lưu trữ trong bộ nhớ cố định (NVRAM) được gắn vào bo mạch chủ. Các định nghĩa này cho ta biết về vị trí của các chương trình tương thích với UEFI (được gọi là ứng dụng EFI) sẽ được thực thi tự động hoặc được gọi từ menu khởi động. Các ứng dụng EFI có thể là trình tải khởi động, bộ chọn hệ điều hành, công cụ chẩn đoán và sửa chữa hệ thống, v.v. Chúng phải nằm trong phân vùng thiết bị lưu trữ thông thường và trong một hệ thống tệp tương thích. Các hệ thống tệp tương thích tiêu chuẩn là FAT12, FAT16 và FAT32 cho các thiết bị khối và ISO-9660 cho các phương tiện quang học. Cách tiếp cận này cho phép ta triển khai nhiều công cụ phức tạp hơn so với những công cụ mà ta có thể có với BIOS.
Phân vùng chứa các ứng dụng EFI được gọi là Phân vùng hệ thống EFI hoặc ESP (EFI System Partition). Phân vùng này không được chia sẻ với các hệ thống tệp hệ thống khác (chẳng hạn như hệ thống tệp gốc hoặc hệ thống tệp dữ liệu người dùng). Thư mục EFI trong phân vùng ESP sẽ chứa các ứng dụng được trỏ đến bởi các mục được lưu trong NVRAM.
Nói chung, các bước trước khởi động hệ điều hành trên hệ thống có UEFI là:
-
Tiến trình POST được thực thi để xác định các lỗi phần cứng đơn giản ngay khi bật nguồn máy.
-
UEFI sẽ kích hoạt các thành phần cơ bản để tải hệ thống như đầu ra video, bàn phím và phương tiện lưu trữ.
-
Phần sụn của UEFI sẽ đọc các định nghĩa được lưu trữ trong NVRAM để thực thi ứng dụng EFI được xác định trước và được lưu trữ trong hệ thống tệp của phân vùng ESP. Thông thường, ứng dụng EFI được xác định trước chính là trình tải khởi động.
-
Nếu ứng dụng EFI được xác định trước là trình tải khởi động, nó sẽ tải hạt nhân để khởi động hệ điều hành.
Tiêu chuẩn UEFI cũng hỗ trợ một tính năng gọi là Khởi động An toàn. Tính năng này chỉ cho phép thực thi các ứng dụng EFI đã ký, tức là các ứng dụng EFI được nhà sản xuất phần cứng ủy quyền. Tính năng này sẽ tăng khả năng bảo vệ chống lại các phần mềm độc hại, nhưng nó cũng có thể gây khó khăn cho việc cài đặt các hệ điều hành không được bảo hành của nhà sản xuất.
Trình Tải Khởi động
Trình tải khởi động phổ biến nhất của Linux trong kiến trúc x86 là GRUB (Grand Unified Bootloader - Bộ Tải Khởi động Hợp nhất Lớn). Ngay khi được BIOS hoặc UEFI gọi, GRUB sẽ hiển thị một danh sách các hệ điều hành có sẵn để khởi động. Đôi khi danh sách sẽ không tự động xuất hiện nhưng nó có thể được gọi bằng cách nhấn phím Shift trong khi GRUB đang được BIOS gọi. Trong các hệ thống UEFI, ta nên sử dụng phím Esc để thay thế.
Từ menu GRUB, ta có thể chọn một trong các hạt nhân đã cài đặt sẽ được tải và chuyển các tham số mới cho hạt nhân đó. Hầu hết các tham số hạt nhân đều sẽ tuân theo mẫu option=value
. Một số tham số hạt nhân hữu ích nhất là:
acpi
-
Bật/tắt hỗ trợ ACPI.
acpi=off
sẽ tắt hỗ trợ cho ACPI. init
-
Đặt một bộ khởi tạo hệ thống thay thế. Ví dụ:
init=/bin/bash
sẽ đặt vỏ Bash làm trình khởi tạo. Điều này có nghĩa là phiên vỏ sẽ bắt đầu ngay sau quá trình khởi động hạt nhân. systemd.unit
-
Đặt kích hoạt mục tiêu systemd (ví dụ như
systemd.unit=graphical.target
). Systemd cũng chấp nhận các mức chạy số như được xác định cho SysV. Ví dụ: để kích hoạt mức chạy 1, ta chỉ cần thêm số1
hoặc chữ cáiS
(viết tắt của “single”) làm tham số hạt nhân. mem
-
Đặt dung lượng RAM khả dụng cho hệ thống. Tham số này sẽ rất hữu ích cho các máy ảo trong việc giới hạn dung lượng RAM khả dụng cho mỗi máy khách. Việc sử dụng
mem=512M
sẽ giới hạn dung lượng RAM khả dụng ở mức 512 megabyte cho một hệ thống khách cụ thể. maxcpus
-
Giới hạn số lượng bộ xử lý (hoặc lõi bộ xử lý) hiển thị cho hệ thống trong các máy đa bộ xử lý đối xứng. Nó cũng hữu ích cho các máy ảo. Giá trị
0
sẽ tắt hỗ trợ cho các máy đa bộ xử lý và có tác dụng tương tự như tham số hạt nhânnosmp
. Tham sốmaxcpus=2
sẽ giới hạn số lượng bộ xử lý có sẵn cho hệ điều hành xuống còn hai. quiet
-
Ẩn hầu hết các thông báo khởi động.
vga
-
Chọn một chế độ video. Tham số
vga=ask
sẽ hiển thị danh sách các chế độ khả dụng để chọn. root
-
Đặt phân vùng gốc khác với phân vùng được định cấu hình sẵn trong trình tải khởi động. Ví dụ:
root=/dev/sda3
. rootflags
-
Tùy chọn gắn kết cho hệ thống tệp gốc.
ro
-
Đặt lần gắn ban đầu của hệ thống tệp gốc ở chế độ chỉ đọc.
rw
-
Cho phép ghi vào hệ thống tệp gốc trong quá trình gắn kết ban đầu.
Việc thay đổi các tham số hạt nhân thường không bắt buộc, nhưng nó có thể sẽ hữu ích trong việc phát hiện và giải quyết các sự cố liên quan đến hệ điều hành. Các tham số hạt nhân phải được thêm vào tệp /etc/default/grub
trong dòng GRUB_CMDLINE_LINUX
để khiến chúng được ổn định trong các lần khởi động lại. Một tệp cấu hình mới cho trình tải khởi động phải được tạo mỗi khi /etc/default/grub
thay đổi. Việc này được thực hiện bằng lệnh grub-mkconfig -o /boot/grub/grub.cfg
. Một khi hệ điều hành đã chạy, các tham số hạt nhân được sử dụng để tải phiên hiện tại sẽ có sẵn để đọc trong tệp /proc/cmdline
.
Note
|
Cấu hình GRUB sẽ được thảo luận thêm trong bài học sau. |
Khởi tạo Hệ thống
Ngoài hạt nhân, hệ điều hành cũng phụ thuộc vào các thành phần khác trong việc cung cấp các tính năng được mong đợi. Nhiều thành phần trong số này sẽ được tải trong quá trình khởi tạo hệ thống, từ các tệp lệnh vỏ đơn giản đến các chương trình dịch vụ phức tạp hơn. Các tệp lệnh thường được sử dụng để thực hiện các tác vụ ngắn sẽ chạy và chấm dứt trong quá trình khởi tạo hệ thống. Các dịch vụ này còn được gọi là trình nền (daemon) và có thể hoạt động mọi lúc vì chúng có thể chịu trách nhiệm về các khía cạnh nội tại của hệ điều hành.
Các kết hợp giữa các tệp lệnh khởi động và các trình nền với nhiều đặc điểm khác biệt vào một bản phân phối Linux là vô cùng đa dạng. Đây là một thực tế trong lịch sử đã cản trở sự phát triển của một giải pháp duy nhất đáp ứng được kỳ vọng của những nhà bảo trì và người dùng của tất cả các bản phân phối Linux. Tuy nhiên, bất kỳ công cụ nào mà những nhà bảo trì phân phối đã chọn để thực hiện chức năng này ít nhất sẽ có thể bắt đầu, dừng và khởi động lại các dịch vụ hệ thống. Ví dụ, những tác vụ này thường được thực hiện bởi chính hệ thống sau khi cập nhật phần mềm, nhưng quản trị viên hệ thống hầu như luôn cần phải khởi động lại dịch vụ theo cách thủ công sau khi thực hiện các sửa đổi đối với tệp cấu hình của nó.
Nó cũng sẽ thuận tiện cho người quản trị hệ thống để có thể kích hoạt một bộ trình nền cụ thể, tùy thuộc vào hoàn cảnh (ví dụ như việc ta có thể chỉ chạy một bộ dịch vụ tối thiểu để thực hiện các tác vụ bảo trì hệ thống).
Note
|
Nói một cách chính xác, hệ điều hành chỉ là một hạt nhân cùng với các thành phần của nó với mục đích điều khiển phần cứng và quản lý tất cả các tiến trình. Tuy nhiên, người ta thường sử dụng thuật ngữ “hệ điều hành” một cách lỏng lẻo hơn để chỉ toàn bộ một nhóm các chương trình riêng biệt tạo nên môi trường phần mềm nơi người dùng có thể thực hiện các tác vụ tính toán cơ bản. |
Quá trình khởi tạo hệ điều hành sẽ bắt đầu khi trình tải khởi động tải hạt nhân vào RAM. Sau đó, hạt nhân sẽ phụ trách CPU và bắt đầu phát hiện và thiết lập các khía cạnh cơ bản của hệ điều hành như cấu hình phần cứng cơ bản và địa chỉ bộ nhớ.
Sau đó, hạt nhân sẽ mở initramfs (initial RAM filesystem - hệ thống tệp RAM ban đầu). initramfs là kho lưu trữ chứa một hệ thống tệp được sử dụng làm hệ thống tệp gốc tạm thời trong quá trình khởi động. Mục đích chính của một tệp initramfs là cung cấp các mô-đun cần thiết để hạt nhân có thể truy cập hệ thống tệp gốc “thực” của hệ điều hành.
Ngay khi hệ thống tệp gốc khả dụng, hạt nhân sẽ gắn kết tất cả các hệ thống tệp được định cấu hình trong /etc/fstab
và sau đó sẽ thực thi chương trình đầu tiên - một tiện ích có tên là init
. Chương trình init
sẽ chịu trách nhiệm chạy tất cả các tệp lệnh khởi tạo và các trình nền hệ thống. Ngoài bộ khởi tạo truyền thống, ta còn có các triển khai riêng biệt của các bộ khởi tạo hệ thống như systemd và Upstart. Khi chương trình init được tải, initramfs sẽ bị xóa khỏi RAM.
- SysV standard
-
Trình quản lý dịch vụ dựa trên tiêu chuẩn SysVinit sẽ kiểm soát trình nền và tài nguyên nào sẽ khả dụng bằng cách sử dụng khái niệm mức chạy. Các mức chạy sẽ được đánh số từ 0 đến 6 và được thiết kế bởi các nhà bảo trì phân phối để đáp ứng các mục đích cụ thể. Các định nghĩa mức chạy duy nhất được dùng chung bởi tất cả các bản phân phối là các mức chạy 0, 1 và 6.
- systemd
-
systemd là một trình quản lý dịch vụ và hệ thống hiện đại với một lớp tương thích cho các lệnh và mức chạy SysV. systemd có cấu trúc đồng thời sử dụng ổ cắm và D-Bus để kích hoạt dịch vụ, thực thi trình nền theo yêu cầu, giám sát tiến trình với cgroups, hỗ trợ chụp nhanh hình ảnh tức thời, khôi phục phiên hệ thống, kiểm soát điểm gắn kết và kiểm soát dịch vụ dựa trên phần phụ thuộc. Trong những năm gần đây, hầu hết các bản phân phối Linux lớn đều đã dần dần sử dụng systemd làm trình quản lý hệ thống mặc định.
- Upstart
-
Giống như systemd, Upstart là một giải pháp thay thế cho init. Trọng tâm của Upstart là tăng tốc quá trình khởi động bằng cách song song hóa quá trình tải các dịch vụ hệ thống. Upstart đã được sử dụng bởi các bản phân phối dựa trên Ubuntu trong các bản phát hành trước đây, nhưng ngày nay cũng đã nhường chỗ cho systemd.
Kiểm tra Quá trình Khởi tạo
Trong quá trình khởi động, lỗi luôn có thể xảy ra nhưng chúng có thể không nghiêm trọng đến mức khiến cho hệ điều hành đình chỉ hoàn toàn. Mặc dù vậy, những lỗi này có thể sẽ ảnh hưởng đến những hoạt động thông thường của hệ thống. Tất cả các lỗi đều sẽ dẫn đến các thông báo có thể được sử dụng cho các cuộc điều tra trong tương lai vì chúng có chứa các thông tin giá trị về thời gian và cách thức xảy ra lỗi. Ngay cả khi không có thông báo lỗi nào được tạo, thông tin được thu thập trong quá trình khởi động có thể vẫn sẽ hữu ích cho mục đích điều chỉnh và cấu hình.
Không gian bộ nhớ nơi hạt nhân lưu trữ các thông báo của nó (bao gồm cả thông báo khởi động) được gọi là bộ đệm vòng hạt nhân. Các thông báo sẽ được giữ trong bộ đệm vòng hạt nhân ngay cả khi chúng không được hiển thị trong quá trình khởi tạo, chẳng hạn như khi một hoạt ảnh được hiển thị thay thế. Tuy nhiên, bộ đệm vòng hạt nhân sẽ mất tất cả các thông báo khi hệ thống bị tắt hoặc khi ta thực hiện lệnh dmesg --clear
. Nếu không có tùy chọn, lệnh dmesg
sẽ hiển thị các thông báo hiện tại trong bộ đệm vòng hạt nhân:
$ dmesg [ 5.262389] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null) [ 5.449712] ip_tables: (C) 2000-2006 Netfilter Core Team [ 5.460286] systemd[1]: systemd 237 running in system mode. [ 5.480138] systemd[1]: Detected architecture x86-64. [ 5.481767] systemd[1]: Set hostname to <torre>. [ 5.636607] systemd[1]: Reached target User and Group Name Lookups. [ 5.636866] systemd[1]: Created slice System Slice. [ 5.637000] systemd[1]: Listening on Journal Audit Socket. [ 5.637085] systemd[1]: Listening on Journal Socket. [ 5.637827] systemd[1]: Mounting POSIX Message Queue File System... [ 5.638639] systemd[1]: Started Read required files in advance. [ 5.641661] systemd[1]: Starting Load Kernel Modules... [ 5.661672] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro [ 5.694322] lp: driver loaded but no devices found [ 5.702609] ppdev: user-space parallel port driver [ 5.705384] parport_pc 00:02: reported by Plug and Play ACPI [ 5.705468] parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA] [ 5.800146] lp0: using parport0 (interrupt-driven). [ 5.897421] systemd-journald[352]: Received request to flush runtime journal from PID 1
Đầu ra của dmesg
có thể dài đến hàng trăm dòng. Vì vậy, danh sách trên sẽ chỉ chứa đoạn trích hiển thị quá trình hạt nhân gọi trình quản lý dịch vụ systemd. Các giá trị ở đầu dòng là số giây tương ứng với thời điểm bắt đầu tải hạt nhân.
Trong các hệ thống dựa trên systemd, lệnh journalctl
sẽ hiển thị thông báo khởi tạo với các tùy chọn -b
, --boot
, -k
hoặc --dmesg
. Lệnh journalctl --list-boots
sẽ hiển thị danh sách các số khởi động liên quan đến lần khởi động hiện tại, hàm băm nhận dạng của chúng và dấu thời gian của thông báo tương ứng đầu tiên và cuối cùng:
$ journalctl --list-boots -4 9e5b3eb4952845208b841ad4dbefa1a6 Thu 2019-10-03 13:39:23 -03—Thu 2019-10-03 13:40:30 -03 -3 9e3d79955535430aa43baa17758f40fa Thu 2019-10-03 13:41:15 -03—Thu 2019-10-03 14:56:19 -03 -2 17672d8851694e6c9bb102df7355452c Thu 2019-10-03 14:56:57 -03—Thu 2019-10-03 19:27:16 -03 -1 55c0d9439bfb4e85a20a62776d0dbb4d Thu 2019-10-03 19:27:53 -03—Fri 2019-10-04 00:28:47 -03 0 08fbbebd9f964a74b8a02bb27b200622 Fri 2019-10-04 00:31:01 -03—Fri 2019-10-04 10:17:01 -03
Các bản ghi khởi tạo trước đó cũng được lưu giữ trong các hệ thống dựa trên systemd. Vì vậy, các thông báo từ các phiên hệ điều hành trước đó vẫn có thể được kiểm tra. Nếu các tùy chọn -b 0
hoặc --boot=0
được cung cấp thì các thông báo cho lần khởi động hiện tại sẽ được hiển thị. Tùy chọn -b -1
hoặc --boot=-1
sẽ hiển thị các thông báo từ lần khởi tạo trước. Các tùy chọn -b -2
hoặc --boot=-2
sẽ hiển thị các thông báo từ lần khởi tạo trước đó, v.v. Đoạn trích sau đây sẽ cho thấy quá trình hạt nhân gọi trình quản lý dịch vụ systemd cho quá trình khởi tạo cuối cùng:
$ journalctl -b 0 oct 04 00:31:01 ubuntu-host kernel: EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null) oct 04 00:31:01 ubuntu-host kernel: ip_tables: (C) 2000-2006 Netfilter Core Team oct 04 00:31:01 ubuntu-host systemd[1]: systemd 237 running in system mode. oct 04 00:31:01 ubuntu-host systemd[1]: Detected architecture x86-64. oct 04 00:31:01 ubuntu-host systemd[1]: Set hostname to <torre>. oct 04 00:31:01 ubuntu-host systemd[1]: Reached target User and Group Name Lookups. oct 04 00:31:01 ubuntu-host systemd[1]: Created slice System Slice. oct 04 00:31:01 ubuntu-host systemd[1]: Listening on Journal Audit Socket. oct 04 00:31:01 ubuntu-host systemd[1]: Listening on Journal Socket. oct 04 00:31:01 ubuntu-host systemd[1]: Mounting POSIX Message Queue File System... oct 04 00:31:01 ubuntu-host systemd[1]: Started Read required files in advance. oct 04 00:31:01 ubuntu-host systemd[1]: Starting Load Kernel Modules... oct 04 00:31:01 ubuntu-host kernel: EXT4-fs (sda1): re-mounted. Opts: commit=300,barrier=0,errors=remount-ro oct 04 00:31:01 ubuntu-host kernel: lp: driver loaded but no devices found oct 04 00:31:01 ubuntu-host kernel: ppdev: user-space parallel port driver oct 04 00:31:01 ubuntu-host kernel: parport_pc 00:02: reported by Plug and Play ACPI oct 04 00:31:01 ubuntu-host kernel: parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA] oct 04 00:31:01 ubuntu-host kernel: lp0: using parport0 (interrupt-driven). oct 04 00:31:01 ubuntu-host systemd-journald[352]: Journal started oct 04 00:31:01 ubuntu-host systemd-journald[352]: Runtime journal (/run/log/journal/abb765408f3741ae9519ab3b96063a15) is 4.9M, max 39.4M, 34.5M free. oct 04 00:31:01 ubuntu-host systemd-modules-load[335]: Inserted module 'lp' oct 04 00:31:01 ubuntu-host systemd-modules-load[335]: Inserted module 'ppdev' oct 04 00:31:01 ubuntu-host systemd-modules-load[335]: Inserted module 'parport_pc' oct 04 00:31:01 ubuntu-host systemd[1]: Starting Flush Journal to Persistent Storage...
Quá trình khởi tạo và các thông báo khác do hệ điều hành đưa ra sẽ được lưu trữ trong các tệp bên trong thư mục /var/log/
. Nếu một lỗi nghiêm trọng xảy ra và hệ điều hành không thể tiếp tục quá trình khởi tạo sau khi tải hạt nhân và initramfs, một phương tiện khởi động thay thế có thể được sử dụng để khởi động hệ thống và truy cập hệ thống tệp tương ứng. Sau đó, các tệp trong /var/log/
sẽ có thể được tìm kiếm để xác định các nguyên nhân có thể gây ra sự gián đoạn quá trình khởi động. Các tùy chọn -D
hoặc --directory
của lệnh journalctl
có thể được sử dụng để đọc các thông điệp tường trình trong các thư mục khác với /var/log/journal/
- vị trí mặc định cho các thông báo nhật ký của systemd. Vì các thông báo nhật ký của systemd không được lưu trữ ở dạng văn bản thô nên ta cần có lệnh journalctl
để có thể đọc chúng.
Bài tập Hướng dẫn
-
Trên một máy có phần sụn BIOS, tệp nhị phân bootstrap sẽ nằm ở đâu?
-
Phần sụn UEFI hỗ trợ các tính năng mở rộng được cung cấp bởi các chương trình bên ngoài được gọi là ứng dụng EFI. Tuy nhiên, những ứng dụng này có vị trí đặc biệt của riêng chúng. Các ứng dụng EFI sẽ được đặt ở đâu trong hệ thống?
-
Trình tải khởi động cho phép truyền các tham số hạt nhân tùy chỉnh trước khi tải nó. Giả sử hệ thống không thể khởi động do vị trí hệ thống tệp gốc bị sai thông tin, làm cách nào để hệ thống tệp gốc chính xác (nằm ở
/dev/sda3
) có thể được cung cấp làm tham số cho hạt nhân? -
Quá trình khởi động của máy Linux kết thúc với thông báo sau:
ALERT! /dev/sda3 does not exist. Dropping to a shell!
Nguyên nhân của vấn đề này là gì?
Bài tập Mở rộng
-
Trình tải khởi động sẽ hiển thị danh sách các hệ điều hành để chọn khi có nhiều hơn một hệ điều hành được cài đặt trên máy. Tuy nhiên, một hệ điều hành mới được cài đặt có thể sẽ ghi đè lên MBR của ổ đĩa cứng, xóa giai đoạn đầu tiên của trình tải khởi động và khiến hệ điều hành khác không thể truy cập được. Tại sao điều này lại không xảy ra trên máy có phần sụn UEFI?
-
Một hậu quả phổ biến của việc cài đặt hạt nhân tùy chỉnh mà không cung cấp hình ảnh initramfs thích hợp là gì?
-
Nhật ký khởi tạo có thể dài đến hàng trăm dòng. Vì vậy, đầu ra của lệnh
dmesg
thường được chuyển thành lệnh máy nhắn tin — như lệnhless
— để thuận tiện cho việc đọc. Tùy chọndmesg
nào sẽ tự động phân trang đầu ra của nó và loại bỏ nhu cầu sử dụng lệnh máy nhắn tin một cách rõ ràng? -
Ổ đĩa cứng chứa toàn bộ hệ thống tệp của máy ngoại tuyến đã bị xóa và gắn vào máy đang hoạt động dưới dạng ổ đĩa phụ. Giả sử điểm gắn kết của nó là
/mnt/hd
thìjournalctl
sẽ được sử dụng như thế nào để kiểm tra nội dung của các tệp nhật ký nằm ở/mnt/hd/var/log/journal/
?
Tóm tắt
Bài học này đã nói về trình tự khởi động trong một hệ thống Linux tiêu chuẩn. Kiến thức chính xác về cách hoạt động của tiến trình khởi động của hệ thống Linux sẽ giúp ngăn chặn các lỗi có thể xảy ra khiến hệ thống không thể truy cập được. Bài học đã đi qua các lĩnh vực chủ đề sau:
-
Phương pháp khởi động BIOS và UEFI khác nhau như thế nào.
-
Các giai đoạn khởi tạo hệ thống điển hình.
-
Khôi phục thông báo khởi động.
Các lệnh và tiến trình đã được nhắc đến là:
-
Các tham số hạt nhân phổ biến.
-
Các lệnh để đọc thông báo khởi động:
dmesg
vàjournalctl
.
Đáp án Bài tập Hướng dẫn
-
Trên một máy có phần sụn BIOS, tệp nhị phân bootstrap sẽ nằm ở đâu?
Trong MBR của thiết bị lưu trữ đầu tiên như đã được định nghĩa trong tiện ích cấu hình BIOS.
-
Phần sụn UEFI hỗ trợ các tính năng mở rộng được cung cấp bởi các chương trình bên ngoài được gọi là ứng dụng EFI. Tuy nhiên, những ứng dụng này có vị trí đặc biệt của riêng chúng. Các ứng dụng EFI sẽ được đặt ở đâu trong hệ thống?
Các ứng dụng EFI được lưu trữ trong Phân vùng hệ thống EFI (ESP) nằm ở bất kỳ khối lưu trữ khả dụng nào có hệ thống tệp tương thích (thường là hệ thống tệp FAT32).
-
Trình tải khởi động cho phép truyền các tham số hạt nhân tùy chỉnh trước khi tải nó. Giả sử hệ thống không thể khởi động do vị trí hệ thống tệp gốc bị sai thông tin, làm cách nào để hệ thống tệp gốc chính xác (nằm ở
/dev/sda3
) có thể được cung cấp làm tham số cho hạt nhân?Nên sử dụng tham số
root
như trongroot=/dev/sda3
. -
Quá trình khởi động của máy Linux kết thúc với thông báo sau:
ALERT! /dev/sda3 does not exist. Dropping to a shell!
Nguyên nhân của vấn đề này là gì?
Hạt nhân không thể tìm thấy thiết bị
/dev/sda3
được thông báo là hệ thống tệp gốc.
Đáp án Bài tập Mở rộng
-
Trình tải khởi động sẽ hiển thị danh sách các hệ điều hành để chọn khi có nhiều hơn một hệ điều hành được cài đặt trên máy. Tuy nhiên, một hệ điều hành mới được cài đặt có thể sẽ ghi đè lên MBR của đĩa cứng, xóa giai đoạn đầu tiên của trình tải khởi động và khiến hệ điều hành khác không thể truy cập được. Tại sao điều này lại không xảy ra trên máy có phần sụn UEFI?
Các máy UEFI không sử dụng MBR của đĩa cứng để lưu trữ giai đoạn đầu tiên của trình tải khởi động.
-
Một hậu quả phổ biến của việc cài đặt hạt nhân tùy chỉnh mà không cung cấp hình ảnh initramfs thích hợp là gì?
Hệ thống tệp gốc có thể sẽ không truy cập được nếu loại của nó được biên dịch dưới dạng mô-đun nhân bên ngoài.
-
Nhật ký khởi tạo có thể dài đến hàng trăm dòng. Vì vậy, đầu ra của lệnh
dmesg
thường được chuyển thành lệnh máy nhắn tin — như lệnhless
— để thuận tiện cho việc đọc. Tùy chọndmesg
nào sẽ tự động phân trang đầu ra của nó và loại bỏ nhu cầu sử dụng lệnh máy nhắn tin một cách rõ ràng?Các lệnh
dmesg -H
hoặcdmesg --human
sẽ bật máy nhắn tin theo mặc định. -
Ổ cứng chứa toàn bộ hệ thống tệp của máy ngoại tuyến đã bị xóa và gắn vào máy đang hoạt động dưới dạng ổ đĩa phụ. Giả sử điểm gắn kết của nó là
/mnt/hd
thìjournalctl
sẽ được sử dụng như thế nào để kiểm tra nội dung của các tệp nhật ký nằm ở/mnt/hd/var/log/journal/
?Với lệnh
journalctl -D /mnt/hd/var/log/journal
hoặcjournalctl --directory=/mnt/hd/var/log/journal
.