Universal Linux Installer

Время от времени почти у любого человека, профессионально или полупрофессионально связанного с компьютерами, появляется насущная необходимость точного копирования операционки вместе с установленными пакетами либо на другой идентичный или схожий компьютер, либо на тот же самый в качестве восстановления резервной копии. А еще лучше, чтобы диск для восстановления имел также функции полнофункционального livecd, так? В этой статье я расскажу о том, как сделать такой диск для компьютера под управлением OS Linux (в данном случае — rpm-based, хотя это не очень принципиально), не ограниченный по возможностям ничем, кроме возможностей самого Linux.

В качестве примера я буду описывать систему восстановления сделанную специально для задач переноса Fedora Linux с одного компьютера на другой, схожий с ним по конфигурации. Изначальное предназначение системы заключалось для быстрой установки настроенной операционки на партию новых компов. Это задачи. Но перед решением самой задачи не лишним было бы определиться, что именно хочется получить в конце. Каким же требованиям должен отвечать такой диск восстановления (и установки)?
Довольно очевидно, что:

  1. Система должна помещаться на один диск. Флешки, конечно, тоже хорошо, особенно учитывая их нынешние размеры и прочие плюсы.
  2. Система должна быть способна к использованию ее в качестве live-системы, но это не прямое предназначение, поэтому возможность должна быть скрыта по умолчанию.

  3. Система должна быть как можно проще, чтобы можно было бы в любой момент исправить и улучшить что-нибудь. Но не следует забывать, что лучшее враг хорошего)

  4. Хорошо было бы базироваться на чем-то готовом, чтобы не делать лишнюю работу, которую уже кто-то сделал. Я в свое время использовал livecd от Fedora 8. Его явным плюсом является наличие в его составе единственного файла-образа с Live-системой, причем в известном формате, хотя его редактирование и сопряжено с некоторыми неудобствами.

Реализация

Итак, Fedora 8 livecd KDE. Сейчас, конечно, есть уже 10-я версия, но суть дела это никак не меняет. Рассмотрим из чего состоит этот диск и как это можно использовать.

  • В папке isolinux лежит загрузчик. Там можно поковыряться в конфигурации — isolinux.cfg — например, чтобы исправить время автоматического выбора варианта загрузки.
  • В папке LiveOS находится самое главное – squashfs.img – сжатый образ live-системы.

Это самый важный файл, поэтому его мы и заменим. Хотя, конечно, можно этого и не делать. Но если сделать, то можно установить в 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мб.

Далее, внутри /tmp/img теперь должен находиться образ диска live-системы в формате ext3 – ext3fs.img. Конечно, дальше с ним работать куда легче. Монтируя его аналогичным образом, но без ro, можно без труда определить, что это просто корневая файловая система от федоры. Что это значит? Это значит, что мы, абсолютно просто установив федору на один раздел без swap и скопировав раздел с помощью dd, получим файл образа, которым можно использовать в squashfs.img. Это позволит создать именно ту live-систему, которую мы захотим.

Теперь я расскажу, что именно и зачем сделал с этим образом я, чтобы достигнуть поставленных задач. Прежде всего, установка системы для live-образа была проведена из варианта минимальной установки путем расширения нужными пакетами (например, KDE и ruby). Обязательно стоит найти в интеренете и добавить в руби библиотеку session.rb – она нужна для исполнения shll-скриптов без проблем. Далее, для KDE был исправлен профиль пользователя таким образом, чтобы ничего, кроме пустого рабочего стола, видно не было. Но, меню и горячие клавиши вызова командной строки никуда не делись, что и позволяет проводить работу в режиме live-системы при указанном выше требовании к скрытности такой возможности. Итак, что мы получаем в итоге: система полнофункциональна, но эта функциональность скрыта, причем скрыта так, что добраться до нее очень легко, например, нажав Alt+F2. Также стоит добавить автовход под рутом да и пароль тоже удалить можно.
Время перейти к обеспечению функционирования в режиме восстановления (установки или называйте как хотите). Да, для дальнейшего следует также положить в /root rpm'ник с ядром той системы, которую нужно будет восстанавливать или устанавливать — это важно только если установка будет проводиться на машину с отличной от предыдущей конфигурацией sata-контроллера.

Простота — залог успеха, а так же малых затрат времени на реализацию этой простоты. Поэтому диалоговые окошки программы для восстановления сделаны на ruby с применением библиотек ruby-gtk2. Собственно, это и есть gtk2-диалог с измененными параметрами конкретных страниц. Чтобы он запускался при старте положим его в /root/.kde/Autostart. Про сам скрипт стоит добавить несколько предложений. Когда он писался, показалось удобным вынести саму функциональность восстановления в отдельный шелл-скрипт. Посему возникла необходимость синхронизации действий руби и шелл, например, при отображении процесса копирования и соответствующей ему полосы-индикатора.

Эта необходимость преодолена с помощью использования /dev/shm – системы виртуальных файлов, где само наличие файла и будет признаком завершения того или иного процесса. Сам скрипт для руби — вещь сложная и работающая со скрипом. Так что буду описывать отдельные фишки, существенные для работы этого скрипта. Во-первых, во избежание всяких проблем с указанием путей выполняется специальный shell-скрипт, который создает ссылки для всего, что требуется. В нем ничего сложного нет, просто один раз стоит посмотреть что и куда монтируется в live-os. Во-вторых, как уже было сказано, функциональную нагрузку несет на себе shell-скрипт, параметры которому, а именно — вид конкретного действия (которое можно и поменять), — передается в руби-скрипте в зависимости от нажатых галочек. Больше в скрипте диалога ничего функционального нет, поэтому перейдем к рассмотрению скрипта установки, про который написано чуть выше.

Как проще всего создать образ файловой системы. Очевидно, с помощью dd. Но такой метод сопряжен с необходимостью дополнительного сжатия и вообще требует больше места, чем если бы файлы этой файловой системы были заархивированы tar и пожаты gzip в процессе архивирования. Поэтому я так и сделал.

Собственно скрипт представлен ниже.


#!/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.


Теперь опишу, что за архивы используются и как их создавать. Для их создания используется специальный скрипт, и вот он:

#!/bin/bash
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.

Вот собственно и все. Это достаточно просто, и вдобавок остается огромный простор для модификации и прочего творчества. Среди представленных для скачивания файлов:
Universal Linux Installer.iso – образ live-cd без архивов с системой и с установщиком на USB FLASH (narod yandex downloader)
maketar.sh – скрипт создания этих самых архивов находится внутри образа.
Для редактирования iso-образа под Linux рекомендую пользоваться пакетом isomaster.
C Уважением,Томилов Александр! Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
 
© Все права защищены.
Копирование и использование текстов только с разрешения авторов
The Power of the Vision control