使用lxc搭建openwrt旁路由

2020-03-28 16:25:15 35点赞 164收藏 24评论

最近闲着无聊折腾了下放在客厅里的x86小nas,装了个openwrt作为旁路由用于分流上网。安装openwrt使用的方案既不是格盘重装,也不是exsi或者pve虚拟机安装,而是选择了安装在lxc容器里。本文不是正经教程,仅仅记录折腾时的思考和一些简单的步骤。

为什么不是虚拟机

最大的原因是这台nas已经稳定着omv系统用于nas服务,重装系统是不可能的。虚拟机本身的性能开销也是个大问题,有经验的朋友应该清楚,即使使用了virtio这样的半虚拟化驱动,虚拟机io仍然非常占用cpu。唯一的办法是硬件直通,而即便是硬件直通下,虚拟机的整体开销也比容器大一个数量级。

为什么是lxc

一句话简单科普下的话,lxc就是一个基于cgroup的linux容器技术。有些朋友就要问了,docker也是基于cgroup的,docker也能安装openwrt,为什么不选择鼎鼎有名的docker,而选择没什么人听说过的lxc呢?

一方面是lxc的实现方式。lxc实现了完整的系统容器化,这意味着在lxc容器里有完整的init生命周期和内核信号,完全可以当成一个仅支持linux系统的虚拟机使用。而docker的设计目标则是进程容器化。所谓的进程容器化就是一个容器里只跑一个进程,多进程分别安装在多个容器里。在docker里安装openwrt显然有悖于这一目标,即使可以通过/sbin/init方式来启动容器也会发生很多其他问题。

问题之一是网络支持。docker默认的桥接网络是only-host,不能用于路由。而host模式则直接无法启动openwrt,唯一可选的模式是macvlan。而macvlan有两个问题,其一是实现macvlan需要修改数据包包头并在内核io路径中做了特殊判断,这会带来可见的性能开销。其二是内核里macvlan与主机是单向隔离的,说人话就是容器里可以ping通主机但主机不能ping通容器。解决的办法有二,第一种是通过自定义路由表方式把数据包送出内核,让数据在交换机里转一圈再回来。第二种方式是新建一个macvlan方式的网桥并把主机网卡桥接上去,这样主机与容器处在同一个macvlan网络里,就不存在隔离问题了。这两种方案显然都会造成主机网络性能降低,对性能较低的小主机来说是无法接受的。而lxc则支持最普通的虚拟网桥,可以直接暴露在物理网络上,也可以无隔阂与主机通信。

问题之二是数据持久化问题。docker的设计思路是分层文件系统,容器里发生文件修改实际上是产生了一个新的数据层,这点容器构建来说非常友好,对运行无状态服务来说也没有丝毫问题,但是对openwrt这样时不时更新下软件包、更新下配置文件非常不友好。而lxc则简单粗暴很多,容器直接使用主机的一个文件夹或者块设备,维护与迁移都非常方便。

介于以上几个基本事实,至少在安装openwrt这件事上没有任何选择docker的理由。

如何使用lxc

借助搜索引擎的力量,可以发现openwrt官网上有wiki讲如何在lxc里安装openwrt。但里面的内容有些根本就是错的,建议朋友们不要去看了,浪费时间。

这里简单讲一下操作步骤给朋友们当作参考。首先是创建虚拟网桥。有很多方式可以创建一个虚拟网桥,因为没有绝对标准的方式所以这里不展开讲,只要把物理网卡桥接上了都行。

然后是安装lxc的工具集,同样要根据主机实际情况,debian系统的朋友可以使用apt直接安装。

# apt update && apt install -y lxc

接着在/var/lib/lxc文件夹下创建openwrt文件夹,再在里面创建rootfs文件夹和config文件。一定不能学官网教程上的把文件夹创建在用户文件夹里,那样容器是无法开机自启的。

接着去官网下载主机对应架构的rootfs.tar.gz压缩包,解压到rootfs文件夹里,此时的文件树类似这样。

