web-dev-qa-db-fra.com

Sauvegarde de la configuration Linux, des scripts et des documents sur Gmail

Sur gmail.com, je vois ceci:

0,38 Go (2%) de 15 Go utilisés

Sur ma partition de 30 Go, 20 Go sont remplis de contenu Ubuntu, mais probablement seulement 1 Go de documents importants. Pourquoi ne pas utiliser ce stockage en nuage gratuit pour la sauvegarde?

Existe-t-il déjà un programme pour le faire? Je vais probablement en écrire un de toute façon, mais je voulais le demander avant de commencer.

Je souhaite également la compression et la segmentation de fichiers, car certains systèmes ont une limite de 10 Mo pour les pièces jointes (comme celle au travail).

Merci :)

6
WinEunuuchs2Unix

Editer le 9 juillet 2019

Article historique dans la section suivante

La partie originale de la réponse est laissée intacte dans la section suivante pour référence historique aux essais et erreurs.

Script de sauvegarde pour créer un fichier .tar

Voici le script de sauvegarde actuel:

#!/bin/bash

# NAME: daily-backup.sh
# PATH: /mnt/e/bin
# DESC: Backup scripts, documents and configuration files to .tar

# DATE: July 11, 2017. Modified July 7, 2019.

HomeDir="/home/USER_NAME"                    # Required for cron compatibility
EmailAddr="[email protected]"

# PARM: 1=backup file name. Extension .tar.gz automatically appended.

# NOTE: To include MBR (Master Boot Record) in backup create an image using:
#       Sudo dd if=/dev/sda of="$HOME/.mbr.sav" bs=512 count=1

# NOTE: CLONE CURRENT INSTALLATION TO NEW MACHINE
#       =========================================

#       To restore use Live USB to install Ubuntu alongside Windows 10
#       Connect to network with password xxxxxxxxx

#       Install Google Chrome
#       (https://askubuntu.com/questions/510056/how-to-install-google-chrome):

#           wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub 
#               | Sudo apt-key add
#           echo 'deb [Arch=AMD64] http://dl.google.com/linux/chrome/deb/
#               stable main' | Sudo tee /etc/apt/sources.list.d/google-chrome.list
#           Sudo apt update
#           Sudo apt install google-chrome-stable

#       Open gmail.com and download attachment `$1` which is usually called
#           Backup-yymmdd-DayOfWeekName.tar

#       Make missing home/bin directory which tar doesn't create automatically:
#           mkdir ~/bin

#       Restore the daily backup using:
#           Sudo tar -xvf Backup-yymmdd-DayFfWeekName.tar -C /
#           yar -xvf Backup-yymmdd-DayFfWeekName.tar -C /

#       Patch /etc/default/grub with new machine parameters, ie for nvme use:
#           acpiphp.disable=1

#       Use `Sudo apt install aptitude-common`
#       Clone packages using `aptitude-create-state-bundle` on Source
#       Copy state-bundle.tar file from Source to Target machine
#       Restore packages using `aptitude-run-state-bundle` on Target

#       Manually copy ~/Pictures, ~/Videos, etc. not in daily backup.

#       Sudo update-grub        # NVMe suspend/resume acpiphp.disable=1
#       Sudo update-initramfs   # to get plymouth sunrise splash screen

