Quá trình khởi động Linux

Thảo luận trong 'Hệ điều hành Linux' bắt đầu bởi integer, 11 Tháng một 2011.

  1. Offline

    integer

    • Tiếu Ngạo Giang Hồ

    • :-?
    Số bài viết:
    1.695
    Đã được thích:
    1.313
    Điểm thành tích:
    900
    Các phiên bản linux hiện nay phần lớn khởi động bằng Grub, nhưng nhìn chung quá trình khởi động cơ bản như sau:



    1. Mở đầu
    Bản báo cáo này trình bày những điều chúng tôi rút ra được sau một thời gian tìm hiểu về quá trình khởi động của hệ thống Linux. Hi vọng nó sẽ giúp đỡ những người muốn tìm hiểu về hệ thống Linux hiểu được bước hoạt động đầu tiên của hệ điều hành thú vị này.
    Ðể bắt đầu tìm hiểu về một hệ điều hành, có lẽ tốt nhất là tìm hiểu xem nó bắt đầu hoạt động từ đâu, hoạt động như thế nào, từ đó mà hiểu sâu thêm về hệ thống. Quá trình khởi động hệ thống linux có thể tóm tắt theo sơ đồ sau.
    LILO ----------------> Kernel -----------> INIT
    Bản linux mà chúng tôi nghiên cứu là bản linux 2.2.14-5.0 được cài đặt từ CDROM Red Hat 6.2, chạy trên máy PC tương thích IBM. CD này hiện có tại nhiều đại lý CD trên cả nước.
    2. Trình nạp LILO (LInux LOader)
    Ðầu tiên, ta sẽ xem xét xem hệ thống làm gì từ lúc bắt đầu bật máy tính.
    Như ta đã biết, khi bật máy, đầu tiên BIOS sẽ tiến hành kiểm tra phần cứng và một số việc khác. Tiếp theo, nó sẽ tiến hành đọc sector đầu tiên của đĩa khởi động. Nếu bạn chọn khởi động từ đĩa mềm, sector đầu tiên đó chính là boot setor. Sector này chứa một đoạn chương trình nhỏ để nạp hệ điều hành.
    Nếu bạn khởi động từ đĩa cứng, sector được nạp lên là master boot record (MBR). Sector này có chứa một chương trình nạp và bảng phân vùng (partition table) chứa các thông tin về các phân vùng trên đĩa cứng. Chương trình nạp chiếm 446 byte đầu tiên của MBR, 64 byte tiếp theo chính là bảng phân vùng, hai byte cuối cùng đánh dấu kết thúc MBR có giá trị 0xAA55.
    Bình thường, chương trình nạp sẽ chọn phân vùng được đánh dấu tích cực (active) để nạp sector đầu tiên của phân vùng này. Sector này chính là boot record của phân vùng tương ứng, sẽ có nhiệm vụ nạp hệ điều hành được cài trên nó và trả điều khiển cho hệ điều hành đó.
    Có rất nhiều cách để hệ thống nạp được nhân của Linux đưa vào hoạt động. Một số cách sẽ được mô tả ở phần sau. ở đây, chúng ta sẽ nói đến một trình nạp hay được sử dụng nhất hiện nay đó là LILO.
    LILO là một chương trình cho phép lựa chọn khởi động các hệ điều hành khác nhau. Có hai cách chính sử dụng LILO đó là cài đặt LILO trên MBR và cài đặt LILO trên boot sector của phân vùng khởi động.
    Trường hợp cài đặt LILO trên boot record của phân vùng chứa linux, nếu phân vùng này được đánh dấu active, MBR sẽ tự động nạp trình LILO trên boot record của phân vùng và chương trình LILO sẽ cho phép lưạ chon hệ điều hành. Trường hợp phân vùng chứa LILO không được đánh dấu active, bạn phải tạo một đĩa mềm khởi động để nạp nhân Linux hoặc có thể sử dụng một số chương trình cho phép chọn phân vùng khởi động thay MBR như BOOTACTV hay BOOTMAGIC.
    Nếu LILO được cài trên MBR, mọi chuyện lại trở lên đơn giản. Khi chúng ta bật máy, BIOS sẽ tự động gọi chương trình LILO hoạt động giúp người dùng lựa chọn hệ điều hành.
    Tuy nhiên không phải khi cài LILO trên MBR hoặc boot record là toàn bộ chương trình LILO được nằm tại đó. Ðó thực sự chỉ là một phần rất nhỏ của LILO mà người ta gọi là "first stage boot loader", phần này chỉ có nhiệm vụ là nạp và chạy phần còn lại lớn hơn gọi là "second stage loader". Ðây mới là phần chính của chương trình nạp, chương trình này đưa ra dấu nhắc giúp ta lựa chọn hệ điều hành và khởi động hệ điều hành ta chọn.
    Ðể cài đặt, sửa đổi trình nạp LILO, chúng ta dùng chương trình lilo trong thư mục /sbin. Chương trình này sử dụng rất nhiều tham số nhưng nếu không đưa ra, nó sẽ mặc định sử dụng file cấu hình lilo.conf trong thư mục /etc để cài đặt.
    File cấu hình lilo.conf thường có dạng sau:
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    linear
    default=linux
    image=/boot/vmlinuz-2.2.14-5.0
    label=linux
    read-only
    root=/dev/hda2
    other=/dev/hda1
    label=dos
    File lilo.conf gồm có hai phần chính đó là phần tổng thể và phần cục bộ của từng lựa chọn (gọi là các image). Phần này bắt đầu bằng dòng image = đường dẫn đến nhân của hệ thống cần khởi động. ở trên image=/boot/vmlinuz-2.2.14-5.0 chỉ ra cho trình nạp biết nhân của hệ thống cần nạp là file vmlinuz-2.2.14-5.0 ở thư mục /boot. Dòng other=... và các tuỳ chọn đi dưới nó chỉ ra vị trí và các tuỳ chọn nạp một hệ điều hành khác linux, ở hệ thống của chúng tôi là DOS. ở mỗi phần đều có các tuỳ chọn riêng đi theo.
    Phần tổng thể:
    Phần này nằm ở phần đầu tiên của file lilo.conf, thường được mở đầu bằng dòng boot=... nó thường có các tuỳ chọn sau:
    + boot= boot_device : Chỉ ra thiết bị chứa sector khởi động ví dụ như phân vùng đĩa cứng. Thiết bị này sẽ được cài đặt LILO vào sector đầu tiên. Nếu tuỳ chọn này không có, lilo sẽ sử dụng mặc định boot_device là thiết bị đang được gán là gốc (root). ở hệ thống của chúng tôi, thiết bị được cài LILO là hda tức là cài lên sector đầu tiên đĩa cứng IDE thứ nhất. Nếu muốn cài LILO lên đĩa cứng IDE thứ hai thì boot=/dev/hdb. Nếu đĩa cứng là đĩa SCSI thì là sda, sdb...
    + map= map_file chỉ ra vị trí file map. Nếu bỏ qua tuỳ chọn này, lilo sẽ sử dụng map_file mặc định là /boot/map. Map file là file được sinh ra sau khi thi hành lệnh lilo. File này chứa các thông số về các image của LILO cũng như một số thông tin quan trọng khác về bảng phân vùng, sector khởi động...
    + install= boot_sector chỉ ra vị trí của file chứa boot sector mới sẽ được ghi vào. Nếu bỏ qua tuỳ chọn này thì chương trình lilo sẽ sử dụng file /boot/boot.b làm file mặc định.
    + prompt : Hiện dấu nhắc để chọn lựa hệ điều hành và các tham số khởi động. Nếu không có tuỳ chọn này, trình nạp LILO sẽ chỉ khởi động image mặc định và người dùng không thể can thiệp.
    + timeout= n : Ðơn vị tính theo 1/10 giây, trong thời gian n/10 giây chỉ ra nếu không có phím nào được nhấn, trình nạp LILO sẽ nạp image mặc định được chỉ ra bởi tuỳ chọn default= label.
    + default= label trong đó label chính là nhãn của một image. Nếu bỏ qua tuỳ chọn này thì image mặc định sẽ là image đầu tiên trong file lilo.conf.
    + linear: Phát sinh địa chỉ tuyến tính thay vì địa chỉ sector/head/cylinder. Ðịa chỉ này sẽ sẽ được dịch lại tại thời điểm chạy không phụ thuộc vào phần cứng của đĩa.
    + backup=backup_file: sao chép lại sector khởi động hiện tại vào file được chỉ ra. Nếu bỏ qua tuỳ chọn này, thì sector khởi động hiện tại sẽ được lưu trữ vào file /boot/boot.number. File này trong hệ thống của chúng tôi là /boot/boot.0300.
    Ngoài ra, còn rất nhiều các lựa chọn khác nhưng ít được dùng hơn. Có thể tham khảo trong tài liệu (4).
    Các tuỳ chọn đi theo các image:
    Mỗi image là một phần chọn lựa khác nhau được LILO nạp trong quá trình khởi động. Một image bao giờ cũng mở đầu bằng image= kernel_file trong đó kernel_file chính là file chứa nhân của hệ thống. Ngoài ra, mỗi image cũng còn có nhiều tuỳ chọn đi kèm. Một số tuỳ chọn phổ biến là:
    + label=name: Chỉ ra tên của image. Tên này sẽ được nhập tại dấu nhắc của LILO khi chọn image khởi động. Nếu bỏ qua tuỳ chọn này, tên của nhân sẽ được sử dụng thay thế.
    + pasword=pasword_string: Yêu cầu người dùng nhập mật khẩu khi nạp image này. Mật khẩu đúng là xâu password_string.
    + root= root_device: Chỉ ra thiết bị sẽ được kết gán (mount) là thư mục gốc. Thiết bị này thường là một phân vùng đĩa có chứa hệ thống file ext2 phù hợp (hệ thống file gốc cũng có thể được định dạng theo minix, ext). Nếu bỏ qua tuỳ chọn này, root_device sẽ mặc định là thiết bị chứa nhân ở trên.
    + read-only : Chỉ ra rằng hệ thống file gốc sẽ được kết gán trong chế độ chỉ đọc (điều này rất quan trọng, vì khi khởi động trình fsck tiến hành kiểm tra các hệ thống file có thể ghi một số thông tin lên hệ thống file đó, đồng thời sinh ra một số cấu trúc dữ liệu trong nhân. Việc gắn hệ thống file ban đầu ở chế độ chỉ đọc vừa an toàn cho hệ thống file gốc khi kiểm tra đồng thời xoá được các cấu trúc dữ liệu trong nhân vì đường nào hệ thống file gốc cũng được gắn lại ở chế độ đọc-ghi).
    + read-write : Chỉ ra rằng hệ thống file gốc sẽ được kết gán trong chế độ đọc ghi.
    + initrd=initramdisk_file: Chỉ ra file sẽ được nạp tại thời điểm khởi động như khởi tạo đĩa ảo (ramdisk). File này thường là một hệ thống file được nén lại thành một file. Tại thời điểm khởi động, nó sẽ được giải nénvào bộ nhớ và tạo thành đĩa ảo. (thường thì đĩa ảo này ban đầu được gắn làm hệ thống file gốc)
    +ramdisk=size: Chỉ ra kích thước của đĩa ảo Ram disk. Giá trị size=0 có nghĩa là không tạo ramdisk. Nếu bỏ qua tuỳ chọn này thì kích thước ramdisk được thiết lập trước đó sẽ được sử dụng.
    Khởi động hệ điều hành khác:
    LILO cung cấp khả năng khởi động hệ điều hành khác linux bằng cách chỉ ra tên của chương trình nạp hoặc phân vùng chứa sector khởi động của hệ điều hành tương ứng. Sector khởi động cùng với bảng phân vùng được lưu trữ trong file map.
    Có hai trình nạp để khởi động các hệ điều hành khác linux đó là chain.b và os2_d.b. os2_d chỉ là một dạng của chain.b cho phép khởi động hệ điều hành OS/2 từ đĩa cứng thứ hai.
    Ðiểm vào của image chứa hệ điều hành khác linux trong lilo.conf như sau:
    other = device_name trong đó device name thường là phân vùng đĩa chứa sector khởi động của hệ điều hành đó.
    Một số tuỳ chọn có thể có của phần này:
    + loader= chain_loader : chain_loader chinh là tên chương trình nạp. Mặc định là file chain.b.
    + label=name: Tên sẽ nhập vào tại dấu nhắc của LILO.
    Và một số tuỳ chọn khác nữa nhưng ít được sử dụng hơn.
    Sau khi thiết lập file cấu hình lilo.conf, muốn có tác dụng phải gọi chương trình lilo trong thư mục sbin. Lệnh này thực hiên nhiệm vụ cài đặt một phần trình nạp LILO (first stage boot loader) lên vị trí được chỉ ra trong tập tin lilo.conf đồng thời tạo ra một số các file có liên quan như file map, boot.0300...
    Một số lỗi gặp phải:
    Khi trình nạp LILO hoạt động, thường thấy có chữ LILO xuất hiện trên màn hình. Thực sự thì đó là các dấu hiệu mà trình LILO thông báo cho người dùng biết là nó đã được nạp hoàn chỉnh. Ðôi khi do sửa chữa LILO không đúng cách hoặc do thay đổi phần cứng mà LILO không được nạp một cách hoàn chỉnh và ta chỉ thấy được một, hai hoặc ba ký tự như L, LI ,LIL, LIL- mà không thấy xuất hiện toàn bộ chữ LILO và sau đó hệ thống treo. Tương ứng với mỗi chữ xuất hiện trên màn hình mà LILO thông báo quá trình nạp cho người dùng biết để xử lý lỗi. Dưới đây là ý nghĩa của từng ký tự xuất hiện:
    - Không có chữ nào: Không có phần nào của LILO được nạp. Ðiều này xảy ra khi LILO chưa được cài hoặc phân vùng chứa LILO không được đặt ở mức active.
    - L : Phần đầu tiên của LILO (first stage boot loader) đã được nạp và khởi động nhưng nó không thể nạp tiếp phần thứ hai. Ðiều này có thể xảy ra do phần cứng lỗi hoặc bị thay đổi.
    - LI : Phần thứ nhất của lilo đã nạp được phần thứ hai nhưng nó không thể thực hiện được phần này. Ðiều này có thể xảy ra do thay đổi phần cứng hoặc do đã chuyển vị trí file boot.b mà không gọi lại lilo.
    - LIL : LILO đã nạp và đang thi hành phần thứ hai (second stage root loader). Tuy nhiên nó không thể tìm được bảng mô tả trong file ánh xạ (map file). Ðiều này thường xảy ra do phần cứng lỗi hoặc có sự thay đổi.
    - LIL?: Phần thứ hai bị nạp vào một địa chỉ không hợp lệ. Lỗi xảy ra do có sự thay đổi phần cứng hoặc file boot.b đã bị chuyển đi chỗ khác mà không gọ lại lilo.
    - LIL-: Bảng mô tả bị lỗi. Ðiều này có thể do lỗi phần cứng hoặc do đã xoá hoặc di chuyển file ánh xạ (thường là /boot/map ) mà không gọi lại chương trình lilo để ghi lại những thay đổi.
    - LILO: LILO đã được nạp thành công.
    Thông thường, các lỗi xảy ra do ta sửa đổi, di chuyển các file có liên quan đến LILO mà không cài đặt lại nó. Các file quan trọng là:
    /boot/boot.b
    /boot/map
    /boot/chain.b
    /boot/os2_d.b
    Nên nhớ hãy gọi "lilo" bất cứ khi nào bạn sửa đổi các file trên.
    Khi gặp các lỗi trên, để khắc phục sự cố, phải khởi động lại hệ thống bằng một đĩa mềm khởi động dự phòng rồi cài đăt lại LILO . Tuy nhiên đĩa mềm này phải được tạo bởi chính hệ thống từ lúc chưa bị lỗi. Nên tạo một đĩa mềm khởi động dự phòng để khắc phục các sự cố hệ thống. Ðể tạo một đĩa dự phòng, sử dụng lệnh mkbootdisk:
    mkbootdisk --device /dev/fd0 kernel_version
    trong đó kernel_version chính là phiên bản của nhân: ở hệ thống của chúng tôi thì kernel_version =2.2.14-5.0.
    3. Quá trình khởi động
    Như ta đã biết, chương trình lilo sẽ dựa vào file lilo.conf để cài đặt LILO lên thiết bị được chỉ ra. Chương trình này sẽ ghi vào sector khởi động của thiết bị chỉ ra phần đầu của chương trình LILO. Trong phần đầu này có tồn tại địa chỉ của phần thứ hai (second stage root loader) trên thiết bị được chỉ ra. Phần thứ hai này của LILO chính là các file trong thư mục /boot trong đó có một file rất quan trọng là file /boot/map chứa các thông tin về các image.
    Tuỳ theo từng chọn lựa của người dùng mà LILO sẽ quyết định xem sẽ khởi động hệ điều hành nào, nhân nào, hệ thống file gốc ở đâu. Sau đó thì nhân của hệ điều hành tương ứng sẽ được LILO nạp vào bộ nhớ và chuyển điều khiển cho nhân. Chú ý rằng lúc này ta cũng có thể quyết định được một số việc như quy định hệ thống file gốc sẽ nàm trên phân vùng nào bằng cách nhập vào sau tên nhãn root=... ví dụ như:
    LILO boot: linux root=/dev/hda5
    hoặc quuyết định sẽ thâm nhập cấp chạy nào bằng cách gõ con số cấp chạy đó sau tên nhãn ví dụ :
    LILO boot: linux 2
    sẽ cho phép hệ thống chạy ở cấp chạy 2. Chi tiết về một số cấp chạy sẽ được nói ở phần sau.
    Trở lại vấn đề, tại dấu nhắc của LILO nếu ta chọn khởi động hệ điều hành khác thì hệ điều hành đó bắt đầu hoạt động. Còn nếu chọn khởi động một hệ thống linux thì khi nhân tương ứng với image được chọn sẽ được nạp và chuyển điều khiển. Khi đó trên màn hinh xuất hiện dòng chữ : Loading label (label là tên tương ứng với image mà ta chọn).
    Khi được nạp vào bộ nhớ, nhân sẽ tự giải nén và bắt đầu thực hiện công việc của nó (Không phải tất cả nhân của Linux được nén, phần đầu của các ảnh nhân là một trình giải nén giúp giải nén phần còn lại của nhân). Sau đây là thông báo của nhân đưa ra trong quá trình khởi động.
    Linux version 2.2.14-5.0 (root@porky.devel.redhat.com) (gcc
    version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release))
    #1 Tue Mar 7 20:53:41 EST 2000
    Detected 200454131 Hz processor.
    Console: colour VGA+ 80x25
    Calibrating delay loop/etc/rc.d. 399.77 BogoMIPS
    Memory: 62944k/65472k available (1084k kernel code, 416k
    --------------
    Adding Swap: 208804k swap-space (priority -1)
    Một số công việc của nhân như sau:
    - Nếu bạn có một card super-VGA thì nhân sẽ tự nhận ra và nếu card của bạn hỗ trợ thêm một số mode văn bản khác thì nhân sẽ hỏi bạn mode văn bản nào được dùng. Thường thì mode văn bản đã được thiết lập trước trong quá trình biên dịch nhân và mode phổ biến nhất là 80x25.
    - Sau đó nhân sẽ tiến hành kiểm tra một số phần cứng khác (như đĩa cứng, đĩa mềm, card mạng...) và nạp một số trình điều khiển thiết bị phù hợp.
    - Sau đó nhân tiến hành kết gán hệ thống file gốc. Thông tin để kết gán có thể được thiết lập lúc biên dịch nhân hoặc sử dụng lệnh rdev hay cấu hình LILO. Nhân tự nhận biết kiểu hệ thống file gốc (ext2, minix...).
    Nếu kết gán không thành công vì một lý do nào đó chẳng hạn như không tìm thấy trình điều khiển hệ thống file tương ứng trong nhân. Khi đó nhân sẽ thông báo lỗi và quá trình khởi động thất bại.
    Tại thời điểm này, hệ thống file gốc thường được kết gán ở chế độ read-only.
    Ðiều này tạo ra sự an toàn cho hệ thống file khi hệ thống tiến hành kiểm tra nó (thường là trình fsck - filesystem check)
    Cuối cùng nhân khởi tạo và trao điều khiển cho tiến trình /sbin/init. Init là một tiến trình nền chạy từ lúc khởi tạo hệ thống cho đến lúc hệ thống kết thúc. Tiến trình init làm rất nhiều việc như kiểm tra hệ thống file gốc và kết gán (mount) lại trong chế độ đọc ghi, khởi tạo các tiến trình nền, và cuối cùng, cũng chính init gửi tín hiệu kết thúc đến các tiến trình để tắt hệ thống.
    Init làm việc dựa trên một file cấu hình là inittab trong thư mục /etc. File này liệt kê các cấp chạy và công việc sẽ phải làm với từng cấp chạy. File này thường có dạng như sau.
    #
    # inittab This file describes how the INIT process should set up
    # the system in a certain run-level.

    # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
    # Modified for RHS Linux by Marc Ewing and Donnie Barnes
    #
    # Default runlevel. The runlevels used by RHS are:
    # 0 - halt (Do NOT set initdefault to this)
    # 1 - Single user mode
    # 2 - Multiuser, without NFS (The same as 3, if you do not have
    # networking)
    # 3 - Full multiuser mode
    # 4 - unused
    # 5 - X11
    # 6 - reboot (Do NOT set initdefault to this)
    #
    id:3:initdefault:
    # System initialization.
    si::sysinit:/etc/rc.d/rc.sysinit
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    ---------------
    x:5:respawn:/etc/X11/prefdm -nodaemon

    Mỗi công việc trong inittab được đặt trên một dòng thường có dạng như sau: dấu nhận dạng: cấp chạy : kiểu chạy: tiến trình chạy ở đây, dấu nhận dạng là một xâu duy nhất khác nhau giữa các dòng. Ví dụ như 1, 2 hay xyz nào đó. Trường cấp chạy mô tả các cấp chạy sẽ thực hiên ở dòng này. Trường kiểu chạy chính là một đặc trưng của inittab, nó chứa các cách thức tiến hành các tiến trình một cách khác nhau. Có các kiểu chạy sau:
    boot: Chạy khi khởi động hệ thống. Với kiểu chạy này, tiến trình sẽ được thực hiên với mọi cấp chạy.
    bootwait: Khi khởi động, init sẽ thực hiện tiến trình trên dòng này và đợi cho đến khi nó kết thúc.
    ctrlaltdel: Chạy khi phím Ctrl+Alt+Del được nhấn.
    initdefault: Quy định cấp chạy mặc định. ở tập tin trên thì cấp chạy măc định là 3. Ta có thể thay đổi cấp chạy của hệ thống ở đây hoặc nhập vào dấu nhắc của LILO như đã trình bày ở phần trước.
    once: Tiến trình trên dòng này sẽ chỉ được thực hiện một lần.
    respawn: Tiến trình trên dòng này sẽ được khởi động lại nếu nó bị lỗi khi đang chạy. Ví dụ như ở trên, trình getty sẽ được khởi tạo với kiểu chạy
    respawn. Trong trường hợp mật khẩu và tên người dùng nhập vào không hợp lệ thì getty sẽ lại được khởi động để người dùng nhập lại tên người dung và mật khẩu.
    sysinit: Chạy lúc khởi động với mọi cấp chạy và được chạy đầu tiên.
    wait : Khởi động tiến trình và chờ cho đến khi tiến trình kết thúc mới thực hiện tiếp các công việc khác.
    Ngoài ra còn một số kiểu chạy nữa như ondermand, powerokwait...
    Trường cuối cùng chính là tiến trình chạy.
    Tập tin inittab của chúng tôi mô tả công việc của 7 cấp chạy (run level) khác nhau. Cấp chạy ở đây tức là các cách khởi tạo hệ thống khác nhau. Bảy cấp chạy trên như sau:
    0 - Dừng hệ thống
    1 - Chế độ đơn người dùng
    2 - Chế độ đa người dùng không hỗ trợ hệ thông file mạng NFS (nếu bạn không dùng mạng thì cấp chạy này giống cấp chạy 3)
    3 - Chế độ đa người dùng đầy đủ.
    4 - Không dùng
    5 - Khởi tạo X11
    6 - Khởi động lại hệ thống.
    Mỗi cấp chạy có tương ứng các kịch bản chạy khác nhau nằm trong thư mục rc*.d tương ứng. Ví dụ cấp chạy 2 có các file kịch bản trong thư mục /etc/rc.d/rc2.d. Các file này đều là file shell tựa như tập tin lệnh (batch) trong Dos, nhưng mạnh hơn rất nhiều. Thứ tự theo tên của các file trong thư mục chính là thứ tự chạy từng kịch bản. Ta sẽ nói lại điều này sau.
    Trở lại tập tin inittab, ta thấy điều đầu tiên mà tiến trình init thực hiện là thi hành file kịch bản (shell script) rc.sysinit. File này có nhiệm vụ thực hiện một loạt công việc như kiểm tra và kết gán hệ thống file, khởi tạo ánh xạ bàn phím mặc định, bộ font mặc định, thiết lập đồng hồ... và cuối cùng nó sinh ra một file kernel.h có nội dung như sau:
    /* This file is automatically generated at boot time. */
    #ifndef __BOOT_KERNEL_H_
    #define __BOOT_KERNEL_H_
    #ifndef __BOOT_KERNEL_SMP
    #define __BOOT_KERNEL_SMP 0
    #endif
    #ifndef __BOOT_KERNEL_UP
    #define __BOOT_KERNEL_UP 1
    #endif
    #endif
    Chúng tôi cũng chưa hiểu một cách chính xác nhiêm vụ của file này.
    Tập tin script tiếp theo mà init thi hành chính là file rc. Tuỳ theo cấp chạy mà có một tham số tương ứng được truyền vào. Ví dụ ở cấp chạy 3 tập tin rc được gọi với tham số 3. Tập tin rc sẽ tương ứng với tham số trên thi hành các file kịch bản nằm trong thư mục tương ứng. Các file kịch bản trong thư mục đó chỉ là các liên kết đến các file thực sự trong thư mục /etc/rc.d/init.d. Ví dụ như trong thư mục rc3.d có các liên kết như sau:
    K05innd -> /etc/rc.d/init.d/innd
    K10pulse -> /etc/rc.d/init.d/pulse
    K10xntpd -> /etc/rc.d/init.d/xntpd
    K15pvmd -> /etc/rc.d/init.d/pvmd
    -----------------------
    S99local -> /etc/rc.d/rc.local
    Như vậy, rc cứ theo thứ tự tên file mà thực hiện. Các file bắt đầu bằng ký tự S (Start) sẽ được thực hiện trong quá trình khởi động còn các file bắt đầu bằng ký tự K (Kill) sẽ được thi hành trong quá trình kết thúc hệ thống. Ta có thể đổi tên các tập tin để thay đổi thứ tự chạy của các file.
    File kịch bản cuối cùng trong tất cả các cấp chạy đều là file rc.local. Nhiệm vụ của file này chỉ là kết xuất dòng chữ thông báo ra file issue. Có thể thay đổi nội dung file rc.local này để đưa ra thông báo của riêng bạn.
    Thông báo này sẽ được xuất hiện trước quá trình nhập tên người dùng và mật khẩu.
    Nhiệm vụ cuối cùng của init trong quá trình khởi động đó là gọi tiến trình getty (mingetty cũng là một dạng của getty). Tiến trình này sẽ buộc bạn nhập tên người dùng và mật khẩu sau đó chương trình login sẽ tiến hành so sánh tên người dùng và mật khẩu đó với dữ liệu trong file password. Nếu sai, getty lại bắt bạn nhập lại. Nếu mật khẩu chính xác, hệ thống bắt đầu đi vào hoạt động.
    Riêng cấp chạy 5, sau khi gọi mingetty, init còn chạy tiếp một file kịch bản nữa là prefdm trong thư mục /etc/X11/. File này có nhiệm vụ dò xem chế độ đồ hoạ (ở đây là X) là chế độ nào sau đó init sẽ khởi tạo chế độ đó. Kết quả là ta nhập tên người dùng và mật khẩu trong chế độ đồ hoạ.
    Chú ý: Thật cẩn thận trong khi sửa các file kịch bản vì một sai sót nhỏ cũng có thể làm cho file kịch bản không chạy, đặc biệt là file rc.sysinit. Ðiều này có thể dẫn đến hỏng hệ thống.
    4. Các cách nạp khác.
    Như đã nói ở trên, ngoài hai cách chính sử dụng LILO để nạp linux là đặt trên MBR và trên sector khởi động của phân vùng được đánh dấu active, còn có nhiều cách khác để nạp khởi động hệ thống linux. Một số cách hay dùng được trình bày dưới đây.
    4.1. LILO được khởi động bởi BOOTACTV.
    BOOTACTV là chương trình được cài đặt trên MBR. Khi chương trình nạp của BIOS hoạt động, nó sẽ nạp MBR của đĩa cứng master và trao điều khiển cho chương trình nạp của MBR này. Nếu MBR của đĩa cứng này đã được cài BOOTACTV thì chương trình BOOTACTV sẽ hoạt động. Nó sẽ hỏi ta xem chọn khởi động từ phân vùng nào và nạp sector khởi động của phân vùng đó.
    Quá trình nạp có thể mô tả trong sơ đồ sau:
    BOOTACTV --------------> LILO ----------------> Linux
    ---------------> Hệ điều hành khác
    Có một chương trình khác tương tự BOOTACTV đó là chương trình BOOTMAGIC.
    4.2 Loadlin.
    Loadlin là một chương trình giúp người dùng có thể khởi động hệ điều hành linux ngay từ môi trường DOS. Ta có thể thêm vào tập tin cấu hình của DOS như các lựa chọn để nạp nhân của linux.
    Ðể dùng loadlin khởi động linux từ môi trường DOS, ta phải có file chứa nhân của hệ thống linux. File này nằm trong thư mục /boot. Trong hệ thống của chúng tôi, file chứa nhân là /boot/vmlinuz-2.2.14-5.0.
    Sau khi đã copy file chứa nhân sang phân vùng chứ DOS, ta có thể khởi động linux từ DOS bằng cách gõ lệnh:
    LOADLIN kernel_image root_device : trong đó kernel_image là file chứa nhân mà ta đã copy sang còn root_device chính là phân vùng đĩa chứa hệ thống file gốc. Nếu hệ thống file gốc chỉ ra không chính xác, hệ thống sẽ không khởi động được.
    4.3 Khởi động từ đĩa mềm.
    Có thể tạo đĩa mềm khởi động trong quá trình cài đặt. Nếu đã có đĩa mèm khởi động thì không cần cài đặt LILO. Ðĩa mềm này đã chứa LILO trên sector khởi động của nó. Khi khởi động, chương trình LILO này sẽ được gọi, nó sẽ nạp nhân (nhân này cũng nằm trên đĩa mềm) vào bộ nhớ và trao điều khiển cho nhân. Ðĩa mềm khởi động được tạo trên máy tính nào thì chỉ dùng được trên máy tính đó. Chỉ một sự thay đổi về phân vùng đĩa cứng hoặc chân cắm đĩa cứng thôi cũng làm cho đĩa mềm này trở nên vô tác dụng.
    Nếu bạn không cài LILO trên đĩa cứng thì hãy giữ cẩn thận đĩa mềm này. Nếu nó hỏng thì có lẽ bạn sẽ phải cài lại linux.
    5. Linux và các hệ điều hành khác.
    Linux có thể cùng tồn tại song song với các hệ điều hành khác mà không mấy có ảnh hưởng đến nhau. Ðể cài linux song song với các hệ điều hành khác, trước tiên phải chia cho nó một phân vùng đủ lớn (độ lớn tuỳ theo lựa chọn của người dùng khi cài đặt), sau đó tiến hành cài đặt linux. Nếu muốn hệ thống hoạt động như cũ, có thể không cài LILO lên MBR. Nhưng đổi lại phải tạo một đĩa mềm khởi động và giữ đĩa này hết sức cẩn thận. Mỗi khi muốn linux hoạt động, hãy đưa đĩa mềm đó vào ổ đĩa và cho hệ thống khởi động từ đĩa mềm.
    Nếu bạn muốn cài một hệ điều hành khác trong khi đã có hệ thống linux thì hãy cẩn thận vì một số hệ điều hành khác khi cài đặt sẽ ghi đè lên MBR dữ liệu của nó. Vì vậy mà bạn có thể sẽ không gọi được LILO để khởi động linux. Trong trường hợp đó bạn có thể sử dụng chương trình Loadlin để khởi động linux sau đó gọi lại lilo để cài LILO lên MBR. Nhưng tốt nhất khi cài đặt bạn nên làm theo các bước sau:
    - Chọn một đĩa mềm còn tốt, khởi động linux, tạo một đĩa khởi động bằng lệnh mkbootdisk.
    - Khởi động lại từ đĩa mềm xem đĩa mềm đã hoạt động chính xác chưa.
    Nếu chưa hoạt động thì phải tạo lại.
    - Cài đặt hệ điều hành khác.
    - Khởi động lại xem còn LILO không. Nếu không còn có nghĩa là MBR đã bị ghi đè thì đưa đĩa mềm khởi động vào ổ và khởi động từ đĩa mềm.
    Sau khi đã vào được linux, gọi lại lilo để cài đặt LILO lên MBR.
    Nếu bạn thạo các thao tác với MBR, có thể dùng một số tiện ích như diskedit của bộ NU copy MBR của đĩa cứng ra một file rồi sau khi cài đặt xong copy đè trở lại.
    Tuy nhiên, nêu trong quá trình cài đặt lại có sự phân chia ổ đĩa thì có khả năng bạn phải cài đặt lại cả linux sau khi cài xong hệ điều hành mới.
    6. Tài liệu tham khảo
    Nếu bạn có ý muốn đi sâu hơn nữa về quá trình khởi động hệ thống, có thể tham khảo các tài liệu sau:
    1. The Linux Bootdisk HOWTO – Tom Fawcelt and Graham Chapman.
    2. From Power Up To Bash Prompt – Greg O’Keefe.
    3. The Linux BootPrompt HOWTO – Paul Gortmaker.
    4. Lilo User ‘s Guide – Werner Almasberger
    5. Linux System Administrators‘ Guide 0.6 – Lars Wirzenius.
    6. Linux From Scratch HOWTO – Gerard Beekmans.


    Nguồn: echip

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí