<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis" -->

---
title: Debian armhf VM on arm64 server | daily.dev
description: A practical walkthrough for running a Debian armhf (32-bit ARM) virtual machine on an arm64 server using QEMU and libvirt. Key challenges covered include the...
canonical: https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Debian armhf VM on arm64 server | daily.dev
og:description: A practical walkthrough for running a Debian armhf (32-bit ARM) virtual machine on an arm64 server using QEMU and libvirt. Key challenges covered include the...
og:url: https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis
og:image: https://api.daily.dev/og/posts/jR0iorgIs.png
og:image:alt: Debian armhf VM on arm64 server
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Debian armhf VM on arm64 server

**[Collabora Blog](https://daily.dev/sources/collabora)** · 6 min read · 0 upvotes · 0 comments

## Summary

A practical walkthrough for running a Debian armhf (32-bit ARM) virtual machine on an arm64 server using QEMU and libvirt. Key challenges covered include the absence of a standard bootloader for QEMU's 'virt' machine, missing generic PCI host controller support in the Debian Stretch armhf kernel, and managing direct kernel booting. The solution uses QEMU's 9pfs to share the guest's /boot directory with the host, a libvirt qemu hook script to resolve symlinks before VM startup, and configuring libvirt to stop rather than reboot the VM on kernel upgrades to ensure the latest kernel is always loaded.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server>

## Questions this post answers

### How do I run a 32-bit armhf VM on a 64-bit arm64 server using QEMU and libvirt without a standard bootloader?

Direct kernel booting is required because no standard bootloader or boot firmware is available in Debian for QEMU's 'virt' machine. The guest's /boot is shared with the host via QEMU's 9pfs (using 'mapped' security mode), and a libvirt qemu hook script at /etc/libvirt/hooks/qemu resolves symlinks before VM start. This lets the host always boot the latest kernel installed by the guest via apt without manually copying kernels.

_Engineers running ARM build infrastructure track solutions like this on daily.dev._

### Why does my Debian Stretch armhf QEMU VM have no storage or network devices?

The Debian Stretch armhf kernel lacks built-in support for the generic PCI host controller that QEMU's virtual machine exposes. Without it, neither storage nor network devices appear in the guest. A custom kernel package built with the patch from Debian bug 864726 is required as a workaround until an official Stretch kernel update includes the fix.

_Developers working around ARM kernel gaps find relevant patches and discussions on daily.dev._

### How do I make a libvirt VM automatically use the latest kernel after a guest kernel upgrade without copying files to the host?

Mount the guest's /boot on a 9pfs share from the host using the fstab entry 'virtio-boot /boot 9p trans=virtio,version=9p2000.L,x-systemd.automount 0 0'. Then use a libvirt qemu hook script (/etc/libvirt/hooks/qemu) to create proper symlinks on the host before VM start, since 9p mapped mode stores symlinks as plain files. Point the libvirt domain definition at those symlinks for kernel and initramfs.

_Teams managing ARM VM fleets share operational patterns like this on daily.dev._

## Similar posts on daily.dev

- [On Ditching Vagrant](https://daily.dev/posts/on-ditching-vagrant-j0ekatxsa) · Lobsters · 1 upvotes · 0 comments
- [QEMU 11.0 Could Finish Removing 32-bit Host CPU Support](https://daily.dev/posts/qemu-11-0-could-finish-removing-32-bit-host-cpu-support-50ypqvtfe) · Phoronix · 0 upvotes · 0 comments
- [Making a micro Linux distro](https://daily.dev/posts/making-a-micro-linux-distro-opv8lmaob) · Hacker News · 21 upvotes · 3 comments

---

Tags: [#linux](https://daily.dev/tags/linux), [#infrastructure](https://daily.dev/tags/infrastructure), [#arm](https://daily.dev/tags/arm)

[View this post on daily.dev](https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Debian armhf VM on arm64 server","url":"https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis"},"datePublished":"2026-08-11T08:56:22.599Z","dateModified":"2026-08-11T09:29:27.802Z","description":"A practical walkthrough for running a Debian armhf (32-bit ARM) virtual machine on an arm64 server using QEMU and libvirt. Key challenges covered include the...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/92ab898f05dafadca1cd1cc44e2ae1bb?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/92ab898f05dafadca1cd1cc44e2ae1bb?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Collabora Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Collabora Blog","logo":"https://media.daily.dev/image/upload/s--ZGZ0FjqS--/f_auto,q_auto/v1786438306/logos/collabora?_a=BAMAMicg0","url":"https://daily.dev/sources/collabora"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"linux,infrastructure,arm","timeRequired":"PT6M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Collabora Blog","item":"https://daily.dev/sources/collabora"},{"@type":"ListItem","position":3,"name":"Debian armhf VM on arm64 server"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/debian-armhf-vm-on-arm64-server-jr0iorgis#faq","mainEntity":[{"@type":"Question","name":"How do I run a 32-bit armhf VM on a 64-bit arm64 server using QEMU and libvirt without a standard bootloader?","acceptedAnswer":{"@type":"Answer","text":"Direct kernel booting is required because no standard bootloader or boot firmware is available in Debian for QEMU's 'virt' machine. The guest's /boot is shared with the host via QEMU's 9pfs (using 'mapped' security mode), and a libvirt qemu hook script at /etc/libvirt/hooks/qemu resolves symlinks before VM start. This lets the host always boot the latest kernel installed by the guest via apt without manually copying kernels. Engineers running ARM build infrastructure track solutions like this on daily.dev."}},{"@type":"Question","name":"Why does my Debian Stretch armhf QEMU VM have no storage or network devices?","acceptedAnswer":{"@type":"Answer","text":"The Debian Stretch armhf kernel lacks built-in support for the generic PCI host controller that QEMU's virtual machine exposes. Without it, neither storage nor network devices appear in the guest. A custom kernel package built with the patch from Debian bug 864726 is required as a workaround until an official Stretch kernel update includes the fix. Developers working around ARM kernel gaps find relevant patches and discussions on daily.dev."}},{"@type":"Question","name":"How do I make a libvirt VM automatically use the latest kernel after a guest kernel upgrade without copying files to the host?","acceptedAnswer":{"@type":"Answer","text":"Mount the guest's /boot on a 9pfs share from the host using the fstab entry 'virtio-boot /boot 9p trans=virtio,version=9p2000.L,x-systemd.automount 0 0'. Then use a libvirt qemu hook script (/etc/libvirt/hooks/qemu) to create proper symlinks on the host before VM start, since 9p mapped mode stores symlinks as plain files. Point the libvirt domain definition at those symlinks for kernel and initramfs. Teams managing ARM VM fleets share operational patterns like this on daily.dev."}}]}
```

