После того как Linux научился сообщать о не прочитанных сообщениях электронной почты настало время научить его информировать о погоде за окном.

В этом может помочь пакет weather-util:

root@localhost:~$ apt-get install weather-util

После устновки нужно проследовать по адресу weather.noaa.gov и найти METAR (METeorological Aerodrome Report) для своего города. После этого можно узнать погоду из командной строки, например для Самары:

root@localhost:~$ weather --city=Samara --id=UWWW
Current conditions at Samara, Russia (UWWW) 53-12N 050-09E (UWWW)
Last updated Oct 26, 2010 - 12:00 PM EDT / 2010.10.26 1600 UTC
   Temperature: 39 F (4 C)
   Relative Humidity: 86%
   Wind: from the SE (130 degrees) at 4 MPH (4 KT)
   Weather: mist

Осталось написать обработчик который пропарсит вывод команды weather и передаст его на озвучку festival. Я использовал для этого простой shell-скрипт:

#!/bin/bash
 
plural () {
    if (( $1 > 10 ))
    then
        N=$(($1 % 10))
    else
        N=$1
    fi
 
    if (( $N > 10 && $N < 20 ))
    then
        FORM=$2
    else if (( $N > 1 && $N < 5 ))
    then
        FORM=$3
    else if (( $N == 1 ))
    then
        FORM=$4
    else
        FORM=$2
    fi
    fi
    fi
 
    echo $FORM
}
 
 
TMP="/tmp/weather_`/bin/date +%s`"
 
/usr/bin/weather --city=Samara --id=UWWW > $TMP
 
temperature=`cat $TMP |grep Temperature |awk '{print $4}' |sed -e 's/(//g'`
humidity=`cat $TMP |grep Humidity |awk '{print $3}' |sed -e 's/%//g'`
 
echo "Температура воздуха $temperature `plural $temperature градусов градуса градус`
Цельсия. Относительная влажность воздуха $humidity
`plural $humidity процентов процента процент`" | /usr/bin/festival --language russian --tts
 
rm -f $TMP
 
exit 0

Твердотельные накопители становятся все доступнее и занимают все большую часть рынка. Вот и я решил заменить hdd c windows seven своего нетбука Lenovo IdeaPad S10-2 на SSD c Ubuntu Netbook.

В этой записи я собрал нагугленные заметки по оптимизации работы Linux на SSD для рабочей станции.

Разметка диска и файловая система

В первую очередь, нужно забыть про раздел подкачки, все прекрасно работает и без него. Для SSD лучше использовать не журналируемую файловую систему. Журнал нужен для того, чтобы, после пропадании электропитания, восстановить незавершенные транзакции — не потерять данные и оставить ФС целостной. Так как большинство SSD используются в ноутбуках/нетбуках, где присутствует батарея, пропадание электропитания практически невозможно, журнал не нужен. Я использую 100 Мб под /boot с ext2, 20 Гб как / с ext4 и все остальное под /home, так же с ext4. Файловую систему ext4 я выбрал так как она позволяет отключать журнал после создания файловой системы, делается это так:

root@localhost:~$ tune2fs -o journal_data_writeback /dev/sda1
root@localhost:~$ tune2fs -O ^has_journal /dev/sda1
root@localhost:~$ e2fsck -f /dev/sda10

Так же, для увеличения производительности, к опциям монтирования в fstab рекомендуется добавить:

relatime,nodiratime,discard,commit=60

Здесь у некоторых может возникнуть подозрение, что использование noatime эффективнее чем relatime. Это не так, relatime обновляет время доступа только при изменении файла или изменении времени доступа. Это нужно для нормальной работы некоторых программ, в том числе почтовых клиентов. Опция discard включает поддержку TRIM. Так же откладываем до раза в минуту запись изменений на накопитель commit=60.

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

tmpfs	 /tmp           tmpfs	defaults,noatime,mode=1777	0 0
tmpfs	 /var/tmp	tmpfs	defaults,noatime,mode=1777	0 0
tmpfs	 /var/log	tmpfs	defaults,noatime,mode=0755	0 0

I/O планировщик

Планировщик cfq, используемый по умолчанию в большинстве дистрибутивов лучше заманить на noop. Для этого к опциям ядра в конфиге загрузчика нужно добавить:

elevator=noop

Параметры ядра

Включаем «режим ноутбука» для подсистемы виртуальной памяти, в таком режиме, ядро будет откладывать запись на диск, пока в этом не появится неотложная необходимость. Кроме того повысим таймаут между сбросом буферов до 15 секунд:

vm.laptop_mode = 5
vm.dirty_writeback_centisecs = 15000

Firefox & Chrome

Временные файлы мы перенесли в оперативную память, но браузеры хранят свой кеш в домашнем каталоге пользователя, который у нас на SSD. Нужно либо переместить кеш с SSD, либо выключить его. Я выбрал последний вариант.

Для этого в адресной строке Firefox введем about:config и изменим параметр:

browser.cache.disk.enable: false

В Chrome немного сложнее, запретить кеш раз и навсегда нельзя, вместо этого нужно каждый раз запускать браузер с параметром --disk-cache-size=0:

