Kraplax 19.10.2009 03:59

How-to`sСоздание live-usb для бэкапа/восстановления системы

Каждый раз, когда мне приходится делать резервную копию системы я искал незанятую USB флэшку, на которую заливал установочный образ ArchLinux и грузился в него. В этом способе был очень неприятный момент — мне приходилось искать незанятую USB флэшку размером >512 MiB, при том что под рукой всегда лежала SD карточка на 64 MB, которой для нужд бэкапа и восстановления вполне хватило бы. Но с SD карточкой была одна проблема — редкий дистрибутив мог загрузиться с нее на моем Eee PC 900. Перепробовав с дюжину различных мелких дистрибутивов, ни один из которых мне не подошел полностью, я решил сделать свою live систему.
Подготовка

Что понадобится:


USB Флэшка или SD/MMC/CF/... карта памяти
Рабочая Linux система, желательно с полным набором для компиляции либо с любым пакетным менеджером
Ядро Linux, не требующее дополнительных модулей для работыРазмер носителя не играет роли — самая маленькая карта памяти, которую я смог найти была размеров в 64 мегабайта, чего с лихвой хватает для создания полноценной системы для бэкапа/восстановления.
Насчет ядра — я использую свое ядро, в котором необходимые модули вкомпилированы, а поддержка initrd отключена. Если у вас уже есть ядро, которое для работы с дисками не требует дополнительных модулей, то можете использовать его. Если такого ядра у вас нет — скачайте исходный код ядра с ftp://kernel.org/ и соберите его вручную. В этой статье я не буду описывать как нужно собирать ядро.
Условимся, что устройство флэшки — /dev/sdc.
BusyBox
Сразу хочу сказать, что я использовал BusyBox — утилиту, заменяющую очень большой набор других утилит, пусть и с немного урезаным функционалом. Фокус ее в том, что в зависимости от того, как вы ее запустите — так она себя и будет вести. Например, если сделать символьную ссылку на busybox с именем ln, то мы получим ln. Если ссылка будет называться dd — получим dd. При весе в 1,5 мегабайта и без зависимостей — это просто чудо.
Если запустить busybox без парамтров, то вы увидите список доступных в вашей версии утилит, чьи функции может заменить busybox. Если размер вам очень важен, то можете собрать BusyBox из исходников, отключив ненужный функционал и уменьшив тем самым размер бинарного файла. Я же использовал готовый пакет из репозиториев.

Подготовка устройства:


С помощью fdisk создайте на устройстве флэшки один раздел и сделайте его загрузочным.
1
fdisk /dev/sdc

Сначала удалите все разделы на этом устройстве. Скорее всего раздел только один, поэтому введите d один раз. Затем создайте новый первичный раздел. Нажмите n, <Ввод>, p, <Ввод>, 1, <Ввод>, <Ввод>, <Ввод>. Сделайте этот раздел загрузочным — введите a. Чтобы записать новую таблицу разделов на устройство — нажмите w.
Теперь создайте новую файловую систему на первом разделе флэшки. В качестве файловой системы я выбрал Ext2 — ее поддержка давно есть везде, а журналирование в такого рода системе не имеет особого смысла. Для форматирования раздела в Ext2 выполните следующую команду:
1
mke2fs -m 0 -N 2000 /dev/sdc1

-m 0 отключит резервирование места под root (что бы это ни значило)
-N 2000 обеспечит достаточное количество inod'ов.
Собираем систему
Смонтируйте новый раздел в отдельную директорию (например, /newroot):
1
2
mkdir /newroot
mount /dev/sdc1 /newroot

В каждом дистрибутиве Linux есть набор обязательных директорий. Создайте следующие директории:
1
2
3
4
5
6
7
/bin
/boot
/dev
/etc
/proc
/sbin
/var

Необязательными являются /sys, /lib, /var, /mnt, /usr и /home — можете создать их позже, если в них появится необходимость.

/DEV


Для начала заполним каталог /dev необходимыми устройствами. Таковыми являются console, kmem, mem, null, ram0 и tty1. Скопируйте их прямо из вашей рабочей системы с помощью
1
cp -dpR /dev/DEVICE /newroot/dev

где DEVICE — каждый из вышеперечисленных устройств. Параметры -dpR обеспечат копирование самих файлов, а не их содержимого, а также сохранит все права доступа к ним. Если вам не по душе такой способ — можете делать более трудоемким, но, возможно, более правильным путем — с помощью ls -l узнайте главный и меньший номера каждого из устройств и создайте их с помощью mknod.
Кроме вышеупомянутых обязательных устройств скопируйте также ваши устройства жестких дисков (hd* и sd*), а также с десяток терминальных устройств (tty*). Возможно, вам также понадобится loop*. Скопируйте также остальные файлы устройств по мере необходимости.

/ETC


В этом каталоге должны храниться настройки системы. Обязательными файлами здесь будут rc (в разных системах называется по-разному), inittab, fstab, passwd, group и shadow. Хотя, group, возможно и не является обязательным, но проверить это я не пытался.
После того как скопируете эти файлы в свою новую систему необходимо будет отредактировать следующие файлы:

inittab — его запускает /bin/init. Он определяет поведение системы при разных уровнях исполнения. Подробнее о формате записей в файле inittab вы можете прочитать в
1
man inittab

Однако есть очень важный момент: в отличии от стандартного inittab, версия для busybox не должна содержать поля id и runlevel. Мой примитивный inittab выглядит следующим образом:
# /etc/inittab

::sysinit:/etc/rc

# Spawn some gettys
::respawn:/sbin/getty -L 115200 tty1 vt100
::respawn:/sbin/getty -L 115200 tty2 vt100
::respawn:/sbin/getty -L 115200 tty3 vt100
::respawn:/sbin/getty -L 115200 tty4 vt100

# Stuff to do when restarting the init process
::restart:/sbin/init

# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot


fstab — здесь все как обычно. Только указываете в качестве корневой системы не ваш жесткий диск, а флэшку.

passwd и shadow — в этих файлах оставьте только запись для root. Остальные вам не понадобятся. Кроме того, возможно вы захотите изменить домашнюю директорию и оболочку командной строки по умолчанию. Обычно в качестве оболочки прописан /bin/bash или /bin/zsh, но в busybox есть только примитивный sh. Конечно, никто не мешает сделать символьную ссылку bash —> sh.

rc — срипт загрузки, прописанный в вашем inittab. Он может быть суперсложный и включать в себя другие rc.скрипты, однако для простых систем можно его сильно упростить (пример моего rc):
#!/bin/sh

# Uncomment next line, if you have sane rc.conf and are able to use it
#/etc/rc.conf

PS1=:
PATH=/sbin:/bin:/usr/bin

/bin/mount -av
/bin/hostname localhost

/BIN


В этот каталог установлен busybox. Этого можно добиться разными способами. Например, если вы собираете его вручную, то при конфигурировании добавьте параметр --prefix=/newroot. Если вы используете менеджер пакетов, то почитайте справку к нему — должна быть опция, которая позволяет указать корневую директорию для устанавливаемого пакета. Например в ArchLinux, в pacman это ключ -r:
1
pacman -S busybox -r /newroot -b /var/lib/pacman

Параметр -b необходим, потому что pacman не сможет найти базу пакетов внутри /newroot.
После установки перейдите в каталог /newroot/bin. Запустите busybox и определитесь с тем, какие встроенные утилиты вам нужны, а какие — нет. Для каждой из утилит сделайте символьную ссылку на busybox с соответствующим утилите именем. Например:
ln -s ./busybox ./cd
Обязательно сделайте ссылки с именами sh, login и mount!

/SBIN


Перейдите в эту директорию и создайте необходимые ссылки на ../bin/busybox. Вообще разделение на две директории — /bin и /sbin — в этой системе особого смысла не имеет, так как пользователь всего один, и тот root.
Обязательно сделайте ссылки с именами init, getty, poweroff, shutfown, reboot, halt!

/BOOT


В этот каталог скопируйте только ваше ядро и назовите его vmlinuz.
Устанавливаем GRUB
Установка загрузчика GRUB производится командой grub-install:
1
grub-install --root-directory=/newroot /dev/sdc

После того, как установка завершится, создайте простой файл меню GRUB (/boot/grub/menu.lst):
title Boot rescue blob
root (hd0,0)
kernel /boot/vmlinuz rootdelay=6 root=/dev/sdc1 rw

В строке root, возможно, придется изменить устройство, однако на моем Eee PC 900 при выборе в BIOS загрузки с карты памяти GRUB определил ее именно так.
Кроме того, важным параметром является rootdelay — без него ядро не успевало найти устройство кардридера и я получал:
Kernel Panic :VFS :Unable to mount root fs on /dev/sdc1

Заключение
Вот, собственно и все. Теперь вы можете перезагрузиться и опробовать новую систему. Конечно, с BusyBox вы вряд ли получите супер функциональную систему, однако система будет способна на многое с точки зрения обслуживания рабочей системы. Кроме того, так как этот вариант live-OS не использует сжатых образов файловой системы, то все изменения, которые вы внесете в нее останутся после перезагрузки, поэтому вы можете смело дополнять функционал скриптами прямо во время использования и не бояться потерять ваши наработки.
Конечно, здесь много еще чего можно оптимизировать, и я этим буду постепенно заниматься, однако, для базовых нужд создания резервных копий диска и их восстановления система вполне готова.


Тэги: backup Linux livecd liveusb usb бэкап восстановление дистрибутив
+ 18 -
Похожие Поделиться

razum2um 19.10.2009 07:25 #
Замечательно написано. Отдельное спасибо за ln`ы к busybox и --rootdelay

