Openwrt官网下载的镜像默认只有120MB,根分区也仅有104MB。如果要安装ADGuard Home、Nginx、Clash等服务就很容易不够用了。这里介绍一种安装前扩容根分区的办法,相比于安装后的方法,重启后不会失效。

1、准备

需要准备一台Linux,虚拟机也可以,这里介绍Ubuntu上的操作方法,其他系统类似。

安装依赖的工具:

  • wget
  • gzip
  • lsblk
  • e2fsck
  • resize2fs
  • losetup
  • fdisk
  • partx
sudo apt-get install wget gzip util-linux mount fdisk

2、下载解压镜像文件

这里使用的是:openwrt-22.03.0-x86-64-generic-ext4-combined.img.gz

# 下载:官网或者国内镜像网址,根据实际情况选择
# 官网下载地址:https://downloads.openwrt.org/releases/22.03.0/targets/x86/64/openwrt-22.03.0-x86-64-generic-ext4-combined.img.gz
# 国内镜像下载地址:https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/22.03.0/targets/x86/64/openwrt-22.03.0-x86-64-generic-ext4-combined.img.gz
wget https://downloads.openwrt.org/releases/22.03.0/targets/x86/64/openwrt-22.03.0-x86-64-generic-ext4-combined.img.gz

# 解压,将会得到文件openwrt-22.03.0-x86-64-generic-ext4-combined.img
gzip -d openwrt-22.03.0-x86-64-generic-ext4-combined.img.gz

3、扩容 

3.1 使用 dd 命令增加镜像空间

使用dd命令,将镜像文件增加到10G(群晖虚拟机最小磁盘大小)。

注意:dd命令中“count=512”,如果是其他值可能会失败

也可根据需要修改bs的值,改为自己需要的大小

dd if=/dev/zero bs=20080k count=512 >> openwrt-22.03.0-x86-64-generic-ext4-combined.img

记录了512+0 的读入
记录了512+0 的写出
10527703040字节(11 GB,9.8 GiB)已复制,104.59 s,101 MB/s

ls -lh openwrt-22.03.0-x86-64-generic-ext4-combined.img
-rwxr-xr-x 1 root root 10G  9月  7 10:28 openwrt-22.03.0-x86-64-generic-ext4-combined.img

3.2 使用 losetup 命令,挂载镜像到 loop 设备

losetup -f openwrt-22.03.0-x86-64-generic-ext4-combined.img

3.3 查看挂载的设备的名称

losetup 命令查看挂载的虚拟区块设备

/dev/loop12,实际每个人loop后面的数值可能不一样,注意根据文件名区分

losetup

NAME        SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                           DIO LOG-SEC
**********************(省略其它)**************************
/dev/loop12         0      0         0  0 openwrt-22.03.0-x86-64-generic-ext4-combined.img   0     512

lsblk 命令查看块设备信息

        对应上面查到的“/dev/loop12”,可以看到块大小已经增加到10G左右

lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
********************(省略其它)***********************
loop12   7:12   0   9.9G  0 loop

3.4 读取分区信息,加载到系统

3.4.1 使用 partx 命令,加载分区信息

partx -a /dev/loop12

3.4.2 使用 lsblk 命令查看加载分区信息结果

lsblk

NAME       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
************************(省略其它)*********************
loop12       7:12   0   9.9G  0 loop
├─loop12p1 259:0    0    16M  0 part
└─loop12p2 259:1    0   104M  0 part

loop12p2就是扩容的分区,虽然已经增加到10G,但是识别到的仍然是120M。所以还需要进行下面的操作。

3.5 使用 fdisk 命令调整分区大小

fdisk /dev/loop12

欢迎使用 fdisk (util-linux 2.37.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

# 输入p查看分区信息,记住/dev/loop12p2分区的开始扇区
命令(输入 m 获取帮助): p
Disk /dev/loop12:9.92 GiB,10654056448 字节,20808704 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x266b958d

设备          启动  起点   末尾   扇区  大小 Id 类型
/dev/loop12p1 *      512  33279  32768   16M 83 Linux
/dev/loop12p2      33792 246783 212992  104M 83 Linux

# 删除/dev/loop12p2分区,输入d之后输入2(默认)
命令(输入 m 获取帮助): d
分区号 (1,2, 默认  2): 2

分区 2 已删除。

# 输入n新建分区
命令(输入 m 获取帮助): n
分区类型
   p   主分区 (1 primary, 0 extended, 3 free)
   e   扩展分区 (逻辑分区容器)
# 输入p主分区
选择 (默认 p): p
# 输入2(默认)
分区号 (2-4, 默认  2): 2
# 输入分区2的开始扇区,一定要和上面的一样,这里是33792!!!
第一个扇区 (33280-20808703, 默认 34816): 33792
# 输入结束扇区,一定要比33792大,如果直接回车就是全部剩余都将作为第二分区,这里直接回车
Last sector, +/-sectors or +/-size{K,M,G,T,P} (33792-20808703, 默认 20808703):

创建了一个新分区 2,类型为“Linux”,大小为 9.9 GiB。
分区 #2 包含一个 ext4 签名。

# 提示,是否移除分区的签名,这里一定要输入n,不然镜像会出问题!!!
您想移除该签名吗? 是[Y]/否[N]: N

# 输入w保存我们的更改
命令(输入 m 获取帮助): w

# 会有警告,这里不用管
分区表已调整。
将调用 ioctl() 来重新读分区表。
重新读取分区表失败。: 无效的参数

# 提示说内核依然会使用旧的分区表,新的分区表需要在下次重启或运行 partprobe(8)或kpartx(8)命令后生效
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or partx(8).

3.6 更新新的分区信息,查看新的分区表

3.6.1 使用 partx 命令,更新分区信息

partx -u /dev/loop12

3.6.2 使用 lsblk 命令查看新的分区信息

lsblk

NAME       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
**********************(省略其他)***********************
loop12       7:12   0   9.9G  0 loop
├─loop12p1 259:2    0    16M  0 part
└─loop12p2 259:3    0   9.9G  0 part

可以看到loop12p2分区已经扩容成功

3.7 同步更改后的分区信息到系统内核

3.7.1 使用 e2fsck 镜像检测,纠错

e2fsck -f /dev/loop12p2

e2fsck 1.46.5 (30-Dec-2021)
第 1 遍:检查 inode、块,和大小
第 2 遍:检查目录结构
第 3 遍:检查目录连接性
第 4 遍:检查引用计数
第 5 遍:检查组概要信息
Inode 位图末尾的填充值未设置。 处理<y>? 是


rootfs:***** 文件系统已被修改 *****
rootfs:1445/6656 文件(0.0% 为非连续的),5165/26624 块

3.7.2 使用 resize2fs 命令,同步分区大小

resize2fs /dev/loop12p2

resize2fs 1.46.5 (30-Dec-2021)
将 /dev/loop12p2 上的文件系统调整为 2596864 个块(每块 4k)。
/dev/loop12p2 上的文件系统大小已经调整为 2596864 个块(每块 4k)。

3.8 卸载

3.8.1 卸载系统中的分区

partx -d /dev/loop12

3.8.2 卸载loop设备

losetup -d /dev/loop12

3.9 安装、使用

此处不再赘述。

文中部分参考网络。