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:警告,忽略就行。