102.2 Bài 1
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
102 Cài đặt Linux và Quản lý Gói |
Mục tiêu: |
102.2 Cài đặt Trình Quản lý Khởi động |
Bài: |
1 trên 1 |
Giới thiệu
Khi máy tính được bật nguồn, phần mềm đầu tiên chạy sẽ là trình tải khởi động. Đây là một đoạn mã có mục đích duy nhất là tải hạt nhân hệ điều hành và trao quyền kiểm soát cho hạt nhân đó. Hạt nhân sẽ tải các trình điều khiển cần thiết, khởi tạo phần cứng và sau đó là tải các phần còn lại của hệ điều hành.
GRUB là trình tải khởi động được sử dụng trên hầu hết các bản phân phối Linux. Nó có thể tải nhân Linux hoặc các hệ điều hành khác (ví dụ như Windows) và có thể xử lý nhiều hình ảnh và tham số hạt nhân dưới dạng các mục menu riêng biệt. Việc lựa chọn hạt nhân khi khởi động được thực hiện thông qua giao diện điều khiển bằng bàn phím. Việc chỉnh sửa các tham số và tùy chọn khởi động sẽ được thực hiện trên giao diện dòng lệnh.
Hầu hết các bản phân phối Linux đều tự động cài đặt và định cấu hình GRUB (thực chất là GRUB 2), vì thế mà người dùng thông thường sẽ không cần phải suy nghĩ gì về việc này. Tuy nhiên, với tư cách là quản trị viên hệ thống, việc biết cách kiểm soát quá trình khởi động để có thể khôi phục hệ thống khi gặp phải lỗi khởi động (chẳng hạn như sau khi nâng cấp hạt nhân không thành công) là rất quan trọng.
Trong bài học này, chúng ta sẽ tìm hiểu về cách cài đặt, định cấu hình và tương tác với GRUB.
GRUB Legacy và GRUB 2
Phiên bản gốc của GRUB (Bộ Tải Khởi động Hợp nhất Lớn), nay được gọi là GRUB Legacy, được phát triển vào năm 1995 như một phần của dự án GNU Hurd và sau đó được sử dụng làm trình tải khởi động mặc định của nhiều bản phân phối Linux, thay thế các lựa chọn có từ trước đó như LILO.
GRUB 2 là một bản viết lại hoàn chỉnh của GRUB với mục đích là trở nên gọn gàng hơn, an toàn hơn và mạnh mẽ hơn. GRUB 2 có nhiều ưu điểm so với GRUB Legacy, một trong số đó là tệp cấu hình linh hoạt hơn rất nhiều (có nhiều lệnh và câu lệnh điều kiện hơn, tương tự như một ngôn ngữ tệp lệnh), thiết kế dựa nhiều trên mô-đun hơn và mang tính chất bản địa hóa/quốc tế hóa hơn.
Ngoài ra, nó cũng hỗ trợ cho các chủ đề và menu khởi động đồ họa với màn hình khởi động, khả năng khởi động LiveCD ISO trực tiếp từ ổ cứng, hỗ trợ tốt hơn cho các kiến trúc không phải x86, hỗ trợ phổ biến cho UUID (giúp xác định đĩa và phân vùng dễ dàng hơn) và nhiều hơn thế nữa.
GRUB Legacy không còn được tiếp tục phát triển (bản phát hành cuối cùng là 0,97 vào năm 2005) và ngày nay, hầu hết các bản phân phối Linux lớn đều sử dụng GRUB 2 làm trình tải khởi động mặc định. Tuy nhiên, chúng ta vẫn có thể tìm thấy các hệ thống sử dụng GRUB Legacy. Do đó, chúng ta phải biết cách sử dụng nó và biết được nó khác với GRUB 2 ở những điểm nào.
Bộ tải Khởi động nằm ở đâu?
Trước đây, các ổ đĩa cứng trên các hệ thống tương thích với PC của IBM được phân vùng bằng sơ đồ phân vùng MBR được tạo vào năm 1982 cho IBM PC-DOS (MS-DOS) 2.0.
Trong sơ đồ này, ngành 512 byte đầu tiên của đĩa được gọi là Bản Ghi Khởi động Chính và có chứa một bảng mô tả các phân vùng trên đĩa (bảng phân vùng) và cả mã khởi động được gọi là trình tải khởi động.
Khi máy tính được bật, mã trình tải khởi động rất nhỏ này (do hạn chế về kích thước) sẽ được tải, thực thi và chuyển quyền điều khiển tới trình tải khởi động thứ cấp trên đĩa. Bộ tải này thường nằm trong khoảng trống 32 KB giữa MBR và phân vùng đầu tiên; chúng cũng sẽ lần lượt tải (các) hệ điều hành.
Trên đĩa được phân vùng MBR, mã khởi động cho GRUB sẽ được cài đặt vào MBR. Thao tác này sẽ tải và chuyển quyền kiểm soát tới hình ảnh "lõi" (core
) được cài đặt giữa MBR và phân vùng đầu tiên. Từ thời điểm này, GRUB sẽ có khả năng tải các phần tài nguyên cần thiết còn lại (định nghĩa menu, tệp cấu hình và các mô-đun bổ sung) từ đĩa.
Tuy nhiên, MBR có giới hạn về số lượng phân vùng (ban đầu tối đa là 4 phân vùng chính, sau này tối đa là 3 phân vùng chính với 1 phân vùng mở rộng được chia nhỏ thành một số phân vùng logic) và kích thước đĩa tối đa là 2TB. Để khắc phục những hạn chế này, sơ đồ phân vùng mới được gọi là GPT (GUID Partition Table - Bảng phân vùng GUID) - một phần của tiêu chuẩn UEFI (Unified Extensible Firmware Interface) - đã được tạo.
Ổ đĩa cứng được phân vùng GPT có thể được sử dụng với máy tính có PC BIOS truyền thống hoặc máy tính có phần sụn UEFI. Trên các máy có BIOS, phần thứ hai của GRUB sẽ được lưu trữ trong phân vùng khởi động BIOS đặc biệt.
Trên các hệ thống có phần sụn UEFI, GRUB sẽ được chương trình cơ sở tải từ các tệp grubia32.efi
(đối với hệ thống 32-Bit) hoặc grubx64.efi
(đối với hệ thống 64-Bit) từ một phân vùng có tên là ESP (Phân vùng hệ thống EFI ).
Phân vùng /boot
Trên Linux, các tệp cần thiết cho quá trình khởi động thường được lưu trữ trên phân vùng khởi động gắn trong hệ thống tệp gốc và thường được gọi là /boot
.
Phân vùng khởi động không phải là một yếu tố cần thiết trên các hệ thống hiện tại vì các trình tải khởi động như GRUB thường có thể tự gắn hệ thống tệp gốc và tìm kiếm các tệp cần thiết bên trong thư mục /boot
. Tuy vậy, việc phân vùng khởi động vẫn khá là hữu ích vì nó phân tách các tệp cần thiết cho quá trình khởi động với các phần còn lại của hệ thống tệp.
Phân vùng này thường là phân vùng đầu tiên trên đĩa. Điều này là do IBM PC BIOS ban đầu đã xử lý các đĩa sử dụng xilanh, đầu và ngành (CHS) với tối đa 1024 xilanh, 256 đầu và 63 ngành, dẫn đến kích thước đĩa tối đa là 528 MB (504 MB trong MS-DOS) . Điều này có nghĩa là mọi thứ vượt qua mốc này sẽ không thể truy cập được trừ khi ta sử dụng sơ đồ địa chỉ đĩa khác (như Định Địa chỉ Khối Logic - LBA).
Vì vậy, để có thể tương thích tối đa, phân vùng /boot
thường nằm ở đầu đĩa và kết thúc trước xi lanh 1024 (528 MB) để đảm bảo rằng máy sẽ luôn tải được hạt nhân. Kích thước khuyến nghị cho phân vùng này trên một máy hiện tại là 300 MB.
Các lý do khác cho việc có một phân vùng riêng biệt dành cho /boot
là việc mã hóa và nén vì một số phương pháp có thể chưa được GRUB 2 hỗ trợ, hoặc nếu người dùng cần định dạng phân vùng gốc hệ thống (/
) bằng một hệ thống tệp không được hỗ trợ.
Nội dung của Phân vùng Khởi động
Nội dung của phân vùng /boot
có thể thay đổi theo kiến trúc hệ thống hoặc trình tải khởi động đang được sử dụng. Trên hệ thống dựa trên x86, ta thường sẽ tìm thấy các tệp như bên dưới. Hầu hết trong số này được đặt tên với hậu tố -VERSION
, trong đó, -VERSION
là phiên bản của nhân Linux tương ứng. Vì vậy, nếu có một tệp cấu hình dành cho phiên bản nhân Linux 4.15.0-65-generic
thì nó sẽ được gọi là config-4.15.0-65-generic
.
- Config file
-
Tệp này thường được gọi là
config-VERSION
(xem ví dụ ở trên) và nó lưu trữ các tham số cấu hình cho nhân Linux. Tệp này sẽ được tạo tự động khi hạt nhân mới được biên dịch hoặc cài đặt và người dùng không nên trực tiếp sửa đổi nó. - System map
-
Tệp này là một bảng tra cứu khớp các tên biểu tượng (như biến hoặc hàm) với vị trí tương ứng của chúng trong bộ nhớ. Điều này rất hữu ích trong việc gỡ một loại lỗi hệ thống được gọi là lỗi loạn hạt nhân vì nó cho phép người dùng biết biến hoặc chức năng nào đã được gọi khi xảy ra lỗi. Giống như tệp cấu hình, tên của nó thường sẽ là
System.map-VERSION
(ví dụ:System.map-4.15.0-65-generic
). - Linux kernel
-
Đây là hạt nhân hệ điều hành thích hợp. Tên của nó thường sẽ là
vmlinux-VERSION
(ví dụ:vmlinux-4.15.0-65-generic
). Ta cũng có thể tìm thấy tênvmlinuz
thay vìvmlinux
, ký tựz
ở cuối có nghĩa là tệp đã được nén. - Initial RAM disk
-
Phần này thường được gọi là
initrd.img-VERSION
và nó sẽ chứa một hệ thống tệp gốc tối thiểu được tải vào đĩa RAM. Hệ thống này sẽ chứa các tiện ích và mô-đun nhân cần thiết để hạt nhân có thể gắn kết hệ thống tệp gốc thực. - Boot loader related files
-
Trên các hệ thống đã được cài đặt GRUB, chúng thường sẽ nằm trong
/boot/grub
và bao gồm tệp cấu hình GRUB (/boot/grub/grub.cfg
đối với GRUB 2 hoặc/boot/grub/menu.lst
đối với GRUB Legacy), các mô-đun (trong/boot/grub/i386-pc
), các tệp dịch (trong/boot/grub/locale
) và phông chữ (trong/boot/grub/fonts
).
GRUB 2
Cài đặt GRUB 2
GRUB 2 có thể được cài đặt bằng tiện ích grub-install
. Nếu hệ thống không khởi động được, ta sẽ cần khởi động bằng Live CD hoặc đĩa cứu hộ, tìm phân vùng khởi động cho hệ thống, gắn nó vào rồi chạy tiện ích.
Note
|
Các lệnh bên dưới sẽ giả định rằng ta đã đăng nhập với quyền gốc. Nếu không, trước tiên hãy chạy |
Ổ đĩa cứng đầu tiên trên hệ thống thường là thiết bị khởi động và ta cần biết liệu có phân vùng khởi động có trên đĩa hay không. Điều này có thể được thực hiện với tiện ích fdisk
. Để liệt kê tất cả các phân vùng trên đĩa đầu tiên của máy, hãy sử dụng:
# fdisk -l /dev/sda Disk /dev/sda: 111,8 GiB, 120034123776 bytes, 234441648 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x97f8fef5 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 2000895 1998848 976M 83 Linux /dev/sda2 2002942 234440703 232437762 110,9G 5 Extended /dev/sda5 2002944 18008063 16005120 7,6G 82 Linux swap / Solaris /dev/sda6 18010112 234440703 216430592 103,2G 83 Linux
Phân vùng khởi động được xác định bằng *
bên dưới cột khởi động. Trong ví dụ trên thì nó là /dev/sda1
.
Bây giờ, hãy tạo một thư mục tạm thời trong /mnt
và gắn kết phân vùng bên dưới nó:
# mkdir /mnt/tmp # mount /dev/sda1 /mnt/tmp
Sau đó, hãy chạy grub-install
, trỏ nó tới thiết bị khởi động (không phải phân vùng) và thư mục nơi phân vùng khởi động được gắn kết. Nếu hệ thống có phân vùng khởi động chuyên dụng, lệnh sẽ là:
# grub-install --boot-directory=/mnt/tmp /dev/sda
Nếu đang cài đặt vào hệ thống không có phân vùng khởi động mà chỉ có thư mục /boot
trên hệ thống tệp gốc, hãy trỏ grub-install
vào đó. Vì thế, lệnh sẽ là:
# grub-install --boot-directory=/boot /dev/sda
Định Cấu hình GRUB 2
Tệp cấu hình mặc định cho GRUB 2 là /boot/grub/grub.cfg
. Tệp này được tạo tự động và không nên được chỉnh sửa thủ công. Để thay đổi cấu hình GRUB, ta cần chỉnh sửa tệp /etc/default/grub
và sau đó là chạy tiện ích update-grub
để tạo tệp tuân thủ.
Note
|
|
Có một số tùy chọn trong tệp /etc/default/grub
sẽ kiểm soát hành vi của GRUB 2 như hạt nhân mặc định để khởi động, thời gian chờ, tham số dòng lệnh bổ sung, v.v. Những tùy chọn quan trọng nhất là:
GRUB_DEFAULT=
-
Mục menu mặc định để khởi động. Đây có thể là một giá trị số (như
0
,1
, v.v.), tên của một mục menu (nhưdebian
) hoặcsaved
được sử dụng cùng vớiGRUB_SAVEDEFAULT=
và sẽ được giải thích ở bên dưới . Hãy nhớ rằng các mục menu sẽ bắt đầu từ 0; vì vậy, mục menu đầu tiên sẽ là0
, mục thứ hai sẽ là1
, v.v. GRUB_SAVEDEFAULT=
-
Nếu tùy chọn này được đặt thành
true
vàGRUB_DEFAULT=
được đặt thànhsaved
thì tùy chọn khởi động mặc định sẽ luôn là tùy chọn cuối cùng được chọn trong menu khởi động. GRUB_TIMEOUT=
-
Thời gian chờ được tính bằng giây trước khi mục menu mặc định được chọn. Nếu được đặt thành
0
, hệ thống sẽ khởi động mục nhập mặc định mà không hiển thị menu. Nếu được đặt thành-1
, hệ thống sẽ đợi cho tới khi người dùng chọn một tùy chọn, bất kể là mất bao lâu. GRUB_CMDLINE_LINUX=
-
Tuỳ chọn sẽ này liệt kê các tùy chọn dòng lệnh được thêm vào các mục cho nhân Linux.
GRUB_CMDLINE_LINUX_DEFAULT=
-
Theo mặc định, hai mục menu sẽ được tạo cho mỗi nhân Linux, một mục có các tùy chọn mặc định và một mục dùng để khôi phục. Với tùy chọn này, ta có thể thêm các tham số bổ sung và chúng sẽ chỉ được thêm vào mục nhập mặc định.
GRUB_ENABLE_CRYPTODISK=
-
Nếu được đặt thành
y
, các lệnh nhưgrub-mkconfig
,update-grub
vàgrub-install
sẽ tìm các đĩa được mã hóa và thêm các lệnh cần thiết để truy cập chúng trong khi khởi động. Việc này sẽ vô hiệu hóa khả năng khởi động tự động (GRUB_TIMEOUT=
với bất kỳ giá trị nào khác-1
) vì sẽ cần có cụm mật khẩu để giải mã các đĩa trước khi có thể truy cập chúng.
Quản lý Mục Menu
Khi update-grub
được chạy, GRUB 2 sẽ quét các hạt nhân và hệ điều hành trên máy và tạo các mục menu tương ứng trên tệp /boot/grub/grub.cfg
. Các mục mới có thể được thêm thủ công vào các tệp tệp lệnh trong thư mục /etc/grub.d
.
Các tệp này phải có thể thực thi được và được update-grub
xử lý theo thứ tự số. Do đó, 05_debian_theme
sẽ được xử lý trước 10_linux
, v.v. Các mục menu tùy chỉnh thường được thêm vào tệp 40_custom
.
Cú pháp cơ bản cho một mục menu sẽ giống như sau:
menuentry "Default OS" { set root=(hd0,1) linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
Dòng đầu tiên sẽ luôn bắt đầu bằng menuentry
và kết thúc bằng {
. Văn bản giữa các dấu ngoặc kép sẽ được hiển thị dưới dạng nhãn của mục trên menu khởi động GRUB 2.
Tham số set root
sẽ xác định đĩa và phân vùng chứa hệ thống tệp gốc cho hệ điều hành. Hãy lưu ý rằng trên GRUB, 2 đĩa sẽ được đánh số từ 0; vì vậy, hd0
sẽ là đĩa đầu tiên (sda
trong Linux), hd1
là đĩa thứ hai, v.v. Tuy nhiên, các phân vùng lại được đánh số bắt đầu từ một. Trong ví dụ trên, hệ thống tệp gốc nằm ở đĩa đầu tiên (hd0
), phân vùng đầu tiên (,1
) hoặc sda1
.
Thay vì chỉ định trực tiếp thiết bị và phân vùng, ta cũng có thể yêu cầu GRUB 2 tìm kiếm hệ thống tệp có nhãn cụ thể hoặc UUID (Số Nhận dạng Duy nhất Toàn cầu). Đối với việc này, hãy sử dụng tham số search --set=root
, theo sau là tham số --label
và nhãn hệ thống tệp để tìm kiếm, hoặc --fs-uuid
theo sau là UUID của hệ thống tệp.
Ta có thể tìm UUID của hệ thống tệp bằng lệnh dưới đây:
$ ls -l /dev/disk/by-uuid/ total 0 lrwxrwxrwx 1 root root 10 nov 4 08:40 3e0b34e2-949c-43f2-90b0-25454ac1595d -> ../../sda5 lrwxrwxrwx 1 root root 10 nov 4 08:40 428e35ee-5ad5-4dcb-adca-539aba6c2d84 -> ../../sda6 lrwxrwxrwx 1 root root 10 nov 5 19:10 56C11DCC5D2E1334 -> ../../sdb1 lrwxrwxrwx 1 root root 10 nov 4 08:40 ae71b214-0aec-48e8-80b2-090b6986b625 -> ../../sda1
Trong ví dụ trên, UUID cho /dev/sda1
là ae71b214-0aec-48e8-80b2-090b6986b625
. Nếu bạn muốn đặt nó làm thiết bị gốc cho GRUB 2, lệnh sẽ là search --set=root --fs-uuid ae71b214-0aec-48e8-80b2-090b6986b625
.
Khi sử dụng lệnh search
, người ta thường thêm tham số --no-floppy
để GRUB không mất thời gian tìm kiếm trên đĩa mềm.
Dòng linux
cho biết vị trí đặt hạt nhân của hệ điều hành (trong trường hợp này là tệp vmlinuz
ở thư mục gốc của hệ thống tệp). Sau đó, ta có thể truyền tham số dòng lệnh đến hạt nhân.
Trong ví dụ trên, chúng ta đã chỉ định phân vùng gốc (root=/dev/sda1
) và chuyển ba tham số hạt nhân: phân vùng gốc phải được gắn ở chế độ chỉ đọc (ro
), hầu hết các thông báo tường trình sẽ bị vô hiệu hóa (` quiet`) và một màn hình giật gân sẽ được hiển thị (splash
).
Dòng initrd
cho biết vị trí của đĩa RAM ban đầu. Trong ví dụ trên, tệp là initrd.img
nằm ở thư mục gốc của hệ thống tệp.
Note
|
Hầu hết các bản phân phối Linux không thực sự đặt hạt nhân và initrd vào thư mục gốc của hệ thống tệp gốc. Thay vào đó, đây là các liên kết đến các tệp thực tế bên trong thư mục hoặc phân vùng |
Dòng cuối cùng của mục menu chỉ được chứa ký tự }
.
Tương tác với GRUB 2
Khi khởi động hệ thống bằng GRUB 2, ta sẽ thấy một menu các tùy chọn. Hãy sử dụng các phím mũi tên để chọn một tùy chọn và phím Enter để xác nhận và khởi động mục đã chọn.
Tip
|
Nếu bạn chỉ thấy đồng hồ đếm ngược chứ không thấy menu, hãy nhấn phím Shift để hiển thị menu. |
Để chỉnh sửa một tùy chọn, hãy chọn tùy chọn đó bằng các phím mũi tên và nhấn phím E để hiển thị một cửa sổ soạn thảo với nội dung của menuentry
được liên kết với tùy chọn đó như đã được xác định trong /boot/grub/grub.cfg
.
Sau khi chỉnh sửa một tùy chọn, hãy nhập Ctrl+X hoặc F10 để khởi động hoặc Esc để quay lại menu.
Để vào vỏ GRUB 2, hãy nhấn C trên màn hình menu (hoặc Ctrl+C) trên cửa sổ soạn thảo) và ta sẽ thấy một dấu nhắc lệnh như thế này: grub >
Hãy nhập help
để xem danh sách tất cả các lệnh có sẵn hoặc nhấn Esc để thoát khỏi vỏ và quay lại màn hình menu.
Note
|
Hãy nhớ rằng menu này sẽ không xuất hiện nếu |
Khởi động từ Vỏ GRUB 2
Ta có thể sử dụng vỏ GRUB 2 để khởi động hệ thống trong trường hợp cấu hình sai trong mục nhập menu khiến nó bị lỗi.
Điều đầu tiên chúng ta nên làm là tìm xem phân vùng khởi động ở đâu. Ta có thể làm điều đó bằng lệnh ls
; lệnh này sẽ hiển thị danh sách các phân vùng và đĩa mà GRUB 2 đã tìm thấy.
grub> ls (proc) (hd0) (hd0,msdos1)
Trong ví dụ trên, mọi thứ rất dễ dàng vì chỉ có một đĩa (hd0)
với duy nhất một phân vùng trên đó là (hd0,msdos1)
.
Các đĩa và phân vùng nào được liệt kê sẽ khác nhau tuỳ thuộc từng hệ thống. Trong ví dụ của chúng ta, phân vùng đầu tiên của hd0
được gọi là msdos1
vì đĩa được phân vùng bằng sơ đồ phân vùng MBR. Nếu nó được phân vùng bằng GPT, tên sẽ là gpt1
.
Để khởi động Linux, chúng ta cần một hạt nhân và đĩa RAM ban đầu (initrd). Hãy cùng kiểm tra nội dung của (hd0,msdos1)
:
grub> ls (hd0,msdos1)/ lost+found/ swapfile etc/ media/ bin/ boot/ dev/ home/ lib/ lib64/ mnt/ opt/ proc/ root/ run/ sbin/ srv/ sys/ tmp/ usr/ var/ initrd.img initrd.img.old vmlinuz cdrom/
Chúng ta có thể thêm tham số -l
vào ls
để có một danh sách dài tương tự như những gì ta sẽ nhận được trên cửa sổ dòng lệnh Linux. Hãy sử dụng Tab để tự động điền tên đĩa, phân vùng và tên tệp.
Hãy lưu ý rằng chúng ta có một hình ảnh hạt nhân (vmlinuz
) và initrd (initrd.img
) ngay trên thư mục gốc. Nếu không, chúng ta có thể kiểm tra nội dung của /boot
với list (hd0,msdos1)/boot/
.
Bây giờ, hãy đặt phân vùng khởi động:
grub> set root=(hd0,msdos1)
Hãy tải nhân Linux bằng lệnh linux
, theo sau là đường dẫn đến hạt nhân và tùy chọn root=
để báo cho hạt nhân biết vị trí của hệ thống tệp gốc cho hệ điều hành.
grub> linux /vmlinuz root=/dev/sda1
Tải đĩa RAM ban đầu bằng initrd
, theo sau là đường dẫn đầy đủ đến tệp initrd.img
:
grub> initrd /initrd.img
Bây giờ, hãy khởi động hệ thống với boot
.
Khởi động từ Vỏ Cứu hộ
Trong trường hợp khởi động không thành công, GRUB 2 có thể tải vỏ cứu hộ (rescue shell) - một phiên bản đơn giản hóa của vỏ mà chúng ta đã đề cập tới trước đây. Chúng ta sẽ nhận ra nó bằng dấu nhắc lệnh hiển thị grub rescue>
.
Quá trình khởi động hệ thống từ vỏ này cũng sẽ gần giống như đã được trình bày ở trên. Tuy nhiên, chúng ta sẽ cần tải một vài mô-đun GRUB 2 để hệ thống có thể hoạt động.
Sau khi tìm ra phân vùng nào là phân vùng khởi động (với ls
), hãy sử dụng lệnh set prefix=
, theo sau là đường dẫn đầy đủ đến thư mục chứa các tệp GRUB 2, thường sẽ là /boot/grub
. Trong ví dụ của chúng ta:
grub rescue> set prefix=(hd0,msdos1)/boot/grub
Bây giờ, hãy tải các mô-đun normal
và linux
bằng lệnh insmod
:
grub rescue> insmod normal grub rescue> insmod linux
Tiếp theo, hãy đặt phân vùng khởi động bằng set root=
như hướng dẫn ở trên, tải nhân linux (với linux
), đĩa RAM ban đầu (initrd
) và thử khởi động bằng boot
.
GRUB Legacy
Cài đặt GRUB Legacy từ Hệ thống đang chạy
Để cài đặt GRUB Legacy trên đĩa từ hệ thống đang chạy, chúng ta có thể sử dụng tiện ích grub-install
. Lệnh cơ bản là grub-install DEVICE
, trong đó, DEVICE
là đĩa cần cài đặt GRUB Legacy ở đó. Một ví dụ có thể là /dev/sda
.
# grub-install /dev/sda
Hãy lưu ý rằng ta cần chỉ định thiết bị nơi GRUB Legacy sẽ được cài đặt (ví dụ như /dev/sda/
) chứ không phải phân vùng như trong /dev/sda1
.
Theo mặc định, GRUB sẽ sao chép các tệp cần thiết vào thư mục /boot
trên thiết bị được chỉ định. Nếu muốn sao chép chúng sang một thư mục khác, ta có thể sử dụng tham số --boot-directory=
, theo sau là đường dẫn đầy đủ đến nơi các tệp sẽ được sao chép vào.
Cài đặt GRUB Legacy từ Vỏ GRUB
Nếu không thể khởi động hệ thống vì một lý do nào đó và cần cài đặt lại GRUB Legacy, chúng ta có thể thực hiện điều này từ Vỏ GRUB trên đĩa khởi động GRUB Legacy.
Từ vỏ GRUB (nhập c
tại menu khởi động để đến dấu nhắc grub>
), bước đầu tiên là đặt thiết bị khởi động chứa thư mục /boot
. Ví dụ: nếu thư mục này nằm trong phân vùng đầu tiên của đĩa đầu tiên, lệnh sẽ là:
grub> root (hd0,0)
Nếu không biết thiết bị nào chứa thư mục /boot
, ta có thể yêu cầu GRUB tìm kiếm nó bằng lệnh find
như dưới đây:
grub> find /boot/grub/stage1 (hd0,0)
Sau đó, hãy thiết lập phân vùng khởi động như hướng dẫn ở trên, sử dụng lệnh setup
để cài đặt GRUB Legacy vào MBR và sao chép các tệp cần thiết vào đĩa:
grub> setup (hd0)
Khi hoàn tất khởi động lại hệ thống, nó sẽ khởi động một cách bình thường.
Định cấu hình các Mục Nhập và Cài đặt Menu của GRUB Legacy
Các mục nhập và cài đặt menu của GRUB Legacy được lưu trữ trong tệp /boot/grub/menu.lst
. Đây là một tệp văn bản đơn giản với danh sách các lệnh và tham số, có thể được chỉnh sửa trực tiếp bằng trình soạn thảo văn bản mà bạn yêu thích.
Các dòng bắt đầu bằng #
được coi là chú thích và các dòng trống sẽ bị bỏ qua.
Một mục menu có ít nhất ba lệnh. Lệnh đầu tiên là title
, dùng để đặt tiêu đề của hệ điều hành trên màn hình menu. Lệnh thứ hai là root
sẽ cho GRUB Legacy biết khởi động từ thiết bị hoặc phân vùng nào.
Lệnh thứ ba là kernel
và được dùng để chỉ định đường dẫn đầy đủ đến hình ảnh hạt nhân sẽ được tải khi mục tương ứng được chọn. Hãy lưu ý rằng đường dẫn này có liên quan đến thiết bị được chỉ định trên tham số root
.
Một ví dụ đơn giản như sau:
# This line is a comment title My Linux Distribution root (hd0,0) kernel /vmlinuz root=/dev/hda1
Không giống như GRUB 2, trong GRUB Legacy, cả phân vùng và đĩa đều được đánh số từ 0. Vì vậy, lệnh root (hd0,0)
sẽ đặt phân vùng khởi động là phân vùng đầu tiên (0
) của đĩa đầu tiên (hd0
).
Chúng ta có thể bỏ qua câu lệnh root
khi chỉ định thiết bị khởi động trước đường dẫn trên lệnh kernel
. Cú pháp của chúng giống nhau; vì vậy:
kernel (hd0,0)/vmlinuz root=dev/hda1
tương đương với:
root (hd0,0) kernel /vmlinuz root=/dev/hda1
Cả hai đều sẽ tải tệp vmlinuz
từ thư mục gốc (/
) của phân vùng đầu tiên của đĩa đầu tiên (hd0,0
).
Tham số root=/dev/hda1
sau lệnh kernel
sẽ cho nhân Linux biết phân vùng nào sẽ được sử dụng làm hệ thống tệp gốc. Đây là tham số nhân Linux, không phải một lệnh GRUB Legacy.
Note
|
Để tìm hiểu thêm về các tham số hạt nhân, hãy xem https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html. |
Chúng ta có thể sẽ cần chỉ định vị trí hình ảnh của Đĩa RAM ban đầu cho hệ điều hành với tham số initrd
. Đường dẫn đầy đủ đến tệp có thể được chỉ định như trong tham số kernel
và ta cũng có thể chỉ định thiết bị hoặc phân vùng trước đường dẫn, ví dụ:
# This line is a comment title My Linux Distribution root (hd0,0) kernel /vmlinuz root=/dev/hda1 initrd /initrd.img
GRUB Legacy có thiết kế dựa trên mô-đun; trong đó, các mô-đun (thường được lưu trữ dưới dạng tệp .mod
trong /boot/grub/i386-pc
) có thể được tải để thêm các tính năng bổ sung như các hỗ trợ cho phần cứng bất thường, hệ thống tệp hoặc thuật toán nén mới .
Các mô-đun có thể được tải bằng cách sử dụng lệnh module
, theo sau là đường dẫn đầy đủ đến tệp .mod
tương ứng. Hãy nhớ rằng, giống như hạt nhân và hình ảnh initrd, đường dẫn này có liên quan đến thiết bị được chỉ định trong lệnh root
.
Ví dụ bên dưới sẽ tải mô-đun 915resolution
cần thiết cho việc thiết lập chính xác độ phân giải của bộ nhớ đệm khung trên các hệ thống có bộ vi xử lý video chuỗi sê-ri 800 hoặc 900.
module /boot/grub/i386-pc/915resolution.mod
Tải Chuỗi Hệ điều hành khác
GRUB Legacy có thể được sử dụng để tải các hệ điều hành không được hỗ trợ (chẳng hạn như Windows) sử dụng tiến trình có tên là tải chuỗi (chainloading). GRUB Legacy sẽ được tải trước và khi tùy chọn tương ứng được chọn, trình tải khởi động cho hệ thống mong muốn sẽ được tải.
Một mục điển hình cho việc tải chuỗi Windows sẽ giống như dưới đây:
# Load Windows title Windows XP root (hd0,1) makeactive chainload +1 boot
Hãy cùng xem từng tham số. Như trước đây, root (hd0,1)
sẽ chỉ định thiết bị và phân vùng nơi đặt trình tải khởi động cho hệ điều hành cần tải. Trong ví dụ này sẽ là phân vùng thứ hai của đĩa đầu tiên.
makeactive
-
sẽ đặt cờ cho biết đây là phân vùng đang hoạt động. Điều này chỉ đúng trên các phân vùng chính của DOS.
chainload +1
-
yêu cầu GRUB tải ngành đầu tiên của phân vùng khởi động. Đây là nơi thường đặt trình tải khởi động.
boot
-
sẽ chạy trình tải khởi động và tải hệ điều hành tương ứng.
Bài tập Hướng dẫn
-
Vị trí mặc định cho tệp cấu hình GRUB 2 là gì?
-
Các bước cần thiết để thay đổi cài đặt cho GRUB 2 là gì?
-
Nên thêm các mục menu GRUB 2 tùy chỉnh vào tệp nào?
-
Các mục menu cho GRUB Legacy được lưu trữ ở đâu?
-
Từ menu GRUB 2 hoặc GRUB Legacy, làm cách nào để có thể vào Vỏ GRUB?
Bài tập Mở rộng
-
Hãy tưởng tượng một người dùng đang định cấu hình GRUB Legacy để khởi động từ phân vùng thứ hai của đĩa đầu tiên. Họ đã viết mục menu tùy chỉnh sau:
title My Linux Distro root (hd0,2) kernel /vmlinuz root=/dev/hda1 initrd /initrd.img
Tuy nhiên, hệ thống lại không khởi động. Hãy giải thích tại sao.
-
Hãy tưởng tượng bạn có một đĩa được xác định là
/dev/sda
với nhiều phân vùng. Lệnh nào có thể được sử dụng để tìm ra đâu là phân vùng khởi động trên hệ thống? -
Lệnh nào có thể được sử dụng để tìm ra UUID của một phân vùng?
-
Hãy xem xét mục sau cho GRUB 2.
menuentry "Default OS" { set root=(hd0,1) linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
Hãy thay đổi nó để hệ thống khởi động từ đĩa với UUID
5dda0af3-c995-481a-a6f3-46dcd3b6998d
-
Làm cách nào để có thể đặt GRUB 2 đợi trong 10 giây trước khi khởi động mục menu mặc định?
-
Từ Vỏ GRUB Legacy, các lệnh để cài đặt GRUB vào phân vùng đầu tiên của đĩa thứ hai là gì?
Tóm tắt
Trong bài học này, chúng ta đã học về:
-
Trình tải khởi động là gì.
-
Sự khác biệt giữa GRUB Legacy và GRUB 2.
-
Phân vùng khởi động và nội dung của nó là gì.
-
Cách cài đặt GRUB Legacy và GRUB 2.
-
Cách định cấu hình GRUB Legacy và GRUB 2.
-
Cách thêm các mục menu tùy chỉnh vào GRUB Legacy và GRUB 2.
-
Cách tương tác với màn hình menu và bảng điều khiển của GRUB Legacy và GRUB 2.
-
Cách khởi động hệ thống từ GRUB Legacy hoặc vỏ GRUB 2 hoặc vỏ cứu hộ.
Các lệnh sau đã được thảo luận trong bài học này:
-
grub-install
-
update-grub
-
grub-mkconfig
Đáp án Bài tập Hướng dẫn
-
Vị trí mặc định cho tệp cấu hình GRUB 2 là gì?
/boot/grub/grub.cfg
-
Các bước cần thiết để thay đổi cài đặt cho GRUB 2 là gì?
Hãy thực hiện các thay đổi đối với tệp
/etc/default/grub
, sau đó cập nhật cấu hình bằngupdate-grub
. -
Nên thêm các mục menu GRUB 2 tùy chỉnh vào tệp nào?
/etc/grub.d/40_custom
-
Các mục menu cho GRUB Legacy được lưu trữ ở đâu?
/boot/grub/menu.lst
-
Từ menu GRUB 2 hoặc GRUB Legacy, làm cách nào để có thể vào Vỏ GRUB?
Nhấn
c
trong màn hình menu.
Đáp án Bài tập Mở rộng
-
Hãy tưởng tượng một người dùng đang định cấu hình GRUB Legacy để khởi động từ phân vùng thứ hai của đĩa đầu tiên. Họ đã viết mục menu tùy chỉnh sau:
title My Linux Distro root (hd0,2) kernel /vmlinuz root=/dev/hda1 initrd /initrd.img
Tuy nhiên, hệ thống lại không khởi động. Hãy giải thích tại sao.
Phân vùng khởi động đã bị sai. Hãy nhớ rằng, không giống như GRUB 2, GRUB Legacy sẽ đếm các phân vùng từ số không. Vì vậy, lệnh đúng cho phân vùng thứ hai của đĩa đầu tiên phải là
root (hd0,1)
. -
Hãy tưởng tượng bạn có một đĩa được xác định là
/dev/sda
với nhiều phân vùng. Lệnh nào có thể được sử dụng để tìm ra đâu là phân vùng khởi động trên hệ thống?Sử dụng
fdisk -l /dev/sda
. Phân vùng khởi động sẽ được đánh dấu hoa thị (*
) trong danh sách. -
Lệnh nào có thể được sử dụng để tìm ra UUID của một phân vùng?
Sử dụng
ls -la /dev/disk/by-uuid/
và tìm UUID trỏ đến phân vùng. -
Hãy xem xét mục sau cho GRUB 2.
menuentry "Default OS" { set root=(hd0,1) linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
Hãy thay đổi nó để hệ thống khởi động từ đĩa với UUID
5dda0af3-c995-481a-a6f3-46dcd3b6998d
Ta sẽ cần thay đổi câu lệnh
set root
. Thay vì chỉ định đĩa và phân vùng, hãy yêu cầu grub tìm kiếm phân vùng có UUID mong muốn.menuentry "Default OS" { search --set=root --fs-uuid 5dda0af3-c995-481a-a6f3-46dcd3b6998d linux /vmlinuz root=/dev/sda1 ro quiet splash initrd /initrd.img }
-
Làm cách nào để có thể đặt GRUB 2 đợi trong 10 giây trước khi khởi động mục menu mặc định?
Thêm tham số
GRUB_TIMEOUT=10
vào/etc/default/grub
. -
Từ Vỏ GRUB Legacy, các lệnh để cài đặt GRUB vào phân vùng đầu tiên của đĩa thứ hai là gì?
grub> root (hd1,0) grub> setup (hd1)