суббота, 27 апреля 2013 г.

Установка Google Chrome в Ubuntu 13.04 Raring Ringtail

Следующий фейл на который я наткнулся настраивая свежеустановленную Ubuntu 13.04: при попытке установить пакет Google Chrome скаченный с официального сайта dpkg выдал мне следующее:


# dpkg -i google-chrome-stable_current_i386.deb
Выбор ранее не выбранного пакета google-chrome-stable.
(Чтение базы данных … на данный момент установлено 162428 файлов и каталогов.)
Распаковывается пакет google-chrome-stable (из файла google-chrome-stable_current_i386.deb) …
dpkg: зависимости пакетов не позволяют настроить пакет google-chrome-stable:
 google-chrome-stable зависит от libudev0 (>= 147), однако:
  Пакет libudev0 не установлен.

dpkg: ошибка при обработке параметра google-chrome-stable (--install):
 проблемы зависимостей — оставляем не настроенным
Обрабатываются триггеры для bamfdaemon …
Rebuilding /usr/share/applications/bamf-2.index...
Обрабатываются триггеры для desktop-file-utils …
Обрабатываются триггеры для gnome-menus …
Обрабатываются триггеры для man-db …
При обработке следующих пакетов произошли ошибки:
 google-chrome-stable

Причем apt-get -f install никак не решал проблемы. dpkg просто напросто сообщал о неразрешимой зависимости и предлагал удалить пакет google-chrome-stable. Гугление на просторах интернета помогло найти следующее решение:
После этого все установилось и завелось:
# dpkg -i libudev0_175-0ubuntu19_i386.deb
Выбор ранее не выбранного пакета libudev0:i386.
(Чтение базы данных … на данный момент установлено 162533 файла и каталога.)
Распаковывается пакет libudev0:i386 (из файла libudev0_175-0ubuntu19_i386.deb) …
Настраивается пакет libudev0:i386 (175-0ubuntu19) …
Обрабатываются триггеры для libc-bin …
ldconfig deferred processing now taking place

# dpkg -i google-chrome-stable_current_i386.deb
(Чтение базы данных … на данный момент установлено 162538 файлов и каталогов.)
Подготовка к замене пакета google-chrome-stable 26.0.1410.63-r192696 (используется файл google-chrome-stable_current_i386.deb) …
Распаковывается замена для пакета google-chrome-stable …
Настраивается пакет google-chrome-stable (26.0.1410.63-r192696) …
update-alternatives: используется /usr/bin/google-chrome для предоставления /usr/bin/x-www-browser (x-www-browser) в автоматический режим
update-alternatives: используется /usr/bin/google-chrome для предоставления /usr/bin/gnome-www-browser (gnome-www-browser) в автоматический режим
Обрабатываются триггеры для bamfdaemon …
Rebuilding /usr/share/applications/bamf-2.index...
Обрабатываются триггеры для desktop-file-utils …
Обрабатываются триггеры для gnome-menus …
Обрабатываются триггеры для man-db …

Возвращаем системный трей в Ubuntu 13.04 Raring Ringtail

Сегодня решил поставить Ubuntu 13.04 и полюбоваться что же изменилось с версии 12.04. Все в принципе осталось на своих местах, добавили плюшек в Dash, подправили иконки, переработали Nautilus. В общем-то на первый взгляд все хорошо, Ubuntu верной дорогой идет к обычным пользователям, все упрощается. Но! Мы то с вами не обычные пользователи, а очень даже продвинутые! ;) Нам подавай все и вся! Естественно очередные правки убунтовских разработчиков не могли не коснуться такой вещи как "системный трей".
Те кто сталкивался с Unity наверняка знают что по умолчанию системный трей отключен и такие приложения как: keepassx, clip2net, opera и остальные не будут показывать себя на панели. В Ubuntu 12.04 это решалось командой:

# gsettings set com.canonical.Unity.Panel systray-whitelist "['all']"

И трей волшебный образом возвращался на место. В 13.04 данная команда выдаст ошибку. Разработчики полностью выпилили эту полезную фичу. Порыскав по интернету наткнулся на багрепорт негодования по этому поводу: https://bugs.launchpad.net/ayatana-design/+bug/974480
Там я нашел решения от товарища Максима Лопарева, за что ему огромное спасибо! Все действия сводятся к установке пропатченного Unity из этого ppa: https://launchpad.net/~timekiller/+archive/unity-systrayfix

