Бэкап Linux и восстановление его на другом железе
Я работаю в организации с маленьким штатом, деятельность тесно связана с IT и у нас возникают задачи по системному администрированию. Мне это интересно и частенько я беру на себя решение некоторых.
На прошлой неделе мы настраивали FreePBX под debian 7.8, нанимали фрилансера. В процессе настройки оказалось, что сервер (да, я так называю обычный PC) не хочет грузится с HDD при подключенных USB 3G модемах, которые мы используем для звонков на мобильные, колупание BIOSа не помогло. Непорядок. Решил, что нужно перенести его на другую железяку. Так появилось сразу две связанные задачи:
Опыт общения с linux-системами у меня небольшой: настройка VPN сервера на open-vpn, ftp-сервера и еще пара мелочей. Сам себя я характеризую как человека умеющего читать маны и править конфиги 🙂
Ниже я описываю свой частный случай и почему я поступил именно так. Надеюсь, новичкам будет полезно, а бородатые админы улыбнутся вспомнив молодость.
Начинаем копать теорию:
По созданию бэкапов уйма статей, я для себя отметил два способа: tar — упаковывает и сжимает все файлы, при этом не сохраняется MBR, мой бэкап будет весить около 1.5 Gb; dd — делает полную копию раздела, включая MBR и всю область, где нет файлов, архив будет равен размеру раздела, в моем случае ~490 Gb.
Второй способ требует наличия внешнего жесткого диска объемом не меньше раздела, который архивируем. Да и что с ним потом делать, непонятно, хранить на полочке? Остановился на tar, чуть сложнее в реализации, нужно будет создать MBR, но время создания/восстановления архива существенно меньше, хранить бэкап проще, полтора гига можно закинуть в облако и скачать, когда будет нужно. Записывать его можно на ту же live-флэшку, с которой буду грузиться.
Итак, план действия:
- создание бэкапа;
- форматирование, разметка диска, создание файловой системы;
- восстановление бэкапа;
- создание MBR;
- тестирование и устранение неполадок.
1. Создание бэкапа
Грузимся с live-флэшки, у меня это debian-live-7.8.0-amd64-standard.
Монтируем раздел, который будем архивировать, у меня это sda1, чтобы случайно не наломать дров, монтируем только для чтения. Посмотреть все свои разделы можно при помощи команд ls /dev | grep sd или df -l
Наша флэшка уже примонтирована, но в режиме только чтения, нужно перемонтировать для чтения-записи, чтобы писать туда бэкап.
mount -o remount,rw /dev/sdb1 /lib/live/mount/medium
Все готово для создания архива
tar -cvzpf /lib/live/mount/medium/backupYYYYMMDD.tgz --exclude=/mnt/var/spool/asterisk/monitor --exclude=/mnt/var/spool/asterisk/backup /mnt/
Здесь у нас параметры: c — создать архив, v — выводить информацию о процессе, z — использовать сжатие gzip, p — сохраняем данные о владельцах и правах доступа, f — пишем архив в файл, путь к файлу, —exclude — исключаем из архива каталог (я исключил каталоги с записями разговоров и каталог с бэкапами FreePBX), /mnt/ — каталог, который архивируем.
Ждем… у меня вся подготовка и создание архива заняли 10 минут. Будь флэшка быстрее, уложился бы в 7-8 минут.
Складываем архив в надежное место за пределами офиса.
Восстановление бэкапа на другом железе
2. Размечаем диск, создаем файловую систему
Грузимся с live-флэшки, у меня все та же debian-live-7.8.0.
Размечаем диск. Мне понравилась утилита с псевдографическим интерфейсом cfdisk. Там все просто и понятно.
Удаляем все имеющиеся разделы. Я создал два новых раздела, один на 490 Gb под / (sda1) и 10 Gb под swap (sda2) в конце диска, т.к. он практически не будет задействован. Проверим типы разделов. Который под систему должен иметь тип 83 Linux, второй — 82 Linux swap / Solaris. Помечаем системный раздел загрузочным (bootable), сохраняем изменения и выходим.
Cоздаем файловую систему на первом разделе.
3. Распаковываем архив.
Монтируем отформатированный раздел
Распаковываем архив прямо с флэшки
tar --same-owner -xvpf /lib/live/mount/medium/backupYYYYMMDD.tgz -C /mnt/
Параметр —same-owner — сохраняет владельцев у распаковываемых файлов, x — извлекаем из архива, v — выводить информацию о процессе, p — сохраняем права доступа, f — указываем файл, который распаковываем, C — распаковываем в категорию.
4. Создаем MBR на новом диске.
Чтобы корректно создать загрузочную запись, монтируем рабочие каталоги к нашему будущему root-каталогу, у меня это /mnt. Каталоги /dev и /proc сейчас используются live-системой, используем параметр bind, чтобы они были доступны сразу в двух местах:
mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc
Переключаемся на новую систему используя chroot:
Делаем swap-раздел для новой системы:
Чтобы grub работал, нужно указать ему правильные UUID разделов в fstab, сейчас там прописаны разделы предыдущей системы:
Открываем второй терминал (Alt+F2) под root:
И видим текущие UUID разделов.
Вручную переписываем их в fstab переключаясь между Alt+F1 и Alt+F2. Да, муторно, но попытки копировать занимали у меня больше времени, чем переписывание. Сохраняем fstab.
Устанавливаем grub2. У меня один физический диск, поэтому ставим его на sda:
На чистый диск должно встать без ошибок. Обновляем информацию из fstab:
Возвращаемся в Live-систему:
Размонтируем все каталоги:
umount /mnt/dev umount /mnt/proc umount /mnt
Если вылазят процессы, которые используют эти каталоги, убиваем их используя fuser.
Все, поехали. Грузимся с жесткого диска:
Здесь статья должна была закончиться, но у меня возникли проблемы с подключением к интернету. Сервер видит сеть, видит компьютеры в ней, но в интернет не ходит… а это как бы важно для телефонии.
5. Тестирование и устранение неполадок.
Показывет интерфейсы eth1 и lo, гугление сказало, что gateway можно прописать только подключению eth0, остальные рассчитаны только на работу внутри сети.
Похоже, отсутствие eth0 вызвано способом переноса системы. Находим файл, который отвечает за нумерацию интерфейсов, смотрим туда:
nano /etc/udev/rules.d/70-persistent-net.rules
Действительно, там два активных интерфейса, определенных MAC’ами. Комментируем первый, второму прописываем eth0.
Перезапуск /etс/init.d/networking не помог, поэтому перезагружаемся:
Пример скрипта для создания резервной копии файлового сервера
Обновлено: 19.06.2023 Опубликовано: 24.05.2022
- Ежедневная актуализация данных в каталоге резервный копий daily.
- Еженедельная актуализация данных в каталоге резервный копий weekly.
- Создание полного архива с данными раз в 30 дней.
- Старые архивы (которым более 370 дней) будут удаляться.
Пример скрипта
Скрипт будет сравнивать файлы в рабочем каталоге и папке резервного копирования с помощью rsync. Это позволит нам сэкономить на времени выполнения задания. Долго будет выполняться только задание создания архива с помощью tar.
Создаем каталог для скриптов и сам скрипт:
- #!/bin/bash
- PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
- source=»/data»
- destination_root=»/backup»
- fdate=$(date +%Y-%m-%d)
- # Clean old archives
- find $/archive -type f -name «*.tar.gz» -ctime +370 -exec rm -R <> \; 2>&1
- # Daily
- rsync -a —partial —inplace —append —delete-after $/ $/daily/
- # Weekly
- if [[ $(date +%u) -eq 0 ]]
- then
- rsync -a —partial —inplace —append —delete-after $/ $/weekly/
- fi
- # Archive
- count_last_archives=$(find $/archive/ -name «*.tar.gz» -mtime -30 | wc -l)
- if [[ $count_last_archives -eq 0 ]]
- then
- cd $
- tar zcf $/archive/samba_$.tar.gz ./*
- fi
Задаем права скрипту на выполнение:
chmod +x /scripts/samba_backup.sh
Описание скрипта
Опишем значимые строки нашего скрипта:
1 | Указываем на путь к интерпретатору. |
2 | Задаем системные переменные, чтобы не пришлось в скрипте прописывать полные пути до исполняемых файлов. |
4 — 6 | Задаем переменные. |
4 | Каталог и рабочими данными, которые нужно резервировать. |
5 | Корневая папка, где нужно хранить резервные копии. |
6 | Дата, когда запускается скрипт. Используется для |
9 | Поиск и удаление всех архивов, которым более 370 дней. |
11 — 18 | Синхронизация данных с помощью rsync |
12 | Выполнение синхронизации данных в каталог daily. |
15 | Задаем условие. Номер дня недели должен равняться 0 (воскресенье). Если это так, то будет выполнена строка 17. |
17 | Выполнение синхронизации данных в каталог weekly. |
20 — 26 | Создание архива. |
21 | Получим количество файлов с архивами, которым меньше 30 дней и сохраним результат в переменную count_last_archives. |
22 | Проверяем условие, равна ли переменная count_last_archives нулю. На практике это значит, что за последние 30 дней у нас нет ни одного архива. Если это так, то выполняем строки 24 — 25. |
24 | Переходим внутрь каталога с рабочими данными. Это нужно для того, чтобы наш архив создавался относительно не корня, а рабочего каталога. Так удобнее при восстановлении данных. |
25 | С помощью утилиты tar мы архивируем все данные и создаем архив в каталоге archive. В название архива добавляем дату его создания. |
Подготовка системы
Создаем каталоги, в которых будут храниться резервные копии:
В нашем примере, это три каталога, относительно, папки /backup:
- daily — ежедневные копии. Для быстрого восстановления.
- weekly — еженедельные. На случай, если ежедневный бэкап успел стереть важные данные.
- archive — архивы на крайний случай.
Наша система готова к созданию резервных копий.
Сохранение данных на удаленном компьютере
Резервные копии необходимо создавать на удаленном компьютере или внешнем диске, чтобы они были доступны при выходе из строя сервера. Предположим, у нас используется общая папка на удаленном сервере, в которой будут размещаться файлы с backup.
Чтобы упростить процесс монтирования сетевой папки, откроем на редактирование следующий файл:
//192.168.0.1/backup /mnt cifs user,rw,noauto,credentials=/root/.smbclient 0 0
* в данном примере выполняется монтирование общей папки backup на сервере с IP-адресом 192.168.0.1 в каталог /mnt. В качестве сетевой файловой системы используется cifs (протокол SMB: сервер samba или общая папка Windows). Параметры для подключения — user: позволяет выполнить монтирование любому пользователю, rw: с правом на чтение и запись, noauto: не монтировать автоматически при старте системы, credentials: файл, в котором написаны логин и пароль для подключения к общей папке.
Теперь создадим файл с логином и паролем:
и приведем его к следующему виду:
* где username: имя пользователя, password: пароль. Само собой, в вашем случае указываются свои данные.
Устанавливаем пакет cifs-utils, позволяющий в Linux монтировать smb-шары. В зависимости от типа Linux, команды будут немного различаться.
а) Deb (Ubuntu / Debian, Astra Linux):
б) RPM (Rocky Linux / РЕД ОС / CentOS):
Теперь введите следующую команду:
Должна примонтировать сетевая папка //192.168.0.1/backup. Это можно проверить следующей командой:
Подробнее про монтирование сетевых папок читайте в инструкции Как в Linux монтировать шару CIFS.
Автоматический запуск по расписанию
Создадим правило в cron для автоматического запуска нашего скрипта. Выполняем команду:
0 3 * * * /scripts/samba_backup.sh
* в данном примере мы будем запускать резервирование каждый день в 3 часа ночи.