Создание загрузочных дискет и CD-дисков Linux::Журнал СА 6.2003
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Магазин
Архив номеров
Вакансии
Контакты
   

  Опросы

Какие курсы вы бы выбрали для себя?  

Очные
Онлайновые
Платные
Бесплатные
Я и так все знаю

 Читать далее...

1001 и 1 книга  
20.12.2019г.
Просмотров: 4899
Комментарии: 0
Dr.Web: всё под контролем

 Читать далее...

04.12.2019г.
Просмотров: 6151
Комментарии: 0
Особенности сертификаций по этичному хакингу

 Читать далее...

28.05.2019г.
Просмотров: 7389
Комментарии: 2
Анализ вредоносных программ

 Читать далее...

28.05.2019г.
Просмотров: 7733
Комментарии: 1
Микросервисы и контейнеры Docker

 Читать далее...

28.05.2019г.
Просмотров: 6785
Комментарии: 0
Django 2 в примерах

 Читать далее...

Друзья сайта  

Форум системных администраторов  

sysadmins.ru

 Создание загрузочных дискет и CD-дисков Linux

Архив номеров / 2003 / Выпуск №6 (7) / Создание загрузочных дискет и CD-дисков Linux

Рубрика: Администрирование /  Продукты и решения

ВСЕВОЛОД СТАХОВ

Создание загрузочных дискет и CD-дисков Linux

В этой статье пойдет речь о создании загрузочных дискет и CD-дисков Linux, которые бывают полезны, а зачастую и необходимы во многих ситуациях, начиная от банального восстановления забытого пароля и заканчивая работой в качестве print-сервера.

Для чего применяются «микро-дистрибутивы»? Примеров применения можно найти море:

  • аварийная дискета;
  • маршрутизатор (www.linuxrouter.org);
  • брандмауэр;
  • бездисковый клиент NFS;
  • утилита для клонирования системы;
  • система для контроля дисковых разделов;
  • смена «забытого» пароля;
  • система, предназначенная для обучения новичков;
  • набор для комфортной работы на любом компьютере;
  • сервер печати;
  • любой сетевой сервер.

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

На сайте www.linuxlinks.com можно найти огромное количество ссылок на различные виды мини-дистрибутивов, каждый из которых предназначен для решения определённых задач. Но я не думаю, что каждый готов выкачивать мегабайты из сети, чтобы решить свою конкретную проблему. Кроме этого, весьма полезно иметь под рукой мульти-загрузочный CD, содержащий несколько мини-дистрибутивов на одном диске. Обо всем этом вы можете узнать, прочитав эту статью. Также хорошим источником информации является Bootdisk-HOWTO.

Перед созданием загрузочного диска необходимо четко представлять цель, с которой этот диск создается, чтобы впоследствии не пожалеть о бесполезно затраченном времени. Выбор ядра также должен определяться конечной целью. В любом случае при выборе ядра учтите следующие факты:

  • ядра 2.2 версий обычно меньше по размеру, но менее функциональны;
  • ядро следует брать как можно новее (но обязательно из стабильной ветки), например, на момент написания этой статьи я расцениваю «новыми» ядра 2.4.20 и 2.2.20 и выше; новые ядра используют компрессию bzip2 и дают выигрыш в размере;
  • если не планируется работа с сетью, то отказ от использования TCP/IP дает очень существенный выигрыш в размере (до 300 Кб!);
  • в ядро обязательно нужно включить поддержку ext2fs и ramdisk, если планируется загрузка ядра при помощи syslinux, то также необходимо включить поддержку msdosfs;
  • лучше всего выключить оптимизацию ядра под определенный процессор, лучше всего будет оставить i386;
  • я не очень уверен насчет целесообразности использования модулей, но если нужна максимальная переносимость, то модули применять, конечно, можно;
  • если вам необходим NFS-дистрибутив, то необходимо установить поддержку nfs на странице настройки файловых систем (в make menuconfig);
  • наконец, последний и самый важный совет – удаляйте из ядра все лишнее без сожаления, первыми кандидатами на удаление являются редкие устройства, звуковые карты, система netfilter и прочие полезности со страницы networking options, хотя если вы создаете nfs-дистрибутив, то от этого правила можно отойти, т.к. основная файловая система все равно будет находиться на удаленной машине, а ядро фактически в любом случае влезает на дискету.

