vendor: Update moby tool to latest

This includes support for CPU microcode handling

Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
This commit is contained in:
Rolf Neugebauer 2018-01-15 17:28:58 +00:00
parent c0ff9cf6f0
commit 63ec7f58c0
7 changed files with 112 additions and 43 deletions

View File

@ -26,7 +26,7 @@ github.com/moby/datakit 97b3d230535397a813323902c23751e176481a86
github.com/moby/hyperkit a12cd7250bcd8d689078e3e42ae4a7cf6a0cbaf3 github.com/moby/hyperkit a12cd7250bcd8d689078e3e42ae4a7cf6a0cbaf3
# When updating also: # When updating also:
# curl -fsSL -o src/cmd/linuxkit/build.go https://raw.githubusercontent.com/moby/tool/«hash»/cmd/moby/build.go # curl -fsSL -o src/cmd/linuxkit/build.go https://raw.githubusercontent.com/moby/tool/«hash»/cmd/moby/build.go
github.com/moby/tool f816553d2fc58638f6904fddedd13c36d237b498 github.com/moby/tool 57b6e2ab947104d47fd60e5af0e34d0edeb9421c
github.com/moby/vpnkit 0e4293bb1058598c4b0a406ed171f52573ef414c github.com/moby/vpnkit 0e4293bb1058598c4b0a406ed171f52573ef414c
github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448 github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448
github.com/opencontainers/image-spec v1.0.0 github.com/opencontainers/image-spec v1.0.0

View File

