При наличии функции маппирования LUN к конкретному серверу виртуализации, необходимо указывать WWID виртуальных карт ВМ, а не сервера виртуализации.

vHBA с помощью libvirt уже должны быть созданы на данный момент.

sudo apt install sysfsutils -y
Пример вывода:
systool -c fc_host -v | grep port_name

port_name = "0x2100f4e9d4213700"

port_name = "0x2100f4e9d4213701"

port_name = "0x10000000c9831b4a"

port_name = "0x10000000c9831b4b"
CODE
где:
  • "0x2100f4e9d4213700" и "0x2100f4e9d4213701" — физические WWID;

  • "0x10000000c9831b4a" и "0x10000000c9831b4b" — виртуальные WWID.

СХД необходимо настроить таким образом, чтобы разрешенными инициаторами для ВМ были vHBA, с помощью которых планируется подключение.

На сервере виртуализации необходимо:

  1. Настроить службу multipath:
    sudo apt install multipath-tools -y
  2. Определить уникальный идентификатор WWID (World Wide Identifier) LUN:
    ls -l /dev/disk/by-id/ | grep scsi
    Пример вывода:
    lrwxrwxrwx 1 root root 10 июл 10 21:10 scsi-3640eedd100533b616be51eb70000000a -> ../../dm-5
    
    lrwxrwxrwx 1 root root 10 июл 10 21:42 scsi-3640eedd100533b617d1eec350000000f -> ../../dm-3
    
    lrwxrwxrwx 1 root root 10 июл 10 22:05 scsi-3640eedd100533b617d1f143700000010 -> ../../dm-4
    CODE
  3. Конфигурационный файл /etc/multipath.conf привести к виду:
    defaults {
        user_friendly_names yes
    }
    
    multipaths {
    
        multipath {
            wwid 3640eedd100533b616be51eb70000000a
            alias lun-vm01
        }
        multipath {
            wwid 3640eedd100533b617d1eec350000000f
            alias lun-vm01-002
        }
    }
    CODE
  4. Перезапустить службу multipath:
    sudo systemctl reload multipathd.service
  5. Выполнить команду:
    sudo multipath -ll
    Пример вывода:
    lun-vm01 (3640eedd100533b616be51eb70000000a) dm-5 HUAWEI,XSG1
    size=265G features='1 queue_if_no_path' hwhandler='0' wp=rw
    `-+- policy='service-time 0' prio=1 status=active
      |- 17:0:0:1 sdf 8:80  active ghost running
      |- 17:0:1:1 sdi 8:128 active ready running
      |- 18:0:0:1 sdl 8:176 active ready running
      `- 18:0:1:1 sdo 8:224 active ghost running
    lun-vm01-002 (3640eedd100533b617d1eec350000000f) dm-3 HUAWEI,XSG1
    size=50G features='1 queue_if_no_path' hwhandler='0' wp=rw
    `-+- policy='service-time 0' prio=1 status=active
      |- 17:0:0:2 sdg 8:96  active ready running
      |- 17:0:1:2 sdj 8:144 active ghost running
      |- 18:0:0:2 sdm 8:192 active ghost running
      `- 18:0:1:2 sdp 8:240 active ready running
    CODE
  6. Определить уникальный идентификатор WWN, определяющий конкретное целевое устройство:
    • если физический адаптер FC Fabric Adapter, необходимо выполнить команду:
      lspci -nn | grep -i fibre
      Пример вывода:
      5f:00.0 Fibre Channel [0c04]: Cavium QLogic BR-1860 Fabric Adapter [1657:0022] (rev 01)
      5f:00.1 Fibre Channel [0c04]: Cavium QLogic BR-1860 Fabric Adapter [1657:0022] (rev 01)
      CODE
    • если физический адаптер FC PCI Express HBA:
      lspci | grep -i hba
      Пример вывода:
      07:00.0 Fibre Channel [0c04]: QLogic Corp. ISP2532-based 8Gb Fibre Channel to PCI Express HBA [1077:2532] (rev 02)
      07:00.1 Fibre Channel [0c04]: QLogic Corp. ISP2532-based 8Gb Fibre Channel to PCI Express HBA [1077:2532] (rev 02)
      CODE
  7. Проверить доступные порты WWPN:
    ls -l /sys/class/fc_host
    Пример вывода:
    lrwxrwxrwx 1 root root 0 июл  8 16:25 host15 -> ../../devices/pci0000:5d/0000:5d:02.0/0000:5f:00.0/host15/fc_host/host15
    lrwxrwxrwx 1 root root 0 июл  8 16:25 host16 -> ../../devices/pci0000:5d/0000:5d:02.0/0000:5f:00.1/host16/fc_host/host16
    lrwxrwxrwx 1 root root 0 июл  8 16:25 host17 -> ../../devices/pci0000:5d/0000:5d:02.0/0000:5f:00.1/host16/vport-16:0-0/host17/fc_host/host17
    lrwxrwxrwx 1 root root 0 июл  8 16:25 host18 -> ../../devices/pci0000:5d/0000:5d:02.0/0000:5f:00.0/host15/vport-15:0-0/host18/fc_host/host18
    CODE
  8. Проверить статусы портов WWPN:
    more /sys/class/fc_host/host??/port_state
    после ввода команды необходимо нажать на клавишу <Enter> для вывода информации о каждом порте.
    Пример вывода:
    ::::::::::::::
    /sys/class/fc_host/host15/port_state
    ::::::::::::::
    Online
    ::::::::::::::
    /sys/class/fc_host/host16/port_state
    ::::::::::::::
    Online
    ::::::::::::::
    /sys/class/fc_host/host17/port_state
    ::::::::::::::
    Online
    ::::::::::::::
    /sys/class/fc_host/host18/port_state
    ::::::::::::::
    Online
    CODE
  9. Вывести номера WWNN вышеуказанных портов:
    more /sys/class/fc_host/host??/port_name
    после ввода команды необходимо нажать на клавишу <Enter> для вывода информации о каждом порте.
    Пример вывода:
    ::::::::::::::
    /sys/class/fc_host/host15/port_name
    ::::::::::::::
    0x2100f4e9d4213700
    ::::::::::::::
    /sys/class/fc_host/host16/port_name
    ::::::::::::::
    0x2100f4e9d4213701
    ::::::::::::::
    /sys/class/fc_host/host17/port_name
    ::::::::::::::
    0x10000000c9831b4b
    ::::::::::::::
    /sys/class/fc_host/host18/port_name
    ::::::::::::::
    0x10000000c9831b4a
    CODE
  10. Определить адаптеры, поддерживающие NPIV:
    virsh nodedev-list --cap vports
    Пример вывода:
    scsi_host15
    scsi_host16
    CODE
  11. Посмотреть дополнительные сведения одного из портов:
    virsh nodedev-dumpxml scsi_host<номер_адаптера>
    где <номер_адаптера> — номер адаптера, определенный в предыдущем шаге.
    Пример вывода:
    <device>
     <name>scsi_host15</name>
     <path>/sys/devices/pci0000:5d/0000:5d:02.0/0000:5f:00.0/host15</path>
     <parent>pci_0000_5f_00_0</parent>
     <capability type='scsi_host'>
       <host>15</host>
       <unique_id>0</unique_id>
       <capability type='fc_host'>
         <wwnn>2000f4e9d4213700</wwnn>
         <wwpn>2100f4e9d4213700</wwpn>
         <fabric_wwn>100050eb1ae33d00</fabric_wwn>
       </capability>
       <capability type='vport_ops'>
         <max_vports>255</max_vports>
         <vports>1</vports>
       </capability>
     </capability>
    </device>
    CODE
    где:
    • <name>scsi_host15</name> — имя порта (потребуется для подключения vhba pool через libvirt);

    • <wwnn>2000f4e9d4213700</wwnn> — уникальный идентификатор WWNN (не должен совпадать с vHBA или физическими HBA);

    • <wwpn>2100f4e9d4213700</wwpn> — уникальный идентификатор WWPN (не должен совпадать с vHBA или физическими HBA);

    • <fabric_wwn>100050eb1ae33d00</fabric_wwn> — уникальный идентификатор WWN;

    • <max_vports>255</max_vports> — максимальное количество виртуальных портов, которое может быть создано для использования виртуального адаптера шины;

    • <vports>1</vports> — количество виртуальных портов, определенных в настоящее время для использования виртуального адаптера шины.

  12. Создать конфигурационный файл в формате xml для каждого пула:
    <pool type='scsi'>
     <name>test1poolvhba1</name>
     <source>
       <adapter type='fc_host' parent='scsi_host15' wwnn='20000000c9831b4b' wwpn='10000000c9831b4b'/>
     </source>
     <target>
       <path>/dev/disk/by-path</path>
       <permissions>
         <mode>0700</mode>
         <owner>0</owner>
         <group>0</group>
       </permissions>
     </target>
    </pool>
    CODE
    где:
    • <name>test1poolvhba1</name> — произвольное имя пула;

    • <adapter type='fc_host' parent='scsi_host15' — имя порта, полученное из шага выше;

    • wwnn='20000000c9831b4b' wwpn='10000000c9831b4b'/> — уникальные значения, сгенерированные администратором.

  13. Создать пулы:
    virsh pool-define <имя_файла>.xml --validate
    где <имя_файла> – имя конфигурационного файла, созданного ранее.
  14. Запустить созданные пулы:
    virsh pool-start <имя_пула>
    где <имя_пула> — имя пула, заданное в конфигурационном файле.

    При запуске пула libvirt проверит, существует ли уже vHBA с такими же уникальными идентификаторами WWNN и WWPN. Если он не существует, будет создан новый vHBA с предоставленными WWNN и WWPN. Если он уже существует, команда определения завершится ошибкой, указывая на то, что WWNN и WWPN уже используются.

  15. Настроить функцию автозапуска пулов хранения:
    virsh pool-autostart <имя_пула>
    где <имя_пула> — имя пула, заданное в конфигурационном файле.
  16. Сгенерировать для каждого пула список доступных LUN на vHBA:

    Если важна миграция, необходимо понимать, что имя тома, представленное в выводе virsh vol-list (например, unit:A:B:C или unit:0:4:0), может различаться между двумя серверами виртуализации для одного и того же физического vHBA LUN в зависимости от порядка обнаружения каждого из серверов виртуализации. Для миграции диск, назначенный гостю с использованием пула хранения и имени тома, может быть сопоставлен с другим диском на целевом сервере виртуализации. Для таких случаев использования рекомендуется описывать диск по имени пути в конфигурационном файле ВМ формата xml.


    virsh vol-list <имя_пула>
    где <имя_пула> — имя пула, заданное в конфигурационном файле.
    Примеры вывода:
    unit:0:0:1   /dev/disk/by-path/pci-0000:5f:00.0-fc-0x200040eedd533b61-lun-1
    unit:0:0:2   /dev/disk/by-path/pci-0000:5f:00.0-fc-0x200040eedd533b61-lun-2
    unit:0:0:3   /dev/disk/by-path/pci-0000:5f:00.0-fc-0x200040eedd533b61-lun-3
    unit:0:1:1   /dev/disk/by-path/pci-0000:5f:00.0-fc-0x201040eedd533b61-lun-1
    unit:0:1:2   /dev/disk/by-path/pci-0000:5f:00.0-fc-0x201040eedd533b61-lun-2
    unit:0:1:3   /dev/disk/by-path/pci-0000:5f:00.0-fc-0x201040eedd533b61-lun-3
    CODE
    unit:0:0:1   /dev/disk/by-path/pci-0000:5f:00.1-fc-0x201040eedd533b61-lun-1
    unit:0:0:2   /dev/disk/by-path/pci-0000:5f:00.1-fc-0x201040eedd533b61-lun-2
    unit:0:0:3   /dev/disk/by-path/pci-0000:5f:00.1-fc-0x201040eedd533b61-lun-3
    unit:0:1:1   /dev/disk/by-path/pci-0000:5f:00.1-fc-0x200040eedd533b61-lun-1
    unit:0:1:2   /dev/disk/by-path/pci-0000:5f:00.1-fc-0x200040eedd533b61-lun-2
    unit:0:1:3   /dev/disk/by-path/pci-0000:5f:00.1-fc-0x200040eedd533b61-lun-3
    CODE
  17. Вывести список вновь созданных vHBA:

    virsh nodedev-list --cap fc_host
    Пример вывода:
    scsi_host15
    scsi_host16
    scsi_host19
    scsi_host20
    CODE
    где scsi_host19 и scsi_host20 — новые адаптеры vHBA.
  18. Проверить настройки каждого из новых vHBA:
    virsh nodedev-dumpxml scsi_host<номер_адаптера>
    где <номер_адаптера> — номер нового адаптера, полученный в предыдущем шаге.
  19. Для каждого LUN создать конфигурационные файлы в формате xml:
    <disk type='block' device='lun'>
     <driver name='qemu' type='raw'/>
     <source dev='/dev/disk/by-path/pci-0000:5f:00.0-fc-0x200040eedd533b61-lun-1'/>
     <target dev='sda' bus='scsi'/>
    </disk>
    CODE
    где '/dev/disk/by-path/pci-0000:5f:00.0-fc-0x200040eedd533b61-lun-1' — данные LUN, полученные в шаге ранее.
  20. Подключить LUN со службой multipath:
    • если ВМ включена:
      virsh attach-device <имя_ВМ> <имя_файла>.xml --live --persistent
      где:
    • если ВМ выключена:
      virsh attach-device <имя_ВМ> <имя_файла>.xml --config --persistent
      где:
  21. Вывести подключенные диски в ВМ:
    virsh domblklist <имя_ВМ>
    Пример вывода:
    Target   Source
    ------------------------------------------------------------------------------
     vda      /var/lib/libvirt/images/alse-vanilla-1.7.4-qemu-max-mg11.2.0.qcow2
    
     sda      /dev/disk/by-path/pci-0000:5f:00.0-fc-0x201040eedd533b61-lun-1
     sdb      /dev/disk/by-path/pci-0000:5f:00.1-fc-0x201040eedd533b61-lun-1
     sdc      /dev/disk/by-path/pci-0000:5f:00.1-fc-0x200040eedd533b61-lun-1
     sdd      /dev/disk/by-path/pci-0000:5f:00.0-fc-0x200040eedd533b61-lun-1
    CODE
  22. повторить шаги 20 и 21 для остальных LUN.