root.sh 7.8 KB
Newer Older
Guido Gunther's avatar
Guido Gunther committed
1
#!/bin/bash
2 3 4 5 6
#
# Copyright (C) 2017 Purism SPC
#
# SPDX-License-Identifier: GPL-3.0+
#
Pedro Vicente's avatar
Pedro Vicente committed
7

8

9
# distro and basedir set by calling script 
Guido Gunther's avatar
Guido Gunther committed
10 11
basedir="$1"
image_name="$2"
Guido Gunther's avatar
Guido Gunther committed
12 13
target_qemu="${basedir}/${qemu}"
stamp="${basedir}/var/log/gitrev.log"
14

15 16 17 18 19 20
for env_var in distro pureos_board packages; do
    if [ -z "${!env_var}" ]; then
	echo "Must pass in \$${env_var} via the environment" 1>&2
	exit 1
    fi
done
21

Pedro Vicente's avatar
Pedro Vicente committed
22
set -e
Guido Gunther's avatar
Guido Gunther committed
23
set -u
24
set -x
25

26

27 28
echo "Configuring ${distro} in ${basedir} for board ${pureos_board}"

29 30 31
# bindmount qemu into the rootfs so we can chroot into it if needed
function setup_qemu()
{
Guido Gunther's avatar
Guido Gunther committed
32
    [ -f "${target_qemu}" ] || cp "${qemu}" "${target_qemu}"
33 34 35
}


Guido Gunther's avatar
Guido Gunther committed
36 37
function setup_kernel()
{
Guido Gunther's avatar
Guido Gunther committed
38 39 40
    local link

    link=$(basename "${basedir}"/boot/vmlinuz-*)
Guido Gunther's avatar
Guido Gunther committed
41 42
    rm -f "${basedir}/boot/zImage"
    ln -s "${link}" "${basedir}/boot/zImage"
43
    cp data/update-zImage-link "${basedir}/etc/kernel/postinst.d/"
Guido Gunther's avatar
Guido Gunther committed
44 45

    mkdir -p "${basedir}/boot/dtbs"
46 47 48 49
    case "${pureos_board}" in
        imx6)
            fdt_source="${basedir}"/usr/lib/linux-image-*/"${fdt_file}"
            ;;
50
        ec-som|devkit|imx8)
51 52 53 54
            fdt_source="${basedir}"/usr/lib/linux-image-*/freescale/"${fdt_file}"
            cp "${basedir}/boot/${link}" "${basedir}/boot/Image.gz"
            gunzip "${basedir}/boot/Image.gz"
            ;;
55 56
    esac
    cp ${fdt_source} "${basedir}/boot/dtbs/"
57 58 59
    # Make sure we have the kernel available for tests
    mkdir -p tmp/
    cp "${basedir}/boot/zImage" "tmp/"
Guido Gunther's avatar
Guido Gunther committed
60 61 62
}


63 64
function setup_uboot()
{
65 66 67 68 69 70
    sed -e "s/##DTBNAME##/${fdt_file}/" "data/boot-${pureos_board}.txt.in" > "${basedir}/boot/boot_emmc.txt"
    sed -e "s/##RFSPART##/0/" -i "${basedir}/boot/boot_emmc.txt"
    mkimage -A arm -T script -O linux -d "${basedir}/boot/boot_emmc.txt" "${basedir}/boot/boot_emmc.scr"
    sed -e "s/##DTBNAME##/${fdt_file}/" "data/boot-${pureos_board}.txt.in" > "${basedir}/boot/boot_sd.txt"
    sed -e "s/##RFSPART##/1/" -i "${basedir}/boot/boot_sd.txt"
    mkimage -A arm -T script -O linux -d "${basedir}/boot/boot_sd.txt" "${basedir}/boot/boot_sd.scr"
71
    if [ "${pureos_board}" == "imx6" ]; then
72
        ln -fs boot_sd.scr "${basedir}/boot/6x_bootscript"
73 74
    elif [ "${pureos_board}" == "devkit" ]; then
        ln -fs boot_emmc.scr "${basedir}/boot/boot.scr"
75
    else
76
        ln -fs boot_sd.scr "${basedir}/boot/boot.scr"
77
    fi
78

Guido Gunther's avatar
Guido Gunther committed
79
    [ ! -d "files/uboot-${pureos_board}" ] || cp -a "files/uboot-${pureos_board}/"* "${basedir}/boot/"
80 81 82
}


