Installation et configuration de Tarsnap sous amd64 et arm64
Date de rédaction : 2026-05-01
Date de péremption : 2026-11-01
J’ai décidé de vous causer de tarsnap aujourd’hui, un programme que j’utilise depuis sa création et auquel je suis toujours fidèle :
Parce qu’il est abordable pour un particulier
L’auteur de Tarsnap se trouve être Colin Percival que j’ai rencontré lorsque j’étais actif pour le projet FreeBSD et il à toute ma confiance.
Je vous copie la présentation disponible sur le site officiel : https://www.tarsnap.com/
Des sauvegardes en ligne pour les plus paranoïaques
Tarsnap est un service de sauvegarde en ligne sécurisé et efficace :
Chiffrement: vos données ne sont accessibles qu'à l'aide de vos clés personnelles. Nous ne pouvons pas accéder à vos données, même si nous le voulions !
Code source : le code client est disponible. Vous n'avez pas besoin de nous faire confiance ; vous pouvez vérifier le chiffrement vous-même !
Déduplication : seules les données uniques entre vos fichiers actuels et vos archives chiffrées sont téléchargées. Cela réduit la bande passante et l'espace de stockage nécessaires, ce qui vous permet de faire des économies !
Tarsnap fonctionne sur des systèmes d'exploitation de type UNIX (BSD, Linux, macOS, Cygwin, etc.).
Tarsnap utilise un modèle prépayé basé sur l'utilisation réelle :
Stockage : 250 picodollars/octet-mois de données codées : 0,25 $/Go-mois
Bande passante : 250 picodollars/octet de données encodées : 0,25 $/Go
Les données encodées correspondent aux octets réels stockés ou transmis après déduplication, compression et chiffrement des données.
Il n'y a pas d'autres frais : Tarsnap n'a pas de coûts fixes ni de frais mensuels minimums.
Vous payez ce que vous utilisez, rien de plus.
Pourquoi les tarifs de Tarsnap sont-ils exprimés en picodollars ?
Il y a trois raisons principales pour lesquelles les tarifs de Tarsnap sont exprimés en picodollars (10 à 12) par octet plutôt qu'en dollars par gigaoctet :
1- L'auteur de Tarsnap est un geek. Appliquer des préfixes du Système international à des unités non-SI, c'est un truc de geek.
2- Si les prix étaient indiqués en dollars par Go plutôt qu'en picodollars par octet, il serait plus difficile d'éviter la confusion autour de la notion de « qu'est-ce qu'un Go » (un Go correspond à 109 octets, mais certaines personnes ne comprennent pas les préfixes du SI). Les picodollars sont parfaitement clairs — personne ne va penser qu'un picodollar équivaut à 2-40 dollars.
3- Le fait d'indiquer les prix en picodollars souligne bien le fait que si vous avez des sauvegardes de très petite taille, vous pouvez payer des montants très modestes.
Maintenant que les présentations sont faites, il ne vous reste plus qu’à créer un compte et c’est parti pour l’installation !
Ce tutoriel couvre l’installation de tarsnap sur les architectures amd64 (binaires officiels) et arm64 (compilation depuis les sources, le repo officiel ne distribuant pas de binaires ARM).
Il devrait pouvoir être étendu à d’autres architectures. N'hésitez pas à me contacter pour adapter ce document à votre architecture, cela sera très apprécié ainsi que tout feedback ! :)
Sources officielles:
- https://www.tarsnap.com/documentation.html
- https://www.tarsnap.com/man.html
- https://www.tarsnap.com/pkg-deb.html
Détection de l'architecture :
dpkg --print-architecture
amd64 –> suivre la voie A (sections 2A puis 3A)
arm64 –> suivre la voie B (sections 2B puis 3B)
Pour toutes les autres archis (armhf, armel, riscv64, ...) –> adapter la voie B en conséquence.
Tarsnap a besoin de la locale en_US.UTF-8 pour traiter correctement les noms de fichiers non-ASCII.
Sur certaines installations minimales (Debian Trixie netinst, RaspiOS Lite, conteneurs …), seule la locale C.UTF-8 est installée.
locale -a | grep -E 'en_US|fr_FR'
Si la locale n’apparait pas, il va falloir l’installer :
apt install locales
sed -i 's/^# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen sed -i 's/^# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen locale-gen
update-locale LANG=en_US.UTF-8
Si seul C.utf8 apparaît :
Choisissez les locales à installer : en_US.UTF8 et en_GB.UTF8 (classique sous Raspberry Pi) et celles propres aux programmes et fichiers que vous manipuler fr_FR.UTF8 pour ma part.
Ensuite choisissez la locale par défaut : en_US.UTF8 qui est la principale locale utilisée dans le monde Linux, l'utiliser pour la compatibilité est une bonne pratique.
Test final, après modifications, dans un nouveau shell : exec bash ou ouvrez une nouvelle session SSH pour vérifier :export LC_ALL=en_US.UTF-8 locale
Aucun warning cannot change locale ne devrait apparaitre une fois que le shell à été rechargé !
1. Récupération et vérification de la clef de signature
Via curl (mais wget fonctionne aussi très bien) :curl -# -O https://pkg.tarsnap.com/tarsnap-deb-packaging-key.asc
Vérifier ensuite l'empreinte de la clef :gpg --show-key tarsnap-deb-packaging-key.asc
Empreinte attendue :pub rsa4096 2025-11-24 [SC] [expires: 2027-02-01] FA8A1B4C2B5EF8A457E3D5508F85AE335D4F3E8A uid Tarsnap .deb packages signing key (Tarsnap Backup Inc.) <[email protected]>
Convertir, puis installer la clef :gpg --dearmor tarsnap-deb-packaging-key.asc mv tarsnap-deb-packaging-key.asc.gpg tarsnap-archive-keyring.gpg mv tarsnap-archive-keyring.gpg /usr/share/keyrings/
Voie A : Installation sur amd64 (binaires officiels)
Ajouter le dépôt tarsnap:
echo "deb [signed-by=/usr/share/keyrings/tarsnap-archive-keyring.gpg] http://pkg.tarsnap.com/deb/$(lsb_release -s -c) ./" | tee /etc/apt/sources.list.d/tarsnap.list
cat /etc/apt/sources.list.d/tarsnap.list
deb [signed-by=/usr/share/keyrings/tarsnap-archive-keyring.gpg] http://pkg.tarsnap.com/deb/trixie ./
Suppression des traces inutiles de la clef du dépôt :
rm tarsnap-archive-keyring.gpg tarsnap-deb-packaging-key.asc
apt update apt install tarsnap which tarsnap # /usr/bin/tarsnap
tarsnap --version # tarsnap 1.0.41
Passer à la section 4 pour continuer votre installation maintenant!
Voie B : Compilation pour arm64 (et autres architectures non amd64)
Pourquoi ? Le repo officiel pkg.tarsnap.com ne distribue des binaires que pour i386et amd64.
Pour toutes les autres archis (arm64, armhf, etc.), Tarsnap fournit en revanche un dépôt deb-src permettant de générer un .deb natif proprement.
2B. Ajout du dépôt source
Ajouter le dépôt source :
echo "deb-src [signed-by=/usr/share/keyrings/tarsnap-archive-keyring.gpg] http://pkg.tarsnap.com/deb-src ./" | tee /etc/apt/sources.list.d/tarsnap.list
cat /etc/apt/sources.list.d/tarsnap.list
deb-src [signed-by=/usr/share/keyrings/tarsnap-archive-keyring.gpg] http://pkg.tarsnap.com/deb-src ./
Suppression des traces de la clef du dépôt qui ne nous sera plus utile :
rm tarsnap-archive-keyring.gpg tarsnap-deb-packaging-key.asc
3B. Compilation et installation du paquet
3.1 Mettre à jour la liste des paquets et installer les outils de build :
apt update apt install build-essential devscripts dpkg-dev fakeroot libssl-dev libbz2-dev zlib1g-dev libarchive-dev e2fslibs-dev
3.2 Récupérer les sources dans un dossier dédié :
mkdir -p /usr/src/tarsnap && cd /usr/src/tarsnap apt source tarsnap cd tarsnap-1.0.41
L’avertissement : Download is performed unsandboxed as root est cosmétique : apt préfère habituellement passer par l'utilisateur _apt, mais comme le dossier est root-only, le download est fait en root : Aucun impact.
dpkg-buildpackage -us -uc -b
-us -uc : pas de signature (utile pour les mainteneur Debian uniquement)
-b : ne construit que les binaires, pas le source package
Une fois la compilation finie, le fichier .deb est dans le dossier parent.
3.4 Installation du fichier .deb
cd .. dpkg -i tarsnap_1.0.41-1_arm64.deb
which tarsnap # /usr/bin/tarsnap tarsnap --version # tarsnap 1.0.41
Une fois le paquet installé et fonctionnel, on peut faire le ménage.
Avant de supprimer quoi que ce soit, sauvegarder le .deb : il pourra être réutilisé sur d'autres machines arm64sans avoir à tout recompiler.
Sauvegarde du .deb :cp /usr/src/tarsnap/tarsnap_1.0.41-1_arm64.deb /root/ # ou ailleurs (NAS, dépôt local, etc.)
Suppression des sources et restes de build :rm -rf /usr/src/tarsnap
3.6 Désinstallation des outils de build (optionnel) :
Sur un Raspberry Pi avec une carte SD limitée en taille ou en cycles d'écriture, c'est loin d'être anecdotique : build-essential et ses dépendances pèsent plusieurs centaines de Mo.
Pour une suppression en profondeur vous pouvez supprimer les outils de développement, mais les garder en place permet de récupérer simplement les nouvelles sources lors des mises à jour et de les recompiler sans avoir à tout réinstaller.apt autoremove --purge build-essential devscripts dpkg-dev fakeroot libssl-dev libbz2-dev zlib1g-dev libarchive-dev e2fslibs-dev
3.7 Suppression du dépôt deb-src (déconseillé)
rm /etc/apt/sources.list.d/tarsnap.list apt update
Il vous faudra alors surveiller https://www.tarsnap.com/news.html ou la mailing-list tarsnap-announce pour être averti des nouvelles versions !
Passer à la section 4 pour continuer votre installation maintenant !
4. Génération de la clef de chiffrement
A partir de maintenant la procédure est la même sous architecture amd64 et arm64 !tarsnap-keygen --keyfile /root/tarsnap.key --user [email protected] --machine $(hostname) # Enter tarsnap account password: **** ls -l /root/tarsnap.key # -rw------- 1 root root 4929 Mar 5 14:30 /root/tarsnap.key
⚠️ Externaliser /root/tarsnap.key en lieu sûr immédiatement ! Sans elle, vos archives seront définitivement perdues !!! ⚠️
5. Test initial avec un snapshot temporaire
Note importante : tarsnap supprime les / en tête des chemins dans l'archive. (Il utilise la même syntaxe que tar en fait)
Les patterns --exclude ne doivent donc pas être préfixées d’un / avant les chemins sources.
Pour les noms de fichiers contenant des caractères non-ASCII (ex : certificats CA hongrois, fichiers accentués), forcer la locale UTF-8 avec LANG=en_US.UTF-8.
Vérifier la config :tarsnap --verify-config tarsnap --dump-config
Attendu :Command-line: tarsnap --dump-config Reading from config file: /root/.tarsnaprc Reading from config file: /root/.config/tarsnap/tarsnap.conf Reading from config file: /etc/tarsnap.conf cachedir /usr/local/tarsnap-cache keyfile /root/tarsnap.key nodump print-stats checkpoint-bytes 1G
Créer un snapshot temporaire, appelé snapshot-test qui va sauvegarder les répertoires suivants :
Mais il ignorera le contenu de :
(Ajuster les locales et les chemins pour votre snapshot de test, il sera détruit ensuite)export LANG=en_US.UTF-8 && tarsnap -c -f "snapshot-test" --exclude 'var/www/html/secret' /etc /home /var/www /root
Vérifier que les données sauvegardées sont maintenant bien présentes :tarsnap --print-stats -f '*' # Affiche les statistiques détaillés du dépôt et des sauvegardes tarsnap --list-archives # Affiche vos différents snapshots de sauvegardes tarsnap -t -f snapshot-test # Liste les fichiers contenus dans la sauvegarde
Une fois que tout est validé il ne vous restera plus qu’à supprimer le snapshot de test :tarsnap -d -f snapshot-test
Valider l'intégrité du dépôt :tarsnap --fsck # Phase 1: Verifying metadata validity # Phase 2: Verifying metadata/metaindex consistency # Phase 3: Reading chunk list # Phase 4: Verifying archive completeness # Phase 5: Identifying unreferenced chunks
Vérifier que le dépôt est propre :tarsnap --print-stats -f '*' # Total size Compressed size # All archives 0 0 # (unique data) 0 0
PS : Un script fournissant des statistiques au format humain est fourni à la section 11
6. Exemple de script de sauvegarde :
Créer /root/tarsnap-backup.sh :
!/bin/sh
Robustness settings
set -eu
# Garde-fou : on s'assure que la locale est bien dispo
if ! locale -a 2>/dev/null | grep -qix 'en_US.utf-\?8'; then
echo "ERREUR: locale en_US.UTF-8 non générée sur ce système" >&2
exit 1
fi
# Locale UTF-8 propre (utile pour les noms de fichiers accentués)
unset LANGUAGE
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
# Sauvegarde de la liste des paquets installés
dpkg --get-selections > /root/pkg-selections.txt
apt list --installed 2>/dev/null > /root/pkg-list.txt
# Construction du nom d'archive
computer=$(uname -n)
now=$(date +%Y-%m-%d_%H-%M-%S)
name=${computer}-${now}
# Mode verbose pour debug : remplacer --quiet par -v
/usr/bin/tarsnap --quiet -c -f "${name}"
--exclude='/tmp/'
--exclude='/core/'
--exclude='/.swp/*
/root /boot /var/lib/tor/keys
exit 0
Les lignes commençant par --exclude= :
Contiennent tous les fichiers et dossiers qui ne seront pas sauvegardés !
La dernière ligne : /root /boot /var/lib/tor/keys
Contient, elle, les répertoires et fichiers qui seront sauvegardés !
Test du script en environnement cron-like
Avant de mettre le script en crontab: Simuler l'environnement minimal de cron
Récupérer l'environnement de cron :
root@foobar:~# grep PATH /etc/crontab PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin root@foobar:~#
Il suffit de recopier l'ensemble de la ligne PATH pour obtenir exactement le même environnement que celui de cron :
env -i HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Maintenant que l'environnement est identique on peut tester notre script : /root/tarsnap-backup.sh
Le env -i supprime toutes les variables d'environnement et ne garde que ce qu'on déclare explicitement.
Si ça passe, le cron passera :)
Dans /etc/crontab, sauvegarde quotidienne à 00:02 :02 00 * * * root /root/tarsnap-backup.sh
7. Statistiques des archives
tarsnap --print-stats -f '*' # Affiche les statistiques détaillés du dépôt et des sauvegardes tarsnap --list-archives # Affiche vos différents snapshots de sauvegardes
root@foobar:~# tarsnap --print-stats -f '*' Total size Compressed size All archives 998478607 941161647 (unique data) 109565064 103665351 foobar.bar.foo-2026-04-20_00-00-01 110934319 104570607 (unique data) 133730 51287 foobar.bar.foo-2026-04-21_00-00-02 110936927 104571631 (unique data) 82417 5511 foobar.bar.foo-2026-04-26_00-00-02 110947735 104575511 (unique data) 82945 5511 foobar.bar.foo-2026-04-25_00-00-02 110947735 104575511 (unique data) 132887 25263 ... root@foobar:~# root@foobar:~# tarsnap --list-archives foobar.foo.bar-2026-04-20_00-00-01 foobar.foo.bar-2026-04-21_00-00-02 foobar.foo.bar-2026-04-26_00-00-02 foobar.foo.bar-2026-04-25_00-00-02 foobar.foo.bar-2026-04-23_00-00-02 foobar.foo.bar-2026-04-24_00-00-02 foobar.foo.bar-2026-04-22_00-00-01 foobar.foo.bar-2026-04-19_07-07-59 foobar.foo.bar-2026-04-27_00-00-02 root@foobar:~#
8. Vérification d'intégrité
La commande :tarsnap --fsck
Permet de s'assurer de l'intégrité de vos archives et de leur dépôt :root@foobar:~# tarsnap --fsck Phase 1: Verifying metadata validity Phase 2: Verifying metadata/metaindex consistency Phase 3: Reading chunk list Phase 4: Verifying archive completeness Archive 1/2... Archive 2/2... Phase 5: Identifying unreferenced chunks root@foobar:~#
À lancer périodiquement (mensuellement par exemple) pour s'assurer que le dépôt distant n’est pas corrompu, même si c’est quasiment impossible, à part peut être lors d’une coupure réseau en pleine sauvegarde.
Ca ne m’est jamais arrivé de devoir l’utiliser.
9. Suppression d'un snapshot
# Lister les sauvegardes disponibles root@foobar:~# tarsnap --list-archives foobar-2026-03-05_15-55-32 root@foobar:~# # Supprimer l'archive souhaitée root@foobar:~# tarsnap -d -f foobar-2026-03-05_15-55-32 Total size Compressed size All archives 0 0 (unique data) 0 0 This archive 299348234 165377794 Deleted data 299333898 165371314 root@foobar:~# # Vérifier que l'achive à bien été supprimée root@foobar:~# tarsnap --list-archives root@foobar:~# # Comme il n'y avait qu'une seule archive le dépôt est maintenant vide root@foobar:~# tarsnap --print-stats -f '*' Total size Compressed size All archives 0 0 (unique data) 0 0 root@foobar:~#
10. Suppression de toutes les données (DANGER)
⚠️ Irréversible. Supprime toutes les archives de la machine sur les serveurs Tarsnap.
tarsnap --nuke # Please type 'No Tomorrow' to continue # No Tomorrow
11. Tests de validation rapide
Liste minimale à passer après installation pour s'assurer que tout est fonctionnel :
Binaire présent : which tarsnap -> /usr/bin/tarsnap
Version correcte : tarsnap --version -> tarsnap 1.0.41
Locale OK : locale -a \| grep en_UU –> en_US.utf8
LCALL utilisable : LC_ALL=en_US.UTF-8 bash -c 'echo OK' –> OK (sans warning)_
Config valide : tarsnap --verify-config –> Aucune erreur
Clef présente : ls -l /root/tarsnap.key –> Doit avoir les permissions -rw-------
Dépôt joignable : tarsnap --print-stats -f '*' –> affichage des stats
12. Script de récupération des statistiques, puis affichage sous une forme humaine
#!/bin/sh # Nombre d'archives (appel réseau séparé, inévitable) NARCHIVES=$(tarsnap --list-archives | wc -l | awk '{print $1}') tarsnap --print-stats | awk -v narchives="$NARCHIVES" ' function format_bytes(bytes) { if (bytes < 1024) return sprintf("%.0f B", bytes) if (bytes < 1024*1024) return sprintf("%.2f KB", bytes / 1024) if (bytes < 1024*1024*1024) return sprintf("%.2f MB", bytes / (1024*1024)) if (bytes < 1024*1024*1024*1024) return sprintf("%.2f GB", bytes / (1024*1024*1024)) return sprintf("%.2f TB", bytes / (1024*1024*1024*1024)) } NR == 2 { printf "All archives:\n" printf " Snapshots: %d\n", narchives + 0 printf " Total size: %s\n", format_bytes($3) printf " Compressed size: %s\n", format_bytes($4) printf " Ratio: %.1f%%\n\n", ($4 / $3) * 100 } NR == 3 { encoded = $4 cost = encoded * 250e-12 printf "Unique data:\n" printf " Total size: %s\n", format_bytes($3) printf " Encoded size: %s\n", format_bytes(encoded) printf " Ratio: %.1f%%\n\n", (encoded / $3) * 100 printf "Storage cost:\n" printf " Monthly: $%.4f\n", cost printf " Daily: $%.6f\n", cost / 30 printf " (250 pUSD/byte/month on encoded data)\n" } '
Voici la sortie attendue :
root@foobar:~# ./tarsnap-stats.sh All archives: Snapshots: 72 Total size: 32.13 GB Compressed size: 18.27 GB Ratio: 56.9% Unique data: Total size: 644.51 MB Encoded size: 341.22 MB Ratio: 52.9% Storage cost: Monthly: $0.0894 Daily: $0.002982 (250 pUSD/byte/month on encoded data) root@foobar:~#
Cette sortie à pris 27 secondes à générer donc : pas de panique si le script ne rends pas la main immédiatement !
J’espère que ce petit tuto vous aidera à installer ainsi que paramétrer vos sauvegardes avec tarsnap ! :)