openwrt分区扩容的问题---多数openwrt固件的一个巨坑 保姆教程/ 顺带 linux和openwrt 扫盲 /常用扩展插件安装

今天第一次弄x86的openwrt,遇到分区扩容的一个坑。网上太多太多的资料 都是坑。

原因是原版的openwrt 有一个挂载的覆盖的bug,多数固件并未解决。我一开始用squashfs的固件,都没有搞定,最后换到ext4 解决。前后折腾2个多小时。 具体可以参考:https://github.com/openwrt/openwrt/issues/7352

然后下午在群里,发现有人手把手教别人弄,最后还是出现和我一样的问题。

df -h 查看容量正常,但是网页端 software查看容量 并没有增加。装软件也会提示容量不足

我的解决办法 就是用ext4模式安装,我用的官网的ext4固件。因为我设备是x86 并且没有很特殊的硬件,官网固件都是可以驱动的(N2600显卡除外,非efi模式启动黑屏)

如果你也和我一样 是x86的路由,那么强烈建议你用最精简的官网固件,原因

  • 第三方固件,不安全,虽然说都号称没有后门,但是你有时间和精力 或者有能力去查找后门嘛?
  • 鉴于openwrt这个圈子的特殊性,与其相信第三方固件作者是用爱发电,我更多相信他是一个半吊子菜鸟一时的热忱
  • 但openwrt圈内也确实有一些 完全开源甚至编译过程都开源的第三方固件,但是我们没有那么多时间去甄别,更没有那么多时间和经历 去折腾试用
  • openwrt 是一个完整的linux系统,官网固件只要能开机,能识别你的有线网卡,或者usb口,哪怕只能识别显示屏,那么剩下的都可以解决
  • openwrt 本身是一个很强壮 稳定高性能的 路由器系统,所有的问题 都出在第三方固件作者和 第三方插件上!!!看看那些第三方固件作者的声明
  • 第三方作者的水平层次不齐,甚至论坛上下载过万的固件 哪怕他最精简的版本bug多到都无法完成最基本的路由功能!
  • 当然,如果你网卡不识别,并且还是linux小白,又不想学习,那么就冒险试用第三方,或者付费找人编译吧。能用钱和安全解决的 问题,都不是问题 哈哈。
  • 如果有时间又能力去编译自定义固件,那么这个文章和这个观点也不适合你,自己忽略就好了。

今天群里还有人问 官网地址。。。 www.openwrt.org

下载官网稳定版固件

下载地址: https://archive.openwrt.org/releases/ 选择版本 再选择 cpu平台 就可以了。我这里是x86 64位的 cpu,所以 依次点击 22.03.2 -> targets -> x86 -> 64 ,然后选择 generic-ext4-combined.img.gz 这个ext4分区的

如果你机器只支持efi启动不支持传统bois启动,那就选generic-ext4-combined-efi.img.gz,如果同时支持,那么还是建议无脑选这个。如果你情况特殊非要用efi 那就选择 generic-ext4-combined-efi.img.gz 这个

很多第三方固件是 squashfs-combined 的,如果制作者没有处理overlay的bug,那么肯定会遇到挂载问题,网上有资料说可以通过删除/etc 目录的方法来解决,但是我试过也不行。

还有群友说看不懂英文的官网。。那么你就直接点我下面地址下载好了

我最终选中的固件是截至目前最新的稳定版:https://archive.openwrt.org/releases/22.03.2/targets/x86/64/openwrt-22.03.2-x86-64-generic-ext4-combined.img.gz

下载后 解压,不会解压或者你的解压工具出错,那么就直接用 winrar 解压他。 解压后是一个img文件

刷入硬盘

如果你原来是squashfs 那么是无法从op的网页后台升级刷入ext4的固件的,需要重新硬刷。

一般建议 是 吧上面的openwrt-22.03.2-x86-64-generic-ext4-combined.img.gz 解压后,从winpe下,或者linux live下 或者干脆把 硬盘挂到另外一个电脑,用balenaEtcher 或DD命令等 写盘工具写入到对应的磁盘

这个经常折腾系统的,都会,就不用细说了。 不会刷的,就自己搜一下balenaEtcher 的教程,基本就是 选择磁盘文件*.img 选择磁盘,写入 等待写入 等待校验 ,就完事了。

什么都不要动 直接去开机

