iSCSI: как удалить зависшие сессии?

Постановка задачи

Необходимо было запустить ВМ, которая не хотела запускаться. Ошибка запуска связана с недоступностью диска на гипервизоре.

Обычно, в таком случае, первым делом смотрим свойства iSCSI-подключения всех дисков данной ВМ. Как правило, там могут быть ошибки двух типов:

  • неверный идентификатор iSCSI (/etc/iscsi/cat /etc/iscsi/initiatorname.iscsi

например: InitiatorName=iqn.1993-08.org.debian:01:37fec792e6a3 , а должен быть InitiatorName=iqn.2024-05.ru.latl.iscsi:cmpt-c01z03-n3008

  • неверные параметры CHAP-доступа с диску - username или password

Однако, в данном случае, все параметры подключения были правильные, но ВМ не запускалась.

Решение

Идем на гипервизор (initiator), на котором размещена наша ВМ и смотрим лог /var/log/nova/nova-compute.log :

2024-10-15 14:54:16.787 974369 ERROR nova.virt.block_device [instance: ed78fbe9-d18d-4b96-9def-7a1bb3a2348f] Stderr: 'iscsiadm: Could not logout of [sid: 131, target: iqn.2010-10.org.openstack:volume-4723e8f9-fdc7-4de8-92de-13f4fa74617d, portal: 100.111.254.231,3260].\niscsiadm: initiator reported error (32 - target likely not connected)\niscsiadm: Could not logout of all requested sessions\n'

Упомянутый здесь instance_uuid (ed78fbe9-d18d-4b96-9def-7a1bb3a2348f) - не наш проблемный инстанс! Однако, эта ошибка мешает нам стартовать нашу ВМ. Смотрим, есть ли такой диск:

VOLID="4723e8f9-fdc7-4de8-92de-13f4fa74617d"
openstack volume show $VOLID
No volume with a name or ID of '4723e8f9-fdc7-4de8-92de-13f4fa74617d' exists.

Оказывается его нет. Пробуем разлогинить iSCSI-сессию на это диск, чтобы, в дальнейшем, удалить эту “зависшую” iSCSI-сессию:

iscsiadm --mode node --target iqn.2010-10.org.openstack:volume-${VOLID} --portal 100.111.254.231,3260 --logout
Logging out of session [sid: 131, target: iqn.2010-10.org.openstack:volume-${VOLID}, portal: 100.111.254.231,3260]
iscsiadm: Could not logout of [sid: 131, target: iqn.2010-10.org.openstack:volume-4723e8f9-fdc7-4de8-92de-13f4fa74617d, portal: 100.111.254.231,3260].
iscsiadm: initiator reported error (32 - target likely not connected)

Как видно из ответа - утилита iscsiadm не может этого сделать, ссылаясь на то, что данный таргет не подключен! Что же делать в такой “патовой” ситуации? За ответом идем в СУБД cinder и смотрим свойства диска:

select * from volumes where id="$VOLID";

В выводе видим, что поле deleted установлено в значение 1 - это означает, что диск удален. Однако, его iSCSI-сессия при удалении по какой-то причине не удалилась и, более того, сам диск физически присутствует на сторадже:

root@strg-z03-01:/home/cloud# zfs list | grep $VOLID
tank/volume-4723e8f9-fdc7-4de8-92de-13f4fa74617d   108G  75.2T     25.7G 
Начинаем исправлять данную ситуацию.

  1. Сначала, выставим метку, что этот диск не удален:

    update volumes set deleted=0 where id="$VOLID"
    

  2. Затем, разлогиним iSCSI-сессию, связанную с этим диском на инициаторе (гипервизоре):

    iscsiadm --mode node --target iqn.2010-10.org.openstack:volume-${VOLID} --portal 100.111.254.231,3260 --logout
    
    На сей раз все проходит без ошибок.

  3. Далее удаляем ненужную теперь iSCSI-сессию:

    ## на инициаторе
    iscsiadm -m node -o delete -T iqn.2010-10.org.openstack:volume-${VOLID}
    ## на таргете
    cinder-rtstool delete iqn.2010-10.org.openstack:volume-${VOLID}
    

  4. И, наконец, удаляем штатно сам диск:

    cinder reset-state --state available $VOLID
    openstack volume delete $VOLID
    
    Диск удалился без ошибок.

  5. Проверим, что диска нет на сторадже:

    root@strg-z03-01:/home/cloud# zfs list | grep $VOLID
    

  6. Проверим лог nova-compute на гипервизоре:

    tail -f /var/log/nova/nova-compute.log | grep -i error
    
    Теперь ошибок быть не должно.

  7. Запускаем нашу ВМ:

    openstack server start <instance_uuid> 
    
    Видим, что на сей раз она успешно стартовала.

  8. Проверим, остались ли ошибки iSCSI-сессий:

    iscsiadm -m discovery -t st -p 100.111.254.231
    iscsiadm: This command will remove the record [iface: default, target: iqn.2010-10.org.openstack:volume-4723e8f9-fdc7-4de8-92de-13f4fa74617d, portal: 100.111.254.231,3260], but a session is using it. Logout session then rerun command to remove record.
    
    100.111.254.231 - IP-адрес нашего стораджа в сети хранения (VLAN 1499)

Как-же так - сессию мы удалили, но она вновь откуда-то появилась?

  1. Чтобы окончательно удалить сессию, необходимо еще удалить запись о сессии из базы данных. Для этого на гипервизоре (инициаторе) выполним команду:
    iscsiadm -m discoverydb -t sendtargets -p 100.111.254.231:3260 -o delete
    
  2. Проверим еще раз:
    iscsiadm -m discovery -t st -p 100.111.254.231 | grep $VOLID
    

В ответ получим пустой вывод. Вот теперь точно все в порядке.

Наконец, необходимо проверить файловую систему, чтобы убедиться, что Linux не попытается восстановить соединение при будущих операциях загрузки.

ls /var/lib/iscsi/nodes/<iqn>
Если iqn существует, его следует удалить. Может потребоваться отредактировать этот объект узла, чтобы удалить определенные IP-адреса из его списков без изменения самого узла, если клиент изменил IP-адреса своих целей ISCSI, но IQN остается действующим. Это можно сделать, перейдя по папке узла через targetcli и выборочно удалить объекты, связанные с недействительными IP-адресами.

Идентификация диска по имени его логического устройства

Иногда в логе nova-compute.log можно увидеть ошибку вида:

Command: blockdev --flushbufs /dev/sdab
Stderr: 'blockdev: cannot open /dev/sdab: No such device or address\n'
2024-10-14 22:09:23.692 3884301 ERROR nova.virt.block_device [instance: 55584f6b-f533-4c5b-8e7e-c364c501c8d8] Command: blockdev --flushbufs /dev/sdab
2024-10-14 22:09:23.692 3884301 ERROR nova.virt.block_device [instance: 55584f6b-f533-4c5b-8e7e-c364c501c8d8] Stderr: 'blockdev: cannot open /dev/sdab: No such device or address\n'
В логе мы явно видим UUID инстанса (55584f6b-f533-4c5b-8e7e-c364c501c8d8) и имя блочного устройства (/dev/sdab). Но нам необходимо для решения проблемы узнать volume_uuid.
Посмотреть параметры блочного устройства, подключенного по iSCSI можно командой:

# udevadm info --query=all --name=/dev/sdab | grep $VOLID

S: disk/by-path/ip-100.111.254.235:3260-iscsi-iqn.2010-10.org.openstack:volume-495edeac-4e35-4312-8c16-c8de53212876-lun-0
E: ID_PATH=ip-100.111.254.235:3260-iscsi-iqn.2010-10.org.openstack:volume-495edeac-4e35-4312-8c16-c8de53212876-lun-0
E: ID_PATH_TAG=ip-100_111_254_235_3260-iscsi-iqn_2010-10_org_openstack_volume-495edeac-4e35-4312-8c16-c8de53212876-lun-0
E: DEVLINKS=/dev/disk/by-id/scsi-36001405936fb404d305451497c4d718d /dev/disk/by-path/ip-100.111.254.235:3260-iscsi-iqn.2010-10.org.openstack:volume-495edeac-4e35-4312-8c16-c8de53212876-lun-0 /dev/disk/by-id/wwn-0x6001405936fb404d305451497c4d718d /dev/disk/by-uuid/5046d468-3478-423d-bf19-2f3820db157d

Опубликовано: 21.10.2024