# Linux PERSISTENT NAMING

Last edited by Junyangz AT 2018-07-10 20:03:49

> Linux管理多块磁盘时（以SATA盘为例）会按磁盘加载的顺序依次给磁盘命名为/dev/sda, /dev/sdb... 这种命名规则就会导致，在增减磁盘数量（热插拔）或磁盘不稳定以及系统重启后，盘符都有可能发生变化，会影响到一些依赖磁盘盘符工作的应用程序，比如fstab里按盘符名来挂载，最终导致挂载的分区不可用影响业务运行。

## 问题分析

> ​要解决磁盘盘符漂移问题，一劳永逸的方法就是将磁盘槽位与盘符名做绑定；

如果只针对磁盘挂载到问题，可通过按标签或UUID挂载的方式解决，下文将简单介绍下方案。 如下所示的fstab，系统启动时，会自动执行每一行挂载动作，将/dev/sda挂载到/data/disk1，其它依此类推。如果磁盘发生热插拔，第一块磁盘的盘符由原来的/dev/sda变成了/dev/sdc，那么fstab就不能正确挂载第一块磁盘。

```bash
/dev/sda /data/disk1 ext4 defaults,noatime 0 0
/dev/sdb /data/disk2 ext4 defaults,noatime 0 0
```

## 按照磁盘标签挂载

为了保证在发生盘符漂移时，磁盘仍能正常挂载，首先对fstab做如下改进，按磁盘标签来挂载；比如第一行的含义是，将标签为disk1的磁盘挂载到/data/disk1。

```bash
LABEL=disk1 /data/disk1    ext4    defaults,noatime 0 0
LABEL=disk2 /data/disk2    ext4    defaults,noatime 0 0
```

接下来的问题就是如何给磁盘设置标签，针对ext系列的文件系统，可通过e\*label来设置标签；也可在磁盘format时设置标签。

```bash
mke4fs /dev/sda -L disk1 #or
mke4fs /dev/sda; e4label /dev/sda disk1
```

通过上述设置后，磁盘/dev/sda就拥有了标签disk1，在fstab里挂载拥有disk1标签的磁盘，即挂载/dev/sda，即使这块磁盘的盘符发生了变化，由于其标签没变，fstab也能正确的将其挂载；通过mke4fs或e4label设置的标签，标签实际上是跟文件系统绑定的，是文件系统超级块的一部分，可通过tune4fs查询到。

## 按照UUID挂载

​设置标签后，如果磁盘上的文件系统被重新格式化，则其原来设置的标签也就不复存在了，这也正是标签机制不足的地方；

​如果要解决这个问题，可通过在fstab里按UUID来挂载磁盘，UUID对于磁盘来说是不变的，不论其盘符、标签是否变化；但使用UUID的缺陷在于灵活性不足，不利于大批量部署。

```bash
UUID=356fdf58-6923-43d5-9a09-349159c7c8a6 /data/disk1    ext4    defaults,noatime 0 0
UUID=3b93fbad-bea2-4cbb-9a76-b4885924d287 /data/disk1    ext4    defaults,noatime 0 0
```

## 集群部署方案

~~​待补充~~

```bash
#!/bin/bash
#By Junyangz AT 2018-07-16 16:58:15 for reconfigure fstab with uuid.

timestamp=$(date +"%Y-%m-%d")
cp /etc/fstab /etc/fstab-${timestamp}

for DEV in $( cat /etc/fstab | awk '{print $1}' | fgrep /dev/ )
do
    PUREDEV=$( echo $DEV | cut -d/ -f3- )
    UUIDIS=$( ls -l /dev/disk/by-uuid/ | fgrep $PUREDEV | awk '{print $9}' )
    UUID=$( echo UUID=${UUIDIS} )
    sed -i "s|$DEV|$UUID|g" /etc/fstab
done
```

## Reference

* [Linux盘符漂移问题](http://blog.chinaunix.net/uid-20196318-id-4009633.html)
* [Persistent Naming of a Block Device CentOS 6](https://www.linuxquestions.org/questions/linux-server-73/persistent-naming-of-a-block-device-centos-6-a-946495/)
* [PERSISTENT NAMING](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/storage_administration_guide/persistent_naming)
