1#!/bin/bash
2
3set -e
4
5print_usage() {
6  echo "Usage: $(basename $0) [options]"
7  echo -e "Creates a Ubuntu root file system image.\n"
8  echo -e "  --help\t\t\tDisplay this information."
9  echo -e "  --arch {armhf|arm64}\t\tSelects architecture of rootfs image."
10  echo -e "  --distro {bionic|focal}\tSelects Ubuntu distribution of rootfs image."
11  echo -e "  --size n{K|M|G}\t\tSets size of rootfs image to n Kilo, Mega or Giga bytes."
12  exit "$1"
13}
14
15invalid_arg() {
16  echo "ERROR: Unrecognized argument: $1" >&2
17  print_usage 1
18}
19
20update_repositories() {
21  echo -e "\nUpdating apt repositories. "
22  echo -e "\nPress 'y' to continue or any other key to exit..."
23  read -s -n 1 user_input
24  if [[ $user_input == 'Y' ]] || [[ $user_input == 'y' ]]; then
25    sudo apt update
26  else
27    exit
28  fi
29}
30
31# Parse options
32while [[ $# -gt 0 ]]; do
33  case "${END_OF_OPT}${1}" in
34    --help)     print_usage 0 ;;
35    --arch)     rfs_arch=$2;   shift;;
36    --distro)   rfs_distro=$2; shift;;
37    --size)     rfs_size=$2;   shift;;
38    *)          invalid_arg "$1" ;;
39  esac
40  shift
41done
42
43if [ -z "$rfs_arch" ]; then
44  echo "Missing architecture"
45  print_usage 1
46fi
47if [ -z "$rfs_distro" ]; then
48  echo "Missing distribution"
49  print_usage 1
50fi
51if [ -z "$rfs_size" ]; then
52  echo "Missing size"
53  print_usage 1
54fi
55
56if [[ "$rfs_arch" != "arm64" && "$rfs_arch" != "armhf" ]]; then
57  echo "Invalid architecture: $rfs_arch"
58  print_usage 1
59fi
60
61pat='^[0-9]+[K|M|G]$'
62if [[ ! $rfs_size =~ $pat ]]; then
63  echo "Invalid size: $rfs_size"
64  print_usage 1
65fi
66
67update_repositories
68
69echo "Installing build dependencies ..."
70sudo apt-get install debootstrap qemu-user-static schroot qemu-utils
71
72image_name=$rfs_distro-$rfs_arch-"rootfs"
73echo "Creating $rfs_distro ($rfs_arch) root file system ..."
74echo "Image name: $image_name.img"
75echo "Image size: $rfs_size"
76
77qemu-img create $image_name.img $rfs_size
78
79mkfs.ext4 $image_name.img
80mkdir $image_name.dir
81sudo mount -o loop $image_name.img $image_name.dir
82
83sudo qemu-debootstrap --arch $rfs_arch $rfs_distro $image_name.dir
84
85sudo chroot $image_name.dir locale-gen en_US.UTF-8
86
87sudo chroot $image_name.dir sed -i \
88's/main/main restricted multiverse universe/g' /etc/apt/sources.list
89
90sudo chroot $image_name.dir sed -i '$ a\nameserver 8.8.8.8' /etc/resolv.conf
91
92sudo chroot $image_name.dir apt update
93sudo chroot $image_name.dir apt -y install ssh bash-completion
94sudo chroot $image_name.dir adduser --gecos "" $USER
95sudo chroot $image_name.dir adduser $USER sudo
96sudo umount $image_name.dir
97rmdir $image_name.dir
98