commit 301b5574b8a4d2ed3c6ce7701ff341e9c24a6c79 Author: Christoph Date: Tue Nov 11 23:29:19 2025 +0100 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1377554 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/2.0.0b5/bin/borg2-b5-fuse b/2.0.0b5/bin/borg2-b5-fuse new file mode 100755 index 0000000..f2f3fe6 Binary files /dev/null and b/2.0.0b5/bin/borg2-b5-fuse differ diff --git a/2.0.0b5/bin/borg2-b5-nofuse b/2.0.0b5/bin/borg2-b5-nofuse new file mode 100755 index 0000000..0b9df0b Binary files /dev/null and b/2.0.0b5/bin/borg2-b5-nofuse differ diff --git a/2.0.0b5/borg2-b5-fuse_guide.md b/2.0.0b5/borg2-b5-fuse_guide.md new file mode 100644 index 0000000..4ba6fa4 --- /dev/null +++ b/2.0.0b5/borg2-b5-fuse_guide.md @@ -0,0 +1,118 @@ +# Borg 2.0.0b5 One-File Build (Variante A: mit `pyfuse3`) + +Diese Anleitung beschreibt den Neuaufbau von Null auf Debian **Bookworm** (Build-Host), um ein tragbares **Borg 2.0.0b5**-Einzelbinary zu erzeugen, das auf Debian **Trixie** (Ziel) läuft – **inkl. `mount`-Support** via `pyfuse3`. + +## Voraussetzungen (Bookworm) + +```bash +sudo apt update +sudo apt install -y git python3-venv python3-dev build-essential pkg-config \ + libssl-dev libxxhash-dev liblz4-dev libzstd-dev libacl1-dev libfuse3-dev \ + liblzma-dev libb2-dev ca-certificates +``` + +## Build per Skript + +```bash +chmod +x build.sh +./build.sh +``` + +Ergebnis: `/opt/borg2-b5-build/dist/borg2-b5` + +## Manuell bauen (Kurzfassung) + +```bash +python3 -m venv /opt/borg2-b5-build +source /opt/borg2-b5-build/bin/activate +python -m pip install -U "pip<25" "setuptools<70" wheel "Cython==0.29.36" pkgconfig "setuptools-scm<8" + +cd /opt +git clone --depth 1 --branch 2.0.0b5 https://github.com/borgbackup/borg.git borg-b5-src + +export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig +export BORG_CYTHONIZE=1 +export BORG_OPENSSL_PREFIX=/usr +export BORG_LIBXXHASH_PREFIX=/usr +export BORG_LIBLZ4_PREFIX=/usr +export BORG_LIBZSTD_PREFIX=/usr +export BORG_LIBB2_PREFIX=/usr +export BORG_LIBLZMA_PREFIX=/usr +export BORG_LIBACL_PREFIX=/usr + +cd /opt/borg-b5-src +python -m pip install --no-build-isolation --no-cache-dir . + +cd / +python - <<'PY' +import borg, sys, inspect +print("borg", borg.__version__, "python", sys.version.split()[0]) +print("from:", inspect.getsourcefile(borg) or borg.__file__) +PY + +python -m pip install pyfuse3 + +cat > /opt/borg2-b5-build/borg2_entry.py <<'EOF' +import os, sys, types +os.environ.setdefault("BORG_SELFTEST", "disabled") +m = types.ModuleType("borg.selftest") +def _selftest(*a, **kw): return 0 +m.selftest = _selftest +sys.modules["borg.selftest"] = m +ver = types.ModuleType("borg._version") +ver.version = "2.0.0b5" +sys.modules["borg._version"] = ver +import borg.archiver as A +if __name__ == "__main__": + A.main() +EOF + +python -m pip install "pyinstaller>=6,<7" +cd /opt/borg2-b5-build +python -m PyInstaller -F -n borg2-b5 -c borg2_entry.py \ + --collect-data borg --collect-binaries borg --collect-all pyfuse3 \ + --exclude-module borg.testsuite \ + --hidden-import=packaging.version --hidden-import=packaging.specifiers \ + --clean -y + +./dist/borg2-b5 --version +``` + +## Deployment (Trixie) + +```bash +scp /opt/borg2-b5-build/dist/borg2-b5 root@trixie:/usr/local/bin/ +ssh root@trixie 'chmod +x /usr/local/bin/borg2-b5 && borg2-b5 --version' +``` + +### Für `mount` auf Trixie + +```bash +sudo apt install -y fuse3 +# /etc/fuse.conf: 'user_allow_other' aktivieren (optional) +sudo usermod -aG fuse +mkdir -p /mnt/borg && chown : /mnt/borg + +export BORG_FUSE_IMPL=pyfuse3 +borg2-b5 mount -o allow_other,default_permissions \ + ssh://borg@backup-server/srv/borg-repos/deb12::ARCHIVENAME /mnt/borg +# Unmount +borg2-b5 umount /mnt/borg # oder: fusermount3 -u /mnt/borg +``` + +## Beispiele + +```bash +export BORG_REMOTE_PATH=borg2 +borg2-b5 rlist ssh://borg@backup-server/srv/borg-repos/deb12 +borg2-b5 create --stats \ + ssh://borg@backup-server/srv/borg-repos/deb12::'{now:%Y-%m-%d_%H%M%S}' \ + /etc /var/www +``` + +## Troubleshooting + +- `ModuleNotFoundError: borg._version`: Nicht-editable installieren (`pip install .`), Import **außerhalb** des Repo-Ordners testen; Entry-Stub liefert Fallback. +- `__set_name__`-Fehler: Cython 0.29.x verwenden; Source-Build erzwingen. +- Native Libs nicht gefunden: `PKG_CONFIG_PATH` + `BORG_*_PREFIX=/usr` setzen. +- `mount not available`: Binary mit `pyfuse3` bauen **und** auf Trixie `fuse3` installieren; `BORG_FUSE_IMPL=pyfuse3` setzen. diff --git a/2.0.0b5/borg2-b5-nofuse_guide.md b/2.0.0b5/borg2-b5-nofuse_guide.md new file mode 100644 index 0000000..ef79d3e --- /dev/null +++ b/2.0.0b5/borg2-b5-nofuse_guide.md @@ -0,0 +1,100 @@ +# Borg 2.0.0b5 One-File Build (Variante B: **ohne** FUSE/mount) + +Diese Variante erzeugt ein **kleineres Binary**, das alle Borg-Funktionen außer `mount` unterstützt. Build-Host: **Debian Bookworm**. Ziel: **Debian Trixie**. + +## Voraussetzungen (Bookworm) + +```bash +sudo apt update +sudo apt install -y git python3-venv python3-dev build-essential pkg-config \ + libssl-dev libxxhash-dev liblz4-dev libzstd-dev libacl1-dev \ + liblzma-dev libb2-dev ca-certificates +``` + +## Build per Skript + +```bash +chmod +x build-nofuse.sh +./build-nofuse.sh +``` + +Ergebnis: `/opt/borg2-b5-build/dist/borg2-b5` + +## Manuell (Kurzfassung) + +```bash +python3 -m venv /opt/borg2-b5-build +source /opt/borg2-b5-build/bin/activate +python -m pip install -U "pip<25" "setuptools<70" wheel "Cython==0.29.36" pkgconfig "setuptools-scm<8" + +cd /opt +git clone --depth 1 --branch 2.0.0b5 https://github.com/borgbackup/borg.git borg-b5-src + +export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig +export BORG_CYTHONIZE=1 +export BORG_OPENSSL_PREFIX=/usr +export BORG_LIBXXHASH_PREFIX=/usr +export BORG_LIBLZ4_PREFIX=/usr +export BORG_LIBZSTD_PREFIX=/usr +export BORG_LIBB2_PREFIX=/usr +export BORG_LIBLZMA_PREFIX=/usr +export BORG_LIBACL_PREFIX=/usr + +cd /opt/borg-b5-src +python -m pip install --no-build-isolation --no-cache-dir . + +cd / +python - <<'PY' +import borg, sys, inspect +print("borg", borg.__version__, "python", sys.version.split()[0]) +print("from:", inspect.getsourcefile(borg) or borg.__file__) +PY + +cat > /opt/borg2-b5-build/borg2_entry.py <<'EOF' +import os, sys, types +os.environ.setdefault("BORG_SELFTEST", "disabled") +m = types.ModuleType("borg.selftest") +def _selftest(*a, **kw): return 0 +m.selftest = _selftest +sys.modules["borg.selftest"] = m +ver = types.ModuleType("borg._version") +ver.version = "2.0.0b5" +sys.modules["borg._version"] = ver +import borg.archiver as A +if __name__ == "__main__": + A.main() +EOF + +python -m pip install "pyinstaller>=6,<7" +cd /opt/borg2-b5-build +python -m PyInstaller -F -n borg2-b5 -c borg2_entry.py \ + --collect-data borg --collect-binaries borg \ + --exclude-module borg.testsuite \ + --hidden-import=packaging.version --hidden-import=packaging.specifiers \ + --clean -y + +./dist/borg2-b5 --version +``` + +## Deployment (Trixie) + +```bash +scp /opt/borg2-b5-build/dist/borg2-b5 root@trixie:/usr/local/bin/ +ssh root@trixie 'chmod +x /usr/local/bin/borg2-b5 && borg2-b5 --version' +``` + +## Nutzung (Beispiele) + +```bash +export BORG_REMOTE_PATH=borg2 +borg2-b5 rlist ssh://borg@backup-server/srv/borg-repos/deb12 +borg2-b5 create --stats \ + ssh://borg@backup-server/srv/borg-repos/deb12::'{now:%Y-%m-%d_%H%M%S}' \ + /etc /var/www +``` + +## Unterschiede zu Variante A (mit FUSE) + +- Kein `pyfuse3` installiert, keine `--collect-all pyfuse3` im Build. +- `borg mount` ist **nicht** verfügbar. +- Binary ist kleiner, Build schneller. diff --git a/2.0.0b5/build-fuse.sh b/2.0.0b5/build-fuse.sh new file mode 100755 index 0000000..3ba1bac --- /dev/null +++ b/2.0.0b5/build-fuse.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================ +# Borg 2.0.0b5 One-File Binary Builder (Variant A: with pyfuse3) +# Target host for build: Debian 12 (Bookworm) +# Output binary: /opt/borg2-b5-build/dist/borg2-b5 +# ============================================================ + +BORG_TAG="2.0.0b5" +VENV_DIR="/opt/borg2-b5-build" +SRC_DIR="/opt/borg-b5-src" +BIN_NAME="borg2-b5-fuse" + +if [[ $EUID -ne 0 ]]; then + echo "[WARN] Not running as root. I will skip 'apt install'. Ensure prerequisites are installed:" + echo " apt install -y git python3-venv python3-dev build-essential pkg-config \\ + libssl-dev libxxhash-dev liblz4-dev libzstd-dev libacl1-dev libfuse3-dev \\ + liblzma-dev libb2-dev ca-certificates" +else + echo "[INFO] Installing OS prerequisites via apt..." + export DEBIAN_FRONTEND=noninteractive + apt update -y + apt install -y git python3-venv python3-dev build-essential pkg-config \ + libssl-dev libxxhash-dev liblz4-dev libzstd-dev libacl1-dev \ + libfuse3-dev liblzma-dev libb2-dev ca-certificates +fi + +echo "[INFO] Creating Python venv at ${VENV_DIR} ..." +rm -rf "${VENV_DIR}" +python3 -m venv "${VENV_DIR}" +source "${VENV_DIR}/bin/activate" + +echo "[INFO] Upgrading pip/setuptools/wheel and installing build helpers..." +python -m pip install -U "pip<25" "setuptools<70" wheel "Cython==0.29.36" pkgconfig "setuptools-scm<8" + +echo "[INFO] Cloning Borg ${BORG_TAG} sources into ${SRC_DIR} ..." +rm -rf "${SRC_DIR}" +git clone --depth 1 --branch "${BORG_TAG}" https://github.com/borgbackup/borg.git "${SRC_DIR}" + +export PKG_CONFIG_PATH="/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig" +export BORG_CYTHONIZE=1 +export BORG_OPENSSL_PREFIX="/usr" +export BORG_LIBXXHASH_PREFIX="/usr" +export BORG_LIBLZ4_PREFIX="/usr" +export BORG_LIBZSTD_PREFIX="/usr" +export BORG_LIBB2_PREFIX="/usr" +export BORG_LIBLZMA_PREFIX="/usr" +export BORG_LIBACL_PREFIX="/usr" + +echo "[INFO] Removing any existing borg from venv (if present)..." +python -m pip uninstall -y borgbackup || true +rm -rf "${VENV_DIR}/lib/python3."*/site-packages/borg \ + "${VENV_DIR}/lib/python3."*/site-packages/borgbackup-"*.dist-info" \ + "${VENV_DIR}/lib/python3."*/site-packages/borg*.egg-info \ + "${VENV_DIR}/lib/python3."*/site-packages/borg*.pth \ + "${VENV_DIR}/lib/python3."*/site-packages/borg*.egg-link || true + +echo "[INFO] Building & installing Borg from source (non-editable)..." +cd "${SRC_DIR}" +python -m pip install --no-build-isolation --no-cache-dir . + +echo "[INFO] Import test for borg (should show version ${BORG_TAG})..." +cd / +python - <<'PY' +import borg, sys, inspect +print("borg", borg.__version__, "python", sys.version.split()[0]) +print("from:", inspect.getsourcefile(borg) or borg.__file__) +PY + +echo "[INFO] Installing pyfuse3 into venv to include mount support..." +python -m pip install pyfuse3 + +echo "[INFO] Creating entry stub..." +cat > "${VENV_DIR}/borg2_entry.py" <<'EOF' +import os, sys, types + +os.environ.setdefault("BORG_SELFTEST", "disabled") +m = types.ModuleType("borg.selftest") +def _selftest(*a, **kw): return 0 +m.selftest = _selftest +sys.modules["borg.selftest"] = m + +ver = types.ModuleType("borg._version") +ver.version = "2.0.0b5" +sys.modules["borg._version"] = ver + +import borg.archiver as A +if __name__ == "__main__": + A.main() +EOF + +echo "[INFO] Building one-file binary with PyInstaller..." +python -m pip install "pyinstaller>=6,<7" +cd "${VENV_DIR}" +python -m PyInstaller -F -n "${BIN_NAME}" -c borg2_entry.py \ + --collect-data borg \ + --collect-binaries borg \ + --collect-all pyfuse3 \ + --exclude-module borg.testsuite \ + --hidden-import=packaging.version \ + --hidden-import=packaging.specifiers \ + --clean -y + +echo "[INFO] Build complete. Binary:" +echo " ${VENV_DIR}/dist/${BIN_NAME}" +ls -lh "${VENV_DIR}/dist/${BIN_NAME}" || true diff --git a/2.0.0b5/build-nofuse.sh b/2.0.0b5/build-nofuse.sh new file mode 100755 index 0000000..cc57255 --- /dev/null +++ b/2.0.0b5/build-nofuse.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================ +# Borg 2.0.0b5 One-File Binary Builder (Variant B: without FUSE/mount) +# Target host for build: Debian 12 (Bookworm) +# Output binary: /opt/borg2-b5-build/dist/borg2-b5 +# ============================================================ + +BORG_TAG="2.0.0b5" +VENV_DIR="/opt/borg2-b5-build" +SRC_DIR="/opt/borg-b5-src" +BIN_NAME="borg2-b5-nofuse" + +if [[ $EUID -ne 0 ]]; then + echo "[WARN] Not running as root. I will skip 'apt install'. Ensure prerequisites are installed:" + echo " apt install -y git python3-venv python3-dev build-essential pkg-config \\ + libssl-dev libxxhash-dev liblz4-dev libzstd-dev libacl1-dev \\ + liblzma-dev libb2-dev ca-certificates" +else + echo "[INFO] Installing OS prerequisites via apt..." + export DEBIAN_FRONTEND=noninteractive + apt update -y + apt install -y git python3-venv python3-dev build-essential pkg-config \ + libssl-dev libxxhash-dev liblz4-dev libzstd-dev libacl1-dev \ + liblzma-dev libb2-dev ca-certificates +fi + +echo "[INFO] Creating Python venv at ${VENV_DIR} ..." +rm -rf "${VENV_DIR}" +python3 -m venv "${VENV_DIR}" +source "${VENV_DIR}/bin/activate" + +echo "[INFO] Upgrading pip/setuptools/wheel and installing build helpers..." +python -m pip install -U "pip<25" "setuptools<70" wheel "Cython==0.29.36" pkgconfig "setuptools-scm<8" + +echo "[INFO] Cloning Borg ${BORG_TAG} sources into ${SRC_DIR} ..." +rm -rf "${SRC_DIR}" +git clone --depth 1 --branch "${BORG_TAG}" https://github.com/borgbackup/borg.git "${SRC_DIR}" + +export PKG_CONFIG_PATH="/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig" +export BORG_CYTHONIZE=1 +export BORG_OPENSSL_PREFIX="/usr" +export BORG_LIBXXHASH_PREFIX="/usr" +export BORG_LIBLZ4_PREFIX="/usr" +export BORG_LIBZSTD_PREFIX="/usr" +export BORG_LIBB2_PREFIX="/usr" +export BORG_LIBLZMA_PREFIX="/usr" +export BORG_LIBACL_PREFIX="/usr" + +echo "[INFO] Removing any existing borg from venv (if present)..." +python -m pip uninstall -y borgbackup || true +rm -rf "${VENV_DIR}/lib/python3."*/site-packages/borg \ + "${VENV_DIR}/lib/python3."*/site-packages/borgbackup-"*.dist-info" \ + "${VENV_DIR}/lib/python3."*/site-packages/borg*.egg-info \ + "${VENV_DIR}/lib/python3."*/site-packages/borg*.pth \ + "${VENV_DIR}/lib/python3."*/site-packages/borg*.egg-link || true + +echo "[INFO] Building & installing Borg from source (non-editable)..." +cd "${SRC_DIR}" +python -m pip install --no-build-isolation --no-cache-dir . + +echo "[INFO] Import test for borg (should show version ${BORG_TAG})..." +cd / +python - <<'PY' +import borg, sys, inspect +print("borg", borg.__version__, "python", sys.version.split()[0]) +print("from:", inspect.getsourcefile(borg) or borg.__file__) +PY + +echo "[INFO] Creating entry stub..." +cat > "${VENV_DIR}/borg2_entry.py" <<'EOF' +import os, sys, types +os.environ.setdefault("BORG_SELFTEST", "disabled") +m = types.ModuleType("borg.selftest") +def _selftest(*a, **kw): return 0 +m.selftest = _selftest +sys.modules["borg.selftest"] = m +ver = types.ModuleType("borg._version") +ver.version = "2.0.0b5" +sys.modules["borg._version"] = ver +import borg.archiver as A +if __name__ == "__main__": + A.main() +EOF + +echo "[INFO] Building one-file binary with PyInstaller (no FUSE)..." +python -m pip install "pyinstaller>=6,<7" +cd "${VENV_DIR}" +python -m PyInstaller -F -n "${BIN_NAME}" -c borg2_entry.py \ + --collect-data borg \ + --collect-binaries borg \ + --exclude-module borg.testsuite \ + --hidden-import=packaging.version \ + --hidden-import=packaging.specifiers \ + --clean -y + +echo "[INFO] Build complete. Binary:" +echo " ${VENV_DIR}/dist/${BIN_NAME}" +ls -lh "${VENV_DIR}/dist/${BIN_NAME}" || true