Резервное копирование конфигурации Linux, сценариев и документов в Gmail

На gmail.com я вижу это:

0,38 ГБ (2%) из 15 ГБ используется

У меня 20 ГБ из моего раздела 30 ГБ, заполненного материалами Ubuntu, но, вероятно, только 1 ГБ важных документов, так почему бы не использовать это бесплатное облачное хранилище для резервного копирования?

Уже есть программа для этого? Я, наверное, все равно напишу, но хотел спросить, прежде чем начать.

Я также хочу сжатие и сегментацию файлов, потому что некоторые системы имеют ограничения на вложения 10 МБ (например, работающее).

Спасибо:)

1 ответ

Решение

Редактировать 3 апреля 2018

Исторический пост в следующем разделе

Оригинальная часть ответа в следующем разделе остается без изменений для исторической ссылки на метод проб и ошибок.

Резервный скрипт для создания.tar файла

Это текущий скрипт резервного копирования:

#!/bin/bash

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

# DATE: July 11, 2017. Modified Oct 20, 2017.

# PARM: 1=backup file name. Extension .tar 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://Ask-ubuntu.ru/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"
HomeDir="/home/Me"                    # Required for cron compatibility
EmailAddr="MyEmail@gmail.com"

cd $HomeDir ||
    exit 1

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

tar -cvpf "$FileName" bin               # create .tar & add user scripts
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/default/grub # bootstrap loader
tar -rvpf "$FileName" /boot/grub        # Custom grub fonts and splash...
tar -vpf "$FileName" /usr/share/plymouth   # ... screen (plymouth)
tar -rvpf "$FileName" /usr/share/plymouth/themes/earth-sunrise/
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

echo "Wait a minute... 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 -- mymail@gmail.com
# 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"
echo -e "to: $EmailAddr\nsubject: $FileName64\n" | \
    (cat - && uuencode "$FileName64" "$FileName64") | ssmtp "$EmailAddr"

#echo -e "to: $EmailAddr\nsubject: $FileName\n" | \
#    (cat - && uuencode "$FileName" "$FileName") | ssmtp "$EmailAddr"

ls -la $FileName
ls -la $FileName64

rm "$FileName"
rm "$FileName64"

exit 0

замещать /home/Me выше с вашим именем пользователя. замещать MyEmail@gamil.com с вашим реальным адресом Gmail. Изменить каталог /mnt/e/bin в каталог вы храните ваши скрипты bash. Сохраните файл и выйдите. Тогда используйте:

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

Это делает скрипт исполняемым.

Обратите внимание, как MBR (Master Boot Record) сохраняется в резервную копию. Отдельный предыдущий шаг для создания ~/.mbr.sav с помощью sudo dd ... требуется, как описано в комментариях к скрипту.

Обратите внимание на dpkg --get-selections линия. Это создает резервную копию списка всех установленных имен приложений.

Самый простой способ автоматизации отправки электронной почты

Из отправки уведомлений по электронной почте с помощью ssmtp мы находим самый простой способ автоматической отправки электронной почты с терминала или скрипта. Шаги установки прямо вперед:

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

Есть один шаг, не упомянутый; Google отправит вам электронное письмо, подтверждающее, что вы хотите разрешить "менее защищенному" приложению отправлять почту с вашей учетной записью:

После установки и настройки ssmpt еще один пакет необходим для того, чтобы прикрепить ваш файл резервной копии.tar к сообщению электронной почты:

sudo apt install sharutils

Этот пакет содержит программу uuencode что необходимо конвертировать двоичные файлы для передачи.

Настроить cron ежедневно вызывать скрипт резервного копирования

Создать файл /etc/cron.daily/daily-backup содержащий:

#!/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

Сохраните файл, выйдите и используйте:

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

Это делает скрипт исполняемым.

Какой cron отправляет вам письма каждое утро

Каждое утро после /etc/cron.daily/daily-backup работает cron отправляет вам два электронных письма. Одним из них является резервная копия Backup-YYYY-MM-DD.tar файл, который в моем случае составляет 5,2 МБ, что я не могу показать вам. Другой - это список всех файлов в резервной копии, которые tar командование доложило cron:

Anacron <Me@gmail.com>
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

Резюме

Ожидание ответа заняло месяц, а затем месяц, чтобы написать ответ, но теперь проект завершен. В дальнейшем это просто вопрос добавления дополнительных каталогов в скрипт резервного копирования.

Следующим проектом будет полное резервное копирование, но оно будет иметь размер 6 ГБ и будет скопировано в gdrive (Google Drive), поскольку размер gmail ограничен 25 МБ. Этот сценарий называется /usr/local/bin/full-backup и включен сюда, если вы заинтересованы:

#!/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 /

Исторический раздел

Это будет скорее "путешествие", чем ответ, поскольку изучаются доступные варианты.

Сделайте резервную копию того, что для вас важнее всего

У меня есть два каталога, в которые я вложил большую часть своего времени с августа 2016 года:

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

Когда я впервые создал tar файл (архив на магнитной ленте) с использованием этих двух каталогов и попытался отправить их мне по электронной почте, я получил эту ошибку:

gmail.com не принимает файлы> 25 МБ

Как два каталога скриптов, написанных за 10 месяцев, могут быть больше 25 МБ? При ближайшем рассмотрении они> 190 МБ. Whhaaatttt?

В результате получается один файл, созданный для тестирования:

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

Поэтому удалите этот тестовый файл и снова запустите команды:

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

Первая команда создает .tar файл, используя один каталог файлов сценариев, а второй добавляет к .tar файл, используя второй каталог файлов сценариев.

.tar Файл теперь более респектабельный размер 1,3 МБ:

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

Самый простой способ - отправить письмо в виде вложения.

Теперь, когда .tar файл создан, просто перейдите в gmail.com и отправьте файл по электронной почте в качестве вложения. На следующем шаге мы хотим cron Работа, которая ежедневно создает файл и автоматически отправляет его по электронной почте, используя MTA (Почтовый транспортный агент). На gmail.com должна быть настроена опция, чтобы удалить все эти письма старше 30 дней. Таким образом, будет сохранено только около 400 МБ от общего количества резервных копий сценариев.


Редактировать 25 июня 2017 г.

Сегодня вечером я обнаружил, что некоторые файлы конфигурации трудно скопировать, пока я не наткнулся на этот поток. Эти файлы находятся в моем домашнем каталоге:

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

Используя ссылку выше, я создал скрипт под названием ~/bin/backup с:

#!/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 {} +

Чтобы посмотреть, что находится в .tar архив используйте команду:

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

Не забудьте заменить "Backup-2017-06-26" на параметр, который вы использовали при создании резервной копии.


Редактировать 1 июля 2017 г.

Аналогичные вопросы и ответы были опубликованы в ноябре 2014 года: отправьте резервную копию по электронной почте с помощью crontab. Принятый ответ включен ниже:

Эта следующая команда работала для меня, когда я тестировал на своей машине.

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com

Так что, вероятно, подход, которому нужно следовать, будет чем-то вроде

tar -zcf /home/blah/backup.tgz /home/blah/
echo "Please find attached the backup file" | mutt -a "/home/blah/backup.tgz" -s "File attached" -- recipient@domain.com

Я сохраню приведенный выше скрипт как backup_email.sh и запланировать работу cron как,

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

Рекомендации

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

Другие вопросы по тегам