Из всех моих исследований и попыток я бы сказал, что невозможно создать программу, которая генерировала бы уникальный идентификатор, соблюдая следующие ограничения .
Здесь я представлю свою попытку с MAC-адресами.
Целью здесь было найти способ получить адреса всех физических сетевых интерфейсов. Как обычный пользователь, я видел, что самый простой способ найти MAC-адреса - это прочитать системные файлы в каталоге «/ sys». Эти файлы доступны начиная с Linux 2.6, так что это прекрасно.
Мои исследования привели меня к следующим сводам правил: https://www.kernel.org/doc/Documentation/sysfs-rules.txt
Использование библиотеки udev, как рекомендовано в этих правилах, невозможно, потому что она должна быть добавлена извне. Итак, я погрузился в источник, который можно найти здесь: http: //cgit.freedesktop.org / systemd / systemd / tree / src / libudev
Из этого я понял, что для получения MAC-адресов вы должны искать "sys / subsystem", если они есть, то найдите в нем каталог "net", и вы найдете каталоги с каждым сетевым интерфейсом. Если папки «subsystem» нет, вам нужно поискать в папках «sys / class», «sys / bus» и «sys / block» каталог «net». На самом деле, я всегда находил их в «классе», но правила говорили, что этого не следует ожидать.
Выше я сказал, что в папке "net" вы найдете сетевые каталоги, это не совсем так. В linux 2.6 (я использовал RHEL 4) это каталоги, и внутри вы найдете, среди прочего, "адресный" файл, содержащий MAC-адрес, символическую ссылку, нацеленную на каталог в "sys / devices". Если в более поздних версиях Linux это будет прямая символическая ссылка на каталог в «/ sys / devices», в котором вы найдете файл «address». (Я пробовал на RHEL 6, Debian 7, Debian 8, Ubuntu 15 и Ubuntu 15 с обновленным ядром до Linux 4.3)
Я никогда не видел каталог «/ sys / subsystem» даже в новой версии Linux (4.3).
Новый макет sysfs (> = linux 3): Чтобы отличить физический интерфейс от виртуального, я хотел посмотреть путь к устройству. Символическая ссылка, которая у меня есть в "/ sys / class / net", ведет к этим каталогам:
eth1 был фиктивным виртуальным ником, который я создал после этой темы: Как я могу создать виртуальный интерфейс Ethernet на машина без физического адаптера?
Итак, вы можете видеть, что виртуальный находится в «виртуальной» папке, так что это будет способ отличить их друг от друга.
Старый макет sysfs (linux 2.6 ):
Виртуальный сетевой интерфейс не имеет символической ссылки "устройство" в своих каталогах.
Вы найдете "/ sys / class / net / eth0 / device -> / sys / devices ...." Но если был виртуальный eth1, такой символической ссылки в "/ sys / class / net / eth1" не было.
Итак, в целом, используя "opendir", "readdir", "access ('...', F_OK) "," fopen ".. вы можете получить MAC-адреса только физических интерфейсов.
Затем просто отсортируйте их, чтобы вы были уверены, что они будут в том же порядке, а затем добавьте все в буфере и используйте SHA1 из openssl, сделайте небольшой синтаксический анализ, чтобы он выглядел как UUID, и все готово.
B Но дело в том, что я не хотел полагаться на тот факт, что на пути разработчика к сетевому устройству будет «виртуальная» папка. В правилах, ссылки на которые приведены выше, никогда не говорится, что так будет всегда. Так что на проблему нельзя ответить таким образом.
Надеюсь, что все мои исследования кому-то помогут.