diff options
Diffstat (limited to 'net/test/build_rootfs.sh')
-rwxr-xr-x | net/test/build_rootfs.sh | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/net/test/build_rootfs.sh b/net/test/build_rootfs.sh new file mode 100755 index 0000000..ce09da1 --- /dev/null +++ b/net/test/build_rootfs.sh @@ -0,0 +1,139 @@ +#!/bin/bash +# +# Copyright (C) 2018 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +set -e + +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) + +usage() { + echo -n "usage: $0 [-h] [-s wheezy|stretch] [-a amd64|arm64] " + echo "[-m http://mirror/debian] [-n net_test.rootfs.`date +%Y%m%d`]" + exit 1 +} + +mirror=http://ftp.debian.org/debian +debootstrap=debootstrap +suite=stretch +arch=amd64 + +while getopts ":hs:a:m:n:" opt; do + case $opt in + h) + usage + ;; + s) + if [ "$OPTARG" != "wheezy" -a "$OPTARG" != "stretch" ]; then + echo "Invalid suite: $OPTARG" >&2 + usage + fi + suite=$OPTARG + ;; + a) + if [ "$OPTARG" != "amd64" -a "$OPTARG" != "arm64" ]; then + echo "Invalid arch: $OPTARG" >&2 + usage + fi + arch=$OPTARG + ;; + m) + mirror=$OPTARG + ;; + n) + name=$OPTARG + ;; + \?) + echo "Invalid option: $OPTARG" >&2 + usage + ;; + :) + echo "Invalid option: $OPTARG requires an argument" >&2 + usage + ;; + esac +done + +name=net_test.rootfs.$arch.`date +%Y%m%d` + +# Switch to qemu-debootstrap for incompatible architectures +if [ "$arch" = "arm64" ]; then + debootstrap=qemu-debootstrap +fi + +# Sometimes it isn't obvious when the script fails +failure() { + echo "Filesystem generation process failed." >&2 +} +trap failure ERR + +# Import the package list for this release +packages=`cat $SCRIPT_DIR/rootfs/$suite.list | xargs | tr -s ' ' ','` + +# For the debootstrap intermediates +workdir=`mktemp -d` +workdir_remove() { + echo "Removing temporary files.." >&2 + sudo rm -rf $workdir +} +trap workdir_remove EXIT + +# Run the debootstrap first +cd $workdir +sudo $debootstrap --arch=$arch --variant=minbase --include=$packages \ + $suite . $mirror +# Workarounds for bugs in the debootstrap suite scripts +for mount in `cat /proc/mounts | cut -d' ' -f2 | grep -e ^$workdir`; do + echo "Unmounting mountpoint $mount.." >&2 + sudo umount $mount +done +# Copy the chroot preparation scripts, and enter the chroot +for file in $suite.sh common.sh net_test.sh; do + sudo cp -a $SCRIPT_DIR/rootfs/$file root/$file + sudo chown root:root root/$file +done +sudo chroot . /root/$suite.sh + +# Leave the workdir, to build the filesystem +cd - + +# For the final image mount +mount=`mktemp -d` +mount_remove() { + rmdir $mount + workdir_remove +} +trap mount_remove EXIT + +# Create a 1G empty ext3 filesystem +truncate -s 1G $name +mke2fs -F -t ext3 -L ROOT $name + +# Mount the new filesystem locally +sudo mount -o loop -t ext3 $name $mount +image_unmount() { + sudo umount $mount + mount_remove +} +trap image_unmount EXIT + +# Copy the patched debootstrap results into the new filesystem +sudo cp -a $workdir/* $mount + +# Fill the rest of the space with zeroes, to optimize compression +sudo dd if=/dev/zero of=$mount/sparse bs=1M 2>/dev/null || true +sudo rm -f $mount/sparse + +echo "Debian $suite for $arch filesystem generated at '$name'." |