首次尝试使用LXD配置管理实验室的服务器
1、配置初衷
买了一台有n张卡的服务器,
,虽然暂时用的人就自己,但是为了组内以后的可持续性发展,还是觉得要做一个管理,当然管理员是我(邪恶脸)。但是作为一个计算机网络一点不懂,容器啥的也没用过的菜鸡,感觉实现起来真的是难上加难,不过好在有big佬以及d老师和g老师的帮助,捯饬了那么一天,终于给弄成一个LXD容器了,在这里,弄成的定义是(我比较严谨),我能在自己的电脑上(直接连校园网或者连路由器(路由器接的校园网的交换机)),通过ssh的方式(命令行或者vscode remote),远程LXD容器,并且使用VNC可视化容器桌面。合理!
2、配置前言
先说一下校园网、服务器(后续称为宿主机)、我的电脑(后续称学生电脑)他们之间的网络关系,因为好像挺抽象的。由于我几乎不懂计算机网络,电脑盲,所以有些用词可能不当,意会一下。
校园网应该是最上层的,宿主机、学生电脑都是被包含在校园网内的。
学生电脑是直接无线连接到校园网,学生电脑的另一种情况是无线连接到路由器,这个路由器和校园网的交换机通过网线相连,这两种方案都可以。
宿主机通过网线连接到交换机上(最终方案),我还尝试过另一种方案,先将宿主机用网线和路由器连接,这个路由器和上面的路由器不是同一个,路由器再通过网线和交换机连接,但这个方案没有弄成功,因为学生电脑ping不通,具体为什么我没有去仔细研究,但建议用最终方案。
大概就是下面这个意思 ,噢对了,他这个得pppoe拨号,反正咱也不懂,输自己的帐号就行了,但是好像涉及一些分配ip的东西,我暂时没遇到,也可能遇到了但没影响。
[校园网核心交换机]
|
|—(网线)—[宿主机]
|
|—(无线)—[学生电脑A](直连校园网)
|
|—(网线)—[路由器]—(无线)—[学生电脑B]
3、开始配置gogogo
这里我主要参考的是“LXD入门详细教程 | 多人使用实验室公共 GPU”,https://zhuanlan.zhihu.com/p/661754584,链接放这儿了。
因为服务器上显卡啥的都已经配好了,所以直接到第三步安装LXD。
3.1 安装LXD
我直接按照他的方式,但是服务器上没有snap,所以我先装了snap,特地跑回去用history看了一下命令行,回忆一下当时的command。

然后LXD和那些啥周边应该就够了(周边hhh)。但是在这一步之后,我直接lxc launch容器,没看到需要初始化(视力不好是这样的),然后就提示第一次launch需要初始化,然后我才发现要init一下。

但是我init的时候,下面这个写的800,我也不知道要多少,后面问了一下g老师,我ssd是1T的,所以建议用500,这个具体含义我去搜了一下,但还是不太明白,反正就写了500吧。剩下的就按照他的来弄的,哦,他里面有些没写,那就是直接按回车,回车应该就是使用default了,好像Would you like to use an existing block device? no没有出现,我就没有管了
Size in GiB of the new loop device (1GiB minimum) [default=30GiB]: 600
3.2 创建容器
同样的,我的宿主机使用的也是ubuntu22.04,所以我在终端输入了和他一样的命令

但是,big佬说,这个看不出ubuntu安装的是桌面版还是啥版本,就是好像是最基础的的版本?这个我不确定,他说因为lxd可以可视化界面,但是我这个似乎没找到咋可视化,他建议我新开一个容器,用desktop的,但是我没听哈哈哈,我后面找到一篇帖子做可视化了,可视化在后续部分,但他说的这个方案我还没有尝试,要是有新big佬试了麻烦叫一下我,我去学习学习。
然后同样的,看一下容器列表

