How-to`s — Создание live-usb для бэкапа/восстановления системы
Каждый раз, когда мне приходится делать резервную копию системы я искал незанятую USB флэшку, на которую заливал установочный образ ArchLinux и грузился в него. В этом способе был очень неприятный момент — мне приходилось искать незанятую USB флэшку размером >512 MiB, при том что под рукой всегда лежала SD карточка на 64 MB, которой для нужд бэкапа и восстановления вполне хватило бы. Но с SD карточкой была одна проблема — редкий дистрибутив мог загрузиться с нее на моем Eee PC 900. Перепробовав с дюжину различных мелких дистрибутивов, ни один из которых мне не подошел полностью, я решил сделать свою live систему.
Насчет ядра — я использую свое ядро, в котором необходимые модули вкомпилированы, а поддержка initrd отключена. Если у вас уже есть ядро, которое для работы с дисками не требует дополнительных модулей, то можете использовать его. Если такого ядра у вас нет — скачайте исходный код ядра с ftp://kernel.org/ и соберите его вручную. В этой статье я не буду описывать как нужно собирать ядро.
Условимся, что устройство флэшки — /dev/sdc.
Сразу хочу сказать, что я использовал BusyBox — утилиту, заменяющую очень большой набор других утилит, пусть и с немного урезаным функционалом. Фокус ее в том, что в зависимости от того, как вы ее запустите — так она себя и будет вести. Например, если сделать символьную ссылку на busybox с именем ln, то мы получим ln. Если ссылка будет называться dd — получим dd. При весе в 1,5 мегабайта и без зависимостей — это просто чудо.
Если запустить busybox без парамтров, то вы увидите список доступных в вашей версии утилит, чьи функции может заменить busybox. Если размер вам очень важен, то можете собрать BusyBox из исходников, отключив ненужный функционал и уменьшив тем самым размер бинарного файла. Я же использовал готовый пакет из репозиториев.
С помощью fdisk создайте на устройстве флэшки один раздел и сделайте его загрузочным.
Сначала удалите все разделы на этом устройстве. Скорее всего раздел только один, поэтому введите d один раз. Затем создайте новый первичный раздел. Нажмите n, [Ввод], p, [Ввод], 1, [Ввод], [Ввод], [Ввод]. Сделайте этот раздел загрузочным — введите a. Чтобы записать новую таблицу разделов на устройство — нажмите w.
Теперь создайте новую файловую систему на первом разделе флэшки. В качестве файловой системы я выбрал Ext2 — ее поддержка давно есть везде, а журналирование в такого рода системе не имеет особого смысла. Для форматирования раздела в Ext2 выполните следующую команду:
-m 0 отключит резервирование места под root (что бы это ни значило)
-N 2000 обеспечит достаточное количество inod'ов.
Смонтируйте новый раздел в отдельную директорию (например, /newroot):
В каждом дистрибутиве Linux есть набор обязательных директорий. Создайте следующие директории:
Необязательными являются /sys, /lib, /var, /mnt, /usr и /home — можете создать их позже, если в них появится необходимость.
Для начала заполним каталог /dev необходимыми устройствами. Таковыми являются console, kmem, mem, null, ram0 и tty1. Скопируйте их прямо из вашей рабочей системы с помощью
где DEVICE — каждый из вышеперечисленных устройств. Параметры -dpR обеспечат копирование самих файлов, а не их содержимого, а также сохранит все права доступа к ним. Если вам не по душе такой способ — можете делать более трудоемким, но, возможно, более правильным путем — с помощью ls -l узнайте главный и меньший номера каждого из устройств и создайте их с помощью mknod.
Кроме вышеупомянутых обязательных устройств скопируйте также ваши устройства жестких дисков (hd* и sd*), а также с десяток терминальных устройств (tty*). Возможно, вам также понадобится loop*. Скопируйте также остальные файлы устройств по мере необходимости.
В этом каталоге должны храниться настройки системы. Обязательными файлами здесь будут rc (в разных системах называется по-разному), inittab, fstab, passwd, group и shadow. Хотя, group, возможно и не является обязательным, но проверить это я не пытался.
После того как скопируете эти файлы в свою новую систему необходимо будет отредактировать следующие файлы:
inittab — его запускает /bin/init. Он определяет поведение системы при разных уровнях исполнения. Подробнее о формате записей в файле inittab вы можете прочитать в
Однако есть очень важный момент: в отличии от стандартного inittab, версия для busybox не должна содержать поля id и runlevel. Мой примитивный inittab выглядит следующим образом:
fstab — здесь все как обычно. Только указываете в качестве корневой системы не ваш жесткий диск, а флэшку.
passwd и shadow — в этих файлах оставьте только запись для root. Остальные вам не понадобятся. Кроме того, возможно вы захотите изменить домашнюю директорию и оболочку командной строки по умолчанию. Обычно в качестве оболочки прописан /bin/bash или /bin/zsh, но в busybox есть только примитивный sh. Конечно, никто не мешает сделать символьную ссылку bash —> sh.
rc — срипт загрузки, прописанный в вашем inittab. Он может быть суперсложный и включать в себя другие rc.скрипты, однако для простых систем можно его сильно упростить (пример моего rc):
В этот каталог установлен busybox. Этого можно добиться разными способами. Например, если вы собираете его вручную, то при конфигурировании добавьте параметр --prefix=/newroot. Если вы используете менеджер пакетов, то почитайте справку к нему — должна быть опция, которая позволяет указать корневую директорию для устанавливаемого пакета. Например в ArchLinux, в pacman это ключ -r:
Параметр -b необходим, потому что pacman не сможет найти базу пакетов внутри /newroot.
После установки перейдите в каталог /newroot/bin. Запустите busybox и определитесь с тем, какие встроенные утилиты вам нужны, а какие — нет. Для каждой из утилит сделайте символьную ссылку на busybox с соответствующим утилите именем. Например:
Перейдите в эту директорию и создайте необходимые ссылки на ../bin/busybox. Вообще разделение на две директории — /bin и /sbin — в этой системе особого смысла не имеет, так как пользователь всего один, и тот root.
Обязательно сделайте ссылки с именами init, getty, poweroff, shutfown, reboot, halt!
В этот каталог скопируйте только ваше ядро и назовите его vmlinuz.
Установка загрузчика GRUB производится командой grub-install:
После того, как установка завершится, создайте простой файл меню GRUB (/boot/grub/menu.lst):
В строке root, возможно, придется изменить устройство, однако на моем Eee PC 900 при выборе в BIOS загрузки с карты памяти GRUB определил ее именно так.
Кроме того, важным параметром является rootdelay — без него ядро не успевало найти устройство кардридера и я получал:
Вот, собственно и все. Теперь вы можете перезагрузиться и опробовать новую систему. Конечно, с BusyBox вы вряд ли получите супер функциональную систему, однако система будет способна на многое с точки зрения обслуживания рабочей системы. Кроме того, так как этот вариант live-OS не использует сжатых образов файловой системы, то все изменения, которые вы внесете в нее останутся после перезагрузки, поэтому вы можете смело дополнять функционал скриптами прямо во время использования и не бояться потерять ваши наработки.
Конечно, здесь много еще чего можно оптимизировать, и я этим буду постепенно заниматься, однако, для базовых нужд создания резервных копий диска и их восстановления система вполне готова.
Подготовка
Что понадобится:
- USB Флэшка или SD/MMC/CF/... карта памяти
- Рабочая Linux система, желательно с полным набором для компиляции либо с любым пакетным менеджером
- Ядро Linux, не требующее дополнительных модулей для работы
Насчет ядра — я использую свое ядро, в котором необходимые модули вкомпилированы, а поддержка initrd отключена. Если у вас уже есть ядро, которое для работы с дисками не требует дополнительных модулей, то можете использовать его. Если такого ядра у вас нет — скачайте исходный код ядра с ftp://kernel.org/ и соберите его вручную. В этой статье я не буду описывать как нужно собирать ядро.
Условимся, что устройство флэшки — /dev/sdc.
BusyBox
Сразу хочу сказать, что я использовал BusyBox — утилиту, заменяющую очень большой набор других утилит, пусть и с немного урезаным функционалом. Фокус ее в том, что в зависимости от того, как вы ее запустите — так она себя и будет вести. Например, если сделать символьную ссылку на busybox с именем ln, то мы получим ln. Если ссылка будет называться dd — получим dd. При весе в 1,5 мегабайта и без зависимостей — это просто чудо.
Если запустить busybox без парамтров, то вы увидите список доступных в вашей версии утилит, чьи функции может заменить busybox. Если размер вам очень важен, то можете собрать BusyBox из исходников, отключив ненужный функционал и уменьшив тем самым размер бинарного файла. Я же использовал готовый пакет из репозиториев.
Подготовка устройства:
С помощью fdisk создайте на устройстве флэшки один раздел и сделайте его загрузочным.
fdisk /dev/sdc
Теперь создайте новую файловую систему на первом разделе флэшки. В качестве файловой системы я выбрал Ext2 — ее поддержка давно есть везде, а журналирование в такого рода системе не имеет особого смысла. Для форматирования раздела в Ext2 выполните следующую команду:
mke2fs -m 0 -N 2000 /dev/sdc1
-N 2000 обеспечит достаточное количество inod'ов.
Собираем систему
Смонтируйте новый раздел в отдельную директорию (например, /newroot):
1 2 |
mkdir /newroot |
1 2 3 4 5 6 7 |
/bin |
/DEV
Для начала заполним каталог /dev необходимыми устройствами. Таковыми являются console, kmem, mem, null, ram0 и tty1. Скопируйте их прямо из вашей рабочей системы с помощью
cp -dpR /dev/DEVICE /newroot/dev
Кроме вышеупомянутых обязательных устройств скопируйте также ваши устройства жестких дисков (hd* и sd*), а также с десяток терминальных устройств (tty*). Возможно, вам также понадобится loop*. Скопируйте также остальные файлы устройств по мере необходимости.
/ETC
В этом каталоге должны храниться настройки системы. Обязательными файлами здесь будут rc (в разных системах называется по-разному), inittab, fstab, passwd, group и shadow. Хотя, group, возможно и не является обязательным, но проверить это я не пытался.
После того как скопируете эти файлы в свою новую систему необходимо будет отредактировать следующие файлы:
inittab — его запускает /bin/init. Он определяет поведение системы при разных уровнях исполнения. Подробнее о формате записей в файле inittab вы можете прочитать в
man 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
::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=[rescue-system]:
PATH=/sbin:/bin:/usr/bin
/bin/mount -av
/bin/hostname localhost
# Uncomment next line, if you have sane rc.conf and are able to use it
#/etc/rc.conf
PS1=[rescue-system]:
PATH=/sbin:/bin:/usr/bin
/bin/mount -av
/bin/hostname localhost
/BIN
В этот каталог установлен busybox. Этого можно добиться разными способами. Например, если вы собираете его вручную, то при конфигурировании добавьте параметр --prefix=/newroot. Если вы используете менеджер пакетов, то почитайте справку к нему — должна быть опция, которая позволяет указать корневую директорию для устанавливаемого пакета. Например в ArchLinux, в pacman это ключ -r:
pacman -S busybox -r /newroot -b /var/lib/pacman
После установки перейдите в каталог /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:
grub-install --root-directory=/newroot /dev/sdc
title Boot rescue blob
root (hd0,0)
kernel /boot/vmlinuz rootdelay=6 root=/dev/sdc1 rw
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 не использует сжатых образов файловой системы, то все изменения, которые вы внесете в нее останутся после перезагрузки, поэтому вы можете смело дополнять функционал скриптами прямо во время использования и не бояться потерять ваши наработки.
Конечно, здесь много еще чего можно оптимизировать, и я этим буду постепенно заниматься, однако, для базовых нужд создания резервных копий диска и их восстановления система вполне готова.