日志
- 2023-07-16:新增文字显示异常的应对措施。详见“OpenWrt虚拟机——文字显示异常”部分。
- 2023-03-28:新增禁root密码登陆的教程;新增关于开机/重启虚拟机与qemu-quest-agent的说明。
前言
学习完《NAS系列 PVE基本设置》和《NAS系列 PVE的节点选项》后,相信你已经迫不及待地要开搞虚拟机了!在本文中,我会展示如何在PVE系统中搭建OpenWrt虚拟机。OpenWrt是一个软路由系统,负责拔号上网、策略分流、广告屏蔽和其它奇奇怪怪的功能。除了OpenWrt的安装,我还会介绍一下OpenWrt的硬盘挂载、Docker使用和SSH禁root密码登陆,它们的使用与Ubuntu/Debian等Linux发行版略有不同。当然,这些只是推荐而不是必需的。限于篇幅,关于OpenWrt的一些重要插件(比如OpenClash和AdGuard Home),有机会的话会在后续文章中作介绍。
另外,本系列教程所配置的网络均为Ipv4网络,所以并不太适合使用Ipv6的小伙伴。下面我们开始设置吧!
OpenWrt虚拟机
上传镜像
首先,我们按照《NAS系列 准备安装PVE系统 – Bensz》的准备工作——OpenWrt
的教程准备好自己的OpenWrt镜像。我目前使用的OpenWrt镜像是基于supes.top来搭建的。将OpenWrt镜像解压(.img)并上传到local(local)
中:
注意保管好原来的img,因为我们会使用硬盘模式来安装OpenWrt虚拟机——整个OpenWrt系统是运行在openwrt-*.img
里面。所以local中的.img
的内容会随着设置的改变而发生变化,而不再是原来的样子。
新建虚拟机
看视频(时间点已选好)按顺序设置即可: 【司波图】2022版通用型PVE_AIO服务器布局教程(上)_哔哩哔哩_bilibili
建议按视频的指引来操作。暂时不需要外挂任何磁盘。最后的结果类似:
点击完成即可。完成后先不要启动OpenWrt虚拟机,以便我们完成一些配置的修改。这里的内存(memory)只有512M。如果你玩PCDN(比如《NAS系列 PCDN系列 网心云之容器魔方》或《NAS系列 PCDN系列 网心云之x86专业版》),由于对带宽传输的要求较高,建议内存在2G以上。
虚拟机选项
对于PVE虚拟机,硬件
和选项
是最重要的两个项目:
如果OpenWrt只需要负责上网功能,则并不需要很大的硬盘空间。这里我们使用硬盘模式来安装OpenWrt。
首先,在PVE Shell中,我们输入以下命令:
# 100就是当前OpenWrt的虚拟机号
cat /etc/pve/qemu-server/100.conf
内容大致如下:
boot: order=ide2;net0
cores: 4
ide2: local:iso/104-openwrt-x64-R22.10.1-CW-X86-P1-squashfs-combined-efi.img,media=cdrom,size=436502016
memory: 512
meta: creation-qemu=7.1.0,ctime=1676165247
name: OpenWrt
net0: virtio=72:E3:81:EA:12:B1,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
scsihw: virtio-scsi-pci
smbios1: uuid=79229ae1-9f45-457a-adc5-c13304ac5441
sockets: 1
vmgenid: 49278893-a349-4744-9c8b-f37fde159456
这些就是PVE里关于100
虚拟机(也就是OpenWrt)的配置信息。
利用Vim等编辑器,我们将ide2
变成硬盘模式——将media=cdrom
改为cache=unsafe
即可:
更改即时生效。
最后,我们还要直通一个物理网卡给OpenWrt系统当WAN口使用,用于宽带PPPoE拔号上网。根据《NAS系列 PVE基本设置》的介绍,我的WAN口对应的设备是04:00.0
,直接添加PCI设备即可:
选PCI设备时有一个所有功能
的选项,勾不勾上似乎影响不大。
启动虚拟机
改完硬盘模式、选好物理WAN口后,就可以直接启动OpenWrt虚拟机了:
值得一提的是,在默认情况下(禁用QEMU Guest Agent),如果你想关闭虚拟机,不要按关机
,而是按停止
。此时要按停止
不容易产生奇奇怪怪的bug或报错:
有些Linux系统支持Qemu quest agent
,建议开启,即可避免此bug并支持重启/关机操作。详见《NAS系列 PVE基本设置》。
工作界面
如果你也是基于supes.top来搭建镜像的,应该记得这个后台地址
和后台密码
:
利用它登陆后台即可。成功登陆后的主页大致如下:
总之,安装Openwrt虚拟机是挺简单的,并没有什么特别的难点。看本教程和司波图视频中安装OpenWrt的部分基本上就可以顺利完成。
其它说明
如果你要更换硬件配置,要停止容器后才可以更换。这是PVE初学者最容易犯的错误 (ฅ´ω`ฅ)
观察控制台(Shell)的反应,出现OpenWrt的logo就代表系统正常运行:
有时这个logo不会自己出现,多按几下Enter键即可!不同的Openwrt固件的logo是不太一样的,但大致都是一些字符组成的与OpenWrt相关的图案。
所有的虚拟机都是可以通过Shell登陆,包括使用MobaXterm等工具。推荐使用《Linux基础 基于密钥对的SSH远程登陆》介绍的方法进行Shell访问。OpenWrt的Shell使用和Ubuntu等区别不大。
需要注意的是,不要随便在Shell里更新OpenWrt甚至是Linux内核,这可能会导致OpenWrt无法正常工作。我以前在家里的软路由里就吃过这个亏,最后只能重刷OpenWrt。如果你真的想更新OpenWrt,建议先获得更新固件,然后在GUI里更新:
文字显示异常
我发现,在系统——软件包
中安装完新插件后,偶尔会存在文字显示异常,比如应该显示中文却仍显示英文。该异常在我安装luci-app-wrtbwmon(流量监控软件)后首次出现。这往往是由浏览器缓存引起的,因此只需打开OpenWrt后台,按F12调出开发者窗口并清空缓存即可:
系统配置
在整个设置过程中,你应该事先确认好用哪些IP和哪个网段,这样可以避免因为网段不一致导致操作电脑无法连接OpenWrt的情况。你需要对《了解IP地址》的内容有较好的理解,这在之前的文章里也反复强调过。
定位WAN/LAN口
在PVE.OpenWrt Shell中输入以下命令:
cat /etc/config/network
输出结果包含:
config interface 'lan'
option proto 'static'
option netmask '255.255.255.0'
option ipaddr '192.168.1.1'
option delegate '0'
option device 'eth0'
这里既可以看到LAN口设置的基本情况,也可以在这里修改ip(即ipaddr
)和对应的网卡(device
)。
在PVE.OpenWrt Shell里输入以下命令:
ip a
输出结果包含:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 1a:d8:c1:42:16:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:e0:b4:1d:e2:a5 brd ff:ff:ff:ff:ff:ff
这里的link/ether
后面对应的1a:d8:c1:42:16:14
或00:e0:b4:1d:e2:a5
就是网卡的mac号。我们通过比对PVE.OpenWrt的硬件信息可以确定虚拟网卡1a:d8:c1:42:16:14
就是eth0
;另外一个网卡则必然是物理网卡:
如果您在OpenWrt里的物理网卡很多,需要在PVE里确定网卡编号时就要确认好Mac号,这样方便未来进入一一对应;又或者直接在OpenWrt系统里通过插网线的方式依次确认。具体方法可见《NAS系列 PVE基本设置》的网络——网口ID
部分。
总之,我们确定:eth1
是物理千兆口,是WAN口;eth0
是虚拟网口,是LAN口。此外,我不太确定这个编号顺序是否和虚拟机硬件中的排列顺序一致,因为在OpenWrt的硬件中,虚拟网口刚好排在直通的PCI网卡的前面:
如果这个顺序是固定的,那么eth
系的ID是挺好确认的,按顺序从eth0
往下排即可。有知道的小伙伴可以评论区留言喔!
设置WAN口
一般家用宽带上网像这样设置即可:
如果有其它多余的网口,可以直接删除,不用担心。以后有需要时可以随时添加新接口。
首先,宽带光猫必须设置成桥接模式,这样才可以用软路由拔号,从而充分发挥软路由的性能。这个过程一般是由装宽带的师傅完成;网上教程也有教自己改的,这个我就不推荐了。
软路由拔号一般是使用PPPoE协议
,输入帐号密码(问宽带师傅或者看光猫底部)就可以上网。下面我贴出WAN口和LAN口的基本设置,大家对照着改动即可:
- 常规设置
- 高级设置:
禁用Ipv6的相关设置:
另外,据我所知,OpenWrt在某些条件下是支持多拔的。比如,拉2条宽带,分配两个WAN口,然后“融合”两者的带宽,从而增强上/下行带宽。这些玩法我也只是耳闻,没亲身试过,感兴趣的小伙伴自行了解喽!
设置LAN口
在下面设置的基础上,按实际情况微调即可:
- 基本设置:
- 高级设置:
- 防火墙设置:
- DHCP服务器:
把WAN口和LAN口设置完后,“保存并应用”使设置生效,即可正常上网:
如果有其它情况,可以在PVE.OpenWrt Shell里输入reboot
命令重启OpenWrt,然后再看看是否可以正常上网。有其它问题评论区留言喽 (ฅ´ω`ฅ)
宽带测速
我们可以访问https://www.speedtest.cn/进行测速。以广东电信的500Mbps宽带(下行500Mbps,上行50Mbps)为例:
这是晚上高峰时间段测试的,这个带宽和延迟还算可以。实际上,不同的连接节点的速度差别还挺大的,这种结果只是一个参考。最重要是日常使用场景没有明显限制。
值得注意的是,如果你使用了OpenClash的Fake IP模式,这个测速大概率是不准的——主要表现为测速下行带宽远低于实际带宽。
挂载硬盘
如果OpenWrt只是个拔号软件,我觉得这样上述的设置就足够了。不过,如果你想在OpenWrt里使用Docker,比如搭建双ADguard Home作为上游DNS服务器和广告过滤器,还是需要挂载一块硬盘的。Docker并不是一个轻量应用,往往对硬盘空间有较大需求;硬盘太小甚至无法正常运行。如果你的需求较大,硬盘空间较足,可以分配多一些容量。
添加新的虚拟硬盘
首先,我们先停止虚拟机。然后,按下图所示添加一块硬盘即可:
在存储
里也可以选其它存储空间(比如OpenMediaVault的SMB共享、其它硬盘等)。我自己的系统盘还挺大的,所以直接上的LVM-Thin。如果你是用SMB共享,那么需要将提供SMB服务的虚拟机的启动顺序调到OpenWrt前面,以避免重启PVE时OpenWrt识别不了分区而发生启动错误。使用LVM-Thin则没有这种问题,因为PVE必然在任何虚拟机之前启动。
给新硬盘分区
和大多数硬盘一样,我们在挂载硬盘前需要先给硬盘分区。我们在PVE.OpenWrt Shell中使用fdisk
命令进行硬盘分区。
首先,我们用fdisk -l
看一下新硬盘的设备名:
比如,我们要在硬盘/dev/sda
上新建分区,只要:
fdisk /dev/sda
之后就是按提示来即可。输入p显示分区;输入n新建分区;输入p新建主分区;按提示完成分区(一般都按默认的参数选择,这样就是新建1个最大的分区);输入p看分区是否成功被创建,此时的新建分区一般叫/dev/sda1
。最后,按w退出。这个过程自己摸索一下,应该不难!
我们还要确定新分区的文件类型,即要对新分区/dev/sda1
进行格式化。只要:
# 文件类型ext4
mkfs.ext4 /dev/sda1
这样一个新的分区/dev/sda1
就准备好了。
挂载新分区
在我的OpenWrt中,系统默认/dev/sda1
是挂载到/mnt/sda1
的。建议使用默认的目录:
mount /dev/sda1 /mnt/sda1
这样新分区就临时挂载到/mnt/sda1
中。此时,如果reboot
重启OpenWrt,该挂载会失效。
我们需要来到OpenWrt GUI,从系统——挂载点
中找到挂载点,添加一条记录即可:
保存并应用配置。然后,reboot
重启OpenWrt,并通过df -h
查看/dev/sda1
的挂载是否生效:
如上图,/dev/sda1
已经成功地永久挂载到/mnt/sda1
路径了!
在OpenWrt中,这种稳定的挂载关系没办法通过修改/etc/fstab
或/etc/config/fstab
而改变,可能是因为OpenWrt的GUI对这些设置进行了强制托管。我发现OpenMediaVault也有类似的保护机制。这可能是因为这些系统的GUI都有对配置改变的应用和回退机制,所以需要这种保护机制。知道具体原因的小伙伴,欢迎在评论区留言!
安装Docker
与大多数Linux发行版不同,OpenWrt安装Docker的最好方式是在系统——软件包
里安装:
如果你编绎时选择了luci-app-dockerman
,大概率就已经带有这个部分了。没有编绎的小伙伴在这里手动安装也行。
这里要特别注意Docker的根目录位置。我们使用的硬盘模式安装的OpenWrt,自带容量对Docker来说太小了。修改根目录的操作在PVE.OpenWrt Shell中是不能成功的——我们需要在Docker——配置
里修改:
我在OpenWrt安装Docker的主要目的是使用双ADGuard Home作为DNS服务器:
基于docker-compose(这个时候可以直接使用PVE.OpenWrt Shell),双ADGuard Home的安装是挺简单的,这里暂时按下不表。
另外,我觉得在OpenWrt安装Nginx Proxy Manager、DDNS-GO之类的Docker应用也是个不错的选择,这个小伙伴们按需要配置即可。我早期的时候是在PVE里安装Nginx Proxy Manager和DDNS-GO的,所以后面并没有在OpenWrt中安装它们。关于Nginx Proxy Manager和DDNS-Go的安装方法可见《Docker系列 两大神器NPM和ddns-go的安装》。
密钥登陆SSH
由于OpenWrt是掌管本地网络的重要基地,因为建议使用更加密钥登陆SSH,这是一种更加安全的做法。具体教程与《Linux基础 基于密钥对的SSH远程登陆》并不相同。
首先,我们进入OpenWrt GUI的管理权
界面并禁止root用户凭密码登陆
:
然后,在SSH密钥
里添加你的公钥:
如果你有一个私钥,可以通过MobaXterm的SSH密钥生成器来生成公钥,具体方法见《Linux基础 基于密钥对的SSH远程登陆》。这样就不怕网络机器人扫描SSH后台了!
小结
本文大致介绍了如何在PVE中搭建OpenWrt虚拟机,还分享了硬盘挂载和安装Docker的相关技巧。以后有机会我可能会介绍基于OpenClash策略分流的基本原理,敬请期待吧!
扩展阅读
- OpenWrt的防火墙到底这么多选项都是什么意思? – YouTube
- 开启 OpenClash 影响NAT类型 · Issue #2288 · vernesong/OpenClash
- 电犀牛R68s,在openwrt下安装Docker版网心云(容器魔方)pcdn教程。 – YouTube
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍
留个爪~
另外补充说明下,PVE 用「关机(shutdown)」一般都是会卡住,这是因为它的关机功能是通过在虚拟机内部安装一个代理程序 qemu-guest-agent 来实现的,这种关机手段更优雅,会妥善处理关机流程。对比之下,直接「停止」就不需要装什么代理,代价则是有些丢数据/损坏数据的风险。
那么显然「关机」不好使就是因为虚拟机里没有 qemu-guest-agent,导致没人来执行真正的「关机」操作,这玩意儿一般得手动装。
对于 Linux 虚拟机可以直接通过 apt 等命令安装此程序,然后重启系统即可生效。
对于 Windows 虚拟机,则需要安装 VirtIO 驱动 Windows_VirtIO_Drivers
原来如此,谢谢提醒哈! 之前我测试后试试看 (ฅ´ω`ฅ)
我在PVE里安装了qemu-guest-agent。经过测试,OpenMediaVault虚拟机关机的时候还是会出现报错:
TASK ERROR: VM quit/powerdown failed - got timeout
。不知大佬有什么建议?可能我的描述有点容易引起误解,这个 qemu-guest-agent 是要装在 guest 主机里面,也就是说要在你的 OpenMediaVault 虚拟机里面安装它,而不是在 PVE 里面装~
原来如此。谢谢 (ฅ´ω`ฅ)
我检查了一下,我的OpenMediaVault虚拟机中本来就已经安装了
qemu-guest-agent
。看来它并不是引起上述错误的主要原因。谢谢大佬的提醒,教程已经更新了 (ฅ´ω`ฅ)