然后就是这样了,那个ipv4的ip地址可以记一下,后面有用的,ipv6就不懂了。
3.3 更改容器名
这里,我就直接按照上面链接的做的,我的容器名是container-1,哦,上面那个图是已经改了容器名的,之前应该不是那样,不过无所谓咯。我当时不知道为啥会多输入一条指令,sudo lxc stop steady-stingray,哦,我知道了,就是初始launch容器的时候,是随机生成名字的。那我的名字应该是steady-stingray这个,所以lxc list的时候看一下叫啥,不然stop的时候找不到。
然后我改了两次名,最后才改成了container-1,名字里是不能出现下划线 _ 的。


3.4 添加设备
我只添加了设备,好像忘记给权限了,可能确实会有影响?确实会有影响,容器内访问不到宿主机的GPU设备,所以别忘了添加权限

# 2. 设置容器特权模式(通常需要)
lxc config set container-1 security.privileged true
lxc config set container-1 security.nesting true
3.5 更改容器用户名和密码
这部分和链接里的大差不差,先进容器内部,然后在容器内部将用户名改为了u01,然后也更改了用户密码以及root用户密码,这个时候是在root用户下的,就像下面这样。

3.6 配置容器ssh连接
这个部分我是在容器的root用户下去做的。

基本的操作和链接差不太多,最终目标就是将PasswordAuthentication变为yes,不然会在连接的时候报错。但这个好像还不够,下面我会详细说的

