├── .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 | > - [](https://github.com/pkgforge/flatimage-base/actions/workflows/healthchecks_housekeeping.yaml)
25 | > - [](https://github.com/pkgforge/flatimage-base/actions/workflows/build_aarch64_Linux.yaml)
26 | > - [](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 | #-------------------------------------------------------#
--------------------------------------------------------------------------------