今天给一台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
[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
[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,分享结束!