* Change Ubuntu Eoan to Ubuntu Groovy and enable it as CSC Tested CLI and desktop image, but needs cache creation and repository before it will be possible to build without error. * Update Groovy compiler for chroot * Adjust pkg dependencies for groovy Sadly htop doesn't build
606 lines
26 KiB
Bash
606 lines
26 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Copyright (c) 2015 Igor Pecovnik, igor.pecovnik@gma**.com
|
|
#
|
|
# This file is licensed under the terms of the GNU General Public
|
|
# License version 2. This program is licensed "as is" without any
|
|
# warranty of any kind, whether express or implied.
|
|
|
|
# This file is a part of the Armbian build script
|
|
# https://github.com/armbian/build/
|
|
|
|
# Functions:
|
|
# install_common
|
|
# install_rclocal
|
|
# install_distribution_specific
|
|
# post_debootstrap_tweaks
|
|
|
|
install_common()
|
|
{
|
|
display_alert "Applying common tweaks" "" "info"
|
|
|
|
# install rootfs encryption related packages separate to not break packages cache
|
|
if [[ $CRYPTROOT_ENABLE == yes ]]; then
|
|
display_alert "Installing rootfs encryption related packages" "cryptsetup" "info"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq --no-install-recommends install cryptsetup" \
|
|
>> "${DEST}"/debug/install.log 2>&1
|
|
if [[ $CRYPTROOT_SSH_UNLOCK == yes ]]; then
|
|
display_alert "Installing rootfs encryption related packages" "dropbear-initramfs" "info"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq --no-install-recommends install dropbear-initramfs cryptsetup-initramfs" \
|
|
>> "${DEST}"/debug/install.log 2>&1
|
|
fi
|
|
|
|
fi
|
|
|
|
# add dummy fstab entry to make mkinitramfs happy
|
|
echo "/dev/mmcblk0p1 / $ROOTFS_TYPE defaults 0 1" >> "${SDCARD}"/etc/fstab
|
|
# required for initramfs-tools-core on Stretch since it ignores the / fstab entry
|
|
echo "/dev/mmcblk0p2 /usr $ROOTFS_TYPE defaults 0 2" >> "${SDCARD}"/etc/fstab
|
|
|
|
# adjust initramfs dropbear configuration
|
|
# needs to be done before kernel installation, else it won't be in the initrd image
|
|
if [[ $CRYPTROOT_ENABLE == yes && $CRYPTROOT_SSH_UNLOCK == yes ]]; then
|
|
# Set the port of the dropbear ssh deamon in the initramfs to a different one if configured
|
|
# this avoids the typical 'host key changed warning' - `WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!`
|
|
[[ -f "${SDCARD}"/etc/dropbear-initramfs/config ]] && \
|
|
sed -i 's/^#DROPBEAR_OPTIONS=/DROPBEAR_OPTIONS="-p '"${CRYPTROOT_SSH_UNLOCK_PORT}"'"/' \
|
|
"${SDCARD}"/etc/dropbear-initramfs/config
|
|
|
|
# setup dropbear authorized_keys, either provided by userpatches or generated
|
|
if [[ -f $USERPATCHES_PATH/dropbear_authorized_keys ]]; then
|
|
cp "$USERPATCHES_PATH"/dropbear_authorized_keys "${SDCARD}"/etc/dropbear-initramfs/authorized_keys
|
|
else
|
|
# generate a default ssh key for login on dropbear in initramfs
|
|
# this key should be changed by the user on first login
|
|
display_alert "Generating a new SSH key pair for dropbear (initramfs)" "" ""
|
|
ssh-keygen -t ecdsa -f "${SDCARD}"/etc/dropbear-initramfs/id_ecdsa \
|
|
-N '' -O force-command=cryptroot-unlock -C 'AUTOGENERATED_BY_ARMBIAN_BUILD' >> "${DEST}"/debug/install.log 2>&1
|
|
|
|
# /usr/share/initramfs-tools/hooks/dropbear will automatically add 'id_ecdsa.pub' to authorized_keys file
|
|
# during mkinitramfs of update-initramfs
|
|
#cat "${SDCARD}"/etc/dropbear-initramfs/id_ecdsa.pub > "${SDCARD}"/etc/dropbear-initramfs/authorized_keys
|
|
CRYPTROOT_SSH_UNLOCK_KEY_NAME="Armbian_${REVISION}_${BOARD^}_${RELEASE}_${BRANCH}_${VER/-$LINUXFAMILY/}".key
|
|
# copy dropbear ssh key to image output dir for convenience
|
|
cp "${SDCARD}"/etc/dropbear-initramfs/id_ecdsa "${DEST}/images/${CRYPTROOT_SSH_UNLOCK_KEY_NAME}"
|
|
display_alert "SSH private key for dropbear (initramfs) has been copied to:" \
|
|
"$DEST/images/$CRYPTROOT_SSH_UNLOCK_KEY_NAME" "info"
|
|
fi
|
|
fi
|
|
|
|
# create modules file
|
|
local modules=MODULES_${BRANCH^^}
|
|
if [[ -n "${!modules}" ]]; then
|
|
tr ' ' '\n' <<< "${!modules}" > "${SDCARD}"/etc/modules
|
|
elif [[ -n "${MODULES}" ]]; then
|
|
tr ' ' '\n' <<< "${MODULES}" > "${SDCARD}"/etc/modules
|
|
fi
|
|
|
|
# create blacklist files
|
|
local blacklist=MODULES_BLACKLIST_${BRANCH^^}
|
|
if [[ -n "${!blacklist}" ]]; then
|
|
tr ' ' '\n' <<< "${!blacklist}" | sed -e 's/^/blacklist /' > "${SDCARD}/etc/modprobe.d/blacklist-${BOARD}.conf"
|
|
elif [[ -n "${MODULES_BLACKLIST}" ]]; then
|
|
tr ' ' '\n' <<< "${MODULES_BLACKLIST}" | sed -e 's/^/blacklist /' > "${SDCARD}/etc/modprobe.d/blacklist-${BOARD}.conf"
|
|
fi
|
|
|
|
# configure MIN / MAX speed for cpufrequtils
|
|
cat <<-EOF > "${SDCARD}"/etc/default/cpufrequtils
|
|
ENABLE=true
|
|
MIN_SPEED=$CPUMIN
|
|
MAX_SPEED=$CPUMAX
|
|
GOVERNOR=$GOVERNOR
|
|
EOF
|
|
|
|
# remove default interfaces file if present
|
|
# before installing board support package
|
|
rm -f "${SDCARD}"/etc/network/interfaces
|
|
|
|
# disable selinux by default
|
|
mkdir -p "${SDCARD}"/selinux
|
|
[[ -f "${SDCARD}"/etc/selinux/config ]] && sed "s/^SELINUX=.*/SELINUX=disabled/" -i "${SDCARD}"/etc/selinux/config
|
|
|
|
# remove Ubuntu's legal text
|
|
[[ -f "${SDCARD}"/etc/legal ]] && rm "${SDCARD}"/etc/legal
|
|
|
|
# Prevent loading paralel printer port drivers which we don't need here.
|
|
# Suppress boot error if kernel modules are absent
|
|
if [[ -f "${SDCARD}"/etc/modules-load.d/cups-filters.conf ]]; then
|
|
sed "s/^lp/#lp/" -i "${SDCARD}"/etc/modules-load.d/cups-filters.conf
|
|
sed "s/^ppdev/#ppdev/" -i "${SDCARD}"/etc/modules-load.d/cups-filters.conf
|
|
sed "s/^parport_pc/#parport_pc/" -i "${SDCARD}"/etc/modules-load.d/cups-filters.conf
|
|
fi
|
|
|
|
# console fix due to Debian bug
|
|
sed -e 's/CHARMAP=".*"/CHARMAP="'$CONSOLE_CHAR'"/g' -i "${SDCARD}"/etc/default/console-setup
|
|
|
|
# add the /dev/urandom path to the rng config file
|
|
echo "HRNGDEVICE=/dev/urandom" >> "${SDCARD}"/etc/default/rng-tools
|
|
|
|
# ping needs privileged action to be able to create raw network socket
|
|
# this is working properly but not with (at least) Debian Buster
|
|
chroot "${SDCARD}" /bin/bash -c "chmod u+s /bin/ping"
|
|
|
|
# change time zone data
|
|
echo "${TZDATA}" > "${SDCARD}"/etc/timezone
|
|
chroot "${SDCARD}" /bin/bash -c "dpkg-reconfigure -f noninteractive tzdata >/dev/null 2>&1"
|
|
|
|
# set root password
|
|
chroot "${SDCARD}" /bin/bash -c "(echo $ROOTPWD;echo $ROOTPWD;) | passwd root >/dev/null 2>&1"
|
|
|
|
# enable automated login to console(s)
|
|
mkdir -p "${SDCARD}"/etc/systemd/system/getty@.service.d/
|
|
mkdir -p "${SDCARD}"/etc/systemd/system/serial-getty@.service.d/
|
|
cat <<-EOF > "${SDCARD}"/etc/systemd/system/serial-getty@.service.d/override.conf
|
|
[Service]
|
|
ExecStartPre=/bin/sh -c 'exec /bin/sleep 10'
|
|
ExecStart=
|
|
ExecStart=-/sbin/agetty --noissue --autologin root %I $TERM
|
|
After=graphical.target
|
|
Type=idle
|
|
EOF
|
|
cp "${SDCARD}"/etc/systemd/system/serial-getty@.service.d/override.conf "${SDCARD}"/etc/systemd/system/getty@.service.d/override.conf
|
|
|
|
# force change root password at first login
|
|
#chroot "${SDCARD}" /bin/bash -c "chage -d 0 root"
|
|
|
|
# change console welcome text
|
|
echo -e "Armbian ${REVISION} ${RELEASE^} \\l \n" > "${SDCARD}"/etc/issue
|
|
echo "Armbian ${REVISION} ${RELEASE^}" > "${SDCARD}"/etc/issue.net
|
|
sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"Armbian $REVISION "${RELEASE^}"\"/" "${SDCARD}"/etc/os-release
|
|
|
|
# enable few bash aliases enabled in Ubuntu by default to make it even
|
|
sed "s/#alias ll='ls -l'/alias ll='ls -l'/" -i "${SDCARD}"/etc/skel/.bashrc
|
|
sed "s/#alias la='ls -A'/alias la='ls -A'/" -i "${SDCARD}"/etc/skel/.bashrc
|
|
sed "s/#alias l='ls -CF'/alias l='ls -CF'/" -i "${SDCARD}"/etc/skel/.bashrc
|
|
# root user is already there. Copy bashrc there as well
|
|
cp "${SDCARD}"/etc/skel/.bashrc "${SDCARD}"/root
|
|
|
|
# display welcome message at first root login
|
|
touch "${SDCARD}"/root/.not_logged_in_yet
|
|
|
|
if [[ ${DESKTOP_AUTOLOGIN} != no ]]; then
|
|
# set desktop autologin
|
|
touch "${SDCARD}"/root/.desktop_autologin
|
|
fi
|
|
|
|
# NOTE: this needs to be executed before family_tweaks
|
|
local bootscript_src=${BOOTSCRIPT%%:*}
|
|
local bootscript_dst=${BOOTSCRIPT##*:}
|
|
cp "${SRC}/config/bootscripts/${bootscript_src}" "${SDCARD}/boot/${bootscript_dst}"
|
|
|
|
if [[ -n $BOOTENV_FILE ]]; then
|
|
if [[ -f $USERPATCHES_PATH/bootenv/$BOOTENV_FILE ]]; then
|
|
cp "$USERPATCHES_PATH/bootenv/${BOOTENV_FILE}" "${SDCARD}"/boot/armbianEnv.txt
|
|
elif [[ -f $SRC/config/bootenv/$BOOTENV_FILE ]]; then
|
|
cp "${SRC}/config/bootenv/${BOOTENV_FILE}" "${SDCARD}"/boot/armbianEnv.txt
|
|
fi
|
|
fi
|
|
|
|
# TODO: modify $bootscript_dst or armbianEnv.txt to make NFS boot universal
|
|
# instead of copying sunxi-specific template
|
|
if [[ $ROOTFS_TYPE == nfs ]]; then
|
|
display_alert "Copying NFS boot script template"
|
|
if [[ -f $USERPATCHES_PATH/nfs-boot.cmd ]]; then
|
|
cp "$USERPATCHES_PATH"/nfs-boot.cmd "${SDCARD}"/boot/boot.cmd
|
|
else
|
|
cp "${SRC}"/config/templates/nfs-boot.cmd.template "${SDCARD}"/boot/boot.cmd
|
|
fi
|
|
fi
|
|
|
|
[[ -n $OVERLAY_PREFIX && -f "${SDCARD}"/boot/armbianEnv.txt ]] && \
|
|
echo "overlay_prefix=$OVERLAY_PREFIX" >> "${SDCARD}"/boot/armbianEnv.txt
|
|
|
|
[[ -n $DEFAULT_OVERLAYS && -f "${SDCARD}"/boot/armbianEnv.txt ]] && \
|
|
echo "overlays=${DEFAULT_OVERLAYS//,/ }" >> "${SDCARD}"/boot/armbianEnv.txt
|
|
|
|
[[ -n $BOOT_FDT_FILE && -f "${SDCARD}"/boot/armbianEnv.txt ]] && \
|
|
echo "fdtfile=${BOOT_FDT_FILE}" >> "${SDCARD}/boot/armbianEnv.txt"
|
|
|
|
# initial date for fake-hwclock
|
|
date -u '+%Y-%m-%d %H:%M:%S' > "${SDCARD}"/etc/fake-hwclock.data
|
|
|
|
echo "${HOST}" > "${SDCARD}"/etc/hostname
|
|
|
|
# set hostname in hosts file
|
|
cat <<-EOF > "${SDCARD}"/etc/hosts
|
|
127.0.0.1 localhost $HOST
|
|
::1 localhost $HOST ip6-localhost ip6-loopback
|
|
fe00::0 ip6-localnet
|
|
ff00::0 ip6-mcastprefix
|
|
ff02::1 ip6-allnodes
|
|
ff02::2 ip6-allrouters
|
|
EOF
|
|
|
|
display_alert "Updating" "package lists"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get update &>/dev/null"
|
|
[[ $? -ne 0 ]] && exit_with_error "Updating packages failed"
|
|
|
|
# install family packages
|
|
if [[ -n ${PACKAGE_LIST_FAMILY} ]]; then
|
|
chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -yqq --no-install-recommends install $PACKAGE_LIST_FAMILY" >> "${DEST}"/debug/install.log
|
|
fi
|
|
|
|
# install board packages
|
|
if [[ -n ${PACKAGE_LIST_BOARD} ]]; then
|
|
chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -yqq --no-install-recommends install $PACKAGE_LIST_BOARD" >> "${DEST}"/debug/install.log
|
|
fi
|
|
|
|
# remove family packages
|
|
if [[ -n ${PACKAGE_LIST_FAMILY_REMOVE} ]]; then
|
|
chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -yqq remove --auto-remove $PACKAGE_LIST_FAMILY_REMOVE" >> "${DEST}"/debug/install.log
|
|
fi
|
|
|
|
# remove board packages
|
|
if [[ -n ${PACKAGE_LIST_BOARD_REMOVE} ]]; then
|
|
chroot "${SDCARD}" /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -yqq remove --auto-remove $PACKAGE_LIST_BOARD_REMOVE" >> "${DEST}"/debug/install.log
|
|
fi
|
|
|
|
# install u-boot
|
|
if [[ "${REPOSITORY_INSTALL}" != *u-boot* ]]; then
|
|
UBOOT_VER=$(dpkg --info "${DEB_STORAGE}/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb" | grep Descr | awk '{print $(NF)}')
|
|
install_deb_chroot "${DEB_STORAGE}/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb"
|
|
else
|
|
UBOOT_VER=$(chroot "${SDCARD}" /bin/bash -c "apt-cache --names-only search ^linux-u-boot-${BOARD}-${BRANCH} | awk '{print \$(NF)}'")
|
|
display_alert "Installing from repository" "linux-u-boot-${BOARD}-${BRANCH} $UBOOT_VER"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -qq -y install linux-u-boot-${BOARD}-${BRANCH}" >> "${DEST}"/debug/install.log 2>&1
|
|
# we need package later, move to output, apt-get must be here, apt deletes file
|
|
UPSTREM_VER=$(dpkg-deb -I "${SDCARD}"/var/cache/apt/archives/linux-u-boot-${BOARD}-${BRANCH}*_${ARCH}.deb | grep Version | awk '{print $(NF)}')
|
|
mv "${SDCARD}"/var/cache/apt/archives/linux-u-boot-${BOARD}-${BRANCH}*_${ARCH}.deb ${DEB_STORAGE}/${CHOSEN_UBOOT}_${UPSTREM_VER}_${ARCH}.deb
|
|
fi
|
|
|
|
# install kernel
|
|
if [[ "${REPOSITORY_INSTALL}" != *kernel* ]]; then
|
|
VER=$(dpkg --info "${DEB_STORAGE}/${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb" | grep Descr | awk '{print $(NF)}')
|
|
VER="${VER/-$LINUXFAMILY/}"
|
|
install_deb_chroot "${DEB_STORAGE}/${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb"
|
|
if [[ -f ${DEB_STORAGE}/${CHOSEN_KERNEL/image/dtb}_${REVISION}_${ARCH}.deb ]]; then
|
|
install_deb_chroot "${DEB_STORAGE}/${CHOSEN_KERNEL/image/dtb}_${REVISION}_${ARCH}.deb"
|
|
fi
|
|
if [[ $INSTALL_HEADERS == yes ]]; then
|
|
install_deb_chroot "${DEB_STORAGE}/${CHOSEN_KERNEL/image/headers}_${REVISION}_${ARCH}.deb"
|
|
fi
|
|
else
|
|
VER=$(chroot "${SDCARD}" /bin/bash -c "apt-cache --names-only search ^linux-image-${BRANCH}-${LINUXFAMILY} | awk '{print \$(NF)}'")
|
|
VER="${VER/-$LINUXFAMILY/}"
|
|
display_alert "Installing from repository" "linux-image-${BRANCH}-${LINUXFAMILY} $VER"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install linux-image-${BRANCH}-${LINUXFAMILY}" >> "${DEST}"/debug/install.log 2>&1
|
|
display_alert "Installing from repository" "linux-dtb-${BRANCH}-${LINUXFAMILY}"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install linux-dtb-${BRANCH}-${LINUXFAMILY}" >> "${DEST}"/debug/install.log 2>&1
|
|
if [[ $INSTALL_HEADERS == yes ]]; then
|
|
display_alert "Installing from repository" "armbian-headers"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install linux-headers-${BRANCH}-${LINUXFAMILY}" >> "${DEST}"/debug/install.log 2>&1
|
|
fi
|
|
fi
|
|
|
|
# install board support packages
|
|
if [[ "${REPOSITORY_INSTALL}" != *bsp* ]]; then
|
|
install_deb_chroot "${DEB_STORAGE}/$RELEASE/${CHOSEN_ROOTFS}_${REVISION}_${ARCH}.deb" >> "${DEST}"/debug/install.log 2>&1
|
|
else
|
|
display_alert "Installing from repository" "${CHOSEN_ROOTFS}"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install ${CHOSEN_ROOTFS}" >> "${DEST}"/debug/install.log 2>&1
|
|
fi
|
|
|
|
# install armbian-desktop
|
|
if [[ "${REPOSITORY_INSTALL}" != *armbian-desktop* ]]; then
|
|
if [[ $BUILD_DESKTOP == yes ]]; then
|
|
install_deb_chroot "${DEB_STORAGE}/$RELEASE/armbian-${RELEASE}-desktop_${REVISION}_all.deb"
|
|
# install display manager and PACKAGE_LIST_DESKTOP_FULL packages if enabled per board
|
|
desktop_postinstall
|
|
fi
|
|
else
|
|
if [[ $BUILD_DESKTOP == yes ]]; then
|
|
display_alert "Installing from repository" "armbian-${RELEASE}-desktop"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install armbian-${RELEASE}-desktop" >> "${DEST}"/debug/install.log 2>&1
|
|
# install display manager and PACKAGE_LIST_DESKTOP_FULL packages if enabled per board
|
|
desktop_postinstall
|
|
fi
|
|
fi
|
|
|
|
# install armbian-firmware
|
|
if [[ "${REPOSITORY_INSTALL}" != *armbian-firmware* ]]; then
|
|
if [[ -f ${DEB_STORAGE}/armbian-firmware_${REVISION}_all.deb ]]; then
|
|
install_deb_chroot "${DEB_STORAGE}/armbian-firmware_${REVISION}_all.deb"
|
|
fi
|
|
else
|
|
display_alert "Installing from repository" "armbian-firmware"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install armbian-firmware" >> "${DEST}"/debug/install.log 2>&1
|
|
fi
|
|
|
|
# install armbian-config
|
|
if [[ "${REPOSITORY_INSTALL}" != *armbian-config* ]]; then
|
|
if [[ $BUILD_MINIMAL != yes ]]; then
|
|
install_deb_chroot "${DEB_STORAGE}/armbian-config_${REVISION}_all.deb"
|
|
fi
|
|
else
|
|
if [[ $BUILD_MINIMAL != yes ]]; then
|
|
display_alert "Installing from repository" "armbian-config"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install armbian-config" >> "${DEST}"/debug/install.log 2>&1
|
|
fi
|
|
fi
|
|
|
|
# install kernel sources
|
|
if [[ -f ${DEB_STORAGE}/${CHOSEN_KSRC}_${REVISION}_all.deb && $INSTALL_KSRC == yes ]]; then
|
|
install_deb_chroot "${DEB_STORAGE}/${CHOSEN_KSRC}_${REVISION}_all.deb"
|
|
fi
|
|
|
|
# install wireguard tools
|
|
if [[ $WIREGUARD == yes ]]; then
|
|
chroot "${SDCARD}" /bin/bash -c "apt-get -y -qq install wireguard-tools --no-install-recommends" >> "${DEST}"/debug/install.log 2>&1
|
|
fi
|
|
|
|
# freeze armbian packages
|
|
if [[ $BSPFREEZE == yes ]]; then
|
|
display_alert "Freezing Armbian packages" "$BOARD" "info"
|
|
chroot "${SDCARD}" /bin/bash -c "apt-mark hold ${CHOSEN_KERNEL} ${CHOSEN_KERNEL/image/headers} \
|
|
linux-u-boot-${BOARD}-${BRANCH} ${CHOSEN_KERNEL/image/dtb}" >> "${DEST}"/debug/install.log 2>&1
|
|
fi
|
|
|
|
# remove deb files
|
|
rm -f "${SDCARD}"/root/*.deb
|
|
|
|
# copy boot splash images
|
|
cp "${SRC}"/packages/blobs/splash/armbian-u-boot.bmp "${SDCARD}"/boot/boot.bmp
|
|
|
|
# execute $LINUXFAMILY-specific tweaks
|
|
[[ $(type -t family_tweaks) == function ]] && family_tweaks
|
|
|
|
# enable additional services
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable armbian-firstrun.service >/dev/null 2>&1"
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable armbian-firstrun-config.service >/dev/null 2>&1"
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable armbian-zram-config.service >/dev/null 2>&1"
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable armbian-hardware-optimize.service >/dev/null 2>&1"
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable armbian-ramlog.service >/dev/null 2>&1"
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable armbian-resize-filesystem.service >/dev/null 2>&1"
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable armbian-hardware-monitor.service >/dev/null 2>&1"
|
|
|
|
# copy "first run automated config, optional user configured"
|
|
cp "${SRC}"/packages/bsp/armbian_first_run.txt.template "${SDCARD}"/boot/armbian_first_run.txt.template
|
|
|
|
# switch to beta repository at this stage if building nightly images
|
|
[[ $IMAGE_TYPE == nightly ]] \
|
|
&& echo "deb http://beta.armbian.com $RELEASE main ${RELEASE}-utils ${RELEASE}-desktop" \
|
|
> "${SDCARD}"/etc/apt/sources.list.d/armbian.list
|
|
|
|
# Cosmetic fix [FAILED] Failed to start Set console font and keymap at first boot
|
|
[[ -f "${SDCARD}"/etc/console-setup/cached_setup_font.sh ]] \
|
|
&& sed -i "s/^printf '.*/printf '\\\033\%\%G'/g" "${SDCARD}"/etc/console-setup/cached_setup_font.sh
|
|
[[ -f "${SDCARD}"/etc/console-setup/cached_setup_terminal.sh ]] \
|
|
&& sed -i "s/^printf '.*/printf '\\\033\%\%G'/g" "${SDCARD}"/etc/console-setup/cached_setup_terminal.sh
|
|
[[ -f "${SDCARD}"/etc/console-setup/cached_setup_keyboard.sh ]] \
|
|
&& sed -i "s/-u/-x'/g" "${SDCARD}"/etc/console-setup/cached_setup_keyboard.sh
|
|
|
|
# fix for https://bugs.launchpad.net/ubuntu/+source/blueman/+bug/1542723
|
|
chroot "${SDCARD}" /bin/bash -c "chown root:messagebus /usr/lib/dbus-1.0/dbus-daemon-launch-helper"
|
|
chroot "${SDCARD}" /bin/bash -c "chmod u+s /usr/lib/dbus-1.0/dbus-daemon-launch-helper"
|
|
|
|
# disable low-level kernel messages for non betas
|
|
if [[ -z $BETA ]]; then
|
|
sed -i "s/^#kernel.printk*/kernel.printk/" "${SDCARD}"/etc/sysctl.conf
|
|
fi
|
|
|
|
# disable repeated messages due to xconsole not being installed.
|
|
[[ -f "${SDCARD}"/etc/rsyslog.d/50-default.conf ]] && \
|
|
sed '/daemon\.\*\;mail.*/,/xconsole/ s/.*/#&/' -i "${SDCARD}"/etc/rsyslog.d/50-default.conf
|
|
|
|
# disable deprecated parameter
|
|
sed '/.*$KLogPermitNonKernelFacility.*/,// s/.*/#&/' -i "${SDCARD}"/etc/rsyslog.conf
|
|
|
|
# enable getty on multiple serial consoles
|
|
# and adjust the speed if it is defined and different than 115200
|
|
#
|
|
# example: SERIALCON="ttyS0:15000000,ttyGS1"
|
|
#
|
|
ifs=$IFS
|
|
for i in $(echo "${SERIALCON:-'ttyS0'}" | sed "s/,/ /g")
|
|
do
|
|
IFS=':' read -r -a array <<< "$i"
|
|
# add serial console to secure tty list
|
|
[ -z "$(grep -w '^${array[0]}' "${SDCARD}"/etc/securetty 2> /dev/null)" ] && \
|
|
echo "${array[0]}" >> "${SDCARD}"/etc/securetty
|
|
if [[ ${array[1]} != "115200" && -n ${array[1]} ]]; then
|
|
# make a copy, fix speed and enable
|
|
cp "${SDCARD}"/lib/systemd/system/serial-getty@.service \
|
|
"${SDCARD}/lib/systemd/system/serial-getty@${array[0]}.service"
|
|
sed -i "s/--keep-baud 115200/--keep-baud ${array[1]},115200/" \
|
|
"${SDCARD}/lib/systemd/system/serial-getty@${array[0]}.service"
|
|
fi
|
|
display_alert "Enabling serial console" "${array[0]}" "info"
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl daemon-reload" >> "${DEST}"/debug/install.log 2>&1
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload enable serial-getty@${array[0]}.service" \
|
|
>> "${DEST}"/debug/install.log 2>&1
|
|
if [[ "${array[0]}" == "ttyGS0" && $LINUXFAMILY == sun8i && $BRANCH == default ]]; then
|
|
mkdir -p "${SDCARD}"/etc/systemd/system/serial-getty@ttyGS0.service.d
|
|
cat <<-EOF > "${SDCARD}"/etc/systemd/system/serial-getty@ttyGS0.service.d/10-switch-role.conf
|
|
[Service]
|
|
ExecStartPre=-/bin/sh -c "echo 2 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role"
|
|
EOF
|
|
fi
|
|
done
|
|
IFS=$ifs
|
|
|
|
[[ $LINUXFAMILY == sun*i ]] && mkdir -p "${SDCARD}"/boot/overlay-user
|
|
|
|
# to prevent creating swap file on NFS (needs specific kernel options)
|
|
# and f2fs/btrfs (not recommended or needs specific kernel options)
|
|
[[ $ROOTFS_TYPE != ext4 ]] && touch "${SDCARD}"/var/swap
|
|
|
|
# install initial asound.state if defined
|
|
mkdir -p "${SDCARD}"/var/lib/alsa/
|
|
[[ -n $ASOUND_STATE ]] && cp "${SRC}/packages/blobs/asound.state/${ASOUND_STATE}" "${SDCARD}"/var/lib/alsa/asound.state
|
|
|
|
# save initial armbian-release state
|
|
cp "${SDCARD}"/etc/armbian-release "${SDCARD}"/etc/armbian-image-release
|
|
|
|
# DNS fix. package resolvconf is not available everywhere
|
|
if [ -d /etc/resolvconf/resolv.conf.d ]; then
|
|
echo "nameserver $NAMESERVER" > "${SDCARD}"/etc/resolvconf/resolv.conf.d/head
|
|
fi
|
|
|
|
# permit root login via SSH for the first boot
|
|
sed -i 's/#\?PermitRootLogin .*/PermitRootLogin yes/' "${SDCARD}"/etc/ssh/sshd_config
|
|
|
|
# enable PubkeyAuthentication
|
|
sed -i 's/#\?PubkeyAuthentication .*/PubkeyAuthentication yes/' "${SDCARD}"/etc/ssh/sshd_config
|
|
|
|
# configure network manager
|
|
sed "s/managed=\(.*\)/managed=true/g" -i "${SDCARD}"/etc/NetworkManager/NetworkManager.conf
|
|
|
|
# remove network manager defaults to handle eth by default
|
|
rm -f "${SDCARD}"/usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
|
|
|
|
# most likely we don't need to wait for nm to get online
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl disable NetworkManager-wait-online.service" >> "${DEST}"/debug/install.log 2>&1
|
|
|
|
# avahi daemon defaults if exists
|
|
[[ -f "${SDCARD}"/usr/share/doc/avahi-daemon/examples/sftp-ssh.service ]] && \
|
|
cp "${SDCARD}"/usr/share/doc/avahi-daemon/examples/sftp-ssh.service "${SDCARD}"/etc/avahi/services/
|
|
[[ -f "${SDCARD}"/usr/share/doc/avahi-daemon/examples/ssh.service ]] && \
|
|
cp "${SDCARD}"/usr/share/doc/avahi-daemon/examples/ssh.service "${SDCARD}"/etc/avahi/services/
|
|
|
|
# Just regular DNS and maintain /etc/resolv.conf as a file
|
|
sed "/dns/d" -i "${SDCARD}"/etc/NetworkManager/NetworkManager.conf
|
|
sed "s/\[main\]/\[main\]\ndns=default\nrc-manager=file/g" -i "${SDCARD}"/etc/NetworkManager/NetworkManager.conf
|
|
if [[ -n $NM_IGNORE_DEVICES ]]; then
|
|
mkdir -p "${SDCARD}"/etc/NetworkManager/conf.d/
|
|
cat <<-EOF > "${SDCARD}"/etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
|
[keyfile]
|
|
unmanaged-devices=$NM_IGNORE_DEVICES
|
|
EOF
|
|
fi
|
|
|
|
# nsswitch settings for sane DNS behavior: remove resolve, assure libnss-myhostname support
|
|
sed "s/hosts\:.*/hosts: files mymachines dns myhostname/g" -i "${SDCARD}"/etc/nsswitch.conf
|
|
|
|
# build logo in any case
|
|
boot_logo
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
install_rclocal()
|
|
{
|
|
|
|
cat <<-EOF > "${SDCARD}"/etc/rc.local
|
|
#!/bin/sh -e
|
|
#
|
|
# rc.local
|
|
#
|
|
# This script is executed at the end of each multiuser runlevel.
|
|
# Make sure that the script will "exit 0" on success or any other
|
|
# value on error.
|
|
#
|
|
# In order to enable or disable this script just change the execution
|
|
# bits.
|
|
#
|
|
# By default this script does nothing.
|
|
|
|
exit 0
|
|
EOF
|
|
chmod +x "${SDCARD}"/etc/rc.local
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
install_distribution_specific()
|
|
{
|
|
|
|
display_alert "Applying distribution specific tweaks for" "$RELEASE" "info"
|
|
|
|
case $RELEASE in
|
|
|
|
xenial)
|
|
|
|
# remove legal info from Ubuntu
|
|
[[ -f "${SDCARD}"/etc/legal ]] && rm "${SDCARD}"/etc/legal
|
|
|
|
# ureadahead needs kernel tracing options that AFAIK are present only in mainline. disable
|
|
chroot "${SDCARD}" /bin/bash -c \
|
|
"systemctl --no-reload mask ondemand.service ureadahead.service >/dev/null 2>&1"
|
|
chroot "${SDCARD}" /bin/bash -c \
|
|
"systemctl --no-reload mask setserial.service etc-setserial.service >/dev/null 2>&1"
|
|
|
|
;;
|
|
|
|
stretch|buster)
|
|
|
|
# remove doubled uname from motd
|
|
[[ -f "${SDCARD}"/etc/update-motd.d/10-uname ]] && rm "${SDCARD}"/etc/update-motd.d/10-uname
|
|
# rc.local is not existing but one might need it
|
|
install_rclocal
|
|
|
|
;;
|
|
|
|
bullseye)
|
|
|
|
# remove doubled uname from motd
|
|
[[ -f "${SDCARD}"/etc/update-motd.d/10-uname ]] && rm "${SDCARD}"/etc/update-motd.d/10-uname
|
|
# rc.local is not existing but one might need it
|
|
install_rclocal
|
|
# fix missing versioning
|
|
[[ $(grep -L "VERSION_ID=" "${SDCARD}"/etc/os-release) ]] && echo 'VERSION_ID="11"' >> "${SDCARD}"/etc/os-release
|
|
[[ $(grep -L "VERSION=" "${SDCARD}"/etc/os-release) ]] && echo 'VERSION="11 (bullseye)"' >> "${SDCARD}"/etc/os-release
|
|
|
|
# remove security updates repository since it does not exists yet
|
|
sed '/security/ d' -i "${SDCARD}"/etc/apt/sources.list
|
|
|
|
;;
|
|
bionic|groovy|focal)
|
|
|
|
# by using default lz4 initrd compression leads to corruption, go back to proven method
|
|
sed -i "s/^COMPRESS=.*/COMPRESS=gzip/" "${SDCARD}"/etc/initramfs-tools/initramfs.conf
|
|
|
|
# remove doubled uname from motd
|
|
[[ -f "${SDCARD}"/etc/update-motd.d/10-uname ]] && rm "${SDCARD}"/etc/update-motd.d/10-uname
|
|
|
|
# remove motd news from motd.ubuntu.com
|
|
[[ -f "${SDCARD}"/etc/default/motd-news ]] && sed -i "s/^ENABLED=.*/ENABLED=0/" "${SDCARD}"/etc/default/motd-news
|
|
|
|
# rc.local is not existing but one might need it
|
|
install_rclocal
|
|
|
|
# Basic Netplan config. Let NetworkManager manage all devices on this system
|
|
[[ -d "${SDCARD}"/etc/netplan ]] && cat <<-EOF > "${SDCARD}"/etc/netplan/armbian-default.yaml
|
|
network:
|
|
version: 2
|
|
renderer: NetworkManager
|
|
EOF
|
|
|
|
# DNS fix
|
|
sed -i "s/#DNS=.*/DNS=$NAMESERVER/g" "${SDCARD}"/etc/systemd/resolved.conf
|
|
|
|
# Journal service adjustements
|
|
sed -i "s/#Storage=.*/Storage=volatile/g" "${SDCARD}"/etc/systemd/journald.conf
|
|
sed -i "s/#Compress=.*/Compress=yes/g" "${SDCARD}"/etc/systemd/journald.conf
|
|
sed -i "s/#RateLimitIntervalSec=.*/RateLimitIntervalSec=30s/g" "${SDCARD}"/etc/systemd/journald.conf
|
|
sed -i "s/#RateLimitBurst=.*/RateLimitBurst=10000/g" "${SDCARD}"/etc/systemd/journald.conf
|
|
|
|
# Chrony temporal fix https://bugs.launchpad.net/ubuntu/+source/chrony/+bug/1878005
|
|
sed -i '/DAEMON_OPTS=/s/"-F -1"/"-F 0"/' "${SDCARD}"/etc/default/chrony
|
|
|
|
# disable conflicting services
|
|
chroot "${SDCARD}" /bin/bash -c "systemctl --no-reload mask ondemand.service >/dev/null 2>&1"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
post_debootstrap_tweaks()
|
|
{
|
|
|
|
# remove service start blockers and QEMU binary
|
|
rm -f "${SDCARD}"/sbin/initctl "${SDCARD}"/sbin/start-stop-daemon
|
|
chroot "${SDCARD}" /bin/bash -c "dpkg-divert --quiet --local --rename --remove /sbin/initctl"
|
|
chroot "${SDCARD}" /bin/bash -c "dpkg-divert --quiet --local --rename --remove /sbin/start-stop-daemon"
|
|
rm -f "${SDCARD}"/usr/sbin/policy-rc.d "${SDCARD}/usr/bin/${QEMU_BINARY}"
|
|
|
|
}
|