примечания:
mount -o loop /dev/sdc1 /newroot

эм? мы ж вроде раздел монтируем, а не файл, зачем loop?

cp -dpR /dev/DEVICE /newroot/dev

cp -a ...?

Если вы используете менеджер пакетов, то почитайте справку к нему — должна быть опция, которая позволяет указать корневую директорию для устанавливаемого пакета

для gentoo
ROOT=/newroot emerge busybox
Кроме того, так как этот вариант live-OS не использует сжатых образов файловой системы

Да, оно мож и удобней, что менять ее проще, но в тот же размер сжатая в lzma, скажем, система будет пофункциональней. Даже с иксами. Скоро нам расскажут про slitaz..

Каждый раз, когда мне приходится делать резервную копию системы

Ну я понимаю, что так оно корректнее (копировать), но если потерпеть и не записывать на корень, можно обойтись (я обхожусь) cp -ax / /backup. Но ясно, что восстанавливать надо откуда-то еще...
Kraplax 19.10.2009 12:22 #
cp -a ...?
Да, судя по ману - похоже что и этот вариант подойдет.
зачем loop?
Да, loop не нужен. Начинал делать по старинной инструкции, в которой предлагалось сделать сжатую корневую систему и т.п., поэтому сначала я пытался делать файл с фс и монтировать его, а потом заливать на флэшку. В итоге запямятовал и проскользнула ошибка. Спасибо.
сжатая в lzma, скажем, система будет пофункциональней. Даже с иксами.
Ну, во-первых функционала busybox мне хватает с лихвой. При этом дистрибутив занимает всего 8 из 64 метров. Так что место еще есть и так. Во-вторых:
здесь много еще чего можно оптимизировать

