Proxmox VE pve虚拟机LXC容器运行openwrt使用模板创建安装
It小小鸟 / 2021-06-27 / Openwrt / 阅读量 20141

021.JPG

022.JPG

023.JPG

LXC是什么 ?
以下内容来自网络:
LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
(1)与宿主机使用同一个内核,性能损耗小;
(2)不需要指令级模拟;
(3)不需要即时(Just-in-time)编译;
(4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
(5)避免了准虚拟化和系统调用替换中的复杂性;
(6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
总结:Linux Container是一种轻量级的虚拟化的手段。
Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。
————————————————

一、用Proxmox VE 管理创建LXC的openwrt模板

由于主机之上的所有lxc是共享内核的,所以要创建不同发行版本的容器,需要有对应的模板.
在Proxmox VE环境中,对模板的管理是非常的简单和高效的.模板是创建lxc的基础.
创建openwrt模板的步骤:

1.下载最新编译openwrt的rootfs文件

openwrt-x86-64-generic-squashfs-rootfs.img.gz

用ssh登陆并上传到PVE里/root目录下

2.ssh里解压

gzip -d openwrt-x86-64-generic-squashfs-rootfs.img.gz

3.安装解包软件

apt install squashfs-tools

如果安装不了下载到本地安装

sudo dpkg -i squashfs-tools_4.3-12_amd64.deb

4.对解压得到的img进行解包

unsquashfs openwrt-x86-64-generic-squashfs-rootfs.img

5.解包后的文件打包为pve的CT模板,此打包过程会自动加载pve内核而不用再另外编译

cd squashfs-root
tar zcf ../openwrt.rootfs.tar.gz ./*

6.上传
将openwrt.rootfs.tar.gz上传到/var/lib/vz/template/cache后,在PVE的WEB管理CT Templates里会出现此模板

二、修改PVE,添加相应模块

1.上传附件里openwrt.conf到/etc/modules-load.d目录下

2.上传附件里rps到/etc/init.d目录下,此脚本可以增强网卡的并发能力

3.ssh运行,加开机自动执行

update-rc.d rps defaults

4.打开/etc/sysctl.conf文件,添加以下内容(也可以不加)

net.netfilter.nf_conntrack_icmp_timeout=10

net.netfilter.nf_conntrack_tcp_timeout_syn_recv=5

net.netfilter.nf_conntrack_tcp_timeout_syn_sent=5

net.netfilter.nf_conntrack_tcp_timeout_established=600

net.netfilter.nf_conntrack_tcp_timeout_fin_wait=10

net.netfilter.nf_conntrack_tcp_timeout_time_wait=10

net.netfilter.nf_conntrack_tcp_timeout_close_wait=10

net.netfilter.nf_conntrack_tcp_timeout_last_ack=10

net.core.somaxconn=65535

5.加载tproxy模块,实现UDP转发

echo 'xt_TPROXY' > /etc/modules-load.d/tproxy.conf

6.重启pve

三、安装pve lxc openwrt

1.用命令方式建容器,自行修改 local-lvm和bridge名称为你自已的

pct create 111 local:vztmpl/openwrt.rootfs.tar.gz --rootfs local-lvm:2 --ostype unmanaged --hostname CTOpenWrt --arch amd64 --cores 2 --memory 512 --swap 0 -net0 bridge=vmbr0,name=eth0 -net1 bridge=vmbr1,name=eth1

2.修改op lxc配置文件

打开/etc/pve/lxc/111.conf,添加以下内容(111改为你容器id,还有倒数第二行的111)

lxc.mount.auto: cgroup:rw

lxc.mount.auto: proc:rw

lxc.mount.auto: sys:rw

lxc.include: /usr/share/lxc/config/openwrt.common.conf

lxc.cap.drop: sys_admin

lxc.apparmor.profile: unconfined

lxc.cgroup.devices.allow: c 108:0 rwm

lxc.autodev: 1

lxc.cgroup.devices.allow: c 10:200 rwm

lxc.hook.autodev: /var/lib/lxc/111/device_hook.sh

lxc.mount.entry: tmp tmp tmpfs rw,nodev,relatime,mode=1777 0 0

3.上传附件里device_hook.sh到/var/lib/lxc/111目录下(111改为你容器id),并修改成可执行

chmod +x device_hook.sh

4.进到op命令行修改/sbin/modprobe为mde

mv /sbin/modprobe sbin/mde

5.进到op命令行修正主页显示,以下去掉lan口显示报错(不改也可以)

修改/usr/lib/lua/luci/view/admin_status/index.htm

找到 local eth_info = luci.sys.exec("ethinfo") 修改为 local eth_info = nil

找到 local conn_max =

修改为下面(只要在net.和.nf_conntrack之间添加netfilter)

local conn_max = tonumber(luci.sys.exec(

                    "sysctl -n -e net.netfilter.nf_conntrack_max net.ipv4.netfilter.ip_conntrack_max"

            ):match("%d+")) or 4096

四、启动容器,本人编译的op地址是192.168.8.1

五、由于PVE7.0 默认采用cgroupv2,缺少对系统类型为unmanaged的容器支持,LXC容器会出现以下错误

run_buffer: 316 Script exited with status 1
lxc_init: 816 Failed to run lxc.hook.pre-start for container "111"
__lxc_start: 2007 Failed to initialize container "111"
startup for container '111' failed

解决方法是修改/usr/share/perl5/PVE/LXC/Setup.pm文件
翻到最后,可以看到以下内容

sub unified_cgroupv2_support {
    my ($self) = @_;
    $self->protected_call(sub {
    $self->{plugin}->unified_cgroupv2_support();
    });
}

修改为

sub unified_cgroupv2_support {
    my ($self) = @_;
    return if !$self->{plugin}; # unmanaged
    $self->protected_call(sub {
    $self->{plugin}->unified_cgroupv2_support();
    });
}

启动容器,会出现WARN:警告,忽略就行。

企业微信截图_20211013105017.png

【附件下载】
device_hook.sh.rar
openwrt.conf.rar
rps.rar