root.sh 6.56 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 10 11
# distro and basedir set by calling script 
basedir=$1
image_name=$2
Angus Ainslie's avatar
Angus Ainslie committed
12
cwd=`pwd`
Guido Gunther's avatar
Guido Gunther committed
13 14
target_qemu="${basedir}/${qemu}"
stamp="${basedir}/var/log/gitrev.log"
15

Angus Ainslie's avatar
Angus Ainslie committed
16

17 18 19 20 21 22
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
23

Pedro Vicente's avatar
Pedro Vicente committed
24
set -e
Guido Gunther's avatar
Guido Gunther committed
25
set -u
26

27

Guido Gunther's avatar
Guido Gunther committed
28
mirror=deb.debian.org
29

30 31 32 33
echo "Configuring ${distro} in ${basedir} for board ${pureos_board}"

case ${pureos_board} in 
  imx6)
Guido Gunther's avatar
Guido Gunther committed
34
    fdt_file=imx6qp-nitrogen6_max_purism.dtb
35 36 37 38 39 40 41 42
    ;;
  imx8)
    echo "board type ${pureos_board} not configured yet"
    ;;
  qemu)
    echo "board type ${pureos_board} not configured yet"
    exit 1
    ;;
43
  *)
44 45 46 47
    echo "unrecognized board type ${pureos_board}"
    exit 1
    ;;
esac
Pedro Vicente's avatar
Pedro Vicente committed
48

Guido Gunther's avatar
Guido Gunther committed
49

50 51 52
# bindmount qemu into the rootfs so we can chroot into it if needed
function setup_qemu()
{
Guido Gunther's avatar
Guido Gunther committed
53
    [ -f ${target_qemu} ] || cp "${qemu}" "${target_qemu}"
54 55 56
}


Guido Gunther's avatar
Guido Gunther committed
57 58 59 60 61 62 63 64 65 66 67
function setup_kernel()
{
    local link="$(basename $basedir/boot/vmlinuz-*)"
    rm -f "${basedir}/boot/zImage"
    ln -s "${link}" "${basedir}/boot/zImage"

    mkdir -p "${basedir}/boot/dtbs"
    cp "${basedir}"/usr/lib/linux-image-*/${fdt_file} "${basedir}/boot/dtbs/"
}


