Skip to content

Commit 303bf28

Browse files
authored
feat: Add support for using nvidia GPUs inside containers (#43)
* feat: Add support for using nvidia GPUs inside containers * feat: Add container runtime config files into general add-ons package * feat: Add config.toml for rootless container support * fix: Keep backup of original nvidia container runtime config.toml
1 parent 4b1c5e6 commit 303bf28

File tree

5 files changed

+123
-40
lines changed

5 files changed

+123
-40
lines changed

Containerfile

+29-9
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,24 @@ RUN NVIDIA_PACKAGE_NAME="$(cat /tmp/nvidia-package-name.txt)" \
4343
|| \
4444
(cat /var/cache/akmods/${NVIDIA_PACKAGE_NAME}/${NVIDIA_VERSION}-for-${KERNEL_VERSION}.failed.log && exit 1)
4545

46-
ADD akmods-nvidia-key.spec /tmp/akmods-nvidia-key/akmods-nvidia-key.spec
46+
ADD ublue-os-nvidia-addons.spec /tmp/ublue-os-nvidia-addons/ublue-os-nvidia-addons.spec
4747

48-
RUN install -D /etc/pki/akmods/certs/public_key.der /tmp/akmods-nvidia-key/rpmbuild/SOURCES/public_key.der
48+
ADD https://nvidia.github.io/nvidia-docker/rhel9.0/nvidia-docker.repo \
49+
/tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/nvidia-container-runtime.repo
50+
51+
RUN sed -i "s@gpgcheck=0@gpgcheck=1@" /tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/nvidia-container-runtime.repo
52+
53+
ADD files/etc/nvidia-container-runtime/config-rootless.toml \
54+
/tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/config-rootless.toml
55+
ADD https://raw.githubusercontent.com/NVIDIA/dgx-selinux/master/bin/RHEL9/nvidia-container.pp \
56+
/tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/nvidia-container.pp
57+
58+
RUN install -D /etc/pki/akmods/certs/public_key.der /tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/public_key.der
4959

5060
RUN rpmbuild -ba \
51-
--define '_topdir /tmp/akmods-nvidia-key/rpmbuild' \
61+
--define '_topdir /tmp/ublue-os-nvidia-addons/rpmbuild' \
5262
--define '%_tmppath %{_topdir}/tmp' \
53-
/tmp/akmods-nvidia-key/akmods-nvidia-key.spec
63+
/tmp/ublue-os-nvidia-addons/ublue-os-nvidia-addons.spec
5464

5565

5666
RUN cp /tmp/nvidia-package-name.txt /var/cache/akmods/nvidia-package-name.txt
@@ -60,8 +70,13 @@ RUN rpm -q "xorg-x11-drv-$(cat /tmp/nvidia-package-name.txt)" \
6070

6171
FROM ${BASE_IMAGE}:${FEDORA_MAJOR_VERSION}
6272

63-
COPY --from=builder /var/cache/akmods /tmp/akmods
64-
COPY --from=builder /tmp/akmods-nvidia-key /tmp/akmods-nvidia-key
73+
COPY --from=builder /var/cache/akmods /tmp/akmods
74+
COPY --from=builder /tmp/ublue-os-nvidia-addons /tmp/ublue-os-nvidia-addons
75+
76+
RUN sed -i 's@enabled=1@enabled=0@g' /etc/yum.repos.d/fedora-{cisco-openh264,modular,updates-modular}.repo
77+
78+
RUN install -D /tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/nvidia-container-runtime.repo \
79+
/etc/yum.repos.d/nvidia-container-runtime.repo
6580

6681
RUN KERNEL_VERSION="$(rpm -q kernel --queryformat '%{VERSION}-%{RELEASE}.%{ARCH}')" \
6782
NVIDIA_FULL_VERSION="$(cat /tmp/akmods/nvidia-full-version.txt)" \
@@ -71,13 +86,18 @@ RUN KERNEL_VERSION="$(rpm -q kernel --queryformat '%{VERSION}-%{RELEASE}.%{ARCH}
7186
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
7287
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm \
7388
&& \
74-
sed -i 's@enabled=1@enabled=0@g' /etc/yum.repos.d/{fedora-{cisco-openh264,modular,updates-modular},rpmfusion-free{,-updates}}.repo \
89+
sed -i 's@enabled=1@enabled=0@g' /etc/yum.repos.d/rpmfusion-free{,-updates}.repo \
7590
&& \
7691
rpm-ostree install \
7792
xorg-x11-drv-${NVIDIA_PACKAGE_NAME}-{,cuda-,devel-,kmodsrc-,power-}${NVIDIA_FULL_VERSION} \
78-
kernel-devel-${KERNEL_VERSION} \
93+
kernel-devel-${KERNEL_VERSION} nvidia-container-toolkit \
7994
"/tmp/akmods/${NVIDIA_PACKAGE_NAME}/kmod-${NVIDIA_PACKAGE_NAME}-${KERNEL_VERSION}-${NVIDIA_FULL_VERSION#*:}.rpm" \
80-
/tmp/akmods-nvidia-key/rpmbuild/RPMS/noarch/akmods-nvidia-key-*.rpm \
95+
/tmp/ublue-os-nvidia-addons/rpmbuild/RPMS/noarch/ublue-os-nvidia-addons-*.rpm \
96+
&& \
97+
mv /etc/nvidia-container-runtime/config.toml{,.orig} && \
98+
cp /etc/nvidia-container-runtime/config{-rootless,}.toml \
99+
&& \
100+
semodule --verbose --install /usr/share/selinux/packages/nvidia-container.pp \
81101
&& \
82102
sed -i 's@enabled=1@enabled=0@g' /etc/yum.repos.d/rpmfusion-nonfree{,-updates}.repo \
83103
&& \

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,19 @@ $ podman build \
112112
--tag build-test:latest
113113
```
114114
115+
## Using Nvidia GPUs in containers
116+
117+
[There is support for enabling Nvidia GPUs in containers](https://www.redhat.com/en/blog/how-use-gpus-containers-bare-metal-rhel-8). This can can be verified by running the following:
118+
119+
```
120+
$ podman run \
121+
--user 1000:1000 \
122+
--security-opt=no-new-privileges \
123+
--cap-drop=ALL \
124+
--security-opt label=type:nvidia_container_t \
125+
docker.io/mirrorgooglecontainers/cuda-vector-add:v0.1
126+
```
127+
115128
## Acknowledgements
116129
117130
Thanks to Alex Diaz for advice, and who got this working first, check out this repo:

akmods-nvidia-key.spec

-31
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
disable-require = false
2+
#swarm-resource = "DOCKER_RESOURCE_GPU"
3+
#accept-nvidia-visible-devices-envvar-when-unprivileged = true
4+
#accept-nvidia-visible-devices-as-volume-mounts = false
5+
6+
[nvidia-container-cli]
7+
#root = "/run/nvidia/driver"
8+
#path = "/usr/bin/nvidia-container-cli"
9+
environment = []
10+
#debug = "/var/log/nvidia-container-toolkit.log"
11+
#ldcache = "/etc/ld.so.cache"
12+
load-kmods = true
13+
#no-cgroups = false
14+
no-cgroups = true
15+
#user = "root:video"
16+
ldconfig = "@/sbin/ldconfig"
17+
18+
[nvidia-container-runtime]
19+
#debug = "/var/log/nvidia-container-runtime.log"
20+
debug = "~/.local/nvidia-container-runtime.log"
21+
log-level = "info"
22+
23+
# Specify the runtimes to consider. This list is processed in order and the PATH
24+
# searched for matching executables unless the entry is an absolute path.
25+
runtimes = [
26+
"docker-runc",
27+
"runc",
28+
]
29+
30+
mode = "auto"
31+
32+
[nvidia-container-runtime.modes.csv]
33+
34+
mount-spec-path = "/etc/nvidia-container-runtime/host-files-for-container.d"

ublue-os-nvidia-addons.spec

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
Name: ublue-os-nvidia-addons
2+
Version: 0.2
3+
Release: 1%{?dist}
4+
Summary: Additional files for nvidia driver support
5+
6+
License: MIT
7+
URL: https://github.com/ublue-os/nvidia
8+
9+
BuildArch: noarch
10+
Supplements: mokutil policycoreutils
11+
12+
Source0: public_key.der
13+
Source1: nvidia-container-runtime.repo
14+
Source2: config-rootless.toml
15+
Source3: nvidia-container.pp
16+
17+
%description
18+
Adds various runtime files for nvidia support. These include a key for importing with mokutil to enable secure boot for nvidia kernel modules
19+
20+
%prep
21+
%setup -q -c -T
22+
23+
24+
%install
25+
# Have different name for *.der in case kmodgenca is needed for creating more keys
26+
install -Dm0644 %{SOURCE0} %{buildroot}%{_sysconfdir}/pki/akmods/certs/akmods-nvidia.der
27+
install -Dm0644 %{SOURCE1} %{buildroot}%{_sysconfdir}/yum.repos.d/nvidia-container-runtime.repo
28+
install -Dm0644 %{SOURCE2} %{buildroot}%{_sysconfdir}/nvidia-container-runtime/config-rootless.toml
29+
install -Dm0644 %{SOURCE3} %{buildroot}%{_datadir}/selinux/packages/nvidia-container.pp
30+
31+
sed -i 's@enabled=1@enabled=0@g' %{buildroot}%{_sysconfdir}/yum.repos.d/nvidia-container-runtime.repo
32+
33+
%files
34+
%attr(0644,root,root) %{_sysconfdir}/pki/akmods/certs/akmods-nvidia.der
35+
%attr(0644,root,root) %{_sysconfdir}/yum.repos.d/nvidia-container-runtime.repo
36+
%attr(0644,root,root) %{_sysconfdir}/nvidia-container-runtime/config-rootless.toml
37+
%attr(0644,root,root) %{_datadir}/selinux/packages/nvidia-container.pp
38+
39+
%changelog
40+
* Thu Feb 16 2023 Joshua Stone <joshua.gage.stone@gmail.com> - 0.2
41+
- Add nvidia-container-runtime repo
42+
- Add nvidia-container-runtime selinux policy file
43+
- Re-purpose into a general-purpose add-on package
44+
- Update URL to point to ublue-os project
45+
46+
* Fri Feb 03 2023 Joshua Stone <joshua.gage.stone@gmail.com> - 0.1
47+
- Add key for enrolling kernel modules in alpha builds

0 commit comments

Comments
 (0)