Пользователь
0,0
рейтинг
15 января 2013 в 16:47

Администрирование → Подмена DSDT через GRUB2 tutorial

Зачем все это надо? Причина в том, что мой нынешний ноутбук 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 еще раз. Если ошибок компиляции нет, то значит все прошло успешно.
Вадим Марков @BubaVV
карма
99,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (18)

  • +9
    По результатам чтения статьи возник интересный вопрос: как можно диагностировать проблемы с DSDT? Поделитесь ссылками на хорошие материалы по теме (в том числе исправление оной).
    Просто на ноутбуке есть похожая проблема (проблема с кнопками подсветки экрана, периодически падают иксы[если система неактивна], периодически иксы не соглашаются отражаться на экране после его угасания, редко система виснет наглухо) и если кнопки как-то прикрутить удалось (через setcpi), то остальные проблемы решить не удалось.
    Что интересно (и обидно) проблема появилась после какой-то версии обновления (я пользуюсь linuxmint), радость явно приплыла из ядра (и, возможно, из кривых ручек intel`а, с их драйверами я уже натыкался на косяки), поскольку с остальными дистрибутивами дела обстоят ровно так же.
    • 0
      Перекомпиляцию DSDT смотрел в гентушной вики: en.gentoo-wiki.com/wiki/ACPI/Fix_common_problems#Diagnosing_a_Buggy_DSDT. В одну руку компилятор, в другую ACPI reference и вперед. Ну и гуглить в процессе имена функций, в которых ошибки. Делал это давно, каких-то глобальных сложностей не припомню.
      • 0
        Gentoo'шникам проще. У них всегда конфиг ядра есть со всем необходимым для работы. Пересобирай, нехочу.
        • 0
          а что, где то нет?
          как правило всегда идет в пакете ядра.
          часто доступен в /proc
          • 0
            Ну я в Ubuntu даже не задумывался о сборке ядра. Но пришли времена 11.10 и выше… пришлось выбирать лучшее. Поставил Gentoo. Начала одно не работало, потом другое. Потихоньку нашёл всё, что нужно в ядре. Конфиг перетаскиваю от версии к версии. Сборка процесс не очень долгий. Вот Chromium, Firefox и gcc настоящий кошмар!
            • 0
              в ubuntu в пакете ядра (запишется в boot с именем версии ядра а ля «config-3.2.0-33-lowlatency»)
            • 0
              В ArchLinux вы можете необходимую часть системных пакетов ставить из бинарников, а часть пересобирать вручную при помощи ABS.
            • 0
              Кошмар — это Open Office. На старой машине перекомпилировался 7 часов. Сейчас лучше, но всё же =)

              .config для debian-ов идёт в соответствующем .deb и складывается в /boot.
    • 0
      Практически на любом форуме «хакинтошников» есть достаточно много информации по теме
      (покуда всякое железо учат «прикидываться» макинтошем как правило с помощью правки DSDT)
  • 0
    не относится ли это к этому багу? bugs.launchpad.net/ubuntu/+source/linux/+bug/578506
    с тех пор, как он появился, каждый раз приходится рещать проблему пересборкой ядра с патчем. Минус — каждое свежее ядро надо патчить. Плюс — проблема пропала в любых ее проявлениях.
    • 0
      Не, не похоже. ACPI работает, просто виснет наглухо через случайные промежутки времени — от 10 минут до 3 суток. Грешил на драйвер иксов, но он оказался не при чем
  • 0
    А можете показать свой «dmesg | grep -i acpi»? Я недавно тоже писал пост про свои приключения с DSDT. У меня как-то с грубом не срослось, хочется посмотреть как выглядит лог в случае успеха.
    • 0
      pastebin.com/VUNdEhk9
      Но вообще лажи всякой в логе много. Есть какие-то неизвестные мне ошибки DMAR и.т.д.
      • 0
        Про DMAR в том, что вы привели никаких ошибок нет, просто запись о том, что такая таблица загрузилась. Ошибка про конфликты, это скорее всего вот это: bugzilla.kernel.org/show_bug.cgi?id=44991. То, что отмечено «ACPI Error:» — это действительно какие-то ошибки в таблицах ACPI, может они в DSDT и iasl их не отловил, хотя, наверное, должен был. А может быть они в других таблицах, нужно попробовать их тоже пересобрать. Обычно код бывает только в DSDT и SSDT, а остальных только данные, но бывает всякое.
        • 0
          • 0
            Скорее всего просто выключено Vt-d (Intel Virtualization Technology) в биосе вот так себя некорректно ведет, вместо того, чтобы просто нормально сообщить об этом. В этом ничего страшного нет, если у вас не больше 4 GB памяти и вы не используете виртуалки.
            • 0
              Тут вообще интересно. Vt-d выключено в биосе, но оно не поддерживается процессором! И если его включить, то оно никак не детектится, потому что его нет. Виртуалки использую по необходимости, хоть и медленно. Памяти сейчас 2 Гб, пробовал поставить 4 — ни одна планка не подходит, комп вообще не стартует
  • +3
    Как увидел надпись DSDT, аж передернуло. Помню на Toshiba Sattelite P100-387 приходилось плясать с этим…
    Причем побочка была, карта Gforce на борту не врубала вентилятор… из-за чего перегрев и уход в down. И это еще хорошо, у некоторых и горело.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.