Quá trình khởi động Linux xảy ra như thế nào?

Có thể bạn đã biết, một hệ thống thì bao gồm nhiều thành phần hỗ trợ lẫn nhau để có thể làm việc. 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.
Cách mà một hệ thống Linux khởi động.
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.

QUÁ TRÌNH KHỞI ĐỘNG HỆ THỐNG LINUX 

(1) Power-on:

BIOS là 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 trong BIOS Setup.

(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 đó, chẳng hạn như việc bạn cài boot loader và sda nhưng OS lại nằm ở sdb vậy. (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 các hệ thống 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:

Kernel đóng vai trò để shell có thể giao tiếp và điều khiển phần cứng. Khi bootloader nạp một phiên bản dạng nén của Linux kernel, và ngay lập tức nó sẽ tự giải nén và tự cài đặt mình lên RAM – 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:

Ở trên, mình đã đề 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 nhà phát triển Linux 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. Sau đây là các run level trên Linux

  • Run level 0 (init 0): tắt máy.
  • Run level 1 (init 1): chế độ này chỉ sử dụng được 1 người dùng.
  • Run level 2 (init 2): chế độ đa người dùng nhưng không có dịch vụ NFS.
  • Run level 3 (init 3): chế độ đa người dùng, có đầy đủ các dịch vụ.
  • Run level 4 (init 4): *không sử dụng*
  • Run level 5 (init 5): chế độ đồ họa.
  • Run level 6 (init 6): khởi động lại máy.

Cú pháp sử dụng:
[[mcode]]# init 6[[ecode]]

(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 [[scode]]/etc/inittab[[escode]], 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ụ (daemon) để 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 daemon 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
Quá trình khởi động một hệ thống Linux
Quá trình khởi động một hệ thống Linux

THAY ĐỔI INIT MẶC ĐỊNH

Runlevel được hiểu là các mức hoạt động của hệ thống, để chuyển đội các mức hoạt động này ta dùng lệnh [[scode]]init[[escode]] như đã giới thiệu ở trên. Ví dụ ta muốn chuyển sang mức 1 ta dùng lệnh [[scode]]init 1[[escode]]. Đặt runlevel mặc định cho hệ thống ta hãy chỉnh sửa cấu hình trong file [[scode]]/etc/inittab[[escode]], ví dụ ở đây mình vi:
[[mcode]]$ vi /etc/inittab  (dùng để mở file inittab)[[ecode]]
Sau khi mở file /etc/inittab, ta nhấn phím [[scode]]i[[escode]] để chỉnh sửa thông tin ở dòng:
[[lcode]]id:5:initdefault:[[ecode]]
thay thành
[[lcode]]id:3:initdefault:[[ecode]]
Vậy là lần khởi động sau ta sẽ sử dụng hệ thống với giao diện command.
Tiếp theo nhấn [[scode]]Esc[[escode]] rồi nhập [[scode]]:wq[[escode]] rồi [[scode]]Enter[[escode]] để lưu và thoát.

Tham khảo Manthang | Tuhocmang

Post a Comment

0 Comments