вторник, 30 августа 2011 г.

Asus P52F-380M и Debian

Недавно я обзавёлся новой игрушкой — Asus P52F-380M. В общем и целом ноут хороший, но некоторые моменты вызывают раздражение. Например, клавиатура немного прогибается (в прямом смысле слова), но когда привыкаешь и начинаешь набирать, не глядя (я, к стыду своему, всё ещё не обучился слепому набору), этот недостаток перестаёт волновать. Гораздо больше раздражает идиотское расположение стрелочек:


То есть кнопка «вправо» находится в области, занимаемой numpad'ом, что, поверьте мне, очень неудобно (в основном из-за огромного RgtCtrl, который я постоянно нажимаю вместо стрелочки влево). Даже на EeePC сделали лучше:


Думаю, теперь я таки перейду на hjkl в vim'е ☺

В остальном дизайн и сборка, к счастью, претензий не вызывают, так что перейдём наконец к теме поста — установке и последующей настройке моего любимого Debian.

Замечу, что в данном ноутбуке используется процессор Intel Core i3, а значит, лучше всего использовать Debian, собранный под amd64. Надеюсь, читатели этого блога в состоянии сами установить систему (если нет — замечательная инструкция virens'а вам в помощь).

Сначала я попытался поставить Squeeze, но после установки наткнулся на неприятный баг: внешние колонки ноутбука продолжают играть даже когда воткнуты наушники. Мириться с этим никак нельзя, тем более что в LiveCD Ubuntu 10.10, оказавшемся под рукой, всё работало. Признаюсь, я не стал долго ковыряться и просто поставил Wheezy, в котором, к счастью, всё работало из коробки.

Впрочем, даже в Wheezy с ходу не заработали некоторые вещи, в частности:
  • веб-камера выдавала перевёрнутое изображение;
  • wicd-curses не видел мою Wi-Fi-точку;
  • из Fn-клавиш работали только три: Fn+F5/Fn+F6, регулирующие яркость монитора, и Fn+F7, которая монитор выключала;
  • pm-suspend и pm-hibernate вроде как работали, но не выключали машину;
  • противно пищал PC speaker (он не настоящий, конечно же, просто эмуляция).
Карт-ридер я на работоспособность не проверял из-за отсутствия подходящих карточек, но наличие в выводе lspci SD Bridge внушает надежду.

Ну-с, проблемы перечислены — вперёд, на барикады! ☺

К счастью, для камеры и suspend'а решения приведены в Linux Laptop Wiki. Для полноты поста я размещу здесь вольный пересказ этих рецептов.

Веб-камера

Починить это раз и навсегда (слегка поправив какой-нибудь конфиг), к сожалению, не получится. Единственный выход — все приложения, использующие веб-камеру, запускать с библиотекой v4l1compat.so. Для начала ставим соответствующий пакетик:
$ sudo aptitude install libv4l-0
После этого все приложения, использующие веб-камеру, следует запускать следующим образом (на примере MPlayer'а):
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so mplayer tv://
Для удобства можно создать алиас — библиотека не нарушает работоспособность программы, так что можно подгружать её даже в тех случаях, когда веб-камера вам не нужна.

Suspend и hibernate

Как гласит Linux Laptop Wiki, питание не выключается из-за неотключенных USB-устройств. Чинится всё написанием скриптов, которые перед засыпанием отключают устройства, а потом подключают обратно, но тут всплывает неприятный баг: машинка успешно засыпает и просыпается, но в точках монтирования флешек становится пусто. Почему так и как это исправить, я ещё не понял. Stay tuned.

В общем, сделать нужно следующее:
  1. ставим любимый пакетик для suspend/hibernate. Я пользуюсь pm-utils:
    $ sudo aptitude install pm-utils
  2. создаём конфиг с модулями, которые нужно выгружать перед suspend'ом:
    $ sudoedit /etc/pm/config.d/modules
    и пихаем в него вот что:
    SUSPEND_MODULES="usb_storage mac80211 cfg80211 btusb bluetooth ahci libahci sdhci_pci sdhci led_class ath9k ath9k_common ath rfcomm sco bnep l2cap asus_laptop ehci_hcd"
    Не забываем разрешить утилитам читать его:
    $ sudo chmod a+r /etc/pm/config/d/modules
  3. создаём скриптик, который будет отключать и подключать устройства:
    $ sudoedit /etc/pm/sleep.d/10_unbindusb
    и помещаем в него следующее:
    #!/bin/bash
    function unbind_usb {
        for driver in ehci ohci uhci; do
            cd "/sys/bus/pci/drivers/${driver}_hcd";
            ids=$(ls | grep :);
            echo $ids > /tmp/DISABLED_$driver;
            for id in $ids; do
                echo "Unbinding $id";
                echo -n "$id" > unbind;
                disabled="$disabled $id";
            done;
        done;
    }
    function bind_usb {
        for driver in ehci ohci uhci; do
            cd "/sys/bus/pci/drivers/${driver}_hcd";
            for id in $(cat /tmp/DISABLED_$driver); do
                echo "Binding $id";
                echo -n "$id" > bind;
            done;
            rm /tmp/DISABLED_$driver;
        done;
    }
    case "$1" in
        hibernate|suspend)
            unbind_usb;
        ;;
        thaw|resume)
            bind_usb;
            unbind_usb;
            bind_usb;
        ;;
        *)
            exit 1;
        ;;
    esac;
    exit 0;
  4. даём скрипту необходимые права:
    $ sudo chmod u=rwx,go=rx /etc/pm/sleep.d/10_unbindusb
Теперь можно спокойно ложить машинку в suspend командой pm-suspend (от рута, конечно же). Не забывайте также о hibernate и suspend-hybrid.

