标签搜索

PVE8 使用LXC运行OpenWRT

Thomas
2024-03-09 / 0 评论 / 7 阅读 / 正在检测是否收录...

用虚拟机方式跑openwrt ,在内网没人下载东西的时候,它依旧会吃相当一部分cpu,所以还是用lxc方式合适,其性能就是你物理机的性能,另外lxc没有docker的层概念,所以非常适合运行这种独立的服务!

LXC(Linux Containers)是Linux内核中的一个软件容器化工具,它提供了一种轻量级的虚拟化技术。与传统虚拟机相比,LXC的优点在于更快的启动时间、更少的资源占用以及更高的性能。用户可以使用LXC在Linux操作系统中创建多个独立的容器,每个容器都提供一个隔离的运行环境,与主机和其他容器完全隔离开来。在容器内,用户可以运行各种不同的应用程序和服务,例如Web服务器、数据库、文件共享等。由于LXC能够更加高效地利用系统资源,因此它已成为开发人员、测试人员、系统管理员和云计算提供商的首选工具之一。
固件选择

我直接使用官网固件:https://downloads.openwrt.org/
如果链接不上可以使用国内镜像:

SquashFS是一种只读文件系统,不允许对其进行写操作,它可以将多个文件和目录合并到一个文件中,从而提高存储空间的利用率,同时也可以提高对这些文件的访问效率。SquashFS文件系统具有高效的压缩和解压缩速度,支持很多不同的压缩算法,能够在存储和传输文件时减少网络流量和存储空间的占用,广泛应用于嵌入式系统、上传和下载镜像等场景。

Rootfs是Linux系统启动时候使用的根文件系统,是指在文件系统概念中的根目录。它包含了Linux系统启动所必需的一些必要文件和目录,例如/etc、/proc、/bin、/sbin和/usr等。rootfs文件系统通常会以类似于ext4或SquashFS文件系统的形式储存于嵌入式系统或者云计算平台中,为Linux系统提供启动和运行的必要支持。由于rootfs文件系统在启动过程中是唯一可用的文件系统,在系统运行时,它也会被其他文件系统所覆盖。

无论是 OpenWrt 官网下载,还是第三方打包的固件,必须是-rootfs.img、-rootfs.img.gz 或者 -rootfs.tar.gz 的文件 。-rootfs.img、*-rootfs.img.gz 需要解包后打包 。

CT模板
  1. 如果是 rootfs 格式(官网tar.gz后缀的文件)打包的固件,直接下载后,在web界面上传至 PVE CT 模板目录即可,
    或者直接ssh登录PVE主机内下载。

    wget https://downloads.openwrt.org/releases/23.05.2/targets/x86/64/openwrt-23.05.2-x86-64-rootfs.tar.gz
    #PVE8下载的CT模板都保存在/var/lib/vz/template/cache
    mv openwrt-23.05.2-x86-64-rootfs.tar.gz /var/lib/vz/template/cache
  2. 其他格式需要先解包重新打包使用。
  • 以下以 *.img.gz 固件包为例:

    cd workspace
    mkdir openwrt
    # 文件名
    img_name="openwrt-x86-64-generic-squashfs-combined.img.gz"
    # gzip 解压出 img
    gzip -d "$img_name"
    # 去除变量 gz 后缀
    img_name=$(basename "$img_name" .gz)
    # 挂载偏移
    root_partition=$((`fdisk -l "$img_name" | grep .img2 | awk '{print $2}'` * 512))
    # 挂载到 openwrt 目录
    mount -o loop,offset=$root_partition "$img_name" ./openwrt
    # 打包
    cd openwrt && tar zcf /var/lib/vz/template/cache/"$img_name".tar.gz * && cd ..
    # 卸载
    umount ./openwrt

    另外一种方法

    apt install squashfs-tools
    unsquashfs openwrt-x86-64-generic-squashfs-rootfs.img
    进入目录,重新打包为模板
    cd squashfs-root
    tar zcf ../openwrt201117.rootfs.tar.gz *
  • qcow2/vmdk
    如果原来镜像是 qcow2 vmdk

    qemu-img convert -p -f qcow2 -O raw op.qcow2  op.img
    qemu-img convert -p -f vmdk -O raw op.vmdk  op.img
  • img.gz

    gzip -d openwrt-01.10.2023-x86-64-generic-squashfs-combined.img.gz
  • 正在运行的虚拟机openwrt转lxc
    直接在pve web控制台点备份,选择 gzip格式 ,得到文件
    /var/lib/vz/dump/vzdump-qemu-100-2023_02_03-12_29_56.vma.gz
    在 local 备份里面 找到这个文件 点恢复 导入到一个新虚拟机 102

    qemu-img convert -p -f qcow2 -O raw /var/lib/vz/images/102/vm-102-disk-0.qcow2  op.img
  • 挂载和打包

    cd /var/lib/vz/template/cache
    mkdir op
    root_partition=$((`fdisk -l op.img | grep .img2 | awk '{print $2}'` * 512))
    mount -o loop,offset=$root_partition op.img /var/lib/vz/template/cache/op
    cd op && tar zcf /var/lib/vz/template/cache/op.tar.gz * &&cd ..     # 打包至PVE中LXC模板路径
    umount op && rm -rf op
    #rm -rf 固件名称.img

    如果img是正在运行的系统且使用的Overlay模式,会丢失Overlay内容(恢复默认了)。你需要在原来系统里面 导出 后覆盖过来。

