Although changing the OS on a Raspberry Pi is quick and easy (especially if you have a spare SD card), there are times when you might want to test a system first, or simply tinker without needing a spare Pi.
This documentation details how to use Qemu to run a RaspberryPi image.
Make sure the qemu-arm support is installed (On Ubuntu the package will be called either qemu-system or qemu-kvm-extras). To find out, run the following
qemu-system-arm -cpu | grep 1176
qemu-system-arm -cpu | grep 1136
You should see the arm1176 CPU, if it's not available you can also use arm1136-r2. If neither are available, check that you have the relevant packages installed
Creating a Disk Image
Assuming you've already loaded the image onto an SD card, you'll want to make a copy (you can run direct from the SD Card but it tends to be slow). If you've simply got an image file, skip this step.
You'll need to know the character device node that the SD card has been assigned to (to find out, run dmesg just after plugging it in). In the examples we'll assume it's /dev/sdb
dd if=/dev/sdb of=disk.img
Grabbing the Kernel
To run well in Qemu, we need to use a slightly amended kernel
Initial (config) boot
For our first boot, we need to make a basic config change to our Pi image, so we're going to jump straight to a shell (replace the cpu with arm1136-r2 if needed)
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 512 -M versatilepb \
-no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" \
Once the system has finished booting, run
Put a # in front of the first line so that it looks like this:
# Save and exit
Boot the System
Now we can boot the system for real
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb \
-no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
Dumping back to an SD Card
If you want to dump the image back to an SD card, make sure QEmu isn't running and then run (make sure you use the correct character device, dd can kill your system!)
dd if=disk.img of=/dev/sdb
Things to Note
The CPU's we're using don't appear to support more than 256mb of RAM, so setting the memory (-m) to 512 won't work.