Каким образом будет грузиться ядро? Существует несколько способов загрузки ядра с дискеты:

  • ядро, будучи записанным на дискету, начиная с 0-го сектора, распаковывается в память и запускается при помощи так называемого kernel loader, этот способ хорош своей быстротой и простотой реализации (фактически ядро записывается непосредственно на дискету без файловой системы), но при этом невозможно непосредственно указывать параметры ядру, что не подходит для создания NFS-дистрибутивов;
  • на дискете формируется обычная файловая система ext2, и ядро записывается непосредственно на файловую систему, при этом возможно манипулирование с дискетой как с обычным ext2-томом, загрузка происходит при помощи lilo, записанного на дискету (необходимо формировать специальный конфигурационный файл для lilo, что будет объяснено далее), преимущества такого способа в том, что при помощи lilo очень просто передавать ядру определённые параметры (что необходимо для использования NFS в качестве root-устройства), недостаток – файловая система на дискете не сжата, поэтому создание root-fs на дискете лишено смысла, т.к. на несжатую систему весьма сложно записать все необходимое;
  • на дискете формируется msdosfs, и загрузка ядра происходит из msdos-программы syslinux, при таком способе появляется возможность работы с такой дискетой в msdos (win*), сама root файловая система сжимается при помощи zip.

Самая большая проблема при создании floppy-дистрибутивов – это формирование корневой файловой системы (которая обычно загружается в память). Корневая файловая система не находится на дискете в NFS-дистрибутивах, что сильно облегчает создание загрузочной дискеты. Поэтому прежде чем говорить о создании дискет с автономной root-fs, я расскажу о создании NFS-дистрибутивов.

NFS-дистрибутивы содержат на дискете только ядро, которому при загрузке передается параметр nfsroot, показывающий, что root-fs находится на NFS-сервере. Ядро монтирует NFS и запускает init. Все операции ядра с root-fs происходят по протоколу rpc в открытом виде, что, конечно, небезопасно. Поэтому не рекомендуется хранить ценные данные на NFS-разделах, особенно это касается паролей (для NFS-системы обязательно иметь особые пароли, которые также полезно время от времени менять). NFS-системы довольно сильно нагружают сеть и годятся только для LAN. NFS-дистрибутивы полезны во многих случаях: резервное копирование, клонирование, запись CD, аварийное восстановление системы и т. д. Ядро для таких дистрибутивов строится без особых ограничений к размеру (т.к. в основном полноценное ядро занимает около 1 Мб) и обязательно должно содержать TCP/IP и поддержку NFS (см. раздел filesystems в make menuconfig). После компиляции ядра (модули этого ядра должны быть установлены на NFS-раздел в соответствующий каталог) необходимо сформировать ext2fs на дискете:

# mke2fs -N 300 /dev/fd0

Опция -N 300 говорит, что необходимо зарезервировать место для 300 inode (хотя в данном случае это число можно и уменьшить на порядок) для экономии места.

После формирования файловой системы записываем на дискету ядро:

# mount -t ext2fs -o rw /dev/fd0 /mnt/tmp

# cp $KERNELSRC/arch/i386/boot/bzImage /mnt/tmp/vmlinuz

# umount /dev/fd0

После этого начинаем настройку lilo:

/tmp/lilo.conf.tmp

boot=/dev/fd0

prompt

timeout=50

compact

vga=normal

read-only

menu-title=" NFS-distributive "

image=/vmlinuz

    label=linux

    append="root=/dev/nfs nfsroot=192.168.1.1:/exports/debian ip=::::nfs-client::bootp"

Несколько поясню значения параметров:

  • root=/dev/nfs – указывает ядру, что root-fs находится на NFS-сервере;
  • nfsroot – параметр, указывающий ядру, где искать nfsroot в виде:

