Под капотом · Виртуализация · Хранилища
Диск на NAS (NFS)
Пользователь кладёт образ ВМ на сетевую файловую шару NFS. Для этого он вводит несколько команд:
virsh pool-define nas-pool.xml virsh pool-start nas-pool virsh vol-create-as nas-pool vm1.qcow2 40G --format qcow2 virsh attach-disk vm1 /var/lib/virt/images-nas/vm1.qcow2 vda --config
После выполнения команд образ лежит на NAS, а в определении ВМ - путь к нему; пул монтируется при старте.
- Команда pool-define описывает шару: хост, каталог и протокол;
- Команда pool-start монтирует её, как это сделал бы администратор вручную;
- Команда vol-create-as создаёт в пуле файл образа;
- Команда attach-disk отдаёт этот файл гостю как диск.
-
пользователь 1. Пользователь описывает пул
<pool type='netfs'> <name>nas-pool</name> <source> <host name='nas.example.com'/> <dir path='/export/vm'/> <format type='nfs'/> </source> <target><path>/var/lib/virt/images-nas</path></target> </pool>Пул - это не сам диск, а описание того, откуда берутся файлы: хост NAS и каталог на нём.
-
libvirt 2. Демон монтирует шару
mount -t nfs nas.example.com:/export/vm /var/lib/virt/images-nas
При старте пула libvirt монтирует шару так же, как это сделал бы человек; с autostart - при каждой загрузке хоста.
-
сеть 3. Файлы едут по сети
TCP 2049: хост -> NAS NFSv4: один порт, состояния держит сервер
Для QEMU это обычная файловая система; задержка и потери пакетов превращаются в замедление ввода-вывода.
-
диск / RAM 4. В пуле появляется том
virsh vol-create-as nas-pool vm1.qcow2 40G --format qcow2 /var/lib/virt/images-nas/vm1.qcow2
Том в пуле - это файл на шаре; его размер и формат задаёт libvirt через qemu-img.
-
QEMU 5. QEMU открывает файл по сети
-drive file=/var/lib/virt/images-nas/vm1.qcow2,format=qcow2
QEMU не знает, что файл удалённый: за него всё делает ядро хоста через NFS-клиент.
-
гость 6. Гость работает с диском
запись идёт в кэш хоста, затем на NAS
Гость видит обычный диск, но каждая его запись - это сетевой запрос, если страница ещё не в кэше.