使用lxc搭建openwrt旁路由

接着编辑config文件,注释的地方是坑点需要特别注意。

使用lxc搭建openwrt旁路由

我们还需要在容器启动前编辑容器的网卡配置。新建配置文件/var/lib/lxc/openwrt/etc/config/network,内容大致如下。

使用lxc搭建openwrt旁路由

最后一步,执行lxc-start -n openwrt启动容器,然后执行lxc-attach -n openwrt进入容器内,使用opkg指令安装管理网页和其他工具。

opkg update && opkg install luci luci-i18n-base-zh-cn

至此局域网内就可以通过浏览器直接访问openwrt的管理网页。如何配制成旁路由分流上网不是本文重点不作赘叙。

展开 收起

Xiaomi 小米 AX3000T 双频3000M 家用千兆Mesh路由器 Wi-Fi 6 白色 单个装

Xiaomi 小米 AX3000T 双频3000M 家用千兆Mesh路由器 Wi-Fi 6 白色 单个装

99元起

Xiaomi 小米 BE6500 Pro 双频6500M 家用千兆Mesh无线路由器 Wi-Fi 7

Xiaomi 小米 BE6500 Pro 双频6500M 家用千兆Mesh无线路由器 Wi-Fi 7

535元起

Ruijie 锐捷 雪豹 X30E 双频3000M 家用千兆Mesh无线路由器 Wi-Fi 6 白色 单个装

Ruijie 锐捷 雪豹 X30E 双频3000M 家用千兆Mesh无线路由器 Wi-Fi 6 白色 单个装

159元起

ZTE 中兴 AX3000 巡天版 双频3000M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 白色

ZTE 中兴 AX3000 巡天版 双频3000M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 白色

161元起

Xiaomi 小米 BE3600 2.5G版 3600M 双频千兆家用无线路由器 Wi-Fi 7 白色

Xiaomi 小米 BE3600 2.5G版 3600M 双频千兆家用无线路由器 Wi-Fi 7 白色

219元起

ASUS 华硕 RT-BE88U 双频7200M 家用Mesh无线路由器 Wi-Fi 7 黑色 单个装

ASUS 华硕 RT-BE88U 双频7200M 家用Mesh无线路由器 Wi-Fi 7 黑色 单个装

1999元起

Redmi 红米 AX6000 双频5952M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装黑色

Redmi 红米 AX6000 双频5952M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装黑色

329元起

Xiaomi 小米 AX6000 双频6000M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 黑色

Xiaomi 小米 AX6000 双频6000M 家用千兆Mesh无线路由器 Wi-Fi 6 单个装 黑色

299元起

HUAWEI 华为 BE3 Pro 双频3000M 千兆家用路由器 Wi-Fi 7 黑色

HUAWEI 华为 BE3 Pro 双频3000M 千兆家用路由器 Wi-Fi 7 黑色

249元起

Xiaomi 小米 BE7000 三频千兆Mesh无线路由器 Wi-Fi 7

Xiaomi 小米 BE7000 三频千兆Mesh无线路由器 Wi-Fi 7

406元起

ZTE 中兴 问天BE7200Pro+ 双频7200M 家用千兆Mesh无线路由器 WiFi 7 黑色

ZTE 中兴 问天BE7200Pro+ 双频7200M 家用千兆Mesh无线路由器 WiFi 7 黑色

549元起

TP-LINK 普联 BE5100 双频5100M 家用千兆Mesh无线路由器 Wi-Fi 7 黑色 单个装

TP-LINK 普联 BE5100 双频5100M 家用千兆Mesh无线路由器 Wi-Fi 7 黑色 单个装

279元起

HUAWEI 华为 AX2 Pro 双频1500M 家用千兆无线路由器 Wi-Fi 6 白色

HUAWEI 华为 AX2 Pro 双频1500M 家用千兆无线路由器 Wi-Fi 6 白色

129元起

