Ubuntu 作为服务器系统使用的时候,系统盘的空间可能并不是很充裕,apt apt 着,根目录就满了。诚然,增加磁盘 / 分区并挂载是一个方案,但并不能解决所有问题(例如 apt)。同时,一些跑在云平台上的服务器并没有很好的离线操作磁盘的手段,这时候在线扩容就显得极为必要了。
数据无价!对磁盘进行任何操作前,请务必做好备份!
1. 磁盘根目录在线扩容
操作环境:Proxmox VE 虚拟化 / Ubuntu 18.04.5 LTS / GPT 分区表 / ext4 分区
1.1 增大物理磁盘容量
这部分没什么好说的,虚拟机就在设置里改,云平台就在对应的平台修改。修改好之后 Ubuntu 应该就可以直接识别到新的容量了。
1.2 将容量合并进分区
首先运行 fdisk -l
命令查看磁盘容量是否被识别:
从上图可以看到,磁盘容量已被正确识别为 64GiB,但分区表记录的磁盘容量仍为扩容前的 40GiB(见红色提示,错误已被识别到),分区大小也是同样的 40G。
1.3 修复分区表
运行 parted -l
查看分区情况。
parted 会立即提示磁盘的空间并没有被全部使用,这里输入 Fix 后回车,修复一下 GPT 分区表。
从上图中已经可以看到,分区表记录的磁盘容量已经正常。
1.4 扩容分区
现在就可以将空闲的磁盘容量合并到分区里了,这里利用界面和操作都更加友好的 cfdisk
来进行操作。
按上下键选中要扩容的分区,再按左右键选择 Resize 操作,回车。cfdisk 应该会自动填写此分区与未分配空间的总容量,也可以自己输入扩容后的大小,回车即可。
下图中的 sda2 分区已经变为 64G,分区扩容完毕。但此时的所有操作仅在内存中完成,我们需要选择 Write 来将更改保存到分区表。写入后退出 cfdisk。
再次执行 fdisk -l
,可见分区容量已变为 64G。
1.5 扩容文件系统
此时扩容并未结束,因为文件系统记录的分区容量仍为 40G,我们需要让文件系统知道分区已被扩容。
这里需要用到 resize2fs,以我的磁盘 sda2 为例,执行以下命令:
resize2fs -p /dev/sda2
等待操作完成即可。根据上图提示,我们已经完成了对文件系统的在线扩容。
2. 修改磁盘 inode
对于 ext4 文件系统,inode 会在格式化时被写死,若要修改必须重新格式化,丢失所有数据,请务必注意。xfs 等文件系统提供 inode 的动态扩展功能。
2.1 查看磁盘 inode 情况
运行 df -i
查看各个分区的 inode 使用情况。
从上图可以看到我的 sdc1 分区已经用尽了所有 4,194,304 个 inode,此时表现为无法写入任何数据,提示磁盘已满(即使仍有可用空间)。
2.2 重新格式化分区
在格式化分区的时候,可以利用 -N 参数指定 inode 数量。
以格式化 sdb1 为具有 16,777,216 个 inode 的 ext4 分区为例,执行以下命令:
mkfs.ext4 /dev/sdb1 -N 16777216
mkfs 会提示磁盘已存在格式化后的文件系统,确认后等待格式化完成即可。
2.3 检查 inode 数量
运行以下命令:
dump2fs -h /dev/sdb1 | grep node
结果如下图,可以看到 Inode count 一项已经变为我们指定的值。
1 Response
[…] Ubuntu 环境扩容根分区的文章(见 Ubuntu 18.04 磁盘根目录在线扩容 & 修改分区 inode 数量 ),这次又来 CentOS 7 下扩容。CentOS 算是我接触最早的 Linux […]