在PVE中,如果需要在 LXC 中开启 ip_vs 模块,直接 modprobe ipvs 是不行的,因为其并未存在于 LXC 内核模块中。
既然模块不存在 ,那就需要首先安装模块,很遗憾,这是一个错误的思路,因为安装内核模块的唯一方法似乎只能是编译安装,所以需要编译Linux内核,这个相当折腾人,即使编译成功了,也会因为版本不兼容而无法安装。这时,就想要去 checkout 到相应的内核源码,然后设置编译选项为当前 LXC 环境的特定版本号,比如 5.15.85-1-pve ,这个版本号是发行版,官方内核并不存在此版本号,官方只有5.15.X,而其中的X并不是85,所以这是一个死胡同;
即使编译成功了,版本也强制设定,安装仍是个问题,其中一个问题就是用编译的内核去覆盖当前内核,做一个整体安装,但这样和安装虚拟机又没什么区别,意义不大。因为我只想安装这一个模块,而不是整个内核。这是一个风险所在,因而没有尝试
最后得到一个简单的实用方法,那就是使LXC与宿主机共享内核模块,但存在 LXC与宿主机内核版本不一致问题,需要在PVE宿主机中设置LXC选项:
nano /etc/pve/lxc/主机编号.conf , 添加以下内容:
lxc.include = /usr/share/lxc/config/nesting.conf
lxc.mount.auto = cgroup:mixed
lxc.autodev = 1
添加的时候注意,不能直接复制粘贴代码,换行会丢失,甚至导致文件中原有的换行也丢失。先放到记事本中整理下格式,然后复制过去,如果还不行,就只好手敲,好在只有三行。
然后重启LXC。重启后发现LXC无法联网,VNC进去发现 网卡 down 掉了,然后运行/sbin/ifup eth0 启动网卡,但没有IP地址,只好强制定制了一个:ip address add 192.168.1.100/24 dev eth0
终于勉强启动了。由于我的PVE没有组虚拟网,所有主机网卡都桥接到了路由器所有的网络,因此地址是物理内网的IP,而不是虚拟网IP。
最后在LXC中安装模块 : modprobe ipvs ,然后 lsmod | grep ip_vs ,就输出了。
至此,终于在LXC中用上了 ip_vs ,其过程相当坎坷,值得一记。