tag:blogger.com,1999:blog-2835745767760996582024-03-27T07:56:10.789+03:00Немного о linuxAnonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.comBlogger41125tag:blogger.com,1999:blog-283574576776099658.post-53061651528717871532014-05-06T16:05:00.001+03:002014-05-06T16:05:16.553+03:00Apache. В error_log - пусто, в access_log - 500 для mod_wsgi<div dir="ltr" style="text-align: left;" trbidi="on">
Нужно добавить логирование в wsgi файл<br />
<br />
import logging, sys<br />
logging.basicConfig(stream=sys.stderr)<br />
<div>
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-83171369059192822432013-11-22T14:36:00.003+03:002013-11-22T14:36:25.312+03:00Виснет yum на Running Transaction Test<div dir="ltr" style="text-align: left;" trbidi="on">
Возникла проблема на одном из серверов. При запуске yum он вис после вывода надписи Running Transaction Test. Пробему решал следующим образом: для локализации проблемы запустил через strace<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">strace yum install zabbix-agent</span><br />
<br />
После этого увидел место "затыка"<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">stat("/dev/pts", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0</span><br />
<span style="font-family: Courier New, Courier, monospace;">stat("/dev/shm", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=40, ...}) = 0</span><br />
<span style="font-family: Courier New, Courier, monospace;">stat("/proc/sys/fs/binfmt_misc", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0</span><br />
<span style="font-family: Courier New, Courier, monospace;">stat("/var/lib/nfs/rpc_pipefs", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0</span><br />
<span style="font-family: Courier New, Courier, monospace;">stat("/nfs", </span><br />
<br />
Как видим, он виснет на обращении к /nfs, куда был примонтирован каталог с другого сервера. Отмонтировав его, я решил проблему.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">umount -l /nfs</span></div>
Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-23549152380257519462013-08-01T15:17:00.000+03:002013-08-01T15:17:10.840+03:00О старых mysql <div dir="ltr" style="text-align: left;" trbidi="on">
В отличии от документации, запрос к Mysql 5.0 вида<br />
CREATE INDEX time ON table1 (start_time, end_time) USING BTREE;<br />
не выполнится и выдаст следующую ошибку:<br />
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE' at line 1<br />
<br />
Для того, чтобы оно работало, нужно делать так:<br />
CREATE INDEX time USING BTREE ON table1 (start_time, end_time);</div>
Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-83351219357297511802012-09-13T16:16:00.001+03:002012-09-13T16:16:56.293+03:00Запускаем Unity под Archlinux<div dir="ltr" style="text-align: left;" trbidi="on">
Многие недовольны развитием десктопного линукса. А мне вот нравится Unity из ubuntu. Вот только в убунте всё настолько запатчено, что очень тяжело завести на других дистрибутивах.<br />
<br />
Однако нашлись люди, которые пропатчили все зависимости и сделали репозиторий.<br />
Есть два способа поставить unity - собрать самому или поставить готовый из репозитория. Я бы рекомендовал собирать самому, так как проблемы фиксятся быстрей. Но можно и из репозитория, а потом пересобрать пакеты, с которыми возникли проблемы.<br />
<br />
Вот адреса репозиториев:<br />
<br />
[unity]<br />
Server = http://unity.xe-xe.org/$arch<br />
<br />
[unity-extra]<br />
Server = http://unity.xe-xe.org/extra/$arch<br />
<br />
Добавляем это в /etc/pacman.conf и устанавливаем.<br />
<br />
pacman -Suy<br />
pacman -S $(pacman -Slq unity)<br />
<br />
Естественно, придётся заменить ряд системных пакетов (вроде xorg-server) на патченные.<br />
Ещё бы я порекомендовал установить lightdm-ubuntu для запуска.<br />
<br />
Собрать можно, используя репозиторий с гитхаба.<br />
<br />
git clone git://github.com/chenxiaolong/Unity-for-Arch<br />
<br />
После этого читаем README и собираем/устанавливаем в правильном порядке.<br />
Если хочется, то можно это просто автоматизировать.<br />
<pre class="brush: bash">#/bin/bash
CURRENT_PATH=`pwd`
echo "" > build-fails
for PACKAGE in `cat README | awk '/[0-9][0-9]:/ { print $2 }'`
do
echo ""
echo "Building $PACKAGE"
cd $PACKAGE
makepkg || echo $PACKAGE >> $CURRENT_PATH/build-fails
rm -rf src pkg
cd $CURRENT_PATH
done</pre>
После того, как всё соберётся, можно это установить.<br />
<pre class="brush: bash">#!/bin/bash
CURRENT_PATH=`pwd`
echo "" > install-fails
for PACKAGE in `cat README | awk '/[0-9][0-9]:/ { print $2 }'`
do
cd $PACKAGE
for PACKAGE_FILE in `ls *.pkg.tar.xz`
do
echo "installing $PACKAGE_FILE"
yaourt --noconfirm -U $PACKAGE_FILE || echo $PACKAGE_FILE >> $CURRENT_PATH/install-fails
done
cd $CURRENT_PATH
done
</pre>
На практике, после установки из репозитория, я столкнулся со следующими проблемами:<br />
<div>
<br />
<ol style="text-align: left;">
<li>Не работали заголовки окон. Решилось пересборкой compiz-ubuntu и установкой metacity-ubuntu из AUR.</li>
<li>Вместо текущего времени отображалась надпись "Time". Решилось созданием файла /etc/timezone c содержанием текущей таймзоны. Для меня это Europe/Minsk</li>
<li>Центр настроек сегфолтился при выборе пункта "мониторы". Решилось пересборкой gnome-control-center-ubuntu</li>
</ol>
</div>
<div>
<br /></div>
<div>
После этого стало возможно пользоваться Unity. Единственное - нужно внимательно следить за обновлениями. Вероятность поломки довольно высока.<br />
<br />
Стоит отметить, что я и раньше использовал NetworkManager и PulseAudio. Поэтому с ними возиться не пришлось.</div>
</div>
Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-68379493736828240122012-09-11T13:43:00.000+03:002012-09-11T13:43:32.196+03:00Заряжаем новый iPad под Linux от USB<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;">Особенностью нового iPad стал огромный аккумулятор (больше 11 тыс мАч), что позволило ему работать довольно долго с хорошим экраном. Однако это потребовало значительно большего тока зарядки и, если просто подключить к USB, то он не заряжется (на самом деле заряжается, но очень медленно). </span></span><br />
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;">Для того, чтобы зарядка работала, нужен ток в 2А. </span></span><br />
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;"><br /></span></span>
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;">К счастью, это можно сделать при помощи костылей. Есть утилита <a href="http://korenkov.info/pages/ipad-charge">ipad_charge</a>, которая позволяет увеличить ток, подаваемый на устройство. </span></span><br />
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;"><br /></span></span>
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;">Вот список поддерживаемых устройств: </span></span><br />
<br />
<ul style="text-align: left;">
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPad</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPad2</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPad3</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPod Touch 2G</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPod Touch 3G</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPod Touch 4G</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPhone 3GS</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPhone 4</span></li>
<li><span style="font-family: sans-serif, Verdana; font-size: 14px;">iPhone 4S</span></li>
</ul>
<br />
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;">Установка проста. Для убунту можно собрать пакет</span></span><br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: 14px;">sudo aptitude install libusb-1.0-0 libusb-1.0-0-dev</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: 14px;">git clone https://github.com/mkorenkov/ipad_charge.git</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: 14px;">cd ./ipad_charge</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: 14px;">make</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: 14px;">checkinstall</span><br />
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;"><br /></span></span>
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;">Для арча я сделал <a href="https://aur.archlinux.org/packages.php?ID=62341">PKGBUILD, который можно найти в AUR</a>. </span></span><br />
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;"><br /></span></span>
<span style="font-family: sans-serif, Verdana;"><span style="font-size: 14px;">Примечание. USB 2.0 рассчитан на ток в 0.5 ампера. Работа на повышенных токах может повредить материнскую плату.</span></span></div>
Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com1tag:blogger.com,1999:blog-283574576776099658.post-20129954300094272922012-08-02T16:33:00.001+03:002012-08-02T16:33:37.249+03:00Выключаем компьютер обычным пользователем<div dir="ltr" style="text-align: left;" trbidi="on">
Решил записать, как выключать/перезагружать/делать спячку без рутовых прав.<br />
Это можно реализовать при помощи DBus, ConsoleKit, UPower. <br />
<br />
У меня для команд есть алиасы:<br />
<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"># suspend / halt / reboot by regular user</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">alias suspend='dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">alias halt='dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop'</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">alias reboot='dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart'</span><br />
<div>
<br /></div>
</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-26709893633317724122012-06-23T12:19:00.000+03:002012-06-26T11:48:48.528+03:00Настраиваем VPN через NetworkManager<div dir="ltr" style="text-align: left;" trbidi="on">
Руки всё-таки дошли и до рабочего ноутбука. И решил я поставить туда archlinux. Так как пароль на загрузку я не знал, и ни флешки, ни желания ждать, когда придёт человек из суппорта, не было (хотя проблем с этим нету никаких), то пришлось извращаться.<br />
<br />
Самым простым способом, пришедшим мне в голову показалась установка убунту в windows, изменение раздела при помощи GParted, установка арча в chroot и установка grub в MBR. Что и было сделано. Внимание стоит обратить разве что на установку арча в чруте. Но для этого <a href="https://wiki.archlinux.org/index.php/Installation_Chroot">есть мануал на вики</a>.<br />
<br />
За время моего неиспользования арча там уже появились подписи пакетов, с чем пришлось разобраться (сделать что-то типа pacman-key --init и pacman-key --populate) и consolekit интегрирован внутрь slim (но это уже и в других дистрибутивах так).<br />
<br />
В общем, поставил я всё, начал настраивать NetworkManager. Тут всё получилось нормально, но возникли проблемы с PPTP соединением до работы. Причём самое интересное - из консоли при помощи pon всё поднимается отлично. Полез я, значит, смотреть в логи, а там почти всё успешно (проходит авторизация, получаются адреса), но через пару секунд всё рвётся со следующей руганью в логи:<br />
<br />
<br />
pptp[2175]: nm-pptp-service-2171 warn[decaps_gre:pptp_gre.c:331]: short read (-1): Message too long<br />
pppd[2173]: Modem hangup<br />
pppd[2173]: Connect time 0.2 minutes.<br />
<br />
Печально, что в NM нельзя выставить настройки MTU только для поднятого VPN соединения, поэтому пришлось задвать жёстко MTU для соединения, через которое поднимается туннель. <strike>Я выставил 1432, переподключился к вай-фай и PPTP нормально заработал.</strike><br />
<strike><br /></strike><br />
Поэтому пришлось копать глубже. Я выставил параметр mru 1400 в /etc/ppp/options и <strike>всё заработало корректно </strike> и с удивлением узнал, что NM переписывает значение MTU после установления соединения каким-то своим значением, которое нельзя изменить. На арчефоруме посоветовали воспользоваться <a href="http://archlinux.org.ru/forum/viewtopic.php?f=16&t=8721">таким костылём</a>:<br />
<br />
<b>/etc/NetworkManager/dispatcher.d/20-mtu_change</b><br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">#!/bin/bash</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"><br /></span><br />
<span style="font-family: 'Courier New', Courier, monospace;">INTERFACE=$1</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">STATUS=$2</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">VPN_ID="5d4ee387-3171-4006-bda1-231b249690b9"</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"><br /></span><br />
<span style="font-family: 'Courier New', Courier, monospace;">if [ "$STATUS" = "vpn-up" -a "$CONNECTION_UUID" = "$VPN_ID" ]; then</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> ip link set "$INTERFACE" mtu 1000</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">fi</span><br />
<div>
<br /></div>
<br />
<div>
<br /></div>
</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com1tag:blogger.com,1999:blog-283574576776099658.post-55533057656802685652012-06-06T13:47:00.000+03:002012-06-06T13:47:37.977+03:00Запускаем несколько инстансов MySQL на одной виртуалке и настраиваем репликацию Master-Slave<div dir="ltr" style="text-align: left;" trbidi="on">
Понадобилось мне поднять сервер RADIUS, который работает с mysql, да причём так, что mysql работает в кластере по схеме master-slave. Так как нужно сделать на одной виртуалке, пришлось думать, как это реализовать. Естественно, всё уже давно придумано за нас и существует такая штука как mysqld_multi, которая создана для управления несколькими инстансами mysqld на одном сервере.<br />
<br />
Сначала переделаем my.cnf для работы с несколькими серверами mysql.<br />
<pre class="brush: bash">[mysqld_multi]<br />mysqld=/usr/bin/mysqld_safe<br />mysqladmin=/usr/bin/mysqladmin<br /><br />[mysqld1]<br />datadir=/var/lib/mysql<br />port=3306<br />socket=/var/lib/mysql/mysql.sock<br />user=mysql<br /># Default to using old password format for compatibility with mysql 3.x<br /># clients (those using the mysqlclient10 compatibility package).<br />old_passwords=1<br /><br /># replication<br />log_bin=mysql-bin<br />server_id=1<br /><br />log-error=/var/log/mysqld1.log<br />pid-file=/var/run/mysqld/mysqld1.pid<br /><br />[mysqld2]<br />datadir=/var/lib/mysql-slave<br />socket=/var/lib/mysql-slave/mysql.sock<br />port=3307<br />user=mysql<br /># Default to using old password format for compatibility with mysql 3.x<br /># clients (those using the mysqlclient10 compatibility package).<br />old_passwords=1<br /><br /># replication<br />log_bin=mysql-bin<br />server_id=2<br />log_slave_update=1<br /><br />log-error=/var/log/mysqld2.log<br />pid-file=/var/run/mysqld/mysqld2.pid</pre>
<br />
Как мы видим, вместо пункта [mysqld] появились [mysqld1] и [mysqld2] для мастера и слейва, к которым можно подключиться при помощи разных сокетов или портов.<br />
<br />
Далее создаём папку для слейва<br /><pre class="brush: bash">
mysql_install_db --user=mysql --datadir=/var/lib/mysql-slave/</pre>
<br />
Теперь настроим репликацию<br />
На обеих нодах:<br />
<pre class="brush: bash">
create user 'rep_user2'@'%' identified by 'rep_user2';
create user 'rep_user2'@'localhost' identified by 'rep_user2';
grant replication slave on *.* to 'rep_user2'@'%';
grant replication slave on *.* to 'rep_user2'@'localhost';
</pre>
<br />На мастере смотрим<br />
<pre class="brush: bash">show master status;</pre>
Определяем файл и позицию. После чего на слейве настраиваем.<br />
<pre class="brush: bash">
change master to master_log_file='mysql-bin.000009',
master_log_pos=98,
master_host='localhost',
master_port=3306,
master_user='rep_user2',
master_password='rep_user2'; </pre>
<br />Теперь на слейве делаем<br />
<pre class="brush: bash">
start slave;</pre>
и смотрим, подключилась ли Mysql к мастеру.<br />
<pre class="brush: bash">
SHOW SLAVE STATUS\G<br />
Slave_IO_State: Waiting for master to send event<br /> Master_Host: localhost<br /> Master_User: rep_user2<br /> Master_Port: 3306<br /> Connect_Retry: 60<br /> Master_Log_File: mysql-bin.000009<br /> Read_Master_Log_Pos: 334<br /> Relay_Log_File: mysqld2-relay-bin.000002<br /> Relay_Log_Pos: 235<br /> Relay_Master_Log_File: mysql-bin.000009<br /> Slave_IO_Running: Yes<br /> Slave_SQL_Running: No <br />
</pre>
Если у нас всё хорошо, то должен быть статус вроде "Waiting for master to send event" и в процессах как на мастере, так и на слейве должен висеть процесс соединения.<br />
Процессы можно посмотреть при помощи<br />
<pre class="brush: bash">SHOW PROCESSLIST\G</pre>
<br />
Теперь напишем простенький инит-скрипт, чтобы сервер запускался автоматически. Однако я тут не предусматривал, что при каждой загрузке нужно прописывать файл вручную в параметрах слейва.<br />
<br /><b>/etc/init.d/mysqld_multi</b><br />
<pre class="brush: bash">
#!/bin/bash<br />#<br /># mysqld_multi This shell script takes care of starting and stopping<br /># the multi instances of MySQL daemons (mysqld_multi).<br />#<br /># chkconfig: - 64 36<br /># description: MySQL database server.<br /># processname: mysqld<br /># config: /etc/my.cnf<br /># pidfile: /var/run/mysqld/mysqld1.pid<br /># pidfile: /var/run/mysqld/mysqld2.pid<br /><br /># Source function library.<br />. /etc/rc.d/init.d/functions<br /><br /># Source networking configuration.<br />. /etc/sysconfig/network<br /><br /><br />prog="MySQL Multi"<br /><br />start(){<br /><br />/usr/bin/mysqld_multi start 1 > /dev/null<br />/usr/bin/mysqld_multi start 2 > /dev/null<br />ret=$?<br /> if [ $ret -eq 0 ]; then<br /> action $"Starting $prog: " /bin/true<br /> else<br /> action $"Starting $prog: " /bin/false<br /> fi<br /> return $ret<br />}<br /><br />stop(){<br />/usr/bin/mysqld_multi stop $* > /dev/null<br /> ret=$?<br /> if [ $ret -eq 0 ]; then<br /> action $"Stopping $prog: " /bin/true<br /> else<br /> ret=1<br /> action $"Stopping $prog: " /bin/false<br /> fi<br /> return $ret<br />}<br /><br />restart(){<br /> stop<br /> start<br />}<br />
<br />
# See how we were called.<br />case "$1" in<br /> start)<br /> start<br /> ;;<br /> stop)<br /> stop<br /> ;;<br /> status)<br /> /usr/bin/mysqld_multi report<br /> ;;<br /> restart)<br /> restart<br /> ;;<br /> *)<br /> echo $"Usage: $0 {start|stop|status|restart}"<br /> exit 1<br />esac<br /><br />exit $? </pre>
<br />
<br />
<br /></div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-23879035430719235002012-05-31T15:31:00.000+03:002012-05-31T15:33:28.760+03:00Пробуем на вкус systemd<div dir="ltr" style="text-align: left;" trbidi="on">
Я тут немножко приболел и в свободное время захотелось пощупать systemd в gentoo, и потавил его на компьюетер, который используется у меня как мультимедиа-центр.<br />
Особенностью этого компьюетера явялется то, что домашняя папка пользователя shtsh (из-под которого запущен xbmc) и /usr/portage монтируются по сети, используя nfs.<br />
<br />
Пара слов о systemd. Этот проект разрабатывается как современная, гибкая и быстрая замена существующих систем инициализации и породила множество споров (бинарные логи! зачем нужен ещё один велосипед?!). Однако в него уже влился проект udev и к нему намертво привязали Gnome. Кроме того, systemd продвигается RedHat и уже входит в состав Fedora, что заставляет подозревать, что в RHEL 7 (в крайнем случае 8) и его форках (CentOS, Scientific Linux, Oracle Linux и проч.) systemd будет. А в Mageia, Mandriva, OpenSUSE уже есть. В debian, gentoo, archlinux доступен для отдельной установки.<br />
<br />
<a href="http://wiki.gentoo.org/wiki/Systemd">Вот мануал</a>, поэтому повторяться я не буду. Только расскажу, что пришлось сделать и впечатления.<br />
<br />
Сначала, я чтобы не заморачиваться, прописал в USE-флаги systemd. Затем обновил систему при помощи emerge -avuDN @world. Потом приступил к настройкам по мануалу.<br />
После настройки ядра, установки и прописывания в grub, мне понадобилось следующее.<br />
<br />
Включить сеть, которая у меня настраивается при помощи DHCP.<br />
<pre class="brush: bash">systemctl enable dhcpcd.service</pre>
Включить ssh<br />
<pre class="brush: bash">systemctl enable sshd.service</pre>
После этого я посмотрел статус загрузки (вывод systemctl) и понял, что NFS шары не монтируются, так как на момент монтирования ещё недоступна сеть. Поэтому пришлось разбираться. Для этого я сделал следующее:<br />
<br />
Создал в /etc/systemd/system файлы с настройками монтирования<br />
mnt-disk.mount<br />
<pre class="brush: bash">[Unit]
Description=/mnt/disk NFS share
Wants=rpc-statd.service
After=network.target
[Mount]
What=server.home:/mnt/disk
Where=/mnt/disk
Type=nfs
</pre>
usr-portage.mount<br />
<pre class="brush: bash">[Unit]
Description=/usr/portage NFS share
Wants=rpc-statd.service
After=network.target
[Mount]
What=server.home:/usr/portage
Where=/usr/portage
Type=nfs </pre>
<br />
Затем заставил их подключаться при загрузке:
<br />
<pre class="brush: bash">ln -s /etc/systemd/system/mnt-disk.mount /etc/systemd/system/multi-user.target.wants/mnt-disk.mount
ln -s /etc/systemd/system/usr-portage.mount /etc/systemd/system/multi-user.target.wants/usr-portage.mount</pre>
<br />
В отличии от мануала, у меня не было xdm.service, поэтому пришлось думать, как сделать свой.<br />
/etc/systemd/system/slim.service
<br />
<pre class="brush: bash">[Unit]
Description=SLIM Display Manager
Wants=dbus.target
Before=bluetooth.target getty.target vixie-cron.service
After=network.target acpid.service mnt-disk.mount
[Service]
ExecStart=/usr/bin/slim -nodaemon
Restart=always
[Install]
Alias=display-manager.service
WantedBy=graphical.target</pre>
<br />
И включить его запуск<br />
<pre class="brush: bash">systemctl enable slim.service</pre>
<br />
В результате у меня запускался slim и xbmc только после того, как смонтируется домашняя папка, расположенная на сетевой шаре /mnt/disk.<br />
<br />
Стоит отметить, что по своим настройкам systemd сильно отличается от остальных систем загрузки. В частности, эти самые service, target, mount. Однако всё это достаточно подробно (по крайней мере, лучше, чем я могу рассказать) расписано в манах. В частности в systemd.service, systemd.target, systemd.mount и прочие. Аналогично с пунктами настроек. Онлайн можно посмотреть <a href="http://www.freedesktop.org/software/systemd/man/">по этой ссылке</a>.<br />
<br />
Также стоит обратить внимание, что системный лог ведётся в своём формате и его можно смотреть утилитой systemd-journalctl. Я так понял, что можно использовать /dev/kmesg, но пока не разобрался, как.<br />
<br />
Выводы:<br />
<ul style="text-align: left;">
<li>Диалог приветствия при использовании systemd появляется буквально через несколько секунд после загрузки (без использования SSD!), однако сеть и прочее подключаются после этого.</li>
<li>Как следствие из вышесказанного - есть смысл отказаться от хомяка через NFS, что сильно ускорит загрузку xbmc. Собственно, я так и сделал.</li>
<li>Systemd очень сильно отличается от других систем инициализации и с её настройкой действительно нужно отдельно разбираться. Хотя, может, когда она начнёт массово использоваться, появится много подробных howto.</li>
<li>Пока непонятно, зачем это нужно - 5-10 секунд выигрыша при загрузке, когда сейчас основной тормоз- скорость инициализации оборудования до загрузки ОС, особенно на серверах. Но серверы и загружаются крайне редко.</li>
<li>Пока что единственную пользу вижу в одном - возможность рестарта демона при падении. Но это не так и часто нужно. </li>
</ul>
<ul style="text-align: left;">
</ul>
</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com2tag:blogger.com,1999:blog-283574576776099658.post-64828330586437962232012-05-15T21:58:00.000+03:002012-05-15T21:58:15.248+03:00Дамб БД mysql по ssh<div dir="ltr" style="text-align: left;" trbidi="on">
Проблема: есть сервер БД, где мало свободного места (на дамп не хватит). Нужно сделать дамп БД.<br />
<br />
Решение:<br />
<div style="font-family: "Courier New",Courier,monospace;">
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
</style>
<![endif]--><span style="color: #1f497d; font-size: 11pt;">ssh
-T <user>@<host> “mysqldump -u <db_user> -p <other
switches> database | bzip2 -9” | bzip2 -dc > database.dump</span></div>
<br />
<span style="color: #1f497d; font-family: "Calibri","sans-serif"; font-size: 11pt;"><span style="color: black;">Стоит обратить внимание на опцию -T, с которой не будет создаваться псевдотерминал и не испортится бинарный поток.</span> </span></div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-76813128482711873572012-05-01T19:14:00.000+03:002012-05-02T20:13:35.183+03:00Делаем из AMI vmdk<div dir="ltr" style="text-align: left;" trbidi="on">
Есть амазоновский образ диска ami, нужно запустить его в виртуалке. Используется virtualbox. Попутно создадим образ диска другого формата (любой, поддерживаемый VB)<br />
<br />
Это делается, в принципе, несложно.<br />
Сначала нужно скачать <a href="http://aws.amazon.com/developertools/368">Amazon EC2 AMI Tools</a>.<br />
Дальше поставить ruby и расшифровать образ.<br />
Утилиты от амазона лежат в /media/sf_Common/ec2-ami-tools, образ лежит в папке /media/sf_Common/jira.<br />
<br />
Для того, чтобы утилиты работали, нужно указать папку, где они находятся.<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"> export EC2_HOME=/media/sf_Common/ec2-ami-tools</span></div>
Дальше распаковываем <br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">/media/sf_Common/ec2-ami-tools/bin/ec2-unbundle -k our_private_key.pem -d /media/sf_Common -s /media/sf_Common/jira -m /media/sf_Common/jira/image.manifest.xml</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<br /></div>
После этого у нас появился файл image в папке /media/sf_Common/, это образ раздела.<br />
Теперь у нас есть два варианта: создать виртуальный диск, с такими же характеристиками, как и у образа, либо просто примонтировать и скопировать всё с сохранением прав. Я выбрал второй вариант.<br />
<br />
Создаём раздел на sdb и на sdb1 создаём файловую систему ext3.<br />
Затем монтируем образ в /tmp/a, а наш диск в /tmp/b<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">mount -o loop /media/sf_Common/image /tmp/a</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">mount /dev/sdb1 /tmp/b</span></div>
<br />
Копируем всё с сохранением прав<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">cp -ra /tmp/a/* /tmp/b</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<br /></div>
После этого чрутимся в новую систему<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">mount -t proc proc /tmp/b/proc</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">mount -o rbind /dev /tmp/b/dev</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">chroot /tmp/b/</span></div>
<br />
ставим grub<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">grub</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">root (hd1,0)</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">setup (hd1)</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">quit</span></div>
<br />
Проверяем, что у нас прописан правильный раздел в /boot/grub/menu.lst, выключаемся, удаляем все диски, которые не нужны и пробуем загрузиться. Мне пришлось дополнительно отредактировать /etc/inittab и раскомментировать строчку<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">1:2345:respawn:/sbin/mingetty tty1</span></div>
<br />
В результате система стала предлагать залогиниться локально.<br />
Ещё проблема может быть с тем, что в virtualbox нереально загрузиться с xen, но тут было обычное ядро. </div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-28122847607248422412012-04-19T17:49:00.000+03:002012-04-19T17:49:18.138+03:00Готовим NFS в домашних условиях<div dir="ltr" style="text-align: left;" trbidi="on">
Получилось так, что у меня есть ноутбук с довольно современным железом и приличным винтом, и которым я совершенно не пользуюсь.<br />
Чтобы ноут не простаивал, было принято волевое решение поставить туда генту без иксов и без всякого мусора и получить бесшумную и энергоэффективную торрентокачалку. В будущем поставлю туда nagios, настрою музыку при проблемах и смогу немножко поспать во время ночных дежурств :)<br />
<br />
К сожалению, мой роутер не умеет DNS, поэтому имена серверов пришлось проприсывать в /etc/hosts. Соответственно, у меня сейчас два домашних сервера: torrents и media. Так как на обоих серверах стоит Gentoo, то я решил сделать им общий /usr/portage, чтобы по десять раз не качать одно и то же. Ну, и какой-нибудь /media/disk на 650 ГБайт, чтобы доступ был откуда нужно.<br />
<br />
Как оказалось, <a href="http://en.gentoo-wiki.com/wiki/NFS">настройка NFS элементарна</a>:<br />
<ul style="text-align: left;">
<li>Нужно проверить, что в ядре включена поддержка</li>
<li>Нужно на сервере указать, кто может получать доступ и к чему</li>
<li>Нужно на клиенте примонтировать разделы</li>
</ul>
Это не считая того, что можно вообще корень держать на сетевой шаре. Или иметь общий /usr на NFS. Правда в таком случае придётся делать initramfs, ибо сейчас идёт интеграция с новым udev и systemd. <br />
<br />
Итак, укажем на сервере, что экспортировать. Для этого есть файл /etc/exports<br /><br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># /etc/exports: NFS file systems being exported. See exports(5).<br />/usr/portage 192.168.2.254(async,rw,no_subtree_check)<br />/media/disk 192.168.2.1/24(ro,no_subtree_check)<br />/media/disk 192.168.2.254(rw,no_subtree_check)</span></div>
<br />
Получается что к /usr/portage и /media/disk будет иметь полный доступ 192.168.2.254. А 192.168.2.1-192.168.2.254 будут спобны только читать /media/disk. Также можно использовать имя сервера вместо IP. То есть у меня прописано так:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">/usr/portage media(async,rw,no_subtree_check)</span></div>
<br />
И сервер media сможет получить доступ к шаре (в данном случае имя прописано в /etc/hosts).<br />
Список опций, что указаны в скобках можно получить <a href="http://en.gentoo-wiki.com/wiki/NFS/Server">тут</a>. <br />
<br />
Теперь осталось прописать монтирование. Делается это банально - в fstab добавляется строчка вроде следующей:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">torrents:/usr/portage /usr/portage nfs defaults 0 0</span><br />
<br />
после этого добавляем nfsmount в автозапуск на клиенте, nfs на сервере и радуемся.<br />
<br />
Но и это ещё не всё. В Windows, начиная с 7 появилась возможность монтирования NFS-шар. Для этого нужно доустановить Services for NFS и можно монтировать раздел.<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">mount \\torrents\media\disk z:</span></div>
<br />
И иметь доступ к файлам. <br />
</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-35920192519455597492012-04-10T12:18:00.000+03:002012-04-10T12:18:20.961+03:00Собираем RPM пакет в CentOS<div dir="ltr" style="text-align: left;" trbidi="on">
Ставить из исходников в бинарном дистрибутиве при помощи make install как-то неправильно. Это очень успешно засоряет систему и мешает обновлениям. Поэтому будем разбираться, как собрать пакет в CentOS.<br />
<br />
Если у вас не подключен репозиторий EPEL, то придётся это сделать путём установки <a href="http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm">этого пакета</a>. После этого нужно установить инструменты для сборки<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">yum install -y rpmdevtools</span></div>
<br />
Ну и естественно, то что требуется для сборки конкретного пакета (make, gcc и прочее).<br />
Теперь создадим пользователя, чтобы не делать потенциально опасные операции под рутом и залогинимся под ним.<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">useradd rpmbuild</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">su - rpmbuild</span></div>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">cd </span></span><br />
<br />
Теперь нужно создать структуру каталогов для сборки.<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">rpmdev-setuptree</span> </div>
<br />
Идём в папку SOURCE и качаем туда приложение, которое будем собирать. В моём случае это <a href="http://www.blogger.com/%20http://pgfoundry.org/frs/download.php/2423/pgpool-II-3.1.tar.gz">pgpool-II</a>. Выдернем из архива pgpool.spec - это файл, где и описана сборка rpm-пакета. Вот его и будем использовать. Посмотрев в него, видно, что он слегка неактуален, поэтому будем исправлять, структура простая.<br />
<br />
Сначала идёт заголовок, поля которого говорят сами за себя, тут нам достаточно прописать нужную версию (у нас 3.1). Ещё хочется обратить внимание на то, что можно указывать на несколько исходных файлов и патчей и на то, как это делается. Так как они описаны в этих полях, то их тоже нужно достать из архива и положить в папку SOURCE.<br />
Ссылки на пути даются в виде переменных, например, ссылка на скачивание выглядит так:<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">Source0: http://pgfoundry.org/frs/download.php/2423/%{name}-%{version}.tar.gz</span></div>
Соответственно, тут %{name} = pgpool-II, а %{version} = 3.1 и ссылка получается <span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">http://pgfoundry.org/frs/download.php/2423/pgpool-II-3.1.tar.gz</span></span><br />
<br />
Далее идёт описание, сборка и установка. О том, какие разделы есть, можно почитать в интернете, например <a href="http://www.emanual.ru/download/www.eManual.ru_3235.html">тут</a>. Также стоит обратить внимание, что есть секции devel - в них описаны параметры сборки -devel пакета, как можно догадаться.<br />
<br />
Теперь попытаемся собрать пакет<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">rpmbuild -bb pgpool.spec</span></div>
<br />
Затем установим зависимости и опять попытаемся собрать. Затем закомментируем патч (который изменяет настройки по-умолчанию - всё равно будем под себя настраивать) и опять попытаемся собрать. Затем добавим новые появившиеся файлы в секцию %files и наконец-то всё соберётся. Как видите, ничего особо сложного - главное читать, на что ругнётся rpmbuild. В результате у нас получилось два пакета: pgpool-II-3.1-3.el6.x86_64.rpm pgpool-II-devel-3.1-3.el6.x86_64.rpm, которые можно устанавливать и использовать.<br />
<br />
Теперь давайте попробуем написать минимальный spec с нуля. Соберём пакет c <a href="http://projects.unbit.it/uwsgi">uwsgi</a>. Его сборка представляет собой просто выполнение команды make. К сожалению, ни spec, ни даже make install они не предоставляют. Поэтому будем делать всё руками. К счастью, vim при создании нового spec-файла подставил заготовку с пустыми полями.<br />
<br />
Вот, что у меня вышло:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">Name: uwsgi<br />Version: 0.9.9.2<br />Release: 1%{?dist}<br />Summary: uWSGI application server<br /><br />License: GPL<br />URL: http://projects.unbit.it/uwsgi<br />Source0: http://projects.unbit.it/downloads/%{name}-%{version}.tar.gz<br />BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># Всё, кроме chrpath взято из их <a href="http://projects.unbit.it/uwsgi/wiki/Install">гайда по сборке </a></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">BuildRequires: libxml2-devel python-devel chrpath<br />Requires: libxml2<br /><br />%description<br />uWSGI is a fast, self-healing and developer/sysadmin-friendly application container server coded in pure C.<br /><br />%prep<br />%setup -q<br /><br />%build<br />make %{?_smp_mflags}<br /><br />%install</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># следующие две строчки - костыль, так как по умолчанию папки /usr/bin и /etc будут<br />install -d $RPM_BUILD_ROOT%{_bindir}<br />install -d $RPM_BUILD_ROOT%{_sysconfdir}</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># Устанавливаем файлы uwsgi и uwsgi.xml в /usr/bin и /etc соответственно.<br />install %{name} $RPM_BUILD_ROOT%{_bindir}<br />install uwsgi.xml $RPM_BUILD_ROOT%{_sysconfdir}</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># А вот это довольно важная команда. При линковке uwsgi были жёстко прописаны пути</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># к библиотекам, что плохо, так как нужно пользоваться динамическим линкером. </span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># Поэтому это безобразие нужно убрать, для чего используется следующая команда.</span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"># Подробней можно почитать <a href="http://fedoraproject.org/wiki/RPath_Packaging_Draft">тут</a>.<br />chrpath --delete $RPM_BUILD_ROOT%{_bindir}/%{name}<br /><br />%clean</span></div>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">rm -rf $RPM_BUILD_ROOT</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">%files</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">%defattr(-,root,root,-)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">%doc</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">%{_bindir}/%{name}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">%{_sysconfdir}/uwsgi.xml</span></span><br />
<br />
Думаю, этого достаточно, чтобы разобраться и попробовать самому. Самое главное - установка, обновление и удаление будут происходить намного безопасней.</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-1324834164720650732012-04-04T16:16:00.001+03:002012-04-04T16:33:20.806+03:00Linux ate my RAM.<div dir="ltr" style="text-align: left;" trbidi="on">
Господа.<br />
К сожалению, многие толковые люди не умеют пользоваться командой free.<br />
<br />
<pre>$ free -m
total used free shared buffers cached
Mem: 1504 1491 13 0 91 764
-/+ buffers/cache: 635 <span style="border: 1px solid; color: red; font-weight: bold;">869</span>
Swap: 2047 6 2041</pre>
<br />
Так вот, количество свободной памяти нужно смотреть во второй строке.<br />
В первой строке знаечение не учитывает, что буферы и кеши могут освобождать память, если программа затребует больше памяти. То есть для программы свободно 869 Мбайт в данном примере.<br />
<br />
И хорошая ссылка напоследок: <a href="http://www.linuxatemyram.com/">http://www.linuxatemyram.com/</a></div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-89716076593315588742012-04-04T04:07:00.001+03:002012-04-14T13:35:17.679+03:00Как работает OOM Killer<div dir="ltr" style="text-align: left;" trbidi="on">
Когда приложение пытается сделать memory allocation, а доступная память закончилась, в linux запускается процесс OOM Killer. Как можно понять из названия, он создан для того, чтобы УБИВАТЬ!11.<br />
<br />
Но, естественно, убивает он не всё подряд, а подчиняясь определённым правилам:<br />
<ul style="text-align: left;">
<li>Мы должны потерять минимум работы</li>
<li>Мы должны освободить много памяти</li>
<li>Мы не должны убивать невиновных в пожирании большого количества памяти</li>
<li>Мы хотим убить как можно меньше процессов (в идеале - один)</li>
<li>Результат работы должен быть предсказуемым</li>
</ul>
Далее идёт подсчёт очков виновности процессов и процессы (или потоки), набравшие больше всего баллов, жестоко убиваются.<br />
<br />
Вот так идёт подсчёт очков:<br />
<ol style="text-align: left;">
<li>Считаем RSS процесса </li>
<li>Добавляем RSS всех дочерних процессов</li>
<li>Если процесс долго живёт, то значение уменьшается</li>
<li>Если у процесса niceness больше 0, то значение увеличивается.</li>
<li>Если есть флаги CAP_SYS_ADMIN или CAP_SYS_RAWIO, результат уменьшается</li>
<li>Смотрится знаечение /proc/<pid>/oom_adj, которое может задавать пользователь, чтобы повышаться сопротивляемость OOM Killer'у. Вроде как это уже deprecated и нужно использовать <span class="st">oomscore_adj. </span> </li>
</ol>
Естественно, это не точный алгоритм, цель написанного - дать представление, от чего зависит выбор кандидата на убийство </div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com2tag:blogger.com,1999:blog-283574576776099658.post-32663235523511722062012-03-31T16:25:00.001+03:002012-03-31T16:25:49.123+03:00Обновление udev в gentoo<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;">
Пришло недавно обновление udev до версии 182 и потребовало включить CONFIG_DEVTMPFS в конфиге ядра.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Этот параметр находится тут</div>
<div style="text-align: left;">
Device Drivers </div>
<div style="text-align: left;">
-> Generic Driver Options</div>
<div style="text-align: left;">
-> Maintain a devtmpfs filesystem to mount at /dev</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
В противном случае отваливался lirc. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Кстати, о lirc. Так как мой комьютер перешёл в разряд мульмедиа ценра и сервера, то я решил изменить профиль на default/linux/amd64/10.0.</div>
<div style="text-align: left;">
А lirc, цуко отказалася собираться. <a href="https://bugs.gentoo.org/show_bug.cgi?id=218717">Баг висит уже года три</a>.</div>
<div style="text-align: left;">
<a href="http://forums.gentoo.org/viewtopic-p-6928138.html">Решение накостылилось примерно такое - </a>ему не нравится LDFLAGS=-m elf_x86_64, поэтому для него нужно заменить на другое значение и можно собирать.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
LDFLAGS_amd64="" emerge -av lirc</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Ну, и ещё потребовалось обновить конфиг syslog-ng. В чём там проблема - он сам писал, так что исправления было сделать несложно. Ну, разве что в заголовке конфига ещё нужно было сменить версию с 2.2 на 2.3. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
И да, наконец-то вышел XBMC 11, на который я перелез с 9999, и который нормально и без костылей собирается.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-61592112634864412902012-02-27T14:13:00.000+03:002012-02-27T14:13:21.306+03:00Гугл + Юзабилити<div dir="ltr" style="text-align: left;" trbidi="on">
Дорогой Гугл, а тебе не кажется, что у тебя в последнее время начал сильно портиться дизай в части юзабилити? Вот кто придумал такую компоновку в интерфейсе блоггера? Почему не сделать так:<br />
<br />
<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT6FNt0TihOHHouGym_efipDE8tQ3p7kMeB5fzNOgWNJ0-QXY1yOCi9SYGYNV1uAIZq8WKO7wzaZQvaf7xqTJcUGTFBtjL1mNpSKT8D5dyJ_SrXgNrLoTkg2SkV_-xOGuwBtEpdjNfrrE/s1600/Selection_004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT6FNt0TihOHHouGym_efipDE8tQ3p7kMeB5fzNOgWNJ0-QXY1yOCi9SYGYNV1uAIZq8WKO7wzaZQvaf7xqTJcUGTFBtjL1mNpSKT8D5dyJ_SrXgNrLoTkg2SkV_-xOGuwBtEpdjNfrrE/s320/Selection_004.png" width="320" /></a></div>
</div>
</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com1tag:blogger.com,1999:blog-283574576776099658.post-86590061940582417582012-02-07T11:41:00.000+03:002012-02-07T11:41:29.948+03:00Редактирование прошивки android под linux<div dir="ltr" style="text-align: left;" trbidi="on">
Писал для 4pda.ru для телефона Samsung GT-I9001 Galaxy S Plus, может, кому будет полезно.<br />
<br />
Данное руководство предполагает, что читающий обладает базовыми навыками использования linux (использование консоли, получение прав рута, установка программ, создание/редактирование системных файлов)<br /><br />
<b>Зависимости и UDEV</b><br />
<br />Сначала нужно установить sun-jdk. Стоит отметить, что оракл недавно менял лицензию, поэтому в основном репозитории его может не быть. Для ubuntu достаточно установить sun-java6-jdk, но, если планирутся пересобирать ядро, то нужно будет установить дополнительные зависимости.<br /><br />Для 32/64 битной ubuntu нужно выполнить следующее:<br /><pre class="brush:bash">sudo -s<br />apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev</pre><br />Дополнительно, если у вас 64 бита, нужно установить 32х битные библиотеки<br /><pre class="brush:bash">ia32-libs lib32z1-dev lib32ncurses5-dev gcc-multilib g++-multilib</pre><br />Теперь, чтобы у обычных пользователей были права на использование adb, нужно создать соответствующее правило udev<br /><pre class="brush:bash">echo 'SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"' > /etc/udev/rules.d/90-adb.rules</pre><br />После этого жмём Ctrl+D, чтобы выйти из рутовской сессии.<br /><br /><b>Создаём своё ядро</b><br /><br />Качаем гугловский sdk. Для этого идём на <a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a> и качаем версию под linux <a href="http://dl.google.com/android/android-sdk_r16-linux.tgz">http://dl.google.com/android/android-sdk_r16-linux.tgz</a><br />После этого распаковываем файл<br /><pre class="brush:bash">tar xzf android-sdk*</pre><br />Идём в папку android-sdk-linux/tools и запускаем файл android<br /><pre class="brush:bash">./android</pre><br />И устанавливаем Android SDK Platform tools<br />После этого появится папка android-sdk-linux/platform-tools, где и находится adb. Для удобства, есть смысл добавить эту папку в PATH, чтобы иметь быстрый доступ к adb (замените путь на свой).<br /><pre class="brush:bash">echo 'PATH="/home/shtsh/phone/android-sdk-linux/platform-tools:${PATH}"' >> ~/.bashrc</pre><br />Теперь можно подключать телефон в режиме отладки USB (Настройки - приложения - разработка - включить отладку USB) к компьютеру. <br />По команде adb devices должен показаться ваш телефон.<br /><br />Теперь возьмём с телефона текущий конфиг ядра.<br /><pre class="brush:bash">adb pull /proc/config.gz</pre><br />Теперь распаковываем его при помощи gunzip и переименовываем в .config (стоит обратить внимание, что файл, начинающийся с точки - скрытый)<br /><br />Идём на <a href="http://opensource.samsung.com">http://opensource.samsung.com</a> и качаем исходники ядра, либо пользуемся git для получения. После этого распаковываем скачанный архив и копируем туда наш файл .config. <br /><br />Теперь нам нужен тулчейн для сборки под arm. Для ubuntu можно скачать <a href="http://www.codesourcery.com/sgpp/lite/arm/portal/package5383/public/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2">отсюда</a>, затем распаковать.<br />В gentoo можно воспользоваться командой crossdev --target arm-none-linux-gnueabi.<br /><br />Открываем Makefile и ищем там переменную CROSS_COMPILE и заменяем значение на тот путь, где находится наш распакованный (или установленный тулчейн). У меня этот путь<br /><pre class="brush:bash">CROSS_COMPILE ?= /usr/bin/arm-none-linux-gnueabi-</pre><br />Теперь обычным make -jX, где X - число процессоров(ядер)+1 собираем ядро. Если собралось, то Вы — молодец. Можно накладывать патчи и что-то менять в ядре. <br />После сборки ядро находится Kernel/arch/arm/boot/zImage.<br /><br /><b>Модификация прошивки.</b><br /><br />Сначала при помощи CWM нужно сделать бэкап прошивки.<br /><br />После этого идём на <a href="https://github.com/dsixda/Android-Kitchen/archives/master">https://github.com/dsixda/Android-Kitchen/archives/master</a> и качаем кухню. Samsung GT-I9001 поддерживается с версии 0.182.<br />Качаем, распаковываем. <br />Копируем файлы, полученные при бэкапе из CWM в папку original_update.<br />Запускаем кухню <br /><pre class="brush:bash">./menu</pre><br />Выбор осуществляется вводом цифр/букв, которые написаны в начале строки.<br /><br />Устанавливаем рабочий каталог, добавляем busybox. Затем жмём 0 и заходим в advanced options — тут можно сделать деодекс прошивки. Это нужно для того, чтобы можно было изменять файлы прошивки. Также стоит включить поддержку /etc/init.d.<br /><br />После всего этого можно заняться кастомизацией интерфейса. Это делается очень просто - идём на <a href="http://uot.dakra.lt/kitchen/">http://uot.dakra.lt/kitchen/</a>, выбираем, что нам нужно сделать и через некоторое время получаем готовую прошивку. Единственное, на что стоит обратить внимание — в пункте File Upload нужно выбрать:<br />update-binary — Type Galaxy<br />Upload system files — заливаем framework-res.apk, SystemUI.apk, twframework-res.apk.<br /><br />После этого жмём submit и ждём, когда модификации будут готовы.<br />На выходе мы получаем zip-файл, который можно прошить через CWM. Но можно вынуть файлы из архива и скопировать их в нашу распакованную прошивку. Она находится в папке WORKING_число_число.<br /><br /><b>Установка нового ядра</b><br /><br />Выбираем 20 - Tools for boot image (unpack/re-pack/etc.), затем распаковываем boot.img. У нас появится папка BOOT-EXTRACTED, где находится ядро и распакованный рамдиск, где можно подредактировать загрузочные скрипты и параметры. Делаем Build boot.img from BOOT-EXTRACTED folder (for working folder) и после этого можно собирать прошивку. <br /><br />В результате у нас готов подписанный архив, который можно ставить из recovery.<br /><br /><b>Примечание 1.</b> У меня нету под руками ubuntu, поэтому с именами пакетов мог ошибиться. Все остальные действия не сильно зависят от используемого linux.</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-32247071374303389562012-02-01T00:14:00.000+03:002012-02-01T00:16:31.240+03:00Настройка прокрутки для трэкпоинта<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Вот список устройств ввода.</div>
<pre class="brush: bash">⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ DualPoint Stick id=12 [slave pointer (2)]
⎜ ↳ AlpsPS/2 ALPS DualPoint TouchPad id=13 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Laptop_Integrated_Webcam_2M id=10 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
</pre>
Соответственно, DualPoint Stick - трекпоинт. Ему нужно включить эмуляцию прокрутки.<br />
<br />
Вот насройки xorg.<br />
<b>/etc/X11/xorg.conf.d/20-synaptics.conf</b>
<br />
<pre class="brush: bash">Section "InputClass"
Identifier "synaptics-all"
Driver "synaptics"
MatchProduct "AlpsPS/2 ALPS DualPoint TouchPad"
MatchIsTouchpad "on"
Option "TapButton1" "1"
Option "TapButton2" "2"
Option "TapButton3" "3"
Option "VertEdgeScroll" "on"
Option "HorizEdgeScroll" "on"
EndSection
Section "InputClass"
Identifier "Trackpoint Wheel Emulation"
MatchProduct "DualPoint Stick"
MatchDevicePath "/dev/input/event*"
Option "EmulateWheel" "true"
Option "EmulateWheelButton" "2"
Option "Emulate3Buttons" "false"
Option "XAxisMapping" "6 7"
Option "YAxisMapping" "4 5"
EndSection
</pre>
<br />
Теперь при средней кнопке + трэкпоинт происходит прокрутка.<br />
<br />
При подготовке использовались материалы с <a href="http://wiki.archlinux.org/">арчевики</a></div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-19224955078378743712012-01-31T23:18:00.000+03:002012-02-27T14:14:52.531+03:00XBMC и shutdown. Гнева пост.<div dir="ltr" style="text-align: left;" trbidi="on">
Недавно возникла такая ситуация: в xbmc пропала возможность выключать компьютер (остался лишь suspend). Сие меня крайне опечалило и заставило искать решение проблемы. Наиболее распространённым было решение добавить политику для policykit.<br />
<br />
<b>/etc/polkit-1/localauthority/50-local.d/custom-actions.pkla</b>
<br />
<pre class="brush: bash">[Actions for me]
Identity=unix-user:1000
Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.*;org.freedesktop.udisks.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
</pre>
Естественно, вместо 1000 нужен uid или логин пользователя, от чьего имени работает xbmc.
<br />
Однако это не помогло.<br />
<br />
Каково было моё удивление, когда для решения этой проблемы потребовалось убрать ck-launch-session для запуска. То есть опять пришлось огребать проблемы из-за этого долбанного нестабильного consolekit. То бишь теперь всё запускается из слима командой:<br />
<br />
<b>/etc/slim.conf</b>
<br />
<pre class="brush: bash">login_cmd exec dbus-launch /bin/bash -login ~/.xinitrc %session > ~/.xsession-errors 2>&1
</pre>
<br />
Год назад при выходе 0.4.2 пришлось извращаться, так теперь опять ковыряться и искать причину.<br />
Господа разработчики основных линуховских подсистем, почему вы так регулярно всё ломаете?!</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-57141585919375139202012-01-27T22:31:00.000+03:002012-01-27T23:26:07.071+03:00Выводим список обновлений в gentoo при логине<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Давным-давно я наваял скромненький скрипт, который дёргается по крону и проверяет, чего обновилось в системе.<br />
<br />
Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите<br />
<br />
<b>/usr/local/sbin/update-system-check</b>
<br />
<pre class="brush: bash">#!/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 &amp;&amp; chmod 640 $LOG_FILE &amp;&amp; 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'} &gt; $PID_FILE
eix-sync &gt; /dev/null
eix-remote fetch &gt; /dev/null
emerge -qupDN @world &gt;&gt; $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 &gt; 2 ))
then
# Всё хорошо, другой процесс работает
echo `date +"%D %A %H:%M"` $STRING_FILE_EXIST &gt;&gt; $LOG_FILE
exit 1
else
# Это единственный процесс, обновляем
echo `date +"%D %A %H:%M"` $STRING_FILE_ALONE &gt; $LOG_FILE
check_update
fi
else
#Файла нету, просто обновляемся
echo `date +"%D %A %H:%M"` $STRING_GOOD &gt; $LOG_FILE
check_update
fi
</pre>
<br />
Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).<br />
<br />
<b>/usr/local/bin/parse.pl
</b><br />
<pre class="brush: perl">#!/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,"/<b>",$2,"</b> ",$4," → <b>",$3,"</b>\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
} else {
print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
}
}
</pre>
Этот скрипт умеет парсить файл, где записано, что обновилось и выводить в HTML для libnotify или plain text.<br />
<br />
Теперь осталось засунуть вызов <b>parse.pl</b> в <b>.bashrc</b>. Так же можно использовать <b>cat /var/log/updates</b>. Только смотрите - у меня логи пишутся для группы log (я <a href="http://shtsh.blogspot.com/2012/01/gentoo.html">об этом раньше писал</a>), поэтому, возможно, придётся немножко подправить. <br />
<br />
Ну, и для обновления системы я использую следующий скрипт:</div>
<pre class="brush: bash">#!/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
</pre>
Ну, и нужно добавить в <b>/etc/crontab</b> что-то, похожее на это:
<br />
<pre class="brush: bash">5 */3 * * * root /usr/local/sbin/update-system-check
</pre>
Каждые 3 часа будут проверяться обновления.<br />
<br />
<b>P.S.</b> Парсер лох. Сейчас буду пытаться исправить. </div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-87343830319565570182012-01-23T13:46:00.000+03:002012-01-27T23:19:10.990+03:00Загружаемся с флешки через grub<div dir="ltr" style="text-align: left;" trbidi="on">
Пришлось как-то недавно повозиться с ноутбуком, у которого dvd-rom уже начал глючить, а поддержки загрузки с usb флешки или внешнего dvd-rom нету.<br />
<br />
Заодно захотелось сделать заявление: "Дорогая Toshiba, я никогда не буду покупать твою продукцию из-за кривых bios и ужасной поддержки linux."<br />
<br />
Так вот. На этот ноутбук нужно было поставить арч, а при чтении с диска возникали ошибки. Поэтому пришлось гуглить. И знаете, нагуглилась очень классная штука - <a href="http://www.plop.at/en/bootmanagers.html">plop boot manager</a>. <br />
<br />
Plop - менеджер загрузки, который способен грузится почти откуда угодно. Нас же интересует его возможности по загрузке из grub.<br />
<br />
Сначала качаем его с <a href="http://www.plop.at/en/bootmanagerdl.html">официального сайта</a>. Затем находим в архиве файл <b>plpbt.bin</b> и кидаем его в /boot.<br />
<br />
После этого добавим запись в меню.<br />
<br />
<b>GRUB</b>
<br />
<pre class="brush: bash">title Plop Boot Manager
root (hd0,0)
kernel /boot/plpbt.bin
</pre>
<b>GRUB2</b><br />
Создаём файл /etc/grub.d/20_plop
<br />
<pre class="brush: bash">#!/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</pre>
Взято <a href="http://forum.odmins-it.ru/index.php?topic=357.0">тут</a><br />
Затем делаем update-grub и у нас появляется нужный пункт меню, через который можно зайти в Plop.<br />
<br />
Конечно, он умеет загружаться не только через grub, но и с дискеты, с виндового загрузчика, по сети.<br />
Более подробно можно почитать на <a href="http://www.plop.at/en/bootmanager.html#noinstall">сайте разработчиков</a>.<br />
</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-53361423968532588992012-01-22T17:24:00.000+03:002012-01-27T23:19:31.434+03:00Собираем xbmc под gentoo ~amd64<div dir="ltr" style="text-align: left;" trbidi="on">
Есть такой очень удобный и красивый медиа-центр xbmc.<br />
<br />
Из стандартного репозитория gentoo он уже собираться не хочет, поэтому я перешёл на версию 9999. Однако и он собираться не захотел! Пришлось гуглить. Решение нашлось на <a href="http://forums.gentoo.org/viewtopic-p-6867724.html">гентушном форуме</a>.<br />
<br />
Проблема оказалась, что xbmc пока не поддерживает libpng 1.5.<br />
<br />
<pre class="brush: bash">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<br /></pre>
Стоит отметить папку /etc/portage/patches. Из неё патчи будут накладывать автоматически при сборке. </div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-68282135260205964592012-01-20T14:19:00.000+03:002012-01-27T23:19:52.128+03:00Gentoo + KDE + appmenu - nepomuk<div dir="ltr" style="text-align: left;" trbidi="on">
Чем хороша Gentoo - в ней можно собрать систему так, как пожелает душа. Вот не нравится мне непомук - его можно выкинуть нафиг. Конечно, Kontaсt, kmail, kopete придётся выкинуть тоже. Но не думаю, что это проблема.<br />
<br />
Спасибо <a href="http://megabaks.blogspot.com/">megabaks</a> за вдохновение и оверлей.<br />
<br />
Сначала выпилим kdepim. Это просто и быстро.<br />
<br />
/etc/portage/package.use<br />
<pre class="mybrush: bash">net-p2p/ktorrent -rss
kde-base/plasma-workspace -rss
kde-base/libplasmaclock -holidays</pre>
В make.conf в USE добавляем "-semantic-desktop"<br />
<br />
Затем смотрим при помощи equery depends, что зависит жёстко от kdepimlibs и удаляем. Если что-то зависит не жёстко, то выставляем нужный USE для пакета. Затем пересобираем мир, делаем emerge --depclean и revdep-rebuild, внимательно читая вывод, чтобы он не поставил kdepim обратно.<br />
<b>UPD.</b> Вообще, без выпиливания kdepim обойтись можно - достаточно убить kontact, и можно будет пользоваться kopete.<br />
<br />
Далее ставим что-нибудь приличное для почты и IM (например, thunderbird и pidgin). Теперь заменим систему вывода для Qt на raster. Для этого используем, например, оверлей megabaks'а stuff<br />
<pre class="brush: bash">layman -a stuff
emerge x11-misc/kcm-qt-graphicssystem</pre>
Теперь выбираем в systemsettings в модуле "Qt Graphics System" режим raster.<br />
<br />
Теперь вместо тормознутой темы приложений Oxygen поставим настраиваемую и быструю qtcurve.<br />
<br />
<pre class="brush: bash">emerge x11-themes/qtcurve-qt4 x11-themes/gtk-engines-qtcurve</pre>
Теперь прикрутим appmenu, но не как в ubuntu, а сделаем кнопочку на оформлении окна.<br />
<br />
В USE вставляем флаг appmenu, затем ставим всё, что нужно<br />
<pre class="mybrush: bash">emerge x11-misc/appmenu x11-misc/appmenu-gtk x11-misc/appmenu-qt x11-misc/appmenu-firefox kde-misc/oxygen-appmenu x11-misc/lo-menubar</pre>
<br />
После этого выбираем оформление окна с кнопочкой меню, перелогиниваемся и радуемся жизни.</div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0tag:blogger.com,1999:blog-283574576776099658.post-33309946979005065132012-01-19T22:01:00.000+03:002012-01-27T23:20:25.305+03:00Установка JBOSS AS 7 + ajp<div dir="ltr" style="text-align: left;" trbidi="on">
Сначала тут должен был быть большой пост с пошаговыми инструкциями, но потом я понял, что если кто-то устанавливает jboss, то он всякие базовые вещи знает и понимает. Поэтому только то, что реально пришлось сделать.<br />
<br />
Мне нужно было установить JBOSS в качестве бэкэнда к апачу через ajp, затем что-нибудь задеплоить.<br />
<br />
Я поднял контейнер openvz, выделил ему 2 гига ОЗУ и запустил.<br />
<br />
Вот, что я ставил:<br />
Debian 6<br />
Apache 2.2.16(from debian repositories)<br />
mod_jk 1.2.30 (from debian repositories)<br />
JDK 1.6.0_26 (from debian repositories)<br />
<a href="http://www.jboss.org/jbossas">JBoss AS 7.0.2.Final</a><br />
<a href="http://www.forgerock.org/openam.html">OpenAM 9.54</a><br />
<br />
<br />
<b>Настройка:</b><br />
Сразу отмечу, что JBoss я ставил впервые и с ajp пришлось неслабо повозиться. Особенно "приятно", что он отличается от предыдущих версий в качестве настройки и управления, поэтому его я сразу очень полюбил за бурный секс.<br />
<br />
<br />
Сначала настроим apache.<br />
<b>/etc/apache2/sites-enabled/000-default</b><br />
<pre class="brush: bash"><VirtualHost *:80>
JkMount /* myworker
ServerAdmin <a href="mailto:email@gmail.com">liparinai@gmail.com</a>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel debug
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
</pre>
<b>/etc/apache2/mods-available/jk.conf</b><br />
<pre class="brush: bash"><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>
</pre>
<b>/etc/apache2/workers.conf</b><br />
<pre class="brush: bash">worker.list=myworker
worker.myworker.port=8009
worker.myworker.host=127.0.0.1
worker.myworker.type=ajp13
worker.myworker.lbfactor=1
</pre>
Теперь делаем. <br />
<pre class="brush: bash">a2enmod jk</pre>
<br />
и перезапускаем апач.<br />
<br />
Теперь настраиваем JBoss.<br />
Установка элементарна - тупо распаковываем, например, в /opt/java. Для удобства, я сделал ссылку на эту папку в /opt/java/jboss<br />
<br />
Теперь настройка. Эти вещи слабо гуглятся, в официальных доках с этим проблема.<br />
<br />
<b>/opt/java/jboss/standalone/configuration/standalone.xml</b><br />
<pre class="brush: xml">(Modifications marked with bold font)
<server name="temporary.ru" xmlns="urn:jboss:domain:1.0">
<extensions>
... skipped ...
</extensions>
<b> <system-properties>
<property name="jvmRoute" value="myworker"/>
</system-properties>
</b> ... 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"/>
<b> <connector name="ajp" protocol="AJP/1.3" socket-binding="ajp" scheme="http"/></b>
... skipped ...
<socket-binding-group name="standard-sockets" default-interface="public">
<socket-binding name="http" port="8080"/>
<b> <socket-binding name="ajp" port="8009"/></b>
<socket-binding name="https" port="8443"/>
... skipped ...
</pre>
В частности, проблема с jvmRoute, который (по идее) должен был сам подхватиться. Спасибо Sirex'у за то, что дал хороший совет.<br />
<br />
Затем можно запускать.<br />
<pre class="my_code_box">/opt/java/jboss/bin/standalone.sh &.</pre>
<br />
По-хорошему нужно создать пользователя, сделать его владельцем jboss и от его имени запускать.<br />
<br />
Теперь можно задеплоить OpenAM. Читаем <a href="https://wikis.forgerock.org/confluence/display/openam/Deploy+OpenAM+in+JBoss+AS+7">руководство</a>, делаем что написано и кидаем в папку /opt/java/jboss/standalone/deployments. <br />
<br />
Если нужно, можно настроит балансировку нагрузки и jboss не светит в интернет.<br />
<br /></div>Anonymoushttp://www.blogger.com/profile/04613753935207006159noreply@blogger.com0