Rootfs là gì?
Rootfs
là một phiên bản đặc biệt của ramfs
(hoặc tmpfs
, nếu được bật),
luôn có trong 2.6 hệ thống. Bạn không thể ngắt kết nốirootfs
với cùng một lý do mà bạn không thể giết tiến trình init; thay vì có mã đặc biệt để kiểm tra và xử lý một danh sách trống, hạt nhân nhỏ hơn và đơn giản hơn để đảm bảo các danh sách nhất định không thể trở nên trống rỗng.
Hầu hết các hệ thống chỉ gắn kết hệ thống tập tin khác rootfs
và bỏ qua nó. Lượng không gian mà một ramfs trống chiếm rất ít.
Nếu CONFIG_TMPFS được bật, rootfs
sẽ sử dụng tmpfs
thay vì ramfs
theo mặc định. Để buộc ramfs
, thêm "rootfstype=ramfs"
vào dòng lệnh kernel.
Initramfs là gì?
Tất cả các nhân Linux Linux chứa một"cpio"
kho lưu trữ định dạng đượcnén, được trích xuất rootfs
khi kernel khởi động. Sau khi giải nén, kiểm tra hạt nhân để xem nếurootfs
có chứa một tập tin"init"
, và nếu như vậy nó thực thi nó như PID 1. Nếu tìm thấy, nàyinit
quá trình chịu trách nhiệm về việc đưa hệ thống phần còn lại của con đường lên, bao gồm định vị và gắn các thiết bị gốc thực ( nếu có). Nếurootfs
không chứainit
chương trình sau khicpio
lưu trữnhúngđược trích xuất vào nó, kernel sẽ chuyển sang mã cũ hơn để xác định vị trí và gắn kết phân vùng gốc, sau đó thực hiện một số biến thể trong/sbin/init
số đó.
Tất cả điều này khác với initrd cũ theo nhiều cách:
Các initrd cũ luôn là một tệp riêng biệt, trong khi kho lưu trữ initramfs được liên kết với hình ảnh kernel linux. (Thư mục linux - * / usr được dành để tạo kho lưu trữ này trong quá trình xây dựng.)
Tệp initrd cũ là một hình ảnh hệ thống tập tin được nén (ở một số định dạng tệp, chẳng hạn như ext2, cần một trình điều khiển được tích hợp trong kernel), trong khi kho lưu trữ initramfs mới là một kho lưu trữ cpio được nén (như chỉ đơn giản là tar, xem cpio (1) và Tài liệu / không gian người dùng sớm / bộ đệm-format.txt). Mã trích xuất cpio của kernel không chỉ cực kỳ nhỏ, mà còn là __init văn bản và dữ liệu có thể bị loại bỏ trong quá trình khởi động.
Chương trình được chạy bởi initrd cũ (được gọi là / initrd, không phải / init) đã thực hiện một số thiết lập và sau đó quay trở lại kernel, trong khi chương trình init từ initramfs dự kiến sẽ không quay trở lại kernel. (Nếu / init cần tắt điều khiển, nó có thể vượt qua / với một thiết bị gốc mới và thực hiện một chương trình init khác. Xem tiện ích switch_root, bên dưới.)
Khi chuyển đổi một thiết bị gốc khác, initrd sẽ p Pivot_root và sau đó vượt qua ramdisk. Nhưng initramfs là rootfs: bạn không thể root pfs_root, cũng không ngắt kết nối 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 bằng root mới (cd / newmount; mount --move. /; Chroot.), đính kèm stdin / stdout / stderr vào new / dev / console và thực thi init mới.
Vì đây là một quá trình khó khăn đáng chú ý (và liên quan đến việc xóa các lệnh trước khi bạn có thể chạy chúng), gói klibc đã giới thiệu một chương trình trợ giúp (utils / run_init.c) để làm tất cả điều này cho bạn. Hầu hết các gói khác (như busybox) đã đặt tên cho lệnh này là "switch_root".
Khởi tạo dân cư:
Quá trình xây dựng kernel 2.6 luôn tạo ra một kho lưu trữ initramfs định dạng được nén và liên kết nó với tệp nhị phân kernel. Theo mặc định, kho lưu trữ này trống (tiêu thụ 134 byte trên x86).
Tùy chọn cấu hình CONFIG_INITRAMFS_SOURCE (trong Cài đặt chung trong menuconfig,
và sống usr/Kconfig
) có thể được sử dụng để chỉ định nguồn cho
initramfs
kho lưu trữ, sẽ tự động được kết hợp vào nhị phân kết quả. Tùy chọn này có thể trỏ đến một kho lưu trữ * đã được nén * hiện cócpio
, một thư mục chứa các tệp sẽ được lưu trữ hoặc một đặc tả tệp văn bản, ví dụ như sau:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Chạy " usr/gen_init_cpio
" (sau khi xây dựng kernel) để nhận thông báo sử dụng ghi lại định dạng tệp ở trên.
Một lợi thế của tệp cấu hình root
là không cần truy cập để đặt quyền hoặc tạo các nút thiết bị trong kho lưu trữ mới.
(Lưu ý rằng hai mục nhập "tệp" ví dụ này sẽ tìm thấy các tệp có tên " init.sh
" và " busybox
" trong thư mục có tên " initramfs
", trong thư mục linux
-2.6. *. Xem Tài liệu / không gian người dùng sớm / README để biết thêm chi tiết.)
Hạt nhân không phụ thuộc vào các cpio
công cụ bên ngoài . Nếu bạn chỉ định một thư mục thay vì tệp cấu hình, cơ sở hạ tầng xây dựng của kernel sẽ tạo một tệp cấu hình từ thư mục đó ( usr/Makefile
các cuộc gọi scripts/gen_initramfs_list.sh
) và tiến hành đóng gói thư mục đó bằng tệp cấu hình (bằng cách cung cấp cho nó usr/gen_init_cpio
, được tạo từ đó usr/gen_init_cpio.c
). cpio
Mã tạo thời gian xây dựng của kernel hoàn toàn khép kín và trình trích xuất thời gian khởi động của kernel cũng (rõ ràng) là khép kín.