rsync — Automated backup script (with snapshots)

Написал(а): ZeroChaos| Когда: 16 января, 2012 г.

Решил немного упростить задачу резервного копирования при помощи rsync и написал для этого небольшой скрипт на bash. Да, знаю, уже есть несколько решений, упрощающих backup при помощи rsync, но для того, чтобы выполнить требуемую задачу, все равно пришлось бы писать для этого свою обвязку. Потому было принято решение написать что-то свое, максимально упрощающее задачу бэкапа и сопутствующих этому действий, таких как генерация ключа для авторизации по ssh, а так же его копирование на backup-сервер.

Следующий скрипт позволяет читать список копирумых каталогов из текстового файла, применять маску исключений, задаваемую в текстовом файле, а так же опционально делать snapshot’ы, содержащие измененные, либо удаленные файлы. Тем самым, появляется возможность откатиться на старые версии файлов, случайно удаленных, к примеру, либо ошибочно измененных. При этом сохраняется полная изначальная структура каталогов, что позволяет легко найти требуемый файл. Snapshot’ы хранятся в каталогах со следующей маской в имени: ‘год-месяц-день.XXчXXм’. Есть возможность авто-ротации snapshot’ов.

backup.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/bin/sh

# --------------------------------------------
# Automated backup script
# Written by ZeroChaos
# Version 1.1, 2012-01-14
# Site: http://zerolab.net/
# --------------------------------------------
# NOTE: Exclude spaces in the variable FOLDER!
# --------------------------------------------
# set -e

# -------------------------------------------- begin of [Configurable settings]
# Use SSH for sync
export RSYNC_RSH="ssh -c arcfour -o Compression=no -x"

# Remote account
USER="zerochaos"
HOST="zerolab.net"
REMOTEHOST="${USER}@${HOST}"

# Enable or disable snapshot
SNAPSHOT="true"
# Auto-rotate (days)
SDAYS="15"

# Destination folder, snapshot directory
DEST_point="/home/zerochaos/www/"
SDIR="snapshot"
SNAPSHOT_dir="${DEST_point}${SDIR}/`date +'%Y-%m-%d.%Hh%Mm'`"

# Take the list from the same folder where the script is called
DIR=$(dirname "$0")
LISTFOLDERS=$DIR/backup.txt
LISTEXCLUDES=$DIR/exclude.txt
STRDEL="# begin of [do not delete this string]"
# -------------------------------------------- end of [Configurable settings]

# -------------------------------------------- begin of [Do not touch this section]
# If no arguments
if [ $# = 0 ]; then
    while read FOLDER; do
        if [ -n "$FOLDER" ] && [ "$FOLDER" != "$STRDEL" ]; then
            FOLDERNAME="`echo "$FOLDER" | awk -F/ '{ print $NF }'`"
            # Options for rsync
            if [ $SNAPSHOT = "true" ]; then
                OPTIONS="-Sazq --bwlimit=3840 --delete --exclude-from=$LISTEXCLUDES --backup --backup-dir=$SNAPSHOT_dir/$FOLDERNAME"
            else
                OPTIONS="-Sazq --bwlimit=3840 --delete --exclude-from=$LISTEXCLUDES"
            fi
            # Sync
            rsync $OPTIONS "${FOLDER}/" $REMOTEHOST:"${DEST_point}${FOLDERNAME}/"
        fi
    done < $LISTFOLDERS
    # Snapshot auto-rotate
    if [ $SNAPSHOT = "true" ]; then
        ssh $REMOTEHOST "find ${DEST_point}${SDIR}/ -type d -mtime +$SDAYS -exec rm -r {} \;" >/dev/null 2>&1
    fi
fi

# Generate public/private rsa key pair
ssh_keygen() {
    ssh-keygen -t rsa -b 4096
}

# Copy your public key on a remote machine
ssh_copy_id() {
    ID_FILE="${HOME}/.ssh/id_rsa.pub"

    if [ x$SSH_AUTH_SOCK != x ] && ssh-add -L >/dev/null 2>&1; then
      GET_ID="$GET_ID ssh-add -L"
    fi

    if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ]; then
      GET_ID="cat ${ID_FILE}"
    fi

    if [ -z "`eval $GET_ID`" ]; then
      echo "$0: ERROR: No identities found" >&2
      exit 1
    fi

    { eval "$GET_ID" ; } | ssh ${REMOTEHOST%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1
}

ME=$(basename "$0")
print_help() {
    echo
    echo "Usage: $ME [OPTION...]"
    echo
    echo "Options:"
    echo "         -g     Generate public/private rsa key pair:"
    echo "                ssh-keygen -t rsa -b 4096"
    echo "         -c     Copy your public key on a remote machine:"
    echo "                ssh-copy-id $REMOTEHOST"
    echo "         -h     Help."
    echo
    echo "Example: $ME -gc"
    echo "Use both options, generate & copy."
    echo
}

while getopts ":gch" opt;
do
    case $opt in
        g) ssh_keygen;
            ;;
        c) ssh_copy_id;
            ;;
        h) print_help;
            ;;
        *) echo "Wrong option";
            echo "For help, use: $ME -h";
            exit 1
            ;;
        esac
