当我的initrd(cpio)很大〜80 MB时,Qemu无法加载
问题描述:
我是qemu的新手,我正在努力学习内核编程,我创建了一个忙框的initrd,但是当我添加一个大的tarbal〜80Mb cpio qemu无法加载。当我的initrd(cpio)很大〜80 MB时,Qemu无法加载
我想将golang包含在intrd中,这样我就可以测试新的内核。
这是正在发生的事情:
[email protected] ~/os/busybox/test_build
% ls
bin linuxrc sbin usr
[email protected] ~/os/busybox/test_build
% !find
find . | cpio -o -H newc | gzip > rootfs_bb.gz
cpio: File ./rootfs_bb.gz grew, 1261568 new bytes not copied
7374 blocks
[email protected] ~/os/busybox/test_build
% ls -ltrh
total 2.6M
drwxr-xr-x 2 mfrw mfrw 4.0K Mar 18 01:56 bin
lrwxrwxrwx 1 mfrw mfrw 11 Mar 18 01:56 linuxrc -> bin/busybox
drwxr-xr-x 2 mfrw mfrw 4.0K Mar 18 01:56 sbin
drwxr-xr-x 4 mfrw mfrw 4.0K Mar 18 15:24 usr
-rw-r--r-- 1 mfrw mfrw 2.6M Mar 18 15:31 rootfs_bb.gz
[email protected] ~/os/busybox/test_build
%
然后我用QEMU与rootfs的一个新鲜的内核运行= 2.6M,
[email protected] ~/os/linux_staging % qemu-system-x86_64 -nographic -no-reboot -kernel arch/x86/boot/bzImage -initrd ./../busybox/test_build/rootfs_bb.gz -append "panic=1 console=ttyS0 rdinit=/bin/sh"
[ 0.000000] Linux version 4.11.0-rc2+ ([email protected]) (gcc version 6.3.1 20170109 (GCC)) #7 SMP Sat Mar 18 02:34:27 IST 2017
[ 0.000000] Command line: panic=1 console=ttyS0 rdinit=/bin/sh
[ 0.000000] x86/fpu: x87 FPU will use FXSAVE
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
...... the kernel boots fine
但是当我包括golang tar.gz的在根文件系统,它拍摄高达80M,然后启动失败
[email protected] ~/os/busybox/test_build
% cp ~/go/go1.6.linux-amd64.tar.gz usr
[email protected] ~/os/busybox/test_build
% !fin
find . | cpio -o -H newc | gzip > rootfs_bb.gz
170406 blocks
[email protected] ~/os/busybox/test_build
% ls -ltrh
total 82M
drwxr-xr-x 2 mfrw mfrw 4.0K Mar 18 01:56 bin
lrwxrwxrwx 1 mfrw mfrw 11 Mar 18 01:56 linuxrc -> bin/busybox
drwxr-xr-x 2 mfrw mfrw 4.0K Mar 18 01:56 sbin
drwxr-xr-x 4 mfrw mfrw 4.0K Mar 18 15:34 usr
-rw-r--r-- 1 mfrw mfrw 82M Mar 18 15:34 rootfs_bb.gz
[email protected] ~/os/busybox/test_build
%
我尝试用相同的命令来运行它,它无法运行...
[email protected] ~/os/linux_staging % qemu-system-x86_64 -nographic -no-reboot -kernel arch/x86/boot/bzImage -initrd ./../busybox/test_build/rootfs_bb.gz -append "panic=1 console=ttyS0 rdinit=/bin/sh"
.... no .. output
我在做什么错?任何指针请:)
答
我终于找到了解决方案,没有给它足够的内存,所以它失败了。 我最后用
-m大小跑了= 512
它运行良好
也许内核配置有小的默认的initrd/initramfs的大小? – 0andriy
使用initramfs而不是initrd(已弃用)。 initramfs是动态调整大小的,并且可以与可用内存一样大。顺便说一句,直到内核引导序列的后期(即设备初始化之后)才访问rootfs。如果你得到*“no ... output”*,那么内核初始化失败。尝试启用** earlyprintk **功能。 – sawdust
@sawdust,它们使用* initramfs *(注意上面的'cpio -o -H newc')。 – 0andriy