Làm thế nào là / etc / fstab được truy cập trước khi root được gắn kết?


21

Tôi đã thực hiện một số thay đổi /etc/fstab, khi câu hỏi về con gà và quả trứng này xảy ra với tôi - nếu /etc/fstabchứa các hướng dẫn để gắn hệ thống tệp, bao gồm phân vùng gốc, thì hệ điều hành sẽ đọc tệp đó ở vị trí đầu tiên như thế nào?

Câu trả lời:


18

Khi bộ tải khởi động gọi kernel, nó sẽ truyền cho nó một tham số được gọi root. Vì vậy, khi kernel khởi tạo xong, nó sẽ tiếp tục bằng cách gắn phân vùng gốc đã cho vào /và sau đó gọi /sbin/init(trừ khi điều này bị ghi đè bởi các tham số khác).

Sau đó, initquá trình bắt đầu phần còn lại của hệ thống bằng cách tải tất cả các dịch vụ được xác định sẽ được bắt đầu trong runlevel mặc định của bạn.

Tùy thuộc vào cấu hình của bạn và trên hệ thống init mà bạn sử dụng, có thể có nhiều bước khác giữa các bước mà tôi đã đề cập. Hiện tại các hệ thống init phổ biến nhất trên Linux là SysVInit (hệ thống truyền thống), Upstart và Systemd. Bạn có thể tìm thêm chi tiết về quá trình khởi động trong bài viết trên wikipedia này .

Đây là một ví dụ đơn giản về cấu hình Grub của tôi. Phần quan trọng để trả lời câu hỏi của bạn là ở dòng thứ hai đến dòng cuối cùng, có một root=/dev/sda3:

menuentry 'Gentoo GNU/Linux' --class gentoo --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-40864544-2d0f-471a-ab67-edd7e4754dae' {
    set root='hd0,msdos1'
    echo    'Loading Linux 3.12.6-gentoo-c2 ...'
    linux   /kernel-3.12.6-gentoo-c2 root=/dev/sda3 ro  
}

Trong nhiều cấu hình, hạt nhân gắn kết /ở chế độ chỉ đọc và tất cả các tùy chọn còn lại được đặt thành mặc định. Trong /etc/fstabbạn có thể chỉ định các tham số hệ thống tệp mà sau đó sẽ được áp dụng sau khi init kết thúc nó.


2
Phân vùng gốc ban đầu được gắn chỉ đọc bởi kernel. Một initquá trình sau đó gắn kết mọi thứ /etc/fstabtheo các tham số ở đó, thường có nghĩa là gắn lại phân vùng gốc đọc-ghi.
goldilocks

1
Ngoài ra kernel có thể được biên dịch với các thường trình mã hóa cứng tìm kiếm một số tệp đặc biệt trên phân vùng hoạt động chưa được gắn. Trình tải FreeBSD hoạt động theo cách đó.
Kondybas

@Kondybas LILO trên Linux cũng được mã hóa cứng để tải kernel ở một số số khối cố định
phuclv

3

Một mục nhập fstablà cần thiết, nếu bạn muốn chỉ định một số tùy chọn gắn kết không mặc định. Tuy nhiên, ngày nay với systemd, một thiết bị kernel chính xác và fstype trong fstablà không cần thiết. Bạn có thể thay thế mục gốc bằng một cái gì đó như:

#UUID=8f74237d-b689-4beb-9d1f-f60b426c9969 /            ext4        rw,relatime,data=ordered    0 1
dummy /             auto        rw,relatime,data=ordered,debug  0 1

và các tùy chọn gắn kết vẫn được systemd vinh danh.

Bạn có thể sử dụng bất kỳ tên thiết bị xấu nào, ví dụ: /dev/sdz1ngoại trừ UUID xấu. Với một UUID xấu, thông báo sẽ được in khi khởi động: Failed to start Remount Root and Kernel File Systemsnhưng dù sao thì hệ thống cũng khởi động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.