Giải Mã Quá Trình Khởi Động và Tắt Máy Linux: Từ BIOS, MBR đến Systemd và Shutdown

Dat Ngo TienDat Ngo Tien
7 min read

Hiểu rõ cách hệ thống Linux khởi động và tắt máy không chỉ là kiến thức nền tảng cho người dùng mà còn là kỹ năng thiết yếu đối với bất kỳ quản trị viên hệ thống nào. Quá trình này, tuy phức tạp với nhiều giai đoạn, lại là chìa khóa để chẩn đoán sự cố, tối ưu hóa hiệu suất và đảm bảo hệ thống vận hành trơn tru.

Hành trình khởi động của Linux: Một cái nhìn chi tiết

Quá trình khởi động của Linux diễn ra qua nhiều giai đoạn tuần tự:

  1. BIOS (Basic Input/Output System):

    • Đây là chương trình đầu tiên chạy khi bạn bật máy, được lưu trữ trên chip ROM của bo mạch chủ.

    • BIOS thực hiện POST (Power-on Self-test) để kiểm tra phần cứng và cho phép thay đổi cấu hình hệ thống.

    • Sau POST, BIOS tìm và khởi chạy hệ điều hành từ thiết bị lưu trữ (ổ cứng, USB). Nếu là Linux trên ổ cứng, BIOS sẽ tìm đến MBR.

  2. MBR (Master Boot Record):

    • Là sector đầu tiên của thiết bị lưu trữ.

    • BIOS đọc MBR để nạp một chương trình nhỏ vào bộ nhớ. Chương trình này có nhiệm vụ định vị và khởi động bootloader.

    • Thông tin ngày giờ và các thiết bị ngoại vi quan trọng được nạp từ CMOS.

  3. Bootloader (GRUB/LILO):

    • Nằm trong MBR, bootloader chịu trách nhiệm nạp kernel Linux và Initial RAM Disk (INITRD) vào bộ nhớ. INITRD chứa các tệp và trình điều khiển cần thiết để khởi động.

    • Hai bootloader phổ biến là GRUB (thường dùng hiện nay) và LILO (tiền thân).

    • Bootloader cho phép chọn hệ điều hành (nếu có nhiều) và sau đó chuyển quyền điều khiển cho kernel.

  4. Linux Kernel Được Nạp và Khởi Chạy:

    • Kernel đóng vai trò trung gian cho shell giao tiếp và điều khiển phần cứng.

    • Một phiên bản nén của kernel được nạp, tự giải nén và cài đặt vào RAM, nơi nó sẽ hoạt động cho đến khi tắt máy.

  5. Các Script trong INITRD Được Thực Thi:

    • Do sự đa dạng về cấu hình phần cứng, INITRD cung cấp các chương trình nhỏ để quét phần cứng hệ thống.

    • Các chương trình này xác định những gì kernel cần hỗ trợ thêm để quản lý phần cứng đó.

    • Sau khi INITRD hoàn thành, quá trình khởi động tiếp tục.

  6. Chương trình init Được Thực Thi:

    • Khi kernel khởi chạy xong, nó gọi duy nhất chương trình init.

    • init có Process ID (PID) là 1 và là tiến trình cha của tất cả các tiến trình khác. Do đó, init không thể bị dừng bằng lệnh kill.

    • init đọc tệp /etc/inittab (trong các hệ thống cũ hơn sử dụng SysVinit) để xác định các hành động tiếp theo, dựa trên runlevel mặc định để thực thi các script khởi động tương ứng trong /etc/rc.d.

Các runlevel trên Linux (truyền thống):

  • Level 0: Tắt máy.

  • Level 1: Chế độ một người dùng (single-user).

  • Level 2: Chế độ nhiều người dùng không có NFS (ít dùng).

  • Level 3: Chế độ nhiều người dùng, không giao diện đồ họa (đa người dùng dòng lệnh).

  • Level 4: Không sử dụng.

  • Level 5: Chế độ đồ họa (GUI).

  • Level 6: Khởi động lại máy.

  • Cú pháp sử dụng: init [runlevel_number]. (Hình ảnh: Ví dụ các runlevel trong /etc/inittab)

  1. Các Initscript Được Thực Thi Dựa Trên Runlevel:

    • Hệ thống chạy các script bắt đầu bằng chữ 'S' (Start) trong thư mục runlevel tương ứng (ví dụ: /etc/rc.d/rc5.d cho runlevel 5). Điều này khởi động tất cả các dịch vụ cần thiết.

    • Sau khi hoàn thành, init sẽ chờ đợi cho đến khi có một chương trình cần dừng hoặc khởi động lại.

  2. Đăng Nhập vào Giao Diện:

    • Subsystem cuối cùng được init khởi động thường là X Window System, cung cấp giao diện đồ họa.

    • Các trình quản lý hiển thị phổ biến bao gồm GDM (GNOME) và KDM (KDE). (Hình ảnh: Màn hình đăng nhập GDM hoặc KDM)

Các Framework quản lý khởi động hiện đại

Có ba framework quản lý khởi động chính đã được sử dụng trên Linux:

  • SysV (System V init): Nền tảng quản lý tiến trình khởi động đầu tiên. Hiện nay ít còn được sử dụng trên các bản phân phối mới do không đáp ứng được yêu cầu hiện đại.

  • Upstart: Được phát triển cho Ubuntu Linux, nhưng Ubuntu cũng đã chuyển sang Systemd từ phiên bản 16.

  • Systemd: Ra mắt năm 2010, là hệ thống init hiện đại, ổn định và giàu tính năng nhất hiện nay. Một ưu điểm lớn là Systemd tương thích ngược với SysV và Upstart.

Tìm Hiểu Sâu Hơn về SysV

  • Runlevel là chìa khóa: SysV dựa vào 7 runlevel (0-6) để quyết định dịch vụ nào sẽ khởi động.

  • Thay đổi runlevel:

    • Cách 1: Chỉnh sửa tệp /etc/inittab (thay đổi id:), áp dụng cho lần khởi động tiếp theo. Không nên đặt mặc định là 0 hoặc 6. (Hình ảnh: Chỉnh sửa /etc/inittab để thay đổi runlevel mặc định)

    • Cách 2: Dùng lệnh init <runlevel_number> (ví dụ init 3). Thay đổi này chỉ có hiệu lực trong phiên hiện tại.

  • Script khởi động: Tệp /etc/rc.d/rc chạy các script trong thư mục /etc/rc.d/rcN.d (N là runlevel). Script bắt đầu bằng 'S' được khởi chạy, bằng 'K' (Kill) được dừng, theo thứ tự số.

  • Kiểm tra runlevel hiện tại: Dùng lệnh runlevel hoặc xem trong cat /etc/inittab (đối với runlevel mặc định trên hệ thống SysV).

Làm Quen Với Systemd

Systemd không dùng runlevel và shell script theo kiểu truyền thống, thay vào đó nó quản lý hệ thống dựa trên khái niệm "unit" và "target".

  • Cấu trúc Unit file: Một unit file thường có 3 phần chính: [Unit], [Service] (hoặc loại unit khác), và [Install].

    • [Unit]: Chứa thông tin mô tả cơ bản về unit.

    • [Service]: Khai báo thông tin về loại unit (ví dụ: service, socket, device, mount). Chỉ định lệnh thực thi khi dịch vụ khởi động, dừng, v.v..

    • [Install]: Chứa thông tin cài đặt, ví dụ như unit này sẽ được kích hoạt bởi target nào. (Hình ảnh: Ví dụ nội dung một file service của systemd)

  • .target: Tương tự như runlevel, .target được dùng để nhóm các unit lại với nhau. Các target khác nhau sẽ khởi động các nhóm unit khác nhau.

  • Viết một service đơn giản với systemd: Tạo một file script (ví dụ example.sh): Bash

      #!/bin/bash
      while :
      do
          echo "helllo" # In ra "helllo" [cite: 49]
          sleep 4      # Chờ 4 giây [cite: 49]
      done
    

    Tạo file service (ví dụ test.service trong /etc/systemd/system/): Ini, TOML

      [Unit]
      Description=Test Service [cite: 49]
    
      [Service]
      Type=simple [cite: 49]
      ExecStart=/usr/sbin/example.sh # Hoặc đường dẫn đến script của bạn [cite: 49]
    
      [Install]
      WantedBy=multi-user.target [cite: 49]
    
  • Quản lý dịch vụ với systemctl: systemctl là công cụ chính để kiểm soát các service và target. Các tùy chọn phổ biến:

    • list-units: Hiển thị trạng thái các unit.

    • start <name.service>: Khởi động một unit.

    • stop <name.service>: Dừng một unit.

    • restart <name.service>: Khởi động lại một unit.

    • reload <name.service>: Tải lại cấu hình của unit.

    • status <name.service>: Xem trạng thái chi tiết của unit.

    • enable <name.service>: Kích hoạt unit khởi động cùng hệ thống.

    • disable <name.service>: Vô hiệu hóa unit khởi động cùng hệ thống.

    • isolate <name.target>: Chuyển sang một target cụ thể, dừng các unit không thuộc target đó. (Hình ảnh: Ví dụ lệnh systemctl status, start, stop, enable, disable apache2.service)

Tắt máy và Khởi động lại Hệ thống an toàn

Lệnh shutdown được sử dụng để tạm dừng, tắt hoặc khởi động lại hệ thống một cách an toàn.

Cấu trúc lệnh shutdown: shutdown [Option] [Time] [Description].

  • Option:

    • -H: Tạm ngưng thiết bị (Halt).

    • -P: Tắt thiết bị (Power off).

    • -r: Khởi động lại thiết bị (Reboot).

    • -h: Tương tự poweroff, tắt máy ngay lập tức. (Lưu ý: trong một số hệ thống -h có thể là halt hoặc poweroff tùy cấu hình).

    • -c: Hủy bỏ một lệnh shutdown đang chờ.

  • Time: Thời gian thực hiện lệnh.

    • hh:mm: Định dạng giờ:phút cụ thể.

    • +mm: Sau mm phút kể từ bây giờ.

    • now: Ngay lập tức.

  • Description: Thông báo gửi đến những người dùng đang đăng nhập.

Ví dụ: shutdown -H 0:01 "maintainance server" (Hình ảnh: Ví dụ lệnh shutdown và thông báo gửi tới người dùng)

Kết luận

Quá trình khởi động và tắt máy của Linux là một chuỗi các sự kiện được điều phối cẩn thận, từ phần cứng BIOS đến các dịch vụ phần mềm do Systemd (hoặc các hệ thống init khác) quản lý. Hiểu rõ từng bước không chỉ giúp bạn tự tin hơn khi sử dụng Linux mà còn trang bị cho bạn khả năng xử lý sự cố và tối ưu hóa hệ thống một cách hiệu quả.

0
Subscribe to my newsletter

Read articles from Dat Ngo Tien directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Dat Ngo Tien
Dat Ngo Tien

Hi friend. Nice to meet you in here. Hope you will find useful information on the blog. Follow and chill with me.