How to install and configure a QEMU aarch64-linux installation.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Last updated 30 April 2015

This gives a fairly usable, and not entirely slow, arm64-linux
install.  It has the advantage that the idle loop works right and so
when the guest becomes idle, qemu uses only very little host cpu, so
you can leave the guest idling for long periods without bad
performance effects on the host.

More or less following
https://gmplib.org/~tege/qemu.html, section 14 (for arm64)

Build qemu-2.2.1 with --target-list including aarch64-softmmu

mkdir Arm64-2
cd Arm64-2

wget http://d-i.debian.org/daily-images/arm64/daily/netboot/debian-installer/arm64/linux

wget http://d-i.debian.org/daily-images/arm64/daily/netboot/debian-installer/arm64/initrd.gz

# Note.  6G is easily enough to install debian and do a build of Valgrind.
# If you envisage needing more space, now is the time to choose a larger
# number.

/path/to/Qemu221/bin/qemu-img create disk6G.img 6G

/path/to/Qemu221/bin/qemu-system-aarch64 \
  -M virt -cpu cortex-a57 -m 256             \ 
  -drive file=disk6G.img,if=none,id=blk -device virtio-blk-device,drive=blk \
  -net user,hostfwd=tcp::5555-:22 -device virtio-net-device,vlan=0 \
  -kernel linux                                                 \
  -initrd initrd.gz                                             \
  -append "console=ttyAMA0 --"                                  \
  -nographic

Do an install, be as vanilla as possible, allow it to create a user
"username", and do not ask it to install any extra software.  But,
when you get to here

  ┌───────────────────┤ [!!] Finish the installation ├────────────────────┐
  │                                                                       │
 ┌│                         Installation complete                         │
 ││ Installation is complete, so it is time to boot into your new system. │
 ││ Make sure to remove the installation media (CD-ROM, floppies), so     │
 ││ that you boot into the new system rather than restarting the          │
 ││ installation.                                                         │
 ││                                                                       │
 └│     <Go Back>                                          <Continue>     │
  │                                                                       │
  └───────────────────────────────────────────────────────────────────────┘

do "Go Back"
then in the next menu "Execute a shell", "Continue"

This gives you a root shell in the new VM.  In that shell:

  mount -t proc proc /target/proc
  mount --rbind /sys /target/sys
  mount --rbind /dev /target/dev
  chroot /target bash
  /etc/init.d/ssh start
  mv /boot/initrd.img-3.16.0-4-arm64 /boot/initrd.img-3.16.0-4-arm64.old
  echo virtio-mmio >>/etc/initramfs-tools/modules
  /usr/sbin/update-initramfs -c -k 3.16.0-4-arm64

Then on the host, copy out the files that the above created.

cd Arm64-2
ssh -p 5555 username@localhost \
   "tar -c -f - --exclude=lost+found /boot" | tar xf -

Now back in the VM, we can finish the installation.

  exit
  exit
  Select "Finish the installation"
  Continue

When it reboots, kill qemu from another shell, else it will try to reinstall.

Now start the installation:

/path/to/Qemu221/bin/qemu-system-aarch64 -M virt \
  -cpu cortex-a57 -m 1024 -drive file=disk6G.img,if=none,id=blk \
  -device virtio-blk-device,drive=blk -net user,hostfwd=tcp::5555-:22 \
  -device virtio-net-device,vlan=0 -kernel boot/vmlinuz-3.16.0-4-arm64 \
  -initrd boot/initrd.img-3.16.0-4-arm64 \
  -append "root=/dev/vda2 rw console=ttyAMA0 --" -nographic

Now you can ssh into the VM and install stuff as usual:

ssh -XC -p 5555 username@localhost

  (on the guest)
  become root
  apt-get install make gcc g++ automake autoconf emacs subversion gdb

Hack on, etc.