Persistent mount points for USB drives on Linux sound simple on the surface—“plug in a drive and mount it in the same place every time”—but the underlying behavior of the kernel, udev, and the block‑device subsystem makes it surprisingly tricky. The problem boils down to device names not being stable, and Linux treating USB storage as ephemeral, hot‑swappable hardware.
/dev/sdX names are not stableWhen you plug in a USB drive, the kernel assigns it a device name like:
/dev/sda
/dev/sdb
/dev/sdc
…but these names depend on enumeration order, not identity.
So if:
…the same physical USB drive might become /dev/sdb one day and /dev/sdc the next.
Any fstab entry that relies on /dev/sdX will break.
Many cheap USB sticks ship with:
This makes it hard for Linux to uniquely identify them.
USB devices can appear and disappear at any time.
Linux treats them as transient, so it doesn’t automatically create persistent mount points.
Linux can mount USB drives persistently, but only if you tell it how:
Without that, the system defaults to non‑persistent behavior.
To fix this, we need to identify the stable identifiers for these devices and mount them in /etc/fstab. I have three USB drives attached.
Start by plugging in your USB devices and listing all the block devices:
lsblk -f
You will see lines like:
sdc └─sdc1 ext4 1.0 Partition_1 1690ebcc-1bdd-445a-9a65-d4083733526c sdd └─sdd1 exfat 1.0 Partition_1 ECBD-BB3B sdf └─sdf1 ext4 1.0 3a433743-d985-4441-980f-16a6cfd5ae41
You'll need sdc1, sdd1, and sdf1. You'll also need the filesystem type (ex. ext, extfat).
Now run:
ls -l /dev/disk/by-id/ | grep sdc1 ls -l /dev/disk/by-id/ | grep sdd1 ls -l /dev/disk/by-id/ | grep sdf1
You'll see lines like:
lrwxrwxrwx 1 root root 10 Jan 17 04:01 usb-Seagate_BUP_Slim_BK_NA7GP210-0:0-part1 -> ../../sdc1 lrwxrwxrwx 1 root root 10 Jan 16 08:18 usb-Seagate_Expansion_Desk_NA4LVM04-0:0-part1 -> ../../sdd1 lrwxrwxrwx 1 root root 10 Jan 17 04:01 usb-SABRENT_SABRENT_DB9876543213A-0:0-part1 -> ../../sdf1
You'll need this:
usb-Seagate_BUP_Slim_BK_NA7GP210-0:0-part1 usb-Seagate_Expansion_Desk_NA4LVM04-0:0-part1 usb-SABRENT_SABRENT_DB9876543213A-0:0-part1
Create mountpoints for them:
mkdir /mnt/3TB-USB mkdir /mnt/1TB-USB mkdir /mnt/300GB-USB
Now add these three lines to /etc/fstab:
/dev/disk/by-id/usb-Seagate_Expansion_Desk_NA4LVM04-0:0-part1 /mnt/3TB-USB exfat defaults,nofail,x-systemd.device-timeout=30 0 2 /dev/disk/by-id/usb-SABRENT_SABRENT_DB9876543213A-0:0-part1 /mnt/1TB-USB ext4 defaults,nofail,x-systemd.device-timeout=30 0 2 /dev/disk/by-id/usb-Seagate_BUP_Slim_BK_NA7GP210-0:0-part1 /mnt/300GB-USB ext4 defaults,nofail,x-systemd.device-timeout=30 0 2
This is what the options mean:
defaults Standard mount options (rw, suid, dev, exec, auto, nouser, async). nofail Boot continues even if the drive is missing or unplugged. Without this, the system might hang at boot waiting for the drive. x-systemd.device-timeout=30 Systemd will wait 30 seconds for the USB drive to appear before giving up. Useful for slow‑spinning external drives.
Run systemctl daemon-reload
Finally, mount them: sudo mount -a
Now, you can reboot, move the USB drives to diferent USB ports, etc. and they will always be mounted to the mount points you defined in /etc/fstab
If you find my content useful, please consider supporting this page: