You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
3.8 KiB
159 lines
3.8 KiB
#!/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)
|
|
|
|
# Make sure we're in C locale so build inside chroot does not complain
|
|
# about missing files
|
|
unset LANG LANGUAGE \
|
|
LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION LC_MEASUREMENT \
|
|
LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME
|
|
export LC_ALL=C
|
|
|
|
usage() {
|
|
echo -n "usage: $0 [-h] [-s bullseye] [-a i386|amd64|armhf|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=bullseye
|
|
arch=amd64
|
|
|
|
while getopts ":hs:a:m:n:" opt; do
|
|
case $opt in
|
|
h)
|
|
usage
|
|
;;
|
|
s)
|
|
if [[ "$OPTARG" != "bullseye" ]]; then
|
|
echo "Invalid suite: $OPTARG" >&2
|
|
usage
|
|
fi
|
|
suite="${OPTARG}"
|
|
;;
|
|
a)
|
|
case "${OPTARG}" in
|
|
i386|amd64|armhf|arm64)
|
|
arch="${OPTARG}"
|
|
;;
|
|
*)
|
|
echo "Invalid arch: ${OPTARG}" >&2
|
|
usage
|
|
;;
|
|
esac
|
|
;;
|
|
m)
|
|
mirror=$OPTARG
|
|
;;
|
|
n)
|
|
name=$OPTARG
|
|
;;
|
|
\?)
|
|
echo "Invalid option: $OPTARG" >&2
|
|
usage
|
|
;;
|
|
:)
|
|
echo "Invalid option: $OPTARG requires an argument" >&2
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "${name}" ]]; then
|
|
name=net_test.rootfs.${arch}.${suite}.`date +%Y%m%d`
|
|
fi
|
|
|
|
# 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
|
|
tmpdir=`mktemp -d`
|
|
tmpdir_remove() {
|
|
echo "Removing temporary files.." >&2
|
|
sudo rm -rf "${tmpdir}"
|
|
}
|
|
trap tmpdir_remove EXIT
|
|
|
|
workdir="${tmpdir}/_"
|
|
|
|
mkdir "${workdir}"
|
|
chmod 0755 "${workdir}"
|
|
sudo chown root:root "${workdir}"
|
|
|
|
# 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
|
|
tmpdir_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'."
|