2011-06-19 32 views
10

Như tôi đã biết, initrd là một hình ảnh nhỏ có thể tải được trong RAM. Nó được sử dụng để khởi động một hạt nhân hoàn chỉnh với tất cả các mô-đun có thể nạp được. Là một phần của quá trình, chúng ta cần hình ảnh hạt nhân vmlinuz là một phiên bản được đổi tên của bzImage.Có thể khởi động hạt nhân Linux mà không cần tạo hình ảnh initrd không?

Có thể khởi động hạt nhân mà không tạo hình ảnh initrd không?

+0

Bạn đã thử bỏ tùy chọn 'initrd = ...' khỏi bộ nạp khởi động chưa? Về nguyên tắc initrd là tùy chọn, miễn là hạt nhân của bạn có tất cả các trình điều khiển cần thiết được biên dịch vào nó để tìm kiếm hệ thống tệp gốc. Ngoài ra, đây là câu hỏi lập trình như thế nào? –

+0

Có thể, và nó được sử dụng để được rằng tất cả các hệ thống Linux khởi động mà không có một initrd. Nhưng initrd làm cho nhiều thứ trở nên dễ dàng hơn nhiều. Tôi tò mò ... Tại sao bạn muốn khởi động mà không có initrd? Biết rằng có lẽ sẽ làm cho nó dễ dàng hơn để cung cấp một câu trả lời có ý nghĩa hơn. – Flimzy

+0

Tôi đã phát triển dự án openwrt và muốn tạo một hình ảnh hạt nhân nhỏ. Bỏ qua phần initrd đã tạo lỗi khởi động. – Neel

Trả lời

2

initrd chứa các mô-đun cần thiết để hiểu hệ thống tệp gốc và do đó có thể truy cập vào các mô-đun hạt nhân bình thường.

Nếu hạt nhân của bạn được biên dịch với tất cả mã được tích hợp sẵn, chứ không phải là mô-đun, thì không cần bắt buộc phải có initrd.

15

initrd/initramfs là tùy chọn và không phải là yêu cầu. bzImage là ảnh hạt nhân thuần túy và có thể được khởi động trực tiếp bởi bộ nạp khởi động. Tuy nhiên, có thể cần phải thực hiện một số nhiệm vụ (tải các mô-đun hệ thống, trình điều khiển để truy cập đĩa, gắn hệ thống tệp gốc từ một số phương tiện trao đổi mà không có tên/đường dẫn cố định, v.v.) thường yêu cầu quyền truy cập vào công cụ hệ thống tệp và không gian người dùng.

Đó là những gì initramfs là dành cho: Đây là bản lưu trữ CPIO được đính kèm vào ảnh hạt nhân (hình ảnh hạt nhân là vùng chứa cho initramfs không theo cách khác) trong chính hình ảnh hạt nhân hoặc trình khởi động lúc khởi động.

Bản lưu trữ CPIO đó chứa rootfs ban đầu với các mô-đun cần thiết để thiết lập tất cả các thiết bị để truy cập hệ thống tệp gốc phù hợp và một số chương trình xác định các thiết bị đó, tải mô-đun, thực hiện một số tác vụ khởi động khác. và bắt đầu/sbin/init

initrd tương tự, với sự khác biệt chính là hình ảnh hệ thống tệp, có thể và thường được nén. Hạt nhân phải có hỗ trợ cho hệ thống tập tin được sử dụng được tích hợp sẵn và sẽ gắn kết hình ảnh này làm hình ảnh ban đầu /.

Vì CPIO đơn giản hơn bởi nhiều đơn đặt hàng, nên initramfs được ưu tiên hơn initrd, vì điều này tiết kiệm cả yêu cầu cho bất kỳ mô-đun hệ thống tệp nào được tích hợp và cũng giúp việc tạo initramfs dễ dàng hơn. Thay vì phải tạo ra một hình ảnh ext2, loopdevice gắn kết và cư trú nó, nó sôi xuống để tạo ra một kho lưu trữ đơn giản, không giống như sử dụng tar.

Tuy nhiên, nếu bạn biên dịch hạt nhân với tất cả các trình điều khiển và mô-đun cần thiết được tích hợp vào ảnh hạt nhân và thiết bị hệ thống tệp gốc của bạn có tên cố định trong hệ thống, bạn không cần initramfs vì hạt nhân có thể tự làm mọi thứ sau đó.

2

Có, bạn có thể khởi động hệ thống không có hình ảnh initrd.

hình ảnh initrd là hình ảnh ramdisc gzipped, hoặc (phổ biến hơn hiện nay) là một hình ảnh .cpio gzipped.

Trong trường hợp sau, tệp .cpio được mở rộng thành một hệ thống tệp được gọi là initramfs.

Nếu hình ảnh .cpio không xuất hiện, hạt nhân sử dụng hình ảnh tích hợp, chỉ chứa một vài tệp đặc biệt (chẳng hạn như/dev/console,/dev/null và một vài thư mục), nhưng không có nhị phân.

Nhân sau đó sử dụng một số tùy chọn logic và dòng lệnh tích hợp để cố gắng tìm và gắn kết là hệ thống tệp gốc "thực", được gắn "trên" các initramfs và do đó ẩn nó.

Hệ thống khởi động "cũ" này chủ yếu không được sử dụng trong các bản phân phối hiện đại.

+0

Điều này thật thú vị, tôi có thể tìm thêm chi tiết về hình ảnh tích hợp ở đâu? Có phải đó là những gì đang được sử dụng khi tôi chạy QEMU mà không có '-initrd'? https://stackoverflow.com/a/48823924/895245 –

0

Minimal qemu + Ví dụ

Đây Buildroot là một ví dụ cụ thể tối thiểu cho thấy rằng initrd không bắt buộc: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af#initrd

Với thiết lập này, chúng ta có thể dễ dàng chạy làm việc hai lệnh qemu loại:

qemu-system-x86_64 -drive file=rootfs.ext2 

và:

qemu-system-x86_64 -initrd rootfs.cpio 

đâu:

  • rootfs.ext2rootfs.cpio về cơ bản hệ thống tập tin gốc giống nhau, nhưng trong các định dạng khác nhau
  • lệnh đầu tiên có ổ cứng và không -initrd
  • lệnh thứ hai một -initrd nhưng không có ổ cứng

Trong cả hai trường hợp, Linux khởi động tốt, ngoại trừ trong hệ thống -initrd, ghi tệp không liên tục kể từ đêm trước rything là trong bộ nhớ.

Các vấn đề liên quan