The Life of a Block Device: Seven Names for One Disk, and Not One of Them Is Both Stable and Unique

ByLinuxtastic

September 6, 2026

A backup disk is mounted at /srv/archive. The mount is clean, the machine has been up for weeks, findmnt --verify gives it four ticks and a success line, and the newest file in there is from June, because the nightly backups have been landing on a different disk. Two attached disks carry the same filesystem UUID. /dev/disk/by-uuid/ is a directory, a directory holds one entry per name, so one disk gets the name and the other gets nothing: no broken link, no warning, no entry. mount UUID= and the fstab line reach whichever disk won, exit 0, and everything about the result looks correct. That happens because a UUID is a value written inside the filesystem, in the superblock, and so it is copied by anything that copies the filesystem: a VM clone, an image restore, dd, a snapshot attached beside its origin.

Every name a Linux disk has is either a value stored inside the disk, and so copied with it, or a description of the slot it is plugged into, and so changed by moving it. The one name that is neither is reset at every boot and may not be used in fstab. No name your disk has is both stable across a move and unique across a copy. “Always use the UUID” answers the instability half and hands you the collision half.

This page follows one disk through the eight stages between the kernel noticing it and a person asking which physical device they are looking at, measured on Ubuntu 24.04 with systemd/udev 255.4, util-linux 2.39.3 and e2fsprogs 1.47.0. The mechanism finishes at stage five. The question does not.

The eight stages, and what each one can hand you.

  1. The device appears — the kernel assigns the only two names nothing in userspace can influence.
  2. The probe — udev reads two entirely different places on the disk and derives four families of name from them.
  3. Arbitration — one name, one slot, one winner. This is where a duplicate stops being visible.
  4. The lookup — something turns a name back into a device. There is one arbiter and everything on the machine is downstream of it.
  5. The mount — and the filesystem check that was aimed at the same symlink.
  6. The dependents — everything that now believes it knows which disk this is.
  7. The diagnosis — asking the machine which disk you actually got, and the commands that cannot answer.
  8. The other copy — the disk that also carries this name, which is somewhere else and is where the fault was created.

The reading. Not “what is this disk called” — every tool answers that. Ask instead: of the names udev gave this disk, do they all still point back at it?

dev=/dev/sdb1          # the device you are asking about

udevadm info -q symlink -n "$dev" | tr ' ' '\n' |
  grep -v '^disk/by-diskseq/' |
  while read -r l; do
    printf '%-58s -> %s\n' "/dev/$l" "$(readlink -f "/dev/$l")"
  done

On a healthy disk every line ends in the device you named. Any line that does not is the finding, and it names the device that took the name.

What comes backWhat it meansGo to
Every line resolves back to $devNothing is contesting this disk’s names. Whatever is wrong is downstream of namingStage 5. The mount, the unit, the dependents
A by-uuid or by-label line resolves to a different deviceTwo disks carry one identity and this one lost. The winner is named in the outputStage 3, then stage 8. Something copied a filesystem
Only by-diskseq — no by-uuid, no by-label, no by-partuuidNothing probed a filesystem here. There is no signature to derive a name fromStage 2. blkid -p and wipefs -n on the raw device
It holds a name it did not hold yesterdayThe previous holder was detached and the name moved rather than breakingStage 8. There is another copy and it has just left the building

Two limits, stated up front. This needs udevadm, so it does not work in an initramfs, a rescue shell or a chroot — which are three of the places where the answer is different, because that is exactly where the symlinks are absent and a fallback scan chooses instead. And it tells you which device holds a name; it cannot tell you which of two identical filesystems is the one you wanted. That is stage 8, and it is off this machine by construction.

Stage 1 — the device appears

When the kernel registers a disk it assigns two names, and neither can be influenced from userspace.

loop0        7:0
loop0p1      259:0
loop0p2      259:1
diskseq: 24

The major:minor pair is the primary key; every other name on this page is an alias that resolves to it. diskseq is a counter that only increases, is never reused within a boot, and resets to 1 when the machine reboots.

udev does not create /dev. devtmpfs creates the node the moment the kernel registers the disk; udev then fixes its ownership and mode and adds symlinks. A node udev has not reached yet is brw------- root root; afterwards it is brw-rw---- root disk. So the node is openable before any name for it exists, which is how a program racing udev at boot finds a disk it cannot name.