Если после просыпания у вас не определяются USB-устройства, перезагрузите модуль ehci_hcd:
$ sudo rmmod ehci_hcd
$ sudo modprobe ehci_hcd

UPD 14.02.2012: даже после вышеприведённых инструкций машинка иногда не просыпалась (точнее, просыпалась, но на этапе загрузки образа уходила в ребут). Только что поставил linux-image-3.2.0-1-amd64 — шесть циклов hibernate пройдены на «ура» (причём в одном из случаев система засыпала от AC, а просыпалась от аккумулятора; в ещё одном случае было наоборот; во всех остальных — AC).

Wi-Fi

Беспроводная сеть была чуть ли не самой простой проблемой из всех. Следать нужно следующее:
  1. поставить менеджер сетевых соединений wicd (помимо curses-клиента существуют также gtk и cli):
    $ sudo aptitude install wicd wicd-curses
  2. прописать в /etc/network/interfaces беспроводной интерфейс:
    $ sudoedit /etc/network/interfaces
    В конец файла нужно дописать следующее:
    allow-hotplug wlan0
    iface wlan0 inet manual
  3. прописать wlan0 в настройках wicd, для чего в curses-интерфейсе (запускаемом с помощью команды wicd-curses) нужно нажать P (это большая английская буква P) и тут же в поле Wireless Interface написать заветное «wlan0» (без кавычек)
  4. жмакнуть F10, чтобы сохранить настройки
После этих нехитрых манипуляций ноутбук начинает-таки видеть беспроводные точки доступа.

Кстати говоря, Fn+F2 работает из коробки, только лампочка на передней панели, показывающая состояние Wi-Fi, не работает. Меня, впрочем, это мало волнует, поэтому я (пока что) не разбирался, почему так. UPD: за лампочки отвечает модуль asus_laptop. Не знаю, что там у меня случилось во время написания статьи, но сейчас, спустя неделю, модуль загружается сам, так что лампочки в порядке.

Fn-клавиши

Сразу после установки работали только клавиши, регулирующие яркость монитора, и Fn+F2, отключающая/включающая Wi-Fi. Мне очень сильно не хватало возможности регулировать громкость звука (и вообще выключать его), так что пришлось отлавливать события acpi и писать обработчики. На самом деле это не так сложно, как может показаться. Следуйте инструкции:
  1. создаём файлы, задающие события, на которые мы хотим реагировать (надеюсь, вы уже запомнили команду sudoedit, потому что на этот раз я просто покажу содержимое файлов, не расписывая процесс их создания):
    $ cat /etc/acpi/events/volume_mute
    event=hotkey ATK0100:00 00000032
    action=/etc/acpi/volume_mute.sh
    $ cat /etc/acpi/events/volume_up
    event=hotkey ATK0100:00 00000030
    action=/etc/acpi/volume_up.sh
    $ cat /etc/acpi/events/volume_down
    event=hotkey ATK0100:00 00000031
    action=/etc/acpi/volume_down.sh
    Если какой-то из Fn-хоткеев у вас работать не будет, запустите acpi_listen, понажимайте хоткей и посмотрите, соответствует ли вывод строке «event» (обратите внимание, что acpi присваивает событиям последовательные номера — их включать в строку event нельзя)
  2. создаём обработчики:
    $ cat /etc/acpi/volume_mute.sh
    #!/bin/sh

    amixer sset 'Master' toggle
    $ cat /etc/acpi/volume_up.sh
    #!/bin/sh

    amixer sset 'Master' 2+
    $ cat /etc/acpi/volume_down.sh
    #/bin/sh

    amixer sset 'Master' 2-
  3. заставляем acpid перечитать настройки:
    $ sudo pkill -SIGHUP acpid

PC speaker

«Пищалка» в данном ноуте детская, не настоящая даже — вместо взрослого PC speaker'а ноутбук пищит колонками. Отключается это тоже по-детски: достаточно открыть alsamixer (выполнив в терминале одноимённую команду), выбрать ползунок Beep и выключить его (нажав m).



Как видим, ни одной серьёзной проблемы — все вещи настраиваются парой изменений в конфигах. И кто после этого посмеет сказать, что Linux не готов для потребителя? ☺

Копируете статью — поставьте ссылку!

5 комментариев:

Unknown комментирует...

ссылка на инструкцию virens'а - на редактирование поста?

Minoru комментирует...

Упс… Спасибо, GalS — пофикшено!

goblinyara комментирует...

>>Правда, в TTY спикер все равно будет эмулироваться — как это побороть, я не знаю.

alsamixer, там будет PCM, убавляете в ноль, и не надо шаманства с xset=)

Minoru комментирует...

goblinyara, PCM — это, так сказать, «общесистемный» регулятор. Если убрать его в ноль, звук пропадёт во всей системе. Но все равно спасибо — пока проверял PCM, заметил Beep. Mute'им этот регулятор — и «пищалка» замолкает даже в TTY. Спасибо!

virens комментирует...

Знатный пост, баянщики и графоманы одобряют :-)

Про acpi_listen - это не панацея, надо сказать. У меня на ноутбуке оно вообще нифига не слышит (никаких выхлопов на нажатие спецклавиш). Тем не менее, Яркость, ВайФай и переключение на внешний монитор работают. Ни разу не из коробки, между прочим.

Про вайфай - тебе крупно повезло, отец, что в ядре поддерживается radio frequency kill switch (rf_kill). Это была большая боль в пояснице, ибо найти это в конфигах ядра было делом непростым (см. ту же ссылку).

И да, спасибо за ссылку на мой старый пост по дебиану. Забавно, но это до сих пор один из самых посещаемых постов по статистике....

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.

 
Blogger logo Debian logo Creative Commons License FeedBurner Subscribers Counter