Быстрая сетевая загрузка "живых" образов дисков с Fedora 12 через PXE
Предисловие
Многие знают, что в дистрибутивах Fedora есть инструмент 'livecd-creator' из пакета 'livecd-tools', позволяющий создавать "живые диски" для загрузки Fedora на компьютер без установки на жёсткий диск. Ещё меньшему количеству людей интересен скрипт 'livecd-iso-to-pxeboot' из того же пакета, конвертирующий полученный образ ISO в образ initrd, который можно загрузить через PXE на "тонкий клиент". Но вот проблема: образ initrd имеет размер в несколько сотен мегабайт, что выливается в оооооооооооооооооооочень долгое время загрузки только этого образа (например, образ в 200 МБ загружается через сеть около полутора минут), что, мягко говоря, непонятно и непозволительно. К тому же, на загружаемом компьютере необходимо иметь такой объём памяти, который позволит не только разместить весь образ, но и заработать потом основной ОС.
Но выход есть, и в этой статье речь пойдёт как раз о том, как в разы уменьшить время загрузки initrd.img и требования к памяти.
Внимание: в этой статье не описывается, как настраивать сервера DHCP, PXE, NFS, как готовить файл kickstart. Предполагается, что сервера настроены, и даётся лишь подсказка, что нужно слегка изменить в работающих конфигурациях, чтобы заработало описываемое решение.
Предыстория вопроса для меня
Сетевой загрузкой Linux-систем я заинтересовался очень давно, приблизительно в 2000 году. В то время я был заведующим лаборатории с рабочими компьютерами конфигурации [CPU=i386,RAM=4MB,HDD=200MB], связанными между собой сетью на коаксиале (1Mbit). Т.к. студенты частенько убивали DOS различными способами (а свободного времени у меня было в 10 раз больше, чем сейчас), я сделал в лаборатории сетевое восстановление разделов с DOS'ом. Работало оно так: установленный в 2-х-мегабайтном разделе GRUB имел в меню пункт "Recovery" (конечно, под паролем), при выборе которого GRUB загружал ядро со включенной поддержкой NFS-root. Ядро запускало init, который запускал мой скрипт восстановления раздела, который с помощью dd копировал заранее сделанный образ DOS-раздела и производил некоторые манипуляции с файлами конфигурации на восстановленном разделе, чтобы TCP/IP в DOS'е работал корректно :-). И вот эта система восстановления компьютеров работала долгие годы, даже после того, как в лаборатории поменялся заведующий.
Первый вариант для Fedora 7
К концу 2007 года у меня был уже большой опыт работы с терминальными клиентами. Начинал с LTSP, потом перешёл к Thinstation. Однако, с течением времени менялись требования и к рабочим местам, и к их количеству. Дешевле стало купить не настоящий "тонкий клиент", а самый слабый компьютер, например, в конце 2008 года его конфигурация была такая: [CPU=AMD Sempron 3000+,RAM=512,video=itegrated,HDD=нет]. Но было бы несколько обидно отдавать "такое" на одно рабочее место, поэтому ко встроенной видеокарте добавлялась внешняя, и получалась двухголовая бездисковая рабочая станция (а точнее, таких рабочих станций было куплено три).
А вот с программной частью начались проблемы. Thinstation был не готов работать ни со встроенной сетевой картой (из-за отсутствия в старом ядре поддержки новой сетевой карты), ни с двухголовой конфигурацией. Я понял, что с ПО для новых тонких клиентов придётся повозиться. Вот тут-то и пришла в голову идея использовать "живые образы" из ISO. Программы "livecd-iso-to-pxeboot" тогда ещё не было, поэтому начинал практически с нуля. В общем, после недели ежедневной возни с livecd-tools (а также его вспомогательной программой mayflower), и десятков перезагрузок родилось вполне рабочее решение для сетевой загрузки образов. Но, оно было неполноценным, в том плане, что драйвера сетевых карт можно было указывать, изменяя сам скрипт 'livecd-creator'а. Времени для "причёсывания" кода у меня тогда не было, поэтому всё это отложилось на годы и не публиковалось :-(.
Отдельно хочу сказать о выборе второй видеокарты. Я не подумал о последствиях, и в заказе на поставку к интегрированной на материнскую плату NVidia была добавлена внешняя двухголовая ATI... Я проклял всё, когда пытался завести их все вместе, с разными комбинациями драйверов. Но в итоге было найдено решение - скрипт, который перед нормальным запуском X'ов запускал Xorg с ключом '-probeonly' и инициализировал видеокарты по очереди и в различных комбинациях на screen'ах, с использованием драйверов nv, nvidia и radeonhd. Поиск этого решения занял ещё две недели.
Текущий вариант для Fedora 12
В конце января 2010 года мне пришлось снова задуматься над этим вопросом. Новые "тонкие клиенты", хоть и были одноголовыми, но имели на борту другие сетевые- и видеокарты, к тому же дистрибутив Fedora сильно подрос. Попробовав результат работы программы 'livecd-iso-to-pxeboot', я пришёл к выводу, что так нельзя. Но взять готовые варианты из решения для Fedora 7 было невозможно - в новом дистрибутиве начал использоваться dracut, и livecd-creator использовал образ initrd, который собирал dracut.
Но решение снова было найдено, теперь всего за два рабочих дня. Предлагаемый минимальный патч к dracut'у + конвертер 'livecd-iso-to-nfssquash' решают вопрос подключения сжатого образа squashfs к тонкому клиенту с помощью NFS.
Патч состоит из 3-х основных частей:
-
предварительный парсер параметров командной строки, добавляющий некоторые хаки в систему событий dracut'а (кстати, система событий сделана довольно-таки просто, но без документации потребовала некоторое время на изучение).
-
модификации в скрипте 'dmsquash-live-root', отключающие монтирование блочного устройства, которого у нас нет.
-
модификации в скрипте init, добавляющие некоторую полезную функциональность (описывается ниже в разделе "Бонус").
Все эти изменения активируются только в случае использования в командной строке ядра параметра "nfssquash".
Итак, что нужно сделать, чтобы всё это заработало:
-
Загрузить пакеты dracut, dracut-network, livecd-tools-nfssquash и nfssquash-setup-client c этого сайта.
-
Скопировать пакеты dracut и dracut-network, в каталог, где будет сделан репозиторий пакетов.
-
В этом же каталоге выполнить команду "createrepo -d ." для создания репозитория.
-
Добавить в файл kickstart репозиторий, в котором находится изменённый пакет dracut.
-
Добавить в раздел "packages" файла kickstart пакет "dracut-network". Простое включение этого пакета в список на установку позволяет производить загрузку с NFS-root.
-
Собрать образ диска ISO с помощью инструмента livecd-creator.
-
Установить пакет livecd-tools-nfssquash и сконвертировать образ диска с помощью скрипта livecd-iso-to-nfssquash. Результат работы скрипта будет лежать в подкаталоге tftpboot текущего каталога.
-
Скопировать содержимое tftpboot в соответствующее место на PXE/NFS-сервере (рекомендуется сделать тестовый раздел).
-
Добавить в список экспортируемых каталогов NFS-сервера /tftpboot/liveimg и /tftpboot/livecfg (с параметром "только для чтения").
-
Загрузить тестовый "тонкий клиент".
Бонус
Плюсом сетевой загрузки описанного выше способа является то, что из сети можно загрузить не только образ диска тонкого клиента, но и модификации в "живой" образ, уникальные для каждого компьютера (или группы). Настройки, сделанные для его работы, копируются администратором на NFS-сервер и "тонкий" клиент, сразу после подключения образа, копирует эти изменения в свою файловую систему. Например:
-
на одном из используемых "тонких клиентов" установлен сканер;
-
персональная тонкая настройка "рабочего стола" пользователя;
-
ключи SSH хоста, генерируемые клиентом при первой загрузке, всё время будут одними и теми же.
И всё это можно динамически изменять, не пересобирая подключаемый образ.
Функциональность изменения файлов образа включается параметром 'nfssquash_conf' в командной строке ядра (пример можно увидеть в файле tftpboot/pxelinux.cfg/default). Если этот параметр есть, то производится попытка подключения соответствующего каталога с NFS-сервера, и уже из него производится запуск скрипта, который и производит действия по копированию файлов в подключенный "живой" образ. На NFS-сервере для этого необходимо установить пакет nfssquash-setup-client, в этом же пакете находится небольшая документация на русском языке.
Данная функциональность используется с самой первой реализации, т.е. с декабря 2007 года.
Предостережение о безопасности. Если в сети имеются недоверенные хосты, может быть необходимо ограничить список тех хостов, которые имеют доступ к /tftpboot/livecfg, т.к. ключи SSH могут попасть в руки злоумышленника.
Прочее
Приветствуется перевод статьи на другие языки, и перепечатка без изменения текста, с указанием автора.
Автор: Резцов М.В., системный администратор ЛВС АКВТ
Дата последнего изменения: 2010-02-09

