Bug 54158 - Команда nvme gen-hostnqn генерирует одинаковые значения
Summary: Команда nvme gen-hostnqn генерирует одинаковые значения
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: nvme (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Konstantin A Lepikhov (L.A. Kostis)
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-05-06 15:34 MSK by Oleg Kolesnichenko
Modified: 2025-11-28 08:35 MSK (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Oleg Kolesnichenko 2025-05-06 15:34:02 MSK
Дистрибутив Альт Виртуализация 10

NAME="ALT Server-V"
VERSION="10.4"
ID=altlinux
VERSION_ID=10.4
PRETTY_NAME="ALT Virtualization Server 10.4 (Actinoform)"
ANSI_COLOR="1;33"
CPE_NAME="cpe:/o:alt:server-v:10.4"
BUILD_ID="ALT Server-V 10.1"
HOME_URL="https://basealt.ru/"
BUG_REPORT_URL="https://bugs.altlinux.org/"

При каждом запуске команды, выдаётся один и тот же UUID:
# nvme gen-hostnqn
nqn.2014-08.org.nvmexpress:uuid:24d4dfd8-1dd2-1000-0387-0015b2b15ca9
# nvme gen-hostnqn
nqn.2014-08.org.nvmexpress:uuid:24d4dfd8-1dd2-1000-0387-0015b2b15ca9

Насколько я понимаю, значение просто берётся из DMI:
# cat /sys/class/dmi/id/product_uuid 
24d4dfd8-1dd2-1000-0387-0015b2b15ca9

Хотя в man написано:
DESCRIPTION
       Generate a random host NQN in the form: nqn.2014-08.org.nvmexpress:uuid:1b4e28ba-2fa1-11d2-883f-0016d3cca427 and prints it to stdout.

Ожидается, что каждый раз будет генерироваться новый NQN.
Comment 1 Alexander Makeenkov 2025-05-06 15:46:27 MSK
Он не может быть каждый раз разный, поскольку генерируется на основе существующего uuid.

Описание из интернета:
"""
NVMe Qualified Name (NQN) используется для идентификации удалённого целевого хранилища NVMe в протоколе NVMe over Fabrics.

Этот протокол предназначен для взаимодействия между хостом и системой хранения по сети.
"""

Это имя по определению не может изменяться.
Comment 2 Oleg Kolesnichenko 2025-05-06 17:06:30 MSK
(Ответ для Alexander Makeenkov на комментарий #1)
> Он не может быть каждый раз разный, поскольку генерируется на основе
> существующего uuid.
> 
> Описание из интернета:
> """
> NVMe Qualified Name (NQN) используется для идентификации удалённого целевого
> хранилища NVMe в протоколе NVMe over Fabrics.
> 
> Этот протокол предназначен для взаимодействия между хостом и системой
> хранения по сети.
> """
> 
> Это имя по определению не может изменяться.

Проблема в том, что на однотипных моделях серверов, этот NQN идентичный, и не позволяет добавить несколько серверов на СХД (СХД требует, чтобы NQN был уникальным).
Comment 3 Oleg Kolesnichenko 2025-05-06 17:26:33 MSK
NQN для хостов - это уникальные номера инициаторов для СХД, они должны быть разными.
В описании утилиты недвусмысленно написано "Generate a random host NQN". Описание не соответствует функционалу. Например, на Debian, эта команда каждый раз выдаёт разный номер.
Comment 4 Alexander Makeenkov 2025-05-07 09:43:35 MSK
Проверил в:
 - fedora - генерируется каждый раз одно и то же значение;
 - ubuntu - генерируется каждый раз разное значение;
 - alt server (обновлён до sisyphus) - генерируется каждый раз одно и то же значение.
Comment 5 Konstantin A Lepikhov (L.A. Kostis) 2025-07-08 17:58:10 MSK
https://github.com/linux-nvme/libnvme/blob/4cef519924249d543555c6cdd43e4c51e41fcf54/src/nvme/fabrics.c#L1430:

char *nvmf_hostid_generate()
{
	int ret;
	char uuid_str[NVME_UUID_LEN_STRING];
	unsigned char uuid[NVME_UUID_LEN];

	ret = uuid_from_dmi(uuid_str);
	if (ret < 0)
		ret = uuid_from_device_tree(uuid_str);
	if (ret < 0) {
		if (nvme_uuid_random(uuid) < 0)
			memset(uuid, 0, NVME_UUID_LEN);
		nvme_uuid_to_string(uuid, uuid_str);
	}

	return strdup(uuid_str);
}
...
char *nvmf_hostnqn_generate_from_hostid(char *hostid)
{
	char *hid = NULL;
	char *hostnqn;
	int ret;

	if (!hostid)
		hostid = hid = nvmf_hostid_generate();

	ret = asprintf(&hostnqn, "nqn.2014-08.org.nvmexpress:uuid:%s", hostid);
	free(hid);

	return (ret < 0) ? NULL : hostnqn;
}

если вы считаете данное поведение неправильным, то советую озадачить этим авторов libnvme.