Под капотом · Виртуализация · Хранилища

Диск на 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
libvirt API virStoragePoolCreate(), virStorageVolCreateXML()

После выполнения команд образ лежит на 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

    Гость видит обычный диск, но каждая его запись - это сетевой запрос, если страница ещё не в кэше.