Установка и настройка LXC
1) Осуществите базовую настройку Ubuntu 18.04.
2) Обновите ядро системы до версии 5.3, согласно инструкции.
3) Установите программу LXC
aptitude install lxc
Установите права доступа, чтобы корректно запускались контейнеры:
chown lxc-root:root /var/lib/lxc
chmod 755 /var/lib/lxc
4) Настройте сеть LXC
Рекомендуется использовать сеть 172.30.0.1/24. Более подробный список указан в списке сетей.
В файле /etc/default/lxc-net пропишите
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_ADDR="172.30.0.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="172.30.0.0/24"
LXC_DHCP_RANGE="172.30.0.2,172.30.0.254"
LXC_DHCP_MAX="253"
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
#LXC_DOMAIN="lxc"
Создайте файл /etc/lxc/dnsmasq.conf и пропишите в нем:
port=53
listen-address=172.30.0.1
5) Пропишите хосты
В /etc/hosts добавьте строчки
172.30.0.25 nvidia
6) Включите драйвера br_netfilter
echo overlay >> /etc/modules-load.d/docker.conf
echo br_netfilter >> /etc/modules-load.d/docker.conf
Установка LXC контейнера
1) В файле /etc/lxc/default.conf проверьте и закоментируйте строчки:
#lxc.idmap = u 0 100000 65536
#lxc.idmap = g 0 100000 65536
2) Установите контейнер docker0. Создавать будем контейнер с названием nvidia
lxc-create -t download -n nvidia -- --dist ubuntu --release jammy --arch amd64
3) Внесите изменения в файл /var/lib/lxc/nvidia/config
Раскоментируйте строку
lxc.include = /usr/share/lxc/config/nesting.conf
Это позволит создать Nested контейнер — возможность запустить контейнер в контейнере (вложенные контейнеры).
Добавьте в файл следующие строки
lxc.net.0.ipv4.address = 172.30.0.25/24
lxc.net.0.ipv4.gateway = 172.30.0.1
lxc.mount.auto = cgroup-full:rw
lxc.apparmor.profile = unconfined
lxc.cgroup.devices.allow = a
lxc.cap.drop =
# nvidia Driver
lxc.cgroup.devices.allow = c 195:* rwm
lxc.cgroup.devices.allow = c 243:* rwm
lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
Настройка контейнера
1) Установка docker:
curl -sSL https://get.docker.com | sh
systemctl enable docker
systemctl start docker
apt-get install docker-compose
2) В крон через команду sudo crontab -e пропишите команду, которая будет автоматически очищать контейнеры
0 0 * * * yes | docker container prune > /dev/null
3) Установите драйвер в LXC контейнер. Драйвер должен быть той же версии, что и на хосте. Ниже команда устанавливает драйвер версии 515. Если у вас новее драйвер, поставьте другую версию.
aptitude install nvidia-driver-515
4) Установите плагин libnvidia-containuer.
Определите версию Убунту
export distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
Установите ключ nvidia:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
Добавьте репозиторий:
wget https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list -O "/etc/apt/sources.list.d/nvidia-container-toolkit.list"
sed -i 's|deb https://|deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://|g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
Установите Docker плагин:
apt-get update
apt-get install -y nvidia-docker2
5) Добавьте строчки в /etc/docker/daemon.json
{
"log-driver": "journald",
"log-opts": {
"labels":"com.docker.swarm.service.name"
},
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
6) Перезапустите Docker:
systemctl restart docker
7) Выполните команду:
docker run --rm --gpus all nvidia/cuda:11.7.1-base-ubuntu20.04 nvidia-smi
Если команда выполнилась успешно и указала версию драйвера, значит все установлено корректно.
Источники