А насчет rootdelay - когда буду у большого компа - скину пару ссылок на источники. Среди них был неплохой документик.
chemikadze 19.10.2009 08:03 #
Я предпочитаю unetbootin + какой-нибудь маленький livecd.
Kraplax 19.10.2009 12:09 #
Я точно так же предпочитал. Только, как я уже сказал - ни один из перепробованных не смог заработать таким способом и при этом иметь достаточный функционал.
ZogG 19.10.2009 09:17 #
title Boot rescue blob
root (hd0,0)
kernel /boot/vmlinuz rootdelay=6 root=/dev/sdc1 rw

не понял, почему ты указал первый жесткий, и ты не прописал граб в MBR/boot sector
, то есть полетит граб на компе, не зайдет систему с флешки
ZogG 19.10.2009 09:24 #
устанавливаем так
#grub
>
>root (hdx,0)
>setup (hdx)


x- номер флешки (к примеру есть только один жесткий и флешка, тогда 1 (счет начинается с 0)

Kraplax 19.10.2009 12:25 #
grub-install --root-directory=/newroot /dev/sdc1
Устанавливаем вот так, а не то, как вы написали. Зачем нам использовать отдельную утилиту в интерактивном режиме, если а) одна команда bash может быть использована в скрипте для автоматизации процесса и б) гадать какие есть команды и что они делают в командной строке grub не очень-то хочется?
Username 19.10.2009 09:31 #
кстати да
Kraplax 19.10.2009 12:08 #
Граб прописывается с помощью grub-install, который используется.
Прописал первый, потому что граб при загрузке видит мою карту памяти как первый из дисков,а потом уже винты. Такая вот странность, но что тут поделать.
xtavras 19.10.2009 11:42 #
оффтоп: а ты Арч на флэшку чем заливал? Просто когда я делаю это через unetbootin, он при загрузке спотыкается на каком то пункте и стоит, заработало только при скачивании img образа и записи стандартным dd, но этот способ мне не нравится, так как флэшка становится размером с образ, и приходится снова форматить ее и размечать.
Kraplax 19.10.2009 12:06 #
Я так же с помощью dd делал. Погляди, я писал установку Arch на Eee 900 - там подрбоно описано как и что я делал.
xtavras 19.10.2009 12:13 #
Ну да, я делал точно также, проблем не было, просто говорю мне сам способ не сильно нравится
Kraplax 19.10.2009 12:26 #
Ну, там размер-то восстановить проще пареной репы =) Причем, решение есть даже в этом посте ;-)
Да и на винде тоже можно восстановить прежний размер.
xtavras 19.10.2009 13:40 #
Не восстановлю то я без проблем с dd,fdisk и mkfs, но для этого нужен линукс, а у меня была ситуация, когда я по забывчивости брал с собой в гости эту флэщку и скинуть на нее что-то большое соответственно уже не мог, как сделать в винде я кстати не знаю.
Kraplax 19.10.2009 14:03 #
Правой кнопкой по моему компьютеру, пункт Управление. Слева выбираем Запоминающие устройства - Управление дисками. Находим флэшку, удаляем раздел, создаем новый.
xtavras 19.10.2009 14:18 #
слушай, я идиот, когда пробовал тоже самое меня испугало "удалить раздел", хотя тот же dd делает тоже самое)))