Преамбула
Прошу не начинать обсуждения не по теме вроде "какая ваша Fedora гадость, в
нормальных дистрибутивах проблем никаких" (в Fedora просто в силу прогресса
сломали раньше, дойдет и до остальных, например, в свежем Debian уже
случилось), "какой ваш GNOME гадость" (проблемы не специфичны для гномовского
десктопа, всякие rhythmbox и другой софт, использующий clutter сломан точно
также), "какие бинарные драйверы гадость" (с открытыми драйверами на многих
карточках безумно шумит кулер, пока не исправлена вот эта ошибка, а еще
проблемы с 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_kernel-patch.doc
Накладываем патч и собираем 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. Я также опубликовал английский вариант на fedoraforum - это не совсем
точный перевод русского текста, просто написав инструкцию на-английском, решил
сделать и русский вариант, заодно упростил некоторые вещи, так как полагаю, что
тут аудитория более подготовленная, чем на fedoraforum.
PPS. Ошибка в Clutter, из-за которой приходится прописывать переменные
окружения можно отслеживать на данной странице.
|