diff --git a/getKernelVersion_darwin.go b/getKernelVersion_darwin.go new file mode 100644 index 0000000000..be3b733b68 --- /dev/null +++ b/getKernelVersion_darwin.go @@ -0,0 +1,9 @@ +package docker + +import ( + "fmt" +) + +func getKernelVersion() (*KernelVersionInfo, error) { + return nil, fmt.Errorf("Kernel version detection is not available on darwin") +} diff --git a/getKernelVersion_linux.go b/getKernelVersion_linux.go new file mode 100644 index 0000000000..04bb1edcb8 --- /dev/null +++ b/getKernelVersion_linux.go @@ -0,0 +1,69 @@ +package docker + +import ( + "bytes" + "strconv" + "strings" + "syscall" +) + +func getKernelVersion() (*KernelVersionInfo, error) { + var ( + uts syscall.Utsname + flavor string + kernel, major, minor int + err error + ) + + if err := syscall.Uname(&uts); err != nil { + return nil, err + } + + release := make([]byte, len(uts.Release)) + + i := 0 + for _, c := range uts.Release { + release[i] = byte(c) + i++ + } + + // Remove the \x00 from the release for Atoi to parse correctly + release = release[:bytes.IndexByte(release, 0)] + + tmp := strings.SplitN(string(release), "-", 2) + tmp2 := strings.SplitN(tmp[0], ".", 3) + + if len(tmp2) > 0 { + kernel, err = strconv.Atoi(tmp2[0]) + if err != nil { + return nil, err + } + } + + if len(tmp2) > 1 { + major, err = strconv.Atoi(tmp2[1]) + if err != nil { + return nil, err + } + } + + if len(tmp2) > 2 { + minor, err = strconv.Atoi(tmp2[2]) + if err != nil { + return nil, err + } + } + + if len(tmp) == 2 { + flavor = tmp[1] + } else { + flavor = "" + } + + return &KernelVersionInfo{ + Kernel: kernel, + Major: major, + Minor: minor, + Flavor: flavor, + }, nil +} diff --git a/runtime.go b/runtime.go index b894a2cdaf..1dfc22d632 100644 --- a/runtime.go +++ b/runtime.go @@ -295,14 +295,13 @@ func NewRuntime() (*Runtime, error) { return nil, err } - k, err := GetKernelVersion() - if err != nil { - return nil, err - } - runtime.kernelVersion = k - - if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 { - log.Printf("WARNING: You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String()) + if k, err := GetKernelVersion(); err != nil { + log.Printf("WARNING: %s\n", err) + } else { + runtime.kernelVersion = k + if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 { + log.Printf("WARNING: You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String()) + } } if cgroupMemoryMountpoint, err := FindCgroupMountpoint("memory"); err != nil { diff --git a/utils.go b/utils.go index a039ca6eb6..5974b7df3b 100644 --- a/utils.go +++ b/utils.go @@ -14,10 +14,8 @@ import ( "path/filepath" "regexp" "runtime" - "strconv" "strings" "sync" - "syscall" "time" ) @@ -407,52 +405,7 @@ type KernelVersionInfo struct { // FIXME: this doens't build on Darwin func GetKernelVersion() (*KernelVersionInfo, error) { - var uts syscall.Utsname - - if err := syscall.Uname(&uts); err != nil { - return nil, err - } - - release := make([]byte, len(uts.Release)) - - i := 0 - for _, c := range uts.Release { - release[i] = byte(c) - i++ - } - - tmp := strings.SplitN(string(release), "-", 2) - if len(tmp) != 2 { - return nil, fmt.Errorf("Unrecognized kernel version") - } - tmp2 := strings.SplitN(tmp[0], ".", 3) - if len(tmp2) != 3 { - return nil, fmt.Errorf("Unrecognized kernel version") - } - - kernel, err := strconv.Atoi(tmp2[0]) - if err != nil { - return nil, err - } - - major, err := strconv.Atoi(tmp2[1]) - if err != nil { - return nil, err - } - - minor, err := strconv.Atoi(tmp2[2]) - if err != nil { - return nil, err - } - - flavor := tmp[1] - - return &KernelVersionInfo{ - Kernel: kernel, - Major: major, - Minor: minor, - Flavor: flavor, - }, nil + return getKernelVersion() } func (k *KernelVersionInfo) String() string {