# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.junyangz.com/ops/linux-persistent-naming.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
