mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-27 12:38:11 +00:00
Merge pull request #214 from rn/squash
Add 'kernel+squashfs' output format
This commit is contained in:
commit
3dbad3b7da
@ -8,6 +8,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/moby/tool/src/pad4"
|
"github.com/moby/tool/src/pad4"
|
||||||
"github.com/surma/gocpio"
|
"github.com/surma/gocpio"
|
||||||
@ -121,26 +122,26 @@ func CopySplitTar(w *Writer, r *tar.Reader) (kernel []byte, cmdline string, ucod
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch thdr.Name {
|
switch {
|
||||||
case "boot/kernel":
|
case thdr.Name == "boot/kernel":
|
||||||
kernel, err = ioutil.ReadAll(r)
|
kernel, err = ioutil.ReadAll(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
case "boot/cmdline":
|
case thdr.Name == "boot/cmdline":
|
||||||
var buf []byte
|
var buf []byte
|
||||||
buf, err = ioutil.ReadAll(r)
|
buf, err = ioutil.ReadAll(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cmdline = string(buf)
|
cmdline = string(buf)
|
||||||
case "boot/ucode.cpio":
|
case thdr.Name == "boot/ucode.cpio":
|
||||||
ucode, err = ioutil.ReadAll(r)
|
ucode, err = ioutil.ReadAll(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
case "boot":
|
case strings.HasPrefix(thdr.Name, "boot/"):
|
||||||
// skip this entry
|
// skip the rest of ./boot
|
||||||
default:
|
default:
|
||||||
_, err = copyTarEntry(w, thdr, r)
|
_, err = copyTarEntry(w, thdr, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func dockerRun(input io.Reader, output io.Writer, trust bool, img string, args ...string) error {
|
func dockerRun(input io.Reader, output io.Writer, trust bool, img string, args ...string) error {
|
||||||
log.Debugf("docker run (input): %s", strings.Join(args, " "))
|
log.Debugf("docker run %s (trust=%t) (input): %s", img, trust, strings.Join(args, " "))
|
||||||
docker, err := exec.LookPath("docker")
|
docker, err := exec.LookPath("docker")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("Docker does not seem to be installed")
|
return errors.New("Docker does not seem to be installed")
|
||||||
@ -38,7 +38,7 @@ func dockerRun(input io.Reader, output io.Writer, trust bool, img string, args .
|
|||||||
pull.Env = env
|
pull.Env = env
|
||||||
if err := pull.Run(); err != nil {
|
if err := pull.Run(); err != nil {
|
||||||
if exitError, ok := err.(*exec.ExitError); ok {
|
if exitError, ok := err.(*exec.ExitError); ok {
|
||||||
return fmt.Errorf("docker pull failed: %v output:\n%s", err, exitError.Stderr)
|
return fmt.Errorf("docker pull %s failed: %v output:\n%s", img, err, exitError.Stderr)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -51,12 +51,12 @@ func dockerRun(input io.Reader, output io.Writer, trust bool, img string, args .
|
|||||||
|
|
||||||
if err := cmd.Run(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
if exitError, ok := err.(*exec.ExitError); ok {
|
if exitError, ok := err.(*exec.ExitError); ok {
|
||||||
return fmt.Errorf("docker run failed: %v output:\n%s", err, exitError.Stderr)
|
return fmt.Errorf("docker run %s failed: %v output:\n%s", img, err, exitError.Stderr)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("docker run (input): %s...Done", strings.Join(args, " "))
|
log.Debugf("docker run %s (input): %s...Done", img, strings.Join(args, " "))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/moby/tool/src/initrd"
|
"github.com/moby/tool/src/initrd"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
@ -19,6 +20,7 @@ var (
|
|||||||
"iso-efi": "linuxkit/mkimage-iso-efi:343cf1a8ac0aba7d8a1f13b7f45fa0b57ab897dc",
|
"iso-efi": "linuxkit/mkimage-iso-efi:343cf1a8ac0aba7d8a1f13b7f45fa0b57ab897dc",
|
||||||
"raw-bios": "linuxkit/mkimage-raw-bios:d90713b2dd610cf9a0f5f9d9095f8bf86f40d5c6",
|
"raw-bios": "linuxkit/mkimage-raw-bios:d90713b2dd610cf9a0f5f9d9095f8bf86f40d5c6",
|
||||||
"raw-efi": "linuxkit/mkimage-raw-efi:8938ffb6014543e557b624a40cce1714f30ce4b6",
|
"raw-efi": "linuxkit/mkimage-raw-efi:8938ffb6014543e557b624a40cce1714f30ce4b6",
|
||||||
|
"squashfs": "linuxkit/mkimage-squashfs:b44d00b0a336fd32c122ff32bd2b39c36a965135",
|
||||||
"gcp": "linuxkit/mkimage-gcp:e6cdcf859ab06134c0c37a64ed5f886ec8dae1a1",
|
"gcp": "linuxkit/mkimage-gcp:e6cdcf859ab06134c0c37a64ed5f886ec8dae1a1",
|
||||||
"qcow2-efi": "linuxkit/mkimage-qcow2-efi:787b54906e14a56b9f1da35dcc8e46bd58435285",
|
"qcow2-efi": "linuxkit/mkimage-qcow2-efi:787b54906e14a56b9f1da35dcc8e46bd58435285",
|
||||||
"vhd": "linuxkit/mkimage-vhd:3820219e5c350fe8ab2ec6a217272ae82f4b9242",
|
"vhd": "linuxkit/mkimage-vhd:3820219e5c350fe8ab2ec6a217272ae82f4b9242",
|
||||||
@ -99,6 +101,13 @@ var outFuns = map[string]func(string, io.Reader, int) error{
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
"kernel+squashfs": func(base string, image io.Reader, size int) error {
|
||||||
|
err := outputKernelSquashFS(outputImages["squashfs"], base, image)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Error writing kernel+squashfs output: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
},
|
||||||
"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)
|
||||||
@ -427,3 +436,57 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin
|
|||||||
}
|
}
|
||||||
return tw.Close()
|
return tw.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func outputKernelSquashFS(image, base string, filesystem io.Reader) error {
|
||||||
|
log.Debugf("output kernel/squashfs: %s %s", image, base)
|
||||||
|
log.Infof(" %s-squashfs.img", base)
|
||||||
|
|
||||||
|
tr := tar.NewReader(filesystem)
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
rootfs := tar.NewWriter(buf)
|
||||||
|
|
||||||
|
for {
|
||||||
|
var thdr *tar.Header
|
||||||
|
thdr, err := tr.Next()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch {
|
||||||
|
case thdr.Name == "boot/kernel":
|
||||||
|
kernel, err := ioutil.ReadAll(tr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(base+"-kernel", kernel, os.FileMode(0644)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case thdr.Name == "boot/cmdline":
|
||||||
|
cmdline, err := ioutil.ReadAll(tr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(base+"-cmdline", cmdline, os.FileMode(0644)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case strings.HasPrefix(thdr.Name, "boot/"):
|
||||||
|
// skip the rest of boot/
|
||||||
|
default:
|
||||||
|
rootfs.WriteHeader(thdr)
|
||||||
|
if _, err := io.Copy(rootfs, tr); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rootfs.Close()
|
||||||
|
|
||||||
|
output, err := os.Create(base + "-squashfs.img")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer output.Close()
|
||||||
|
|
||||||
|
return dockerRun(buf, output, true, image)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user