创建一个CT/lxc
  1. pve目前依旧无法直接创建op的lxc,这里还是用命令行。

    pct create 109 local:vztmpl/openwrt-23.05.2-x86-64-rootfs.tar.gz --rootfs local:1 --ostype unmanaged --hostname CTOpenWrt --arch amd64 --cores 2 --memory 512 --swap 0 -net0 bridge=vmbr0,name=eth0 -net1 bridge=vmbr1,name=eth1,tag=85

    解释

    • pct create 109 是pve里面CT或者VM的id值,你可以修改成你的
    • local:vztmpl/openwrt-23.05.2-x86-64-rootfs.tar.gz 是上面你上传到rootfs的包名
    • rootfs local:1 是本lxc储存位置(我的PVE已经删除了local-lvm)和硬盘占用大小限制1G 如果用其他地方储存可以参考实际配置,比如 rootfs local-lvm:1 rootfs local-brtfs:0.5
    • ostype unmanaged 操作系统类型
    • hostname OP 节点名称
    • arch amd64 cpu平台
    • cores 2 可占用的cpu核心数
    • memory 1024 swap 0 内存和交换内存,建议关闭交换内存 也就是0
    • net0 bridge=vmbr0,name=eth0 把pve的管理网桥给op用,也就是op把他作为 lan
    • net1 bridge=vmbr1,name=eth1,tag=85 将连接光猫IPTV口的网桥给op,作为wan
  2. 手动修改LXC配置

    nano /etc/pve/lxc/109.conf

    如果网卡不需要增加,就添加以下内容

    lxc.include: /usr/share/lxc/config/openwrt.common.conf
    lxc.cgroup2.devices.allow: c 108:0 rwm
    lxc.mount.entry: /dev/ppp dev/ppp none bind,create=file
    lxc.mount.entry: /dev/net dev/net none bind,create=dir
    lxc.cap.drop:

    如果要直通一个网卡进去

    lxc.include: /usr/share/lxc/config/openwrt.common.conf
    lxc.net.1.type: phys
    lxc.net.1.link: enx0023545ca007
    lxc.net.1.flags: up
    lxc.net.1.name: eth1
    lxc.cgroup2.devices.allow: c 108:0 rwm
    lxc.mount.entry: /dev/ppp dev/ppp none bind,create=file
    lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
    lxc.cap.drop:
    lxc.include 包含pve自带的op配置模板
    lxc.net.1 直通网卡enx0023545ca007进去作为 eth1
    lxc.cgroup2 的配置,这是lxc运行一些服务类的系统必须的
    lxc.mount.entry 挂载ppoe和tun到lxc内
    lxc.cap.drop: 取消 openwrt.common.conf 里面 对 cap的限制,不然openclash无法使用
  3. 启动CT

    pct start 109