google-chrome --disk-cache-size=0

Или создать alias:

alias google-chrome='google-chrome --disk-cache-size=0'

Кэш пакетных менеджеров

Так же может быть полезным вынести кэш менеджера пакетов в ОЗУ. Для deb-based дистрибутивов нужно добавить в fstab:

tmpfs   /var/cache/apt/archives tmpfs   defaults        	0 0

Для rpm-based дистрибутивов нужно добавить в fstab:

tmpfs   /var/cache/yum tmpfs   defaults        			0 0

UPD20130310: Обновлены обции монтирования, добавлен вынос кеша пакетных менеджеров в ОЗУ.

Тем кто использует такие операционные системы как Gentoo и FreeBSD пакеты ccache и distcc должны быть хорошо знакомы, те кто использует бинарные дистрибутивы так же могли о них слышать.

Ccache — кеш C/C++ компиляторов. При компилировании какого-либо файла вычисляется его хэш, если файл с таким хэшем есть в локальном кеше, то файл не будет повторно компилироваться, вместо этого будет использован файл из кеша. Так как при обновлении программы, как правило, изменяются не все файлы исходного кода, использование кеша позволяет существенно ускорить не только повторную компиляцию программы, но и ее обновлений.

Distcc — позволяет компилировать исходные коды C/C++/ObjC на нескольких компьютерах. Поддерживает кросс-платформенное компилирование. Для отсутствия ошибок в программ скомпилированных посредством distcc на всех компьютерах должна быть установлена одинаковая версия gcc, например 4.3.x, при этом x — может отличаться.

Рассмотрим установку и настройку ccache и distcc в бинарном дистрибутиве, на примере Debian Linux. Некоторые могут сказать, подобные программы в бинарном дистрибутиве не нужны, в общем то это справедливо, но только до тех пор, пока не требуется использование apt-build, make-kpkg и вас полностью устраивает набор ПО и их версий включенных в текущий релиз.

Пакеты ccache и distcc включены в стандартные репозитории Debian, поэтому их установка сводится к выполнению одной команды:

root@localhost:~$ apt-get install ccache distcc

Настройка Ccache

Чтобы начать использовать ccache во время компиляции нужно установить несколько переменных окружения, сделаем это через .profile или .bashrc, добавим такие строки:

export PATH=/usr/lib/ccache:$PATH
export CC="ccache gcc"
export HOSTCC="ccache gcc"
export HOSTCXX="ccache g++"
export CCACHE_DIR="/var/cache/.ccache"

Переменная CCACHE_DIR — устанавливает каталог где хранится кеш C/C++ компиляторов, по умолчанию она равна $HOME/.ccache.

Настройка Distcc

Данная будет полезна только тем у кого в распоряжении есть несколько компьютеров с одной версией gcc, например ПК и ноутбук, или ноутбук или домашний сервер.

Все настройки демона distcc в Debian находятся в файле /etc/default/distcc:

 
STARTDISTCC="true"
 
ALLOWEDNETS="127.0.0.1 192.168.0.0/24"
 
LISTENER="0.0.0.0"
 
JOBS="4"

Число джобов не должно быть больше числа ядер:

root@localhost:~$ cat /proc/cpuinfo |grep processor |wc -l
4

Таким образом следует настроить distcc на каждом хосте. После настройки демонов их нужно запустить:

root@localhost:~$ invoke-rc.d distcc start

Теперь клиентская часть, в .profile или .bashrc, добавим:

export CCACHE_PREFIX="distcc"
export CONCURRENCY_LEVEL=7
export DISTCC_HOSTS="localhost/3 192.168.0.2/2 192.168.0.3/2"

В переменной DISTCC_HOSTS указывается перечень хостов, через слеш указывается максимальное число параллельных задач компиляции которое может быть принято хостом, кроме того, если хост находится не в локальной сети, есть смысл включить lzo-компрессию. Для локальной машины стоит указать число задач на 1 меньше максимального, так как, кроме непосредственно процесса компиляции, она будет обрабатывать задачи отправляемые на удаленные хосты посредством distcc.
Переменная CONCURRENCY_LEVEL устанавливает максимальное число параллельных задач компиляции в момент времени.

На последок, немного практики, соберем ядро Linux 2.6.36 на копьютере с процессором Intel Atom D510:

root@localhost:/usr/src/linux-2.6.36$ time make-kpkg --initrd --revision=atom1 kernel_image
kernel_headers
...
real	64m37.225s
user	135m48.470s
sys	27m38.509s

Подчистим за собой

root@localhost:/usr/src/linux-2.6.36$ make mrproper
root@localhost:/usr/src/linux-2.6.36$ make-kpkg clean

И соберем ядро еще раз:

root@localhost:/usr/src/linux-2.6.36$ time make-kpkg --initrd --revision=atom1 kernel_image
kernel_headers
...
real	21m36.359s
user	31m15.794s
sys	12m5.879s

Статистика ccache выглядит при этом примерно так:

root@localhost:/usr/src/linux-2.6.36$ ccache -s
cache directory                     /var/ccache/.ccache
cache hit (direct)                 17112
cache hit (preprocessed)              18
cache miss                          8624
called for link                      110
unsupported source language          117
unsupported compiler option         4494
no input file                       4224
files in cache                     25844
cache size                           1.5 Gbytes
max cache size                       2.0 Gbytes

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

В качестве плеера используем mpd, благодаря своей клиент-серверной архитектуре он подходит для таких целей идеально. Серверная часть работает как демон, воспроизводит музыку и принимает управляющие команды от клиентского приложения. При этом клиентом может быть графическое GTK/Qt приложение, консольная утилита или веб-интерфейс (есть даже [urlspan]плагин для firefox[/urlspan]). Для использования с консольным сервером наиболее пригоден последний вариант — веб-интерфейс, он позволяет управлять музыкальным центром как с ПК, так и с любого мобильного устройства имеющего браузер и подключение к домашней WiFi-сети.

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

Установим требуемые пакеты:


Все настройки mpd расположены в конфигурационном файле /etc/mpd.conf:
music_directory         "/media/music"
playlist_directory      "/media/playlists"
db_file                 "/var/lib/mpd/db"
 
bind_to_address         "localhost"
port                    "6600"
 
default_permissions     "read,add,control,admin"
 
audio_output {
        type            "alsa"
        name            "My ALSA Device"
        device          "hw:0,0"
        format          "44100:16:2"
        mixer_device    "default"
        mixer_control   "PCM"
        mixer_index     "0"
}
 
audio_output {
        type            "shout"
        name            "My Shout Stream"
        host            "localhost"
        port            "8000"
        mount           "/stream.ogg"
        password        "secret"
        bitrate         "128"
         protocol       "icecast2"
        user            "source"
        description     "My Stream"
        timeout         "2"
}
 
mixer_type              "software"
 
filesystem_charset      "UTF-8"

В приведенной конфигурации управление mpd возможно только с локального компьютера, именно поэтому разрешены все команды без пароля. После указания music_directory попросим mpd принудительно обновить базу данных аудио-файлов:

root@localhost:~$ invoke-rc.d mpd stop
root@localhost:~$ mpd --create-db

Пока база создается, скачаем и установим веб-интерфес для mpd. К сожалению проект pitchfork мертв, из живых мне больше всего понравился ExtJS MPD.

root@localhost:~$ cd /var/www
root@localhost:/var/www$ wget http://crsw.dk/Projects/Mpd/ExtMPD_1.3.tgz
root@localhost:/var/www$ tar xfv ExtMPD_1.3.tgz
root@localhost:/var/www$ chmod -R www-data: ExtMPD

Этого достаточно чтобы открыв в браузере http://<ip сервера>/ExtMPD/ увидеть примерно следующее:

Осталось настроить сервер потокового мультимедиа в лице icecast. Для этого в файле /etc/icecast2/icecast.xml исправим следующее:

    <authentication>
        <!-- Sources log in with username 'source' -->
        <source-password>secret</source-password>
        <!-- Relays log in username 'relay' -->
        <relay-password>secret</relay-password>
 
        <!-- Admin logs in with the username given below -->
        <admin-user>admin</admin-user>
        <admin-password>secret</admin-password>
    </authentication>
...
    <listen-socket>
        <port>8000</port>
        <bind-address>0.0.0.0</bind-address>
    </listen-socket>

Чтобы изменения вступили в силу, рестартуем icecast:

root@localhost:~$ invoke-rc.d icecast2 restart

После этого аудио поток будет доступен по адресу http://<ip сервера>:8000/stream.ogg. Приятного прослушивания!

Для исключения из обновления пакетов

 
echo "packageName hold" | dpkg --set-selections
echo "lighttpd hold" | dpkg --set-selections

 

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

Выведем все ядра, которые присутствуют в системе:

$ dpkg -l | grep linux-image
ii linux-image-2.6-686  2.6.32+28  Linux 2.6 for modern PCs (meta-package)
ii  linux-image-2.6.26-2-686  2.6.26-26lenny1  Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4
ii  linux-image-2.6.32-5-486  2.6.32-29 Linux 2.6.32 for old PCs
ii  linux-image-2.6.32-5-686  2.6.32-29 Linux 2.6.32 for modern PCs

Последняя строчка – текущее ядро, т.е. 2.6.32-5-686. Остальные можно удалять.
Удаляем ядро:

$ aptitude purge linux-image-2.6.26-2-686

Вторым шагом уничтожаем ненужные заголовки. Делаем по аналогии:

$ dpkg -l | grep linux-headers
ii  linux-headers-2.6.32-5-686  2.6.32-29 Header files for Linux 2.6.32-5-686
ii  linux-headers-2.6.32-5-common 2.6.32-29 Common header files for Linux 2.6.32-5

Соответственно удаляем ненужные заголовки, если они есть (у меня их нет, поэтому здесь просто показываю пример команды для их удаления):

$ aptitude purge linux-headers-2.6.32-24 linux-headers-2.6.32-24-generic

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

$ update-grub