Objective: писать бэкапы на зашифрованный раздел + LVM
Prerequisites: Хард на пицот гигов, Debian Lenny
Итак, новый диск Maxtor виден в системе как /dev/sdc, будем его приспосабливать в качестве хранилища для секурных бэкапов. Схема такая:
- Девайс без таблицы разделов полностью шифруем средствами
cryptsetup-luks; - На зашифрованном девайсе создаем дескриптор
LVM,VGиLV; - Сверху накатываем
ext3, бэкапимся.
cryptsetup-luks
Шифровать диск будем средствами cryptsetup-luks. О технологии можно почитать здесь и здесь.
В Дебиане есть простая утилита для быстрого создания разделов, называется luksformat.
$ man luksformat
Ей мы пользоваться не будем, потому что она не позволяет сделать множество полезных вещей. Сама по себе эта штука есть perl-скрипт, который можно поизучать на предмет основных команд, которыми создается crypted device.
$ file `which luksformat` /usr/sbin/luksformat: a /usr/bin/perl -w script text executable $ vim `which luksformat`
56 57 58 59 | print "Creating encrypted device on $device...\n"; if ((system 'cryptsetup', 'luksFormat', '-s', '256', '--cipher', 'aes-cbc-essiv:sha256', $device)) { die "Could not create LUKS device $device"; } |
A-ha! Искомая утиль называется cryptsetup. Читаем ман.
man cryptsetup
Чтобы создать шифрованный девайс, достаточно вызвать cryptsetup с опцией luksFormat. Passphrase должна быть достаточно стойкой. Понятное дело, /dev/sdc надо заменить на свой файл.
# cryptsetup luksFormat --key-size 256 --verify-passphrase --cipher aes-cbc-essiv:sha256 /dev/sdc WARNING! ======== This will overwrite data on /dev/sdc irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: Verify passphrase: Command successful.
Чтобы изменения вступили в силу при следующей загрузке, небходимо модифицировать файл /etc/crypttab
$ man 5 crypttab
Как следует из описания, первым словом должно быть указано имя для будущего зашифрованного (целевого) устройства, которое появится в /dev/mapper/ при “отрытии” LUKS’а. Вторым — путь до исходного (нешифрованного) устройства, затем путь до файла ключа (если указать none, попросят ввести с stdin) и опции шифрования. Как я понимаю, формат LUKS определяет формат заголовка, в котором указана вся необходимая информация, поэтому в последнем поле просто ставим luks.
Имя исходного устройства удобно указать через симлинки, заботливо созданные udev‘ом в /dev/disk/by-id/.
$ ll /dev/disk/by-id/ | grep -i maxtor lrwxrwxrwx 1 root root 9 Сен 26 19:24 ata-MAXTOR_STM3500320AS_5QM0HBKM -> ../../sdc lrwxrwxrwx 1 root root 9 Сен 26 19:24 scsi-SATA_MAXTOR_STM35003_5QM0HBKM -> ../../sdc
$ cat /etc/crypttab | tail -1 sdc_crypt /dev/disk/by-id/scsi-SATA_MAXTOR_STM35003_5QM0HBKM none luks
Теперь, нужно “открыть” LUKS-контейнер, делается это с помощью cryptdisks_start:
$ cryptdisks_start usage: /usr/sbin/cryptdisks_start <name> reads /etc/crypttab and starts the mapping corresponding to <name>
# cryptdisks_start sdc_crypt Starting crypto disk...sdc_crypt (starting). Enter passphrase to unlock the disk /dev/disk/by-id/scsi-SATA_MAXTOR_STM35003_5QM0HBKM (sdc_crypt): key slot 0 unlocked. Command successful. sdc_crypt (started)...done.
betelgeuse-6 : xio [~] $ ll /dev/mapper/ | grep sdc brw-rw---- 1 root disk 254, 13 Сен 27 12:51 sdc_crypt
Done!
LVM
Теперь, LVM. Замечательная статья в тему: XGU.
# lvm
lvm> pvcreate -v /dev/mapper/sdc_crypt
Set up physical volume for "/dev/mapper/sdc_crypt" with 976771112 available sectors
Zeroing start of device /dev/mapper/sdc_crypt
Physical volume "/dev/mapper/sdc_crypt" successfully created
lvm> vgcreate vg2 /dev/mapper/sdc_crypt
Volume group "vg2" successfully created
lvm> lvcreate -L 100% -n backup vg2
Invalid argument 100%
Error during parsing of command line.
lvm> vgdisplay vg2
--- Volume group ---
VG Name vg2
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 465,76 GB
PE Size 4,00 MB
Total PE 119234
Alloc PE / Size 0 / 0
Free PE / Size 119234 / 465,76 GB
VG UUID d9lDBt-x2SW-jlsf-ba92-Uc8D-muDy-sSe84j
lvm> lvcreate -l 119234 -n backup vg2
Logical volume "backup" created
lvm> quit
Exiting.Все. Девайс, с которым будем работать дальше, называется /dev/mapper/vg-backup.
ext3
Ничего необычного, укажем лишь label и 0% зарезервированного для рута объема (для этого раздела нет необходимости).
# mke2fs -j -L BACKUP -m 0 /dev/mapper/vg2-backup
mke2fs 1.41.0 (10-Jul-2008)
Filesystem label=BACKUP
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
30531584 inodes, 122095616 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
3727 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.Добавим в fstab:
16 | /dev/mapper/vg2-backup /srv/backup ext3 defaults 0 2 |
Ну и последний штрих:
# mkdir /srv/backup # mount /srv/backup $ ls /srv/backup lost+found
Дальше надо подумать о технологии инкрементального бэкапа. В простейшем случае это может быть rsync, в более сложном — комплексные решения, вроде Bacula.
That’s it!