Анатомия SystemRescueCD-x86-1.3.5

Выражаю благодарность команде разработчиков gentoo.ru за предоставление тематической площадки для «вещания»! :) Начну пожалуй с цикла статей, посвящённых Linux-аналогу «реаниматора», собранного на базе Gentoo Linux. Итак, знакомьтесь: SystemRescueCD!!! Задача: затратив минимум времени и не устраивая глобального потепления путём длительных компиляций, допилить функциональность SystemRescueCD до необходимого уровня, добавив поддержку русского языка в консоли (UTF-8), убрав инструментарий разработчика, внеся другие мелкие правки: собственные скрипты, часовой пояс, службы. По ходу изучаем анатомию готового решения и обходим подводные камни...

В распакованном виде образ initramfs (/isolinux/initram.igz, cpio/gzip) занимает в памяти порядка 41Мб. После развёртывания squashfs-образа в память (~175Мб, /sysrcd.dat) и/или перехода в основной корень (CDROOT), эти 41Мб высвобождаются. /isolinux/isolinux.cfg определяет различные варианты загрузки с SysRescueCD, /isolinux/f*.msg – хэлпскрины, выводимые по нажатию F1...F7.

Помимо специализированной загрузки (memtest, ntpasswd, freedos, gag, ranish, hdt, dban, mhdd, netboot, grubdisk, disk1), есть четыре ядра на выбор: rescuecd (2.6.31.12-std135), rescue64 (2.6.31.12-std135-amd64), altker32 (2.6.27.41-alt134) и altker64 (2.6.27.41-alt134-amd64). Не считая модулей, самое большое ядро (altker32) – 5Мб, самое маленькое (rescue64) – 4Мб. Конфиг выбранного при загрузке ядра доступен через /proc/config.gz, а также через /root/kernel-2.6.*.conf.

Initramfs-образ содержит в /lib/keymaps не очень подходящую для нас карту 31.map, однако в /usr/share/keymaps/i386/qwerty лежит нужная нам ru4.map.gz и loadkeys ru4 её загружает. Также, внутри squashfs-образа уже имеются необходимые нам /usr/share/consoletrans/koi2alt и русские шрифты в /usr/share/consolefonts/ter-*.psf.gz, что уже обнадёживает! :)

Хотя и zsh, и bash, вроде бы собраны с флагом unicode, есть проблемы с вводом и выводом русского языка в консоли. Изменив только /etc/conf.d/{consolefont,keymaps} и перезапустив соответствующие службы, ввод и вывод русских символов заработает только после запуска bash, и то, очень кривовато. А чтобы «лазить» по дискам с русскими именами файлов, проверять их на вирусы итп, крайне желательно иметь дружелюбную консоль с поддержкой в/в родного языка. Попробуем это вылечить, а заодно научимся изменять под собственные нужды SystemRescueCD, благо он уже содержит весь необходимый инструментарий...

Используя утилиты /usr/sbin/sysresccd-* создаём собственный дистрибутив. 2Гб свободного места на диске должно хватить. Сразу оговорюсь, что если вы не стали нарезать ISO'шку на CD-болванку, а решили работать с USB-флэшкой, НЕ УДАЛЯЙТЕ /isolinux!!! При создании USB-флэшки по этой инструкции вместо предлагаемого там лучше использовать следующий набор команд:

