From: Stefano Stabellini Date: Wed, 13 Dec 2017 01:45:06 +0000 (-0800) Subject: Introduce a second domain build X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=refs%2Fheads%2Fwip2;p=people%2Fsstabellini%2Fmojo.git%2F.git Introduce a second domain build Signed-off-by: Stefano Stabellini --- diff --git a/alpine-domu/build.sh b/alpine-domu/build.sh new file mode 100755 index 0000000..c65040b --- /dev/null +++ b/alpine-domu/build.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +build() { + label=$1 + + if test `which linuxkit` + then + linuxkit pkg build --disable-content-trust -hash $label alpine-domu/$label/ + else + exists=`docker images -q "mojoos/$label"` + if test -z "$exists" + then + docker build -f alpine-domu/$label/Dockerfile -t mojoos/$label alpine-domu/$label + fi + fi +} + +build domu diff --git a/alpine-domu/domu/Dockerfile b/alpine-domu/domu/Dockerfile new file mode 100644 index 0000000..a323a2e --- /dev/null +++ b/alpine-domu/domu/Dockerfile @@ -0,0 +1,32 @@ +FROM alpine:3.6 as domu + +RUN \ + apk update && \ + apk add openrc + +ADD udhcpc.script /usr/share/udhcpc/default.script + +RUN \ + rc-update add networking sysinit && \ + rc-update add loopback sysinit && \ + rc-update add bootmisc boot && \ + rc-update add devfs sysinit && \ + rc-update add dmesg sysinit && \ + rc-update add hostname boot && \ + rc-update add hwclock boot && \ + rc-update add hwdrivers sysinit && \ + rc-update add killprocs shutdown && \ + rc-update add modloop sysinit && \ + rc-update add modules boot && \ + rc-update add mount-ro shutdown && \ + rc-update add savecache shutdown && \ + rc-update add sysctl boot && \ + rc-update add local default && \ + echo "nameserver 8.8.8.8" > /etc/resolv.conf && \ + echo "auto lo" > /etc/network/interfaces && \ + echo "auto eth0" >> /etc/network/interfaces && \ + echo "iface eth0 inet dhcp" >> /etc/network/interfaces && \ + echo "ttyS0" >> /etc/securetty && \ + echo "hvc0" >> /etc/securetty && \ + echo "ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100" >> /etc/inittab && \ + echo "hvc0::respawn:/sbin/getty -L hvc0 115200 vt100" >> /etc/inittab diff --git a/alpine-domu/domu/build.yml b/alpine-domu/domu/build.yml new file mode 100644 index 0000000..71cf2cf --- /dev/null +++ b/alpine-domu/domu/build.yml @@ -0,0 +1,3 @@ +image: domu +org: mojoos +network: yes diff --git a/alpine-domu/domu/udhcpc.script b/alpine-domu/domu/udhcpc.script new file mode 100755 index 0000000..6a78bba --- /dev/null +++ b/alpine-domu/domu/udhcpc.script @@ -0,0 +1,101 @@ +#!/bin/busybox sh + +# udhcp sample script by Gabriel Somlo (somlo at cmu edu) +# - uses 'ip' instead of 'ifconfig' and 'route' +# - make minimal changes, and only if required by changing dhcp options + +[ -z "$1" ] && echo 'Error: should be called from udhcpc' && exit 1 + +# where to save config information for $interface: +CFG="/var/run/udhcpc.${interface}.cfg" + +# names of files we might need to touch: +RESOLV_CONF='/etc/resolv.conf' +NTP_CONF='/etc/ntp.conf' + +# which interface configures DNS and NTP ? Comment out if none: +#PEERDNS_IF=eth0 +#PEERNTP_IF=eth0 + +case "$1" in + deconfig) + # bring interface up, but with no IP configured: + ip addr flush dev $interface + ip link set $interface up + # remove any stored config info for this $interface: + rm -f $CFG + # restore any pre-dhcp config files: + if [ "$interface" == "$PEERDNS_IF" ] ; then + [ -f ${RESOLV_CONF}.dhcsave ] && mv -f ${RESOLV_CONF}.dhcsave $RESOLV_CONF + fi + if [ "$interface" == "$PEERNTP_IF" ] ; then + [ -f ${NTP_CONF}.dhcsave ] && mv -f ${NTP_CONF}.dhcsave $NTP_CONF + fi + ;; + bound) + # save config info for $interface: + set > $CFG + # configure interface and routes: + ip addr flush dev $interface + ip addr add ${ip}/${mask} dev $interface + [ -n "$router" ] && ip route add default via ${router%% *} dev $interface + # save pre-dhcp config files and generate new ones: + if [ "$interface" == "$PEERDNS_IF" ] ; then + [ -f $RESOLV_CONF ] && mv -f $RESOLV_CONF ${RESOLV_CONF}.dhcsave + [ -n "$domain" ] && echo search $domain > $RESOLV_CONF + for i in $dns ; do + echo nameserver $i >> $RESOLV_CONF + done + fi + if [ "$interface" == "$PEERNTP_IF" ] ; then + [ -f $NTP_CONF ] && mv -f $NTP_CONF ${NTP_CONF}.dhcsave + > $NTP_CONF + for i in $ntpsrv ; do + echo server $i >> $NTP_CONF + done + fi + ;; + renew) + # compare new vs. previous config info: + set > ${CFG}.new + for i in $(diff -U1 $CFG ${CFG}.new | grep -E ^[+-] \ + | tail +3 \ + | awk -F[+-=] '{print $2}') ; do + case "$i" in + ip|mask|router) + REDO_NET='yes' + ;; + domain|dns) + REDO_DNS='yes' + ;; + ntpsrv) + REDO_NTP='yes' + ;; + esac + done + # save new config info: + mv -f ${CFG}.new $CFG + # make only necessary changes, as per config comparison: + if [ -n "$REDO_NET" ] ; then + ip addr flush dev $interface + ip addr add ${ip}/${mask} dev $interface + [ -n "$router" ] && ip route add default via ${router%% *} dev $interface + fi + if [ -n "$REDO_DNS" -a "$interface" == "$PEERDNS_IF" ] ; then + [ -n "$domain" ] && echo search $domain > $RESOLV_CONF + for i in $dns ; do + echo nameserver $i >> $RESOLV_CONF + done + fi + if [ -n "$REDO_NTP" -a "$interface" == "$PEERNTP_IF" ] ; then + > $NTP_CONF + for i in $ntpsrv ; do + echo server $i >> $NTP_CONF + done + # FIXME: RELOAD NTP DAEMON HERE + fi + ;; +esac + +exit 0 + diff --git a/build.sh b/build.sh index a4ab6de..27b8275 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,9 @@ #!/bin/bash -# Build Dom0. Output is a container labeled "dom0". -alpine-dom0/build.sh +for domain in `cat domains.cfg | cut -d " " -f 1` +do + $domain/build.sh +done # Create final image. Output is out/image. mkimage/build.sh diff --git a/domains.cfg b/domains.cfg new file mode 100644 index 0000000..e29f924 --- /dev/null +++ b/domains.cfg @@ -0,0 +1,2 @@ +alpine-dom0 dom0 +alpine-domu domu diff --git a/mkimage/build.sh b/mkimage/build.sh index 28fae4a..9c7069c 100755 --- a/mkimage/build.sh +++ b/mkimage/build.sh @@ -17,10 +17,14 @@ build() { fi } -for label in `cat mkimage/series` +build grub-builder + +cp mkimage/image-builder/Dockerfile.template mkimage/image-builder/Dockerfile +for dom in `cat domains.cfg | cut -d " " -f 2` do - build $label + echo "COPY --from=mojoos/$dom:$dom / /out-$dom" >> mkimage/image-builder/Dockerfile done +build image-builder # Create system image if ! test -f $OUT_DIR/image diff --git a/mkimage/image-builder/Dockerfile b/mkimage/image-builder/Dockerfile deleted file mode 100644 index 40d4b89..0000000 --- a/mkimage/image-builder/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM mojoos/grub-builder:grub-builder AS image-builder - -COPY --from=mojoos/dom0:dom0 / /out - -RUN \ - apk update && apk upgrade && \ - apk add --no-cache \ - dosfstools \ - libarchive-tools \ - binutils \ - mtools \ - sfdisk \ - sgdisk \ - xfsprogs \ - e2fsprogs \ - util-linux \ - coreutils \ - multipath-tools \ - && true - -COPY make-efi / - -ENTRYPOINT [ "/bin/sh" ] diff --git a/mkimage/image-builder/Dockerfile.template b/mkimage/image-builder/Dockerfile.template new file mode 100644 index 0000000..e0a2728 --- /dev/null +++ b/mkimage/image-builder/Dockerfile.template @@ -0,0 +1,23 @@ +FROM mojoos/grub-builder:grub-builder AS image-builder + +RUN \ + apk update && apk upgrade && \ + apk add --no-cache \ + dosfstools \ + libarchive-tools \ + binutils \ + mtools \ + sfdisk \ + sgdisk \ + xfsprogs \ + e2fsprogs \ + util-linux \ + coreutils \ + multipath-tools \ + bash \ + && true + +COPY make-efi / + +ENTRYPOINT [ "/bin/bash" ] + diff --git a/mkimage/image-builder/make-efi b/mkimage/image-builder/make-efi index dc22e4e..6da0fc0 100755 --- a/mkimage/image-builder/make-efi +++ b/mkimage/image-builder/make-efi @@ -1,9 +1,11 @@ -#!/bin/sh +#!/bin/bash set -e IMGFILE=$PWD/disk.img ESP_FILE=$PWD/boot.img + +DOM0_DIR=/out-dom0 ROOTFS_FILE=$PWD/rootfs.img ( exec 1>&2; @@ -24,9 +26,8 @@ esac mkdir -p /tmp/efi cd /tmp/efi -OUT_DIR=/out -KERNEL="$OUT_DIR/boot/kernel" -XEN="$OUT_DIR/boot/xen-4.10.0-rc.gz" +KERNEL="$DOM0_DIR/boot/kernel" +XEN="$DOM0_DIR/boot/xen-4.10.0-rc.gz" # PARTUUID for root PARTUUID=$(cat /proc/sys/kernel/random/uuid) @@ -50,7 +51,7 @@ EOF # # calculate sizes -ls -l /out > /dev/stderr +ls -l /$DOM0_DIR > /dev/stderr KERNEL_FILE_SIZE=$(stat -c %s "$KERNEL") XEN_FILE_SIZE=$(stat -c %s "$XEN") EFI_FILE_SIZE=$(stat -c %s "$BOOTFILE") @@ -71,7 +72,7 @@ ESP_FILE_SIZE_KB=$(( ( ($ESP_FILE_SIZE+1024) / 1024 ) / 1024 * 1024 )) # and for sectors ESP_FILE_SIZE_SECTORS=$(( $ESP_FILE_SIZE_KB * 2 )) -ROOTFS_FILE_SIZE_KB=$(du -sk /out | awk '{print $1}') +ROOTFS_FILE_SIZE_KB=$(du -sk /$DOM0_DIR | awk '{print $1}') ROOTFS_BLOCKSZ=4096 ROOTFS_PART_HEADROOM_BLOCKS=16000 @@ -95,14 +96,46 @@ mcopy -i $ESP_FILE $XEN ::/ dd if=/dev/zero of=$ROOTFS_FILE bs=1024 count=$(( $ROOTFS_PART_SIZE_KB )) mkfs.ext4 -b 4096 -L mojo_rootfs -v $ROOTFS_FILE mount -o loop $ROOTFS_FILE /mnt -cp -R /out/* /mnt +cp -R /$DOM0_DIR/* /mnt umount /mnt +num=1 +for i in `ls -d /out-dom*` +do + if [[ "$i" = "/out-dom0" ]] + then + continue + fi + ROOTFS_DOM_PART_SIZE_KB[$num]=$(du -sk $i | awk '{print $1}') + ROOTFS_DOM_BLOCKSZ=4096 + ROOTFS_DOM_PART_HEADROOM_BLOCKS=16000 + ROOTFS_DOM_PART_BLOCKS[$num]=$(( ${ROOTFS_DOM_PART_SIZE_KB[$num]} / 4 + $ROOTFS_DOM_PART_HEADROOM_BLOCKS )) + ROOTFS_DOM_PART_SIZE[$num]=$(( ${ROOTFS_DOM_PART_BLOCKS[$num]} * $ROOTFS_DOM_BLOCKSZ )) + ROOTFS_DOM_PART_SIZE_KB[$num]=$(( ( (${ROOTFS_DOM_PART_SIZE[$num]} + 1024) / 1024 ) / 1024 * 1024 )) + ROOTFS_DOM_PART_SECTORS[$num]=$(( ${ROOTFS_DOM_PART_SIZE_KB[$num]} * 2 )) + + dd if=/dev/zero of=/rootfs-$num.img bs=1024 count=$(( ${ROOTFS_DOM_PART_SIZE_KB[$num]} )) + mkfs.ext4 -b 4096 -L domu -v /rootfs-$num.img + mount -o loop /rootfs-$num.img /mnt + cp -R $i/* /mnt + umount /mnt + + num=$((num + 1)) +done + # now make our actual filesystem image # how big an image do we want? # it should be the size of our ESP file+1MB for BIOS boot + 1MB for MBR + 1MB for GPT ONEMB=$(( 1024 * 1024 )) SIZE_IN_BYTES=$(( $(stat -c %s "$ESP_FILE") + 4*$ONEMB + $ROOTFS_PART_SIZE_KB * 1024 )) +i=1 +while test $i -lt $num +do + SIZE_IN_BYTES=$(($SIZE_IN_BYTES + ${ROOTFS_DOM_PART_SIZE_KB[$i]} * 1024)) + i=$((i + 1)) +done + + # and make sure the ESP is bootable for BIOS mode # settings @@ -116,18 +149,35 @@ ESP_SECTOR_START=2048 ESP_SECTOR_END=$(( $ESP_SECTOR_START + $ESP_FILE_SIZE_SECTORS - 1 )) ROOTFS_SECTOR_START=$(( $ESP_SECTOR_END + 1 )) ROOTFS_SECTOR_END=$(( $ROOTFS_SECTOR_START + $ROOTFS_PART_SECTORS - 1)) +i=1 +extra="" +ROOTFS_DOM_SECTOR_END[0]=$ROOTFS_SECTOR_END +while test $i -lt $num +do + prev=$((i - 1)) + ROOTFS_DOM_SECTOR_START[$i]=$(( ${ROOTFS_DOM_SECTOR_END[$prev]} + 1 )) + ROOTFS_DOM_SECTOR_END[$i]=$(( ${ROOTFS_DOM_SECTOR_START[$i]} + ${ROOTFS_DOM_PART_SECTORS[$i]} - 1)) + part=$((i + 2)) + extra="$extra --new $part:${ROOTFS_DOM_SECTOR_START[$i]}:${ROOTFS_DOM_SECTOR_END[$i]} --typecode=2:fe00 --change-name=$part:'rootfs'" + i=$((i + 1)) +done # create the partitions - size of the ESP must match our image # and make sure the ESP is bootable for BIOS mode sgdisk --clear \ --new 1:$ESP_SECTOR_START:$ESP_SECTOR_END --typecode=1:ef00 --change-name=1:'EFI System' --partition-guid=1:$PARTUUID \ - --new 2:$ROOTFS_SECTOR_START:$ROOTFS_SECTOR_END --typecode=2:fe00 --change-name=2:'rootfs' \ + --new 2:$ROOTFS_SECTOR_START:$ROOTFS_SECTOR_END --typecode=2:fe00 --change-name=2:'rootfs' $extra \ --attributes 1:set:2 \ $IMGFILE # copy in our EFI System Partition image dd if=$ESP_FILE of=$IMGFILE bs=$BLKSIZE count=$ESP_FILE_SIZE_SECTORS conv=notrunc seek=$ESP_SECTOR_START dd if=$ROOTFS_FILE of=$IMGFILE bs=$BLKSIZE count=$ROOTFS_PART_SECTORS conv=notrunc seek=$ROOTFS_SECTOR_START - +i=1 +while test $i -lt $num +do + dd if=/rootfs-$i.img of=$IMGFILE bs=$BLKSIZE count=${ROOTFS_DOM_PART_SECTORS[$i]} conv=notrunc seek=${ROOTFS_DOM_SECTOR_START[$i]} + i=$((i + 1)) +done ) cat $IMGFILE diff --git a/mkimage/series b/mkimage/series deleted file mode 100644 index 3647a25..0000000 --- a/mkimage/series +++ /dev/null @@ -1,2 +0,0 @@ -grub-builder -image-builder