#!/bin/bash add_systemd_unit() { # Add a systemd unit file to the initcpio image. Hard dependencies on binaries # and other unit files will be discovered and added. # $1: path to rules file (or name of rules file) local unit= rule= entry= key= value= binary= dep= unit=$(PATH=/usr/lib/systemd/system:/lib/systemd/system type -P "$1") if [[ -z $unit ]]; then # complain about not found unit file return 1 fi add_file "$unit" while IFS='=' read -r key values; do read -ra values <<< "$values" case $key in Requires|OnFailure) # only add hard dependencies (not Wants) map add_systemd_unit "${values[@]}" ;; Exec*) # do not add binaries unless they are required, # strip special executable prefixes case ${values[0]} in -*) ;; !!*) add_binary "${values[0]#!!}" ;; *) add_binary "${values[0]#[@!:+]}" ;; esac ;; esac done <"$unit" # preserve reverse soft dependency for dep in {/usr,}/lib/systemd/system/*.wants/${unit##*/}; do if [[ -L $dep ]]; then add_symlink "$dep" fi done # add hard dependencies if [[ -d $unit.requires ]]; then for dep in "$unit".requires/*; do add_systemd_unit ${dep##*/} done fi } add_systemd_drop_in() { local unit=$1 dropin_name=$2 mkdir -p "$BUILDROOT/etc/systemd/system/$unit.d" cat >"$BUILDROOT/etc/systemd/system/$unit.d/$2.conf" } build() { local rules unit add_binary /usr/bin/kmod /usr/bin/modprobe add_binary /usr/bin/mount add_binary /usr/bin/sulogin add_binary /usr/bin/umount add_binary /usr/lib/systemd/systemd /init map add_binary \ /usr/bin/journalctl \ /usr/bin/systemd-tmpfiles \ /usr/lib/systemd/systemd-executor \ /usr/lib/systemd/systemd-hibernate-resume \ /usr/lib/systemd/systemd-shutdown \ /usr/lib/systemd/systemd-sulogin-shell \ /usr/lib/systemd/system-generators/systemd-fstab-generator \ /usr/lib/systemd/system-generators/systemd-gpt-auto-generator \ /usr/lib/systemd/system-generators/systemd-hibernate-resume-generator # udev rules map add_udev_rule "$rules" \ 50-udev-default.rules \ 60-persistent-storage.rules \ 64-btrfs.rules \ 80-drivers.rules \ 99-systemd.rules # systemd units map add_systemd_unit \ initrd-cleanup.service \ initrd-fs.target \ initrd-parse-etc.service \ initrd-root-fs.target \ initrd-root-device.target \ initrd-switch-root.service \ initrd-switch-root.target \ initrd-udevadm-cleanup-db.service \ initrd.target \ kmod-static-nodes.service \ local-fs.target \ local-fs-pre.target \ paths.target \ reboot.target \ slices.target \ sockets.target \ swap.target \ systemd-battery-check.service \ systemd-bsod.service \ systemd-fsck@.service \ systemd-hibernate-resume.service \ systemd-journald-audit.socket \ systemd-journald-dev-log.socket \ systemd-journald.service \ systemd-modules-load.service \ systemd-pcrphase-initrd.service \ systemd-tmpfiles-setup-dev.service \ systemd-udevd-control.socket \ systemd-udevd-kernel.socket \ systemd-udevd.service \ systemd-udev-trigger.service \ systemd-vconsole-setup.service \ timers.target \ rescue.target \ emergency.target # add libraries dlopen()ed (hard and optional dependencies): # kmod -> systemd-shared # qrencode -> bsod # tss2-* -> tpm2-util for LIB in kmod qrencode tss2-{esys,rc,mu,tcti-'*'}; do for FILE in $(find /usr/lib/ -maxdepth 1 -name "lib${LIB}.so*"); do if [[ -L "${FILE}" ]]; then add_symlink "${FILE}" else add_binary "${FILE}" fi done done add_symlink "/usr/lib/systemd/system/default.target" "initrd.target" add_symlink "/usr/lib/systemd/system/ctrl-alt-del.target" "reboot.target" printf '%s\n' >"$BUILDROOT/etc/nsswitch.conf" \ 'passwd: files' \ 'group: files' \ 'shadow: files' echo "root:x:0:0:root:/root:/bin/sh" >"$BUILDROOT/etc/passwd" echo 'root:*:::::::' >"$BUILDROOT/etc/shadow" getent group root audio disk input kmem kvm lp optical render sgx storage tty uucp video | awk -F: ' { print $1 ":x:" $3 ":" }' >"$BUILDROOT/etc/group" add_dir "/etc/modules-load.d" ( . "$_f_config" set -f printf '%s\n' ${MODULES[@]} >"$BUILDROOT/etc/modules-load.d/MODULES.conf" ) [[ -f /etc/fstab.initramfs ]] && add_file "/etc/fstab.initramfs" "/etc/fstab" } help() { cat <