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虚拟机设置

  1. 启动UTM,然后点击 Create a new Virtual Machine
  2. 选择Virtualize
  3. 选择Other(因为Linux的安装路径需要一个安装ISO映像文件,而我们在OpenWrt中不使用这种映像文件)。
  4. 勾选 Skip ISO boot
  5. 配置为512MB内存和2个CPU(需要保证有足够资源运行sysupgrade), 这里我用了1G内存,反正够大
  6. 接受默认的存储设置(稍后将删除这个驱动器并替换为OpenWrt镜像)。
  7. 无需配置共享目录
  8. 勾选 Open VM Settings 。为虚拟机命名,然后点击 Save

虚拟机配置

如果您根据本文档设置,请继续参考下列配置:

网络设置

  1. 选择 Network 。官方文档是改为 Host Only 。勾选 Show Advanced Settings 。并在 Guest Network 框中,输入虚拟机LAN的网络范围:_10.0.2.0/24_。但是我经过测试/踩坑之后发现使用 Bridged 即可,这里不用配置网络范围,因为稍后还是需要命令行配置。
  2. 在“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在创建虚拟机时创建的空白磁盘)

其他设备设置

  1. 继续在下方点击_/+New_条目,添加一个新的_Serial_设备。点击串口设备并检查模式。默认模式是一个内置终端窗口,支持使用macOS原生键盘快捷键进行复制和粘贴。可自由终端样式。
  2. Drives 选项部分,选择 New …。接受接口默认设置(VirtIO),然后点击 Import …。目标文件夹为你之前解压的openwrt.img文件。
  3. 这一步非常重要,因为此固件只分配给根分区 102MB 空间,不利于将来安装其它软件,需要将根分区进入扩容。这里再次添加一个 Disk Image 作为扩容。在 Drives 选项部分,选择 New …。接受接口默认设置(VirtIO), 设置磁盘空间为10G。

点击 Save 保存以上设置 .

虚拟机中OpenWrt设置

  • 启动你的虚拟机(点击启动按钮)
  • 等待几秒GRUB自动启动
  • 当启动消息完成滚动时,按Enter键以激活虚拟机内的控制台
  • 显示当前LAN网络配置。请注意,在第一次启动时,默认的LAN地址为192.168.1.1。
1
2
3
4
5
6
7
root@openwrt:~# uci show network.lan
network.lan=interface
network.lan.device='br-lan'
network.lan.proto='static'
network.lan.ipaddr='192.168.1.1'
network.lan.netmask='255.255.255.0'
network.lan.ip6assign='60'
  • 编辑网络配置以允许SSH访问,ip地址根据主网络,将以下命令粘贴到控制台中:
1
2
3
uci set network.lan.ipaddr='192.168.124.2'
uci commit
service network restart
  • 也可以使用vi直接编辑config文件,进行修改后重启网络
1
2
3
vi /etc/config/network
service network restart

  • 我的网络配置文件是这样的,以作参考

现在可以通过SSH访问OpenWrt虚拟机,使用用户root(无密码),IP地址为192.168.124.99

OpenWrt 扩展根目录空间

因为此固件只分配给根分区 102MB 空间,不利于将来安装其它软件,需要将根分区进入扩容, 本段教程主要参考了这篇教程 Vmware下openwrt虚拟机扩展根目录大小.

首先可以查看系统空间使用情况,

1
2
3
4
5
6
7
root@OpenWrt:~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 102.3M 17.9M 82.3M 18% /rom
tmpfs 491.4M 68.0K 491.3M 0% /tmp
/dev/vda1 16.0M 6.1M 9.8M 38% /boot
/dev/vda1 16.0M 6.1M 9.8M 38% /boot
tmpfs 512.0K 0 512.0K 0% /dev

其中 /dev/root 是系统固件目录,不用考虑。/dev/vda* 就是系统实际可用的硬盘空间。记着上面明明分配了 10GB 空间给 openwrt 但是由于系统分区是在下载的固件中定义好的,所以其余空间就没有被识别。由于默认存储空间过小,当安装了过多的插件后,会提示空间不足导致无法安装更多插件:

1
2
verify_pkg_installable: Only have 0kb available on filesystem /overlay, pkg luci-app-openvpn needs 9
opkg_install_cmd: Cannot install package luci-app-openvpn

如何将剩余空间挂在到OpenWrt中

  1. 安装需要的插件,注意顺序不能错:
1
2
3
4
opkg update
opkg install block-mount e2fsprogs
opkg update
opkg install fdisk blkid
  1. 配置存储空间,注意 fdisk 指令后的几个选项:
1
2
3
4
5
6
7
8
9
10
11
12
fdisk -l

fdisk /dev/vdb
m
n
p
<默认,回车> //–>分区号为1
<默认,回车>
<默认,回车>
w

reboot
  1. 重启后,格式化刚才建立的分区:
1
2
fmkfs.ext4 /dev/vdb1
reboot
  1. 再次重启后配置 fstab:
1
2
3
4
5
6
7
8
9
10
11
12
13
uci add fstab mount

# 将下面第一行命令输出的 UUID 替换第二行命令后的 UUID
blkid -s UUID /dev/sda3 | cut -d\" -f2
uci set fstab.@mount[-1].uuid=UUID

uci set fstab.@mount[-1].options=rw,sync,noatime
uci set fstab.@mount[-1].fstype=ext4
uci set fstab.@mount[-1].enabled_fsck=1
uci set fstab.@mount[-1].enabled=1
uci set fstab.@mount[-1].target=/
uci set fstab.@mount[-1].device=/dev/vdb1
uci commit fstab
  1. 将根目录复制到新的分区下:
1
2
3
4
5
6
7
8
mkdir /mnt/vdb1
mount /dev/vdb1 /mnt/vdb1
mkdir -p /tmp/cproot
mount --bind / /tmp/cproot
tar -C /tmp/cproot -cvf - . | tar -C /mnt/vdb1 -xf -

umount /tmp/cproot
umount /mnt/vdb1
  1. 启用引导:
1
2
3
4
/etc/init.d/fstab enable
/etc/init.d/fstab start

reboot
  1. 重启后再次查看系统分区信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@OpenWrt:~# fdisk -l
GPT PMBR size mismatch (246303 != 246334) will be corrected by write.
The backup GPT table is not on the end of the device.
Disk /dev/vda: 120.28 MiB, 126123520 bytes, 246335 sectors
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: 7117DB1B-5559-E8FA-6528-E16757565D00

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

Partition table entries are not in disk order.

Disk /dev/vdb: 10 GiB, 10737418240 bytes, 20971520 sectors
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: dos
Disk identifier: 0x4a3398cd

Device Boot Start End Sectors Size Id Type
/dev/vdb1 2048 20971519 20969472 10G 83 Linux

可以看到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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Install packages
opkg update
opkg install parted
root@OpenWrt:~# parted -l
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 10.7GB 10.7GB primary ext4


Warning: Not all of the space available to /dev/vda appears to be used, you can
fix the GPT to use all of the space (an extra 30 blocks) or continue with the
current setting?
Fix/Ignore? Fix
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 126MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
128 17.4kB 262kB 245kB bios_grub
1 262kB 17.0MB 16.8MB fat16 legacy_boot
2 17.0MB 126MB 109MB ext2

再次输入fdisk -l查看分区信息就没有那个错误了。