nfsroot=[:][,]

  • root-dir должна указываться как абсолютный путь на сервере (как это указано в /etc/exports на NFS-сервере);
  • ip – настройки IP-протокола, в данном примере все настройки получаются от bootp-сервера, в общем случае этот параметр выглядит таким образом:

ip=::::::

Если какое-либо поле не указывается, то просто ставится :, например, для настройки статического IP (что пригодится для использования, например, в print-сервере):

ip=192.168.1.102:192.168.1.1:192.168.1.1:255.255.255.0:print-server:eth0:

Если используется автоконфигурирование IP при помощи bootp или rarp, то необходимо включить поддержку этих протоколов в ядре (IP: kernel level autoconfiguration на странице Networking options). В качестве bootp-сервера можно применять ISC dhcpd, но в директиве range должно присутствовать ключевое слово dynamic-bootp (range dynmaic-bootp 192.168.2.1 192.168.2.100), и для каждого клиента bootp должна быть отдельная директива host:

host hostname{

    [parameters]

}

Эта директива разрешает выдачу IP-адресов только определённым хостам.

Настройка сервера NFS также не должна вызвать особых проблем. При компиляции ядра нужно включить поддержку nfs-сервера и установить программы mountd и nfsd. После этого необходимо выбрать каталог и установить туда GNU/Linux. Вариантов может быть несколько: можно взять жесткий диск, установить на него Gnu/Linux и примонтировать в необходимый каталог на сервере, а можно просто скопировать все файлы с дискового мини-дистрибутива.

У нас, например, в качестве NFS-системы используется debian. Далее необходимо отредактировать файл /etc/exports:

/exports/debian nfs-client(rw,no_root_squash)

где:

  • /exports/debian – каталог, в котором расположена основная nfs-система;
  • nfs-client – имя хоста нашего мини-дистрибутива, опции rw и no_root_squash говорят о возможности монтирования этим клиентом этого каталога для записи и о том, что этот клиент может осуществлять доступ к данному каталогу от имени суперпользователя.

Далее необходимо запустить mountd и nfsd:

# rpc.mountd

# rpc.nfsd

Можно проверить правильность их работы при помощи команд:

# rpcinfo -p

# showmount --export

После этого завершаем построение нашего дистрибутива и записываем на дискету lilo.

Для начала необходимо скопировать загрузочный сектор lilo с жесткого диска на дискету:

# mount -t ext2 /dev/fd0 /mnt/tmp

# mkdir /mnt/tmp/boot

# cp /boot/boot.b /mnt/tmp/boot

также полезно будет скопировать конфигурационный файл lilo:

# cp /tmp/lilo.conf.tmp /mnt/tmp/lilo.conf

# /sbin/lilo -v -C /mnt/tmp/lilo.conf -r /mnt/tmp

Опция -r говорит lilo о необходимости использовать другой корневой каталог (в нашем случае дискету).

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

...cut...

image=/vmlinuz

...cut...

    password="my_password"

    mandatory

На этом я завершаю описание построения NFS-дистрибутива и перехожу к рассказу о создании автономных дистрибутивов.

Основное отличие автономного дистрибутива от NFS-дистрибутива в том, что корневая файловая система автономного дистрибутива расположена на дискете. Главная проблема такого дистрибутива – небольшой объем дискеты. Поэтому приходится запаковывать root-fs для записи на дискету и распаковывать при загрузке ядра в память. Такая схема позволяет уместить на дискету гораздо больше информации и избежать другого неприятного недостатка дискеты (и в меньшей степени компакт-диска) – неспешности операций ввода/вывода.

Формирование корневой файловой системы – процесс, требующий определённых навыков, поэтому я более подробно остановлюсь на этом этапе создания автономного дистрибутива.

Как ядро определяет, какое устройство использовать в качестве root-fs? Во-первых, исследуется параметр root (если ядру не передано никаких параметров, то оно начинает исследовать блочные устройства и ищет первую ext2-fs), далее используется параметр initrd (initial ram disk).

