Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Tìm hiểu về Linux boot process | #2
Linux boot process là quá trình khởi tạo hệ thống Linux. Nó bao bước từ khi ta bật máy đến khi giao diện người dùng sẵn sàng.
Giờ hãy tìm hiểu từng phần một!
BIOS POST
BIOS - Basic Input/Output System
Về bản chất, BIOS là một nhóm lệnh được lưu trữ trên một chip firmware nằm ở trên bo mạch chủ (mainboard) của máy vi tính. BIOS kiểm soát các tính năng cơ bản của máy vi tính như : Kết nối và chạy trình điều khiển (driver) cho các thiết bị ngoại vi (chuột, bàn phím, usb…), đọc thứ tự ổ cứng để khởi động các hệ điều hành, hiển thị tín hiệu lên màn hình v.v… Sau đó, nó sẽ giao lại quyền cho bootloader.
POST - Power On Self Test
Khi IBM thiết kế cái máy tính đầu tiên năm 1981, BIOS được thiết kế để khởi động các thiết bị phần cứng. POST là một phần của BIOS có nhiệm vụ đảm bảo phần cứng máy tính hoạt động chính xác. Nếu POST thất bại thì máy tính có thể không sử dụng được nên quá trình khởi động dừng lại (Là máy đi luôn đó~~).
Sau khi POST kiểm tra các thiết bị phần cứng mà không có vấn đề gì. Nó sẽ gọi BIOS interrupt call (Cái này nó sẽ thực hiện một chức năng cơ bản nào đó) để tìm kiếm vàload boot record
vào RAM và giao quyền lại cho boot record
, thực chất đây là giai đoạn của đầu tiên của Boot loader
.
Master Boot Record và Boot Loader
Đây là danh sách một số bootloader được dùng cho Linux:
- GRUB - GRand Unified Boot loader - Gồm GRUB và GRUB2
- ISOLINUX
- DAS U-Boot
Bài viết sẽ tập trong nói về GRUB 2 vì nó mới và xịn hơn mấy cái cũ hơn. Để có kiến thức một các trực quan và đầy đủ hơn. Trong phần này, chu trình GRUB 2 sẽ được chia là 3 giai đoạn để việc hiểu được công việc của nó trở nên dễ dàng hơn.
Giai đoạn 1
Như đã đề cập ở trên ở cuối bước POST
thì boot record
sẽ được load vào RAM. boot record
thường được lưu trữ tại Master Boot Record -MBR. Bootstrap code
ở giai đoạn này rất nhỏ vì nó chỉ có một không gian 512 bytes để lưu trữ cùng với partition table
nữa. Nên thường thì có chỉ có dung lượng khoảng 446 bytes với tên gọi là boot.img
. Và vì boot record
có dung lượng rất nhỏ nên nó sẽ không được "thông minh" cho lắm nên nhiệm vụ chính của nó sẽ là định vị và load core.img
.
Giai đoạn 1.5
Giai đoạn 1.5 là việc của file core.img
chứ không file là file boot.img
như ở trên. Nó nằm ở khoảng không gian của boot record
(MBR) và phân vùng đầu tiên ==> khoảng 31,744 bytes (32 Mb). Và cũng như file boot.img
bên trên, flie core.img
cũng chỉ có dung lượng 25,389 bytes thôi. Và vì "thông minh" nên nhiệm vụ của nó là định vị, load các tệp tin trong/boot
mà trong GRUB 2 là /boot/grub2
và load các trình điều khiển cần thiết khác.
Một lưu ý ở đây là core.img
chỉ có thể load một số định dạng phân vùng ổ đĩa nhất định.
Giai đoạn 2
Ở phần này ta không có file .img
như ở trên, thay vào đó là kernel modules
sẽ được gọi khi cần thiết tại thư mục /boot/grub2/i386-pc
. Nhiệm vụ của phần này là load kernel
vào RAM và chuyển quyền điều khiển lại cho kernel
.
Ở đây nếu ta có nhiều Operating system (nhiều kernel
khác nhau), màn hình lựa chọn sẽ hiện ra cho phép người dụng lựa chọn Operating system (OS) để chạy. Sau khi chọn OS, Bootloader
(GRUB) sẽ tải kernel của OS được chọn vào RAM và giao quyền cho kernel
. Một điều nữa là các tập tin kernel
thường được đặt tên là vmlinuz
.
Ok giờ là đến nhiệm vụ của kernel
. Viết đến đây vừa căng não vừa sợ sai! Đậu đỏ!
Load Kernel
Kernel
thì thường được nén lại nên việc đầu tiên mà nó là giải nén chính nó. Rồi sau đó,kernel
ngay lập tức khởi tạo và cấu hình bộ nhớ của máy tính cũng như cấu hình các thiết bị phần cứng được liên kết với hệ thống. Bao gồm tất cả các vi sử lý, I/O subsystems, storage devices, etc. Kernel
cũng sẽ load một số ứng dụng user space cần thiết.
Khi một Kernel
giải nén chính mình, nó cũng sẽ load một thứ gọi là systemd và chia sẽ quyền với nó. Tại thời điểm này Kernel
và systemd
chưa thể thực hiện các tác vụ của người dùng.
Initial RAM disk - initramfs - initrd
Initramfs filesystem image
cũng nằm trong thư mục /boot
như Kernel
vậy. Và nó cũng sẽ được load vào RAM cùng với kernel
nên kernel
có thể sử dụng initramfs
trực tiếp.
Initramfs
bao gồm các chương trình và file binary thực hiện tất cả các hoạt động cần thiết để "khởi tạo" (mount) root filesystem
, như là cung cấp chức năng kernel
cho filesystem
hay cung cấp trình điều khiển cho Mass Storage Controllers với một "cơ sở" là udev (for user device). Udev là thứ chịu trách nhiệm tìm kiếm thiết bị nào được kết nối, định vị trình điều khiển thiết bị mà người dùng cần để hoạt động và sau đó load chúng.
Theo như tìm hiểu sơ bộ thì quá trình này sẽ thực hiện gần như cùng lúc với quá trình load Kernel.
Thực thi trương trình trong /init
Khi quá trình trên hoàn thành thì initramfs
sẽ bị xóa khỏi RAM và các chương trình nằm trong root filesystem
(/sbin/init
) sẽ được thực thi. Đây cũng là lúc mà kernel
cũng đã thiết lập xong phần cũng và liên kết chúng với root filesystem
. Quá trình này sẽ là quá trình chu trình đầu tiên và các tiến trình khác sẽ được chạy sau đó. Init
có nhiệm vụ giữ hệ thống hoạt động và tắt một cách clearly.
Trong hệ điều hành Linux có 2 loại init phổ biến:
- Loại thứ nhất dựa trên Unix System V
- Loại thứ hai dựa trên Systemd
Đăng nhập vào hệ thống
Khi gần kết thúc quá trình khởi động, init
sẽ hiển thị một trình command prompts
và yêu cầu các bạn nhập và username và password. Và sau đó ta sẽ có được một command shell
để gõ lệnh. Nhưng nếu chúng ta có sử dụng giao diện đồ họa thì sẽ không thấy cái này (Cái này chắc hay có ở mấy con VPS??). Và mặc định command shell
sẽ là bash (the GNU Bourne Again Shell).
Note:
Subsystem cuối cùng được init khởi động lên là X Window System, là một hệ thống giao diện đồ họa người dùng của Linux.
Tham khảo:
Một bài của OpenSource.com rất hay
Và một bài trên Blogd.net
Một vài tài liệu khác:
GRUB bootloader - Full tutorial
GRUB 2 bootloader - Full tutorial
https://en.wikipedia.org/wiki/Init
https://en.wikipedia.org/wiki/Systemd
VuGaro 13-04-2019




