Highlighter

воскресенье, 15 января 2012 г.

Creative Sound Blaster 5.1 VX и переход с ALSA на OSS

Захотелось мне приобрести полноценную звуковую карточку для мих Microlab Solo 2 mk3, так как та поделка, которую любят называть "встроенная звуковая карта" не могла раскачать их (всё-таки это простенький кодек, от него ничего ждать не стоит). Много денег отдавать желания совершенно не было, поэтому решил остановиться на Creative Sound Blaster 5.1 VX (SB1070).

Зашёл, значит, на alsa-project.org, посмотрел, а там статус
Not all features on all models supported. On the VX, white noise on playback unless initialized in Windows first.


"Хорошо" - Подумал я. Воткнул карточку и услышал злобное шипение.
"Не очень хорошо" - подумал я и решил поставить себе винду для того, чтобы посмотреть, что из этого выйдет, успешно забыв, что она может грузиться только с первого primary раздела. Через несколько часов поставились на неё драйвера и она под оффтопиком заиграла.
"Ну, хотя бы работает" - подумал я и пошёл ковыряться дальше.

Так как под alsa всё было грустно, я вспомнил, что с более-менее свежими карточками Creative, ALSA работает не очень хорошо (мягко выражаясь), а вот под OSS, всё очень даже неплохо, было принято решение перейти на эту систему.

В результате, всё поставилось (pacman -S oss),
Я запретил модуль soundcore (в /etc/rc.conf)
MODULES=(!soundcore
После перезагрузки запустилось (/etc/rc.d/oss start). Вот только были программы, которые используют для вывода только ALSA (тот же любимый мной xbmc). Погуглив, нашлось решение - поставить пакет alsa-plugins и прописать в /etc/asound.conf следующее

pcm.!default {
type oss
device /dev/dsp
}

ctl.!default {
type oss
device /dev/mixer
}
Вуаля! Всё работает. Вот только заметил я, что amarok очень сильно грузит процессор при работе. Решение нашлось быстро. Он же при работе использует xine, которому нужно указать, что требуется использовать oss вместо alsa.
Тут есть два варианта:
~/.xine/config

# используемый аудиодрайвер
# { auto  null  alsa  oss  jack  esd  file  none }, default: 0
audio.driver:oss
Либо установить xine-ui и там в настройках указать, что используется OSS как аудиодрайвер.

Осталось только найти хороший микшер для kde, а то дефолтный как-то плохо воспринимает oss.
В остальном всё замечательно и приятно работает. Кроме того, если раньше была проблема с одновременным проигрыванием звука из нескольких программ (например, если запустить chromium, xbmc не мог ничего выдать), то с переходом на oss этой проблемы нету.

Опубликовано на Welinux.ru

Убрать строки из одного файла в другом

Не заработал grep -v, стал делать так:

sort test_in test_ex | uniq -u

Hibernate на ASUS Eee 1201NL при помощи uswsusp

В продолжении этого поста

Понятно, что одним только Suspend2RAM сыт не будешь. Мне очень хотелось настроить нормальный hibernate при закрытии крышки ноута. Так как стандартные pm-utils не работали, то воспользовался этим руководством.


Для работы hibernate можно воспользоваться пакетом из AUR uswsusp-git. После сборки и установки редактируем файл /etc/suspend.conf и указываем там раздел со свопом
resume device = /dev/sda3
Затем нужно добавить в /etc/mkinitcpio.conf хук uresume перед filesystems — раздел в этот момент уже должен существовать. Теперь можно пересобрать initramfs:
# mkinitcpio -p kernel26
Важно! Сначала указываем параметр, потом собираем initramfs

Всё! Теперь по s2disk система уходит в hibernate, при загрузке восстанавливается.

Теперь настроим, чтобы по закрытию крышки ноут уходил в hibernate.

Для этого подправим скрипты из acpi-eeepc-generic

У этих скриптов довольно запутанная структура, поэтому пришлось проделать довольно много работы.
Для этого в /etc/conf.d/acpi-eeepc-generic.conf
Добавляем следующее
COMMANDS_HIBERNATE=("/etc/acpi/eeepc/acpi-eeepc-generic-suspend2disk.sh")
SUSPEND2DISK_COMMANDS=("s2disk")

Переменная COMMANDS_LID_CLOSE_ON_BATTERY содержит команду, которая выполняется при закрытии крышки. Приводим её к следующему виду
COMMANDS_LID_CLOSE_ON_BATTERY=("${COMMANDS_HIBERNATE<@>}")

Теперь копируем /etc/acpi/eeepc/acpi-eeepc-generic-suspend2ram.sh в /etc/acpi/eeepc/acpi-eeepc-generic-suspend2disk.sh

Теперь исправляем в файле /etc/acpi/eeepc/acpi-eeepc-generic-suspend2disk.sh
execute_commands "${SUSPEND2RAM_COMMANDS<@>}"
на
execute_commands "${SUSPEND2DISK_COMMANDS<@>}"

Перезапускаем acpid
# /etc/rc.d/acpid restart

И закрываем ноут. И открываем. И опять закрываем. И снова открываем. Всё работает :)

