Làm thế nào một nhân Linux có khả năng truy cập initramfs / initrd được gán của nó?


8

Tôi đang cố gắng tìm hiểu toàn bộ quá trình khởi động của máy kể từ khi bạn nhấn nút nguồn. Có một phần từ bootloader đến giai đoạn initramfs tôi không hiểu lắm về một số bit nhỏ khác.

Đưa ra cấu hình Grub này cho một mục nhập, được lấy từ bản cài đặt mặc định của Ubuntu gần đây:

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

Điều này thực sự làm gì về trạng thái hệ thống và bộ nhớ? Tôi hiểu rằng nhiệm vụ của Grub là "tải và chạy kernel" và nó có bộ mô-đun riêng để truy cập các tệp trên thiết bị (hoặc mạng) để truy cập chúng. Trong ví dụ ở đây insmods, set rootsearch- nhưng đây chỉ là từ quan điểm của Grub, và không được chia sẻ với kernel, phải không?

Tôi cũng đoán rằng Grub đang tải (một bản sao?) Của kernel vào bộ nhớ ( linuxlệnh ) và đá nó để bắt đầu thực thi. (hai bước khác nhau rõ ràng - vì vậy, làm thế nào?) Các tham số đã cho có thể được đọc trong kernel và được diễn giải (đây có phải là một chuỗi lớn được ánh xạ vào bộ nhớ ở đâu đó không?) và cung cấp các tùy chọn để sắp xếp những thứ được yêu cầu.

Tôi cũng thấy initrdtùy chọn này . Điều này trỏ đến initramfs nén của tôi, cần thiết để khởi động thiết bị gốc thực sự được chỉ định bởi root=. Nhưng làm thế nào là initramfs này được cung cấp cho kernel? Nó không được chuyển bất kỳ địa chỉ bộ nhớ nào đến nơi mà nó có thể tải nó, cũng như không thể truy cập chính nó, vì nó đã được tải trước khi kernel được khởi động. Một số tài liệu kernel nói rằng 'thiết bị' hệ thống tệp initramfs này có thể truy cập được thông qua /dev/ram0, nhưng tôi không thấy cách nó trở thành một tệp thiết bị có thể truy cập để bắt đầu. Có điều gì đó xảy ra dưới nước tôi không thấy, tôi đoán.

Tôi cũng không thấy điều này liên quan đến các trình tải khởi động khác, bao gồm các nền tảng nhúng, ví dụ như sử dụng U-boot / Coreboot. Đây có phải đang làm điều tương tự như Grub (cùng địa chỉ bộ nhớ tiêu chuẩn không?) Và mức độ này so với Grub về việc tải kernel / initrd ở mức độ nào?

Chỉ cần được rõ ràng về câu hỏi của tôi, tôi nghĩ rằng tôi hiểu tại sao các giai đoạn khởi động khác nhau tồn tại và những gì chuyển tiếp diễn ra, nhưng tôi không thấy cách họ diễn ra và những gì mà trách nhiệm chính xác là cho mỗi giai đoạn. Tôi có cảm giác tôi đang bỏ lỡ một số "tiêu chuẩn" mà tất cả điều này được đưa ra.

Tôi sẽ đánh giá cao một số lời giải thích về điều này.


Lưu ý bootlệnh ngầm ở cuối chuỗi. Tôi không chắc chính xác những gì nó làm trong Grub, nhưng nếu bạn sử dụng dòng lệnh Grub để nhập các lệnh này theo cách thủ công, bạn cần boothoặc nó sẽ chỉ ngồi mãi ở grub>(hoặc ít nhất, cho đến khi bạn chán và tắt máy tính ). Các lệnh trước "chỉ" thiết lập một môi trường.
một CVn

@ MichaelKjorling Từ sự hiểu biết của tôi bây giờ, bootsẽ làm cho CPU nhảy đến địa chỉ của hạt nhân được tải (bắt đầu thực hiện). Đối với một mục menu, điều này được định nghĩa ngầm. thấy này .
gertvdijk

Câu trả lời:


5

Nói chung, phải có một số loại giao thức vì thông thường chỉ cần tải một tệp vào bộ nhớ và nhảy vào một vị trí cụ thể là không đủ nhưng bạn phải truyền thêm các đối số như tham số kernel, tức là truy cập các đối số memdisk từ DOS .

Vì đây là phụ thuộc vào phần cứng (ví dụ như arm khác với x86), bạn phải tìm thông tin chính xác, xem bài viết này về khởi động arm hoặc giao thức khởi động Linux / x86 để biết một số ví dụ.


6

Bộ nạp khởi động lưu trữ initrd vào một vị trí trong bộ nhớ và cho kernel biết địa chỉ bộ nhớ của hình ảnh initrd. Hầu hết các hệ thống linux hiện đại sử dụng lược đồ initramfs bằng cách sử dụng dracut , đây thực sự là một kho lưu trữ cpio (chứ không phải là hình ảnh đĩa) được giải nén vào hệ thống tập tin tmpfs được tạo bởi kernel ngay sau khi thực thi.


Tôi đã đi xa đến đó; nhưng làm thế nào để bộ nạp khởi động nói với kernel về vị trí trong bộ nhớ? Hạt nhân lấy địa chỉ bộ nhớ đó ở đâu?
gertvdijk

3
@gertvdijk hãy xem kernel.org/doc/Documentation/x86/boot.txt nó mô tả cách bộ nạp khởi động giao tiếp với kernel, tức là bộ nạp khởi động cũng phải cung cấp các tham số kernel, v.v.
Ulrich Dangel

@UlrichDeach Đẹp! Chính xác những gì tôi đang tìm kiếm. Rõ ràng, đó là một giao thức dành riêng cho phần cứng (x86 trong trường hợp này) mô tả tất cả. Viết nó như một câu trả lời với một mô tả ngắn và tôi sẽ chấp nhận nó.
gertvdijk
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.