#!/bin/sh set -eu BANANARCHY_DIR="${BANANARCHY_DIR:-/bananarchy}" WORK="${WORK:-/work}" echo "[1/4] Installing lightweight host helper tools in container..." cat > /etc/apk/repositories < Ensuring fcitx5-gtk3 and Bananarchy development/scripting packages are installed in $ROOTFS..." apk --root "$ROOTFS" --arch armv7 add --no-scripts \ fcitx5-gtk3 \ git \ gcc \ g++ \ musl-dev \ make \ coreutils \ ed \ rlwrap \ less \ nano \ frotz \ janet \ janet-dev \ jpm \ perl \ perl-io-socket-ssl \ tcl \ tcl-lib \ tcl-tls \ sqlite \ sqlite-tcl \ modemmanager \ modemmanager-udev \ mobile-broadband-provider-info \ postmarketos-base-ui-modemmanager \ postmarketos-base-ui-modemmanager-openrc \ i2c-tools \ v4l-utils echo " -> Installing busybox and busybox-extras symlinks..." for applet in $(/bin/busybox --list-full); do target="$ROOTFS/$applet" mkdir -p "$(dirname "$target")" if [ ! -e "$target" ] && [ ! -L "$target" ]; then ln -s /bin/busybox "$target" fi done if [ -x /bin/busybox-extras ]; then for applet in $(/bin/busybox-extras --list-full); do target="$ROOTFS/$applet" mkdir -p "$(dirname "$target")" if [ ! -e "$target" ] && [ ! -L "$target" ]; then ln -s /bin/busybox-extras "$target" fi done fi if [ -e "$ROOTFS/sbin/losetup" ] && [ ! -e "$ROOTFS/usr/sbin/losetup" ]; then ln -sf /sbin/losetup "$ROOTFS/usr/sbin/losetup" fi echo " -> Setting up temporary x86_64 hostbin for chroot execution..." rm -rf "$ROOTFS/tmp/hostbin" mkdir -p "$ROOTFS/tmp/hostbin" cp /bin/busybox.static "$ROOTFS/tmp/hostbin/busybox.static" for app in $(/bin/busybox.static --list); do ln -sf /tmp/hostbin/busybox.static "$ROOTFS/tmp/hostbin/$app" done for bin in \ /sbin/depmod \ /usr/sbin/mkinitfs \ /usr/bin/boot-deploy \ /usr/bin/generate-kernel-cmdline \ /usr/bin/mkbootimg \ /usr/bin/mkbootimg-osm0sis \ /usr/bin/zstd; do if [ -e "$bin" ]; then cp -L "$bin" "$ROOTFS/tmp/hostbin/" fi done rm -f "$ROOTFS/tmp/hostbin/df" cat > "$ROOTFS/tmp/hostbin/df" <<'EOF' #!/tmp/hostbin/sh printf "Filesystem 1024-blocks Used Available Capacity Mounted on\n/dev/root 52428800 5242880 47185920 10%% /\n" EOF chmod +x "$ROOTFS/tmp/hostbin/df" mkdir -p "$ROOTFS/proc/1/root" cp /lib/ld-musl-x86_64.so.1 "$ROOTFS/lib/" cp -a /usr/lib/libgcc_s.so* "$ROOTFS/tmp/hostbin/" 2>/dev/null || true cp -a /lib/libz.so* /usr/lib/libzstd.so* /usr/lib/liblzma.so* /lib/libcrypto.so* "$ROOTFS/tmp/hostbin/" 2>/dev/null || true ln -sf /tmp/hostbin/busybox.static "$ROOTFS/bin/sh" echo " -> Creating system groups, users, and default user (UID 10000)..." chroot "$ROOTFS" /tmp/hostbin/busybox.static sh -e -c ' export PATH="/tmp/hostbin:/usr/sbin:/usr/bin:/sbin:/bin" export LD_LIBRARY_PATH="/tmp/hostbin:/lib:/usr/lib" addgroup -S -g 42 shadow 2>/dev/null || true chown root:shadow /etc/shadow [ -e /etc/shadow- ] && chown root:shadow /etc/shadow- addgroup -S -g 86 avahi 2>/dev/null || true adduser -S -u 86 -D -H -h /dev/null -s /sbin/nologin -G avahi -g "Avahi System User" avahi 2>/dev/null || true addgroup -S klogd 2>/dev/null || true adduser -S -D -H -h /dev/null -s /sbin/nologin -G klogd -g klogd klogd 2>/dev/null || true addgroup -S chrony 2>/dev/null || true adduser -S -D -H -h /dev/null -s /sbin/nologin -G chrony -g chrony chrony 2>/dev/null || true addgroup -S messagebus 2>/dev/null || true adduser -S -D -H -h /dev/null -s /sbin/nologin -G messagebus -g messagebus messagebus 2>/dev/null || true addgroup -S dnsmasq 2>/dev/null || true adduser -S -D -H -h /dev/null -s /sbin/nologin -G dnsmasq -g dnsmasq dnsmasq 2>/dev/null || true addgroup -S geoclue 2>/dev/null || true adduser -S -D -h /var/lib/geoclue -s /sbin/nologin -G geoclue geoclue 2>/dev/null || true addgroup -S plugdev 2>/dev/null || true addgroup -S pipewire 2>/dev/null || true addgroup -S seat 2>/dev/null || true addgroup -S feedbackd 2>/dev/null || true addgroup -S polkitd 2>/dev/null || true adduser -S -D -H -h /var/empty -s /sbin/nologin -G polkitd -g polkitd polkitd 2>/dev/null || true addgroup -S colord 2>/dev/null || true adduser -S -D -H -h /var/lib/colord -s /sbin/nologin -G colord -g colord colord 2>/dev/null || true addgroup -S greetd 2>/dev/null || true adduser -S -D -H -h /var/lib/greetd -s /sbin/nologin -G greetd -g greetd greetd 2>/dev/null || true addgroup greetd video 2>/dev/null || true if ! grep -q "^user:" /etc/passwd 2>/dev/null; then adduser -D -u 10000 -s /bin/ash user 2>/dev/null || true fi for grp in audio input netdev plugdev video wheel seat feedbackd dialout tty pipewire; do addgroup -S "$grp" 2>/dev/null || true addgroup user "$grp" 2>/dev/null || true done echo "user:147147" | chpasswd passwd -l root >/dev/null 2>&1 || true ' echo " -> Configuring sudo/doas, hostname, locale, timezone, inittab, and sysctl..." mkdir -p "$ROOTFS/etc/doas.d" "$ROOTFS/etc/sudoers.d" rm -f "$ROOTFS/etc/doas.d/wheel.conf" cat > "$ROOTFS/etc/sudoers.d/wheel" < "$ROOTFS/etc/hostname" cat > "$ROOTFS/etc/hosts" < "$ROOTFS/etc/locale.conf" if [ -f "$ROOTFS/usr/share/zoneinfo/UTC" ]; then cp "$ROOTFS/usr/share/zoneinfo/UTC" "$ROOTFS/etc/localtime" echo "UTC" > "$ROOTFS/etc/timezone" fi touch "$ROOTFS/etc/apk/interactive" mkdir -p "$ROOTFS/run/openrc" touch "$ROOTFS/run/openrc/shutdowntime" dbus-uuidgen --ensure="$ROOTFS/etc/machine-id" if grep -q "^#ttyS0::respawn:/sbin/getty" "$ROOTFS/etc/inittab"; then sed -i 's|^#ttyS0::respawn:/sbin/getty.*|ttyMSM0::respawn:/sbin/getty -L 115200 ttyMSM0 vt100|' "$ROOTFS/etc/inittab" fi for mod in panel_mipi_dbi leds_msm8905_torch msm8905-cam; do if ! grep -qx "$mod" "$ROOTFS/etc/modules" 2>/dev/null; then echo "$mod" >> "$ROOTFS/etc/modules" fi done mkdir -p "$ROOTFS/etc/udev/rules.d" cat > "$ROOTFS/etc/udev/rules.d/90-nokia-argon-leds.rules" < "$ROOTFS/etc/sysctl.d/90-nokia-argon-lowram.conf" < Installing patched audio DTB, QDSP6/torch/camera kernel modules, UCM, and WirePlumber S16LE rules..." cp "$BANANARCHY_DIR/prebuilt/kernel-6.12.1-msm8916/dtbs/qcom-msm8905-nokia-argon.dtb" \ "$ROOTFS/boot/dtbs/qcom-msm8905-nokia-argon.dtb" cp "$BANANARCHY_DIR/prebuilt/kernel-6.12.1-msm8916/qdsp6/"*.ko* \ "$ROOTFS/lib/modules/6.12.1-msm8916/kernel/sound/soc/qcom/qdsp6/" mkdir -p "$ROOTFS/lib/modules/6.12.1-msm8916/extra" cp "$BANANARCHY_DIR/prebuilt/kernel-6.12.1-msm8916/leds/"*.ko* \ "$ROOTFS/lib/modules/6.12.1-msm8916/extra/" 2>/dev/null || true cp "$BANANARCHY_DIR/prebuilt/kernel-6.12.1-msm8916/camera/"*.ko* \ "$ROOTFS/lib/modules/6.12.1-msm8916/extra/" 2>/dev/null || true depmod -b "$ROOTFS" 6.12.1-msm8916 sed -i 's/"CS-Voice"/"VoiceMMode1"/g' \ "$ROOTFS/usr/share/alsa/ucm2/platforms/msm8916/qdsp6.conf" mkdir -p \ "$ROOTFS/usr/share/wireplumber/wireplumber.conf.d" \ "$ROOTFS/etc/wireplumber/wireplumber.conf.d" \ "$ROOTFS/etc/skel/.config/wireplumber/wireplumber.conf.d" \ "$ROOTFS/home/user/.config/wireplumber/wireplumber.conf.d" cat > "$ROOTFS/usr/share/wireplumber/wireplumber.conf.d/msm8916-s16le.conf" < Installing fcitx5-t9 addon and T9 profile..." cp -a "$BANANARCHY_DIR/prebuilt/fcitx5-t9/usr/"* "$ROOTFS/usr/" mkdir -p \ "$ROOTFS/usr/share/superd/services" \ "$ROOTFS/etc/skel/.config/superd/services/enabled" \ "$ROOTFS/home/user/.config/superd/services/enabled" \ "$ROOTFS/etc/skel/.config/fcitx5" \ "$ROOTFS/home/user/.config/fcitx5" cat > "$ROOTFS/usr/share/superd/services/fcitx5.service" < "$ROOTFS/etc/skel/.config/fcitx5/profile" < "$ROOTFS/etc/profile.d/fcitx5-t9.sh" <<'EOF' export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export SXMO_MENU=wofi export SXMO_BEMENU_PORTRAIT_LINES=11 export SXMO_BEMENU_LANDSCAPE_LINES=8 export BEMENU_OPTS='--fn "Sxmo 11.5" -H 24 -B 2 --hp 4 -s --no-overlap --fixed-height --scrollbar none --cw 2 --bdr "#005577" --tb "#383838" --tf "#aaaaaa" --fb "#383838" --ff "#ffffff" --cb "#ffffff" --cf "#383838" --nb "#1c1c1c" --nf "#ffffff" --ab "#1c1c1c" --af "#ffffff" --hb "#005577" --hf "#ffffff" -w -i' EOF chmod 755 "$ROOTFS/etc/profile.d/fcitx5-t9.sh" if ! grep -q "GTK_IM_MODULE=fcitx" "$ROOTFS/etc/skel/.profile" 2>/dev/null; then cat >> "$ROOTFS/etc/skel/.profile" <<'EOF' export PATH="$HOME/.local/bin:$PATH" export WLR_RENDERER=pixman export WLR_NO_HARDWARE_CURSORS=1 export SXMO_DISABLE_LEDS=1 export SXMO_NO_VIRTUAL_KEYBOARD=1 export NO_AT_BRIDGE=1 export GTK_A11Y=none export GTK_USE_PORTAL=0 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export SXMO_MENU=wofi export SXMO_BEMENU_PORTRAIT_LINES=11 export SXMO_BEMENU_LANDSCAPE_LINES=8 export BEMENU_OPTS='--fn "Sxmo 11.5" -H 24 -B 2 --hp 4 -s --no-overlap --fixed-height --scrollbar none --cw 2 --bdr "#005577" --tb "#383838" --tf "#aaaaaa" --fb "#383838" --ff "#ffffff" --cb "#ffffff" --cf "#383838" --nb "#1c1c1c" --nf "#ffffff" --ab "#1c1c1c" --af "#ffffff" --hb "#005577" --hf "#ffffff" -w -i' EOF fi cp "$ROOTFS/etc/skel/.profile" "$ROOTFS/home/user/.profile" echo " -> Enabling OpenRC runlevel services..." mkdir -p \ "$ROOTFS/etc/runlevels/sysinit" \ "$ROOTFS/etc/runlevels/boot" \ "$ROOTFS/etc/runlevels/default" \ "$ROOTFS/etc/runlevels/shutdown" rm -f "$ROOTFS/etc/runlevels/boot/hwclock" for svc in devfs dmesg msm-firmware-loader udev udev-trigger udev-settle; do if [ -e "$ROOTFS/etc/init.d/$svc" ]; then ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/sysinit/$svc" fi done for svc in osclock swclock-offset-boot modules sysctl hostname bootmisc logbookd tmpfs msm-firmware-loader-unpack; do if [ -e "$ROOTFS/etc/init.d/$svc" ]; then ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/boot/$svc" fi done for svc in \ udev-postmount \ rmtfs \ msm-modem-uim-selection \ msm8909-modem-wwan-port \ q6voiced \ modemmanager \ networkmanager \ wpa_supplicant \ bluetooth \ dbus \ cgroups \ haveged \ chronyd \ rfkill \ sleep-inhibitor \ sshd \ swapfile \ local \ postmarketos-zram-swap \ nftables \ iio-sensor-proxy \ hkdm \ kill-plymouth; do if [ -e "$ROOTFS/etc/init.d/$svc" ]; then ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/default/$svc" fi done for svc in mount-ro killprocs savecache swclock-offset-shutdown; do if [ -e "$ROOTFS/etc/init.d/$svc" ]; then ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/shutdown/$svc" fi done if [ "$UI_TYPE" = "sxmo" ]; then echo " -> Applying Sxmo UI & User:Ybon keypad/RAM/display tweaks..." for svc in seatd tinydm; do if [ -e "$ROOTFS/etc/init.d/$svc" ]; then ln -sf "/etc/init.d/$svc" "$ROOTFS/etc/runlevels/default/$svc" fi done mkdir -p "$ROOTFS/var/lib/tinydm" ln -sf /usr/share/wayland-sessions/swmo.desktop "$ROOTFS/var/lib/tinydm/default-session.desktop" cat > "$ROOTFS/usr/bin/sxmo_deviceprofile_nokia,argon.sh" < "$ROOTFS/usr/bin/sxmo_inputhandler.sh" <<'EOF' #!/bin/sh exec sxmo_hook_inputhandler.sh "$@" EOF chmod 755 "$ROOTFS/usr/bin/sxmo_inputhandler.sh" sed -i 's|--input-device="$pwr" ||g' "$ROOTFS/usr/bin/sxmo_swayinitconf.sh" if ! grep -q "superctl start fcitx5" "$ROOTFS/usr/share/sxmo/default_hooks/sxmo_hook_start.sh"; then sed -i 's|superctl start bonsaid|[ "$(command -v bonsaid)" ] \&\& superctl start bonsaid\n\t\t[ "$(command -v fcitx5)" ] \&\& superctl start fcitx5|' \ "$ROOTFS/usr/share/sxmo/default_hooks/sxmo_hook_start.sh" fi mkdir -p "$ROOTFS/etc/skel/.cache/sxmo" "$ROOTFS/home/user/.cache/sxmo" touch "$ROOTFS/etc/skel/.cache/sxmo/sxmo.nogesture" "$ROOTFS/home/user/.cache/sxmo/sxmo.nogesture" cat > "$ROOTFS/usr/share/sxmo/appcfg/wofi.config" < "$ROOTFS/usr/share/sxmo/appcfg/wofi.css" < "$ROOTFS/usr/share/sxmo/appcfg/conky.conf" </dev/null || true apk --root "$ROOTFS" --arch armv7 del --no-scripts vim vim-common nftables-vim protobuf-vim 2>/dev/null || true if [ -x /bananarchy/scripts/apply-bananarchy-overlay.sh ]; then /bananarchy/scripts/apply-bananarchy-overlay.sh "$ROOTFS" nokia-argon depmod -b "$ROOTFS" 6.12.1-msm8916 fi chown -R 10000:10000 "$ROOTFS/home/user" echo " -> Generating initramfs, boot.img, and extlinux.conf via mkinitfs..." chroot "$ROOTFS" /tmp/hostbin/busybox.static sh -e -c ' export PATH="/tmp/hostbin:/usr/sbin:/usr/bin:/sbin:/bin" export LD_LIBRARY_PATH="/tmp/hostbin:/lib:/usr/lib" /tmp/hostbin/mkinitfs ' echo " -> Restoring armv7 /bin/sh symlink and cleaning up temporary hostbin..." ln -sf /bin/busybox "$ROOTFS/bin/sh" rm -rf "$ROOTFS/tmp/hostbin" "$ROOTFS/lib/ld-musl-x86_64.so.1" "$ROOTFS/proc/1" echo " -> Verifying $ROOTFS boot artifacts:" ls -lh "$ROOTFS/boot/initramfs" "$ROOTFS/boot/boot.img" "$ROOTFS/boot/extlinux/extlinux.conf" cat "$ROOTFS/boot/extlinux/extlinux.conf" } BOOT_UUID_SXMO="a1b2c3d4-8110-4000-8000-000000000001" ROOT_UUID_SXMO="a1b2c3d4-8110-4000-8000-000000000002" configure_common_rootfs "$WORK/rootfs-sxmo" "sxmo" "$BOOT_UUID_SXMO" "$ROOT_UUID_SXMO" echo "BANANARCHY ROOTFS CONFIGURATION COMPLETED SUCCESSFULLY!"