Creating Persistent Mounts for USB Devices

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.

🔌 Why USB drives don’t mount persistently by default

  1. /dev/sdX names are not stable
  2. When 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.

  3. USB drives often have identical or missing metadata
  4. Many cheap USB sticks ship with:

    This makes it hard for Linux to uniquely identify them.

  5. Hot‑plugging means the system can’t assume permanence
  6. USB devices can appear and disappear at any time.

    Linux treats them as transient, so it doesn’t automatically create persistent mount points.

  7. Systemd and udev rules require explicit configuration
  8. Linux can mount USB drives persistently, but only if you tell it how:

    Without that, the system defaults to non‑persistent behavior.

    The fix

    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: