Highlighter

вторник, 31 января 2012 г.

XBMC и shutdown. Гнева пост.

Недавно возникла такая ситуация: в xbmc пропала возможность выключать компьютер (остался лишь suspend). Сие меня крайне опечалило и заставило искать решение проблемы. Наиболее распространённым было решение добавить политику для policykit.

/etc/polkit-1/localauthority/50-local.d/custom-actions.pkla
[Actions for me]
Identity=unix-user:1000                                                                               
Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.*;org.freedesktop.udisks.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
Естественно, вместо 1000 нужен uid или логин пользователя, от чьего имени работает xbmc.
Однако это не помогло.

Каково было моё удивление, когда для решения этой проблемы потребовалось убрать ck-launch-session для запуска. То есть опять пришлось огребать проблемы из-за этого долбанного нестабильного consolekit. То бишь теперь всё запускается из слима командой:

/etc/slim.conf
login_cmd           exec dbus-launch /bin/bash -login ~/.xinitrc %session > ~/.xsession-errors 2>&1

Год назад при выходе 0.4.2 пришлось извращаться, так теперь опять ковыряться и искать причину.
 Господа разработчики основных линуховских подсистем, почему вы так регулярно всё ломаете?!

пятница, 27 января 2012 г.

Выводим список обновлений в gentoo при логине

Давным-давно я наваял скромненький скрипт, который дёргается по крону и проверяет, чего обновилось в системе.

Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите

/usr/local/sbin/update-system-check
#!/bin/bash

LOG_FILE=/var/log/updates
PID_FILE=/var/run/updates.pid

LANG=ru_RU.UTF-8

STRING_FILE_EXIST="Процесс уже запущен. Выход"
STRING_FILE_ALONE="Процесс был некорректно завершён. Перезапуск обновления"
STRING_GOOD="Обновление"

#для того, чтобы работал notify-send
USER="shtsh"

#Создаём лог-файл, если его нету
[ -e $LOG_FILE ] || touch $LOG_FILE && chmod 640 $LOG_FILE && chown root.log $LOG_FILE

#Пишем в PID-файл, качаем файлы и удаляем PID-файл
check_update(){
        ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | awk {'print $2'} > $PID_FILE
                eix-sync > /dev/null
                eix-remote fetch > /dev/null
                emerge -qupDN @world >> $LOG_FILE
                TMP=`grep ebuild $LOG_FILE`
                if [ "x$TMP" != x"" ]
                then
                        # Тут извращаемся и пользователю $USER выводим при помощи notify-send, что обновилось. Так как используется DBUS, то нужно поизвращаться.
                        # Так как я использую KDE, то грепаем процессы по kdeinit для получения параметров DBUS
                        PID=$(pgrep -u $USER kdeinit)
                        DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
                        sudo -u $USER DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS bash -c "notify-send $STRING_GOOD \"`/usr/local/bin/parse.pl html`\""

                fi
        rm -f $PID_FILE
}


if [ -e $PID_FILE ]
# PID-файл есть, проверяем на корректность завершения операции.
then
        process_count=`ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | wc -l`
        if (( $process_count > 2 ))
        then
                # Всё хорошо, другой процесс работает
                echo `date +"%D %A %H:%M"` $STRING_FILE_EXIST >> $LOG_FILE
                exit 1
        else
                # Это единственный процесс, обновляем
                echo `date +"%D %A %H:%M"` $STRING_FILE_ALONE > $LOG_FILE
                check_update
        fi

else
#Файла нету, просто обновляемся
        echo `date +"%D %A %H:%M"` $STRING_GOOD > $LOG_FILE
        check_update
fi

Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).

/usr/local/bin/parse.pl
#!/usr/bin/perl -w

use strict;

# проверяем аргументы, которые должны быть равны plain или html
# По-умолчанию выводим как plain text
my $output_type="plain";

if (defined(@ARGV)) {
        if (("$ARGV[0]" ne "html") and ("$ARGV[0]" ne "plain")) {
                print "\nUSAGE:\n $0 plain \t for plain text output\n $0 html\t for HTML output\n\n";
                die;
        }
        $output_type=$ARGV[0];
}

open(LOG_FILE,'<','/var/log/updates');

# Выводим список обновлений
while(<LOG_FILE>) {
        /ebuild/;
        if ("$output_type" eq "html") {
                print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
        } else {
                print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
        }
}
Этот скрипт умеет парсить файл, где записано, что обновилось и выводить в HTML для libnotify или plain text.

Теперь осталось засунуть вызов parse.pl в .bashrc. Так же можно использовать cat /var/log/updates. Только смотрите - у меня логи пишутся для группы log (я об этом раньше писал), поэтому, возможно, придётся немножко подправить.

Ну, и для обновления системы я использую следующий скрипт:
#!/bin/bash

LOG_FILE=/var/log/updates

emerge -auDN @world &amp;&amp; [ -e $LOG_FILE ] &amp;&amp; echo "" &gt; $LOG_FILE
revdep-rebuild &gt; /dev/null

Ну, и нужно добавить в /etc/crontab что-то, похожее на это:
5 */3 * * *     root    /usr/local/sbin/update-system-check
Каждые 3 часа будут проверяться обновления.

P.S. Парсер лох. Сейчас буду пытаться исправить.

понедельник, 23 января 2012 г.

Загружаемся с флешки через grub

Пришлось как-то недавно повозиться с ноутбуком, у которого dvd-rom уже начал глючить, а поддержки загрузки с usb флешки или внешнего dvd-rom нету.

Заодно захотелось сделать заявление: "Дорогая Toshiba, я никогда не буду покупать твою продукцию из-за кривых bios и ужасной поддержки linux."

Так вот. На этот ноутбук нужно было поставить арч, а при чтении с диска возникали ошибки. Поэтому пришлось гуглить. И знаете, нагуглилась очень классная штука - plop boot manager.

Plop - менеджер загрузки, который способен грузится почти откуда угодно. Нас же интересует его возможности по загрузке из grub.

Сначала качаем его с официального сайта. Затем находим в архиве файл plpbt.bin и кидаем его в /boot.

После этого добавим запись в меню.

GRUB
title Plop Boot Manager
root (hd0,0)
kernel /boot/plpbt.bin
GRUB2
Создаём файл /etc/grub.d/20_plop
#!/bin/sh
set -e

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib

# older versions of grub2 do not have this yet (LP: #459080)
if [ ! -e ${libdir}/grub/grub-mkconfig_lib ]; then
    echo "no grub-mkconfig_lib, exiting"
    exit 0
fi

. ${libdir}/grub/grub-mkconfig_lib

