RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Панацея на флешке. Создаем мультизагрузочную флешку на все случаи жизни [2009]
Думаю, у всех нас есть несколько любимых LiveCD, которые мы постоянно носим с собой — на всякий случай. И это оправданно, ведь LiveCD незаменим, когда нужно восстановить работоспособность ОС или просто поработать в знакомом окружении. Но CD/DVD — громоздкий и ненадежный носитель. Если тебе надоело таскать с собой ворох LiveCD, я предлагаю записать все эти ОС на флешку.
С момента первого публичного релиза knoppix («дедушки» всех LiveCD) прошло уже около 10 лет. За этот срок каждый уважающий себя дистрибутив обзавелся LiveCD-версией, а количество узкоспециализированных LiveCD-систем перевалило за все мыслимые и немыслимые пределы. Но время идет, и компакт-диски уже не соответствуют современным требованиям компактности (такой вот каламбур), надежности и сроков хранения информации. На смену LiveCD/LiveDVD-системам давно пришли так называемые LiveUSBсистемы (ОС на USB-флешке). Создать свой LiveUSB с каким-нибудь одним дистрибутивом сегодня не составляет труда. На помощь придут многочисленные графические утилиты, подчас даже входящие в состав дистрибутива. Но при всей простоте подход недостаточно гибок: если требуется несколько ОС или хочется по-своему разбить накопитель на разделы — придется немного поработать руками и головой. Зато получится многофункциональный, тонко настроенный инструмент. Итак, приступим…
Ингредиенты
Для начала стоит определиться, что же мы все-таки будем водружать. Вариант установки Windows представляется мне не очень удачным, так как функциональность и скорость работы этой ОС в качестве LiveUSB оставляет желать лучшего. К тому же, ее запуск с CD или флешки запрещен по лицензионному соглашению. Если не рассматривать всякие экзотические варианты, типа Minix, то на выбор остается сотня-другая ОС на базе Linux и десяток-другой решений на xBSD. После непродолжительных раздумий я остановил свой выбор на следующих системах:
1. System Rescue CD 1.3.1 Beta4 — пожалуй, самый популярный, функциональный и динамически развивающийся «спасательный» CD на базе Linux.
2. Ubuntu 9.10 i386 Alpha6 LiveCD — думаю, в представлении не нуждается. Пригодится, если захочется поработать в знакомой системе на чужом компе.
3. DrWeb 5.0 LiveCD — переносной антивирус, удобный и достаточно эффективный.
4. FreeBSD 8 RC1 — на случай, если понадобится ее куда-нибудь установить или починить установленную систему.
5. FreeDOS — да-да, старичок еще может пригодиться для запуска, например, mhdd (лучшей, на мой взгляд, программы для низкоуровневой работы с винтами).
В установленном виде весь «зоопарк» будет занимать не более 2,5-3 Гб, поэтому подойдет любая флешка от 4 Гб. Можно взять и большего объема, при этом организовав жирный раздел FAT/NTFS, используемый по прямому назначению — для переноса данных. Но я предпочел выделить под эту задачу отдельную флешку Transcend V85 на 4 Гб.
Все настройки будут производиться на Ubuntu 9.10 amd64 alpha (к моменту публикации статьи уже выйдет релиз), которая живет на ноуте Dell Vostro A860.
Пропорции
Использовать объем флешки можно двумя способами: либо создать 1 раздел, куда поставить все ОС, либо выделить каждой свой раздел. Первый вариант не очень удобен, так как на одном разделе образуется мешанина из файлов разных ОС, что осложняет обновление и вынуждает отслеживать совпадения имен файлов. К тому же, FreeBSD отказывается жить на FATразделе. Лучше поделить флешку на разделы. Я использовал следующее разбиение:
1. FAT32, 400 Мб — на случай необходимости переноса небольшого количества информации. Кстати, мне попадались компьютеры, которые отказывались грузиться с флешки, если на ней не было первого раздела с FAT32. На этом же разделе мы разместим образы загрузочных дискет с FreeDOS.
2. Неформатированный, 1 Гб — раздел для FreeBSD. Если хочется хранить коллекцию портов и/или установить что-нибудь дополнительно, то может понадобиться больше места. FreeBSD может быть установлена только на первичный раздел.
3. EXT4, 2 Гб — раздел для Ubuntu.
4. EXT4, 250 Мб — раздел для SystemRescueCD.
5. EXT3, 100 Мб — раздел для DrWeb LiveCD. Текущая версия не может загружаться с ext4.
Разбивать можно как с помощью fdisk + mkfs, так и с помощью gparted. Это тривиальная операция, поэтому подробно на ней останавливаться не будем. Стоит лишь учесть некоторые нюансы:
• Для удобства можно каждому разделу присвоить соответствующую метку. • На FAT-раздел рекомендую установить bootфлаг. • С целью экономии места на ext-файловых системах лучше отключить резервирование блоков (вместо /dev/sdb3 нужно подставить имена нужных разделов):
$ sudo tune2fs -r 0 /dev/sdb3
Пришло время выбрать загрузчик для нашего «зверинца». Вариантов не так много: если держаться мейнстрима, то выбирать надо из Grub, Grub2, Grub4DOS, syslinux.
Syslinux — хороший и распространенный загрузчик (практически все графические утилиты именно его устанавливают на флешку), но он не умеет напрямую грузить FreeBSD. Grub4DOS — тот же Grub, только с некоторыми дополнительными возможностями. Grub2 — реинкарнация Grub первой версии (который теперь получил название Grub Legacy), имеющая все те же возможности плюс много всяких вкусностей (подробнее о Grub2 можно узнать из статьи «На пути к совершенству», опубликованной в z #127). Его-то и будем ставить, благо, в Ubuntu, начиная с версии 9.10, он является загрузчиком по умолчанию.
Команда для установки загрузчика выглядит следующим образом:
где /dev/sdb — устройство, куда установится бутлоадер, а /media/Ubuntu/ — путь, где будет находиться каталог /boot/grub с конфигом и модулями. В каталоге /media/Ubuntu/boot/ grub создадим конфигурационный файл grub.cfg с содержимым:
$ sudo nano /media/Ubuntu/boot/grub/grub.
cfg
set timeout=5
set default=0
menuentry "Reboot" {
reboot
}
menuentry "Halt" {
halt
}
Параметр «set timeout» задает время, по истечении которого при бездействии пользователя будет загружен пункт, заданный параметром «set default». Конструкции menuentry описывают пункты меню (нумерация пунктов начинается с 0).
Первое блюдо
Вариантов установки Ubuntu на флешку несколько:
1. Запустить установку и выбрать в качестве корня раздел на флешке. Все вносимые в систему изменения будут сохраняться, но мы лишимся преимуществ live-системы: возникнут проблемы с загрузкой иксов на компах с разными видеокартами, будут плодиться сетевые устройства в udev и т.д.
2. Просто скопировать на флешку содержимое LiveCD. В этом случае останутся все преимущества LiveCD, но вносимые изменения будут теряться.
3. Скопировать на флешку содержимое LiveCD и создать файл casper-rw, в котором будут сохраняться все изменения. На мой взгляд, наиболее оптимальный вариант.
Копируем на заранее подготовленный раздел содержимое LiveCD, за исключением папок isolinux, pics и файлов wubi.exe и autorun.inf (не забываем скопировать скрытый каталог.disk). Затем создадим на этом разделе файл casper-rw размером 1250 Мб:
$ dd if=/dev/zero of=casper-rw
bs=1M count=1250
и отформатируем его в ext2:
$ mkfs.ext2 -F casper-rw
Теперь в grub.cfg добавим пункты:
$ sudo nano /media/Ubuntu/boot/grub/grub.cfg
menuentry "Ubuntu" {
# В отличие от Grub Legacy, в Grub2
отсчет разделов начинается с 1
set root=(hd0,3)
linux /casper/vmlinuz noprompt
cdrom-detect/try-usb=true
persistent file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/
casper/initrd.lz quiet splash
initrd /casper/initrd.lz
}
menuentry "memtest" {
set root=(hd0,3)
linux16 /install/mt86plus
}
Второе блюдо
К сожалению, проект FreeBSD не имеет официального LiveCD (не говоря уже о LiveUSB). А самый известный FreeBSD LiveCD — frenzy — остановил свое развитие на версии 1.1 (основанной на FreeBSD 6). Этот недостаток с лихвой компенсируется гибкостью системы — качеством, свойственным всему Open Source. Уже установленная и настроенная система может быть легко перенесена на флешку. Если под рукой установленной системы нет, то можно установить FreeBSD на флешку с помощью штатного инсталлятора. Правда, sysinstall отказывался видеть мою флешку и упрямо предлагал установиться на винт.
Поэтому пришлось воспользоваться VirtualBox и представить флешку как винт (смотри врезку «Виртуализируемся»). Пожалуй, единственный недостаток такого способа — предпочтительно не создавать слайсы через fdisk из FreeBSD (из-за эмуляции он неправильно определяет геометрию диска). Лучше создать слайс из Ubuntu с помощью mkfs.ufs (из пакета ufsutils):
$ sudo mkfs.ufs /dev/sdb2
Сегодня установить FreeBSD не сложнее, чем Linux, поэтому, ввиду ограничения на объем статьи, не буду подробно останавливаться на процессе установки. Единственный нюанс: не надо устанавливать загрузчик. После окончания установки нужно в grub.cfg добавить пункт:
В уже установленной системе следует провести несколько манипуляций, чтобы минимизировать количество операций записи/чтения на флешке (что несколько продлит ей жизнь). Для начала перенесем /tmp в mfs (файловая система в виртуальной памяти). Для этого в конфиг / etc/rc.conf добавим строчку:
# ee /etc/rc.conf
tmpmfs="YES"
С помощью опции varmfs= «YES» можно также перенести в mfs /var. Но использование mfs для всего /var может вызвать некоторые проблемы, поэтому ее лучше использовать только для /var/ run и /var/log:
По умолчанию при перезагрузке в /var/log создаются не все файлы (не создается, например, / var/log/wtmp, а он нужен таким системным утилитам, как login, last, who и т.п.) Это поведение можно изменить в файле /etc/newsyslog.conf.
Достаточно к строке с /var/log/wtmp добавить «C»:
# ee /etc/newsyslog.conf
/var/log/wtmp 644 3 *
@01T05 BC
Десерт
Перенесем содержимое DrWeb LiveCD (каталог boot) на соответствующий раздел и пропишем в grub.cfg:
С диска System Rescue CD скопируем в соответствующий раздел каталоги isolinux и ntpasswd, а также файлы sysrcd.dat, sysrcd.md5 и version. Добавим в конфиг Grub’а пункты: $ sudo nano /media/Ubuntu/boot/grub/grub.
cfg
menuentry «System Rescue CD» {
set root=(hd0,5)
linux /isolinux/rescuecd
initrd /isolinux/initram.igz
}
# Альтернативное ядро (более старая версия) — на случай, если не загрузится основное menuentry "System Rescue CD altker"
{
set root=(hd0,5)
linux /isolinux/altker32
initrd /isolinux/initram.igz
}
System Rescue CD содержит также 64-битные ядра, но они могут пригодиться лишь в одном случае — при необходимости сделать chroot в 64-битную систему, поэтому нет смысла выносить их в меню загрузчика. Кроме стандартных параметров (типа acpi=off), ядро System Rescue CD может при загрузке принимать различные специфические параметры, самые полезные из которых:
• setkmap=uk — при загрузке не спрашивает раскладку, устанавливает uk. • docache — загружает всю систему в ОЗУ (потребуется не менее 300 Мб). • forcevesa — использовать видеодрайвер vesa (полезно при проблемах с видеорежимом). • dostartx — запускать иксы при загрузке.
В комплекте с System Rescue CD идет также ворох загрузочных дискет: FreeDOS, mhdd, aida (прога для получения информации о железе), gag (загрузчик), ranish (менеджер разделов, аналог fdisk), dban (утилита для уничтожения данных с винтов), memtest. Из всех дискет мне могут пригодиться только FreeDOS и mhdd. Grub2 сможет загрузить эти дискеты при помощи memdisk (из состава пакета syslinux).
Я скопировал файлы freedos.img и mhdd.img, а также файл /usr/lib/syslinux/memdisk в каталог /bootdisk на первом разделе. В grub.cfg добавил:
Ну вот, все грузится и работает. Но черное меню с белыми буквами — слишком обыденно, хочется добавить красивостей. К сожалению, модуль gfxmenu (grub.gibibit.com) еще не включен в основную ветку Grub2 (из-за недостаточной стабильности), поэтому создать полностью кастомизированное меню не получится. Но кое-что сделать все-таки можно. Grub2 имеет два режима отображения меню: console (по умолчанию) и gfxterm.
Последний позволяет поставить фоновое изображение и использовать произвольный шрифт (при использовании юникодного шрифта пункты меню могут быть на русском), правда, за счет незначительного увеличения времени загрузки. Для включения gfxterm надо в grub.cfg добавить:
# Указываем расположение шрифта
loadfont (hd0,3)/boot/unicode.pf2
set gfxmode=640x480
# Переключаем режим отображения в gfxterm
terminal_output gfxterm
# Указываем расположение фонового изображения
background_image (hd0,3)/boot/x.png
Шрифт можно скопировать отсюда /usr/share/grub/unicode.pf2 (или /usr/share/grub/ascii.pf2, если не нужен юникод) или сконвертировать из любого имеющегося в формате bdf (с помощью grub-mkfont). Фоновое изображение можно либо выбрать из пакета grub2-splashimages (будет располагаться в /usr/share/ images/grub), либо сконвертировать самому. Grub2 понимает изображения в форматах png, jpeg и tga (необходимо загрузить соответствующий модуль для каждого формата) и разрешении 640x480. За несколько минут в Gimp’е я набросал простенький splashimage в стиле x.
Цвет надписей и элементов меню задается с помощью команд color_normal и color_highlight в формате foreground/ background. Список доступных цветов можно посмотреть на страничкеwww.gnu.org/software/grub/manual/html_node/color.html.
Reboot
Теперь точно все! Можно перезагружаться и наслаждаться результатами проделанной работы. P.S. Необязательно останавливаться именно на описанных дистрибутивах — по аналогии можно загружать любой линуксовый LiveCD.
Виртуализируемся
В процессе создания мультизагрузочной флешки мне понадобилось много раз тестировать полученный результат. Чтобы не перезагружать ноутбук каждый раз при внесении изменений в конфиг загрузчика, я использовал VirtualBox. Правда, VirtualBox не поддерживает загрузку с USB, и пришлось прибегнуть к маленькому трюку — представлению флешки как образа виртуального жесткого диска.
При установленном VirtualBox (версии не ниже 1.4), чтобы /dev/sdb представить как образ виртуального жесткого диска, надо дать команду:
Затем в виртуальной машине в качестве жесткого диска указать /home/username/flash. vmdk (при этом у пользователя, от которого запущена виртуальная машина, должны быть права на доступ к /dev/sdb).