Перенос системы на шифрованный lvm без потери данных

У меня есть нетбук, внешний USB-диск, способный вместить всю информацию что есть на внутреннем и есть желание заиметь на нетбуке шифрованный диск. Никто не застрахован от потерь. Не хотелось бы чтобы данные увидел кто-то, кто видеть их не должен. Решено было перенести рабочую систему на шифрованный раздел, за одно и избавиться от статичной разбивки в пользу lvm. Ещё нет никакого желания разбирать нетбук, подключать диск куда-то ещё, нетбук без cd-привода и в случае чего livecd не поможет, хотя есть вариант liveusb, но самого liveusb нет. Так же нет желания сидеть “тупить” в чёрный экран потому что нетбук – единственная рабочая машина. На нетбуке стоит Debian GNU/Linux. Из пакетов сейчас там солянка stable+testing+немного sid. Загрузчик – grub2. На stable (squeeze) описанный метод переноса работать будет.

Ставим программы для работы с lvm и шифрованными разделами:
aptitude install lvm2 cryptsetup
Далее создаём разделы на usb-диске (пусть он будет sdb)
sdb1 занят полезной информацией, которую удалять не будем.
Создаём два раздела (не важно чем – хоть fdisk, хоть gparted, хоть ещё чем):

  • sdb2 – мегабайт на 300 хватит с большим запасом – там будет /boot
  • sdb3 – там будет временное хранилище данных – т.е. места должно хватить на все данные, которые нужно сохранить.

На sdb2 создаём файловую систему – я сделал ext4, хотя местами часто говорят делать там ext2. Не особо важно.
mkfs.ext4 /dev/sdb2
Затем создаём шифрованный раздел
cryptsetup luksFormat /dev/brtntbk/test

WARNING!
========
This will overwrite data on /dev/brtntbk/test irrevocably.

