Как-то возникла у меня потребность обзавестись iso-образом FreeBSD с возможностью протестировать ОЗУ до (или вместо) установки системы. Подобное есть, например, в дистрибутивах Linux: там для этих целей из меню загрузчика (в роли которого обычно выступает isolinux) можно запустить Memtest86+. Далее я расскажу как модифицировать iso-шку FreeBSD при загрузке с которой появлялось бы меню как на следующей картинке.
Все описанные ниже действия я выполнял на машине с FreeBSD. Отличия от Linux будут лишь в части "распаковки" iso-образа, все остальное справедливо для обеих систем.
Небольшое отступление
Вообще, в FreeBSD есть пакет memtest86+. После его установки появляется файл /boot/opt/memtest86+, а сообщение на экране гласит, что загрузчику loader(8) достаточно скомандовать:unload
load /boot/opt/memtest86+
boot
и можно созерцать процесс тестирования памяти. Так оно и происходит, если загружаешься с жесткого диска. Однако, когда я пересобрал iso-шку вместе с /boo/opt/memtest86+ и загрузился с нее, то после выполнения приведенных выше команд ничего полезного не произошло, лишь загрузчик перестал подавать признаки жизни. Гугление результатов не принесло и я решил использовать isolinux из меню которого уже загружать либо фряшный /boot/cdboot, либо memtest86+, скачанный с родного для него сайта.
Поехали
У вас уже, вероятно, заготовлен iso-образ FreeBSD, который вы решили препарировать (для удобства изложения я буду называть его freebsd.iso). Распаковываем его в каталог именуемый далее iso-tree - в нем мы будем формировать структуру будущего iso-образа:# mkdir iso-tree
# mkconfig freebsd.iso
md0
# mount_cd9660 /dev/md0 /mnt
# cp -a /mnt/ iso-tree
# umount /mnt
# mdconfig -d -u md0
Обратите внимание на команду cp. Каталог-источник надо записывать именно со слешем на конце - /mnt/, что означает “скопировать содержимое каталога”, а не сам каталог. Кроме того, cp игнорирует атрибуты файлов, выставленные командой chflags.
Затем внутри нашего iso-tree подготовим каталог в котором разместится загрузчик isolinux с необходимыми ему файлами. Не мудрствуя, назовем этот каталог isolinux и скачаем в него Memtest86+ (не забыв распаковать). Опять таки, лишь удобства изложения ради, примем, что загруженный файл Memtest86+ будет сохранен у нас под именем memtest86.bin:
# mkdir iso-tree/isolinux
# wget http://memtest.org/download/5.01/memtest86+-5.01.bin.gz
# gunzip -c memtest86+-5.01.bin.gz > iso-tree/isolinux/memtest86.bin
Теперь дело за isolinux, который надо "выковырить" из syslinux. Качаем и распаковываем архив syslinux понравившейся версии. Если ваш выбор пал на версию 4.07, то в распакованном каталоге ищем файл isolinux.bin и menu.c32. Для версии 5.10 нужно уже больше файлов: isolinux.bin, menu.c32, ldlinux.c32, libutil.c32. На счет других версий не скажу, свои эксперименты я проводил только с этими двумя.
# wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-5.10.tar.gz
# tar -xf syslinux-5.10.tar.gz
# find syslinux-5.10 \
\( -name isolinux.bin \
-o -name menu.c32 \
-o -name ldlinux.c32 \ # Для v4.07 эти две строчки
-o -name libutil.c32 \ # не нужны, хотя и не мешают
\) -exec cp -v -f {} iso-tree/isolinux \;
И так, загрузчик на месте, осталось написать ему конфигурационный файл (что и как писать в конфиг описано тут). Наполняем файл iso-tree/isolinux/isolinux.cfg. следующим содержанием:
ui menu.c32 timeout 100 # Раскомментируйте две следующие строки, если # пользователь не должен изменять параметры загрузчика #noescape 1 #allowoptions 0 menu title Boot Menu menu color border 30;40 #00000000 #00000000 none menu color title 1;36;40 #c00090f0 #00000000 std menu color unsel 37;40 #90ffffff #00000000 std menu color hotkey 1;37;40 #ffffffff #00000000 std menu color sel 7;37;40 #e0000000 #20ff8000 all menu color scrollbar 30;40 #40000000 #00000000 std label install menu label Boot FreeBSD boot /boot/cdboot label memtest menu label Run Memtest86+ linux memtest86.bin
Ну и последний шаг. Выясняем "Volume id" (метку диска) у оригинальной iso-шки, чтобы задать такой же у нашей, т.к. FreeBSD использует его для монтирования cd-диска. Сделать это можно двумя способами. Первый способ - это просто "спросить" у iso-шки:
# isoinfo -d -i freebsd.iso | grep 'Volume id:'
Volume id: FREEBSD_INSTALL
Второй - посмотреть, что пытается смонтировать система после загрузки:
# cat iso-tree/etc/fstab
/dev/iso9660/FREEBSD_INSTALL / cd9660 ro 0 0
Как видим, в моем случае метка диска FREEBSD_INSTALL.
Ну что ж, все готово, можно делать наш образ:
# mkisofs -r -U -V FREEBSD_INSTALL \
-b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 4 \
-input-charset koi8-r \
-o my_freebsd.iso iso-tree
Готово.
Автоматизируем
Для более легкого повторения описанных действий в будущем я набросал пару вспомогательных скриптов:- mkisolinux.sh - для создания каталога isolinux со всем содержимым. Скрипт принимает один обязательный параметр - каталог с syslinux’ом и два не обязательных: путь до файла Memtest86+ и путь до каталога в котором будет размещаться isolinux (для нашего примера это был бы iso-tree).
- mkiso.sh - создает iso-образ с нужным "Volume id". Обязательный параметр скрипта - каталог из которого формируется iso-шка (iso-tree в нашем примере). Опционально, в качестве второго параметра, можно задать имя формируемой iso-шки (по-умолчанию будет FreeBSD-memtest86.iso).
Приложение
На тот случай, если кому лень качать скрипты привожу их полное содержание.mkisolinux.sh
#!/bin/sh set -e usage() { echo "Usage: ${0##*/} syslinux-dir [memtest86-file] [output-dir]" exit 1 } [ ! -d "$1" ] && usage if [ -f "$2" ]; then memtest86=$2 isolinux=${3:-.} else memtest86="memtest" isolinux=${2:-.} fi [ ! -d "$isolinux" ] && usage syslinux=$1 isolinux=$isolinux/isolinux mkdir -p $isolinux [ -f "$memtest86" ] && cp -v -f $memtest86 $isolinux find $syslinux \( \ -name isolinux.bin -o \ -name menu.c32 -o \ -name ldlinux.c32 -o \ -name libutil.c32 \ \) -exec cp -v -f {} $isolinux \; chmod -x $isolinux/* echo "\"isolinux.cfg\" -> \"$isolinux/isolinux.cfg\"" cat > $isolinux/isolinux.cfg << __EOF__ ui menu.c32 timeout 100 menu title Boot Menu menu color border 30;40 #00000000 #00000000 none menu color title 1;36;40 #c00090f0 #00000000 std menu color unsel 37;40 #90ffffff #00000000 std menu color hotkey 1;37;40 #ffffffff #00000000 std menu color sel 7;37;40 #e0000000 #20ff8000 all menu color scrollbar 30;40 #40000000 #00000000 std label install menu label Boot FreeBSD boot /boot/cdboot label memtest menu label Run Memtest86+ linux ${memtest86##*/} __EOF__
mkiso.sh
#!/bin/sh # $1 - iso files dir # $2 - iso file name if [ ! -d "$1" ]; then echo "Usage: ${0##*/} iso-dir [iso-file]" exit 1 fi iso_dir=${1} iso_name=${2:-FreeBSD-memtest86.iso} volid=$(basename $(grep "/dev/iso9660" ${1}/etc/fstab | cut -d ' ' -f1)) mkisofs -r -U -V ${volid} \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 4 \ -input-charset koi8-r \ -o ${iso_name} ${iso_dir} echo echo "Created $(realpath ${iso_name})"
Комментариев нет:
Отправить комментарий