From 2b1a611babe45dbf35fd784a591f6cc98b64c2e3 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Mon, 15 Jan 2018 15:17:31 +0000 Subject: [PATCH] output: Extract ucode if present For now the backends for the different formats do not yet use the extracted ucode cpio archive, but '// TODO' are placed for the backends which should eventually handle it. Signed-off-by: Rolf Neugebauer --- src/initrd/initrd.go | 11 ++++++++--- src/moby/linuxkit.go | 2 +- src/moby/output.go | 32 ++++++++++++++++++-------------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/initrd/initrd.go b/src/initrd/initrd.go index d479fdf42..2a4a27a06 100644 --- a/src/initrd/initrd.go +++ b/src/initrd/initrd.go @@ -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 -func CopySplitTar(w *Writer, r *tar.Reader) (kernel []byte, cmdline string, err error) { +// 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, ucode []byte, err error) { for { var thdr *tar.Header thdr, err = r.Next() if err == io.EOF { - return kernel, cmdline, nil + return kernel, cmdline, ucode, nil } if err != nil { return @@ -134,6 +134,11 @@ func CopySplitTar(w *Writer, r *tar.Reader) (kernel []byte, cmdline string, err return } cmdline = string(buf) + case "boot/ucode.cpio": + ucode, err = ioutil.ReadAll(r) + if err != nil { + return + } case "boot": // skip this entry default: diff --git a/src/moby/linuxkit.go b/src/moby/linuxkit.go index 67449e372..bc15a0896 100644 --- a/src/moby/linuxkit.go +++ b/src/moby/linuxkit.go @@ -72,7 +72,7 @@ func ensureLinuxkitImage(name string) error { return err } defer image.Close() - kernel, initrd, cmdline, err := tarToInitrd(image) + kernel, initrd, cmdline, _, err := tarToInitrd(image) if err != nil { return fmt.Errorf("Error converting to initrd: %v", err) } diff --git a/src/moby/output.go b/src/moby/output.go index 5cd649104..ed8d57426 100644 --- a/src/moby/output.go +++ b/src/moby/output.go @@ -27,10 +27,11 @@ const ( var outFuns = map[string]func(string, io.Reader, int) error{ "kernel+initrd": func(base string, image io.Reader, size int) error { - kernel, initrd, cmdline, err := tarToInitrd(image) + kernel, initrd, cmdline, _, err := tarToInitrd(image) if err != nil { return fmt.Errorf("Error converting to initrd: %v", err) } + // TODO: Handle ucode err = outputKernelInitrd(base, kernel, initrd, cmdline) if err != nil { return fmt.Errorf("Error writing kernel+initrd output: %v", err) @@ -38,10 +39,11 @@ var outFuns = map[string]func(string, io.Reader, int) error{ return nil }, "tar-kernel-initrd": func(base string, image io.Reader, size int) error { - kernel, initrd, cmdline, err := tarToInitrd(image) + kernel, initrd, cmdline, _, err := tarToInitrd(image) if err != nil { return fmt.Errorf("Error converting to initrd: %v", err) } + // TODO: Handle ucode if err := outputKernelInitrdTarball(base, kernel, initrd, cmdline); err != nil { return fmt.Errorf("Error writing kernel+initrd tarball output: %v", err) } @@ -62,10 +64,11 @@ var outFuns = map[string]func(string, io.Reader, int) error{ return nil }, "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 { return fmt.Errorf("Error converting to initrd: %v", err) } + // TODO: Handle ucode err = outputImg(rawBios, base+"-bios.img", kernel, initrd, cmdline) if err != nil { return fmt.Errorf("Error writing raw-bios output: %v", err) @@ -73,7 +76,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{ return nil }, "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 { return fmt.Errorf("Error converting to initrd: %v", err) } @@ -86,7 +89,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{ "aws": func(base string, image io.Reader, size int) error { filename := base + ".raw" log.Infof(" %s", filename) - kernel, initrd, cmdline, err := tarToInitrd(image) + kernel, initrd, cmdline, _, err := tarToInitrd(image) if err != nil { return fmt.Errorf("Error converting to initrd: %v", err) } @@ -97,7 +100,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{ return nil }, "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 { return fmt.Errorf("Error converting to initrd: %v", err) } @@ -110,10 +113,11 @@ var outFuns = map[string]func(string, io.Reader, int) error{ "qcow2-bios": func(base string, image io.Reader, size int) error { filename := base + ".qcow2" log.Infof(" %s", filename) - kernel, initrd, cmdline, err := tarToInitrd(image) + kernel, initrd, cmdline, _, err := tarToInitrd(image) if err != nil { return fmt.Errorf("Error converting to initrd: %v", err) } + // TODO: Handle ucode err = outputLinuxKit("qcow2", filename, kernel, initrd, cmdline, size) if err != nil { return fmt.Errorf("Error writing qcow2 output: %v", err) @@ -121,7 +125,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{ return nil }, "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 { return fmt.Errorf("Error converting to initrd: %v", err) } @@ -132,7 +136,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{ return nil }, "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 { return fmt.Errorf("Error converting to initrd: %v", err) } @@ -143,7 +147,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{ return nil }, "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 { return fmt.Errorf("Error converting to initrd: %v", err) } @@ -220,16 +224,16 @@ func Formats(base string, image string, formats []string, size int) error { 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) iw := initrd.NewWriter(w) tr := tar.NewReader(r) - kernel, cmdline, err := initrd.CopySplitTar(iw, tr) + kernel, cmdline, ucode, err := initrd.CopySplitTar(iw, tr) if err != nil { - return []byte{}, []byte{}, "", err + return []byte{}, []byte{}, "", []byte{}, err } 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) {