Junyangz's docs
  • Introduction
  • Ops
    • Linux-tips
    • MySQL-5.7.20
    • Upgrading MySQL
    • Upgrade OpenSSH to 7.7p1 in CentOS 6
    • Linux PERSISTENT NAMING
    • Use Kafka with Flume - CRS2
    • Setup Chroot SFTP in CentOS
    • Setup software RAID-5 in CentOS
    • SSH-port-forwarding
    • Elasticsearch In Production
    • ELK-simple-tutorial
    • Ansible Playbooks for Apache Kafka in production
    • GitHub Actions depoly Hexo
    • Test HTTP3/QUIC docker
    • Docker tutorial
    • SFTP-auth-pubkey
    • Linux Process Substitution
  • Note
    • Interview
      • interview-prepare
      • 2020-campus-recruiting
    • Android Tips
    • MacOS tips
    • Secret knowledge
    • GPG-Note
    • ud185
    • ud185-2
    • Introducing Tensorflow Federated
    • Tensorflow Federated
    • Expert Python Programing
    • What happens when zh_CN
    • TILGC
    • VScode keyboard shortcuts
    • Abseil Python
    • Latex Note
    • Git Cheatsheet
    • Study Smarter Not Harder
    • Machine Learning Interviews
    • 深度学习中的优化
    • Beej's Guide to Network Programming Note
      • ch4
      • ch5
      • ch6
      • ch7
  • [Share]
    • What to do after what to do
    • Truman is everywhere
    • Way2outer
    • 未来十五年
  • Quote
Powered by GitBook
On this page
  • 问题分析
  • 按照磁盘标签挂载
  • 按照UUID挂载
  • 集群部署方案
  • Reference

Was this helpful?

  1. Ops

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就不能正确挂载第一块磁盘。

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

按照磁盘标签挂载

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

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

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

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的缺陷在于灵活性不足,不利于大批量部署。

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

集群部署方案

​待补充

#!/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

PreviousUpgrade OpenSSH to 7.7p1 in CentOS 6NextUse Kafka with Flume - CRS2

Last updated 2 years ago

Was this helpful?

Linux盘符漂移问题
Persistent Naming of a Block Device CentOS 6
PERSISTENT NAMING