Можно ли использовать virtfs / 9p в качестве корневой файловой системы?

11

Можно ли использовать общую папку с хоста для гостя через virtfs / 9p в качестве корневой файловой системы внутри гостя?

Слабое отношение к моему предыдущему вопросу: можно ли использовать virtfs / 9p для совместного использования одной и той же папки хоста с несколькими гостями?

0xC0000022L
источник
Я никогда не пробовал 9p в качестве root FS, но я думаю, что при правильном initrd нет ничего, что могло бы помешать вам сделать это.
Александр Кудреватых
1
jor1k делает это
Янус Троелсен
Что было бы прекрасно, так это если бы мы могли использовать overlayfs с / и монтированием 9p как более низкими, а затем подключиться к нему. Но это не может быть очень полезным, потому что записи в низшие уровни не определены ... Однако, есть и другие файловые системы FUSER, которые позволяют это, я думаю, но я еще не достиг этого.
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

9

Да, посмотрите, например, как загрузить виртуальную машину с FS хоста:

Добавьте модули 9p на хост initramfs(это самый простой способ, хотя и не самый чистый, иметь initrd с необходимыми модулями):

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'

Если вы запускаете его как обычный пользователь, есть файлы, к которым он не сможет получить доступ, но вы должны иметь возможность получить приглашение оболочки, и оно не нанесет никакого ущерба:

[    0.000000] Linux version 3.10-3-amd64 (debian-kernel@lists.debian.org) (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.
Стефан Шазелас
источник
2
Кроме того, вы можете использовать «security_model = mapped», чтобы иметь возможность полного доступа к базовой файловой системе, поскольку она хранит информацию о владельце и другой привилегированной информации о файле в расширенных атрибутах файла. Это также позволяет вам монтировать fs для чтения-записи вместо readonly. Смотрите также ссылку
Рутгер Нийлунсинг
Современный Linux, похоже, игнорирует параметр командной строки «root = r» и безоговорочно ищет mount_tag «/ dev / root». Есть возражения против обновления ответа, чтобы отразить это?
R .. GitHub ОСТАНОВИТЬ ЛЬДА
4

Как разумная идея, как это кажется на первый взгляд, не делайте этого. 9P в своем текущем состоянии не может выполнять некоторые довольно простые операции, в том числе:

9P в настоящее время не находится в состоянии, пригодном для использования в производстве.

Несмотря на то, что вы можете создать загрузочную систему с 9P в качестве корневой файловой системы, работа с этой виртуальной машиной вызовет значительное горе - если вы используете Debian, вышеперечисленный дефект не даст работать обновлению apt-get. Патчи для решения этой проблемы никуда не годились.

Если вы настаиваете на этом, корневыми флагами должно быть «rootflags = trans = virtio, cache = mmap», иначе отображение памяти для чтения / записи не будет работать (используется, например, MariaDB).

TMR
источник
Хотя мне это не нравится, спасибо за вклад. В настоящее время я размышляю о том, чтобы поместить boot и root в соответствующий файловый контейнер, а некоторые данные, которые должны быть разделены в 9p ...
0xC0000022L
1

Да, конечно. Добавьте в командную строку ядра:

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

И вы можете загружаться без initrd (если 9P скомпилировано в ядро, а не как модули).

socketpair
источник