Qemu ไม่สามารถโหลดได้เมื่อ initrd (cpio) ของฉันมีขนาดใหญ่ ~ 80 mb

ฉันยังใหม่กับ qemu และกำลังพยายามเรียนรู้การเขียนโปรแกรมเคอร์เนล ฉันสร้าง initrd ซึ่งมีกล่องไม่ว่าง แต่เมื่อฉันเพิ่ม tarbal ขนาดใหญ่ ~80Mb ใน cpio qemu ไม่สามารถโหลดได้

ฉันต้องการรวม golang ไว้ใน intrd เพื่อที่ฉันจะได้ทดสอบเคอร์เนลใหม่ได้

นี่คือสิ่งที่เกิดขึ้น:

mfrw@kp ~/os/busybox/test_build
 % ls
bin  linuxrc  sbin  usr
mfrw@kp ~/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
mfrw@kp ~/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
mfrw@kp ~/os/busybox/test_build
 % 

จากนั้นฉันก็รันโดยใช้ qemu กับเคอร์เนลที่สร้างขึ้นใหม่ด้วย rootfs = 2.6 M

mfrw@kp ~/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+ (mfrw@kp) (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

แต่เมื่อฉันรวม tar.gz สำหรับ golang ไว้ใน rootfs มันจะยิงได้สูงถึง 80M แล้วไม่สามารถบูตได้

mfrw@kp ~/os/busybox/test_build
 % cp ~/go/go1.6.linux-amd64.tar.gz usr 
mfrw@kp ~/os/busybox/test_build
 % !fin
find . | cpio -o -H newc | gzip > rootfs_bb.gz
170406 blocks
mfrw@kp ~/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
mfrw@kp ~/os/busybox/test_build
 % 

ฉันพยายามรันด้วยคำสั่งเดียวกัน แต่ไม่สามารถรันได้...

mfrw@kp ~/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

ผมทำอะไรผิดหรือเปล่า ? พอยน์เตอร์ใด ๆ โปรด :)


person mfrw    schedule 18.03.2017    source แหล่งที่มา
comment
บางทีการกำหนดค่าเคอร์เนลอาจมีค่าเริ่มต้นเล็กน้อยสำหรับขนาด initrd / initramfs   -  person 0andriy    schedule 18.03.2017
comment
ใช้ initramfs แทน initrd (ซึ่งเลิกใช้แล้ว) initramfs มีขนาดแบบไดนามิก และสามารถมีขนาดใหญ่เท่ากับหน่วยความจำที่มีอยู่ BTW ไม่สามารถเข้าถึง rootfs จนกว่าจะล่าช้าในลำดับการบูตเคอร์เนล (เช่น หลังจากการเตรียมใช้งานอุปกรณ์) หากคุณได้รับ no ...output แสดงว่าการเริ่มต้นเคอร์เนลล้มเหลว ลองเปิดใช้งานคุณลักษณะ earlyprintk   -  person sawdust    schedule 18.03.2017
comment
@sawdust พวกเขาใช้ initramfs (หมายเหตุ cpio -o -H newc ด้านบน)   -  person 0andriy    schedule 20.03.2017
comment
@0andriy -- แล้ว -initrd ./../busybox/test_build/rootfs_bb.gz ในบรรทัดคำสั่ง qemu ระบุอะไร?   -  person sawdust    schedule 20.03.2017
comment
มันระบุ initramfs/initrd ที่คุณต้องการใช้... (rootfs)... ฉันพบวิธีแก้ปัญหาแล้ว ฉันไม่ได้ให้หน่วยความจำเพียงพอแก่ qemu ... ฉันใช้ flag -m size=512 มันวิ่ง.. .   -  person mfrw    schedule 21.03.2017
comment
@ขี้เลื่อย คุณสามารถตรวจสอบ kernel/init.c IIRC เพื่อดูรายละเอียดการจดจำรูปแบบไฟล์โดยอัตโนมัติ ไม่สำคัญว่าไฟล์จะเป็นชื่อหรือรูปแบบใด (initrd / initramfs)   -  person 0andriy    schedule 21.03.2017
comment
พวกคุณกำลังรวม initrd และ initramfs เข้าด้วยกัน พวกเขาไม่เหมือนกัน BTW นั่นเป็นคำถามเชิงวาทศิลป์ และคุณได้รับคำตอบผิดตามคู่มือ qemu   -  person sawdust    schedule 22.03.2017
comment
ฉันยอมรับว่าทั้งคู่ไม่เหมือนกัน แต่ในความคิดของฉันเคอร์เนลมีสติเพียงพอที่จะเข้าใจและดำเนินการอย่างเหมาะสม   -  person mfrw    schedule 22.03.2017


คำตอบ (1)


ในที่สุดฉันก็พบวิธีแก้ปัญหา เนื่องจากไม่ได้ให้หน่วยความจำเพียงพอ ดังนั้นจึงล้มเหลว ในที่สุดฉันก็วิ่งไปกับมัน

-ขนาดม=512

และมันก็วิ่งได้ดี

person mfrw    schedule 20.03.2017