OpenWrt系统盘扩容方法
1 条件和定义
Openwrt版本:24.10.5(据说是目前最新的稳定版)
金士顿NVME M2 512G硬盘:在系统中的名字为nvme0n1(文中都以这个出现,请自行换成你的硬盘名字)
U盘:大于1G
2 背景说明
最近有一个需求需要用到软路由,之前用iStoreOS,其实也是基于Openwrt做的,你可以认为就像小米的MIUI一样,基于安卓做的。我写文章前又装了一边,发现开机跑的代码都差不多。小白或不想折腾的建议去看看iStoreOS,真心话好用的多。Openwrt像以前的安卓,想折腾的来。iStoreOS像苹果,没太多折腾的。去iStoreOS的网站你会发现他的版本和Openwrt是一致的。所以Openwrt有的,iStoreOS也有。好了不扯闲篇直入主题。
3 吐槽
其实这个过程是自己看了网上的一些教程,我说真的,既然要写就好好写,写个半吊子,让人看的云里雾里的。最后没办法求助Deepseek和豆包,结果这两货每次胸脯拍的叭叭响,结果全是问题。最后好在我自己还是搞定了,下面就说一下关于Openwrt扩容的问题。
4 大前提
大前提就是不要试图在系统运行中的硬盘上扩容,什么意思呢?比如你有一块512G的硬盘,但是安装完后实际只有126MB被使用,剩下的都浪费了。那么这会你要扩容就两个方向,第一扩展系统盘,第二扩展为数据盘。扩展数据盘相对简单一点,虽然我没做,但是你可以想象,你在扩容的过程没有操作系统正在使用的部分,这样就像我刚开始说的,并没有在系统运行的硬盘上扩容。这话有点怪,看了下面就知道了。另一种就是扩展系统盘,这下好了,就是要在正在运行的分区上进行操作,一个字难。就这个破事儿我折腾了整整一天。其实道理也很简单,你要在windows的C进行操作也很难,你可以试试,只要你想操作就会提示你进PE去干,为什么呢——因为系统盘空闲了。
5 操作步骤
首先将要安装系统的硬盘的分区全部删除后再进来安装,这个步骤怎么弄都可以,PE、外置U盘,反正方法多的很,这里就不赘述了。
5.1 准备工作
大于1T的U盘,去Openwrt的官网或者阿里镜像站下载你需要的系统文件,具体下载哪个看你自己。
下载完后,使用Rufus将镜像装在U盘。这里注意一下,我被坑了一下,就是刚开始都是对的,直接烧下载的文件,就是后缀名为.gz的原始下载文件。我搞的时候后面估计是整晕了跑去解压缩成img烧写,然后就无法启动了。
5.2 安装系统
#使用制作好的U盘,在bios中设置U盘启动,进入命令行后,这会可以先装系统,也可以先改IP从而使用ssh操作。建议先改IP,用ssh操作,毕竟可以粘贴复制,比自己手敲命令行快多了。
#配置网络
#查看所有网络接口
ip addr show
#或者用OpenWrt专用的查看命令
uci show network
#查看当前LAN口的配置
uci show network.lan
#修改IP地址为局域网的网段(假设是192.168.8.0/24)
uci set network.lan.ipaddr=’192.168.8.250′ # 改成你想要的固定IP
#修改子网掩码(一般就是255.255.255.0)
uci set network.lan.netmask=’255.255.255.0′
#设置网关(你公司主路由的IP,一般是192.168.8.1)
uci set network.lan.gateway=’192.168.8.1′
#添加DNS服务器(可选,但推荐)
uci set network.lan.dns=’114.114.114.114 223.5.5.5′
# 提交修改
uci commit network
#重启网络
/etc/init.d/network restart
#现在你就可以使用ssh,连接到系统了。
#通过下面命令看看硬盘分区情况,其实就是看看你的硬盘叫啥
cat /proc/partitions
#安装系统到硬盘
dd if=/dev/sdb of=/dev/nvme0n1 bs=4M
#sdb是现在U盘系统名字,nvme0n1是要安装的硬盘名字,通过前面命令可以看到。这个命令下去是没有进度条的,时间根据你的U盘决定,最多一分钟,你看要是还没回到命令行就ctrl+c就可以返回了。
#同步一下
sync
#这里千万不要重启了,重启了更难搞,其实根据后面的操作,感觉重启了还是在U盘系统还是可以的,但是一旦是进了硬盘的系统太难太难
#看看分区硬盘是否正常(结果肯定不正常)
df -h
#可以看到你的硬盘只有126MB了,接下来就要扩容了。
5.3 硬盘扩容
#这里的扩容就是把剩余的硬盘空间扩展到系统盘上
#安装工具
opkg update && opkg install parted resize2fs
#开始扩容,输入以下命令:
parted /dev/nvme0n1 resizepart 2 100%
#这里会出现一个Error: The backup GPT table is corrupt, but the primary appears OK, so that will de used
OK/Cancel?
#输入ok回车
#接着又会出现:Not all of the space available to /dev/nvme0n1 appears to be used, you can fix the GPT to use all of the space (an extra 7897897897)
Fix/Ignore?
#输入fix回车
#接下来又来一个Partition number?
#这里输入2回车(其实就是第二个硬盘分区,也就是系统盘)
#马上又是End?[126MB]
#这里输入100%回车(第一次我啥也没输入就回车,然后就悲剧了)
#最后输入quit可以退出,不过我这边是直接退出的。
#在线扩容文件系统(关键一步)
#输入以下命令
resize2fs /dev/nvme0n1p2
#这里会有一个提示“Please run ‘e2fsck -f /dev/nvme0n1p2’ first.”就是让你先检查以下,没什么好说的,照做:
e2fsck -f /dev/nvme0n1p2
#中间会有三个是否修复的提示,都输入Y回车。
Free blocks count wrong (18634, counted=18641).
Fix<y>? yes
Free inodes count wrong (5075, counted=5080).
Fix<y>? yes
Padding at end of inode bitmap is not set. Fix<y>? yes
#接着再重新扩展(所以可以进行e2fsck)
resize2fs /dev/nvme0n1p2
#第二次复盘的时候是下面的提示(第一次是什么忘记了)
root@OpenWrt:~# resize2fs /dev/nvme0n1p2
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/nvme0n1p2 to 122092481 (4k) blocks.
The filesystem on /dev/nvme0n1p2 is now 122092481 (4k) blocks long.
#这个提示实际就是已经扩展到465G的样子,其实就已经成功了。不过由于第一次上面输入100%那个地方我输入回车了,也就是以126MB处结束,说白了就是一点都没动,所以失败了。
#接着用df -h查看,还是104M(不用管?不是,因为你看到的还是U盘的)
#查看是否扩容成功
#输入
parted /dev/nvme0n1
#输入print,看看情况(下面是第一次的结果)
Number Start End Size File system Name Flags
3 17.4kB 262kB 245kB bios_grub
1 262kB 17.0MB 16.8MB fat16 legacy_boot
2 17.0MB 126MB 109MB ext4
#这里17.0MB是个关键数字,意思是从17.0MB之后就是你要扩展的分区的开始位置。
#下面是第二次复盘的结果
Number Start End Size File system Name Flags
3 17.4kB 262kB 245kB bios_grub
1 262kB 17.0MB 16.8MB fat16 legacy_boot
2 17.0MB 500GB 500GB ext4
#这个结果是对的,所以下面的删除旧分区,新建新分区可以不用了,直接到通知内核更新分区表(第二次测试直接到了#验证分区大小已更新lsblk /dev/nvme0n1p2)
而第一次搞得就是还得再来一次,结果又引出得别得问题,下面细说。
#下面是针对第一次扩容失败后的操作
#删除旧分区 2(放心,数据不会丢,只是重划边界)
(parted) rm 2
#新建根分区 2(占满剩余所有空间)
mkpart primary ext4 17.0MB 100%
#17.0MB 是你当前 EFI 分区的结束位置(从上面 print 里抄)
#100% 表示用满剩下所有磁盘空间
#接下来会有一个警告,如下:
Warning: The resulting partition is not properly aligned for best performance: 33280s % 2048s != 0s
Ignore/Cancel? Ignore
#选择Ignore
#退出
(parted) quit
#然后出现了下面的提示,意思就是让你刷新以下
Information: You may need to update /etc/fstab.
#通知内核更新分区表
partprobe /dev/nvme0n1
#验证分区大小已更新
lsblk /dev/nvme0n1p2
#这里会提示没有lsblk这个命令,用opkg install lsblk安装一下,安装完后再用上面的命令看看
#这里应该显示 465G 了。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1p2 259:2 0 465.7G 0 part
#上面看着对了之后就可以继续扩容文件系统
resize2fs /dev/nvme0n1p2
#最终验证
df -h
#结果如下:(这个是废话,因为还在U盘系统里面)
Filesystem Size Used Available Use% Mounted on
/dev/root 98.3M 27.5M 68.7M 29% /
tmpfs 3.8G 1.2M 3.8G 0% /tmp
/dev/sda1 16.0M 6.3M 9.7M 39% /boot
/dev/sda1 16.0M 6.3M 9.7M 39% /boot
tmpfs 512.0K 0 512.0K 0% /dev
#下面部分才能真正验证,看到下面结果就是好了
root@OpenWrt:~# mkdir /mnt/nvme
root@OpenWrt:~# mount /dev/nvme0n1p2 /mnt/nvme
root@OpenWrt:~# df -h /mnt/nvme
Filesystem Size Used Available Use% Mounted on
/dev/nvme0n1p2 459.8G 25.5M 459.8G 0% /mnt/nvme
#重启,记得拔掉U盘,我第一次就是忘记拔掉,回来看还是不对
Reboot
#再次进入系统之后使用df -h查看就对了。
#以下内容是因为第一次使用“删除旧分区 2 (parted) rm 2”这一块的操作导致了grub.cfg不对引起的。第二次复盘的时候没有出现,直接进系统了。
#第一次看到扩容的地方正确了,开心啊,就reboot重启了,结果不出意外的又出意外了,重启进不了系统。但是可以看到grub菜单,并且还跑了一会代码,那么就意味着引导程序没有问题,有问题的是引导的内容不对。
这里要感谢自己前端时间搞得Windows时光机,有兴趣可以在我的博客上看到,一台电脑从Win98到Win11,一共装了十几个系统,最后的引导管理就是用Grub4Dos来做,虽然不是Openwrt用的Grub2,但是很接近的。所以就是要改这个Grub2的配置文件。的这里推荐最简单的方案,进PE,在PE里面改。
#用记事本打开 grub.cfg(这个东西路径就在16MB那个盘上,忘记是在boot文件夹还是efi文件夹了,找一下吧,这文件是唯一的,好找)。
看到root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx或者root=/dev/sda2这种的时候直接改成以下内容:
root=/dev/nvme0n1p2(这个根据你的硬盘描述来)
#改完之后保存,重启
#我用的微PE,然后用DG将文件拷贝出来修改,结果拷贝回去说我这个版本好像基础版不得行。当时郁闷的很。不过仔细找了一下 有一个叫显示分区的工具,打开,然后Linux的硬盘分区也出来了。嗯,后面大大方方的复制替换就可以了。
@重启之后
df -h
成功了!