Coder Social home page Coder Social logo

lxd_gpu_server's Introduction

实验室GPU服务器的LXD虚拟化

实验室加了台GPU服务器用于深度学习,因为实验室人数比较多,但是每个人使用的软件千差万别,多人使用同一台的话,软件,环境,文件,配置杂七杂八。甚至还有小白会运行损害系统的命令
image
所以我们做了虚拟化。为什么使用LXD呢,而不是使用最热门的docker呢?
两者都是基于lxc虚拟化,而docker作为应用容器,LXD是系统容器(可以安装完整的桌面有没有很赞),更加接近我们的生产环境,想象一下,别人使用docker时,还要自己使用命令上传文件,运行程序。尤其是小白对着黑框框会很头疼。而自己打开远程,打开pycharm,美滋滋。去除什么linux不要用桌面的想法,9102年了,ubuntu桌面已经很稳定了。接下来就来安装使用吧

第一步:宿主机的安装与配置

服务器系统的安装

建议安装server版,通过ssh远程 ubuntu镜像
服务器一般有一块SSD和多块机械做成的RAID的阵列,系统安装在SSD(比较小)还有一块RAID阵列的数据盘

服务器显卡驱动的安装

(如不能访问,在pdf文件夹已经离线好)
显卡驱动安装,
安装NVIDIA显卡驱动、CUDA、cuDNN

第二步:lxd的安装与初始化

安装lxd

LXD 实现虚拟容器
ZFS 用于管理物理磁盘,支持LXD高级功能
bridge-utils 用于搭建网桥

安装LXD、ZFS和bridge-utils

sudo apt-get install lxd zfsutils-linux bridge-utils

配置网桥:

因为学校信息中心网络的限制,如果配置桥接网卡,会导致流量异常,直接断网,因此实现每人一个ip的方式失败,不得已我们采用端口监听的方式来实现各个容器的连接(如果你不想使用监听的方式请自行上网查询LXD配置桥接网卡)

配置ZFS

首先,我们运行sudo fdisk -l列出服务器上的可用磁盘和分区,我们有两块硬盘,第一块为系统盘,第二块为数据盘,现在我们将数据盘(/dev/sdb)分出需要使用的空间,作为容器的存储卷。

查看分区

sudo fdisk /dev/sdb

my-logo.png
按照下图分出了80GB的分区作为容器的存储卷,分区为/dev/sdb1,剩下的空间同理可以分区,可以作为服务器另外的应用使用
my-logo.png

创建块设备

在块设备 /dev/sdb1 上创建一个ZFS存储池

sudo lxc storage create zfs-pool zfs source=/dev/sdb1

LXD初始化

sudo lxd init

my-logo.png
因为我们已经创建好了一个叫zfs-pool的存储池,所以在lxd初始化时不需要创建新的储存池,之后在进行配置即可

再次配置

sudo lxc profile edit default

修改容器内默认磁盘大小

在配置时还将每个容器的硬盘大小限制为固定大小
(如果没有设置,容器里面的磁盘大小为整个储存池的大小)
my-logo.png

第三步:容器的创建

如果你嫌这一步制作容器母本比较麻烦,或者在安装远程连接软件出现问题,你可直接使用镜像备份直接导入我制作好的带桌面可远程的容器(容器不带英伟达驱动),详情在后面

加速源

使用清华的镜像源(加速创建)

sudo lxc remote add tuna-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public

列出可用的镜像

sudo lxc image list tuna-images:

创建ubuntu容器

使用清华源中的ubuntu镜像创建一个叫test的容器

sudo lxc launch tuna-images:ubuntu/18.04 test

进入容器

sudo lxc exec test bash

我们登录的是root用户,在这个容器中已经存在了一个叫ubuntu的用户

修改密码

passwd root
passwd ubuntu

容器里的ubuntu是一个很精简的系统,需要安装各种软件

安装ssh

apt install ssh

通过ssh连接容器

查看容器与宿主机的ip

因为我们没有设置桥接网卡,不能从外部电脑访问容器(不能ping通容器的ip),因此我们采用端口监听的方式来访问我们的容器。

退出容器

exit

在宿主机查看容器

sudo lxc list

图中可知容器的ip地址为10.152.210.183

my-logo.png

查看宿主机ip地址

ip addr

可知宿主机ip为172.22.24.126

端口转发

sudo lxc config device add test proxy0 proxy listen=tcp:172.22.24.126:60601 connect=tcp:10.152.210.183:22 bind=host

60601是我们定的端口号,通过宿主机的60601端口号监听容器中22端口号(SSH默认端口号)

第四步:初始容器的配置

使用ssh连接容器并配置

ssh [email protected] -p 60601

1. 更换源

备份原来的源

sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak

编辑写入网易源 (**源)

(注意系统版本 ubuntu 18.04 bionic)

sudo vim /etc/apt/sources.list

deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

2. 为容器添加显卡

我们回到宿主机

为容器添加所有GPU:

lxc config device add yourContainerName gpu gpu

添加指定GPU:

lxc config device add yourContainerName gpu0 gpu id=0

安装驱动

添加好显卡后,就相当于我们给容器安装了显卡,我们回到容器,然后安装显卡驱动
与宿主机的显卡版本必须一致,安装方法参考第一步NVIDIA显卡驱动、CUDN、cuDNN的安装
需要注意的是容器里面安装显卡驱动时需要加上后面的参数,安装时不需要安装到内核

sudo sh ./NVIDIA-Linux-X86_64-[YOURVERSION].run --no-kernel-module

到了这一步可以看第七步:容器模板,将server版的容器导出为镜像,可供不需要桌面的同学使用(推荐可以使用VSCode安装Remote SSH插件连接远程服务器)

3. 安装图形化界面

刷新源

sudo apt update

安装无推荐软件的ubuntu桌面(默认安装gnome,完整安装会有很多无关的软件)

sudo apt install --no-install-recommends ubuntu-desktop

4.安装远程连接

使用安装脚本(安装git后下载我们之后需要用的东西)

sudo apt install git
git clone https://github.com/shenuiuin/LXD_GPU_SERVER

打开文件夹

cd LXD_GPU_SERVER/

赋予脚本可执行权限

sudo chmod a+x xrdp-installer-1.2.sh

脚本会下载一些文件,需要有Downloads文件夹

mkdir -p ~/Downloads

安装脚本

./xrdp-installer-1.2.sh -c -l -s

安装完成

my-logo.png

如果有其他桌面的需求

kde桌面环境以及xrdp安装
xfce桌面环境以及xrdp安装
xrdp解决声音重定向

5. 远程连接测试

端口转发

在安装好XRDP后,与之前一样,因为我们ping不通容器,所以我们需要使用宿主机的端口号监听容器的xrdp的端口

sudo lxc config device add test proxy1 proxy listen=tcp:172.22.24.126:60611 connect=tcp:10.152.210.183:3389 bind=host

远程连接

60611是我们定的端口号,通过宿主机的60611端口号监听容器中3389端口号(XRDP默认端口号)
可以通过windows的远程连接来使用容器(windows运行mstsc)
my-logo.png
接下来就是当普通的ubuntu来使用,比如可以找一些教程:安装完ubuntu必做的事等等

第五步:ubuntu的美化等配置

icon图标主题

sudo apt update
sudo apt install papirus-icon-theme

GTK主题

git clone https://github.com/vinceliuice/vimix-gtk-themes
cd vimix-gtk-themes
sudo ./vimix-installer

应用主题

主题安装好后用使用gnome-tweak-toos来应用主题
my-logo.png
还可以个性化你的ubuntu,比如加上最大化最小化按钮
my-logo.png

gnome扩展

推荐的这些扩展
my-logo.png

切换中文

系统的中文在Language Support。然后添加简体中文的语言将中文拖到第一项,然后应用到整个系统
my-logo.png

保留旧的名称

重启之后会有提示将文件夹的名字改成中文(最好还是用旧的名称,英文路径)
my-logo.png

安装需要的软件

搜狗输入法、谷歌浏览器等等

显示Linux系统信息

sudo apt install neofetch
neofetch

查看CPU运行以及内存占用情况

sudo apt install htop
htop

查看显卡运行情况

nvidia-smi

实时查看显卡运行情况(按照0.1s的频率实时刷新)

watch -n0.1 nvidia-smi

第六步:容器管理

查看zfs储存卷的占用情况

zpool list

为容器修改参数配置

我们不想每个人使用全部的硬件资源,所以还需要限制每个人的参数
容器参数配置说明

