O virtfs / 9p pode ser usado como sistema de arquivos raiz?

11

É possível usar uma pasta compartilhada do host para o convidado via virtfs / 9p como o sistema de arquivos raiz dentro do convidado?

Relacionado com a minha pergunta anterior: o virtfs / 9p pode ser usado para compartilhar a mesma pasta host com vários convidados?

0xC0000022L
fonte
Eu nunca tentei 9p como root FS, mas acho que com o initrd adequado, não há nada que possa impedi-lo de fazer isso.
Alexander Kudrevatykh
1
jor1k faz isso
Janus Troelsen
O que seria bonito é se pudéssemos usar overlayfs com / e a montagem 9p como baixa, e depois fazer chroot nela. Mas ele não é muito útil, porque as gravações para os mais baixos são indefinidas ... No entanto, existem outros sistemas de arquivos FUSER que permitem isso, mas ainda não o cheguei.
Ciro Santilli # 17/18

Respostas:

8

Sim, veja, por exemplo, como inicializar uma VM com o FS do host:

Adicione os módulos 9p ao host initramfs(essa é a maneira mais fácil, embora não a mais limpa, de ter um initrd com os módulos necessários):

printf '%s\n' 9p 9pnet 9pnet_virtio | sudo tee -a /etc/initramfs-tools/modules
sudo update-initramfs -u

qemu -kernel "/boot/vmlinuz-$(uname -r)" \
  -initrd "/boot/initrd.img-$(uname -r)" \
  -fsdev local,id=r,path=/,security_model=none \
  -device virtio-9p-pci,fsdev=r,mount_tag=r \
  -nographic \
  -append 'root=r ro rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/bin/sh'

Se você executá-lo como um usuário normal, existem arquivos que não poderão ser acessados, mas você deve conseguir o prompt do shell e isso não causará nenhum dano:

[    0.000000] Linux version 3.10-3-amd64 ([email protected]) (gcc version 4.7.3 (Debian 4.7.3-7) ) #1 SMP Debian 3.10.11-1 (2013-09-10)
[    0.000000] Command line: root=r rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/bin/sh
[...]
Loading, please wait...
[    0.564122] systemd-udevd[52]: starting version 204
[...]
Begin: Loading essential drivers ... [    1.007951] FS-Cache: Loaded
[    1.009958] 9p: Installing v9fs 9p2000 file system support
[    1.012880] FS-Cache: Netfs '9p' registered for caching
done.
Begin: Running /scripts/init-premount ... done.
[...]
sh-4.2# ls /
bin   home            lib32       media    opt   safe  tmp      vmlinuz.old
boot  initrd.img      lib64       mnt      proc  sbin  usr
dev   initrd.img.old  libx32      old      root  srv   var
etc   lib             lost+found  old-tmp  run   sys   vmlinuz
sh-4.2# poweroff -f
[   56.958724] ACPI: Preparing to enter system sleep state S5
[   56.960332] Power down.
Stéphane Chazelas
fonte
1
Além disso, você pode usar 'security_model = mapped' para poder acessar totalmente o sistema de arquivos subjacente, pois ele armazena propriedade e outras informações privilegiadas sobre o arquivo em atributos estendidos do arquivo. Isso também permite montar o fs read-write em vez de somente leitura. Veja também o link
Rutger Nijlunsing 4/14
O Linux moderno parece ignorar a opção de linha de comando "root = r" e procura incondicionalmente o mount_tag "/ dev / root". Alguma objeção em atualizar a resposta para refletir isso?
G .. GitHub Pare de ajudar o gelo
3

Por mais sensata que possa parecer à primeira vista, não faça isso. 9P em seu estado atual não pode lidar com algumas operações bastante básicas, incluindo:

No momento, 9P não está em um estado adequado para ser usado na produção.

Embora você possa criar um sistema inicializável com 9P como sistema de arquivos raiz, operar a VM causará um sofrimento significativo - se você estiver usando o Debian, o defeito listado acima impedirá o funcionamento da atualização apt-get. Os patches para corrigir esse problema não levam a lugar algum há anos.

Se você insistir em fazer isso, os rootflags devem ser "rootflags = trans = virtio, cache = mmap"; caso contrário, o mapeamento de memória de leitura / gravação não funcionará (usado por, por exemplo, MariaDB).

TMR
fonte
0

Sim claro. Adicione à linha de comando do kernel:

root=host rootfstype=9p rootflags=trans=virtio

E você pode inicializar sem o initrd (se o 9P for compilado no kernel, e não como módulos).

socketpair
fonte