Virtfs / 9p peut-il être utilisé comme système de fichiers racine?

11

Est-il possible d'utiliser un dossier partagé de l'hôte à l'invité via virtfs / 9p comme système de fichiers racine à l'intérieur de l'invité?

Liée à ma question précédente: virtfs / 9p peut-il être utilisé pour partager le même dossier hôte avec plusieurs invités?

0xC0000022L
la source
Je n'ai jamais essayé de 9p en tant que root FS, mais je pense qu'avec un initrd approprié, rien ne peut vous empêcher de le faire.
Alexander Kudrevatykh
1
jor1k fait cela
Janus Troelsen
Ce qui serait beau, c'est que nous pourrions utiliser des superpositions avec / et la monture 9p en tant que plus bas, puis y chrooter. Mais il ne parvient pas à être très utile car les écritures vers les bas ne sont pas définies ... Il existe cependant d'autres systèmes de fichiers FUSER qui le permettent, je pense, mais je ne l'ai pas encore atteint.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Réponses:

9

Oui, voir par exemple comment démarrer une VM avec le FS de l'hôte:

Ajoutez les modules 9p à l'hôte initramfs(c'est le moyen le plus simple mais pas le plus propre, d'avoir un initrd avec les modules nécessaires):

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'

Si vous l'exécutez en tant qu'utilisateur normal, il existe des fichiers auxquels il ne pourra pas accéder, mais vous devriez pouvoir obtenir l'invite du shell et cela ne causera aucun dommage:

[    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
la source
2
De plus, vous pouvez utiliser «security_model = mapped» pour pouvoir accéder pleinement au système de fichiers sous-jacent, car il stocke la propriété et d'autres informations de fichier privilégiées dans des attributs étendus du fichier. Cela vous permet également de monter le fs en lecture-écriture au lieu de lecture seule. Voir aussi le lien
Rutger Nijlunsing
Le Linux moderne semble ignorer l'option de ligne de commande "root = r" et recherche inconditionnellement le mount_tag "/ dev / root". Avez-vous une objection à mettre à jour la réponse pour refléter cela?
R .. GitHub STOP HELPING ICE
4

Une idée aussi sensée que cela semble au premier abord, ne le faites pas. Le 9P dans son état actuel ne peut pas gérer certaines opérations assez basiques, notamment:

À l'heure actuelle, le 9P n'est pas en état d'être utilisé pour la production.

Bien que vous puissiez créer un système amorçable avec 9P comme système de fichiers racine, le fonctionnement de cette machine virtuelle causera des problèmes importants - si vous utilisez Debian, le défaut répertorié ci-dessus empêchera la mise à niveau apt-get de fonctionner. Les correctifs pour résoudre ce problème sont allés nulle part depuis des années.

Si vous insistez pour le faire, les rootflags doivent être "rootflags = trans = virtio, cache = mmap", sinon le mappage de la mémoire en lecture / écriture ne fonctionnera pas (utilisé par exemple par MariaDB).

TMR
la source
Même si je ne l'aime pas, merci pour l'entrée. Je réfléchis actuellement à placer le démarrage et la racine dans un conteneur de fichiers approprié et certaines des données qui sont censées être partagées dans 9p ...
0xC0000022L
1

Oui bien sûr. Ajouter à la ligne de commande du noyau:

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

Et vous pouvez démarrer sans initrd (si 9P est compilé dans le noyau, plutôt que sous forme de modules).

socketpair
la source