NAS系列 在PVE中搭建OpenWrt虚拟机
本文最后更新于 248 天前,如有失效请评论区留言。

本博客由ZGOCLOUD大力赞助!如何更快地访问本站?有需要可加电报群获得更多帮助。本博客用什么VPS?创作不易,请支持苯苯!推荐购买本博客的VIP喔,10元/年即可畅享所有VIP专属内容!

日志

  • 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)中:

msedge_RLmE76QyGc

注意保管好原来的img,因为我们会使用硬盘模式来安装OpenWrt虚拟机——整个OpenWrt系统是运行在openwrt-*.img里面。所以local中的.img的内容会随着设置的改变而发生变化,而不再是原来的样子。

新建虚拟机

看视频(时间点已选好)按顺序设置即可: 【司波图】2022版通用型PVE_AIO服务器布局教程(上)_哔哩哔哩_bilibili

建议按视频的指引来操作。暂时不需要外挂任何磁盘。最后的结果类似:

msedge_cYcOOr24LD

点击完成即可。完成后先不要启动OpenWrt虚拟机,以便我们完成一些配置的修改。这里的内存(memory)只有512M。如果你玩PCDN(比如《NAS系列 PCDN系列 网心云之容器魔方》或《NAS系列 PCDN系列 网心云之x86专业版》),由于对带宽传输的要求较高,建议内存在2G以上。

虚拟机选项

对于PVE虚拟机,硬件选项是最重要的两个项目:

msedge_0KCCm61SHS

如果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即可:

MobaXterm1_CHS_HogeacOlET

更改即时生效。

最后,我们还要直通一个物理网卡给OpenWrt系统当WAN口使用,用于宽带PPPoE拔号上网。根据《NAS系列 PVE基本设置》的介绍,我的WAN口对应的设备是04:00.0,直接添加PCI设备即可:

msedge_mMv7STmkgM

选PCI设备时有一个所有功能的选项,勾不勾上似乎影响不大。

启动虚拟机

改完硬盘模式、选好物理WAN口后,就可以直接启动OpenWrt虚拟机了:

msedge_KViFQeFO9E

值得一提的是,在默认情况下(禁用QEMU Guest Agent),如果你想关闭虚拟机,不要按关机,而是按停止。此时要按停止不容易产生奇奇怪怪的bug或报错:

msedge_T3T52mkmYS

有些Linux系统支持Qemu quest agent,建议开启,即可避免此bug并支持重启/关机操作。详见《NAS系列 PVE基本设置》。

工作界面

如果你也是基于supes.top来搭建镜像的,应该记得这个后台地址后台密码

msedge_4j8rjPJDii

利用它登陆后台即可。成功登陆后的主页大致如下:

msedge_36dRM3rsez

总之,安装Openwrt虚拟机是挺简单的,并没有什么特别的难点。看本教程和司波图视频中安装OpenWrt的部分基本上就可以顺利完成。

其它说明

