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