Опубликовано на Welinux.ru

Как я настраивал нетбук ASUS Eee PC 1201NL

Я поделюсь радостью: я купил себе нетбук ASUS Eee PC 1201NL, который посоветовал Midler в этом посте. Ещё раз хочу сказать спасибо всем тем, кто помогал выбрать.

И значительная часть уик-энда была посвящена настройке под себя этого чуда под archlinux.


Вот этот красавец (кстати, к моей радости, enter там, в отличии от скриншота, узкий)
asus_1201nlsiv002w_132495.jpg

В самом деле, нетбук очень симпатичный. Я выбрал серебристый цвет, ибо у этих моделей есть один недостаток — они глянцевые да и нравится он мне! Правда, нетбуком эту машинку назвать можно с натяжкой — 12 дюймов это вам не хухры-мухры. Однако такие размеры позволили засунуть в него клавиатуру нормальных размеров, в результате чего набирать данный пост очень удобно.

Хочется отметить, что существуют разные руководства, например на арчевики, поэтому просто даю туда ссылку, и рассказываю нюансы, с которыми пришлось столкнуться. В результате работает всё, что нужно и одного заряда хватает часа на 4 работы.

Итак, начнём. Сначала я настраивал горячие клавиши. Гугление показало, что в свежих ядрах для работы специфического оборудования используется модуль eeepc-wmi, но все готовые скрипты предполагают, что используется eeepc-laptop.
Для его работы нужно поставить acpi и добавить в меню груба параметр ядра acpi_osi=Linux. То есть у меня нужно было исправить в /boot/grub/menu.lst
1
kernel /boot/vmlinuz26 root=/dev/disk/by-uuid/301248ef-1795-41ee-b390-6f3abb1018d4 ro acpi_osi=Linux  vga=792

и в /etc/rc.conf
MODULES=(r8192se_pci eeepc_laptop !eeepc_wmi)

Далее я поставил acpid и acpi-eeepc-generic и настроил как в мануале. И всё остальное оттуда тоже сделал. В результате получил систему, в которой работают кнопочки :) В том числе отключается тачпад, включаются/отключаются блютуз и вай-фай, регулируются яркость и громкость. Вот тут был нюанс: нужно было отключить клавиши регулировки громкости в awesome через alsactl. Иначе звук регулировался ужасно.

Проблемы, которые я не решил: не работает hibernate и для включения wi-fi нужно дважды нажимать Fn+F2.

Далее захотелось нормальной работы с тачпадом. И поставил xf86-input-synaptics, для мультитача привёл конфиг (/etc/X11/xorg.conf.f/10-synaptics.conf) к следующему виду
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Section "InputClass"
        Identifier "touchpad catchall"
        Driver "synaptics"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Option "TapButton1" "1"
        Option "TapButton2" "2"
        Option "TapButton3" "3"
        Option "VertEdgeScroll" "on"
        Option "VertTwoFingerScroll" "on"
        Option "HorizTwoFingerScroll" "on"
        Option "CircularScrolling" "on"
        Option "CircScrollTrigger" "2"
        Option "EmulateTwoFingerMinZ" "0"
EndSection

В результате у меня заработала прокрутка двумя пальчиками :)

Далее я настроил автозагрузку иксов без ввода пароля, ибо при переноске я не собираюсь выключать - достаточно suspend2ram (хотя хотелось бы hibernate). Для этого добавил в /etc/inittab следующую строчку

x:5:once:/bin/su shtsh -l -c '/bin/bash --login -c /usr/bin/startx >/dev/null 2>/dev/null'

Теперь, когда система будет переходить в runlevel 5, будут запускаться иксы под моим пользователем.

Соответственно, логин - shtsh, shell пользователя /bin/bash

