根据实验室的任务需要,该服务器需要同时运行多种任务,且任务间的干扰大。
为了能够将不同开发人员的环境区分开,我们在经过多种尝试后,决定采用LXC容器进行虚拟化。
虚拟化需求
- 各容器应当具有独立IP
- 容器内具备运行CUDA环境的能力
- 性能损耗小
- 管理方便
LXC思路
因为现有的服务器资源比较充裕,所以给用户空间和编译执行空间设定了不同的RAID卷,用户空间单独提出进行挂载,这样,每个用户的数据都能安全保存。
每个用户对应独立IP的容器,容器内具有root权限,可以执行任意的操作。
通过LVM对根目录扩充,容许用户在容器中进行大磁盘占用的操作。独立的RAID0 SSD,支持用户将当前的执行任务放入其中,进行当前运行。独立的RAID1 HDD,支持用户存储用户目录内容,且数据安全有保证。
LXC容器创建
创建模板容器
首先创建一个模板容器,并将网络、ssh-server等内容配置好,之后给用户配置的容器都基于该模板容器进行复制。
1 | lxc-copy -n old_name -N new_name -K |
old_name 是模板容器名,new_name 是目标容器名,-K表示保存之前的配置。
修改容器内的特定信息
进入到复制得到的容器rootfs,更改容器内的/etc/hostname,将其更改为需要的名称,否则会显示模板的主机名。
修改容器的配置文件config,将文件夹的挂载配置修改为对应的目录。
由宿主机的lxc-attach,进入容器中,创建用户,并赋予sudo权限,用户名与挂载的目录一致。
实现效果
最终实现的效果,是用户可以通过独立IP登陆到容器中,并且可以使用挂载的设备与目录。
用户可以自行配置UI,通过vncserver进行访问;也可以创建ftp服务器,直接进行文件传输。
从实际使用效果来看,创建的各个容器就像虚拟机一样,有自己独立的空间,也有独立的IP可以直接访问。
因为创建的容器运行在用户态,在容器中即使以root身份执行,对应于实际机器中的进程ID也不是真正的root。
容器相对于虚拟机来说,资源占用小得多,并且可以根据实际需要进行释放,大大缓解宿主机的压力。