Kernel names are recycled and diskseq is not. Attaching and detaching the same image five times:

attach 1: kernel name=/dev/loop0  diskseq=201  fs UUID=1feed34c-...
attach 2: kernel name=/dev/loop0  diskseq=203  fs UUID=1feed34c-...
attach 3: kernel name=/dev/loop0  diskseq=205  fs UUID=1feed34c-...
attach 4: kernel name=/dev/loop0  diskseq=207  fs UUID=1feed34c-...
attach 5: kernel name=/dev/loop0  diskseq=209  fs UUID=1feed34c-...

The kernel name repeats. The filesystem UUID repeats. diskseq never does. It is the only guaranteed-unique name the machine has, and the one you cannot use, because it means nothing after a reboot.

Stage 2 — the probe

udev’s work here starts with one rule:

# 60-persistent-storage.rules
KERNEL!="sr*|mmcblk[0-9]boot[0-9]", IMPORT{builtin}="blkid"

That builtin reads two different places on the disk. The filesystem superblock gives the ID_FS_* properties; the partition table gives the ID_PART_ENTRY_* ones. udevadm info shows the split:

ID_FS_LABEL=rootfs
ID_FS_TYPE=ext4
ID_FS_UUID=12345678-1111-1111-1111-111111111111         <- inside the filesystem
ID_PART_ENTRY_NAME=rootpart
ID_PART_ENTRY_UUID=aaaaaaaa-0001-0001-0001-000000000001  <- in the partition table
ID_PART_TABLE_UUID=11111111-2222-3333-4444-555555555555  <- in the GPT header

Five rules turn those properties into symlinks, and they are the entire naming system:

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*",
    SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_LABEL_ENC}=="?*",
    SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"
ENV{ID_PART_ENTRY_UUID}=="?*",
    SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*",
    SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
ENV{DISKSEQ}=="?*", ENV{ID_IGNORE_DISKSEQ}!="1",
    SYMLINK+="disk/by-diskseq/$env{DISKSEQ}$env{.PART_SUFFIX}"

crypto in the first two is why a LUKS container has a by-uuid entry before it is unlocked, and why crypttab can use UUID=. A sixth family, by-path, comes from the path_id builtin, which is skipped for virtual devices.

For each family: where does the value live, and what changes it?

FamilyThe value lives inSurvives a dd clone?Survives a move to another port?Allowed in fstab?
by-uuidThe filesystem superblockYes — identicallyYesYes
by-labelThe filesystem superblockYes — identicallyYesYes
by-partuuidThe GPT partition entryYes — identicallyYesYes
by-partlabelThe GPT partition entryYes — identicallyYesYes
by-idThe device’s own firmwareNo — a clone is a different deviceYesYes
by-pathThe sysfs bus topologyNoNoYes
by-diskseqThe kernel, per bootNoNoNo — resets at boot

The four families anybody puts in fstab are content-derived, so a clone duplicates all four at once. The two a clone cannot duplicate describe hardware, and by-path describes a slot:

$ udevadm test-builtin path_id /sys/block/vda
ID_PATH=pci-0000:00:02.0
$ udevadm test-builtin path_id /sys/block/vdb
ID_PATH=pci-0000:00:03.0

Nothing in that came off the platter. by-path is unique and not stable, which is the /dev/sdb failure under a more respectable name. by-diskseq is unique and unforgeable and meaningless after a reboot. There is no fourth option.

Change one thing and see which names move:

You do thisby-uuidby-labelby-partuuidKernel namediskseq
tune2fs -L newnameunchangedmovesunchangedunchangedunchanged
tune2fs -U newuuidmovesunchangedunchangedunchangedunchanged
mkfs the partitionnew valuenew valueunchangedunchangedunchanged
Detach and re-attachunchangedunchangedunchangedreusednew
dd the whole diskduplicatedduplicatedduplicatedn/adistinct
Move it to another portunchangedunchangedunchangedmay changenew

The mkfs row is the one argument for PARTUUID= that survives this page: reformatting gives the filesystem a new UUID and leaves the partition’s own GUID alone, so PARTUUID= survives a reformat where UUID= does not. It buys nothing against a clone.