但我的config里面PasswordAuthentication的P是小写,一开始我没注意,以为无所谓,但是后面发现死活连不上,然后我就问d老师,他给我的回答是:
首先,
# 执行这组命令,确保配置绝对正确
sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config # 确保此项不是 'no'
sudo grep -E "^(PasswordAuthentication|PermitRootLogin)" /etc/ssh/sshd_config
我输出了
root@container-1:~# sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
root@container-1:~# sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
root@container-1:~# sudo grep -E "^(PasswordAuthentication|PermitRootLogin)" /etc/ssh/sshd_config
PermitRootLogin prohibit-password
d老师分析说:
这是因为
sed命令是用来“查找并替换”文本的。但很可能你的/etc/ssh/sshd_config文件里根本不存在任何以PasswordAuthentication开头的行(无论是注释掉的还是未注释的),所以sed命令没有找到目标,也就什么都没做。
#搜索所有包含 “PasswordAuthentication” 的行(包括带#号的)
sudo grep -n "PasswordAuthentication" /etc/ssh/sshd_config
然后我出现,
root@container-1:~# sudo grep -n "PasswordAuthentication" /etc/ssh/sshd_config
79:# PasswordAuthentication. Depending on your PAM configuration,
83:# PAM authentication, then enable this but set PasswordAuthentication
意思是,并给出下面的操作建议,
你的检查结果证实了问题的根源:文件里只有关于
PasswordAuthentication的注释说明,没有实际生效的配置行(第79和83行都以#开头)。
# 直接将配置追加到文件末尾
echo "PasswordAuthentication yes" | sudo tee -a /etc/ssh/sshd_config
# 现在应该能看到带有 yes 的生效配置行了
sudo grep -i "^PasswordAuthentication" /etc/ssh/sshd_config
然后我再次尝试连接就报了新的错误hhh,此时有人已经小小的裂开了
宿主机@宿主机:~$ sudo ssh container-1@ip
[sudo] server 的密码:
container-1@ip: Permission denied (publickey).
然后d老师要我检查了一堆东西,我选择了比较关键的地方,这个操作是在容器root下执行的
root@container-1:~# sudo grep -E "^(PasswordAuthentication|ChallengeResponseAuthentication|KbdInteractiveAuthentication|AuthenticationMethods|PermitRootLogin)" /etc/ssh/sshd_config
PermitRootLogin prohibit-password
KbdInteractiveAuthentication no
PasswordAuthentication yes
预期的输出应该是
PasswordAuthentication yes
ChallengeResponseAuthentication yes
KbdInteractiveAuthentication yes
我不仅Kdb是no,并且没有Challenge这个,然后就应该执行下面这些
sudo sed -i 's/^KbdInteractiveAuthentication.*/KbdInteractiveAuthentication yes/' /etc/ssh/sshd_config
# 检查该行是否存在(可能输出为空)
sudo grep "^ChallengeResponseAuthentication" /etc/ssh/sshd_config
# 如果上一条命令没有输出(即不存在),则手动添加
echo "ChallengeResponseAuthentication yes" | sudo tee -a /etc/ssh/sshd_config
# 再确认一下三项配置ok了没有
sudo grep -E "^(PasswordAuthentication|ChallengeResponseAuthentication|KbdInteractiveAuthentication)" /etc/ssh/sshd_config
最后别忘了重启SSH,
sudo systemctl restart ssh
然后同样的用exit退出容器,进入宿主机,用ssh连接容器。这里有一个问题,就是要确定一下容器的ip,就是我前面提到的容器列表那一块,然后将链接中的容器名和ip改为自己的,我一开始就是忘改ip了,咋都连不上。总之就是很艰难的在宿主机上连接了容器。
接下来,是比较难搞的,因为我完全不懂计算机网络。上面的操作是只能在宿主机上连上容器,但是怎么在学生电脑上ssh连接容器呢?链接里给了两种方法,我又是一点不懂了。我就狠狠问d老师,给出的答案是端口转发。
sudo lxc config device add container-1 ssh-port-forward proxy listen=tcp:0.0.0.0:2222 connect=tcp:127.0.0.1:22
然后我还试了一下密钥登陆,好像也没什么用,就没管了,密码就密码吧。完成这一步之后,应该就可以在学生电脑命令行里面去ssh连接容器了。
3.7 配置容器可视化界面and用vscode remote连接容器
我觉得光命令行还是太难了,所以还是想试试用vscode,毕竟用云端的时候,也一直用的vscode,就比较习惯。我这一部分主要是参考https://zhuanlan.zhihu.com/p/1960667258167734966,“机器人RL开源项目代码详解——Tienkung_lab”。
在root用户下,我添加了一下sudo权限,u01改成自己的用户名
usermod -aG sudo u01
然后在终端修改了一下镜像源,也是和链接里的一样,然后安装python和miniconda,以及Turbovnc图形界面,这几个部分都畅通无阻,我是用的XFCE
# 轻量级桌面 - XFCE
sudo apt install -y xfce4 xfce4-goodies
# 下载并安装TurboVNC
wget https://github.com/TurboVNC/turbovnc/releases/download/3.1.2/turbovnc_3.1.2_amd64.deb
# 安装
sudo dpkg -i turbovnc_3.1.2_amd64.deb
# 修复可能的依赖问题
sudo apt install -f -y
# 编辑xstartup配置文件
vim ~/.vnc/xstartup
编辑这个配置文件也折磨了我一下,主要还是太菜了,反正最后的内容是这样,
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
# 启动 DBUS(重要!)
dbus-launch --exit-with-session startxfce4 &
然后给一下权限?再重新启动,
chmod +x ~/.vnc/xstartup
# 重启 VNC
/opt/TurboVNC/bin/vncserver -kill :1
/opt/TurboVNC/bin/vncserver :1
然后你会发现运行了之后,什么都没有发生,哈哈哈哈哈哈哈太逆天了。于是我问了一下g老师,

有被抽象到,啥也没出现的原因是,学生本地没有安装客户端哈哈哈,怎么可能出现可视化界面呢?然后就在学生电脑上装了一下。
sudo apt update
sudo apt install tigervnc-viewer
# 启动方式
vncviewer
# 在地址栏里填,这个15901改成自己的
localhost:15901
然后就出现了,下面就能看到容器内部长什么样子了,小老鼠怪可爱的喵

接下来就自行配置一下科学上网,这个就各显神通吧。
最后,有了梯子之后,在vscode里面就能直接ssh上了,不会卡在初始化vscode server那一步了,但是我发现我为啥不直接在可视化界面里操作呢??????????有一点呆。剩下容器里的一些配置就自己去配吧。
总结
我觉得上面是开容器的入门操作,因为自己水平太菜,导致折腾了很久,才勉强完成了容器管理的第一步,下一步就要开始研究怎么真正去管理容器了。。。。。太难了我








