Highlighter

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

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

Есть такая замечательная аркадная игра — 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 для работы от батареи. Соотвественно, сейчас, когда отключаюсь из розетки, можно автоматом останавливать/запускать нужные демоны.