# We can't cope with loop-mounted devices here.
case ${GRUB_DEVICE_BOOT} in
  /dev/loop/*|/dev/loop[0-9])
    exit 0
  ;;
esac

if test -e /boot/plpbt.bin ; then
  USBBOOTPATH=$( make_system_path_relative_to_its_root "/boot/plpbt.bin" )
  echo "Found plpbt.bin image: $USBBOOTPATH" >&2
  cat << EOF
menuentry "Plop Boot Manager" {
   linux16   $USBBOOTPATH
}

EOF
fi
Взято тут
Затем делаем update-grub и у нас появляется нужный пункт меню, через который можно зайти в Plop.

Конечно, он умеет загружаться не только через grub, но и с дискеты, с виндового загрузчика, по сети.
Более подробно можно почитать на сайте разработчиков.

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

Собираем xbmc под gentoo ~amd64

Есть такой очень удобный и красивый медиа-центр xbmc.

Из стандартного репозитория gentoo он уже собираться не хочет, поэтому я перешёл на версию 9999. Однако и он собираться не захотел! Пришлось гуглить. Решение нашлось на гентушном форуме.

Проблема оказалась, что xbmc пока не поддерживает libpng 1.5.

mkdir -p /etc/portage/patches/media-tv/xbmc/ 
cd /etc/portage/patches/media-tv/xbmc/ 
wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5-fix-plt-trn-get.patch
wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5.patch
mv xbmc-9999-libpng-1.5.patch xbmc-9999-a-libpng-1.5.patch
Стоит отметить папку /etc/portage/patches. Из неё патчи будут накладывать автоматически при сборке.

пятница, 20 января 2012 г.

Gentoo + KDE + appmenu - nepomuk

Чем хороша Gentoo - в ней можно собрать систему так, как пожелает душа. Вот не нравится мне непомук - его можно выкинуть нафиг. Конечно, Kontaсt, kmail, kopete придётся выкинуть тоже. Но не думаю, что это проблема.

Спасибо megabaks за вдохновение и оверлей.

Сначала выпилим kdepim. Это просто и быстро.

/etc/portage/package.use
net-p2p/ktorrent        -rss
kde-base/plasma-workspace -rss
kde-base/libplasmaclock -holidays
В make.conf в USE добавляем "-semantic-desktop"

Затем смотрим при помощи equery depends, что зависит жёстко от kdepimlibs и удаляем. Если что-то зависит не жёстко, то выставляем нужный USE для пакета. Затем пересобираем мир, делаем emerge --depclean и revdep-rebuild, внимательно читая вывод, чтобы он не поставил kdepim обратно.
UPD. Вообще, без выпиливания kdepim обойтись можно - достаточно убить kontact, и можно будет пользоваться kopete.

Далее ставим что-нибудь приличное для почты и IM (например, thunderbird и pidgin). Теперь заменим систему вывода для Qt на raster. Для этого используем, например, оверлей megabaks'а stuff
layman -a stuff

emerge x11-misc/kcm-qt-graphicssystem
Теперь выбираем в systemsettings в модуле "Qt Graphics System" режим raster.

Теперь вместо тормознутой темы приложений Oxygen поставим настраиваемую и быструю qtcurve.

emerge x11-themes/qtcurve-qt4 x11-themes/gtk-engines-qtcurve
Теперь прикрутим appmenu, но не как в ubuntu, а сделаем кнопочку на оформлении окна.

В USE вставляем флаг appmenu, затем ставим всё, что нужно
emerge x11-misc/appmenu x11-misc/appmenu-gtk x11-misc/appmenu-qt x11-misc/appmenu-firefox kde-misc/oxygen-appmenu x11-misc/lo-menubar

После этого выбираем оформление окна с кнопочкой меню, перелогиниваемся и радуемся жизни.

четверг, 19 января 2012 г.

Установка JBOSS AS 7 + ajp

Сначала тут должен был быть большой пост с пошаговыми инструкциями, но потом я понял, что если кто-то устанавливает jboss, то он всякие базовые вещи знает и понимает. Поэтому только то, что реально пришлось сделать.

Мне нужно было установить JBOSS в качестве бэкэнда к апачу через ajp, затем что-нибудь задеплоить.

Я поднял контейнер openvz, выделил ему 2 гига ОЗУ и запустил.

Вот, что я ставил:
Debian 6
Apache 2.2.16(from debian repositories)
mod_jk 1.2.30 (from debian repositories)
JDK 1.6.0_26 (from debian repositories)
JBoss AS 7.0.2.Final
OpenAM 9.54


Настройка:
Сразу отмечу, что JBoss я ставил впервые и с ajp пришлось неслабо повозиться. Особенно "приятно", что он отличается от предыдущих версий в качестве настройки и управления, поэтому его я сразу очень полюбил за бурный секс.


Сначала настроим apache.
/etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
        JkMount /* myworker
        ServerAdmin liparinai@gmail.com
        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel debug
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost> 

 /etc/apache2/mods-available/jk.conf
<IfModule mod_jk.c>
# The Jk shared mem location
JkShmFile /var/log/apache2/mod_jk.shm

# Jk logs
JkLogFile /var/log/apache2/mod_jk.log

# Jk loglevel
JkLogLevel error

# Jk logformat
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# Our workers config
JkWorkersFile /etc/apache2/workers.conf
</IfModule>
 /etc/apache2/workers.conf
worker.list=myworker
worker.myworker.port=8009
worker.myworker.host=127.0.0.1
worker.myworker.type=ajp13
worker.myworker.lbfactor=1
Теперь делаем.
a2enmod jk

и перезапускаем апач.

Теперь настраиваем JBoss.
Установка элементарна - тупо распаковываем, например, в /opt/java. Для удобства, я сделал ссылку на эту папку в /opt/java/jboss

Теперь настройка. Эти вещи слабо гуглятся, в официальных доках с этим проблема.

/opt/java/jboss/standalone/configuration/standalone.xml
(Modifications marked with bold font)

<server name="temporary.ru" xmlns="urn:jboss:domain:1.0">
    <extensions>
            ... skipped ...
    </extensions>

    <system-properties>
        <property name="jvmRoute" value="myworker"/>
    </system-properties>

    ... skipped ...

        <subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host">
            <connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http"/>
            <connector name="ajp" protocol="AJP/1.3" socket-binding="ajp" scheme="http"/>
     ... skipped ...
         <socket-binding-group name="standard-sockets" default-interface="public">
                <socket-binding name="http" port="8080"/>
                <socket-binding name="ajp" port="8009"/>
                 <socket-binding name="https" port="8443"/>
... skipped ...

В частности, проблема с jvmRoute, который (по идее) должен был сам подхватиться. Спасибо Sirex'у за то, что дал хороший совет.

Затем можно запускать.
/opt/java/jboss/bin/standalone.sh &.

По-хорошему нужно создать пользователя, сделать его владельцем jboss и от его имени запускать.

Теперь можно задеплоить OpenAM. Читаем руководство, делаем что написано и кидаем в папку /opt/java/jboss/standalone/deployments.

Если нужно, можно настроит балансировку нагрузки и jboss не светит в интернет.

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

Установка Quake2 с улучшенной графикой

Классика... Как много в этом :)
Вот и руки дошли помучать вторую кваку. Вот только это - классика, и вышла игра давно... А система сильно изменилась с того времени. И не факт, что запустится какой-нибудь из гуляющих по интернету движков. Оффициальный-то уже устарел, и графику нормальную выдавать не может :( Но существует в природе куча модифицированных движков, сделанных фанатами. Правда, делали их тоже давно, и придётся для запуска шаманить или компилировать из исходников. Чем мы сейчас и займёмся.

Одним из самых известных сайтов, посвященных разработке на движках quake является Quakedev. А лучшим на данный момент движком является QuDos. Вот его мы и будем собирать.

Сначала идём сюда и качаем исходник
После этого распаковываем и открываем в редакторе Makefile. Там нам нужны следующие строчки


# Client and Renderers
BUILD_QUAKE2?=YES   # Build client (OSS sound, cdrom ioctls for cd audio).
BUILD_DEDICATED?=NO # Build dedicated server.
BUILD_GLX?=YES      # Build OpenGL renderer.
BUILD_SDLGL?=YES    # Build SDL OpenGL renderer.
ifeq ($(OSTYPE),Linux)
BUILD_ALSA_SND?=YES     # Enable support for ALSA (default sound on 2.6 Linux).
endif
BUILD_ARTS_SND?=NO      # Enable support for libaRts (KDE sound system) sound.
BUILD_OSS_SND?=YES      # Enable support for OSS (default) sound.
BUILD_SDL_SND?=YES      # Enable support for SDL sound.

# Mods
BUILD_GAME?=YES     # Build original game modification (game$(ARCH).so).
BUILD_3ZB2?=NO      # Build 3zb2 (bots) modification.
BUILD_CTF?=NO       # Build CTF (Capture The Flag) modification.
BUILD_JABOT?=NO     # Build JABot (bots) modification.
BUILD_ROGUE?=YES        # Build Rogue modification.
BUILD_XATRIX?=YES   # Build Xatrix modification.
BUILD_ZAERO?=YES        # Build Zaero modification.

# Configurable options.
WITH_BOTS?=YES      # Enable Ace Bot support in modifications (Quake2, Rogue, Xatrix and Zaero).
WITH_DATADIR?=NO    # Read from $(DATADIR) and write to "~/.quake2".
WITH_DGA_MOUSE?=NO  # Enable DGA mouse extension.
WITH_GAME_MOD?=YES  # Enable custom addons in the main modification (Quake2, Rogue, Xatrix and Zaero).
WITH_IPV6?=NO       # Enable IPv6 support. Tested on FreeBSD.
WITH_JOYSTICK?=NO   # Enable joystick support.
WITH_LIBDIR?=NO     # Read data and renderers from $(LIBDIR).
WITH_QMAX?=YES      # Enable fancier OpenGL graphics.
WITH_REDBLUE?=NO    # Enable red-blue 3d glasses renderer.
WITH_RETEXTURE?=YES # Enable retextured graphics support.
WITH_X86_ASM?=YES   # Enable x86 assembly code (only for i386).
WITH_XMMS?=NO       # Enable XMMS support (thanks AprQ2).
В них включаем/выключаем те параметры, которые нам нужны/не нужны (а то нафига мне поддержка xmms, которого у меня нету и мне незачем ставить его хедеры и библиотеки). Далее пишем make и ждём, когда соберётся. Если ругается на отсутствие какого-нибудь файла, то ставим соответствующий dev-пакет и повторяем операцию.
Мне потребовалось установить следующие пакеты из того, что у меня не было.
sudo apt-get install xorg-dev libvorbis-dev libsdl-dev
В результате, в папке quake2 появился собранный под мою систему движок игры. Далее с купленного диска игры (если найдёте) в папку baseq2 копируете pak0.pak
Потом нужно туда же скопировать этот файл.
Теперь можно и запускать QuDos. Тут я это сделал и мой монитор ругнулся на некорректное разрешение и пришлось перезапускать иксы. После этого я запускал его так

./QuDos +set vid_fullscreen 0
Теперь у нас есть квака с симпатичными эффектами и кучей плюшек
например, красивые взрывы
aaa10w.th.jpg

или нормальная вода
aaa11.th.jpg

Эффект блюра под водой
aaa16.th.jpg

А теперь идём сюда и качаем пак с текстурами (~300 MiB). Кидаем, естественно, в baseq2. Кстати, там есть ещё дополнительные текстуры с большим разрешением - если готовы качать около 800 Мбайт, то смотрите в разделе Berserker@Quake2.
В результате у нас получается что-то типа этого
aaa12.th.jpgaaa13.th.jpgaaa14.th.jpg

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







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

Настройка Xorg + awesome для работы с двумя мониторами

Купил я, значит, монитор Benq 24" G2420HD, воткнул его вместе со своим старым LG Flatron L192WS и стал думать, как бы их нормально настроить.

Настройка Xorg

Растягивать на два экрана ничего не нужно было (просто не смог придумать такую задачу), перемещать вручную окна между экранами тоже (ибо awesome), поэтому решил просто настроить как два отдельных экрана.

Секция Device — указываем, что к одному устройству подключено два экрана

 
Section "Device"                                                                                                                       
       Identifier     "Device0" 
        Driver "nvidia"
        Option "NoLogo" "True"
        Screen  1
EndSection

Section "Device"
       Identifier     "Device1" 
        Driver "nvidia"
        Option "NoLogo" "True"
        Screen          0   
EndSection
Теперь описываем мониторы
 
Section "Monitor"                                                                                                                      
    Identifier     "Monitor1"
    VendorName     "Unknown"
    ModelName      "LG Electronics L192WS"
    HorizSync       30.0 - 83.0
    VertRefresh     56.0 - 75.0
    Option         "DPMS"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "BenQ G2420HD"
    HorizSync       24.0 - 83.0
    VertRefresh     50.0 - 76.0
    Option         "DPMS"
EndSection
Теперь настройка экранов

Section "Screen"
    Identifier     "Screen0"
    Device         "Device1"
    Monitor        "Monitor1"
    DefaultDepth    24
    Option         "TwinView" "0"
    Option         "metamodes" "DFP: nvidia-auto-select +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "TwinView" "0"
    Option         "metamodes" "CRT: 1440x900 +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection
И напоследок настроим Layout и укажем, что маленький монитор слева от большого.

Section "ServerLayout"                                                                                                             
   Identifier     "DualSreen"
   Screen       0 "Screen0"
   Screen       1 "Screen1" LeftOf "Screen0"
   Option         "Xinerama" "0" 
EndSection
Если у вас версия xorg-server < 1.8, то настройки лежат в /etc/X11/xorg.conf, иначе лежат в отельных файлах в /etc/X11/xorg.conf.d/

Настраиваем awesome

Тут тоже ничего экстраординарного нету, ибо awesome умеет два монитора "искаропки". Стоит только помнить, что есть смысл следить за тем, с какого экрана запускаете программу. Например, если у меня у firefox тэг со свойством screen = 1, а запускаю я с другого экрана, то он запустится, но окна видно не будет. Поэтому нужно принудительно запускать как

DISPLAY=:0.0 firefox
Вот, как я разделил теги в shifty

-- shifty: predefined tags
shifty.config.tags = { 
 
    -- screen 1 
 
    <"term">         = { init = true, position = 1, screen = 1, layout = awful.layout.suit.fair                          },  
    <"web">          = { position = 2, screen = 1, layout = awful.layout.suit.fullscreen, mwfact = 0.6, spawn = browser  },  
    <"multimedia">   = { position = 8, screen = 1, layout = awful.layout.suit.fullscreen                                 },  
    <"office">       = { position = 9, screen = 1, layout = awful.layout.suit.tile.bottom                                },  
    <"gimp">         = { position = 0, screen = 1, layout = awful.layout.suit.max, spawn = "gimp"                        },  

    --screen 2

    <"im">           = { position = 3, screen = 2, layout = awful.layout.suit.tile.left, mwfact = 0.3                    },  
    <"skype">        = { position = 4, screen = 2, layout = awful.layout.suit.tile.left,                                 },  
    <"mail">         = { position = 5, screen = 2, layout = awful.layout.suit.tile.bottom                                },  
    <"picture">      = { position = 6, screen = 2, layout = awful.layout.suit.max                                        },  
    <"music">        = { position = 7, screen = 2, layout = awful.layout.suit.tile.bottom                                },  
}
Конечно, если бы я работал чаще с гимпом, то (наверное) настроил его для работы с двумя мониторами, но сейчас это не особо важно.

Ну, и напоследок изменил автоматический запуск программ

os.execute("pgrep -u $USER -x pidgin || (DISPLAY=:0.1 pidgin &)")
os.execute("pgrep -u $USER -x thunderbird|| (DISPLAY=:0.1 thunderbird &)")
os.execute("pgrep -u $USER -x deadbeef || (DISPLAY=:0.1 deadbeef &)")
os.execute("pgrep -u $USER -x skype || (DISPLAY=:0.1 skype &)")
Как можно увидеть, ничего особо сложного делать не пришлось. Но, может, кому-нибудь эта информация будет полезной.

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

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

Файловая Система /proc

Файловая система /proc является особой для GNU/Linux . Это виртуальная файловая система и она не занимает места на вашем диске, то есть если вы попробуете просмотреть его при незапущенном Linux, то ничего не увидите. Это очень удобный способ получить информацию о системе, тем более, что большинство файлов в этом каталоге читаемы для человека.
Большинство программ реально получают информацию из файлов в /proc, форматируют их своим способом, а затем отображают. Так делают все программы, которые отображают информацию о процессах, и некоторые из них мы уже видели (top, ps и подобные). /proc это также хороший источник информации о ваших аппаратных средствах, и таким же образом некоторые программы являются только интерфейсами к информации, содержащейся в /proc. Существует также специальный подкаталог /proc/sys. Он позволяет изменять некоторые параметры ядра в реальном режиме времени или отображать их.

Кстати, не стоит открывать файлы, содержащиеся в этих каталогах ― это может нарушить целостность файловой системы, или ядро может успеть изменить значения в этих файлах. Для того, чтобы не вызвать проблем, при записи в эти файлы нужно использовать команду echo.
Пример:
# echo «message» > /proc/file

Для чтения использоуйте команду cat/more/less
$ more /proc/cpuinfo

В результате вы получите всю информацию о процессорах, установленных в системе.
Если вы пролистаете содержимое каталога /proc, вы увидите много каталогов, названиями которых являются номера. Эти каталоги содержат информацию о все запущенных в данный момент процессах в системе.

Имейте в виду, что как пользователь, вы можете увидеть информацию только о своих собственных процессах. Для других пользователей вы такой информации не получите. Перейдя в каталог с номером какого-нибудь процесса и выполнив ls -l, можно заметить, что выводе для разных каталогов присутствуют одинаковые входы.
Вот краткое описание некоторых из них:
1. cmdline: этот (псевдо-) файл содержит целую командную строку, использованную для вызова процесса. Он не отформатирован: нет пробелов между программой и ее аргументами, и нет разделителя в конце строки.
2. cwd: это символическая ссылка на текущий рабочий каталог (следует из имени) процесса.
3. environ Этот файл содержит все переменные окружения, определенные для процесса, в форме VARIABLE=value. Подобно cmdline, вывод не форматирован вообще: нет разделителей между различными переменными, и нет разделителя в конце.
4. exe: это символическая ссылка на соответствующий запущенному процессу выполняемый файл.
5. fd: этот подкаталог содержит список файловых дескрипторов, открытых процессом в данный момент.
6. root: Это символическая ссылка на корневой каталог, используемый процессом. Обычно это будет /.
7. status: этот файл содержит различную информацию о процессе: название выполняемой программы, его текущее состояние, его PID и PPID, его реальные и эффективные UID и GID, использование им памяти, и другое.
Кроме каталогов, связанных с различными процессами, /proc также содержит несметное количество информации об аппаратном обеспечении вашей машины. Вот некоторые из них:
1. cpuinfo: этот файл содержит, соответственно своему названию, информацию о процессоре(рах) в вашей машине.
2. modules: этот файл содержит список модулей, которые используются ядром в данный момент, а также процент использования для каждого модуля. Фактически, это та же самая информация, которую предоставляет команда lsmod.
3. meminfo: этот файл предоставляет информацию о загрузке памяти на момент запроса. Более аккуратно форматированный вид этой же информации можно получить командой free.
4. apm: если у вас ноутбук, то вывод этого файла предоставит вам информацию о состоянии батарей. Вы сможете увидеть куда подключен AC, текущую загрузку батарей, и, если APM BIOS вашего ноутбука поддерживает это (к сожалению это не всегда так), то вы смож ете увидеть еще и сколько времени в минутах батареи смогут проработать. Файл не очень читаем, поэтому лучше использовать вместо него команду apm, которая предоставит информацию в "человекочитаемом" виде.
5. bus: этот подкаталог предоставит вам информацию о всех периферийных устройствах, найденных на
6. различных шинах вашего компьютера. Информация внутри него редко вообще читаема, и главным образом с ней имеют дело и умеют форматировать внешние утилиты.

Подкаталог /proc/sys
Задача этого каталога - сообщать о различных параметрах ядра и позволять замену некоторых из них в реальном режиме времени. Список каталогов и файлов преимущественно зависит от конкретно вашей системы, а большинство файлов будет использоваться только для очень специализированных приложений. Тем не менее, есть различные ситуации, в которых будет полезно изменять содержимое файлов в этом каталоге. Например, файл
/proc/sys/kernel/ctrl-alt-del
Этот файл содержит двоичное значение, которое управляет реакцией системы на комбинацию ctrl+alt+delete. Возможны два значения:
— Ноль (0) значит, что ctrl+alt+delete принимается и отправляется программе init, что обеспечит правильный останов и перезагрузку как если бы вы ввели команду reboot.
— Один (1) значит, что ctrl+alt+delete не принимается и никакого чистого отключения не происходит - перезагрузка как при нажатии на RESET.
То есть для изменения делаем так:
# echo 0 > /proc/sys/kernel/ctrl-alt-del

Файл /proc/sys/vm/swappiness
Этот параметр позволяет регулировать стремление системы сбрасывать данные из памяти в файл подкачки. Чрезмерное значение здесь приведёт к интенсивному использованию своп-раздела, что нежелательно в ряде случаев. Слишком маленькое значение может привести к тому, что при заполнении памяти будет принудительно запущен OOMkiller (процесс, запускающийся при исчерпании памяти и убивающий наиболее ресурсоёмкие задачи). Значение параметра может быть в пределах от 0 (наименьшее использование подкачки) до 100 (подкачка используется часто). Значение по умолчанию - 60. Есть сообщения, что при большом объёме памяти (от 1Гб) оптимальным значением является 10. Для этого:
echo "10" > /proc/sys/vm/swappiness

Но, естественно, после перезагрузки содержимое /proc опять вернётся к своим значениям по-умолчанию. Для того, чтобы изменения в директории /proc/sys стали постоянными, нужно внести изменения в файл конфигурации для sysctl - /etc/sysctl.conf

Формат этого файла требует некоторых пояснений. Так как sysctl может только изменять переменные в директории /proc/sys, то часть имени переменной обозначающая директорию отбрасывается. Другое изменение касается слэшей, которые заменяются на точки.

Вот два простых правила для преобразования файлов в /proc/sys и переменных в sysctl:
Уберите из начала команды /proc/sys
Замените слэши на точки в имени файла.
Эти два правила позволят вам преобразовать любой файл в /proc/sys в любое имя переменной в sysctl. Обычное преобразование имени файла в переменную:
/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file
Вы можете увидеть все переменные, доступные для изменения, используя команду sysctl -a.
Вообще, есть много информации о /proc, как и о другой файлойвой системе /sys. Но это заслуживает отельного разговора, а на этом пора закругляться.

Просматриваем логи обычным пользователем в gentoo

В gentoo по-умолчанию для логов используется syslog-ng. Но, мне очень портило жизнь, что логи можно было просматривать только рутом.

Наконец-то дошли руки поправить это.

Настройки syslog-ng находятся в файле /etc/syslog-ng/syslog-ng.conf

Нам нужна часть

options {
};

Там есть такая опция perm(), которая указывает права на доступ к логам.
 Конечно, можно сделать 644, но лучше воспользуемся опцией group(), которая указывает на группу, от имени которой будут писаться логи - это поможет нам указывать пользователей, которым нужен доступ к логам.

options {
perm(0640);
group("log");
};

После этого добавляем пользователя в группу log

gpasswd -a имя log

Выставляем права на папку с логами

chown -R root:log /var/log

и перезапускаем демон

/etc/init.d/syslog-ng restart

После этого можно смотреть под теми пользователями, которые находятся в группе log

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

Решение проблемы с сетевыми соединенениями

Была у меня проблема - при увеличении нагрузки на web-сервер, начинал ругаться nagios, примерно так

Notification Type: PROBLEM

Service: *Практически любой, обычно memcached*
Host: *не важно*
Address: *не скажу*
State: UNKNOWN

Date/Time: 30-02-2011 Additional Info : NRPE: Unable to read output

Почитав /var/log/messages, я увидел такие сообщения
kernel: ip_conntrack: table full, dropping packet.
kernel: printk: 223 messages suppressed.

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

В файл /etc/sysctl.conf добавил строчку

net.ipv4.netfilter.ip_conntrack_max = 524280
(было 65535)

Затем sysctl -p и проблема была решена.

Gentoo + Dell Latitude e5410

Попала мне в руки в виде подарка на день рождения эта самая машинка, вот я и решил поставить на неё Gentoo + KDE (ага, надоел awesome). 
Естественно, я тут не буду расписывать всякие банальности по установке, которых куча в интернете. Так что ниже будут описаны проблемы, с которыми я столкнулся и их решение.

1. WiFi Broadcom BCM43224 b/g/n.
Для этой карточки есть свободные драйверы, но у них проблемы с энергосбережением и стабильностью, поэтому стоит ставить закрытые. В gentoo для этого есть пакет broadcom-sta. Ставится он просто, но перед этим нужно настроить ядро. А тут есть один нюанс: нужно включить CONFIG_WIRELESS_EXT=Y. 
В nconfig идём в Device Drivers ->  Network Device support -> Wireless LAN -> Intel PRO/Wireless 2200BG and 2915ABG Network Connection и отмечаем, что он нам нужен. Спасибо этому руководству. Дальше делаем по руководству для broadcom-sta из gentoo-wiki.

2. ALPS PS/2 Touchpad.
Тут проблема намного более крутая. Ряд таких тачпадов (особенно у dell) определяется как обычная мышь и synaptics не работает - соответственно ни прокрутки двумя пальцами, ни настраиваемости synaptics не дождёшься. 
Конечно, можно было бы забить на проблему (в принципе, и тачстик, и тачпад работают), но это не вариант, поэтому будем патчить ядро. Решение было найдено на просторах интернета и взято из арчевского AUR.
Качаем файлы:
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0001-Input-ALPS-Move-protocol-information-to-Documentatio.patch
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0002-Input-psmouse-Add-PSMOUSE_CMD_RESET_WRAP.patch
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0003-Input-ALPS-Add-protocol-version-field-in-alps_model_.patch
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0004-Input-ALPS-Remove-assumptions-about-packet-size.patch
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0005-Input-ALPS-Add-support-for-protocol-versions-3-and-4.patch
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0006-Input-ALPS-Add-semi-MT-support-for-v3-protocol.patch
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0007-Input-ALPS-Add-documentation-for-protocol-versions-3.patch
http://people.canonical.com/~sforshee/alps-touchpad/psmouse-alps-0.10/0008-Input-ALPS-dump-raw-packet-data.patch

Затем копирум в /usr/src/linux, патчим ядро и собираем его. Если что, патчится при помощи patch -Np1 -i имя_патча. После загрузке всё будет корректно работать.

3. Оптимизация компиляции и ещё чего-нибудь.
Так как памяти дофига (8 гигабайт), перенесём /tmp и /var/tmp/portage (там всё собирается) в tmpfs, для чего добавим в /etc/fstab следующие строчки:
tmpfs                   /tmp            tmpfs           defaults        0 0
tmpfs                   /var/tmp/portage                tmpfs           defaults,size=6G       0 0
Возможно, возникнет проблема со сборкой libreoffice - когда в последний раз этим занимался, требовалось почти 6 гигабайт свободного места.
Ну, и в /etc/make.conf следующие параметры:
# количество параллельных потоков сборки
MAKEOPTS="-j3"
# Количество одновременно выполняющих процессов установки/сборки, избавляемся от выхлопа компиляции, выводим подробную информацию перед сборкой по флагам/пакетам.
EMERGE_DEFAULT_OPTS="--jobs=2 --quiet-build=y -v"
# Уменьшаем приоритет, чтобы компиляция не сказывалась на работе системы
PORTAGE_NICENESS="19"

4. Энергосбережение
Тут я почти полность положился на powerdevil из kde. Hibernate мне не требуется, а suspend заработал "из коробки".
Дополнительно я воспользовался этим гайдом.
То есть поставил laptop-mode-tools, acpid и создал ещё один runlevel для работы от батареи. Соотвественно, сейчас, когда отключаюсь из розетки, можно автоматом останавливать/запускать нужные демоны.