Điều gì đang xảy ra là bạn đang cố gắng khởi động Linux theo cách "lỗi thời". Đó là nơi mà initrd
một ramdisk trái ngược với kho lưu trữ cpio đã nén được giải nén bởi kernel trong một ramfs, và với cách cũ để chuyển sang thiết bị cuối.
Trong chế độ đó, kernel gắn đĩa.img dưới dạng ramdisk làm hệ thống tập tin gốc và sau đó thực thi /linuxrc
trong đó. Rất có thể trong trường hợp của bạn, không có tập tin nào như vậy. Khi /linuxrc
(được cho là làm bất cứ điều gì cần thiết để đưa thiết bị khối cho hệ thống tập tin gốc thực sự) thoát ra, thì nhân gắn kết hệ thống tập tin gốc thực sự.
Các thông báo ở trên cho thấy rằng nó gắn đĩa ram thành công (1,0: 1 là ram
vì vậy /dev/ram0
) nhưng không phải là hệ thống tập tin gốc thực sự / dev / sda1 (8.1: 8 là sd
, 1 là a1
). Có lẽ vì bạn đã không chỉ định một dòng lệnh kernel ( -append
), /dev/sda1
xuất phát từ CONFIG_CMDLINE được truyền vào thời gian biên dịch kernel hoặc sử dụng rdev
.
Nếu đĩa.img của bạn có nghĩa là chứa một hệ thống tệp gốc có nghĩa là một bản phân phối Linux nhỏ với /sbin/init
..., thì có lẽ bạn muốn viết nó thay thế:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
Sau đó, kernel sẽ coi đĩa ram là hệ thống tập tin gốc thực sự (mặc dù bạn vẫn có thể pivot_root
đến một cái khác).
Để có thể xem các thông điệp kernel dễ dàng hơn, tôi khuyên bạn nên sử dụng đầu ra nối tiếp:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
Để thay thế, bạn có thể sử dụng ram ram init thay vì init ramdisk:
mkdir -p RAMFS/{bin,dev}
cd RAMFS/bin
cp /bin/busybox .
"$PWD/busybox" --install .
cd ..
cp -a /dev/{null,tty,zero,console} dev
printf '%s\n' "#! /bin/sh" "exec /bin/sh" > init
chmod +x init
find . | cpio -oHnewc | gzip > ../initramfs.gz
cd ..
kvm -kernel kernel.img -initrd initramfs.gz
(được cung cấp busybox
là phiên bản được liên kết tĩnh) và bạn sẽ nhận được một shell và các tiện ích busybox khác trong kernel đó).
Lưu ý rằng kernel bây giờ chạy /init
ngược lại /linuxrc
hoặc /sbin/init
trong chế độ đó.