Universal Linux Installer
Время от времени почти у любого человека, профессионально или полупрофессионально связанного с компьютерами, появляется насущная необходимость точного копирования операционки вместе с установленными пакетами либо на другой идентичный или схожий компьютер, либо на тот же самый в качестве восстановления резервной копии. А еще лучше, чтобы диск для восстановления имел также функции полнофункционального livecd, так? В этой статье я расскажу о том, как сделать такой диск для компьютера под управлением OS Linux (в данном случае — rpm-based, хотя это не очень принципиально), не ограниченный по возможностям ничем, кроме возможностей самого Linux.
- Система должна помещаться на один диск. Флешки, конечно, тоже хорошо, особенно учитывая их нынешние размеры и прочие плюсы.
Система должна быть способна к использованию ее в качестве live-системы, но это не прямое предназначение, поэтому возможность должна быть скрыта по умолчанию.
Система должна быть как можно проще, чтобы можно было бы в любой момент исправить и улучшить что-нибудь. Но не следует забывать, что лучшее враг хорошего)
- Хорошо было бы базироваться на чем-то готовом, чтобы не делать лишнюю работу, которую уже кто-то сделал. Я в свое время использовал livecd от Fedora 8. Его явным плюсом является наличие в его составе единственного файла-образа с Live-системой, причем в известном формате, хотя его редактирование и сопряжено с некоторыми неудобствами.
Реализация
- В папке isolinux лежит загрузчик. Там можно поковыряться в конфигурации — isolinux.cfg — например, чтобы исправить время автоматического выбора варианта загрузки.
- В папке LiveOS находится самое главное – squashfs.img – сжатый образ live-системы.
Нетрудно заметить, что название этого файла совпадает с названием файловой системы squashfs. Поэтому для работы с ним (и с ней, соответственно) нужна поддержка со стороны операционки. Для этого нужна поддержка со стороны ядра (которая для современных ядер уже давно вроде как присутствует по умолчанию) и пакетик squashfs-tools от Fedora. Это обязательно, тк формат squashfs может меняться от дистрибутива к дистрибутиву, в частности, образ может быть сжат различными способами.
Например, так:
mkdir /tmp/img
mount /dir-with-squashfs.img/squashfs.img /tmp/img -t squashfs -o loop,ro
Насчет ro стоит сказать отдельно. Собственно, это и является единственной сложностью при работе со squashfs. В принципе, существует особый патч, который позволяет монтировать эту файловую систему в режиме чтения-записи, но я им так и не воспользовался, а каждый раз создавал файл заново. Кстати, процесс этот довольно длительный и занимает около 10 минут на среднем компьютере для файла с конечными размерами около 500мб.
Время перейти к обеспечению функционирования в режиме восстановления (установки или называйте как хотите). Да, для дальнейшего следует также положить в /root rpm'ник с ядром той системы, которую нужно будет восстанавливать или устанавливать — это важно только если установка будет проводиться на машину с отличной от предыдущей конфигурацией sata-контроллера.
Эта необходимость преодолена с помощью использования /dev/shm – системы виртуальных файлов, где само наличие файла и будет признаком завершения того или иного процесса. Сам скрипт для руби — вещь сложная и работающая со скрипом. Так что буду описывать отдельные фишки, существенные для работы этого скрипта. Во-первых, во избежание всяких проблем с указанием путей выполняется специальный shell-скрипт, который создает ссылки для всего, что требуется. В нем ничего сложного нет, просто один раз стоит посмотреть что и куда монтируется в live-os. Во-вторых, как уже было сказано, функциональную нагрузку несет на себе shell-скрипт, параметры которому, а именно — вид конкретного действия (которое можно и поменять), — передается в руби-скрипте в зависимости от нажатых галочек. Больше в скрипте диалога ничего функционального нет, поэтому перейдем к рассмотрению скрипта установки, про который написано чуть выше.
Собственно скрипт представлен ниже.
#!/bin/bash
#15.09.07
CDDIR=/mnt/cd;
#Preparing of disk
umount /dev/sda1 > /dev/null 2>&1 ;
umount /dev/sda2 > /dev/null 2>&1 ;
umount /dev/sda3 > /dev/null 2>&1 ;
umount /dev/sda4 > /dev/null 2>&1 ;
umount /dev/sda5 > /dev/null 2>&1 ;
umount /dev/sda6 > /dev/null 2>&1 ;
umount /dev/sda7 > /dev/null 2>&1 ;
umount /dev/sda8 > /dev/null 2>&1 ;
/sbin/swapoff -a > /dev/null 2>&1 ;
cat /root/fdisk.bat | /sbin/fdisk /dev/sda > /dev/null 2>&1 ;
dd if=/root/repairsystem.sh of=/dev/sda bs=512 count=1 > /dev/null 2>&1 ;
echo "w" | /sbin/fdisk /dev/sda > /dev/null 2>&1 ;
/sbin/parted /dev/sda mkpart primary 0 4702 > /dev/null 2>&1 ;
/sbin/parted /dev/sda mkpart primary 4702 6750 > /dev/null 2>&1 ;
/sbin/parted /dev/sda mkpart primary 6750 $(parted /dev/sda unit mb print | grep Disk | awk '{print $3}' | sed s/MB// ) > /dev/null 2>&1 ;
echo "w" | /sbin/fdisk /dev/sda > /dev/null 2>&1 ;
/sbin/mke2fs -j -L /1 -F /dev/sda1 > /dev/null 2>&1 ;
/sbin/tune2fs /dev/sda1 -c 90 -C 1 -i 0 > /dev/null 2>&1 ;
/sbin/mkswap -L SWAP-sda2 /dev/sda2 > /dev/null 2>&1 ;
/sbin/mke2fs -j -L /home1 -F /dev/sda3 > /dev/null 2>&1 ;
/sbin/tune2fs /dev/sda3 -c 90 -C 1 -i 0 > /dev/null 2>&1 ;
mkdir /mnt/sda1 > /dev/null 2>&1 ;
mkdir /mnt/sda3 > /dev/null 2>&1 ;
mount /dev/sda1 /mnt/sda1 -t ext3 -o rw > /dev/null 2>&1 ;
mount /dev/sda3 /mnt/sda3 -t ext3 -o rw > /dev/null 2>&1 ;
mkdir /mnt/sda1/home > /dev/null 2>&1 ;
mkdir /mnt/sda1/proc > /dev/null 2>&1 ;
mkdir /mnt/sda1/sys > /dev/null 2>&1 ;
mkdir /mnt/sda3/tmp > /dev/null 2>&1 ;
chmod 777 /mnt/sda3/tmp > /dev/null 2>&1 ;
touch /dev/shm/frys_dog > /dev/null 2>&1 ;
#End of preparing
#Installation
tar -zxvf $CDDIR/sda1.tar.gz -C /mnt/sda1 > /dev/null 2>&1 ;
tar -zxvf $CDDIR/sda3.tar.gz -C /mnt/sda3 > /dev/null 2>&1 ;
/sbin/grub-install --root-directory=/mnt/sda1 /dev/sda > /dev/null 2>&1 ;
cp /root/kernel*.rpm /mnt/sda1/root > /dev/null 2>&1 ;
/usr/sbin/chroot /mnt/sda1 mkdir /home/tmp > /dev/null 2>&1 ;
/usr/sbin/chroot /mnt/sda1 mount sysfs > /dev/null 2>&1 ;
/usr/sbin/chroot /mnt/sda1 rpm -Uhv --force /root/kernel*.rpm > /dev/null 2>&1 ;
/usr/sbin/chroot /mnt/sda1 rm -rf /home/tmp > /dev/null 2>&1 ;
/sbin/grub-install --root-directory=/mnt/sda1 /dev/sda > /dev/null 2>&1 ;
cd / ;
umount -f /mnt/sda1 > /dev/null 2>&1 ;
umount -f /mnt/sda3 > /dev/null 2>&1 ;
touch /dev/shm/benders_beans > /dev/null 2>&1 ;
#End of installation
Этот скрипт удалит все (реально — первые 8) разделы с диска, создаст 3 новых по принципу: [4,6Гб, 2Гб, до конца]. Потом будут созданы файловые системы (ext3 и swap), проставлены их параметры, созданы служебные директории и, наконец, разделы будут подмонтированы для использования, на что будет указано созданием файла-признака, который будет использован в руби-скрипте. Далее — сам процесс установки, который в данном случае сведется к:
- распаковке архивов для пользовательских файлов (/home – sda3 ) и собственно системы (/ – sda1)
- установке загрузчика
- переустановке ядра и предварительному монтированию sysfs
- индикации о завершении созданием файла
О переустановке ядра. Этот шаг нужен для обхода трудностей с различными контроллерами дисковой системы, т.е. различными материнскими платами. Да, можно ядро не переустанавливать, а только создать новый initrd, но тогда мне это не показалось хорошей идеей. Так что, я просто устанавливаю ядро из ВОССТАНАВЛИВАЕМОЙ системы, rpm пакет которого я ПРЕДВАРИТЕЛЬНО (на этапе создания live-системы) кладу в каталог /root.
Теперь опишу, что за архивы используются и как их создавать. Для их создания используется специальный скрипт, и вот он:
if [ $UID = 0 ]
then
rm -rf /home/sda1.tar.gz /home/sda3.tar.gz ;
echo "Making archives"
cd /
tar -zcvf /home/sda1.tar.gz usr bin boot dev etc lib media misc mnt opt root sbin selinux srv tmp var ;
cd /home
tar -zcvf /home/sda3.tar.gz *;
echo "Ready"
else
echo "You are not root. Exit"
exit
fi
Тут даже комментарии не требуются, все и так предельно ясно. Для сжатия арихивов в процессе архивирования используется параметр z. В принципе, можно пользоваться не gzip, а bzip2, но при этом экономия места получается незначительной, а время архивирования/разархивирования возрастает совершенно непропорционально. Созданные архивы следует положить в корень live-cd.