网上很多教程,甚至是都一个文章抄出来的,说让你 在diskgen下调整分区,这个方法很不靠谱,且不说 diskgen对linux的分区支持不好,你可能压根操作不了,再说,diskgen可能会破坏UUID或者分区表兼容性,会导致 fstab和gurb出错。导致你的openwrt 压根启动不起来

linux下的文件系统,你尽量少用win下的软件去鼓捣。第三方的这些商业化软件 ,真的不靠谱。

所以 如果你调整不了 或 调整后启动不起来 那么是正常的。 不要用diskgen调整分区!!! 不要用diskgen调整分区!!!不要用diskgen调整分区!!!

启动openwrt

电脑接入openwrt,可以网线直接插上,也可以接入下属ap设备的wifi。自动获取ip,获取到 192.168.1.XX的就对了。 官网版本默认网页地址是: http://192.168.1.1 用户名 root 密码 空的

进入后,先拨号 联网,官网版本全英文界面 ,看不懂 自己手机翻译

点击 NetWork > Interfaces

编辑 edit wan口,接入方式 默认是dhcp 切换到 pppoe 会提示一次确认切换,然后输入 宽带用户密码,保存 应用保存(aplay save)

或者干脆直接接到 你现在的路由下dhcp自动获取ip,然后在现在的路由器 的dhcp列表里面找到他的ip然后用对应的ip 打开网页 以及登录shell 正常就可以拨号成功了。

shell登录openwrt

如果用putty 或者 其他工具比如MobaXterm fineshell 等等,甚至 win10以上电脑的cmd都可以。这里以简单的cmd命令好为例,win10、win11 下 win+R 快捷键,运行 cmd 在 cmd 窗口输入 执行 ssh root@192.168.1.1 第一次登录 会处理key的问题,输入yes 确认, 因为现在密码是空的不用输入密码 就可以了登录了。

如果有提示known_hosts的错误,打开 C:\Users\你的用户名\.ssh 这个隐藏文件夹,删除 known_hosts 文件,或者记事本打开编辑一下删除对应的行。

后面多数操作都是基于shell下的openwrt 。虽然很多操作是可以在网页端完成的,只是点来点去麻烦

准备安装软件

修改国内源(此步骤可以省略)

以修改清华源为例,执行以下命令sed正则替换downloads.openwrt.org为清华源的地址,如果你用其他源 找一下官网帮助,修改下面的命令就好

sed -i 's_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf

或者你用vim /etc/opkg/distfeeds.conf 手动编辑也行。 执行完成后更新一次本地list,记得openwrt每次重启后,如果要安装软件,都需要在网页端更新一次list 或者 shell执行下面命令。这个是openwrt的机制,他把源的数据放内存去了。重启就就没有了。

opkg update

安装常用的磁盘工具

op的官网版本 极度精简,精简到只有核心的基本功能,所以多数工具需要自己装。用过opwnwrt的都知道 ,约少的功能和插件,才越稳定。很多国内第三方固件,精简版,还要收费。。。真的 是坑小白。。。

opkg install block-mount fdisk cfdisk  lsblk 

解释下opkg 是openwrt的包管理工具的安装,同其他linux发行版的 apk apt yum pacman 等命令一样道理 ,你可以理解成 Windows的 exe msi setup等可以直接双击安装的安装包

安装:opkg install 在线软件包名称或者本地路径
卸载:先查看opkg list_installed 然后卸载opkg remove 软件包名(上一步找到的名称)

  • block-mount 是一个可以在openwrt网页端 操作挂载点的工具,这也是为什么你的openwrt菜单 系统下 没有挂载点这个按钮的原因 就是缺少这个包
  • fdisk 磁盘分区工具管理 同Windows下的fdisk 一样的
  • cfdisk 命令行可视化的磁盘分区工具,你可以理解为 这就是一个简化的linux版本 diskgen,或者fdisk的易用性工具
  • lsblk 磁盘分区和挂载点的一个查看工具

上面的 cfdisk lsblk 甚至block-mount 都不是必须软件,但是为了简单使用,还是建议你参考我教程 都装上,这些软件也都很小

block-mount 安装完成后 需要重启一下 openwrt ,才可以在网页端的 系统菜单 找到 mount/挂载点 这个按钮

安装网页中文汉化包和主题(此步骤可以省略)

opkg install  luci-i18n-base-zh-cn luci-theme-material

