]> xenbits.xensource.com Git - people/sstabellini/mojo.git/.git/commitdiff
Introduce a second domain build wip2
authorStefano Stabellini <sstabellini@kernel.org>
Wed, 13 Dec 2017 01:45:06 +0000 (17:45 -0800)
committerStefano Stabellini <sstabellini@kernel.org>
Thu, 14 Dec 2017 01:47:53 +0000 (17:47 -0800)
Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
alpine-domu/build.sh [new file with mode: 0755]
alpine-domu/domu/Dockerfile [new file with mode: 0644]
alpine-domu/domu/build.yml [new file with mode: 0644]
alpine-domu/domu/udhcpc.script [new file with mode: 0755]
build.sh
domains.cfg [new file with mode: 0644]
mkimage/build.sh
mkimage/image-builder/Dockerfile [deleted file]
mkimage/image-builder/Dockerfile.template [new file with mode: 0644]
mkimage/image-builder/make-efi
mkimage/series [deleted file]

diff --git a/alpine-domu/build.sh b/alpine-domu/build.sh
new file mode 100755 (executable)
index 0000000..c65040b
--- /dev/null
@@ -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 (file)
index 0000000..a323a2e
--- /dev/null
@@ -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 (file)
index 0000000..71cf2cf
--- /dev/null
@@ -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 (executable)
index 0000000..6a78bba
--- /dev/null
@@ -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
+
index a4ab6de4581f2a23905f56407a43386ae449c2d0..27b8275dcdcea773ba4ae0d9f9518ce088605afc 100644 (file)
--- 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 (file)
index 0000000..e29f924
--- /dev/null
@@ -0,0 +1,2 @@
+alpine-dom0 dom0
+alpine-domu domu
index 28fae4a61dc16065363ff532661d7738620a57bf..9c7069c5d1e630b2c39bc62510586cdc87d4ea85 100755 (executable)
@@ -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 (file)
index 40d4b89..0000000
+++ /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 (file)
index 0000000..e0a2728
--- /dev/null
@@ -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" ]
+
index dc22e4e17caebcdd281e8b446cdbf6ebdd74169d..6da0fc02ee93d2734395249a8446859861c47959 100755 (executable)
@@ -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 (file)
index 3647a25..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-grub-builder
-image-builder