done
# -------------------------------------------- end of [Do not touch this section]

Сохраните содержимое в файл backup.sh и дайте права на выполнение:

1
chmod -x backup.sh

Положите файлы backup.txt и exclude.txt рядом со скриптом. Формат файлов представлен ниже.

backup.txt:

1
2
3
4
5
# begin of [do not delete this string]
/home/zerochaos/www/msilab.net
/home/zerochaos/www/ruslab.net
/home/zerochaos/www/zerolab.net
# end of [do not delete this string]

exclude.txt:

1
2
3
4
5
6
temp/summ/checks/*
temp/sess/*
temp/tmp/*
template_cache/*
cache/*
logs/*

Параметры, поддающиеся настройке в backup.sh, вынесены в отдельную секцию и снабжены соответствующими комментариями. Для связи с backup-сервером будем использовать протокол ssh, для авторизации воспользуемся беспарольным вариантом, т.е. авторизацией по ключу. Для этого сгенерируем пару public/private rsa key. Выполним скрипт с ключом -g:

1
backup.sh -g

Отвечаем на заданные вопросы и переходим к копированию открытого ключа на удаленный сервер. Для этого выполним скрипт с ключом -c:

1
backup.sh -c

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

1
backup.sh -gc

Остается добавить скрипт в cron:

1
2
#minute hour    mday    month   wday    command
00      1       *       *       *       sh /scripts/backup.sh

Вот и все, настраивайте список копируемых каталогов, список исключений, конечную директорию и параметры создания снапшотов. Надеюсь этот скрипт окажется для многих полезным и сэкономит много времени и сил. Всегда делайте backup’ы.

{ Нет комментариев }

HP ProLiant MicroServer N40L with 8GB Memory

Написал(а): ZeroChaos| Когда: 11 января, 2012 г.

Вот она! Домашняя серверная, ужатая до минимума. Наконец-то нормальная лаба с гипервизором на борту. HP ProLiant MicroServer N40L. 8ГБ оперативы, 4 корзины под HDD + 1, полученная с помощью конвертера 5.25″ ODD Bay to 3.5″ HDD Bay. Поддерживаются диски до 4ТБ, в теории можно собрать хранилище на 20ТБ (+ еще на eSata можно один повесить, получится 24ТБ o_O). Но, думаю, ограничусь 5×3ТБ, когда диски подешевеют, а случится это, похоже, не скоро, долго еще спекулировать будут.

{ Комментариев - 6 }

Russia. Freedom.

Написал(а): ZeroChaos| Когда: 20 декабря, 2011 г.

Подумайте о своём будущем

Написал(а): ZeroChaos| Когда: 2 декабря, 2011 г.

На выборы идти надо, что бы вам не говорили, но если не хотите чтобы за вас проголосовали как нужно им (ПЖиВ), нужно идти, не дайте им использовать свой бюллетень (порча его так же ни к чему не приведет). Хорошенько подумайте над своим выбором. До выборов осталось всего ничего, каким бы сложным выбор ни был, для себя я его сделал. Не дайте прокатить себя на «каруселе», сегодня вы продали свой голос за рубль, завтра вас прокатят на миллион, не дайте возможности жуликам и ворам остаться у руля. Подумайте о своём будущем.

» Читать полностью »

Mac OS X Snow Leopard — исправляем переход на зимнее время

Написал(а): ZeroChaos| Когда: 30 октября, 2011 г.

По какой-то причине, в Apple решили обделить пользователей Snow Leopard и не предоставили обновление часовых поясов, поэтому, мы можем наблюдать перевод на зимнее время, которого теперь быть не должно. К слову, в OS X Lion и iOS 5 с этим проблем нет.

Исправим эту неприятность. Открываем консоль и последовательно выполняем:

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir temp-tz
cd temp-tz
curl -O http://www.iana.org/time-zones/repository/releases/tzdata2011m.tar.gz
tar zxvf tzdata2011m.tar.gz
sudo zic europe
curl -O http://www.opensource.apple.com/tarballs/ICU/ICU-400.42.tar.gz
tar zxvf ICU-400.42.tar.gz
cp tzdata2011m.tar.gz ICU-400.42/icuSources/tools/tzcode/
cd ICU-400.42/icuSources
./runConfigureICU MacOSX --with-data-packaging=archive
gnumake
sudo install -o root -g wheel -m 0644 -Sp data/out/icudt40l.dat /usr/share/icu/icudt40l.dat
cd ../../../ && rm -rf temp-tz

Перезагружаемся.

P.S. Для компиляции у вас должен быть установлен GCC (входит в пакет Xcode).

{ Комментариев - 4 }

RIP Steve Jobs. 1955-2011

Написал(а): ZeroChaos| Когда: 6 октября, 2011 г.

RIP Steve Jobs

Ушёл кумир. Ушёл гений. Ушёл из жизни человек, изменивший мир. Светлая память, Стив.

{ Нет комментариев }

Nook Touch — System backup on the OS X

Написал(а): ZeroChaos| Когда: 3 сентября, 2011 г.

nook_touch_backup

1. Скачайте noogie.img

2. Введите в терминале:

1
diskutil list

или

1
df -h

И ищите свою карту памяти.

3. Размонтируйте карту памяти:

1
diskutil unmountDisk /dev/disk#

Где # — номер устройства, не используйте при размонтировании disk#s# (где s — slice). После чего будет сообщение об успешном размонтировании всех томов карты памяти.

4. Разворачиваем образ на карту памяти:

1
dd if=noogie.img of=/dev/rdisk# bs=1m

5. Загрузите свой NOOK Touch со вставленной только что приготовленной картой памяти. Подключите Nook по USB к компьютеру.

6. Введите в терминале:

1
diskutil list

или

1
df -h

И ищите карту памяти Nook.

7. Размонтируйте карту памяти:

1
diskutil unmountDisk /dev/disk#

8. Снимите образ:

1
2
cd ~/Desktop
dd if=/dev/rdisk# of=nook_touch_backup.img bs=1m

Где # — запомненный ранее номер устройства.

После чего получите образ с именем nook_touch_backup.img на своем рабочем столе. Удостоверьтесь, что размер образа получился 1958739968 байт.

Для восстановления из образа:

1
dd if=nook_touch_backup.img of=/dev/rdisk# bs=1m

{ Комментариев - 3 }

Nook Touch — Root package and a minimal set of tools

Написал(а): ZeroChaos| Когда: 3 сентября, 2011 г.

ReLauch touch-nooter-zc

Что входит в пакет:

Системные:
- Root (patched uRamdisk (adb via Wi-Fi), su, busybox, SuperUser.apk)
- Any Soft Keyboard + Russian Language Pack (урезал с 1496 КБ до 549 КБ, убрав словари; пересобрал клавиатуру из последних исходных кодов; выкинул все лишнее; смерджил русскую версию в основной пакет; цветовую схему и размер кнопок приблизил к оригинальной клавиатуре; принудительно отключены всплывающие подсказки, что полностью решило проблему падения клавиатуры в некоторых приложениях без необходимости плясать с бубном; немного переделал интерфейс; сделал 2 темы под E-Ink, между которыми можно сделать выбор; доперевел недостающие пункты; немного поправил то, что уже было локализовано (совсем немного, по-хорошему, там с нуля нужно садиться и переводить, но времени нет))
- Nook Color Tools (с добавленной alexstsv возможностью вызова по кнопке ‘N’ -> ‘settings’)

Пользовательские:
- ReLaunch
- Zeam Launcher (русская версия от kaznelson, по методе alexstsv добавил возможность вызова по кнопке ‘N’ -> ‘home’)
- MoreLocale
- Root Explorer

- Remap левых кнопок (Menu, Back)
- Переносы (hyph_ru.dic)
- Обновление tzdata (база данных часовых поясов)

- Возможен полный откат до заводской прошивки (удаляется только то, что установилось из образа и не более, tzdata останутся обновленными), для этого достаточно на карте с развернутым образом переименовать файл-пустышку с именем ‘-rm‘ в ‘rm‘ и загрузиться с этой карты. Удаляются приложения и утилиты, чистятся настройки, wiping dalvik-cache.
- Образ сделан универсальным, можно ставить root или не ставить, можно ставить на версию прошивки 1.0.0, 1.0.1, 1.1.0.
По порядку:
1) Чтобы не устанавливать root, просто удалите файл-пустышку с именем ‘110‘ на карте памяти с развернутым образом.
2) По умолчанию устанавливается пропатченный uRamdisk для версии 1.1.0. Чтобы установить для версии 1.0.0, переименуйте файл-пустышку ‘110‘ в ‘100‘; чтобы установить для версии 1.0.1, переименуйте файл-пустышку ‘110‘ в ‘101‘ соответственно. При удалении также не забудьте переименовать, взяв во внимание свою версию прошивки, чтобы восстановился соответствующий родной uRamdisk.
- Лог всех операций после завершения установки сохраняется в файл ‘/log/zcnooter.log’.
- После установки устройство успешно загрузится, проверьте что все работает, выньте карту памяти и перезагрузите устройство. Карту памяти можете отформатировать на компьютере и после этого использовать ее на нуке.
- Образ ужат до минимума, качать придется всего около 5 МБ.
- Для установки своих системных приложений поместите их в папку ‘/custom/system/app‘, для установки обычных приложений в ‘/custom/data/app‘.
- Добавлена возможность выборочной установки приложений, утилит и прочего из базового пакета. Для этого просто отредактируйте на карте памяти файлы ‘system.txt‘ и ‘data.txt‘, удалив строки с ненужными пакетами:

listsystem

Настройки хранятся в папке ‘settings‘.

При первом запуске и по кнопке ‘N‘ -> ‘home‘ ставим по умолчанию загружать ReLaunch или Zeam Launcher. Теперь у нас всегда на рабочем столе будет наш ланчер. Все остальное легко доставляем через любой файловый менеджер по тапу на apk, для гиков же никто не отменял adb.

Скачать для 1.0.0/1.0.1/1.1.0 (универсальный) (обновлено: 19.12.2011) [~5.5 МБайт]

Русская клавиатура:

nt-keyboard nt-keyboard

» Читать полностью »

{ Комментариев - 100 }

CyanogenMod 7 Gingerbread 2.3.5(7) for Samsung Galaxy Tab 7″ GSM (Slightly modified)

Написал(а): ZeroChaos| Когда: 13 августа, 2011 г.

[GSM] CM7 Gingerbread с небольшой доработкой.

Особенности:

Изменено:
- Плотность экрана 240 (как в стоковых прошивках от Samsung, а не 200, как по дефолту от майнтейнера CM7 под SGT)
- Монтирование внутренней памяти в /mnt/sdcard, внешней в /mnt/sdcard/external_sd (как в стоковых прошивках от Samsung)
Удалено:
- программы CMStats.apk, CMUpdateNotify.apk, Development.apk, RomManager.apk, Stk.apk

Прошивка через Heimdall:

1
heimdall flash --repartition --pit gt-p1000_mr.pit --cache cache.ext4 --dbdata dbdata.ext4 --factoryfs factoryfs.ext4 --primary-boot boot.bin --secondary-boot Sbl.bin --param param.lfs --kernel zImage

Скачать:
CM7-Gingerbread-Beta-2011-11-02-Mod-ZEROLAB-DOT-NET (Android 2.3.7)
CM7-Gingerbread-Beta-2011-10-09-Mod-ZEROLAB-DOT-NET (Android 2.3.7)
CM7-Gingerbread-Beta-2011-09-19-Mod-ZEROLAB-DOT-NET (Android 2.3.5)
CM7-Gingerbread-Beta-2011-08-07-Mod-ZEROLAB-DOT-NET (Android 2.3.5)

{ Нет комментариев }

iBooks theme for Cool Reader

Написал(а): ZeroChaos| Когда: 4 июля, 2011 г.

Цветовая схема из iBooks с iPad. Уж больно комфортно читать в iBooks, постарался максимально воспроизвести среду для Cool Reader на Samsung Galaxy Tab 7″.

Background:

Цвет текста (Шрифт — Georgia):
#3d2816
RGB:
61
40
22

Цвет колонтитулов (Шрифт — Myriad Pro):
#704f32
RGB:
112
79
50

Установка: качаем background по ссылке с миниатюры выше и кладем в папку ‘/cr3/backgrounds’ на внутреннюю или внешнюю память устройства. Выбираем в ‘Настройки’ — ‘Цвет фона’. Настраиваем тип шрифта для основного текста и колонтитулов, а также цветовую схему.

Как это выглядит:

{ Нет комментариев }