From 8a3ae66f64df316c1cd214dcb2d5f2af776fff52 Mon Sep 17 00:00:00 2001 From: Tycho Andersen Date: Tue, 7 Mar 2017 14:39:22 -0800 Subject: [PATCH 1/3] hoist kernel command line out of qemu docker image we want to fiddle with this for selinux, and probably for other things too. Signed-off-by: Tycho Andersen --- scripts/qemu.sh | 4 ++-- tools/qemu/qemu.sh | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/qemu.sh b/scripts/qemu.sh index d4d4ed6d4..a04a45b77 100755 --- a/scripts/qemu.sh +++ b/scripts/qemu.sh @@ -1,6 +1,6 @@ #!/bin/sh -QEMU_IMAGE=mobylinux/qemu:156d2160c2ccf4d5118221bc2708f6c0981d54cc@sha256:e1345ba0400d6c45bf3bdf4f4ed425c3d7596d11e6553b83f17f5893dfc49f7b +QEMU_IMAGE=mobylinux/qemu:2e63db70759e37de6f9cc5cdf67c15f3aa8373c8@sha256:958c6bb1fca426cadf7a3664b8c019eba9f9e2ad4f6b4f3ed02d766fe5e709e4 # if not interactive if [ ! -t 0 -a -z "$1" ] @@ -32,4 +32,4 @@ BASE=$(basename "$FILE") MOUNTS="-v $FILE:/tmp/$BASE" BASE2=$(basename "$FILE2") [ ! -z "$FILE2" ] && MOUNTS="$MOUNTS -v $FILE2:/tmp/$BASE2" -docker run -it --rm $MOUNTS "$QEMU_IMAGE" +docker run -it --rm $MOUNTS "$QEMU_IMAGE" console=ttyS0 diff --git a/tools/qemu/qemu.sh b/tools/qemu/qemu.sh index a1353771d..ebc28b282 100755 --- a/tools/qemu/qemu.sh +++ b/tools/qemu/qemu.sh @@ -30,7 +30,7 @@ then then ARGS="$ARGS -initrd $INITRD" fi - ARGS="$ARGS -append console=ttyS0 -drive file=systemdisk.img,format=raw" + ARGS="$ARGS -drive file=systemdisk.img,format=raw" else echo "no recognised boot media" >2 exit 1 @@ -38,4 +38,10 @@ fi echo "$ARGS" | grep -q systemdisk && qemu-img create -f raw systemdisk.img 256M -qemu-system-x86_64 -device virtio-rng-pci -serial stdio -vnc none -m 1024 $ARGS $* +CMDLINE="$*" +if [ -z "${CMDLINE}" ] +then + CMDLINE="console=ttyS0" +fi + +qemu-system-x86_64 -device virtio-rng-pci -serial stdio -vnc none -m 1024 -append "${CMDLINE}" $ARGS From a383e6bb465c4e4f35bb5d45161992944c021743 Mon Sep 17 00:00:00 2001 From: Tycho Andersen Date: Wed, 8 Mar 2017 11:09:31 -0800 Subject: [PATCH 2/3] hoist kernel cmdline into moby.yaml Signed-off-by: Tycho Andersen --- Makefile | 10 +++---- config.go | 5 +++- main.go | 47 ++++++++++++++++++++----------- moby.yaml | 4 ++- output.go | 12 ++++---- scripts/hyperkit.sh | 3 +- scripts/qemu.sh | 3 +- test.yaml | 4 ++- tools/mkimage-iso-bios/Dockerfile | 2 +- tools/mkimage-iso-bios/make-iso | 3 +- tools/mkimage-iso-efi/Dockerfile | 2 +- tools/mkimage-iso-efi/make-efi | 6 ++-- 12 files changed, 60 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index 657d3d145..d7c5aa448 100644 --- a/Makefile +++ b/Makefile @@ -26,8 +26,8 @@ test-bzImage: test-initrd.img # interactive versions need to use volume mounts .PHONY: qemu qemu-iso -qemu: moby-initrd.img moby-bzImage - ./scripts/qemu.sh $^ +qemu: moby-initrd.img moby-bzImage bin/moby moby.yaml + ./scripts/qemu.sh moby-initrd.img moby-bzImage "$(shell bin/moby --cmdline moby.yaml)" qemu-iso: alpine/mobylinux-bios.iso ./scripts/qemu.sh $^ @@ -56,8 +56,8 @@ else endif .PHONY: hyperkit hyperkit-test -hyperkit: scripts/hyperkit.sh bin/com.docker.hyperkit bin/vpnkit moby-initrd.img moby-bzImage - ./scripts/hyperkit.sh moby +hyperkit: scripts/hyperkit.sh bin/com.docker.hyperkit bin/vpnkit moby-initrd.img moby-bzImage moby.yaml + ./scripts/hyperkit.sh moby "$(shell bin/moby --cmdline moby.yaml)" define check_test_log @cat $1 |grep -q 'Moby test suite PASSED' @@ -65,7 +65,7 @@ endef hyperkit-test: scripts/hyperkit.sh bin/com.docker.hyperkit bin/vpnkit test-initrd.img test-bzImage rm -f disk.img - script -q /dev/null ./scripts/hyperkit.sh test | tee test.log + script -q /dev/null ./scripts/hyperkit.sh test "$(shell bin/moby --cmdline moby.yaml)" | tee test.log $(call check_test_log, test.log) .PHONY: test diff --git a/config.go b/config.go index 37a2bc345..d086d2d58 100644 --- a/config.go +++ b/config.go @@ -14,7 +14,10 @@ import ( // Moby is the type of a Moby config file type Moby struct { - Kernel string + Kernel struct { + Image string + Cmdline string + } Init string System []MobyImage Daemon []MobyImage diff --git a/main.go b/main.go index 33f92e677..9ef5d9dfc 100644 --- a/main.go +++ b/main.go @@ -4,11 +4,11 @@ import ( "archive/tar" "bytes" "errors" + "flag" "fmt" "io" "io/ioutil" "log" - "os" "os/exec" "path/filepath" @@ -129,17 +129,7 @@ func containersInitrd(containers []*bytes.Buffer) (*bytes.Buffer, error) { return w, nil } -func build(configfile string) { - config, err := ioutil.ReadFile(configfile) - if err != nil { - log.Fatalf("Cannot open config file: %v", err) - } - - m, err := NewConfig(config) - if err != nil { - log.Fatalf("Invalid config: %v", err) - } - +func build(m *Moby) { containers := []*bytes.Buffer{} // get kernel bzImage and initrd tarball from container @@ -148,7 +138,7 @@ func build(configfile string) { bzimageName = "bzImage" ktarName = "kernel.tar" ) - out, err := dockerRun(m.Kernel, "tar", "cf", "-", bzimageName, ktarName) + out, err := dockerRun(m.Kernel.Image, "tar", "cf", "-", bzimageName, ktarName) if err != nil { log.Fatalf("Failed to extract kernel image and tarball: %v", err) } @@ -211,11 +201,34 @@ func build(configfile string) { } } -var conf = "moby.yaml" +var ( + conf string + cmdline bool +) func main() { - if len(os.Args) >= 2 { - conf = os.Args[1] + flag.BoolVar(&cmdline, "cmdline", false, "Print the kernel command line and exit") + flag.Parse() + + conf = "moby.yaml" + if len(flag.Args()) > 0 { + conf = flag.Args()[0] } - build(conf) + + config, err := ioutil.ReadFile(conf) + if err != nil { + log.Fatalf("Cannot open config file: %v", err) + } + + m, err := NewConfig(config) + if err != nil { + log.Fatalf("Invalid config: %v", err) + } + + if cmdline { + fmt.Printf("%s\n", m.Kernel.Cmdline) + return + } + + build(m) } diff --git a/moby.yaml b/moby.yaml index cc993cd8e..8f96526bc 100644 --- a/moby.yaml +++ b/moby.yaml @@ -1,4 +1,6 @@ -kernel: "mobylinux/kernel:598481c08deafa37dccb33c88ad69fdecda57909" +kernel: + image: "mobylinux/kernel:598481c08deafa37dccb33c88ad69fdecda57909" + cmdline: "console=ttyS0 page_poison=1" init: "mobylinux/init:2f1b5c1be1157cb17e5b1e6dee171dccdebb5277" system: - name: sysctl diff --git a/output.go b/output.go index 34f8e92c5..95f4cdb8c 100644 --- a/output.go +++ b/output.go @@ -9,8 +9,8 @@ import ( ) const ( - bios = "mobylinux/mkimage-iso-bios:6b3ef6d6bdcc5fdf2ee683febac99533c2268c89@sha256:2484146c4dfbd2eee83d9dd3adf84d9232e5dd739d8762275dcd50bf60a529c6" - efi = "mobylinux/mkimage-iso-efi:40f35270037dae95584324427e56f829756ff145@sha256:ae5b37ae560a5e030342f3d493d4ad611f2694bcd54eba86bf42ca069da986a7" + bios = "mobylinux/mkimage-iso-bios:489b1f054a77a8f379d0bfc6cd91639b4db6b67c@sha256:0f058951aac4367d132682aa19eeb5cdcb05600a5d51fe5d0fcbd97b03ae4f87" + efi = "mobylinux/mkimage-iso-efi:b210c58e096e53082d35b28fa2b52dba6ae200c8@sha256:10c2789bf5fbd27c35c5fe2f3b97f75a7108bbde389d0f5ed750e3e2dae95376" ) func outputs(m *Moby, base string, bzimage []byte, initrd []byte) error { @@ -22,12 +22,12 @@ func outputs(m *Moby, base string, bzimage []byte, initrd []byte) error { return fmt.Errorf("Error writing %s output: %v", o.Format, err) } case "iso-bios": - err := outputISO(bios, base+".iso", bzimage, initrd) + err := outputISO(bios, base+".iso", bzimage, initrd, m.Kernel.Cmdline) if err != nil { return fmt.Errorf("Error writing %s output: %v", o.Format, err) } case "iso-efi": - err := outputISO(efi, base+"-efi.iso", bzimage, initrd) + err := outputISO(efi, base+"-efi.iso", bzimage, initrd, m.Kernel.Cmdline) if err != nil { return fmt.Errorf("Error writing %s output: %v", o.Format, err) } @@ -41,7 +41,7 @@ func outputs(m *Moby, base string, bzimage []byte, initrd []byte) error { } // TODO add kernel command line -func outputISO(image, filename string, bzimage []byte, initrd []byte) error { +func outputISO(image, filename string, bzimage []byte, initrd []byte, args ...string) error { // first build the input tarball from kernel and initrd buf := new(bytes.Buffer) tw := tar.NewWriter(buf) @@ -75,7 +75,7 @@ func outputISO(image, filename string, bzimage []byte, initrd []byte) error { if err != nil { return err } - iso, err := dockerRunInput(buf, image) + iso, err := dockerRunInput(buf, append([]string{image}, args...)...) if err != nil { return err } diff --git a/scripts/hyperkit.sh b/scripts/hyperkit.sh index 4a6bc9c13..4521bf4ed 100755 --- a/scripts/hyperkit.sh +++ b/scripts/hyperkit.sh @@ -7,8 +7,7 @@ PREFIX="moby" KERNEL="$PREFIX-bzImage" INITRD="$PREFIX-initrd.img" - -CMDLINE="earlyprintk=serial console=ttyS0" +CMDLINE="$2" SLIRP_SOCK="$HOME/Library/Containers/com.docker.docker/Data/s50" diff --git a/scripts/qemu.sh b/scripts/qemu.sh index a04a45b77..c4c790d9f 100755 --- a/scripts/qemu.sh +++ b/scripts/qemu.sh @@ -12,6 +12,7 @@ fi FILE=$1 FILE2=$2 +CMDLINE=$3 [ -z "$FILE" ] && FILE="$PWD/moby" BASE=$(basename "$FILE") @@ -32,4 +33,4 @@ BASE=$(basename "$FILE") MOUNTS="-v $FILE:/tmp/$BASE" BASE2=$(basename "$FILE2") [ ! -z "$FILE2" ] && MOUNTS="$MOUNTS -v $FILE2:/tmp/$BASE2" -docker run -it --rm $MOUNTS "$QEMU_IMAGE" console=ttyS0 +docker run -it --rm $MOUNTS "$QEMU_IMAGE" $CMDLINE diff --git a/test.yaml b/test.yaml index 7912eaec4..68ad67590 100644 --- a/test.yaml +++ b/test.yaml @@ -1,4 +1,6 @@ -kernel: "mobylinux/kernel:598481c08deafa37dccb33c88ad69fdecda57909" +kernel: + image: "mobylinux/kernel:598481c08deafa37dccb33c88ad69fdecda57909" + cmdline: "console=ttyS0" init: "mobylinux/init:2f1b5c1be1157cb17e5b1e6dee171dccdebb5277" system: - name: binfmt diff --git a/tools/mkimage-iso-bios/Dockerfile b/tools/mkimage-iso-bios/Dockerfile index 691c8d10c..f49ee54e8 100644 --- a/tools/mkimage-iso-bios/Dockerfile +++ b/tools/mkimage-iso-bios/Dockerfile @@ -10,4 +10,4 @@ RUN \ COPY . . -CMD [ "/make-iso" ] +ENTRYPOINT [ "/make-iso" ] diff --git a/tools/mkimage-iso-bios/make-iso b/tools/mkimage-iso-bios/make-iso index e32f321c3..54daf237d 100755 --- a/tools/mkimage-iso-bios/make-iso +++ b/tools/mkimage-iso-bios/make-iso @@ -14,6 +14,7 @@ cd /tmp/iso INITRD="$(find . -name '*.img')" KERNEL="$(find . -name vmlinuz64 -or -name bzImage)" +CMDLINE="$*" [ "$KERNEL" = "vmlinuz64" ] || mv "$KERNEL" vmlinuz64 [ "$INITRD" = "initrd.img" ] || mv "$INITRD" initrd.img @@ -29,7 +30,7 @@ CFG="DEFAULT linux LABEL linux KERNEL /vmlinuz64 INITRD /initrd.img - APPEND earlyprintk=serial console=ttyS0 console=tty1 $* + APPEND ${CMDLINE} " printf "$CFG" > isolinux/isolinux.cfg diff --git a/tools/mkimage-iso-efi/Dockerfile b/tools/mkimage-iso-efi/Dockerfile index 81a951319..06b366f84 100644 --- a/tools/mkimage-iso-efi/Dockerfile +++ b/tools/mkimage-iso-efi/Dockerfile @@ -12,4 +12,4 @@ RUN \ COPY . . -CMD [ "/make-efi" ] +ENTRYPOINT [ "/make-efi" ] diff --git a/tools/mkimage-iso-efi/make-efi b/tools/mkimage-iso-efi/make-efi index d3186a6ac..66f9e3131 100755 --- a/tools/mkimage-iso-efi/make-efi +++ b/tools/mkimage-iso-efi/make-efi @@ -14,6 +14,7 @@ cd /tmp/efi INITRD="$(find . -name '*.img')" KERNEL="$(find . -name vmlinuz64 -or -name bzImage)" +CMDLINE="$*" [ "$KERNEL" = "vmlinuz64" ] || mv "$KERNEL" vmlinuz64 [ "$INITRD" = "initrd.img" ] || mv "$INITRD" initrd.img @@ -21,13 +22,10 @@ KERNEL="$(find . -name vmlinuz64 -or -name bzImage)" # clean up subdirectories find . -mindepth 1 -maxdepth 1 -type d | xargs rm -rf -# Docker for Windows specific options, should be moved -WINDOWS_OPTIONS="mobyplatform=windows vsyscall=emulate page_poison=1 panic=1 rootdelay=300 noautodetect" - # Create a EFI boot file with kernel and initrd. From: # https://github.com/haraldh/mkrescue-uefi/blob/master/mkrescue-uefi.sh cp /usr/lib/gummiboot/linuxx64.efi.stub . -echo "earlyprintk=ttyS0,115200 console=ttyS0,115200 $WINDOWS_OPTIONS" > cmdline.txt +echo "${CMDLINE} rootdelay=300 noautodetect" > cmdline.txt objcopy \ --add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 \ From 1504c9584e6b92a0ca3de7bc5e5dec62dd710b77 Mon Sep 17 00:00:00 2001 From: Tycho Andersen Date: Thu, 9 Mar 2017 10:27:26 -0800 Subject: [PATCH 3/3] better debugging output in more error cases Signed-off-by: Tycho Andersen --- main.go | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 9ef5d9dfc..c9b630387 100644 --- a/main.go +++ b/main.go @@ -70,11 +70,38 @@ func dockerRunInput(input io.Reader, args ...string) ([]byte, error) { args = append([]string{"run", "--rm", "-i"}, args...) cmd := exec.Command(docker, args...) cmd.Stdin = input - out, err := cmd.Output() + + stderrPipe, err := cmd.StderrPipe() if err != nil { return []byte{}, err } - return out, nil + + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + return []byte{}, err + } + + err = cmd.Start() + if err != nil { + return []byte{}, err + } + + stdout, err := ioutil.ReadAll(stdoutPipe) + if err != nil { + return []byte{}, err + } + + stderr, err := ioutil.ReadAll(stderrPipe) + if err != nil { + return []byte{}, err + } + + err = cmd.Wait() + if err != nil { + return []byte{}, fmt.Errorf("%s: %s", err, stderr) + } + + return stdout, nil } func untarKernel(buf *bytes.Buffer, bzimageName, ktarName string) (*bytes.Buffer, *bytes.Buffer, error) {