mirror of
https://github.com/commaai/agnos-builder.git
synced 2026-04-07 07:13:53 +08:00
94 lines
2.6 KiB
Bash
Executable File
94 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
UBUNTU_BASE_URL="http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release"
|
|
UBUNTU_FILE="ubuntu-base-20.04.1-base-arm64.tar.gz"
|
|
|
|
export DOCKER_BUILDKIT=1
|
|
|
|
# Make sure we're in the correct spot
|
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
|
cd $DIR
|
|
|
|
BUILD_DIR="$DIR/build"
|
|
OUTPUT_DIR="$DIR/output"
|
|
|
|
ROOTFS_DIR="$BUILD_DIR/agnos-rootfs"
|
|
ROOTFS_IMAGE="$BUILD_DIR/system.img.raw"
|
|
ROOTFS_IMAGE_SIZE=10G
|
|
SPARSE_IMAGE="$BUILD_DIR/system.img"
|
|
|
|
# Create temp dir if non-existent
|
|
mkdir -p $BUILD_DIR $OUTPUT_DIR
|
|
|
|
# Copy kernel modules over
|
|
if ! ls $OUTPUT_DIR/*.ko >/dev/null 2>&1; then
|
|
echo "kernel modules missing. run ./build_kernel.sh first"
|
|
exit 1
|
|
fi
|
|
cp $OUTPUT_DIR/wlan.ko $DIR/userspace/usr/comma
|
|
cp $OUTPUT_DIR/snd*.ko $DIR/userspace/usr/comma/sound/
|
|
|
|
# Download Ubuntu Base if not done already
|
|
if [ ! -f $UBUNTU_FILE ]; then
|
|
echo -e "${GREEN}Downloading Ubuntu: $UBUNTU_FILE ${NO_COLOR}"
|
|
wget -c $UBUNTU_BASE_URL/$UBUNTU_FILE --quiet
|
|
fi
|
|
|
|
# Register qemu multiarch
|
|
if [ "$(uname -p)" != "aarch64" ]; then
|
|
docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
|
fi
|
|
|
|
# Start docker build
|
|
echo "Building image"
|
|
export DOCKER_CLI_EXPERIMENTAL=enabled
|
|
docker build -f Dockerfile.agnos -t agnos-builder $DIR
|
|
|
|
# Create filesystem ext4 image
|
|
echo "Creating empty filesystem"
|
|
fallocate -l $ROOTFS_IMAGE_SIZE $ROOTFS_IMAGE
|
|
mkfs.ext4 $ROOTFS_IMAGE > /dev/null
|
|
|
|
# Mount filesystem
|
|
echo "Mounting empty filesystem"
|
|
mkdir -p $ROOTFS_DIR
|
|
sudo umount -l $ROOTFS_DIR > /dev/null || true
|
|
sudo mount $ROOTFS_IMAGE $ROOTFS_DIR
|
|
|
|
# Extract image
|
|
echo "Extracting docker image"
|
|
CONTAINER_ID=$(docker container create --entrypoint /bin/bash agnos-builder:latest)
|
|
docker container export -o $BUILD_DIR/filesystem.tar $CONTAINER_ID
|
|
docker container rm $CONTAINER_ID > /dev/null
|
|
cd $ROOTFS_DIR
|
|
sudo tar -xf $BUILD_DIR/filesystem.tar > /dev/null
|
|
|
|
# Add hostname and hosts. This cannot be done in the docker container...
|
|
echo "Setting network stuff"
|
|
HOST=tici
|
|
sudo bash -c "echo $HOST > etc/hostname"
|
|
sudo bash -c "echo \"127.0.0.1 localhost.localdomain localhost\" > etc/hosts"
|
|
sudo bash -c "echo \"127.0.0.1 $HOST\" >> etc/hosts"
|
|
|
|
# Fix resolv config
|
|
sudo bash -c "ln -sf /run/systemd/resolve/stub-resolv.conf etc/resolv.conf"
|
|
|
|
# Write build info
|
|
DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
|
|
GIT_HASH=$(git --git-dir=$DIR/.git rev-parse HEAD)
|
|
sudo bash -c "printf \"$GIT_HASH\n$DATETIME\" > BUILD"
|
|
|
|
cd $DIR
|
|
|
|
# Unmount image
|
|
echo "Unmount filesystem"
|
|
sudo umount -l $ROOTFS_DIR
|
|
|
|
# Sparsify
|
|
echo "Sparsify image"
|
|
img2simg $ROOTFS_IMAGE $SPARSE_IMAGE
|
|
mv $SPARSE_IMAGE $OUTPUT_DIR
|
|
|
|
echo "Done!"
|