суббота, 23 апреля 2011 г.

Приобрел нетбук

Прошло около месяца, как я приобрел подержанный Asus EEE PC 1015P у своего друга за 10 килорублей. Расскажу немного о том что я на него установил и как настроил.


Что мне собственно хотелось:
  • энергосбережение
  • нормальную работу железа нетбука
  • шифрование домашней директории
  • удобную пользовательскую среду

Надеялся на нем попользоваться Arch GNU/Linux, но как разработчика меня пока больше устраивает Gentoo. Поставил и то и другое, но Arch оставил как запасную ОС.

Перед сборкой @system и @world стОит позаботиться о настройках компилятора. В make.conf я прописал:
CHOST="x86_64-pc-linux-gnu"
CFLAGS="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j5 -l5"
EMERGE_DEFAULT_OPTS="-v --jobs=5 --load-average=5.0"
Последние строки означают, что компиляция будет производиться не более чем в 5 потоков и не более 5 пакетов одновременно, в зависимости от текущей нагрузки на процессор.

По поводу энергосбережения написано много чего здесь. Всё железо работает изкоробки™ при правильной настройки ядра (см. gentoo-wiki). Для app-laptop/laptop-mode-tools (не забудьте поставить сервис laptop_mode в загрузку) в /etc/laptop-mode/laptop-mode.conf отмечу кое-какие важные настройки:
BATT_HD_POWERMGMT=254
LM_AC_HD_POWERMGMT=254
NOLM_AC_HD_POWERMGMT=254
MINIMUM_BATTERY_CHARGE_PERCENT=3
HIBERNATE_COMMAND="/usr/local/bin/hibernate"
ENABLE_AUTO_HIBERNATION=1
Первые три строчки нужны для того, что бы винт не щелкал зазря (паркуется читающая бошка, по всей видимости для энергосбережения; у меня powertop не показывает никакой разницы, а значит полезного в этом меньше, чем вредного). Бошка должна парковаться только в случае, если ноут оказался, например, в состоянии невесомости (в преддверии удара об стену или пол). Впрочем можно вообще написать CONTROL_HD_POWERMGMT=0 и что-то вроде hdparm -B 254 /dev/sda 2&>> /dev/null в /etc/local.d/local.start. Последние строчки означают, что надо выполнить гибернацию в жесткий диск при сильно разряженном аккумуляторе и при выключенном питании. Скрипты hibernate и standby выглядят примерно одинаково (основное различие в предпоследней строчке, в standby будет echo -n mem > /sys/power/state):
su sbar -c 'DISPLAY=:0 XAUTHORITY=~sbar/.Xauthority alock -bg image:center,file=/home/sbar/pix/locked.png -cursor theme:name=mini -auth passwd' &
#su sbar -c 'echo disconnect >> /home/sbar/.mcabber/mcabber.fifo'
su sbar -c 'DISPLAY=:0 /usr/bin/gajim-remote change_status offline'
mpc stop
/etc/init.d/alsasound restore
chvt 5
echo -n disk > /sys/power/state
hdparm -B 254 /dev/sda >> /dev/null
Музыка вырубается перед гибернацией и восстанавливаются уровни громкости. Не очень хочется открыть лэптоп на какой-нибудь лекции по физике и всем дать послушать кусок буфера радио "Воруй-убивай". Также экран блочится с помощью x11-misc/alock (собран с поддержкой pam), если конечно запущены иксы.

Скрипт /etc/acpi/default.sh для sys-power/acpid выглядит примерно так:
#!/bin/sh
set $*
group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4
log_unhandled() {
logger "ACPI event unhandled: $*"
}
case "$group" in
button)
case "$action" in
power)
#/sbin/init 0
/usr/local/bin/hibernate
;;
lid)
if [[ $(cat /sys/class/power_supply/BAT0/status) == "Discharging" ]]
then
/usr/local/bin/standby
else
su sbar -c 'DISPLAY=:0 XAUTHORITY=~sbar/.Xauthority alock -bg image:center,file=/home/sbar/pix/locked.png -cursor theme:name=mini -auth passwd' &
fi
;;
*) log_unhandled $* ;;
esac
;;
ac_adapter)
case "$value" in
*) log_unhandled $* ;;
esac
;;
*) log_unhandled $* ;;
esac
Теперь кнопка power переведет в режим гибернации, закрытие крышки при включенном питании просто заблочит экран, а при отключенном еще и переведет в спящий режим в память.

В иксы я вхожу самопальным init-скриптом mydm (он запускает startx для определенного пользователя), не люблю я дисплей-менеджеры (ведь я один пользуюсь этим нетбуком).

Шифрование домашней директории настроил с помощью encfs.
В ~/.bash_profile не зашифрованной директории:
cd ..
sudo encfs --public /home/.$USER /home/$USER -- -o nonempty
cd $USER
source .bash_profile
Теперь автоматически при загрузке запустить иксы нет возможности. Поэтому решено было написать следующий костыль в .bash_profile (в уже зашифрованном и примонтированном home):
[[ -f ~/.bashrc ]] && . ~/.bashrc
if [[ $TERM != screen.linux &&
! $(ps uax | egrep 'X.*:0' | grep $USER | grep -v grep) ]]
then
echo -n '>>> X11 is not running. Run X11 (and GTFO from the shell)? [Y/n] '
read ANSWER
if [[ $ANSWER != n ]]; then
/etc/init.d/mydm restart
exit
fi
fi
Теперь после входа в систему и ввода двух паролей надо нажать Enter для запуска иксов и "n" если нужно просто попасть в шелл. Спрашивать оно будет только если иксы не запущены. Не лишним также будет написать в .bash_logout нечто вроде этого:
if [[ $(who | grep $USER | wc -l) -eq 1 ]]
then
cd ..
(sleep 10 &&
(sudo umount $HOME 2&>> /dev/null) && echo 'home is unmounted'
) &
fi
Теперь при выходе из системы последнего пользователя зашифрованный раздел отмаунтится (в случае если за 10 секунд пользователь не залогинится снова).

В качестве оконного менеджера я использую awesome. После небольшой работы напильником виджета состояния батареи, написания некоторых своих виджетов (например индикатор раскладки клавиатуры на основе x11-apps/skb) — вполне можно пользоваться:
function skb_widget()
p = io.popen("skb -1")
text = p:read()
p:close()
return "[ <b>" .. text .. "</b> ]"
end

Свой конфиг ядра пожалуй оставлю здесь.

P.S.: не знаю почему поехало форматирование всего и вся, но трогать не буду. -___-

среда, 5 января 2011 г.

Купил вебку

Вместо того что бы готовиться к экзаменам, как обычно я занимаюсь какой-то фигнёй. Купил себе вебку (ну надо же себе хоть какой-то подарок на НГ сделать) «Creative WebCam Live! Chat IM» (на коробке написано «Supports USB Video Class (UVC) for Plug & Chat (No CD installation)» и «Works with Mac & Linux»; приятно что такие устройства все-таки выпускают). Включил поддержку UVC в ядре, попробовал повещать свою рожу в интернеты.

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

UPD 15.01.10: Сегодня посмотрел OpenCV. Отлично определяет местоположение моей рожи в пространстве. Жаль только что на моем ущербном железе нереально с этим работать, 1 fps получается при такой нагрузке на проц. :(