From 978e2f10eef8225dc656efef7226508f53e003df Mon Sep 17 00:00:00 2001 From: Pim Kunis Date: Wed, 31 May 2023 15:02:58 +0200 Subject: [PATCH] add blog post about virtio 9p --- README.md | 5 ++ jekyll/README.md | 1 + .../2023-05-31-virtio-9p-experiences.md | 61 ++++++++++++++++++ .../virtio-9p-experiences/virt-manager.png | Bin 0 -> 15884 bytes 4 files changed, 67 insertions(+) create mode 100644 jekyll/README.md create mode 100644 jekyll/_posts/virtio-9p-experiences/2023-05-31-virtio-9p-experiences.md create mode 100644 jekyll/_posts/virtio-9p-experiences/virt-manager.png diff --git a/README.md b/README.md index 28b697d..b795f7a 100644 --- a/README.md +++ b/README.md @@ -1 +1,6 @@ +# static + +My static website written in Jekyll. +Deployment through Concourse. + `fly -t home set-pipeline --load-vars-from=secrets.yml -p static -c pipeline.yml` diff --git a/jekyll/README.md b/jekyll/README.md new file mode 100644 index 0000000..2cf4324 --- /dev/null +++ b/jekyll/README.md @@ -0,0 +1 @@ +`jekyll serve` diff --git a/jekyll/_posts/virtio-9p-experiences/2023-05-31-virtio-9p-experiences.md b/jekyll/_posts/virtio-9p-experiences/2023-05-31-virtio-9p-experiences.md new file mode 100644 index 0000000..89f564c --- /dev/null +++ b/jekyll/_posts/virtio-9p-experiences/2023-05-31-virtio-9p-experiences.md @@ -0,0 +1,61 @@ +--- +layout: post +title: My Experiences with virtio-9p +date: 2023-05-31 14:18:00 Europe/Amsterdam +categories: libvirt virtio 9p +--- + +When I was scaling up my home lab, I started thinking more about data management. +I hadn't (and still haven't) set up any form of network storage. +I have, however, set up a backup mechanism using [Borg](https://borgbackup.readthedocs.io/en/stable/). +Still, I want to operate lots of virtual machines, and backing up each one of them separately seemed excessive. +So I started thinking, what if I just let the host machines back up the data? +After all, the amount of physical hosts I have in my home lab is unlikely to increase drastically. + +# The Use Case for Sharing Directories + +I started working out this idea further. +Without network storage, I needed a way for guest VMs to access the host's disks. +Here there are two possibilities, either expose some block device or a file system. +Creating a whole virtual disk for just the data of some VMs seemed wasteful, and from my experiences also increases backup times dramatically. +I therefore searched for a way to mount a directory from the host OS on the guest VM. +This is when I stumbled upon [this blog](https://rabexc.org/posts/p9-setup-in-libvirt) post talking about sharing directories with virtual machines. + +# Sharing Directories with virtio-9p + +virtio-9p is a way to map a directory on the host OS to a special device on the virtual machine. +In `virt-manager`, it looks like the following: +![picture showing virt-manager configuration to map a directory to a VM](virt-manager.png) +Under the hood, virtio-9p uses the 9pnet protocol. +Originally developed at Bell Labs, support for this is available in all modern Linux kernels. +If you share a directory with a VM, you can then mount it. +Below is an extract of my `/etc/fstab` to automatically mount the directory: +``` +data /mnt/data 9p trans=virtio,rw 0 0 +``` + +The first argument (`data`) refers to the name you gave this share from the host +With the `trans` option we specify that this is a virtio share. + +# Problems with virtio-9p + +At first I had no problems with my setup, but I am now contemplating just moving to a network storage based setup because of two problems. + +The first problem is that some files have suddenly changed ownership from `libvirt-qemu` to `root`. +If the file is owned by `root`, the guest OS can still see it, but cannot access it. +I am not entirely sure the problem lies with virtio, but I suspect it is. +For anyone experiencing this problem, I wrote a small shell script to revert ownership to the `libvirt-qemu` user: +```shell +find -printf "%h/%f %u\n" | grep root | cut -d ' ' -f1 | xargs chown libvirt-qemu:libvirt-qemu +``` + +Another problem that I have experienced, is guests being unable to mount the directory at all. +I have only experienced this problem once, but it was highly annoying. +To fix it, I had to reboot the whole physical machine. + +# Alternatives + +virtio-9p seemed like a good idea, but as discussed, I had some problems with it. +It seems [virtioFS](https://virtio-fs.gitlab.io/) might be a an interesting alternative as it is designed specifically for sharing directories with VMs. + +As for me, I will probably finally look into deploying network storage either with NFS or SSHFS. diff --git a/jekyll/_posts/virtio-9p-experiences/virt-manager.png b/jekyll/_posts/virtio-9p-experiences/virt-manager.png new file mode 100644 index 0000000000000000000000000000000000000000..8567efbbd91929cfcb94648b49bb20361003995c GIT binary patch literal 15884 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

Lx@I_ z2aL@|GRV*Zff57@1M`N8>Mv7+g+;IN?Nd2LoRmGG88aSmw#-!NgR%0dB{?_%q*K3Y zL3x@XF3JZFeNgWJ!*1;D{Qwq~m8GTaa_ehAC_S}lwt2cZI5=o&&5sH_^MjKBq}s8h z+ZRowNk82ahDjpe`34Ko@8(a)@N-th+TPxLm43%-HdA}yOJ@r)m`JOzFk0y9lcZ-d0E%I4QA6?C0 zpRpS=8hy6ipxPc8=<#64J)NJ$=qq`guF4ye-zu#7wzc{_aV#|^qXiqmklQY|x9#7P zoMmsTtE*4V%*gKV*%Ka*<-F@?_rYb*KixUa3s>K4v|ULPaH|wken)EfI6cWjqo0sT z>-DV1#Brp@QN(OTR~CA5;sf_PI3x(gG>YGIt!J=6_QA*JFV6TEtUxv!TeY$Vk3Ak8 z3yp`c)VG?XnF^ipxr&Lp)Y{-EM6a722PQkaz_C5-A>E9O!qGHLe)pYb`EjQx_ zN3-K*ctAja_nz}cKSrF?#@5zP!)g%jeo-^CZGdJa#Ki%RNC}c=NXU@7qO|nD;2;3Q zXV=&2A1Xv}!^^ydfBZ|@p)&{xm(y-JBP&axXabx;MOpc0G?A==DS@-w$!h1Q;JtN! zEEy1q8tqn45fCiKp5iDZK?Ab5v;^e4R5?>EEqu*(Kv9N=BT^*{7*=Cl3+H*27u

!!QJjX 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 N(&7qYm7*X0{~uTK%MAbk literal 0 HcmV?d00001