Install Arch Linux ARM di QEMU
Panduan ini menjalankan Arch Linux ARM (ALARM) sebagai guest di dalam QEMU lewat emulasi penuh (full-system emulation), sehingga bisa dijalankan dari host arsitektur apa pun (x86_64, ARM, dll).
Tersedia 2 metode:
- Metode A — Direct kernel boot (disarankan, paling sederhana). Kernel di-pass langsung lewat argumen QEMU. Tidak butuh firmware UEFI maupun bootloader.
- Metode B — UEFI boot (lebih realistis & mandiri). VM boot sendiri seperti mesin asli. Lebih banyak langkah.
Mulai dari Metode A. Pindah ke Metode B kalau sudah nyaman.
Prasyarat
Kebutuhan di host:
- RAM cukup (alokasikan ≥ 2–4 GB untuk VM)
- Disk kosong ± 20 GB
- Akses
sudo - Emulasi murni (TCG) itu lambat di host non-ARM — ini normal. Di host Apple Silicon bisa pakai akselerasi HVF (lihat catatan di bagian boot).
Install paket QEMU
Arch / Manjaro:
sudo pacman -S --needed qemu-base qemu-system-aarch64 libarchive
# untuk Metode B (UEFI), tambahkan firmware:
sudo pacman -S edk2-aarch64
Debian / Ubuntu:
sudo apt update
sudo apt install qemu-system-arm qemu-utils libarchive-tools
# untuk Metode B (UEFI):
sudo apt install qemu-efi-aarch64
Fedora:
sudo dnf install qemu-system-aarch64 qemu-img libarchive
# untuk Metode B (UEFI):
sudo dnf install edk2-aarch64
Tip: libarchive / libarchive-tools dibutuhkan untuk perintah bsdtar. Tarball ALARM wajib diekstrak pakai bsdtar, bukan tar GNU biasa, supaya permission & atribut file terjaga.
Metode A — Direct Kernel Boot (disarankan)
Langkah 1: Download rootfs tarball
wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
Tip: Kecepatan dari Indonesia: mirror Jepang/Taiwan biasanya lebih cepat, mis. http://jp.mirror.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz atau http://tw2.mirror.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz.
Langkah 2: Buat disk image
qemu-img create -f qcow2 alarm.qcow2 16G
(16G = batas maksimum; file qcow2 tumbuh sesuai pemakaian, tidak langsung memakan 16 GB.)
Langkah 3: Siapkan partisi via qemu-nbd
Sambungkan image qcow2 sebagai network block device agar bisa dipartisi dari host:
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 alarm.qcow2
Buat satu partisi root ext4 (cukup untuk Metode A):
sudo parted -s /dev/nbd0 mklabel gpt
sudo parted -s /dev/nbd0 mkpart primary ext4 1MiB 100%
sudo mkfs.ext4 /dev/nbd0p1
Langkah 4: Mount & ekstrak rootfs
sudo mount /dev/nbd0p1 /mnt
sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt
sudo sync
Cek isi /boot — pastikan ada kernel & initramfs:
ls -lh /mnt/boot
Harus muncul Image dan initramfs-linux-fallback.img (juga initramfs-linux.img). Kalau initramfs tidak ada, gunakan Metode B yang me-regenerate-nya saat boot pertama.
Langkah 5: Salin kernel + initramfs ke host
Metode A mem-boot kernel dari sisi host, jadi salin keluar:
sudo cp /mnt/boot/Image ./Image
sudo cp /mnt/boot/initramfs-linux-fallback.img ./initramfs.img
sudo chown $USER:$USER Image initramfs.img
Langkah 6: (Opsional) atur fstab
echo '/dev/vda1 / ext4 defaults 0 1' | sudo tee /mnt/etc/fstab
Langkah 7: Lepas mount & putuskan nbd
sudo umount /mnt
sudo qemu-nbd --disconnect /dev/nbd0
sudo rmmod nbd # opsional
Langkah 8: Jalankan VM
qemu-system-aarch64 \
-M virt \
-cpu cortex-a72 \
-smp 4 \
-m 4G \
-kernel Image \
-initrd initramfs.img \
-append "root=/dev/vda1 rw console=ttyAMA0" \
-drive if=virtio,file=alarm.qcow2,format=qcow2 \
-nic user,model=virtio-net-pci,hostfwd=tcp::2222-:22 \
-nographic
Penjelasan opsi:
| Opsi | Arti |
|---|---|
-M virt |
Mesin virtual ARM generik standar QEMU |
-cpu cortex-a72 |
CPU yang diemulasi (alternatif: -cpu max)
|
-smp 4 / -m 4G |
4 vCPU, RAM 4 GB |
-kernel / -initrd / -append |
Boot kernel langsung + argumen kernel |
-drive if=virtio,... |
Disk muncul sebagai /dev/vda di dalam VM
|
-nic user,...,hostfwd=tcp::2222-:22 |
Jaringan user-mode + forward port host 2222 → guest 22 (SSH) |
-nographic |
Output serial langsung ke terminal |
Tip: Keluar dari -nographic: tekan Template:Ic lalu Template:Ic.
Apple Silicon (host ARM): tambahkan -accel hvf -cpu host untuk kecepatan jauh lebih tinggi (ganti -cpu cortex-a72).
Catatan Metode A: karena kernel berada di host, kalau nanti update kernel di dalam VM (
pacman -Syu), salin ulang Image & initramfs yang baru dari /boot, atau pindah ke Metode B agar update kernel otomatis ke-boot.Login pertama & konfigurasi awal
Akun default Arch Linux ARM:
| User | Password |
|---|---|
alarm |
alarm
|
root |
root
|
Login sebagai root untuk setup.
Inisialisasi keyring pacman (WAJIB sebelum update)
pacman-key --init
pacman-key --populate archlinuxarm
Update sistem
pacman -Syu
Konfigurasi dasar
# Ganti password root
passwd
# Zona waktu (Bandung = WIB)
ln -sf /usr/share/zoneinfo/Asia/Jakarta /etc/localtime
hwclock --systohc
# Locale
sed -i 's/#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen
sed -i 's/#id_ID.UTF-8/id_ID.UTF-8/' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
# Hostname
echo 'archarm' > /etc/hostname
# Buat user baru + sudo
pacman -S --needed sudo
useradd -m -G wheel namauser
passwd namauser
EDITOR=nano visudo # hapus tanda # pada baris: %wheel ALL=(ALL:ALL) ALL
SSH dari host
ALARM sudah menyertakan sshd. Dari terminal host:
ssh -p 2222 alarm@localhost
(Kalau koneksi ditolak: di dalam VM jalankan systemctl enable --now sshd.)
Selesai — sistem Arch Linux ARM siap dipakai.
Metode B — UEFI Boot (mandiri, lebih realistis)
Di sini VM boot sendiri lewat firmware UEFI (edk2), tanpa perlu pass kernel dari host. Update kernel di dalam VM otomatis ke-boot. Pendekatan paling andal di QEMU adalah lewat startup.nsh di EFI System Partition (ESP).
Ulangi Langkah 1–3 dari Metode A (download tarball, buat qcow2, modprobe + connect nbd), lalu lanjut:
B1. Partisi: ESP + root
sudo parted -s /dev/nbd0 mklabel gpt
sudo parted -s /dev/nbd0 mkpart ESP fat32 1MiB 513MiB
sudo parted -s /dev/nbd0 set 1 esp on
sudo parted -s /dev/nbd0 mkpart primary ext4 513MiB 100%
sudo mkfs.fat -F32 /dev/nbd0p1
sudo mkfs.ext4 /dev/nbd0p2
B2. Mount & ekstrak
sudo mount /dev/nbd0p2 /mnt
sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt
sudo mkdir -p /mnt/boot/efi
sudo mount /dev/nbd0p1 /mnt/boot/efi
B3. Siapkan kernel + startup.nsh di ESP
# Ambil PARTUUID partisi root
ROOT_PARTUUID=$(sudo blkid -s PARTUUID -o value /dev/nbd0p2)
echo "Root PARTUUID = $ROOT_PARTUUID"
# Salin kernel + initramfs ke ESP
sudo cp /mnt/boot/Image /mnt/boot/efi/
sudo cp /mnt/boot/initramfs-linux-fallback.img /mnt/boot/efi/
# Buat startup.nsh (UEFI Shell otomatis menjalankannya)
printf 'Image initrd=initramfs-linux-fallback.img root=PARTUUID=%s rw console=ttyAMA0\n' "$ROOT_PARTUUID" \
| sudo tee /mnt/boot/efi/startup.nsh
B4. fstab
ESP_UUID=$(sudo blkid -s UUID -o value /dev/nbd0p1)
sudo tee /mnt/etc/fstab >/dev/null <<EOF
PARTUUID=$ROOT_PARTUUID / ext4 defaults 0 1
UUID=$ESP_UUID /boot/efi vfat defaults 0 2
EOF
B5. Lepas mount & putuskan nbd
sudo umount /mnt/boot/efi
sudo umount /mnt
sudo qemu-nbd --disconnect /dev/nbd0
B6. Siapkan firmware UEFI
Variabel NVRAM perlu file yang bisa ditulis — salin templatenya:
# Arch (edk2-aarch64):
cp /usr/share/edk2/aarch64/QEMU_VARS.fd ./QEMU_VARS.fd
CODE=/usr/share/edk2/aarch64/QEMU_CODE.fd
# Debian/Ubuntu (qemu-efi-aarch64) — pakai ini sebagai gantinya:
# cp /usr/share/AAVMF/AAVMF_VARS.fd ./QEMU_VARS.fd
# CODE=/usr/share/AAVMF/AAVMF_CODE.fd
B7. Jalankan VM (UEFI)
qemu-system-aarch64 \
-M virt \
-cpu cortex-a72 \
-smp 4 \
-m 4G \
-drive if=pflash,format=raw,readonly=on,file="$CODE" \
-drive if=pflash,format=raw,file=QEMU_VARS.fd \
-drive if=virtio,file=alarm.qcow2,format=qcow2 \
-nic user,model=virtio-net-pci,hostfwd=tcp::2222-:22 \
-nographic
Firmware akan gagal menemukan bootloader standar, jatuh ke UEFI Shell, lalu menjalankan startup.nsh yang mem-boot kernel. Setelah masuk, lanjutkan dari bagian Login pertama & konfigurasi awal.
Tip: Setelah update kernel di dalam VM, salin ulang kernel/initramfs ke ESP, atau (lebih baik) install bootloader sungguhan seperti systemd-boot/grub dari dalam VM agar tidak perlu startup.nsh.
Troubleshooting
- Kernel panic "Unable to mount root fs" / "VFS
- Cannot open root device"
- Disk tidak terbaca. Pastikan pakai
initramfs-linux-fallback.img(bukan yang biasa), danroot=/dev/vda1cocok dengan layout disk (/dev/vda= drive virtio pertama).
- Layar diam / tidak ada output
- Pastikan ada
console=ttyAMA0di-appenddan pakai-nographic. Untuk Metode B, console diatur distartup.nsh.
bsdtar: command not found- Install
libarchive(Arch/Fedora) ataulibarchive-tools(Debian/Ubuntu).
Could not access KVM kernel module/ sangat lambat- Normal di host non-ARM: kamu memang sedang mengemulasi ARM (TCG), bukan virtualisasi. Tidak ada KVM. Untuk percepatan, jalankan di host ARM (Apple Silicon:
-accel hvf -cpu host).
/dev/nbd0sibuk / tidak bisa connectsudo qemu-nbd --disconnect /dev/nbd0 sudo rmmod nbd && sudo modprobe nbd max_part=8
- Permission saat ekstrak
- Selalu pakai
sudo bsdtar -xpf ...(flag-pmempertahankan permission).
Tips lanjutan
- GUI/desktop: ganti
-nographicdengan-device virtio-gpu-pci -display gtk(atau-display sdl), lalu install desktop di dalam VM (mis.pacman -S xfce4). Emulasi grafis terasa berat. - Folder bersama host↔guest: paling praktis lewat SSH/
scpke port 2222, atau pakaivirtfs/9p. - Perbesar disk nanti:
qemu-img resize alarm.qcow2 +10G, lalu perluas partisi dari dalam VM. - Snapshot:
qemu-img snapshot -c nama alarm.qcow2(buat),-a nama(kembalikan),-l(daftar). - Bikin skrip launcher: simpan perintah
qemu-system-aarch64 ...di file.shagar tidak ketik ulang.