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

Диск на iSCSI (SAN)

Пользователь подключает к ВМ LUN, который выдаёт СХД по iSCSI. Для этого он вводит несколько команд:

Команда
iscsiadm -m discovery -t sendtargets -p 10.0.0.10
iscsiadm -m node -T iqn.2024-01.com.example:storage -l
virsh attach-device vm1 disk-iscsi.xml --config
libvirt API virDomainAttachDeviceFlags()

После выполнения команд LUN записан в определение ВМ; при запуске QEMU откроет его по сети, а на хосте не появится копия данных.

  • Команда discovery узнаёт IQN target и адрес портала;
  • Команда node -l поднимает сессию, и ядро создаёт устройство для каждого LUN;
  • Команда attach-device отдаёт это устройство гостю как virtio-диск.
  • пользователь 1. Пользователь ищет target на портале
    iscsiadm -m discovery -t sendtargets -p 10.0.0.10
    ← 10.0.0.10:3260,1 iqn.2024-01.com.example:storage

    sendtargets - стандартный способ узнать IQN: без него подключаться некуда, имя target задаёт администратор СХД.

  • сеть 2. Устанавливается сессия iSCSI
    TCP 3260: хост -> портал СХД
    iscsiadm -m session

    На транспорте это обычный TCP, а SCSI-команды едут внутри него: нужна только сетевая доступность портала.

  • диск / RAM 3. Ядро хоста создаёт SCSI-устройство
    /dev/disk/by-path/ip-10.0.0.10:3260-iscsi-iqn.2024-01…-lun-0

    Имена вида sdX нестабильны, поэтому в конфигурацию берут путь by-path или by-id.

  • libvirt 4. Демон получает готовое блочное устройство
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-path/ip-10.0.0.10:3260-iscsi-…-lun-0'/>
      <target dev='vdb' bus='virtio'/>
    </disk>

    type='block' означает, что libvirt не создаёт файл: он отдаёт QEMU устройство, которое уже существует.

  • QEMU 5. QEMU открывает блочное устройство
    -drive file=/dev/disk/by-path/…-lun-0,format=raw

    Здесь нет заголовка образа, поэтому формат указывают явно: raw, иначе QEMU может ошибиться в определении.

  • гость 6. В госте появляется диск
    lsblk
    vdb    200G

    Гость работает с virtio-блоком и не знает, что за ним стоит сеть и СХД.