diff --git a/pkg/os/os.go b/pkg/os/os.go index 9ad7d9474..4f1ae4e28 100644 --- a/pkg/os/os.go +++ b/pkg/os/os.go @@ -45,7 +45,7 @@ type OS interface { Unmount(target string, flags int) error GetMounts() ([]*mount.Info, error) LookupMount(path string) (containerdmount.Info, error) - DeviceUUID(device string) (string, error) + DeviceUUID(device uint64) (string, error) } // RealOS is used to dispatch the real system level operations. @@ -144,14 +144,9 @@ func blkrdev(device string) (uint64, error) { return stat.Rdev, nil } -// DeviceUUID gets device uuid of a device. The passed in device should be -// an absolute path of the device. -func (RealOS) DeviceUUID(device string) (string, error) { - rdev, err := blkrdev(device) - if err != nil { - return "", err - } - +// DeviceUUID gets device uuid of a device. The passed in rdev should be +// linux device number. +func (RealOS) DeviceUUID(rdev uint64) (string, error) { const uuidDir = "/dev/disk/by-uuid" files, err := ioutil.ReadDir(uuidDir) if err != nil { @@ -169,5 +164,5 @@ func (RealOS) DeviceUUID(device string) (string, error) { return file.Name(), nil } } - return "", fmt.Errorf("device %q not found", device) + return "", fmt.Errorf("device %d not found", rdev) } diff --git a/pkg/os/testing/fake_os.go b/pkg/os/testing/fake_os.go index b682eb284..61338241b 100644 --- a/pkg/os/testing/fake_os.go +++ b/pkg/os/testing/fake_os.go @@ -52,7 +52,7 @@ type FakeOS struct { UnmountFn func(target string, flags int) error GetMountsFn func() ([]*mount.Info, error) LookupMountFn func(path string) (containerdmount.Info, error) - DeviceUUIDFn func(device string) (string, error) + DeviceUUIDFn func(device uint64) (string, error) calls []CalledDetail errors map[string]error } @@ -258,7 +258,7 @@ func (f *FakeOS) LookupMount(path string) (containerdmount.Info, error) { } // DeviceUUID is a fake call that invodes DeviceUUIDFn or just return nil. -func (f *FakeOS) DeviceUUID(device string) (string, error) { +func (f *FakeOS) DeviceUUID(device uint64) (string, error) { f.appendCalls("DeviceUUID", device) if err := f.getError("DeviceUUID"); err != nil { return "", err diff --git a/pkg/server/service.go b/pkg/server/service.go index 0a93e234d..4c934ebaa 100644 --- a/pkg/server/service.go +++ b/pkg/server/service.go @@ -34,6 +34,7 @@ import ( runcapparmor "github.com/opencontainers/runc/libcontainer/apparmor" runcseccomp "github.com/opencontainers/runc/libcontainer/seccomp" "golang.org/x/net/context" + "golang.org/x/sys/unix" "google.golang.org/grpc" "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime" "k8s.io/kubernetes/pkg/kubelet/server/streaming" @@ -143,6 +144,7 @@ func NewCRIContainerdService(config options.Config) (CRIContainerdService, error if err != nil { return nil, fmt.Errorf("failed to get imagefs uuid of %q: %v", imageFSPath, err) } + glog.V(2).Infof("Get device uuid %q for image filesystem %q", c.imageFSUUID, imageFSPath) c.netPlugin, err = ocicni.InitCNI(config.NetworkPluginConfDir, config.NetworkPluginBinDir) if err != nil { @@ -243,11 +245,12 @@ func (c *criContainerdService) Stop() { // getDeviceUUID gets device uuid for a given path. func (c *criContainerdService) getDeviceUUID(path string) (string, error) { - info, err := c.os.LookupMount(path) + mount, err := c.os.LookupMount(path) if err != nil { return "", err } - return c.os.DeviceUUID(info.Source) + rdev := unix.Mkdev(uint32(mount.Major), uint32(mount.Minor)) + return c.os.DeviceUUID(rdev) } // imageFSPath returns containerd image filesystem path.