Làm thế nào để điền thư mục / dev khi xây dựng initrd của riêng tôi?


9

Tôi đang cố gắng học những thứ về initrd. Tôi đã làm theo hướng dẫn này để xây dựng initrd của riêng tôi từ đầu và tôi đã cài đặt busybox trên đó. Sau đó, tôi đã tạo một .iso từ nó bằng isolinux, vì vậy tôi có thể kiểm tra nó trong hộp ảo. Nó hoạt động rất tốt!

Tôi có các lệnh cơ bản từ busybox, vì vậy tôi muốn gắn kết một hệ thống tập tin. Nhưng thư mục / dev gần như trống rỗng (không có sda), ngoại trừ một số tệp tôi đã tạo trong khi làm theo hướng dẫn. Tôi đã học về udev và tôi nghĩ đây là thứ tôi cần. Tuy nhiên tôi không chắc làm thế nào để tiếp tục điều này.

Tôi có nên lấy mã nguồn mới nhất từ ​​udev, biên dịch nó và thêm nó vào initrd của tôi không? Và sau đó gọi / bin / udev hoặc một cái gì đó tương tự trong tập lệnh init của tôi? Hoặc có một cách khác / tốt hơn để điền vào thư mục / dev?

Chỉnh sửa: Một số thông tin và cập nhật bổ sung về những gì tôi đã làm.

  • Tôi kiểm tra mọi thứ trong hộp ảo. Tôi vừa cài đặt tối thiểu Ubuntu trong hộp ảo, tạo một .iso từ initrd của tôi và sau đó khởi động từ iso trong hộp ảo.
  • Tôi đã sử dụng vmlinuz và /lib/modulesđã có mặt trên debian-businesscard.iso và sao chép chúng vào initrd mà tôi đã tạo bằng cách làm theo hướng dẫn mà tôi đã liên kết trước đó.
  • Hạt nhân có CONFIG_DEVTMPFS=y
  • Một số thiết bị hiển thị trong /dev, như tty0-tty63 và một số thiết bị khác, nhưng không có sda / hda.
  • Chạy lspci -ktrong hệ điều hành hiện đang chạy của tôi và trong một hộp ảo để kiểm tra các mô-đun đang sử dụng. SATA Controllernói rằng nó sử dụng ahcinhư mô-đun.
  • Khi tôi thực thi, modprobe -v ahcinó phàn nàn rất nhiều về "biểu tượng không xác định: ata_some_ ware", nhưng sau đó nó trả về một cái gì đó như SCSI Subsystem initialized, ATA-6: VBOX HARDDISKDirect-Access ATA VBOX HARDDISK. Tuy nhiên, vẫn không có thiết bị ổ cứng nào được tìm thấy trong /dev.

/init/Kịch bản hiện tại của tôi là như sau:

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

Có ai có ý tưởng gì về những gì tôi đang làm sai và thay vào đó tôi nên làm gì không?

Câu trả lời:


12

Trong khi câu trả lời của gilles là chính xác, đó là trường học cũ :-). Một mục lưu ý khác (nhiều thuật ngữ về thuật ngữ hơn bất cứ điều gì) là hướng dẫn mà bạn liên kết đến là hướng dẫn về cách tạo initramfs, không phải là initrd. Hai cái này giống nhau và phục vụ cùng một mục đích, nhưng khác nhau về cách lưu trữ và tải hình ảnh.

Dù sao, câu trả lời cho câu hỏi của bạn thực sự rất đơn giản.

  1. Kích hoạt devtmpfstrong kernel ( CONFIG_DEVTMPFS=y)
  2. Chạy mount -t devtmpfs none /devnhư là điều đầu tiên trong initkịch bản của bạn .

Đó là nó. Các devtmpfs sẽ cư trú /devgiống như udev. Bạn thậm chí không cần phải trước các /dev(trong hình ảnh initramfs) với những điều cơ bản như null, zerohoặc console.


Cám ơn bạn đã góp ý. Tôi đã chạy lệnh của bạn và bây giờ tôi có nhiều thiết bị hơn, nhưng vẫn không có sda hoặc hda để gắn kết. Có điều gì tôi quên làm? Tôi sử dụng kernel vmlinuz mà tôi nhận được từ hệ thống trực tiếp của debians, tôi có nên thực sự biên dịch cho riêng mình không?
Carlito

@Carlito Hạt nhân này có bật devtmpfs không (kiểm tra tệp cấu hình)? Debian chỉ mới chuyển sang devtmpfs.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Không có tệp cấu hình được cung cấp, nhưng tôi đã tải kernel tôi nhận được từ debian, tệp cấu hình cho biết CONFIG_DEVTMPFS=y, nhưng tôi vẫn không nhận được bất kỳ thiết bị sda nào. Tôi nghĩ điều này là do tôi chưa tải bất kỳ mô-đun nào (lsmod không trả về gì). Những mô-đun nào tôi nên tải để có được các thiết bị hệ thống tập tin? Hoặc có điều gì khác tôi quên?
Carlito

@Carlito có, nếu bạn có những thứ khác hiển thị /dev, không phải là ổ đĩa, thì devtmpfs đang hoạt động và bạn có thể thiếu mô-đun bộ điều khiển đĩa (như bạn đoán). Thật không may, cách duy nhất để biết trình điều khiển / mô-đun nào bạn cần là đọc thông tin cho từng trình trong cấu hình kernel hoặc chạy lspci -ktrong hệ thống linux đang chạy (sẽ cho bạn biết trình điều khiển hạt nhân nào mà các thành phần khác nhau trong hệ thống của bạn đang sử dụng) .
Patrick

1
@ CiroSantilli709 抓捕CONFIG_DEVTMPFS_MOUNT=ykhông có bất kỳ ảnh hưởng nào đến initramfs. Từ văn bản trợ giúp của kernel: "Tùy chọn này không ảnh hưởng đến việc khởi động dựa trên initramfs, ở đây hệ thống tập tin devtmpfs luôn cần được gắn thủ công sau khi rootfs được gắn kết"
Patrick

4

Udev /devtự động cư trú dựa trên các trình điều khiển được tải vào kernel và các thiết bị mà các trình điều khiển này phát hiện. Tên của các thiết bị và quyền của chúng dựa trên một bộ quy tắc mà quản trị viên có thể tinh chỉnh. Hầu hết các hệ thống Linux nên sử dụng udev; ngoại lệ là các hệ thống (thường được nhúng) trong đó cấu hình phần cứng được biết tại thời điểm hệ thống được thiết lập và sẽ không thay đổi sau đó.

Bạn thường gọi udevkhá sớm trong chuỗi khởi động của bạn. Một trong số ít những điều bạn nên (phải?) Làm trước đó là mount /proc/sys. Sau khi khởi động trình nền, hãy gọi udevadm trigger --action=add; udevadm settleđể tạo udev xử lý tất cả các sự kiện đang chờ xử lý từ kernel ( trigger) và đợi cho đến khi các sự kiện được xử lý trước khi tiếp tục ( settle). Sau đó, bạn có thể tiến hành xác định vị trí thiết bị chứa hệ thống tập tin gốc.

Ngoài udevdnhị phân, bạn sẽ cần các phần khác udevtrên initrd của mình. Điều này bao gồm các tệp cấu hình trong /etc/udev, cấu hình cơ sở /lib/udevcũng như các nhị phân của trình trợ giúp, chẳng hạn như scsi_idtrong /lib/udev. Bạn cần tất cả các chương trình được gọi từ các quy tắc udev mà bạn đưa vào initrd.

Vào cuối initrd, trước khi chuyển điều khiển sang phân vùng gốc thực sự, bạn sẽ cần dừng udevdnhư mọi chương trình khác từ initrd. Điều này không loại bỏ bất kỳ thiết bị từ /dev. Sử dụng mount --move /dev /root/devđể di chuyển gắn /devvào gốc thực sự.

Gentoo có một hướng dẫn initramfs và một trang wiki initramfs có đề cập đến udev trong số những thứ khác. Initramfs là sự kế thừa hiện đại của initrd, sử dụng kho lưu trữ cpio chứ không phải hình ảnh hệ thống tập tin và với giao diện xử lý khác (trên initrd, /linuxrcphải thoát, trong khi trên initramfs, /initphải execkhởi tạo từ gốc thực); hầu hết các hệ thống đã chuyển đổi những ngày này (ngay cả khi tệp vẫn có thể được gọi là initrd).


Cảm ơn câu trả lời của bạn. Tôi đi đến kết luận rằng tôi thực sự đã tạo ra một initramfs thay vì một initrd. Nhưng tôi sử dụng hạt nhân vmlinuz mà tôi nhận được từ hệ thống gỡ lỗi trực tiếp, tôi thực sự nên biên dịch hạt nhân của riêng mình cho việc này (vì vậy tôi biết mô-đun nào có để tải ổ cứng) hoặc có một phiên bản tối thiểu nào tôi có thể sử dụng với các mô-đun cơ bản ? Tôi có thể sẽ tải xuống udev mới nhất và cố gắng biên dịch và chạy nó.
Carlito

@Carlito Tôi khuyên bạn trước tiên nên thử với kernel Debian, vì quên một trình điều khiển cần thiết là một lỗi phổ biến khi biên dịch kernel của riêng bạn.
Gilles 'SO- ngừng trở nên xấu xa'

Nhưng làm thế nào tôi có được một? Tôi vừa sao chép vmlinuz mà tôi tìm thấy trong debian-businesscard.iso (có lẽ không phải là ý tưởng tốt nhất). Tôi có nên sao chép kernel chuẩn mà tôi nhận được từ ubfox hoặc debian và toàn bộ thư mục / lib / mô-đun không?
Carlito

@Carlito Bạn sẽ cần ít nhất tất cả các mô-đun cần thiết cho phần cứng của bạn. Có thể khó tìm thấy tất cả những gì bạn cần từ việc duyệt danh sách. Cách tốt nhất để tìm ra những gì bạn cần là chạy lsmodtrên một hệ thống làm việc. Vì vậy, hãy bắt đầu với tất cả chúng, sau đó cắt tỉa thông minh nếu bạn cần tiết kiệm không gian.
Gilles 'SO- ngừng trở nên xấu xa'
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.