@ -110,13 +110,13 @@ func CopyTar(w *Writer, r *tar.Reader) (written int64, err error) {
} }
} }
// CopySplitTar copies a tar stream into an initrd, but splits out kernel and cmdline // CopySplitTar copies a tar stream into an initrd, but splits out kernel, cmdline, and ucode
func CopySplitTar(w *Writer, r *tar.Reader) (kernel []byte, cmdline string, err error) { func CopySplitTar(w *Writer, r *tar.Reader) (kernel []byte, cmdline string, ucode []byte, err error) {
for { for {
var thdr *tar.Header var thdr *tar.Header
thdr, err = r.Next() thdr, err = r.Next()
if err == io.EOF { if err == io.EOF {
return kernel, cmdline, nil return kernel, cmdline, ucode, nil
} }
if err != nil { if err != nil {
return return
@ -134,6 +134,11 @@ func CopySplitTar(w *Writer, r *tar.Reader) (kernel []byte, cmdline string, err
return return
} }
cmdline = string(buf) cmdline = string(buf)
case "boot/ucode.cpio":
ucode, err = ioutil.ReadAll(r)
if err != nil {
return
}
case "boot": case "boot":
// skip this entry // skip this entry
default: default:

View File

@ -176,9 +176,9 @@ func Build(m Moby, w io.Writer, pull bool, tp string) error {
dupMap := map[string]string{} dupMap := map[string]string{}
if m.Kernel.ref != nil { if m.Kernel.ref != nil {
// get kernel and initrd tarball from container // get kernel and initrd tarball and ucode cpio archive from container
log.Infof("Extract kernel image: %s", m.Kernel.ref) log.Infof("Extract kernel image: %s", m.Kernel.ref)
kf := newKernelFilter(iw, m.Kernel.Cmdline, m.Kernel.Binary, m.Kernel.Tar) kf := newKernelFilter(iw, m.Kernel.Cmdline, m.Kernel.Binary, m.Kernel.Tar, m.Kernel.UCode)
err := ImageTar(m.Kernel.ref, "", kf, enforceContentTrust(m.Kernel.ref.String(), &m.Trust), pull, "") err := ImageTar(m.Kernel.ref, "", kf, enforceContentTrust(m.Kernel.ref.String(), &m.Trust), pull, "")
if err != nil { if err != nil {
return fmt.Errorf("Failed to extract kernel image and tarball: %v", err) return fmt.Errorf("Failed to extract kernel image and tarball: %v", err)
@ -259,13 +259,15 @@ type kernelFilter struct {
cmdline string cmdline string
kernel string kernel string
tar string tar string
ucode string
discard bool discard bool
foundKernel bool foundKernel bool
foundKTar bool foundKTar bool
foundUCode bool
} }
func newKernelFilter(tw *tar.Writer, cmdline string, kernel string, tar *string) *kernelFilter { func newKernelFilter(tw *tar.Writer, cmdline string, kernel string, tar, ucode *string) *kernelFilter {
tarName, kernelName := "kernel.tar", "kernel" tarName, kernelName, ucodeName := "kernel.tar", "kernel", ""
if tar != nil { if tar != nil {
tarName = *tar tarName = *tar
if tarName == "none" { if tarName == "none" {
@ -275,7 +277,10 @@ func newKernelFilter(tw *tar.Writer, cmdline string, kernel string, tar *string)
if kernel != "" { if kernel != "" {
kernelName = kernel kernelName = kernel
} }
return &kernelFilter{tw: tw, cmdline: cmdline, kernel: kernelName, tar: tarName} if ucode != nil {
ucodeName = *ucode
}
return &kernelFilter{tw: tw, cmdline: cmdline, kernel: kernelName, tar: tarName, ucode: ucodeName}
} }
func (k *kernelFilter) finishTar() error { func (k *kernelFilter) finishTar() error {
@ -329,16 +334,19 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error {
} }
k.foundKernel = true k.foundKernel = true
k.discard = false k.discard = false
whdr := &tar.Header{ // If we handled the ucode, /boot already exist.
Name: "boot", if !k.foundUCode {
Mode: 0755, whdr := &tar.Header{
Typeflag: tar.TypeDir, Name: "boot",
} Mode: 0755,
if err := tw.WriteHeader(whdr); err != nil { Typeflag: tar.TypeDir,
return err }
if err := tw.WriteHeader(whdr); err != nil {
return err
}
} }
// add the cmdline in /boot/cmdline // add the cmdline in /boot/cmdline
whdr = &tar.Header{ whdr := &tar.Header{
Name: "boot/cmdline", Name: "boot/cmdline",
Mode: 0644, Mode: 0644,
Size: int64(len(k.cmdline)), Size: int64(len(k.cmdline)),
@ -363,6 +371,28 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error {
k.foundKTar = true k.foundKTar = true
k.discard = false k.discard = false
k.buffer = new(bytes.Buffer) k.buffer = new(bytes.Buffer)
case k.ucode:
k.foundUCode = true
k.discard = false
// If we handled the kernel, /boot already exist.
if !k.foundKernel {
whdr := &tar.Header{
Name: "boot",
Mode: 0755,
Typeflag: tar.TypeDir,
}
if err := tw.WriteHeader(whdr); err != nil {
return err
}
}
whdr := &tar.Header{
Name: "boot/ucode.cpio",
Mode: hdr.Mode,
Size: hdr.Size,
}
if err := tw.WriteHeader(whdr); err != nil {
return err
}
default: default:
k.discard = true k.discard = true
} }

View File

@ -36,6 +36,7 @@ type KernelConfig struct {
Cmdline string `yaml:"cmdline,omitempty" json:"cmdline,omitempty"` Cmdline string `yaml:"cmdline,omitempty" json:"cmdline,omitempty"`
Binary string `yaml:"binary,omitempty" json:"binary,omitempty"` Binary string `yaml:"binary,omitempty" json:"binary,omitempty"`
Tar *string `yaml:"tar,omitempty" json:"tar,omitempty"` Tar *string `yaml:"tar,omitempty" json:"tar,omitempty"`
UCode *string `yaml:"ucode,omitempty" json:"ucode,omitempty"`
ref *reference.Spec ref *reference.Spec
} }
@ -289,6 +290,9 @@ func AppendConfig(m0, m1 Moby) (Moby, error) {
if m1.Kernel.Tar != nil { if m1.Kernel.Tar != nil {
moby.Kernel.Tar = m1.Kernel.Tar moby.Kernel.Tar = m1.Kernel.Tar
} }
if m1.Kernel.UCode != nil {
moby.Kernel.UCode = m1.Kernel.UCode
}
if m1.Kernel.ref != nil { if m1.Kernel.ref != nil {
moby.Kernel.ref = m1.Kernel.ref moby.Kernel.ref = m1.Kernel.ref
} }

View File

@ -72,7 +72,7 @@ func ensureLinuxkitImage(name string) error {
return err return err
} }
defer image.Close() defer image.Close()
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }

View File

@ -27,22 +27,22 @@ const (
var outFuns = map[string]func(string, io.Reader, int) error{ var outFuns = map[string]func(string, io.Reader, int) error{
"kernel+initrd": func(base string, image io.Reader, size int) error { "kernel+initrd": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, ucode, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
err = outputKernelInitrd(base, kernel, initrd, cmdline) err = outputKernelInitrd(base, kernel, initrd, cmdline, ucode)
if err != nil { if err != nil {
return fmt.Errorf("Error writing kernel+initrd output: %v", err) return fmt.Errorf("Error writing kernel+initrd output: %v", err)
} }
return nil return nil
}, },
"tar-kernel-initrd": func(base string, image io.Reader, size int) error { "tar-kernel-initrd": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, ucode, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
if err := outputKernelInitrdTarball(base, kernel, initrd, cmdline); err != nil { if err := outputKernelInitrdTarball(base, kernel, initrd, cmdline, ucode); err != nil {
return fmt.Errorf("Error writing kernel+initrd tarball output: %v", err) return fmt.Errorf("Error writing kernel+initrd tarball output: %v", err)
} }
return nil return nil
@ -62,10 +62,11 @@ var outFuns = map[string]func(string, io.Reader, int) error{
return nil return nil
}, },
"raw-bios": func(base string, image io.Reader, size int) error { "raw-bios": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
// TODO: Handle ucode
err = outputImg(rawBios, base+"-bios.img", kernel, initrd, cmdline) err = outputImg(rawBios, base+"-bios.img", kernel, initrd, cmdline)
if err != nil { if err != nil {
return fmt.Errorf("Error writing raw-bios output: %v", err) return fmt.Errorf("Error writing raw-bios output: %v", err)
@ -73,7 +74,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{
return nil return nil
}, },
"raw-efi": func(base string, image io.Reader, size int) error { "raw-efi": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
@ -86,7 +87,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{
"aws": func(base string, image io.Reader, size int) error { "aws": func(base string, image io.Reader, size int) error {
filename := base + ".raw" filename := base + ".raw"
log.Infof(" %s", filename) log.Infof(" %s", filename)
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
@ -97,7 +98,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{
return nil return nil
}, },
"gcp": func(base string, image io.Reader, size int) error { "gcp": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
@ -110,10 +111,11 @@ var outFuns = map[string]func(string, io.Reader, int) error{
"qcow2-bios": func(base string, image io.Reader, size int) error { "qcow2-bios": func(base string, image io.Reader, size int) error {
filename := base + ".qcow2" filename := base + ".qcow2"
log.Infof(" %s", filename) log.Infof(" %s", filename)
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
// TODO: Handle ucode
err = outputLinuxKit("qcow2", filename, kernel, initrd, cmdline, size) err = outputLinuxKit("qcow2", filename, kernel, initrd, cmdline, size)
if err != nil { if err != nil {
return fmt.Errorf("Error writing qcow2 output: %v", err) return fmt.Errorf("Error writing qcow2 output: %v", err)
@ -121,7 +123,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{
return nil return nil
}, },
"vhd": func(base string, image io.Reader, size int) error { "vhd": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
@ -132,7 +134,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{
return nil return nil
}, },
"dynamic-vhd": func(base string, image io.Reader, size int) error { "dynamic-vhd": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
@ -143,7 +145,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{
return nil return nil
}, },
"vmdk": func(base string, image io.Reader, size int) error { "vmdk": func(base string, image io.Reader, size int) error {
kernel, initrd, cmdline, err := tarToInitrd(image) kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil { if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err) return fmt.Errorf("Error converting to initrd: %v", err)
} }
@ -220,16 +222,16 @@ func Formats(base string, image string, formats []string, size int) error {
return nil return nil
} }
func tarToInitrd(r io.Reader) ([]byte, []byte, string, error) { func tarToInitrd(r io.Reader) ([]byte, []byte, string, []byte, error) {
w := new(bytes.Buffer) w := new(bytes.Buffer)
iw := initrd.NewWriter(w) iw := initrd.NewWriter(w)
tr := tar.NewReader(r) tr := tar.NewReader(r)
kernel, cmdline, err := initrd.CopySplitTar(iw, tr) kernel, cmdline, ucode, err := initrd.CopySplitTar(iw, tr)
if err != nil { if err != nil {
return []byte{}, []byte{}, "", err return []byte{}, []byte{}, "", []byte{}, err
} }
iw.Close() iw.Close()
return kernel, w.Bytes(), cmdline, nil return kernel, w.Bytes(), cmdline, ucode, nil
} }
func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, error) { func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, error) {
@ -314,21 +316,35 @@ func outputRPi3(image, filename string, filesystem io.Reader) error {
return dockerRun(filesystem, output, true, image) return dockerRun(filesystem, output, true, image)
} }
func outputKernelInitrd(base string, kernel []byte, initrd []byte, cmdline string) error { func outputKernelInitrd(base string, kernel []byte, initrd []byte, cmdline string, ucode []byte) error {
log.Debugf("output kernel/initrd: %s %s", base, cmdline) log.Debugf("output kernel/initrd: %s %s", base, cmdline)
log.Infof(" %s %s %s", base+"-kernel", base+"-initrd.img", base+"-cmdline")
err := ioutil.WriteFile(base+"-initrd.img", initrd, os.FileMode(0644)) if len(ucode) != 0 {
if err != nil { log.Infof(" %s ucode+%s %s", base+"-kernel", base+"-initrd.img", base+"-cmdline")
return err if err := ioutil.WriteFile(base+"-initrd.img", ucode, os.FileMode(0644)); err != nil {
return err
}
f, err := os.OpenFile(base+"-initrd.img", os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return err
}
defer f.Close()
if _, err = f.Write(initrd); err != nil {
return err
}
} else {
log.Infof(" %s %s %s", base+"-kernel", base+"-initrd.img", base+"-cmdline")
if err := ioutil.WriteFile(base+"-initrd.img", initrd, os.FileMode(0644)); err != nil {
return err
}
} }
err = ioutil.WriteFile(base+"-kernel", kernel, os.FileMode(0644)) if err := ioutil.WriteFile(base+"-kernel", kernel, os.FileMode(0644)); err != nil {
if err != nil {
return err return err
} }
return ioutil.WriteFile(base+"-cmdline", []byte(cmdline), os.FileMode(0644)) return ioutil.WriteFile(base+"-cmdline", []byte(cmdline), os.FileMode(0644))
} }
func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdline string) error { func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdline string, ucode []byte) error {
log.Debugf("output kernel/initrd tarball: %s %s", base, cmdline) log.Debugf("output kernel/initrd tarball: %s %s", base, cmdline)
log.Infof(" %s", base+"-initrd.tar") log.Infof(" %s", base+"-initrd.tar")
f, err := os.Create(base + "-initrd.tar") f, err := os.Create(base + "-initrd.tar")
@ -370,5 +386,18 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin
if _, err := tw.Write([]byte(cmdline)); err != nil { if _, err := tw.Write([]byte(cmdline)); err != nil {
return err return err
} }
if len(ucode) != 0 {
hdr := &tar.Header{
Name: "ucode.cpio",
Mode: 0644,
Size: int64(len(ucode)),
}
if err := tw.WriteHeader(hdr); err != nil {
return err
}
if _, err := tw.Write(ucode); err != nil {
return err
}
}
return tw.Close() return tw.Close()
} }

View File

@ -13,7 +13,8 @@ var schema = string(`
"image": {"type": "string"}, "image": {"type": "string"},
"cmdline": {"type": "string"}, "cmdline": {"type": "string"},
"binary": {"type": "string"}, "binary": {"type": "string"},
"tar": {"type": "string"} "tar": {"type": "string"},
"ucode": {"type": "string"}
} }
}, },
"file": { "file": {