在qemu中测试linux内核

时间:2014-05-03 23:25:00

标签: linux testing linux-kernel qemu building

我刚从我的ubuntu 12.04计算机上的kernel.org构建了3.13.3内核。我运行了make menuconfig命令,然后我做了构建内核和模块的make。我想在qemu模拟器(qemu-system-x86_64)中运行内核,这样我就可以开始测试并构建它了。我肯定会让它与qemu-system-x86_64 -kernel bzImage一起运行,但它无法正常启动。我应该做些什么改变才能使内核正常启动?

1 个答案:

答案 0 :(得分:1)

首先需要一张可启动磁盘。您是否尝试在没有-kernel的情况下启动并指定要从中启动的磁盘?

当且仅当它有效时,请考虑使用-kernel作为优化 测试新内核

制作可引导磁盘可能是一个挑战,除非你采用简单的路线并使用dd制作一个大的空文件,例如。

sudo dd if=/dev/zero of=$OUTPUT_DISK bs=4096 count=524288

然后使用您下载的linux iso启动qemu并告诉它使用此磁盘(-hda)并让安装程序为您设置磁盘

如果手动制作可引导磁盘,我已经做了几次 - 不容易,但以下步骤可能会对您有所帮助。您需要格式化磁盘,创建分区,安装grub然后再启动

就个人而言,我会采用简单的方法并通过linux安装程序安装到磁盘

#!/bin/sh
#
# Change these settings
#
INPUT_ISO=mydownloadedlinux.iso
OUTPUT_DISK=mydisk
KERNEL_IMAGE_NAME=linux-kernel
QEMU=qemu-system-x86_64

#
# Stuff you should not need to change
#
TMP_BOOTDISK=/tmp/disk.$$
ISO_MOUNT_DIR=/mnt/iso

#
# Choose DOS or Linux disks
#
PARTITION_TYPE=ext2
MKFS_TYPE=ext2

#
# Mount the ISO
#
sudo mkdir -p $ISO_MOUNT_DIR
sudo umount $ISO_MOUNT_DIR 2>/dev/null
sudo mount -o loop -t iso9660 $INPUT_ISO $ISO_MOUNT_DIR

#
# Make a new disk
#
sudo dd if=/dev/zero of=$OUTPUT_DISK bs=4096 count=524288
LOOP=`sudo losetup -f --show $OUTPUT_DISK`
LOOPDEV=`echo $LOOP | sed 's/.*loop/loop/g'`
echo "Loopback device $LOOP, ($LOOPDEV)"

#
# Make two partitions on the disk
#
sudo parted -s $LOOP mktable msdos \
              mkpart primary $PARTITION_TYPE 32K 50% \
              mkpart primary $PARTITION_TYPE 50% 95%

#
# Make one bootable
#
sudo parted -s $LOOP set 1 boot on
sudo kpartx -l $LOOP
sudo kpartx -a $LOOP

#
# Make the filesystems
#
sudo mkfs.$MKFS_TYPE /dev/mapper/${LOOPDEV}p1
sudo mkfs.$MKFS_TYPE /dev/mapper/${LOOPDEV}p2

#
# List what we made
#
sudo kpartx -l -v $LOOP

#
# Mount this temporary disk so we can install grub on it
#
sudo mkdir -p $TMP_BOOTDISK
sudo mount /dev/mapper/${LOOPDEV}p1 $TMP_BOOTDISK
sudo grub-install --boot-directory=/$TMP_BOOTDISK $LOOP

#
# Make grub boot config
#
cat >/tmp/grub.cfg <<%%
serial
#terminal_input --append serial_com0
#terminal_output --append serial_com0
configfile /mybootfile
%%

cat >/tmp/mybootfile <<%%
set timeout=5
set default=0
menuentry 'mylinux' {
    insmod ext2
    set root='(hd0,1)'
    linux /$KERNEL_IMAGE_NAME bigphysarea=28000
    initrd /rootfs.img.gz
}
%%

#
# Just copy all the files off of the ISO into the mounted temp disk
# This would be the tricky part as you need enough so linux can boot
#
sudo cp -r $ISO_MOUNT_DIR/* $TMP_BOOTDISK

#
# But use our grub files we made above
#
sudo cp /tmp/grub.cfg $TMP_BOOTDISK/grub/grub.cfg
sudo cp /tmp/mybootfile $TMP_BOOTDISK/mybootfile

#
# Show all the files on the temp disk and then unmuont it
#
find $TMP_BOOTDISK
sudo umount $TMP_BOOTDISK
sudo losetup -d $LOOP

#
# Convert the temp disk from raw to vmdk format
#
sudo qemu-img convert $OUTPUT_DISK -O vmdk $OUTPUT_DISK.vmdk

#
# Boot the vmdk
#
sudo $QEMU -boot d -m 4096 \
    -enable-kvm \
    -drive file=$OUTPUT_DISK.vmdk,if=virtio,media=disk \
    -serial telnet:localhost:4444,nowait,server,telnet \
    -net nic,model=e1000,vlan=0 -net user \