68 69
function setup_uboot()
{
70
    sed -e "s/##DTBNAME##/${fdt_file}/" data/boot-${pureos_board}.txt.in > $basedir/boot/boot.txt
71 72
    mkimage -A arm -T script -O linux -d $basedir/boot/boot.txt $basedir/boot/boot.scr
    ln -fs boot.scr $basedir/boot/6x_bootscript
73

74
    [ ! -d files/uboot-${pureos_board} ] || cp -a files/uboot-${pureos_board}/* $basedir/boot/
75 76 77
}


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
function build_tarball()
{
   tarball="$(basename ${image_name} .img)".tar.xz
   pwd=$PWD

   echo -n "Taring up rootfs to $PWD/$tarball..."
   tar --acl \
       --exclude='./run/*' \
       --exclude='./dev/*' \
       --exclude='./sys/*' \
       --exclude='./proc/*' \
       -acf $PWD/$tarball -C $basedir .
   echo "Done."
}


94
function cleanup_chroot()
95
{
96 97
    chroot $basedir apt-get clean

98 99 100 101
    rm $basedir/etc/resolv.conf
    mv $basedir/etc/resolv.conf.bak $basedir/etc/resolv.conf
    rm $basedir/usr/sbin/policy-rc.d

102 103 104 105
    umount $basedir/dev/pts
    umount $basedir/dev
    umount $basedir/sys
    umount $basedir/proc
106 107 108 109 110

    # existence of stamp indicates success
    if [ -f $stamp ]; then
      build_tarball
    fi
111 112 113
}


114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
function prepare_chroot()
{
    trap cleanup_chroot EXIT

    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
}


129 130 131 132 133 134
function create_stamp()
{
    git log --format=format:%H -1 > $stamp
}


135 136
function setup_gui()
{
137 138 139 140
    # Allow purism user to launch weston from the console, etc.
    for group in weston-launch video audio; do
        chroot $basedir adduser purism $group
    done
Guido Gunther's avatar
Guido Gunther committed
141
    # Will move into a debian package once we have build infra
142
    cp data/weston.service $basedir/etc/systemd/system/
Guido Gunther's avatar
Guido Gunther committed
143
    chroot $basedir systemctl enable weston.service
144 145
}

146

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


Guido Gunther's avatar
Guido Gunther committed
159 160 161 162 163 164 165 166 167 168 169
function setup_sshd()
{
    [[ "$packages" =~ "openssh-server" ]] || return
    # Generate new host keys on first boot
    cp data/gen-sshd-host-keys "${basedir}/usr/local/bin/"
    cp data/sshd-host-keys.service "${basedir}/etc/systemd/system/"
    chroot $basedir systemctl enable sshd-host-keys.service
    chroot $basedir rm -f /etc/ssh/ssh_host_*
}


170 171
# 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
172 173 174
# other packages are better installed late to not confuse deboostrap about
# systemd and systemd-shim (e.g. libpam-systemd)
function install_pkgs()
175 176 177 178 179 180 181 182 183 184
{
    # Inspired by https://linux-sunxi.org/Mainline_Debian_HowTo
    (
        export DEBIAN_FRONTEND=noninteractive
        export DEBCONF_NONINTERACTIVE_SEEN=true
        export LC_ALL=C
        export LANGUAGE=C
        export LANG=C

        chroot $basedir apt-get -y update
185
        chroot $basedir apt-get -y install $packages
186 187 188
    )
}

189

190 191 192
function setup_apt()
{
    cat << EOF > $basedir/etc/apt/sources.list
193 194 195 196
deb http://$mirror/debian $distro main contrib non-free
deb-src http://$mirror/debian $distro main contrib non-free
deb http://$mirror/debian $distro-updates main contrib non-free
deb-src http://$mirror/debian $distro-updates main contrib non-free
Pedro Vicente's avatar
Pedro Vicente committed
197 198 199 200
deb http://security.debian.org/debian-security $distro/updates main contrib non-free
deb-src http://security.debian.org/debian-security $distro/updates main contrib non-free
EOF

201
    cat << EOF > $basedir/etc/apt/apt.conf.d/71-no-recommends
Pedro Vicente's avatar
Pedro Vicente committed
202 203
	APT::Install-Recommends "0";
	APT::Install-Suggests "0";
204 205 206 207
EOF
}


208 209 210
function setup_network()
{
    cat << EOF > $basedir/etc/hosts
Pedro Vicente's avatar
Pedro Vicente committed
211 212 213 214 215 216 217 218
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

219
    cat << EOF > $basedir/etc/network/interfaces
Pedro Vicente's avatar
Pedro Vicente committed
220 221
auto lo
iface lo inet loopback
222

Pedro Vicente's avatar
Pedro Vicente committed
223 224 225 226
allow-hotplug eth0
iface eth0 inet dhcp
EOF

227 228 229

# Don't setup resolv.conf if it's a symlink
# DHCP will later handle this just fine
230 231
    if [ -f $basedir/etc/resolv.conf ]; then
        cat <<EOF > $basedir/etc/resolv.conf
232 233
    nameserver 208.67.220.220
    nameserver 208.67.222.222
Pedro Vicente's avatar
Pedro Vicente committed
234
EOF
235 236 237 238 239 240
    fi
}

# create the directories so that this script can be tested without the generated filesystem
mkdir -p $basedir/etc/apt/apt.conf.d/
mkdir -p $basedir/etc/network
Pedro Vicente's avatar
Pedro Vicente committed
241 242 243 244 245 246 247 248 249

export MALLOC_CHECK_=0 # workaround for LP: #520465
export LC_ALL=C
export DEBIAN_FRONTEND=noninteractive

cat << EOF > $basedir/debconf.set
console-common console-data/keymap/policy select Select keymap from full list
console-common console-data/keymap/full select en-latin1-nodeadkeys
EOF
250

251
setup_network
252
prepare_chroot
253
setup_qemu
254
setup_apt
255
install_pkgs
256
setup_gui
Guido Gunther's avatar
Guido Gunther committed
257
setup_journal
Guido Gunther's avatar
Guido Gunther committed
258
setup_sshd
Guido Gunther's avatar
Guido Gunther committed
259 260 261 262 263
# Skip setup until we have hardware,  not needed for qemu
if [ "${pureos_board}" != "imx8" ]; then
  setup_kernel
  setup_uboot
fi
264
create_stamp
265 266

if [ -x files/local.sh ]; then
267 268 269
    echo "Warning: local.sh found, image is tainted"
    echo "tainted: true" >> files/meta.yml
    ./files/local.sh "$@"
270
fi