TP-LINK 普联 飞流系列 TL-XDR5480 易展Turbo版 双频5400M 家用千兆Mesh无线路由器 WiFi 6 单个装 灰色

TP-LINK 普联 飞流系列 TL-XDR5480 易展Turbo版 双频5400M 家用千兆Mesh无线路由器 WiFi 6 单个装 灰色

379元起

H3C 新华三 NX54 双频5400M 千兆Mesh家用无线路由器 Wi-Fi 6 单个装 黑色

H3C 新华三 NX54 双频5400M 千兆Mesh家用无线路由器 Wi-Fi 6 单个装 黑色

179元起

HUAWEI 华为 Q6 网线版 双频3000M 千兆Mes无线分布式路由器 Wi-Fi 6 一母三子装 白色

HUAWEI 华为 Q6 网线版 双频3000M 千兆Mes无线分布式路由器 Wi-Fi 6 一母三子装 白色

397元起
24评论

  • 精彩
  • 最新
  • 赠品很丰盛啊大佬

    校验提示文案

    提交
    就打包了酸酸乳和passwall,没别的233

    校验提示文案

    提交
    收起所有回复
  • 直接用wondows客户端出去,和这个用软路由出去。同一个服务器,你能感觉出用软路由快吗?

    校验提示文案

    提交
    v2***和tro***的windows客户端做的不太好,软路由的确速度更快更方便,而且有些东西是没有客户端的,比如游戏机,电视盒子,只能靠路由器

    校验提示文案

    提交
    谢谢 🙏

    校验提示文案

    提交
    收起所有回复
  • 奇怪,刚才发了很多,却没了.
    简单补充下, 最简单方法是lxc launch 官方op, 然后将自己编译的rootfs改了权限替代进去

    校验提示文案

    提交
    我个人更喜欢lxc而已,反正lxd底层也是lxc,

    校验提示文案

    提交
    收起所有回复
  • 想问下lz,lxc容器还有必要或者说还能不能做网卡直通呢?宿主机一个虚拟网桥+容器自己的虚拟网卡虚拟网桥,理论上网络性能会不会很差,但网上也搜不到给容器做网卡直通的办法

    校验提示文案

    提交
    网桥几乎不会带来肉眼可见的性能损失,

    校验提示文案

    提交
    收起所有回复
  • 我威联通之前使用虚拟机装了openwrt,后面嫌弃虚拟机性能损耗和内存占用,改成docker跑openwrt,lxc这个技术之前没了解过,感觉没有docker部署方便,docker只要几行命令就部署好了,性能上不知道会不会差很多

    校验提示文案

    提交
    研究了一晚上,docker部署openwrt失败,一直访问不到管理界面,现在尝试lxd部署,希望能成功吧

    校验提示文案

    提交
    docker部署openwrt只能用vxlan网络,挺麻烦的,lxc和lxd都能用网桥,更直观方便,

    校验提示文案

    提交
    收起所有回复
  • lxc下的op怎么更新呢,我用固件里的更新完了还是旧版本

    校验提示文案

    提交
  • 虽然看不懂,但收藏了备用!

    校验提示文案

    提交
  • 不明觉厉,顶大佬

    校验提示文案

    提交
  • 我喜欢你的赠品

    校验提示文案

    提交
  • 谢谢大佬分享!

    校验提示文案

    提交
  • 太厲害了!雖然我不會,但知道理論也很感謝大佬。

    校验提示文案

    提交
  • 大佬,求一个赠品的链接,非常感谢!!!

    校验提示文案

    提交
  • 大佬,求一个赠品的某度云,感谢!!!

    校验提示文案

    提交
  • 赠品在哪?可以再发一次么

    校验提示文案

    提交
  • 楼主对相关知识理解很深!解决了我一个大问题

    校验提示文案

    提交
  • mark一下

    校验提示文案

    提交
  • 扩展,扩展,回头试试

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章

苏维_

Ta还没有介绍自己

关注 打赏
最新文章 热门文章
164
扫一下,分享更方便,购买更轻松