Linux管理多块磁盘时,会按磁盘加载的顺序依次给磁盘命名为/dev/sda, /dev/sdb... 这种命名规则就会导致,一块磁盘在发生热插拔或系统重启后,盘符可能发生变化,会影响到一些依赖磁盘盘符工作的应用程序,比如fstab里按盘符名来挂载。要解决磁盘盘符漂移问题,一劳永逸的方法就是将磁盘槽位与盘符名做绑定;如果只针对磁盘挂载到问题,可通过按标签或UUID挂载的方式解决,下文将简单介绍下方案。如下所示的fstab,系统启动时,会自动执行每一行挂载动作,将/dev/sdc挂载到/data/disk1,其它依此类推。如果磁盘发生热插拔,磁盘的盘符由原来的/dev/sdc变成了/dev/sde,那么fstab就不能正确挂载第一块磁盘。/dev/sdc /data/disk1 ext4 defaults,noatime 0 0/dev/sdd /data/disk2 ext4 defaults,noatime 0 0为了保证在发生盘符漂移时,磁盘仍能正常挂载,首先对fstab做如下改进,按磁盘标签来挂载;比如第一行的含义是,将标签为disk1的磁盘挂载到/data/disk1。LABEL=disk1 /data/disk1 ext4 defaults,noatime 0 0LABEL=disk2 /data/disk2 ext4 defaults,noatime 0 0
接下来的问题就是如何给磁盘设置标签,针对ext系列的文件系统,可通过e*label来设置标签;也可在磁盘format时设置标签。mke4fs /dev/sdc -L disk1或者 mke4fs /dev/sdc; e4label /dev/sdc disk1通过上述设置后,磁盘/dev/sdc就拥有了标签disk1,在fstab里挂载拥有disk1标签的磁盘,即挂载/dev/sdc,即使这块磁盘的盘符发生了变化,由于其标签没变,fstab也能正确的将其挂载;通过mke4fs或e4label设置的标签,标签实际上是跟文件系统绑定的,是文件系统超级块的一部分,可通过tune4fs查询到。设置标签后,如果磁盘上的文件系统被重新格式化,则其原来设置的标签也就不复存在了,这也正是标签机制不足的地方;如果要解决这个问题,可通过在fstab里按UUID来挂载磁盘,UUID对于磁盘来说是不变的,不论其盘符、标签是否变化;但使用UUID的缺陷在于灵活性不足,不利于大批量部署。UUID=356gedv8-6753-31d1-9a09-g3bei19dag56 /data/disk1 ext4 defaults,noatime 0 0UUID=3a67fbad-2da1-4c3b-9a76-b488ea24d391 /data/disk1 ext4 defaults,noatime 0 0