ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS7新盘挂载与LVM扩容:分区、格式化、fstab实战

CentOS7新盘挂载与LVM扩容:分区、格式化、fstab实战 1. 服务器加了块盘为什么系统里看不到机房那台老业务机最近天天报磁盘告警df -h一看根分区已经吃到 92%日志都快写不进去了。跟运维申请了一块 500G 的新盘插上去之后兴冲冲敲df -h结果什么都没多出来。这种情况我第一次遇到的时候也懵了几分钟——硬盘明明插了BIOS 里也能认到为什么系统里连个影子都没有答案其实很简单物理上接了盘不等于操作系统上能直接用它。一块裸盘从硬件到能存文件中间要经过分区、格式化文件系统、挂载三个动作每一步都有它存在的理由。很多人包括几年前的我以为新盘插上就能用是因为平时用的 U 盘、移动硬盘出厂时厂家已经帮你把这三步做完了一半——它们预置了分区表和文件系统插上即识别。服务器上采购的裸盘不会替你干这些活得自己来。这篇内容主要讲清楚两件事一块全新的数据盘怎么从零挂载到 CentOS7 上正常使用以及当原有分区空间不够时怎么在不动数据的前提下把新盘的空间扩进去。前者是从无到有后者是从小到大。写这篇文章的初衷是我在带新人的时候发现很多人会挂载但不会扩容会扩容又搞不清楚pv、vg、lv这套逻辑关系。文中所有命令我都在 CentOS 7.9 上实测过同时也会把 Ubuntu 这类发行版的差异点标出来方便你换环境时对照。2. 动手之前先把 lsblk 和 fdisk 的脾气摸清2.1 找盘为什么别名要认 /dev/sdb 而不是 /dev/sda新盘接上之后第一件事不是急着分区而是确认系统到底认没认到这块盘、它被分配了哪个设备名。lsblk是我最推荐的第一个命令输出干净一眼能看出设备树的层级关系lsblk典型输出长这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 99G 0 part ├─centos-root 253:0 0 50G 0 lvm / └─centos-swap 253:1 0 49G 0 lvm [SWAP] sdb 8:16 0 500G 0 disk注意最后那行sdb后面没有 part、没有 MOUNTPOINT这说明它是一块还没被使用的裸盘正是我们要操作的盘。这里有个经验sda通常是系统盘能不动就不动新增的数据盘基本都是sdb、sdc往后的字母。但设备名不是永久不变的它会受插槽、控制器扫描顺序影响机器重启或者换插槽后sdb有可能变成sdc。所以后面挂载时不要用/dev/sdb这种设备名写死到/etc/fstab要用 UUID这个坑我后面会专门说。再补一个fdisk -l看更详细的信息fdisk -l /dev/sdb如果你敲完发现根本没有sdb这一段那说明系统还没扫描到新硬件。这种情况不用重启用下面这条命令让内核重新扫描 SCSI 总线就行echo - - - /sys/class/scsi_host/host0/scan如果 host0 没反应就依次试 host1、host2或者用ls /sys/class/scsi_host/看看到底有哪些 host。2.2 分区MBR 和 GPT 到底选哪个确认盘认到了之后接下来是分区。这一步很多人会问我就挂一块盘存数据能不能不分区直接用技术上可以直接mkfs.ext4 /dev/sdb也行但我强烈建议还是分一个区。原因是很多工具、备份软件、监控脚本都假设磁盘有分区表裸设备直接用有时候会踩到一些奇怪的兼容问题。分区成本很低没必要省这一步。选分区表格式的时候有个判断标准盘容量超过 2T 就必须用 GPT。MBR 分区表受限于 32 位寻址单盘最大只能识别到 2T 左右而且主分区最多 4 个。500G 这种盘两种都行但既然 GPT 是现在的主流没有特殊下游系统兼容要求的话直接上 GPT 更省心。用parted做 GPT 分区parted /dev/sdb (parted) mklabel gpt (parted) mkpart primary ext4 0% 100% (parted) print (parted) quitmkpart里的0% 100%是相对单位表示从盘头到盘尾这样不用去算具体扇区号。如果你的系统上压根没装 parted最小化安装经常没有用fdisk交互式操作也完全没问题fdisk /dev/sdb # 依次输入n新建p主分区1分区号回车默认起始回车默认结束w保存保存之后内核会提示需要重新读取分区表有时候执行partprobe /dev/sdb或者partx -a /dev/sdb让它生效避免后面格式化时提示找不到设备。2.3 格式化文件系统选 xfs 还是 ext4CentOS 7 时代默认文件系统是 XFS这也是 RedHat 系从 RHEL7 开始全面转向 XFS 的原因。XFS 在超大文件、高并发读写、在线扩容方面表现比 ext4 更稳尤其适合数据库、日志这类场景。ext4 的优势在于生态老、工具链成熟、删除恢复方案多。我的选择习惯是这样纯数据盘、存文件、存日志、做备份XFSCentOS7 下省事也是官方默认。有大量小文件并且需要频繁fsck检查ext4 会更顺手修复时间相对短。担心后期要缩容注意 XFS不支持缩小只能扩不能缩ext4 支持缩容但流程繁琐。如果业务上确实有缩容预期选 ext4 并规划得保守一点。格式化的命令# XFS mkfs.xfs /dev/sdb1 # 或者 ext4 mkfs.ext4 /dev/sdb1mkfs.xfs默认会给你一个比较均衡的参数一般不建议乱改su、sw这些条带参数除非你清楚底层阵列的几何结构。我有次为了优化给一块 RAID 盘手动设了 stripe 参数结果反而比默认慢后来老老实实退回默认值。3. 临时挂载和开机自动挂载差别不止一个 -a3.1 临时挂载先用 mount 验证一次再写配置格式化完不要直接改/etc/fstab先用mount手动挂一次确认盘真的能用mkdir -p /data mount /dev/sdb1 /data df -h | grep data能正常看到/data的容量和使用率说明从分区到文件系统这一整条链路是通的。如果这一步就报错那就先别往下走回去查格式化和分区有没有问题。临时挂载的缺点是重启就丢——挂载关系只存在内存里系统一重启就没了。所以真正要长期使用必须写进/etc/fstab。3.2 写 fstab 之前先拿到 UUID这是我在生产环境里见过最多故障的一个点。很多人图省事直接在 fstab 里写/dev/sdb1 /data xfs defaults 0 0然后某天换了个插槽或者加了新盘设备名顺序一变sdb1变成了系统盘上别的分区系统直接进不去救援模式只能挂光盘进去改 fstab。正确的做法是用 UUIDblkid /dev/sdb1输出类似/dev/sdb1: UUIDa1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx TYPExfs把这串 UUID 抄进 fstabUUIDa1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data xfs defaults 0 0fstab 的六个字段分别是设备标识、挂载点、文件系统类型、挂载参数、dump 备份标志、fsck 检查顺序。最后两个字段基本都是0 0数据盘不需要开机 fsck设成 0 能让开机快一点也避免大容量盘 fsck 卡住启动。3.3 用 mount -a 验证而不是直接重启写完 fstab 之后千万别直接重启去验重启失败就要进救援模式了。正确姿势是用mount -a它会把 fstab 里所有还没挂载的条目都挂一遍有语法错误或者 UUID 写错会当场报错不会等到重启才暴露。报错信息一般很直白告诉你哪一行有问题。确认mount -a无报错、df -h能看到新挂载点再去做别的。提示如果你的挂载点路径之前已经有数据比如/data目录下本来就有一堆文件挂载之后这些文件会被遮住实际访问的是新盘的目录。要么提前把原目录清空要么换个空目录当挂载点。还有一个隐藏细节写进 fstab 的挂载选项里defaults其实是个很多选项的集合包含rw、suid、dev、exec、auto、nouser、async。如果这块盘只是用来存备份、不需要执行任何程序加上noexec,nosuid会更安全一些能防止有人在上面放个脚本被意外执行。4. LVM 才是扩容的真正主角4.1 为什么扩容要绕道 LVM而不是直接 resize上面讲的是新盘挂载属于从无到有。但更常见也更让人头疼的场景是某个已有分区尤其根分区/或者/home空间快满了想把新加的硬盘容量扩进去。这个场景下如果原来是直接分区格式化的比如/dev/sda2直接是 ext4扩容会非常别扭因为设备是固定大小往里扩没有中间层可以周转。LVM逻辑卷管理解决的正是这个问题。它通过三层抽象把物理磁盘和最终文件系统解耦层级全称作用PVPhysical Volume 物理卷把物理分区/磁盘标记为 LVM 可用VGVolume Group 卷组由多个 PV 组成的存储池容量可动态增减LVLogical Volume 逻辑卷从 VG 里切出来的虚拟分区就是最终格式化的对象理解这三层之后扩容的逻辑就变得非常自然新硬盘先变成 PV加入已有的 VG 扩容存储池再从 VG 里给目标 LV 分空间最后对文件系统做扩容让系统认这块新空间。整个过程原有数据完全不动也不需要卸载分区。用pvs、vgs、lvs三个命令可以快速看当前 LVM 布局pvs vgs lvsCentOS 7 默认装系统时就会建一个叫centos的卷组根分区/是里面的root逻辑卷。这就是为什么很多人发现自己的根分区明明没分区却能被 LVM 管理着。4.2 从新盘到还能用的额外空间完整链路假设我们要把新的 500G 盘/dev/sdb加进现有 VG并把空间全部分给根分区。整个链路是这样# 1. 把新盘做成 PV pvcreate /dev/sdb # 2. 查看现有 VG 名字假设是 centos vgs # 3. 把新 PV 加入 VG vgextend centos /dev/sdb # 4. 确认 VG 空间已经变大 vgs # 5. 给根 LV 扩容lvextend 加 -r 会自动同步扩容文件系统 lvextend -r -l 100%FREE /dev/centos/root第 5 步的-l 100%FREE表示把 VG 里剩余的所有空闲空间都加给这个 LV。如果你不想全用完、要留一部分给别的 LV可以写-L 200G这样的绝对大小。-r参数是最省事的技巧它会自动调用xfs_growfs或resize2fs把文件系统同步扩上去省得你手动再执行一次文件系统扩容命令。如果不用-r那就要分两步走# 先扩 LV lvextend -l 100%FREE /dev/centos/root # XFS 用这个 xfs_growfs / # ext4 用这个 resize2fs /dev/centos/root这里有个新手最容易踩的坑lvextend只是把逻辑卷的边界扩大了文件系统本身并不知道所以df -h看到的容量还是老的。必须执行xfs_growfs或resize2fsdf -h才会显示新容量。我第一次扩容的时候就在这一步卡了半天还以为扩容失败了。注意 XFS 的xfs_growfs参数是挂载点比如/而 ext4 的resize2fs参数是设备路径比如/dev/centos/root或/dev/sdb1这俩别搞混弄错会报错。4.3 新盘不加入老 VG 的另一种做法不是所有场景都适合把新盘塞进已有 VG。如果你的目的是新建一个独立的挂载点比如把备份数据、日志数据单独放一块盘上便于管理和迁移那就不要动 LVM直接按第 2、3 节的流程走分区、格式化、挂载就行。判断标准很简单目标是把新空间并到已有分区比如/或/home不够用→ 走 LVM 扩容链路。目标是新开一个独立的数据目录比如/backup、/data2→ 直接挂载新盘不用碰 LVM。我个人的项目里业务数据的盘倾向独立挂载方便单独做快照备份和故障隔离系统盘和运行目录则用 LVM方便后期统一扩容。5. 几个我实际踩过、文档里不会写的坑5.1 扩容前忘了留空间swap 被吃掉了有次给一台测试机扩容我用lvextend -l 100%FREE /dev/centos/root把 VG 掏得一干二净结果后来发现这台机器 memory 偏小、swap 用得很勤需要扩 swap 的时候发现 VG 里一点空闲都没有了只能再加新盘。这个教训是如果 VG 里还有别的 LV尤其 swap扩容前先vgs看一眼空闲空间用-L xxxG精确给量不要无脑100%FREE。5.2 /etc/fstab 用设备名重启后系统进不去前面提过一次这里再强调因为它真的是最高频的生产事故。设备名会变UUID 不会变。养成习惯fstab 里一律写 UUID。如果已经写错了导致系统起不来进救援模式后要先用mount -o remount,rw /让根分区可写再改 fstab。5.3 分区后忘记 partprobe格式化报设备不存在用 fdisk 建完分区有时候/dev/sdb1这个设备节点还没被内核创建出来直接mkfs.xfs /dev/sdb1会提示 No such file or directory。这时候执行partprobe /dev/sdb或者partx -a /dev/sdb内核重新读一遍分区表设备节点就有了。5.4 XFS 不能缩容别指望 reverse经常有人问怎么把 XFS 的分区缩小。答案是不能缩只能通过xfsdump备份数据、重建小分区、xfsrestore还原这个笨办法。所以规划 XFS 分区时宁可小一点后期加盘扩容也不要一开始就分得很大然后想缩。ext4 虽然支持缩容但必须先umount而且缩容前要e2fsck检查流程也不轻松。5.5 挂载点如果有旧数据会被隐藏挂载一个盘到已经存在的非空目录原目录的内容会被临时隐藏df看的是新盘的容量但原数据其实还在那个目录的底层。如果你挂载后发现文件没了别慌先umount再看看。要避免这种情况挂载点用专门新建的空目录。5.6 虚拟机环境下的额外一步如果你是在 VMware 或 VirtualBox 里做实验光在虚拟机的硬件设置里加了新盘还不够。VMware 下加完盘一般能热识别但部分版本需要重启虚拟机VirtualBox 加完盘基本都建议重启一次或者用echo - - - /sys/class/scsi_host/host0/scan手动触发扫描。我见过好几次在图形界面加了盘、进去lsblk死活看不到纠结半天最后才发现虚拟机需要重启。6. 一套可以直接抄走的验证清单每次挂载或扩容做完我都会习惯性走一遍下面这套检查三分钟之内就能确认一切正常检查项命令预期结果设备是否识别lsblk新盘出现在列表里有分区和挂载点容量是否正确df -h挂载点容量和磁盘实际大小吻合fstab 语法是否正确mount -a无任何报错输出开机挂载是否生效findmnt /data能看到挂载源是 UUIDxxx扩容后文件系统是否同步df -h对比lvsLV 大小和 df 显示容量一致是否有磁盘错误dmesg -T | tail -50没有 I/O error、EXT4-fs error 之类findmnt这个命令比mount | grep好用输出结构化能直接看到挂载源、挂载点、文件系统类型和挂载选项排查 fstab 问题特别顺手。另外如果要把这套流程做成可复用脚本我一般会加set -e让任何一步失败就立刻停止避免在某个命令失败之后继续往下执行把盘搞得更乱。磁盘操作这种东西出错的前一步和出错的这一步之间往往就差一个回车谨慎比什么都重要。Ubuntu 环境下有个小差异默认文件系统是 ext4LVM 卷组名通常是ubuntu-vg逻辑卷是ubuntu-lv。另外 Ubuntu 上分区工具用fdisk或parted都行但xfs_growfs默认可能没装需要apt install xfsprogs。这些差异不影响整体思路只是命令里的名字和包名要对照着换。我个人的经验是磁盘这块的东西一次搞懂、反复受用。分区、格式化、挂载、LVM 扩容这套链路看起来步骤不少但本质上就是一句话把一块物理盘变成能用的存储空间需要一层层往上叠抽象。理解了 PV、VG、LV 的分层逻辑扩容就不再是靠背命令而是能自己推出来下一步该干什么。下次再遇到加盘了但是看不到这种问题你应该能条件反射地先问一句是盘没识别还是分区没建还是只是挂载关系还没配。
返回列表