Gentoo проблемы и решения

Материал из Belgorod Linux User Group - Белгород

Перейти к: навигация, поиск

Дистрибутиво-зависимые проблемы с которыми сталкнулись, проблемы с пакетным менеджером. База знаний.

Содержание

PYTHON

Пропал python

При обновлении python старой системы, emerge решил обновить с 2.4 до 3.1, но не смог.

Emerge в результате снес старый python и ни оставил не одного.

Что можно сделать:

  • На другой машине, где есть python (допустим 2.5) делаем:
quickpkg =python-2.5.2-r7

В результате получаем бинарный пакет уже собранного python.

  • Переносим его на целевую систему и разворачиваем там:
tar -xjf /usr/portage/packages/All/python-2.5.2-r7.tbz2 -C /
  • Теперь ставим обязательно python 2.6 там же:
emerge -pv =python-2.6*


  • Выбираем его:
eselect python list
Available python interpreters:
 [1]   python2.4
 [2]   python2.5
 [3]   python2.6 
eselect python 3

тут предварительно возможно понадобится обновить portage

emerge portage

Обновление python

Обновление с 2.4/2.5 до 2.6/3.1

Уже доступен 3.1, но его пока нельзя использовать, так говорит сам emerge. По этому ставим 2.6:

emerge -pv python
emerge -1 dev-lang/python:2.6
eselect python list
eselect python set <2.6>
eselect profile list
eselect profile set 1
emerge -1 portage
python-updater -i 
emerge -C dev-lang/python:2.4
emerge -C dev-lang/python:2.5

А теперь можно и 3.1

emerge -1 python

пока без выбора его eselect -ом

Python не хочет ставиться

EAPI

Невозможно обновить portage и / или python:

emerge -pv portage

These are the packages that would be merged, in order:

Calculating dependencies /
!!! All ebuilds that could satisfy ">=dev-lang/python-2.5" have been masked.
!!! One of the following masked packages is required to complete your request:
- dev-lang/python-2.6.4 (masked by: required EAPI -2, supported EAPI 0)
- dev-lang/python-3.1.1-r1 (masked by: required EAPI -2, supported EAPI 0)
- dev-lang/python-2.5.4-r4 (masked by: required EAPI -1, supported EAPI 0)
- dev-lang/python-2.5.4-r3 (masked by: required EAPI -1, supported EAPI 0)

Причина:

Старый API у старого portage. Надо его обновить. Но чтобы обновить - он тянет питон, который требует уже новый API.

Решение:

Ставим новый portage без зависимости:

emerge -1 --nodeps portage

А далее идем к пункту "Обновление python"

Perl

обновление

После обновления perl мажорной версии к примеру 5.8 на 5.10 - не запускаются к-л приложения, выдавая сообщения о том, что не найден нужный модуль, к примеру:

Can't locate XML/Stream.pm in @INC

Пересобрать модули командой:

perl-cleaner --modules

GCC

sandbox

Пишет:

cannot run C compiled programs

Не помогает даже:

FEATURES=-sandbox emerge sandbox

Возможно не включена эмуляция IA32:

http://www.gentoo.org/doc/en/gentoo-amd64-faq.xml#kernel
Executable file formats / Emulations  --->
 [*] IA32 Emulation

Если ничего не помогло, то на любой машине с таким же target собрать бинарный пакет:

emerge -b sandbox

и на целевой "распаковать"

emerge -k sandbox

gcc-config

gcc-config -l

дает:

/usr/bin/gcc-config: line 9: /etc/init.d/functions.sh: Нет такого файла или каталога

Необходимо обновить openrc:

emerge -C sysvinit
emerge -1 openrc
dispatch-conf


distcc

gcc иногда не может собраться с distcc. Тогда его надо обновить отдельно и перезапустить distcc

FEATURES="-distcc" emerge -1 gcc
gcc-config -l
source /etc/profile
/etc/init.d/distccd restart

Кроме gcc может еще не собираться glibc, так что всю систему надежнее обновлять без distcc, а затем весь мир:

FEATURES="-distcc" emerge -vuDN system
emerge -vuDN world

NFS

v3

mount дает:

mount.nfs: an incorrect mount option was specified

dmesg:

NFS: bad mount option value specified: vers=4

Надо добавить vers=3 в опции монтирования, в fstab это будет так:

portage.gentoo.ivt.lan:/usr/portage     /usr/portage    nfs     rw,vers=3              0 0

udev

udev >= 150

После обновления udev до 150 пропал /dev/hda, невозможно подмонтировать диск и следовательно обновить ядро.

Откатываемся до старого udev:

emerge =udev-145-r3

Перезагружаемся. Со старым udev диск должен появиться.

В ядре убираем флаги CONFIG_SYSFS_DEPRECATED так:

 # CONFIG_SYSFS_DEPRECATED is not set
 # CONFIG_SYSFS_DEPRECATED_V2 is not set

Пересобираем ядро. Обновляем udev обратно. Перезагружаемся.

udev >= 181

/usr вынесен на LVM:

Решается через initrd, проверьте что в ядре выставлен этот флаг:

cat /usr/src/linux/.config  | grep INITR
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""

Теперь нужно создать initramfs, к примеру так:

emerge genkernel 
genkernel --lvm ramdisk
cd /boot
ln -sf initramfs-genkernel-x86_64-3.3.0-gentoo initramfs

Затем указать загрузчику использовать его:

vim /boot/grub/menu.lst
kernel /boot/vmlinuz root=/dev/sda1 dolvm
initrd /boot/initramfs

Далее в fstab обязательно прописать пути к lvm разделам через /dev/mapper (а то так не видит их скрипт initramfs-а)

/dev/mapper/vg-home             /home           reiserfs        noatime         0 1
/dev/mapper/vg-usr              /usr reiserfs        noatime 0 1 
/dev/mapper/vg-var              /var            reiserfs        noatime         0 1

Да, и еще желательно обновить udev-init-scripts

openrc

Висит

* Caching service dependencies ...

намертво и ничего не происходит.

Диагностика:

/lib/rc/sh/gendepends.sh

Будет генерировать все зависимости по алфавиту на экран для /etc/init.d/, по этому смотрим до чего он доходит и зависает, а потом смотрим что следует после этого сервиса в алфавитном порядке:

ls -la /etc/init.d/

Ищем причину в том сервисе, до которого он не дошел (не показал зависимости). Возможно циклическая зависимость или еще что. Если сервис не нужен - можно сделать ему

chmod -x

Прочее

Не забываем делать после обновления

revdev-rebuild
dispatch-conf
Личные инструменты