Linux磁盘扩容实战:用LVM将/home空间在线分配给/root

发布时间:2026/9/17 3:57:00
Linux磁盘扩容实战:用LVM将/home空间在线分配给/root 1. 先搞清楚现状你的磁盘到底是LVM还是裸分区我翻了一圈网上的求助帖发现问“home空间怎么给root”的人十个里有八个是当年装系统时随手选了自动分区后面磁盘告急才想起来补救。还有不少人是买的VPS或云主机厂商默认给的系统盘规划就很离谱——比如根分区只有20G/home竟然占了100G可实际上/home里除了一些没用的示例文件几乎什么都没有。这个操作本身不难但真正难的是你的磁盘用的是LVM逻辑卷管理还是传统裸分区。这两套方案的操作逻辑完全不同搞错了轻则白折腾重则直接把系统搞崩溃。所以动手之前先把下面这几条命令敲一遍摸清家底# 查看磁盘和分区结构 lsblk # 查看文件系统使用情况 df -hT # 查看LVM相关状态 pvs vgs lvs看输出结果的时候重点盯三件事第一lsblk的输出里有没有LVM字样。如果看到类似sda3 lvm /或者vg-root这种结构说明你用的是LVM那么恭喜你后面要走的路线非常顺在线就能完成不用重启、不用进救援模式、不用U盘启动。如果lsblk显示的是/dev/sda1直接挂载到/、/dev/sda2直接挂载到/home这种纯裸设备结构那就得走另一条更麻烦的路子后面第三章详细说。第二/home用的什么文件系统。用df -hT看如果是xfs记住xfs文件系统不支持缩小这是Linux文件系统的一个硬性限制。如果是ext4那就没问题可以随便折腾。这个点直接决定了你的操作顺序和方案选择后面细说。第三LVM卷组里有没有空闲空间。用vgs看如果VFree列不是0说明卷组里还有空闲空间没分配事情就好办很多如果VFree是0那就要从现有的逻辑卷里挤空间出来也就是把/home的容量退还一部分给卷组再分配给/root。我先说个生活化的比喻把LVM讲明白传统分区就好比买房子的时候直接把墙体砌死了客厅多大就是多大真想改格局就得砸墙。而LVM相当于一个精装房里的活动隔断客厅、卧室之间用的都是可拆卸的隔板想调整空间大小只需要挪动隔板就行不需要动房子的承重结构。所以如果你的系统是LVM那这篇博客的核心操作你都能用得上。如果你是非LVM的裸分区看到第四章也有折中方案。2. LVM方案实操把/home的空间在线转给/root先把话放在前面任何涉及磁盘分区的操作都有风险请务必先备份数据再动手。以下流程我在CentOS 7/8、Ubuntu 20.04/22.04、以及银河麒麟、统信UOS这些国产系统上都验证过流程是一致的但每台机器环境不同谨慎为上。2.1 备份/home里的数据很多人觉得这一步多余尤其是那些/home下基本没什么个人文件的机器。但我见过太多翻车现场有人误以为lvremove只是把逻辑卷“卸载”实际上它会把逻辑卷整个删除连同里面的数据一起抹掉连进回收站的机会都没有。所以备份不是可选项是必选项。备份方法很简单直接打包tar -czvf /root/home_backup.tar.gz /home/*如果/home里有大量文件而且不想打包也可以用cp -a复制mkdir -p /root/home_backup cp -a /home/* /root/home_backup/cp -a会保留权限、属主、时间戳等属性恢复的时候直接拷回去就行。打包方式更保险一个tar包不会漏文件就是如果数据量很大的话时间比较长。2.2 卸载/home并确保没有进程占用卸载前要特别提醒如果/home是一个独立的逻辑卷才需要卸载如果你根本看不到/home对应独立分区那大概率/和/home是在同一个根分区里这种情况不需要做任何操作。怎么确认再看一眼df -h如果/home不出现在独立行里说明它就是根分区下的一个普通目录根本不存在“把home扩容给root”的问题。这种情况你真正要解决的是根分区本身太小处理思路完全不同。但既然你能看到/home和/是两个独立行说明它们各自是独立的文件系统。接下来卸载umount /home如果系统提示target is busy说明有进程还在/home下开着文件。用fuser找出并杀掉这些进程fuser -km /home然后再次尝试卸载。-k是kill-m是挂载点意即杀掉所有占用/home的进程。如果fuser没有安装就手动查lsof D /home看看是哪个进程在用/home的文件。有时候是一些自启动服务比如samba、docker、各种数据库导致的需要先停掉服务再卸载。实在卸载不干净最稳妥的办法是重启系统然后进入单用户模式或者救援模式挂载状态下不做任何操作直接在未挂载的状态下卸载/home然后完成后续步骤。当然如果是远程服务器不推荐为了这个单独跑到机房去尽量用fuser解决或者干脆走后面说的备份恢复方案。2.3 删除/缩小/home逻辑卷腾出卷组空间确认/home成功卸载之后现在要腾出空间。这里有两种路数路数A直接删除/home逻辑卷重新建一个小的适合/home里没数据或数据已备份而且以后也不打算整太多东西的场景。参考命令lvremove /dev/vg_name/home执行后会提示确认输入y。注意vg_name换成你实际的卷组名用vgs查看。比如卷组叫centos那就写/dev/centos/home。删除之后卷组的空闲空间就变大了。可以用vgs确认。路数B不删卷只是缩小适用于ext4XFS不行如果/home是ext4文件系统可以用lvreduce直接缩小逻辑卷# 先把文件系统缩小到目标大小例如20G resize2fs /dev/vg_name/home 20G # 再把逻辑卷缩小到同样大小 lvreduce -L 20G /dev/vg_name/home但是如果你的/home是xfs文件系统这条路走不通。xfs不支持在线缩小唯一能把xfs的/home空间让出来的办法就是备份 - 删除/重建逻辑卷 - 恢复数据。所以方案B仅限ext4。我个人更推荐方案A因为简单直接也很少出幺蛾子。前提是数据备份好。2.4 把腾出来的空间全部或部分划给/root/home的空间腾出来之后接下来就是给根目录扩容。先看根目录对应的逻辑卷名df -h /输出里能看到类似/dev/mapper/centos-root、/dev/vg_name/root这样的路径。也就是/dev/vg_name/root。接下来用lvextend扩展逻辑卷。如果想把卷组里所有空闲空间都划给根分区lvextend -l 100%FREE /dev/vg_name/root-l 100%FREE的意思是把卷组里所有空闲的PE物理扩展块都添加到root这个逻辑卷里。也可以用-L 80G指定增加80G空间写法更直观。执行完之后逻辑卷大小已经变了但文件系统还没有感知到这个变化。这时候要根据文件系统类型执行不同的命令如果根分区是xfsCentOS/RHEL默认就是xfsxfs_growfs /注意xfs用的是xfs_growfs后面跟挂载点不需要指定设备路径。如果根分区是ext4很多Ubuntu/国产系统是ext4resize2fs /dev/vg_name/root这两个命令的作用都是让文件系统扩展到逻辑卷的新大小。区别在于一个针对xfs一个针对ext4。2.5 重建/home并恢复数据现在给/home重新分配空间。如果你刚才直接删除了home逻辑卷需要重建它# 创建新的home逻辑卷比如分配20G lvcreate -L 20G -n home vg_name # 格式化这里看你的需求ext4兼容性最好如果你之前是xfs也可以继续用xfs mkfs.ext4 /dev/vg_name/home然后挂载回去mount /dev/vg_name/home /home千万记得检查/etc/fstab里的配置。很多发行版在装系统的时候用的是UUID方式挂载重新格式化之后UUID会变导致开机无法自动挂载/home。先用blkid看一下新分区的UUIDblkid /dev/vg_name/home然后把/etc/fstab里对应的那行改成新的UUID或者干脆改成设备路径不推荐但比UUID变来变去省事。改完之后用mount -a验证一下再reboot测试能否正常开机。最后把备份的数据恢复回去cd / tar -xzvf /root/home_backup.tar.gz或者拷贝回去cp -a /root/home_backup/* /home/到这里整条线就跑通了/home的空间缩了/root的空间涨了数据也没丢。3. 非LVM方案没有逻辑卷怎么腾挪如果你的lsblk输出里根本没有lvm这个字眼根分区和/home分区就是两块独立的裸分区那上面的操作完全不能用。这种场景下有几种解法我按推荐程度排序。3.1 备份删除重建法说白了就是把/home的数据备份走然后删除/home分区把磁盘上空出来的空间用growpart或者fdisk分配给根分区所在的物理分区或者更极端一点——干脆home不要了把整个磁盘的全部空间都给根分区。这是最直白、风险也最高的一种方式因为操作到分区表级别一旦断电、命令写错整个盘可能就全废了。一个例子系统盘是/dev/sda根分区是/dev/sda1home分区是/dev/sda2而且home在sda2的末尾正好可以把sda2删掉再把sda1扩展到整个磁盘。# 1. 备份home数据到外部存储或root cp -a /home/* /root/home_backup/ # 2. 卸载home并删除分区 umount /home fdisk /dev/sda在fdisk交互页面里d删除分区选择home所在的分区号一般是2w保存退出。然后用partprobe让内核重新读取分区表。partprobe /dev/sda再把根分区扩大到整个磁盘# 用growpart比较方便 growpart /dev/sda 1growpart需要安装yum install -y cloud-utils-growpart或apt install -y cloud-guest-utils它做的事情就是把根分区扩展到磁盘剩余空间。最后扩展文件系统# 如果是ext4 resize2fs /dev/sda1 # 如果是xfs xfs_growfs /然后新home怎么办有两个选择一是重建一个小的home分区二是直接在根分区下建/home目录顶上以后所有用户的家目录都落在根分区里。这个就看你的实际需求。这个方案的痛点是必须在卸载/home的状态下操作而且一旦分区表写错就彻底完蛋。所以如果不是特别紧急我一般不推荐新手直接干这个。3.2 GParted图形化操作如果你不怕麻烦愿意启动到救援环境或U盘系统里那GParted是最直观的工具。准备一个Ubuntu系统U盘启动后进入试用模式Try Ubuntu打开GParted右键/home分区选择卸载Unmount然后右键选择Resize/Move把大小缩小到目标值再把根分区扩展操作完成后点击应用。这里要提醒一点GParted操作分区表时不让目标分区处于挂载状态。所以你必须在Live CD环境下操作不能在当前运行的系统里动当前分区的分区表。这个过程可视化、容错率高一些但步骤其实和上面fdisk的方式差不多只是把命令行换成了图形界面。这个方法适合没有任何经验的新手或者看得懂图但不放心敲命令的人。唯一的要求是得有条件用U盘启动机器远程服务器就没办法了。3.3 折中方案/home目录迁移如果不想动分区表风险最小但效果也不差的方案是把/home的数据迁移到根分区下重新挂载一个绑定的目录。具体思路是在/ root下新建一个目录比如/rootdiv/home_data名字随意把根分区的一部分空间当作/home来用把原来/home里的数据都搬过去以后所有用户的家目录实际落在根分区里原来的/home分区里的空间就空着了。这个方案适用于单个分区容量不够的双分区场景把/home的业务数据迁移然后把根分区扩容最后把/home作为目录指到根分区里。但说句实话如果你的磁盘物理空间总量是固定的这个方案并不能“凭空变出”空间来本质是把原来分给home的空间浪费掉对你root空间的增长没有任何帮助。唯一能真正利用home空间的做法还是得删掉或者缩小原来的home分区。打个比方你只有一套两居室的房子非要把客厅扩大一倍就只能把卧室拆了。所谓“不拆墙”的折中方案其实只适用于“把家具挪个地方”的场景没办法改变房间的实际面积。所以在非LVM场景下老实备份、删分区、扩展根分区是最直接有效的路径。4. 常见问题与排查技巧实录4.1 lvextend之后df -h没变化这是新手最容易懵的地方。逻辑卷已经从20G变成100G了但df -h看根目录还是20G。原因很简单lvextend只是扩展了逻辑卷没有扩展文件系统。两个文件系统对应两个命令文件系统扩展命令说明xfsxfs_growfs /针对挂载点不用指定设备ext4resize2fs /dev/xxx/root必须指定逻辑卷设备路径执行完第4步之后再df -h就能看到变化。如果还是没变检查一下是不是逻辑卷名字写错了用lvdisplay看看实际路径。4.2 umount /home报错 target is busy这个错误几乎每个人都会遇到多半是当前shell的当前目录就在/home下、或者有服务在读写/home下的文件。解决办法cd / fuser -km /home sleep 2 umount /home如果fuser没有就用lsof查占用进程。实在不行就重启系统在开机时按e编辑grub进入单用户模式single再卸载/home操作。但这属于最后一招一般用不到。还有一个小细节不要在/home目录下执行任何命令否则你用的那个进程bash自身就站在/home里怎么会让你卸载呢。闭着眼睛都知道会报busy。4.3 删除home逻辑卷后系统提示找不到用户目录这大概率是你没把/home挂载回去或者/etc/fstab里的挂载项没更新。系统开机后找不到/home分区但登录用户又必须访问/home/用户名这个目录所以能看到/home变成了一个挂在根目录下的空目录。检查方法lsblk -f cat /etc/fstab确保fstab里有一行/dev/vg_name/home /home xxx defaults 0 0或对应的UUID执行mount -a验证。另外记得新格式化的/home目录里有个lostfound是正常的恢复数据的时候直接往下拷就行不用理会lostfound目录。4.4 root分区扩完之后系统无法启动进入紧急模式这个比较吓人但多半不是你把系统搞坏了而是fstab里的UUID变了、对应逻辑卷找不到了。开机进紧急模式后登录root执行journalctl -xb看日志里有没有Timed out waiting for device或者UUID not found类似的报错。有的话改一下/etc/fstab把对不上号的UUID改成当前的或者改成逻辑卷路径echo /dev/vg_name/home /home ext4 defaults 0 0 /etc/fstab这里要特别提醒改fstab的时候一定要小心不要随便删掉别的条目。fstab写错一条开机就可能崩所以建议改之前先备份cp /etc/fstab /etc/fstab.bak。4.5 xfs文件系统的home也能缩吗再强调一次xfs文件系统不支持缩小只能扩大。网上有人说什么xfs_growfs -D能缩小那是误读文档实际操作中没人成功过。所以如果你的home是xfs别想着“缩小home”直接备份-删卷-重建-恢复这是唯一路线。那xfs的home能不能不删直接把数据迁移到别的分区然后把home分区卸下来给root呢思路可以实现路径就是上面说的“备份删除重建法”本质还是删卷重建xfs自家没法缩。4.6 为什么我lvextend之后重启机器又变回去了重启后root尺寸变回原样大概率是启动时内核加载的逻辑卷元数据不同步。一般出现在你用LVM操作后忘了执行vgscan --mknodes vgchange -ay这两条命令会让LVM重新扫描卷组并激活逻辑卷。如果还是不行就重启一遍试试通常重启后LVM会自己恢复正常。5. 一点实践后的真心话说回开头的问题。为什么很多人把/home空间划给/root后后面还会觉得不够用、又要折腾一次因为问题的根源根本不在“怎么扩容”而在于最开始分区的时候就没有规划好。现在很多Linux发行版装系统时默认就把/root分得很小比如CentOS默认只给根分区50G而把剩下的全部丢给/home。对于服务器场景来说/home往往是最不常用的目录真正的数据都在/、/var、/opt、/srv下面这种默认分区方案就是逼着用户日后折腾。所以我的建议是新装系统、买VPS、或者重装虚拟机的时候如果不知道怎么分就直接把整个系统盘都挂给/只分一个根分区就完事。什么/boot、/home、/var单独分区除非你明确知道自己的用途否则一律不搞。你问LVM不就是为了灵活吗可很多人到最后根本不用LVM的几个高级功能就只把它当普通分区用。如果你已经装了而且遇到了本文开头的那个场景按我给的LVM流程走一遍基本十分钟内搞定。非LVM就委屈一点备份数据、滚动操作也别慌。这个操作实际上没有你想的那么神秘读几遍命令再动手成功率很高。最后再送一个小技巧操作完之后一定要顺手把分区情况记录下来。比如现在的逻辑卷布局、卷组名、UUID写在一个笔记文件里或者贴在你服务器的/wiki上。下次再出现磁盘告急的时候你不需要从头开始分析直接照着笔记做就行。我敢打赌一年后你会感谢现在的自己。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询