cp -af /mnt/cdrom/* /mnt/usbstick/
cp /mnt/usbstick/isolinux/isolinux.cfg /mnt/usbstick/isolinux/syslinux.cfg
cp -R /mnt/usbstick/isolinux /mnt/usbstick/syslinux

Далее не стану подробно излагать всю инструкцию, она написана довольно понятно, однако обращу внимание на некоторые ключевые моменты. Первичное представление об инфраструктуре разработки этого диска можно получить по содержимому файлов /root/sysresccd-*.txt, /etc/make.conf, /etc/portage/*, /usr/sbin/sysresccd-*, /usr/share/sysresccd/*. До захода в чрут (лучше до Step-01) желательно во внешней среде заранее выставить нужный часовой пояс и время, а после входа в чрут первым делом опять же установить нужный часовой пояс (/etc/localtime, /etc/conf.d/clock) и снова проверить время (date). Это на случай, если часы BIOS показывают местное время вашего часового пояса, а не Лондонское (UTC).

Вся система 32-битная (CHOST='i486-pc-linux-gnu', PROFILE: default/linux/x86/10.0), собрана с C(XX)FLAGS='-Os -mtune=i686 -pipe', ACCEPT_KEYWORDS='x86', ACCEPT_LICENESS='*'. etc-update верно подметит, что разработчики диска забыли обновить целую кучу конфигов, а rc-update show поможет понять, какие сервисы, специфичные для SystemRescueCD, стартуют сами и для чего они нужны. К сожалению, инфраструктура далеко не полная, по крайней мере нет следов оверлея, из которого тянулись некоторые пакеты. Даже не советую пытаться сделать emerge -vauDN world или чего-нибудь в этом роде! ;)

Из /etc/mtab я сразу удалил вторую строку – явный «хвост», оставленный разработчиками. После внесения нужных правок в /etc/make.conf (необязательно) и запуска eix-sync первым делом обновляем portage, поскольку наша цель – корректно пересобрать несколько библиотек. В предлагаемом примере не будет ошибкой запустить всё одной командой:

emerge -va1 portage ncurses slang timezone-data

После чего делаем: echo '-5' | etc-update, редактируем конфиги и добавляем некоторые сервисы:

nano -w /etc/conf.d/{keymaps,consolefont,clock}

/etc/conf.d/keymaps:
	KEYMAP='-u ru4'
	SET_WINDOWKEYS='yes'
	EXTENDED_KEYMAPS='backspace keypad'
	DUMPKEYS_CHARSET='koi8-r'

/etc/conf.d/consolefont:
	CONSOLEFONT='ter-k16f'
	CONSOLETRANSLATION='koi2alt'

/etc/conf.d/clock:
	CLOCK='local'
	TIMEZONE='Europe/Moscow'
	CLOCK_SYSTOHC='yes'

/etc/init.d/keymaps start
/etc/init.d/consolefont start
rc-update add gpm default
rc-update add keymaps default
rc-update add consolefont default

Если необходимо, можно обновить clamav. Мне это не потребовалось, однако антивирусную базу я обновил:

mkdir -p /var/log/clamav
touch /var/log/clamav/freshclam.log
chown -R clamav:clamav /var/log/clamav
freshclam

До очистки среды и выхода из чрута я также изменил настройки Midnight Commander'а (в /root появляется поддиректория .mc), отредактировал /etc/nanorc и убедился, что поддержка русского языка в консоли появилась. Теперь не торопитесь переходить к очистке (Step-05). Тут будет ещё пара существенных замечаний. ;)

Во-первых, если находясь во внешней среде вы бы обратили внимание, с какими правами монтируется USB-флэшка (grep /mnt/cdrom /etc/mtab), наверняка бы встал вопрос об исполняемых файлах. Никакие скрипты, положенные в корень на последующих шагах, исполняться не будут!!! Обойти это простейшим способом можно например так: сложить их в /root внутри squashfs-образа или сложить скрипт-обёртку, которая будет цеплять не исполняемый файл из корня флэшки (/mnt/cdrom) через source.

Во-вторых, не советую при очистке удалять x11tools. Всё равно иксы не удаляются целиком, но и не работают после этой очистки! :) К тому же, иксы – весьма полезная вещь на таком диске. Также стоит иметь ввиду, что после очистки devtools многие программы вообще перестанут работать! Чтобы сэкономить ~30Мб и всё же выполнить такую очистку, сначала надо внести небольшие изменения. Из файла /usr/share/sysresccd/removelist-devtools-unmerge.txt удаляем строчку 'sys-devel/libtool'. Из файла /usr/share/sysresccd/removelist-devtools-filedir.txt в четвёртой снизу строке удаляем ',libltdl.so'.

Вот теперь в качестве Step-05 можно выполнить полную очистку таким образом:

sysresccd-cleansys devtools
rm -rf /var/log/* /usr/sbin/sysresccd-* /usr/share/sysreccd

Далее всё по инструкции (начиная со Step-06) и логике здравого смысла. Чтобы не видеть больше предлагаемый набор раскладок и 20-секундную паузу, запускаем sysresccd-custom setkmap us на восьмом шаге. На девятом шаге я также добавил в /mnt/custom/customcd/isoroot/isolinux/isolinux.cfg опцию 'dodhcp' в дефолтном варианте загрузки, чтобы сетка поднималась автоматом. Но это, как говорится, по желанию. Графику не трогал, иксы и так работают. Если нужна русская клава в иксах, оставляю в качестве домашнего задания.

Enjoy! ;)

В ихнюю багзиллу не пробовали

В ихнюю багзиллу не пробовали обращаться по поводу косяков?

Не грусти, товарищ! Всё хорошо, beautiful good!

Скорее на форум, багзиллы я там не нашёл...

Да и какие особо косяки, ведь сам по себе диск-то работает!? :) А раз уж человек берётся переделывать его под себя, тут он уже сам в ответе за все будущие косяки. Понятное дело, что инструкция на ВиКи не совсем соответствует каждой версии диска. Нашёл некоторые следы оверлея, но и там не всё. Например, нет скрипта linuxrc2 из initramfs. Зато теперь стало более понятно, что эта система собирается каталистом, и как выяснилось, образы специализированных загрузчиков в ней лежат готовые, они их вообще не пересобирают.

Привет!

Рад видеть новые хавтушки.
Сразу к делу.

Цитата:
Из /etc/mtab я сразу удалил вторую строку – явный «хвост», оставленный разработчиками.

разве файл /etc/mtab не динамично-генеририруемый?
Он содержит все смонтированные разделы из /etc/fstab.
какой толк его редактировать?

:)

Верно, но не только он, а все файлы генерятся динамически!

Вопрос только кем, когда и с какой целью. :) Конкретно по /etc/mtab:

Образ initramfs (/mnt/cdrom/???linux/initram.igz) содержит скрипт /init, в нём есть такой фрагмент:

...
if [ "${CDROOT}" -eq '1' ]
then
    rm -f /etc/mtab
    ln -s /proc/mounts /etc/mtab
...

Если загрузиться с флэшки и сделать ls -l /etc/mtab, то увидим, что это никакой не симлинк. Однако содержимое /etc/matb и /proc/mounts всё же идентично, т.е. действительно создаётся динамически, но не из initramfs, а уже скриптами в реальном корне: /etc/init.d/{checkroot,halt.sh,sysresccd}. Т.е. когда флэшка (или ISO-образ) будут готовы и мы с них загрузимся, всё будет работать действительно ровно так, как и задумывалось, НЕЗАВИСИМО от внесения изменений в /etc/mtab нами, когда мы находились в чруте.

Но ведь не случайно же этому моменту уделено внимание на заключительных страницах хэндбука, приглядитесь. ;) Я заметил разницу лишь по поведению команды df -h, когда сидел в чруте. Т.е. если нам нужен полностью правильно работающий чрут на этапе сборки, /etc/mtab вообще по-хорошему сделать изначально правильным (лучше скопировать из /proc/mounts). Вообще странно, почему это сразу не делается при sysresccd-custom extract.

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

Один из самых геморройных

Один из самых геморройных геморроев для новичков - это недостаточное количество inode по умолчанию на разделах /mnt/gentoo и /mnt/customcd
Надо бы упомянуть везде в документации: дескать, если раздел невелик (у меня 2Гб), делайте mke2fs -N 1M /dev/sda1

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

Каким тут боком SysRescueCD?

LevT написал(а):
недостаточное количество inode по умолчанию на разделах /mnt/gentoo и /mnt/customcd

А с каких пор это разделы? :) То, что вы в эти разделы монтировали, вы наверное сами и форматировали? Согласно своим потребностям. Причём тут SysRescueCD?

Правда я написал про 2Гб исходя из того, что в процессе ещё подключал своп и собирался на tmpfs. Просто не стал перегружать и без того большую статью. Был бы внятный отказ, можно было бы судить, действительно ли не хватает 2Гб. Сомневаюсь. На оффсайте написано, что 850Мб должно хватить на всё про всё.

Просто в sysresccd хорошие

Просто в sysresccd хорошие концентрированные доки - как и в самом генту. И вот этот момент и там, и тут опущен.

При 2Гб разделе по дефолту не хватает инодов (без подключения tmpfs, о котором в доках молчок). Обламывается то ли emerge --sync, то ли даже распаковка портежей. Короче 200000 с чем-то инодов, созданных mke2fs по умолчанию, точно не хватает.

ЗЫ. Будьте так любезны, дайте ссылку на решение "Если нужна русская клава в иксах, оставляю в качестве домашнего задания."

Ну, делайте тогда не 2, а 4 :)

Очевидно решается путём правки /etc/X11/xorg.conf в чруте, но я не проверял (за ненадобностью). Что-нть типа:

Section "InputDevice"
...
       Option          "XkbLayout" "us,ru(winkeys)"
       Option          "XkbOptions" "grp:ctrl_shift_toggle, grp_led:scroll"
EndSection

Ещё может быть вариант 2: /etc/hal/fdi/policy/10-x11-input.fdi :

<?xml version="1.0" encoding="utf-8"?><!-- -*- SGML -*- -->
<deviceinfo version="0.2">
<device>
  <match key="info.capabilities" contains="input.keyboard">
    <merge key="input.x11_driver" type="string">evdev</merge>
    <merge key="input.x11_options.XkbModel" type="string">pc105</merge>
    <merge key="input.x11_options.XkbLayout" type="string">us,ru(winkeys)</merge>
    <merge key="input.x11_options.XkbVariant" type="string">winkeys</merge>
    <merge key="input.x11_options.XkbOptions" type="strlist">grp:ctrl_shift_toggle</merge>
    <append key="input.x11_options.XkbOptions" type="strlist">grp:switch</append>
    <append key="input.x11_options.XkbOptions" type="strlist">grp_led:scroll</append>
    <append key="input.x11_options.XkbOptions" type="strlist">compose:ralt</append>
  </match>
</device>
</deviceinfo>

Но опять же, не проверял.

Большое спасибо за статью!

Большое спасибо за статью! Оказалась очень полезной :)
Еще удобно сменить shell по умолчанию, поправив /bin/bashlogin (zsh, может, и хорош, но bash привычнее)

Ещё один вариант русификации SystemRescueCD

В своем подходе я старался оставить возможность выбора языка при загрузке, избежать значительных изменений в конфигурационных файлах, обеспечить возможность быстрого внесения необходимых изменений по возможности без лишнего вмешательства пользователя.
http://www.ylsoftware.com/news/551

Цитата: Хотя и zsh, и bash,

Цитата:
Хотя и zsh, и bash, вроде бы собраны с флагом unicode, есть проблемы с вводом и выводом русского языка в консоли. Изменив только /etc/conf.d/{consolefont,keymaps} и перезапустив соответствующие службы, ввод и вывод русских символов заработает только после запуска bash, и то, очень кривовато. А чтобы «лазить» по дискам с русскими именами файлов, проверять их на вирусы итп, крайне желательно иметь дружелюбную консоль с поддержкой в/в родного языка. Попробуем это вылечить,...

могу ошибаться, но вроде из Х-ов с русскими именами файлов всё нормально....

________________________
"We Will Win"

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".