Правда, по умолчанию система грузится в 3й уровень, поэтому нужно передать ядру параметр 5. Соответственно, теперь строчка загруки ядра выглядит так
1
kernel /boot/vmlinuz26 root=/dev/disk/by-uuid/301248ef-1795-41ee-b390-6f3abb1018d4 ro acpi_osi=Linux  vga=792 5


Так как я собираюсь бывать в разных местах и использовать разные сети, то решил установить NetworkManager. Про установку NetworkManager можно прочитать тут. Обратите внимание, что для корректной работы нужно установить consolekit и запускать awesome так
exec ck-launch-session awesome

Так как я собираюсь использовать 3G-модемы, я установил modemmanager (приблуда для нормальной работы NM с модемами) и usb_modeswitch (ибо модемы любят определяться как накопители по-умолчанию).

Затем я настраивал bluetooth. Вот руководство.
Bletooth мне был нужен, чтобы можно было присоединиться к телефону LG KU 990i и использовать его как 3G-модем.
Стоит отметить, что blueman не хотел работать по-нормальному с NM. Везде советовали использовать gnome-bluetooth. Ну, я его и использую. В результате телефон настроился. Кстати, тут тоже нашёлся один нюанс. Если при настройке DUN выбирать оператора готовые предустановки, то при подключении появляется окошко с просьбой ввода пароля и никакой пароль из возможных не подходил. Решилось выбором своих настроек и вбиванием туда APN оператора.

Кстати, интересный факт: gnome-bluetooth и network-manager-applet (тоже гномовский) никаких гномовских либ за собой не тянут, так что они довольно лёгкие.

Далее я стянул с ББ конфиг awesome и переделал на работу с одним монитором и прописал серенькую тему strict и добавил скрипт мониторинга батареи.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
batwidget = widget({ type = "textbox" })
    vicious.register(batwidget, vicious.widgets.bat,
    function (widget, args)
        if  args<2> &lt; 30 and args<2> &gt;= 15 then
            return "" .. color_blue .. " Bat:<b> " ..  args<2> .. "</b>% <b>" ..args<3> .. "</b> "  .. color_default .. ""
        elseif args<2> &lt; 15 then
            return "" .. color_red .. " Bat:<b> " .. args<2> .. "</b>% <b>" .. args<3> .. "</b> " .. color_default .. ""
        else
            return " Bat:<b> " .. args<2> .. "</b>%  <b>" .. args<3> .. "</b> "
        end 
    end,
    60, 
    "BAT0")


Затем добавил для автозапуска следющее в конец
1
2
3
os.execute("pgrep -u $USER -x libreoffice || (libreoffice -nologo -quickstart &)")
os.execute("pgrep -u $USER -x nm-applet || (nm-applet &)")
os.execute("pgrep -u $USER -x bluetooth-applet || (bluetooth-applet &)")


Затем добавил переключение на русский по Caps Lock, скачал серую тему для chromium и радуюсь.

На всякий случай, вот мои запускаемые демоны.
DAEMONS=(syslog-ng dbus !network !netfs networkmanager acpid !crond @laptop-mode @alsa @bluetooth)

Вот набор скриншотов: терминалки, тема GTK+ на примере pidgin (qt программы выглядят так же благодаря gtk-qt-engine), chromium

s_1295856166_6da1db8ba3.pngs_1295856033_073bd8be20.pngs_1295856180_713033cda0.png

Опубликовано на welinux.ru

Делаем бэкап при вставке флешки

Есть такая замечательная аркадная игра — In The Groove. И эта самая игра сохраняет результаты на флешку. И очень захотелось делать бэкап папок с информацией. Под катом как я это реализовал.

Что делает скрипт?
При вставке флешки с определённой меткой (тут shtsh_itg) архивируем папки "In The Groove 2" и "In The Groove 3", помещаем в определённую папку (/home/shtsh/backup/itg) и копируем по ssh на сервер.

Примечание. Для корректной работы требуется монтирование флешки через udev (или как угодно, но флешка должна монтироваться в /media/label). Вот как монтируются флешки (файл /etc/udev/rules.d/10-usb-storage.rules)


ACTION=="add", KERNEL=="sd<a-z><0-9>", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/mkdir -p /mnt/%k"
ACTION=="add", KERNEL=="sd</a-z><a-z><0-9>", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/mount -o rw,noexec,dmask=000,fmask=111,utf8 /dev/%k /mnt/%k"
ACTION=="add", KERNEL=="sd</a-z><a-z><0-9>", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/ln -s /mnt/%k /media/$env{ID_FS_LABEL_SAFE}"
ACTION=="remove", KERNEL=="sd</a-z><a-z><0-9>", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/umount /dev/%k"
ACTION=="remove", KERNEL=="sd</a-z><a-z><0-9>", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/usr/bin/unlink /media/%k"
ACTION=="remove", KERNEL=="sd</a-z><a-z><0-9>", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/usr/bin/unlink /media/$env{ID_FS_LABEL_SAFE}"
ACTION=="remove", KERNEL=="sd</a-z><a-z><0-9>", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/rmdir /mnt/%k"
</a-z>

Тут у нас монтируются диски автоматом в /mnt/sdXY, где sdXY — имя диска, создаётся симлинк на неё в /media/label, где label — метка диска. Когда флешку вынимают, папки удаляются.

Далее, создадим правило для бэкапа при вставке флешки с меткой shtsh_itg (файл /etc/udev/rules.d/80-backup.rules)


ACTION=="add", ENV{ID_FS_LABEL}=="shtsh_itg", RUN+="/usr/local/bin/itg-backup.sh"
Для удобства при вставке нужной флешки просто запускается скрипт /usr/local/bin/itg-backup.sh
Вот этот самый файл.


#!/bin/sh                                                                                                                                                                                         

#файл со списком папок для копирования
FILES_TO_BACKUP='/home/shtsh/backup/itg/filelist'
#куда копировать бэкап
DIRECTORY_TO_BACKUP="/home/shtsh/backup/itg/"
#куда монтируется флешка
DIRECTORY_WITH_FILES="/media/shtsh_itg"
#удалённый каталог для копирования
REMOTE_DIR="shtsh@192.168.0.254:/home/shtsh/backup/itg/"
#ключ для автоматической авторизации ssh
KEY="/root/id_rsa"

cd $DIRECTORY_WITH_FILES
tar czvf $DIRECTORY_TO_BACKUP/shtsh_itg-`date +%Y%m%d-%H:%M`.tgz -T $FILES_TO_BACKUP
rsync -avrz -e "ssh -i $KEY" $DIRECTORY_TO_BACKUP $REMOTE_DIR
Вот файл /home/shtsh/backup/itg/filelist
In The Groove 2
In The Groove 3

Возможные вопросы:
Почему выбран tgz? — Быстро. На нетбуке с атомом он отрабатывает в разы быстрее, чем bzip2
Почему подключаемся под root? — UDEV работает из-под root, поэтому владельцем файла ключа должен быть root (владельцем файла должен быть root:root, права 600)
Теперь делаем

udevadm control restart

И радуемся!

Опубликовано на Welinux.ru

Postfix. Перенаправление с существующего ящика.

Для работы с почтой мы используем postfix.
Для управления postfix мы используем postfixadmin.
Удобная штука, но есть такой недостаток: нельзя с существующего ящика перенаправлять на другой почтовый ящик.

Решение проблемы:

1. Подключаемся напрямую к БД (используется mysql)

2. при помощи SHOW DATABASES; смотрим, какие есть базы

3. При помощи USE `postfix`; выбираем базу (используется postfix)

4. В таблице alias ищем нужный ящик (например, sysadmin@example.com)





SELECT * FROM `alias` WHERE `address`='sysadmin@example.com';


5. Видите поле goto? Оно-то нам и нужно. Туда через запятую нужно добавить адреса.

Не забудьте добавить ящик, на который идёт почта, иначе она на него не пойдёт :) КО.
 

UPDATE `alias` SET `goto`='me@example.com,sysadmin@example.com' WHERE `address`='sysadmin@example.com';

6. ...

7. PROFIT!

mceusb и миграция на lirc-0.9

Была у меня система, работающая, в основном, как домашний мультимедиа-центр, на базе Gentoo. Естественно, был пульт и использовался lircd. 

Для работы компилировались модули ядра из комплекта lirc. И для работы использовался модуль lirc_mceusb. Однако примерно с ядра 2.6.36 mceusb включён в ядро linux. Конечно, есть всякие "полезности" для совместимости, но нужно переделывать lircd.conf, что не хочется. В итоге у меня использовался lirc_mceusb, а всё, касающееся пультов ДУ, из ядра было убрано. 

Но это не могло продолжаться вечно. И наступил тот час, когда после обновления, lirc банально не собрался, а в более свежей версии уже не было поддержки lirc. В общем, пришлось делать всё "по-уму". Вообще, действия простые, но на то, чтобы понять, что делать, ушло довольно много времени. 

1) Включаем в ядре (можно модулями, если есть желание) 


CONFIG_RC_MAP=y
CONFIG_IR_RC6_DECODER=y
CONFIG_IR_MCEUSB=y

Это всё зависит от модели пульта и протокола, который он использует. Подробнее можно посмотреть тут 

-> Device Drivers
 -> Multimedia support (MEDIA_SUPPORT =y])
 -> Remote Controller adapters (RC_CORE [=y])


2) В make.conf заменяем значение LIRC_DEVICES на "devinput", заменяя то, что было. И пересобираем lirc. 

LIRC_DEVICES="devinput"

3) Используем стандартный конфиг для lirc 

ln -s /usr/share/lirc/remotes/devinput/lircd.conf.devinput /etc/lirc/lircd.conf

4) стартуем lircd 

5) Если irw не видит нажатий кнопок на пульте, то смотрим, какое устройство в /dev/input соответствует нашему ir-приёмнику. Для этого можно его отключить, и посмотреть, что изчезнет, затем подключить. После этого, можно прописать /etc/conf.d/lircd что-то вроде 

LIRCD_OPTS="-H devinput -d /dev/input/by-id/usb-COMPRO_VideoMate_IR20_REV.02-event-if00"LIRCD_OPTS="-H devinput -d /dev/input/by-id/usb-COMPRO_VideoMate_IR20_REV.02-event-if00"

5) Перезапускаем lirc, смотрим irw и радуемся. 

6) А мне пришлось не радоваться, а править ~/.xbmc/userdata/Lircmap.xml для корректной работы всех кнопок. Для этого я добавил описание пульта. 

<remote device="devinput"> 
 <play>KEY_PLAYPAUSE</play> 
 <pause>KEY_PAUSE</pause> 
 <stop>KEY_STOP</stop> 
 <forward>KEY_FASTFORWARD</forward> 
 <reverse>KEY_REWIND</reverse> 
 <left>KEY_LEFT</left> 
 <right>KEY_RIGHT</right> 
 <up>KEY_UP</up> 
 <down>KEY_DOWN</down> 
 <select>KEY_OK</select> 
 <pageplus>KEY_CHANNELUP</pageplus> 
 <pageminus>KEY_CHANNELDOWN</pageminus> 
 <back>KEY_EXIT</back> 
 <menu>KEY_LEFTMETA</menu> 
 <title>KEY_EPG</title> 
 <info>KEY_INFO</info> 
 <skipplus>KEY_NEXT</skipplus> 
 <skipminus>KEY_PREVIOUS</skipminus> 
 <display>KEY_SUBTITLE</display> 
 <start>Home</start> 
 <record>KEY_RECORD</record> 
 <volumeplus>KEY_VOLUMEUP</volumeplus> 
 <volumeminus>KEY_VOLUMEDOWN</volumeminus> 
 <mute>KEY_MUTE</mute> 
 <power>KEY_POWER</power> 
 <myvideo>KEY_VIDEO</myvideo> 
 <mymusic>KEY_AUDIO</mymusic> 
 <mypictures>KEY_CAMERA</mypictures> 
 <recordedtv>KEY_PVR</recordedtv> 
 <livetv>KEY_TUNER</livetv> 
 <mytv>KEY_DVD</mytv> 
 <one>KEY_NUMERIC_1</one> 
 <two>KEY_NUMERIC_2</two> 
 <three>KEY_NUMERIC_3</three> 
 <four>KEY_NUMERIC_4</four> 
 <five>KEY_NUMERIC_5</five> 
 <six>KEY_NUMERIC_6</six> 
 <seven>KEY_NUMERIC_7</seven> 
 <eight>KEY_NUMERIC_8</eight> 
 <nine>KEY_NUMERIC_9</nine> 
 <zero>KEY_NUMERIC_0</zero> 
 <star>KEY_NUMERIC_STAR</star> 
 <hash>KEY_NUMERIC_POUND</hash> 
 <clear>KEY_DELETE</clear> 
 <enter>KEY_ENTER</enter> 
 <red>KEY_RED</red> 
 <green>KEY_GREEN</green> 
 <yellow>KEY_YELLOW</yellow> 
 <blue>KEY_BLUE</blue> 
 </remote>

Всё работает. 

Примечание. В большинстве дистрибутивов такой проблемы не возникнет, ибо модули компилируются почти все, как для ядра, так и для lirc, но местами материал может быть полезен.

Впервые опубликовано на http://welinux.ru