ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux磁盘扩容实战:从挂载到LVM在线扩容全指南

2026/9/24 8:51:16 拓冰建站 浏览量
Linux磁盘扩容实战:从挂载到LVM在线扩容全指南 做运维这几年最怕听到的一句话就是“那台服务器磁盘满了”。一旦根分区爆掉日志写不进去数据库直接罢工服务反复重启整个项目组都跟着紧张。而应对这种局面的常规解法不是去删日志、清缓存而是加一块新磁盘把它挂载到根目录或者指定的数据目录本质上就是给Linux系统“接一块更大的硬盘”。这篇文章我把自己实际处理过的几种挂载扩容场景完整拆一遍把分区、格式化、挂载、写入fstab、根目录数据迁移、LVM在线扩容这些环节讲透适合刚接触Linux的运维新手也适合那些接手了服务器却不知道怎么安全扩容的朋友。1. 动手之前先看盘搞清几个基本概念1.1 设备名、分区、文件系统与挂载点的关系很多人第一次看到df -h和lsblk的输出会蒙圈一堆/dev/sda1、/dev/mapper/centos-root之类的名字。这里我建议先建立几个基本概念。物理磁盘在Linux里对应的是设备文件比如/dev/sda是第一块SATA/SCSI磁盘/dev/sdb是第二块云服务器上常见的是/dev/vda、/dev/vdb这种虚拟设备名。一块磁盘可以分成多个分区分区名就是在设备名后面加数字比如/dev/sdb1就是第二块磁盘的第一个分区。分区本身不能直接用得在上面创建文件系统也就是执行格式化操作常见的文件系统有 ext4、xfs、btrfs。之后还要把这个文件系统挂载到某个目录下这个目录就是挂载点。访问挂载点目录本质就是在读写这块磁盘上的文件系统。用生活化的方式理解磁盘是一间毛坯房分区是隔出来的房间文件系统是房间里的柜子挂载点就是房间的门。你走进门之后能用到的东西都在柜子里。Linux系统里所有文件都是从根目录/演化出来的根目录本身也一定挂载在某块磁盘分区的文件系统上。1.2 为什么不能简单地把根目录原地扩大很多新手的第一反应是既然根目录空间不够那我直接给它扩容不就行了这个想法本身没错但关键是“怎么扩”。如果系统安装时没有使用LVM逻辑卷管理那么根文件系统所在的分区大小在格式化那一刻基本就固定了。虽然可以用resize2fs去扩大ext4文件系统但前提是底层分区本身要有剩余空间。物理磁盘分区没有可伸缩能力分区表定义的就是固定大小除非你用fdisk删除分区再重建但那样数据基本不保。结论就是要么一开始规划好要么加新盘加新盘是绝大多数场景下最稳妥的扩容手段。加新盘之后有两个方向一是把新盘挂载到某个指定目录比如/data、/home让新数据往新盘上放二是直接把新盘整个替换掉原有的根目录让系统根分区变得很大。两个方向各有适用场景接下来的选型分析我会展开讲。2. 扩容方案选型先想清楚再做避免白忙2.1 方案一新增数据盘挂载到指定目录如果你的根分区还不是马上要炸只是某个目录比如/home、/var/lib/mysql、/data的数据增长太快那就没必要动系统盘。给服务器插一块新硬盘分区、格式化、挂载到对应目录后续数据都写到新盘上属于风险最低、对业务影响最小的方案。这种方案的操作核心就三步创建分区、格式化、挂载。如果目录原来已经有数据还需要把旧数据迁移到新盘再重新挂载。最大的坑也出在这部分如果旧目录里有正在被进程写入的数据迁移时要注意服务停止的窗口否则容易出现丢数据或者数据不一致。2.2 方案二新增数据盘直接扩容根目录根目录空间已经告急比如df -h /显示100%连日志都写不进去的时候就只能做根目录级别的扩容了。这个方案有两条路第一如果系统盘原本就是LVM管理的那最简单新盘加入卷组再把逻辑卷扩大根文件系统在线变大不需要停机。第二种情况是系统盘没用LVM根目录就是一个普通分区。这种情况下需要把新盘格式化后挂载到临时目录把旧根目录完整复制过去然后改启动引导让系统直接从新盘启动。本质是“整盘替换”操作复杂度和风险都高不少一个不留神就开不了机。我自己处理这类问题时会先执行lsblk和df -h快速判断根分区是不是LVM。如果输出里有/dev/mapper/路径基本就是LVM如果直接是/dev/sda2之类的普通分区路径就得考虑整盘替换的数据迁移方案。2.3 方案三LVM逻辑卷在线扩展LVM是Linux环境下比较推荐的一种磁盘管理方式它把物理磁盘抽象成物理卷PV、卷组VG和逻辑卷LV。逻辑卷可以跨磁盘、可以在线扩展这也是企业服务器上非常常见的部署方式。说句实话如果是云服务器默认镜像装出来的系统很多发行版现在默认就用LVM了比如CentOS安装时如果选了自动分区根目录多半会做成LVM。遇到这类系统加新盘扩容根目录非常顺滑先用pvcreate把新盘初始化为物理卷然后vgextend加入根目录所在的卷组再用lvextend扩大逻辑卷最后用resize2fs或xfs_growfs同步文件系统大小。整个过程不用停机不用迁移数据是我最喜欢的一种方案。3. 通用实操把新磁盘挂载到指定目录3.1 确认新盘是否被系统识别拿到一块新盘第一件事是确认系统有没有识别到它。我习惯用lsblk这个命令会以树形结构列出所有块设备非常直观。比如新插入一块100G的盘执行后能看到/dev/sdb下面没有分区子节点整个设备的大小就是100G。如果lsblk里看不到再用fdisk -l或者cat /proc/partitions确认。这里要留意设备名云服务器上有时显示的是/dev/vdb有些虚拟化环境里是/dev/xvdb处理方法都一样只是设备名不同。注意操作前一定要再次确认设备名千万不要把系统盘当成新盘分区了。拿不准就对比一下df -h里的设备路径和lsblk的输出系统盘一定挂载在/上。3.2 分区fdisk与parted怎么选确认设备名后开始分区。小于2T的盘用传统的fdisk就够了大于等于2T的盘建议用parted配合GPT分区表因为传统的MBR分区表最大只能识别2T空间。以一块/dev/sdb大小为1T的盘为例用fdisk分区的过程如下fdisk /dev/sdb进入交互界面后依次输入n 创建新分区 p 主分区 1 分区号 回车 使用默认起始扇区 回车 使用默认结束扇区即整块盘 w 保存并退出操作完用lsblk或fdisk -l /dev/sdb检查应该能看到/dev/sdb1了。如果是大于2T的盘用partedparted /dev/sdb mklabel gpt mkpart primary 0% 100% quit这里我提醒一下如果没有特殊需求新盘就建一个分区把整块盘都用上。分太多区反而给后续管理添麻烦。3.3 格式化ext4还是xfs分区完成后要创建文件系统。Linux下常见的两个选择是 ext4 和 xfs。ext4是老牌文件系统兼容性好CentOS 6及以前是默认选择xfs在CentOS 7之后成为默认处理大文件和高并发场景表现更好。两者现在都用得很广泛如果你服务器的系统盘是xfs那新盘也用xfs保持一致就行如果系统盘是ext4就格式化ext4。没必要在这个问题上纠结太多。执行格式化的命令mkfs.ext4 /dev/sdb1或者mkfs.xfs /dev/sdb1格式化过程中会输出一些文件系统信息完成后用blkid /dev/sdb1查看记录下它的UUID这个在后面配置开机自动挂载时要用。3.4 创建挂载点并挂载挂载前需要先创建一个“门”也就是空目录。mkdir -p /data mount /dev/sdb1 /data df -h执行完df -h如果能看到/dev/sdb1挂载在/data下说明临时挂载成功。但这种挂载方式是临时的服务器重启后就会失效。要永久生效必须写入/etc/fstab。用vim /etc/fstab打开文件在末尾加一行UUID你的UUID号 /data ext4 defaults 0 0各列含义分别是设备标识、挂载点、文件系统类型、挂载参数、是否dump备份、是否fsck检查。这里强烈建议用UUID而不是设备名因为设备名在系统重启后可能变化UUID是稳定的唯一标识。写完fstab后不要急着重启先执行umount /data然后mount -a这个命令会读取fstab并尝试挂载所有条目。如果没报错再df -h确认说明配置没问题。3.5 指定目录已有数据时的迁移操作如果挂载的目录是/home而/home下已经有用户数据了直接挂载新盘会导致原有数据不可见。很多人第一次遇到这种情况会以为数据丢了其实是新盘把原来的目录内容遮住了。正确的操作顺序是这样mkdir -p /mnt/oldhome mount /dev/sdb1 /mnt/oldhome先把新盘挂到临时目录然后用rsync把/home/下的现有数据复制到新盘上rsync -aXS --progress /home/ /mnt/oldhome/复制完成后建议检查一下目录大小是否一致du -sh /home du -sh /mnt/oldhome确认没问题卸载新盘再挂载到/homeumount /mnt/oldhome mount /dev/sdb1 /home如果复制过程中有服务在往/home写入数据最好先停服务或者用rsync做增量同步最后一次同步时短暂停止写入然后重新挂载。实际操作中我一般会选凌晨业务低峰期做这个操作尽可能降低对用户的影响。4. 进阶实操用新盘扩容根目录4.1 第一步判断根目录处于哪种管理模式做根目录扩容前先确认根分区是普通分区还是LVM逻辑卷。这个判断直接决定后面走哪条路。df -h / lsblk lvdisplay如果df -h /的输出里设备路径是/dev/mapper/centos-root这类说明用了LVM如果直接是/dev/sda2这类说明是普通分区。另外也可以看lsblk输出如果看到vgname-lvname或者/dev/mapper/基本就确认LVM无误。4.2 LVM逻辑卷在线扩容根目录如果是LVM管理那恭喜这是最舒服的场景。假设新盘是/dev/sdb根目录所在卷组是centos操作步骤如下。初始化为物理卷pvcreate /dev/sdb把物理卷加入卷组vgextend centos /dev/sdb查看卷组和逻辑卷名vgdisplay lvdisplay假设根逻辑卷名是/dev/mapper/centos-root把剩余所有空间都分配给根逻辑卷lvextend -l 100%FREE /dev/mapper/centos-root逻辑卷扩大后文件系统还没有感知新大小需要同步。xfs用xfs_growfs /ext4用resize2fs /dev/mapper/centos-root最后用df -h /确认根空间应该已经变大了。整个过程不需要重启服务器数据零丢失这也是为什么我一直推荐有条件就用LVM。4.3 非LVM场景整盘替换根目录流程如果根目录不是LVM那扩容思路就是“搬家”把新盘做成新根把旧根的数据复制过去让系统从新盘启动。首先对新盘分区格式化和之前讲的步骤一样建议给新盘创建一个足够大的分区比如/dev/sdb1格式化xfs或ext4。然后把新盘挂载到临时目录比如/mnt/newrootmkdir -p /mnt/newroot mount /dev/sdb1 /mnt/newroot用rsync复制根目录数据注意要保留权限、链接、设备文件等属性rsync -aAXv / /mnt/newroot/ --exclude{/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lostfound}这里排除的都是虚拟或临时目录它们不需要复制系统启动时会自动生成。复制过程可能比较久耐心等它跑完就行。复制完成后需要修改新盘上的/etc/fstab确保系统从新盘启动时能正确挂载根分区。用blkid /dev/sdb1查UUID然后编辑/mnt/newroot/etc/fstab把根目录对应行的UUID改成新盘的UUID。接着需要重新安装引导程序到新盘上。这里的操作因发行版而异以常见的grub2为例mount --bind /dev /mnt/newroot/dev mount --bind /proc /mnt/newroot/proc mount --bind /sys /mnt/newroot/sys chroot /mnt/newroot /bin/bash grub2-install /dev/sdb grub2-mkconfig -o /boot/grub2/grub.cfg exit umount /mnt/newroot/dev umount /mnt/newroot/proc umount /mnt/newroot/sys umount /mnt/newroot最后关机把新盘设置成第一启动项或者直接拔掉旧盘开机后确认系统正常再用新盘空间替换旧盘。这个方法我实际做过几次风险确实偏高操作前一定备份重要数据平时没有十足的把握不推荐在生产环境直接做。5. 常见问题与故障排查5.1 fstab写错导致开机进入紧急模式配置/etc/fstab时一个字符写错重启后系统会直接进紧急模式或者卡在等待挂载的界面这是新手最容易踩的坑。遇到这种情况不用慌输入root密码进入维护模式执行mount -o remount,rw /然后把fstab里刚写的错误行注释掉或改正再reboot。所以每次改完fstab我都会执行一遍mount -a验证能有效避免这种开机灾难。5.2 挂载后目录里原有文件“不见了”根目录或/home这种非空目录被新盘挂载后原来的文件不会被删除只是被遮住了。用mount挂载一个新文件系统到非空目录时原目录内容会被隐藏。如果遇到这种情况正确的姿势是先把原来目录里的内容转移比如临时把新盘挂到别处用rsync复制原目录内容复制完成后再挂载过去。千万不要直接格式化原来的目录内容。5.3 卸载时提示target is busy执行umount /data时如果提示target is busy说明有进程正在使用这个目录。可以用fuser -km /data强制杀掉占用进程或者用lsof D /data查看具体是哪些进程手动停掉相关服务之后再卸载。运维讲究稳我一般优先手动处理fuser是最后手段。5.4 云服务器重启后挂载点消失新盘挂载后如果发现重启就丢了百分之百是没写fstab。有的云服务器在控制台单独挂载数据盘后系统里对应设备名可能是/dev/vdb、/dev/nvme1n1等但设备名每次重启后有改变的可能使用UUID写在fstab里就是关键。配置方法上面的章节已经写过核心就是blkid查UUID写入fstab。5.5 磁盘空间显示满但是找不到大文件还有一种情况比较隐蔽df显示磁盘使用100%但du统计出来的目录大小远没有那么多。这通常是文件被进程删除但还在被占用导致的典型的比如日志文件被后台进程打开rm之后空间不释放。可以执行lsof | grep deleted找到对应的进程重启或重载日志服务空间就会释放出来。挂载扩容的个人实操心得处理过几次磁盘告警之后我现在拿到一台磁盘不足的服务器顺序永远是先lsblk看盘、df -h看挂载、lvdisplay看LVM。能走LVM在线扩容的一定优先走LVM不行再考虑指定目录挂载最后才是整盘替换。这个顺序能最大程度降低风险。给新手的建议是先拿一台测试虚拟机练手把分区、格式化、rsync迁移、fstab配置这一套流程跑熟再去碰生产环境。磁盘操作没有后悔药但多备份、多验证几乎所有问题都能兜住。