83 84
function build_tarball()
{
Guido Gunther's avatar
Guido Gunther committed
85
   tarball=$(basename "${image_name}" .img).tar.xz
86

Guido Gunther's avatar
Guido Gunther committed
87
   echo -n "Taring up rootfs to $PWD/${tarball}..."
88 89 90 91 92
   tar --acl \
       --exclude='./run/*' \
       --exclude='./dev/*' \
       --exclude='./sys/*' \
       --exclude='./proc/*' \
Guido Gunther's avatar
Guido Gunther committed
93
       -acf "${PWD}/${tarball}" -C "${basedir}" .
94 95 96 97
   echo "Done."
}


98
function cleanup_chroot()
99
{
Guido Gunther's avatar
Guido Gunther committed
100
    chroot "${basedir}" apt-get clean
101

Guido Gunther's avatar
Guido Gunther committed
102 103 104
    rm "${basedir}/etc/resolv.conf"
    mv "${basedir}/etc/resolv.conf.bak" "${basedir}/etc/resolv.conf"
    rm "${basedir}/usr/sbin/policy-rc.d"
105

Guido Gunther's avatar
Guido Gunther committed
106 107 108 109
    umount "${basedir}/dev/pts"
    umount "${basedir}/dev"
    umount "${basedir}/sys"
    umount "${basedir}/proc"
110 111

    # existence of stamp indicates success
112 113 114 115
    if [ -f "${stamp}" ]; then
      [ -z "${build_tarball}" ] || build_tarball
    else
      exit 1
116
    fi
117 118 119
}


120 121 122 123
function prepare_chroot()
{
    trap cleanup_chroot EXIT

Guido Gunther's avatar
Guido Gunther committed
124 125 126 127 128 129 130 131
    mount -t proc chproc "${basedir}/proc"
    mount -t sysfs chsys "${basedir}/sys"
    mount -t devtmpfs chdev "${basedir}/dev" || mount --bind /dev "${basedir}/dev"
    mount -t devpts chpts "${basedir}/dev/pts"
    echo -e '#!/bin/sh\nexit 101' > "${basedir}/usr/sbin/policy-rc.d"
    chmod 755 "${basedir}/usr/sbin/policy-rc.d"
    mv "${basedir}/etc/resolv.conf" "${basedir}/etc/resolv.conf.bak"
    cp /etc/resolv.conf "${basedir}/etc"
132 133 134
}


135 136
function create_stamp()
{
Guido Gunther's avatar
Guido Gunther committed
137
    git log --format=format:%H -1 > "${stamp}"
138 139 140
}


141 142
function setup_gui()
{
143
    # Allow purism user to launch weston from the console, etc.
Guido Gunther's avatar
Guido Gunther committed
144
    for group in video audio; do
Guido Gunther's avatar
Guido Gunther committed
145
        chroot "${basedir}" adduser purism "${group}"
146
    done
Guido Gunther's avatar
Guido Gunther committed
147
    chroot "${basedir}" systemctl enable phosh.service
148 149
}

150

Guido Gunther's avatar
Guido Gunther committed
151 152 153
function setup_journal()
{
    # Enable systemd journal
Guido Gunther's avatar
Guido Gunther committed
154 155 156
    chroot "${basedir}" mkdir -p /var/log/journal
    chroot "${basedir}" systemd-tmpfiles --create --prefix /var/log/journal
    chroot "${basedir}" apt-get -y remove rsyslog
Guido Gunther's avatar
Guido Gunther committed
157
    for l in daemon messages syslog kern mail user; do
Guido Gunther's avatar
Guido Gunther committed
158
        chroot "${basedir}" rm -f /var/log/${l}.*
Guido Gunther's avatar
Guido Gunther committed
159 160 161 162
    done
}


Guido Gunther's avatar
Guido Gunther committed
163 164
function setup_sshd()
{
165
    [ -x "${basedir}/usr/sbin/sshd" ] || return
166
    # Make sure unique host keys are generated on first boot
Guido Gunther's avatar
Guido Gunther committed
167
    chroot "${basedir}" rm -f /etc/ssh/ssh_host_*
Guido Gunther's avatar
Guido Gunther committed
168 169 170
}


171 172 173 174 175 176 177
function setup_locale()
{
    echo "en_US.UTF-8 UTF-8" > "${basedir}/etc/locale.gen"
    chroot "${basedir}" dpkg-reconfigure locales
}


178 179
# We have to do this because task packages don't work with debootstrap
# (and won't).  See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=841649
180 181 182
# other packages are better installed late to not confuse deboostrap about
# systemd and systemd-shim (e.g. libpam-systemd)
function install_pkgs()
183
{
184
    chroot "${basedir}" apt-get -y update
185 186 187 188
    if ! chroot "${basedir}" apt -y install ${packages}; then
	echo "Package installation failed, this might help to diagnose the problem:"
	chroot "${basedir}" apt -y -o Debug::pkgProblemResolver=yes install -y --simulate ${packages}
    fi
189 190
}