解释

  • luci-i18n-base-zh-cn 是网页端的中文语言包
  • luci-theme-material 是一个左右分栏,并且兼容手机等设备的openwrt网页界面主题,也可以不装,随便你。

中文语言包,虽然可以自动识别,但是部分软件 会显示中英文混杂的情况,所以最好 还是在 openwrt网页端的 system(系统) -> system(系统) -> lanuage and style(语言和主题) 选择一下 简体中文

主题 可以选择前面安装的 material,也可用默认的

开始之前 linux的磁盘管理的入门扫盲小知识

window 我们都知道 有C盘D盘什么的,但是linux 不存在这个,Linux下 一切皆为文件,包括硬件设备的:内存 硬盘 usb 甚至显卡 等等,这些都是文件,对应的 都是 Linux下 /dev下的文件。 我们所有的硬件的操作,都是对 /dev下的文件的操作。

因为没有C D 盘符的概念,linux下完整的路径 都是以/xxx 开头的,而非Windows下 C:/ D:/ 这样开头的

我们都知道 Windows可以修改盘符,比如 我可以把D盘从windows磁盘管理里面 分别E给他,他就同时可以用D和E 两个盘符了,删掉D 就变成E。 linux下就是用挂载和解除挂载的方式来解决不同分区的路径变化。。

如果是临时的挂载,我们直接用 mount /dev/【磁盘名称】【分区编号】 /【挂载地址】 命令就可以了。如果是开机启动挂载,就需要修改/etc 目录的下的 fstab文件

/etc这个目录,你可以理解成 Windows 的注册表 组策略。 几乎所有的软件和系统的配置项 都在这个目录里面。

但是因为直接编辑 /etc/fstab 这个文本文件,需要处理uuid可能不太直观,而且可能还存在其他分区甚至U盘 sd卡等,所以我们在openwrt下借用 上面说的block-mount 这个软件包,可以可视化的在openwrt网页端来操作。后续管理u盘sd卡 或nas也方便

处理分区和磁盘

cmd再次登录到openwrt的shell下,执行命令 fdisk -l 查看磁盘

root@OpenWrt:~# fdisk -l
Disk /dev/sda: 29.5 GiB, 31675383808 bytes, 61865984 sectors
Disk model: BIWIN SSD
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C120D9F5-D6F9-D15B-05A7-0D348F8A4B00

Device       Start      End  Sectors  Size Type
/dev/sda1      512    33279    32768   16M Linux filesystem
/dev/sda2    33280   246271   212992  104M Linux filesystem
/dev/sda128     34      511      478  239K BIOS boot

Partition table entries are not in disk order.

我这里 就一个磁盘 磁盘名称是 sdaDisk /dev/sda: 29.5 GiB,有三个分区 sda1 sda2 sda128

  • sda1 是他的基本启动文件
  • sda2 就是openwrt的系统分区,如果是overlay的openwrt固件情况还要复杂一些,如果你要用overlay,不妨去看一下overlay相关的文章。我这里是ext4的固件,所以简单很多。 如果你是efi的镜像,可能还多出来一个efi分区。

如果你要有多个磁盘,注意看 每一个磁盘的名字 还有 磁盘的编号。如果是nvme 磁盘的换,多数是/dev/nvmeXXX mmc磁盘的话/dev/mmcXXX 虚拟机的话根据虚拟平台不一样可能是/dev/vdXXXX /dev/vmXXX /dev/virXXX /dev/qemuXXX u盘或者sd卡的话,那么多数就usb 或者 sd开头的

我们现在需要增加容量的磁盘上扩建空间,我这里 以我的/dev/sda 这个磁盘为例子,shell命令再次执行cfdisk /dev/sda( 空格后面 指的要操作的磁盘 )

用键盘方向键操作,上下键盘,选择中绿色的部分 free space (空闲空间) 左右键 选择 New(新建)回车,输入新分区的容量。 你可以弄一个1-2G的给系统用,剩下一点分区给docker用(挂载到/opt)或者干脆简单简单的 全部空间 给到系统

然后 会新建一个分区 /dev/sdaXXX 我 这里是/dev/sda3, 然后左右键 选择 保存(write)输入 yes确认 左右键选择退出(quit)

这样我们就新建了一个分区

格式化这个新分区

