mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2024-11-22 16:29:18 +00:00
Add option to create device nodes
This change adds a --create-device-nodes option to the nvidia-ctk system create-dev-char-symlinks command to create device nodes. The currently only creates control device nodes. Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
parent
7b801a0ce0
commit
b64ba6ac2d
@ -44,6 +44,7 @@ type config struct {
|
|||||||
dryRun bool
|
dryRun bool
|
||||||
watch bool
|
watch bool
|
||||||
createAll bool
|
createAll bool
|
||||||
|
createDeviceNodes bool
|
||||||
loadKernelModules bool
|
loadKernelModules bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,6 +106,12 @@ func (m command) build() *cli.Command {
|
|||||||
Destination: &cfg.loadKernelModules,
|
Destination: &cfg.loadKernelModules,
|
||||||
EnvVars: []string{"LOAD_KERNEL_MODULES"},
|
EnvVars: []string{"LOAD_KERNEL_MODULES"},
|
||||||
},
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "create-device-nodes",
|
||||||
|
Usage: "Create the NVIDIA control device nodes in the driver root if they do not exist. This is only applicable when --create-all is set",
|
||||||
|
Destination: &cfg.createDeviceNodes,
|
||||||
|
EnvVars: []string{"CREATE_DEVICE_NODES"},
|
||||||
|
},
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "dry-run",
|
Name: "dry-run",
|
||||||
Usage: "If set, the command will not create any symlinks.",
|
Usage: "If set, the command will not create any symlinks.",
|
||||||
@ -127,6 +134,11 @@ func (m command) validateFlags(r *cli.Context, cfg *config) error {
|
|||||||
cfg.loadKernelModules = false
|
cfg.loadKernelModules = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.createDeviceNodes && !cfg.createAll {
|
||||||
|
m.logger.Warn("create-device-nodes is only applicable when create-all is set; ignoring")
|
||||||
|
cfg.createDeviceNodes = false
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,6 +163,7 @@ func (m command) run(c *cli.Context, cfg *config) error {
|
|||||||
WithDryRun(cfg.dryRun),
|
WithDryRun(cfg.dryRun),
|
||||||
WithCreateAll(cfg.createAll),
|
WithCreateAll(cfg.createAll),
|
||||||
WithLoadKernelModules(cfg.loadKernelModules),
|
WithLoadKernelModules(cfg.loadKernelModules),
|
||||||
|
WithCreateDeviceNodes(cfg.createDeviceNodes),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to create symlink creator: %v", err)
|
return fmt.Errorf("failed to create symlink creator: %v", err)
|
||||||
@ -206,6 +219,7 @@ type linkCreator struct {
|
|||||||
devCharPath string
|
devCharPath string
|
||||||
dryRun bool
|
dryRun bool
|
||||||
createAll bool
|
createAll bool
|
||||||
|
createDeviceNodes bool
|
||||||
loadKernelModules bool
|
loadKernelModules bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,18 +247,9 @@ func NewSymlinkCreator(opts ...Option) (Creator, error) {
|
|||||||
c.devCharPath = defaultDevCharPath
|
c.devCharPath = defaultDevCharPath
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.loadKernelModules {
|
if err := c.setup(); err != nil {
|
||||||
s, err := system.New(
|
|
||||||
system.WithLogger(c.logger),
|
|
||||||
system.WithDryRun(c.dryRun),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := s.LoadNVIDIAKernelModules(); err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to load NVIDIA kernel modules: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.createAll {
|
if c.createAll {
|
||||||
lister, err := newAllPossible(c.logger, c.driverRoot)
|
lister, err := newAllPossible(c.logger, c.driverRoot)
|
||||||
@ -258,6 +263,34 @@ func NewSymlinkCreator(opts ...Option) (Creator, error) {
|
|||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m linkCreator) setup() error {
|
||||||
|
if !m.loadKernelModules && !m.createDeviceNodes {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
s, err := system.New(
|
||||||
|
system.WithLogger(m.logger),
|
||||||
|
system.WithDryRun(m.dryRun),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.loadKernelModules {
|
||||||
|
if err := s.LoadNVIDIAKernelModules(); err != nil {
|
||||||
|
return fmt.Errorf("failed to load NVIDIA kernel modules: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.createDeviceNodes {
|
||||||
|
if err := s.CreateNVIDIAControlDeviceNodesAt(m.driverRoot); err != nil {
|
||||||
|
return fmt.Errorf("failed to create NVIDIA device nodes: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// WithDriverRoot sets the driver root path.
|
// WithDriverRoot sets the driver root path.
|
||||||
func WithDriverRoot(root string) Option {
|
func WithDriverRoot(root string) Option {
|
||||||
return func(c *linkCreator) {
|
return func(c *linkCreator) {
|
||||||
@ -300,6 +333,13 @@ func WithLoadKernelModules(loadKernelModules bool) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithCreateDeviceNodes sets the createDeviceNodes flag for the linkCreator.
|
||||||
|
func WithCreateDeviceNodes(createDeviceNodes bool) Option {
|
||||||
|
return func(lc *linkCreator) {
|
||||||
|
lc.createDeviceNodes = createDeviceNodes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// CreateLinks creates symlinks for all NVIDIA device nodes found in the driver root.
|
// CreateLinks creates symlinks for all NVIDIA device nodes found in the driver root.
|
||||||
func (m linkCreator) CreateLinks() error {
|
func (m linkCreator) CreateLinks() error {
|
||||||
deviceNodes, err := m.lister.DeviceNodes()
|
deviceNodes, err := m.lister.DeviceNodes()
|
||||||
|
Loading…
Reference in New Issue
Block a user