今天第一次弄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
,最终命令和解释
|
|
先在网页的 保存挂载点的配置,然后删除 和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小时时间,得不偿失。。