Stage 3 — arbitration

Take one ext4 filesystem, write a marker into it, unmount it, copy the whole disk with dd if=/dev/sda of=/dev/sdb, write a different marker into the copy, and attach both, settling udev between each step. This is the best case for the tooling.

ORIGINAL is /dev/loop0
  /dev/disk/by-uuid/ right now:
    aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee -> ../../loop0

CLONE    is /dev/loop1
  /dev/disk/by-uuid/ right now:
    aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee -> ../../loop1

The name moved the instant the second disk appeared. Then:

$ blkid -U aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
/dev/loop1
$ mount UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee /mnt/payroll
$ cat /mnt/payroll/marker
I AM THE CLONE - stale copy from three months ago

Exit 0 throughout. findmnt on that mount point reports the device, the type, the UUID and the label, every column correct and every column useless.

The winner is deterministic. Each symlink name is a directory under /run/udev/links/ holding one entry per claiming device with its link priority. At equal priority udev takes the most recently processed device. Over ten rounds, five with the clone attached first and five with the original first, the second device processed won every time. The order itself is a race between disks spinning up at speeds nobody controls.

udev knows there are two, and records it:

$ ls -l '/run/udev/links/disk\x2fby-uuid\x2faaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/'
b7:0 -> 0:/dev/loop0
b7:1 -> 0:/dev/loop1

Two claimants, both at link priority 0. The information exists on the machine. It is not in /dev, which is the only place anybody is told to look.

Unplugging the winner does not break the name. It moves it. Detach the disk holding the symlink and udev re-points the name at the surviving claimant. The link does not dangle. The next mount succeeds against different data with no error at any point in the transition.

Stage 4 — the lookup

mount UUID= does not search the block devices when udev is running. blkid(8) documents the order as EVALUATE=udev,scan: /dev/disk/by-* first, and a scan of /proc/partitions only if that fails. A stock install has no /etc/blkid.conf, so the compiled-in default applies.

The test is to force the symlink at the disk udev did not choose, then delete it, changing nothing else:

--- STEP 1: point the symlink at the OTHER disk (/dev/loop0) ---
  symlink now  -> /dev/loop0
  blkid -U     -> /dev/loop0
  findfs       -> /dev/loop0
  mount UUID=  -> /dev/loop0, containing DISK-ONE

--- STEP 2: delete the symlink. Nothing else changes. ---
  symlink      -> (absent)
  blkid -U     -> /dev/loop1
  findfs       -> /dev/loop1
  mount UUID=  -> /dev/loop1, containing DISK-TWO

Same tag, same two disks, different data mounted, and the only difference is one symlink. An absent symlink is the normal state of every initramfs before udev has settled, every rescue shell, every chroot and every container. The same fstab line can reach different disks depending on where you are standing when it runs.

systemd-fstab-generator never resolves a UUID itself. Run against a four-line fstab using four spellings, it emits:

mnt-payroll.mount   What=/dev/disk/by-uuid/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
mnt-bylabel.mount   What=/dev/disk/by-label/payroll
mnt-bypart.mount    What=/dev/disk/by-partuuid/aaaaaaaa-0001-0001-0001-000000000001
mnt-bydev.mount     What=/dev/sdb1

All four spellings become a path, three of them under /dev/disk/. systemd waits for udev to publish that path and then trusts it. So there is one arbiter with one slot per name, and mount, blkid -U, findfs and the generated unit are all downstream of it. The question “which disk will this line reach?” therefore has one answer you can look up right now.

Stage 5 — the mount

The generated unit also carries an ordering dependency on the device and a filesystem check:

After=blockdev@dev-disk-by\x2duuid-aaaaaaaa\x2d....target
Requires=systemd-fsck@dev-disk-by\x2duuid-aaaaaaaa\x2d....service

The boot-time fsck is aimed at the symlink too. It checks whichever filesystem currently holds that name, before the mount, and it will repair the clone.

Then mount(2) returns 0, the kernel attaches a superblock at a mount point, and /proc/self/mountinfo gains a line. As far as the operating system is concerned, this story is finished. Both disks are mounted, both are healthy, nothing has failed.

