From a366336895c3b5f3a23f2bc03712b20e1ea24736 Mon Sep 17 00:00:00 2001 From: Sven Dowideit Date: Wed, 3 May 2017 15:40:30 +1000 Subject: [PATCH] Add build-moby and run-moby to start Signed-off-by: Sven Dowideit --- Makefile | 8 ++- scripts/build-moby | 13 +++++ scripts/clean | 3 + scripts/layout | 110 +------------------------------------ scripts/layout-initrd | 58 +++++++++++++++++++ scripts/layout-kernel | 66 ++++++++++++++++++++++ scripts/moby/Dockerfile | 20 +++++++ scripts/moby/rancheros.yml | 13 +++++ scripts/package-installer | 3 +- scripts/run-moby | 11 ++++ 10 files changed, 196 insertions(+), 109 deletions(-) create mode 100755 scripts/build-moby create mode 100755 scripts/layout-initrd create mode 100755 scripts/layout-kernel create mode 100644 scripts/moby/Dockerfile create mode 100644 scripts/moby/rancheros.yml create mode 100755 scripts/run-moby diff --git a/Makefile b/Makefile index 69d40664..3d9bd929 100755 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -TARGETS := $(shell ls scripts | grep -vE 'clean|run|help|docs|release') +TARGETS := $(shell ls scripts | grep -vE 'clean|run|help|docs|release|moby') .dapper: @echo Downloading dapper @@ -28,6 +28,12 @@ run: build/initrd/.id .dapper docs: ./scripts/docs +build-moby: + ./scripts/build-moby + +run-moby: + ./scripts/run-moby + shell-bind: .dapper ./.dapper -m bind -s diff --git a/scripts/build-moby b/scripts/build-moby new file mode 100755 index 00000000..5c8fe589 --- /dev/null +++ b/scripts/build-moby @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +cd $(dirname $0)/.. +docker build -t zombie/os - < scripts/moby/Dockerfile + + +cd dist +mkdir -p moby +cd moby +moby build ../../scripts/moby/rancheros + + diff --git a/scripts/clean b/scripts/clean index ff8c701e..a0783e09 100755 --- a/scripts/clean +++ b/scripts/clean @@ -4,3 +4,6 @@ set -e cd $(dirname $0)/.. rm -rf build dist bin images/*/build state rm -rf ./scripts/images/openstack/dist + +docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" | grep rancher) || true +docker rmi $(docker images --filter dangling=true -q) ||true diff --git a/scripts/layout b/scripts/layout index ddfa567d..561f55e6 100755 --- a/scripts/layout +++ b/scripts/layout @@ -7,117 +7,13 @@ cd $(dirname $0)/.. ARTIFACTS=$(pwd)/dist/artifacts BUILD=build INITRD_DIR=${BUILD}/initrd +export ARTIFACTS BUILD INITRD_DIR VERSION -echo Create initrd layout in $INITRD_DIR - -rm -rf ${INITRD_DIR} -mkdir -p ${INITRD_DIR}/usr/{etc,lib,bin,share/ros,var/lib/cni/bin} - -./scripts/template - -cp -rf assets/selinux ${INITRD_DIR}/usr/etc -cp -rf assets/docker ${INITRD_DIR}/usr/etc -cp build/images.tar ${INITRD_DIR}/usr/share/ros/ -cp bin/ros ${INITRD_DIR}/usr/bin/ -ln -s usr/bin/ros ${INITRD_DIR}/init -ln -s bin ${INITRD_DIR}/usr/sbin -ln -s usr/sbin ${INITRD_DIR}/sbin -ln -s ros ${INITRD_DIR}/usr/bin/system-docker -ln -s ros ${INITRD_DIR}/usr/bin/docker-runc -ln -s ../../../../usr/bin/ros ${INITRD_DIR}/usr/var/lib/cni/bin/bridge -ln -s ../../../../usr/bin/ros ${INITRD_DIR}/usr/var/lib/cni/bin/host-local - -cat < ${INITRD_DIR}/usr/share/ros/os-release -NAME="RancherOS" -VERSION=${VERSION} -ID=rancheros -ID_LIKE= -VERSION_ID=${VERSION} -PRETTY_NAME="RancherOS ${VERSION}" -HOME_URL="http://rancher.com/rancher-os/" -SUPPORT_URL="https://forums.rancher.com/c/rancher-os" -BUG_REPORT_URL="https://github.com/rancher/os/issues" -BUILD_ID= -HERE -# TODO: usr/lib dir is overwritten by the kernel modules and firmware -ln -s ../share/ros/os-release ${INITRD_DIR}/usr/lib/ - -# Support upgrades from old persistent consoles that bind mount these -touch ${INITRD_DIR}/usr/bin/docker-containerd -touch ${INITRD_DIR}/usr/bin/docker-containerd-shim -touch ${INITRD_DIR}/usr/bin/docker - -# Override using a local kernel build -if [ -e ${DAPPER_SOURCE}/assets/kernel.tar.gz ]; then - echo "copying ${DAPPER_SOURCE}/assets/kernel.tar.gz ${DOWNLOADS}/kernel.tar.gz" - cp ${DAPPER_SOURCE}/assets/kernel.tar.gz ${DOWNLOADS}/kernel.tar.gz -fi - -if [ -e ${DOWNLOADS}/kernel.tar.gz ]; then - mkdir -p ${BUILD}/kernel - tar xf ${DOWNLOADS}/kernel.tar.gz -C ${BUILD}/kernel - - for i in vmlinuz vmlinux; do - if [ -e ${BUILD}/kernel/boot/${i}-* ]; then - mkdir -p ${ARTIFACTS} - # frustratingly, the vmlinuz versioned filename != the tag name, so we need to do some guessing - # for eg, 4.9-rc8-rancher2 is called vmlinuz-4.9.0-rc8-rancher - echo "Copy ${BUILD}/kernel/boot/${i}-* to ${ARTIFACTS}/vmlinuz-${KERNEL_VERSION}" - cp ${BUILD}/kernel/boot/${i}-* ${ARTIFACTS}/vmlinuz-${KERNEL_VERSION} - # use an unversioned filename for `scripts/run` - cp ${BUILD}/kernel/boot/${i}-* ${BUILD}/kernel/vmlinuz - break - fi - done - - # TODO: move these into a separate tar.gz and add to the syslinux initrd line - if [ -d ${BUILD}/kernel/lib ]; then - rm -rf ${INITRD_DIR}/usr/lib - cp -rf ${BUILD}/kernel/lib ${INITRD_DIR}/usr/ - depmod -b ${INITRD_DIR}/usr $(basename ${INITRD_DIR}/usr/lib/modules/*) - - #TODO: - # new: put the kernel modules into their own initrd file - #mkdir -p ${BUILD}/kernel-fs/usr/ - #pushd . - #cp -rf ${BUILD}/kernel/lib ${BUILD}/kernel-fs/usr/ - #depmod -b ${BUILD}/kernel-fs/usr $(basename ${BUILD}/kernel-fs/usr/lib/modules/*) - ## and then package it up cpio - #cd ${BUILD}/kernel-fs/ - #echo Creating kernel ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} - - #if [ "$COMPRESS" == "" ]; then - # COMPRESS="gzip -1" - #fi - #find | cpio -H newc -o | ${COMPRESS} > ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} - #popd - #echo Done creating kernel ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} - ## use an unversioned filename for `scripts/run` - #cp ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} ${BUILD}/kernel/linuxmods - fi -else - if [ "$ARCH" == "amd64" ]; then - echo "no ${DOWNLOADS}/kernel.tar.gz found" - exit 1 - fi -fi - -if [ "$ARCH" == "amd64" ]; then - ls -lah ${ARTIFACTS}/vmlinuz-* - if [ ! -e "${ARTIFACTS}/vmlinuz-${KERNEL_VERSION}" ]; then - echo "Can't find ${ARTIFACTS}/vmlinuz-${KERNEL_VERSION}" - exit -1 - fi -fi - -if [ -e ${DOWNLOADS}/policy.29 ]; then - mkdir -p ${INITRD_DIR}/usr/etc/selinux/ros/policy/ - cp ${DOWNLOADS}/policy.29 ${INITRD_DIR}/usr/etc/selinux/ros/policy/ -fi +./scripts/layout-initrd +./scripts/layout-kernel DFS_ARCH=$(docker create ${DFS_IMAGE}${SUFFIX}) trap "docker rm -fv ${DFS_ARCH} >/dev/null" EXIT - docker export ${DFS_ARCH} | tar xf - -C ${INITRD_DIR} --exclude=usr/bin/docker* \ --exclude=usr/share/git-core \ --exclude=usr/bin/git \ diff --git a/scripts/layout-initrd b/scripts/layout-initrd new file mode 100755 index 00000000..08925055 --- /dev/null +++ b/scripts/layout-initrd @@ -0,0 +1,58 @@ + +echo Create initrd layout in $INITRD_DIR + +rm -rf ${INITRD_DIR} +mkdir -p ${INITRD_DIR}/usr/{etc,lib,bin,share/ros,var/lib/cni/bin} + +./scripts/template + +cp -rf assets/selinux ${INITRD_DIR}/usr/etc +cp -rf assets/docker ${INITRD_DIR}/usr/etc +cp build/images.tar ${INITRD_DIR}/usr/share/ros/ +cp bin/ros ${INITRD_DIR}/usr/bin/ +ln -s usr/bin/ros ${INITRD_DIR}/init +ln -s bin ${INITRD_DIR}/usr/sbin +ln -s usr/sbin ${INITRD_DIR}/sbin +ln -s ros ${INITRD_DIR}/usr/bin/system-docker +ln -s ros ${INITRD_DIR}/usr/bin/docker-runc +ln -s ../../../../usr/bin/ros ${INITRD_DIR}/usr/var/lib/cni/bin/bridge +ln -s ../../../../usr/bin/ros ${INITRD_DIR}/usr/var/lib/cni/bin/host-local + +cat < ${INITRD_DIR}/usr/share/ros/os-release +NAME="RancherOS" +VERSION=${VERSION} +ID=rancheros +ID_LIKE= +VERSION_ID=${VERSION} +PRETTY_NAME="RancherOS ${VERSION}" +HOME_URL="http://rancher.com/rancher-os/" +SUPPORT_URL="https://forums.rancher.com/c/rancher-os" +BUG_REPORT_URL="https://github.com/rancher/os/issues" +BUILD_ID= +HERE +# TODO: usr/lib dir is overwritten by the kernel modules and firmware +ln -s ../share/ros/os-release ${INITRD_DIR}/usr/lib/ + +# Support upgrades from old persistent consoles that bind mount these +touch ${INITRD_DIR}/usr/bin/docker-containerd +touch ${INITRD_DIR}/usr/bin/docker-containerd-shim +touch ${INITRD_DIR}/usr/bin/docker + +if [ -e ${DOWNLOADS}/policy.29 ]; then + mkdir -p ${INITRD_DIR}/usr/etc/selinux/ros/policy/ + cp ${DOWNLOADS}/policy.29 ${INITRD_DIR}/usr/etc/selinux/ros/policy/ +fi + +# make rancher/os-initrd image +cat < ${INITRD_DIR}/../Dockerfile.initrd +FROM scratch +COPY initrd/* / +HERE + +name="os-initrd" +tag="${OS_REPO}/${name}:${VERSION}${SUFFIX}" +pushd . +cd ${INITRD_DIR}/.. +docker build -t ${OS_REPO}/${name} -f Dockerfile.initrd . +docker tag rancher/${name} ${tag} +popd diff --git a/scripts/layout-kernel b/scripts/layout-kernel new file mode 100755 index 00000000..fc5ef04b --- /dev/null +++ b/scripts/layout-kernel @@ -0,0 +1,66 @@ +#!/bin/bash +set -e + +# Override using a local kernel build +if [ -e ${DAPPER_SOURCE}/assets/kernel.tar.gz ]; then + echo "copying ${DAPPER_SOURCE}/assets/kernel.tar.gz ${DOWNLOADS}/kernel.tar.gz" + cp ${DAPPER_SOURCE}/assets/kernel.tar.gz ${DOWNLOADS}/kernel.tar.gz +fi + +if [ -e ${DOWNLOADS}/kernel.tar.gz ]; then + mkdir -p ${BUILD}/kernel + tar xf ${DOWNLOADS}/kernel.tar.gz -C ${BUILD}/kernel + + for i in vmlinuz vmlinux; do + if [ -e ${BUILD}/kernel/boot/${i}-* ]; then + mkdir -p ${ARTIFACTS} + # frustratingly, the vmlinuz versioned filename != the tag name, so we need to do some guessing + # for eg, 4.9-rc8-rancher2 is called vmlinuz-4.9.0-rc8-rancher + echo "Copy ${BUILD}/kernel/boot/${i}-* to ${ARTIFACTS}/vmlinuz-${KERNEL_VERSION}" + cp ${BUILD}/kernel/boot/${i}-* ${ARTIFACTS}/vmlinuz-${KERNEL_VERSION} + # use an unversioned filename for `scripts/run` + cp ${BUILD}/kernel/boot/${i}-* ${BUILD}/kernel/vmlinuz + break + fi + done + + # TODO: move these into a separate tar.gz and add to the syslinux initrd line + if [ -d ${BUILD}/kernel/lib ]; then + rm -rf ${INITRD_DIR}/usr/lib + cp -rf ${BUILD}/kernel/lib ${INITRD_DIR}/usr/ + depmod -b ${INITRD_DIR}/usr $(basename ${INITRD_DIR}/usr/lib/modules/*) + + #TODO: + # new: put the kernel modules into their own initrd file + #mkdir -p ${BUILD}/kernel-fs/usr/ + #pushd . + #cp -rf ${BUILD}/kernel/lib ${BUILD}/kernel-fs/usr/ + #depmod -b ${BUILD}/kernel-fs/usr $(basename ${BUILD}/kernel-fs/usr/lib/modules/*) + ## and then package it up cpio + #cd ${BUILD}/kernel-fs/ + #echo Creating kernel ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} + + #if [ "$COMPRESS" == "" ]; then + # COMPRESS="gzip -1" + #fi + #find | cpio -H newc -o | ${COMPRESS} > ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} + #popd + #echo Done creating kernel ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} + ## use an unversioned filename for `scripts/run` + #cp ${ARTIFACTS}/linuxmods-${KERNEL_VERSION} ${BUILD}/kernel/linuxmods + fi +else + if [ "$ARCH" == "amd64" ]; then + echo "no ${DOWNLOADS}/kernel.tar.gz found" + exit 1 + fi +fi + +if [ "$ARCH" == "amd64" ]; then + ls -lah ${ARTIFACTS}/vmlinuz-* + if [ ! -e "${ARTIFACTS}/vmlinuz-${KERNEL_VERSION}" ]; then + echo "Can't find ${ARTIFACTS}/vmlinuz-${KERNEL_VERSION}" + exit -1 + fi +fi + diff --git a/scripts/moby/Dockerfile b/scripts/moby/Dockerfile new file mode 100644 index 00000000..ba03db7a --- /dev/null +++ b/scripts/moby/Dockerfile @@ -0,0 +1,20 @@ +FROM rancher/os + +# replace this with `rancher/os-initrd` +RUN mkdir /tmp/initrd \ + && cd /tmp/initrd \ + && cat /dist/initrd-* | gunzip | cpio -i \ + && rm -rf usr/lib \ + && rm /tmp/initrd/usr/var/lib/cni/bin/host-local /tmp/initrd/usr/var/lib/cni/bin/bridge \ + && mkdir -p /tmp/initrd/var/lib/cni/bin \ + && ln -s ../../../../usr/bin/ros /tmp/initrd/var/lib/cni/bin/host-local \ + && ln -s ../../../../usr/bin/ros /tmp/initrd/var/lib/cni/bin/bridge \ + && cp -r --update --dereference --force /tmp/initrd/* / \ + && cd / \ + && rm -rf /tmp/initrd + +#FROM rancher/os-installer +#RUN cp /bin/ros /init + +#FROM rancher/os-installer +#RUN cp /bin/ros /init diff --git a/scripts/moby/rancheros.yml b/scripts/moby/rancheros.yml new file mode 100644 index 00000000..c9ad2c48 --- /dev/null +++ b/scripts/moby/rancheros.yml @@ -0,0 +1,13 @@ +kernel: + image: "linuxkit/kernel:4.9.x" +# cmdline: "debug ignore_loglevel log_buf_len=10M print_fatal_signals=1 LOGLEVEL=8 earlyprintk sched_debug initcall_debug option.debug=Y break=y console=ttyS0 console=tty0 console=tty1 page_poison=1 printk.devkmsg=on rancher.debug=true rancher.password=rancher rancher.autologin=ttyS0 rancher.autologin=tty0 rancher.autologin=tty1" + cmdline: 'printk.devkmsg=on rancher.debug=true rancher.password=rancher console=ttyS0 rancher.autologin=ttyS0 console=tty0 rancher.autologin=tty0 console=tty1 rancher.autologin=tty1 rancher.state.dev=LABEL=RANCHER_STATE rancher.state.autoformat=[/dev/sda,/dev/vda] rancher.rm_usr' +init: + - zombie/os +# - rancher/os-installer +# - rancher/os-initrd +outputs: + - format: kernel+initrd + - format: iso-bios +# - format: iso-efi +# - format: gcp-img diff --git a/scripts/package-installer b/scripts/package-installer index b688c2ea..ec781eb5 100755 --- a/scripts/package-installer +++ b/scripts/package-installer @@ -62,8 +62,9 @@ cp -r ${DIST}/boot/* ./scripts/installer/build/boot cp $DOCKERFILE ./scripts/installer/build/Dockerfile # Full installer image with initrd - used for pulling from network docker build \ - -t ${OS_REPO}/os:${VERSION}${SUFFIX} \ + -t ${OS_REPO}/os \ ./scripts/installer/build +docker tag ${OS_REPO}/os ${OS_REPO}/os:${VERSION}${SUFFIX} docker save -o ${ARTIFACTS}/fullinstaller.tar ${OS_REPO}/os:${VERSION}${SUFFIX} echo ${OS_REPO}/os:${VERSION}${SUFFIX} >> dist/images diff --git a/scripts/run-moby b/scripts/run-moby new file mode 100755 index 00000000..e0f39274 --- /dev/null +++ b/scripts/run-moby @@ -0,0 +1,11 @@ +#!/bin/bash + +cd $(dirname $0)/../dist/moby +qemu-system-x86_64 \ + -nographic \ + -kernel ./rancheros-kernel \ + -initrd ./rancheros-initrd.img \ + -m 2048 \ + -net nic,vlan=0,model=virtio \ + -net user,vlan=0,hostfwd=tcp::3333-:22,hostname=rancher-moby \ + -append 'printk.devkmsg=on rancher.debug=true rancher.password=rancher console=ttyS0 rancher.autologin=ttyS0 console=tty0 rancher.autologin=tty0 console=tty1 rancher.autologin=tty1 rancher.state.dev=LABEL=RANCHER_STATE rancher.state.autoformat=[/dev/sda,/dev/vda] rancher.rm_usr'