Difference between revisions of "Persistent block device naming"

From ArchWiki
Jump to: navigation, search
(by-label: Belong to ntfs-3g now.)
(update interlanguage links)
(Tag: wiki-scripts)
 
(61 intermediate revisions by 21 users not shown)
Line 2: Line 2:
 
[[Category:File systems]]
 
[[Category:File systems]]
 
[[Category:Hardware detection and troubleshooting]]
 
[[Category:Hardware detection and troubleshooting]]
 +
[[es:Persistent block device naming]]
 
[[it:Persistent block device naming]]
 
[[it:Persistent block device naming]]
[[zh-TW:UUID]]
+
[[ja:永続的なブロックデバイスの命名]]
{{Article summary start}}
+
[[ru:Persistent block device naming]]
{{Article summary text|An overview of persistent block device naming; the preferred method of referencing block devices.}}
+
[[zh-hans:Persistent block device naming]]
{{Article summary heading|Related articles}}
+
[[zh-hant:UUID]]
{{Article summary wiki|fstab}}
+
{{Related articles start}}
{{Article summary wiki|udev}}
+
{{Related|fstab}}
{{Article summary wiki|LVM}}
+
{{Related|udev}}
{{Article summary end}}
+
{{Related|LVM}}
 
+
{{Related articles end}}
 
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. If your machine has more than one SATA, SCSI or IDE disk controller, the order in which their corresponding device nodes are added is arbitrary. This may result in device names like {{ic|/dev/'''sda'''}} and {{ic|/dev/'''sdb'''}} switching around on each boot, culminating in an unbootable system, kernel panic, or a block device disappearing. Persistent naming solves these issues.
 
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. If your machine has more than one SATA, SCSI or IDE disk controller, the order in which their corresponding device nodes are added is arbitrary. This may result in device names like {{ic|/dev/'''sda'''}} and {{ic|/dev/'''sdb'''}} switching around on each boot, culminating in an unbootable system, kernel panic, or a block device disappearing. Persistent naming solves these issues.
{{Note|If you are using [[LVM|LVM2]], this article is not relevant as LVM takes care of this automatically.}}
+
{{Note|
 +
* Persistent naming has limits that are out-of-scope in this article. For example, while [[mkinitcpio]] may support a method, systemd may impose its own limits (e.g. {{Bug|42884}}) on naming it can process during boot.
 +
* If you are using [[LVM2]], this article is not relevant as LVM takes care of this automatically.}}
  
 
==Persistent naming methods==
 
==Persistent naming methods==
  
