模拟一次普通分区根目录扩容

文章目录


前言

在使用 LVM 的场景下,逻辑卷的扩容通常比较轻松。但在某些受限环境中(例如无法连接公网、又处于涉密或内外网隔离环境)或特殊条件下系统采用传统分区模式进行部署。此时,如果根分区空间不足,扩容将变得相对复杂。因为普通分区根目录是直接建立在物理分区之上的,要扩容根分区的话就需要修改磁盘分区表,分区表是系统最底层最关键的数据结构之一,所以操作中一点小失误就会导致数据全部丢失,属于高危操作。但是能不能扩容呢?答案是能!

环境准备

.

模拟环境:Oracle Linux 7.9,MBR 分区表(dos),根分区 / 使用 XFS,非 LVM,磁盘空间20G.

存在分区:

  • /dev/sda1:1G,XFS,挂载到 /boot
  • /dev/sda2:8G,XFS,挂载到 /
  • /dev/sda3:2G,swap

目标:在不丢数据的前提下,将 / 从 8G 扩到 16G,并重新规划 swap

一、初始化检查

操作前请完整的记录以下数据,尤其是根目录的起始扇区

bash 复制代码
##查看每个块设备的大小、挂载点
lsblk
##查看文件系统类型和UUID,之后恢复fstab要用
lsblk -f
##查看Start / End扇区
fdisk -l /dev/sda
##确认每个分区当前的UUID,和TYPE
blkid

注意看以下关键信息

text 复制代码
/dev/sda1  *    2048   2099199   1048576  83 Linux      1G   /boot  xfs
/dev/sda2       2099200 18876415  8388608  83 Linux      8G   /     xfs
/dev/sda3      18876416 23070719  2097152  82 Linux swap 2G  [SWAP]
  • 旧的 / 分区 sda2 的起始扇区:2099200
  • swap sda3 的大小:2G

之后我们扩容的时候,sda2 的起始扇区必须保持 2099200 不变,如果起始位置不对则会数据全部丢失,2099200不能多也不能少。

二、安全备份

先备份所有关键信息

bash 复制代码
mkdir -p /root/backup
fdisk -l /dev/sda > /root/backup/sector.txt
blkid > /root/backup/uuid.txt
cp /etc/fstab /root/backup/fstab.bak
ls -l /root/backup/

这几份东西很重要:

  • sector.txt:原始分区表,尤其是 Start / End,之后万一手滑了也能查回来。
  • uuid.txt:分区与 UUID 对照表,fstab 里用的是 UUID,就靠这个恢复。
  • fstab.bak:万一改坏了 /etc/fstab,还能直接覆盖回去。

三、进入 emergency 模式

在 GRUB 菜单按 e,找到那行以 linux16 开头的内核启动行,在最后面追加:

text 复制代码
systemd.unit=emergency.target

按 Ctrl + X 启动,就会进入 emergency 模式,输入root密码登录

登录 root 之后,先把根分区重挂载成可读写:

bash 复制代码
mount -o remount,rw /

四、再看一次盘,然后"动刀"

1. 再次确认当前分区表

bash 复制代码
fdisk /dev/sda
p   # print

2. 删除 swap 分区 sda3

bash 复制代码
d		#删除分区
3		#分区号
p		#print

此时 p 输出只剩 sda1、sda2。

这里删除的是分区记录,不是"抹掉数据",磁盘上的数据还在,只是暂时没有分区指向它。

3. 删除根分区 sda2

bash 复制代码
d
2
p

现在只剩:

text 复制代码
/dev/sda1  *    2048  2099199  1048576  83  Linux

此时整个 / 分区的内容还在磁盘上,只是分区表不再有 sda2 这一行了,所以后面必须 用完全一样的起始扇区重建

五、重建sda2

现在用 fdisk 重建 sda2:

bash 复制代码
fdisk /dev/sda

n          # 新建分区
p          # 主分区
2          # 分区号 2
2099200    # 一定要填原来的起始扇区 !!!
+16G       # 用 +16G 表示分配 16GiB 给这个分区
p          # 打印确认
w          # 写入分区表

打印出来是:

text 复制代码
/dev/sda1  *    2048   2099199  1048576  83  Linux
/dev/sda2       2099200 35653631 16777216 83 Linux

此处的关键点:

  • Start 仍然是 2099200 → 这就保证了旧数据的位置没变。
  • End 扩到了 35653631 → sda2 大小从 8G 变成 16G。

写入后会出现:

text 复制代码
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot...

这很正常:内核已经在用旧的分区布局,必须重启才会用新的。

bash 复制代码
reboot

六、重启后对XFS做在线扩容

系统正常启动后,先扩文件系统:

bash 复制代码
xfs_growfs /

输出:

text 复制代码
data blocks changed from 2097152 to 4194304

表示 XFS 把数据区从原来的大小扩展到了更大的区间。

然后连着三条确认一下:

