xref: /openbsd-src/gnu/llvm/lldb/scripts/lldb-test-qemu/rootfs.sh (revision be691f3bb6417f04a68938fadbcaee2d5795e764)
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