Tìm hiểu quá trình khởi động của máy Linux


Trong bài viết này, chúng ta sẽ cùng tìm hiểu về quá trình khởi động của một máy Linux. Từ lúc bạn nhấn nút nguồn để bật máy tính lên cho tới khi bạn có thể sử dụng máy tính để thực hiện các công việc của mình. Quá trình này chỉ diễn ra trong vòng vài ba phút (hoặc ít hơn) nhưng đằng sau đó là cả một quy trình xử lý và tính toán phức tạp.

Việc hiểu được các bước trong quá trình khởi động máy Linux có thể giúp bạn phần nào trong việc xác định và khắc phục các sự cố liên quan tới hoạt động khởi động của máy tính. Xin các bạn lưu ý rằng, những mô tả trong bài viết này chỉ ở mức khái quát chung (high-level), không thật sự đi sâu vào từng tiểu tiết xảy ra ở từng giai đoạn khởi động. Không để các bạn đợi lâu hơn nữa, sau đây là các bước khởi động của máy Linux :)

(1) Power-on:

BIOS (một phần mềm được cài đặt sẵn (embedded) vào các chíp PROM, EPROM hay bộ nhớ flash nằm trên bo mạch chủ) là chương trình được chạy đầu tiên khi bạn nhấn nút nguồn hoặc nút reset trên máy tính của mình. BIOS thực hiện một công việc gọi là POST (Power-on Self-test) nhằm kiểm tra thông số và trạng thái của các phần cứng máy tính khác như bộ nhớ, CPU, thiết bị lưu trữ, card mạng… Đồng thời, BIOS cũng cho phép bạn thay đổi các thiết lập, cấu hình của nó (tùy từng máy mà bạn nhấn phím F2, Delete, F10,… để vào giao diện cài đặt cho BIOS).

Nếu quá trình POST kết thúc thành công (tức, các phần cứng ở trạng thái tốt, BIOS không phát hiện ra các trục trặc nào), thì sau đó BIOS sẽ cố gắng tìm kiếm và khởi chạy (boot) một hệ điều hành được chứa trong các thiết bị lưu trữ như ổ cứng, CD/DVD, USB…. Thứ tự tìm kiếm có thể được thay đổi bởi người dùng.

(2) Master Boot Record (MBR):

Sector đầu tiên (được đánh số 0) của một thiết bị lưu trữ dữ liệu được gọi là MBR, thường sector 0 này có kích thước là 512-byte. Sau khi BIOS xác định được thiết bị lưu trữ nào sẽ được ưu tiên để tìm kiếm đầu tiên thì thực chất BIOS sẽ đọc trong MBR của thiết bị này để nạp vào bộ nhớ một chương trình rất nhỏ (dưới 512-byte). Chương trình nhỏ này sẽ định vị và khởi động boot loader – đây là chương trình chịu trách nhiệm cho việc tìm và nạp nhân (kernel) của hệ điều hành.

Chú ý, hệ điều hành sẽ được nạp bởi boot loader không nhất thiết phải nằm chung thiết bị lưu trữ với boot loader đó (những năm trước đây có thể bạn đã từng nghe tới đĩa mềm khởi động, thực ra chúng chỉ chứa boot loader mà thôi.)

(3) Boot loader:

Có 2 bootloader phổ biến trên Linux là GRUB và LILO (tiền thân của GRUB). Cả 2 chương trình này đều có chung mục đích: cho phép bạn lựa chọn một trong các hệ điều hành có trên máy tính để khởi động, sau đó chúng sẽ nạp kernel của hệ điều hành đó vào bộ nhớ và chuyển quyền điều khiển máy tính cho kernel này.

GRUB hay LILO đều có thể khởi động cho cả Linux và Windows, nhưng ngược lại các bootloader trên Windows như (NTLDR, BOOTMGR) thì không hỗ trợ khởi động cho các hệ điều hành Linux. Trong thế giới Linux, các bootloader cũng có thể nạp thêm các ramdisk hoặc các INITRD, lát nữa chúng ta sẽ nói thêm về chúng.

(4) Linux kernel được nạp và khởi chạy:

bootloader nạp một phiên bản dạng nén của Linux kernel, và ngay lập tức nó tự giải nén và tự cài đặt mình lên đỉnh bộ nhớ hệ thống – nơi mà nó sẽ nằm ở đó cho tới khi bạn tắt máy.

(5) Các script trong (các) INITRD được thực thi:

