i Emulate Raspberry Pi on QEMU – All things in moderation

Emulate Raspberry Pi on QEMU

Today, I will present how to install the Raspbian Linux distribution for Raspberry Pi on QEMU.


First, get the Ubuntu image and run it in a VM:

For the  QEMU emulation you will need the following:

Install the Raspbian:

Inside yout Ubuntu VM, create a new folder:

$ mkdir ~/qemu_vms

Download and place the Raspbian image to ~/qemu_vms/

Download and place the qemu-kernel to ~/qemu_vms/

$ sudoapt-get install qemu-system
$ unzip <image-file>.zip
$ fdisk -l <image-file>

You should see something like this:

You see that filesystem (.img2) starts at sector 92160. Now take that value and multiply it by 512, in this case it’s 512 * 92160 = 47185920 bytes. Use this value as an offset in the following command:

$ sudo mkdir /mnt/raspbian
$ sudo mount -v -o offset=47185920 -t ext4 ~/qemu_vms/<your-img-file.img> /mnt/raspbian
$ sudo nano /mnt/raspbian/etc/ld.so.preload

Comment out every entry in that file with ‘#’, save and exit with Ctrl-x>> Y.

$ sudo nano /mnt/raspbian/etc/fstab

If you see anything with mmcblk0 in fstab, then:

  • Replace the first entry containing /dev/mmcblk0p1 with /dev/sda1
  • Replace the second entry containing /dev/mmcblk0p2 with /dev/sda2, save and exit.
$ cd ~
$ sudo umount /mnt/raspbian

Now you can emulate it on Qemu by using the following command:

$ qemu-system-arm -kernel ~/qemu_vms/<your-kernel-qemu> -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda ~/qemu_vms/<your-jessie-image.img> -redir tcp:5022::22 -no-reboot

From the terminal, you need to start the SSH service so that you can access it from your host system (the one from which you launched the qemu).

Turn on SSH:

$ sudo service ssh start

Now you can SSH into it from host system with (default password – raspberry):

$ ssh [email protected] -p 5022

Troubleshooting SSH service:

If SSH doesn’t start in your emulator at startup by default, you can change that inside your Pi terminal with:

$ sudo update-rc.d ssh enable

If your emulated Pi starts the GUI and you want to make it start in console mode at startup, use the following command inside your Pi terminal:

$ sudo raspi-config
/>Select 3 - Boot Options
/>Select B1 - Desktop / CLI
/>Select B2 - Console Autologin

If your mouse doesn’t move in the emulated Pi, click <Windows>, arrow down to Accessories, arrow right, arrow down to Terminal, enter.

Resizing the Raspbian image:

Once you are done with the setup, you are left with a total of 3,9GB on your image, which is full. To enlarge your Raspbian image, follow these steps on your Ubuntu machine:

Create a copy of your existing image:

$ cp <your-raspbian-jessie>.img rasbian.img

Run this command to resize your copy:

$ qemu-img resize raspbian.img +6G

Now start the original raspbian with enlarged image as second hard drive:

$ sudo qemu-system-arm -kernel ~/qemu_vms/<kernel-qemu> -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda ~/qemu_vms/<your-original-raspbian-jessie>.img -redir tcp:5022::22 -no-reboot -hdb raspbian.img

Login and run:

$ sudo cfdisk /dev/sdb

Delete the second partition (sdb2) and create a New partition with all available space. Once new partition is creates, use Write to commit the changes. Then Quit the cfdisk.

Resize and check the old partition and shutdown.

$ sudo resize2fs /dev/sdb2
$ sudo fsck -f /dev/sdb2
$ sudo halt

Now you can start QEMU with your enlarged image:

$ sudo qemu-system-arm -kernel ~/qemu_vms/<kernel-qemu> -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda ~/qemu_vms/raspbian.img -redir tcp:5022::22

Leave a Reply