From a9a8cc2da85c842972d780326e85bf94bf0e0502 Mon Sep 17 00:00:00 2001 From: Zeglius <33781398+Zeglius@users.noreply.github.com> Date: Sat, 21 Jun 2025 19:35:53 +0200 Subject: [PATCH] feat: Bind mount podman container storage to btrfs loopback This allows building more space demanding images Signed-off-by: Zeglius <33781398+Zeglius@users.noreply.github.com> --- .github/workflows/build.yml | 3 +++ .github/workflows/mount_btrfs.sh | 44 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100755 .github/workflows/mount_btrfs.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index db95edd8..0ce7076e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,6 +51,9 @@ jobs: # uses: ublue-os/remove-unwanted-software@517622d6452028f266b7ba4cc9a123b5f58a6b53 # v7 # with: # remove-codeql: true + + - name: Mount BTRFS for podman storage + run: ${{ github.workspace }}/.github/workflows/mount_btrfs.sh - name: Get current date id: date diff --git a/.github/workflows/mount_btrfs.sh b/.github/workflows/mount_btrfs.sh new file mode 100755 index 00000000..702c6744 --- /dev/null +++ b/.github/workflows/mount_btrfs.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -eo pipefail + +BTRFS_TARGET_DIR="${BTRFS_TARGET_DIR:-$( + dir=$(podman system info --format '{{.Store.GraphRoot}}' | sed 's|/storage$||') + mkdir -p "$dir" + echo "$dir" +)}" +# Options used to mount +BTRFS_MOUNT_OPTS=${BTRFS_MOUNT_OPTS:-"compress-force=zstd:2"} +# Location where the loopback file will be placed. +_BTRFS_LOOPBACK_FILE=${_BTRFS_LOOPBACK_FILE:-/mnt/btrfs_loopbacks/$(systemd-escape -p "$BTRFS_TARGET_DIR")} +# Percentage of the total space to use. Max: 1.0, Min: 0.0 +_BTRFS_LOOPBACK_FREE=${_BTRFS_LOOPBACK_FREE:-"0.8"} + +# Result of $(dirname "$_BTRFS_LOOPBACK_FILE") +btrfs_pdir="$(dirname "$_BTRFS_LOOPBACK_FILE")" + +# Install btrfs-progs +sudo apt-get install -y btrfs-progs + +# Create loopback file +sudo mkdir -p "$btrfs_pdir" && sudo chown "$(id -u)":"$(id -g)" "$btrfs_pdir" +_final_size=$( + findmnt --target "$btrfs_pdir" --bytes --df --json | + jq -r --arg freeperc "$_BTRFS_LOOPBACK_FREE" \ + '.filesystems[0].avail * ($freeperc | tonumber) | round' +) +truncate -s "$_final_size" "$_BTRFS_LOOPBACK_FILE" +unset -v _final_size + +# # Stop docker services +# sudo systemctl stop docker + +# Format btrfs loopback +sudo mkfs.btrfs -r "$BTRFS_TARGET_DIR" "$_BTRFS_LOOPBACK_FILE" + +# Mount +sudo systemd-mount "$_BTRFS_LOOPBACK_FILE" "$BTRFS_TARGET_DIR" \ + ${BTRFS_MOUNT_OPTS:+ --options="${BTRFS_MOUNT_OPTS}"} + +# # Restart docker services +# sudo systemctl start docker