家里的pve虚拟小主机里只虚拟了一个系统,用于跑docker容器,想着如果能通过lxc跑dockers的话,那资源开销可以进一步降低,而且dockers里的jellyfin也可以使用硬件解码了,于是开启了后续的折腾之路。

安装lxc

这部分就不详细写了,基本上最新的pve里也都能够通过创建lxc时的配置直接解决容器嵌套的问题。

PS: 这里写个坑点:在安装完某些linux发行版后,创建的新用户控制台中无法使用TAB键、上下键,命令行不显示当前路径。因默认ubuntu创建的普通帐号,默认shell为/bin/sh,而这不支持tab等键的,所以将「指定用户」帐号的shell改为/bin/bash就可以了。修改命令如下:

  1. 查看当前用户所用的shell:echo $SHELL,你应该会得到/bin/sh的结果;
  2. 修改shell为/bin/bashusermod -s /bin/bash <username><username>为要修改shell的用户名。

直通磁盘

配置完上述发行版后,确保系统能够正常启动且使用新用户登录执行命令均正常,就可以先关掉lxc容器了。我们接下来需要在pve里操作硬盘直通的配置。

  1. 首先先查看系统中磁盘的uuid(当然,也可以通过sda等方式进行直接挂载,但为了避免重启或者磁盘变动导致的磁盘文件描述符发生变化,这里最好是使用uuid来进行挂载),查看的命令也很简单相信大家也基本都比较熟悉:blkid /dev/sdx
  2. pve控制台执行挂载配置命令:
    ## <lxc-id>是lxc的id,在lxc配置信息中可以查看到;<uuid>是查看到的磁盘uuid,这里要注意别搞错了;<mount-point>则是要在lxc容器中挂载的路径
    pct set <lxc-id> -mp0 /dev/disk/by-uuid/<uuid>,mp=<mount-point>
    

配置完成后就可以启动lxc容器了,如果没有其它问题的话,从挂载信息里就能看到该磁盘了。

安装docker

重点:去掉勾选非特权容器,在创建的选项中打开允许嵌套。 然后就按照自己的lxc里使用的linux发行版的方式进行安装docker就行,安装成功后需要测试下docker是否能够正常执行。这部分也不详细描述了,本篇重点在于记录直通磁盘。 安装完docker后,就可以愉快的玩耍了。但遗憾的是lxc里的docker似乎无法将硬件解码能力让jellyfin识别或者调用到,原因暂时不详,有可能是底层不支持,也有可能是用户权限用户组导致的权限问题,也可能是jellyfin容器里自带的核显驱动的问题。这里没有深入去解决,如果有小伙伴搞定了,可以写个文章分享到社区里,相信这对大家非常有帮助。

lxc安装openwrt

我拿openwrt通常是用作旁路由使用,安装一些个性化的插件优化网络,或者用来搭建全局出国加速的网络服务,为了优化资源使用率,因此将openwrt也折腾为了使用lxc的方式进行安装。

openwrt lxc镜像的获取方式有两种:

  1. 通过开源社区提供的镜像地址进行下载(openwrt下载地址)[https://uk.lxd.images.canonical.com/images/openwrt/],具体版本和cpu架构自行选择下载。
  2. 通过命令进行下载,通过lxc命令进行下载镜像,然后到默认镜像路径找到对应的lxc镜像,具体命令记不得了,可以通过帮助命令自行查看:lxc-create --template download --help

获取到镜像后,然后执行以下命令创建openwrt的lxc容器:

## 简单解释下下面的命令参数:
## create后的100是创建的lxc的id;
## 之后的路径是openwrt的镜像文件路径;
## arch参数是指定架构;
## hostname是生成的lxc容器的hostname;
## rootfs后的参数`:`前指具体使用哪个lvm卷进行存储镜像文件,`:`后的数字是指具体分配多大的空间,单位是GB;
## 后面的参数就不解释了,要注意ostype参数比较关键,设置为`unmanaged`
pct create 100 /var/lib/vz/template/cache/openwrt-22.03-rootfs.tar.xz --arch amd64 --hostname OpenWrt --rootfs local-lvm:0.5 --memory 1024 --cores 2 --ostype unmanaged --unprivileged 1

命令执行完成后就可以在pve的ui看到新创建的openwrt的lxc容器了,然后再配置下网络,添加下网口,就可以启动了。启动后,要注意openwrt的网络配置,需要将网线插在LAN口,并且配置对应的ip,LAN口才能用来访问ui。 最后就愉快的玩耍吧。

参考