当前位置:首页>Linux>经验分享:Linux系统扩容2次后,第3次扩容我遇上了MBR分区限制

经验分享:Linux系统扩容2次后,第3次扩容我遇上了MBR分区限制

  • 2026-10-27 11:21:00
经验分享:Linux系统扩容2次后,第3次扩容我遇上了MBR分区限制

今天给一台Linux服务器做磁盘扩容,遇到一个典型问题,觉得很意思,给大家分享一下。

这台服务器装的是龙蜥(Anolis OS)8.9,系统上运行了docker。这次我本来也想用创建新分区的方法来扩展,却发现因为分区表的限制,行不通了。具体看下面我整理的扩容全过程,如果你也遇到类似的情况,或许可以参考。

查看磁盘分区状态:df -Th

可以看到分区 /dev/mapper/ao-root 大小为292G,已经满了,我们要扩容的就是这个分区。

查看分区布局

[root@localhost ~]# fdisk -lDisk /dev/vda:500 GiB,536870912000 字节,1048576000 个扇区单元:扇区 / 1 * 512 = 512 字节扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节磁盘标签类型:dos设备       启动      起点      末尾      扇区  大小 Id 类型/dev/vda1  *         2048   2099199   2097152    1G 83 Linux/dev/vda2         2099200 209715199 207616000   99G 8e Linux LVM/dev/vda3       209715200 419430399 209715200  100G 8e Linux LVM/dev/vda4       419430400 629145599 209715200  100G 83 LinuxDisk /dev/mapper/ao-root:291.1 GiB,312601477120 字节,610549760 个扇区单元:扇区 / 1 * 512 = 512 字节扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节Disk /dev/mapper/ao-swap:7.9 GiB,8434745344 字节,16474112 个扇区单元:扇区 / 1 * 512 = 512 字节扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节

可以看到,后台已经增加了磁盘空间,将磁盘大小调整到了500G。

而且明显可以发现,这台服务器此前已经扩容过两次,VG的大小,就是vda2、vda3、vda4三个分区空间总和,vda4的的分区类型还忘记改了(前面的扩容不是我做的),虽然不影响使用,但最好保持统一。

之前扩容方法是创建新分区,然后扩展到卷组里,为了不影响业务,尝试使用同样的方法进行扩展。

[root@localhost ~]# fdisk /dev/vda欢迎使用 fdisk (util-linux 2.32.1)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。命令(输入 m 获取帮助):n要创建更多分区,请先将一个主分区替换为扩展分区。命令(输入 m 获取帮助):

发现新情况,以前扩展时创建的分区都是主分区,MBR分区表最多只能创建4个主分区(或3个主分区+1个扩展分区),而这里已经创建了4个主分区,此时就不能再使用这种方法。将主分区转化为扩展分区非常麻烦,综合考虑,采用扩展已有LVM主分区的方法,来实现扩容。

与项目经理沟通了一下,为防止docker在扩容过程中因文件系统写入导致问题,先将docker停掉。

可以先备份一下容器的状态,方便启用后核对

[root@localhost ~]# docker ps -a > /tmp/docker_status.txt

关闭docker服务

[root@localhost ~]# systemctl stop dockerWarning: Stopping docker.service, but it can still be activated by:  docker.socket

还启动了“套接字激活”机制,那就先停docker.socket,再停docker.service

[root@localhost ~]# systemctl stop docker.socket[root@localhost ~]# systemctl stop docker

确认启动状态都为关闭:

开始扩展空间

(谨慎操作)
1. 删除并重建vda4分区

删除分区不会清除数据,但需要保证重建分区时起始扇区与原分区一致。

