LINUX.ORG.RU

CRUX-3.5 и terminfo

 


0

1

Установил себе CRUX-3.5. Позарился на минималистичность и настраиваемость. Устанавливал на соседний раздел и вход был осуществлён под chroot. Первым делом установил midnight commander. Привычка. Их меняют только жулики, чтобы не попасться, или подражающие кому то. И вот тут первая засада:

ncurses

Покрутил мышкой и в командной строке mc, вместо работы колёсика стали выскакивать какие то непонятные коды. Начал копать. Методом научного тыка пальцем, виновника вроде бы нашёл, это некорректно скомпиленный ncurses, вернее скомпиленные им описания терминалов. Если тупо скопировать описания терминалов по адресу /usr/share/terminfo/x/* из Slackware-current в CRUX, проблема исчезает. Но это не есть решение, это костыль. В Arch’е содержимое этого каталога похоже как и в CRUX. Правда, я побайтно не сравнивал. Но в Arch’е всё работает по умолчанию, а в CRUX такая вот загогулина. Понял, что, что то не так в описании терминала, но что, пока не могу докопаться. Может кто знает, как решить эту проблему без костылей?


CRUX это прежде всего ванильный софт, поставляемый «as is».

https://crux.nu/ports/crux-3.5/core/ncurses/Pkgfile — минимум движений по сборке ncurses.

http://slackware.tsu.ru/slackware/slackware-current/source/l/ncurses/ncurses.... — а тут:

# Use various upstream/fixed/better terminfo files to update the terminfo
# database. Only *.terminfo files in $CWD/terminfo will be used.
export TERMINFO=$PKG/usr/share/terminfo
for tfile in $CWD/terminfo/*.terminfo ; do
  if [ -r $tfile ]; then
    progs/tic -v $tfile
  fi
done
unset TERMINFO

соответственно, аналогичные действия нужно проделать и в CRUX, при сборке уже своего ncurses. пишите свой Pkgfile. :)

Spoofing ★★★★★ ()
Ответ на: комментарий от Spoofing

Я попробовал содрать буилд с Slackware-current, не помогло.

Description: A System V Release 4.0 curses emulation library

URL: http://www.gnu.org/software/ncurses/ncurses.html

Maintainer: CRUX System Team, core-ports at crux dot nu

name=ncurses version=6.2 release=2 source=(http://ftpmirror.gnu.org/gnu/$name/$name-$version.tar.gz)

ncurses_configure() {

./configure --prefix=/usr                               \
	    --libdir=/usr/lib                           \
	    --mandir=/usr/man                           \
	    --enable-colorfgbg                          \
	    --enable-hard-tabs                          \
	    --enable-overwrite                          \
	    --enable-xmc-glitch                         \
	    --with-cxx-shared                           \
	    --with-ospeed=unsigned                      \
	    --with-termlib=tinfo                        \
	    --with-ticlib=tic                           \
	    --with-gpm                                  \
	    --with-shared                               \
	    --without-debug                             \
	    --without-normal                            \
	    --without-profile                           \
	    --enable-symlinks                           \
	    --enable-pc-files                           \
	    --with-pkg-config-libdir=/usr/lib/pkgconfig \
	    --without-ada                               \
	    --with-chtype=long                          \
	    --with-mmask-t=long                         \
	    --program-suffix=""                         \
	    --program-prefix=""                         \
	    $WIDEC 

}

build() {

cd $name-$version

ncurses_configure

make
make DESTDIR=$PKG install

make clean
WIDEC=--enable-widec

ncurses_configure

make
make DESTDIR=$PKG install

( cd $PKG/usr/include
  rm -rf ncurses
  mkdir ncurses
  mv *.h ncurses
  for file in ncurses/* ; do
    ln -sf $file .
  done
)

if [ ! -d $PKG/usr/include/ncursesw -a ! -L $PKG/usr/include/ncursesw ]; then
  ( cd $PKG/usr/include ; ln -sf ncurses ncursesw )
fi

mkdir -p $PKG/lib
( cd $PKG/usr/lib
  chmod 755 *.so
  chmod 644 *.a
  mv libncurses.so.6* $PKG/lib
  mv libncursesw.so.6* $PKG/lib
  mv libtinfo.so.6* $PKG/lib
  rm -f libtinfo.so.6
  ln -sf ../../lib/libtinfo.so.6 .
)    

export TERMINFO=$PKG/usr/share/terminfo
for tfile in $SRC/terminfo/*.terminfo ; do
  if [ -r $tfile ]; then
    progs/tic -v $tfile
  fi
done
unset TERMINFO

}

cdrw ()
Ответ на: комментарий от cdrw

Ладно, расскажу как устанавливал. Может там ошибка. Есть свободный раздел, sda5, отформатирован ext4. Хост система - Slackware64-current. Под root’ом создал рабочий каталог: mkdir -p /work Затем в него перешёл: cd /work Скачал образ дистрибутива: wget -c https://crux.ninja/updated-iso/crux-3.5-updated.iso Для того, чтобы получить доступ к пакетам находящимся в iso-образе, создал специальный для этого каталог /crux и примонтировал образ в него. mkdir -p /work/crux mount -o loop,ro crux-3.5-updated.iso /work/crux Инсталляционный iso-образ дистрибутива CRUX содержит статистически скомпилированную утилиту pkgadd. Поэтому её можно использовать для установки системы CRUX из пакетов включенных в ISO, из другого дистрибутива. Поэтому, для установки пакетов с помощью хост-системы распаковал её в рабочий каталог Slackware /work и присвоил аттрибут исполняемости. tar xvf /work/crux/crux/core/pkgutils*.tar* usr/bin/pkgadd -O > ./pkgadd chmod a+rx ./pkgadd Затем создал каталог для монтирования раздела, куда собрался устанавливать CRUX. mkdir -p /mnt/crux Примонтировал его: mount /dev/sda5 /mnt/crux/ Теперь раздел для установки на него дистрибутива выглядит как /mnt/crux, а каталог с пакетами для установки - /work/crux. Создал каталог и в нём пустой файл для базы данных установленных пакетов на разделе для установки. Этот файл необходим для работы утилиты pkgadd. mkdir -p /mnt/crux/var/lib/pkg touch /mnt/crux/var/lib/pkg/db Установил все пакеты системы CRUX, из всех каталогов пооочередно: for pkg in /work/crux/crux/core/*; do echo "installing $pkg" && ./pkgadd -r /mnt/crux/ $pkg; done for pkg in /work/crux/crux/opt/*; do echo "installing $pkg" && ./pkgadd -r /mnt/crux/ $pkg; done for pkg in /work/crux/crux/xorg/*; do echo "installing $pkg" && ./pkgadd -r /mnt/crux/ $pkg; done Прописал версию дистрибутива для того, чтобы grub главной системы не принимал CRUX за «неизвестный linux». cat > /mnt/crux/etc/lsb-release << EOF DISTRIB_ID=CRUX DISTRIB_RELEASE=3.5 DISTRIB_CODENAME=posix DISTRIB_DESCRIPTION="Crux 3.5 LTS" EOF Повтор из-за идиотского форматирования… cat > /mnt/crux/etc/lsb-release << EOF DISTRIB_ID=CRUX DISTRIB_RELEASE=3.5 DISTRIB_CODENAME=posix DISTRIB_DESCRIPTION=«Crux 3.5 LTS» EOF Создал файл fstab, чтобы при загрузке система не зависла. cat > /mnt/crux/etc/fstab << EOF /dev/sda6 swap swap defaults 0 0 /dev/sda5 / ext4 defaults 1 1 devpts /dev/pts devpts gid=5,mode=620 0 0 proc /proc proc defaults 0 0 tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0 tmpfs /tmp tmpfs defaults,size=2G,mode=1777 0 0 EOF Настроил файл /etc/rc.conf: cat > /mnt/crux/etc/rc.conf << EOF

/etc/rc.conf: system configuration

FONT=LatArCyrHeb-16 KEYMAP=ruwin_ct_sh-UTF-8.map TIMEZONE=Europe/Vilnius HOSTNAME=cdrw SYSLOG=sysklogd SERVICES=(lo net crond)

End of file

EOF Скрипт chroot: #!/bin/bash

Пример: sh chroot.sh /mnt/crux/

if [ «$UID» != «0» ]; then echo «Для смены корня нужны права root!» exit 1 fi

CRUX=$1

if [ -z $1 ]; then echo «Укажите каталог для смены корня!» exit 1 fi

if [ ! -d $CRUX ]; then echo «Каталог ‘$CRUX’ не существует!» exit 1 fi

pushd $CRUX

mount -v –bind /dev $CRUX/dev mount -vt devpts devpts $CRUX/dev/pts -o gid=5,mode=620 mount -vt proc proc $CRUX/proc mount -vt sysfs sysfs $CRUX/sys mount -vt tmpfs tmpfs $CRUX/run

if [ -h $CRUX/dev/shm ]; then mkdir -pv $CRUX/$(readlink $CRUX/dev/shm) fi

if [ -e /etc/resolv.conf ]; then cp -L /etc/resolv.conf $CRUX/etc/ fi

chroot «$CRUX» /usr/bin/env -i
HOME=/root
TERM=«$TERM»
PS1=’(crux chroot) \u:\w$ ’
PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash –login

popd echo chroot exited

echo «Отмонтирование виртуальных файловых систем» umount -v $CRUX/dev/pts umount -v $CRUX/dev umount -v $CRUX/run umount -v $CRUX/proc umount -v $CRUX/sys

exit $?

Вход в chroot:

sh chroot.sh /mnt/crux/

Генерация русской локали: localedef -i ru_RU -f UTF-8 ru_RU.utf8 Опускаю мелочи… cd /usr/ports/opt/mc pkgmk -d pkgadd mc#4.8.*.tar.gz

И вот тут началось…

cdrw ()
Ответ на: комментарий от cdrw

Проблема разрешилась не просто, а очень просто. Пересобирать пакет ncurses смысла нет. Легче скомпилировать рабочий файл описания терминала. В Slackware выше описанной проблемы с колёсиком мышки нет, всё работает превосходно. Поэтому, в слакварном окне консоли, чтобы просмотреть исходный текст рабочего описания, за одно узнать название описания терминала, дал команду:

infocmp

Последовал выхлоп команды:

Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm-256color

xterm-256color|xterm with 256 colors, …

Название я узнал, теперь нужно сохранить вывод команды в текстовый файл:

infocmp > xterm-256color.src

Такой же трюк провернул под chroot’ом в CRUX’е, названия оказались идентичными, но исходники даже на беглый вгляд - нет.

Вот этот файлик я и перенёс из Slackware в каталог /root установленного CRUX’а. Затем дал под chroot’ом уже в CRUX’е команду:

tic -v xterm-256color.src

Компилятор скомпилил файлик и автоматом заменил негодный. Всё, проблема с колёсиком мышки исчезла. Правда я ещё не пробовал загрузиться обычным образом после изменений. Если неудача, хотя я так не думаю, - сообщу.

cdrw ()
Последнее исправление: cdrw (всего исправлений: 1)