# add-apt-repository ppa:timekiller/unity-systrayfix
# apt-get update && apt-get upgrade

Обновляем пакет unity, разлогиниваемся, заходим и возвращаем трей:

# gsettings set com.canonical.Unity.Panel systray-whitelist "['all']"

Не знаю что курят и чем думают разработчики Ubuntu, но такие обновления честно говоря не очень радуют.

Подключение к Wi-Fi точке доступа через прокси

Привет всем! Понадобилось тут на днях настроить сеть вот таким образом
Почему именно такая конфигурация спросите вы? Почему нельзя сразу подключиться к Wi-Fi AP (Wi-Fi Access Point) без использования "proxy laptop"? Отвечаю:

  1. Появился свободный ноут, плюс я стал обладателем мощного Wi-Fi адаптера TP-LINK TL-WN7200ND, захотелось напрячь их обоих :)
  2. Получить возможность гибкого управления трафиком.
  3. Увеличить область действия Wi-Fi сигнала и получить возможность подключаться к тем точкам доступа, которые недосягаемы для машины "laptop1".
  4. Ну и конечно же, просто спортивный интерес. Знание - сила! ;)
Порыскав по инету я не нашел полноценный мануал как настроить такую конфигурацию. Итак, преступим. Что нам понадобится для работы данной конфигурации:

  • ОСь. Я выбрал Ubuntu 10.04 LTS; 
  • hostapd. Демон создающий программную точку доступа с поддержкой WPA/WPA2; 
  • DHCP-сервер;
  • squid. Собственно сам прокси.
Начнем с hostapd. В репах 10.04 находится версия 0.6. Сразу скажу, что нам понадобится версия 0.7 или выше, т.к. 0.6 мне так и не удалось завести на своем железе. Добавляем ppa с версией 0.7:

# add-apt-repository ppa:aspeed/ppa
# apt-get update
# apt-get install hostapd

Теперь настраиваем точку доступа. Это минимальный конфиг с которым можно поднять AP:

# nano /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=proxyap
hw_mode=g
channel=11
# Включить только WPA2 (1 - WPA, 2 - WPA2, 3 - WPA + WPA2)
wpa=2
wpa_passphrase=myappass

Теперь пробуем запустить:

# hostapd -d /etc/hostapd/hostapd.conf

Если в выводе есть строка:

wlan0: Setup of interface done.

Значит AP поднялась. Пробуем сканировать эфир с другой машины и видим нашу точку доступа "proxyap". Быстро просканировать можно командой:

# iwlist wlan0 scan | grep 'proxyap'

Теперь необходимо запустить DHCP-сервер для автоматического назначения IP-адресов клиентам нашей AP. Ставим его:

# apt-get install dhcp3-server

Теперь отредактируем и раскомментим секцию "subnet" в dhcpd.conf:

# nano /etc/dhcp3/dhcpd.conf
subnet 10.10.0.0 netmask 255.255.255.0 {
 option routers 10.10.0.1;
 option domain-name-servers 8.8.8.8;
 range 10.10.0.25 10.10.0.50;
 interface wlan0;
}

Мы создаем подсеть 10.10.0.x и разрешаем раздать клиентам до 25 IP-шников.
Теперь редактируем /etc/default/dhcp3-server:

# nano /etc/default/dhcp3-server
INTERFACES="wlan0"

Теперь сконфигурируем нашу сеть:

# ifconfig wlan0 down
# ifconfig wlan0 10.10.0.1 netmask 255.255.255.0 up
# ifconfig wlan0 up

Можно запускать DHCP и hostap:

# service dhcp3-server start
# service hostapd start

Проверим все ли запустилось:

# ps aux | egrep '(hostap|dhcpd)' | grep -v grep

Пробуем подключиться к точке доступа, вводим пасс, ждем пока назначится IP. После подключения убедимся что IP назначился и мы видим прокси-ноут. Эти действия делаем на "laptop1":

# ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 70:f3:95:e4:53:87
inet addr:10.10.0.25 Bcast:10.10.0.255 Mask:255.255.255.0
inet6 addr: fe80::72f3:95ff:fee4:5387/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:137215 errors:0 dropped:0 overruns:0 frame:0
TX packets:139973 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:129062378 (129.0 MB) TX bytes:41828862 (41.8 MB)

# ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=1.09 ms
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=1.05 ms
64 bytes from 10.10.0.1: icmp_req=3 ttl=64 time=1.04 ms
64 bytes from 10.10.0.1: icmp_req=4 ttl=64 time=1.08 ms

Теперь завершающий шаг. Установка и настройка прокси-сервера:

# apt-get install squid
# nano /etc/squid/squid.conf

Раскомментируем эти строки:

http_port 3128 transparent # в конце обязательно добавляем 'transparent'
cache_dir ufs /var/spool/squid 100 16 256
acl localnet 10.10.0.0/24
http_access localnet
dns_nameservers 8.8.8.8 8.8.4.4

Остальное оставляем как есть. На данном этапе необходимо настроить сетевые правила и направить трафик приходящий в wlan0 на wlan1. Для этого добавим правила:

# iptables -t nat -A PREROUTING -i wlan0 -d ! 10.10.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 10.10.0.1:3128
# iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o wlan1 -j MASQUERADE

И не забываем включить IP Forwarding для включения проброса трафика на другую сетевуху:

# echo 1 > /proc/sys/net/ipv4/ip_forward

Вот и все. Для удобства пользования прокси-ноутом я убрал из автозагрузки все установленные нами демоны:

# update-rc.d dhcp3-server disable
# update-rc.d hostapd disable

И создал скрипт для поднятия dhcp+hostap+squid и настройки iptables:

#!/bin/sh
service squid stop
service hostapd stop
service dhcp3-server stop
ifconfig wlan0 down
ifconfig wlan0 10.10.0.1 netmask 255.255.255.0 up
ifconfig wlan0 up
echo 1 > /proc/sys/net/ipv4/ip_forward
service dhcp3-server start
service hostapd start
service squid start
iptables -t nat -F
iptables -t nat -A PREROUTING -i wlan0 -d ! 10.10.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 10.10.0.1:3128
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o wlan1 -j MASQUERADE

The end.

Добавление мультиязычности в плагин scrollGallery для WordPress


