first commit
This commit is contained in:
BIN
2.0.0b5/bin/borg2-b5-fuse
Executable file
BIN
2.0.0b5/bin/borg2-b5-fuse
Executable file
Binary file not shown.
BIN
2.0.0b5/bin/borg2-b5-nofuse
Executable file
BIN
2.0.0b5/bin/borg2-b5-nofuse
Executable file
Binary file not shown.
118
2.0.0b5/borg2-b5-fuse_guide.md
Normal file
118
2.0.0b5/borg2-b5-fuse_guide.md
Normal file
@@ -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 <user>
|
||||
mkdir -p /mnt/borg && chown <user>:<user> /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.
|
||||
100
2.0.0b5/borg2-b5-nofuse_guide.md
Normal file
100
2.0.0b5/borg2-b5-nofuse_guide.md
Normal file
@@ -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.
|
||||
107
2.0.0b5/build-fuse.sh
Executable file
107
2.0.0b5/build-fuse.sh
Executable file
@@ -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
|
||||
100
2.0.0b5/build-nofuse.sh
Executable file
100
2.0.0b5/build-nofuse.sh
Executable file
@@ -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
|
||||
Reference in New Issue
Block a user