Stage 6 — the dependents

Once a filesystem is mounted, a queue of things forms behind it. Each one inherits the naming decision without re-checking it.

  • Everything in fstab underneath it. A mount ordered After= this one — a bind mount, a nested data directory, a x-systemd.requires= chain — attaches to whatever came up, not to what you meant.
  • Every service with RequiresMountsFor= on that path. The dependency is satisfied by a mount at that path, not by the right one. A database that starts against a three-month-old copy of its data directory starts cleanly.
  • Your backup job. It writes into a path, and the path exists, and the write succeeds.
  • crypttab, which uses the same namespace. A LUKS container gets a by-uuid entry before it is unlocked, and unlocking it creates a second name — /dev/mapper/<name> — in a namespace udev does not arbitrate at all, because that name was chosen by whoever wrote crypttab.
  • LVM, which is the one layer here that anticipated this. See below.

What each of those layers does to your bytes belongs to The Life of a Write. What matters here is what each layer is called, and one measured contrast covers the stage.

Attach two disks carrying the same identity and ask each subsystem what it sees. ext4 says nothing: lsblk -f prints two rows with the same UUID, blkid prints two lines, both mount, both exit 0. btrfs says nothing at the identity layer either, though btrfs filesystem show lists one filesystem with Total devices 1 and names only the first disk. LVM says this on every pvs, vgs and lvs you run:

WARNING: Not using device /dev/loop1 for PV eeee00-0000-...-000004.
WARNING: PV eeee00-0000-...-000004 prefers device /dev/loop0 because
         device name matches previous.
  PV         VG        Fmt  Attr PSize  PFree
  /dev/loop0 shared_vg lvm2 a--  60.00m 60.00m

It names the duplicate, the device it rejected, the device it chose, and its tie-breaking rule. “Linux is silent about duplicate identities” is not a law. One layer handles a situation its authors anticipated and another layer does not.

Stage 7 — the diagnosis

Nine fstab entries on one machine, one correct and eight broken in different ways, then every recommended command run once across all nine.

  • F1 control, correct in every way · F2 duplicate UUID, two attached disks carry it · F3 the disk is not plugged in · F4 a typo, last character wrong · F5 wrong fstype, disk is ext4 and fstab says xfs
  • F6 duplicate LABEL, two disks labelled backup · F7 the mount point directory does not exist · F8 shadowing, the mount point already contains files · F9 the signature was wiped after fstab was written

Three different situations produce a byte-identical message.

mount: /mp/f3: can't find UUID=33333333-0000-0000-0000-000000000003.
mount: /mp/f4: can't find UUID=44444444-0000-0000-0000-00000000000X.
mount: /mp/f9: can't find UUID=88888888-0000-0000-0000-000000000008.

The disk is not connected, you made a typo and the filesystem was destroyed differ only in the UUID quoted back at you. From mount‘s side they are one condition: the tag did not resolve. findmnt --verify collapses all three the same way, to [E] unreachable on boot required source.

Four of the nine are indistinguishable, and three of those four lose or hide data. findmnt --verify --verbose, the standard pre-reboot check, on four of the entries:

/mp/f1                                    <- CONTROL, correct
   [ ] target exists
   [ ] UUID=11111111-... translated to /dev/loop0
   [ ] source /dev/loop0 exists
   [ ] FS type is ext4
/mp/f2                                    <- DUPLICATE UUID
   [ ] target exists
   [ ] UUID=22222222-... translated to /dev/loop2
   [ ] source /dev/loop2 exists
   [ ] FS type is ext4
/mp/f6                                    <- DUPLICATE LABEL
   [ ] target exists
   [ ] LABEL=backup translated to /dev/loop6
   [ ] source /dev/loop6 exists
   [ ] FS type is ext4
/mp/f8                                    <- SHADOWING
   [ ] target exists
   [ ] UUID=77777777-... translated to /dev/loop7
   [ ] source /dev/loop7 exists
   [ ] FS type is ext4

Four identical reports, four ticks each. One is healthy. When the machine boots, the other three mount a stale clone, mount the wrong one of two disks labelled backup, and hide a directory of files that was already there. With only the duplicate entry present, the command ends with Success, no errors or warnings detected and exits 0. It cannot do otherwise: it asks libblkid to translate the tag, and libblkid’s answer is a single device path. There is nowhere in that conversation for the word “two” to appear.

