Ok, đây là cách quá trình khởi động hoạt động:
- firmware> bootloader có thể > kernel
${parameters}
> initramfs> không gian người dùng có thể
Trên một đĩa cài đặt redhat hệ thống các tập lệnh dracut của họ là những gì xây dựng và cấu thành initramfs và hệ thống cài đặt anaconda của họ tạo thành không gian người dùng cuối cùng.
Đó là udev
xử lý thiết lập thiết bị - như trong, nó đặt tên cho các thiết bị trong /dev
. Nhưng điều này hầu như luôn xảy ra hai lần - một lần trong initramfs và một lần nữa khi init
bên trong đã tìm thấy thiết bị gốc mục tiêu của nó và sẵn sàng gắn kết devfs
nó trên nó.
Vì vậy, đây là cách nó hoạt động:
bootloader (hoặc firmware) gọi kernel với một bộ tham số tùy chọn và hình ảnh initramfs tùy chọn. Bộ tham số này được lưu trong /proc/cmdline
và kernel bỏ qua tất cả các tham số mà nó không hiểu.
Các initramfs là một không gian người dùng linux hoạt động. Cho dù /
nội dung của nó được giải nén từ một hình ảnh được đưa ra khi gọi hoặc chúng được biên dịch không thành vấn đề - vì kernel 2.6 nó luôn là hệ thống tập tin gốc hoạt động đầu tiên, gắn kết kernel linux. Từ thời điểm này, nhân linux để lại tất cả cho không gian người dùng.
Thông thường (như đúng với dracut của redhat) các initramfs chỉ chứa những gì thực sự cần thiết để tìm một thiết bị gốc và gắn nó lên chính nó. Nói chung, tất cả những gì được bao gồm là busybox
và các mô-đun hạt nhân cần thiết để gắn thiết bị gốc mục tiêu của bạn.
Có lẽ nó cần udev
phải làm điều đó, vì vậy udev
thường được bao gồm - với bộ quy tắc nhỏ bé của riêng nó.
Như đã đề cập, initramfs là hệ thống tập tin gốc linux hoàn chỉnh nhỏ của riêng nó. Một cái hoàn chỉnh có thể trông giống như : /bin /etc /dev /new_root /proc /sys init
. Nhìn chung không có gì khác thường về bất kỳ nội dung nào của các thư mục này - hầu như luôn luôn là một /bin/sh
và một /etc/fstab
.
Hầu hết init
s sẽ phân tích cú pháp /proc/cmdline
cho bất kỳ tham số kernel nào mà chúng có thể diễn giải. Một một trong rất phổ biến là root=/dev/somedisk
hay root=UUID=somediskUUID
hay root=LABEL=somedisklabel
. Đó là các initramfs init
diễn giải các root=...
tham số này - không phải kernel hoặc cuối cùng được thực init
thi sau đó (mặc dù cái cuối cùng có thể diễn giải rất tốt các tham số khác) . Nó sẽ chấp nhận tham số này và gắn kết nó /new_root
(hoặc bất kỳ tên nào nó sử dụng cho dàn dựng trước khi switchroot
s) . Nếu udev
được bao gồm trong initramfs thì chính quy tắc initramfs sẽ quyết định mục /dev/...
nhập của đĩa đích đó được đặt tên cho bây giờ - nhưng điều đó có thể thay đổi.
Khi initramfs init
tìm thấy thành công và gắn kết các /new_root
thiết bị đó thường tìm kiếm cái gì đó để exec
bản thân vào - thường /new_root/bin/init
- vì vậy bất cứ chương trình đó là trở thành pid 1. Nó thường thực hiện điều này với các switch_root
chương trình cung cấp busybox
- mà không một exec
khi đồng thời gắn /new_root
trên /
. Quá trình của nó được mô tả trong các tài liệu kernel, do đó :
Nhưng initramfs là rootfs: bạn không thể pivot_root
rootfs, cũng không phải umount
nó. Thay vào đó hãy xóa mọi thứ ra khỏi rootfs để giải phóng không gian ( find -xdev / -exec rm '{}' ';'
) , vượt qua rootfs với root mới ( cd /newmount; mount --move . /; chroot .
) , đính kèm stdin/stdout/stderr
với cái mới /dev/console
và exec
cái mới init
.
Thiết bị gốc init
vừa được thực thi bây giờ phải đưa vào hệ thống tập tin gốc của chính nó. Nó kêu gọi của nó udev
gắn kết và riêng của mình devfs
trên /dev
dựa trên ruleset riêng của mình và làm tất cả phần còn lại. Khi nó thông qua bạn đã sẵn sàng để sử dụng máy tính của bạn.
Xin lỗi về mức độ chi tiết ở đó, nhưng tôi muốn làm rõ lý do tại sao điều sau là đúng:
- bất kỳ tham số kernel nào bạn sử dụng từ bộ tải khởi động như
root=/dev/sda
không nhất thiết phải giống /dev/sda
với cuối cùng bạn sẽ truy cập /dev/sda
sau khi initramfs kết thúc /init
.
Vì vậy, một cách để làm điều này, tôi nghĩ, là đặt một udev
quy tắc trên đĩa anaconda của bạn - thực sự là một kho lưu trữ squashfs, có thể - hướng dẫn nó thiết lập tất cả các đĩa usb ở một nơi khác. Có một ví dụ tuyệt vời ở đây:
KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 Storage Device", SYMLINK+="usbhd%n"
Và nó sẽ là một điều rất tốt nếu bạn đọc phần còn lại của liên kết đó. Bạn sẽ có thể làm điều đó để thiết bị đĩa usb của bạn /dev/sda
dành cho initramfs - vì vậy bạn không phải thay đổi bất kỳ cấu hình bộ nạp khởi động nào - nhưng sau đó tạo một nút cho cùng một đĩa như /dev/usba
đối với hệ thống cài đặt anaconda.