Initramfs có thể được phân trang ra để trao đổi đĩa?


7

Tôi đang sử dụng initramfsđể khởi động Centos thông qua PXE. Bộ initramfsnhớ đã sử dụng được liệt kê trong giá trị "được lưu trong bộ nhớ cache" trong /proc/meminfohoặc thông qua free.

Vì tôi cần tính toán dữ liệu hiệu suất, tôi cần biết liệu bộ nhớ được sử dụng initramfscó thể lấy lại được không (tức là có thể hoán đổi ra đĩa) hay không. Thông thường chỉ có một phần rất nhỏ của /cây hệ thống tập tin thực sự được sử dụng, do đó, phần lớn initramfscó thể được hoán đổi.

Đọc về điều này tôi nhận được thông tin mâu thuẫn. Một số nguồn tin cho rằng initramfshành vi như thế initrdvà dựa trên ramfs, điều đó có nghĩa là bộ nhớ được yêu cầu không thể được phân trang để trao đổi. Các nguồn khác tuyên bố rằng initramfsvề cơ bản tmpfs, điều này sẽ ngụ ý rằng nó có thể được phân trang để trao đổi.

Cái nào đúng? Các phần không sử dụng của initramfshệ thống tập tin có thể được phân trang để trao đổi không gian?


Tôi đoán thật dễ dàng để tìm ra với một VM có ít bộ nhớ ...
Hauke ​​Laging

Câu trả lời:


6

EDIT: Trả lời cập nhật / sửa chữa.

Mặc dù tài liệu kernel về chủ đề này nói rằng "Rootfs là một phiên bản đặc biệt của ramfs (hoặc tmpfs, nếu được bật) [...]", nhưng thực tế nó vẫn là một ramfs, vì một cái nhìn ngắn trong mã cho thấy ( rootfs là không được đề cập trong mm/shmem.c).

Một số bản vá (xem ví dụ ở đâyở đây ) đã được gửi đến danh sách gửi thư nhân Linux (lkml) để thay đổi điều này. Nhưng họ đã không được chấp nhận. Một lý do là, thông thường bạn không kích hoạt trao đổi trong giai đoạn initramfs hoặc trong các hệ thống nhúng.

Hình ảnh initramfs được trích xuất vào rootfs. Trước khi không gian người dùng (thường switch_rootđược gọi là từ /init) chuyển sang root mới, nó sẽ xóa nội dung của các rootfs sao cho chỉ còn lại dung lượng bộ nhớ tối thiểu của một ramfs trống. Vì vậy, sau này, về cơ bản bạn có thể bỏ qua việc sử dụng bộ nhớ của nó và câu hỏi nếu nó có thể được hoán đổi, gần như không liên quan.


1
Cảm ơn bạn đã thông tin. Tôi nên làm rõ: tôi không thực hiện switch_root, initramfs là kho lưu trữ cpio 2GB của Cài đặt CentOS đầy đủ được khởi động qua PXE, nó vẫn ở dạng rootfs. Do đó, tôi muốn biết liệu một thiết bị trao đổi cục bộ có thể giải phóng một số 2GB không sử dụng hay không.
dfens123

Ngoài ra, theo gossamer-threads.com/lists/linux/kernel/1463249 : "Rootfs là một phiên bản đặc biệt của ramfs (hoặc tmpfs, nếu được bật)" nhưng cho đến nay nó vẫn luôn là một lời nói dối. Vì vậy, tôi không chắc chắn rootfs thực sự là một tmpfs hay vẫn là ramfs, làm thế nào để kiểm tra?
dfens123

1
@ dfens123, thay vì yêu cầu khách hàng tải toàn bộ hệ thống vào một rootfs đồ sộ, tại sao bạn không gắn root qua NFS?
psusi

@ dfens123 Tôi đã sửa câu trả lời của mình.
jofel

1
Tôi cho rằng tôi có thể trích xuất kho lưu trữ cpio vào một tmpfs thực tế và switch_root từ ramfs / rootfs
dfens123

1

Như bạn nói, rootfsdữ liệu tệp chỉ có thể được phân trang nếu nó được thực hiện với tmpfs, không ramfs.

Kể từ Linux v3.12, tmpfsđược sử dụng trong một số trường hợp. Nếu tôi đọc mã chính xác, điều này chỉ xảy ra nếu bạn không vượt qua root=tùy chọn. Bạn có thể buộc ramfs được sử dụng bằng cách chuyển rootfstype=ramfs, nhưng bạn không thể buộc tmpfs bằng cách chuyển `rootfstype = tmpfs.

Nếu bạn có statlệnh, stat -f .sẽ xác nhận xem bạn đang ở trên một ramfstương đương, hoặc tmpfstương đương, hoặc một loại hệ thống tập tin khác hoàn toàn.


Điều này đã được thực hiện trong:

6e19eded3684 "initmpfs: sử dụng initramfs nếu rootfstype = hoặc root = được chỉ định"

Tùy chọn dòng lệnh rootfstype = ramfs để có được hành vi initramfs cũ và sử dụng ramfs thay vì tmpfs cho stub khi root = được xác định (vì lý do mỹ phẩm).

Đó là một chút bối rối, vì hai lý do. Đầu tiên, nó có hiệu quả ghi đè logic trong cam kết xuất hiện ngay trước nó:

16203a7a942 "initmpfs: làm cho rootfs sử dụng tmpfs khi bật CONFIG_TMPFS"

Gọi một cách có điều kiện hàm fs_init và hàm fill_super thích hợp.

Thứ hai, bài kiểm tra root=dường như không được đề cập trong tài liệu, ngay cả trong v4.17:

https://github.com/torvalds/linux/blob/v4.17/Documentation/filesystems/ramfs-rootfs-initramfs.txt

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.

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.