The whole grid, scored:

CommandF1 okF2 dup UUIDF3 absentF4 typoF5 fstypeF6 dup LABELF7 no dirF8 shadowF9 wiped
lsblk -fcleantwo rows, same UUID, unflaggedabsentcleancleantwo rows, same LABELcleancleanblank row
blkidlistedtwo lines, same UUIDabsentlistedlistedtwo lineslistedlistedabsent
ls /dev/disk/by-uuid/1 entry1 entryabsentabsent1 entry1 each1 entry1 entryabsent
findmnt --verify4 ✓4 ✓[E][E][W]4 ✓[E]4 ✓[E]
findmnt --fstab --evaluatedevicedeviceblankblankdevicesame device twicedevicedeviceblank
mount -a --fakeokokfailsfails“mounted”ok“mounted”okfails
mount -aokokfailsfailsfailsokfailsokfails
systemd-analyze verifysilentsilentsilentsilentsilentsilentsilentsilentsilent

lsblk -f contains the answer and does not present it. Two rows carry the same thirty-six-character UUID, and finding them means comparing every row against every other by eye. blkid is worse for this: its output is in cache order, so two identical UUIDs can sit four unsorted lines apart.

mount -a --fake is more reassuring than the real thing. It reported successfully mounted for the entry with the wrong fstype and for the entry whose mount point did not exist, both of which the real mount -a refuses. It resolves the tag and stops.

systemd-analyze verify said nothing about any of the nine, including the generated unit containing What=/dev/disk/by-uuid/NOT-A-UUID-AT-ALL, and exited 0.

findmnt --fstab --evaluate is the best tool here. It prints the device each line will actually reach and leaves the source blank for the lines that will not resolve, which separates the three identical error messages. On the duplicate-label entry it printed the same device on two different lines, which is visible. Run it before a reboot:

findmnt --fstab --evaluate      # what each line actually reaches
findmnt --verify --verbose      # the checks it can do, which are not these

Nothing reports the shadowing case. F8 destroys nothing and hides everything, and not one command in the grid mentions it. findmnt --verify had the mount point in its hand and did not look inside it.

Stage 8 — the other copy

Stages 1 to 7 happen on the machine in front of you. This one does not. A duplicate identity is created by a clone, a restore or a dd performed somewhere else, possibly months earlier, possibly by somebody who has since left. There is one way to stop it recurring: the moment a second copy of a filesystem exists, one of the two needs a new UUID before both are ever attached to the same machine.

The command everybody publishes for that does not work on a current system:

$ sudo tune2fs -U random /dev/sdc1
tune2fs 1.47.0 (5-Feb-2023)
Setting the UUID on this filesystem could take some time.
Proceed anyway (or wait 5 seconds to proceed) ? (y,N) y
This operation requires a freshly checked filesystem.

Please run e2fsck -fD on the filesystem.

e2fsprogs 1.47.0 refuses on any filesystem last mounted more recently than it was last checked, which is every filesystem you have ever used. The working sequence is two commands, and the check is not optional:

sudo e2fsck -f /dev/sdc1        # must be unmounted
sudo tune2fs -U random /dev/sdc1
sudo blkid /dev/sdc1            # write the new value into fstab

With metadata_csum the UUID is folded into every metadata checksum on the filesystem, so changing it means rewriting all of them, and the tool will not do that to a filesystem it has not just verified. A filesystem created with -O metadata_csum_seed stores the seed once and changes its UUID instantly. Set that flag at mkfs time on images that will be cloned.

Then update every reference: fstab on the machine that will use the disk, crypttab if a container is involved, and any RequiresMountsFor= or x-systemd.requires= that names the old value. The old value is still inside the other copy, wherever that is. Restoring a Linux Server owns the neighbouring problem, two machines the network cannot tell apart through machine-id and SSH host keys; this page owns two block devices that one machine cannot tell apart. A server restored from an image has probably created both at once.

A worked diagnosis

Back to the backup disk from the top of the page: mounted at /srv/archive, clean, weeks of uptime, newest file from June. Nothing has failed and nothing has alerted.

