Install on a QEMU

## Host system

**WARNING! Information in the article may become out of date.**
New QEMU (v > 1.5.x) has completely different console support under Windows.

This article was written with "host-independence" in mind. Any system which can run QEMU may be used as a host: any sort of Linux (Ubuntu, SuSe e.t.c.) and even Windows with Cygwin or MinGW.

CentOS or Scientific Linux are recommended for sources and SRPM compatibility with RedSleeve.

## QEMU

QEMU is a system emulator supporting ARM architecture (among many others). QEMU is widely used as a low-level driver for virtualization platform such as XEN and KVM. To avoid interference with "system" QEMU only minimal ARM version shoul be installed.

Download an QEMU sources from the http://wiki.qemu.org/Download and extract it

```
./configure --target-list="arm-softmmu" --disable-strip --disable-xen \
            --disable-kvm --disable-user --disable-docs

make
make install

```

This will install `/usr/local/bin/qemu-system-arm` and other QEMU tools.

Precompiles Windows binaries (w32 and w64) are available on the http://qemu.weilnetz.de/

Another approach (not discusse in this article) is to *integrate* QEMU/ARM emulator into virtualization infrastructure. See Fedora ARM HowToQemu.

JFYI: QEMU reaches about 1/10 of the host speed, Core2 Duo E7500 @2.93GHz provides ~400MHz ARM926EJ-S CPU.

## Target platform

QEMU ARM emulates a wide list of ARM machines and CPUs, including devboard, PDAs and others.

```
/usr/local/bin/qemu-system-arm -M ?
Supported machines are:
z2                   Zipit Z2 (PXA27x)
xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
vexpress-a9          ARM Versatile Express for Cortex-A9
vexpress-a15         ARM Versatile Express for Cortex-A15
versatilepb          ARM Versatile/PB (ARM926EJ-S)
versatileab          ARM Versatile/AB (ARM926EJ-S)
...
...

```

One popular platform is an ARM Versatile Platform Baseboard with ARM926EJ-S CPU. It provides rich set of periprerals includiing AMBA Bus and AHB controllers includind PL031 realtime clock, PL011 UART (`/dev/ttyAMA0`) e.t.c. QEMU emulates most of VersatilePB devices including SYM895a SCSI adapter in the PCI slot, Versatile CLDC VGA-like framebuffer and SMC91C11 ethernet.

## Linux on QEMU

Aurelien Jarno kindly provides a precompiled kernels, initrd and disk images for the Debian on the Versatile PB :

http://people.debian.org/~aurel32/qemu/armel/

This distributive is used as "bootstrap" starting point to create a RS root filesystem on a QEMU disk. Grab these files:

* vmlinuz-2.6.32-5-versatile
* initrd.img-2.6.32-5-versatile
* debian\_squeeze\_armel\_standard.qcow2

### Preparing a RS disk image

Crate a new empty disk image:

```
qemu-img create -f qcow2 redsleeve_armel_rootfs.qcow2 16G

```

Download a big RS rootfs archive and store it into a new folder (rs/).

Create a CD-ROM ISO image containing this rootfs file:

```
mkisofs -J -R -o rsel6-rootfs.iso rs/

```

Start a QEMU with Aurelien's kernel and **three** images:

* Debian rootfs as `/dev/sda`
* New empty disk as `/dev/sdb`
* CD-ROM containing rootfs archive as `/dev/cdrom`

```
qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile \
                -hda debian\_squeeze\_armel\_standard.qcow2 \
                -hdb redsleeve\_armel\_rootfs.qcow2 \
                -cdrom rsel6-rootfs.iso \
                -nographic -append "root=/dev/sda1 console=ttyAMA0"

```

The login/password is root/root. You have working ARM Debian Linux now.

Make partitions on the new disk:

```
fdisk -H 255 -S 63 /dev/sdb
...
Command (m for help): p

Disk /dev/sdb: 17.2 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x484c09cc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        2027    16281846   83  Linux
/dev/sdb2            2028        2088      489982+  82  Linux swap / Solaris

```

Format a new disk:

```
mkfs.ext3 /dev/sdb1
mkswap /dev/sdb2

```

Mount CD-ROM and new disk

```
mkdir /mnt/cdrom
mkdir /mnt/disk
mount /dev/cdrom /mnt/cdrom
mount /dev/sdb1 /mnt/disk

```

Extract rootfs onto the new disk

```
cd /mnt/disk/
tar --strip-components 1 -xJf /mnt/cdrom/rsel6-rootfs-big.tar.xz
cd /
umount /mnt/disk

```

Exit from QEMU with `CTRL-a x`

### Booting and configuring RS

Boot a RS with bash as an init

```
qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile \
               -hda redsleeve\_armel\_rootfs.qcow2 -nographic \
               -append "root=/dev/sda1 console=ttyAMA0 init=/bin/bash"

```

Remount root as read/write

```
mount -o rw,remount /

```

Edit `/etc/fstab`

