Когда у вас в продакшине крутится много разных программ и сервисов, то вопрос резервного копирования данных очень актуален. Потому что любой сервер можно настроить заново, любое оборудование тоже можно купить заново, но данные... Данные, наработанные годами, вы не сможете ни от куда взять заново. Например, у меня на работе, есть несколько конфигураций 1с со множеством баз данных, есть отдельная самописная учётная система, базирующаяся на MS Access, есть несколько сайтов, есть файловое хранилище, есть почтовый сервер и ещё множество всего другого по мелочи. И, само собой, что всё это надо бэкапить. Поэтому я решил настроить специальное хранилище под всевозможные бэкапы, чтобы бэкапы всего и вся лежали в одном надёжном месте.
В каком виде я его решил реализовать:
- имеется старенькая, но надёжная машина
- имеется укромное место вне серверной поближе к выходу из здания
- имеются 4 новеньких жёстких диска на 3тб
Сервер бэкапов я решил установить в какое-нибудь укромное место, которое было бы поближе к выходу, и о котором мало кто знает. Это для того, чтобы, в случае какого-либо ч/п или форс мажора, эту машину можно было выключить и быстро вынести из здания.
Обязательным требованием будет шифрование — это для того, чтобы до данных было невозможно добраться, если вдруг этот сервер попадёт в чужие руки. Ведь на нём будут храниться абсолютно все данные компании.
Итак, подводя итоги, на сервере бэкапов у меня должно быть следующее:
- отдельный диск или массив под систему
- отдельный программный массив под хранилище бэкапов. Именно программный, чтобы его можно было собрать на любом другом компе потом.
- на массиве под хранилище бэкапов должна быть шифрованная файловая система
- поскольку сервер будет стоять не в серверной, то должна быть система мониторинга температуры дисков, которая будет выключать сервер в случае перегревания дисков и посылать об этом сообщение админу. Потому что, бывает, что вентиляторы подводят.
- должна быть настроена samba для доступа из-под Windows
- должен быть настроен nfs-сервер для доступа из-под Linux и FreeBSD
Всё это будет функционировать на Fedora 17. Установка будет вестись через графический интерфейс anaconda. Если у вас уже подключены все диски: и для системы и для массива бэкапов, то при установке ставьте систему на диск для системы, а диски для массива не трогайте совсем.
При установке я выбрал следующие компоненты:
- в меню серверы выделил: файловый сервер для windows и сервер службы каталогов
- в меню базовая система выделил: поддержка оборудования и системные средства. А в уже в самих системных средствах галки оставил только на: mc, samba-client, screen и yum-utils
Остальное буду доустанавливать в процессе настройки. После установки системы нужно провести базовую настройку: настроить сеть, поставить обновления, отключить selinux и прочие действия, которые я уже много раз описывал в других статьях. Например вот в этих:
http://technotrance.su/index.php/moi-stati/linux-fedora/item/21-openmeetings2
http://technotrance.su/index.php/moi-stati/linux-fedora/item/19-1c-linux
После базовой настройки приступим к созданию программного raid-массива из 4-ёх трёхтерабайтных дисков. Мне в этом помогли вот эти статьи:
http://www.linuxhome.ru/sozdanie-v-linux-razdelov-bolee-2tb/
http://xgu.ru/wiki/Программный_RAID_в_Linux
Для начала, нужно выяснить, как эти диски обозначились в системе. Это можно узнать командой:
dmesg | grep sd
У меня её вывод был таким:
[ 0.992059] sd 0:0:0:0: Attached scsi generic sg0 type 0
[ 0.992063] sd 0:0:0:0: [sda] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
[ 0.992065] sd 0:0:0:0: [sda] 4096-byte physical blocks
[ 0.992137] sd 0:0:0:0: [sda] Write Protect is off
[ 0.992139] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 0.992152] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 0.992242] sd 1:0:0:0: [sdb] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
[ 0.992244] sd 1:0:0:0: [sdb] 4096-byte physical blocks
[ 0.992321] sd 1:0:0:0: [sdb] Write Protect is off
[ 0.992323] sd 1:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[ 0.992340] sd 1:0:0:0: Attached scsi generic sg1 type 0
[ 0.992348] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 0.993626] sd 4:0:0:0: [sdc] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
[ 0.993628] sd 4:0:0:0: [sdc] 4096-byte physical blocks
[ 0.993635] sd 4:0:0:0: Attached scsi generic sg2 type 0
[ 0.993664] sd 4:0:0:0: [sdc] Write Protect is off
[ 0.993666] sd 4:0:0:0: [sdc] Mode Sense: 00 3a 00 00
[ 0.993682] sd 4:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 0.993778] sd 5:0:0:0: [sdd] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
[ 0.993780] sd 5:0:0:0: [sdd] 4096-byte physical blocks
[ 0.993790] sd 5:0:0:0: Attached scsi generic sg3 type 0
[ 0.993854] sd 5:0:0:0: [sdd] Write Protect is off
[ 0.993856] sd 5:0:0:0: [sdd] Mode Sense: 00 3a 00 00
т.е. диски для массива — это /dev/sda, /dev/sdb, /dev/sdc и /dev/sdd
На этих дисках нужно создать разделы, которые будут использоваться под программный raid-массив. И поскольку диски больше 2ТБ, то для этого понадобится программа parted. Она уже должна быть в установленной системе. Но если вдруг нет, то ставим её:
yum -y install parted
Теперь на каждом диске надо создать новую метку таблиц GPT и создать сам раздел. Показываю это на примере первого диска, с остальными тремя надо сделать всё тоже самое:
parted /dev/sda
mklabel gpt # создаём новую GPT метку
mkpart primary 0 -0 # создаём раздел на все свободное место
после последней команды parted выдаст вот такое предупреждение:
Предупреждение: The resulting partition is not properly aligned for best performance.
Игнорировать/Ignore/Отменить/Cancel?
Собственно, это предупреждение можно игнорировать, набрав Ignore. А можно поступить, как написано тут:
Точнее, вам и придётся поступить, как написано в ссылке выше, если после игнорирования ошибки вылезет сообщение:
You should align the first partition at block 64
Поэтому тут сами принимайте решение. Я нажал Ignore, и у меня ругань не вылезла. После всех команд выше жмите:
quit
для выхода из parted. С остальными тремя дисками проделываем точно такую же процедуру.
Итак, теперь мы имеем разделы для raid-массива. Приступим к его созданию. Ставим программу mdadm:
yum -y install mdadm
Затем создаём массив вот такой командой:
mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
где /dev/md0 — это название нового программного raid
level=10 — уровень раида. Т.е. я создал raid10.
raid-devices=4 — означает, что массив состоит из 4-ёх дисков
ну и дальше перечислены сами диски и их разделы, которые участвуют в рэиде. Если эта команда отработала примерно вот в таком виде:
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 3221225472K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
то значит всё в порядке. Убедиться, что RAID-массив проинициализирован корректно можно командой:
cat /proc/mdstat
Вывод должен быть примерно такой:
Personalities : [raid10] md0 : active raid10 sdc1[2] sda1[0] sdb1[1] sdd1[3] 5860267008 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU] [>....................] resync = 1.9% (82737792/5860267008) finish=358.3min speed=195874K/sec unused devices:
Поскольку мы массив только что создали, то он ещё не успел синхронизироваться, и мы как раз видим, что этот процесс как раз и идёт.
Операционная система сама не запоминает какие RAID-массивы ей нужно создать и какие компоненты в них входят. Эта информация находится в файле /etc/mdadm/mdadm.conf, который надо создать. Но создадим сначала каталог:
mkdir /etc/mdadm
А потом создаём и заполняем файл mdadm.conf вот таким хитрым методом:
echo "DEVICE partitions" > /etc/mdadm/mdadm.conf
mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf
В итоге содержание файла /etc/mdadm/mdadm.conf у меня стало таким:
DEVICE partitions
ARRAY /dev/md0 level=raid10 num-devices=4 metadata=1.2 name=back-serv.maindomain.local:0 UUID=5e125d2d:236de7f8:ada9b0b4:2c662050
Пробуем перезагрузить сервер и смотрим, собрался ли рэид автоматически после старта системы.
Теперь на свежесозданном raid-массиве надо создать шифрованный раздел. Мне в этом помогла вот эта статья:
http://www.opennet.ru/tips/info/2029.shtml
Сначала надо поставить программу cryptsetup:
yum -y install cryptsetup
Потом, с помощью неё, инициализируем шифрованный раздел на массиве:
cryptsetup luksFormat /dev/md0
Сначала программа предупредит, что всё удалит с раздела и попросит дальнейшего подтверждения:
This will overwrite data on /dev/md0 irrevocably.
Are you sure? (Type uppercase yes):
Тут надо ввести «YES» большими буквами. Потом программа попросит установить пароль на шифрованный раздел:
Enter LUKS passphrase:
Придумываем и вводим пароль. Когда программа отработает, то проверяем все ли нормально было создано:
cryptsetup isLuks /dev/md0 && echo Sucess
Вы должны увидеть «Sucess». Теперь смотрим параметры созданного раздела:
cryptsetup luksDump /dev/md0
Эта команда покажет что-то нечто этого:
Version: 1
Cipher name: aes
Cipher mode: cbc-essiv:sha256
Hash spec: sha1
Payload offset: 4096
MK bits: 256
Я тут привёл не весь вывод этой команды, а лишь первые несколько строчек.
Далее, подключаем шифрованный раздел, для его последующего монтирования:
cryptsetup luksOpen /dev/md0 store
store — это его там обзываем. Его обозвать можно как угодно. Здесь программа попросит ввести пароль, который был ранее придуман для этого шифрованного раздела. Потом смотрим параметры расшифрованного устройства /dev/mapper/store, пригодного для монтирования:
dmsetup info store
Вывод должен быть примерно таким:
Name: store
State: ACTIVE
Read Ahead: 4096
Tables present: LIVE
Open count: 0
Event number: 0
Major, minor: 253, 2
Number of targets: 1
UUID: CRYPT-LUKS1-8323d43be77d4f2fbf64dd53e970d3cf-store
Вот теперь на этом разделе можно создать файловую систему. Но тут есть один момент, поскольку мы создавали именно программный массив, то параметры файловой системы нужно делать исходя из параметров рэида, а они вот такие (смотрите их выше, они отображались при создании рэида):
RAID level: 10
Number of physical disks: 4
RAID chunk size (in KiB): 512K
Переходим вот на этот сайт и там вбиваем эти параметры:
http://busybox.net/~aldot/mkfs_stride.html
Там также есть четвёртое поле с названием «number of filesystem blocks (in KiB)» — в нём лучше всегда оставлять значение по умолчанию: 4
В итоге мы получим вот такую команду для создания файловой системы:
mkfs.ext3 -b 4096 -E stride=128,stripe-width=256
В которой ext3 можно смело менять на ext4. Для создания ext4 параметры будут точно такие же. Итак, создаём файловую систему на шифрованном разделе:
mkfs.ext4 -b 4096 -E stride=128,stripe-width=256 /dev/mapper/store
Потом пробуем примонтировать куда-нибудь только что отформатированный раздел:
mount /dev/mapper/store /mnt
Если монтирование оказалось удачным, то всё сделано правильно: рэид собран, шифрованный раздел работает. Однако в fstab монтирование шифрованного раздела я прописывать не буду. Вся фишка в том и заключается, что массив с шифрованным разделом нужно монтировать вручную после загрузки сервера. Это на тот случай, если сервер попадёт в чужие руки: злоумышленник не сможет добраться до информации не примонтировав шифрованный раздел. А примонтировать он его не сможет не зная пароль. Думаю, это вполне оправданное неудобство, которое, зато, обеспечивает безопасность.
Чуть ниже я опишу скрипт, с помощью которого можно будет быстро монтировать шифрованный раздел. Но сначала надо настроить самбу и nfs. Начнём с того, что на iptables сразу откроем все нужные порты. Находим файл /etc/sysconfig/iptables и под строчкой, которая открывает порт 22, добавляем вот такой кусок:
-A INPUT -p tcp -m state -m tcp --dport 10000 --state NEW -j ACCEPT
# nfs
-A INPUT -p udp -m udp -m multiport -m state --state NEW -j ACCEPT --dports 111,2049,32769,20048,875
# nfs
-A INPUT -p tcp -m tcp -m multiport -m state --state NEW -j ACCEPT --dports 111,2049,32803,20048,875
-A INPUT -p tcp -m state --dport 892 --state NEW -j ACCEPT
-A INPUT -p udp -m state --dport 892 --state NEW -j ACCEPT
-A INPUT -p tcp -m state --dport 662 --state NEW -j ACCEPT
-A INPUT -p udp -m state --dport 662 --state NEW -j ACCEPT
# samba
-A INPUT -p udp -m udp -m state --dport 137 --state NEW -j ACCEPT
# samba
-A INPUT -p udp -m udp -m state --dport 138 --state NEW -j ACCEPT
# samba
-A INPUT -p tcp -m tcp -m state --dport 139 --state NEW -j ACCEPT
# samba
-A INPUT -p tcp -m tcp -m state --dport 445 --state NEW -j ACCEPT
# samba
-A INPUT -p udp -m udp -m state --dport 631 --state NEW -j ACCEPT
# samba
-A INPUT -p tcp -m tcp -m state --dport 631 --state NEW -j ACCEPT
Тут мы сразу открыли порты и для самбы, и для nfs, и для webmin (он понадобится). Не забываем перезапустить iptables:
service iptables restart
Теперь начнём настройку самбы. Убедимся, что у нас стоят следующие пакеты:
yum -y install samba samba-client samba-common
Если при установке системы вы выбирали компоненты, которые выбирал и я, то вышеперечисленные пакеты уже должны стоять.
Находим файл /etc/samba/smb.conf и приводим его вот к такому виду:
[global] log file = /var/log/samba/log.%m smb passwd file = /etc/samba/smbpasswd netbios name = BACK-SERV server string = Samba Server Version %v workgroup = WORKGROUP #название рабочей группы interfaces = p2p1 # название сетевого интерфейса, на котором будет работать самба hosts allow = 127.0.0.1 192.168. 172.16. # адреса, с которых разрешено подключение encrypt passwords = yes # использовать шифрование паролей security = user # схема безопасности user max log size = 50 [share] # название шары path = /home/backstore # пусть, на который ведёт шара read only = no # разрешена запись browseable = yes # шара видима directory mask = 0770 # маска для создаваемых каталогов create mask = 0660 # маска для создаваемых файлов valid users = admin # кому из самбовских пользователей разрешён доступ к шаре.
Собственно, как видно из конфига, хранилище для бэкапов у меня будет располагаться в каталоге /home/backstore — именно к этому каталогу будет монтироваться массив с шифрованным разделом. Также, обращу внимание, что самба НЕ будет привязана к домену Active Directory — так тоже безопаснее.
Теперь надо создать пользователя. Сначала создаём пользователя в системе:
adduser admin
passwd admin
Потом этого пользователя надо привязать к самбе. Я это люблю делать через webmin. Установим webmin:
yum install http://prdownloads.sourceforge.net/webadmin/webmin-1.650-1.noarch.rpm
Потом заходим в вэбмин и переходим вот сюда:
в меню samba windows file sharing и выбираем convert users. Нам нужно сконвертировать лишь одного пользователя admin:
Поэтому выбираем Only listed users or UID ranges и щёлкаем на кнопку с многоточием и в появившемся окне выбираем admin. Потом ниже ставим крыж Use this password и задаём пароль. Этот пароль будет использоваться при подключении к самбовской шаре. Затем нажимаем кнопку convert users.
Далее, снова в вебмине переходим в меню Samba Windows File Sharing и щёлкаем вот на эту кнопку:
Мы увидим список пользователей, сконвертированных для самбы:
а точнее, одного пользователя admin. Щёлкнем на него. И в его свойствах отметим галку Password never expires (срок действия пароля не ограничен):
Сохраняем.
Теперь надо найти файл /etc/samba/smbusers. Его надо привести вот к такому виду:
# Unix_name = SMB_name1 SMB_name2 ...
admin = admin
nobody = guest pcguest smbguest
На этом всё. Но пока не запускаем самбу и в автозагрузку её не ставим.
Теперь надо настроить NFS-сервер. Для начала, ставим пакеты:
yum -y install nfs-utils libnfsidmap
Потом находим файл /etc/sysconfig/nfs. В нём надо раскомментировать строчки:
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
и под ними добавить ещё вот такие строчки:
MOUNTD_PORT=892
RQUOTAD_PORT=875
STATD_PORT=662
STATD_OUTGOING_PORT=2020
Чтобы изменения вступили в силу, надо перезапустить демон rpcbind:
service rpcbind restart
После этого надо создать файл /etc/exports. В этом файле прописываются nfs-шары. У меня они выглядят так:
/home/backstore/asterisk 172.16.0.101(rw,sync,no_root_squash,no_subtree_check)
/home/backstore/webserv 172.16.0.90(rw,sync,no_root_squash,no_subtree_check)
/home/backstore/filestore 172.16.0.55(rw,sync,no_root_squash,no_subtree_check)
Т.е. у меня на шифрованном массиве созданы отдельные папки для разных бэкапов, в том числе для астериска, вэб-сервера, на котором корпоративные сайты и для файлового сервера. Каждый из этих трёх серваков монтирует к себе расшаренные nfs-папки и кладёт в них свои бэкапы. Собственно говоря, и самбой тоже самое: виндовые серваки кладут свои бэкапы в сетевую самбовскую папку. Т.е. сам бэкап-сервер ничего не бэкапит — бэкапы на него складывают другие всевозможные серваки.
Как только внесли изменения в /etc/exports, их нужно применить командой:
exportfs -a -v
Вот теперь можно запускать и самбу и nfs-сервер. Я для себя написал вот такой скрипт:
#! /bin/bash
cryptsetup luksOpen /dev/md0 store
dmsetup info store
mount /dev/mapper/store /home/backstore
service nfs-server start
service smb start
service nmb start
Этот скрипт я запускаю вручную после загрузки сервера. Он сначала инициализирует шифрованный раздел и просит для этого ввести пароль. Затем этот раздел монтируется к каталогу /home/backstore. И уже только после этого запускаются демоны самбы и nfs-сервера. Хранилище начинает функционировать
Не забываем сделать этот скрипт исполняемым:
chmod +x name_of_script
Осталось сделать последний пункт: настроить систему мониторинга температуры дисков. Хотя, «система» — это, наверно, будет слишком громко сказано... Это будет всего лишь скрипт, запускаемый каждые 2 минуты в кроне. Чтобы он работал, надо установить программку hddtemp:
yum -y install hddtemp
hddtemp отображает температуру выбранного диска. Также надо установить программку sendEmail. О том, как это сделать, я писал вот в этой заметке:
http://technotrance.su/index.php/zametki-iz-drugikh-istochnikov/23-sendemail
Теперь, когда есть всё нужное, готов представить вам сам скрипт:
#!/bin/bash
# Переменные
# Критическая температура
temper=55
# Диски
hard1=0
hard2=0
hard3=0
hard4=0
# скрипт
hard1=$(hddtemp /dev/sda | grep "dev/sd" | awk '{print $4+0}' )
if [ "$hard1" -gt "$temper" ]; then
sendEmail -o message-charset=UTF-8 -f backserv@maydomain.ru -t "me@maydomain.ru, me1@maydomain.ru" -u "Back-serv: Disk Temperature Alert!!!" -m "Температура диска hdd1 повысилась до $hard1 градусов! Сервер будет выключен." -s 172.16.0.62:25
shutdown -h now
fi
hard2=$(hddtemp /dev/sdb | grep "dev/sd" | awk '{print $4+0}' )
if [ "$hard2" -gt "$temper" ]; then
sendEmail -o message-charset=UTF-8 -f backserv@maydomain.ru -t "me@maydomain.ru, me1@maydomain.ru" -u "Back-serv: Disk Temperature Alert!!!" -m "Температура диска hdd2 повысилась до $hard2 градусов! Сервер будет выключен." -s 172.16.0.62:25
shutdown -h now
fi
hard3=$(hddtemp /dev/sdc | grep "dev/sd" | awk '{print $4+0}' )
if [ "$hard3" -gt "$temper" ]; then
sendEmail -o message-charset=UTF-8 -f backserv@maydomain.ru -t "me@maydomain.ru, me1@maydomain.ru" -u "Back-serv: Disk Temperature Alert!!!" -m "Температура диска hdd3 повысилась до $hard3 градусов! Сервер будет выключен." -s 172.16.0.62:25
shutdown -h now
fi
hard4=$(hddtemp /dev/sdd | grep "dev/sd" | awk '{print $4+0}' )
if [ "$hard4" -gt "$temper" ]; then
sendEmail -o message-charset=UTF-8 -f backserv@maydomain.ru -t "me@maydomain.ru, me1@maydomain.ru" -u "Back-serv: Disk Temperature Alert!!!" -m "Температура диска hdd4 повысилась до $hard4 градусов! Сервер будет выключен." -s 172.16.0.62:25
shutdown -h now
fi
exit
В переменной «temper=» впишите критическую температуру, которая вам нужна. У меня это 55 градусов. Потому что, при рабочем вентиляторе, вся стопка из дисков у меня имеет температуру приблизительно 30 градусов. И если вентилятор выйдет из строя, то температура дисков быстро поднимется и наверняка превысит 55 градусов. Самой критичной, насколько я знаю, является температура в 70 градусов. Я же решил до греха не доводить и поставил 55. Т.е. когда хоть один диск нагреется до 55 градусов, то система отправит уведомление мне на электронную почту и выполнит корректное выключение сервера. Таким образом, я узнаю, что скорее всего сдох вентилятор
Теперь этот скрипт надо сделать исполняемым:
chmod +x my_script_name
И поместить его в крон. Если просто добавить строчку в файле /etc/crontab, то скрипт не будет срабатывать. Поэтому сделаем чуток иначе: в папке /root создадим файл cron_root вот с таким содержимым:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
1-60/2 * * * * /home/my_script_name
И потом выполняем вот такую команду:
crontab /root/cron_root
Эта команда добавит запланированное задание для пользователя root. Посмотреть, добавилось ли оно, можно так (из-под рута):
crontab -l
Эта команда выведет содержимое файла cron_root.
Собственно, на этом и всё, можно пользоваться
Комментарии
Нужно убрать пробел. Простым копированием не получилось запустить