OpenWrt 配置

Attach 到容器内进行操作

lxc-attach 109
  1. 修改密码

    passwd
    # Changing password for root
    # New password: 
    # Retype password: 
    # passwd: password for root changed by root
  2. 配置网络

    #编辑lan的IP
    vi /etc/config/network
    #重启网络即可登录
    /etc/init.d/network restart

    或者这么配置

    uci set network.lan.ipaddr=[lan ip]
    uci set network.lan.gateway=[上级路由ip]
    uci set network.lan.dns=[上级路由ip]
    uci commit 
    /etc/init.d/network restart 
  3. (如果需要)映射宿主机目录 ,109是ID,最后mp=是LXC中目录地址

    pct set 109 -mp0 /mnt/bindmounts/shared,mp=/shared 
  4. 安装argon界面,相关安装包

    luci-lib-xterm_git-24.217.56735-8015371_all.ipk
    taskd_1.0.3-2_all.ipk
    luci-lib-taskd_git-24.231.52046-6266f45_all.ipk
    luci-lib-xterm_git-24.217.56735-8015371_all.ipk
    luci-app-quickstart_git-25.033.56170-95d0213_all.ipk
    luci-app-store_0.1.14-2_all.ipk
    luci-app-istorex_git-25.050.51480-120b7dd_all.ipk
    quickstart_0.8.9-75_x86_64.ipk
    luci-theme-argon-master_2.2.9.4_all.ipk
无法opkg update ,更新源出错,无法ping通www.baidu.com。但可以ping通baidu的实际IP

断定为DNS没有解析,22.03版本可以直接ping通www.baidu.com。比对寻找原因未果。
解决办法:
修改host文件,解析源

vi /etc/hosts
opkg update
opkg install luci-i18n-base-zh-cn
容器lxc开启tun-br,可使用zerotier等
# pve主机编辑lxc文件, vi /etc/pve/lxc/2001.conf ,最后加入
lxc.cgroup.devices.allow = c 10:200 rwm
lxc.hook.autodev = sh -c "modprobe tun; cd ${LXC_ROOTFS_MOUNT}/dev; mkdir net; mknod net/tun c 10 200; chmod 0666 net/tun"

# 进入lxc执行,重启后生效
cd /dev
mkdir net
mknod net/tun c 10 200
chmod 0666 net/tun
reboot
部分情况下 udp无法转发

需要PVE系统加载 xt_TPROXY 模块。在PVE系统下执行改命令后重启。

echo 'xt_TPROXY' > /etc/modules-load.d/tproxy.conf
NAT 环回 无效
  • 别名主机
    别名主机可以在 openwrt 网络 -> dncp -> 主机名映射的地方 添加域名到对应的内网机器ip上。然后清理本地dns缓存后即可访问。也可以在openwrt里面运行

    uci add dhcp domain
    uci set dhcp.@domain[-1].name='nas.leiyanhui.com'
    uci add_list dhcp.@domain[-1].ip='10.1.1.50'
    uci commit dhcp
    /etc/init.d/dnsmasq restart
  • 自定域名解析
    如果你有使用adguardHome 之类的自建dns,可以在dns内添加对应的域名解析记录到内网ip。或者修改需要访问的的电脑的hosts文件。

参考链接:
https://dev.leiyanhui.com/openwrt/lxc-mian-op/
https://dev.leiyanhui.com/openwrt/pve-lxc-install-op/
https://molezz.net/proxmox-pve-kvm-ct-lxc-openwrt
https://wayjam.me/posts/allinone-install-lxc-openwrt/
https://www.right.com.cn/forum/thread-8352956-1-1.html

0

评论

博主关闭了所有页面的评论