Tại bước 3, tôi đã đề cập tới các ram disk nhưng đã không giải thích nó là gì. Giờ thì tôi sẽ giải thích nó. Một vấn đề mà những người viết các bản Linux đa mục đích phải đối mặt là: không thể nào đoán trước được chính xác cấu trúc máy tính của người sẽ sử dụng bản Linux của họ… Máy tính của người dùng có những thành phần linh kiện nào?

Các INITRD cung cấp một giải pháp: một tập các chương trình nhỏ sẽ được thực thi khi kernel vừa mới được khởi chạy. Các chương trình nhỏ này sẽ dò quét phần cứng của hệ thống và xác định xem kernel cần được hỗ trợ thêm những gì để có thể quản lý được các phần cứng đó. Chương trình INITRD có thể nạp thêm vào kernel các module bổ trợ. Khi chương trình INITRD kết thúc thì quá trình khởi động Linux sẽ tiếp diễn.

(6) Chương trình init được thực thi:

Khi kernel được khởi chạy xong, nó triệu gọi duy nhất một chương trình tên là init. Tiến trình này có PID (process ID) =1, init là cha của tất cả các tiến trình khác mà có trên hệ thống Linux này. Do tính chất cực kỳ quan trọng này mà init sẽ không bao giờ bị chết (khi sử dụng lệnh kill) và không được phép chết!

Sau đó, init sẽ xem trong file /etc/inittab để biết được nó cần làm gì tiếp theo như: dựa vào runlevel mặc định để thực thi các script khởi động (initscript) tương ứng trong thư mục /etc/rc.d.

Nhân đây, một trong các vấn đề phổ biến thường xảy ra với một hệ thống Linux mới cài đặt (hoặc mới được cập nhật) là kernel không thể tìm thấy init. Một thông báo khó hiểu được đưa ra là kernel panic – not syncing. Nguyên nhân chủ yếu là sự thiết sót tham số root= khi bạn cấu hình cho bootloader. Kernel cũng có thể “than phiền” với ai đó mà cố gắng để tiêu diệt tiến trình init.

(7) Các initscript được thực thi dựa trên runlevel được chọn:

Nếu bạn kiểm tra trong file /etc/inittab, bạn sẽ thấy nó bao gồm hầu hết các đặc tả, chỉ dẫn để chạy các chương trình nào đó. Các script có tên bắt đầu bằng ký tự S sẽ được thực thi, bằng cách này, init sẽ khởi động tất cả các hệ thống con (subsystem) hoặc các dịch vụ (deamon) để tạo thành một hệ thống Linux hoạt động hoàn chỉnh.

Tại thời điểm này, về cơ bản Linux đã khởi động xong, init cũng hoàn thành vai trò của mình: tạm thời nó sẽ “ngủ” (ở trạng thái chờ đợi) cho tới khi có chương trình nào đó bị chết hoặc cần được khởi động lại. Tất cả các hoạt động của hệ thống bây giờ sẽ được thực hiện bởi các deamon khác nhau.

(8) Đăng nhập với giao diện đồ họa:

Subsystem cuối cùng được init khởi động lên là X Window (còn có các tên gọi khác là X.Org, Xorg, hay đơn giản là X), đây là một hệ thống cung cấp giao diện đồ họa người dùng (GUI) của Linux. Một thành phần của X được gọi là XDM đưa ra cho bạn màn hình đăng nhập dạng GUI.

Tuy nhiên, do XDM chưa thực sự thân thiện với người dùng nên hiện nay XDM được thay thế bằng GDM (nằm trong gói GNOME), KDM (nằm trong gói KDE) hoặc Entrance (nằm trong gói Enlightenment).

(9) Khi bạn hoặc ai đó đăng nhập thành công vào hệ thống:

một chương trình shell (có thể là bash, sh, csh…) sẽ được bắt đầu. Tất cả các chương trình mà bạn chạy và mọi thao tác khác mà bạn thực hiện trong suốt phiên làm việc sẽ được thực hiện bởi shell đó hoặc bởi chương trình khác mà được shell khởi động.

Khi bạn đăng xuất, shell đó và tất cả các tiến trình con của nó sẽ bị kết thúc. Sau đó init (hoặc XDM/GDM/KDM/Entrance) sẽ “thức tỉnh” và bắt đầu một lời nhắc nhở đăng nhập mới.

Toàn bộ quá trình khởi động của máy Linux được minh họa như hình dưới đây

 –manthang.

2 comments

  1. Anh oi cho e hoi, em dung ubuntu 10.10 thi ko tim thay /etc/inittab dau ca. Vay e muon chinh sua man hinh luc khoi dong thi phai vao dau a. Cam on a.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s