用虚拟机方式跑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模板
如果是 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- 其他格式需要先解包重新打包使用。
以下以 *.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 vmdkqemu-img convert -p -f qcow2 -O raw op.qcow2 op.img qemu-img convert -p -f vmdk -O raw op.vmdk op.imgimg.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 备份里面 找到这个文件 点恢复 导入到一个新虚拟机 102qemu-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
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.5ostype unmanaged操作系统类型hostname OP节点名称arch amd64cpu平台cores 2可占用的cpu核心数memory 1024 swap 0内存和交换内存,建议关闭交换内存 也就是0net0 bridge=vmbr0,name=eth0把pve的管理网桥给op用,也就是op把他作为 lannet1 bridge=vmbr1,name=eth1,tag=85将连接光猫IPTV口的网桥给op,作为wan
手动修改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无法使用启动CT
pct start 109
OpenWrt 配置
Attach 到容器内进行操作
lxc-attach 109修改密码
passwd # Changing password for root # New password: # Retype password: # passwd: password for root changed by root配置网络
#编辑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(如果需要)映射宿主机目录 ,109是ID,最后mp=是LXC中目录地址
pct set 109 -mp0 /mnt/bindmounts/shared,mp=/shared安装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.confNAT 环回 无效
别名主机
别名主机可以在 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
评论