if [[ $# -ne 1 ]]; then
    echo 'One argument required for file name, e.g. "Backup-2017-10-21-Saturday"'
    echo '.tar will automatically be added as a file extension'
    exit 1
fi

Filename="$1.tar"

cd $HomeDir ||
    exit 1

dpkg --get-selections > .packages       # List of installed applications

tar -cvpf "$Filename" bin               # create .tar & add user scripts
tar -rvpf "$Filename" .config/autostart # autostart programs configuration
tar -rvpf "$Filename" /usr/local/bin    # add global root-based scripts
tar -rvpf "$Filename" /etc/cron*        # crontab, cron.d, cron.daily, etc
tar -rvpf "$Filename" /etc/system*      # systemd files: login.conf, etc.
tar -rvpf "$Filename" /lib/systemd/system-sleep
tar -rvpf "$Filename" /etc/rc.local     # Startup script: calls zaprestore.
tar -rvpf "$Filename" /etc/sudoers      # 120 minute Sudo, stars in password
tar -rvpf "$Filename" /etc/environment  # PATH backup
tar -rvpf "$Filename" /etc/default/grub # bootstrap loader
#July 20, 2018 - /boot/grub takes 5MB+
#tar -rvpf "$Filename" /boot/grub        # Custom grub fonts and splash...
tar -rvpf  "$Filename" /usr/share/plymouth   # ... screen (plymouth)
#included above tar -rvpf "$Filename" /usr/share/plymouth/themes/earth-sunrise/
tar -rvpf "$Filename" /usr/share/grub/themes/Tuxkiller2/
tar -rvpf "$Filename" /etc/grub.d       # 00_header, etc. changes
tar -rvpf "$Filename" Desktop           # files and links on desktop
tar -rvpf "$Filename" Documents/*.od*   # Libre Office: *.ods, *.odt, etc.

# Trusted keys to install from third party PPAs
tar -rvpf "$Filename" /etc/apt/trusted.gpg
tar -rvpf "$Filename" /etc/apt/trusted.gpg.d

# Sources for repositories - 1) Main single file - 2) directory of files
tar -rvpf "$Filename" /etc/apt/sources.list
tar -rvpf "$Filename" /etc/apt/sources.list.d

# find all $HOME/.config files and add to .tar
find .* -maxdepth 0 -type f -exec tar -rvf "$Filename" {} +

# Nautilus custom scripts
tar -rvpf "$Filename" .local/share/nautilus/scripts

# /etc/udev rules
tar -rvpf "$Filename" /etc/udev/rules.d

# /etc/rc.local
tar -rvpf "$Filename" /etc/rc.local

# /etc/X11/xorg.conf.d
tar -rvpf "$Filename" /etc/X11/xorg.conf.d

# /mnt/e - shared WSL + Linux
tar -rvpf "$Filename" /mnt/e/bin
tar -rvpf "$Filename" /mnt/e/Documents

# ~/eyesome - Development version
tar -rvpf "$Filename" eyesome

# ~/gmail - Python and Bash scripts but NOT huge data files
tar -rvpf "$Filename" gmail/*.py
tar -rvpf "$Filename" gmail/*.sh
tar -rvpf "$Filename" gmail/go
tar -rvpf "$Filename" gmail/BackupSets
tar -rvpf "$Filename" gmail/BackupDays

echo "Complete file list with sizes..."
tar -tvf "$Filename" > BackupLog    # list filenames and sizes
chmod a+w BackupLog                 # give user delete access

echo "Compressing with gzip..."
gzip "$Filename"
Filename="$Filename.gz"

echo "Emailing: $EmailAddr"

# From: https://internetlifeforum.com/gmail/2251-gmail-some-file-types-blocked-fix-how-go-around/
# cat archive.tar.gz | base64 > file
# then i sent the file via email:
# echo "Base64 encoded file" | mutt -a file -s subject -- [email protected]
# then mail was delivered properly! Then when one need to get readable archive 
# again, he need to decode it by base64. In my case i do it via linux command line:
# cat file | base64 -d > decodedarchive.tar.gz

Filename64="$Filename.64"
cat "$Filename" | base64 > "$Filename64"
mail -a "$Filename64" -s "$Filename64" "$EmailAddr" < BackupLog

ls -la "$Filename" "$Filename64"
rm     "$Filename" "$Filename64"

exit 0

Remplacez USER_NAME ci-dessus par votre nom d'utilisateur. Remplacez [email protected] par votre adresse gmail actuelle. Changez le répertoire /mnt/e/bin dans le répertoire dans lequel vous stockez vos scripts bash. Enregistrez le fichier et quittez. Alors utilisez:

chmod a+x /mnt/e/bin/backup

Cela rend le script exécutable.

Remarquez comment le MBR (Master Boot Record) est sauvegardé. Une étape précédente distincte pour créer ~/.mbr.sav à l'aide de Sudo dd ... est requise, comme décrit dans les commentaires de script.

Remarquez la ligne dpkg --get-selections. Cela crée une liste de tous les noms d’applications installées.

Le moyen le plus simple d'automatiser l'envoi de courrier électronique

De envoyer des alertes par e-mail à l'aide de ssmtp nous trouvons le moyen le plus simple d'envoyer des e-mails automatisés à partir d'un terminal ou d'un script. Les étapes d'installation sont simples:

Sudo apt install ssmtp
Sudo nano /etc/ssmtp/ssmtp.conf
# Change "MyEmailAddress" and "MyPassword" to your own.

Il y a une étape non mentionnée; Google vous enverra un e-mail confirmant que vous souhaitiez autoriser une application "moins sécurisée" à envoyer des e-mails avec votre compte:

gmail turns on less secure apps for email

Après l'installation et la configuration de ssmpt, un package supplémentaire est nécessaire pour attacher votre fichier de sauvegarde .tar à un courrier électronique:

Sudo apt install sharutils

Ce paquet contient le programme uuencode qui nécessite de convertir des fichiers binaires pour la transmission.

Programme d'installation cron quotidien pour appeler le script de sauvegarde

Créez le fichier /etc/cron.daily/daily-backup contenant:

#!/bin/sh
#
# NAME: daily-backup
# DESC: A .tar backup file is created, emailed and removed.
# DATE: Nov 25, 2017.
# CALL: WSL or Ubuntu calls from /etc/cron.daily/daily-backup
# PARM: No parameters but /etc/ssmtp/ssmtp.conf must be setup

# NOTE: Backup file name contains machine name + Distro
#       Same script for user with multiple dual boot laptops
#       Single machine should remove $HOSTNAME from name
#       Single distribution should remove $Distro

sleep 30 # Wait 30 seconds after boot

# Running under WSL (Windows Subsystem for Ubuntu)?
if cat /proc/version | grep Microsoft; then
    Distro="WSL"
else
    Distro="Ubuntu"
fi

today=$( date +%Y-%m-%d-%A )
/mnt/e/bin/daily-backup.sh Daily-$(hostname)-$Distro-backup-$today

Enregistrez le fichier, quittez et utilisez:

chmod a+x /etc/cron.daily/daily-backup

Cela rend le script exécutable.

Ce que cron vous envoie chaque matin

Chaque matin après l'exécution de /etc/cron.daily/daily-backup, cron vous envoie deux courriels. Le premier est le fichier de sauvegarde Backup-YYYY-MM-DD.tar qui, dans mon cas, fait 5,2 Mo que je ne peux pas vous montrer. L'autre est une liste de tous les fichiers de la sauvegarde que la commande tar avait signalés à cron:

Anacron <[email protected]>
6:58 AM (1 hour ago)

to root, bcc: me 
/etc/cron.daily/daily-backup:
bin/
bin/.websync.new
bin/log-gsu-del
bin/now
  (... SNIP ...)
.xscreensaver
.xsession-errors
.xsession-errors.old

Sommaire

Il a fallu un mois pour attendre une réponse, puis un mois pour écrire une réponse, mais le projet est maintenant terminé. À l'avenir, il suffit d'ajouter des répertoires supplémentaires au script de sauvegarde.

Le prochain projet consistera en une sauvegarde complète, mais il aura une taille de 6 Go et sera copié sur gdrive (Google Drive), car Gmail est limité à 25 Mo. Ce script s'appelle /usr/local/bin/full-backup et est inclus ici si cela vous intéresse:

#!/bin/bash

# NAME: full-backup
# PATH: $HOME/bin
# DESC: Full system backup - must call with Sudo

# DATE: July 16, 2017. Modified July 26, 2017.

apt autoclean   # reduces size of /var/cache/apt/archives

cd /tmp         # tar must be created in directory not backed up.

time tar -cvpzf backup.tar.gz \
--exclude=/backup.tar.gz \
--exclude=/proc \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/dev \
--exclude=/sys \
--exclude=/media \
--exclude=/usr/src/linux-headers* \
--exclude=/home/Me/.cache \
--exclude=/var/log \
--exclude=/var/run/ \
--exclude=/run \
--exclude=/var/cache/apt/archives /

Section historique

Ce sera plus un "voyage" qu'une réponse à mesure que les options disponibles sont explorées.

Sauvegardez ce qui est le plus important pour vous en premier

J'ai deux annuaires dans lesquels j'ai investi la majeure partie de mon temps depuis août 2016:

/home/rick/bin
/usr/local/bin

Lorsque j'ai créé pour la première fois un fichier tar (archive sur bande) à l'aide de ces deux répertoires et que je tentais de m'envoyer un courrier électronique, j'ai reçu cette erreur:

gmail 25MB limit

gmail.com n'acceptera pas les fichiers> 25 Mo

Comment deux répertoires de scripts écrits sur 10 mois peuvent-ils dépasser 25 Mo? A y regarder de plus près, ils sont> 190 MB. Whhaaatttt?

Il s’avère qu’il s’agit d’un fichier unique créé à des fins de test:

-rw-rw-r--  1 rick rick 191143744 Dec 23 17:27 log-gsu-gedit.tst

Supprimez donc ce fichier de test et réexécutez les commandes:

tar -cvf scripts-2017-06-05.tar /home/rick/bin
tar -rvf scripts-2017-06-05.tar /usr/local/bin

La première commande crée le fichier .tar à l'aide d'un répertoire de fichiers de script et la seconde est ajoutée au fichier .tar à l'aide du deuxième répertoire de fichiers de script.

Le fichier .tar a maintenant une taille plus respectable de 1,3 Mo:

-rw-rw-r-- 1 rick rick 1341440 Jun  5 17:27 scripts-2017-06-05.tar

Le moyen le plus simple est d'envoyer un e-mail en pièce jointe

Maintenant que le fichier .tar est créé, allez simplement dans gmail.com et envoyez-le par e-mail en pièce jointe. Dans l'étape suivante, nous voulons un travail cron qui crée le fichier quotidiennement et l'envoie automatiquement par courrier électronique à l'aide de MTA (Agent de transport du courrier). Une option doit être configurée dans gmail.com pour supprimer tous ces courriels de plus de 30 jours. Ainsi, seules 400 Mo environ des sauvegardes de scripts seront stockées.


Modifier le 25 juin 2017

J'ai découvert ce soir des fichiers de configuration difficiles à sauvegarder jusqu'à ce que je tombe par hasard sur ce fil . Les fichiers en question sont dans mon répertoire personnel:

.bashrc
.conkyrc
.websync # one of my own databases
.bafman* # Another one of my own databases

En utilisant le lien ci-dessus, j'ai créé un script appelé ~/bin/backup avec:

#!/bin/bash

if [[ $1 == "" ]] ; then
    echo 'Parameter required for file name, ie "Backup-2017-06-26"'
    echo ".tar will automatically be added as a file extension"
    exit
fi
tar -cvf $1.tar /home/rick/bin
tar -rvf $1.tar /usr/local/bin
find .* -maxdepth 0 -type f -exec tar -rvf $1.tar {} +

Pour voir ce qu'il y a dans l'archive .tar, utilisez la commande suivante:

tar -tvf Backup-2017-06-26.tar

N'oubliez pas de remplacer "Backup-2017-06-26" par le paramètre que vous avez utilisé lors de la création de la sauvegarde.


Edit 1er juillet 2017

Des questions et réponses similaires ont été publiées en novembre 2014: Envoyer une sauvegarde par courrier électronique avec crontab . La réponse acceptée est incluse ci-dessous:

Cette commande suivante a fonctionné pour moi lorsque j'ai testé ma machine.

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]

Donc, probablement l'approche à suivre sera quelque chose comme,

tar -zcf /home/blah/backup.tgz /home/blah/
echo "Please find attached the backup file" | mutt -a "/home/blah/backup.tgz" -s "File attached" -- [email protected]

Je vais enregistrer le script ci-dessus en tant que backup_email.sh et planifier le travail cron en tant que,

0 1 * * * /path/to/backup_email.sh

Références

https://stackoverflow.com/a/9524359/1742825

4
WinEunuuchs2Unix