├── .github ├── SIZE.txt ├── shellcheck.txt ├── SIZE.md ├── dependabot.yaml └── workflows │ ├── healthchecks_housekeeping.yaml │ ├── build_aarch64_Linux.yaml │ └── build_x86_64_Linux.yaml ├── LICENSE ├── blueprint_bootstrap.sh ├── README.md ├── archlinux_hooks.sh ├── IDEAS_TODO.txt ├── alpine_bootstrap.sh ├── debian_bootstrap.sh ├── ubuntu_bootstrap.sh ├── void-musl_bootstrap.sh ├── void-glibc_bootstrap.sh ├── eweos_bootstrap.sh ├── archlinux_bootstrap.sh ├── cachyos_bootstrap.sh ├── artixlinux_bootstrap.sh ├── artixlinux_bootstrap.sh.old ├── cachyos_bootstrap.sh.old └── archlinux_bootstrap.sh.old /.github/SIZE.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/shellcheck.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/SIZE.md: -------------------------------------------------------------------------------- 1 | ```mathematica 2 | ``` 3 | -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | #Bare bones dependabot only for GH Workflow Files 2 | version: 2 3 | updates: 4 | - package-ecosystem: "github-actions" 5 | directory: "/" 6 | schedule: 7 | interval: "daily" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Package Forge 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /blueprint_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/blueprint_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | #-------------------------------------------------------# 28 | ##BluePrint 29 | pushd "${FIM_SRCDIR}" >/dev/null 2>&1 30 | echo -e "\n[+] Creating Blueprint.FlatImage\n" 31 | #Setup FS 32 | rm -rfv "${FIM_TMPDIR}/blueprint/fim" 2>/dev/null 33 | mkdir -pv "${FIM_TMPDIR}/blueprint/fim/config" 34 | mkdir -pv "${FIM_TMPDIR}/blueprint/fim/static" 35 | #Copy Bins 36 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/blueprint/fim/static" 37 | #Copy Desktop, Icon & AppStream 38 | mkdir -pv "${FIM_TMPDIR}/blueprint/fim/desktop" 39 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/blueprint/fim/desktop/icon.svg" 40 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/blueprint/fim/desktop/flatimage.xml" 41 | #Create 42 | create_flatimage_base blueprint || true 43 | #Info 44 | "${FIM_TMPDIR}/blueprint.flatimage" fim-env add 'FIM_DIST=blueprint' 2>/dev/null 45 | "${FIM_TMPDIR}/blueprint.flatimage" fim-env list 2>/dev/null 46 | "${FIM_TMPDIR}/blueprint.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 47 | "${FIM_TMPDIR}/blueprint.flatimage" fim-perms list 48 | "${FIM_TMPDIR}/blueprint.flatimage" fim-commit 49 | #Copy 50 | if [[ -f "${FIM_TMPDIR}/blueprint.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/blueprint.flatimage") -gt 10000 ]]; then 51 | rsync -achLv "${FIM_TMPDIR}/blueprint.flatimage" "${FIM_IMGDIR}" 52 | realpath "${FIM_IMGDIR}/blueprint.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 53 | fi 54 | popd >/dev/null 2>&1 55 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > - [FlatImage](https://github.com/ruanformigoni/flatimage): https://github.com/ruanformigoni/flatimage 2 | > - For: [Soarpkgs](https://github.com/pkgforge/soarpkgs) 3 | > > - Contact: PkgForge () Discord `➼` [`https://discord.gg/djJUs48Zbu`](https://discord.gg/djJUs48Zbu) 4 | 5 | - #### Download 6 | > - Continuous Releases are available for [`aarch64`](https://github.com/pkgforge/flatimage-base/releases/tag/aarch64) & [`x86_64`](https://github.com/pkgforge/flatimage-base/releases/tag/x86_64) 7 | > > ```bash 8 | > > !#To get os-release & ldd version 9 | > > curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/${IMG_NAME}.txt" 10 | > > #Example: curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/alpine.txt" 11 | > > 12 | > > !#To Download the image 13 | > > wget -q "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/${IMG_NAME}.flatimage" 14 | > > #Example: wget -q "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/alpine.flatimage" 15 | > > ``` 16 | > 17 | > - [Stable/Tagged](https://github.com/pkgforge/flatimage-base/tags) Releases are also available at: https://github.com/pkgforge/flatimage-base/releases 18 | > 19 | > - `NOTE:` Flatimages based on `aarch64` may exhibit unexpected behavior, and not all distributions are supported. 20 | > - `NOTE:` These Base Images are as minimal as possible and have [all permissions enabled by default](https://flatimage.github.io/docs/cmd/perms/). Details: https://flatimage.github.io/docs/cmd/perms/ 21 | > - `NOTE:` **Sometimes Files are NOT uploaded to Releases due to GitHub API Error, make sure to check [ARTIFACTS](https://github.com/pkgforge/flatimage-base/actions)** 22 | 23 | - #### Status 24 | > - [![🐧🧹 HealthChecks 🖳🗑️](https://github.com/pkgforge/flatimage-base/actions/workflows/healthchecks_housekeeping.yaml/badge.svg)](https://github.com/pkgforge/flatimage-base/actions/workflows/healthchecks_housekeeping.yaml) 25 | > - [![🛍️ Build 📀 (aarch64-Linux) FlatImages 📦📀](https://github.com/pkgforge/flatimage-base/actions/workflows/build_aarch64_Linux.yaml/badge.svg)](https://github.com/pkgforge/flatimage-base/actions/workflows/build_aarch64_Linux.yaml) 26 | > - [![🛍️ Build 📀 (x86_64-Linux) FlatImages 📦📀](https://github.com/pkgforge/flatimage-base/actions/workflows/build_x86_64_Linux.yaml/badge.svg)](https://github.com/pkgforge/flatimage-base/actions/workflows/build_x86_64_Linux.yaml) 27 | -------------------------------------------------------------------------------- /archlinux_hooks.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## DO NOT RUN DIRECTLY 4 | #ONLY RUN FROM WITHIN CHROOT 5 | #Self 6 | 7 | 8 | ##SystemD Updates 9 | shopt -s nullglob 10 | for i in $(grep -rin -m1 -l "ConditionNeedsUpdate" /usr/lib/systemd/system/); do 11 | sed -Ei "s/ConditionNeedsUpdate=.*/ConditionNeedsUpdate=/" "$i" 12 | done 13 | grep -rin "ConditionNeedsUpdate" "/usr/lib/systemd/system/" 14 | 15 | ##Pacman Hooks 16 | mkdir -p "/etc/pacman.d/hooks" 17 | #Override Desktop cache 18 | tee "/etc/pacman.d/hooks/update-desktop-database.hook" << 'EOF' 19 | [Trigger] 20 | Type = Path 21 | Operation = Install 22 | Operation = Upgrade 23 | Operation = Remove 24 | Target = * 25 | 26 | [Action] 27 | Description = Overriding the desktop file MIME type cache... 28 | When = PostTransaction 29 | Exec = /bin/true 30 | EOF 31 | #Override MIME cache 32 | tee "/etc/pacman.d/hooks/30-update-mime-database.hook" << 'EOF' 33 | [Trigger] 34 | Type = Path 35 | Operation = Install 36 | Operation = Upgrade 37 | Operation = Remove 38 | Target = * 39 | 40 | [Action] 41 | Description = Overriding the desktop file MIME type cache... 42 | When = PostTransaction 43 | Exec = /bin/true 44 | EOF 45 | #Cleanup cache 46 | tee "/etc/pacman.d/hooks/cleanup-pkgs.hook" << 'EOF' 47 | [Trigger] 48 | Type = Path 49 | Operation = Install 50 | Operation = Upgrade 51 | Operation = Remove 52 | Target = * 53 | 54 | [Action] 55 | Description = Cleaning up downloaded files... 56 | When = PostTransaction 57 | Exec = /bin/sh -c 'rm -rf /var/cache/pacman/pkg/* 2>/dev/null' 58 | EOF 59 | #Cleanup Locale 60 | tee "/etc/pacman.d/hooks/cleanup-locale.hook" << 'EOF' 61 | [Trigger] 62 | Type = Path 63 | Operation = Install 64 | Operation = Upgrade 65 | Operation = Remove 66 | Target = * 67 | 68 | [Action] 69 | Description = Cleaning up locale files... 70 | When = PostTransaction 71 | Exec = /bin/sh -c 'find /usr/share/locale -mindepth 1 -maxdepth 1 -type d -not -iname "en_us" -exec rm -rf "{}" 2>/dev/null \;' 72 | EOF 73 | #Cleanup Docs 74 | tee "/etc/pacman.d/hooks/cleanup-doc.hook" << 'EOF' 75 | [Trigger] 76 | Type = Path 77 | Operation = Install 78 | Operation = Upgrade 79 | Operation = Remove 80 | Target = * 81 | 82 | [Action] 83 | Description = Cleaning up doc... 84 | When = PostTransaction 85 | Exec = /bin/sh -c 'rm -rf /usr/share/doc/* 2>/dev/null' 86 | EOF 87 | #Cleanup Manpages 88 | tee "/etc/pacman.d/hooks/cleanup-man.hook" << 'EOF' 89 | [Trigger] 90 | Type = Path 91 | Operation = Install 92 | Operation = Upgrade 93 | Operation = Remove 94 | Target = * 95 | 96 | [Action] 97 | Description = Cleaning up man... 98 | When = PostTransaction 99 | Exec = /bin/sh -c 'rm -rf /usr/share/man/* 2>/dev/null' 100 | EOF 101 | #Cleanup Fonts 102 | tee "/etc/pacman.d/hooks/cleanup-fonts.hook" << 'EOF' 103 | [Trigger] 104 | Type = Path 105 | Operation = Install 106 | Operation = Upgrade 107 | Operation = Remove 108 | Target = * 109 | 110 | [Action] 111 | Description = Cleaning up noto fonts... 112 | When = PostTransaction 113 | Exec = /bin/sh -c 'find /usr/share/fonts/noto -mindepth 1 -type f -not -iname "notosans-*" -and -not -iname "notoserif-*" -exec rm "{}" 2>/dev/null \;' 114 | EOF 115 | ##END -------------------------------------------------------------------------------- /IDEAS_TODO.txt: -------------------------------------------------------------------------------- 1 | #Proprietary GPU Drivers Ubuntu: https://github.com/NatoBoram/FirstRun/blob/main/Linux/Ubuntu.sh 2 | https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa 3 | sudo add-apt-repository -y ppa:graphics-drivers/ppa 4 | 5 | 6 | 7 | #Cachyos V4 8 | https://github.com/CachyOS/linux-cachyos?tab=readme-ov-file#how-to-add-cachyos-repositories 9 | 10 | The docker image can't be built in due to qemu itself, so I have to probably build it locally if I want to add a v4 cachyos.... 11 | https://github.com/CachyOS/docker/pull/4 12 | 13 | #ppsspp on Arch/CachyOS 14 | pushd "$($TMPDIRS)" >/dev/null 2>&1 15 | OWD="$(realpath .)" && export OWD="${OWD}" 16 | export APP="ppsspp" 17 | export PKG_NAME="${APP}.FlatImage" 18 | 19 | rsync -achLv "/opt/FLATIMAGE/cachyos" "${OWD}/cachyos" 20 | export FIMG_BASE="${OWD}/cachyos" 21 | #Bootstrap 22 | "${FIMG_BASE}" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 23 | "${FIMG_BASE}" fim-perms list 24 | "${FIMG_BASE}" fim-root bash -c ' 25 | #Sync 26 | pacman -Syu --noconfirm 27 | #Install Deps 28 | packages="" 29 | for pkg in $packages; do pacman -Sy "$pkg" --needed --noconfirm ; done 30 | #Install 31 | pacman ppsspp -Sy --noconfirm 32 | pacman -Ql ppsspp 33 | #Cleanup 34 | pacman -Rsn base-devel --noconfirm 35 | pacman -Rsn perl --noconfirm 36 | pacman -Rsn python --noconfirm 37 | pacman -Scc --noconfirm 38 | ' 39 | #ENV 40 | "${FIMG_BASE}" fim-exec mkdir -p "/home/root" 41 | "${FIMG_BASE}" fim-env add 'USER=root' 'HOME=/home/root' 'XDG_CONFIG_HOME=/home/root/.config' 'XDG_DATA_HOME=/home/root/.local/share' 42 | "${FIMG_BASE}" fim-env list 43 | "${FIMG_BASE}" fim-boot "/usr/bin/PPSSPPQt" 44 | #Create 45 | "${FIMG_BASE}" fim-commit 46 | 47 | 48 | ##ppsspp on Void 49 | pushd "$($TMPDIRS)" >/dev/null 2>&1 50 | OWD="$(realpath .)" && export OWD="${OWD}" 51 | export APP="ppsspp" 52 | export PKG_NAME="${APP}.FlatImage" 53 | 54 | rsync -achLv "/opt/FLATIMAGE/void-glibc" "${OWD}/void-glibc" 55 | export FIMG_BASE="${OWD}/void-glibc" 56 | #ppsspp on VOid 57 | #Bootstrap 58 | "${FIMG_BASE}" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 59 | "${FIMG_BASE}" fim-perms list 60 | "${FIMG_BASE}" fim-root bash -c ' 61 | #Enable Repos 62 | xbps-install void-repo-multilib void-repo-multilib-nonfree void-repo-nonfree --sync --update --yes 63 | #Install Deps 64 | packages="" 65 | for pkg in $packages; do xbps-install "$pkg" --sync --update --yes ; done 66 | #Finally Install ppsspp 67 | xbps-install ppsspp --sync --update --yes 68 | xbps-query -f ppsspp 69 | xbps-remove --clean-cache --remove-orphans --recursive --verbose 70 | ' 71 | #ENV 72 | "${FIMG_BASE}" fim-exec mkdir -p "/home/root" 73 | "${FIMG_BASE}" fim-env add 'USER=root' 'HOME=/home/root' 'XDG_CONFIG_HOME=/home/root/.config' 'XDG_DATA_HOME=/home/root/.local/share' 74 | "${FIMG_BASE}" fim-env list 75 | "${FIMG_BASE}" fim-boot "/usr/bin/ppsspp-headless" 76 | #Create 77 | "${FIMG_BASE}" fim-commit 78 | 79 | #Steam on VOid 80 | #Bootstrap 81 | "${FIMG_BASE}" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 82 | "${FIMG_BASE}" fim-perms list 83 | "${FIMG_BASE}" fim-root bash -c ' 84 | #Enable Repos 85 | xbps-install void-repo-multilib void-repo-multilib-nonfree void-repo-nonfree --sync --update --yes 86 | #Install Deps 87 | packages="alsa-utils alsa-lib alsa-plugins-pulseaudio alsa-ucm-conf bash binutils curl fakeroot git glibc-32bit intel-media-driver intel-video-accel libcurl libcurl-32bit libdrm-32bit libgcc-32bit libglvnd-32bit libjack-pipewire libpipewire libpulseaudio libstdc++-32bit libva-intel-driver libusb libxkbcommon libxkbcommon-tools libxkbcommon-x11 MangoHud mesa mesa-dri-32bit mesa-nouveau-dri mesa-vaapi mesa-vdpau mesa-vulkan-intel mesa-vulkan-lavapipe nv-codec-headers pipewire pulseaudio SDL2 Vulkan-Tools vulkan-loader wget wireplumber xf86-video-nouveau" 88 | for pkg in $packages; do xbps-install "$pkg" --sync --update --yes ; done 89 | #Finally Install steam 90 | xbps-install steam --sync --update --yes 91 | xbps-remove --clean-cache --remove-orphans --recursive --verbose 92 | ' 93 | #ENV 94 | "${FIMG_BASE}" fim-exec mkdir -p "/home/steam" 95 | "${FIMG_BASE}" fim-env add 'USER=steam' 'HOME=/home/steam' 'XDG_CONFIG_HOME=/home/steam/.config' 'XDG_DATA_HOME=/home/steam/.local/share' 96 | "${FIMG_BASE}" fim-env list 97 | "${FIMG_BASE}" fim-boot "/usr/sbin/steam" 98 | #Create 99 | "${FIMG_BASE}" fim-commit 100 | 101 | 102 | 103 | ##nix on alpine 104 | pushd "$(mktemp -d)" >/dev/null 2>&1 105 | docker stop "alpine-nix" 2>/dev/null ; docker rm "alpine-nix" 2>/dev/null 106 | docker run --name "alpine-nix" --pull="always" "alpine:edge" sh -c ' 107 | apk update --no-interactive 108 | #DO NOT USE --update | --latest, it breaks 109 | apk add nix --no-interactive 110 | apk info nix -L 111 | nix-channel --add "https://nixos.org/channels/nixos-unstable" "nixpkgs" 112 | nix-channel --list && nix-channel --update 113 | nix derivation show "nixpkgs#hello" --extra-experimental-features flakes --extra-experimental-features nix-command 114 | chmod 755 "/bin/bbsuid" 115 | rm -rfv "/var/cache/apk/"* 2>/dev/null 116 | rm -rfv "/usr/share/fonts/"* 2>/dev/null 117 | rm -rfv "/usr/share/licenses/"* 2>/dev/null 118 | rm -rfv "/usr/share/locale/"* 2>/dev/null 119 | rm -rfv "/usr/share/man/"* 2>/dev/null 120 | nix-collect-garbage ; apk cache clean 121 | ' 122 | docker export "$(docker ps -aqf 'name=alpine-nix')" --output "rootfs.tar" 123 | mkdir -p "./root" ; bsdtar -x -f "rootfs.tar" -C "./root" 124 | 125 | proot --kill-on-exit -R "./root" /bin/sh -c 'nix-shell -p librewolf --run "librewolf"' 126 | 127 | 128 | apk update --no-interactive 129 | apk add nix --force --latest --upgrade --no-interactive 130 | 131 | apk add bash coreutils curl shadow sudo tar xz --force --latest --upgrade --no-interactiv 132 | 133 | sh <(curl -qfsSL "https://nixos.org/nix/install") --no-daemon 134 | 135 | 136 | 137 | curl -qfsSL "https://install.determinate.systems/nix" | bash -s -- install linux --init none --extra-conf "filter-syscalls = false" --no-confirm 138 | #Source 139 | source "/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh" 140 | #Fix perms: could not set permissions on '/nix/var/nix/profiles/per-user' to 755: Operation not permitted 141 | #sudo chown --recursive "${USER}" "/nix" 142 | sudo chown --recursive "root" "/nix" 143 | echo "root ALL=(ALL:ALL) ALL" | sudo tee -a "/etc/sudoers" -------------------------------------------------------------------------------- /alpine_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/alpine_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | #-------------------------------------------------------# 28 | ##Alpine 29 | echo -e "\n[+] Creating Alpine.FlatImage\n" 30 | #Bootstrap 31 | pushd "$(mktemp -d)" >/dev/null 2>&1 32 | curl -qfsSL "https://bin.ajam.dev/$(uname -m)/apk-static" -o "./apk-static" && chmod +x "./apk-static" 33 | if [[ -f "./apk-static" ]] && [[ $(stat -c%s "./apk-static") -gt 1024 ]]; then 34 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 35 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 36 | sudo "./apk-static" --arch "$(uname -m)" -X "http://dl-cdn.alpinelinux.org/alpine/latest-stable/main/" -U --allow-untrusted --root "${ROOTFS_DIR}" --initdb add "alpine-base" 37 | #aria2c "https://pub.ajam.dev/utils/alpine-mini-$(uname -m)/rootfs.tar.gz" \ 38 | #--split="16" --max-connection-per-server="16" --min-split-size="1M" \ 39 | #--check-certificate="false" --console-log-level="error" --user-agent="${USER_AGENT}" \ 40 | #--max-tries="10" --retry-wait="5" --connect-timeout="60" --timeout="600" \ 41 | #--download-result="default" --allow-overwrite --out="./ROOTFS.tar.gz" 2>/dev/null 42 | #bsdtar -x -f "./ROOTFS.tar.gz" -p -C "${ROOTFS_DIR}" 2>/dev/null 43 | du -sh "${ROOTFS_DIR}" 44 | sudo chmod 755 "${ROOTFS_DIR}/bin/bbsuid" 2>/dev/null 45 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 46 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 47 | sudo mkdir -pv "${ROOTFS_DIR}/etc/apk" 48 | echo "https://dl-cdn.alpinelinux.org/alpine/edge/main" | sudo tee "${ROOTFS_DIR}/etc/apk/repositories" 49 | echo "https://dl-cdn.alpinelinux.org/alpine/edge/community" | sudo tee -a "${ROOTFS_DIR}/etc/apk/repositories" 50 | echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" | sudo tee -a "${ROOTFS_DIR}/etc/apk/repositories" 51 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 52 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 53 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 54 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 55 | find "${ROOTFS_DIR}/bin" -type l -lname '/bin/busybox' -exec sudo sh -c 'ln -sf "../bin/busybox" "$1"' _ {} \; 56 | find "${ROOTFS_DIR}/usr/bin" -type l -lname '/bin/busybox' -exec sudo sh -c 'ln -sf "../../bin/busybox" "$1"' _ {} \; 57 | find "${ROOTFS_DIR}/bin" "${ROOTFS_DIR}/usr/bin" -type l -exec sudo sh -c 'echo "{} -> $(readlink "{}")"' \; 58 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apk update --no-interactive' 59 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apk upgrade --no-interactive' 60 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apk add bash binutils curl fakeroot musl-locales-lang sudo wget --latest --upgrade --no-interactive' 61 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen' 62 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen "en_US.UTF-8"' 63 | #sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apk add bash alsa-utils alsa-utils-doc alsa-lib alsaconf alsa-ucm-conf pulseaudio pulseaudio-alsa --latest --upgrade --no-interactive' 64 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 65 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 66 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 67 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 68 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apk info -L' 69 | sudo rm -rfv "${ROOTFS_DIR}/var/cache/apk/"* 70 | du -sh "${ROOTFS_DIR}" 71 | fi 72 | fi 73 | #Setup FS 74 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 75 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 76 | rm -rfv "${FIM_TMPDIR}/alpine" 2>/dev/null 77 | mkdir -pv "${FIM_TMPDIR}/alpine/fim/config" 78 | mkdir -pv "${FIM_TMPDIR}/alpine/fim/static" 79 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/alpine" 80 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/alpine" && chmod -R 755 "${FIM_TMPDIR}/alpine" 81 | #Copy Bins 82 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/alpine/fim/static" 83 | #Copy Desktop, Icon & AppStream 84 | mkdir -pv "${FIM_TMPDIR}/alpine/fim/desktop" 85 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/alpine/fim/desktop/icon.svg" 86 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/alpine/fim/desktop/flatimage.xml" 87 | #Create 88 | create_flatimage_base alpine || true 89 | #Info 90 | "${FIM_TMPDIR}/alpine.flatimage" fim-env add 'FIM_DIST=alpine' 2>/dev/null 91 | "${FIM_TMPDIR}/alpine.flatimage" fim-env list 2>/dev/null 92 | "${FIM_TMPDIR}/alpine.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 93 | "${FIM_TMPDIR}/alpine.flatimage" fim-perms list 94 | "${FIM_TMPDIR}/alpine.flatimage" fim-commit 95 | fi 96 | unset ROOTFS_DIR 97 | #Copy 98 | if [[ -f "${FIM_TMPDIR}/alpine.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/alpine.flatimage") -gt 10000 ]]; then 99 | rsync -achLv "${FIM_TMPDIR}/alpine.flatimage" "${FIM_IMGDIR}" 100 | realpath "${FIM_IMGDIR}/alpine.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 101 | fi 102 | popd >/dev/null 2>&1 103 | #-------------------------------------------------------# 104 | -------------------------------------------------------------------------------- /.github/workflows/healthchecks_housekeeping.yaml: -------------------------------------------------------------------------------- 1 | name: 🐧🧹 HealthChecks 🖳🗑️ 2 | 3 | on: 4 | #push: 5 | workflow_dispatch: 6 | schedule: 7 | - cron: "*/120 * * * *" # Every 120 Mins 8 | env: 9 | RCLONE_CF_R2_PUB: "${{ secrets.RCLONE_CF_R2_PUB }}" 10 | #------------------------------------------------------------------------------------# 11 | jobs: 12 | check: 13 | runs-on: ubuntu-latest 14 | 15 | permissions: 16 | contents: write 17 | 18 | steps: 19 | 20 | - name: Checkout repository 21 | uses: actions/checkout@v4 22 | with: 23 | path: main 24 | filter: "blob:none" 25 | 26 | - name: Setup Env 27 | run: | 28 | ##presets 29 | set +x ; set +e 30 | #-------------# 31 | ##CoreUtils 32 | sudo apt update -y 33 | sudo apt install bc coreutils curl dos2unix fdupes jq moreutils wget -y 34 | sudo apt-get install apt-transport-https apt-utils ca-certificates coreutils dos2unix gnupg2 jq moreutils p7zip-full rename rsync software-properties-common texinfo tmux util-linux wget -y 2>/dev/null ; sudo apt-get update -y 2>/dev/null 35 | #binutils 36 | sudo apt install binutils-aarch64-linux-gnu -y 37 | #libguestfs-tools 38 | sudo apt install libguestfs-tools -y 39 | #qemu 40 | sudo apt install qemu qemu-user-static qemu-utils -y 41 | #temp 42 | SYSTMP="$(dirname $(mktemp -u))" && export SYSTMP="${SYSTMP}" 43 | echo "SYSTMP=${SYSTMP}" >> "${GITHUB_ENV}" 44 | ##Setup rClone 45 | mkdir -p "${HOME}/.config/rclone" 46 | echo "${{ secrets.RCLONE_CF_R2_PUB }}" > "${HOME}/.config/rclone/rclone.conf" 47 | export RCLONE_STATS="120s" ; echo "RCLONE_STATS=${RCLONE_STATS}" >> "${GITHUB_ENV}" 48 | ##User-Agent 49 | USER_AGENT="$(curl -qfsSL 'https://pub.ajam.dev/repos/Azathothas/Wordlists/Misc/User-Agents/ua_chrome_macos_latest.txt')" && export USER_AGENT="${USER_AGENT}" 50 | echo "USER_AGENT=${USER_AGENT}" >> "${GITHUB_ENV}" 51 | continue-on-error: true 52 | 53 | - name: Install Addons 54 | run: | 55 | ##presets 56 | set +x ; set +e 57 | #-------------# 58 | bash <(curl -qfsSL "https://pub.ajam.dev/repos/Azathothas/Arsenal/misc/Linux/install_dev_tools.sh") 59 | continue-on-error: true 60 | 61 | - name: Dos2Unix Everything 62 | run: | 63 | #Presets 64 | set +x ; set +e 65 | #--------------# 66 | cd "${GITHUB_WORKSPACE}/main" 67 | find . -type f ! -path "./.git/*" -exec dos2unix {} \; 2>/dev/null 68 | continue-on-error: true 69 | 70 | - name: ActionLint 71 | run: | 72 | #Presets 73 | set +x ; set +e 74 | #--------------# 75 | cd "${GITHUB_WORKSPACE}/main" 76 | find ".github/workflows" -type f -name "*ml" -exec actionlint {} \; 77 | continue-on-error: true 78 | 79 | - name: Shellcheck 80 | run: | 81 | #Presets 82 | set +x ; set +e 83 | #--------------# 84 | cd "${GITHUB_WORKSPACE}/main" 85 | find ".github" -type f -name '*.sh' -exec shellcheck --exclude="SC2261" --severity="error" "{}" \; 2>/dev/null | tee "${GITHUB_WORKSPACE}/main/.github/shellcheck.txt" 86 | continue-on-error: true 87 | 88 | - name: Generate Repo Metadata (git-sizer) 89 | run: | 90 | #Presets 91 | set +x ; set +e 92 | #--------------# 93 | cd "${GITHUB_WORKSPACE}/main" 94 | #Dust sizes 95 | echo '```mathematica' > "${GITHUB_WORKSPACE}/main/.github/SIZE.md" 96 | dust -b -c -i -r -n 99999999 "${GITHUB_WORKSPACE}/main" | tee -a "${GITHUB_WORKSPACE}/main/.github/SIZE.md" 97 | dust -b -c -i -r -n 99999999 "${GITHUB_WORKSPACE}/main" | tee "${GITHUB_WORKSPACE}/main/.github/SIZE.txt" 98 | echo '```' >> "${GITHUB_WORKSPACE}/main/.github/SIZE.md" 99 | continue-on-error: true 100 | 101 | - name: Git Pull 102 | run: | 103 | cd "${GITHUB_WORKSPACE}/main" && git pull origin main 104 | continue-on-error: true 105 | 106 | - name: Ensure Healthy Commit Nums (RESET ON >= 100000) 107 | run: | 108 | #Presets 109 | set +x ; set +e 110 | #--------------# 111 | pushd "$(mktemp -d)" >/dev/null 2>&1 && git clone --filter="blob:none" "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}" 112 | cd "$(find . -maxdepth 1 -type d -exec basename {} \; | grep -Ev '^\.$' | xargs -I {} realpath {})" 113 | CLONED_DIR="$(realpath .)" && export CLONED_DIR="${CLONED_DIR}" 114 | COMMIT_NUMS="$(git rev-list --count HEAD)" && export COMMIT_NUMS="${COMMIT_NUMS}" 115 | popd >/dev/null 2>&1 ; rm -rf "${CLONED_DIR}" 2>/dev/null 116 | cd "${GITHUB_WORKSPACE}/main" 117 | if [ "${COMMIT_NUMS}" -gt 100000 ]; then 118 | echo -e "\n[+] Total number of commits exceeds 1000. (${COMMIT_NUMS})\n" 119 | cd "${GITHUB_WORKSPACE}/main" 120 | git config "user.name" "Azathothas" 121 | git config "user.email" "AjamX101@gmail.com" 122 | git checkout --orphan temp 123 | git add --all --verbose && git commit -m "Purge (Re:Init)" 124 | git branch -D "main" 125 | git branch -m "main" 126 | git push --set-upstream origin main --force 127 | echo "RESET_HISTORY=YES" >> "${GITHUB_ENV}" 128 | else 129 | echo -e "\n[+] Total number of commits looks healthy. (${COMMIT_NUMS})\n" 130 | echo "RESET_HISTORY=NO" >> "${GITHUB_ENV}" 131 | fi 132 | pushd "${GITHUB_WORKSPACE}/main" >/dev/null 2>&1 && git pull origin main && popd >/dev/null 2>&1 133 | continue-on-error: true 134 | 135 | - uses: stefanzweifel/git-auto-commit-action@v5 136 | with: 137 | repository: ./main 138 | commit_user_name: Azathothas 139 | commit_user_email: AjamX101@gmail.com 140 | #commit_message: "✅ 🐧🧹 🖳🗑️" 141 | commit_message: "‎‎‏‏‎ ‎" 142 | #push_options: '--force' 143 | continue-on-error: true 144 | #------------------------------------------------------------------------------------# 145 | - name: rClone BackUp Repo ("https://pub.ajam.dev/repos/${GITHUB_REPOSITORY}") 146 | run: | 147 | # Presets 148 | set +x ; set +e 149 | #--------------# 150 | #touch "${HOME}/.rclone.conf" 151 | echo "${{ secrets.RCLONE_CF_R2_PUB }}" > "${HOME}/.rclone.conf" 152 | #chdir to Repo 153 | cd "${GITHUB_WORKSPACE}/main" 154 | #Git pull 155 | git pull origin main --no-edit 2>/dev/null 156 | #Del Bloat 157 | rm -rf "$(pwd)/.git" 158 | #Upload to Pub 159 | echo -e "[+] Syncing ${GITHUB_REPOSITORY} to pub.ajam.dev/repos/${GITHUB_REPOSITORY} \n" 160 | rclone sync "." "r2:/pub/repos/${GITHUB_REPOSITORY}/" --user-agent="${USER_AGENT}" --buffer-size="100M" --s3-upload-concurrency="500" --s3-chunk-size="100M" --multi-thread-streams="500" --checkers="2000" --transfers="1000" --check-first --checksum --copy-links --fast-list --progress 161 | continue-on-error: true 162 | #------------------------------------------------------------------------------------# -------------------------------------------------------------------------------- /debian_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/debian_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | #-------------------------------------------------------# 28 | ##Debian (https://hub.docker.com/_/debian) 29 | echo -e "\n[+] Creating debian.FlatImage\n" 30 | #Bootstrap 31 | pushd "$(mktemp -d)" >/dev/null 2>&1 32 | docker stop "debian-slim" 2>/dev/null ; docker rm "debian-slim" 2>/dev/null 33 | docker run --name "debian-slim" --privileged "debian:stable-slim" sh -c "hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null" && docker export "$(docker ps -aqf 'name=debian-slim')" --output "rootfs.tar" 34 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 35 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 36 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 37 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 38 | du -sh "${ROOTFS_DIR}" 39 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 40 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 41 | sudo unlink "${ROOTFS_DIR}/var/lib/dbus/machine-id" 2>/dev/null 42 | sudo unlink "${ROOTFS_DIR}/etc/machine-id" 2>/dev/null 43 | sudo rm -rvf "${ROOTFS_DIR}/etc/machine-id" 44 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'systemd-machine-id-setup --print 2>/dev/null' | sudo tee "${ROOTFS_DIR}/var/lib/dbus/machine-id" 45 | sudo ln --symbolic --force --relative "${ROOTFS_DIR}/var/lib/dbus/machine-id" "${ROOTFS_DIR}/etc/machine-id" 46 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 47 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 48 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 49 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 50 | echo "en_US.UTF-8 UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.gen" 51 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/environment" 52 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'chown -R _apt:root /var/cache/apt/archives/partial/' 53 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'dpkg-statoverride --remove /usr/bin/crontab' 54 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'DEBIAN_FRONTEND="noninteractive" apt update -y' 55 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'DEBIAN_FRONTEND="noninteractive" apt install bash binutils coreutils curl fakeroot git locales sudo wget -y --no-install-recommends --ignore-missing' 56 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'locale-gen "en_US.UTF-8"' 57 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'echo "debconf debconf/frontend select Noninteractive" | debconf-set-selections' 58 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apt purge locales perl -y ; apt autoremove -y ; apt autoclean -y' 59 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apt list --installed' 60 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apt clean -y' 61 | sudo find "${ROOTFS_DIR}/boot" -mindepth 1 -delete 2>/dev/null 62 | sudo find "${ROOTFS_DIR}/dev" -mindepth 1 -delete 2>/dev/null 63 | sudo find "${ROOTFS_DIR}/proc" -mindepth 1 -delete 2>/dev/null 64 | sudo find "${ROOTFS_DIR}/run" -mindepth 1 -delete 2>/dev/null 65 | sudo find "${ROOTFS_DIR}/sys" -mindepth 1 -delete 2>/dev/null 66 | sudo find "${ROOTFS_DIR}/tmp" -mindepth 1 -delete 2>/dev/null 67 | sudo find "${ROOTFS_DIR}/usr/include" -mindepth 1 -delete 2>/dev/null 68 | sudo find "${ROOTFS_DIR}/usr/lib" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 69 | sudo find "${ROOTFS_DIR}/usr/lib32" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 70 | sudo find "${ROOTFS_DIR}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex '.*/\(locale.alias\|en\|en_US\)$' -exec sudo rm -rfv {} + 2>/dev/null 71 | sudo find "${ROOTFS_DIR}/usr/share/doc" -mindepth 1 -delete 2>/dev/null 72 | sudo find "${ROOTFS_DIR}/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 73 | sudo find "${ROOTFS_DIR}/usr/share/help" -mindepth 1 -delete 2>/dev/null 74 | sudo find "${ROOTFS_DIR}/usr/share/info" -mindepth 1 -delete 2>/dev/null 75 | sudo find "${ROOTFS_DIR}/usr/share/man" -mindepth 1 -delete 2>/dev/null 76 | sudo find "${ROOTFS_DIR}" -type d -name '__pycache__' -exec sudo rm -rfv {} \; 2>/dev/null 77 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacnew' -exec sudo rm -rfv {} \; 2>/dev/null 78 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacsave' -exec sudo rm -rfv {} \; 2>/dev/null 79 | sudo find "${ROOTFS_DIR}/var/log" -type f -name '*.log' -exec sudo rm -rfv {} \; 2>/dev/null 80 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/apt/lists/"* 81 | sudo rm -rfv "${ROOTFS_DIR}/var/cache/apt/"* 82 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 83 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 84 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 85 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 86 | du -sh "${ROOTFS_DIR}" 87 | fi 88 | fi 89 | #Setup FS 90 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 91 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 92 | rm -rfv "${FIM_TMPDIR}/debian" 2>/dev/null 93 | mkdir -pv "${FIM_TMPDIR}/debian/fim/config" 94 | mkdir -pv "${FIM_TMPDIR}/debian/fim/static" 95 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/debian" 96 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/debian" && chmod -R 755 "${FIM_TMPDIR}/debian" 97 | #Copy Bins 98 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/debian/fim/static" 99 | #Copy Desktop, Icon & AppStream 100 | mkdir -pv "${FIM_TMPDIR}/debian/fim/desktop" 101 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/debian/fim/desktop/icon.svg" 102 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/debian/fim/desktop/flatimage.xml" 103 | #Create 104 | create_flatimage_base debian || true 105 | #Info 106 | "${FIM_TMPDIR}/debian.flatimage" fim-env add 'FIM_DIST=debian' 2>/dev/null 107 | "${FIM_TMPDIR}/debian.flatimage" fim-env list 2>/dev/null 108 | "${FIM_TMPDIR}/debian.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 109 | "${FIM_TMPDIR}/debian.flatimage" fim-perms list 110 | "${FIM_TMPDIR}/debian.flatimage" fim-commit 111 | fi 112 | unset ROOTFS_DIR 113 | #Copy 114 | if [[ -f "${FIM_TMPDIR}/debian.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/debian.flatimage") -gt 10000 ]]; then 115 | rsync -achLv "${FIM_TMPDIR}/debian.flatimage" "${FIM_IMGDIR}" 116 | realpath "${FIM_IMGDIR}/debian.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 117 | fi 118 | docker rmi "debian:stable-slim" --force 119 | popd >/dev/null 2>&1 120 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /ubuntu_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/ubuntu_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | #-------------------------------------------------------# 28 | ##Ubuntu (phusion/baseimage) 29 | echo -e "\n[+] Creating Ubuntu.FlatImage\n" 30 | #Bootstrap 31 | pushd "$(mktemp -d)" >/dev/null 2>&1 32 | docker stop "ubuntu-phusion" 2>/dev/null ; docker rm "ubuntu-phusion" 2>/dev/null 33 | docker run --name "ubuntu-phusion" --privileged "phusion/baseimage:noble-1.0.0" sh -c "hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null" && docker export "$(docker ps -aqf 'name=ubuntu-phusion')" --output "rootfs.tar" 34 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 35 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 36 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 37 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 38 | du -sh "${ROOTFS_DIR}" 39 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 40 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 41 | sudo unlink "${ROOTFS_DIR}/var/lib/dbus/machine-id" 2>/dev/null 42 | sudo unlink "${ROOTFS_DIR}/etc/machine-id" 2>/dev/null 43 | sudo rm -rvf "${ROOTFS_DIR}/etc/machine-id" 44 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'systemd-machine-id-setup --print 2>/dev/null' | sudo tee "${ROOTFS_DIR}/var/lib/dbus/machine-id" 45 | sudo ln --symbolic --force --relative "${ROOTFS_DIR}/var/lib/dbus/machine-id" "${ROOTFS_DIR}/etc/machine-id" 46 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 47 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 48 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 49 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 50 | echo "en_US.UTF-8 UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.gen" 51 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/environment" 52 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'chown -R _apt:root /var/cache/apt/archives/partial/' 53 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'dpkg-statoverride --remove /usr/bin/crontab' 54 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'DEBIAN_FRONTEND="noninteractive" apt update -y' 55 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'DEBIAN_FRONTEND="noninteractive" apt install bash binutils coreutils curl fakeroot git locales sudo wget -y --no-install-recommends --ignore-missing' 56 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'locale-gen "en_US.UTF-8"' 57 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'echo "debconf debconf/frontend select Noninteractive" | debconf-set-selections' 58 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apt purge locales perl -y ; apt autoremove -y ; apt autoclean -y' 59 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apt list --installed' 60 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'apt clean -y' 61 | sudo find "${ROOTFS_DIR}/boot" -mindepth 1 -delete 2>/dev/null 62 | sudo find "${ROOTFS_DIR}/dev" -mindepth 1 -delete 2>/dev/null 63 | sudo find "${ROOTFS_DIR}/proc" -mindepth 1 -delete 2>/dev/null 64 | sudo find "${ROOTFS_DIR}/run" -mindepth 1 -delete 2>/dev/null 65 | sudo find "${ROOTFS_DIR}/sys" -mindepth 1 -delete 2>/dev/null 66 | sudo find "${ROOTFS_DIR}/tmp" -mindepth 1 -delete 2>/dev/null 67 | sudo find "${ROOTFS_DIR}/usr/include" -mindepth 1 -delete 2>/dev/null 68 | sudo find "${ROOTFS_DIR}/usr/lib" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 69 | sudo find "${ROOTFS_DIR}/usr/lib32" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 70 | sudo find "${ROOTFS_DIR}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex '.*/\(locale.alias\|en\|en_US\)$' -exec sudo rm -rfv {} + 2>/dev/null 71 | sudo find "${ROOTFS_DIR}/usr/share/doc" -mindepth 1 -delete 2>/dev/null 72 | sudo find "${ROOTFS_DIR}/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 73 | sudo find "${ROOTFS_DIR}/usr/share/help" -mindepth 1 -delete 2>/dev/null 74 | sudo find "${ROOTFS_DIR}/usr/share/info" -mindepth 1 -delete 2>/dev/null 75 | sudo find "${ROOTFS_DIR}/usr/share/man" -mindepth 1 -delete 2>/dev/null 76 | sudo find "${ROOTFS_DIR}" -type d -name '__pycache__' -exec sudo rm -rfv {} \; 2>/dev/null 77 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacnew' -exec sudo rm -rfv {} \; 2>/dev/null 78 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacsave' -exec sudo rm -rfv {} \; 2>/dev/null 79 | sudo find "${ROOTFS_DIR}/var/log" -type f -name '*.log' -exec sudo rm -rfv {} \; 2>/dev/null 80 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/apt/lists/"* 81 | sudo rm -rfv "${ROOTFS_DIR}/var/cache/apt/"* 82 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 83 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 84 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 85 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 86 | du -sh "${ROOTFS_DIR}" 87 | fi 88 | fi 89 | #Setup FS 90 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 91 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 92 | rm -rfv "${FIM_TMPDIR}/ubuntu" 2>/dev/null 93 | mkdir -pv "${FIM_TMPDIR}/ubuntu/fim/config" 94 | mkdir -pv "${FIM_TMPDIR}/ubuntu/fim/static" 95 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/ubuntu" 96 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/ubuntu" && chmod -R 755 "${FIM_TMPDIR}/ubuntu" 97 | #Copy Bins 98 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/ubuntu/fim/static" 99 | #Copy Desktop, Icon & AppStream 100 | mkdir -pv "${FIM_TMPDIR}/ubuntu/fim/desktop" 101 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/ubuntu/fim/desktop/icon.svg" 102 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/ubuntu/fim/desktop/flatimage.xml" 103 | #Create 104 | create_flatimage_base ubuntu || true 105 | #Info 106 | "${FIM_TMPDIR}/ubuntu.flatimage" fim-env add 'FIM_DIST=ubuntu' 2>/dev/null 107 | "${FIM_TMPDIR}/ubuntu.flatimage" fim-env list 2>/dev/null 108 | "${FIM_TMPDIR}/ubuntu.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 109 | "${FIM_TMPDIR}/ubuntu.flatimage" fim-perms list 110 | "${FIM_TMPDIR}/ubuntu.flatimage" fim-commit 111 | fi 112 | unset ROOTFS_DIR 113 | #Copy 114 | if [[ -f "${FIM_TMPDIR}/ubuntu.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/ubuntu.flatimage") -gt 10000 ]]; then 115 | rsync -achLv "${FIM_TMPDIR}/ubuntu.flatimage" "${FIM_IMGDIR}" 116 | realpath "${FIM_IMGDIR}/ubuntu.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 117 | fi 118 | docker rmi "phusion/baseimage:noble-1.0.0" --force 119 | popd >/dev/null 2>&1 120 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /void-musl_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/void-musl_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | 28 | #-------------------------------------------------------# 29 | ##Void (musl) 30 | echo -e "\n[+] Creating Void-musl.FlatImage\n" 31 | #Bootstrap 32 | pushd "$(mktemp -d)" >/dev/null 2>&1 33 | docker stop "void-musl" 2>/dev/null ; docker rm "void-musl" 2>/dev/null 34 | docker run --name "void-musl" --privileged "ghcr.io/void-linux/void-musl:latest" sh -c "hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null" && docker export "$(docker ps -aqf 'name=void-musl')" --output "rootfs.tar" 35 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 36 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 37 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 38 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 39 | du -sh "${ROOTFS_DIR}" 40 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 41 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 42 | sudo unlink "${ROOTFS_DIR}/var/lib/dbus/machine-id" 2>/dev/null 43 | sudo unlink "${ROOTFS_DIR}/etc/machine-id" 2>/dev/null 44 | sudo rm -rvf "${ROOTFS_DIR}/etc/machine-id" 45 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'systemd-machine-id-setup --print 2>/dev/null' | sudo tee "${ROOTFS_DIR}/var/lib/dbus/machine-id" 46 | sudo ln --symbolic --force --relative "${ROOTFS_DIR}/var/lib/dbus/machine-id" "${ROOTFS_DIR}/etc/machine-id" 47 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 48 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 49 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 50 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 51 | find "${ROOTFS_DIR}/bin" "${ROOTFS_DIR}/usr/bin" -type l -exec sudo sh -c 'echo "{} -> $(readlink "{}")"' \; 52 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-query --list-repos' 53 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-install --sync --yes' 54 | #packages="alsa-utils alsa-lib alsa-plugins-pulseaudio alsa-ucm-conf bash binutils curl fakeroot git intel-media-driver intel-video-accel libjack-pipewire libpipewire libpulseaudio libva-intel-driver libusb libxkbcommon libxkbcommon-tools libxkbcommon-x11 MangoHud mesa mesa-nouveau-dri mesa-vaapi mesa-vdpau mesa-vulkan-intel mesa-vulkan-lavapipe nv-codec-headers pipewire pulseaudio SDL2 Vulkan-Tools vulkan-loader wget wireplumber xf86-video-nouveau" 55 | #for pkg in $packages; do sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c "xbps-install "$pkg" --sync --update --yes" ; done 56 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-install bash binutils curl fakeroot sudo wget --sync --update --yes' 57 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-install void-repo-multilib void-repo-multilib-nonfree void-repo-nonfree --sync --update --yes' 58 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-query --list-pkgs' 59 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-remove --clean-cache' 60 | sudo find "${ROOTFS_DIR}/boot" -mindepth 1 -delete 2>/dev/null 61 | sudo find "${ROOTFS_DIR}/dev" -mindepth 1 -delete 2>/dev/null 62 | sudo find "${ROOTFS_DIR}/proc" -mindepth 1 -delete 2>/dev/null 63 | sudo find "${ROOTFS_DIR}/run" -mindepth 1 -delete 2>/dev/null 64 | sudo find "${ROOTFS_DIR}/sys" -mindepth 1 -delete 2>/dev/null 65 | sudo find "${ROOTFS_DIR}/tmp" -mindepth 1 -delete 2>/dev/null 66 | sudo find "${ROOTFS_DIR}/usr/include" -mindepth 1 -delete 2>/dev/null 67 | sudo find "${ROOTFS_DIR}/usr/lib" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 68 | sudo find "${ROOTFS_DIR}/usr/lib32" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 69 | sudo find "${ROOTFS_DIR}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex '.*/\(locale.alias\|en\|en_US\)$' -exec sudo rm -rfv {} + 2>/dev/null 70 | sudo find "${ROOTFS_DIR}/usr/share/doc" -mindepth 1 -delete 2>/dev/null 71 | sudo find "${ROOTFS_DIR}/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 72 | sudo find "${ROOTFS_DIR}/usr/share/help" -mindepth 1 -delete 2>/dev/null 73 | sudo find "${ROOTFS_DIR}/usr/share/info" -mindepth 1 -delete 2>/dev/null 74 | sudo find "${ROOTFS_DIR}/usr/share/man" -mindepth 1 -delete 2>/dev/null 75 | sudo find "${ROOTFS_DIR}" -type d -name '__pycache__' -exec sudo rm -rfv {} \; 2>/dev/null 76 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacnew' -exec sudo rm -rfv {} \; 2>/dev/null 77 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacsave' -exec sudo rm -rfv {} \; 2>/dev/null 78 | sudo find "${ROOTFS_DIR}/var/log" -type f -name '*.log' -exec sudo rm -rfv {} \; 2>/dev/null 79 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 80 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 81 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 82 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 83 | du -sh "${ROOTFS_DIR}" 84 | fi 85 | fi 86 | #Setup FS 87 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 88 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 89 | rm -rfv "${FIM_TMPDIR}/void-musl" 2>/dev/null 90 | mkdir -pv "${FIM_TMPDIR}/void-musl/fim/config" 91 | mkdir -pv "${FIM_TMPDIR}/void-musl/fim/static" 92 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/void-musl" 93 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/void-musl" && chmod -R 755 "${FIM_TMPDIR}/void-musl" 94 | #Copy Bins 95 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/void-musl/fim/static" 96 | #Copy Desktop, Icon & AppStream 97 | mkdir -pv "${FIM_TMPDIR}/void-musl/fim/desktop" 98 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/void-musl/fim/desktop/icon.svg" 99 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/void-musl/fim/desktop/flatimage.xml" 100 | #Create 101 | create_flatimage_base void-musl || true 102 | #Info 103 | "${FIM_TMPDIR}/void-musl.flatimage" fim-env add 'FIM_DIST=void-musl' 2>/dev/null 104 | "${FIM_TMPDIR}/void-musl.flatimage" fim-env list 2>/dev/null 105 | "${FIM_TMPDIR}/void-musl.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 106 | "${FIM_TMPDIR}/void-musl.flatimage" fim-perms list 107 | "${FIM_TMPDIR}/void-musl.flatimage" fim-commit 108 | fi 109 | unset ROOTFS_DIR 110 | #Copy 111 | if [[ -f "${FIM_TMPDIR}/void-musl.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/void-musl.flatimage") -gt 10000 ]]; then 112 | rsync -achLv "${FIM_TMPDIR}/void-musl.flatimage" "${FIM_IMGDIR}" 113 | realpath "${FIM_IMGDIR}/void-musl.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 114 | fi 115 | docker rmi "ghcr.io/void-linux/void-musl:latest" --force 116 | popd >/dev/null 2>&1 117 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /void-glibc_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/void-glibc_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | #-------------------------------------------------------# 28 | ##Void (glibc) 29 | echo -e "\n[+] Creating Void-GLIBC.FlatImage\n" 30 | #Bootstrap 31 | pushd "$(mktemp -d)" >/dev/null 2>&1 32 | docker stop "void-glibc" 2>/dev/null ; docker rm "void-glibc" 2>/dev/null 33 | docker run --name "void-glibc" --privileged "ghcr.io/void-linux/void-glibc:latest" sh -c "hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null" && docker export "$(docker ps -aqf 'name=void-glibc')" --output "rootfs.tar" 34 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 35 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 36 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 37 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 38 | du -sh "${ROOTFS_DIR}" 39 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 40 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 41 | sudo unlink "${ROOTFS_DIR}/var/lib/dbus/machine-id" 2>/dev/null 42 | sudo unlink "${ROOTFS_DIR}/etc/machine-id" 2>/dev/null 43 | sudo rm -rvf "${ROOTFS_DIR}/etc/machine-id" 44 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'systemd-machine-id-setup --print 2>/dev/null' | sudo tee "${ROOTFS_DIR}/var/lib/dbus/machine-id" 45 | sudo ln --symbolic --force --relative "${ROOTFS_DIR}/var/lib/dbus/machine-id" "${ROOTFS_DIR}/etc/machine-id" 46 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 47 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 48 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 49 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 50 | find "${ROOTFS_DIR}/bin" "${ROOTFS_DIR}/usr/bin" -type l -exec sudo sh -c 'echo "{} -> $(readlink "{}")"' \; 51 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-query --list-repos' 52 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-install --sync --yes' 53 | #packages="alsa-utils alsa-lib alsa-plugins-pulseaudio alsa-ucm-conf bash binutils curl fakeroot git intel-media-driver intel-video-accel libjack-pipewire libpipewire libpulseaudio libva-intel-driver libusb libxkbcommon libxkbcommon-tools libxkbcommon-x11 MangoHud mesa mesa-nouveau-dri mesa-vaapi mesa-vdpau mesa-vulkan-intel mesa-vulkan-lavapipe nv-codec-headers pipewire pulseaudio SDL2 Vulkan-Tools vulkan-loader wget wireplumber xf86-video-nouveau" 54 | #for pkg in $packages; do sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c "xbps-install "$pkg" --sync --update --yes" ; done 55 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-install bash binutils curl fakeroot sudo wget --sync --update --yes' 56 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-install void-repo-multilib void-repo-multilib-nonfree void-repo-nonfree --sync --update --yes' 57 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-query --list-pkgs' 58 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" /bin/sh -c 'xbps-remove --clean-cache' 59 | sudo find "${ROOTFS_DIR}/boot" -mindepth 1 -delete 2>/dev/null 60 | sudo find "${ROOTFS_DIR}/dev" -mindepth 1 -delete 2>/dev/null 61 | sudo find "${ROOTFS_DIR}/proc" -mindepth 1 -delete 2>/dev/null 62 | sudo find "${ROOTFS_DIR}/run" -mindepth 1 -delete 2>/dev/null 63 | sudo find "${ROOTFS_DIR}/sys" -mindepth 1 -delete 2>/dev/null 64 | sudo find "${ROOTFS_DIR}/tmp" -mindepth 1 -delete 2>/dev/null 65 | sudo find "${ROOTFS_DIR}/usr/include" -mindepth 1 -delete 2>/dev/null 66 | sudo find "${ROOTFS_DIR}/usr/lib" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 67 | sudo find "${ROOTFS_DIR}/usr/lib32" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 68 | sudo find "${ROOTFS_DIR}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex '.*/\(locale.alias\|en\|en_US\)$' -exec sudo rm -rfv {} + 2>/dev/null 69 | sudo find "${ROOTFS_DIR}/usr/share/doc" -mindepth 1 -delete 2>/dev/null 70 | sudo find "${ROOTFS_DIR}/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 71 | sudo find "${ROOTFS_DIR}/usr/share/help" -mindepth 1 -delete 2>/dev/null 72 | sudo find "${ROOTFS_DIR}/usr/share/info" -mindepth 1 -delete 2>/dev/null 73 | sudo find "${ROOTFS_DIR}/usr/share/man" -mindepth 1 -delete 2>/dev/null 74 | sudo find "${ROOTFS_DIR}" -type d -name '__pycache__' -exec sudo rm -rfv {} \; 2>/dev/null 75 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacnew' -exec sudo rm -rfv {} \; 2>/dev/null 76 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacsave' -exec sudo rm -rfv {} \; 2>/dev/null 77 | sudo find "${ROOTFS_DIR}/var/log" -type f -name '*.log' -exec sudo rm -rfv {} \; 2>/dev/null 78 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 79 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 80 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 81 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 82 | du -sh "${ROOTFS_DIR}" 83 | fi 84 | fi 85 | #Setup FS 86 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 87 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 88 | rm -rfv "${FIM_TMPDIR}/void-glibc" 2>/dev/null 89 | mkdir -pv "${FIM_TMPDIR}/void-glibc/fim/config" 90 | mkdir -pv "${FIM_TMPDIR}/void-glibc/fim/static" 91 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/void-glibc" 92 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/void-glibc" && chmod -R 755 "${FIM_TMPDIR}/void-glibc" 93 | #Copy Bins 94 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/void-glibc/fim/static" 95 | #Copy Desktop, Icon & AppStream 96 | mkdir -pv "${FIM_TMPDIR}/void-glibc/fim/desktop" 97 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/void-glibc/fim/desktop/icon.svg" 98 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/void-glibc/fim/desktop/flatimage.xml" 99 | #Create 100 | create_flatimage_base void-glibc || true 101 | #Info 102 | "${FIM_TMPDIR}/void-glibc.flatimage" fim-env add 'FIM_DIST=void-glibc' 2>/dev/null 103 | "${FIM_TMPDIR}/void-glibc.flatimage" fim-env list 2>/dev/null 104 | "${FIM_TMPDIR}/void-glibc.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 105 | "${FIM_TMPDIR}/void-glibc.flatimage" fim-perms list 106 | "${FIM_TMPDIR}/void-glibc.flatimage" fim-commit 107 | fi 108 | unset ROOTFS_DIR 109 | #Copy 110 | if [[ -f "${FIM_TMPDIR}/void-glibc.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/void-glibc.flatimage") -gt 10000 ]]; then 111 | rsync -achLv "${FIM_TMPDIR}/void-glibc.flatimage" "${FIM_IMGDIR}" 112 | realpath "${FIM_IMGDIR}/void-glibc.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 113 | fi 114 | docker rmi "ghcr.io/void-linux/void-glibc:latest" --force 115 | popd >/dev/null 2>&1 116 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /.github/workflows/build_aarch64_Linux.yaml: -------------------------------------------------------------------------------- 1 | name: 🛍️ Build 📀 (aarch64-Linux) FlatImages 📦📀 2 | 3 | on: 4 | workflow_dispatch: 5 | #GH Arm Runners aren't public yet 6 | #schedule: 7 | # - cron: "0 6 * * 3" # @ 06:00 AM UTC (11:45 AM NPT Morning Thu) 8 | jobs: 9 | #------------------------------------------------------------------------------------# 10 | build: 11 | #runs-on: ubuntu-latest 12 | runs-on: aarch64-linux-healthchecker 13 | timeout-minutes: 180 14 | permissions: write-all 15 | 16 | steps: 17 | - name: Checkout repository 18 | uses: actions/checkout@v4 19 | with: 20 | path: main 21 | filter: "blob:none" 22 | 23 | - name: Install Addons 24 | run: | 25 | #presets 26 | set -x ; set +e 27 | #-------------# 28 | bash <(curl -qfsSL "https://pub.ajam.dev/repos/Azathothas/Arsenal/misc/Linux/install_dev_tools.sh") 29 | continue-on-error: true 30 | 31 | - name: Setup Env 32 | run: | 33 | ##presets 34 | set +x ; set +e 35 | #-------------# 36 | ##CoreUtils 37 | sudo apt update -y 38 | sudo apt install bc coreutils curl dos2unix fdupes jq moreutils wget -y 39 | sudo apt-get install apt-transport-https apt-utils ca-certificates coreutils dos2unix gnupg2 jq moreutils p7zip-full rename rsync software-properties-common texinfo tmux util-linux wget -y 2>/dev/null ; sudo apt-get update -y 2>/dev/null 40 | ##tmp 41 | SYSTMP="$(dirname $(mktemp -u))" && export SYSTMP="${SYSTMP}" 42 | #GH ENV 43 | echo "SYSTMP=${SYSTMP}" >> "${GITHUB_ENV}" 44 | #-------------# 45 | mkdir -p "${HOME}/bin" 46 | sudo apt update -y 47 | sudo apt install dos2unix -y 48 | ##User-Agent 49 | USER_AGENT="$(curl -qfsSL 'https://pub.ajam.dev/repos/Azathothas/Wordlists/Misc/User-Agents/ua_chrome_macos_latest.txt')" && export USER_AGENT="${USER_AGENT}" 50 | echo "USER_AGENT=${USER_AGENT}" >> "${GITHUB_ENV}" 51 | continue-on-error: true 52 | 53 | - name: Set up QEMU 54 | uses: docker/setup-qemu-action@v3 55 | continue-on-error: true 56 | 57 | - name: Set up Docker Buildx 58 | uses: docker/setup-buildx-action@v3 59 | continue-on-error: true 60 | 61 | - name: Build 62 | env: 63 | GITHUB_TOKEN: "${{ github.token }}" 64 | run: | 65 | ##presets 66 | set +x ; set +e 67 | #-------------# 68 | pushd "$(mktemp -d)" >/dev/null 2>&1 69 | chmod +x "${GITHUB_WORKSPACE}/main/build.sh" 70 | dos2unix --quiet "${GITHUB_WORKSPACE}/main/build.sh" 71 | shellcheck --exclude="SC2261" --severity="error" "${GITHUB_WORKSPACE}/main/build.sh" 72 | "${GITHUB_WORKSPACE}/main/build.sh" 73 | eget "https://github.com/Jguer/yay" --asset "$(uname -m)" --file "yay" --to "/tmp/FLATIMAGES/yay" 74 | eget "https://github.com/Morganamilo/paru" --asset "$(uname -m)" --file "paru" --to "/tmp/FLATIMAGES/paru" 75 | #Sanity Checks 76 | if [ -d "/tmp/FLATIMAGES" ] && [ "$(find "/tmp/FLATIMAGES" -mindepth 1 -print -quit 2>/dev/null)" ]; then 77 | #Gen Release Notes 78 | cd "/tmp/FLATIMAGES" && find "." -type f | xargs realpath 79 | find "./" -maxdepth 1 -type f | sort | grep -v -E '\.tar$|\.txt$|\.xz$' | xargs file | sort -u -o "./FILE.txt" 80 | find "./" -maxdepth 1 -type f | sort | grep -v -E '\.tar$|\.txt$|\.xz$' | xargs sha256sum | sort -u -o "./SHA256SUM.txt" 81 | #INFO 82 | readarray -d '' FIM_IMGS < <(find "." -name '*.flatimage' -print0) 83 | for FIM_IMG in "${FIM_IMGS[@]}"; do 84 | FIM_IMG_B="${FIM_IMG%.flatimage}" 85 | { 86 | "${FIM_IMG}" fim-root cat "/etc/os-release" 87 | "${FIM_IMG}" fim-root ldd --version 88 | } &> "${FIM_IMG_B}.txt" 89 | done 90 | #GH ENV 91 | export HAS_RELEASE="TRUE" 92 | echo "HAS_RELEASE=${HAS_RELEASE}" >> "${GITHUB_ENV}" 93 | else 94 | export HAS_RELEASE="FALSE" 95 | echo "HAS_RELEASE=${HAS_RELEASE}" >> "${GITHUB_ENV}" 96 | exit 1 97 | fi 98 | continue-on-error: true 99 | 100 | - name: Fail (If Build Failed) 101 | if: env.HAS_RELEASE == 'FALSE' 102 | run: | 103 | #presets 104 | set +x ; set +e 105 | #-------------# 106 | exit 1 107 | continue-on-error: false 108 | 109 | - name: Get Release ENV & Tags 110 | if: env.HAS_RELEASE == 'TRUE' 111 | run: | 112 | #presets 113 | set +x ; set +e 114 | #-------------# 115 | #Arch 116 | B_ARCH="$(uname -m)" && export B_ARCH="${B_ARCH}" 117 | echo "B_ARCH=${B_ARCH}" >> "${GITHUB_ENV}" 118 | #Time 119 | UTC_TIME="$(TZ='UTC' date +'%Y_%m_%d')" 120 | echo "UTC_TIME=${UTC_TIME}" >> "${GITHUB_ENV}" 121 | #VERSION 122 | pushd "$(mktemp -d)" >/dev/null 2>&1 123 | git clone --filter="blob:none" --depth="1" --quiet "https://github.com/ruanformigoni/flatimage" && cd "./flatimage" 124 | FIM_VERSION="$(git tag --sort="-v:refname" | head -n 1 | tr -d "[:space:]")" && export FIM_VERSION="${FIM_VERSION}" 125 | if [[ -z "${FIM_VERSION}" ]]; then 126 | FIM_VERSION="$(git log --oneline --format="%h" | head -n 1 | tr -d "[:space:]")" && export FIM_VERSION="${FIM_VERSION}" 127 | fi 128 | echo "FIM_VERSION=${FIM_VERSION}" >> "${GITHUB_ENV}" 129 | continue-on-error: true 130 | 131 | - name: Create Body for Release 132 | if: env.HAS_RELEASE == 'TRUE' 133 | run: | 134 | #presets 135 | set +x ; set +e 136 | #-------------# 137 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 138 | echo '---' >> "/tmp/RELEASE_NOTE.md" 139 | echo '```console' >> "/tmp/RELEASE_NOTE.md" 140 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 141 | echo -e "[+] --> Metadata (Version: ${FIM_VERSION})" >> "/tmp/RELEASE_NOTE.md" 142 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 143 | cat "/tmp/FLATIMAGES/FILE.txt" >> "/tmp/RELEASE_NOTE.md" 144 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 145 | echo -e "[+] --> SHA256SUM" >> "/tmp/RELEASE_NOTE.md" 146 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 147 | cat "/tmp/FLATIMAGES/SHA256SUM.txt" >> "/tmp/RELEASE_NOTE.md" 148 | echo -e '```\n' >> "/tmp/RELEASE_NOTE.md" 149 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 150 | continue-on-error: true 151 | 152 | #Artifacts 153 | - name: Upload (Build) Artifacts 154 | uses: actions/upload-artifact@v4 155 | with: 156 | name: ARTIFACTS 157 | path: | 158 | /tmp/FLATIMAGES/* 159 | /tmp/ROOTFS/* 160 | compression-level: 0 #no compression, [Default: 6 (GNU Gzip)] 161 | retention-days: 90 #max 162 | overwrite: true 163 | continue-on-error: true 164 | 165 | #continuous 166 | - name: Releaser (Continuous) 167 | if: env.HAS_RELEASE == 'TRUE' 168 | uses: softprops/action-gh-release@v2.2.1 169 | with: 170 | name: "Continuous ${{ env.B_ARCH }}" 171 | tag_name: "${{ env.B_ARCH }}" 172 | prerelease: true 173 | draft: false 174 | generate_release_notes: false 175 | body_path: "/tmp/RELEASE_NOTE.md" 176 | files: | 177 | /tmp/FLATIMAGES/* 178 | /tmp/ROOTFS/* 179 | continue-on-error: true 180 | 181 | #Snapshot 182 | - name: Releaser (Snapshot) 183 | if: env.HAS_RELEASE == 'TRUE' 184 | uses: softprops/action-gh-release@v2.2.1 185 | with: 186 | name: "FLATIMAGE-(${{ env.FIM_VERSION}})-${{ env.UTC_TIME }}-${{ env.B_ARCH }}" 187 | tag_name: "${{ env.UTC_TIME }}-${{ env.B_ARCH }}" 188 | prerelease: false 189 | draft: false 190 | generate_release_notes: false 191 | make_latest: false 192 | body_path: "/tmp/RELEASE_NOTE.md" 193 | files: | 194 | /tmp/FLATIMAGES/* 195 | /tmp/ROOTFS/* 196 | continue-on-error: true -------------------------------------------------------------------------------- /.github/workflows/build_x86_64_Linux.yaml: -------------------------------------------------------------------------------- 1 | name: 🛍️ Build 📀 (x86_64-Linux) FlatImages 📦📀 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: "0 6 * * 3" # @ 06:00 AM UTC (11:45 AM NPT Morning Thu) 7 | jobs: 8 | #------------------------------------------------------------------------------------# 9 | build: 10 | runs-on: ubuntu-latest 11 | timeout-minutes: 180 12 | permissions: write-all 13 | 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v4 17 | with: 18 | path: main 19 | filter: "blob:none" 20 | 21 | - name: Install Addons 22 | run: | 23 | #presets 24 | set -x ; set +e 25 | #-------------# 26 | bash <(curl -qfsSL "https://pub.ajam.dev/repos/Azathothas/Arsenal/misc/Linux/install_dev_tools.sh") 27 | continue-on-error: true 28 | 29 | - name: Setup Env 30 | run: | 31 | ##presets 32 | set +x ; set +e 33 | #-------------# 34 | ##CoreUtils 35 | sudo apt update -y 36 | sudo apt install bc coreutils curl dos2unix fdupes jq moreutils wget -y 37 | sudo apt-get install apt-transport-https apt-utils ca-certificates coreutils dos2unix gnupg2 jq moreutils p7zip-full rename rsync software-properties-common texinfo tmux util-linux wget -y 2>/dev/null ; sudo apt-get update -y 2>/dev/null 38 | ##tmp 39 | SYSTMP="$(dirname $(mktemp -u))" && export SYSTMP="${SYSTMP}" 40 | #GH ENV 41 | echo "SYSTMP=${SYSTMP}" >> "${GITHUB_ENV}" 42 | #-------------# 43 | mkdir -p "${HOME}/bin" 44 | sudo apt update -y 45 | sudo apt install dos2unix -y 46 | ##User-Agent 47 | USER_AGENT="$(curl -qfsSL 'https://pub.ajam.dev/repos/Azathothas/Wordlists/Misc/User-Agents/ua_chrome_macos_latest.txt')" && export USER_AGENT="${USER_AGENT}" 48 | echo "USER_AGENT=${USER_AGENT}" >> "${GITHUB_ENV}" 49 | continue-on-error: true 50 | 51 | - name: Set up QEMU 52 | uses: docker/setup-qemu-action@v3 53 | continue-on-error: true 54 | 55 | - name: Set up Docker Buildx 56 | uses: docker/setup-buildx-action@v3 57 | continue-on-error: true 58 | 59 | - name: Build 60 | env: 61 | GITHUB_TOKEN: "${{ github.token }}" 62 | run: | 63 | ##presets 64 | set +x ; set +e 65 | #-------------# 66 | pushd "$(mktemp -d)" >/dev/null 2>&1 67 | chmod +x "${GITHUB_WORKSPACE}/main/build.sh" 68 | dos2unix --quiet "${GITHUB_WORKSPACE}/main/build.sh" 69 | shellcheck --exclude="SC2261" --severity="error" "${GITHUB_WORKSPACE}/main/build.sh" 70 | "${GITHUB_WORKSPACE}/main/build.sh" 71 | eget "https://github.com/Jguer/yay" --asset "$(uname -m)" --file "yay" --to "/tmp/FLATIMAGES/yay" 72 | eget "https://github.com/Morganamilo/paru" --asset "$(uname -m)" --file "paru" --to "/tmp/FLATIMAGES/paru" 73 | eget "https://github.com/VHSgunzo/runimage-fake-sudo-pkexec" --asset "any" --asset "tar.zst" --download-only --to "/tmp/FLATIMAGES/fake-sudo-pkexec.tar.zst" 74 | #Sanity Checks 75 | if [ -d "/tmp/FLATIMAGES" ] && [ "$(find "/tmp/FLATIMAGES" -mindepth 1 -print -quit 2>/dev/null)" ]; then 76 | #Gen Release Notes 77 | cd "/tmp/FLATIMAGES" && find "." -type f | xargs realpath 78 | find "./" -maxdepth 1 -type f | sort | grep -v -E '\.tar$|\.txt$|\.xz$' | xargs file | sort -u -o "./FILE.txt" 79 | find "./" -maxdepth 1 -type f | sort | grep -v -E '\.tar$|\.txt$|\.xz$' | xargs sha256sum | sort -u -o "./SHA256SUM.txt" 80 | #INFO 81 | readarray -d '' FIM_IMGS < <(find "." -name '*.flatimage' -print0) 82 | for FIM_IMG in "${FIM_IMGS[@]}"; do 83 | FIM_IMG_B="${FIM_IMG%.flatimage}" 84 | { 85 | "${FIM_IMG}" fim-root cat "/etc/os-release" 86 | "${FIM_IMG}" fim-root ldd --version 87 | } &> "${FIM_IMG_B}.txt" 88 | done 89 | #GH ENV 90 | export HAS_RELEASE="TRUE" 91 | echo "HAS_RELEASE=${HAS_RELEASE}" >> "${GITHUB_ENV}" 92 | else 93 | export HAS_RELEASE="FALSE" 94 | echo "HAS_RELEASE=${HAS_RELEASE}" >> "${GITHUB_ENV}" 95 | exit 1 96 | fi 97 | continue-on-error: true 98 | 99 | - name: Fail (If Build Failed) 100 | if: env.HAS_RELEASE == 'FALSE' 101 | run: | 102 | #presets 103 | set +x ; set +e 104 | #-------------# 105 | exit 1 106 | continue-on-error: false 107 | 108 | - name: Get Release ENV & Tags 109 | if: env.HAS_RELEASE == 'TRUE' 110 | run: | 111 | #presets 112 | set +x ; set +e 113 | #-------------# 114 | #Arch 115 | B_ARCH="$(uname -m)" && export B_ARCH="${B_ARCH}" 116 | echo "B_ARCH=${B_ARCH}" >> "${GITHUB_ENV}" 117 | #Time 118 | UTC_TIME="$(TZ='UTC' date +'%Y_%m_%d')" 119 | echo "UTC_TIME=${UTC_TIME}" >> "${GITHUB_ENV}" 120 | #VERSION 121 | pushd "$(mktemp -d)" >/dev/null 2>&1 122 | git clone --filter="blob:none" --depth="1" --quiet "https://github.com/ruanformigoni/flatimage" && cd "./flatimage" 123 | FIM_VERSION="$(git tag --sort="-v:refname" | head -n 1 | tr -d "[:space:]")" && export FIM_VERSION="${FIM_VERSION}" 124 | if [[ -z "${FIM_VERSION}" ]]; then 125 | FIM_VERSION="$(git log --oneline --format="%h" | head -n 1 | tr -d "[:space:]")" && export FIM_VERSION="${FIM_VERSION}" 126 | fi 127 | echo "FIM_VERSION=${FIM_VERSION}" >> "${GITHUB_ENV}" 128 | continue-on-error: true 129 | 130 | - name: Create Body for Release 131 | if: env.HAS_RELEASE == 'TRUE' 132 | run: | 133 | #presets 134 | set +x ; set +e 135 | #-------------# 136 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 137 | echo '---' >> "/tmp/RELEASE_NOTE.md" 138 | echo '```console' >> "/tmp/RELEASE_NOTE.md" 139 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 140 | echo -e "[+] --> Metadata (Version: ${FIM_VERSION})" >> "/tmp/RELEASE_NOTE.md" 141 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 142 | cat "/tmp/FLATIMAGES/FILE.txt" >> "/tmp/RELEASE_NOTE.md" 143 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 144 | echo -e "[+] --> SHA256SUM" >> "/tmp/RELEASE_NOTE.md" 145 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 146 | cat "/tmp/FLATIMAGES/SHA256SUM.txt" >> "/tmp/RELEASE_NOTE.md" 147 | echo -e '```\n' >> "/tmp/RELEASE_NOTE.md" 148 | echo -e "" >> "/tmp/RELEASE_NOTE.md" 149 | continue-on-error: true 150 | 151 | #Artifacts 152 | - name: Upload (Build) Artifacts 153 | uses: actions/upload-artifact@v4 154 | with: 155 | name: ARTIFACTS 156 | path: | 157 | /tmp/FLATIMAGES/* 158 | /tmp/ROOTFS/* 159 | compression-level: 0 #no compression, [Default: 6 (GNU Gzip)] 160 | retention-days: 90 #max 161 | overwrite: true 162 | continue-on-error: true 163 | 164 | #continuous 165 | - name: Releaser (Continuous) 166 | if: env.HAS_RELEASE == 'TRUE' 167 | uses: softprops/action-gh-release@v2.2.1 168 | with: 169 | name: "Continuous ${{ env.B_ARCH }}" 170 | tag_name: "${{ env.B_ARCH }}" 171 | prerelease: true 172 | draft: false 173 | generate_release_notes: false 174 | body_path: "/tmp/RELEASE_NOTE.md" 175 | files: | 176 | /tmp/FLATIMAGES/* 177 | /tmp/ROOTFS/* 178 | continue-on-error: true 179 | 180 | #Snapshot 181 | - name: Releaser (Snapshot) 182 | if: env.HAS_RELEASE == 'TRUE' 183 | uses: softprops/action-gh-release@v2.2.1 184 | with: 185 | name: "FLATIMAGE-(${{ env.FIM_VERSION}})-${{ env.UTC_TIME }}-${{ env.B_ARCH }}" 186 | tag_name: "${{ env.UTC_TIME }}-${{ env.B_ARCH }}" 187 | prerelease: false 188 | draft: false 189 | generate_release_notes: false 190 | make_latest: false 191 | body_path: "/tmp/RELEASE_NOTE.md" 192 | files: | 193 | /tmp/FLATIMAGES/* 194 | /tmp/ROOTFS/* 195 | continue-on-error: true -------------------------------------------------------------------------------- /eweos_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/eweos_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | 28 | #-------------------------------------------------------# 29 | ##eweos 30 | echo -e "\n[+] Creating eweos.FlatImage\n" 31 | #Bootstrap 32 | pushd "$(mktemp -d)" >/dev/null 2>&1 33 | docker stop "eweos" 2>/dev/null ; docker rm "eweos" 2>/dev/null 34 | docker run --name "eweos" --privileged "ghcr.io/eweos/docker:nightly" bash -l -c ' 35 | #Bootstrap 36 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm --debug 37 | packages="bash binutils curl fakechroot fakeroot git wget" 38 | for pkg in $packages; do pacman -Sy "$pkg" --noconfirm ; done 39 | for pkg in $packages; do pacman -Sy "$pkg" --needed --noconfirm ; done 40 | #Fix & Patches 41 | sed '\''/DownloadUser/d'\'' -i "/etc/pacman.conf" 42 | #sed '\''s/^.*Architecture\s*=.*$/Architecture = auto/'\'' -i "/etc/pacman.conf" 43 | sed '\''0,/^.*SigLevel\s*=.*/s//SigLevel = Never/'\'' -i "/etc/pacman.conf" 44 | #sed '\''s/^.*SigLevel\s*=.*$/SigLevel = Never/'\'' -i "/etc/pacman.conf" 45 | sed '\''/#\[multilib\]/,/#Include = .*/s/^#//'\'' -i "/etc/pacman.conf" 46 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | tee "/etc/resolv.conf" 47 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | tee -a "/etc/resolv.conf" 48 | unlink "/var/lib/dbus/machine-id" 2>/dev/null 49 | unlink "/etc/machine-id" 2>/dev/null 50 | rm -rvf "/etc/machine-id" 51 | systemd-machine-id-setup --print 2>/dev/null | tee "/var/lib/dbus/machine-id" 52 | cat "/var/lib/dbus/machine-id" | tee "/etc/machine-id" 53 | pacman -Scc --noconfirm 54 | echo "disable-scdaemon" | tee "/etc/pacman.d/gnupg/gpg-agent.conf" 55 | curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_hooks.sh" -o "/arch_hooks.sh" 56 | chmod +x "/arch_hooks.sh" ; "/arch_hooks.sh" 57 | rm -rfv "/arch_hooks.sh" 58 | echo "LANG=en_US.UTF-8" | tee "/etc/locale.conf" 59 | echo "LANG=en_US.UTF-8" | tee -a "/etc/locale.conf" 60 | echo "LANGUAGE=en_US:en" | tee -a "/etc/locale.conf" 61 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/locale.conf" 62 | echo "en_US.UTF-8 UTF-8" | tee -a "/etc/locale.gen" 63 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/environment" 64 | locale-gen ; locale-gen "en_US.UTF-8" 65 | #Cleanup 66 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm 67 | pacman -Rsn base-devel --noconfirm 68 | pacman -Rsn perl --noconfirm 69 | pacman -Rsn python --noconfirm 70 | pacman -Scc --noconfirm 71 | #Fake-Sudo 72 | pacman -Rsndd sudo 2>/dev/null 73 | rm -rvf "/usr/bin/sudo" 2>/dev/null 74 | curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/fake-sudo-pkexec.tar.zst" -o "./fake-sudo-pkexec.tar.zst" && chmod +x "./fake-sudo-pkexec.tar.zst" 75 | pacman -Uddd "./fake-sudo-pkexec.tar.zst" --noconfirm 76 | pacman -Syy fakeroot --needed --noconfirm 77 | rm -rvf "./fake-sudo-pkexec.tar.zst" 78 | ##Yay 79 | # curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/yay" -o "/usr/bin/yay" && chmod +x "/usr/bin/yay" 80 | # yay --version ; which fakeroot yay sudo 81 | #More cleanup 82 | rm -rfv "/usr/share/gtk-doc/"* 2>/dev/null 83 | rm -rfv "/usr/share/man/"* 2>/dev/null 84 | rm -rfv "/usr/share/help/"* 2>/dev/null 85 | rm -rfv "/usr/share/info/"* 2>/dev/null 86 | rm -rfv "/usr/share/doc/"* 2>/dev/null 87 | rm -rfv "/var/tmp/"* 2>/dev/null 88 | rm -rfv "/var/lib/pacman/sync/"* 2>/dev/null 89 | rm -rfv "/var/cache/pacman/pkg/"* 2>/dev/null 90 | find "/boot" -mindepth 1 -delete 2>/dev/null 91 | find "/dev" -mindepth 1 -delete 2>/dev/null 92 | find "/proc" -mindepth 1 -delete 2>/dev/null 93 | find "/run" -mindepth 1 -delete 2>/dev/null 94 | find "/sys" -mindepth 1 -delete 2>/dev/null 95 | find "/tmp" -mindepth 1 -delete 2>/dev/null 96 | find "/usr/include" -mindepth 1 -delete 2>/dev/null 97 | find "/usr/lib" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 98 | find "/usr/lib32" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 99 | find "/etc/pacman.d/gnupg" -type f -name "S.*" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 100 | find "/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex ".*/\(locale.alias\|en\|en_US\)$" -exec rm -rfv "{}" + 2>/dev/null 101 | find "/usr/share/doc" -mindepth 1 -delete 2>/dev/null 102 | find "/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 103 | find "/usr/share/help" -mindepth 1 -delete 2>/dev/null 104 | find "/usr/share/info" -mindepth 1 -delete 2>/dev/null 105 | find "/usr/share/man" -mindepth 1 -delete 2>/dev/null 106 | find "." -type d -name "__pycache__" -exec rm -rfv "{}" \; 2>/dev/null 107 | find "." -type f -name "*.pacnew" -exec rm -rfv "{}" \; 2>/dev/null 108 | find "." -type f -name "*.pacsave" -exec rm -rfv "{}" \; 2>/dev/null 109 | find "/var/log" -type f -name "*.log" -exec rm -rfv "{}" \; 2>/dev/null 110 | rm -rfv "/"{tmp,proc,sys,dev,run} 2>/dev/null 111 | mkdir -pv "/"{tmp,proc,sys,dev,run/media,mnt,media,home} 2>/dev/null 112 | rm -fv ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 113 | touch ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 114 | hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null' 115 | docker export "$(docker ps -aqf 'name=eweos')" --output "rootfs.tar" 116 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 117 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 118 | rsync -achLv --mkpath "./rootfs.tar" "/tmp/ROOTFS/eweos.rootfs.tar" 119 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 120 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 121 | du -sh "${ROOTFS_DIR}" 122 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm' 123 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 124 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 125 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 126 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 127 | du -sh "${ROOTFS_DIR}" 128 | fi 129 | fi 130 | #Setup FS 131 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 132 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 133 | rm -rfv "${FIM_TMPDIR}/eweos" 2>/dev/null 134 | mkdir -pv "${FIM_TMPDIR}/eweos/fim/config" 135 | mkdir -pv "${FIM_TMPDIR}/eweos/fim/static" 136 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/eweos" 137 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/eweos" && chmod -R 755 "${FIM_TMPDIR}/eweos" 138 | #Copy Bins 139 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/eweos/fim/static" 140 | #Copy Desktop, Icon & AppStream 141 | mkdir -pv "${FIM_TMPDIR}/eweos/fim/desktop" 142 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/eweos/fim/desktop/icon.svg" 143 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/eweos/fim/desktop/flatimage.xml" 144 | #Create 145 | create_flatimage_base eweos || true 146 | #Info 147 | "${FIM_TMPDIR}/eweos.flatimage" fim-env add 'FIM_DIST=eweos' 2>/dev/null 148 | "${FIM_TMPDIR}/eweos.flatimage" fim-env list 2>/dev/null 149 | "${FIM_TMPDIR}/eweos.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 150 | "${FIM_TMPDIR}/eweos.flatimage" fim-perms list 151 | "${FIM_TMPDIR}/eweos.flatimage" fim-commit 152 | fi 153 | unset ROOTFS_DIR 154 | #Copy 155 | if [[ -f "${FIM_TMPDIR}/eweos.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/eweos.flatimage") -gt 10000 ]]; then 156 | rsync -achLv "${FIM_TMPDIR}/eweos.flatimage" "${FIM_IMGDIR}" 157 | realpath "${FIM_IMGDIR}/eweos.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 158 | fi 159 | docker rmi "ghcr.io/eweos/docker:nightly" --force 160 | popd >/dev/null 2>&1 161 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /archlinux_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | #-------------------------------------------------------# 28 | ##ArchLinux 29 | echo -e "\n[+] Creating ArchLinux.FlatImage\n" 30 | #Bootstrap 31 | pushd "$(mktemp -d)" >/dev/null 2>&1 32 | docker stop "archlinux" 2>/dev/null ; docker rm "archlinux" 2>/dev/null 33 | docker run --name "archlinux" --privileged "azathothas/archlinux:latest" bash -l -c ' 34 | #Bootstrap 35 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm --debug 36 | packages="bash binutils curl fakechroot fakeroot git wget" 37 | for pkg in $packages; do pacman -Sy "$pkg" --noconfirm ; done 38 | for pkg in $packages; do pacman -Sy "$pkg" --needed --noconfirm ; done 39 | #Mirrors 40 | #wget "https://bin.ajam.dev/$(uname -m)/rate-mirrors" -O "./rate-mirrors" && chmod +x "./rate-mirrors" 41 | #if [ "$(uname -m)" == "aarch64" ]; then 42 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" archlinux 43 | #elif [ "$(uname -m)" == "x86_64" ]; then 44 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" archlinux 45 | #fi 46 | #cat "./mirrors.txt" | tee "/etc/pacman.d/mirrorlist" 47 | #Fix & Patches 48 | sed '\''/DownloadUser/d'\'' -i "/etc/pacman.conf" 49 | #sed '\''s/^.*Architecture\s*=.*$/Architecture = auto/'\'' -i "/etc/pacman.conf" 50 | sed '\''0,/^.*SigLevel\s*=.*/s//SigLevel = Never/'\'' -i "/etc/pacman.conf" 51 | #sed '\''s/^.*SigLevel\s*=.*$/SigLevel = Never/'\'' -i "/etc/pacman.conf" 52 | sed '\''/#\[multilib\]/,/#Include = .*/s/^#//'\'' -i "/etc/pacman.conf" 53 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | tee "/etc/resolv.conf" 54 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | tee -a "/etc/resolv.conf" 55 | unlink "/var/lib/dbus/machine-id" 2>/dev/null 56 | unlink "/etc/machine-id" 2>/dev/null 57 | rm -rvf "/etc/machine-id" 58 | systemd-machine-id-setup --print 2>/dev/null | tee "/var/lib/dbus/machine-id" 59 | cat "/var/lib/dbus/machine-id" | tee "/etc/machine-id" 60 | pacman -Scc --noconfirm 61 | echo "disable-scdaemon" | tee "/etc/pacman.d/gnupg/gpg-agent.conf" 62 | curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_hooks.sh" -o "/arch_hooks.sh" 63 | chmod +x "/arch_hooks.sh" ; "/arch_hooks.sh" 64 | rm -rfv "/arch_hooks.sh" 65 | echo "LANG=en_US.UTF-8" | tee "/etc/locale.conf" 66 | echo "LANG=en_US.UTF-8" | tee -a "/etc/locale.conf" 67 | echo "LANGUAGE=en_US:en" | tee -a "/etc/locale.conf" 68 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/locale.conf" 69 | echo "en_US.UTF-8 UTF-8" | tee -a "/etc/locale.gen" 70 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/environment" 71 | locale-gen ; locale-gen "en_US.UTF-8" 72 | #Cleanup 73 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm 74 | pacman -Rsn base-devel --noconfirm 75 | pacman -Rsn perl --noconfirm 76 | pacman -Rsn python --noconfirm 77 | pacman -Scc --noconfirm 78 | #Fake-Sudo 79 | pacman -Rsndd sudo 2>/dev/null 80 | rm -rvf "/usr/bin/sudo" 2>/dev/null 81 | curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/fake-sudo-pkexec.tar.zst" -o "./fake-sudo-pkexec.tar.zst" && chmod +x "./fake-sudo-pkexec.tar.zst" 82 | pacman -Uddd "./fake-sudo-pkexec.tar.zst" --noconfirm 83 | pacman -Syy fakeroot --needed --noconfirm 84 | rm -rvf "./fake-sudo-pkexec.tar.zst" 85 | #Yay 86 | curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/yay" -o "/usr/bin/yay" && chmod +x "/usr/bin/yay" 87 | yay --version ; which fakeroot yay sudo 88 | #More cleanup 89 | rm -rfv "/usr/share/gtk-doc/"* 2>/dev/null 90 | rm -rfv "/usr/share/man/"* 2>/dev/null 91 | rm -rfv "/usr/share/help/"* 2>/dev/null 92 | rm -rfv "/usr/share/info/"* 2>/dev/null 93 | rm -rfv "/usr/share/doc/"* 2>/dev/null 94 | rm -rfv "/var/tmp/"* 2>/dev/null 95 | rm -rfv "/var/lib/pacman/sync/"* 2>/dev/null 96 | rm -rfv "/var/cache/pacman/pkg/"* 2>/dev/null 97 | find "/boot" -mindepth 1 -delete 2>/dev/null 98 | find "/dev" -mindepth 1 -delete 2>/dev/null 99 | find "/proc" -mindepth 1 -delete 2>/dev/null 100 | find "/run" -mindepth 1 -delete 2>/dev/null 101 | find "/sys" -mindepth 1 -delete 2>/dev/null 102 | find "/tmp" -mindepth 1 -delete 2>/dev/null 103 | find "/usr/include" -mindepth 1 -delete 2>/dev/null 104 | find "/usr/lib" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 105 | find "/usr/lib32" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 106 | find "/etc/pacman.d/gnupg" -type f -name "S.*" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 107 | find "/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex ".*/\(locale.alias\|en\|en_US\)$" -exec rm -rfv "{}" + 2>/dev/null 108 | find "/usr/share/doc" -mindepth 1 -delete 2>/dev/null 109 | find "/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 110 | find "/usr/share/help" -mindepth 1 -delete 2>/dev/null 111 | find "/usr/share/info" -mindepth 1 -delete 2>/dev/null 112 | find "/usr/share/man" -mindepth 1 -delete 2>/dev/null 113 | find "." -type d -name "__pycache__" -exec rm -rfv "{}" \; 2>/dev/null 114 | find "." -type f -name "*.pacnew" -exec rm -rfv "{}" \; 2>/dev/null 115 | find "." -type f -name "*.pacsave" -exec rm -rfv "{}" \; 2>/dev/null 116 | find "/var/log" -type f -name "*.log" -exec rm -rfv "{}" \; 2>/dev/null 117 | rm -rfv "/"{tmp,proc,sys,dev,run} 2>/dev/null 118 | mkdir -pv "/"{tmp,proc,sys,dev,run/media,mnt,media,home} 2>/dev/null 119 | rm -fv ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 120 | touch ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 121 | hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null' 122 | docker export "$(docker ps -aqf 'name=archlinux')" --output "rootfs.tar" 123 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 124 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 125 | rsync -achLv --mkpath "./rootfs.tar" "/tmp/ROOTFS/archlinux.rootfs.tar" 126 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 127 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 128 | du -sh "${ROOTFS_DIR}" 129 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm' 130 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 131 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 132 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 133 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 134 | du -sh "${ROOTFS_DIR}" 135 | fi 136 | fi 137 | #Setup FS 138 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 139 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 140 | rm -rfv "${FIM_TMPDIR}/archlinux" 2>/dev/null 141 | mkdir -pv "${FIM_TMPDIR}/archlinux/fim/config" 142 | mkdir -pv "${FIM_TMPDIR}/archlinux/fim/static" 143 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/archlinux" 144 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/archlinux" && chmod -R 755 "${FIM_TMPDIR}/archlinux" 145 | #Copy Bins 146 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/archlinux/fim/static" 147 | #Copy Desktop, Icon & AppStream 148 | mkdir -pv "${FIM_TMPDIR}/archlinux/fim/desktop" 149 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/archlinux/fim/desktop/icon.svg" 150 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/archlinux/fim/desktop/flatimage.xml" 151 | #Create 152 | create_flatimage_base archlinux || true 153 | #Info 154 | "${FIM_TMPDIR}/archlinux.flatimage" fim-env add 'FIM_DIST=archlinux' 2>/dev/null 155 | "${FIM_TMPDIR}/archlinux.flatimage" fim-env list 2>/dev/null 156 | "${FIM_TMPDIR}/archlinux.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 157 | "${FIM_TMPDIR}/archlinux.flatimage" fim-perms list 158 | "${FIM_TMPDIR}/archlinux.flatimage" fim-commit 159 | fi 160 | unset ROOTFS_DIR 161 | #Copy 162 | if [[ -f "${FIM_TMPDIR}/archlinux.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/archlinux.flatimage") -gt 10000 ]]; then 163 | rsync -achLv "${FIM_TMPDIR}/archlinux.flatimage" "${FIM_IMGDIR}" 164 | realpath "${FIM_IMGDIR}/archlinux.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 165 | fi 166 | docker rmi "archlinux/archlinux:latest" --force 167 | popd >/dev/null 2>&1 168 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /cachyos_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/cachyos_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | ## No aarch64 docker yet: https://hub.docker.com/r/cachyos/cachyos/tags 28 | ## Official Response: https://discuss.cachyos.org/t/arm-future-for-cachyos/727/2 29 | ## https://github.com/CachyOS/docker 30 | if [ "$(uname -m)" == "aarch64" ]; then 31 | exit 0 32 | fi 33 | 34 | 35 | #-------------------------------------------------------# 36 | ##CachyOS 37 | echo -e "\n[+] Creating CachyOS.FlatImage\n" 38 | #Bootstrap 39 | pushd "$(mktemp -d)" >/dev/null 2>&1 40 | docker stop "cachyos" 2>/dev/null ; docker rm "cachyos" 2>/dev/null 41 | docker run --name "cachyos" --privileged "cachyos/cachyos-v3:latest" bash -l -c ' 42 | #Bootstrap 43 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm --debug 44 | packages="bash binutils curl fakechroot fakeroot git wget" 45 | for pkg in $packages; do pacman -Sy "$pkg" --noconfirm ; done 46 | for pkg in $packages; do pacman -Sy "$pkg" --needed --noconfirm ; done 47 | #Mirrors 48 | #wget "https://bin.ajam.dev/$(uname -m)/rate-mirrors" -O "./rate-mirrors" && chmod +x "./rate-mirrors" 49 | #if [ "$(uname -m)" == "aarch64" ]; then 50 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" cachyos 51 | #elif [ "$(uname -m)" == "x86_64" ]; then 52 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" cachyos 53 | #fi 54 | #cat "./mirrors.txt" | tee "/etc/pacman.d/mirrorlist" 55 | #Fix & Patches 56 | sed '\''/DownloadUser/d'\'' -i "/etc/pacman.conf" 57 | #sed '\''s/^.*Architecture\s*=.*$/Architecture = auto/'\'' -i "/etc/pacman.conf" 58 | sed '\''0,/^.*SigLevel\s*=.*/s//SigLevel = Never/'\'' -i "/etc/pacman.conf" 59 | #sed '\''s/^.*SigLevel\s*=.*$/SigLevel = Never/'\'' -i "/etc/pacman.conf" 60 | sed '\''/#\[multilib\]/,/#Include = .*/s/^#//'\'' -i "/etc/pacman.conf" 61 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | tee "/etc/resolv.conf" 62 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | tee -a "/etc/resolv.conf" 63 | unlink "/var/lib/dbus/machine-id" 2>/dev/null 64 | unlink "/etc/machine-id" 2>/dev/null 65 | rm -rvf "/etc/machine-id" 66 | systemd-machine-id-setup --print 2>/dev/null | tee "/var/lib/dbus/machine-id" 67 | cat "/var/lib/dbus/machine-id" | tee "/etc/machine-id" 68 | pacman -Scc --noconfirm 69 | echo "disable-scdaemon" | tee "/etc/pacman.d/gnupg/gpg-agent.conf" 70 | curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_hooks.sh" -o "/arch_hooks.sh" 71 | chmod +x "/arch_hooks.sh" ; "/arch_hooks.sh" 72 | rm -rfv "/arch_hooks.sh" 73 | echo "LANG=en_US.UTF-8" | tee "/etc/locale.conf" 74 | echo "LANG=en_US.UTF-8" | tee -a "/etc/locale.conf" 75 | echo "LANGUAGE=en_US:en" | tee -a "/etc/locale.conf" 76 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/locale.conf" 77 | echo "en_US.UTF-8 UTF-8" | tee -a "/etc/locale.gen" 78 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/environment" 79 | locale-gen ; locale-gen "en_US.UTF-8" 80 | #Cleanup 81 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm 82 | pacman -Rsn base-devel --noconfirm 83 | pacman -Rsn perl --noconfirm 84 | pacman -Rsn python --noconfirm 85 | pacman -Scc --noconfirm 86 | #Fake-Sudo 87 | pacman -Rsndd sudo 2>/dev/null 88 | rm -rvf "/usr/bin/sudo" 2>/dev/null 89 | curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/fake-sudo-pkexec.tar.zst" -o "./fake-sudo-pkexec.tar.zst" && chmod +x "./fake-sudo-pkexec.tar.zst" 90 | pacman -Uddd "./fake-sudo-pkexec.tar.zst" --noconfirm 91 | pacman -Syy fakeroot --needed --noconfirm 92 | rm -rvf "./fake-sudo-pkexec.tar.zst" 93 | #Yay 94 | curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/yay" -o "/usr/bin/yay" && chmod +x "/usr/bin/yay" 95 | yay --version ; which fakeroot yay sudo 96 | #More cleanup 97 | rm -rfv "/usr/share/gtk-doc/"* 2>/dev/null 98 | rm -rfv "/usr/share/man/"* 2>/dev/null 99 | rm -rfv "/usr/share/help/"* 2>/dev/null 100 | rm -rfv "/usr/share/info/"* 2>/dev/null 101 | rm -rfv "/usr/share/doc/"* 2>/dev/null 102 | rm -rfv "/var/tmp/"* 2>/dev/null 103 | rm -rfv "/var/lib/pacman/sync/"* 2>/dev/null 104 | rm -rfv "/var/cache/pacman/pkg/"* 2>/dev/null 105 | find "/boot" -mindepth 1 -delete 2>/dev/null 106 | find "/dev" -mindepth 1 -delete 2>/dev/null 107 | find "/proc" -mindepth 1 -delete 2>/dev/null 108 | find "/run" -mindepth 1 -delete 2>/dev/null 109 | find "/sys" -mindepth 1 -delete 2>/dev/null 110 | find "/tmp" -mindepth 1 -delete 2>/dev/null 111 | find "/usr/include" -mindepth 1 -delete 2>/dev/null 112 | find "/usr/lib" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 113 | find "/usr/lib32" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 114 | find "/etc/pacman.d/gnupg" -type f -name "S.*" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 115 | find "/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex ".*/\(locale.alias\|en\|en_US\)$" -exec rm -rfv "{}" + 2>/dev/null 116 | find "/usr/share/doc" -mindepth 1 -delete 2>/dev/null 117 | find "/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 118 | find "/usr/share/help" -mindepth 1 -delete 2>/dev/null 119 | find "/usr/share/info" -mindepth 1 -delete 2>/dev/null 120 | find "/usr/share/man" -mindepth 1 -delete 2>/dev/null 121 | find "." -type d -name "__pycache__" -exec rm -rfv "{}" \; 2>/dev/null 122 | find "." -type f -name "*.pacnew" -exec rm -rfv "{}" \; 2>/dev/null 123 | find "." -type f -name "*.pacsave" -exec rm -rfv "{}" \; 2>/dev/null 124 | find "/var/log" -type f -name "*.log" -exec rm -rfv "{}" \; 2>/dev/null 125 | rm -rfv "/"{tmp,proc,sys,dev,run} 2>/dev/null 126 | mkdir -pv "/"{tmp,proc,sys,dev,run/media,mnt,media,home} 2>/dev/null 127 | rm -fv ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 128 | touch ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 129 | hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null' 130 | docker export "$(docker ps -aqf 'name=cachyos')" --output "rootfs.tar" 131 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 132 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 133 | rsync -achLv --mkpath "./rootfs.tar" "/tmp/ROOTFS/cachyos.rootfs.tar" 134 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 135 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 136 | du -sh "${ROOTFS_DIR}" 137 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm' 138 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 139 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 140 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 141 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 142 | du -sh "${ROOTFS_DIR}" 143 | fi 144 | fi 145 | #Setup FS 146 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 147 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 148 | rm -rfv "${FIM_TMPDIR}/cachyos" 2>/dev/null 149 | mkdir -pv "${FIM_TMPDIR}/cachyos/fim/config" 150 | mkdir -pv "${FIM_TMPDIR}/cachyos/fim/static" 151 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/cachyos" 152 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/cachyos" && chmod -R 755 "${FIM_TMPDIR}/cachyos" 153 | #Copy Bins 154 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/cachyos/fim/static" 155 | #Copy Desktop, Icon & AppStream 156 | mkdir -pv "${FIM_TMPDIR}/cachyos/fim/desktop" 157 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/cachyos/fim/desktop/icon.svg" 158 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/cachyos/fim/desktop/flatimage.xml" 159 | #Create 160 | create_flatimage_base cachyos || true 161 | #Info 162 | "${FIM_TMPDIR}/cachyos.flatimage" fim-env add 'FIM_DIST=cachyos' 2>/dev/null 163 | "${FIM_TMPDIR}/cachyos.flatimage" fim-env list 2>/dev/null 164 | "${FIM_TMPDIR}/cachyos.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 165 | "${FIM_TMPDIR}/cachyos.flatimage" fim-perms list 166 | "${FIM_TMPDIR}/cachyos.flatimage" fim-commit 167 | fi 168 | unset ROOTFS_DIR 169 | #Copy 170 | if [[ -f "${FIM_TMPDIR}/cachyos.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/cachyos.flatimage") -gt 10000 ]]; then 171 | rsync -achLv "${FIM_TMPDIR}/cachyos.flatimage" "${FIM_IMGDIR}" 172 | realpath "${FIM_IMGDIR}/cachyos.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 173 | fi 174 | docker rmi "cachyos/cachyos-v3:latest" --force 175 | popd >/dev/null 2>&1 176 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /artixlinux_bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/artixlinux_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | 28 | ## No aarch64 docker yet: https://hub.docker.com/r/artixlinux/artixlinux 29 | ## Though it does exist: https://wiki.artixlinux.org/Main/Aarch64 30 | ## https://armtixlinux.org/ 31 | ## https://gitea.artixlinux.org/artixdocker/artixlinux-docker 32 | if [ "$(uname -m)" == "aarch64" ]; then 33 | exit 0 34 | fi 35 | 36 | #-------------------------------------------------------# 37 | ##ArtixLinux 38 | echo -e "\n[+] Creating ArtixLinux.FlatImage\n" 39 | #Bootstrap 40 | pushd "$(mktemp -d)" >/dev/null 2>&1 41 | docker stop "artixlinux" 2>/dev/null ; docker rm "artixlinux" 2>/dev/null 42 | docker run --name "artixlinux" --privileged "artixlinux/artixlinux:latest" bash -l -c ' 43 | #Bootstrap 44 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm --debug 45 | packages="bash binutils curl fakechroot fakeroot git wget" 46 | for pkg in $packages; do pacman -Sy "$pkg" --noconfirm ; done 47 | for pkg in $packages; do pacman -Sy "$pkg" --needed --noconfirm ; done 48 | #Mirrors 49 | #wget "https://bin.ajam.dev/$(uname -m)/rate-mirrors" -O "./rate-mirrors" && chmod +x "./rate-mirrors" 50 | #if [ "$(uname -m)" == "aarch64" ]; then 51 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" artix 52 | #elif [ "$(uname -m)" == "x86_64" ]; then 53 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" artix 54 | #fi 55 | #cat "./mirrors.txt" | tee "/etc/pacman.d/mirrorlist" 56 | #Fix & Patches 57 | sed '\''/DownloadUser/d'\'' -i "/etc/pacman.conf" 58 | #sed '\''s/^.*Architecture\s*=.*$/Architecture = auto/'\'' -i "/etc/pacman.conf" 59 | sed '\''0,/^.*SigLevel\s*=.*/s//SigLevel = Never/'\'' -i "/etc/pacman.conf" 60 | #sed '\''s/^.*SigLevel\s*=.*$/SigLevel = Never/'\'' -i "/etc/pacman.conf" 61 | sed '\''/#\[multilib\]/,/#Include = .*/s/^#//'\'' -i "/etc/pacman.conf" 62 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | tee "/etc/resolv.conf" 63 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | tee -a "/etc/resolv.conf" 64 | unlink "/var/lib/dbus/machine-id" 2>/dev/null 65 | unlink "/etc/machine-id" 2>/dev/null 66 | rm -rvf "/etc/machine-id" 67 | systemd-machine-id-setup --print 2>/dev/null | tee "/var/lib/dbus/machine-id" 68 | cat "/var/lib/dbus/machine-id" | tee "/etc/machine-id" 69 | pacman -Scc --noconfirm 70 | echo "disable-scdaemon" | tee "/etc/pacman.d/gnupg/gpg-agent.conf" 71 | curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_hooks.sh" -o "/arch_hooks.sh" 72 | chmod +x "/arch_hooks.sh" ; "/arch_hooks.sh" 73 | rm -rfv "/arch_hooks.sh" 74 | echo "LANG=en_US.UTF-8" | tee "/etc/locale.conf" 75 | echo "LANG=en_US.UTF-8" | tee -a "/etc/locale.conf" 76 | echo "LANGUAGE=en_US:en" | tee -a "/etc/locale.conf" 77 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/locale.conf" 78 | echo "en_US.UTF-8 UTF-8" | tee -a "/etc/locale.gen" 79 | echo "LC_ALL=en_US.UTF-8" | tee -a "/etc/environment" 80 | locale-gen ; locale-gen "en_US.UTF-8" 81 | #Cleanup 82 | pacman -y --sync --refresh --refresh --sysupgrade --noconfirm 83 | pacman -Rsn base-devel --noconfirm 84 | pacman -Rsn perl --noconfirm 85 | pacman -Rsn python --noconfirm 86 | pacman -Scc --noconfirm 87 | #Fake-Sudo 88 | pacman -Rsndd sudo 2>/dev/null 89 | rm -rvf "/usr/bin/sudo" 2>/dev/null 90 | curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/fake-sudo-pkexec.tar.zst" -o "./fake-sudo-pkexec.tar.zst" && chmod +x "./fake-sudo-pkexec.tar.zst" 91 | pacman -Uddd "./fake-sudo-pkexec.tar.zst" --noconfirm 92 | pacman -Syy fakeroot --needed --noconfirm 93 | rm -rvf "./fake-sudo-pkexec.tar.zst" 94 | #Yay 95 | curl -qfsSL "https://github.com/pkgforge/flatimage-base/releases/download/$(uname -m)/yay" -o "/usr/bin/yay" && chmod +x "/usr/bin/yay" 96 | yay --version ; which fakeroot yay sudo 97 | #More cleanup 98 | rm -rfv "/usr/share/gtk-doc/"* 2>/dev/null 99 | rm -rfv "/usr/share/man/"* 2>/dev/null 100 | rm -rfv "/usr/share/help/"* 2>/dev/null 101 | rm -rfv "/usr/share/info/"* 2>/dev/null 102 | rm -rfv "/usr/share/doc/"* 2>/dev/null 103 | rm -rfv "/var/tmp/"* 2>/dev/null 104 | rm -rfv "/var/lib/pacman/sync/"* 2>/dev/null 105 | rm -rfv "/var/cache/pacman/pkg/"* 2>/dev/null 106 | find "/boot" -mindepth 1 -delete 2>/dev/null 107 | find "/dev" -mindepth 1 -delete 2>/dev/null 108 | find "/proc" -mindepth 1 -delete 2>/dev/null 109 | find "/run" -mindepth 1 -delete 2>/dev/null 110 | find "/sys" -mindepth 1 -delete 2>/dev/null 111 | find "/tmp" -mindepth 1 -delete 2>/dev/null 112 | find "/usr/include" -mindepth 1 -delete 2>/dev/null 113 | find "/usr/lib" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 114 | find "/usr/lib32" -type f -name "*.a" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 115 | find "/etc/pacman.d/gnupg" -type f -name "S.*" -print -exec rm -rfv "{}" 2>/dev/null \; 2>/dev/null 116 | find "/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex ".*/\(locale.alias\|en\|en_US\)$" -exec rm -rfv "{}" + 2>/dev/null 117 | find "/usr/share/doc" -mindepth 1 -delete 2>/dev/null 118 | find "/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 119 | find "/usr/share/help" -mindepth 1 -delete 2>/dev/null 120 | find "/usr/share/info" -mindepth 1 -delete 2>/dev/null 121 | find "/usr/share/man" -mindepth 1 -delete 2>/dev/null 122 | find "." -type d -name "__pycache__" -exec rm -rfv "{}" \; 2>/dev/null 123 | find "." -type f -name "*.pacnew" -exec rm -rfv "{}" \; 2>/dev/null 124 | find "." -type f -name "*.pacsave" -exec rm -rfv "{}" \; 2>/dev/null 125 | find "/var/log" -type f -name "*.log" -exec rm -rfv "{}" \; 2>/dev/null 126 | rm -rfv "/"{tmp,proc,sys,dev,run} 2>/dev/null 127 | mkdir -pv "/"{tmp,proc,sys,dev,run/media,mnt,media,home} 2>/dev/null 128 | rm -fv ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 129 | touch ""/etc/{host.conf,hosts,nsswitch.conf} 2>/dev/null 130 | hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null' 131 | docker export "$(docker ps -aqf 'name=artix')" --output "rootfs.tar" 132 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 133 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 134 | rsync -achLv --mkpath "./rootfs.tar" "/tmp/ROOTFS/artixlinux.rootfs.tar" 135 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 136 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 137 | du -sh "${ROOTFS_DIR}" 138 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm' 139 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 140 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 141 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 142 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,nsswitch.conf} 143 | du -sh "${ROOTFS_DIR}" 144 | fi 145 | fi 146 | #Setup FS 147 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 148 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 149 | rm -rfv "${FIM_TMPDIR}/artix" 2>/dev/null 150 | mkdir -pv "${FIM_TMPDIR}/artix/fim/config" 151 | mkdir -pv "${FIM_TMPDIR}/artix/fim/static" 152 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/artix" 153 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/artix" && chmod -R 755 "${FIM_TMPDIR}/artix" 154 | #Copy Bins 155 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/artix/fim/static" 156 | #Copy Desktop, Icon & AppStream 157 | mkdir -pv "${FIM_TMPDIR}/artix/fim/desktop" 158 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/artix/fim/desktop/icon.svg" 159 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/artix/fim/desktop/flatimage.xml" 160 | #Create 161 | create_flatimage_base artix || true 162 | #Info 163 | "${FIM_TMPDIR}/artix.flatimage" fim-env add 'FIM_DIST=artix' 2>/dev/null 164 | "${FIM_TMPDIR}/artix.flatimage" fim-env list 2>/dev/null 165 | "${FIM_TMPDIR}/artix.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 166 | "${FIM_TMPDIR}/artix.flatimage" fim-perms list 167 | "${FIM_TMPDIR}/artix.flatimage" fim-commit 168 | fi 169 | unset ROOTFS_DIR 170 | #Copy 171 | if [[ -f "${FIM_TMPDIR}/artix.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/artix.flatimage") -gt 10000 ]]; then 172 | rsync -achLv "${FIM_TMPDIR}/artix.flatimage" "${FIM_IMGDIR}" 173 | realpath "${FIM_IMGDIR}/artix.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 174 | fi 175 | docker rmi "artixlinux/artixlinux:latest" --force 176 | popd >/dev/null 2>&1 177 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /artixlinux_bootstrap.sh.old: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/artixlinux_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | 28 | #-------------------------------------------------------# 29 | ##Artix 30 | echo -e "\n[+] Creating Artix.FlatImage\n" 31 | #Bootstrap 32 | pushd "$(mktemp -d)" >/dev/null 2>&1 33 | docker stop "artixlinux" 2>/dev/null ; docker rm "artixlinux" 2>/dev/null 34 | docker run --name "artixlinux" --privileged "artixlinux/artixlinux:latest" sh -c "hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null" && docker export "$(docker ps -aqf 'name=artixlinux')" --output "rootfs.tar" 35 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 36 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 37 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 38 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 39 | du -sh "${ROOTFS_DIR}" 40 | #wget "https://bin.ajam.dev/$(uname -m)/rate-mirrors" -O "./rate-mirrors" && chmod +x "./rate-mirrors" 41 | #if [ "$(uname -m)" == "aarch64" ]; then 42 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" artix 43 | #elif [ "$(uname -m)" == "x86_64" ]; then 44 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" artix 45 | #fi 46 | #cat "./mirrors.txt" | sudo tee "${ROOTFS_DIR}/etc/pacman.d/mirrorlist" 47 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/pacman/sync/"* 48 | sudo rm -rfv "${ROOTFS_DIR}/etc/pacman.d/gnupg/"* 49 | #sudo sed '/DownloadUser/d' -i "${ROOTFS_DIR}/etc/pacman.conf" 50 | #sudo sed 's/^.*Architecture\s*=.*$/Architecture = auto/' -i "${ROOTFS_DIR}/etc/pacman.conf" 51 | sudo sed '0,/^.*SigLevel\s*=.*/s//SigLevel = Never/' -i "${ROOTFS_DIR}/etc/pacman.conf" 52 | #sudo sed 's/^.*SigLevel\s*=.*$/SigLevel = Never/' -i "${ROOTFS_DIR}/etc/pacman.conf" 53 | sudo sed '/#\[multilib\]/,/#Include = .*/s/^#//' -i "${ROOTFS_DIR}/etc/pacman.conf" 54 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 55 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 56 | sudo unlink "${ROOTFS_DIR}/var/lib/dbus/machine-id" 2>/dev/null 57 | sudo unlink "${ROOTFS_DIR}/etc/machine-id" 2>/dev/null 58 | sudo rm -rvf "${ROOTFS_DIR}/etc/machine-id" 59 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'systemd-machine-id-setup --print 2>/dev/null' | sudo tee "${ROOTFS_DIR}/var/lib/dbus/machine-id" 60 | sudo ln --symbolic --force --relative "${ROOTFS_DIR}/var/lib/dbus/machine-id" "${ROOTFS_DIR}/etc/machine-id" 61 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Scc --noconfirm' 62 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Syy artix-keyring archlinux-keyring pacutils --noconfirm' 63 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --init' 64 | echo "disable-scdaemon" | sudo tee "/etc/pacman.d/gnupg/gpg-agent.conf" 65 | #timeout 30s sudo chroot "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --populate artix archlinux' 66 | timeout 30s sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --populate artix archlinux' 67 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm --debug' 68 | sudo curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_hooks.sh" -o "${ROOTFS_DIR}/arch_hooks.sh" 69 | sudo chmod +x "${ROOTFS_DIR}/arch_hooks.sh" 70 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c '"/arch_hooks.sh"' 71 | sudo rm -rfv "${ROOTFS_DIR}/arch_hooks.sh" 72 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 73 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 74 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 75 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 76 | echo "en_US.UTF-8 UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.gen" 77 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/environment" 78 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen' 79 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen "en_US.UTF-8"' 80 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm' 81 | #packages="alsa-lib alsa-plugins alsa-tools alsa-utils binutils fakeroot fakechroot git intel-media-driver lib32-alsa-lib lib32-mesa lib32-alsa-plugins lib32-libpulse libva-intel-driver lib32-libva-intel-driver lib32-libva-mesa-driver lib32-libvdpau lib32-mesa-utils lib32-nvidia-utils lib32-pipewire lib32-pipewire-jack lib32-sdl2 lib32-vulkan-icd-loader lib32-vulkan-intel lib32-vulkan-mesa-layers lib32-vulkan-radeon lib32-libxkbcommon libpulse libusb libva-mesa-driver libva-utils libvdpau libxkbcommon mesa mesa-utils nvidia-prime nvidia-utils pipewire pipewire-alsa pipewire-jack pipewire-pulse sdl2 vulkan-icd-loader vulkan-intel vulkan-mesa-layers vulkan-radeon vulkan-tools wireplumber" 82 | #for pkg in $packages; do sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c "pacman -Sy "$pkg" --needed --noconfirm" ; done 83 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Sy bash binutils curl fakeroot sudo wget --needed --noconfirm' 84 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn base-devel --noconfirm' 85 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn perl --noconfirm' 86 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn python --noconfirm' 87 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Scc --noconfirm' 88 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/gtk-doc/"* 2>/dev/null 89 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/man/"* 2>/dev/null 90 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/help/"* 2>/dev/null 91 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/info/"* 2>/dev/null 92 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/doc/"* 2>/dev/null 93 | sudo rm -rfv "${ROOTFS_DIR}/var/tmp/"* 2>/dev/null 94 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/pacman/sync/"* 2>/dev/null 95 | sudo rm -rfv "${ROOTFS_DIR}/var/cache/pacman/pkg/"* 2>/dev/null 96 | sudo find "${ROOTFS_DIR}/boot" -mindepth 1 -delete 2>/dev/null 97 | sudo find "${ROOTFS_DIR}/dev" -mindepth 1 -delete 2>/dev/null 98 | sudo find "${ROOTFS_DIR}/proc" -mindepth 1 -delete 2>/dev/null 99 | sudo find "${ROOTFS_DIR}/run" -mindepth 1 -delete 2>/dev/null 100 | sudo find "${ROOTFS_DIR}/sys" -mindepth 1 -delete 2>/dev/null 101 | sudo find "${ROOTFS_DIR}/tmp" -mindepth 1 -delete 2>/dev/null 102 | sudo find "${ROOTFS_DIR}/usr/include" -mindepth 1 -delete 2>/dev/null 103 | sudo find "${ROOTFS_DIR}/usr/lib" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 104 | sudo find "${ROOTFS_DIR}/usr/lib32" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 105 | sudo find "${ROOTFS_DIR}/etc/pacman.d/gnupg" -type f -name "S.*" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 106 | sudo find "${ROOTFS_DIR}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex '.*/\(locale.alias\|en\|en_US\)$' -exec sudo rm -rfv {} + 2>/dev/null 107 | sudo find "${ROOTFS_DIR}/usr/share/doc" -mindepth 1 -delete 2>/dev/null 108 | sudo find "${ROOTFS_DIR}/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 109 | sudo find "${ROOTFS_DIR}/usr/share/help" -mindepth 1 -delete 2>/dev/null 110 | sudo find "${ROOTFS_DIR}/usr/share/info" -mindepth 1 -delete 2>/dev/null 111 | sudo find "${ROOTFS_DIR}/usr/share/man" -mindepth 1 -delete 2>/dev/null 112 | sudo find "${ROOTFS_DIR}" -type d -name '__pycache__' -exec sudo rm -rfv {} \; 2>/dev/null 113 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacnew' -exec sudo rm -rfv {} \; 2>/dev/null 114 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacsave' -exec sudo rm -rfv {} \; 2>/dev/null 115 | sudo find "${ROOTFS_DIR}/var/log" -type f -name '*.log' -exec sudo rm -rfv {} \; 2>/dev/null 116 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 117 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 118 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 119 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 120 | du -sh "${ROOTFS_DIR}" 121 | fi 122 | fi 123 | #Setup FS 124 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 125 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 126 | rm -rfv "${FIM_TMPDIR}/artix" 2>/dev/null 127 | mkdir -pv "${FIM_TMPDIR}/artix/fim/config" 128 | mkdir -pv "${FIM_TMPDIR}/artix/fim/static" 129 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/artix" 130 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/artix" && chmod -R 755 "${FIM_TMPDIR}/artix" 131 | #Copy Bins 132 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/artix/fim/static" 133 | #Copy Desktop, Icon & AppStream 134 | mkdir -pv "${FIM_TMPDIR}/artix/fim/desktop" 135 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/artix/fim/desktop/icon.svg" 136 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/artix/fim/desktop/flatimage.xml" 137 | #Create 138 | create_flatimage_base artix || true 139 | #Info 140 | "${FIM_TMPDIR}/artix.flatimage" fim-env add 'FIM_DIST=artix' 2>/dev/null 141 | "${FIM_TMPDIR}/artix.flatimage" fim-env list 2>/dev/null 142 | "${FIM_TMPDIR}/artix.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 143 | "${FIM_TMPDIR}/artix.flatimage" fim-perms list 144 | "${FIM_TMPDIR}/artix.flatimage" fim-commit 145 | fi 146 | unset ROOTFS_DIR 147 | #Copy 148 | if [[ -f "${FIM_TMPDIR}/artix.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/artix.flatimage") -gt 10000 ]]; then 149 | rsync -achLv "${FIM_TMPDIR}/artix.flatimage" "${FIM_IMGDIR}" 150 | realpath "${FIM_IMGDIR}/artix.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 151 | fi 152 | docker rmi "artixlinux/artixlinux:latest" --force 153 | popd >/dev/null 2>&1 154 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /cachyos_bootstrap.sh.old: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/cachyos_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | #-------------------------------------------------------# 28 | ##CachyOS 29 | echo -e "\n[+] Creating CachyOS.FlatImage\n" 30 | #Bootstrap 31 | pushd "$(mktemp -d)" >/dev/null 2>&1 32 | docker stop "cachyos" 2>/dev/null ; docker rm "cachyos" 2>/dev/null 33 | docker run --name "cachyos" --privileged "cachyos/cachyos-v3:latest" sh -c "hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null" && docker export "$(docker ps -aqf 'name=cachyos')" --output "rootfs.tar" 34 | if [[ -f "./rootfs.tar" ]] && [[ $(stat -c%s "./rootfs.tar") -gt 10000 ]]; then 35 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 36 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 37 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 38 | du -sh "${ROOTFS_DIR}" 39 | #wget "https://bin.ajam.dev/$(uname -m)/rate-mirrors" -O "./rate-mirrors" && chmod +x "./rate-mirrors" 40 | #if [ "$(uname -m)" == "aarch64" ]; then 41 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" cachyos 42 | #elif [ "$(uname -m)" == "x86_64" ]; then 43 | # "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" cachyos 44 | #fi 45 | #cat "./mirrors.txt" | sudo tee "${ROOTFS_DIR}/etc/pacman.d/mirrorlist" 46 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/pacman/sync/"* 47 | sudo rm -rfv "${ROOTFS_DIR}/etc/pacman.d/gnupg/"* 48 | #sudo sed '/DownloadUser/d' -i "${ROOTFS_DIR}/etc/pacman.conf" 49 | #sudo sed 's/^.*Architecture\s*=.*$/Architecture = auto/' -i "${ROOTFS_DIR}/etc/pacman.conf" 50 | sudo sed '0,/^.*SigLevel\s*=.*/s//SigLevel = Never/' -i "${ROOTFS_DIR}/etc/pacman.conf" 51 | #sudo sed 's/^.*SigLevel\s*=.*$/SigLevel = Never/' -i "${ROOTFS_DIR}/etc/pacman.conf" 52 | sudo sed '/#\[multilib\]/,/#Include = .*/s/^#//' -i "${ROOTFS_DIR}/etc/pacman.conf" 53 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 54 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 55 | sudo unlink "${ROOTFS_DIR}/var/lib/dbus/machine-id" 2>/dev/null 56 | sudo unlink "${ROOTFS_DIR}/etc/machine-id" 2>/dev/null 57 | sudo rm -rvf "${ROOTFS_DIR}/etc/machine-id" 58 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'systemd-machine-id-setup --print 2>/dev/null' | sudo tee "${ROOTFS_DIR}/var/lib/dbus/machine-id" 59 | sudo ln --symbolic --force --relative "${ROOTFS_DIR}/var/lib/dbus/machine-id" "${ROOTFS_DIR}/etc/machine-id" 60 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Scc --noconfirm' 61 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Syyu archlinux-keyring pacutils --noconfirm' 62 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --init' 63 | echo "disable-scdaemon" | sudo tee "/etc/pacman.d/gnupg/gpg-agent.conf" 64 | #timeout 30s sudo chroot "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --populate cachyos archlinux' 65 | timeout 30s sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --populate' 66 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm --debug' 67 | sudo curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_hooks.sh" -o "${ROOTFS_DIR}/arch_hooks.sh" 68 | sudo chmod +x "${ROOTFS_DIR}/arch_hooks.sh" 69 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c '"/arch_hooks.sh"' 70 | sudo rm -rfv "${ROOTFS_DIR}/arch_hooks.sh" 71 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 72 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 73 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 74 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 75 | echo "en_US.UTF-8 UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.gen" 76 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/environment" 77 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen' 78 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen "en_US.UTF-8"' 79 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm' 80 | #packages="alsa-lib alsa-plugins alsa-tools alsa-utils binutils fakeroot fakechroot git intel-media-driver lib32-alsa-lib lib32-mesa lib32-alsa-plugins lib32-libpulse libva-intel-driver lib32-libva-intel-driver lib32-libva-mesa-driver lib32-libvdpau lib32-mesa-utils lib32-nvidia-utils lib32-pipewire lib32-pipewire-jack lib32-sdl2 lib32-vulkan-icd-loader lib32-vulkan-intel lib32-vulkan-mesa-layers lib32-vulkan-radeon lib32-libxkbcommon libpulse libusb libva-mesa-driver libva-utils libvdpau libxkbcommon mesa mesa-utils nvidia-prime nvidia-utils pipewire pipewire-alsa pipewire-jack pipewire-pulse sdl2 vulkan-icd-loader vulkan-intel vulkan-mesa-layers vulkan-radeon vulkan-tools wireplumber" 81 | #for pkg in $packages; do sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c "pacman -Sy "$pkg" --needed --noconfirm" ; done 82 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Sy bash binutils curl fakeroot sudo wget --needed --noconfirm' 83 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn base-devel --noconfirm' 84 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn perl --noconfirm' 85 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn python --noconfirm' 86 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Scc --noconfirm' 87 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/gtk-doc/"* 2>/dev/null 88 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/man/"* 2>/dev/null 89 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/help/"* 2>/dev/null 90 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/info/"* 2>/dev/null 91 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/doc/"* 2>/dev/null 92 | sudo rm -rfv "${ROOTFS_DIR}/var/tmp/"* 2>/dev/null 93 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/pacman/sync/"* 2>/dev/null 94 | sudo rm -rfv "${ROOTFS_DIR}/var/cache/pacman/pkg/"* 2>/dev/null 95 | sudo find "${ROOTFS_DIR}/boot" -mindepth 1 -delete 2>/dev/null 96 | sudo find "${ROOTFS_DIR}/dev" -mindepth 1 -delete 2>/dev/null 97 | sudo find "${ROOTFS_DIR}/proc" -mindepth 1 -delete 2>/dev/null 98 | sudo find "${ROOTFS_DIR}/run" -mindepth 1 -delete 2>/dev/null 99 | sudo find "${ROOTFS_DIR}/sys" -mindepth 1 -delete 2>/dev/null 100 | sudo find "${ROOTFS_DIR}/tmp" -mindepth 1 -delete 2>/dev/null 101 | sudo find "${ROOTFS_DIR}/usr/include" -mindepth 1 -delete 2>/dev/null 102 | sudo find "${ROOTFS_DIR}/usr/lib" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 103 | sudo find "${ROOTFS_DIR}/usr/lib32" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 104 | sudo find "${ROOTFS_DIR}/etc/pacman.d/gnupg" -type f -name "S.*" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 105 | sudo find "${ROOTFS_DIR}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex '.*/\(locale.alias\|en\|en_US\)$' -exec sudo rm -rfv {} + 2>/dev/null 106 | sudo find "${ROOTFS_DIR}/usr/share/doc" -mindepth 1 -delete 2>/dev/null 107 | sudo find "${ROOTFS_DIR}/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 108 | sudo find "${ROOTFS_DIR}/usr/share/help" -mindepth 1 -delete 2>/dev/null 109 | sudo find "${ROOTFS_DIR}/usr/share/info" -mindepth 1 -delete 2>/dev/null 110 | sudo find "${ROOTFS_DIR}/usr/share/man" -mindepth 1 -delete 2>/dev/null 111 | sudo find "${ROOTFS_DIR}" -type d -name '__pycache__' -exec sudo rm -rfv {} \; 2>/dev/null 112 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacnew' -exec sudo rm -rfv {} \; 2>/dev/null 113 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacsave' -exec sudo rm -rfv {} \; 2>/dev/null 114 | sudo find "${ROOTFS_DIR}/var/log" -type f -name '*.log' -exec sudo rm -rfv {} \; 2>/dev/null 115 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 116 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 117 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 118 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 119 | du -sh "${ROOTFS_DIR}" 120 | fi 121 | fi 122 | #Setup FS 123 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 124 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 125 | rm -rfv "${FIM_TMPDIR}/cachyos" 2>/dev/null 126 | mkdir -pv "${FIM_TMPDIR}/cachyos/fim/config" 127 | mkdir -pv "${FIM_TMPDIR}/cachyos/fim/static" 128 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/cachyos" 129 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/cachyos" && chmod -R 755 "${FIM_TMPDIR}/cachyos" 130 | #Copy Bins 131 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/cachyos/fim/static" 132 | #Copy Desktop, Icon & AppStream 133 | mkdir -pv "${FIM_TMPDIR}/cachyos/fim/desktop" 134 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/cachyos/fim/desktop/icon.svg" 135 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/cachyos/fim/desktop/flatimage.xml" 136 | #Create 137 | create_flatimage_base cachyos || true 138 | #Info 139 | "${FIM_TMPDIR}/cachyos.flatimage" fim-env add 'FIM_DIST=cachyos' 2>/dev/null 140 | "${FIM_TMPDIR}/cachyos.flatimage" fim-env list 2>/dev/null 141 | "${FIM_TMPDIR}/cachyos.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 142 | "${FIM_TMPDIR}/cachyos.flatimage" fim-perms list 143 | "${FIM_TMPDIR}/cachyos.flatimage" fim-commit 144 | fi 145 | unset ROOTFS_DIR 146 | #Copy 147 | if [[ -f "${FIM_TMPDIR}/cachyos.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/cachyos.flatimage") -gt 10000 ]]; then 148 | rsync -achLv "${FIM_TMPDIR}/cachyos.flatimage" "${FIM_IMGDIR}" 149 | realpath "${FIM_IMGDIR}/cachyos.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 150 | fi 151 | docker rmi "cachyos/cachyos-v3:latest" --force 152 | popd >/dev/null 2>&1 153 | #-------------------------------------------------------# -------------------------------------------------------------------------------- /archlinux_bootstrap.sh.old: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ##DO NOT RUN DIRECTLY 4 | ##Self: bash <(curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_bootstrap.sh") 5 | # 6 | #-------------------------------------------------------# 7 | set -x 8 | #Sanity Checks 9 | if [ -z "${FIM_SRCDIR}" ] || \ 10 | [ -z "${FIM_BINDIR}" ] || \ 11 | [ -z "${FIM_IMGDIR}" ]; then 12 | #exit 13 | echo -e "\n[+] Skipping Builds...\n" 14 | exit 1 15 | fi 16 | if [ ! -d "${FIM_BINDIR}" ] || [ $(du -s "${FIM_BINDIR}" | cut -f1) -le 1000 ]; then 17 | echo -e "\n[+] FIM_BINDIR is Empty or Broken\n" 18 | exit 1 19 | fi 20 | if ! declare -F create_flatimage_base >/dev/null; then 21 | echo -e "\n[+] create_flatimage_base Function is undefined\n" 22 | exit 1 23 | fi 24 | set +x 25 | #-------------------------------------------------------# 26 | 27 | 28 | #-------------------------------------------------------# 29 | ##ArchLinux 30 | echo -e "\n[+] Creating ArchLinux.FlatImage\n" 31 | #Bootstrap 32 | pushd "$(mktemp -d)" >/dev/null 2>&1 33 | #docker stop "archlinux" 2>/dev/null ; docker rm "archlinux" 2>/dev/null 34 | #docker run --name "archlinux" --privileged "azathothas/archlinux:latest" sh -c "hostname 2>/dev/null; cat "/etc/os-release" 2>/dev/null" && docker export "$(docker ps -aqf 'name=archlinux')" --output "rootfs.tar" 35 | if [ "$(uname -m)" == "x86_64" ]; then 36 | aria2c "https://pub.ajam.dev/utils/archlinux-$(uname -m)/rootfs.tar.zst" \ 37 | --split="16" --max-connection-per-server="16" --min-split-size="1M" \ 38 | --check-certificate="false" --console-log-level="error" --user-agent="${USER_AGENT}" \ 39 | --max-tries="10" --retry-wait="5" --connect-timeout="60" --timeout="600" \ 40 | --download-result="default" --allow-overwrite --out="./ROOTFS.tar.zst" 2>/dev/null 41 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 42 | bsdtar -x -f "./ROOTFS.tar.zst" -C "${ROOTFS_DIR}" --strip-components=1 2>/dev/null 43 | elif [ "$(uname -m)" == "aarch64" ]; then 44 | aria2c "https://pub.ajam.dev/utils/archlinuxarm-$(uname -m)/rootfs.tar.gz" \ 45 | --split="16" --max-connection-per-server="16" --min-split-size="1M" \ 46 | --check-certificate="false" --console-log-level="error" --user-agent="${USER_AGENT}" \ 47 | --max-tries="10" --retry-wait="5" --connect-timeout="60" --timeout="600" \ 48 | --download-result="default" --allow-overwrite --out="./ROOTFS.tar.gz" 2>/dev/null 49 | mkdir -pv "./rootfs" && export ROOTFS_DIR="$(realpath "./rootfs")" 50 | bsdtar -x -f "./ROOTFS.tar.gz" -C "${ROOTFS_DIR}" 2>/dev/null 51 | fi 52 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 53 | if [ -n "${ROOTFS_DIR+x}" ] && [[ "${ROOTFS_DIR}" == "/tmp"* ]]; then 54 | bsdtar -x -f "./rootfs.tar" -C "${ROOTFS_DIR}" 2>/dev/null 55 | du -sh "${ROOTFS_DIR}" 56 | wget "https://bin.ajam.dev/$(uname -m)/rate-mirrors" -O "./rate-mirrors" && chmod +x "./rate-mirrors" 57 | if [ "$(uname -m)" == "aarch64" ]; then 58 | "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" archarm 59 | elif [ "$(uname -m)" == "x86_64" ]; then 60 | "./rate-mirrors" --allow-root --disable-comments-in-file --save "./mirrors.txt" arch 61 | fi 62 | cat "./mirrors.txt" | sudo tee "${ROOTFS_DIR}/etc/pacman.d/mirrorlist" 63 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/pacman/sync/"* 64 | sudo rm -rfv "${ROOTFS_DIR}/etc/pacman.d/gnupg/"* 65 | sudo sed '/DownloadUser/d' -i "${ROOTFS_DIR}/etc/pacman.conf" 66 | #sudo sed 's/^.*Architecture\s*=.*$/Architecture = auto/' -i "${ROOTFS_DIR}/etc/pacman.conf" 67 | sudo sed '0,/^.*SigLevel\s*=.*/s//SigLevel = Never/' -i "${ROOTFS_DIR}/etc/pacman.conf" 68 | #sudo sed 's/^.*SigLevel\s*=.*$/SigLevel = Never/' -i "${ROOTFS_DIR}/etc/pacman.conf" 69 | sudo sed '/#\[multilib\]/,/#Include = .*/s/^#//' -i "${ROOTFS_DIR}/etc/pacman.conf" 70 | echo -e "nameserver 8.8.8.8\nnameserver 2620:0:ccc::2" | sudo tee "${ROOTFS_DIR}/etc/resolv.conf" 71 | echo -e "nameserver 1.1.1.1\nnameserver 2606:4700:4700::1111" | sudo tee -a "${ROOTFS_DIR}/etc/resolv.conf" 72 | sudo unlink "${ROOTFS_DIR}/var/lib/dbus/machine-id" 2>/dev/null 73 | sudo unlink "${ROOTFS_DIR}/etc/machine-id" 2>/dev/null 74 | sudo rm -rvf "${ROOTFS_DIR}/etc/machine-id" 75 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'systemd-machine-id-setup --print 2>/dev/null' | sudo tee "${ROOTFS_DIR}/var/lib/dbus/machine-id" 76 | sudo ln --symbolic --force --relative "${ROOTFS_DIR}/var/lib/dbus/machine-id" "${ROOTFS_DIR}/etc/machine-id" 77 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Scc --noconfirm' 78 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Syyu archlinux-keyring pacutils --noconfirm' 79 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --init' 80 | echo "disable-scdaemon" | sudo tee "/etc/pacman.d/gnupg/gpg-agent.conf" 81 | #timeout 30s sudo chroot "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --populate archlinux' 82 | timeout 30s sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman-key --populate archlinux' 83 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm --debug' 84 | sudo curl -qfsSL "https://raw.githubusercontent.com/pkgforge/flatimage-base/refs/heads/main/archlinux_hooks.sh" -o "${ROOTFS_DIR}/arch_hooks.sh" 85 | sudo chmod +x "${ROOTFS_DIR}/arch_hooks.sh" 86 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c '"/arch_hooks.sh"' 87 | sudo rm -rfv "${ROOTFS_DIR}/arch_hooks.sh" 88 | echo "LANG=en_US.UTF-8" | sudo tee "${ROOTFS_DIR}/etc/locale.conf" 89 | echo "LANG=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 90 | echo "LANGUAGE=en_US:en" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 91 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.conf" 92 | echo "en_US.UTF-8 UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/locale.gen" 93 | echo "LC_ALL=en_US.UTF-8" | sudo tee -a "${ROOTFS_DIR}/etc/environment" 94 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen' 95 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'locale-gen "en_US.UTF-8"' 96 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -y --sync --refresh --refresh --sysupgrade --noconfirm' 97 | #packages="alsa-lib alsa-plugins alsa-tools alsa-utils binutils fakeroot fakechroot git intel-media-driver lib32-alsa-lib lib32-mesa lib32-alsa-plugins lib32-libpulse libva-intel-driver lib32-libva-intel-driver lib32-libva-mesa-driver lib32-libvdpau lib32-mesa-utils lib32-nvidia-utils lib32-pipewire lib32-pipewire-jack lib32-sdl2 lib32-vulkan-icd-loader lib32-vulkan-intel lib32-vulkan-mesa-layers lib32-vulkan-radeon lib32-libxkbcommon libpulse libusb libva-mesa-driver libva-utils libvdpau libxkbcommon mesa mesa-utils nvidia-prime nvidia-utils pipewire pipewire-alsa pipewire-jack pipewire-pulse sdl2 vulkan-icd-loader vulkan-intel vulkan-mesa-layers vulkan-radeon vulkan-tools wireplumber" 98 | #for pkg in $packages; do sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c "pacman -Sy "$pkg" --needed --noconfirm" ; done 99 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Sy bash binutils curl fakeroot sudo wget --needed --noconfirm' 100 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn base-devel --noconfirm' 101 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn perl --noconfirm' 102 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Rsn python --noconfirm' 103 | sudo "${FIM_BINDIR}/proot" --kill-on-exit -R "${ROOTFS_DIR}" "/bin/bash" -c 'pacman -Scc --noconfirm' 104 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/gtk-doc/"* 2>/dev/null 105 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/man/"* 2>/dev/null 106 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/help/"* 2>/dev/null 107 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/info/"* 2>/dev/null 108 | sudo rm -rfv "${ROOTFS_DIR}/usr/share/doc/"* 2>/dev/null 109 | sudo rm -rfv "${ROOTFS_DIR}/var/tmp/"* 2>/dev/null 110 | sudo rm -rfv "${ROOTFS_DIR}/var/lib/pacman/sync/"* 2>/dev/null 111 | sudo rm -rfv "${ROOTFS_DIR}/var/cache/pacman/pkg/"* 2>/dev/null 112 | sudo find "${ROOTFS_DIR}/boot" -mindepth 1 -delete 2>/dev/null 113 | sudo find "${ROOTFS_DIR}/dev" -mindepth 1 -delete 2>/dev/null 114 | sudo find "${ROOTFS_DIR}/proc" -mindepth 1 -delete 2>/dev/null 115 | sudo find "${ROOTFS_DIR}/run" -mindepth 1 -delete 2>/dev/null 116 | sudo find "${ROOTFS_DIR}/sys" -mindepth 1 -delete 2>/dev/null 117 | sudo find "${ROOTFS_DIR}/tmp" -mindepth 1 -delete 2>/dev/null 118 | sudo find "${ROOTFS_DIR}/usr/include" -mindepth 1 -delete 2>/dev/null 119 | sudo find "${ROOTFS_DIR}/usr/lib" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 120 | sudo find "${ROOTFS_DIR}/usr/lib32" -type f -name "*.a" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 121 | sudo find "${ROOTFS_DIR}/etc/pacman.d/gnupg" -type f -name "S.*" -print -exec sudo rm -rfv {} 2>/dev/null \; 2>/dev/null 122 | sudo find "${ROOTFS_DIR}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -regex '.*/\(locale.alias\|en\|en_US\)$' -exec sudo rm -rfv {} + 2>/dev/null 123 | sudo find "${ROOTFS_DIR}/usr/share/doc" -mindepth 1 -delete 2>/dev/null 124 | sudo find "${ROOTFS_DIR}/usr/share/gtk-doc" -mindepth 1 -delete 2>/dev/null 125 | sudo find "${ROOTFS_DIR}/usr/share/help" -mindepth 1 -delete 2>/dev/null 126 | sudo find "${ROOTFS_DIR}/usr/share/info" -mindepth 1 -delete 2>/dev/null 127 | sudo find "${ROOTFS_DIR}/usr/share/man" -mindepth 1 -delete 2>/dev/null 128 | sudo find "${ROOTFS_DIR}" -type d -name '__pycache__' -exec sudo rm -rfv {} \; 2>/dev/null 129 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacnew' -exec sudo rm -rfv {} \; 2>/dev/null 130 | sudo find "${ROOTFS_DIR}" -type f -name '*.pacsave' -exec sudo rm -rfv {} \; 2>/dev/null 131 | sudo find "${ROOTFS_DIR}/var/log" -type f -name '*.log' -exec sudo rm -rfv {} \; 2>/dev/null 132 | sudo rm -rfv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run} 133 | sudo mkdir -pv "${ROOTFS_DIR}/"{tmp,proc,sys,dev,run/media,mnt,media,home} 134 | sudo rm -fv "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 135 | sudo touch "${ROOTFS_DIR}"/etc/{host.conf,hosts,passwd,group,nsswitch.conf} 136 | du -sh "${ROOTFS_DIR}" 137 | fi 138 | fi 139 | #Setup FS 140 | if [ -d "${ROOTFS_DIR}" ] && [ $(du -s "${ROOTFS_DIR}" | cut -f1) -gt 10000 ]; then 141 | popd >/dev/null 2>&1 ; pushd "${FIM_SRCDIR}" >/dev/null 2>&1 142 | rm -rfv "${FIM_TMPDIR}/archlinux" 2>/dev/null 143 | mkdir -pv "${FIM_TMPDIR}/archlinux/fim/config" 144 | mkdir -pv "${FIM_TMPDIR}/archlinux/fim/static" 145 | sudo rsync -achv --mkpath "${ROOTFS_DIR}/." "${FIM_TMPDIR}/archlinux" 146 | #sudo ln --symbolic --force --verbose "/usr/share" "${FIM_TMPDIR}/archlinux/usr" 147 | sudo chown -R "$(whoami):$(whoami)" "${FIM_TMPDIR}/archlinux" && chmod -R 755 "${FIM_TMPDIR}/archlinux" 148 | #Copy Bins 149 | rsync -achv --mkpath "${FIM_BINDIR}/." "${FIM_TMPDIR}/archlinux/fim/static" 150 | #Copy Desktop, Icon & AppStream 151 | mkdir -pv "${FIM_TMPDIR}/archlinux/fim/desktop" 152 | cp -fv "${FIM_SRCDIR}/mime/icon.svg" "${FIM_TMPDIR}/archlinux/fim/desktop/icon.svg" 153 | cp -fv "${FIM_SRCDIR}/mime/flatimage.xml" "${FIM_TMPDIR}/archlinux/fim/desktop/flatimage.xml" 154 | #Create 155 | create_flatimage_base archlinux || true 156 | #Info 157 | "${FIM_TMPDIR}/archlinux.flatimage" fim-env add 'FIM_DIST=archlinux' 2>/dev/null 158 | "${FIM_TMPDIR}/archlinux.flatimage" fim-env list 2>/dev/null 159 | "${FIM_TMPDIR}/archlinux.flatimage" fim-perms add "audio,dbus_user,dbus_system,gpu,home,input,media,network,udev,usb,xorg,wayland" 160 | "${FIM_TMPDIR}/archlinux.flatimage" fim-perms list 161 | "${FIM_TMPDIR}/archlinux.flatimage" fim-commit 162 | fi 163 | unset ROOTFS_DIR 164 | #Copy 165 | if [[ -f "${FIM_TMPDIR}/archlinux.flatimage" ]] && [[ $(stat -c%s "${FIM_TMPDIR}/archlinux.flatimage") -gt 10000 ]]; then 166 | rsync -achLv "${FIM_TMPDIR}/archlinux.flatimage" "${FIM_IMGDIR}" 167 | realpath "${FIM_IMGDIR}/archlinux.flatimage" | xargs -I {} sh -c 'file {}; sha256sum {}; du -sh {}' 168 | fi 169 | docker rmi "artixlinux/artixlinux:latest" --force 170 | popd >/dev/null 2>&1 171 | #-------------------------------------------------------# --------------------------------------------------------------------------------