Bisakah virtfs / 9p digunakan sebagai sistem file root?

11

Apakah mungkin menggunakan folder yang dibagikan dari host ke tamu melalui virtfs / 9p sebagai sistem file root di dalam tamu?

Secara longgar terkait dengan pertanyaan saya sebelumnya: Dapatkah virtfs / 9p digunakan untuk berbagi folder host yang sama dengan beberapa tamu?

0xC0000022L
sumber
Saya tidak pernah mencoba 9p sebagai root FS, tapi saya pikir dengan initrd yang tepat tidak ada yang dapat menghalangi Anda untuk melakukan itu.
Alexander Kudrevatykh
1
jor1k melakukan ini
Janus Troelsen
Apa yang akan indah adalah jika kita bisa menggunakan overlay dengan / dan mount 9p lebih rendah, lalu chroot ke dalamnya. Tapi gagal menjadi sangat berguna karena menulis ke yang lebih rendah tidak terdefinisi ... Namun ada sistem berkas FUSER lain yang memungkinkan saya berpikir, tetapi saya belum mencapainya.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Jawaban:

9

Ya, lihat misalnya cara mem-boot VM dengan FS host:

Tambahkan modul 9p ke host initramfs(itu cara termudah meskipun bukan yang terbersih, untuk memiliki initrd dengan modul yang dibutuhkan):

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'

Jika Anda menjalankannya sebagai pengguna biasa, ada file yang tidak dapat diakses, tetapi Anda harus bisa mendapatkan prompt shell dan itu tidak akan merusak:

[    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
sumber
2
Selain itu, Anda dapat menggunakan 'security_model = dipetakan' untuk dapat sepenuhnya mengakses sistem file yang mendasari karena menyimpan kepemilikan dan informasi file istimewa lainnya dalam atribut yang diperluas dari file. Ini juga memungkinkan Anda untuk me-mount fs read-write bukan readonly. Lihat juga tautan
Rutger Nijlunsing
Linux modern tampaknya mengabaikan opsi baris perintah "root = r" dan tanpa syarat mencari mount_tag "/ dev / root". Adakah keberatan untuk memperbarui jawaban untuk mencerminkan hal itu?
R .. GitHub BERHENTI MEMBANTU ICE
4

Sebagai ide yang masuk akal seperti ini pada awalnya, jangan lakukan ini. 9P dalam kondisi saat ini tidak dapat menangani beberapa operasi yang cukup mendasar, termasuk:

9P saat ini tidak dalam kondisi fit untuk digunakan dalam produksi.

Meskipun Anda dapat membuat sistem yang dapat di-boot dengan 9P sebagai sistem file root, mengoperasikan VM itu akan menyebabkan kesedihan yang signifikan - jika menggunakan Debian, kerusakan yang tercantum di atas akan mencegah peningkatan apt-get upgrade agar tidak berfungsi. Tambalan untuk memperbaiki masalah ini telah hilang kemana-mana selama bertahun-tahun.

Jika Anda bersikeras melakukan ini, rootflag harus "rootflag = trans = virtio, cache = mmap", jika tidak, pemetaan memori baca / tulis tidak akan berfungsi (digunakan oleh, misalnya, MariaDB).

TMR
sumber
Meskipun saya tidak suka, terima kasih atas masukannya. Saat ini saya sedang merenungkan menempatkan boot dan root dalam wadah file yang tepat dan beberapa data yang seharusnya dibagikan ke 9p ...
0xC0000022L
1

Ya tentu. Tambahkan ke baris perintah kernel:

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

Dan Anda dapat boot tanpa initrd (jika 9P dikompilasi ke dalam kernel, bukan sebagai modul).

soketpair
sumber