There are four different schemes for persistent naming: [[#by-label|by-label]], [[#by-uuid|by-uuid]], [[#by-id and by-path|by-id and by-path]]. The following sections describes what the different persistent naming methods are and how they are used.  
+
There are four different schemes for persistent naming: [[#by-label|by-label]], [[#by-uuid|by-uuid]], [[#by-id and by-path|by-id and by-path]]. For those using disks with [[GUID Partition Table|GUID Partition Table (GPT)]], two additional schemes can be used [[#by-partlabel|by-partlabel]] and [[#by-partuuid|by-partuuid]]. You can also use [[#Static device names with Udev|static device names by using Udev]].
 +
 
 +
{{Note|Beware that [[Disk cloning]] creates two different disks with the same name.}}
 +
 
 +
The following sections describes what the different persistent naming methods are and how they are used.
  
Here is a good command for viewing all the information.
+
The {{ic|lsblk -f}} command can be used for viewing graphically the first persistent schemes:
  
{{hc|# lsblk -f|<nowiki>
+
{{hc|$ lsblk -f|<nowiki>
NAME  FSTYPE LABEL   UUID                                MOUNTPOINT
+
NAME  FSTYPE LABEL UUID                                MOUNTPOINT
sda                                                        
+
sda                                                      
├─sda1 ext2            7f4cef7e-7ee2-489a-b759-d52ba23b692c /boot
+
├─sda1 vfat          CBB6-24F2                            /boot
├─sda2 swap            a807fff3-e89f-46d0-ab17-9b7ad3efa7b5 [SWAP]
+
├─sda2 ext4  SYSTEM 0a3407de-014b-458b-b5c1-848e92a327a3 /
├─sda3 ext4            81917291-fd1a-4ffe-b95f-61c05cfba76f /
+
├─sda3 ext4  DATA   b411dc99-f0a0-4c87-9e05-184977be8539 /home
└─sda4 ext4            c4c23598-19fb-4562-892b-6fb18a09c7d3 /home
+
└─sda4 swap         f9fe0b69-a280-415d-a03a-a32752370dee [SWAP]
sdb
 
└─sdb1 ext4  X2      4bf265f7-da17-4575-8758-acd40885617b /mnt/X1
 
sdc
 
└─sdc1 ext4  X1      4bf265f7-da17-4575-8758-acd40885617b /mnt/X2
 
sdd
 
└─sdd1 ext4   Y2      8a976a06-3e56-476f-b73a-ea3cad41d915 /mnt/Y2
 
sde
 
└─sde1 ext4  Z2      9d35eaae-983f-4eba-abc9-434ecd4da09c /mnt/Z2
 
sdf
 
└─sdf1 ext4  Y1      e2ec37a9-0689-46a8-a07b-0609ce2b7ea2 /mnt/Y1
 
sdg
 
└─sdg1 ext4  Z1      9fa239c1-720f-42e0-8aed-39cf53a743ed /mnt/Z1
 
sdj
 
├─sdj1 ext4  RAPT    a9ed7ecb-96ce-40fe-92fa-e07a532ed157
 
└─sdj2 swap           20826c74-eb6d-46f8-84d8-69b933a4bf3f [SWAP]
 
 
</nowiki>}}
 
</nowiki>}}
 +
 +
For those using [[GPT]], use the {{ic|blkid}} command instead. The latter is more convenient for scripts, but more difficult to read.
 +
 +
{{hc|$ blkid|<nowiki>
 +
/dev/sda1: UUID="CBB6-24F2" TYPE="vfat" PARTLABEL="EFI SYSTEM PARTITION" PARTUUID="d0d0d110-0a71-4ed6-936a-304969ea36af"
 +
/dev/sda2: LABEL="SYSTEM" UUID="0a3407de-014b-458b-b5c1-848e92a327a3" TYPE="ext4" PARTLABEL="GNU/LINUX" PARTUUID="98a81274-10f7-40db-872a-03df048df366"
 +
/dev/sda3: LABEL="DATA" UUID="b411dc99-f0a0-4c87-9e05-184977be8539" TYPE="ext4" PARTLABEL="HOME" PARTUUID="7280201c-fc5d-40f2-a9b2-466611d3d49e"
 +
/dev/sda4: UUID="f9fe0b69-a280-415d-a03a-a32752370dee" TYPE="swap" PARTLABEL="SWAP" PARTUUID="039b6c1c-7553-4455-9537-1befbc9fbc5b"
 +
</nowiki>
 +
}}
  
 
===by-label===
 
===by-label===
Line 49: Line 51:
 
Almost every filesystem type can have a label. All your partitions that have one are listed in the {{ic|/dev/disk/by-label}} directory. This directory is created and destroyed dynamically, depending on whether you have partitions with labels attached.
 
Almost every filesystem type can have a label. All your partitions that have one are listed in the {{ic|/dev/disk/by-label}} directory. This directory is created and destroyed dynamically, depending on whether you have partitions with labels attached.
  
{{hc|$ ls -lF /dev/disk/by-label|<nowiki>
+
{{hc|$ ls -l /dev/disk/by-label|<nowiki>  
 
total 0
 
total 0
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data -> ../../sdb2
+
lrwxrwxrwx 1 root root 10 May 27 23:31 DATA -> ../../sda3
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data2 -> ../../sda2
+
lrwxrwxrwx 1 root root 10 May 27 23:31 SYSTEM -> ../../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
 
 
</nowiki>}}
 
</nowiki>}}
  
The labels of your filesystems can be changed, but note that they have to be unambiguous to prevent any possible conflicts. Following are some methods for changing labels on common filesystems:
+
The labels of your filesystems can be changed. Following are some methods for changing labels on common filesystems:
  
; swap : {{ic|swaplabel -L <label> /dev/XXX}}
+
; swap : {{ic|swaplabel -L <label> /dev/XXX}} using {{pkg|util-linux}}
 
; ext2/3/4 : {{ic|e2label /dev/XXX <label>}} using {{pkg|e2fsprogs}}
 
; ext2/3/4 : {{ic|e2label /dev/XXX <label>}} using {{pkg|e2fsprogs}}
 
; btrfs : {{ic|btrfs filesystem label /dev/XXX <label>}} using {{pkg|btrfs-progs}}
 
; btrfs : {{ic|btrfs filesystem label /dev/XXX <label>}} using {{pkg|btrfs-progs}}
Line 68: Line 65:
 
; jfs : {{ic|jfs_tune -L <label> /dev/XXX}} using {{pkg|jfsutils}}
 
; jfs : {{ic|jfs_tune -L <label> /dev/XXX}} using {{pkg|jfsutils}}
 
; xfs : {{ic|xfs_admin -L <label> /dev/XXX}} using {{pkg|xfsprogs}}
 
; xfs : {{ic|xfs_admin -L <label> /dev/XXX}} using {{pkg|xfsprogs}}
; fat/vfat : {{ic|dosfslabel /dev/XXX <label>}} using {{pkg|dosfstools}}
+
; fat/vfat : {{ic|fatlabel /dev/XXX <label>}} using {{pkg|dosfstools}}
; fat/vfat : {{ic|mlabel -i /dev/XXX ::<label>}} using {{pkg|mtools}}
+
: {{ic|mlabel -i /dev/XXX ::<label>}} using {{pkg|mtools}}
 
; ntfs : {{ic|ntfslabel /dev/XXX <label>}} using {{pkg|ntfs-3g}}
 
; ntfs : {{ic|ntfslabel /dev/XXX <label>}} using {{pkg|ntfs-3g}}
 +
; zfs : this filesystem does not support {{ic|/dev/disk/by-label}}, but [[#by-partlabel]] may be used
  
{{Note|Labels can be up to 16 characters long.}}
+
{{Note|
 +
* Changing the filesystem label of the root partition has to be done from a "live" GNU/Linux distribution because the partition needs to be unmounted first.
 +
* Labels have to be unambiguous to prevent any possible conflicts.
 +
* Labels can be up to 16 characters long.
 +
* Since the label is a property of the filesystem, it is not suitable for addressing a single RAID device persistently.
 +
* When using encrypted containers with [[dm-crypt]], the labels of filesystems inside of containers are not available while the container is locked/encrypted.}}
  
 
===by-uuid===
 
===by-uuid===
  
[http://en.wikipedia.org/wiki/UUID UUID] is a mechanism to give each filesystem a unique identifier. It is designed so that collisions are unlikely. All GNU/Linux filesystems (including swap and LUKS headers of raw encrypted devices) support UUID. FAT and NTFS filesystems (''fat'' and ''windows'' labels above) do not support UUID, but are still listed in {{ic|/dev/disk/by-uuid}} with a shorter UID (unique identifier):
+
[[wikipedia:UUID|UUID]] is a mechanism to give each filesystem a unique identifier. These identifiers are generated by filesystem utilities (e.g. {{ic|mkfs.*}}) when the partition gets formatted and are designed so that collisions are unlikely. All GNU/Linux filesystems (including swap and LUKS headers of raw encrypted devices) support UUID. FAT and NTFS filesystems (''fat'' and ''windows'' labels above) do not support UUID, but are still listed in {{ic|/dev/disk/by-uuid}} with a shorter UID (unique identifier):
 +
 
 +
{{hc|$ ls -l /dev/disk/by-uuid/|
 +
total 0
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 0a3407de-014b-458b-b5c1-848e92a327a3 -> ../../sda2
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 b411dc99-f0a0-4c87-9e05-184977be8539 -> ../../sda3
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 CBB6-24F2 -> ../../sda1
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 f9fe0b69-a280-415d-a03a-a32752370dee -> ../../sda4
 +
}}
 +
 
 +
The advantage of using the UUID method is that it is much less likely that name collisions occur than with labels. Further, it is generated automatically on creation of the filesystem. It will, for example, stay unique even if the device is plugged into another system (which may perhaps have a device with the same label).
  
{{hc|# ls -l /dev/disk/by-uuid/|total 0
+
The disadvantage is that UUIDs make long code lines hard to read and break formatting in many configuration files (e.g. fstab or crypttab). Also every time a partition is resized or reformatted a new UUID is generated and configs have to get adjusted (manually).
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}}
 
  
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 make long code lines hard to read and break formatting in many configuration files (e.g. fstab or crypttab). Also every time a partition is resized or reformatted a new UUID is generated and configs have to get adjusted (manually).
+
{{Tip|In case your swap partition does not have an UUID assigned, you will need to reset the swap partition using [[Swap#Swap partition|mkswap]] utility.}}
  
 
===by-id and by-path===
 
===by-id and by-path===
  
{{ic|by-id}} creates a unique name depending on the hardware serial number, {{ic|by-path}} depending on the shortest physical path (according to sysfs). Both contain strings to indicate which subsystem they belong to (i.e. {{ic|-ide-}} for {{ic|by-path}}, and {{ic|-ata-}} for {{ic|by-id}}) and thus are not suitable for solving the problems mentioned in the beginning of this article. They will not be discussed any further here.
+
{{ic|by-id}} creates a unique name depending on the hardware serial number, {{ic|by-path}} depending on the shortest physical path (according to sysfs). Both contain strings to indicate which subsystem they belong to (i.e. {{ic|-ide-}} for {{ic|by-path}}, and {{ic|-ata-}} for {{ic|by-id}}), so they are linked to the hardware controlling the device. This implies different levels of persistence: the {{ic|by-path}} will already change when the device is plugged into a different port of the controller, the {{ic|by-id}} will change when the device is plugged into a port of a hardware controller subject to another subsystem. [https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Online_Storage_Reconfiguration_Guide/persistent_naming.html] Thus, both are not suitable to achieve persistent naming tolerant to hardware changes.
 +
 
 +
However, both provide important information to find a particular device in a large hardware infrastructure. For example, if you do not manually assign persistent labels ({{ic|by-label}} or {{ic|by-partlabel}}) and keep a directory with hardware port usage, {{ic|by-id}} and {{ic|by-path}} can be used to find a particular device.[http://linuxshellaccount.blogspot.in/2008/09/how-to-easily-find-wwns-of-qlogic-hba.html] [http://www.linuxquestions.org/questions/linux-server-73/how-to-find-wwn-for-dev-sdc-917269/]
 +
 
 +
===by-partlabel===
 +
 
 +
{{Note|This method only concerns disks with [[GUID Partition Table|GUID Partition Table (GPT)]].}}
 +
 
 +
Partition labels can be defined in the header of the partition entry on GPT disks.
 +
 
 +
See also [[Wikipedia:GUID Partition Table#Partition entries]].
 +
 
 +
This method is very similar to the [[#by-label|filesystem labels]], excepted that the dynamic directory is {{ic|/dev/disk/by-partlabel}}.
 +
 
 +
{{hc|ls -l /dev/disk/by-partlabel/|<nowiki>
 +
total 0
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 EFI\x20SYSTEM\x20PARTITION -> ../../sda1
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 GNU\x2fLINUX -> ../../sda2
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 HOME -> ../../sda3
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 SWAP -> ../../sda4
 +
</nowiki>}}
 +
 
 +
{{Note|
 +
* GPT partition labels have also to be different to avoid conflicts. To change your partition label, you can use {{ic|gdisk}} or the ncurses-based version {{ic|cgdisk}}. Both are available from the {{Pkg|gptfdisk}} package. See [[Partitioning#Partitioning tools]].
 +
* According to the specification, GPT partition labels can be up to 72 characters long.}}
 +
 
 +
===by-partuuid===
 +
{{Note|This method only concerns disks with [[GUID Partition Table|GUID Partition Table (GPT)]].}}
 +
 
 +
Like [[#by-partlabel|GPT partition labels]], GPT partition UUID are defined in the partition entry on GPT disks.
 +
 
 +
See also [[Wikipedia:GUID Partition Table#Partition entries]].
  
===Individual device names===
+
The dynamic directory is similar to other methods and, like [[#by-uuid|UUID filesystems]], using UUIDs is prefered over labels.
You can also create individual device names: [[udev#Setting static device names (for iscsi)]].
 
  
==Using persistent naming==
+
{{hc|ls -l /dev/disk/by-partuuid/|<nowiki>
 +
total 0
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 039b6c1c-7553-4455-9537-1befbc9fbc5b -> ../../sda4
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 7280201c-fc5d-40f2-a9b2-466611d3d49e -> ../../sda3
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 98a81274-10f7-40db-872a-03df048df366 -> ../../sda2
 +
lrwxrwxrwx 1 root root 10 May 27 23:31 d0d0d110-0a71-4ed6-936a-304969ea36af -> ../../sda1
 +
</nowiki>
 +
}}
  
There are various applications that can be configured using persistent naming. Following are some examples of how to configure them.
+
===Static device names with Udev===
  
===[[fstab]]===
+
See [[Udev#Setting static device names]].
  
To enable persistent naming in {{ic|/etc/fstab}} replace the device kernel name in the first column with the persistent name path as follows:
+
==Using persistent naming==
  
/dev/disk/by-label/home_myhost ...
+
There are various applications that can be configured using persistent naming. Following are some examples of how to configure them.
/dev/disk/by-uuid/31f8eb0d-612b-4805-835e-0e6d8b8c5591 [...]
 
  
or directly specify the persistent name type using a prefix:
+
=== fstab ===
  
LABEL=home_myhost ...
+
See the main article: [[fstab#UUIDs]]
UUID=1f8eb0d-612b-4805-835e-0e6d8b8c5591 [...]
 
  
 
===Boot managers===
 
===Boot managers===
  
To use persistent names in your boot manager, the following prerequisites must be met:
+
To use persistent names in the [[Boot loader|boot manager (boot loader)]], the following prerequisites must be met. On a standard installation following the installation guide both prerequisites are met.
  
* You are using a [[Configuring mkinitcpio|mkinitcpio]] initial RAM disk image
+
* You are using a [[Mkinitcpio#Configuration|mkinitcpio]] initial RAM disk image
 
* You have udev enabled in {{ic|/etc/mkinitcpio.conf}}
 
* You have udev enabled in {{ic|/etc/mkinitcpio.conf}}
  
In the above example, {{ic|/dev/sda1}} is the root partition. In the [[GRUB]] {{ic|grub.cfg}} file, the ''linux'' line looks like this:
+
The location of the root filesystem is given by the parameter {{ic|root}} on the kernel commandline. The kernel commandline is configured from the bootloader, see [[Kernel parameters#Configuration]]. To change to persistent device naming, only change the parameters which specify block devices, e.g. {{ic|root}} and {{ic|resume}}, while leaving other parameters as is. Various naming schemes are supported:
 +
 
 +
Non-persistent device naming using the {{ic|/dev}} path format, in this example {{ic|''/dev/sdr1''}} is the root partition.
 +
 
 +
root=''/dev/sdr1''
  
linux /boot/vmlinuz-linux root=/dev/sda1 ro quiet
+
Persistent device naming using label and the {{ic|/dev}} path format, in this example {{ic|''root_myhost''}} is the label of the root partition.
  
Depending on which naming scheme you would prefer, change it to one of the following:
+
root=/dev/disk/by-label/''root_myhost''
  
linux /boot/vmlinuz-linux root=/dev/disk/by-label/root_myhost ro quiet
+
Persistent device naming using label and the {{ic|1=LABEL=}} format.
  
or:
+
root=LABEL=''root_myhost''
  
linux /boot/vmlinuz-linux root=UUID=2d781b26-0285-421a-b9d0-d4a0d3b55680 ro quiet
+
Persistent device naming using UUID and the {{ic|1=UUID=}} format, in this example {{ic|''1234-5678''}} is the UUID of the root partition
  
If you are using [[LILO]], then do not try this with the {{ic|1=root=...}} configuration option; it will not work. Use {{ic|1=append="root=..."}} or {{ic|1=addappend="root=..."}} instead. Read the LILO man page for more information on {{ic|append}} and {{ic|addappend}}.
+
root=UUID=''1234-5678''
  
There is an alternative way to use the label embedded in the filesystem. For example if (as above) the filesystem in {{ic|/dev/sda1}} is labeled {{ic|root_myhost}}, you would give this line to GRUB:
+
Persistent device naming using the PARTUUID and the {{ic|1=PARTUUID=}} format.
  
  linux /boot/vmlinuz-linux root=LABEL=root_myhost ro quiet
+
  root=PARTUUID=''1234-5678''

Latest revision as of 18:11, 29 July 2017

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. If your machine has more than one SATA, SCSI or IDE disk controller, the order in which their corresponding device nodes are added is arbitrary. This may result in device names like /dev/sda and /dev/sdb switching around on each boot, culminating in an unbootable system, kernel panic, or a block device disappearing. Persistent naming solves these issues.

Note:
  • Persistent naming has limits that are out-of-scope in this article. For example, while mkinitcpio may support a method, systemd may impose its own limits (e.g. FS#42884) on naming it can process during boot.
  • If you are using LVM2, this article is not relevant as LVM takes care of this automatically.

Persistent naming methods

There are four different schemes for persistent naming: by-label, by-uuid, by-id and by-path. For those using disks with GUID Partition Table (GPT), two additional schemes can be used by-partlabel and by-partuuid. You can also use static device names by using Udev.

Note: Beware that Disk cloning creates two different disks with the same name.

The following sections describes what the different persistent naming methods are and how they are used.

The lsblk -f command can be used for viewing graphically the first persistent schemes:

$ lsblk -f
NAME   FSTYPE LABEL  UUID                                 MOUNTPOINT
sda                                                       
├─sda1 vfat          CBB6-24F2                            /boot
├─sda2 ext4   SYSTEM 0a3407de-014b-458b-b5c1-848e92a327a3 /
├─sda3 ext4   DATA   b411dc99-f0a0-4c87-9e05-184977be8539 /home
└─sda4 swap          f9fe0b69-a280-415d-a03a-a32752370dee [SWAP]

For those using GPT, use the blkid command instead. The latter is more convenient for scripts, but more difficult to read.

$ blkid
/dev/sda1: UUID="CBB6-24F2" TYPE="vfat" PARTLABEL="EFI SYSTEM PARTITION" PARTUUID="d0d0d110-0a71-4ed6-936a-304969ea36af" 
/dev/sda2: LABEL="SYSTEM" UUID="0a3407de-014b-458b-b5c1-848e92a327a3" TYPE="ext4" PARTLABEL="GNU/LINUX" PARTUUID="98a81274-10f7-40db-872a-03df048df366" 
/dev/sda3: LABEL="DATA" UUID="b411dc99-f0a0-4c87-9e05-184977be8539" TYPE="ext4" PARTLABEL="HOME" PARTUUID="7280201c-fc5d-40f2-a9b2-466611d3d49e" 
/dev/sda4: UUID="f9fe0b69-a280-415d-a03a-a32752370dee" TYPE="swap" PARTLABEL="SWAP" PARTUUID="039b6c1c-7553-4455-9537-1befbc9fbc5b"

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. This directory is created and destroyed dynamically, depending on whether you have partitions with labels attached.

$ ls -l /dev/disk/by-label
 
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 DATA -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 SYSTEM -> ../../sda2

The labels of your filesystems can be changed. Following are some methods for changing labels on common filesystems:

swap 
swaplabel -L <label> /dev/XXX using util-linux
ext2/3/4 
e2label /dev/XXX <label> using e2fsprogs
btrfs 
btrfs filesystem label /dev/XXX <label> using btrfs-progs
reiserfs 
reiserfstune -l <label> /dev/XXX using reiserfsprogs
jfs 
jfs_tune -L <label> /dev/XXX using jfsutils
xfs 
xfs_admin -L <label> /dev/XXX using xfsprogs
fat/vfat 
fatlabel /dev/XXX <label> using dosfstools
mlabel -i /dev/XXX ::<label> using mtools
ntfs 
ntfslabel /dev/XXX <label> using ntfs-3g
zfs 
this filesystem does not support /dev/disk/by-label, but #by-partlabel may be used
Note:
  • Changing the filesystem label of the root partition has to be done from a "live" GNU/Linux distribution because the partition needs to be unmounted first.
  • Labels have to be unambiguous to prevent any possible conflicts.
  • Labels can be up to 16 characters long.
  • Since the label is a property of the filesystem, it is not suitable for addressing a single RAID device persistently.
  • When using encrypted containers with dm-crypt, the labels of filesystems inside of containers are not available while the container is locked/encrypted.

by-uuid

UUID is a mechanism to give each filesystem a unique identifier. These identifiers are generated by filesystem utilities (e.g. mkfs.*) when the partition gets formatted and are designed so that collisions are unlikely. All GNU/Linux filesystems (including swap and LUKS headers of raw encrypted devices) support UUID. FAT and NTFS filesystems (fat and windows labels above) do not support UUID, but are still listed in /dev/disk/by-uuid with a shorter UID (unique identifier):

$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 0a3407de-014b-458b-b5c1-848e92a327a3 -> ../../sda2
lrwxrwxrwx 1 root root 10 May 27 23:31 b411dc99-f0a0-4c87-9e05-184977be8539 -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 CBB6-24F2 -> ../../sda1
lrwxrwxrwx 1 root root 10 May 27 23:31 f9fe0b69-a280-415d-a03a-a32752370dee -> ../../sda4

The advantage of using the UUID method is that it is much less likely that name collisions occur than with labels. Further, it is generated automatically on creation of the filesystem. It will, for example, stay unique even if the device is plugged into another system (which may perhaps have a device with the same label).

The disadvantage is that UUIDs make long code lines hard to read and break formatting in many configuration files (e.g. fstab or crypttab). Also every time a partition is resized or reformatted a new UUID is generated and configs have to get adjusted (manually).

Tip: In case your swap partition does not have an UUID assigned, you will need to reset the swap partition using mkswap utility.

by-id and by-path

by-id creates a unique name depending on the hardware serial number, by-path 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), so they are linked to the hardware controlling the device. This implies different levels of persistence: the by-path will already change when the device is plugged into a different port of the controller, the by-id will change when the device is plugged into a port of a hardware controller subject to another subsystem. [1] Thus, both are not suitable to achieve persistent naming tolerant to hardware changes.

However, both provide important information to find a particular device in a large hardware infrastructure. For example, if you do not manually assign persistent labels (by-label or by-partlabel) and keep a directory with hardware port usage, by-id and by-path can be used to find a particular device.[2] [3]

by-partlabel

Note: This method only concerns disks with GUID Partition Table (GPT).

Partition labels can be defined in the header of the partition entry on GPT disks.

See also Wikipedia:GUID Partition Table#Partition entries.

This method is very similar to the filesystem labels, excepted that the dynamic directory is /dev/disk/by-partlabel.

ls -l /dev/disk/by-partlabel/
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 EFI\x20SYSTEM\x20PARTITION -> ../../sda1
lrwxrwxrwx 1 root root 10 May 27 23:31 GNU\x2fLINUX -> ../../sda2
lrwxrwxrwx 1 root root 10 May 27 23:31 HOME -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 SWAP -> ../../sda4
Note:
  • GPT partition labels have also to be different to avoid conflicts. To change your partition label, you can use gdisk or the ncurses-based version cgdisk. Both are available from the gptfdisk package. See Partitioning#Partitioning tools.
  • According to the specification, GPT partition labels can be up to 72 characters long.

by-partuuid

Note: This method only concerns disks with GUID Partition Table (GPT).

Like GPT partition labels, GPT partition UUID are defined in the partition entry on GPT disks.

See also Wikipedia:GUID Partition Table#Partition entries.

The dynamic directory is similar to other methods and, like UUID filesystems, using UUIDs is prefered over labels.

ls -l /dev/disk/by-partuuid/
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 039b6c1c-7553-4455-9537-1befbc9fbc5b -> ../../sda4
lrwxrwxrwx 1 root root 10 May 27 23:31 7280201c-fc5d-40f2-a9b2-466611d3d49e -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 98a81274-10f7-40db-872a-03df048df366 -> ../../sda2
lrwxrwxrwx 1 root root 10 May 27 23:31 d0d0d110-0a71-4ed6-936a-304969ea36af -> ../../sda1

Static device names with Udev

See Udev#Setting static device names.

Using persistent naming

There are various applications that can be configured using persistent naming. Following are some examples of how to configure them.

fstab

See the main article: fstab#UUIDs

Boot managers

To use persistent names in the boot manager (boot loader), the following prerequisites must be met. On a standard installation following the installation guide both prerequisites are met.

  • You are using a mkinitcpio initial RAM disk image
  • You have udev enabled in /etc/mkinitcpio.conf

The location of the root filesystem is given by the parameter root on the kernel commandline. The kernel commandline is configured from the bootloader, see Kernel parameters#Configuration. To change to persistent device naming, only change the parameters which specify block devices, e.g. root and resume, while leaving other parameters as is. Various naming schemes are supported:

Non-persistent device naming using the /dev path format, in this example /dev/sdr1 is the root partition.

root=/dev/sdr1

Persistent device naming using label and the /dev path format, in this example root_myhost is the label of the root partition.

root=/dev/disk/by-label/root_myhost

Persistent device naming using label and the LABEL= format.

root=LABEL=root_myhost

Persistent device naming using UUID and the UUID= format, in this example 1234-5678 is the UUID of the root partition

root=UUID=1234-5678

Persistent device naming using the PARTUUID and the PARTUUID= format.

root=PARTUUID=1234-5678