From 1cc65fe9d09b28a0bec636d581d1f684ff373d43 Mon Sep 17 00:00:00 2001 From: Frederic Crozat Date: Tue, 17 Mar 2026 14:40:05 +0100 Subject: [PATCH] mount /lib/modules from host when using precompiled driver Signed-off-by: Frederic Crozat --- controllers/object_controls.go | 22 +++++++++++++++ controllers/object_controls_test.go | 43 +++++++++++++++++++++++++++++ internal/state/driver_volumes.go | 22 +++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/controllers/object_controls.go b/controllers/object_controls.go index b436bcab1..843309583 100644 --- a/controllers/object_controls.go +++ b/controllers/object_controls.go @@ -3553,6 +3553,28 @@ func transformDriverContainer(obj *appsv1.DaemonSet, config *gpuv1.ClusterPolicy } } + // Mount /lib/modules for precompiled drivers + if config.Driver.UsePrecompiledDrivers() { + n.logger.Info("Mounting /lib/modules into the driver container") + libModulesVolMount := corev1.VolumeMount{ + Name: "lib-modules", + MountPath: "/run/host/lib/modules", + ReadOnly: true, + } + driverContainer.VolumeMounts = append(driverContainer.VolumeMounts, libModulesVolMount) + + libModulesVol := corev1.Volume{ + Name: "lib-modules", + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: "/lib/modules", + Type: ptr.To(corev1.HostPathDirectory), + }, + }, + } + podSpec.Volumes = append(podSpec.Volumes, libModulesVol) + } + // no further repo configuration required when using pre-compiled drivers, return here. if config.Driver.UsePrecompiledDrivers() { return nil diff --git a/controllers/object_controls_test.go b/controllers/object_controls_test.go index f6df7340d..80db14d04 100644 --- a/controllers/object_controls_test.go +++ b/controllers/object_controls_test.go @@ -1883,3 +1883,46 @@ func TestMIGManager(t *testing.T) { }) } } + +// TestDriverPrecompiledLibModules tests that /lib/modules is mounted when precompiled drivers are used +func TestDriverPrecompiledLibModules(t *testing.T) { + cp := getDriverTestInput("precompiled") + output := getDriverTestOutput("precompiled") + + ds, err := testDaemonsetCommon(t, cp, "Driver", output["numDaemonsets"].(int)) + if err != nil { + t.Fatalf("error in testDaemonsetCommon(): %v", err) + } + require.NotNil(t, ds) + + // Check for /lib/modules volume and mount + foundVolume := false + for _, vol := range ds.Spec.Template.Spec.Volumes { + if vol.Name == "lib-modules" { + foundVolume = true + require.NotNil(t, vol.HostPath) + require.Equal(t, "/lib/modules", vol.HostPath.Path) + } + } + require.True(t, foundVolume, "lib-modules volume not found for precompiled drivers") + + foundMount := false + driverContainer := findContainerByName(ds.Spec.Template.Spec.Containers, "nvidia-driver-ctr") + require.NotNil(t, driverContainer) + + for _, mount := range driverContainer.VolumeMounts { + if mount.Name == "lib-modules" { + foundMount = true + require.Equal(t, "/run/host/lib/modules", mount.MountPath) + require.True(t, mount.ReadOnly) + } + } + require.True(t, foundMount, "lib-modules volume mount not found for precompiled drivers") + + // Cleanup + err = removeState(&clusterPolicyController, clusterPolicyController.idx-1) + if err != nil { + t.Fatalf("error removing state %v:", err) + } + clusterPolicyController.idx-- +} diff --git a/internal/state/driver_volumes.go b/internal/state/driver_volumes.go index c9e13b998..2ed1c7074 100644 --- a/internal/state/driver_volumes.go +++ b/internal/state/driver_volumes.go @@ -209,6 +209,28 @@ func (s *stateDriver) getDriverAdditionalConfigs(ctx context.Context, cr *v1alph additionalCfgs.Volumes = append(additionalCfgs.Volumes, subscriptionVol) } } + + // Mount /lib/modules for precompiled drivers + if cr.Spec.UsePrecompiledDrivers() { + logger.Info("Mounting /lib/modules into the driver container") + libModulesVolMount := corev1.VolumeMount{ + Name: "lib-modules", + MountPath: "/run/host/lib/modules", + ReadOnly: true, + } + additionalCfgs.VolumeMounts = append(additionalCfgs.VolumeMounts, libModulesVolMount) + + libModulesVol := corev1.Volume{ + Name: "lib-modules", + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: "/lib/modules", + Type: ptr.To(corev1.HostPathDirectory), + }, + }, + } + additionalCfgs.Volumes = append(additionalCfgs.Volumes, libModulesVol) + } } // mount any custom kernel module configuration parameters at /drivers