```
vim /etc/fstab

```

```
/dev/sda1       /               ext3    defaults                1 1
/dev/sda2       swap            swap    defaults                0 0

```

Disable unneeded daemons:

```
ntsysv

```

Remove all mmc stuff from the rc.local

```
vim /etc/rc.d/rc.local

```

In RHEL6, init from the sysvinit package has been replaced with Upstart, an event-based init system.

```
rm /etc/init/kexec-disable.conf
mv /etc/init/serial.conf /root

```

Create a new config file to run getty on the `/dev/ttyAMA0`

```
vim /etc/init/ttyAMA.conf

```

```
#
start on stopped rc RUNLEVEL=[2345]
stop on starting runlevel [016]

respawn

pre-start exec /sbin/securetty ttyAMA0
exec /sbin/agetty -L /dev/ttyAMA0 9600 vt102

```

(\*)The `/etc/init/start-ttys.conf` and `/etc/init/tty.conf` files are for the framebuffer console.

Run QEMU with fresh new RedSleeve system

```
qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile \
                -hda redsleeve_armel_rootfs.qcow2 -nographic \
                -append "root=/dev/sda1 console=ttyAMA0"

```

Login/password is root/password

### Networking

Firts of all, extract kernel modules from the Debian image. Run QEMU with second drive:

```
 qemu-system-arm ... -hdb debian_squeeze_armel_standard.qcow2 ..

```

```
mkdir /mnt/disk
mount /dev/sdb1 /mnt/disk
cp -R /mnt/disk/lib/modules/2.6.32-5-versatile /lib/modules/2.6.32-5-versatile

```

Load an ethernet driver

```
modprobe smc91x

```

Create `/etc/sysconfig/network-scripts/ifcfg-eth0`

```
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=52:54:00:12:34:56
ONBOOT=yes
TYPE=ethernet
USERCTL=no
PEERDNS=no

```

Disable IPV6 in the `/etc/sysctl.conf`

```
net.ipv6.conf.all.disable_ipv6 = 1

```

Restart network subsystem

```
/etc/rc.d/init.d/network restart

```

By default QEMU emulates network in "user" mode acting as NAT/Firewall with DHCP, DNS and SMB servers

Setup a DNS server `/etc/resolv.conf`

```
nameserver 10.0.2.3

```

To configure QEMU firewall to redirect incoming connection to the RS add :

```
qemu-system-arm ... -redir tcp:50022::22 -redir tcp:50080::80 ...

```

More information:

http://wiki.qemu.org/Documentation/Networking

http://en.wikibooks.org/wiki/QEMU/Networking

http://people.gnome.org/~markmc/qemu-networking.html

### Graphics

QEMU for VersatileBP also emulates framebuffer and input devices. The Keyboard and Mouse Interfaces (KMI) are implemented with two PrimeCells PL050 incorporated into the system controller FPGA. The framebuffer Color LCD Controller (CLCD) is implemented with PrimeCell PL110.

```
CLCD: Versatile hardware, VGA display
Console: switching to colour frame buffer device 80x30
mice: PS/2 mouse device common for all mice
input: AT Raw Set 2 keyboard as /devices/fpga:06/serio0/input/input0
input: ImExPS/2 Generic Explorer Mouse as /devices/fpga:07/serio1/input/input1

```

Linux supports CLCDC as standatd Linux framebuffer. Run RS with framebuffer console (delete `-nographic` and `console=ttyAMA0`):

```
qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile \
                -hda redsleeve_armel_rootfs.qcow2 \
                -serial stdio \
                -vnc 0.0.0.0:0 -append "root=/dev/sda1"

```

QEMU opens VNC on the 127.0.0.1 by default, `-vnc 0.0.0.0:0` enables incoming connections for all interfeces. Then, *quicky* connect to your QEMU with VNC client, screen :0 (open port 5900 on the firewall). Use `ALT+F2` `ALT+Fx` to switch between framebuffer screens. The `-serial stdio` enables `/dev/ttyAMA0` and getty on the QEMU stdio (Linux only, see a `-serial` QEMU option).

Another option is to use SDL.

(\*) This disables QEMU monitor interface and `CTRL+A x` does not work anymore. Use `killall qemu-system-arm` or configure a `-monitor` QEMU option.

X.Org Server also supports Linux framebuffer as fbdev device.

RedSleeve "big" rootfs has X-Server and KDE preconfigured for the FBdev. Just run X session :

```
startx

```

### USB

To add an USB controller :

```
qemu-system-arm -M versatilepb ... -usb ...

```

This optin will attach an USB controller to the VersatilePB PCI bus

```
lspci
00:0c.0 USB Controller: Apple Computer Inc. KeyLargo/Intrepid USB
...
lsusb
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
...

```

To add an USB tablet (useful for QEMU VNC mouse pointer sychronization )

```
qemu-system-arm -M versatilepb ... -usb -usbdevice wacom-tablet -show-cursor ...

```