Архив метки: arch linux

linux: русский в консоли archlinux

Возникла проблема со шрифтами в виртуальной консоли. Квадратики вместо кириллицы. В графическом эмуляторе терминала, разумеется, всё нормально, а в /dev/ttyX беда. Выяснилось, что всё портит systemd, сначала загружая шрифты и настраивая их согласно vconsole.conf как и положено, а потом подгружая drm-модуль видеокарты, который создаёт новый фреймбуфер (например, у меня /dev/fb0), в котором уже никаких настроек не делается.

Считаю, что это косяк. Когда-нибудь это должны поправить, вероятно. Это давно было уже, до сих пор актуально, сначала долго копался, потом появилось несколько материалов в сети. Примерный механизм описан здесь. Основная тема на archlinux.org.ru здесь.

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

MODULES="i915"

(нужно подставить свой модуль: i915, nouveau, radeon итд) в /etc/mkinitcpio.conf
и перегенерацией initramfs:

mkinitcpio -p linux

Проверить в этом ли дело можно руками поставив нужный шрифт (они лежат в /usr/share/kbd/consolefonts/):

setfont cyr-sun16[.psfu.gz]

Автор: Дмитрий

archlinux перевод на systemd

Как известно, archlinux к данному моменту почти полностью перешёл на systemd. Старый механизм sysvinit/initscripts тоже почти полноценно пока поддерживается через костыли. Чтобы вату не катать, я тоже стал переходить. В данный момент переход довольно подробно описан на арчвики, но на момент накидывания черновика этой заметки всё только начиналось, к тому же у меня чуть более сложный случай, т.к. стояло несколько специфических сервисов итд. Чтобы сразу всё не сломалось (а оно может даже если ничего не трогать), переходить решил постепенно, в принципе, на арчвики так же рекомендовано сейчас.

Смешанная установка systemd+sysvinit+initscripts

Сам systemd уже должен стоять по-любому, но если отдельно не настраивалось, то грузится пока старый init. Попробуем прописать init=/bin/systemd в параметры ядра. Очевидные вещи разжёвывать не нужно, если grub2, то в /etc/default/grub прописываем в GRUB_CMDLINE_LINUX_DEFAULT="init=/bin/systemd" , и далее grub-mkconfig, как положено.
Из /etc/rc.conf надо убрать лишние демоны. Самое простое: после перезагрузки надо изучить что поднялось (cups, sshd итд), и это убрать из DAEMONS в /etc/rc.conf . По идее, все стандартные службы должны уже иметь systemd-unit и корректно подняться. У меня остались в DAEMONS network, а также мои специфические activemq и т.д.
Это и ниже всё нужно будет включить руками через systemctl enable, читать справку по systemd в той же арчвики по ссылке выше.

Если согласно предыдущим рекомендациям (с archlinux.org или при апдейтах) журналирование меняли, то не забыть изменить в /etc/syslog-ng/syslog-ng.conf на systemd-шный.

source src {
...
unix-dgram("/run/systemd/journal/syslog");
#unix-dgram("/dev/log");
...
};

Ещё у меня был netfs, теперь он не нужен, всё работает искаропки. Но надо только включить не забыть (как и раньше) rpcbind, для него тоже есть нативный юнит.

# systemctl enable rpcbind

Также надо не забыть заенаблить нужный dm для графического входа (у меня lxdm).

Перезагружаемся и (скорее всего) радуемся.

Смешанная установка systemd+initscripts

Это вариант предыдущего этапа, но фиксируем systemd как init по дефолту. Ставим systemd-sysvcompat, оно заменяет sysvinit и прописывает линки init на systemd и прочие sysvinit бинарники на systemctl. Так что init= из grub убираем. Перегружаемся.

После проверки и написания недостающих юнитов, когда rc.conf опустел можно приступить к следующему этапу. На что, возможно, придётся до этого обратить внимание:

Сеть

Если было настроено как служба network (а не через NetworkManager или другие механизмы), то оно почти как служба осталась, но с нюансами. Итак, из rc.conf надо убрать настройку сети и загрузку демона network, а сеть включить нативно как-то так (если через dhcp, например):

systemctl enable dhcpcd@eth0

Если нужно грузить модуль ядра для сети и т.д., см. ссылку на арчвики выше.

Группы юзера

Нужно не забыть выкинуть всех локальных юзеров из дополнительных групп (audio, lock, scan итд итп) кроме wheel пожалуй только, это всё тоже написано в инструкции к арчвики. Походу, проблемы иначе действительно возникают.

Чистая установка systemd

Это такой окончательный этап на арчвики, но на самом деле отличается от предыдущего только тем, что не стартует костыль который запускает все инитскриптовские скрипты (которые называются у этого костыля легаси-юниты) и вообще как-либо парсит rc.conf. Ну и удаляем initscripts, раз он не нужен больше. Удаляются также и rc.conf, rc.local, rc.local.shutdown.

Автор: Дмитрий

linux: почему же ELF interpreter в Arch Linux 64 линкуется в /lib

Как-то однажды я собрал программу в своём 64-битном Arch Linux и отдал бинарник, а оно берёт и не работает. Пишет:

/lib/ld-linux-x86-64.so.2: bad ELF interpreter: Нет такого файла или каталога

Ну, долго тут думать не пришлось — оказался странным путь для ld-linux-x86-64. Я не понял как оно должно быть по LSB, но во всех тестируемых системах ld-linux-x86-64.so.2 ищется в /lib64.
Fedora 17:

$ whereis ld-linux-x86-64.so.2
ld-linux-x86-64.so: /lib64/ld-linux-x86-64.so.2 /usr/lib64/ld-linux-x86-64.so.2

Arch Linux:

$  whereis ld-linux-x86-64.so.2
ld-linux-x86-64.so: /lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2

В генту lib это ссылка на lib64.
Причём, в арче в lib64 кроме двух ссылок на соответствующие файлы в lib больше ничего нет:

$ ls /lib64
ld-2.15.so  ld-linux-x86-64.so.2


Короче, как ясно, интерпретатор находится и в lib и в lib64. То есть будет работать и так и так. Но при линковке на моей машине у меня связывается напрямую в lib, так что нигде больше не работает:

$ ldd ./myprogram
...
 /lib/ld-linux-x86-64.so.2 (0x00007f4b4ea70000)
...

Это печально, ну а что делать. Решил проблему временно с помощью patchelf:

patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 ./myprogram

Всё стало прекрасно. На этот счёт девелопер (?) сказал:

Historically, we were a pure 64-bit distro (multilib is a more recent thing), so the distinction of /lib v. /lib64 didn’t make sense for us.

Автор: Дмитрий