如果你要更换硬件配置,要停止容器后才可以更换。这是PVE初学者最容易犯的错误 (ฅ´ω`ฅ)

观察控制台(Shell)的反应,出现OpenWrt的logo就代表系统正常运行:

msedge_lxwKSHJawp

有时这个logo不会自己出现,多按几下Enter键即可!不同的Openwrt固件的logo是不太一样的,但大致都是一些字符组成的与OpenWrt相关的图案。

所有的虚拟机都是可以通过Shell登陆,包括使用MobaXterm等工具。推荐使用《Linux基础 基于密钥对的SSH远程登陆》介绍的方法进行Shell访问。OpenWrt的Shell使用和Ubuntu等区别不大。

需要注意的是,不要随便在Shell里更新OpenWrt甚至是Linux内核,这可能会导致OpenWrt无法正常工作。我以前在家里的软路由里就吃过这个亏,最后只能重刷OpenWrt。如果你真的想更新OpenWrt,建议先获得更新固件,然后在GUI里更新:

msedge_D34Y7H1RPm

文字显示异常

我发现,在系统——软件包中安装完新插件后,偶尔会存在文字显示异常,比如应该显示中文却仍显示英文。该异常在我安装luci-app-wrtbwmon(流量监控软件)后首次出现。这往往是由浏览器缓存引起的,因此只需打开OpenWrt后台,按F12调出开发者窗口并清空缓存即可:

msedge_NIs6yH1gPr

系统配置

在整个设置过程中,你应该事先确认好用哪些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:1400:e0:b4:1d:e2:a5就是网卡的mac号。我们通过比对PVE.OpenWrt的硬件信息可以确定虚拟网卡1a:d8:c1:42:16:14就是eth0;另外一个网卡则必然是物理网卡:

ImageGlass_cnIy2P1X0A

如果您在OpenWrt里的物理网卡很多,需要在PVE里确定网卡编号时就要确认好Mac号,这样方便未来进入一一对应;又或者直接在OpenWrt系统里通过插网线的方式依次确认。具体方法可见《NAS系列 PVE基本设置》的网络——网口ID部分。

总之,我们确定:eth1是物理千兆口,是WAN口;eth0是虚拟网口,是LAN口。此外,我不太确定这个编号顺序是否和虚拟机硬件中的排列顺序一致,因为在OpenWrt的硬件中,虚拟网口刚好排在直通的PCI网卡的前面:

msedge_XnB6WBcA9E

如果这个顺序是固定的,那么eth系的ID是挺好确认的,按顺序从eth0往下排即可。有知道的小伙伴可以评论区留言喔!

设置WAN口

一般家用宽带上网像这样设置即可:

msedge_awftHqDZvi

如果有其它多余的网口,可以直接删除,不用担心。以后有需要时可以随时添加新接口。

首先,宽带光猫必须设置成桥接模式,这样才可以用软路由拔号,从而充分发挥软路由的性能。这个过程一般是由装宽带的师傅完成;网上教程也有教自己改的,这个我就不推荐了。

软路由拔号一般是使用PPPoE协议,输入帐号密码(问宽带师傅或者看光猫底部)就可以上网。下面我贴出WAN口和LAN口的基本设置,大家对照着改动即可:

  • 常规设置

msedge_09RrtnNz0s

  • 高级设置:

msedge_x6uZ1UxsyQ

禁用Ipv6的相关设置:

msedge_jeyVnffGmZ

另外,据我所知,OpenWrt在某些条件下是支持多拔的。比如,拉2条宽带,分配两个WAN口,然后“融合”两者的带宽,从而增强上/下行带宽。这些玩法我也只是耳闻,没亲身试过,感兴趣的小伙伴自行了解喽!

设置LAN口

在下面设置的基础上,按实际情况微调即可:

  • 基本设置:

msedge_hu0lpmQZuZ

  • 高级设置:

msedge_MEgyepFNxa

  • 防火墙设置:

msedge_31DcsY75Ew

  • DHCP服务器:

msedge_dPpqP3vnhR

把WAN口和LAN口设置完后,“保存并应用”使设置生效,即可正常上网:

msedge_nGVYtG7FZx

如果有其它情况,可以在PVE.OpenWrt Shell里输入reboot命令重启OpenWrt,然后再看看是否可以正常上网。有其它问题评论区留言喽 (ฅ´ω`ฅ)

宽带测速

我们可以访问https://www.speedtest.cn/进行测速。以广东电信的500Mbps宽带(下行500Mbps,上行50Mbps)为例:

msedge_XjELbTgedO

这是晚上高峰时间段测试的,这个带宽和延迟还算可以。实际上,不同的连接节点的速度差别还挺大的,这种结果只是一个参考。最重要是日常使用场景没有明显限制

值得注意的是,如果你使用了OpenClash的Fake IP模式,这个测速大概率是不准的——主要表现为测速下行带宽远低于实际带宽。

挂载硬盘

如果OpenWrt只是个拔号软件,我觉得这样上述的设置就足够了。不过,如果你想在OpenWrt里使用Docker,比如搭建双ADguard Home作为上游DNS服务器和广告过滤器,还是需要挂载一块硬盘的。Docker并不是一个轻量应用,往往对硬盘空间有较大需求;硬盘太小甚至无法正常运行。如果你的需求较大,硬盘空间较足,可以分配多一些容量。

添加新的虚拟硬盘

首先,我们先停止虚拟机。然后,按下图所示添加一块硬盘即可:

msedge_2veLXt3I4h

存储里也可以选其它存储空间(比如OpenMediaVault的SMB共享、其它硬盘等)。我自己的系统盘还挺大的,所以直接上的LVM-Thin。如果你是用SMB共享,那么需要将提供SMB服务的虚拟机的启动顺序调到OpenWrt前面,以避免重启PVE时OpenWrt识别不了分区而发生启动错误。使用LVM-Thin则没有这种问题,因为PVE必然在任何虚拟机之前启动。

给新硬盘分区

和大多数硬盘一样,我们在挂载硬盘前需要先给硬盘分区。我们在PVE.OpenWrt Shell中使用fdisk命令进行硬盘分区。

首先,我们用fdisk -l看一下新硬盘的设备名:

MobaXterm1_CHS_xUx6P6EnXp

比如,我们要在硬盘/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,从系统——挂载点中找到挂载点,添加一条记录即可:

msedge_1Wbk8dQGaI

保存并应用配置。然后,reboot重启OpenWrt,并通过df -h查看/dev/sda1的挂载是否生效:

