From 22e84071b396061e6dfcf059197f45c844f66d10 Mon Sep 17 00:00:00 2001 From: cyteen Date: Wed, 13 Mar 2024 03:37:15 +0000 Subject: [PATCH] Commit before push. --- README.md | 4 + TODO.txt | 14 +- blend_chimaera_config | 4 +- blend_config | 62 ++++-- blend_config.mirror | 185 ++++++++++++++++ blend_daedalus-docker_config | 326 ++++++++++++++++++++++++++++ blend_daedalus_config | 299 +++++++++++++++++++++++++ blend_excalibur-docker_config | 326 ++++++++++++++++++++++++++++ blend_excalibur_config | 298 +++++++++++++++++++++++++ blend_freia-docker_config | 326 ++++++++++++++++++++++++++++ blend_freia_config | 299 +++++++++++++++++++++++++ blend_helpers | 284 ++++++++++++++++++------ blend_helpers.md | 78 ++++++- blend_sysconf | 4 +- collect_edited_files.sh | 12 +- console_livesdk.sh | 2 +- daedalus.config | 176 +++++++++++++++ devuan-debian_releases | 13 ++ devuan-desktop-metal.blend | 40 +--- .gitlab-ci.yml => dot.gitlab-ci.yml | 0 excalibur.config | 176 +++++++++++++++ freia.config | 176 +++++++++++++++ install.sh | 260 +++++++++++++++++++--- sistarte-id_rsa.pub | 1 + sistarte_password.txt | 1 + snapshot.sources.list | 4 + u-boot-logo/Devuan-logo-swoosh.bmp | Bin 0 -> 232262 bytes u-boot-logo/Devuan-logo-swoosh.png | Bin 0 -> 34822 bytes u-boot-logo/Devuan-logo-swoosh.svg | 34 +++ u-boot-logo/Devuan-logo.bmp | Bin 0 -> 455662 bytes u-boot-logo/Devuan-logo.png | Bin 0 -> 87940 bytes u-boot-logo/Devuan-logo.svg | 27 +++ u-boot-logo/README.md | 75 +++++++ 33 files changed, 3328 insertions(+), 178 deletions(-) create mode 100644 blend_config.mirror create mode 100644 blend_daedalus-docker_config create mode 100644 blend_daedalus_config create mode 100644 blend_excalibur-docker_config create mode 100644 blend_excalibur_config create mode 100644 blend_freia-docker_config create mode 100644 blend_freia_config create mode 100644 daedalus.config create mode 100644 devuan-debian_releases rename .gitlab-ci.yml => dot.gitlab-ci.yml (100%) create mode 100644 excalibur.config create mode 100644 freia.config create mode 100644 sistarte-id_rsa.pub create mode 100644 sistarte_password.txt create mode 100644 snapshot.sources.list create mode 100644 u-boot-logo/Devuan-logo-swoosh.bmp create mode 100644 u-boot-logo/Devuan-logo-swoosh.png create mode 100644 u-boot-logo/Devuan-logo-swoosh.svg create mode 100644 u-boot-logo/Devuan-logo.bmp create mode 100644 u-boot-logo/Devuan-logo.png create mode 100644 u-boot-logo/Devuan-logo.svg create mode 100644 u-boot-logo/README.md diff --git a/README.md b/README.md index 399ec0b..c340293 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +NB. These helper functions are falling behind the arm-sdk blend helpers. +currently /space/code_repositories/decode-os/os-build-system/blends/devuan-desktop is the working place. + + Helper scripts and configs for devuan sdk to form a blend to produce minimized docker images and install devuan to multiple harddrives using zfs. diff --git a/TODO.txt b/TODO.txt index 1ee5a35..a658c11 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,7 +1,15 @@ metal -/boot/grub not mounted by fstab, mountpoint on bpool not available ------- +connman not set up, might not like it. + +----- + +bluez missing + +----- +default devuan user disappears +----- + change /tmp to tmpfs ------ rewrite the docker helpers that just set config in apt-conf.d to the sysconf pattern. @@ -17,7 +25,7 @@ Move the metal blend and associated file into its own blend directory. add submodules, dockerfile and gitlab-ci.yml so that images can be build automatically. ---------------------- +---------------- debootstrap has the option 'doing_variant' that accepts 1. minbase - base="$devuan_required apt" diff --git a/blend_chimaera_config b/blend_chimaera_config index 4f789bf..14cd1c4 100644 --- a/blend_chimaera_config +++ b/blend_chimaera_config @@ -53,6 +53,7 @@ base_packages+=( openssh-client sudo alsa-utils + alsa-ucm-conf mawk tmux tmuxp @@ -92,7 +93,6 @@ extra_packages+=( firmware-bnx2 firmware-bnx2x firmware-brcm80211 - firmware-intelwimax firmware-iwlwifi firmware-libertas firmware-linux-free @@ -173,7 +173,6 @@ extra_packages+=( firmware-bnx2 firmware-bnx2x firmware-brcm80211 - firmware-intelwimax firmware-iwlwifi firmware-libertas firmware-linux-nonfree @@ -190,7 +189,6 @@ extra_packages+=( refractasnapshot-gui linux-headers-${arch} zfs-dkms - spl-dkms zfsutils-linux avahi-daemon ) diff --git a/blend_config b/blend_config index 9ae3ea6..0d1afda 100644 --- a/blend_config +++ b/blend_config @@ -6,13 +6,34 @@ arrs+=(disk_name efi_partitions swap_partitions custom_deb_packages) blend_name="devuan-desktop-metal_" +# release="jessie" +# version="1.0.0" + +# release="ascii" +# version="2.0.0" + +# release="beowulf" +# version="3.0.0" + +# release="chimaera" +# version="4.0.0" + release="daedalus" -version="5.0.0" +version="5.0.0" + +# release="excalibur" +# version="6.0.0" + +# release="freia" +# version="7.0.0" + hostname="devuan" username="devuan" userpass="devuan" -userskel="/etc/skel" +user_skel="/etc/skel" +user_groups="sudo,docker" +user_shell="/usr/bin/zsh" default_shell="/usr/bin/zsh" # comment to disable: @@ -26,26 +47,24 @@ default_shell="/usr/bin/zsh" # >>> ${bootstrap_options} \ <<< # --arch # Currently we have put a wrapper in blend_helpers-docker to add these optiions using an alias. -bootstrap_options=("\ - --force-check-gpg \ - --no-merged-usr \ - --variant=minbase" \ -) +debootstrap_options=("--force-check-gpg --no-merged-usr --variant=minbase") +debootstrap_purge_packages=() +debootstrap_cache="/tmp/debootstrap_cache" # debootstrap mirror #mirror="tor+http://devuanauxrkggcowgm2vcs6go3c5pgxdidd5wqjpg7zpfaxkmgspr6id.onion/merged" #mirror="http://pkgmaster.devuan.org/merged" # #mirror="http://deb.devuan.org" # #mirror="http://localhost:3142/deb.devuan.org/merged/" # apt-cacher-ng -#mirror="http://192.168.1.50:3142/deb.devuan.org/merged/" # apt-cacher-ng -mirror="http://192.168.1.50:3142" # apt-cacher-ng +#mirror="http://192.168.1.49:3142/deb.devuan.org/merged/" # apt-cacher-ng +mirror="http://192.168.1.49:3142" # apt-cacher-ng # the mirror to use in /etc/apt/apt.conf.d/02proxy -apt_proxy="http://192.168.1.50:3142" +apt_proxy="http://192.168.1.49:3142" -host_arch="$(dpkg-architecture -q DEB_BUILD_ARCH)" -arch=arm64 -#arch=amd64 +arch="amd64" +#arch="arm64" +#arch="i386" case "$arch" in # for minimal-live @@ -59,15 +78,16 @@ case "$arch" in arm64) extra_packages+=(linux-image-arm64) ;; esac -kernel_version="5.10.0-13" -#kernel_version="5.17.3-1" = requires daedalus +kernel_version="6.1.0-10" # ZFS install parameters rootfs="zfs" disk_path="/dev/disk/by-id" -disk_name="ata-HGST_HTS541010A9E680_JA1000102T3RVP" -disk2_name="ata-HGST_HTS541010A9E680_JB10001329MG7R" +disk_name="ata-CT1000MX500SSD1_2321E6DBE216" +disk2_name="ata-CT1000MX500SSD1_2321E6DBE1D2" +# disk_name="ata-HGST_HTS541010A9E680_JA1000102T3RVP" +# disk2_name="ata-HGST_HTS541010A9E680_JB10001329MG7R" #raid=unset # raid0: striped 1 or more raid=mirror # raid1: mirror 2 @@ -152,11 +172,7 @@ fi # Uncomment for amd64 -if [[ dpkg-architecture --is amd64 ]]; then - base_packages+=(grub-efi-amd64-bin grub-efi-ia32-bin) -else - echo "Build u-boot instead of grub: not implemetned yet." -fi +base_packages+=(grub-efi-amd64-bin grub-efi-ia32-bin) # devuan grub themes: cinnabar-grub darkpurpy-grub deepsea-grub # grub themes must be placed on filesystems visable to grub ie not zfs. @@ -164,7 +180,7 @@ grub_theme="deepsea-grub" grub_gfxmode="1920x1200x32,1920x1200x8" mirror="http://deb.devuan.org/merged" -section="main contrib non-free" +section="main contrib non-free non-free-firmware" # need to add to the debootstrap command in lib/libdevuansdk/zlibs/bootstrap #debootstrap_options="--extra-suites=ascii-proposed-updates --include=libupower-glib3,dbus-x11,xfce4" diff --git a/blend_config.mirror b/blend_config.mirror new file mode 100644 index 0000000..85ae83c --- /dev/null +++ b/blend_config.mirror @@ -0,0 +1,185 @@ +#!/usr/bin/env zsh +## configuration file for devuan-desktop-live blend + +vars+=(username userpass default_shell mkefi grubversion hookscripts) +arrs+=(disk_name efi_partitions swap_partitions custom_deb_packages) + +blend_name="devuan-desktop-metal_" + +release="daedalus" +version="5.0.0" + +hostname="devuan" +username="devuan" +userpass="devuan" +userskel="/etc/skel" +default_shell="/usr/bin/zsh" + +# comment to disable: +#hookscripts="yes" + +# debootstrap options +# From lib/libdevuansdk/zlib/bootstrap we need to add the options variable. +# debootstrap --keyring="$LIBPATH/extra/devuan-keyring/keyrings/devuan-archive-keyring.gpg" \ +# --include=devuan-keyring,wget,ca-certificates \ +# --foreign \ +# >>> ${bootstrap_options} \ <<< +# --arch +# Currently we have put a wrapper in blend_helpers-docker to add these optiions using an alias. +bootstrap_options=("\ + --force-check-gpg \ + --no-merged-usr \ + --variant=minbase" \ +) + +# debootstrap mirror +#mirror="tor+http://devuanauxrkggcowgm2vcs6go3c5pgxdidd5wqjpg7zpfaxkmgspr6id.onion/merged" +#mirror="http://pkgmaster.devuan.org/merged" # +#mirror="http://deb.devuan.org" # +#mirror="http://localhost:3142/deb.devuan.org/merged/" # apt-cacher-ng +#mirror="http://192.168.1.50:3142/deb.devuan.org/merged/" # apt-cacher-ng +mirror="http://192.168.1.50:3142" # apt-cacher-ng + +# the mirror to use in /etc/apt/apt.conf.d/02proxy +apt_proxy="http://192.168.1.50:3142" + +host_arch="$(dpkg-architecture -q DEB_BUILD_ARCH)" +arch=arm64 +#arch=amd64 + +case "$arch" in + # for minimal-live + #i386) extra_packages+=(linux-image-686) ;; + + # for desktop-live + #i386) extra_packages+=(linux-image-686-pae) ;; + + amd64) extra_packages+=(linux-image-amd64) ;; + + arm64) extra_packages+=(linux-image-arm64) ;; +esac + +kernel_version="5.10.0-13" +#kernel_version="5.17.3-1" = requires daedalus + +# ZFS install parameters +rootfs="zfs" + +disk_path="/dev/disk/by-id" +disk_name="ata-HGST_HTS541010A9E680_JA1000102T3RVP" +disk2_name="ata-HGST_HTS541010A9E680_JB10001329MG7R" + +#raid=unset # raid0: striped 1 or more +raid=mirror # raid1: mirror 2 +#raid=raidz # raid1: mirror 3 +#raid=raidz2 # raid2: mirror 4 +#raid=raidz3 # raid3: mirror 5 +#raid=stripedmirror # raid10: mirror 4 and paired + +available_disks=("${disk_name}") +if [[ -v $raid ]]; then + available_disks+="${disk2_name}" +fi + +root_name="devuan-1" +rpool_name="rpool" +bpool_name="bpool" +#encrypt=yes + +# polite to use somewhere other than /etc/zfs rather than squash it. +#zpool_cache_dir="/etc/zfs" +zpool_cache_dir="/var/tmp" + +## underlying physical block size for zpool create. +# ashift=9 means 512B sectors (used by all ancient drives), +# ashift=12 means 4K sectors (used by most modern hard drives), and +# ashift=13 means 8K sectors (used by some modern SSDs). +ashift=12 + +bios_part_number="1" +efi_part_number="2" +swap_part_number="3" +boot_part_number="4" +root_part_number="5" + +efi_start="2048" + +bios_part_size="1MB" +efi_part_size="512MB" +swap_part_size="8GB" +boot_part_size="2GB" + +# zvol requires resume to be disabled +#swap_type="zvol" +swap_type="physical" + +tmp_exec_state="off" +var_tmp_exec_state="on" + +# uncomment to create uefi-bootable iso causes iso_make_efi and iso_write_grub_cfg +# to be called in blend_postinst +#MKEFI=1 +efi_work="$BLENDPATH/${release}/efi-files" + + +zero_uefi="no" +#efi=1 + +if [[ -n $efi ]];then + grub_mount="/boot/efi" + grubversion="grub-efi-${arch}" + + case "arch" in + amd64) grub_efi_target="x86_64-efi" ;; + arm64) grub_efi_target="arm64-efi" ;; + i386) grub_efi_target="i386-efi" ;; + esac + +else + grub_mount="/boot/grub" + grubversion="grub-pc" +fi + +efi_partitions+=("/dev/disk/by-id/${disk_name}-part${efi_part_number}") +if [[ -v ${raid} ]]; then + efi_partitions+="/dev/disk/by-id/${disk2_name}-part${efi_part_number}" +fi + +swap_partitions+=("/dev/disk/by-id/${disk_name}-part${swap_part_number}") +if [[ -v ${raid} ]]; then + swap_partitions+="/dev/disk/by-id/${disk2_name}-part${swap_part_number}" +fi + + +# Uncomment for amd64 +if [[ $(dpkg-architecture --is amd64) ]]; then + base_packages+=(grub-efi-amd64-bin grub-efi-ia32-bin) +else + echo "Build u-boot instead of grub: not implemented yet." +fi + +# devuan grub themes: cinnabar-grub darkpurpy-grub deepsea-grub +# grub themes must be placed on filesystems visable to grub ie not zfs. +grub_theme="deepsea-grub" +grub_gfxmode="1920x1200x32,1920x1200x8" + +mirror="http://deb.devuan.org/merged" +section="main contrib non-free" + +# need to add to the debootstrap command in lib/libdevuansdk/zlibs/bootstrap +#debootstrap_options="--extra-suites=ascii-proposed-updates --include=libupower-glib3,dbus-x11,xfce4" + +base_packages_option=(--no-install-recommends) +extra_packages_option=(--no-install-recommends) + + +release_conf="$BLENDPATH/${release}/config" + + +### package sets are defined in the corresponding $release/config file + +source $release_conf + +## image_name depends on release and version + +image_name="${os}_${release}_${version}_${arch}_desktop" diff --git a/blend_daedalus-docker_config b/blend_daedalus-docker_config new file mode 100644 index 0000000..cccb44c --- /dev/null +++ b/blend_daedalus-docker_config @@ -0,0 +1,326 @@ +#!/usr/bin/env zsh +# shellcheck shell=bash +## configuration file for devuan-minimal-docker blend -- Chimaera release + +# -o options to apt-get install. +# APT::Get::Mark-Auto=true +# APT::Get::AllowUnauthenticated=true +# Dpkg::Progress and Dpkg::Progress-Fancy=true +# +# The following would be useful if pulling old releases +#core_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) +#base_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) +#extra_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) + + +# Override base_packages and core_packages from: lib/libdevuansdk/config +core_packages=() +base_packages=() +extra_packages=() + +# these are the differences between debian and devuan slim images that are not in 'required'. +# If they are in /usr/share/debootstrap/scripts/ceres it doesn't have to be here. +# devuan_required="devuan-keyring sysvinit-core" +# +base_packages=( + bootlogd + innserv + eudev + ) + +# bootstrap_stage4 +extra_packages=( + vim-tiny + ) + + +### now we include all the package sets +#base_packages+=( +# $minimal_base_packages +# $minimal_admin_packages +# $minimal_editors_packages +# $minimal_net_packages +# $minimal_prod_packages +# $minimal_devel_packages +# $minimal_games_packages +# $minimal_a11y_packages +# $minimal_media_packages +# $minimal_misc_packages +#) + +## +## definition of package sets +## + +### base package set +minimal_base_packages+=( + acpi + acpi-support-base + acpid + acpi-fakekey + at + bash + bash-completion + bc + busybox + console-common + console-data + console-setup + console-setup-linux + coreutils + dash + dc + dialog + discover + dselect + file + groff-base + $grubversion + info + kbd + laptop-detect + locales + lsof + syslinux + util-linux-locales + zsh +) + +## admin package set +minimal_admin_packages+=( + cryptsetup + cryptsetup-bin + debootstrap + dosfstools + entr + gddrescue + gdisk + htop + iftop + iotop + iw + lvm2 + mdadm + mtr-tiny + multitail + ncdu + parted + pciutils + psmisc + sudo + time + usbutils + wavemon + wireless-tools + wpasupplicant + +) + +## editors package set +minimal_editors_packages+=( + ed + nano + vim-tiny + zile +) + + +## networking package set +minimal_net_packages+=( + bind9-host +# bittornado ### not in chimaera + ceni + curl + dnsutils + edbrowse + fetchmail + ftp + geoip-bin + haveged + irssi + lftp + links2 + lrzsz + mcabber + minicom + mosh + msmtp + mutt + netcat + net-tools + nfacct +# nrss # not in beowulf. Use rsstail instead. + openssh-client + openssh-server + procmail + rfkill + rsstail + rsync +# setnet # use ascii deb package for beowulf and chimaera + telnet + traceroute + transmission-cli + w3m + wget + whois +) + + +## productivity package set +minimal_prod_packages+=( + abook + apcalc + aspell + aspell-en + calcurse + clex + dvtm + fbi + fbterm + ghostscript + gnupg + gnupg2 + gnupg-agent + mc + parallel + poppler-utils + rpl + rename + sc + screen + taskwarrior + tmux +) + +## programming package set +minimal_devel_packages+=( + tcc + libc6-dev + m4 + patch + perl + perl-base + perl-modules-5.36 + python3.11-minimal + gawk + guile-3.0 + guile-3.0-libs +) + +## games package set +# minimal_games_packages+=( +# bastet +# bombardier +# bsdgames +# cavezofphear +# crawl +# curseofwar +# empire +# freesweep +# gnuchess +# greed +# matanza +# moria +# nethack-console +# ninvaders +# omega-rpg +# pacman4console +# pente +# sudoku +# ) + +## accessibility package set +minimal_a11y_packages+=( + beep + brltty + espeak + espeakup + yasr +) + + +## multimedia package set +minimal_media_packages+=( + alsa-utils + caca-utils + fmtools + hasciicam + imagemagick + jhead + moc +# radio # Not in beowulf. Replaced with fmtools. + sox +) + +## misc package set +minimal_misc_packages+=( + cmatrix + cowsay + eject + figlet + fortunes-min + fortune-mod + gpm + man-db + manpages + manpages-dev + mlocate +# termsaver ### not in chimaera + toilet + toilet-fonts + ttyrec + unzip +) + + + +#### TODO: REPLACE twidge (twitter client) +#### ADDED: geoip-bin + +#extra_packages+=( +# atmel-firmware +# bluez-firmware +# dahdi-firmware-nonfree +# firmware-amd-graphics +# firmware-ath9k-htc +# firmware-atheros +# firmware-bnx2 +# firmware-bnx2x +# firmware-brcm80211 +# firmware-cavium +## firmware-crystalhd +# firmware-intel-sound +# firmware-intelwimax +## firmware-ipw2x00 ### These two exist but fail today. +## firmware-ivtv ### ...they require EULA +# firmware-iwlwifi +# firmware-libertas +# firmware-linux-free +# firmware-linux-nonfree +# firmware-myricom +# firmware-netxen +# firmware-qlogic +## firmware-ralink +# firmware-realtek +# firmware-ti-connectivity +# firmware-zd1211 +# refractainstaller-base +# refractasnapshot-base +#) + + +#purge_packages=( +# elinks +# elinks-data +# liberror-perl +# libfsplib0 +# libtre5 +# openntpd +# tasksel +# tasksel-data +#) + +#custom_deb_packages+=( +# memtest86+_5.01-3.1_${arch}.deb +# setnet_0.4+devuan1_all.deb +#) diff --git a/blend_daedalus_config b/blend_daedalus_config new file mode 100644 index 0000000..b11bbee --- /dev/null +++ b/blend_daedalus_config @@ -0,0 +1,299 @@ +#!/usr/bin/env zsh +## configuration file for devuan-desktop-live blend -- Daedalus release + + +base_packages+=( + lsof + bash-completion + texinfo + acpi-support-base + acpi-fakekey + aptitude + apt-listchanges + debootstrap + discover + dnsutils + doc-debian + docutils-common + docutils-doc + ftp + gettext + gnupg2 + gparted + mtd-utils + u-boot-tools + grub-pc-bin + $grubversion + iw + laptop-detect + lvm2 + mdadm + mlocate + mutt + ncurses-term + net-tools + netcat-traditional + nfs-common + procmail + reportbug + rfkill + telnet + traceroute + usbutils + util-linux-locales + w3m + whois +) + +base_packages+=( + apt-utils + dselect + parted + openssh-server + openssh-client + sudo + alsa-utils + alsa-ucm-conf + mawk + tmux + tmuxp + screen + ntp + wpasupplicant + wireless-tools + elinks + firmware-linux-free + zsh + rsync + git + strace +) + + +extra_packages+=( + + task-desktop + task-laptop + task-xfce-desktop + fontsnaps +# task-print-server ## no package + popularity-contest +# refractainstaller-base +# refractasnapshot-base +# yad +# refractainstaller-gui +# refractasnapshot-gui +# libgtk3-perl #need to add this for graphical debconf - THIS SUCKS! (buttons off-screen) + gvfs-backends +) + + +extra_packages+=( + firmware-atheros + firmware-bnx2 + firmware-bnx2x + firmware-brcm80211 + firmware-iwlwifi + firmware-libertas + firmware-linux-free + firmware-linux-nonfree + firmware-misc-nonfree + firmware-myricom + firmware-netxen + firmware-qlogic +# firmware-ralink # no package + firmware-realtek + firmware-ti-connectivity + firmware-zd1211 +) + +extra_packages+=( + fonts-quicksand + fonts-liberation + fonts-symbola + xserver-xorg-input-all + xserver-xorg-video-all + anacron + bluetooth + iw + powertop + vim-gtk3 + wireless-tools + wpasupplicant + tasksel + xfce4 + xfce4-goodies + xfce4-power-manager + xfce4-terminal + atril + dbus-x11 + hunspell-en-gb + hyphen-en-gb + mythes-en-us + synaptic + system-config-printer + tango-icon-theme + xsane + enlightenment + terminology + rox-filer + rsync + lsof + gdisk + gnupg-utils + schroot + debootstrap + debhelper + makedev + curl + git + wget + qemu-user-static + build-essential + gcc-arm-none-eabi + gcc-multilib + lib32z1 + u-boot-tools + device-tree-compiler + lzop + dosfstools + vboot-utils + vboot-kernel-utils + dpkg-dev + swig + bc + bison + flex + parted + kpartx + qemu-user-static + pinthread + neovim + firmware-atheros + firmware-bnx2 + firmware-bnx2x + firmware-brcm80211 + firmware-iwlwifi + firmware-libertas + firmware-linux-nonfree + firmware-misc-nonfree + firmware-myricom + firmware-netxen + firmware-qlogic + firmware-realtek + firmware-ti-connectivity + firmware-zd1211 + sudo +# yad +# refractainstaller-gui +# refractasnapshot-gui + linux-headers-${arch} + zfs-dkms + zfsutils-linux + avahi-daemon +) + + +purge_packages=( +# devuan-baseconf + debian-keyring + elinks + elinks-data +# git +# git-core +# git-man + liberror-perl + libfsplib0 + libtre5 +# openntpd +# openssh-server +# openssh-sftp-server +# tmux +# zsh +# zsh-common +# intel-microcode +# iucode-tool +# amd64-microcode +) + +purge_packages+=( + auditd + cups-browsed + gvfs-daemons + pulseaudio + pulseaudio-utils + libpulsedsp + xscreensaver + xscreensaver-data + packagekit + packagekit-tools +) + + +custom_deb_packages+=( + + +) + + +custom_scripts+=( + 001_apt_get-selections.sh + 001_apt-group.sh + 001_apt-parallel_on.sh + 001_apt-preferences.sh + 001_apt-proxy_off.sh + 001_apt-proxy_on.sh + 001_apt-sources.sh + 001_apt_suggests-recommends.sh + 001_apt-verbose-versions.sh + 001_docker_grub-commandline.sh + 001_enable-binfmt-misc.sh + 001_grub_gfxmode.sh + 001_locales.sh + 001_prevent_udev_net-rename.sh +# 001_resolvconf.sh + 020_connman.sh + 001_ssh.sh + 001_swap-caps.sh + 001_system_bell.sh + 001_udev-rules.sh + 001_virtual-mem.sh + 010_sysctl.sh + 010_generate-ssh.sh + 010_apt-get.sh + 001_system_bell.sh + 010_saltstack.sh + 020_console.sh + 020_zsh_quickstart.sh + 020_zsh_aliases.d.sh + 020_lsd.sh + 020_grc.sh + 010_alsa.sh + 020_conky.sh + 020_djmount.sh + 029_yarn.sh + 020_vim.sh + 020_meld.sh + 020_themes.sh + 020_audacity.sh + 020_powerline-bash.sh + 020_fonts.sh + 020_nanorc.sh + 020_neovim.sh + 020_mutt-wizard.sh + 020_mutt-notmuch.sh + 020_mutt-khard.sh + 020_shellcheck.sh + 020_neofetch_motd.sh + 020_tmux.sh + 020_rox-filer.sh + 020_hexchat.sh + 020_pidgin.sh + 020_brave_browser.sh +# 020_slim.sh + 020_lightdm.sh + 020_docker.sh + 020_docker-compose_checkinstall.sh + 050_remove_xscreensaver.sh +) + diff --git a/blend_excalibur-docker_config b/blend_excalibur-docker_config new file mode 100644 index 0000000..cccb44c --- /dev/null +++ b/blend_excalibur-docker_config @@ -0,0 +1,326 @@ +#!/usr/bin/env zsh +# shellcheck shell=bash +## configuration file for devuan-minimal-docker blend -- Chimaera release + +# -o options to apt-get install. +# APT::Get::Mark-Auto=true +# APT::Get::AllowUnauthenticated=true +# Dpkg::Progress and Dpkg::Progress-Fancy=true +# +# The following would be useful if pulling old releases +#core_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) +#base_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) +#extra_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) + + +# Override base_packages and core_packages from: lib/libdevuansdk/config +core_packages=() +base_packages=() +extra_packages=() + +# these are the differences between debian and devuan slim images that are not in 'required'. +# If they are in /usr/share/debootstrap/scripts/ceres it doesn't have to be here. +# devuan_required="devuan-keyring sysvinit-core" +# +base_packages=( + bootlogd + innserv + eudev + ) + +# bootstrap_stage4 +extra_packages=( + vim-tiny + ) + + +### now we include all the package sets +#base_packages+=( +# $minimal_base_packages +# $minimal_admin_packages +# $minimal_editors_packages +# $minimal_net_packages +# $minimal_prod_packages +# $minimal_devel_packages +# $minimal_games_packages +# $minimal_a11y_packages +# $minimal_media_packages +# $minimal_misc_packages +#) + +## +## definition of package sets +## + +### base package set +minimal_base_packages+=( + acpi + acpi-support-base + acpid + acpi-fakekey + at + bash + bash-completion + bc + busybox + console-common + console-data + console-setup + console-setup-linux + coreutils + dash + dc + dialog + discover + dselect + file + groff-base + $grubversion + info + kbd + laptop-detect + locales + lsof + syslinux + util-linux-locales + zsh +) + +## admin package set +minimal_admin_packages+=( + cryptsetup + cryptsetup-bin + debootstrap + dosfstools + entr + gddrescue + gdisk + htop + iftop + iotop + iw + lvm2 + mdadm + mtr-tiny + multitail + ncdu + parted + pciutils + psmisc + sudo + time + usbutils + wavemon + wireless-tools + wpasupplicant + +) + +## editors package set +minimal_editors_packages+=( + ed + nano + vim-tiny + zile +) + + +## networking package set +minimal_net_packages+=( + bind9-host +# bittornado ### not in chimaera + ceni + curl + dnsutils + edbrowse + fetchmail + ftp + geoip-bin + haveged + irssi + lftp + links2 + lrzsz + mcabber + minicom + mosh + msmtp + mutt + netcat + net-tools + nfacct +# nrss # not in beowulf. Use rsstail instead. + openssh-client + openssh-server + procmail + rfkill + rsstail + rsync +# setnet # use ascii deb package for beowulf and chimaera + telnet + traceroute + transmission-cli + w3m + wget + whois +) + + +## productivity package set +minimal_prod_packages+=( + abook + apcalc + aspell + aspell-en + calcurse + clex + dvtm + fbi + fbterm + ghostscript + gnupg + gnupg2 + gnupg-agent + mc + parallel + poppler-utils + rpl + rename + sc + screen + taskwarrior + tmux +) + +## programming package set +minimal_devel_packages+=( + tcc + libc6-dev + m4 + patch + perl + perl-base + perl-modules-5.36 + python3.11-minimal + gawk + guile-3.0 + guile-3.0-libs +) + +## games package set +# minimal_games_packages+=( +# bastet +# bombardier +# bsdgames +# cavezofphear +# crawl +# curseofwar +# empire +# freesweep +# gnuchess +# greed +# matanza +# moria +# nethack-console +# ninvaders +# omega-rpg +# pacman4console +# pente +# sudoku +# ) + +## accessibility package set +minimal_a11y_packages+=( + beep + brltty + espeak + espeakup + yasr +) + + +## multimedia package set +minimal_media_packages+=( + alsa-utils + caca-utils + fmtools + hasciicam + imagemagick + jhead + moc +# radio # Not in beowulf. Replaced with fmtools. + sox +) + +## misc package set +minimal_misc_packages+=( + cmatrix + cowsay + eject + figlet + fortunes-min + fortune-mod + gpm + man-db + manpages + manpages-dev + mlocate +# termsaver ### not in chimaera + toilet + toilet-fonts + ttyrec + unzip +) + + + +#### TODO: REPLACE twidge (twitter client) +#### ADDED: geoip-bin + +#extra_packages+=( +# atmel-firmware +# bluez-firmware +# dahdi-firmware-nonfree +# firmware-amd-graphics +# firmware-ath9k-htc +# firmware-atheros +# firmware-bnx2 +# firmware-bnx2x +# firmware-brcm80211 +# firmware-cavium +## firmware-crystalhd +# firmware-intel-sound +# firmware-intelwimax +## firmware-ipw2x00 ### These two exist but fail today. +## firmware-ivtv ### ...they require EULA +# firmware-iwlwifi +# firmware-libertas +# firmware-linux-free +# firmware-linux-nonfree +# firmware-myricom +# firmware-netxen +# firmware-qlogic +## firmware-ralink +# firmware-realtek +# firmware-ti-connectivity +# firmware-zd1211 +# refractainstaller-base +# refractasnapshot-base +#) + + +#purge_packages=( +# elinks +# elinks-data +# liberror-perl +# libfsplib0 +# libtre5 +# openntpd +# tasksel +# tasksel-data +#) + +#custom_deb_packages+=( +# memtest86+_5.01-3.1_${arch}.deb +# setnet_0.4+devuan1_all.deb +#) diff --git a/blend_excalibur_config b/blend_excalibur_config new file mode 100644 index 0000000..a74bb06 --- /dev/null +++ b/blend_excalibur_config @@ -0,0 +1,298 @@ +#!/usr/bin/env zsh +## configuration file for devuan-desktop-live blend -- Excalibur release + + +base_packages+=( + lsof + bash-completion + texinfo + acpi-support-base + acpi-fakekey + aptitude + apt-listchanges + debootstrap + discover + dnsutils + doc-debian + docutils-common + docutils-doc + ftp + gettext + gnupg2 + gparted + mtd-utils + u-boot-tools + grub-pc-bin + $grubversion + iw + laptop-detect + lvm2 + mdadm + mlocate + mutt + ncurses-term + net-tools + netcat-traditional + nfs-common + procmail + reportbug + rfkill + telnet + traceroute + usbutils + util-linux-locales + w3m + whois +) + +base_packages+=( + apt-utils + dselect + parted + openssh-server + openssh-client + sudo + alsa-utils + mawk + tmux + tmuxp + screen + ntp + wpasupplicant + wireless-tools + elinks + firmware-linux-free + zsh + rsync + git + strace +) + + +extra_packages+=( + + task-desktop + task-laptop + task-xfce-desktop + fontsnaps +# task-print-server ## no package + popularity-contest +# refractainstaller-base +# refractasnapshot-base +# yad +# refractainstaller-gui +# refractasnapshot-gui +# libgtk3-perl #need to add this for graphical debconf - THIS SUCKS! (buttons off-screen) + gvfs-backends +) + + +extra_packages+=( + firmware-atheros + firmware-bnx2 + firmware-bnx2x + firmware-brcm80211 + firmware-iwlwifi + firmware-libertas + firmware-linux-free + firmware-linux-nonfree + firmware-misc-nonfree + firmware-myricom + firmware-netxen + firmware-qlogic +# firmware-ralink # no package + firmware-realtek + firmware-ti-connectivity + firmware-zd1211 +) + +extra_packages+=( + fonts-quicksand + fonts-liberation + fonts-symbola + xserver-xorg-input-all + xserver-xorg-video-all + anacron + bluetooth + iw + powertop + vim-gtk3 + wireless-tools + wpasupplicant + tasksel + xfce4 + xfce4-goodies + xfce4-power-manager + xfce4-terminal + atril + dbus-x11 + hunspell-en-gb + hyphen-en-gb + mythes-en-us + synaptic + system-config-printer + tango-icon-theme + xsane + enlightenment + terminology + rox-filer + rsync + lsof + gdisk + gnupg-utils + schroot + debootstrap + debhelper + makedev + curl + git + wget + qemu-user-static + build-essential + gcc-arm-none-eabi + gcc-multilib + lib32z1 + u-boot-tools + device-tree-compiler + lzop + dosfstools + vboot-utils + vboot-kernel-utils + dpkg-dev + swig + bc + bison + flex + parted + kpartx + qemu-user-static + pinthread + neovim + firmware-atheros + firmware-bnx2 + firmware-bnx2x + firmware-brcm80211 + firmware-iwlwifi + firmware-libertas + firmware-linux-nonfree + firmware-misc-nonfree + firmware-myricom + firmware-netxen + firmware-qlogic + firmware-realtek + firmware-ti-connectivity + firmware-zd1211 + sudo +# yad +# refractainstaller-gui +# refractasnapshot-gui + linux-headers-${arch} + zfs-dkms + zfsutils-linux + avahi-daemon +) + + +purge_packages=( +# devuan-baseconf + debian-keyring + elinks + elinks-data +# git +# git-core +# git-man + liberror-perl + libfsplib0 + libtre5 +# openntpd +# openssh-server +# openssh-sftp-server +# tmux +# zsh +# zsh-common +# intel-microcode +# iucode-tool +# amd64-microcode +) + +purge_packages+=( + auditd + cups-browsed + gvfs-daemons + pulseaudio + pulseaudio-utils + libpulsedsp + xscreensaver + xscreensaver-data + packagekit + packagekit-tools +) + + +custom_deb_packages+=( + + +) + + +custom_scripts+=( + 001_apt_get-selections.sh + 001_apt-group.sh + 001_apt-parallel_on.sh + 001_apt-preferences.sh + 001_apt-proxy_off.sh + 001_apt-proxy_on.sh + 001_apt-sources.sh + 001_apt_suggests-recommends.sh + 001_apt-verbose-versions.sh + 001_docker_grub-commandline.sh + 001_enable-binfmt-misc.sh + 001_grub_gfxmode.sh + 001_locales.sh + 001_prevent_udev_net-rename.sh +# 001_resolvconf.sh + 020_connman.sh + 001_ssh.sh + 001_swap-caps.sh + 001_system_bell.sh + 001_udev-rules.sh + 001_virtual-mem.sh + 010_sysctl.sh + 010_generate-ssh.sh + 010_apt-get.sh + 001_system_bell.sh + 010_saltstack.sh + 020_console.sh + 020_zsh_quickstart.sh + 020_zsh_aliases.d.sh + 020_lsd.sh + 020_grc.sh + 010_alsa.sh + 020_conky.sh + 020_djmount.sh + 029_yarn.sh + 020_vim.sh + 020_meld.sh + 020_themes.sh + 020_audacity.sh + 020_powerline-bash.sh + 020_fonts.sh + 020_nanorc.sh + 020_neovim.sh + 020_mutt-wizard.sh + 020_mutt-notmuch.sh + 020_mutt-khard.sh + 020_shellcheck.sh + 020_neofetch_motd.sh + 020_tmux.sh + 020_rox-filer.sh + 020_hexchat.sh + 020_pidgin.sh + 020_brave_browser.sh +# 020_slim.sh + 020_lightdm.sh + 020_docker.sh + 020_docker-compose_checkinstall.sh + 050_remove_xscreensaver.sh +) + diff --git a/blend_freia-docker_config b/blend_freia-docker_config new file mode 100644 index 0000000..cccb44c --- /dev/null +++ b/blend_freia-docker_config @@ -0,0 +1,326 @@ +#!/usr/bin/env zsh +# shellcheck shell=bash +## configuration file for devuan-minimal-docker blend -- Chimaera release + +# -o options to apt-get install. +# APT::Get::Mark-Auto=true +# APT::Get::AllowUnauthenticated=true +# Dpkg::Progress and Dpkg::Progress-Fancy=true +# +# The following would be useful if pulling old releases +#core_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) +#base_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) +#extra_packages_option(-o Acquire::Check-Valid-Until=false -o Acquire::AllowReleaseInfoChange=true) + + +# Override base_packages and core_packages from: lib/libdevuansdk/config +core_packages=() +base_packages=() +extra_packages=() + +# these are the differences between debian and devuan slim images that are not in 'required'. +# If they are in /usr/share/debootstrap/scripts/ceres it doesn't have to be here. +# devuan_required="devuan-keyring sysvinit-core" +# +base_packages=( + bootlogd + innserv + eudev + ) + +# bootstrap_stage4 +extra_packages=( + vim-tiny + ) + + +### now we include all the package sets +#base_packages+=( +# $minimal_base_packages +# $minimal_admin_packages +# $minimal_editors_packages +# $minimal_net_packages +# $minimal_prod_packages +# $minimal_devel_packages +# $minimal_games_packages +# $minimal_a11y_packages +# $minimal_media_packages +# $minimal_misc_packages +#) + +## +## definition of package sets +## + +### base package set +minimal_base_packages+=( + acpi + acpi-support-base + acpid + acpi-fakekey + at + bash + bash-completion + bc + busybox + console-common + console-data + console-setup + console-setup-linux + coreutils + dash + dc + dialog + discover + dselect + file + groff-base + $grubversion + info + kbd + laptop-detect + locales + lsof + syslinux + util-linux-locales + zsh +) + +## admin package set +minimal_admin_packages+=( + cryptsetup + cryptsetup-bin + debootstrap + dosfstools + entr + gddrescue + gdisk + htop + iftop + iotop + iw + lvm2 + mdadm + mtr-tiny + multitail + ncdu + parted + pciutils + psmisc + sudo + time + usbutils + wavemon + wireless-tools + wpasupplicant + +) + +## editors package set +minimal_editors_packages+=( + ed + nano + vim-tiny + zile +) + + +## networking package set +minimal_net_packages+=( + bind9-host +# bittornado ### not in chimaera + ceni + curl + dnsutils + edbrowse + fetchmail + ftp + geoip-bin + haveged + irssi + lftp + links2 + lrzsz + mcabber + minicom + mosh + msmtp + mutt + netcat + net-tools + nfacct +# nrss # not in beowulf. Use rsstail instead. + openssh-client + openssh-server + procmail + rfkill + rsstail + rsync +# setnet # use ascii deb package for beowulf and chimaera + telnet + traceroute + transmission-cli + w3m + wget + whois +) + + +## productivity package set +minimal_prod_packages+=( + abook + apcalc + aspell + aspell-en + calcurse + clex + dvtm + fbi + fbterm + ghostscript + gnupg + gnupg2 + gnupg-agent + mc + parallel + poppler-utils + rpl + rename + sc + screen + taskwarrior + tmux +) + +## programming package set +minimal_devel_packages+=( + tcc + libc6-dev + m4 + patch + perl + perl-base + perl-modules-5.36 + python3.11-minimal + gawk + guile-3.0 + guile-3.0-libs +) + +## games package set +# minimal_games_packages+=( +# bastet +# bombardier +# bsdgames +# cavezofphear +# crawl +# curseofwar +# empire +# freesweep +# gnuchess +# greed +# matanza +# moria +# nethack-console +# ninvaders +# omega-rpg +# pacman4console +# pente +# sudoku +# ) + +## accessibility package set +minimal_a11y_packages+=( + beep + brltty + espeak + espeakup + yasr +) + + +## multimedia package set +minimal_media_packages+=( + alsa-utils + caca-utils + fmtools + hasciicam + imagemagick + jhead + moc +# radio # Not in beowulf. Replaced with fmtools. + sox +) + +## misc package set +minimal_misc_packages+=( + cmatrix + cowsay + eject + figlet + fortunes-min + fortune-mod + gpm + man-db + manpages + manpages-dev + mlocate +# termsaver ### not in chimaera + toilet + toilet-fonts + ttyrec + unzip +) + + + +#### TODO: REPLACE twidge (twitter client) +#### ADDED: geoip-bin + +#extra_packages+=( +# atmel-firmware +# bluez-firmware +# dahdi-firmware-nonfree +# firmware-amd-graphics +# firmware-ath9k-htc +# firmware-atheros +# firmware-bnx2 +# firmware-bnx2x +# firmware-brcm80211 +# firmware-cavium +## firmware-crystalhd +# firmware-intel-sound +# firmware-intelwimax +## firmware-ipw2x00 ### These two exist but fail today. +## firmware-ivtv ### ...they require EULA +# firmware-iwlwifi +# firmware-libertas +# firmware-linux-free +# firmware-linux-nonfree +# firmware-myricom +# firmware-netxen +# firmware-qlogic +## firmware-ralink +# firmware-realtek +# firmware-ti-connectivity +# firmware-zd1211 +# refractainstaller-base +# refractasnapshot-base +#) + + +#purge_packages=( +# elinks +# elinks-data +# liberror-perl +# libfsplib0 +# libtre5 +# openntpd +# tasksel +# tasksel-data +#) + +#custom_deb_packages+=( +# memtest86+_5.01-3.1_${arch}.deb +# setnet_0.4+devuan1_all.deb +#) diff --git a/blend_freia_config b/blend_freia_config new file mode 100644 index 0000000..cd0c4eb --- /dev/null +++ b/blend_freia_config @@ -0,0 +1,299 @@ +#!/usr/bin/env zsh +## configuration file for devuan-desktop-live blend -- Freia release + + +base_packages+=( + lsof + bash-completion + texinfo + acpi-support-base + acpi-fakekey + aptitude + apt-listchanges + debootstrap + discover + dnsutils + doc-debian + docutils-common + docutils-doc + ftp + gettext + gnupg2 + gparted + mtd-utils + u-boot-tools + grub-pc-bin + $grubversion + iw + laptop-detect + lvm2 + mdadm + mlocate + mutt + ncurses-term + net-tools + netcat-traditional + nfs-common + procmail + reportbug + rfkill + telnet + traceroute + usbutils + util-linux-locales + w3m + whois +) + +base_packages+=( + apt-utils + dselect + parted + openssh-server + openssh-client + sudo + alsa-utils + alsa-ucm-conf + mawk + tmux + tmuxp + screen + ntp + wpasupplicant + wireless-tools + elinks + firmware-linux-free + zsh + rsync + git + strace +) + + +extra_packages+=( + + task-desktop + task-laptop + task-xfce-desktop + fontsnaps +# task-print-server ## no package + popularity-contest +# refractainstaller-base +# refractasnapshot-base +# yad +# refractainstaller-gui +# refractasnapshot-gui +# libgtk3-perl #need to add this for graphical debconf - THIS SUCKS! (buttons off-screen) + gvfs-backends +) + + +extra_packages+=( + firmware-atheros + firmware-bnx2 + firmware-bnx2x + firmware-brcm80211 + firmware-iwlwifi + firmware-libertas + firmware-linux-free + firmware-linux-nonfree + firmware-misc-nonfree + firmware-myricom + firmware-netxen + firmware-qlogic +# firmware-ralink # no package + firmware-realtek + firmware-ti-connectivity + firmware-zd1211 +) + +extra_packages+=( + fonts-quicksand + fonts-liberation + fonts-symbola + xserver-xorg-input-all + xserver-xorg-video-all + anacron + bluetooth + iw + powertop + vim-gtk3 + wireless-tools + wpasupplicant + tasksel + xfce4 + xfce4-goodies + xfce4-power-manager + xfce4-terminal + atril + dbus-x11 + hunspell-en-gb + hyphen-en-gb + mythes-en-us + synaptic + system-config-printer + tango-icon-theme + xsane + enlightenment + terminology + rox-filer + rsync + lsof + gdisk + gnupg-utils + schroot + debootstrap + debhelper + makedev + curl + git + wget + qemu-user-static + build-essential + gcc-arm-none-eabi + gcc-multilib + lib32z1 + u-boot-tools + device-tree-compiler + lzop + dosfstools + vboot-utils + vboot-kernel-utils + dpkg-dev + swig + bc + bison + flex + parted + kpartx + qemu-user-static + pinthread + neovim + firmware-atheros + firmware-bnx2 + firmware-bnx2x + firmware-brcm80211 + firmware-iwlwifi + firmware-libertas + firmware-linux-nonfree + firmware-misc-nonfree + firmware-myricom + firmware-netxen + firmware-qlogic + firmware-realtek + firmware-ti-connectivity + firmware-zd1211 + sudo +# yad +# refractainstaller-gui +# refractasnapshot-gui + linux-headers-${arch} + zfs-dkms + zfsutils-linux + avahi-daemon +) + + +purge_packages=( +# devuan-baseconf + debian-keyring + elinks + elinks-data +# git +# git-core +# git-man + liberror-perl + libfsplib0 + libtre5 +# openntpd +# openssh-server +# openssh-sftp-server +# tmux +# zsh +# zsh-common +# intel-microcode +# iucode-tool +# amd64-microcode +) + +purge_packages+=( + auditd + cups-browsed + gvfs-daemons + pulseaudio + pulseaudio-utils + libpulsedsp + xscreensaver + xscreensaver-data + packagekit + packagekit-tools +) + + +custom_deb_packages+=( + + +) + + +custom_scripts+=( + 001_apt_get-selections.sh + 001_apt-group.sh + 001_apt-parallel_on.sh + 001_apt-preferences.sh + 001_apt-proxy_off.sh + 001_apt-proxy_on.sh + 001_apt-sources.sh + 001_apt_suggests-recommends.sh + 001_apt-verbose-versions.sh + 001_docker_grub-commandline.sh + 001_enable-binfmt-misc.sh + 001_grub_gfxmode.sh + 001_locales.sh + 001_prevent_udev_net-rename.sh +# 001_resolvconf.sh + 020_connman.sh + 001_ssh.sh + 001_swap-caps.sh + 001_system_bell.sh + 001_udev-rules.sh + 001_virtual-mem.sh + 010_sysctl.sh + 010_generate-ssh.sh + 010_apt-get.sh + 001_system_bell.sh + 010_saltstack.sh + 020_console.sh + 020_zsh_quickstart.sh + 020_zsh_aliases.d.sh + 020_lsd.sh + 020_grc.sh + 010_alsa.sh + 020_conky.sh + 020_djmount.sh + 029_yarn.sh + 020_vim.sh + 020_meld.sh + 020_themes.sh + 020_audacity.sh + 020_powerline-bash.sh + 020_fonts.sh + 020_nanorc.sh + 020_neovim.sh + 020_mutt-wizard.sh + 020_mutt-notmuch.sh + 020_mutt-khard.sh + 020_shellcheck.sh + 020_neofetch_motd.sh + 020_tmux.sh + 020_rox-filer.sh + 020_hexchat.sh + 020_pidgin.sh + 020_brave_browser.sh +# 020_slim.sh + 020_lightdm.sh + 020_docker.sh + 020_docker-compose_checkinstall.sh + 050_remove_xscreensaver.sh +) + diff --git a/blend_helpers b/blend_helpers index 8ac80e8..a9b7904 100644 --- a/blend_helpers +++ b/blend_helpers @@ -21,6 +21,8 @@ build_metal_dist() { req=(arch) req+=(workdir strapdir disk_name) ckreq || return 1 + + notice "installing complete dist" act "add release symlink to debootstrap scripts." if [[ ! -f /usr/share/debootstrap/scripts/${release} ]]; then ln -sf /usr/share/debootstrap/scripts/ceres \ @@ -34,6 +36,31 @@ build_metal_dist() { blend_postinst || { zerr; wrapup } } +build_image_dist() { + fn build_image_dist + req=(arch size parted_type) + case "$parted_type" in + gpt) req+=(gpt_boot gpt_root) ;; + dos) req+=(parted_boot parted_root) ;; + *) die "Unknown parted_type: $parted_type. Supported is gpt|dos." + zerr; return 1 + ;; + esac + req+=(workdir strapdir image_name) + ckreq || return 1 + + notice "building complete dist image" + act "$image_name" + + bootstrap_complete_base || { zerr; wrapup } + blend_preinst || { zerr; wrapup } + image_prepare_raw || { zerr; wrapup } + image_partition_raw_${parted_type} || { zerr; wrapup } + build_kernel_${arch} || { zerr; wrapup } + blend_postinst || { zerr; wrapup } + rsync_to_raw_image || { zerr; wrapup } + image_pack_dist || { zerr; wrapup } +} build_arm_dist() { @@ -41,7 +68,7 @@ build_arm_dist() req=(workdir strapdir os arch size parted_type) case "$parted_type" in gpt) req+=(gpt_boot gpt_root) ;; - dos) req+=(dos_boot dos_root) ;; + dos) req+=(parted_boot parted_root) ;; *) die "Unknown parted_type: $parted_type. Supported is gpt|dos." zerr; return 1 ;; @@ -54,7 +81,7 @@ build_arm_dist() blend_preinst || { zerr; return 1; } image_prepare_raw || { zerr; return 1; } image_connect_raw || { zerr; return 1; } - image_partition_${parted_type} || { zerr; return 1; } + image_partition_raw_${parted_type} || { zerr; return 1; } image_format_partitions || { zerr; return 1; } build_kernel_${arch} || { zerr; return 1; } image_mount || { zerr; return 1; } @@ -67,7 +94,27 @@ build_arm_dist() } -# Overide the post 'debootstrap stage 2' placeholder function of zlib/debootstrap bootstrap_complete_base. +copy-root-overlay() { + fn copy-root-overlay "(override)" + req=(strapdir device_name bootpart_partuuid R) + ckreq || return 1 + + [[ -d $R/extra/generic-root ]] && + notice "copying generic-root" && \ + sudo cp -rfv $R/extra/generic-root/* $strapdir + + sudo sed -e "s/{{{BOOTFS}}}/$bootfs/" -i "$strapdir/etc/fstab" + sudo sed -e "s/\/dev\/mmcblk0p1/PARTUUID=$bootpart_partuuid/" -i "$strapdir/etc/fstab" + + [[ -d $R/extra/$device_name ]] && \ + notice "copying ${device_name}-root" && \ + sudo cp -rfv $R/extra/$device_name/* $strapdir + + return 0 +} + +# Overide the post 'debootstrap stage 2' placeholder function of zlib/debootstrap +# bootstrap_complete_base. # The default is just to return 0 blend_bootstrap_setup() { fn blend_bootstrap_setup "noop" @@ -75,20 +122,73 @@ blend_bootstrap_setup() { } - # the local bootstrap wrapper just adds an options variable - # via an alias to the debootstrap command +# the local bootstrap wrapper just adds an options variable +# via an alias to the debootstrap command bootstrap_complete_base-wrapper() { mkdir -p "$debootstrap_cache" alias debootstrap='debootstrap \ --cache-dir="$debootstrap_cache" \ - --exclude="$purge_packages" \ - ${bootstrap_options}' + --exclude="$debootstrap_purge_packages" \ + ${debootstrap_options}' bootstrap_complete_base } +image_partition_raw_gpt() { + fn image_partition_raw_gpt + req=(workdir image_name gpt_boot gpt_root bootpart_partuuid rootpart_partuuid) + ckreq || return 1 + + notice "partitioning raw gpt image..." + notice "workdir: $workdir" + notice "image_name: $image_name" + notice "gpt_boot: $gpt_boot" + notice "gpt_root: $gpt_root" + + parted $workdir/${image_name}.img --script -- mklabel gpt || zerr + cgpt repair $workdir/${image_name}.img + cgpt create -z $workdir/${image_name}.img || zerr + cgpt create $workdir/${image_name}.img || zerr + + notice 'cgpt add -i 1 -t kernel -b ${gpt_boot[1]} \ + -s ${gpt_boot[2]} \ + -l kernel -S 1 -T 5 -P 10 $workdir/${image_name}.img' + + notice "cgpt add -i 1 -t kernel -b ${gpt_boot[1]} \ + -s ${gpt_boot[2]} \ + -l kernel -S 1 -T 5 -P 10 $workdir/${image_name}.img" + + cgpt add -i 1 -t kernel -b ${gpt_boot[1]} \ + -s ${gpt_boot[2]} \ + -l kernel -S 1 -T 5 -P 10 $workdir/${image_name}.img + + notice 'cgpt add -i 2 -t data -b ${gpt_root[1]} \ + -s $(expr $(cgpt show $workdir/${image_name}.img | \ + awk "/Sec GPT table/ {print $1}") - ${gpt_root[1]}) \ + -l Root $workdir/${image_name}.img' + + notice "cgpt add -i 2 -t data -b ${gpt_root[1]} \ + -s $(expr $(cgpt show $workdir/${image_name}.img | \ + awk '/Sec GPT table/ {print $1}') - ${gpt_root[1]}) \ + -l Root $workdir/${image_name}.img" + + cgpt add -i 2 -t data -b ${gpt_root[1]} \ + -s $(expr $(cgpt show $workdir/${image_name}.img | \ + awk '/Sec GPT table/ {print $1}') - ${gpt_root[1]}) \ + -l Root $workdir/${image_name}.img + + findloopdev + + bootpart="${loopdevice}p1" + rootpart="${loopdevice}p2" + bootpart_partuuid=$(blkid -s PARTUUID -o value ${bootpart}) + rootpart_partuuid=$(blkid -s PARTUUID -o value ${rootpart}) + + image_format_partitions +} ## Override the helper function: -# takes the 'apt-get -f' out of the loop so that dependency provided by other debs can be resolved. +# takes the 'apt-get -f' out of the loop so that dependency provided by other +# debs can be resolved. # inside the loop it just uninstalls the deb because of unfullfilled deps. install-custdebs() { fn install-custdebs "(override)" @@ -113,10 +213,12 @@ install-custdebs() { } ## Added function: -# In the style of install-custdebs above but for a collection of arbitrary scripts placed in a -# directory alongside the blend custom debs called automate. -# The scripts are copied from the blends scripts directory to extra/custom-scripts in blend_preinst() above. -# Called after install-customdebs because some need checkinstall which disappears from archives. +# In the style of install-custdebs above but for a collection of arbitrary +# scripts placed in a # directory alongside the blend custom debs called automate. +# The scripts are copied from the blends scripts directory to extra/custom-scripts +# in blend_preinst() above. +# Called after install-customdebs because some need checkinstall which disappears +# from archives. install-custscripts() { fn install-custscripts req=(R strapdir custom_scripts) @@ -140,29 +242,51 @@ install-custscripts() { chroot-script -d install-scripts } -## Override the helper function: -# Allow an alternative skel directory -add-user() { - fn add-user $* - local user="$1" - local pass="$2" - local skel="$3" - req=(strapdir user pass skel) +copy-kernel-config() { + fn copy-kernel-config "(override)" + req=(device_name gitbranch) ckreq || return 1 - notice "adding user $user:$pass using $skel" + notice "copying available ${gitbranch} kernel config for ${device_name}" + notice "cp -f $R/boards/kernel-configs/${device_name}.config_${gitbranch} \ + $R/tmp/kernels/$device_name/${device_name}-linux_$gitbranch/.config" + cp -f $R/boards/kernel-configs/${device_name}.config_${gitbranch} \ + $R/tmp/kernels/$device_name/${device_name}-linux_$gitbranch/.config +} - cat <<-EOF | sudo tee ${strapdir}/adduser >/dev/null +## Override the helper function: +# Allow an alternative skel directory, defaults to /etc/skel +add-user() { + fn add-user + req=(strapdir username userpass user_shell) + ckreq || return 1 + + notice "adding user $user:$pass using $skel and shell $default_shell" + + cat <<-EOF | sudo tee ${strapdir}/add-user >/dev/null #!/bin/sh set -x - if [ $(id -u ${user} 2>&1 >/dev/null) ]; then + if [ $(id -u ${username} 2>&1 >/dev/null) ]; then echo "user not present, creating account." - useradd -m ${user} -k ${userskel:-/etc/skel} - echo "${user}:${pass}" | chpasswd + sudo useradd --create-home \ + --shell $usershell \ + --groups $usergroups \ + --password $(openssl passwd -1 $userpass) \ + --skel ${user_skel:-/etc/skel} \ + $username + + echo "${username}:${userpass}" | chpasswd + usermod -a -G ${user_groups} ${username} + + if grep -q "${user_shell}" /etc/shells; then + usermod --shell "${user_shell}" "${username}" + else + echo "${user_shell} is not available, leaving unchanged." + fi fi EOF - chroot-script adduser || { zerr; return 0; } + chroot-script add-user || { zerr; return 0; } } @@ -286,7 +410,7 @@ image_partition_disk_zfs() { # See: https://didrocks.fr/2020/06/11/zfs-focus-on-ubuntu-20.04-lts-zsys-partition-layout/ for disk in "${available_disks[@]}"; do - TARGET="/dev/disk/by-id/${disk}" + local TARGET="/dev/disk/by-id/${disk}" act "partitioning ${TARGET}" /sbin/sgdisk --zap-all ${TARGET} @@ -319,7 +443,12 @@ image_partition_disk_zfs() { act "Reread the current partition tables with partprobe." # the second drive fails to update the kernel until reboot so added 2> partprobe ${TARGET} 2>/dev/null || true + #partx --update ${TARGET} + #kpartx -a ${TARGET} #hdparm -z ${TARGET} + #blockdev --rereadept ${TARGET} + #udevadm trigger --subsystem-match=block; udevadm settle --exit-if-exists=/dev/${TARGET}-part5 + #echo 1 > /sys/block/sdX/device/rescan done } @@ -342,11 +471,11 @@ image_format_partitions_zfs() { notice "formatting zfs partitions..." - for disk in "${available_disks[@]}"; do - gdisk -l /dev/disk/by-id/${disk} - done + # for disk in "${available_disks[@]}"; do + # gdisk -l /dev/disk/by-id/${disk} + # done - act "udev is slow recognize new partition so trigger sleep for 10 seconds" + act "udev is slow recognizing new partitions so trigger sleep for 10 seconds" sleep 10 @@ -381,8 +510,8 @@ image_format_partitions_zfs() { -O normalization=formD \ -O relatime=on \ -O xattr=sa \ - -O mountpoint=/boot -o altroot=${strapdir} \ - ${bpool_name} ${raid} /dev/disk/by-id/${disk_name}-part${boot_part_number} ${mirror_disk} + -O mountpoint=legacy -o altroot=${strapdir} \ + ${bpool_name} ${raid} /dev/disk/by-id/${disk_name}-part${boot_part_number} /dev/disk/by-id/${mirror_disk}-part${boot_part_number} act "create the zfs root pool" @@ -398,20 +527,20 @@ image_format_partitions_zfs() { -O relatime=on \ -O xattr=sa \ -O mountpoint=/ -o altroot=${strapdir} \ - ${rpool_name} ${raid} /dev/disk/by-id/${disk_name}-part${root_part_number} ${mirror_disk} + ${rpool_name} ${raid} /dev/disk/by-id/${disk_name}-part${root_part_number} /dev/disk/by-id/${mirror_disk}-part${root_part_number} ## Physical swap used instead. - #act "create the zfs zvol for swap" - #zfs create -V ${swap_part_size} -b $(getconf PAGESIZE) \ - # -o compression=zle \ - # -o logbias=throughput \ - # -o sync=always \ - # -o primarycache=metadata \ - # -o secondarycache=none \ - # -o com.sun:auto-snapshot=false \ - # ${rpool_name}/swap - #mkswap -f -L "Linux swap" /dev/zvol/${rpool_name}/swap + # act "create the zfs zvol for swap" + # zfs create -V ${swap_part_size} -b $(getconf PAGESIZE) \ + # -o compression=zle \ + # -o logbias=throughput \ + # -o sync=always \ + # -o primarycache=metadata \ + # -o secondarycache=none \ + # -o com.sun:auto-snapshot=false \ + # ${rpool_name}/swap + # mkswap -f -L "Linux swap" /dev/zvol/${rpool_name}/swap notice "zfs system installation" act "create filesystem datasets to act as containers" @@ -426,8 +555,8 @@ image_format_partitions_zfs() { #zfs create -o canmount=noauto -o mountpoint=/boot ${bpool_name}/BOOT/${root_name} zfs create -o mountpoint=/boot ${bpool_name}/BOOT/${root_name} - # At this point rpool directory is created in the workdir - #zfs set mountpoint=/${rpool_name} ${rpool_name} + ## At this point rpool directory is created in the workdir + # zfs set mountpoint=/${rpool_name} ${rpool_name} TMP_EXEC_STATE=on VAR_TMP_EXEC_STATE=on @@ -489,6 +618,7 @@ image_format_partitions_zfs() { #chmod 1777 ${strapdir}/var/tmp act "mount the efi partition on ${grub_mount} before debootstrap." + mkdir -p ${strapdir}${grub_mount} mount /dev/disk/by-id/${disk_name}-part${efi_part_number} -t vfat ${strapdir}${grub_mount} act "create zpool cache file" @@ -688,7 +818,7 @@ enablessh() { #!/usr/bin/env zsh set -x ; exec 2>${PWD}/enablessh.log - config_file="/tmp/sshd_config" + config_file="/etc/ssh/sshd_config" typeset -A rules rules=( @@ -840,8 +970,12 @@ install_grub(){ act "write grub-efi to available efi partitions." for efi_partition in "${efi_partitions[@]}"; do notice "writing to efi partitions: ${efi_partitions}" - act "mount the primary disks efi partition under ${grub_mount}" - mount ${disk_path}/${disk_name}-part${efi_part_number} ${strapdir}${grub_mount} + if ! /bin/mountpoint -q "${strapdir}${grub_mount}"; then + act "mount the primary disks efi partition under ${grub_mount}" + mount ${disk_path}/${disk_name}-part${efi_part_number} ${strapdir}${grub_mount} + else + notice "the mountpoint ${grub_mount} already in use. Skipping mount operation." + fi cat <<-EOF | sudo tee ${strapdir}/update-grub_${disk_name} > /dev/null #!/bin/sh @@ -862,10 +996,15 @@ install_grub(){ done else mkdir -p ${grub_mount} - for disk_name in "${available_disks[@]}"; do - notice "writing grub to available disks:" - act "mount the primary disks efi partition under ${grub_mount}" - mount ${disk_path}/${disk_name}-part${efi_part_number} ${strapdir}${grub_mount} + act "write grub to available efi partitions." + for disk_name in "${available_disks[@]}"; do + notice "writing grub to available ${disk_name}:" + if ! /bin/mountpoint -q "${strapdir}${grub_mount}"; then + act "mount the primary disks efi partition under ${grub_mount}" + mount ${disk_path}/${disk_name}-part${efi_part_number} ${strapdir}${grub_mount} + else + notice "The mount point ${grub_mount} is already in use. Skipping mount operation." + fi cat <<-EOF | sudo tee ${strapdir}/update-grub_${disk_name} > /dev/null #!/bin/sh @@ -1002,6 +1141,7 @@ build_uboot(){ artifact=u-boot notice "Build u-boot" + "FIXME: AUTOBOOT was too chatty at the configure stage with these entries do its disabled for now." git clone --depth 1 "$ubootgit" -b "$uboot_branch" "$R/tmp/kernels/u-boot-rockpro64" || zer pushd "$R/tmp/kernels/u-boot-rockpro64" make mrproper @@ -1011,8 +1151,6 @@ build_uboot(){ --enable CONFIG_CMD_ZFS \ --enable CONFIG_CMD_BOOTMENU \ --enable CONFIG_MENU \ - --enable CONFIG_AUTOBOOT_KEYED \ - --set-val CONFIG_BOOTDELAY 30 \ --enable CONFIG_MENU_SHOW \ --enable CONFIG_CFB_CONSOLE_ANSI \ --enable CONFIG_CMD_BOOTEFI \ @@ -1024,18 +1162,19 @@ build_uboot(){ --enable CONFIG_BOOTM_NETBSD \ --enable CONFIG_BLK \ --enable CONFIG_VERSION_VARIABLE \ - --enable CONFIG_PARTITIONS + --enable CONFIG_PARTITIONS \ + --enable CONFIG_DM_VIDEO + #--enable CONFIG_AUTOBOOT_KEYED \ + #--set-val CONFIG_BOOTDELAY 30 act "apply sigmaris changes to defconfig." "$R/tmp/kernels/rockpro64/rockpro64-linux/scripts/config" --file .config \ - --set-val CONFIG_DEFAULT_DEVICE_TREE "rk3399-rockpro64" \ --enable CONFIG_OF_BOARD_SETUP \ --enable CONFIG_MTD \ - --enable CONFIG_SPI_FLASH_MTD \ --enable CONFIG_CMD_MTDPARTS \ - --set-val CONFIG_MTDIDS_DEFAULT "nor0=spi0.0" \ - --set-val CONFIG_MTDPARTS_DEFAULT="mtdparts=spi0.0:384k(u-boot-spl),3680k(u-boot),32k(u-boot-env),-(user)" \ - --enable CONFIG_SPL_SPI_SUPPORT \ + --enable CONFIG_SPL_MMC \ + --enable CONFIG_SPL_SPI \ + --enable CONFIG_SPI_FLASH_MTD \ --enable CONFIG_SPL_SPI_FLASH_SUPPORT \ --enable CONFIG_NVME \ --enable CONFIG_SCSI \ @@ -1043,13 +1182,16 @@ build_uboot(){ --enable CONFIG_OF_LIBFDT_OVERLAY \ --enable CONFIG_FDT_FIXUP_PARTITIONS \ --enable CONFIG_SERVERIP_FROM_PROXYDHCP \ - --set-val CONFIG_SERVERIP_FROM_PROXYDHCP_DELAY_MS 100 \ --enable CONFIG_AHCI \ --enable CONFIG_SCSI_AHCI \ --enable CONFIG_AHCI_PCI \ --enable CONFIG_DM_KEYBOARD \ --enable CONFIG_LED \ - --enable CONFIG_LED_GPIO + --enable CONFIG_LED_GPIO \ + --set-val CONFIG_DEFAULT_DEVICE_TREE "rk3399-rockpro64" \ + --set-val CONFIG_SERVERIP_FROM_PROXYDHCP_DELAY_MS 100 \ + --set-val CONFIG_MTDIDS_DEFAULT "nor0=spi0.0" \ + --set-val CONFIG_MTDPARTS_DEFAULT="mtdparts=spi0.0:384k(u-boot-spl),3680k(u-boot),32k(u-boot-env),-(user)" make -j$(nproc) $MAKEOPTS ARCH=arm CROSS_COMPILE=$compiler || zerr @@ -1198,7 +1340,7 @@ bootloader-version(){ req=(strapdir) ckreq || return 1 - # FIXME: Assumes partitions numbers + # FIXME: Assumes partitions number p1 or p6 and uses p1 for both version() { local DEVICE="${1/p6/p1}" @@ -1223,8 +1365,8 @@ upgrade-sd-bootloader(){ notice "Upgrading pre-existing bootloader." # FIXME: # extlinux, u-boot, grub, EFI - # Assumes a mounted efi partion - # Writes the rksd image only to a specific partition number on sd devices. + # Assumes u-boot written to a mounted efi partion + # Writes the rksd image only to a specific partition number on sd devices. Uses p1 if [[ $(findmnt -M /boot/efi) ]]; then MNT_DEV=$(findmnt /boot/efi -n -o SOURCE) else @@ -1234,7 +1376,7 @@ upgrade-sd-bootloader(){ # report current version - #bootloader-version "$MNT_DEV" + bootloader-version "$MNT_DEV" write_sd() { case "$1" in @@ -1260,7 +1402,7 @@ erase-sd-bootloader(){ ckreq || return 1 notice "Erasing pre-existing bootloader." - # FIXME: Writes/erases a specific partition number on sd devices. + # FIXME: Writes/erases a specific partition number on sd devices. Uses p1 MNT_DEV=$(findmnt /boot/efi -n -o SOURCE) # report current version @@ -1333,7 +1475,7 @@ erase-spi-flash(){ # mtd1: 00398000 00001000 "u-boot" # mtd2: 00008000 00001000 "u-boot-env" # mtd3: 00c00000 00001000 "user" -# + if ! MTD=$(grep \"loader\" /proc/mtd | cut -d: -f1); then echo "loader partition on MTD is not found" return 1 @@ -1370,12 +1512,14 @@ write-spi-flash(){ } +# u-boot menu has been deprecated, extlinux.conf is used instead and uutomatically +# updated with u-boot-update from u-boot-menu. see ARM-sdk/BOARDs/rockpro64-ayunfan. create-u-boot-menu(){ fn create-u-boot-menu req=(strapdir) ckreq || return 1 - # FIXME: Need to chosse a default and fix the other calls + # FIXME: Need to choose a default and fix the other calls cat <<-EOF | tee scripts/boot.cmd > /dev/null setenv bootmenu_0 Boot 1. kernel=bootm 0x82000000 # Set first menu entry setenv bootmenu_1 Boot 2. kernel=bootm 0x83000000 # Set second menu entry diff --git a/blend_helpers.md b/blend_helpers.md index 8626ea5..286aefa 100644 --- a/blend_helpers.md +++ b/blend_helpers.md @@ -8,10 +8,19 @@ additional or overridden helper functions to add or test functionality or workar specific to the blend to avoid changes to the sdk. +## build_arm_dist() +defines the sequence of calls that will result in an SDcard image with gpt partition table and u-boot. +* partition_type, gpt_boot and gpt_root must be set to gpt, and the boot and root size respectively in the blend +- partition_type=gpt +- gpt_boot= +- gpt_root= + ## build_metal_dist() defines the sequence of calls that will result in a devuan install with root and boot zfs to one or two disks (mirrored) using either grub-pc or grub-efi to boot. +## image_partition_raw_gpt() +a partitioning function using cgpt to produce gpt partition table rather than parted to product dos partion table. ## blend_bootstrap_setup() * Overide the post 'debootstrap stage 2' placeholder function of zlib/debootstrap bootstrap_complete_base. @@ -35,7 +44,7 @@ Override the helper function: Added function: * In the style of install-custdebs above but for a collection of arbitrary scripts placed in a * directory alongside the blend custom debs called automate. -* The scripts are copied from the blends scripts directory to extra/custom-scripts in blend_preinst() above. +* The scripts are copied from the blends scripts directory ${blend_scripts} to $R/extra/custom-scripts in blend_preinst() above. * Called after install-customdebs because some need checkinstall which disappears from archives. ## add-user() @@ -80,7 +89,9 @@ uses three files to replicate the installed packages of another system. * /var/tmp/pkgs_manual.lst ## enablessh() -this function will allow a root or user login in the bootstrapped root using: +FIXME: currently changes /etc/ssh/ssh_config to allow password access. + +Change this function will allow a root or user login in the bootstrapped root using: * ssh-copy-id default@192.168.1.x @@ -137,20 +148,79 @@ with: u-boot.itb from $R/tmp/kernels/u-boot-rockpro64 to producing flash-spi.img.gz +## copy-kernel-config() override +extend the function to accept a kernel config name that includes a version not just device_name + +## copy-root-overlay() override +re-write fstab to use PARTUUID as kernel does not guarantee the order of discovery and it is known to change between kernel versions. + +We set boot_partuuid in image_partition_raw_${parted_type} + ## set-bootloader() Change SPI_LOADER to rksip or rksd depending on board. Called with -rockchip-rockpro64- sets the variable SD_LOADER, SPI_LOADER and BOARD to values consistant for the board, other boards: rock64, pinebookpro and rockpi4b ## bootloader-version() FIXME +https://stackoverflow.com/questions/5781738/getting-u-boots-version-from-userspace + +There's no defined way to do this. Once Linux boots, u-boot is no longer running and it's RAM is reclaimed for Linux's use. Linux doesn't even know about u-boot. Nor does it have to have been booted by u-boot. + +If you really want to do this, the only way to do it is to add the u-boot version to the kernel's command line, write code to scan the u-boot image in flash for it's version, or if u-boot is still a mounted partition then you can extract this info from it with strings. + +u-boot-tools packages fw_printenv in debian returns ver: + +fw_printenv just looks for the printenv partition and dumps its data. So it's OK for normal variables, but it's not OK for the "ver" variable, which is dynamic, and whose value is initialized by u-boot when it boots. The value of this variable doesn't remain after u-boot exit, except if you manually save it to environment. + +U-Boot > printenv ver +ver=U-Boot 2009.11-00393-g5ca9497-dirty (Nov 26 2012 - 11:08:44) + +$ fw_printenv | grep ver= +ver=U-Boot 2009.11-00323-gbcc6e0e (Sep 21 2012 - 11:07:19) + +U-Boot > saveenv + +$ fw_printenv | grep ver= +ver=U-Boot 2009.11-00393-g5ca9497-dirty (Nov 26 2012 - 11:08:44) + +So running the a u-boot script with saveenv prior to booting the kernel will set the ver properly in /boot/uboot.env: + +https://stackoverflow.com/questions/67974867/fw-printenv-not-showing-env-variables-from-uboot-env + + + + +Find uboot partition, eg. for MTD device: +$ cat /proc/mtd + +For /dev/mtd5: +$ cat /dev/mtd5 | hexdump -C -n 64 + +$ strings /dev/mtd0 | grep 'U-Boot [0-9]*\.[0-9]*.*\(Build.*)' +U-Boot 1.1.4-g1c8343c8-dirty (Feb 28 2014 - 13:56:54) +U-Boot +Now running in RAM - U-Boot at: %08lx + +If you know for a fact that it's in the first megabyte, you can use dd to siphon off the first meg of data before you run strings on it to save yourself processing time. + +The current strings method used by bootloader-version() sets DEVICE /dev/mtdp6 and mtdp1 to p1, if we strings "$DEVICE" | grep -b "^U-Boot [a-z0-9.-]*$" we can discover where the ver strings are located and use dd to select just that area rather than the complete partition. + +If u-boot is residing in an MTD partition then this will work: + +U_BOOT_VER=$(for part in `grep u-boot-[01] /proc/mtd | cut -f 1 -d ':'`; do strings /dev/${part} | grep "^U-Boot.*("; break; done) + + + ## upgrade-sd-bootloader() FIXME # Assumes a mounted efi partion # Writes the rksd image only to a specific partition number on sd/mvme/sd/mmc devices. - # + # /dev/mmcblk*p6|/dev/sd*p6|/dev/mapper/loop*p6|/dev/mapper/nvme*p6) with p6 being changed to p1 + ## erase-sd-bootloader() FIXME +Writes /dev/zero to the partition returned by findmnt /boot/efi ## write-emmc-flash() We need to prevent writing on an emmc when it is the current boot device. @@ -197,6 +267,8 @@ expects: $1 $2 where: ## create-u-boot-menu() FIXME +Need to choose a default and fix the other calls + #----------- #zfs specific commands can be seen in the boot loader prompt using # UBOOT #help diff --git a/blend_sysconf b/blend_sysconf index 73f7492..5881cec 100644 --- a/blend_sysconf +++ b/blend_sysconf @@ -1,6 +1,6 @@ conf_print_resolvconf() { - fn conf_print_resolvconf + fn conf_print_resolvconf "(override)" cat <<-EOF nameserver 1.1.1.1 @@ -9,7 +9,7 @@ conf_print_resolvconf() { } conf_print_sourceslist() { - fn conf_print_sourceslist + fn conf_print_sourceslist "(override)" req=(mirror release section) ckreq || return 1 diff --git a/collect_edited_files.sh b/collect_edited_files.sh index 82c7d9c..f3bd158 100755 --- a/collect_edited_files.sh +++ b/collect_edited_files.sh @@ -1,7 +1,7 @@ -cp $strapdir/etc/zfs/zpool.cache log/ -cp $strapdir/etc/fstab log/ -cp $strapdir/etc/default/grub log/default_grub -cp $strapdir/boot/grub/grub.cfg log/ -echo $(lsinitramfs $strapdir/boot/initrd.img-${kernel_version}-${arch} | grep zfs) > log/zfs_initramfs.txt -echo $(lsinitramfs $strapdir/boot/initrd.img-${kernel_version}-${arch}) > log/initramfs.txt +cp "${strapdir}"/etc/zfs/zpool.cache log/ +cp "${strapdir}"/etc/fstab log/ +cp "${strapdir}"/etc/default/grub log/default_grub +cp "${strapdir}"/boot/grub/grub.cfg log/ +echo "$(lsinitramfs ${strapdir}/boot/initrd.img-${kernel_version}-${arch} | grep zfs)" > log/zfs_initramfs.txt +"$(lsinitramfs "${strapdir}"/boot/initrd.img-"${kernel_version}-${arch}")" > log/initramfs.txt diff --git a/console_livesdk.sh b/console_livesdk.sh index 7870a31..975e39c 100755 --- a/console_livesdk.sh +++ b/console_livesdk.sh @@ -8,7 +8,7 @@ cat < .zshrc pushd \$ZDOTDIR > /dev/null source sdk -load devuan devuan-desktop-metal chimaera +load devuan devuan-desktop-metal daedalus popd > /dev/null EOF diff --git a/daedalus.config b/daedalus.config new file mode 100644 index 0000000..1e30cec --- /dev/null +++ b/daedalus.config @@ -0,0 +1,176 @@ +#!/usr/bin/env zsh +## configuration file for devuan-desktop-live blend + +vars+=(username userpass default_shell mkefi grubversion hookscripts) +arrs+=(disk_name efi_partitions swap_partitions custom_deb_packages) + +blend_name="devuan-desktop-metal_" + +release="daedalus" +version="5.0.1" + +hostname="devuan" +username="devuan" +userpass="devuan" +userskel="/etc/skel" +default_shell="/usr/bin/zsh" + +# comment to disable: +#hookscripts="yes" + +# debootstrap options +# From lib/libdevuansdk/zlib/bootstrap we need to add the options variable. +# debootstrap --keyring="$LIBPATH/extra/devuan-keyring/keyrings/devuan-archive-keyring.gpg" \ +# --include=devuan-keyring,wget,ca-certificates \ +# --foreign \ +# >>> ${bootstrap_options} \ <<< +# --arch +# Currently we have put a wrapper in blend_helpers-docker to add these optiions using an alias. +bootstrap_options=("--force-check-gpg --no-merged-usr --variant=minbase") + +# debootstrap mirror +#mirror="tor+http://devuanauxrkggcowgm2vcs6go3c5pgxdidd5wqjpg7zpfaxkmgspr6id.onion/merged" +#mirror="http://pkgmaster.devuan.org/merged" # +#mirror="http://deb.devuan.org" # +#mirror="http://localhost:3142/deb.devuan.org/merged/" # apt-cacher-ng +#mirror="http://192.168.1.50:3142/deb.devuan.org/merged/" # apt-cacher-ng +mirror="http://192.168.1.50:3142" # apt-cacher-ng + +# the mirror to use in /etc/apt/apt.conf.d/02proxy +apt_proxy="http://192.168.1.50:3142" + +arch="amd64" +#arch="arm64" +#arch="i386" + +case "$arch" in + # for minimal-live + #i386) extra_packages+=(linux-image-686) ;; + + # for desktop-live + #i386) extra_packages+=(linux-image-686-pae) ;; + + amd64) extra_packages+=(linux-image-amd64) ;; + + arm64) extra_packages+=(linux-image-arm64) ;; +esac + +kernel_version="5.10.0-11" + +# ZFS install parameters +rootfs="zfs" + +disk_path="/dev/disk/by-id" +disk_name="ata-HGST_HTS541010A9E680_JA1000102T3RVP" +disk2_name="ata-HGST_HTS541010A9E680_JB10001329MG7R" + +#raid=unset # raid0: striped 1 or more +raid=mirror # raid1: mirror 2 +#raid=raidz # raid1: mirror 3 +#raid=raidz2 # raid2: mirror 4 +#raid=raidz3 # raid3: mirror 5 +#raid=stripedmirror # raid10: mirror 4 and paired + +available_disks=("${disk_name}") +if [[ -v $raid ]]; then + available_disks+="${disk2_name}" +fi + +root_name="devuan-1" +rpool_name="rpool" +bpool_name="bpool" +#encrypt=yes + +# polite to use somewhere other than /etc/zfs rather than squash it. +#zpool_cache_dir="/etc/zfs" +zpool_cache_dir="/var/tmp" + +## underlying physical block size for zpool create. +# ashift=9 means 512B sectors (used by all ancient drives), +# ashift=12 means 4K sectors (used by most modern hard drives), and +# ashift=13 means 8K sectors (used by some modern SSDs). +ashift=12 + +bios_part_number="1" +efi_part_number="2" +swap_part_number="3" +boot_part_number="4" +root_part_number="5" + +efi_start="2048" + +bios_part_size="1MB" +efi_part_size="512MB" +swap_part_size="8GB" +boot_part_size="2GB" + +# zvol requires resume to be disabled +#swap_type="zvol" +swap_type="physical" + +tmp_exec_state="off" +var_tmp_exec_state="on" + +# uncomment to create uefi-bootable iso causes iso_make_efi and iso_write_grub_cfg +# to be called in blend_postinst +#MKEFI=1 +efi_work="$BLENDPATH/${release}/efi-files" + + +zero_uefi="no" +#efi=1 + +if [[ -n $efi ]];then + grub_mount="/boot/efi" + grubversion="grub-efi-${arch}" + + case "arch" in + amd64) grub_efi_target="x86_64-efi" ;; + arm64) grub_efi_target="arm64-efi" ;; + i386) grub_efi_target="i386-efi" ;; + esac + +else + grub_mount="/boot/grub" + grubversion="grub-pc" +fi + +efi_partitions+=("/dev/disk/by-id/${disk_name}-part${efi_part_number}") +if [[ -v ${raid} ]]; then + efi_partitions+="/dev/disk/by-id/${disk2_name}-part${efi_part_number}" +fi + +swap_partitions+=("/dev/disk/by-id/${disk_name}-part${swap_part_number}") +if [[ -v ${raid} ]]; then + swap_partitions+="/dev/disk/by-id/${disk2_name}-part${swap_part_number}" +fi + + +# Uncomment for amd64 +base_packages+=(grub-efi-amd64-bin grub-efi-ia32-bin) + +# devuan grub themes: cinnabar-grub darkpurpy-grub deepsea-grub +# grub themes must be placed on filesystems visable to grub ie not zfs. +grub_theme="deepsea-grub" +grub_gfxmode="1920x1200x32,1920x1200x8" + +mirror="http://deb.devuan.org/merged" +section="main contrib non-free" + +# need to add to the debootstrap command in lib/libdevuansdk/zlibs/bootstrap +#debootstrap_options="--extra-suites=ascii-proposed-updates --include=libupower-glib3,dbus-x11,xfce4" + +base_packages_option=(--no-install-recommends) +extra_packages_option=(--no-install-recommends) + + +release_conf="$BLENDPATH/${release}/config" + + +### package sets are defined in the corresponding $release/config file + +source $release_conf + +## image_name depends on release and version + +image_name="${os}_${release}_${version}_${arch}_desktop" diff --git a/devuan-debian_releases b/devuan-debian_releases new file mode 100644 index 0000000..335c061 --- /dev/null +++ b/devuan-debian_releases @@ -0,0 +1,13 @@ +# jessie caused a name collision with debian, capitalized ascii is already used +# for something and just an anoying choice, they calmed down after that +# (or someone left). + + corresponds to Debian 7 Wheezy 20170617T034212Z +Devuan 1.0 Jessie corresponds to Debian 8 Jessie 20180623T023722Z +Devuan 2.0 ASCII corresponds to Debian 9 Stretch 20200717T204551Z +Devuan 3.0 Beowulf corresponds to Debian 10.4 Buster 20230611T103552Z +Devuan 4.0 Chimaera corresponds to Debian 11.1 Bullseye 20230611T103552Z +Devuan 5.0 Daedalus corresponds to Debian 12 Bookworm 20231007T150030Z +Devuan 6.0 Excalibur corresponds to Debian 13 Trixie testing +Devuan 7.0 Freia corresponds to Debian 14 Forky +Devuan Ceres corresponds to Debian Sid unstable diff --git a/devuan-desktop-metal.blend b/devuan-desktop-metal.blend index d76df8f..d8a2c0e 100644 --- a/devuan-desktop-metal.blend +++ b/devuan-desktop-metal.blend @@ -22,6 +22,7 @@ BLENDPATH="${BLENDPATH:-$(dirname $0)}" source $BLENDPATH/config source $BLENDPATH/helpers +source $BLENDPATH/sysconf blend_release_path=$BLENDPATH/$release blend_packages=${blend_release_path}/packages @@ -91,39 +92,9 @@ blend_preinst() { chroot-script -d install-custompackages || { zerr; return 1; } notice "adding user account." - act "customize the post-adduser script." - cat <<-EOF | sudo tee "$strapdir/usr/local/sbin/adduser.local" >/dev/null - #!/bin/sh - ## Site-specific setup for newly-created users. - ## adduser(8) will call this script after setting up a new user. - ## Usage: adduser.local USER UID GID HOME - - set -euo pipefail - if [[ "\$#" != 4 ]]; then - echo "usage: $0 username uid gid home" > /dev/stderr - fi - - NEW_USERNAME="\${1:?}" - NEW_UID="\${2:?}" - NEW_GID="\${3:?}" - NEW_HOME="\${4:?}" - - # EXAMPLE: adduser discards permissions when copying from /etc/skel. - #chgrp www-data ${NEW_HOME}/public_html - #chmod g+s ${NEW_HOME}/public_html - - # EXAMPLE: create a matching MySQL User for the Unix user. - #mysql -vv -e "CREATE USER '${NEW_USERNAME}'@'localhost' IDENTIFIED WITH auth_socket;" - - - # Fetch the tmux plugins. - #su -c '/usr/share/tmux-plugin-manager/bin/install_plugins' ${NEW_USERNAME} - EOF - chmod u+x ${strapdir}/usr/local/sbin/adduser.local - + act "create default user." - # that populate /etc/skel will be reflected in the new user directory. - add-user "${username}" "${userpass}" ${userskel:-/etc/skel} || exit 1 + add-user } blend_postinst() { @@ -177,8 +148,8 @@ blend_finalize() { notice "Finalizing." - act "enabling ssh." - enablessh + # act "enabling ssh." + # enablessh act "create /etc/fstab" pushd "${strapdir}" @@ -236,6 +207,7 @@ blend_finalize() { # Disable contrib and non-free after installing firmware. #sed -i 's/contrib//g' /etc/apt/sources.list #sed -i 's/non-free//g' /etc/apt/sources.list + #sed -i 's/non-free-firmware//g' /etc/apt/sources.list ## package list - Why does this make an empty file? #dpkg -l | awk '/^ii/ { print $2 " " $3 }' > /home/${username}/package_list diff --git a/.gitlab-ci.yml b/dot.gitlab-ci.yml similarity index 100% rename from .gitlab-ci.yml rename to dot.gitlab-ci.yml diff --git a/excalibur.config b/excalibur.config new file mode 100644 index 0000000..d5217f1 --- /dev/null +++ b/excalibur.config @@ -0,0 +1,176 @@ +#!/usr/bin/env zsh +## configuration file for devuan-desktop-live blend + +vars+=(username userpass default_shell mkefi grubversion hookscripts) +arrs+=(disk_name efi_partitions swap_partitions custom_deb_packages) + +blend_name="devuan-desktop-metal_" + +release="excalibur" +version="6.0.0" + +hostname="devuan" +username="devuan" +userpass="devuan" +userskel="/etc/skel" +default_shell="/usr/bin/zsh" + +# comment to disable: +#hookscripts="yes" + +# debootstrap options +# From lib/libdevuansdk/zlib/bootstrap we need to add the options variable. +# debootstrap --keyring="$LIBPATH/extra/devuan-keyring/keyrings/devuan-archive-keyring.gpg" \ +# --include=devuan-keyring,wget,ca-certificates \ +# --foreign \ +# >>> ${bootstrap_options} \ <<< +# --arch +# Currently we have put a wrapper in blend_helpers-docker to add these optiions using an alias. +bootstrap_options=("--force-check-gpg --no-merged-usr --variant=minbase") + +# debootstrap mirror +#mirror="tor+http://devuanauxrkggcowgm2vcs6go3c5pgxdidd5wqjpg7zpfaxkmgspr6id.onion/merged" +#mirror="http://pkgmaster.devuan.org/merged" # +#mirror="http://deb.devuan.org" # +#mirror="http://localhost:3142/deb.devuan.org/merged/" # apt-cacher-ng +#mirror="http://192.168.1.50:3142/deb.devuan.org/merged/" # apt-cacher-ng +mirror="http://192.168.1.50:3142" # apt-cacher-ng + +# the mirror to use in /etc/apt/apt.conf.d/02proxy +apt_proxy="http://192.168.1.50:3142" + +arch="amd64" +#arch="arm64" +#arch="i386" + +case "$arch" in + # for minimal-live + #i386) extra_packages+=(linux-image-686) ;; + + # for desktop-live + #i386) extra_packages+=(linux-image-686-pae) ;; + + amd64) extra_packages+=(linux-image-amd64) ;; + + arm64) extra_packages+=(linux-image-arm64) ;; +esac + +kernel_version="5.10.0-11" + +# ZFS install parameters +rootfs="zfs" + +disk_path="/dev/disk/by-id" +disk_name="ata-HGST_HTS541010A9E680_JA1000102T3RVP" +disk2_name="ata-HGST_HTS541010A9E680_JB10001329MG7R" + +#raid=unset # raid0: striped 1 or more +raid=mirror # raid1: mirror 2 +#raid=raidz # raid1: mirror 3 +#raid=raidz2 # raid2: mirror 4 +#raid=raidz3 # raid3: mirror 5 +#raid=stripedmirror # raid10: mirror 4 and paired + +available_disks=("${disk_name}") +if [[ -v $raid ]]; then + available_disks+="${disk2_name}" +fi + +root_name="devuan-1" +rpool_name="rpool" +bpool_name="bpool" +#encrypt=yes + +# polite to use somewhere other than /etc/zfs rather than squash it. +#zpool_cache_dir="/etc/zfs" +zpool_cache_dir="/var/tmp" + +## underlying physical block size for zpool create. +# ashift=9 means 512B sectors (used by all ancient drives), +# ashift=12 means 4K sectors (used by most modern hard drives), and +# ashift=13 means 8K sectors (used by some modern SSDs). +ashift=12 + +bios_part_number="1" +efi_part_number="2" +swap_part_number="3" +boot_part_number="4" +root_part_number="5" + +efi_start="2048" + +bios_part_size="1MB" +efi_part_size="512MB" +swap_part_size="8GB" +boot_part_size="2GB" + +# zvol requires resume to be disabled +#swap_type="zvol" +swap_type="physical" + +tmp_exec_state="off" +var_tmp_exec_state="on" + +# uncomment to create uefi-bootable iso causes iso_make_efi and iso_write_grub_cfg +# to be called in blend_postinst +#MKEFI=1 +efi_work="$BLENDPATH/${release}/efi-files" + + +zero_uefi="no" +#efi=1 + +if [[ -n $efi ]];then + grub_mount="/boot/efi" + grubversion="grub-efi-${arch}" + + case "arch" in + amd64) grub_efi_target="x86_64-efi" ;; + arm64) grub_efi_target="arm64-efi" ;; + i386) grub_efi_target="i386-efi" ;; + esac + +else + grub_mount="/boot/grub" + grubversion="grub-pc" +fi + +efi_partitions+=("/dev/disk/by-id/${disk_name}-part${efi_part_number}") +if [[ -v ${raid} ]]; then + efi_partitions+="/dev/disk/by-id/${disk2_name}-part${efi_part_number}" +fi + +swap_partitions+=("/dev/disk/by-id/${disk_name}-part${swap_part_number}") +if [[ -v ${raid} ]]; then + swap_partitions+="/dev/disk/by-id/${disk2_name}-part${swap_part_number}" +fi + + +# Uncomment for amd64 +base_packages+=(grub-efi-amd64-bin grub-efi-ia32-bin) + +# devuan grub themes: cinnabar-grub darkpurpy-grub deepsea-grub +# grub themes must be placed on filesystems visable to grub ie not zfs. +grub_theme="deepsea-grub" +grub_gfxmode="1920x1200x32,1920x1200x8" + +mirror="http://deb.devuan.org/merged" +section="main contrib non-free" + +# need to add to the debootstrap command in lib/libdevuansdk/zlibs/bootstrap +#debootstrap_options="--extra-suites=ascii-proposed-updates --include=libupower-glib3,dbus-x11,xfce4" + +base_packages_option=(--no-install-recommends) +extra_packages_option=(--no-install-recommends) + + +release_conf="$BLENDPATH/${release}/config" + + +### package sets are defined in the corresponding $release/config file + +source $release_conf + +## image_name depends on release and version + +image_name="${os}_${release}_${version}_${arch}_desktop" diff --git a/freia.config b/freia.config new file mode 100644 index 0000000..d5217f1 --- /dev/null +++ b/freia.config @@ -0,0 +1,176 @@ +#!/usr/bin/env zsh +## configuration file for devuan-desktop-live blend + +vars+=(username userpass default_shell mkefi grubversion hookscripts) +arrs+=(disk_name efi_partitions swap_partitions custom_deb_packages) + +blend_name="devuan-desktop-metal_" + +release="excalibur" +version="6.0.0" + +hostname="devuan" +username="devuan" +userpass="devuan" +userskel="/etc/skel" +default_shell="/usr/bin/zsh" + +# comment to disable: +#hookscripts="yes" + +# debootstrap options +# From lib/libdevuansdk/zlib/bootstrap we need to add the options variable. +# debootstrap --keyring="$LIBPATH/extra/devuan-keyring/keyrings/devuan-archive-keyring.gpg" \ +# --include=devuan-keyring,wget,ca-certificates \ +# --foreign \ +# >>> ${bootstrap_options} \ <<< +# --arch +# Currently we have put a wrapper in blend_helpers-docker to add these optiions using an alias. +bootstrap_options=("--force-check-gpg --no-merged-usr --variant=minbase") + +# debootstrap mirror +#mirror="tor+http://devuanauxrkggcowgm2vcs6go3c5pgxdidd5wqjpg7zpfaxkmgspr6id.onion/merged" +#mirror="http://pkgmaster.devuan.org/merged" # +#mirror="http://deb.devuan.org" # +#mirror="http://localhost:3142/deb.devuan.org/merged/" # apt-cacher-ng +#mirror="http://192.168.1.50:3142/deb.devuan.org/merged/" # apt-cacher-ng +mirror="http://192.168.1.50:3142" # apt-cacher-ng + +# the mirror to use in /etc/apt/apt.conf.d/02proxy +apt_proxy="http://192.168.1.50:3142" + +arch="amd64" +#arch="arm64" +#arch="i386" + +case "$arch" in + # for minimal-live + #i386) extra_packages+=(linux-image-686) ;; + + # for desktop-live + #i386) extra_packages+=(linux-image-686-pae) ;; + + amd64) extra_packages+=(linux-image-amd64) ;; + + arm64) extra_packages+=(linux-image-arm64) ;; +esac + +kernel_version="5.10.0-11" + +# ZFS install parameters +rootfs="zfs" + +disk_path="/dev/disk/by-id" +disk_name="ata-HGST_HTS541010A9E680_JA1000102T3RVP" +disk2_name="ata-HGST_HTS541010A9E680_JB10001329MG7R" + +#raid=unset # raid0: striped 1 or more +raid=mirror # raid1: mirror 2 +#raid=raidz # raid1: mirror 3 +#raid=raidz2 # raid2: mirror 4 +#raid=raidz3 # raid3: mirror 5 +#raid=stripedmirror # raid10: mirror 4 and paired + +available_disks=("${disk_name}") +if [[ -v $raid ]]; then + available_disks+="${disk2_name}" +fi + +root_name="devuan-1" +rpool_name="rpool" +bpool_name="bpool" +#encrypt=yes + +# polite to use somewhere other than /etc/zfs rather than squash it. +#zpool_cache_dir="/etc/zfs" +zpool_cache_dir="/var/tmp" + +## underlying physical block size for zpool create. +# ashift=9 means 512B sectors (used by all ancient drives), +# ashift=12 means 4K sectors (used by most modern hard drives), and +# ashift=13 means 8K sectors (used by some modern SSDs). +ashift=12 + +bios_part_number="1" +efi_part_number="2" +swap_part_number="3" +boot_part_number="4" +root_part_number="5" + +efi_start="2048" + +bios_part_size="1MB" +efi_part_size="512MB" +swap_part_size="8GB" +boot_part_size="2GB" + +# zvol requires resume to be disabled +#swap_type="zvol" +swap_type="physical" + +tmp_exec_state="off" +var_tmp_exec_state="on" + +# uncomment to create uefi-bootable iso causes iso_make_efi and iso_write_grub_cfg +# to be called in blend_postinst +#MKEFI=1 +efi_work="$BLENDPATH/${release}/efi-files" + + +zero_uefi="no" +#efi=1 + +if [[ -n $efi ]];then + grub_mount="/boot/efi" + grubversion="grub-efi-${arch}" + + case "arch" in + amd64) grub_efi_target="x86_64-efi" ;; + arm64) grub_efi_target="arm64-efi" ;; + i386) grub_efi_target="i386-efi" ;; + esac + +else + grub_mount="/boot/grub" + grubversion="grub-pc" +fi + +efi_partitions+=("/dev/disk/by-id/${disk_name}-part${efi_part_number}") +if [[ -v ${raid} ]]; then + efi_partitions+="/dev/disk/by-id/${disk2_name}-part${efi_part_number}" +fi + +swap_partitions+=("/dev/disk/by-id/${disk_name}-part${swap_part_number}") +if [[ -v ${raid} ]]; then + swap_partitions+="/dev/disk/by-id/${disk2_name}-part${swap_part_number}" +fi + + +# Uncomment for amd64 +base_packages+=(grub-efi-amd64-bin grub-efi-ia32-bin) + +# devuan grub themes: cinnabar-grub darkpurpy-grub deepsea-grub +# grub themes must be placed on filesystems visable to grub ie not zfs. +grub_theme="deepsea-grub" +grub_gfxmode="1920x1200x32,1920x1200x8" + +mirror="http://deb.devuan.org/merged" +section="main contrib non-free" + +# need to add to the debootstrap command in lib/libdevuansdk/zlibs/bootstrap +#debootstrap_options="--extra-suites=ascii-proposed-updates --include=libupower-glib3,dbus-x11,xfce4" + +base_packages_option=(--no-install-recommends) +extra_packages_option=(--no-install-recommends) + + +release_conf="$BLENDPATH/${release}/config" + + +### package sets are defined in the corresponding $release/config file + +source $release_conf + +## image_name depends on release and version + +image_name="${os}_${release}_${version}_${arch}_desktop" diff --git a/install.sh b/install.sh index ca4f54d..d4cf1c0 100755 --- a/install.sh +++ b/install.sh @@ -1,4 +1,33 @@ #!/usr/bin/env bash + +# Once you have run this script you should be able to +# +# drive names must be changed in blends/devuan-desktop-metal/config +# blends/devuan-desktop-metal/daedalus/config has the installed package list +# +# then: +# $ cd /var/tmp/live-sdk +# $ tmuxp load . +# +# This will give you two frames, one in the live-sdk env and one not. +# Use ^B arrow to switch between them, +# +# To install run: +# $ build_metal_dist + +# This script is intended to be run of an sdcard live image NOT a running system. +# +# It copies /var/tmp/live-sdk from 192.168.1.102 if the ssh key exchange does not +# fix password requests the default:default can be used. +# +# It takes the blends/devuan-desktop-live directory as a template and copies the +# configuration files in live-metal to the newly named blend directory. +# +# The sources.list will be updated to a snapshot.debian.org date that matches +# the live sdcard release (bookworm) if you change the live sdcard image you +# must change the date of the snapshot. + +# check for the availability of color terminfoi, fix it if it's missing. if [[ ! -f /lib/terminfo/t/tmux-256color ]]; then wget -c https://raw.githubusercontent.com/jez/dotfiles/master/tmux-256color.terminfo tic ./tmux-256color.terminfo @@ -27,57 +56,222 @@ rm /etc/apt/sources.list.d/brave-browser.list rm /etc/apt/sources.list.d/nodesource.list rm /etc/apt/sources.list.d/matrix-riot-im.list +# the snapshot.debian.org sources.list for the sdcard image. +# rm /etc/apt/sources.list + + +# To reduce the number of packages installed with an update we put a fixed date +# sources.list from snapshot.debian.org that matches the release of the live sdcard. + +# jessie caused a name collision with debian, capitalized ascii is already used +# for something and just an anoying choice, they calmed down after that +# (or someone left). + +# corresponds to Debian 7 Wheezy 20170617T034212Z +# Devuan 1.0 Jessie corresponds to Debian 8 Jessie 20180623T023722Z +# Devuan 2.0 ASCII corresponds to Debian 9 Stretch 20200717T204551Z +# Devuan 3.0 Beowulf corresponds to Debian 10.4 Buster 20230611T103552Z +# Devuan 4.0 Chimaera corresponds to Debian 11.1 Bullseye 20230611T103552Z +# Devuan 5.0 Daedalus corresponds to Debian 12 Bookworm 20231007T150030Z +# Devuan 6.0 Excalibur corresponds to Debian 13 Trixie testing +# Devuan 7.0 Freia corresponds to Debian 14 Forky +# Devuan Ceres corresponds to Debian Sid unstable + + +RELEASE_NAME=bookworm +SOURCES_DATE=20221017T031443Z +SNAPSHOT_SERVER="snapshot.debian.org" +# SNAPSHOT_SERVER="snapshot.notset.fr" +cat <<-EOF | sudo tee /etc/apt/sources.list.d/snapshot.sources.list + deb https://"${SNAPSHOT_SERVER}"/archive/debian/"${SOURCES_DATE}"/ "${RELEASE_NAME}" main contrib non-free non-free-firmware + deb-src https://"${SNAPSHOT_SERVER}"/archive/debian/"${SOURCES_DATE}"/ "${RELEASE_NAME}" main contrib non-free non-free-firmware + deb https://"${SNAPSHOT_SERVER}"/archive/debian-security/"${SOURCES_DATE}"/ "${RELEASE_NAME}"-security main contrib non-free non-free-firmware + deb-src https://"${SNAPSHOT_SERVER}"/archive/debian-security/"${SOURCES_DATE}"/ "${RELEASE_NAME}"-security main contrib non-free non-free-firmware +EOF +# cp ./snapshot.sources.list /etc/apt/sources.list.d/snapshot.sources.list + # Update apt even if upstream have shifted to a new release. +echo 'Acquire::Check-Valid-Until "false";' | sudo tee /etc/apt/apt.conf.d/99validuntil +echo 'Acquire::AllowReleaseInfoChange::Suite "true";' | sudo tee /etc/apt/apt.conf.d/99releaseinfochange +echo 'APT::Get::AllowUnauthenticated "true";' | sudo tee -a /etc/apt/apt.conf.d/99unauth +echo 'quiet::ReleaseInfoChange::Version "true";' | sudo tee -a /etc/apt/apt.conf.d/99releaseinfochange + +# When a suite gets advanced from testing to stable the release info changes, +# allow to update without error. apt-get update --allow-releaseinfo-change -y -apt-get install -y lsof gdisk hdparm debootstrap dosfstools rsync desktop-base + +# Keep the existing kernel and headers to prevent multiple builds of the zfs +# module for additional kernels. +KERNEL_VERSION="$(uname -r)" +apt-mark hold \ + linux-image-"${KERNEL_VERSION}" \ + linux-headers-"${KERNEL_VERSION}" \ + linux-image-amd64 \ + linux-headers-amd64 +apt-get install linux-headers-"${KERNEL_VERSION}" zfs-dkms + +modprobe zfs + +# Remove libreoffice, updating an installed libreoffice is time consuming and +# uses a lot of disk space on an sdcard image. +apt-get remove -y --purge \ + libreoffice \ + libreoffice-common \ + libreoffice-calc \ + libreoffice-core \ + libreoffice-writer \ + libreoffice-impress \ + libreoffice-draw \ + libreoffice-math \ + libreoffice-base \ + libreoffice-gtk3 \ + liblibreoffice-java \ + libreoffice-sdbc-hsqldb \ + libreoffice-base-drivers +apt-get -y autoremove +apt-get install -y lsof jc jq gdisk hdparm debootstrap dosfstools rsync openssh-server sshpass eudev # desktop-base + + +apt-get clean + +# install server public key for ssh from ~/.ssh/id_rsa.pub +mkdir -p ~/.ssh && cat ./sistarte-id_rsa.pub >> "${HOME}"/.ssh/authorized_keys + +# +# Exchange ssh keys +AUTOMATE_IP="192.168.1.102" +LOCAL_USER_EMAIL="devuan@${AUTOMATE_IP}" +ssh-keygen -t rsa -b 4096 -N '' -C "${LOCAL_USER_EMAIL}" -f "${HOME}"/.ssh/id_rsa +sshpass -f sistarte_password.txt ssh-copy-id default@${AUTOMATE_IP} #git clone https://git.devuan.org/devuan-sdk/live-sdk ../live-sdk #cd ../livecd || exit; git submodule update --init --recursive --checkout alias ssh="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" -rsync -avz -e ssh default@192.168.1.92:/var/tmp/automate /var/tmp/ -rsync -avz -e ssh default@192.168.1.92:/var/tmp/live-sdk .. -mkdir -p /var/tmp/live-sdk/log -mkdir -p /var/tmp/live-sdk/tmp -rsync -avz -e ssh default@192.168.1.92:/var/tmp/"bootstrap-devuan-amd64-stage*.cpio.gz" /var/tmp/live-sdk/tmp/ +# rsync -ratlz \ +# --rsh="/usr/bin/sshpass -p password ssh -l username" \ +# src_path \ +# dest_path + +rsync -avz \ + --exclude='.git/*' \ + --exclude='*gz' \ + --exclude='*deb' \ + -e ssh default@"${AUTOMATE_IP}":/var/tmp/automate \ + ../ + +ln -sf ../automate /var/tmp/automate + +bash ../automate/010_generate-ssh.sh "${HOME}" +bash ../automate/001_ssh.sh + +# SDCARD_ID="usb-Mass_Storage_Device_121220160204-0:0-part1" +# mkdir -p ../live-sdk +# if ! mountpoint -q ../live-sdk; then +# fsck.ext4 -f /dev/disk/by-id/${SDCARD_ID} +# mount /dev/disk/by-id/${SDCARD_ID} ../live-sdk +# else +# echo "mount point already in use, skipping mount operation." +# fi + +rsync -avz \ + --exclude='.git' \ + --exclude='tmp/*' \ + --exclude='dist/*' \ + --exclude='git/*' \ + -e ssh default@${AUTOMATE_IP}:/var/tmp/live-sdk \ + ../live-sdk + +mkdir -p ../live-sdk/log +mkdir -p ../live-sdk/tmp + +# Uncomment to speed up subsequent builds +# rsync -avz \ +# -e ssh default@${AUTOMATE_IP}:/var/tmp/"bootstrap-devuan-amd64-stage*.cpio.gz" \ +# /var/tmp/live-sdk/tmp/ + + +# Install # metal install chimaera (bare metal install to zfs following openzfs zfs rootfs) +RELEASE_NAME="daedalus" BLEND_NAME=devuan-desktop-metal TEMPLATE=devuan-desktop-live -sed -i "/blend_map=.*/ s/.*/&\n\t\t\"${BLEND_NAME}\" \"\$R\/blends\/${BLEND_NAME}\/${BLEND_NAME}.blend\"/" ../live-sdk/sdk +sed -i \ + "/blend_map=.*/ s/.*/&\n\t\t\"${BLEND_NAME}\" \"\$R\/blends\/${BLEND_NAME}\/${BLEND_NAME}.blend\"/" \ + ../live-sdk/sdk + +mkdir -p ../live-sdk/blends/${BLEND_NAME}/${RELEASE_NAME} cp -a ../live-sdk/blends/${TEMPLATE} ../live-sdk/blends/${BLEND_NAME} -cp --backup blend_chimaera_config ../live-sdk/blends/${BLEND_NAME}/chimaera/config -cp --backup blend_config ../live-sdk/blends/${BLEND_NAME}/config -cp --backup blend_sysconf ../live-sdk/blends/${BLEND_NAME}/sysconf -cp --backup blend_sysconf.md ../live-sdk/blends/${BLEND_NAME}/sysconf.md -cp --backup blend_helpers ../live-sdk/blends/${BLEND_NAME}/helpers -cp --backup blend_helpers.md ../live-sdk/blends/${BLEND_NAME}/helpers.md -cp --backup devuan-desktop-metal.blend ../live-sdk/blends/${BLEND_NAME}/ -cp --backup devuan-desktop-metal.md ../live-sdk/blends/${BLEND_NAME}/ -cp --backup console_livesdk.sh ../live-sdk/ -cp --backup dot_tmuxp.yaml_metal ../live-sdk/.tmuxp.yaml +cp blend_config ../live-sdk/blends/${BLEND_NAME}/config +cp blend_${RELEASE_NAME}_config ../live-sdk/blends/${BLEND_NAME}/${RELEASE_NAME}/config +cp blend_sysconf ../live-sdk/blends/${BLEND_NAME}/sysconf +cp blend_sysconf.md ../live-sdk/blends/${BLEND_NAME}/sysconf.md +cp blend_helpers ../live-sdk/blends/${BLEND_NAME}/helpers +cp blend_helpers.md ../live-sdk/blends/${BLEND_NAME}/helpers.md +cp devuan-desktop-metal.blend ../live-sdk/blends/${BLEND_NAME}/ +cp devuan-desktop-metal.md ../live-sdk/blends/${BLEND_NAME}/ +cp console_livesdk.sh ../live-sdk/ +cp dot_tmuxp.yaml_metal ../live-sdk/.tmuxp.yaml # docker image minimal (following debuerreotype methods) BLEND_NAME=devuan-minimal-docker TEMPLATE=devuan-minimal-live -sed -i "/blend_map=.*/ s/.*/&\n\t\t\"${BLEND_NAME}\" \"\$R\/blends\/${BLEND_NAME}\/${BLEND_NAME}.blend\"/" ../live-sdk/sdk +sed -i \ + "/blend_map=.*/ s/.*/&\n\t\t\"${BLEND_NAME}\" \"\$R\/blends\/${BLEND_NAME}\/${BLEND_NAME}.blend\"/" \ + ../live-sdk/sdk + +mkdir -p ../live-sdk/blends/${BLEND_NAME}/${RELEASE_NAME} cp -a ../live-sdk/blends/${TEMPLATE} ../live-sdk/blends/${BLEND_NAME} -cp --backup blend_chimaera-docker_config ../live-sdk/blends/${BLEND_NAME}/chimaera/config -cp --backup blend_config-docker ../live-sdk/blends/${BLEND_NAME}/config-docker -cp --backup blend_sysconf ../live-sdk/blends/${BLEND_NAME}/sysconf -cp --backup blend_sysconf.md ../live-sdk/blends/${BLEND_NAME}/sysconf.md -cp --backup blend_helpers-docker ../live-sdk/blends/${BLEND_NAME}/helpers-docker -cp --backup blend_helpers-docker.md ../live-sdk/blends/${BLEND_NAME}/helpers-docker.md -cp --backup devuan-minimal-docker.blend ../live-sdk/blends/${BLEND_NAME}/ -cp --backup devuan-minimal-docker.md ../live-sdk/blends/${BLEND_NAME}/ -cp --backup tar-excludes ../live-sdk/blends/${BLEND_NAME}/ +cp blend_${RELEASE_NAME}-docker_config ../live-sdk/blends/${BLEND_NAME}/${RELEASE_NAME}/config +cp blend_config-docker ../live-sdk/blends/${BLEND_NAME}/config-docker +cp blend_sysconf ../live-sdk/blends/${BLEND_NAME}/sysconf +cp blend_sysconf.md ../live-sdk/blends/${BLEND_NAME}/sysconf.md +cp blend_helpers-docker ../live-sdk/blends/${BLEND_NAME}/helpers-docker +cp blend_helpers-docker.md ../live-sdk/blends/${BLEND_NAME}/helpers-docker.md +cp devuan-minimal-docker.blend ../live-sdk/blends/${BLEND_NAME}/ +cp devuan-minimal-docker.md ../live-sdk/blends/${BLEND_NAME}/ +cp tar-excludes ../live-sdk/blends/${BLEND_NAME}/ + +# ln -sf ${RELEASE_NAME}.config config -bash /var/tmp/automate/010_zram.sh && /etc/init.d/zram start -bash /var/tmp/automate/020_tmux.sh +bash ../automate/010_zram.sh && /etc/init.d/zram start +bash ../automate/020_tmux.sh "${HOME}" +bash ../automate/020_zsh_quickstart.sh "${HOME}" -su '/usr/share/tmux-plugin-manager/bin/install_plugins' default -su '/usr/share/tmux-plugin-manager/bin/install_plugins' root +sudo -i -u devuan '/usr/share/tmux-plugin-manager/bin/install_plugins' +sudo -i '/usr/share/tmux-plugin-manager/bin/install_plugins' -ps aux > /var/tmp/live-sdk/log/psaux.pre -lsof > /var/tmp/live-sdk/log/lsof.pre +ps aux > ../live-sdk/log/psaux.pre +lsof > ../live-sdk/log/lsof.pre + +# Fix the innumeration of drives to usbe ata-* rather than wwn-* + +# could import from blend_config +# disk_path="/dev/disk/by-id" +# disk_name="ata-CT1000MX500SSD1_2321E6DBE216" +# disk2_name="ata-CT1000MX500SSD1_2321E6DBE1D2" +# +# raid=mirror +# +# available_disks=("${disk_name}") +# if [[ -v $raid ]]; then +# available_disks+="${disk2_name}" +# fi + +# source blend_config +# for disk in "${available_disks[@]}"; do +# TARGET="/dev/disk/by-id/${disk}" +# +# UDEV_OUTPUT=$(udevadm info --query=all "${TARGET}" | jc --udevadm -p | jq 'del(.E.ID_MODEL_ENC)') +# MODEL=$(echo -n "${UDEV_OUTPUT}" | jq -r '.E.ID_MODEL') +# SERIAL=$(echo -n "${UDEV_OUTPUT}" | jq -r '.E.ID_SERIAL_SHORT') +# echo "SUBSYSTEM==\"block\", \ +# ATTRS{model}=\"$MODEL\", \ +# ATTRS{serial_short}=\"$SERIAL\", \ +# SYMLINK+=\"disk/by-id/ata-\$attr{serial_short}\"" | \ +# sudo tee /etc/udev/rules.d/99-custom-ata-names.rules +# done + +# udevadm control --reload-rules && sudo udevadm trigger diff --git a/sistarte-id_rsa.pub b/sistarte-id_rsa.pub new file mode 100644 index 0000000..7036c8a --- /dev/null +++ b/sistarte-id_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC1p5qweYQBS/I0ir3xss8dTYpEKx19j3AeosVwNMlcXm3oD7MvyAkIeFI2g8/VZTXAX+AM9WFqzH9nGbdm7+xnjsTwfhzDgEEsJ/Dqfv5TVVB6swUzN2Xl4waxLSTDHf0J4qeemzecPgWLOG6O2QIrblkKjSXc3tWjwoYeqEvaq2kIz/wQQkjgKZWV+hm4GYLuFHgLDVvaR6Ltkf7eVcoGleCpeJ6d3Qq6GsTbm1h/sB2FmVpeyCHQKK2t2DO4tDf93pCqsMLSxdORDNcAZvnQi1w8sNLJPCzg9756Zdrmgt7IEiuF9tvzMnir4tfbR3q7zAjKBhU4jykhLv7AS4oqWr9EphVKHGciIpZvJMb7KqRSjMFbe5ofdDoWE/BrlzywFnu4eQHwvvLEnMYUWyrLWcDNZTv9CoUTsbiFcrC856H7NqA4J5HgRvFI04TCnh0Jkk10iu8KbsUA+KyzdxO2SVtqh1Hkxs2FjhsVdtYXziU7tsbEcSsMwako+DBec+8= default@sistarte diff --git a/sistarte_password.txt b/sistarte_password.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/sistarte_password.txt @@ -0,0 +1 @@ +default diff --git a/snapshot.sources.list b/snapshot.sources.list new file mode 100644 index 0000000..bdc419c --- /dev/null +++ b/snapshot.sources.list @@ -0,0 +1,4 @@ +deb https://snapshot.debian.org/archive/debian/20221017T031443Z/ bookworm main contrib non-free non-free-firmware +deb-src https://snapshot.debian.org/archive/debian/20221017T031443Z/ bookworm main contrib non-free non-free-firmware +deb https://snapshot.debian.org/archive/debian-security/20221017T031443Z/ bookworm-security main contrib non-free non-free-firmware +deb-src https://snapshot.debian.org/archive/debian-security/20221017T031443Z/ bookworm-security main contrib non-free non-free-firmware diff --git a/u-boot-logo/Devuan-logo-swoosh.bmp b/u-boot-logo/Devuan-logo-swoosh.bmp new file mode 100644 index 0000000000000000000000000000000000000000..57fb43634862bd4fd38a88b1691c8fdad2638050 GIT binary patch literal 232262 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 + + + Devuan Logo + + + + + + image/svg+xml + + Devuan Logo + + + hellekin + + + + + Dyne.org Foundation + + + + + hellekin, golinux, Centurion_Dan + + + + + + + + + \ No newline at end of file diff --git a/u-boot-logo/Devuan-logo.bmp b/u-boot-logo/Devuan-logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..695c516764d24ed41ccd5ba895a3d54021b16310 GIT binary patch literal 455662 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 GLK6U}7ydE; literal 0 HcmV?d00001 diff --git a/u-boot-logo/Devuan-logo.svg b/u-boot-logo/Devuan-logo.svg new file mode 100644 index 0000000..5de8c68 --- /dev/null +++ b/u-boot-logo/Devuan-logo.svg @@ -0,0 +1,27 @@ + + + + + + + + + image/svg+xml + + + + + + + + ® + + + + + + + + + + \ No newline at end of file diff --git a/u-boot-logo/README.md b/u-boot-logo/README.md new file mode 100644 index 0000000..066a4f2 --- /dev/null +++ b/u-boot-logo/README.md @@ -0,0 +1,75 @@ +Pinephone A64 native resolution 1440x720 18:9 2:1 + +Display size: 5.32" × 2.66" = 14.16in² (13.52cm × 6.76cm = 91.36cm²) at 270.58 PPI, 0.0939mm dot pitch, 73215 PPI² + +https://developer.toradex.com/linux-bsp/how-to/boot/splash-screen-on-u-boot/ + + +* Inkscape + +Load the svg to inkscape and export png + + +* Converting from PNG to BMP + +U-Boot can read a specific image format. Use the following command to convert the PNG image to BPM. +SVG="Devuan-logo.svg" +PNG="Devuan-logo.png" +BMP="Devuan-logo.bmp" +inkscape --export-type="png" ${SVG} +convert ${PNG} -type Palette -colors 224 -depth 8 -compress none -verbose BMP3:${PNG} + +SVG="Devuan-logo-swoosh.svg" +PNG="Devuan-logo-swoosh.png" +BMP="Devuan-logo-swoosh.bmp" +inkscape --export-type="png" ${SVG} +convert ${PNG} -type Palette -colors 224 -depth 8 -compress none -verbose BMP3:${BMP} + + +# The u-boot makefile sets the location of the logo image in LOGO_BMP +# It will look for logos/$(BOARD).bmp and logos/$(VENDOR).bmp so +# we can write it their instead. +# copy to the existing denx generic logo image location. +# tools/bmp_logo --gen-info ./tools/logos/denx.bmp > include/bmp_logo.h +# tools/bmp_logo --gen-bmp ./tools/logos/denx.bmp > include/bmp_logo_data.h +cp ~/${BMP} ${UBOOT_HOME}/tools/logos/denx.bmp + + +----- +* Using GIMP image dump + +https://developer.ridgerun.com/wiki/index.php/How_to_change_uboot_splash_image + + + +# Get image that you want to show in resolution smaller than your display resolution. +# Open the image using GIMP graphic application. +# Save the image using "save as" option. +# In the select box "Select File Type (by Extension)" select the format "c source code" +# Then you will get one windows with some options, in this window deselect all options (Use glibs types, use macros instead of struct, Use 1 byte run-length-encoding, Save alpha channel) +# Then save this file (changing the file extension from .c to .h) to +#* $DEVDIR/bootloader/uboot.*/src/board/davinci/common +# Change the variable value CONFIG_SPLASH_LOGO_FILE with the name of file used above. The CONFIG_SPLASH_LOGO_FILE configuration setting can be found in the Splash Screen section in your board file in the directory +#* $DEVDIR/bootloader/uboot.*/src/include/configs +# Clean and compile the bootloader + +The form of the image-file must be similar to: + + +/* GIMP RGB C-Source image dump (image.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + unsigned char pixel_data[200 * 100 * 3 + 1]; +} gimp_image = { + 200, 100, 3, + "(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306" + "(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306" + "(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306" + "(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306(\237\306" + + +Remember that normally the bootloader modifications are made using patches. +