配置容器参数

lxc config edit YourContainerName

一般使用以下的配置即可满足

my-logo.png 其实在教程第二步的最后编辑默认磁盘大小的时候就已经在操作了(default)

配置默认容器参数(新容器的参数会继承default配置的参数,容器会优先使用自己的参数)

sudo lxc profile edit default

管理员须知

管理员应在桌面上新建使用说明read.txt,写下系统的版本等信息、安装了什么软件、各种注意事项等等

第七步:容器模板

我们把这个配置好的容器当成模板,保存为镜像。

停止容器

sudo lxc stop test

将test容器保存为ubuntudemo镜像

sudo lxc publish test --alias ubuntudemo --public

从模板镜像中新建容器

以后直接用模板镜像来创建容器,容器创建好后修改它的配置文件:添加端口映射(远程连接与SSH)、添加显卡(显卡驱动已经有了)、配置硬件参数,(可使用默认配置文件,使得新容器的参数继承于它,这一步就可以省略) my-logo.png

my-logo.png my-logo.png my-logo.png

番外

使用镜像备份直接导入容器(如果嫌制作容器麻烦或者有问题可直接导入)

下载我制作的镜像备份文件(ubuntu2004_xrdp,用户名和密码都为ubuntu)

https://pan.baidu.com/s/1AlnyEblEfP1ruIw9sg5Dtw 密码: cb25

拷贝至服务器,在该文件目录下导入镜像

lxc image import 4dd4710a11c146cbdbba13d7bc8c9fb69d7dca8fb93680b4a9285d2951b05db6.tar.gz --alias ubuntu_demo

就可以直接使用导入的镜像来创建容器,容器创建好后为它添加显卡和端口监听(远程连接与SSH),还有为容器安装显卡驱动(每个人的显卡驱动版本不同,我就没有安装了)

在lxd容器中使用docker

lxc config edit YourContainerName

在config中添加

my-logo.png

然后重启容器

lxc restart YourContainerName

共享目录

path1为宿主机路径,path2为容器内路径。

lxc config set yourContainerName security.privileged true
lxc config device add privilegedContainerName shareName disk source=path1 path=path2

若容器内对共享目录沒有权限,只需将宿主机目录路径权限给足

sudo chmod -R 777 path1

使用自定义lxd容器

上述lxd容器只能使用镜像源中,但如果我们想使用自己喜欢的发行版,或者自己已经有一台各方面已经调教满意的linux实体机,不想折腾了。这时候我们便可以将此系统移植到lxd中

接下来我以manjaro为例演示

my-logo.png

启用aur,安装xrdp、xorgxrdp

yay -S xrdp xorgxrdp

创建以下配置文件 /etc/X11/Xwrapper.config

allowed_users=anybody
needs_root_rights=auto

修改pam.d /etc/pam.d/xrdp-sesman

auth include system-remote-login
account include system-remote-login
password include system-remote-login
session include system-remote-login

修改 ~/.xinitrc

找到这行
local dbus_args=(--sh-syntax --e10.240.135.158xit-with-session)
改为
local dbus_args=(--sh-syntax)

启动服务与添加开机自启

sudo systemctl enable xrdp
sudo systemctl enable xrdp-sesman
sudo systemctl start xrdp
sudo systemctl start xrdp-sesman

测试远程连接,虚拟机可能需要桥接网卡才能访问

manjaro-rdp.png

准备一个linux live cd,可以使用ubuntu、manjaro等,实体机需要制作启动盘,使用rufus刻录即可

实体机U盘启动,虚拟机直接挂载镜像进入live cd

查看分区

sudo fdisk -l
manjaro03.png

这里/dev/sda1分区是安装的系统的根目录,我们将他挂载出来

如果还有其他的挂载点也需要挂载到/data1的相应目录,保证系统文件的完整性

sudo mkdir /data1
sudo mount /dev/sda1 /data1

这里/dev/sdb是我新加的一块硬盘,作为打包文件存放的地方,现在格式化并挂载,实体机可以直接挂载其他分区作为存放的地方

sudo mkfs -t ext4 /dev/sdb
sudo mkdir /data2
sudo mount /dev/sdb /data2

打包系统文件到/data2目录

cd /data2
sudo tar -cvzf rootfs.tar.gz -C /data1 .

创建metadata.yaml文件,根据自己的需要修改

architecture: "x86_64"
creation_date: 1584170077 # To get current date in Unix time, use date +%s command
properties:
architecture: "x86_64"
description: "manjaro_i3wm_xrdp"
os: "manjarolinux"
release: "kyina"

打包metadata.yaml文件

tar -cvzf metadata.tar.gz metadata.yaml

将这两个文件上传到服务器的同一个文件夹

现在我们连接到服务器,切换到那两个文件的目录

导入镜像

lxc image import metadata.tar.gz rootfs.tar.gz --alias manjaro_demo

接下来便可以当做正常的镜像使用

manjaro04.png

可能有些容器不能自动获取ipv4,可以在重启容器时进容器手动获取后添加dhclient开机自启

lxc exec manjaro-test bash
ip a
ip link set eth0 up
dhcpcd eth0
systemctl enable dhclient manjaro05.png

接下来就是为新容器添加显卡,并配置它的硬件参数,安装与宿主机一样版本的NVIDIA、CUDA、cuDNN驱动(可能会遇到gcc版本问题,降级即可)

目前测试成功的有manjaro、deepin(deepin直接安装xrdp)

manjaro06.png deepin.png

lxd_gpu_server's People

Contributors

shenuiuin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

lxd_gpu_server's Issues

Xorg cann't run. X11服务器无法启动.

请问博主,遇到过Xorg无法启动的情形吗,会导致xrdp登录后只显示空白蓝屏?
本人lxc内是手动安装xrdp包,没有采用脚本。桌面用xfce和gnome都不行。

使用端口监听的方式实现容器远程连接,但是却无效

我尝试使用您提供的端口监听的方式实现容器的远程连接:
sudo lxc config device add test proxy0 proxy listen=tcp:宿主机ip:60601 connect=tcp:容器ip:22 bind=host
我可以通过 ssh -p 22 root@宿主机ip 连接宿主机,
但是却不能通过 ssh -p 60601 ubuntu@宿主机ip 连接容器,请问这个问题是怎么解决的?

你好,有一些问题-

  1. 使用这种方式来搭建GPU服务器的话,是否意味着服务器端始终运行所有的容器?如果容器退出重启的话,其IP会重新分配么?
  2. 1个容器使用一个GPU核心,另外一个容器能看到该GPU的工作情况么?照理说是不可以的吧,也就是说一个容器分配一个GPU是实现固定好的么?
  3. 如何解决GPU的利用率问题,也就是作业排队
    谢谢

使用共享镜像无法禁止Nouveau 内核驱动程序,安装不了显卡驱动

大佬你好,我用Ubuntu20.4官方镜像没有办法禁止自带的Nouveau自带的驱动,所以也安装不了Nvidia显卡驱动。
使用百度网盘分享的镜像也是一样的问题:
image

我尝试了在/etc/modprobe.d/blacklist.conf 中加入:
blacklist nouveau
options nouveau modeset=0
然后执行sudo update-initramfs -u,重启但仍然没用,还是会自动运行Nouveau相关的程序。请问如何解决呢?

LXD升级驱动、cuda

感谢大佬的分享~
不过请问后续如何升级驱动、cuda呢,要重新制作模版吗

为容器分显卡时错误

您好,非常感谢您提供的配置指南,但是我在配置的过程中还是遇到了如下的问题,不知道您是否可以帮助我:
我使用您提供的指令为容器分配显卡,但是我分配了一个,为什么容器内两张卡都能看到

您可以使用Google翻譯將英語翻譯添加到README.md文件嗎? Nín kěyǐ shǐyòng Google fānyì jiāng yīngyǔ fānyì tiānjiā dào README.Md wénjiàn ma?

I used google translate to create a decent English translation of your README so I think you should do that and provide it along with your Chinese language version.

我使用Google翻譯為您的自述文件創建了不錯的英語翻譯,所以我認為您應該這樣做並提供您的中文版本
Wǒ shǐyòng Google fānyì wèi nín de zìshù wénjiàn chuàng jiàn liǎo bùcuò de yīngyǔ fānyì, suǒyǐ wǒ rènwéi nín yīnggāi zhèyàng zuò bìng tígōng nín de zhōngwén bǎnběn

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.