MobaXterm1_CHS_0nalckntaV

如上图,/dev/sda1已经成功地永久挂载到/mnt/sda1路径了!

在OpenWrt中,这种稳定的挂载关系没办法通过修改/etc/fstab/etc/config/fstab而改变,可能是因为OpenWrt的GUI对这些设置进行了强制托管。我发现OpenMediaVault也有类似的保护机制。这可能是因为这些系统的GUI都有对配置改变的应用和回退机制,所以需要这种保护机制。知道具体原因的小伙伴,欢迎在评论区留言!

安装Docker

与大多数Linux发行版不同,OpenWrt安装Docker的最好方式是在系统——软件包里安装:

msedge_avMvrDsu5U

如果你编绎时选择了luci-app-dockerman,大概率就已经带有这个部分了。没有编绎的小伙伴在这里手动安装也行。

这里要特别注意Docker的根目录位置。我们使用的硬盘模式安装的OpenWrt,自带容量对Docker来说太小了。修改根目录的操作在PVE.OpenWrt Shell中是不能成功的——我们需要在Docker——配置里修改:

msedge_EeAJhwV0RG

我在OpenWrt安装Docker的主要目的是使用双ADGuard Home作为DNS服务器:

msedge_jTHXAHhfLE

基于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用户凭密码登陆

msedge_lR2ZMcpkT3

然后,在SSH密钥里添加你的公钥:

msedge_ZrXRvnWqxu

如果你有一个私钥,可以通过MobaXterm的SSH密钥生成器来生成公钥,具体方法见《Linux基础 基于密钥对的SSH远程登陆》。这样就不怕网络机器人扫描SSH后台了!

小结

本文大致介绍了如何在PVE中搭建OpenWrt虚拟机,还分享了硬盘挂载和安装Docker的相关技巧。以后有机会我可能会介绍基于OpenClash策略分流的基本原理,敬请期待吧!

扩展阅读

---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍

感谢ZGOCLOUD友情赞助 (ฅ´ω`ฅ) 本博客基于m2w创作。版权声明:除特殊说明,博客文章均为Bensz原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。VIP内容严禁转载!由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如有需要,请至学习地图系统学习本博客的教程。加Telegram群可获得更多帮助喔! | 博客订阅:RSS | 广告招租请留言 | 博客VPS | 致谢渺软公益CDN |

评论

  1. 置顶
    Macintosh Firefox 111.0
    已编辑
    1年前
    2023-3-28 10:26:17

    留个爪~
    另外补充说明下,PVE 用「关机(shutdown)」一般都是会卡住,这是因为它的关机功能是通过在虚拟机内部安装一个代理程序 qemu-guest-agent 来实现的,这种关机手段更优雅,会妥善处理关机流程。对比之下,直接「停止」就不需要装什么代理,代价则是有些丢数据/损坏数据的风险。
    那么显然「关机」不好使就是因为虚拟机里没有 qemu-guest-agent,导致没人来执行真正的「关机」操作,这玩意儿一般得手动装。
    对于 Linux 虚拟机可以直接通过 apt 等命令安装此程序,然后重启系统即可生效。
    对于 Windows 虚拟机,则需要安装 VirtIO 驱动 Windows_VirtIO_Drivers

    • 博主
      二花
      Windows Edge 111.0.1661.54
      1年前
      2023-3-28 10:27:48

      原来如此,谢谢提醒哈! 之前我测试后试试看 (ฅ´ω`ฅ)

    • 博主
      二花
      Windows Edge 111.0.1661.54
      1年前
      2023-3-28 10:42:10

      我在PVE里安装了qemu-guest-agent。经过测试,OpenMediaVault虚拟机关机的时候还是会出现报错:TASK ERROR: VM quit/powerdown failed - got timeout。不知大佬有什么建议?

      • Bensz
        Macintosh Firefox 111.0
        1年前
        2023-3-28 11:07:41

        可能我的描述有点容易引起误解,这个 qemu-guest-agent 是要装在 guest 主机里面,也就是说要在你的 OpenMediaVault 虚拟机里面安装它,而不是在 PVE 里面装~

      • 博主
        二花
        Windows Edge 111.0.1661.54
        1年前
        2023-3-28 17:40:11

        原来如此。谢谢 (ฅ´ω`ฅ)

      • 博主
        二花
        Windows Edge 111.0.1661.54
        1年前
        2023-3-28 17:43:27

        我检查了一下,我的OpenMediaVault虚拟机中本来就已经安装了qemu-guest-agent。看来它并不是引起上述错误的主要原因。

    • 博主
      二花
      Windows Edge 111.0.1661.54
      1年前
      2023-3-28 20:18:10

      谢谢大佬的提醒,教程已经更新了 (ฅ´ω`ฅ)

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