MacOS黑苹果折腾OpenWrt
前段时间把吃灰的NUC8安装黑苹果并升级到Sonoma14.5(安装、升级很顺利,就是在14.5WI-FI没了,弄了好久还没搞出来),黑苹果安装ClashXPro做旁路由,相当丝滑。看到还可以安装一个OpenWrt做软路由,开整。
安装UTM
UTM 是苹果 IOS、macOS 生态下的一款开源的虚拟机软件,底层基于 QEMU 或 Apple 虚拟化,能够在苹果操作系统上以半虚拟化(同 CPU 架构)或全虚拟化(异构 CPU 系统)的形式运行 Linux、Windows 以及 macOS,支持x86和Apple Silicon.
直接在官网下载dmg安装即可。
在x86的黑苹果UTM虚拟机安装OpenWrt
黑苹果是x86架构,UTM官网上只有Apple Silicon的教程,但是照着做下来,区别不大。
选择适合的OpenWrt镜像
我们需要x86_64位版本的 OpenWrt。 有下列两个版本可供选择:
combined-squashfs.img.gz
: 截止到版本23.05.3,这个版本与sysupgrade功能不兼容combined-ext4.img.gz
: 这个磁盘镜像使用一个单独的可读写的ext4分区,没有只读的squashfs根文件系统,因此无法使用像 Failsafe Mode(安全模式)或 Factory Reset(出厂重置)等功能
在这份文档中,我们将使用openwrt-x86-64-generic-ext4-combined-efi.img.gz/
, 因为它支持sysupgrade功能
- 从targets/x86/64/下载一个稳定版本的generic-ext4-combined-efi.img.gz,比如23.05.3
- 解压下载得到的gz文件,可以使用
gzcat openwrt-23.05.3-x86-64-generic-ext4-combined-efi.img.gz > openwrt.img
,将得到一个原始的openwrt.img
镜像文件
UTM虚拟机设置
- 启动UTM,然后点击 Create a new Virtual Machine
- 选择Virtualize
- 选择Other(因为Linux的安装路径需要一个安装ISO映像文件,而我们在OpenWrt中不使用这种映像文件)。
- 勾选 Skip ISO boot
- 配置为512MB内存和2个CPU(需要保证有足够资源运行sysupgrade), 这里我用了1G内存,反正够大
- 接受默认的存储设置(稍后将删除这个驱动器并替换为OpenWrt镜像)。
- 无需配置共享目录
- 勾选 Open VM Settings 。为虚拟机命名,然后点击 Save
虚拟机配置
如果您根据本文档设置,请继续参考下列配置:
网络设置
- 选择 Network 。官方文档是改为 Host Only 。勾选 Show Advanced Settings 。并在 Guest Network 框中,输入虚拟机LAN的网络范围:_10.0.2.0/24_。但是我经过测试/踩坑之后发现使用 Bridged 即可,这里不用配置网络范围,因为稍后还是需要命令行配置。
- 在“Devices”下,点击/+New条目,添加一个新的 Network 。点击这个网络并确认它被配置为 Shared Network 。
官方文档的说明是
虚拟机上的br-lan 接口连接到lan 接口,固定地址为10.0.2.2,在UTM中设置为Host Only Network。此接口将始终对当前主机可用。
虚拟机上的eth1接口连接到wan接口,使用动态地址,在UTM中设置为Shared Network(NAT)。此接口将通过主机进行互联网访问。
我的理解稍有不同,NUC8黑苹果连接的主网络ip范围是192.168.124.0/24
,我需要OpenWrt接入主网络做旁路由,所以这里使用br-lan连接到lan 接口,固定地址192.168.124.99
,这样OpenWrt也可以被主网络的设备识别.
移除未使用的设备
在 Display 选项上右键点击并删除它。在Sound选项上右键点击并删除它。(由于OpenWrt运行在终端,无需声音图形设备,删除可以减轻资源压力)在 VirtIO Drive 选项上右键点击并删除它。确认删除驱动器,点击 Delete 。(这是UTM在创建虚拟机时创建的空白磁盘)
其他设备设置
- 继续在下方点击_/+New_条目,添加一个新的_Serial_设备。点击串口设备并检查模式。默认模式是一个内置终端窗口,支持使用macOS原生键盘快捷键进行复制和粘贴。可自由终端样式。
- 在 Drives 选项部分,选择 New …。接受接口默认设置(VirtIO),然后点击 Import …。目标文件夹为你之前解压的
openwrt.img
文件。 - 这一步非常重要,因为此固件只分配给根分区 102MB 空间,不利于将来安装其它软件,需要将根分区进入扩容。这里再次添加一个 Disk Image 作为扩容。在 Drives 选项部分,选择 New …。接受接口默认设置(VirtIO), 设置磁盘空间为10G。
点击 Save 保存以上设置 .
虚拟机中OpenWrt设置
- 启动你的虚拟机(点击启动按钮)
- 等待几秒GRUB自动启动
- 当启动消息完成滚动时,按Enter键以激活虚拟机内的控制台
- 显示当前LAN网络配置。请注意,在第一次启动时,默认的LAN地址为192.168.1.1。
1 | root@openwrt:~# uci show network.lan |
- 编辑网络配置以允许SSH访问,ip地址根据主网络,将以下命令粘贴到控制台中:
1 | uci set network.lan.ipaddr='192.168.124.2' |
- 也可以使用vi直接编辑config文件,进行修改后重启网络
1 | vi /etc/config/network |
- 我的网络配置文件是这样的,以作参考
现在可以通过SSH访问OpenWrt虚拟机,使用用户root(无密码),IP地址为192.168.124.99
OpenWrt 扩展根目录空间
因为此固件只分配给根分区 102MB 空间,不利于将来安装其它软件,需要将根分区进入扩容, 本段教程主要参考了这篇教程 Vmware下openwrt虚拟机扩展根目录大小.
首先可以查看系统空间使用情况,
1 | root@OpenWrt:~# df -h |
其中 /dev/root 是系统固件目录,不用考虑。/dev/vda* 就是系统实际可用的硬盘空间。记着上面明明分配了 10GB 空间给 openwrt 但是由于系统分区是在下载的固件中定义好的,所以其余空间就没有被识别。由于默认存储空间过小,当安装了过多的插件后,会提示空间不足导致无法安装更多插件:
1 | verify_pkg_installable: Only have 0kb available on filesystem /overlay, pkg luci-app-openvpn needs 9 |
如何将剩余空间挂在到OpenWrt中
- 安装需要的插件,注意顺序不能错:
1 | opkg update |
- 配置存储空间,注意 fdisk 指令后的几个选项:
1 | fdisk -l |
- 重启后,格式化刚才建立的分区:
1 | fmkfs.ext4 /dev/vdb1 |
- 再次重启后配置 fstab:
1 | uci add fstab mount |
- 将根目录复制到新的分区下:
1 | mkdir /mnt/vdb1 |
- 启用引导:
1 | /etc/init.d/fstab enable |
- 重启后再次查看系统分区信息:
1 | root@OpenWrt:~# fdisk -l |
可以看到10G的 vdb1 分区已经正常挂载了,后续可以继续安装需要的各种插件了,足够折腾了。但是,上面显示有PMBR错误,尽管影响不大,还是要解决,
GPT PMBR size mismatch (246303 != 246334) will be corrected by write. The backup GPT table is not on the end of the device.
1 | # Install packages |
再次输入fdisk -l
查看分区信息就没有那个错误了。