Pull to refresh

Подмена DSDT через GRUB2

Reading time 3 min
Views 17K
Зачем все это надо? Причина в том, что мой нынешний ноутбук Gigabyte Q1105M нестабильно работает под Линуксом. Проблема явно где-то на уровне БИОСа и проявляется в спонтанных зависаниях наглухо. В среднем раз в несколько часов. И это точно не перегрев и не сбой драйверов. Лечится только отключением одного из ядер в БИОСе, что по понятным причинам не годится. Полным перебором всех источников проблемы уткнулся в конце концов в кривой DSDT, что весьма типично для производителей ноутбуков второго эшелона. Кстати по конкретной модели ноутбука такого рода информации в интернете вообще нет. Если вкратце, то DSDT — это некий кусочек БИОСа, который отвечает за работу специфичных для данного ноута или материнки функций типа управления подсветкой или кулерами и часто бывает глючным и/или ориентированным для работы с Windows. Лайт-способы типа маскировки под Win7 при загрузке не прокатили, так что пришлось править. Исправление багов в DSDT особых проблем не вызвало, благо информации на эту тему навалом и в этом посте касаться этого не буду. А вот подсунуть таблицу ядру оказалось неожиданно сложно. Используемая система — Arch Linux, соответственно ориентировался на их мануалы. Есть три пути всунуть ядру подменное DSDT:
  1. initrd
  2. Вкомпилировать в ядро
  3. Через загрузчик — способ новый и мало где описанный

Первый способ не поддерживается чуть ли не со времен ядер 2.4, так что не годится. Второй реален, но к стыду своему автор не осилил перекомпиляцию ядра с измененным конфигом. Если есть желание, то надо копать в сторону получения диффа для .config с подключенным DSDT и прописыванием его в PKGBUILD. Будет желание — расскажу подробнее. Способ дико громоздкий и неудобный и требует времени на перекомпиляцию ядра после каждого обновления системы. Третий способ самый новый и удобный, но почему-то не описан в Arch Wiki. Для него требуется поставить и слегка настроить GRUB2. Ставится по мануалу без единой проблемы, конфиг GRUB-legacy подхватывается автоматически. Перезагружаемся, проверяем — все должно работать. GRUB2 настраивается довольно диким способом через каталог /etc/grub.d. Там надо создать конфиг для подключения DSDT:

/etc/grub.d/01_acpi
#! /bin/sh -e

# Uncomment to load custom ACPI table
GRUB_CUSTOM_ACPI="/boot/dsdt.aml"

# DON'T MODIFY ANYTHING BELOW THIS LINE!

libdir=/usr/share

. ${libdir}/grub/grub-mkconfig_lib

# Load custom ACPI table
if [ x${GRUB_CUSTOM_ACPI} != x ] && [ -f ${GRUB_CUSTOM_ACPI} ] \
        && is_path_readable_by_grub ${GRUB_CUSTOM_ACPI}; then
    echo "Found custom ACPI table: ${GRUB_CUSTOM_ACPI}" >&2
    prepare_grub_to_access_device `${grub_probe} --target=device ${GRUB_CUSTOM_ACPI}` | sed -e "s/^/  /"
    cat << EOF
acpi (\$root)`make_system_path_relative_to_its_root ${GRUB_CUSTOM_ACPI}`
EOF
fi


И после этого
# chmod a+x /etc/grub.d/01_acpi
Критичные места:
  • Путь к DSDT. Логично сунуть ее в /boot, поближе к загрузчику. Если название не совпадает — то исправить.
  • Переменная $LIBDIR и путь к какой-то библиотеке. Она зависит от системы, надо проверить лежит ли файл там где указано.

На этом с конфигом вроде бы все. После этого запускаем
# grub-mkconfig -o /boot/grub/grub.cfg
Будет несколько строк с описанием прогресса, там должно написать про успешно найденную таблицу:
Found custom ACPI table: /boot/dsdt.aml
Если нет — значит где-то ошибка. После перезагрузки все должно работать нормально. Как проверить? Самый тупой способ — попробовать перекомпилировать активную DSDT еще раз. Если ошибок компиляции нет, то значит все прошло успешно.
Tags:
Hubs:
+31
Comments 18
Comments Comments 18

Articles