Под капотом · Виртуализация · Хранилища
Диск на 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
После выполнения команд 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-блоком и не знает, что за ним стоит сеть и СХД.