Highlighter

четверг, 13 сентября 2012 г.

Запускаем Unity под Archlinux

Многие недовольны развитием десктопного линукса. А мне вот нравится Unity из ubuntu. Вот только в убунте всё настолько запатчено, что очень тяжело завести на других дистрибутивах.

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

Вот адреса репозиториев:

[unity]
Server = http://unity.xe-xe.org/$arch

[unity-extra]
Server = http://unity.xe-xe.org/extra/$arch

Добавляем это в /etc/pacman.conf и устанавливаем.

pacman -Suy
pacman -S $(pacman -Slq unity)

Естественно, придётся заменить ряд системных пакетов (вроде xorg-server) на патченные.
Ещё бы я порекомендовал установить lightdm-ubuntu для запуска.

Собрать можно, используя репозиторий с гитхаба.

git clone  git://github.com/chenxiaolong/Unity-for-Arch

После этого читаем README и собираем/устанавливаем в правильном порядке.
Если хочется, то можно это просто автоматизировать.
#/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
После того, как всё соберётся, можно это установить.
#!/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
На практике, после установки из репозитория, я столкнулся со следующими проблемами:

  1. Не работали заголовки окон. Решилось пересборкой compiz-ubuntu и установкой metacity-ubuntu из AUR.
  2. Вместо текущего времени отображалась надпись "Time". Решилось созданием файла /etc/timezone c содержанием текущей таймзоны. Для меня это Europe/Minsk
  3. Центр настроек сегфолтился при выборе пункта "мониторы". Решилось пересборкой gnome-control-center-ubuntu

После этого стало возможно пользоваться Unity. Единственное - нужно внимательно следить за обновлениями. Вероятность поломки довольно высока.

Стоит отметить, что я и раньше использовал NetworkManager и PulseAudio. Поэтому с ними возиться не пришлось.

вторник, 11 сентября 2012 г.

Заряжаем новый iPad под Linux от USB


Особенностью нового iPad стал огромный аккумулятор (больше 11 тыс мАч), что позволило ему работать довольно долго с хорошим экраном. Однако это потребовало значительно большего тока зарядки и, если просто подключить к USB, то он не заряжется (на самом деле заряжается, но очень медленно). 
Для того, чтобы зарядка работала, нужен ток в 2А. 

К счастью, это можно сделать при помощи костылей. Есть утилита ipad_charge, которая позволяет увеличить ток, подаваемый на устройство. 

Вот список поддерживаемых устройств: 

  • iPad
  • iPad2
  • iPad3
  • iPod Touch 2G
  • iPod Touch 3G
  • iPod Touch 4G
  • iPhone 3GS
  • iPhone 4
  • iPhone 4S

Установка проста. Для убунту можно собрать пакет

sudo aptitude install libusb-1.0-0 libusb-1.0-0-dev
git clone https://github.com/mkorenkov/ipad_charge.git
cd ./ipad_charge
make
checkinstall

Для арча я сделал PKGBUILD, который можно найти в AUR

Примечание. USB 2.0 рассчитан на ток в 0.5 ампера. Работа на повышенных токах может повредить материнскую плату.

четверг, 2 августа 2012 г.

Выключаем компьютер обычным пользователем

Решил записать, как выключать/перезагружать/делать спячку без рутовых прав.
Это можно реализовать при помощи DBus, ConsoleKit, UPower.

У меня для команд есть алиасы:


# suspend / halt / reboot by regular user
alias suspend='dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend'
alias halt='dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop'
alias reboot='dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart'

суббота, 23 июня 2012 г.

Настраиваем VPN через NetworkManager

Руки всё-таки дошли и до рабочего ноутбука. И решил я поставить туда archlinux. Так как пароль на загрузку я не знал, и ни флешки, ни желания ждать, когда придёт человек из суппорта, не было (хотя проблем с этим нету никаких), то пришлось извращаться.

Самым простым способом, пришедшим мне в голову показалась установка убунту в windows, изменение раздела при помощи GParted, установка арча в chroot и установка grub в MBR. Что и было сделано. Внимание стоит обратить разве что на установку арча в чруте. Но для этого есть мануал на вики.

За время моего неиспользования арча там уже появились подписи пакетов, с чем пришлось разобраться (сделать что-то типа pacman-key --init и pacman-key --populate) и consolekit интегрирован внутрь slim (но это уже и в других дистрибутивах так).

В общем, поставил я всё, начал настраивать NetworkManager. Тут всё получилось нормально, но возникли проблемы с PPTP соединением до работы. Причём самое интересное - из консоли при помощи pon всё поднимается отлично. Полез я, значит, смотреть в логи, а там почти всё успешно (проходит авторизация, получаются адреса), но через пару секунд всё рвётся со следующей руганью в логи:


pptp[2175]: nm-pptp-service-2171 warn[decaps_gre:pptp_gre.c:331]: short read (-1): Message too long
pppd[2173]: Modem hangup
pppd[2173]: Connect time 0.2 minutes.

Печально, что в NM нельзя выставить настройки MTU только для поднятого VPN соединения, поэтому пришлось задвать жёстко MTU для соединения, через которое поднимается туннель. Я выставил 1432, переподключился к вай-фай и PPTP нормально заработал.


Поэтому пришлось копать глубже. Я выставил параметр mru 1400 в /etc/ppp/options и всё заработало корректно  и с удивлением узнал, что NM переписывает значение MTU после установления соединения каким-то своим значением, которое нельзя изменить. На арчефоруме посоветовали воспользоваться таким костылём:

/etc/NetworkManager/dispatcher.d/20-mtu_change

#!/bin/bash


INTERFACE=$1
STATUS=$2
VPN_ID="5d4ee387-3171-4006-bda1-231b249690b9"


if [ "$STATUS" = "vpn-up" -a "$CONNECTION_UUID" = "$VPN_ID" ]; then
    ip link set "$INTERFACE" mtu 1000
fi



среда, 6 июня 2012 г.

Запускаем несколько инстансов MySQL на одной виртуалке и настраиваем репликацию Master-Slave

Понадобилось мне поднять сервер RADIUS, который работает с mysql, да причём так, что mysql работает в кластере по схеме master-slave. Так как нужно сделать на одной виртуалке, пришлось думать, как это реализовать. Естественно, всё уже давно придумано за нас и существует такая штука как mysqld_multi, которая создана для управления несколькими инстансами mysqld на одном сервере.

Сначала переделаем my.cnf для работы с несколькими серверами mysql.
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin

[mysqld1]
datadir=/var/lib/mysql
port=3306
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# replication
log_bin=mysql-bin
server_id=1

log-error=/var/log/mysqld1.log
pid-file=/var/run/mysqld/mysqld1.pid

[mysqld2]
datadir=/var/lib/mysql-slave
socket=/var/lib/mysql-slave/mysql.sock
port=3307
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# replication
log_bin=mysql-bin
server_id=2
log_slave_update=1

log-error=/var/log/mysqld2.log
pid-file=/var/run/mysqld/mysqld2.pid

Как мы видим, вместо пункта [mysqld] появились [mysqld1] и [mysqld2] для мастера и слейва, к которым можно подключиться при помощи разных сокетов или портов.

Далее создаём папку для слейва
mysql_install_db --user=mysql --datadir=/var/lib/mysql-slave/

Теперь настроим репликацию
На обеих нодах:
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';

На мастере смотрим
show master status;
Определяем файл и позицию. После чего на слейве настраиваем.
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'; 

Теперь на слейве делаем
start slave;
и смотрим, подключилась ли Mysql к мастеру.
SHOW SLAVE STATUS\G
             Slave_IO_State: Waiting for master to send event
                Master_Host: localhost
                Master_User: rep_user2
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000009
        Read_Master_Log_Pos: 334
             Relay_Log_File: mysqld2-relay-bin.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000009
           Slave_IO_Running: Yes
          Slave_SQL_Running: No
Если у нас всё хорошо, то должен быть статус вроде "Waiting for master to send event" и в процессах как на мастере, так и на слейве должен висеть процесс соединения.
Процессы можно посмотреть при помощи
SHOW PROCESSLIST\G

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

/etc/init.d/mysqld_multi
#!/bin/bash
#
# mysqld_multi  This shell script takes care of starting and stopping
#               the multi instances of MySQL daemons (mysqld_multi).
#
# chkconfig: - 64 36
# description:  MySQL database server.
# processname: mysqld
# config: /etc/my.cnf
# pidfile: /var/run/mysqld/mysqld1.pid
# pidfile: /var/run/mysqld/mysqld2.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


prog="MySQL Multi"

start(){

/usr/bin/mysqld_multi start 1 > /dev/null
/usr/bin/mysqld_multi start 2 > /dev/null
ret=$?
        if [ $ret -eq 0 ]; then
                    action $"Starting $prog: " /bin/true
        else
            action $"Starting $prog: " /bin/false
        fi
        return $ret
}

stop(){
/usr/bin/mysqld_multi stop $* > /dev/null
            ret=$?
            if [ $ret -eq 0 ]; then
                    action $"Stopping $prog: " /bin/true
        else
            ret=1
            action $"Stopping $prog: " /bin/false
        fi
        return $ret
}