Занимался тут на днях своим второстепенным проектом, и появилась необходимость добавить что-то наподобие "горизонтальной галереи". Вот такого плана (http://www.pikachoose.com/):


Порыскав в вордпрессовских плагинах, нашел подходящее решение, называется оно: NextGEN Scroll Gallery. Все работало как по маслу. Единственный минус - плагин не дружит с мультиязычностью. Пришлось его немного под рихтовать.

Для работы сайта с несколькими языками я использую плагины qTranslate и CodeStyling Localization. На этом месте я хочу немного подробнее остановиться и поделиться своими впечатлениями от работы плагинов обеспечивающих мультиязычность.

qTranslate

Данный плагин очень мощный, предлагает много фич для обеспечения мультиязычности. НО, имеет очень критический и очень утомляющий баг - проблема с дублированием\перемешиванием текста на разных языках (http://www.qianqin.de/qtranslate/forum/viewtopic.php?f=3&t=2841). Это просто ужас какой-то. Суть в том, что если у вас текст довольно большой и имеет "насыщенное" форматирование, то после сохранения поста и вновь зайдя в режим редактирования вы получите кашу в одном из языков, а в других возможно пусто (а может и нет), как повезет:



Вплоть до версии 2.5.29 данный баг не пофикшен :(
Еще пришлось попариться с украинским языком, т.к. автоматом скачиваться из интерфейса плагина он не хотел. Подсунул ему файлы языков из украинской сборки вордпресса.
В остальном - все гуд.

CodeStyling Localization

Обязательно(!!!) поставьте этот плагин, если захотите подправить переводы в различных плагинах, а также ядра WP. Он избавит вас от геморроя при ручном редактировании переводов (файлов *.mo и *.po) и использования стороннего софта. Единственный недостаток - периодические глюки при подгрузке переводов на определенном языке, особенно если там их очень много. Мне к примеру так и не удалось полностью просмотреть немецкий языковой файл WP.
Данный плагин сберег кучу времени и нервов при доработке мной перевода NextGEN Gallery на украинский.

Правим scrollGallery

В общем капли ненависти и добра я добавил. Займемся главным - адаптации scrollGallery к мультиязычности.

1. Переходим в редактор кода плагинов:

2. Ищем функцию

nggSGShow():function nggSGShow($sgconfig, $pictures = null, ...) {

3. Чуть ниже видим код:

$aux["title"] = stripslashes($picture->alttext); // $picture->alttext;
$aux["desc"] = $picture->description;

4. Меняем его на:

$aux["title"] = stripslashes(__(html_entity_decode($picture->alttext, ENT_NOQUOTES))); // $picture->alttext;
$aux["desc"] = __(html_entity_decode($picture->description, ENT_NOQUOTES));

Вот и все. Сохраняем.

Теперь при заполнении заголовка изображения или его описания, можно вводить qTranslate'овские шорткоды:



Пример можно посмотреть здесь: http://museum-gallery.org/, кликая по фоткам scrollGallery на разных языках.

HowTo: Конвертируем DjVu > PDF в Linux


Понадобилось тут переконвертировать книгу из DjVu в PDF для отправки ее в Amazon Kindle. Решение нашлось довольно быстро:

# apt-get install djvulibre-bin
$ djvups mybook.djvu mybook.ps
$ ps2pdf mybook.ps

CookieWebUser


Хочу представить общественности свой Yii компонент для управления пользовательской аутентификацией.

  • От стандартного CWebUser'а отличается тем, что для хранения инфы используются только куки (никакие серверные хранилища ($_SESSION, memcache и т.п.) не используются).
  • Все данные сохраняющиеся в куку запаковываются в JSON + Base64.
  • Для проверки подлинности куки используется контрольная сумма.
Использовал данный компонент в одном HighLoad-проекте. Жалоб не поступало :)

GitHub
https://github.com/andser/CookieWebUser

HP Pavilion dv6-3155sr и Kubuntu


Привет всем!

Сегодня я покажу как увеличить время автономной работы на примере ноутбука HP Pavilion dv6-3155sr. Ноутбук имеет 2 видеокарты: встроенную (Intel GMA HD 3000) и дискретную (ATI Mobility Radeon HD 5650M). Под виндой эти видеокарты переключаются между собой при подключении к сети и отключении от нее. Но сначала небольшая прелюдия :)

С момента покупки ноута - работал в винде. В связи с тем что я занимаюсь веб-разработкой да и вся работа заточена под Linux - необходимо постоянно иметь настроенную для этого дела среду. До этого момента все время пользовался виртуалкой от VMWare, но последнее время все большие тормоза в ней начали надоедать (да, знаю про всякие тюнинги, улучшайзинги, но все они мало помогали). С этого момента решил поставить рядом с виндой Ubuntu 11.10. Обычно я юзаю только LTS-релизы, но в текущем 10.04 - очень плохая поддержка Wi-Fi и переключаемой графики для этого ноута, да и общая работа системы не радовала. Хотелось иметь максимально возможную поддержку оборудования. В общем терпеть до 12.04 больше сил не хватило - поставил 11.10. Вот так :)

Короче хватит трепа, перейдем к основной задаче. Итак, чего мы хотим добиться:

  1. Иметь возможность отключить дискретную графику (в связи с тем что линух мне нужен только для работы, поэтому дискретная графика не нужна).
  2. Максимально возможное время автономной работы.
  3. Автоматизировать переключение между режимами.

Отключаем дискретную графику

Сначала необходимо узнать распознала ли система наши видяхи:

# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor

Integrated Graphics Controller (rev 02) 01:00.0 VGA compatible controller: ATI Technologies Inc Madison
[AMD Radeon HD 5000M Series] (rev ff)


Как видно, мои карточки успешно подхватились. Никаких дополнительных манипуляций после установки системы я не производил. Хочу отметить, что переключение между картами (а также их отключение) работает, только если в ядре включен флаг vga_switcheroo. Это можно проверить командой:

# grep -i switcheroo /boot/config-3.*
/boot/config-3.0.0-12-generic:CONFIG_VGA_SWITCHEROO=y
/boot/config-3.0.0-16-generic:CONFIG_VGA_SWITCHEROO=y


Также данный флаг работает только с опенсорсными дровами (radeon - для ATI'шных видеокарт и nouveau - для NVIDIA'вских). С проприетарными дровами nvidia и fglrx работать эта фича не будет.

И последний тест того что vga_switcheroo работает:

# ls -l /sys/kernel/debug/vgaswitcheroo/switch
-rw-r--r-- 1 root root 0 2012-02-26 13:02 /sys/kernel/debug/vgaswitcheroo/switch

Итак, все что нужно для переключения видеокарт - работает.

Теперь проверим какая видеокарта сейчас работает:

# cat /sys/kernel/debug/vgaswitcheroo/switch
0:IGD: :Pwr:0000:00:02.0
1:DIS:+:Pwr:0000:01:00.0


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

"Pwr" означает, что видеокарта подключена, "+" - видеокарта используется в данный момент.

Нам необходимо полностью отключить дискретную видеокарту и использовать интегрированную. Делаем следующее:

# echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch

Переключение видеокарты происходит только после рестарта сессии X-Window. Это можно сделать просто выходом и текущего сеанса, и войти снова. Но у меня даже после этого переключение не происходило, помогал только рестарт системы. В итоге мы получаем такую картину:

# cat /sys/kernel/debug/vgaswitcheroo/switch
0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Off:0000:01:00.0


Дабы закрепить результат, чтобы настройки применялись при каждом запуске системы добавим пару команд в /etc/rc.local перед командой exit 0:

# nano /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
echo IGD > /sys/kernel/debug/vgaswitcheroo/switch
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
exit 0


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

Увеличиваем время автономной работы

Есть такой очень полезный ресурс: LessWatts.org

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

Тюнинг планировщика ядра

В линуксовых ядрах выше 2.6.18 планировщик имеет одну полезную для энергосбережения опцию, а именно: sched_mc_power_savings

# cat /sys/devices/system/cpu/sched_mc_power_savings 0

Значение в файле sched_mc_power_savings может быть равно 0 или 1. Значение по умолчанию — 0. При установленном параметре "1" планировщик попытается загрузить работой наименьшее возможное количество ядер, чтобы остальные оставались свободны. Другими словами, если каждый процессор немного загружен, sched_mc_power_savings старается сконцентрировать эту работу на минимально возможном количестве процессоров. Это в свою очередь даёт возможность чуть дольше "передохнуть" некоторым процессорам, что экономит энергию, особенно если процессор поддерживает какие-либо режимы глубокого сна, например, режимы C (режим "почти полного бездействия". Подробнее читайте здесь), которые потребляют в простое крайне малое количество энергии. Итоговая экономия может зависеть от многих факторов, включая то, какое количество процессоров доступно в системе и какой из регуляторов работает. При установленном значении "0" планировщик не действует.

Настройка регуляторов частоты ЦП

Чтобы по максимуму использовать энергосбережение процессора и иметь возможность регулировать частоту его работы в реальном времени, в ядрах 2.6.18 и выше реализована подсистема CPUfreq, которая и позволяет динамически изменять данный параметр. Чтобы узнать поддержку, воспользуемся командой:

# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors conservative ondemand userspace powersave performance

Как видим предусмотрено 5 разных регуляторов:

performance
Данный регулятор настраивает процессор на максимально высокую частоту независимо от нагрузки.

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

conservative
Регулятор conservative впервые появился в ядре версии 2.6.12, он базируется на регуляторе ondemand. Он тоже динамически настраивает частоты в зависимости от загрузки процессора, однако ведёт себя немного по-другому и даёт возможность увеличивать мощность постепенно. Регулятор conservative проверяет процент использования процессора и в случае, если значение выходит за нижний или верхний порог, постепенно повышает или понижает частоту до следующей возможной, вместо того чтобы сразу установить наивысшую частоту, как это делает регулятор ondemand.

userspace
Ручная настройка частоты.
powersave
Регулятор powersave, в противоположность performance'у, статически настраивает процессор на самую низкую из доступных частот. В нем также можно настроить диапазон доступных частот. Назначение его – постоянная работа на самой низкой из возможных частот. Очевидно, что в этом случае на производительность влияет тот факт, что система никогда не будет использовать более высокую частоту, независимо от степени занятости процессора(ов).
На практике этот регулятор часто не дает экономии энергии, поскольку самая большая экономия достигается за счет использования режимов C-state (режим "почти полного бездействия". Подробнее читайте здесь). Использование регулятора powersave увеличивает время работы процесса, поскольку он будет использовать наименьшую частоту; в результате система дольше не перейдет в состояние простоя и потому не получит экономию от вхождения в режим C-state.

В данном ноуте установлен Intel Core i5-460M, который имеет 2 реальных и 4 логических ядра, поэтому у меня конфигурация такая:

# ls -l /sys/devices/system/cpu/ | grep cpu.$
drwxr-xr-x 7 root root 0 2012-02-26 15:34 cpu0
drwxr-xr-x 7 root root 0 2012-02-26 15:34 cpu1
drwxr-xr-x 7 root root 0 2012-02-26 15:34 cpu2
drwxr-xr-x 7 root root 0 2012-02-26 15:34 cpu3


Мы будем использовать регулятор ondemand:

# echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
# echo ondemand > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor
# echo ondemand > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor

Энергосбережение для SATA-устройств

В ядрах выше 2.6.25 появилась возможность включать энергосберегающий режим для SATA-интерфейсов (ALPM - Aggressive Link Power Management), когда на них долгое время не производятся операции ввода\вывода.

Чтобы проверить возможность управления питанием SATA-интерфейсов, выполним команду:

# cat /sys/class/scsi_host/host0/link_power_management_policy
max_performance


link_power_management_policy может принимать 2 значения: max_performance и min_power.

В данном ноуте аж 6 штук SATA'шных интерфейсов:

# ls -l /sys/class/scsi_host/ | grep host.$
lrwxrwxrwx 1 root root 0 2012-02-26 15:34 host0 -> ../../devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0
lrwxrwxrwx 1 root root 0 2012-02-26 15:34 host1 -> ../../devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1
lrwxrwxrwx 1 root root 0 2012-02-26 15:34 host2 -> ../../devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2
lrwxrwxrwx 1 root root 0 2012-02-26 15:34 host3 -> ../../devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3
lrwxrwxrwx 1 root root 0 2012-02-26 15:34 host4 -> ../../devices/pci0000:00/0000:00:1f.2/host4/scsi_host/host4
lrwxrwxrwx 1 root root 0 2012-02-26 15:34 host5 -> ../../devices/pci0000:00/0000:00:1f.2/host5/scsi_host/host5


И для всех можно установить режим энергосбережения.

Энергосбережение для звуковых карт Intel HDA (High Definition Audio)

Проверить наличие такой возможности можно командой:

# ls -l /sys/module/snd_hda_intel/parameters/power_save
-rw-r--r-- 1 root root 4096 2012-02-26 15:34 /sys/module/snd_hda_intel/parameters/power_save


power_save может иметь значение "0" (энергосбережение выключено) или больше. Обычно используют значения "0" или "10".

Оптимизация дисковой подсистемы

dirty_ratio
Максимальный размер памяти для хранения данных которые будут в итоге записаны (сброшены) на диск. Чем выше значение, тем реже производится запись.# cat /proc/sys/vm/dirty_ratio 10
Значение "10" можно ставить при работе от сети и "90" - при работе от батареи.

dirty_background_ratio
Минимальный размер памяти где будут храниться данные перед записью на диск. Желательно выставлять намного меньше чем dirty_ratio.# cat /proc/sys/vm/dirty_background_ratio 5
При работе от сети - "5", при работе от батареи - "1".

dirty_writeback_centisecs
Как часто ядро должно проверять есть ли данные для записи на диск. Чем выше значение, тем реже используется диск для записи данных.

# cat /proc/sys/vm/dirty_writeback_centisecs 500

Я ставлю "500" - при работе от сети и "60000" при работе от батареи.
Энергосбережение для PCI Express

# cat /sys/module/pcie_aspm/parameters/policy
[default] performance powersave


Начиная с версий ядер 2.6.39 данную нельзя менять, но это можно обойти, включив опцию ядра pcie_aspm:

# nano /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0 #GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT=10 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pcie_aspm=force"
.....


ВНИМАНИЕ!!! Обязательно убедитесь, что ваш PCI Express может менять режимы и имеет такую функциональность. Если не уверены - лучше не менять.

В данном ноутбуке такая функциональность предусмотрена, поэтому после перезагрузки можем менять режимы:

# echo default > /sys/module/pcie_aspm/parameters/policy
# echo powersave > /sys/module/pcie_aspm/parameters/policy
# echo performance > /sys/module/pcie_aspm/parameters/policy

Автоматизируем...

В Убунте есть один прекрасный скрипт который выполняется при переключении режимов. Он лежит здесь:

# cat /etc/acpi/power.sh
#!/bin/sh
test -f /usr/share/acpi-support/key-constants || exit 0
. /usr/share/acpi-support/policy-funcs
if [ -z "$*" ] && ( [ `CheckPolicy` = 0 ] || CheckUPowerPolicy ); then
  exit;
fi
pm-powersave $*


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

#!/bin/sh
if on_ac_power; then
 echo 0 > /proc/sys/vm/laptop_mode
 echo 10 > /proc/sys/vm/dirty_ratio
 echo 5 > /proc/sys/vm/dirty_background_ratio
 echo 500 > /proc/sys/vm/dirty_writeback_centisecs
 echo 0 > /sys/module/snd_hda_intel/parameters/power_save
 echo max_performance > /sys/class/scsi_host/host0/link_power_management_policy
 echo max_performance > /sys/class/scsi_host/host1/link_power_management_policy
 echo max_performance > /sys/class/scsi_host/host2/link_power_management_policy
 echo max_performance > /sys/class/scsi_host/host3/link_power_management_policy
 echo max_performance > /sys/class/scsi_host/host4/link_power_management_policy
 echo max_performance > /sys/class/scsi_host/host5/link_power_management_policy
 echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
 echo ondemand > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor
 echo ondemand > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
 echo default > /sys/module/pcie_aspm/parameters/policy
 echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
else
 echo 5 > /proc/sys/vm/laptop_mode
 echo 90 > /proc/sys/vm/dirty_ratio
 echo 1 > /proc/sys/vm/dirty_background_ratio
 echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
 echo 10 > /sys/module/snd_hda_intel/parameters/power_save
 echo min_power > /sys/class/scsi_host/host0/link_power_management_policy
 echo min_power > /sys/class/scsi_host/host1/link_power_management_policy
 echo min_power > /sys/class/scsi_host/host2/link_power_management_policy
 echo min_power > /sys/class/scsi_host/host3/link_power_management_policy
 echo min_power > /sys/class/scsi_host/host4/link_power_management_policy
 echo min_power > /sys/class/scsi_host/host5/link_power_management_policy
 echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
 echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
 echo ondemand > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor
 echo ondemand > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
 echo powersave > /sys/module/pcie_aspm/parameters/policy
 echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
fi

test -f /usr/share/acpi-support/key-constants || exit 0

. /usr/share/acpi-support/policy-funcs

if [ -z "$*" ] && ( [ `CheckPolicy` = 0 ] || CheckUPowerPolicy ); then
 exit;
fi

pm-powersave $*


На всякий случай делаем:

# chmod +x /etc/acpi/power.sh

Напоследок могу посоветовать очень полезную тулзу powertop с помощью которой вы можете еще более тоньше оптимизировать работу своей системы.

И вот некоторые доказательства полезности данных манипуляций. Вот что было до оптимизации:

А это после:
Результат налицо! :)

