/etc/machine-id это уникальный персистентный идентификатор ноды. По крайней мере с точки зрения systemd. Формально считается private data, о чём нам "подсказывают" права 0644. Иными словами напрямую не должно экпозироваться или принимать участе в идентификации хоста или каких бы то ни было данных с него.

Утилиты генерации этого id штатно присутствуют только в наборе утилит systemd.

systemd-machine-id-setup предполагается к использованию во время инсталляции ОС.

systemd-firstboot предполагается к использованию для генерации образов lxc, docker, виртуальных машин

Также (в системах с systemd) существует соответствующий сервис systemd-machine-id-commit.service, который записывает /etc/machine-id (если такового не существует) как только /etc становится доступен на запись.

До версии systemd v30 идентификатор представлял из себя строку из 32 символов + символ переноса строки (\n). Самое интересное написано в конце вышеупомянутой ссылки - этот самый machine-id может быть симлинком и указывать на /var/lib/dbus/machine-id, который генерируется dbus-ом. То есть один из вариантов изобразить корректный machine-id будет:

cp /var/lib/dbus/machine-id /etc/machine-id

Если хочется сделать симлинк, то src имеет смысл брать с /etc/machine-id, так как в современных системах именно этот файл используется для идентификации систем (несмотря на то, что там думает пакет dbus).

ln -s /etc/machine-id /var/lib/dbus/machine-id

Тем не менее, после 30-й версии этот самый machine-id поменял формат и ныне записывается как v4 UUID (только без знаков "-" исходя из того, что выдаёт systemd-machine-id-setup). И, как ни странно, это тоже строка из 32 символов + символ переноса строки (\n).

Конкретно в случае systemd-machine-id-setup источником данных служит random number generator. И исходя из этих сведений /etc/machine-id можно с довольно высокой точностью изобразить командой:

uuidgen | tr -d '-' >/etc/machine-id

И, наконец, ещё одной альтернативой может стать команда

dbus-uuidgen --ensure=/etc/machine-id

которая генерирует файл /etc/machine-id, если его нет, или перегенерирует его, если он в неправильном формате.

В качестве замечания не по теме: в некоторых системах есть /etc/hostid. Процесс его генерации вроде как отдаётся на откуп системному администратору. Чтобы никто не остался без внимания, имеет смысл сделать его содержимое таким же как и /var/lib/dbus/machine-id. И далее поддерживать все 3 файла одинаковыми.

К чему всё это?, кому (кроме systemd и dbus) вообще нужен этот machine-id?

Внезапно, google chrome (и все его производные, в т.ч. обёртки для всяких электронов) хочет /etc/machine-id и если не находит, то, похоже начинает потреблять чуть больше CPU. Но про cpu эт не точно.

Gnumeric хочет видеть /etc/machine-id. Каковы последствия не нахождения - мне неизвестно.

Также масса разных проприетарных программ ориентируется на эти данные для идентификации хоста, на котором запущен инстанс программы, например, для целей лицензирования.

Такой вот интересный атрибут systemd, обретший массовую популярность самым внезапным образом.

Next Post