Persistent block device naming

From ArchWiki

Jump to: navigation, search
Article summary
An overview of persistent block device naming; the preferred method of referencing block devices.
Available in languages
English
Related articles
fstab

This article describes how to use persistent names for your block devices. This has been made possible by the introduction of udev and has some advantages over bus-based naming.

Contents

Why persistent naming?

If your machine has more than one SATA, SCSI or IDE disk controller, the order in which their corresponding device nodes are added is random. This may result in device names like /dev/sdX and /dev/sdY switching around randomly on each boot, culminating in an unbootable system or kernel panic. Persistent naming solves these issues.

Additionally, by-label, by-id and by-path methods provide human-readable names.

Which method should I use?

There are four different schemes for persistent naming:

  1. #by-label
  2. #by-uuid
  3. #by-id
  4. #py-path

by-label

Almost every filesystem type can have a label. All your partitions that have one are listed in the /dev/disk/by-label directory.

Note: This directory is created (and destroyed) dynamically, depending on whether you have partitions with labels attached.
Command: $ ls -lF /dev/disk/by-label
total 0
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data -> ../../sdb2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 fat -> ../../sda6
lrwxrwxrwx 1 root root 10 Oct 16 10:27 home -> ../../sda7
lrwxrwxrwx 1 root root 10 Oct 16 10:27 root -> ../../sda1
lrwxrwxrwx 1 root root 10 Oct 16 10:27 swap -> ../../sda5
lrwxrwxrwx 1 root root 10 Oct 16 10:27 windows -> ../../sdb1

You can change the labels of your filesystems using these commands:

swap 
mkswap -L <label> /dev/XXX
ext2/ext3 
e2label /dev/XXX <label>
reiserfs 
reiserfstune -l <label> /dev/XXX
jfs 
jfs_tune -L <label> /dev/XXX
xfs 
xfs_admin -L <label> /dev/XXX
fat/vfat (mtools package) 
mlabel -i /dev/XXX ::<label>
ntfs (ntfsprogs package) 
ntfslabel /dev/XXX <label>
Warning: Labels must be unique for this method to be useful.

by-uuid

UUID, or Universally Unique Identifier, is a mechanism to give each filesystem a unique identifier. It is designed so that collisions are unlikely. All GNU/Linux filesystems (including swap) support UUID. FAT and NTFS filesystems don't support UUID, but are still listed in by-uuid with a unique identifier:

Command: $ /bin/ls -lF /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Oct 16 10:27 2d781b26-0285-421a-b9d0-d4a0d3b55680 -> ../../sda1
lrwxrwxrwx 1 root root 10 Oct 16 10:27 31f8eb0d-612b-4805-835e-0e6d8b8c5591 -> ../../sda7
lrwxrwxrwx 1 root root 10 Oct 16 10:27 3FC2-3DDB -> ../../sda6
lrwxrwxrwx 1 root root 10 Oct 16 10:27 5090093f-e023-4a93-b2b6-8a9568dd23dc -> ../../sda2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 912c7844-5430-4eea-b55c-e23f8959a8ee -> ../../sda5
lrwxrwxrwx 1 root root 10 Oct 16 10:27 B0DC1977DC193954 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Oct 16 10:27 bae98338-ec29-4beb-aacf-107e44599b2e -> ../../sdb2

As you can see, the FAT and NTFS partitions (fat and windows labels above) have shorter names, but are still listed. The advantage about using the UUID method is that it is less likely that you have name collisions than with labels. The disadvantage is that UUIDs lose any readability advantage.

by-id and by-path

by-id creates a unique name depending on the hardware serial number. by-path creates a unique name depending on the shortest physical path (according to sysfs). Both contain strings to indicate which subsystem they belong to (i.e. "-ide-", for 'by-path', and "ata-" for 'by-id') and thus are not suitable for solving the problems mentioned in the beginning of this article. They won't be discussed any further here.

Enabling persistent naming

Having chosen which naming method you'd like to use, let's now enable persistent naming for your system:

In fstab

To enable persistent naming in /etc/fstab replace the device name in the first column with the new persistent name. In the example, replace /dev/sda7 with one of the following:

  • /dev/disk/by-label/home
  • /dev/disk/by-uuid/31f8eb0d-612b-4805-835e-0e6d8b8c5591

Do so for all the partitions in your fstab file.

Instead of listing the device explicitly, one may specify the device via "LABEL=<label>" or "UUID=<uuid>" (e.g. "LABEL=boot" or "UUID=3e6be9de-8139-11d1-9106-a43f08d823a6").

In your boot manager

To use persistent names in your boot manager, the following prerequisites must be met:

  • You are using a mkinitcpio initial RAM disk image
  • You have udev enabled in /etc/mkinitcpio.conf
  • When your initramfs image was generated, version 101-3 or greater of klibc-udev was installed (persistent naming is broken in any earlier version). If you are updating klibc-udev from an earlier version and want to use persistent naming, regenerate your initramfs image before you reboot.

In the above example, /dev/sda1 is the root partition. In the GRUB menu.lst file, the kernel line looks like this:

kernel /boot/vmlinuz26 root=/dev/hda1 vga=0x318 ro

Depending on which naming scheme you would prefer, change it to one of the following:

kernel /boot/vmlinuz26 root=/dev/disk/by-label/root vga=0x318 ro

or

kernel /boot/vmlinuz26 root=/dev/disk/by-uuid/2d781b26-0285-421a-b9d0-d4a0d3b55680 vga=0x318 ro

If you are using LILO, then do not try this with the root=... configuration option; it will not work. Use append="root=..." or addappend="root=..." instead. Read the LILO man page for more information on append and addappend.

There is an alternative way to use the label embedded in the filesystem. For example if (as above) the filesystem in /dev/hda1 is labeled "root", you would give this line to GRUB:

 kernel /boot/vmlinuz26 root=LABEL=root vga=0x318 ro
Personal tools