0

I have just built the 3.13.3 kernel from kernel.org on my ubuntu 12.04 computer. I ran the make menuconfig command and then I did make which built the kernel and the modules. I want to run the kernel in the qemu emulator (qemu-system-x86_64) so I can start testing and building on top of it. Curently I am getting it to run with qemu-system-x86_64 -kernel bzImage however it is not booting properly. What changes should I make in order to make the kernel boot properly?

1 Answers1

1

You need to have a bootable disk first of all. Have you tried booting without -kernel and specifying the disk to boot from ?

If and only if that works, then think about using -kernel as an optimization to test out new kernels

Making a bootable disk can be a challenge unless you take the easy route and use dd to make a large empty file e.g.

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

then boot qemu with the linux iso you downloaded and also tell it to use this disk (-hda) and let the installer set the disk up for you

If making a bootable disk by hand, I've done this a couple of times - not easy, but the following steps may help you. You need to format the disk, create partitions, install grub and then boot

Personally I would take the easy route and install to disk via linux installer

#!/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 \
Goblinhack
  • 2,859
  • 1
  • 26
  • 26