Итак, что мы имеем:
генератор образов - Thinstation-2.2.tar.gz
исходные коды - thinstation_src-2.2.tar.bz2
ASPLinux 10 установленный в режиме разработки,
свободное дисковое пространство - не менее 4 Гбайт,
т.к. исходники после распаковки занимают ~ 3.6 Гбайт.Статьи: Ядерная физика для домохозяйки 2.0,
HOWTO от Thinstation по сборке ядра.
Рекомендую прочитать всё до конца, прежде чем что-либо делать.
Часть 1.
Наши любимые буковки на носителях разного рода.
Что требуется сделать:
1. Распаковываем исходники командой tar -jxvf thinstation_src-2.2.tar.bz2
2. Распаковываем генератор Thinstation-2.2.tar.gz
3. Заходим в thinstation_src-2.2 и даём команду: ./RUNME
После чего попадаем в sh.
4. Идём в source/kernel-2.6.16.5/linux-2.6.16.5 и копируем оригинальный конфиг в дирректорию уровнем выше: cp .config ../.config.orig
5. Снова заходим в linux-2.6.16.5: cd linux-2.6.16.5
6. Последовательно выполняем команды:
make mrproper
make distclean
make menuconfig !Внимание, ничего не изменяем, только сохраняем конфиг.
rm .config
cp ../.config.orig .config
make menuconfug Здесь уже можно изменять параметры.
7. В разделе DOS/FAT/NT Filesystems устанавливаем параметры:
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=866
CONFIG_FAT_DEFAULT_IOCHARSET="CP1251"
В разделе # Network File Systems
CONFIG_SMB_FS=m
CONFIG_SMB_NLS_DEFAULT=y
CONFIG_SMB_NLS_REMOTE="CP1251"
В разделе # Native Language Support
CONFIG_NLS_DEFAULT="CP1251"
CONFIG_NLS_CODEPAGE_866=y
CONFIG_NLS_CODEPAGE_1251=y
Конфиг сохраняем.
8. Выполняем
cd ../
./setup.sh При этом начнётся процесс сборки ядра. Под конец у Вас спросят удалить ли старые файлы - ответить надо r (remove).
exit Выходим из ./RUNME
Итак, ядрышко готово, но его надо проинсталлировать. А куда? А в генератор образов. Для этого существует скрипт в папке Thibstation-2.2/utils/scripts имя ему - update_kernel.sh. Но прежде, чем мы его запустим - нам надо подправить путь к нашим исходникам в файле SOURCE_PATH директорией выше. После чего запустить скрипт: ./update_kernel.sh
По завершению его работы никаких сообщений в консоли быть не должено.
Теперь необходимо обратиться к скриптам, отвечающим за монтирование файловых систем, а именно к скриптам UDEV по адресу Thinstation-2.2/packages/base/etc/udev/scripts
Имеем три скрипта: floppy.sh ide.sh usb.sh - названия говорят сами за себя.
В floppy.sh правим строчку с mount так, чтобы она приобрела вид, всё в одну строчку:
mount -t supermount -o fs=auto,dev=$DEVNAME,--,codepage=866,iocharset=cp1251 \ /mnt/floppy /mnt/floppy
В ide.sh правим строчку с mount так, чтобы она приобрела вид, всё в одну строчку:
Для CD/DVD:
mount -r -t supermount -o fs=auto,dev=/dev/$devpath,--,iocharset=cp1251 \ /mnt/cdrom$x /mnt/cdrom$x
Для того, чтобы разделы FAT* распознавались добавляем к строчке
mount -t auto /dev/$devpath /mnt/disc/$name/$name
строчку:
mount -t vfat -o iocharset=cp1251,codepage=866 /dev/$devpath /mnt/disc/$name/$name
и к строчке
mount -t auto /dev/$devpath /mnt/disc/$name/part$node
строчку:
mount -t vfat -o iocharset=cp1251,codepage=866 /dev/$devpath /mnt/disc/$name/part$node
Чтобы в итоге получилось:
if [ -z "$node" ] ; then
mkdir /mnt/disc/$name/$name
mount -t auto /dev/$devpath /mnt/disc/$name/$name
mount -t vfat -o iocharset=cp1251,codepage=866 /dev/$devpath /mnt/disc/$name/$name
else
mkdir /mnt/disc/$name/part$node
mount -t auto /dev/$devpath /mnt/disc/$name/part$node
mount -t vfat -o iocharset=cp1251,codepage=866 /dev/$devpath /mnt/disc/$name/part$node
Этот костыль с FAT* нужен, т.к. mount не поддерживает автоопределение vfat, а добавление в /etc и /proc файла filesystems (со списком файловых систем, которые должы быть опробованы как параметр вместо auto), который должен читаться, если автоопределение выдало ошибку, не помогает. Буду признателен, если кто-нибудь предложит иное решение. Например, знаю, что параметрами можно организовать команду mount так, чтобы система пыталась смонтировать с заданными параметрами, но как записать это я не могу представить.
В usb.sh правим строчку с mount так, чтобы она приобрела вид, всё в одну строчку:
mount -t supermount -o fs=auto,dev=$DEVNAME,--,sync,nosuid,noatime,iocharset=cp1251,codepage=866,rw \ /mnt/usbdevice/$devname /mnt/usbdevice/$devname
Для тех, кто использует Samba, для предоставления доступа к носителям локального компьютера в smb.conf.tpl и smb.conf надо указать следующие параметры (в стандартной поставке Samba 3.0):
unix charset=cp1251
display charset=cp1251
dos charset=866
На этом руссификация носителей заканчивается.
Часть 2. Или кодировка CP1251 в менюшках.
Прежде, чем говорить о русских буквах, посмотрим на локаль системы:
echo $LANG
пишем через echo, т.к. locale отсутствует...
Thinstation послушно выведет ru_RU
Однако никакой спецификации кодировки почерпнуть отсюда не удётся: локали ru_RU могут быть ru_RU.KOI8R, ru_RU.CP1251, ru_RU.UTF8 ну и т.д.
А какая же у нас?
А это видно из скриптов в папке Thinstation-2.2/utils/build-maps, к которым мы и обратимся.
Мы имеем: create_all.sh, create_fonts.sh, create_gconv.sh, create_ica.sh, create_kmaps.sh, create_locales.sh, create_rdesktop.sh, create_x11.sh, названия всё так же говорящие.
Нам нужны: create_x11.sh, create_locales.sh, create_gconv.sh
Приступим:
Прежде всего сохраняем keymap-en_us и по желанию keymap-ru.
create_x11.sh
Из этого скрипта почерпнём, что X локаль собиралась для KOI8R. Нам же нужна CP1251, однако для X надо прописать microsoft-cp1251
А именно ищем и редактируем, чтобы получилось:
for filename in ru
do
cp -R -L $X_PATH/microsoft-cp1251 packages/keymaps-$filename/full/x-common/lib/X11/locale
done
create_locales.sh
Из этого скрипта почерпнём, что стандартная локаль ru_RU в кодировке iso8859-5, что нас не устраивает.
Ищем и редактируем, чтобы получилось:
for filename in mk_MK ru_RU
do
$TOOLS_PATH/localedef -i $LOCALE_PATH/localedata/locales/$filename -f $LOCALE_PATH/localedata/charmaps/CP1251 locale/$filename
done
create_gconv.sh
Почерпнём, что и тут iso8859-5.
Правим, чтобы было:
for filename in mk ru
do
mkdir packages/keymaps-$filename/full/base/lib/gconv
cp $GCONV_PATH/CP1251.so packages/keymaps-$filename/full/base/lib/gconv
cp ./gconv-modules packages/keymaps-$filename/full/base/lib/gconv
done
Обращаю внимание на: GCONV_PATH=$SOURCE_PATH/glibc-2.3.5-obj/iconvdata
По данному адресу никаких модулей нет, т.к. мы не собирали glibc-2.3.5, что нам и не надо, а надо лишь положить туда соответствующий модуль, взятый из thinstation_src-2.2\lib\gconv\
Замечательно, скрипты мы поправили, теперь надо сгенерировать новые keymaps.
Даём команду: ./create_all.sh
В процессе выполнения вывалится гигантское количество ругани (всё потому, что glibc-2.3.5 не собирали, и потому, что кое-какие шрифты отсутствуют), но при ближайшем рассмотрении они нашей локали не касаются.
Получили новые keymap, - чудесно. Теперь заходим в Thinstation-2.2\packages\keymaps-ru\full\base\lib\locale\
и видим, что папочка ru_RU пустая. Ай-яй-яй. Удаляем ёё, на ёё место вставляем папку ru_RU.CP1251, взятую из системы. В файле ru_locale записываем:
LC_ALL=ru_RU.CP1251 ; export LC_ALL
LANG=ru_RU.CP1251 ; export LANG
Поскольку я использую Citrix, то теперь для того, чтобы ICA правильно находила свою папку с локалью в дирректории Thinstation-2.2\packages\keymaps-ru\full\ica_wfc\share\locale\ должна быть папка ru_RU.CP1251, содержимое которой (pna.nls) можно взять из ранее сохранённой keymap-ru.
Ещё один полезный совет для Citrix-ойдов: чтобы в последствии не было проблем с настройкой Citrix ICA клиента, рекомендую установить Citrix ICA клиента в своей Linux системе, произвести все необходимые настройки (добавить сессии, настроить звук/перенаправление портов и т.д.), сохранить настройки (в дирректории $HOME/.ICAClient файлы appsrv.ini, wfclient.ini лежит то, что вы "наконфигили"), скачать linuxx86.tar.gz в котором заменить ВСЕ файлы appsrv.ini, wfclient.ini одноимёнными файлами из $HOME/.ICAClient. Ещё чуть чуть: в дальнейшем вы сможете рулить этими параметрами из конфигурационных файлов, скачиваемых с сервера с помощью параметра SESSION_#_type_specific, где type_specific - необходимый вам параметр из appsrv.ini и wfclient.ini.
Теперь удаляем keymap-en_US и вставляем ранее сохранённый.
На этом действия с системной локалью заканчиваются.
Можно подумать, что и всё, однако нет. Если теперь собрать образ, загрузиться, указав в конф файле на сервере русские заголовковки менюшек, то мы увидим лишь кракозяблы. Ответ на вопрос "Почему?" прост - не загружен нужный шрифт. Система XWindow расширяет для себя поняте системной локали, локаль XWindow хранится в отдельной папке и представляет собой 3 файла: Compose, XI18N_OBJS, XLC_LOCALE. Поэтому мы редактировали скрипт create_x11.sh, дабы включить нужную нам локаль в сборку.
Теперь же нам не хватает кирилических щрифтов. Их я взял из пакета kdb, коий я положил в Thinstation-2.2/packages/base/lib, предварительно вырезав из него всё, что не надо (остался только фонт UniCyr_8x16, таблицы acm, и *.to_uni_trans). И ещё кое-чего: а именно скрипта setsysfont (взятого мной из системы) который должен запускаться из rc.sysinit, иначе наш файлик Thinstation-2.2/packages/ect/sysconfig/i18n никакого действия производить не будет. В нём, кстати надо прописать:
LANG="ru_RU.CP1251"
SYSFONT="UniCyr_8x16"
SYSFONTACM="cp1251"
Так, скрипт есть, теперь его надо запускать каждый раз при загрузке системы. Обычно это делается из rc.sysinit, однако такого файла в Thinstation не наблюдается, его роль выполняет другой, прописаный в inittab. Я не стал там ничего менять, а просто добавил скрипт в Thinstation-2.2/packages/base/bin и симлинку на него в Thinstation-2.2/packages/base/etc/rc0.d, названную мной S11setsysfont.
Теперь можно собирать образ.Всё должно работать.
При написании данного материала было использовано очень много разного материала к размышлению, на который ушла не одна упаковка бумаги и не один месяц времени. В связи с чем список "литературы" будет выложен немного позже.