[root@localhost ~]# fdisk /dev/vda欢迎使用 fdisk (util-linux 2.32.1)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。命令(输入 m 获取帮助):d    # 删除分区分区号 (1-4, 默认  4): 4    # 选择4分区 4 已删除。命令(输入 m 获取帮助):n    # 创建分区分区类型   p   主分区 (3个主分区,0个扩展分区,1空闲)   e   扩展分区 (逻辑分区容器)选择 (默认 e):p    # 选择主分区p已选择分区 4    第一个扇区 (419430400-1048575999, 默认 419430400):上个扇区,+sectors 或 +size{K,M,G,T,P} (419430400-1048575999, 默认 1048575999):创建了一个新分区 4,类型为“Linux”,大小为 300 GiB。分区 #4 包含一个 LVM2_member 签名。您想移除该签名吗?是[Y]/否[N]:n    # 这里一定要选否[N]命令(输入 m 获取帮助):t分区号 (1-4, 默认  4): 4Hex 代码(输入 L 列出所有代码):8e已将分区“Linux”的类型更改为“Linux LVM”。命令(输入 m 获取帮助):w分区表已调整。正在同步磁盘。

再次说一下,询问移除签名那里很关键,一定要选否。如果选是,签名被删除,LVM就无法识别这个分区对应的原有PV,导致卷组(VG)和逻辑卷(LV)的数据无法读取、数据丢失!!

2. 刷新分区表

让系统识别新的分区大小

[root@localhost ~]# partprobe /dev/vda

3. 扩展物理卷(PV)

更新PV大小,识别扩展后的vda4空间

[root@localhost ~]# pvresize /dev/vda4  Physical volume "/dev/vda4" changed  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

检查PV和VG空间,确认空闲空间已增加

[root@localhost ~]# pvs  PV         VG Fmt  Attr PSize    PFree  /dev/vda2  ao lvm2 a--   <99.00g      0  /dev/vda3  ao lvm2 a--  <100.00g      0  /dev/vda4  ao lvm2 a--  <300.00g 200.00g[root@localhost ~]# vgs  VG #PV #LV #SN Attr   VSize    VFree  ao   3   2   0 wz--n- <498.99g 200.00g

4. 扩展逻辑卷(LV)

把所有Free空间全部加到/dev/mapper/ao-root中

[root@localhost ~]# lvextend -l +100%FREE /dev/mapper/ao-root  Size of logical volume ao/root changed from 291.13 GiB (74530 extents) to 491.13 GiB (125730 extents).  Logical volume ao/root successfully resized.

验证:

[root@localhost ~]# lvs  LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert  root ao -wi-ao---- 491.13g  swap ao -wi-ao----  <7.86g
5. 扩展文件系统大小

龙蜥系统默认文件系统为XFS,使用xfs_growfs命令

[root@localhost ~]# xfs_growfs /dev/mapper/ao-rootmeta-data=/dev/mapper/ao-root    isize=512    agcount=13, agsize=5972992 blks         =                       sectsz=512   attr=2, projid32bit=1         =                       crc=1        finobt=1, sparse=1, rmapbt=0         =                       reflink=1    bigtime=0 inobtcount=0data     =                       bsize=4096   blocks=76318720, imaxpct=25         =                       sunit=0      swidth=0 blksnaming   =version 2              bsize=4096   ascii-ci=0, ftype=1log      =internal log           bsize=4096   blocks=11666, version=2         =                       sectsz=512   sunit=0 blks, lazy-count=1realtime =none                   extsz=4096   blocks=0, rtextents=0data blocks changed from 76318720 to 128747520

验证:

[root@localhost ~]# df -Th文件系统            类型      容量  已用  可用 已用% 挂载点devtmpfs            devtmpfs   16G     0   16G    0% /devtmpfs               tmpfs      16G     0   16G    0% /dev/shmtmpfs               tmpfs      16G   33M   16G    1% /runtmpfs               tmpfs      16G     0   16G    0% /sys/fs/cgroup/dev/mapper/ao-root xfs       492G  293G  199G   60% //dev/vda1           xfs      1014M  301M  714M   30% /boottmpfs               tmpfs     3.2G     0  3.2G    0% /run/user/0

可以看到/dev/mapper/ao-root分区从原来的292G,扩容到了492G,扩容成功!

恢复docker服务

[root@localhost ~]# systemctl start docker

使用命令:docker ps查看容器状态,与之前的/tmp/docker_status.txt核对

OK,分享结束!

最新文章

随机文章