Обмен файлами между хостом виртуализации и виртуальными машинами#

Если необходим обмен данными между хостом и ВМ, которые на нем запускаются, в системе можно настроить общий файл NFS. Другой способ настройки обмена данными – использование virtiofs.

Настройка обмена данными с помощью NFS#

Для обмена файлами между хостом SberLinux OS и ВМ можно настроить общий ресурс NFS, к которому ВМ могут монтироваться и получать доступ.

Примечание

Для ВМ с гостевыми ОС Linux рекомендуется использовать функцию virtiofs.

Предварительные условия#

  • На хосте установлен пакет nfs-utils. Если пакет не установлен, воспользуйтесь командой:

    dnf install nfs-utils -y
    
  • Настроена виртуальная сеть с NAT или с использованием моста для подключения хоста к ВМ.

  • Опционально: для повышения безопасности убедитесь, что ваши ВМ совместимы с NFS версии 4 и выше.

Сценарий#

  1. На хосте экспортируйте каталог с файлами, который будет использоваться как общий ресурс NFS:

    1. Используйте существующий каталог, к которому получат доступ ВМ. Если требуется создать новый, воспользуйтесь командой:

      mkdir <<shared_directory>
      

      Где <shared_directory> - имя каталога общего ресурса NFS.

    2. Получите IP-адрес каждой ВМ, которая будет обмениваться данными с хостом, например, <example-vm-1> и <example-vm-2>:

      virsh domifaddr <example-vm-1>
      

      Пример вывода команды:

      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet0      52:53:00:84:57:90    ipv4         hh.hh.hh.2/24
      

      И:

      virsh domifaddr <example-vm-2>
      

      Пример вывода команды:

      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet1      52:53:00:65:29:21    ipv4         hh.hh.hh.3/24
      

      Где hh.hh.hh.2/24 и hh.hh.hh.3/24 – IP-адреса ВМ.

    3. Отредактируйте файл /etc/exports на хосте и добавьте строку, включающую в себя: каталог, который будет общим ресурсом, IP-адреса ВМ для общего использования, дополнительные опции:

      /home/<username>/Downloads/<shared_directory>/ <example-vm-1-ip>(<options>)> <example-vm-2-ip>(<options>)>
      ...
      

      Где:

      • <username> – имя учетной записи пользователя;

      • <example-vm-1-ip> и <example-vm-2-ip> - IP-адреса ВМ <example-vm-1> и <example-vm-2>;

      • <options> - возможные опции;

      Пример ниже показывает, как настроить совместный доступ и редактирование содержимого каталога /usr/local/shared-files на хосте для ВМ <example-vm-1> и <example-vm-2>:

      /usr/local/shared-files/ hh.hh.hh.2(rw,sync) hh.hh.hh.3(rw,sync)
      

      Примечание

      Чтобы предоставить доступ к каталогу ВМ с ОС Windows, необходимо убедиться, что клиент Windows NFS имеет разрешения на запись в общий каталог. Можно использовать опции all_squash, anonuid и anongid в файле /etc/exports.

      /Usr/local/shared-files/ hh.hh.hh.2(rw,sync,all_squash,anonuid=<directory-owner-UID>,anongid=<directory-owner-GID>)
      

      Где <directory-owner-UID> и <directory-owner-GID> это UID и GID локального пользователя, которому принадлежит общий каталог на хосте.

    4. Экспортируйте обновленную файловую систему:

      exportfs -a
      
    5. Запустите службу nfs-server:

      systemctl start nfs-server
      
    6. Получите IP-адрес хоста для монтирования общего каталога на ВМ:

      ip addr
      

      Пример вывода команды:

      5: virbr0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP group default qlen 1000
      link/ether 52:54:00:32:ff:a5 brd ff:ff:ff:ff:ff:ff
      inet hh.hh.hh.1/24 brd hh.hh.hh.255 scope global virbr0
      valid_lft forever preferred_lft forever
      

      Внимание

      Обратите внимание, что соответствующая сеть соединяет хост с ВМ для обмена файлами. Обычно это virbr0.

  2. Смонтируйте общий каталог на ВМ c ОС Linux, указанной в файле /etc/exports:

    mount hh.hh.hh.h:/usr/local/shared-files /mnt/host-share
    
    • hh.hh.hh.hh – IP-адрес хоста*

    • /usr/local/shared-files – путь к экспортируемому каталогу на хосте;

    • /mnt/host-share – точка монтирования на ВМ.

    Примечание

    Точка монтирования должна быть пустым каталогом

Проверка#

Выведите список содержимого каталога, который является общим ресурсом между хостом и ВМ:

ls <mount_point>

Пример вывода команды:

<shared-file1>  <shared-file2>  <shared-file3>

Где:

  • <mount_point> – путь в файловой системе к смонтированному общему каталогу;

  • <shared-file1>, <shared-file2>, <shared-file3> – общие файлы для хоста и ВМ.

Настройка обмена данными с помощью virtiofs#

С помощью virtiofs можно обмениваться файлами между хостом и ВМ в виде дерева каталогов, которое работает так же, как и локальная структура файловой системы.

Предварительные условия#

  • Виртуализация установлена и включена на хосте SberLinux OS.

  • Существует общий каталог для обмена данными. Если требуется создать новый каталог, используйте команду:

    mkdir /root/<shared-directory>
    

    Где <shared-directory> – имя каталога общего ресурса.

  • Гостевая ОС – Linux.

Сценарий#

  1. Каждый каталог на хосте, доступ к которому нужно предоставить ВМ, в XML-конфигурации ВМ установите как файловую систему virtiofs:

    1. Откройте XML-конфигурацию целевой ВМ.

    2. Добавьте следующую запись в раздел <device> XML-конфигурацию ВМ:

      <filesystem type='mount' accessmode='passthrough'>
        <driver type='virtiofs'/>
        <binary path='/usr/libexec/virtiofsd' xattr='on'/>
        <source dir='/root/shared-directory'/>
        <target dir='host-file-share'/>
      </filesystem>
      

      Внимание

      В примере выше каталог /root/<shared-directory> на хосте ВМ будет виден как host-file-share.

  2. Добавьте топологию NUMA для общей памяти в XML-конфигурацию:

    <cpu mode='host-passthrough' check='none'>
      <numa>
        <cell id='0' cpus='0-{number-vcpus - 1}' memory='{ram-amount-KiB}' unit='KiB' memAccess='shared'/>
      </numa>
    </cpu>
    

    В примере выше добавлена базовая топология для всех процессоров и всей оперативной памяти.

  3. Добавьте резервную копию общей памяти в раздел <domain> XML-конфигурации:

    <domain>
     [...]
     <memoryBacking>
       <access mode='shared'/>
     </memoryBacking>
     [...]
    </domain>
    
  4. Загрузите ВМ:

    virsh start <example-vm>
    
  5. Смонтируйте файловую систему в гостевой ОС:

    mount -t virtiofs host-file-share /mnt
    

    В примере выше монтируется ранее настроенный каталог host-file-share с гостевой ОС Linux.

Проверка#

Убедитесь, что общий каталог стал доступен на ВМ, и открываются файлы, хранящиеся в каталоге.

Внимание

Параметры монтирования файловой системы, связанные со временем доступа, такие как noatime и strictatime, будут некорректно работать с virtiofs. Их использование не рекомендуется.

Устранение ошибок#

Если использование virtiofs не применимо для конкретного случая или не поддерживается системой, используйте NFS.