Are you sure? (Type uppercase yes): <- вводим YES
Enter LUKS passphrase: <- вводим пароль
Verify passphrase: <- ещё раз пароль
Шифрованное устройство создано
Запишем его в конфиг чтобы система “знала” о нём. Для начала посмотрим uuid командой blkid
~# blkid
<...>
/dev/sdb1: UUID="09ba38fb-22fb-44ee-ae00-a1ccab2b01c8" TYPE="ext4"
/dev/sdb2: UUID="1d027431-f8f1-4452-ada3-586338196b19" TYPE="ext4"
/dev/sdb3: UUID="63080eed-a812-4961-b0b9-baad344dc13d" TYPE="crypto_LUKS"
<...>
Нам нужен UUID от sdb3. Откроем файл /etc/crypttab и напишем там строку:
cryptusb UUID=63080eed-a812-4961-b0b9-baad344dc13d none luks
Затем “откроем” наш шифрованный диск:
~# cryptdisks_start cryptusb
Starting crypto disk...cryptusb (starting)...
Unlocking the disk /dev/disk/by-uuid/63080eed-a812-4961-b0b9-baad344dc13d (cryptusb)
Enter passphrase: <- сюда вводим пароль
cryptusb (started)...done.
Появилось устройство /dev/mapper/cryptusb, на котором создадим pv для lvm
~# pvcreate /dev/mapper/cryptusb
Physical volume "/dev/mapper/cryptusb" successfully created
Создаём группу томов
~# vgcreate crypt /dev/mapper/cryptusb
Volume group "crypt" successfully created
Создаём том, где будут лежать все файлы кроме /home и /boot
~# lvcreate -L10G -nroot crypt
Logical volume "root" created
У меня так. Если у кого-то иначе и разделов больше – сделать по аналогии.
Создаём файловую систему
~# mkfs.ext4 /dev/crypt/root
Монтируем её чтобы перенести туда данные
mkdir /mnt/newroot
mount /dev/crypt/root /mnt/newroot
Монтируем новый /boot
mkdir /mnt/newroot/boot
mount /dev/sdb2 /mnt/newroot/boot
Монтируем корневую ФС с работающей системой
mkdir /mnt/oldroot
mount --bind / /mnt/oldroot
У меня до этого все файлы были на одной файловой системе на одном разделе.
Копируем информацию со старой системы в новую, исключая /home/ т.к. его мы скопируем на отдельный том.
rsync -avPHAX --exclude="home/*" /mnt/oldroot/* /mnt/newroot/
Пока копируется можно заниматься своими делами даже не выходя из иксов. После того как процесс завершится – закрываем все свои рабочие программы, завершаем сеанс от пользователя, переходим в консоль tty1, логинимся рутом и переводим систему в однопользовательский режим
init 1
Затем повторяем процедуру копирования
rsync -avPHAX --exclude="home/*" /mnt/oldroot/* /mnt/newroot/
Второй раз она завершится значительно быстрее.
Монтируем виртуальные системы proc и dev к новой системе
mount --bind /dev /mnt/newroot/dev
mount --bind /proc /mnt/newroot/proc
И переходим в новую систему
chroot /mnt/newroot
В новой системе меняем пути к разделам в /etc/fstab и зовём grub-mkdevicemap, затем update-grub2. Проверяем что в /boot/grub/grub.cfg написано правильное новое устройство, если нет – правим руками, записываем невзирая на отсутствие прав за запись.
У меня в grub меню выглядит так:
menuentry ‘Debian GNU/Linux, с Linux 3.0.0-1-686-pae’ —class debian —class gnu-linux —class gnu —class os {
insmod gzio
insmod part_msdos
insmod ext2
set root=’(/dev/sdb,msdos2)’
search —no-floppy —fs-uuid —set=root 1d027431-f8f1-4452-ada3-586338196b19
echo ‘Загружается Linux 3.0.0-1-686-pae …’
linux /vmlinuz-3.0.0-1-686-pae root=/dev/mapper/brtntbk-root ro rootfstype=ext4 quiet
echo ‘Загружается начальный ramdisk …’
initrd /initrd.img-3.0.0-1-686-pae
}



Вообще встречается в статьях параметр ядра
cryptdevice=/dev/sdb3:crypt
но у меня и без него работает

И fstab выглядит так:
/dev/mapper/crypt-root / ext4 noatime,errors=remount-ro 0 1
UUID=“1d027431-f8f1-4452-ada3-586338196b19” /boot ext4 noatime,errors=remount-ro 0 1

Затем ставим grub на usb-диск
grub-install /dev/sdb
После проверяем всё ли хорошо у нас с initrd:
mkdir /tmp/foo
cd /tmp/foo
zcat /boot/initrd.img-$(uname -r) | cpio -iv
cat conf/conf.d/cryptroot
Там должно быть что-то типа этого:
target=cryptusb,source=/dev/sdb3,key=none,lvm=crypt-root,lvm=crypt
Если файла нет вообще, или там написано что-то странное – удалим initrd
rm /boot/initrd.img-$(uname -r)
и сгенерим заново
update-initramfs -k all -u

Вообще здесь рекомендуют сделать так:
cd /etc/initramfs-tools/conf.d
vim cryptroot
Внутрь файла написать:
target=cryptusb,source=/dev/sdb3,key=none,lvm=crypt-root,lvm=crypt
и только после этого перегенерить initrd, однако у меня заработало без прописывания

Теперь выходим из chroot, отмонтируем dev и proc, затем boot, затем /mnt/newroot /mnt/oldroot и после перезагружаемся, сообщив BIOS-у что грузиться надо с USB.
Если всё сделано верно – система должна нормально загрузиться уже с нового шифрованного раздела. До логина в иксы необходимо перейти в консоль и смонтировать старую ФС.
mount /dev/sda3 /mnt/oldroot
и подключить старый /home
mount --bind /mnt/oldroot/home /home
Только после этого логиниться пользователем.
Дальше создаём том, куда перенесём /home. Или тома под каждого пользователя, или чего там надо куда переносить, создаём фс, переносим. Переносим опять в два захода.
lvcreate -L30G -nhome crypt
mkfs.btrfs /dev/crypt/home
mkdir /mnt/newhome
mount /dev/crypt/home /mnt/newhome
rsync -avPHAX /home/* /mnt/newhome/
после того как закончится – разлогиниться пользователем, позвать ещё раз rsync, затем поставить новый /home на своё место.
umount /home /mnt/newhome /mnt/oldroot
mount /dev/crypt/home /home
И можно вновь логиниться пользователем.
Теперь можно спокойно удалять разделы на внутреннем диске нетбука, создавать там такой же /boot, рсинкать его, затем создавать криптованый раздел,на нём всё так же создавать pv, вносить в группу томов и потом переносить pv с usb-диска на внутренний.
Переносить командой pvmove /dev/sdb3 /dev/sda2 (sda1 – /boot, sda2 – криптованный раздел). Удаляем старый pv из группы. USB-диск больше нам не нужен.
vgreduce crypt /dev/sdb3
pvremove /dev/sdb3
Меняем grub.cfg уже на новом диске, ещё раз зовём обновление initramfs и проверяем всё ли правильно. Ещё раз зовём grub-install но на этот раз уже на /dev/sda.
grub-install /dev/sda
Перезагружаем машину. Всё должно загрузиться уже с внутреннего диска.
Вот и всё. Особое спасибо Said Chavkin из рассылки debian-russian за ссылку и указание нужного направления, гуглу и прочему интернету :-)

По производительности – не скажу что особо сильно использую диск и мне критична любая наносекунда. “На глаз” – ничего не поменялось. Железка – MSI Wind U120 (1GB RAM, 1.6GHz Atom N270). Из софта, использующего диск активно пожалуй icedove на 5 imap ящиков с кучей папок на несколько гб в сумме да iceweasel.

| опубликовано: Авг 13, 00:47

  Помощь по Textile