Просмотр исходного кода

Merge pull request #5995 from vieux/recur_nodes

Add device nodes recursively
Michael Crosby 11 лет назад
Родитель
Сommit
3d78c49aab

+ 1 - 1
daemon/execdriver/native/template/default_template.go

@@ -35,7 +35,7 @@ func New() *libcontainer.Container {
 		},
 		},
 		Context:             libcontainer.Context{},
 		Context:             libcontainer.Context{},
 		RequiredDeviceNodes: nodes.DefaultNodes,
 		RequiredDeviceNodes: nodes.DefaultNodes,
-		OptionalDeviceNodes: []string{"fuse"},
+		OptionalDeviceNodes: []string{"/dev/fuse"},
 	}
 	}
 	if apparmor.IsEnabled() {
 	if apparmor.IsEnabled() {
 		container.Context["apparmor_profile"] = "docker-default"
 		container.Context["apparmor_profile"] = "docker-default"

+ 6 - 6
pkg/libcontainer/container.json

@@ -45,11 +45,11 @@
     }
     }
   ],
   ],
   "required_device_nodes": [
   "required_device_nodes": [
-      "null",
-      "zero",
-      "full",
-      "random",
-      "urandom",
-      "tty"
+      "/dev/null",
+      "/dev/zero",
+      "/dev/full",
+      "/dev/random",
+      "/dev/urandom",
+      "/dev/tty"
   ]
   ]
 }
 }

+ 29 - 15
pkg/libcontainer/mount/nodes/nodes.go

@@ -14,12 +14,12 @@ import (
 
 
 // Default list of device nodes to copy
 // Default list of device nodes to copy
 var DefaultNodes = []string{
 var DefaultNodes = []string{
-	"null",
-	"zero",
-	"full",
-	"random",
-	"urandom",
-	"tty",
+	"/dev/null",
+	"/dev/zero",
+	"/dev/full",
+	"/dev/random",
+	"/dev/urandom",
+	"/dev/tty",
 }
 }
 
 
 // CopyN copies the device node from the host into the rootfs
 // CopyN copies the device node from the host into the rootfs
@@ -39,7 +39,7 @@ func CopyN(rootfs string, nodesToCopy []string, shouldExist bool) error {
 // on the host system does not exist and the boolean flag is passed
 // on the host system does not exist and the boolean flag is passed
 // an error will be returned
 // an error will be returned
 func Copy(rootfs, node string, shouldExist bool) error {
 func Copy(rootfs, node string, shouldExist bool) error {
-	stat, err := os.Stat(filepath.Join("/dev", node))
+	stat, err := os.Stat(node)
 	if err != nil {
 	if err != nil {
 		if os.IsNotExist(err) && !shouldExist {
 		if os.IsNotExist(err) && !shouldExist {
 			return nil
 			return nil
@@ -48,27 +48,41 @@ func Copy(rootfs, node string, shouldExist bool) error {
 	}
 	}
 
 
 	var (
 	var (
-		dest = filepath.Join(rootfs, "dev", node)
-		st   = stat.Sys().(*syscall.Stat_t)
+		dest   = filepath.Join(rootfs, node)
+		st     = stat.Sys().(*syscall.Stat_t)
+		parent = filepath.Dir(dest)
 	)
 	)
 
 
+	if err := os.MkdirAll(parent, 0755); err != nil {
+		return err
+	}
+
 	if err := system.Mknod(dest, st.Mode, int(st.Rdev)); err != nil && !os.IsExist(err) {
 	if err := system.Mknod(dest, st.Mode, int(st.Rdev)); err != nil && !os.IsExist(err) {
 		return fmt.Errorf("mknod %s %s", node, err)
 		return fmt.Errorf("mknod %s %s", node, err)
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func GetHostDeviceNodes() ([]string, error) {
-	files, err := ioutil.ReadDir("/dev")
+func getNodes(path string) ([]string, error) {
+	out := []string{}
+	files, err := ioutil.ReadDir(path)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-
-	out := []string{}
 	for _, f := range files {
 	for _, f := range files {
-		if f.Mode()&os.ModeDevice == os.ModeDevice {
-			out = append(out, f.Name())
+		if f.IsDir() && f.Name() != "pts" && f.Name() != "shm" {
+			sub, err := getNodes(filepath.Join(path, f.Name()))
+			if err != nil {
+				return nil, err
+			}
+			out = append(out, sub...)
+		} else if f.Mode()&os.ModeDevice == os.ModeDevice {
+			out = append(out, filepath.Join(path, f.Name()))
 		}
 		}
 	}
 	}
 	return out, nil
 	return out, nil
 }
 }
+
+func GetHostDeviceNodes() ([]string, error) {
+	return getNodes("/dev")
+}