背景
我们研究小组跑程序一直使用的新配的服务器,每人分配了一个lxd容器。这本是一份极为美妙的事情,但是容器内出现过两次ping不通百度的情况,导致需要下载新环境时,不能直接使用命令,本人找过许多人,想了许多方法都无效,索性直接重装暴力解决。下面记录一下我们重装的过程和其中遇到的问题。
Ubuntu服务器备份数据到硬盘
找到需要备份的文件,使用tar打包。(例:/home/Project文件夹)
cd /home
tar cvf Project.tar Project/
#可以查看文件/文件夹的大小
du -ach Project.tar
方法一:
如果大家使用的图形化界面或者U盘路径可以直接显示,那么就用此方法
使用scp命令 将打包的文件发送给硬盘,其中ubuntu下的硬盘路径为 : /media/ubuntu/KESU/Ubuntu_File 。其中10.118.158.1是目标主机的ip,KESU即硬盘名称,Ubuntu_File是文件名。例:
发送文件
scp Project.tar ubuntu@10.118.158.1:/media/ubuntu/KESU/Ubuntu_File
发送文件夹时需要加 -r
scp -r Project/ ubuntu@10.118.158.1:/media/ubuntu/KESU/Ubuntu_File
#传输文件这个事情可以有很多种做法,他们的效率各不相同,因为要备份的数据多,所以我们使用效率最高的scp
- Filezilla : 5M/s (max)
- scp : 50M/s (avg)
- scp:100M/s (双硬盘拷贝)
方法二(挂载方法):
如果大家是文字界面或U盘路径不能直接显示。那就要先把设备挂载到路径下。
首先查看设备情况
lsblk
这里的sdb和sdc就是我们外接的、需要访问的硬盘。由于对Ubuntu对格式的要求,我们不能直接挂载disk格式的sdb和sdc,而是他们part格式的子目录。
创建我们要挂载的目录,并挂载磁盘到目录
sudo mkdir /mnt/mount_point
sudo mount /dev/sdb1 /mnt/mount_point
#注意:一次只能挂载一个part,所以这样挂载的方式传输效率会稍微慢一些
数据传输按照方法一进行。
卸载lxd
首先停止lxd容器并删除(容器名:paige)
lxc stop paige
lxc delete paige
照以上方法删除其余容器,然后卸载lxd。由于服务器lxd是用snap安装的,所以也需要用snap命令卸载。如图
参考:ubuntu中snap包安装、更新删除与使用的示例分析
卸载lxd
sudo snap remove lxd
#关于lxd容器没网的问题,有种说法是docker和lxd冲突了,正好本机也通过snap安装过docker,但是没使用。这里正好也卸载了
参考:LXD/LXC 奇怪的重启断网问题解决
sudo snap remove docker
到目前为止就是纯净的宿主机系统了
lxd
sudo snap install lxd # 安装lxd
sudo apt install zfsutils-linux bridge-utils # 用于搭建网桥
sudo lxc init # 初始化lxd,全选默认选项
#选错也没关系,还能使用下面命令改
#sudo lxc profile edit default
这样lxd基本就下好了,接下来是一些主机的配置
宿主机显卡配置
主机需要下载显卡驱动才能使用nvidia-smi
命令,同时容器要与主机版本完全一致。由于找不到以前的版本 这里选择重装:
卸载宿主机显卡驱动
sudo apt-get remove --purge nvidia*
sudo apt autoremove
安装宿主机显卡驱动,去NVIDIA官网 下载最新驱动(.run文件),然后用Filezila传给宿主机
sudo apt install gcc g++ make # 安装依赖
sudo apt install nvidia-driver-xxx #xxx为指定的驱动版本号
sudo reboot #重启
nvidia-smi #查看是否生效
设置显卡驱动不要⾃动更新,在弹出的界⾯中选择 no
sudo dpkg-reconfigure unattended-upgrades
重装显存后发现两个问题,一个是功率占用比较高,另一个是nvidia-smi
命令后要几秒时间才会出结果。
为了解决这些问题,将显卡模式改为持久模式
sudo nvidia-smi -pm 1 # 改为持久模式
然后如果出现xorg占用显存的问题(如下所示),可以关闭可视化界面
sudo service gdm stop
# 容器的中不用安装显卡驱动。最好的方式是宿主机安装显卡驱动,容器使用宿主机的共享即可,在后面我们会说到
容器配置——lxd共享存储池
查看我们数据要存放的设备
sudo lsblk
在块设备/dev/nvme0n1上创建⼀个ZFS存储池
#注意:这里同样只能操作part格式的内容,所以命令是
lxc storage create zfs-pool zfs source=/dev/nvme0n1p1
这样我们就创建好了一个存储池
lxc storage list #列出存储池
查看存储池使用情况和总容量
lxc storage info zfs-pool
容器配置——ssh连接
sudo lxc launch ubuntu:20.02 paige -s zfs-pool#创建名为paige的容器,ubuntu版本与宿主机一致,并挂载到共享存储池中
lxc exec paige bash #进入容器,进去之后是root用户,实际上还自带一个ubuntu用户
passwd root #设置root密码
passwd ubuntu #设置ubuntu密码,最好与root密码相同
# 设置ssh
sudo vim /etc/ssh/sshd_config #将 PasswordAuthentication 改为yes
systemctl restart sshd #重启ssh服务
通过上诉步骤后返回宿主机,建立端口与容器的映射关系,这里宿主机的6002端口映射到了容器的22端口,ssh连接宿主机的6002端口即可进入容器
sudo lxc config device add paige proxy0 proxy listen=tcp:192.168.2.85:6002 connect=tcp:10.228.141.116:22 bind=host
到此我们就可以使用ssh直接连接容器了
ssh ubuntu@192.168.2.85 -p 6002
#如果端口映射写错 我们可以通过以下命令删除
sudo lxc config device remove paige proxy0
容器配置——使用容器模板批量生成
可以现在容器中安装一些必要的软件或文件夹,例如:anaconda,之后批量生成的容器中也会包含这些软件、文件夹、配置等内容
- 停止容器paige
lxc stop {容器名}
#例如:lxc stop paige
- 打包
sudo lxc publish {容器名} --alias {镜像名} --public
#例如:sudo lxc publish paige --alias paige_copy --public
- 生成
lxc launch [镜像名] [新的容器名]
#例如:lxc launch paige_copy yui
#注意:新生成的容器虽然ssh配置正确,但是ubuntu密码没能被拷贝。所以不能直接使用ssh连接,需要先进容器修改用户ubuntu的密码。
容器配置——权限
sudo lxc config device add [container_name] gpu gpu #允许paige容器使用所有显卡
lxc config set [container_name] limits.cpu [xx] # xx表示指定的cpu核心数 我们没设置
lxc config set [container_name] limits.memory=[xx]GB # xx表示指定的内存的大小 我们是24
lxc config set [container_name] security.privileged false #设置容器的特权为false,不然可能与显卡驱动共享不兼容
lxc config set [container_name] nvidia.runtime true #设置容器可以共享宿主机的显卡驱动
lxc restart [container_name] # 重启容器 让权限生效