1. 需求整体拆解与方案选型思路
机房搬迁、存储扩容、业务下线、盘阵退役,这几年碰到的磁盘回收需求五花八门,但核心动作高度一致:把一块或者几块已经不需要的磁盘从银河麒麟v10服务器上干干净净地摘下来,既要不影响线上业务,又要保证系统重启后不报错、不自动挂载、不留下一堆悬空的逻辑卷。我见过太多人一上来就fdisk删分区,结果重启之后系统卡在紧急模式,或者lvs里还孤零零挂着几个无法激活的卷组,最后只能进单用户模式救火。所以下面这套流程是我反复验证过、在银河麒麟v10 SP1/SP2/SP3上都跑通的完整套路,从确认现状、卸载文件系统,到删除LVM、擦除分区、清理配置文件,一步一步来,小白照着做也不会翻车。
先说清楚这套操作适合谁。如果你是刚接触国产化服务器运维的工程师,手里正好有一台银河麒麟v10,需要回收数据盘或者释放LVM空间;如果你是系统集成商,在给客户做交付前要清理测试盘;又或者你的服务器上之前用LVM做过home扩容,现在业务迁移要走,盘要腾出来——这些场景都适用。涉及的关键词就是银河麒麟v10、LVM、磁盘、服务器、配置文件,整篇围绕这五个点展开,把每个命令背后的道理讲透,让你知其然也知其所以然。
1.1 什么场景下需要卸载磁盘和删除LVM
先别急着敲命令,我们得先搞清楚自己的需求属于哪一类。第一类是物理磁盘退役,比如一块1T的SAS盘要拔下来换新盘,此时磁盘上可能既有分区又有LVM,必须先把上层逻辑关系全部解除,再擦分区表,否则新盘插上去系统还认到旧的PV UUID,会报"duplicate PV"警告。第二类是LVM空间回收,之前给/home或者/data做过lvextend扩容,现在业务缩容,想把多出来的LV删掉把空间还给卷组,甚至把整个卷组删掉让磁盘回到裸盘状态。第三类是更换存储路径,服务器从本地盘切到SAN存储,原来的本地LVM要全部清理,配置文件里也不能再有残留挂载项。
这三类场景虽然细节不同,但底层的处理顺序是一样的:先停业务、再卸载文件系统、然后删除LV、VG、PV,最后擦分区、清配置、刷缓存。这个顺序不能乱,因为LVM是分层结构,PV在最底层对应物理磁盘或分区,VG在中间把多个PV聚合成资源池,LV在最上层是给文件系统用的逻辑卷。删的时候必须自上而下,就像拆积木一样,先拿掉顶上的,再拆中间的,最后处理地基。你要是反过来先删PV,系统会直接报错"PV is in use",因为VG还引用着它。
1.2 为什么不能直接用fdisk删分区
很多人图省事,fdisk /dev/sdb进去一个d删掉分区,然后w保存,觉得完事了。这在纯裸盘、无LVM的场景下勉强可行,但只要涉及LVM,这么做几乎必然出问题。原因是LVM在磁盘头部和分区的起始位置写了PV元数据(LVM2_member标签),fdisk删了分区表,PV的元数据可能还残留在磁盘上,系统启动时pvscan会扫到这些孤儿PV,虽然不会自动激活,但会在日志里刷一堆警告,有些版本还会导致systemctl status lvm2-pvscan@服务报failed。
更稳妥的做法是分两步走:先让LVM自己把关系解除干净(vgremove、pvremove),再去动分区表。这样PV元数据会被主动清掉,磁盘回到真正的"干净"状态。我在一台麒麟v10 SP2上实测过,直接fdisk删分区后pvs还能看到unknown device的残留记录,就是元数据没清导致的,后来用pvremove重新处理才彻底正常。
1.3 操作前的整体流程与风险控制
把整个流程浓缩成一句话:确认现状 → 卸载挂载 → 删除LV → 删除VG → 删除PV → 擦分区 → 清配置 → 刷缓存 → 重启验证。这九步里,风险最高的是前两步和最后一步。卸载挂载如果没做干净,有进程占用会报"target is busy";重启验证如果配置文件没清干净,系统可能进不了正常模式。
我一般的做法是先在一台测试机上完整走一遍,把每一步的输出记下来,再上生产。生产环境操作前一定要做快照或者备份,尤其是/etc/fstab、/etc/lvm/lvm.conf、/etc/multipath.conf这几个文件,备份成.bak加日期,出问题能秒回滚。另外强烈建议在维护窗口操作,因为卸载文件系统会让依赖该盘的业务中断,这个不用多说,但真有人在大白天干过,结果数据库直接崩了。
2. 操作前的必备排查与数据备份
动手之前,最忌讳的就是"我以为"。你以为那块盘没用了,结果上面挂着备份目录;你以为LV叫lv_home,实际是lv_data。所以这一章专门讲怎么把现状摸清楚,把该备的备好,磨刀不误砍柴工。这一步骤花的时间通常比实际操作还长,但它能帮你避免90%的翻车。
2.1 摸清磁盘与LVM的完整拓扑
第一件事是搞清楚系统里现在有哪些盘、哪些LVM。我习惯用一组命令组合看,逐个说。
lsblk是最直观的,它以树形结构展示磁盘、分区、LVM的父子关系。输出里你能一眼看到/dev/sdb下面挂了/dev/sdb1,sdb1又是某个VG的PV,VG下面又有几个LV,每个LV挂载在哪里。这个树是操作的总地图。
lsblk -f加-f会显示文件系统类型、UUID、挂载点,信息更全。如果输出里某个LV的MOUNTPOINT有值,说明它正在被挂载,操作前必须卸载。
接着看LVM的详细情况:
pvs # 查看物理卷 vgs # 查看卷组 lvs # 查看逻辑卷pvs输出里重点看PV Name(对应哪个设备)、VG Name(属于哪个卷组)、PV Size。vgs看卷组剩余空间和包含几个PV。lvs看每个逻辑卷的大小和所属卷组。这三个命令的输出要交叉比对,确认没有遗漏。
再看挂载和分区:
df -hT # 查看已挂载的文件系统 mount | grep sd # 查看磁盘挂载 blkid # 查看块设备UUID和类型 fdisk -l /dev/sdb # 查看指定磁盘分区表注意:
blkid输出里的TYPE="LVM2_member"就说明这个分区是PV,TYPE="ext4"或xfs"才是文件系统。麒麟v10默认根分区用xfs,数据盘常见ext4,两者卸载命令一样,但后面清理细节略有区别。
2.2 确认挂载点、进程占用与开机自启
确认了拓扑,接下来要确认"谁在用这块盘"。最直接的方法是看挂载点:
mount | grep /dev/mapper如果LV正在挂载,比如/dev/mapper/vg_data-lv_home on /home type ext4,那说明/home在用这块盘。这时候不能直接umount,得先确认没有进程在读写。
用lsof和fuser两把利器排查占用:
lsof /home fuser -mv /homelsof会列出打开该目录下文件的进程,fuser -mv会显示哪个进程的哪个用户在使用这个挂载点。如果发现有进程,先停服务再卸载。我碰到过一次nginx日志目录挂在待卸载的盘上,直接umount报busy,后来systemctl stop nginx才解决。
还要确认开机自动挂载。检查/etc/fstab:
grep -E "sd|mapper" /etc/fstab只要看到待卸载磁盘或LV的挂载项,就要记下来,后面统一清理。这一步漏了,重启必然出问题。另外如果用了autofs,还要检查/etc/auto.master和相关map文件;如果用了systemd mount unit,检查/etc/systemd/system/下有没有对应的.mount文件。
2.3 数据备份与回滚预案
这一步是底线。哪怕你100%确定盘里没数据,也建议备份配置文件。要备份的清单如下:
cp /etc/fstab /etc/fstab.bak.$(date +%F) cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak.$(date +%F) cp /etc/multipath.conf /etc/multipath.conf.bak.$(date +%F) 2>/dev/null vgcfgbackup -f /root/vgcfgbackup_$(date +%F).txt # 备份VG元数据vgcfgbackup这个命令很多人不知道,它会把当前所有卷组的配置信息导出成文本,万一误删VG,可以用vgcfgrestore恢复元数据。虽然不能恢复数据,但能救回卷组结构,省去重建的麻烦。
如果有重要数据,用rsync或者tar先拷到别的盘:
rsync -avP /data/ /backup/data_$(date +%F)/提示:LVM删除是不可逆操作,
lvremove之后数据基本找不回来。别迷信数据恢复工具,LVM的条带化和元数据布局让恢复难度极高。所以"确认无用"这四个字一定要落实到人,最好让业务方书面确认。
3. 逐步卸载磁盘与删除LVM的实操
准备工作做完,正式进入操作环节。这一章是全文的核心,我会把每一步的命令、输出含义、注意事项都讲清楚。整个删除顺序是自上而下:文件系统 → LV → VG → PV → 分区。记住这个方向,就不会乱。
3.1 卸载文件系统与停止相关服务
第一步,卸载所有挂载的LV或分区。假设我们要处理的是/dev/mapper/vg_data-lv_home,挂载在/home:
umount /home如果报target is busy,先cd /切出目录,再用fuser -km /home强制踢掉占用进程(慎用,会杀掉进程),或者老老实实找到进程停服务。卸载成功后再确认:
mount | grep /home没有任何输出才算卸载干净。如果这块盘上有LVM快照(snapshot),先删快照再删原LV,因为快照引用着原卷:
lvs # 先看有没有snap lvremove /dev/vg_data/lv_home_snap同时别忘了停掉可能依赖这块盘的服务,比如数据库、日志服务、监控agent。麒麟v10上可以用systemctl list-units --type=service --state=running看看跑着哪些服务,评估是否有依赖。
3.2 删除LV、VG、PV的正确顺序
文件系统卸载后,开始拆LVM。顺序是LV → VG → PV,一层一层来。
先删逻辑卷:
lvremove /dev/vg_data/lv_home系统会提示确认,输入y。如果有多个LV,可以一次性删:
lvremove /dev/vg_data/lv_data /dev/vg_data/lv_log如果LV处于激活状态删不掉,先lvchange -an /dev/vg_data/lv_home去激活再删。删完用lvs确认,该卷组下应该没有LV了。
接着删卷组:
vgremove vg_data卷组必须在其下所有LV都删除后才能删。如果VG里有PV还活跃,vgremove会报错,先排查。删完用vgs确认。
最后删物理卷:
pvremove /dev/sdb1如果PV对应的是整块盘(没分区),就是pvremove /dev/sdb。这一步会把磁盘头部的LVM2_member标签清掉。删完用pvs确认,对应的PV应该消失了。
注意:这三个命令的先后顺序绝对不能反。
vgremove会连带把VG的元数据删掉,但如果VG里还有LV,它会拒绝执行。pvremove要求PV不属于任何VG。所以自上而下是硬性规则。
3.3 擦除分区表与磁盘标识
LVM关系解除后,磁盘就成了一块"有分区表但没用"的裸设备。如果你想让磁盘彻底回到出厂状态,需要清掉分区表和残留标识。
用fdisk或parted删分区。以fdisk为例:
fdisk /dev/sdb # 进入后输入 p 查看分区 # 输入 d 删除分区,多个分区重复 d # 输入 w 保存退出或者用parted更干净:
parted /dev/sdb mklabel gpt # 重建分区表(会清空所有分区)提示:
mklabel会瞬间清空分区表,确认盘上无数据再用。如果想彻底擦除磁盘头部的所有残留(包括PV标签、文件系统超级块),可以用:
dd if=/dev/zero of=/dev/sdb bs=1M count=100这个命令往磁盘前100M写零,足以覆盖分区表、PV元数据、文件系统超级块。之后wipefs -a /dev/sdb再扫一遍,确保没有残留标识:
wipefs -a /dev/sdb wipefs -n /dev/sdb # -n只预览不执行,确认无输出wipefs是专门用来擦除设备签名(signature)的工具,比dd更精准,推荐两个配合用。
3.4 刷新内核识别与验证结果
分区表改完后,有时候内核还缓存着旧的分区信息,需要刷新:
partprobe /dev/sdb或者用更底层的:
blockdev --rereadpt /dev/sdb刷新后再用lsblk看,/dev/sdb下面应该不再有sdX1之类的子节点,pvs里也不应该有它。最后确认一遍:
lsblk pvs vgs lvs blkid | grep sdb理想状态下,blkid应该完全没有sdb的输出,说明签名已清干净。到这里磁盘层面的操作就完成了,接下来处理配置文件。
4. 配置文件清理与残留排查
很多人的操作到这里就结束了,结果重启后系统报错、进紧急模式,问题就出在配置文件没清。LVM和磁盘相关的配置文件有好几个,分布在/etc下的不同位置,这一章逐个梳理,把该清的清干净。
4.1 fstab与自动挂载配置清理
/etc/fstab是重灾区。只要里面有对已删除设备的挂载项,系统启动时就会尝试挂载,挂不上就报错,严重时卡在emergency mode。清理方法:
vim /etc/fstab找到包含待删磁盘或LV的行,比如:
/dev/mapper/vg_data-lv_home /home ext4 defaults 0 0整行删除或注释掉。如果用UUID挂载:
UUID=xxxx-xxxx /home ext4 defaults 0 0同样删掉。改完用mount -a测试一下,没有报错说明配置正常:
mount -a注意:
mount -a会挂载fstab里所有未挂载的项,如果还有别的盘没挂会一起挂上,这是预期行为。如果有报错,说明fstab里还有问题项,仔细排查。
如果用了systemd的mount unit,删掉对应文件:
systemctl disable home.mount rm /etc/systemd/system/home.mount systemctl daemon-reload4.2 LVM元数据缓存与扫描配置
LVM有一套自己的缓存和扫描机制。删除PV后,/etc/lvm/cache/.cache里可能还残留旧记录,一般不用手动清,vgscan会刷新。但有个地方要注意,/etc/lvm/lvm.conf里可能配置了设备过滤规则,比如:
filter = [ "a|/dev/sdb|", "r|.*|" ]如果写死了某块盘,删盘后规则还在,最好一并清理,改成通用规则或者把特定条目去掉。改完执行:
vgscan --cache让LVM重新扫描并刷新缓存。再检查/etc/lvm/backup/和/etc/lvm/archive/目录,这里存放卷组的备份和归档文件,如果卷组已删,对应的文件可以清掉:
ls /etc/lvm/backup/ ls /etc/lvm/archive/ rm /etc/lvm/backup/vg_data留着也不影响运行,但有洁癖或者担心误扫描的话,清掉更清爽。
4.3 多路径、iSCSI与其他残留检查
如果服务器接了SAN存储或者用了多路径软件,/etc/multipath.conf和multipathd服务里可能有残留的wwid映射。先看多路径状态:
multipath -ll如果输出里有待删磁盘的wwid,用:
multipath -f <wwid> # 刷新该多路径设备然后在/etc/multipath.conf的blacklist里加上,或者删掉对应配置,重启multipathd:
systemctl restart multipathd如果用了iSCSI,还要iscsiadm登出并删除节点记录。这些存储协议相关的清理,核心原则是"谁引用了这块盘,就在谁的配置里解除引用"。
最后做一个全面残留检查。我常用的组合:
grep -r "sdb\|vg_data\|lv_home" /etc/ 2>/dev/null把上面命令的sdb、vg_data换成你实际删的设备名和卷组名,看/etc下还有哪些文件引用了它们。重点关注/etc/fstab、/etc/mtab、/etc/crypttab、/etc/exports(如果配了NFS)、/etc/rc.local。这个grep是兜底手段,能揪出你意想不到的残留。
5. 常见问题与排查技巧实录
即便流程再规范,实操中还是会遇到各种报错。这一章把我和同行踩过的坑整理出来,配上排查思路和解决办法,遇到问题直接对着查。
5.1 卸载时报device is busy怎么办
这是最高频的问题,报错长这样:
umount: /home: target is busy.原因是有进程占用或者有进程的工作目录在这个挂载点下。排查顺序:
fuser -mv /home看哪个进程在用;lsof +D /home列出打开该目录下文件的进程;cd /确认自己不在该目录里(自己占用的坑最容易被忽略);- 停掉相关服务后重试。
如果实在找不到进程,可以用lsof | grep /home全量搜。还有一种情况是NFS导出占用了挂载点,exportfs -v看一下有没有相关导出。实在不行,umount -l /home做懒卸载,但这是下策,懒卸载后进程继续写会出问题,只适合维护窗口内应急。
5.2 LV删除报Logical volume is in use
Logical volume vg_data/lv_home in use.说明LV还处于激活状态或者有挂载。先确认卸载:
umount /dev/vg_data/lv_home lvchange -an /dev/vg_data/lv_home lvremove /dev/vg_data/lv_home如果报LV is used by another device,可能是被dm设备引用,用dmsetup ls看有没有相关的device mapper条目,必要时dmsetup remove清掉。还有可能是快照或thin pool引用了它,lvs -a -o +devices看依赖关系。
5.3 重启后磁盘又出现或系统进紧急模式
重启后lsblk又看到/dev/sdb有分区,通常是分区表没擦干净,或者partprobe没生效。进系统后重新wipefs -a /dev/sdb加dd擦头部。
系统进紧急模式,八成是fstab里有挂不上的项。在紧急模式下,根分区通常是只读挂载的,需要重新挂载为读写:
mount -o remount,rw / vim /etc/fstab # 删掉问题项 reboot紧急模式里如果没有vim,用vi或者nano,再不行用sed直接改。这就是前面强调备份fstab的原因——有备份可以直接覆盖回去。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查命令 | 解决方式 |
|---|---|---|---|
| umount target is busy | 进程占用挂载点 | fuser -mv、lsof | 停服务或fuser -km |
| LV is in use | LV未去激活/被引用 | lvs -a -o +devices | lvchange -an后删除 |
| PV is in use | PV属于VG | pvs | 先删VG再删PV |
| vgremove拒绝执行 | VG下有LV | lvs | 先删所有LV |
| 重启进紧急模式 | fstab残留挂载项 | cat /etc/fstab | 注释或删除问题行 |
| 磁盘出现duplicate PV | PV元数据未清 | pvs、blkid | pvremove加wipefs |
| 分区删了又出现 | 分区表缓存未刷 | lsblk、partprobe | blockdev --rereadpt |
| blkid仍显示旧类型 | 超级块残留 | blkid、wipefs -n | wipefs -a擦除 |
这张表建议收藏,遇到报错直接对照。我自己最常遇到的是前三个,基本占了八成情况。
我个人在实际操作中的体会是,这套流程里最容易被低估的是"确认现状"和"清理配置"两头。中间删LVM的命令其实很简单,就那么几条,但前面的排查决定了你会不会删错盘,后面的配置清理决定了重启稳不稳。我见过删错盘的惨案,就是因为lsblk没看仔细,把系统盘当数据盘处理了。所以每次动手前,我都会在纸上或者文本里把盘符、VG名、LV名、挂载点列一遍,对着lsblk的输出核三遍再敲回车。另外一个小技巧是,删LVM之前先vgcfgbackup备份一次元数据,真删错了还能vgcfgrestore把结构找回来,虽然数据救不回,但至少不用从头重建分区和卷组。这套流程在麒麟v10 SP3上跑了不下二十台机器,目前零事故,希望对你有用。