191

192 193
function setup_apt()
{
194 195 196
    echo "${apt_sources}" | sed 's/|/\n/g' > "${basedir}/etc/apt/sources.list"
    echo "Set sources list to:"
    cat "${basedir}/etc/apt/sources.list"
Guido Gunther's avatar
Guido Gunther committed
197

Guido Gunther's avatar
Guido Gunther committed
198
    cat << EOF > "${basedir}/etc/apt/apt.conf.d/71-no-recommends"
Pedro Vicente's avatar
Pedro Vicente committed
199 200
	APT::Install-Recommends "0";
	APT::Install-Suggests "0";
201
EOF
Guido Gunther's avatar
Guido Gunther committed
202
    chroot ${basedir} apt-get install -y gnupg
203 204 205 206 207 208 209

    if [ "${ci_pkgs}" -gt 0 ]; then
      cat << EOF > "${basedir}/etc/apt/sources.list.d/ci.list"
deb http://ci.puri.sm/ scratch librem5
EOF
      cat data/ci-repo.key | chroot ${basedir} apt-key add -
    fi
210 211 212
}


213 214
function setup_network()
{
215 216 217 218 219
	cat << EOF > "${basedir}/etc/modprobe.d/rsi_91x.conf"
# This is for wlan sta + BT
options dev_oper_mode=13 rsi_zone_enabled=1
EOF

Guido Gunther's avatar
Guido Gunther committed
220
    cat << EOF > "${basedir}/etc/hosts"
Pedro Vicente's avatar
Pedro Vicente committed
221 222 223 224 225 226 227 228
127.0.0.1       pureos   localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
EOF

Guido Gunther's avatar
Guido Gunther committed
229
    cat << EOF > "${basedir}/etc/network/interfaces"
Pedro Vicente's avatar
Pedro Vicente committed
230 231
auto lo
iface lo inet loopback
232

Pedro Vicente's avatar
Pedro Vicente committed
233 234 235 236
allow-hotplug eth0
iface eth0 inet dhcp
EOF

237 238 239 240 241 242 243 244 245 246 247
# Don't setup resolv.conf if it's a symlink
# DHCP will later handle this just fine
    if [ -f "${basedir}/etc/resolv.conf" ]; then
        cat <<EOF > "${basedir}/etc/resolv.conf"
    nameserver 208.67.220.220
    nameserver 208.67.222.222
EOF
    fi
}


248 249 250 251 252 253 254 255 256 257
function create_report()
{
	echo "Installed packages:"
	chroot "${basedir}" dpkg -l
	echo -e "\nInstalled apt keys:"
	chroot "${basedir}" apt-key list
	echo -e "\nKernels:"
	ls -l "${basedir}/boot"
}

258

259
# create the directories so that this script can be tested without the generated filesystem
Guido Gunther's avatar
Guido Gunther committed
260 261
mkdir -p "${basedir}/etc/apt/apt.conf.d/"
mkdir -p "${basedir}/etc/network"
Pedro Vicente's avatar
Pedro Vicente committed
262 263 264 265

export MALLOC_CHECK_=0 # workaround for LP: #520465
export LC_ALL=C
export DEBIAN_FRONTEND=noninteractive
266
export DEBCONF_NONINTERACTIVE_SEEN=true
Pedro Vicente's avatar
Pedro Vicente committed
267

Guido Gunther's avatar
Guido Gunther committed
268
cat << EOF > "${basedir}/debconf.set"
Pedro Vicente's avatar
Pedro Vicente committed
269 270 271
console-common console-data/keymap/policy select Select keymap from full list
console-common console-data/keymap/full select en-latin1-nodeadkeys
EOF
272

273
setup_network
274
prepare_chroot
275
setup_qemu
276
setup_apt
277
install_pkgs
278
setup_locale
279
setup_gui
Guido Gunther's avatar
Guido Gunther committed
280
setup_journal
Guido Gunther's avatar
Guido Gunther committed
281
setup_sshd
282

Guido Gunther's avatar
Guido Gunther committed
283
# Skip setup until we have hardware,  not needed for qemu
284
case "${pureos_board}" in
285
    imx6|imx8|ec-som|devkit)
286 287 288 289 290 291 292 293
        setup_kernel
        setup_uboot
        ;;
    ?)
        echo "No kernel or u-boot setup for ${pureos_board}"
        ;;
esac

294
create_report > "./tmp/${pureos_board}-report.log"
295
create_stamp
296 297

if [ -x files/local.sh ]; then
298 299 300
    echo "Warning: local.sh found, image is tainted"
    echo "tainted: true" >> files/meta.yml
    ./files/local.sh "$@"
301
fi