Tại sao initramfs gắn hệ thống tập tin gốc chỉ đọc


12

Lý do cho hệ thống tập tin gốc được gắn kết rotrong initramfs (và trong initrd) là gì.

Ví dụ: hướng dẫn Gentram initramfs gắn kết hệ thống tập tin gốc với:

mount -o ro /dev/sda1 /mnt/root

Tại sao không phải là sau đây?

mount -o rw /dev/sda1 /mnt/root

Tôi có thể thấy rằng có một lý do chính đáng (và nó có thể liên quan switchroot), tuy nhiên nó dường như không được ghi nhận ở bất cứ đâu.

Câu trả lời:


19

Các đĩa RAM ban đầu (initrd) thường là một phiên bản rút gọn của hệ thống tập tin gốc có chứa duy nhất đó là cần thiết để gắn kết hệ thống tập tin gốc thực tế và tay tắt khởi động nó.

Khởi đầu tồn tại bởi vì trong các hệ thống hiện đại, bộ tải khởi động không thể đủ thông minh để tìm hệ thống tập tin gốc một cách đáng tin cậy. Có quá nhiều khả năng cho một chương trình nhỏ như bộ tải khởi động để trang trải. Xem xét root NFS, thẻ RAID không chuẩn, v.v ... Bộ tải khởi động phải thực hiện công việc của mình bằng cách chỉ sử dụng BIOS cộng với bất kỳ mã nào có thể được nhồi nhét vào khu vực khởi động.

Các initrd được lưu trữ ở đâu đó mà bộ tải khởi động có thể tìm thấy và nó đủ nhỏ để có thêm không gian cần thiết thường không làm phiền bất cứ ai. (Trong các hệ thống nhúng nhỏ, thường không có root "thực", chỉ là initrd.)

Các initrd là quý giá: nội dung của nó phải được bảo tồn trong mọi điều kiện, bởi vì nếu initrd bị hỏng, hệ thống không thể khởi động. Một lựa chọn thiết kế mà các nhà thiết kế của nó đưa ra để đảm bảo điều này là làm cho bộ tải khởi động tải chỉ đọc initrd. Có những nguyên tắc khác mà làm việc về phía này, quá, chẳng hạn như trong trường hợp của các hệ thống nhỏ, nơi không có "thực" root, bạn vẫn gắn riêng biệt /tmp, /var/cachevà như vậy để lưu trữ mọi thứ. Thay đổi initrd chỉ được thực hiện hiếm khi, và sau đó nên được thực hiện rất cẩn thận.

Trở lại với trường hợp bình thường, nơi có một hệ thống tập tin gốc thực tế, nó là bước đầu gắn read-only vì initrd là. Sau đó, nó được giữ ở chế độ chỉ đọc càng lâu càng tốt vì nhiều lý do tương tự. Bất kỳ ghi vào gốc thực sự cần phải được thực hiện cho đến khi hệ thống được khởi động, theo sở thích hoặc ít nhất là cho đến cuối quá trình khởi động khi không thể thỏa mãn sở thích đó.

Điều quan trọng nhất xảy ra trong giai đoạn chỉ đọc này là hệ thống tập tin gốc được kiểm tra để xem liệu nó có bị xóa sạch không. Đó là điều mà trình tải khởi động chắc chắn có thể làm thay vì để nó vào initrd, nhưng điều gì sẽ xảy ra nếu hệ thống tập tin gốc không được xử lý sạch? Sau đó, nó phải gọi fsckđể kiểm tra và có thể sửa nó. Vì vậy, nơi nào sẽ initrdnhận được fsck, nếu nó chịu trách nhiệm cho bước này thay vì chờ đợi cho đến khi bàn giao đến gốc "thực sự"? Bạn có thể nói rằng bạn cần sao chép fsckvào initrdkhi xây dựng nó, nhưng bây giờ nó lớn hơn. Và trên hết, fsck bạn sẽ sao chép? Các hệ thống Linux thường xuyên sử dụng hàng tá hệ thống tập tin khác nhau. Bạn có chỉ sao chép cái cần thiết cho root thực sự tại thời điểminitrdđược tạo ra? Bạn có tăng kích thước initrdbằng cách sao chép tất cả fsck.foocác chương trình có sẵn vào nó, trong trường hợp hệ thống tập tin gốc sau đó được di chuyển sang một số loại hệ thống tập tin khác và ai đó quên xây dựng lại initrd?

Các kiến ​​trúc sư hệ thống khởi động Linux đã khôn ngoan chọn không gây gánh nặng cho các vấn đề này. Họ ủy thác kiểm tra hệ thống tập tin gốc thực sự cho hệ thống tập tin gốc thực sự, vì nó ở vị trí tốt hơn để làm điều đó hơn so với initrd.

Khi quá trình khởi động đã tiến hành đủ xa để đảm bảo an toàn, initrd sẽ được hoán đổi từ bên dưới gốc thực pivot_root(8)và hệ thống tập tin được hiển thị lại ở chế độ đọc-ghi.


4
Các initramfs không được gắn chỉ đọc; kernel giải nén nó thành một tmpfs đọc / ghi được gắn kết là /. Ngoài ra p Pivot_root () được sử dụng trong initrd hiện đã khấu hao, nhưng không phải là initramfs, mà hầu hết các hệ thống sử dụng ngày nay (mặc dù tệp vẫn được đặt tên là initrd). Với initrd, p Pivot_root đã diễn ra trước khi thực hiện / sbin / init, tiếp tục với fsck và remount r / w. Với một initramfs, nó chỉ xóa tất cả các tệp trong initramfs, sau đó chroots vào root thực và exec / sbin / init.
psusi

0

Bởi vì trong quá trình khởi động, hệ thống tập tin gốc luôn được gắn kết chỉ đọc. Sau khi tự kiểm tra khác nhau hoàn tất, nó sẽ nhắc lại hệ thống tập tin gốc dưới dạng đọc / ghi và bắt đầu gắn các hệ thống tập tin khác.


0

Một lý do tôi có thể nghĩ đến là để ngăn chặn một số loại tham nhũng. Ví dụ: bạn có thể gắn hệ thống tệp ext4 dưới dạng ext2 (hoặc ngược lại) và điều này an toàn trong chế độ ro, nhưng có thể gây ra thay đổi định dạng không tương thích nếu được gắn rw từ initram.

Ồ, và có một lý do khác: initramfs có thể không có fsck, nhưng bạn có thể cần kiểm tra hệ thống tập tin trước khi cài đặt nó.

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.