$ findmnt /srv/archive
TARGET       SOURCE     FSTYPE OPTIONS
/srv/archive /dev/sdc1  ext4   rw,relatime
$ sudo findmnt --verify --verbose | tail -6
/srv/archive
   [ ] target exists
   [ ] UUID=9f2c1a44-... translated to /dev/sdc1
   [ ] source /dev/sdc1 exists
   [ ] FS type is ext4
Success, no errors or warnings detected

Four ticks and a success line. What has been established: the tag resolves to a device, and the device exists. Not that it resolves to the device you meant, and not that it resolves uniquely. This command asks neither question.

$ dev=/dev/sdc1
$ udevadm info -q symlink -n "$dev" | tr ' ' '\n' | grep -v '^disk/by-diskseq/' |
    while read -r l; do printf '%-58s -> %s\n' "/dev/$l" "$(readlink -f "/dev/$l")"; done
/dev/disk/by-uuid/9f2c1a44-3b7e-4c19-8a05-2d6f1e904bb2   -> /dev/sdd1
/dev/disk/by-label/archive                               -> /dev/sdd1
/dev/disk/by-partuuid/7c1e0a92-0001-...                  -> /dev/sdd1
/dev/disk/by-id/wwn-0x5000c500a1b2c3d4-part1             -> /dev/sdc1
/dev/disk/by-path/pci-0000:00:1f.2-ata-3-part1           -> /dev/sdc1

Three of this disk’s five names are held by a different device. The two it still owns are the two not derived from its contents: its firmware serial and its bus slot. That pattern is the signature of a clone. /dev/sdd1 holds the names, so /dev/sdd1 is what an fstab line naming that UUID reaches. The mounted disk is the loser, mounted by something that named it directly.

$ ls -l '/run/udev/links/disk\x2fby-uuid\x2f9f2c1a44-3b7e-4c19-8a05-2d6f1e904bb2/'
b8:33 -> 0:/dev/sdc1
b8:49 -> 0:/dev/sdd1
$ sudo mount -o ro /dev/sdd1 /mnt/check && ls -t /mnt/check | head -2
2026-09-05.tar.zst
2026-09-04.tar.zst

Two claimants at equal priority, and the backups have been running perfectly onto /dev/sdd1, the disk that holds the name. Somebody added a second drive in June and seeded it by cloning the first. Since then the timer has written to whichever disk the fstab line reached and a human has been reading the one that was already mounted.

The fix is stage 8, in order. Unmount both. e2fsck -f then tune2fs -U random on the one you are keeping as the second copy. Put the new UUID in fstab. Then, before rebooting, findmnt --fstab --evaluate: the command that would have shown two lines reaching one device, and will now show two lines reaching two.

Deciding the contest yourself

udev built for collisions twice. /run/udev/links/ records every device wanting a name, with its priority, which is how stage 3 could show both disks. And udev(7) documents a knob for deciding the contest rather than leaving it to arrival order:

# /etc/udev/rules.d/10-local-disk-priority.rules
ENV{ID_SERIAL_SHORT}=="WD-1A2B3C4D", OPTIONS+="link_priority=100"

Highest priority wins, so the winner becomes a decision rather than a race. It is half a fix: the knob requires you to already suspect there is a contest, and the database that would tell you is in /run rather than /dev, and the man page for the knob does not point at it. Two things stay out of reach on any machine: how many other copies of this identity exist unattached, in a drawer or in object storage, and which of two disks will win after the next reboot.

Before you call it done

  • findmnt --fstab --evaluate run before the reboot, and every line reaching a different device
  • The hinge run against any disk you have cloned, restored or snapshotted — all of its names resolving back to it
  • Any second copy given a new UUID with e2fsck -f then tune2fs -U random, before both are ever attached to one machine
  • nofail and x-systemd.device-timeout= on every non-essential entry, so a missing disk is a warning rather than an emergency shell
  • The mount point checked to be empty before it is mounted over — nothing else on the machine will tell you
  • A mkfs that will be cloned given -O metadata_csum_seed, so the copy’s UUID can be changed in a second rather than a full check
  • Something that watches the content — the age of the newest file — rather than the mount, because a mount succeeding is not evidence about which disk it reached

Related reading