2022-11-27 20:44:50 +00:00
#!/usr/bin/env bash
2023-03-09 17:30:40 +00:00
#
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (c) 2013-2023 Igor Pecovnik, igor@armbian.com
#
# This file is a part of the Armbian Build Framework
# https://github.com/armbian/build/
2022-10-03 03:17:59 +00:00
2023-01-14 21:49:18 +00:00
function install_distribution_specific( ) {
display_alert "Applying distribution specific tweaks for" " ${ RELEASE :- } " "info"
2022-10-03 03:17:59 +00:00
2023-01-14 21:49:18 +00:00
# disable broken service, the problem is in default misconfiguration
2024-06-29 11:09:18 +00:00
disable_systemd_service_sdcard smartmontools.service smartd.service
2022-10-03 03:17:59 +00:00
2024-01-08 16:52:39 +00:00
if [ [ " ${ DISTRIBUTION } " = = "Ubuntu" ] ] ; then
2022-10-03 03:17:59 +00:00
2024-01-08 16:52:39 +00:00
# by using default lz4 initrd compression leads to corruption, go back to proven method
# @TODO: rpardini: this should be a config option (which is always set to zstd ;-D )
sed -i "s/^COMPRESS=.*/COMPRESS=gzip/" " ${ SDCARD } " /etc/initramfs-tools/initramfs.conf
2022-10-03 03:17:59 +00:00
2024-01-08 16:52:39 +00:00
run_host_command_logged rm -f " ${ SDCARD } " /etc/update-motd.d/{ 10-uname,10-help-text,50-motd-news,80-esm,80-livepatch,90-updates-available,91-release-upgrade,95-hwe-eol}
2022-10-03 03:17:59 +00:00
2024-01-08 16:52:39 +00:00
# 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
2022-10-03 03:17:59 +00:00
2024-01-08 16:52:39 +00:00
# disable conflicting services
disable_systemd_service_sdcard ondemand.service
2023-03-19 12:44:09 +00:00
2024-01-08 16:52:39 +00:00
# Remove Ubuntu APT spamming
install_artifact_deb_chroot "fake-ubuntu-advantage-tools"
truncate --size= 0 " ${ SDCARD } " /etc/apt/apt.conf.d/20apt-esm-hook.conf
fi
2022-10-03 03:17:59 +00:00
2023-05-12 16:11:51 +00:00
# install our base-files package (this replaces the original from Debian/Ubuntu)
if [ [ " ${ KEEP_ORIGINAL_OS_RELEASE :- "no" } " != "yes" ] ] ; then
2024-08-22 08:43:45 +00:00
install_artifact_deb_chroot "armbian-base-files" "--allow-downgrades"
2023-05-12 16:11:51 +00:00
fi
2024-01-08 16:52:39 +00:00
# Set DNS server if systemd-resolved is in use
if [ [ -n " $NAMESERVER " && -f " ${ SDCARD } " /etc/systemd/resolved.conf ] ] ; then
2024-08-26 14:58:10 +00:00
display_alert "Using systemd-resolved" "for DNS management" "info"
# This used to set a default DNS entry from $NAMESERVER into "${SDCARD}"/etc/systemd/resolved.conf.d/00-armbian-default-dns.conf -- no longer; better left to DHCP.
2024-01-08 16:52:39 +00:00
fi
2022-10-03 03:17:59 +00:00
# cleanup motd services and related files
2023-01-14 21:49:18 +00:00
disable_systemd_service_sdcard motd-news.service motd-news.timer
2022-10-03 03:17:59 +00:00
# remove motd news from motd.ubuntu.com
[ [ -f " ${ SDCARD } " /etc/default/motd-news ] ] && sed -i "s/^ENABLED=.*/ENABLED=0/" " ${ SDCARD } " /etc/default/motd-news
# 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
# use list modules INITRAMFS
if [ -f " ${ SRC } " /config/modules/" ${ MODULES_INITRD } " ] ; then
2023-01-14 21:49:18 +00:00
display_alert "Use file list modules MODULES_INITRD" " ${ MODULES_INITRD } "
2022-10-03 03:17:59 +00:00
sed -i "s/^MODULES=.*/MODULES=list/" " ${ SDCARD } " /etc/initramfs-tools/initramfs.conf
cat " ${ SRC } " /config/modules/" ${ MODULES_INITRD } " >> " ${ SDCARD } " /etc/initramfs-tools/modules
fi
}
2025-10-20 17:43:19 +00:00
#fetch_distro_keyring <release>
#
# <release>: debian or ubuntu release name
#
function fetch_distro_keyring( ) {
declare release = " ${ 1 } "
declare distro = ""
case $release in
buster | bullseye | bookworm | trixie | forky | sid)
distro = "debian"
; ;
focal | jammy | noble | oracular | plucky | raccoon)
distro = "ubuntu"
; ;
*)
exit_with_error "fetch_distro_keyring failed" " unrecognized release: $release "
esac
CACHEDIR = " /armbian/cache/keyrings/ $distro "
mkdir -p " ${ CACHEDIR } "
case $distro in
debian)
if [ -e " ${ CACHEDIR } /debian-archive-keyring.gpg " ] ; then
display_alert " fetch_distro_keyring( $release ) " "cache found, skipping" "info"
else
BASEURI = 'https://deb.debian.org/debian/pool/main/d/debian-archive-keyring/'
#FIXME: write something to retrieve newest
KEYRING_DEB = 'debian-archive-keyring_2025.1_all.deb'
curl -fLOJ --output-dir " ${ CACHEDIR } " " ${ BASEURI } / ${ KEYRING_DEB } " || \
exit_with_error "fetch_distro_keyring failed" " unable to download ${ BASEURI } / ${ KEYRING_DEB } "
dpkg-deb -x " ${ CACHEDIR } / ${ KEYRING_DEB } " " ${ CACHEDIR } " || \
exit_with_error "fetch_distro_keyring" " dpkg-deb -x ${ KEYRING_DEB } failed "
# yes, for 2025.1, the canonical name is .pgp, but our tools expect .gpg.
# the package contains the .pgp and a .gpg symlink to it.
cp -l " ${ CACHEDIR } /usr/share/keyrings/debian-archive-keyring.pgp " " ${ CACHEDIR } /debian-archive-keyring.gpg "
display_alert " fetch_distro_keyring( $release ) " "extracted" "info"
BASEURI = 'https://deb.debian.org/debian/pool/main/d/debian-ports-archive-keyring/'
#FIXME: write something to retrieve newest
KEYRING_DEB = 'debian-ports-archive-keyring_2025.04.05_all.deb'
curl -fLOJ --output-dir " ${ CACHEDIR } " " ${ BASEURI } / ${ KEYRING_DEB } " || \
exit_with_error "fetch_distro_keyring failed" " unable to download ${ BASEURI } / ${ KEYRING_DEB } "
dpkg-deb -x " ${ CACHEDIR } / ${ KEYRING_DEB } " " ${ CACHEDIR } " || \
exit_with_error "fetch_distro_keyring" " dpkg-deb -x ${ KEYRING_DEB } failed "
# see above comment about .pgp vs .gpg
cp -l " ${ CACHEDIR } /usr/share/keyrings/debian-ports-archive-keyring.pgp " " ${ CACHEDIR } /debian-ports-archive-keyring.gpg "
fi
; ;
ubuntu)
if [ -e " ${ CACHEDIR } /ubuntu-archive-keyring.gpg " ] ; then
display_alert " fetch_distro_keyring( $release ) " "cache found, skipping" "info"
else
BASEURI = 'https://archive.ubuntu.com/ubuntu/pool/main/u/ubuntu-keyring/'
#FIXME: write something to retrieve newest
KEYRING_DEB = 'ubuntu-keyring_2023.11.28.1_all.deb'
curl -fLOJ --output-dir " ${ CACHEDIR } " " ${ BASEURI } / ${ KEYRING_DEB } " || \
exit_with_error "fetch_distro_keyring failed" " unable to download ${ BASEURI } / ${ KEYRING_DEB } "
dpkg-deb -x " ${ CACHEDIR } / ${ KEYRING_DEB } " " ${ CACHEDIR } " || \
exit_with_error "fetch_distro_keyring" " dpkg-deb -x ${ KEYRING_DEB } failed "
cp -l " ${ CACHEDIR } /usr/share/keyrings/ubuntu-archive-keyring.gpg " " ${ CACHEDIR } / "
fi
debootstrap_arguments += ( "--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg" )
; ;
esac
# cp -l may break here if it's cross-filesystem
# copy everything to the "host" inside the container
cp -r " ${ CACHEDIR } " /{ etc,usr} / || exit_with_error "fetch_distro_keyring" "failed to copy keyrings to host"
debootstrap_arguments += ( " --setup-hook='copy-in ${ CACHEDIR } /usr ${ CACHEDIR } /etc /' " )
}
2023-05-13 09:00:28 +00:00
# create_sources_list_and_deploy_repo_key <when> <release> <basedir>
2022-10-03 02:52:43 +00:00
#
2023-05-13 09:00:28 +00:00
# <when>: rootfs|image
2025-10-23 22:21:04 +00:00
# <release>: bullseye|bookworm|trixie|forky|sid|focal|jammy|noble|oracular|plucky
2022-10-03 02:52:43 +00:00
# <basedir>: path to root directory
#
2023-05-13 09:00:28 +00:00
function create_sources_list_and_deploy_repo_key( ) {
declare when = " ${ 1 } "
declare release = " ${ 2 } "
declare basedir = " ${ 3 } " # @TODO: rpardini: this is SDCARD in all practical senses. Why not just use SDCARD?
[ [ -z $basedir ] ] && exit_with_error "No basedir passed to create_sources_list_and_deploy_repo_key"
2022-10-03 02:52:43 +00:00
2025-02-06 23:41:19 +00:00
declare distro = ""
2022-10-08 11:17:30 +00:00
2025-03-04 09:22:19 +00:00
# Drop deboostrap sources leftovers
rm -f " ${ basedir } /etc/apt/sources.list "
2025-02-06 23:41:19 +00:00
# Add upstream (Debian/Ubuntu) APT repository
case $release in
2025-10-23 22:21:04 +00:00
buster | bullseye | bookworm | trixie | forky)
2025-02-06 23:41:19 +00:00
distro = "debian"
2022-10-08 11:17:30 +00:00
2025-02-06 23:41:19 +00:00
declare -a suites = ( " ${ release } " " ${ release } -updates " )
declare -a components = ( main contrib non-free)
2023-02-03 12:01:02 +00:00
2025-02-06 23:41:19 +00:00
if [ [ " $release " != "buster" && " $release " != "bullseye" ] ] ; then
2025-07-30 08:36:33 +00:00
# EOS releases doesn't get security updates
declare -a security_suites = ( " ${ release } -security " )
suites += ( " ${ release } -backports " )
components += ( "non-free-firmware" )
2025-02-06 23:41:19 +00:00
fi
2023-02-03 12:01:02 +00:00
2025-02-06 23:41:19 +00:00
cat <<- EOF > " ${ basedir } /etc/apt/sources.list.d/ ${ distro } .sources "
Types: deb
URIs: http://${ DEBIAN_MIRROR }
Suites: ${ suites [@] }
Components: ${ components [@] }
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
2023-02-03 12:01:02 +00:00
EOF
2025-07-30 08:36:33 +00:00
if [ ${# security_suites [@] } -gt 0 ] ; then
echo "" >> " ${ basedir } /etc/apt/sources.list.d/ ${ distro } .sources " # it breaks if there is no line space in between
cat <<- EOF >> " ${ basedir } /etc/apt/sources.list.d/ ${ distro } .sources "
Types: deb
URIs: http://${ DEBIAN_SECURITY }
Suites: ${ security_suites [@] }
Components: ${ components [@] }
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
fi
2023-02-03 12:01:02 +00:00
; ;
2025-02-06 23:41:19 +00:00
sid | unstable)
distro = "debian"
2023-02-23 08:24:41 +00:00
2025-07-24 01:39:42 +00:00
if [ [ " ${ ARCH } " = = loong64 ] ] ; then
# loong64 is using debian-ports repo, we can change it to default after debian supports it officially
keyring_filename = /usr/share/keyrings/debian-ports-archive-keyring.gpg
else
keyring_filename = /usr/share/keyrings/debian-archive-keyring.gpg
fi
2025-02-06 23:41:19 +00:00
# sid is permanent unstable development and has no such thing as updates or security
cat <<- EOF > " ${ basedir } /etc/apt/sources.list.d/ ${ distro } .sources "
Types: deb
URIs: http://${ DEBIAN_MIRROR }
Suites: ${ release }
Components: main contrib non-free non-free-firmware
2025-07-24 01:39:42 +00:00
Signed-By: ${ keyring_filename }
2022-10-08 11:17:30 +00:00
EOF
2023-08-16 14:37:20 +00:00
2025-02-06 23:41:19 +00:00
# Required for some packages on riscv64.
# See: http://lists.debian.org/debian-riscv/2023/07/msg00053.html
2023-08-22 11:32:09 +00:00
if [ [ " ${ ARCH } " = = riscv64 ] ] ; then
2025-02-06 23:41:19 +00:00
cat <<- EOF >> " ${ basedir } /etc/apt/sources.list.d/ ${ distro } .sources "
Types: deb
URIs: http://deb.debian.org/debian-ports/
Suites: ${ release }
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Architectures: riscv64
EOF
2023-08-22 11:32:09 +00:00
fi
2022-10-08 11:17:30 +00:00
; ;
2025-01-23 08:38:33 +00:00
focal | jammy | noble | oracular | plucky)
2025-02-06 23:41:19 +00:00
distro = "ubuntu"
cat <<- EOF > " ${ basedir } /etc/apt/sources.list.d/ ${ distro } .sources "
Types: deb
URIs: http://${ UBUNTU_MIRROR }
Suites: ${ release } ${ release } -security ${ release } -updates ${ release } -backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
2022-10-08 11:17:30 +00:00
EOF
; ;
2022-10-03 02:52:43 +00:00
esac
2025-07-09 20:36:48 +00:00
# add armbian key
display_alert "Adding Armbian repository and authentication key" " ${ when } :: /etc/apt/sources.list.d/armbian.sources " "info"
mkdir -p " ${ basedir } " /usr/share/keyrings
# change to binary form
APT_SIGNING_KEY_FILE = "/usr/share/keyrings/armbian-archive-keyring.gpg"
2025-07-09 23:37:25 +00:00
gpg --batch --yes --dearmor < " ${ SRC } " /config/armbian.key > " ${ basedir } ${ APT_SIGNING_KEY_FILE } "
2025-07-09 20:36:48 +00:00
2025-07-11 01:41:16 +00:00
# deploy the qemu binary, no matter where the rootfs came from (built or cached)
deploy_qemu_binary_to_chroot " ${ basedir } " " ${ when } " # undeployed at end of this function
2025-07-09 20:36:48 +00:00
# lets link to the old file as armbian-config uses it and we can't set there to new file
# we user force linking as some old caches still exists
chroot " ${ basedir } " /bin/bash -c "ln -fs armbian-archive-keyring.gpg /usr/share/keyrings/armbian.gpg"
# lets keep old way for old distributions
if [ [ " ${ RELEASE } " = ~ ( focal| bullseye) ] ] ; then
cp " ${ SRC } " /config/armbian.key " ${ basedir } "
chroot " ${ basedir } " /bin/bash -c "cat armbian.key | apt-key add - > /dev/null 2>&1"
2022-10-03 02:52:43 +00:00
fi
2025-07-11 01:41:16 +00:00
# undeploy the qemu binary from the image; we don't want to ship the host's qemu in the target image
undeploy_qemu_binary_from_chroot " ${ basedir } " " ${ when } "
2025-02-06 23:41:19 +00:00
# Add Armbian APT repository
2023-05-13 09:00:28 +00:00
declare -a components = ( )
2023-05-23 11:56:46 +00:00
if [ [ " ${ when } " = = "image" * ] ] ; then # only include the 'main' component when deploying to image (early or late)
2023-05-13 09:00:28 +00:00
components += ( "main" )
fi
components += ( " ${ RELEASE } -utils " ) # utils contains packages Igor picks from other repos
components += ( " ${ RELEASE } -desktop " ) # desktop contains packages Igor picks from other repos
2024-01-01 22:19:35 +00:00
# stage: add armbian repository and install key
2025-02-06 23:41:19 +00:00
# armbian_mirror="http://$([[ $BETA == yes ]] && echo "beta" || echo "apt").armbian.com"
declare armbian_mirror = "apt.armbian.com"
if [ [ -n $LOCAL_MIRROR ] ] ; then
armbian_mirror = " $LOCAL_MIRROR "
elif [ [ $DOWNLOAD_MIRROR = = "china" ] ] ; then
armbian_mirror = "mirrors.tuna.tsinghua.edu.cn/armbian"
2024-01-01 22:19:35 +00:00
elif [ [ $DOWNLOAD_MIRROR = = "bfsu" ] ] ; then
2025-02-06 23:41:19 +00:00
armbian_mirror = "mirrors.bfsu.edu.cn/armbian"
elif [ [ $BETA = = "yes" ] ] ; then
armbian_mirror = "beta.armbian.com"
2024-01-01 22:19:35 +00:00
fi
2025-02-06 23:41:19 +00:00
cat <<- EOF > " ${ basedir } " /etc/apt/sources.list.d/armbian.sources
Types: deb
2025-06-13 08:31:24 +00:00
URIs: http://${ armbian_mirror }
2025-02-06 23:41:19 +00:00
Suites: $RELEASE
Components: ${ components [*] }
Signed-By: ${ APT_SIGNING_KEY_FILE }
EOF
2022-10-03 02:52:43 +00:00
2024-03-03 16:54:08 +00:00
# disable repo if DISTRIBUTION_STATUS==eos, or if SKIP_ARMBIAN_REPO==yes, or if when==image-early.
2024-06-24 18:56:06 +00:00
if [ [ " ${ when } " = = "image-early" ||
" $( cat " ${ SRC } /config/distributions/ ${ RELEASE } /support " ) " = = "eos" ||
2024-03-03 16:54:08 +00:00
" ${ SKIP_ARMBIAN_REPO } " = = "yes" ] ] ; then
2024-01-01 22:19:35 +00:00
display_alert "Disabling Armbian repo" " ${ ARCH } - ${ RELEASE } :: skip: ${ SKIP_ARMBIAN_REPO :- "no" } when: ${ when } " "info"
2025-02-06 23:41:19 +00:00
mv " ${ SDCARD } " /etc/apt/sources.list.d/armbian.sources " ${ SDCARD } " /etc/apt/sources.list.d/armbian.sources.disabled
2022-10-03 02:52:43 +00:00
fi
2023-05-13 09:00:28 +00:00
declare CUSTOM_REPO_WHEN = " ${ when } "
# Let user customize
call_extension_method "custom_apt_repo" <<- 'CUSTOM_APT_REPO'
*customize apt sources.list.d and/or deploy repo keys*
2025-02-06 23:41:19 +00:00
Called after core Armbian has finished setting up SDCARD' s debian.sources/ubuntu.sources and armbian.sources in /etc/apt/sources.list.d/.
If SKIP_ARMBIAN_REPO = yes, armbian.sources.disabled is present instead.
The global Armbian GPG key has been deployed to SDCARD' s ${ APT_SIGNING_KEY_FILE } , de-armored.
2023-05-13 09:00:28 +00:00
You can implement this hook to add, remove, or modify sources.list.d entries, and/or deploy additional GPG keys.
Important: honor $CUSTOM_REPO_WHEN ; if it's ==rootfs, don' t add repos/components that carry the .debs produced by armbian/build.
2023-05-23 11:56:46 +00:00
Ideally, also don' t add any possibly-conflicting repo if ` $CUSTOM_REPO_WHEN = = image-early` .
` $CUSTOM_APT_REPO = = image-late` is passed during the very final stages of image building, after all packages were installed/upgraded.
2023-05-13 09:00:28 +00:00
CUSTOM_APT_REPO
unset CUSTOM_REPO_WHEN
return 0
2022-10-03 02:52:43 +00:00
}