bash 复制代码
df -h        ##看 / 的容量是否变成 16G
lsblk -f     ##看文件系统和挂载点
fdisk -l /dev/sda

显示只有 sda1、sda2,说明我们成功处理完 root,但是暂时还没恢复 swap。

到这里,根分区扩容 8G → 16G 已经完成。

七、重建 sda3 作为 swap 分区

接下来重建swap

bash 复制代码
fdisk /dev/sda
p   # 确认现在只有 sda1/sda2
n   # 新建
p   # 主分区
3   # 分区号 3
35653632   # 默认即可,从 sda2 后面开始
+2G        # 分 2G 给 swap
p

此时打印:

text 复制代码
/dev/sda1  *     2048   2099199  1048576  83  Linux
/dev/sda2       2099200 35653631 16777216 83 Linux
/dev/sda3       35653632 39847935 2097152 83 Linux

注意 Id 还是 83 Linux,还没改成 swap 类型。

接着改类型:

bash 复制代码
t
3         # 选择分区 3
82        # Linux swap / Solaris
p         # 再看一眼,Id 已经变成 82
w         # 写分区表
reboot

八、初始化 & 挂载 swap

系统起来之后,我们要确保 sda3 已被当作 swap 使用。

bash 复制代码
##创建并激活swap
mkswap /dev/sda3
swapon /dev/sda3
##查看swap状态
swapon --show

再查一下 /dev/sda3 的 UUID:

bash 复制代码
blkid /dev/sda3

再检查一下 /etc/fstab

/ 和 /boot 的 UUID 与之前一致(没动过这两个分区的起始扇区里面的文件系统,所以 UUID 不变)。

swap 这一行用的是旧的 UUID(5eda3d...),跟当前 blkid 查到的不一致

将 fstab 里的 swap UUID 更新为 blkid 查到的新 UUID

bash 复制代码
UUID=0cd20842-7155-4379-bd96-ff3017feebd3 swap  swap  defaults  0 0

改完执行:

bash 复制代码
swapoff -a
swapon -a
swapon --show

九、最终状态检查

最后再跑一遍 fdisk -l:

再配合:

bash 复制代码
df -h
lsblk -f
swapon --show

就能确认:

  • 根分区从 8G → 16G
  • swap 分区 2G
  • / 和 /boot 的 UUID 未变化
  • 系统可以正常启动

十、数据验证

1. rpm -Va 校验系统文件

bash 复制代码
rpm -Va

只要没有大面积 missing、size mismatch、MD5 mismatch 之类致命错误,就说明rpm 管理的系统文件没有损坏

2. 读全盘所有文件,看有没有 I/O 错误

bash 复制代码
find / -xdev -type f -exec cat {} > /dev/null \;

这条命令的含义是:

  • 遍历根文件系统里所有普通文件
  • 尝试把它们全部读一遍
  • 任何磁盘坏块、inode 断链、文件系统元数据损坏,都会在这里暴露为 I/O error

跑完后,如果没有返回则是数据无损坏


流程总结

  1. 看清当前分区状态
  2. 做备份(分区信息 + fstab + UUID)
  3. 进 emergency 模式
  4. 删除旧的 sda2/sda3
  5. 用同一个起始扇区重建 sda2
  6. 重启后对 XFS 做在线扩容
  7. 用剩余空间重建 sda3 + 改类型为 swap
  8. 初始化 & 挂载 swap,并修 fstab
  9. 最后做"数据没坏"的验证

由于操作风险高,每一步需要谨慎再谨慎,我第一次模拟测试的时候就因为起始扇区写错导致数据丢失无法开机了。

相关推荐
AI科技星25 分钟前
张祥前统一场论宇宙大统一方程的求导验证
服务器·人工智能·科技·线性代数·算法·生活
魂万劫38 分钟前
如何在虚拟机VM上|Linux环境内安装windows
linux·运维·服务器·windows
序属秋秋秋1 小时前
《Linux系统编程之进程控制》【进程等待】
linux·c语言·c++·进程·系统编程·进程控制·进程等待
zfj3211 小时前
top 命令中的 wa (IO wait) 指标,理论上几乎完全是由磁盘IO(包括swap)引起的,而不是网络IO
linux·网络·top·iowait
Xの哲學1 小时前
Linux网卡注册流程深度解析: 从硬件探测到网络栈
linux·服务器·网络·算法·边缘计算
不哦罗密经1 小时前
python相关
服务器·前端·python
数字化转型20251 小时前
SAP Signavio 在风机制造行业的深度应用研究
大数据·运维·人工智能
用户6135411460161 小时前
libicu-62.1-6.ky10.x86_64.rpm 安装步骤详解(麒麟V10系统)
linux
WordPress学习笔记1 小时前
wordpress根据分类ID调用分类名称和分类描述
运维·wordpress
qq_455760852 小时前
docker - 镜像、存储卷和网络深入理解
运维·docker·容器