Внимание: для поддержки initrd необходимо включить опцию Block devices –> Initial RAM disk support.

Этот параметр указывает на компрессированную файловую систему, которая распаковывается в память и используется в качестве root-fs на этапе инициализации ядра (в дальнейшем корневая ФС может измениться, что полезно, например, для загрузки модульного ядра, когда основной корневой раздел имеет ФС, которая не вкомпилирована в ядро; в этом случае единственным выходом является создание initrd, содержащего необходимые модули).

Что представляет из себя initrd, и как его создавать? На самом деле initrd – это обычное устройство, на котором расположена корневая ФС. Создание ramdisk не должно представлять особых проблем. Для начала необходимо создать некомпрессированный образ ram-диска (он должен быть достаточных размеров, обычный размер – 3 Мб.):

# dd if=/dev/zero of=/tmp/initrd.img bs=1024 count=3072

Изначально мы заполняем весь образ 0, поэтому при сжатии лишние нули места занимать не будут (самая плохая идея – копировать в образ /dev/random, т.к. никакому сжатию он не подвергается, и размер ram-диска может существенно превышать фактический размер дискеты.

Далее создаем ext2fs (обратите внимание на число inode):

# mke2fs -N 360 -m 0 /tmp/initrd.img

монтируем образ (в ядре должна быть включена поддержка loop devices – см. на странице Block devices -> Loop device support):

# mount -t ext2 -o loop /mnt/tmp /tmp/initrd.img

Недавно я обнаружил одну занимательную вещь: если создать 3 Мб ram-диск и записать на него 3 Мб данных, а потом стереть 1 Мб, то сожмется такой файл очень слабо, т.к. изначально весь образ был заполнен нулями, а после удаления на месте файлов нули не пишутся, что намного уменьшает эффективность архивации. Поэтому для экспериментов лучше не использовать образ, а поколдовать где-нибудь на основной файловой системе, а потом все перенести на ram-диск при помощи cp с флагами -dpR (cp -dpR ./* /mnt/tmp).

После этого можно приступать к созданию файловой структуры корневого раздела нашей дискеты. Для начала создаем все необходимые каталоги:

  • /bin            
  • /sbin
  • /dev           
  • /tmp
  • /etc            
  • /usr
  • /lib              
  • /usr/bin
  • /proc          
  • /usr/sbin
  • /root           
  • /var 

После этого необходимо скопировать все нужные для работы устройства (ни в коем случае не копируйте слишком много устройств, т.к. файлы устройств – настоящие пожиратели inode), следующие устройства обязаны присутствовать в системе:

# cp -dpR /dev/tty[0-6] /mnt/tmp/dev

# cp -dpR /dev/fd0* /mnt/tmp/dev

# cp -dpR /dev/console /mnt/tmp/dev

# cp -dpR /dev/kmem /mnt/tmp/dev

То же самое проделываем для устройств /dev/mem, /dev/null, /dev/ram0.

Если необходим доступ к дискам, то также можно скопировать и файлы /dev/hd* (или /dev/sd* для SCSI-дисков). Если вы получите сообщение о нехватке места, то придется увеличить количество inode (необходимо пересоздать ext2fs с большим числом inode и повторить все операции заново). После создания файлов устройств перейдем к созданию файлов в каталоге /etc. Безусловно, это одна из трудоемких операций, т.к. фактически мы создаем собственный дистрибутив с оригинальной конфигурацией, но я все-таки попытаюсь как можно более наглядно описать основные вехи формирования этого каталога. Во-первых, необходимо создать /etc/passwd, /etc/fstab, /etc/inittab, /etc/groups, /etc/nssswitch.conf, которые могут выглядеть следующим образом:

/etc/passwd

root::0:0:root:/root:/bin/sh

daemon:*:1:1:daemon:/sbin:/bin/sh

bin:*:2:2:bin:/bin:/bin/sh

sys:*:3:3:sys:/dev:/bin/sh

sync:*:4:100:sync:/bin:/bin/sync

games:*:5:100:games:/usr/games:/bin/sh

man:*:6:100:man:/var/cache/man:/bin/sh

lp:*:7:7:lp:/var/spool/lpd:/bin/sh

mail:*:8:8:mail:/var/mail:/bin/sh

/etc/fstab

/dev/ram0        /            ext2   defaults     0 1

proc             /proc        proc   defaults     0 0

/etc/inittab

# Runlevel по умолчанию:

id:2:initdefault:

# Путь к инициализационному скрипту:

si::sysinit:/etc/rc

# Запуск /sbin/getty для виртуальных консолей (в данном примере 3, но может быть и больше, только учтите,

# что устройства ttyX должны находиться в каталоге /dev ram-диска):

1:2345:respawn:/sbin/getty 9600 tty1 linux

2:23:respawn:/sbin/getty 9600 tty2 linux

3:23:respawn:/sbin/getty 9600 tty3 linux

# Перезагрузка при нажатии клавиш Ctrl+Alt+Del:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now                      

/etc/group

root:x:0:

daemon:x:1:

bin:x:2:

sys:x:3:

tty:x:5:

disk:x:6:

lp:x:7:lp

mail:x:8:

/etc/nsswitch.conf

passwd:     files

shadow:     files

group:      files

hosts:      files

networks:   files

protocols:  files

services:   files

Кроме этого, необходимо настроить pam так, чтобы можно было заходить в систему, не вводя пароля (т.к. пароль как мера безопасности бесполезен на дискете, гораздо лучше, например, защитить образ при помощи пароля lilo):

/etc/pam.conf

OTHER   auth       optional     /lib/security/pam_permit.so

OTHER   account    optional     /lib/security/pam_permit.so

OTHER   password   optional     /lib/security/pam_permit.so

OTHER   session    optional     /lib/security/pam_permit.so

После чего можно перейти к настройке стартовых скриптов. Здесь есть два варианта:

1) перекопировать /etc/inittab, /etc/init.d и /etc/rc.* на ram-диск и удалить ненужные скрипты;

2) создать свой inittab и простой стартовый скрипт (который указывается в inittab директивой si::sysinit:/path_to_script), подобный следующему:

/etc/rc

#!/bin/sh

# Устанавливаем переменные среды:

PATH=/bin:/sbin:/usr/bin:/usr/sbin

# Монтируем файловые системы:

/bin/mount -av

# Устанавливаем имя хоста:

/bin/hostname floppy-dist

# Настраиваем и запускаем сетевой интерфейс (если это нужно):

/sbin/ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255

/sbin/ifconfig eth0 up

# Настраиваем маршрутизацию:

/sbin/route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1

# Далее могут быть другие команды, в зависимости от назначения дистрибутива

export PATH

Не забудьте сделать этот файл исполняемым:

# chmod +x /mnt/tmp/etc/rc

Необходимо также иметь файлы настройки терминала (termcap или база terminfo). В моей системе (Debian GNU/Linux) используется база terminfo, поэтому можно просто скопировать нужный терминал на ramdisk:

# mkdir -p /mnt/tmp/etc/terminfo/l

# cp /etc/terminfo/l/linux /mnt/tmp/etc/terminfo/l/linux

Если планируется использование /etc/termcap, то просто скопируйте строки, относящиеся к терминалу linux из существующего файла на дискету.

Содержимое каталога /etc может сильно различаться в зависимости от того, для каких целей планируется система, но, в общем, должны обязательно присутствовать вышеприведенные файлы. Далее необходимо заняться также весьма трудоемкой частью работы – созданием каталогов /bin, /sbin и /lib. Из-за небольшого размера дискеты на неё весьма сложно записать полноценную систему, поэтому очень часто приходится пользоваться «куцыми» аналогами системных утилит. Один из самых известных проектов – busybox, содержащий урезанные, но вполне функциональные аналоги стандартных утилит (cd, ls, sh, vi, ifconfig и других). Эти утилиты содержатся в едином выполняемом файле, на который обычно делают символические ссылки примерно таким образом:

# cd /mnt/tmp

# ln -s bin/busybox bin/cd

# ln -s bin/busybox bin/ls

Для создания всех символических ссылок необходимо проинсталлировать собранный из исходников следующим образом:

# make PREFIX=/mnt/tmp install

При добавлении исполняемых файлов на ram-диск, не забывайте проверять зависимости при помощи программы ldd:

(debian:/etc)# ldd /sbin/init

libc.so.6 => /lib/libc.so.6 (0x4001d000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Эти библиотеки также необходимо скопировать на ram-диск.

Обязательно необходимо наличие следующих файлов:

  • /sbin/init (есть в составе busybox, но я бы рекомендовал воспользоваться полноценным init);
  • /sbin/getty;
  • /bin/mount (busybox);
  • /bin/sh (я использовал ash(NetBSD sh) – классический shell);
  • /bin/login.

Также весьма удобно наличие busybox. В папке /lib должны быть по крайней мере 3 библиотеки:

  • /lib/libc.so.6 – стандартная библиотека СИ;
  • /lib/ld-linux.so.2 – библиотека димамического компоновщика ld;
  • /lib/libnss_files.so.2 – библиотека выбора сетевых служб (используется libc для выбора способа аутентификации, без этой библиотеки вы не сможете пройти этап логина);
  • /lib/libdl.so.2 – библиотека загрузки DLL (нужна для login);
  • /lib/libpam.so.0 – библиотека pam;
  • /lib/libpam_misc.so.0 – библиотека pam, нужная для login;
  • /lib/libcrypt.so.1 – библиотека шифрования (также нужна для login);
  • /lib/security/pam_permit.so – PAM-модуль, всегда подтверждающий права доступа.

При выборе busybox лучше отановиться на динамически скомпонованной версии (использующей библиотеку СИ), т.к. библиотеку СИ (более 1 Мб) все равно придется копировать на ramdisk. При копировании библиотек учтите, что большинство отображаемых библиотек являются сивмолическими ссылками, поэтому не забывайте скопировать и ссылку, и файл, на который эта библиотека ссылается (копировать ссылку в этом случае надо с флагом -d). Если ваше ядро содержит модули, то не забудьте их скопировать на ram-диск (лучше весь каталог /lib/modules/$KERNELVERSION/), также не забудьте скопировать исполняемые файлы insmod, modprobe, rmmod, lsmod и depmod в каталог /sbin на ram-диске. После всей этой мороки делаем заключительные действия:

# mkdir -p /mnt/tmp/var/{log,run}

# touch /mnt/tmp/var/run/utmp

кроме этого, настриваем динамический компоновщик:

# ldconfig -r /mnt/tmp

После этого отмонтируем образ:

# umount /mnt/tmp

сжимаем его при помощи gzip (bzip2 не подходит) и записываем в какой-нибудь каталог:

# gzip -c9 /tmp/initrd.img > ~/initrd.gz

# rm -f /tmp/initrd.img

и приступаем к записи дискеты, имея ядро и подготовленный образ...

Существует несколько способов записи автономной дискеты, из них я расскажу о двух: использование загрузчика ядра (наиболее компактный метод) и использование загрузчика syslinux (загрузка с дискеты ms-dos).

При использовании kernel-loader значительно усложняется процесс настройки параметров ядра и изменение чего-либо на дискете. Преимущества kernel-loader – компактность и отсутствие необходимости наличия файловой системы на дискете. Создание дискеты такого типа тоже не представляет особых проблем: для начала копируем ядро на дискету, начиная с 0-го сектора:

# dd if=/usr/src/linux/arch/i386/boot/bzImage of=/dev/fd0 bs=1k

384+1 прочитано блоков

Цифры означают, сколько блоков заняло ядро. Знак «+» значит, что ядро заняло 384 полных блока и 1 неполный. Root-fs может размещаться с 385 блока соответственно. Эту цифру надо запомнить, а еще лучше – записать, т.к. в дальнейшем она нам еще пригодится. На следующем этапе необходимо чуть-чуть поколдовать с настройками ram-диска:

# rdev /dev/fd0 /dev/fd0

Указываем, что ram-диск будет размещаться на том же устройстве, что и образ ядра (вообще команда rdev используется в случаях, когда ядро и корневая FS находятся на разных дисках).

# rdev -R /dev/fd0

Указание того, что ram-диск должен использоваться в качестве корневой файловой системы (опция -R должна быть написана именно так: с большой буквой R).

Далее мы должны указать маску ram-диска, чтобы ядро знало, где найти этот диск. Маска представляет собой 16-ти разрядное значение, в котором 10 бит представляют собой начальный блок ram-диска, бит 14 означает, должен ли быть загружен ram-диск, а бит 15 говорит о необходимости вывода подсказки перед загрузкой initrd. Чтобы не утомлять читателей расчетами, просто скажу, что если initrd расположен на одной дискете с ядром, то это значение рассчитывается как block_of_kernel + 16384, а если initrd записан на другой дискете, то этот параметр имеет фиксированную величину – 49152 (установка в 1 14 и 15 битов), а сам ram-диск записывается на другую дискету, начиная также с 0-го сектора. Приведу пример для ситуации, когда ядро и ramdisk размещаются на одной дискете:

# rdev -r /dev/fd0 `expr 16384 + 385`

если кто-то умеет складывать такие числа в уме (я не умею), то для него эта команда будет выглядеть так:

# rdev -r /dev/fd0 16769

После того как ядро узнает, где расположен initrd, можно спокойно записывать наш компрессированный образ на дискету (в нашем примере образ записывается сразу же после ядра, ну а если initrd планируется разместить на другой дискете, то образ записывается с 0-го блока соответственно):

# dd if=~/initrd.gz of=/dev/fd0 bs=1k seek=385

Подождем, пока запишется образ, и перезагрузимся с дискеты. Если все прошло нормально, то можете вздохнуть спокойно и гордиться тем, что вы создали свой собственный, пусть маленький, но настоящий дистрибутив Linux!

Если же возникли ошибки, то придется повторять вышеописанные действия, пока эти ошибки не будут исправлены. Если вам необходимо поправить initrd, то учтите, что все изменения, которые вы проделываете в корневом разделе непосредственно при работе нашего floppy-дистрибутива, не сохраняются нигде, и при рестарте будут утрачены, так что единственным способом поправить что-либо является редактирование образа (естественно, для начала образ нужно разжать и примонтировать) с последующей записью его на дискету (новый образ можно писать прямо поверх старого, не меняя при этом параметров ram-диска, единственное условие: чтобы новый образ писался с того же блока, что и старый). Ну что ж, думаю, с этим способом создания boot-дискеты все ясно, настало время рассказать и о другом: о создании msdos-дискеты c Linux.

Для этой цели существует специальная утилита – syslinux (домашняя страница: http://syslinux.zytor.com), которая позволяет обойти обычный процесс загрузки ms-dos, запуская ядро Linux. Настройка syslinux весьма похожа на настройку lilo: создается конфигурационный файл, описывающий образы, расположенные на диске. При этом доступно весьма большое количество параметров, но нас будут интересовать только те параметры, что отвечают за загрузку ядра, передачу ему (ядру) аргументов и загрузку initrd. Итак, опишу все стадии правильной подготовки ms-dos дискеты:

  • форматируем дискету, не проверяя сбойные сектора:

# fdformat -n /dev/fd0

  • проверяем сбойные сектора:

# badblocks /dev/fd0 > /tmp/fd0.bad

  • создаем файловую систему (FAT12 в данном случае) с меткой «boot» и указываем обнаруженные сбойные сектора:

# mkfs.msdos -l /tmp/fd0.bad -n boot /dev/fd0

  • далее записываем syslinux на дискету (появится файл ldlinux.sys):

# syslinux /dev/fd0

  • копируем ядро и initrd:

# mount /dev/fd0 /floppy

# cp /usr/src/linux/arch/i386/boot/bzImage /floppy/vmlinuz

# cp ~/initrd.gz /floppy/

  • после этого составляем примерно такой конфигурационный файл:

# vi /floppy/syslinux.cfg

syslinux.cfg:

default linux

prompt 1

label linux

kernel vmlinuz

append initrd=initrd.gz

Обратите внимание на структуру описания ядра:

label метка

kernel файл_ядра

append опции_ядра

В общем случае выбор загрузчика будет определяться конкретными целями. Но учтите, что самый экономичный (хотя и менее гибкий) способ – использование kernel loader.

Для некоторых целей объема и скорости дискеты явно недостаточно. В таких случаях идеально использовать загрузочные CD-диски. О том, как создавать такие диски, и пойдет дальше речь.

Я буду предполагать, что ваш CD-Record привод работает правильно под Linux (если нет, то почитайте CD-Writing-HOWTO: http://www.guug.de/~winni/linux). Для создания bootable CD существует особое расширение формата iso9660. Новые версии mkisofs умеют работать с этим расширением, для очень старых версий необходим патч.

# cp /dev/fd0 /cd-iso/boot/boot.img

После этого создается isofs:

# cd /cd-iso

# mkisofs -r -b boot/boot.img -c boot/boot.catalog -o bootcd.iso ./

После этого при загрузке с CD-ROM загружается указанный опцией -b образ дискеты. Файл boot.catalog создается mkisofs автоматически, т.к. этот файл необходим по стандарту (как я понял, для создания multi-boot CD). На самом CD может оказаться удобным разместить файловую систему /usr, т.е. на дискете миниатюрный набор необходимых программ, а на самом компакте – основной дистрибутив (не забудьте включить поддержку файловой системы iso9660 в ядре). Для организации такого поведения скопируйте все необходимые файлы на CD, с которого будет осуществляться загрузка:

  • /bin           
  • /sbin
  • /lib             
  • /share
  • /libexec   
  • /src
  • /local        
  • /tmp

Обратите внимание на отсутствие префикса /usr. При загрузке дискеты можно примонтировать CD вручную:

# mount -t iso9660 -o ro,exec /dev/hd[b] /usr

Или сделать запись в /etc/fstab на дискете:

/dev/hdb       /               is09660    ro,exec  0 0

В общем, ничего сложного в создании CD-дистрибутива нет. Все сводится к подготовке правильного загрузочного образа и формировании необходимых программ, размещающихся непосредственно на CD. Запись загрузочного образа ничем не примечательна:

# cdrecord -v speed=8 dev=0,0,0 /cd-iso/bootcd.iso

Единственную трудность представляет, пожалуй, создание мульти-загрузочного диска. Я решил не описывать этот процесс в данной статье, т.к. сам недавно увидел статью «Изготовление мульти-загрузочного CD-диска» в русской Linux Gazette. Статья написана очень грамотно и поможет решить любые вопросы.

Поэтому в этой статье я не буду цитировать чужую публикацию, а просто дам ссылку на вышеупомянутую статью: http://gazette.linux.ru.net.

Итак, на этом я завершаю своё небольшое руководство и привожу список полезных ссылок и полезных документов:

  1. http://www.tldp.org – здесь могут быть найдены Linux Boot Disk HOWTO, CD-Writing-HOWTO.
  2. http://syslinux.zytor.com – сайт syslinux.
  3. http://www.linuxlots.com/~fawcett/yard/index.html – набор утилит для восстановления системы.

Список ресурсов, где могут быть найдены образы загрузочных дискет и дисков различного назначения:

  1. http://www.linuxlinks.com – огромный архив ссылок на проекты различных мини- и микро-дистрибутивов (очень полезно посмотреть!)
  2. http://www.toms.net/rb – Tomsrtbt мини-дистрибутив, содержащий утилиты по восстановлению данных.
  3. http://www.liap.eu.org – LIAP, «Linux в пилюлях» – сайт содержит множество образов 1.44 Мб дискет с различными утилитами и разными версиями ядра для борьбы со всякого рода неприятностями.
  4. http://www.ibiblio.org/pub/Linux/system/recovery – огромный архив всякого рода утилит и загрузочных образов для восстановления.

Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru