++ Преамбула
Прошу не начинать обсуждения не по теме вроде "какая ваша Fedora гадость, в нормальных дистрибутивах проблем никаких" (в Fedora просто в силу прогресса сломали раньше, дойдет и до остальных, например, в свежем Debian уже случилось), "какой ваш GNOME гадость" (проблемы не специфичны для гномовского десктопа, всякие rhythmbox и другой софт, использующий clutter сломан точно также), "какие бинарные драйверы гадость" (с открытыми драйверами на многих карточках безумно шумит кулер, пока не исправлена [[https://bugs.freedesktop.org/show_bug.cgi?id=73338 вот эта ошибка]], а еще проблемы с suspend и прочее) или так далее. А вот предложения, как сделать эти инструкции более надежными приветствуются.++ Задача
Итак, есть свежая Fedora 21, 64-х битная система с карточкой AMD, нужно заставить работать Catalyst, чтобы не сломался gdm или программы, собранные с clutter, в том числе GNOME. В rpmfusion каталиста нет, советы в интернете предлагают идти на какие-то жертвы типа "снести GNOME", "выключить gdm" (лично у меня с lightdm не работает блокировка экрана), "ставить левые пакеты clutter/gnome-shell/etc после каждого обновления, пересобираемые каким-то сомнительным товарищем и выкладываемые на что-то типа mediafire без подписи" и так далее. Это не наш путь, нужно, чтобы работало все как есть и цивилизованно: пакеты в rpm'ках, не сломанная функциональность и прочее. Это достижимо (ну, почти). Инструкция проверена на последних версиях пакетов на данный момент (Catalyst 14.12, ядро 3.17.7 gnome-shell 3.14.3, gdm 3.14.1, clutter 1.20.0)
++ Инструкция
Загружаем AMD Catalyst - amd-catalyst-omega-14.12-linux-run-installers.zip. Распаковываем, переходим в fglrx-14.501.1003. Качаем патч, чтобы собрать с ядром 3.17:
wget https://bluehatrecord.files.wordpress.com/2014/11/3-17_kerne...
Накладываем патч и собираем rpm пакет. Федоры в списке нет, зато есть RHEL7, который почти F19, которая почти F21 - в общем, то, что надо!
sh amd-driver-installer-14.501.1003-x86.x86_64.run --extract
cd fglrx-install.*
patch -p0 < ../3-17_kernel-patch.doc
./ati-installer.sh '14.501' --buildpkg RedHat/RHEL7_64a
Ставим пакет и создаем файл конфигурации Xorg.
sudo rpm -i ../fglrx64_p_i_c-14.501.1003-1.x86_64.rpm
aticonfig --initial
Выключаем драйвер radeon и kernel modesetting.
Правим /etc/sysconfig/grub, в строку GRUB_CMDLINE_LINUX= добавляем
radeon.modeset=0 rd.driver.blacklist=radeon nomodeset
к тому, что там уже есть; пересоздаем конфиг grub командой
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
на современной системе с UEFI, или же
grub2-mkconfig -o /boot/grub2/grub.cfg
на системой со старым BIOS или на UEFI-системе в legacy-режиме
Чиним ошибку в clutter. Создаем файл /etc/X11/xinit/xinitrc.d/cogl-setup.sh по такой инструкции:
sudo sh -c "cat > /etc/X11/xinit/xinitrc.d/cogl-setup.sh" << EOF
export COGL_DRIVER=gl
export COGL_OVERRIDE_GL_VERSION=1.4
export COGL_RENDERER=GLX
export LD_PRELOAD=/usr/lib64/fglrx/fglrx-libGL.so.1.2
EOF
sudo chmod +x /etc/X11/xinit/xinitrc.d/cogl-setup.sh
Чиним проверку версии X'ов в драйвере при использовании gdm. Аккуратнее - точно выполняйте эти команды, нельзя их менять, если что-то в них непонятно - а то не сработает, либо вообще повредите бинарник и придется переставлять fglrx:
sudo -i
Xorg -version > /amd_xversion 2>&1
cd /usr/lib64/xorg/modules/drivers/
offset=`strings -td fglrx_drv.so | grep '/proc/%i/fd/0' | sed 's/^ *//' | cut -d' ' -f1`
echo -ne '/amd_xversion' | dd conv=notrunc of=fglrx_drv.so bs=1 count=13 seek=$offset
cd ../extensions
offsetext=`strings -td libglx.so | grep '/proc/%i/fd/0' | sed 's/^ *//' | cut -d' ' -f1`
echo -ne '/amd_xversion' | dd conv=notrunc of=libglx.so bs=1 count=13 seek=$offsetext
exit
Здесь на диске меняются два бинарника, если переставить rpm'ку fglrx, это придется делать заново. В процессе будет создан файл /amd_xversion, не удаляйте его! Оттуда драйвер будет считывать версию иксов.
Чиним запускаемый специальным образом gnome-shell, который выполняет gdm (да, он сейчас не сам по себе, фон и верхнюю панель рисует именно gnome-shell). Правим /usr/share/gdm/greeter/applications/gnome-shell.desktop и меняем строку
Exec=gnome-shell --mode=gdm" на "Exec=env COGL_DRIVER=gl COGL_OVERRIDE_GL_VERSION=1.4 COGL_RENDERER=GLX LD_PRELOAD=/usr/lib64/fglrx/fglrx-libGL.so.1.2 gnome-shell --mode=gdm
Это самое несовершенное изменение - если обновить gdm, это придется делать заново, так как rpm перетрет файл. Я не знаю, как это сделать более нормально - патчить при загрузке изврат, вроде теоретически можно создать свою копию gnome-shell.desktop и копию /usr/share/gnome-session/sessions/gdm-shell.session, в котором прописать вместо gnome-shell свою версию, а потом поправить dconf'ом файлик /usr/share/gdm/greeter-dconf-defaults, чтобы gdm использовал системную сессию, отличную от gdm-shell.session. Но, подозреваю, rpm это тоже переписывает. []В общем, если кто-то знает, как сделать аналог этого изменения, чтобы нормально обновлялся gdm и ничего не ломалось - сообщите![]
PS. Я также опубликовал английский вариант на [[http://forums.fedoraforum.org/showpost.php?p=1719887&postcou... fedoraforum]] - это не совсем точный перевод русского текста, просто написав инструкцию на-английском, решил сделать и русский вариант, заодно упростил некоторые вещи, так как полагаю, что тут аудитория более подготовленная, чем на fedoraforum.
PPS. Ошибка в Clutter, из-за которой приходится прописывать переменные окружения можно отслеживать на [[https://bugzilla.redhat.com/show_bug.cgi?id=1054435 данной странице]].
URL:
Обсуждается: http://www.opennet.dev/tips/info/2876.shtml