You might really want to track machines in your fleet, in a way that persists across reboots. Let's say you can access a machine remotely but you got all your ethernet cables tangled up, so you don't know which physical machine you SSHed into.
Or if you are being concerned about being tracked by a third party, you don't want this identifier to exist at all, even if it doesn't persist through reboots.
I agree there are other solutions in both cases.
Machine IDs are stored in several places, some of which are not even files.
* http://jdebp.uk./Softwares/nosh/guide/commands/machine-id.xm...
They can be resurrected if not all storage locations are dealt with. Moreover, some systems use things like the SMBIOS product UUID.
* http://jdebp.uk./Softwares/nosh/guide/commands/setup-machine...
The correct approach is not deleting files.
* http://jdebp.uk./Softwares/nosh/guide/commands/erase-machine...
* https://lists.debian.org/debian-user/2019/03/msg00550.html
So at boot, one would run "erase-machine-id". Then create a random 30-character hexadecimal number. And then either set "the systemd.machine_id= kernel command line parameter" to it. Or pass it via "the option --machine-id= to systemd".
% system-control cat machine-id
start:#!/bin/nosh
start:true
stop:#!/bin/nosh
stop:envdir env
stop:erase-machine-id
run:#!/bin/nosh
run:#Set up and tear down the machine ID
run:envdir env
run:setup-machine-id
restart:#!/bin/sh
restart:exec false # ignore script arguments
%So "setup-machine-id". Does that generate a value that's unrelated to any preexisting versions, analogs, etc?
I ask because, when I deleted /etc/machine-id and ran "systemd-machine-id-setup", it generated a new machine-id by copying the D-Bus machine ID.
Edit: OK, so I created a Debian VM, noted /etc/machine-id, deleted it, and rebooted. And found that it was still missing.
Running systemd-machine-id-setup generated a new machine-id from the D-Bus machine ID. And it was the same as the initial one.
But I also see in man machine-id:
> The machine-id may also be set, for example when network booting, by setting the systemd.machine_id= kernel command line parameter or passing the option --machine-id= to systemd. A machine-id may not be set to all zeros.
dd if=/dev/urandom bs=1 count=16 | hexdump
Give you something that you can use?
38d05397c25548b4f4bda7751b5062
... and ... $ FOO=`cat /dev/urandom | tr -dc a-z0-9 | head -c${1:-30}`
$ echo $FOO
6we4gvnmx00w208ffty6i11m82rw6d
But I have no clue whether systemd would be happy with that. Maybe later I can test more.Edit: Oops. Make that ...
$ FOO=`cat /dev/urandom | tr -dc abcdef0-9 | head -c${1:-30}`
$ echo $FOO
b486935dbb9e9fe603328a19e2b5b4Something like:
$ pwgen -1s 31
qHfKU46H2RA2WUr0EZ1zBHfIBLKZKuT
> The /etc/machine-id file contains the unique machine ID of the local system that is set during installation. The machine ID is a single newline-terminated, hexadecimal, 32-character, lowercase ID. When decoded from hexadecimal, this corresponds to a 16-byte/128-bit value.
> The machine ID is usually generated from a random source during system installation and stays constant for all subsequent boots. Optionally, for stateless systems, it is generated during runtime at early boot if it is found to be empty.
So if that works for "stateless systems", why can't all machines be "stateless systems"?