restart(){
    stop
    start
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    /usr/bin/mysqld_multi report
        ;;
  restart)
    restart
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart}"
    exit 1
esac

exit $?



четверг, 31 мая 2012 г.

Пробуем на вкус systemd

Я тут немножко приболел и в свободное время захотелось пощупать systemd в gentoo, и потавил его на компьюетер, который используется у меня как мультимедиа-центр.
Особенностью этого компьюетера явялется то, что домашняя папка пользователя shtsh (из-под которого запущен xbmc) и /usr/portage монтируются по сети, используя nfs.

Пара слов о systemd. Этот проект разрабатывается как современная, гибкая и быстрая замена существующих систем инициализации и породила множество споров (бинарные логи! зачем нужен ещё один велосипед?!). Однако в него уже влился проект udev и к нему намертво привязали Gnome. Кроме того, systemd продвигается RedHat и уже входит в состав Fedora, что заставляет подозревать, что в RHEL 7 (в крайнем случае 8) и его форках (CentOS, Scientific Linux, Oracle Linux и проч.) systemd будет. А в Mageia, Mandriva, OpenSUSE уже есть. В debian, gentoo, archlinux доступен для отдельной установки.

Вот мануал, поэтому повторяться я не буду. Только расскажу, что пришлось сделать и впечатления.

Сначала, я чтобы не заморачиваться, прописал в USE-флаги systemd. Затем обновил систему при помощи emerge -avuDN @world. Потом приступил к настройкам по мануалу.
После настройки ядра, установки и прописывания в grub, мне понадобилось следующее.

Включить сеть, которая у меня настраивается при помощи DHCP.
systemctl enable dhcpcd.service
Включить ssh
systemctl enable sshd.service
После этого я посмотрел статус загрузки (вывод systemctl) и понял, что NFS шары не монтируются, так как на момент монтирования ещё недоступна сеть. Поэтому пришлось разбираться. Для этого я сделал следующее:

Создал в /etc/systemd/system файлы с настройками монтирования
mnt-disk.mount
[Unit]
Description=/mnt/disk NFS share
Wants=rpc-statd.service
After=network.target

[Mount]
What=server.home:/mnt/disk
Where=/mnt/disk
Type=nfs
usr-portage.mount
[Unit]
Description=/usr/portage NFS share
Wants=rpc-statd.service
After=network.target

[Mount]
What=server.home:/usr/portage
Where=/usr/portage
Type=nfs 

Затем заставил их подключаться при загрузке:
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

В отличии от мануала,  у меня не было xdm.service, поэтому пришлось думать, как сделать свой.
/etc/systemd/system/slim.service
[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

И включить его запуск
systemctl enable slim.service

В результате у меня запускался slim и xbmc только после того, как смонтируется домашняя папка, расположенная на сетевой шаре /mnt/disk.

Стоит отметить, что по своим настройкам systemd сильно отличается от остальных систем загрузки. В частности, эти самые service, target, mount. Однако всё это достаточно подробно (по крайней мере, лучше, чем я могу рассказать) расписано в манах. В частности в systemd.service, systemd.target, systemd.mount и прочие. Аналогично с пунктами настроек. Онлайн можно посмотреть по этой ссылке.

Также стоит обратить внимание, что системный лог ведётся в своём формате и его можно смотреть утилитой systemd-journalctl. Я так понял, что можно использовать /dev/kmesg, но пока не разобрался, как.

Выводы:
  • Диалог приветствия при использовании systemd появляется буквально через несколько секунд после загрузки (без использования SSD!), однако сеть и прочее подключаются после этого.
  • Как следствие из вышесказанного - есть смысл отказаться от хомяка через NFS, что сильно ускорит загрузку xbmc. Собственно, я так и сделал.
  • Systemd очень сильно отличается от других систем инициализации и с её настройкой действительно нужно отдельно разбираться. Хотя, может, когда она начнёт массово использоваться, появится много подробных howto.
  • Пока непонятно, зачем это нужно - 5-10 секунд выигрыша при загрузке, когда сейчас основной тормоз- скорость инициализации оборудования до загрузки ОС, особенно на серверах. Но серверы и загружаются крайне редко.
  • Пока что единственную пользу вижу в одном - возможность рестарта демона при падении. Но это не так и часто нужно.

вторник, 15 мая 2012 г.

Дамб БД mysql по ssh

Проблема: есть сервер БД, где мало свободного места (на дамп не хватит). Нужно сделать дамп БД.

Решение:
ssh -T <user>@<host> “mysqldump -u <db_user> -p <other switches> database | bzip2 -9” | bzip2 -dc > database.dump

Стоит обратить внимание на опцию -T, с которой не будет создаваться псевдотерминал и не испортится бинарный поток.