Windows下格式化命令 我们都知道 是format,Linux下用 mkfs.XXX, Linux常用的分区很多种,这里不展开说,但是这里肯定适合用NTFS exfat fat之类,不是说不能用,而是说稳定性和速度在linux下表现不好, 所以还是用linux的常用分区格式,我这里用传统的ext4 兼容性和稳定最好

mkfs.ext4  /dev/sda3

不要关闭shell,回到openwrt网页端处理挂载

点 系统> 挂载点 生成配置 自动生成配置

在挂载点那个位置,可以看到 多出来的一个分区/dev/sda3 他想自动挂载到/mnt/sda3上,我们编辑一下这条

UUID 保持是这个分区的没错 我这里是xx-xx-xx /dev/sda3 29.38G

挂载点选择 / 作为根目录使用

然后看一下这行地方有一个提示 根目录准备,确保使用以下命令来复制根文件系统,后面几行命令,其中一行 mount /dev/sda1 /tmp/extroot

这个地方 他的实例是处理的/dev/sda1 第一分区,需要改为你刚刚新建的分区 我这是/dev/sda3,最终命令和解释

1
2
3
4
5
6
7
mkdir -p /tmp/introot  #创建一个文件夹
mkdir -p /tmp/extroot #创建一个文件夹
mount --bind / /tmp/introot # 用临时屏蔽的方法 挂载/ 到introot这个目录 方便我们后面复制
mount /dev/sda3 /tmp/extroot  # 这行需要编辑一下  把我们的新建的分区 临时挂载到extroot
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -  # 用tar的方式,把原来根分区的 文件 保留权限同步复制到extroot(/dev/sda3 就是新分区) 并打印出详细信息和进度
umount /tmp/introot # 取消挂载
umount /tmp/extroot # 取消挂载

先在网页的 保存挂载点的配置,然后删除 和sda2 之前的那个100M左右的分区的挂载。 然后应用保存。 再把上面的命令逐行 或者全部复制到 openwrt的shell 里面 执行

注意顺序别搞错了。

重启检查

重启路由器,启动完成后检查 shell运行df -h

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               102.3M     20.5M     79.7M  20% /rom
tmpfs                     1.9G    572.0K      1.9G   0% /tmp
/dev/sda3                28.8G    348.8M     26.9G   1% /
/dev/sda1                16.0M      5.7M     10.2M  36% /boot
/dev/sda1                16.0M      5.7M     10.2M  36% /boot
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda3                28.8G    348.8M     26.9G   1% /opt/docker

shell运行lsblk

root@OpenWrt:~# lsblk
NAME     MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda        8:0    0 29.5G  0 disk
├─sda1     8:1    0   16M  0 part /boot
│                                 /boot
├─sda2     8:2    0  104M  0 part /rom
├─sda3     8:3    0 29.4G  0 part /opt/docker
│                                 /
└─sda128 259:0    0  239K  0 part

网页端依次点开 系统 Software 查看 Free space 30G 左右

这就正常了

后续- 安装常用插件

能用docker跑的,尽量用docker,能放到旁路路由的尽量不要放主路由

安装方法和清单 https://dev.leiyanhui.com/openwrt/openwrt-plus/

最后写在结尾的话

openwrt这个国内圈子有一点畸形,做固件的也不是什么大神,更多是一些linux一知半解的小白的做,可能比完全不懂linux的你好不到哪里去。甚至还有收费的第三方定制固件,甚至还有x86的精简固件收费。。有点匪夷所思。

openwrt群里,还一些人自己可以编译固件 沾沾自喜自诩为大神 甚至收费。。

其实 openwrt 是一个完整的linux系统,只是官网没有出iso安装镜像,而且img格式的磁盘镜像。 大部分内容你甚至可以直接挂载img文件编辑后写入磁盘。。。

最后,openwrt本身很强壮很稳定, 不稳定的是第三方插件。

所以能不用第三方固件 就不要用,能用精简版 就不要用什么高大全,能修改img文件搞定的事情,就不要自己编译固件。折腾。

如果是x86_64 尽量用ext4的方法安装,系统如果损坏有资料需要导出或者文件误删除 都好处理。overlay 系统恢复初始化简单一些。但是扩容这个地方需要自己编译固件,或者用第三方已经处理好的固件来弄。 完整编译一次固件,看网络和机器性能 差不多需要2-4小时时间,得不偿失。。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus