Tôi đang xây dựng một hệ thống Linux rất tối thiểu chỉ bao gồm kernel (v4.1-rc5) và một initramfs được điền với busybox (v1.23.2). Nó hoạt động tốt đối với hầu hết các phần, nhưng tôi quan sát thấy sự khác biệt trong hành vi thực thi lệnh trong / init cho dù tôi đang sử dụng một initramfs nhúng so với bên ngoài.
Tập lệnh / init là:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
setsid cttyhack /bin/sh
done
Sau đó, tôi hoặc đặt tùy chọn CONFIG_INITRAMFS_SOURCE trong kernel .config vào thư mục chứa tất cả các thư mục cho initramfs hoặc tôi chạy
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
để xây dựng nó.
Sau đó, khi tôi biên dịch kernel, có hoặc không có CONFIG_INITRAMFS_SOURCE, tôi kết thúc với hai biến thể của hệ thống của mình:
bzImage với initramfs được nhúng
bzImage + rootfs.cpio.gz (initramfs bên ngoài)
khi tôi bắt đầu sử dụng qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
hoặc là
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
Tôi nhận được sự khác biệt sau đây trong hành vi:
với phiên bản 2 (initramfs bên ngoài) mọi thứ đều hoạt động tốt, "Chào mừng" được hiển thị và tôi nhận được lời nhắc. Tuy nhiên với phiên bản 1 (nhúng initramfs) tôi nhận được cảnh báo
unable to open an initial console
"Chào mừng" không được hiển thị và tôi nhận được lời nhắc của mình.
Theo như tôi hiểu về quy trình, hai phiên bản initramfs đó nên chứa cùng một tệp, vì tôi xây dựng nó (hoặc có kernel xây dựng nó) từ một thư mục giống hệt nhau.
Tôi tự hỏi nếu có ai có thể giúp tôi giải thích cho hành vi này?
* CẬP NHẬT *
như mikeerv đã nói trong các bình luận, kernel bao gồm một initramfs nhúng tối thiểu cho mỗi mặc định. Điều này vẫn còn khi sử dụng một cái bên ngoài, nhưng bị ghi đè nếu bạn nhúng cái của riêng bạn. Tôi thấy rằng trái với đặc điểm kỹ thuật, điều này thực sự không trống, nhưng chứa một thư mục dev, một thư mục gốc và thiết bị / dev / console. Thiết bị này sau đó được sử dụng khi sử dụng initramfs bên ngoài, nhưng được ghi đè nếu bạn nhúng chính thiết bị của mình. Vì vậy, bạn phải bao gồm thiết bị / dev / console trong nguồn initramfs của mình mknod -m 622 initramfs_src/dev/console c 5 1
khi nhúng thiết bị của riêng bạn.
Cảm ơn rất nhiều đến mikeerv, frostschutz và JdeBP vì đã giúp tôi vượt qua điều đó!
/dev/console
trên dựng sẵn của bạn là gì? Tôi nghĩ rằng sự khác biệt có thể là về việc ai đóng gói trong hai trường hợp.