HowTo: Исправление подвисания SSH


Подвисает SSH? Это легко исправить.
В /etc/ssh/sshd_config добавляем такие строки:

TCPKeepAlive yes
ClientAliveInterval 120

И не забываем перезапустить SSH:

# /etc/init.d/ssh restart

HowTo: Исправление медленной загрузки файлов в Total Commander

Столкнулся с медленной загрузкой файлов по FTP Total Commander'ом, причем ситуация одинакова для любых FTP-серверов. Чтобы исправить данную проблему необходимо сделать следующее:
В C:\Program Files (x86)\Total Commander\wcx_ftp.ini добавляем:

[General]
UploadBlockSize=32768

Управление удаленными ветками в Git репозитории


Сегодня копался в проекте и заметил, что локальные ссылки на remote-ветки, которые были удалены другими разработчиками не очищаются локально, даже после "git fetch", "git pull", "git pull --all". Покопавшись в доках Git нашел следующее решение:

$ git branch -d mybranch
$ git push origin :mybranch
$ git remote prune origin


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

$ git remote prune origin --dry-run

Настройка оповещателя о push в Git репозиторий

Всем привет! В прошлом посте (Настройка Git для разработки на сервере и клиенте) я рассказал как развернуть Git на сервере и клиенте. Теперь у нас есть готовая система контроля версий которая поможет нам в разработке. При работе с любой системой иногда (или всегда :) хочется расширить ее функциональность, добавить что-то нужное, то что может облегчить нам работу.

Этот пост о том как можно улучшить Git, а именно добавить функционал оповещателя о push в удаленный репозиторий.

Настройка Git для разработки на сервере и клиенте


Сегодня я расскажу как установить Git на сервере и клиенте. На клиентской машине установлена Ubuntu 10.04 LTS, на сервере - Debian 6 x86-64.