Posts Tagged ‘ linux

Ошибка в libpcap если в системе есть Bonding

В случае если ядро собрано с поддержкой bonding (CONFIG_BONDING=y or M) то утилиты которые используют библиотеку libpcap могут ругаться такой ошибкой:

pcap_findalldevs: SIOCGIFFLAGS: bonding_masters: No such device

решается данная проблема довольно просто: нужно пропатчить libpcap либо установить версию равную или выше libpcap-1.1.1-r1

 emerge -av /usr/portage/net-libs/libpcap/libpcap-1.1.1-r1.ebuild

Xen приняли в основную ветку ядра

Последние 2 года Xen планомерно впиливался в ядро Линукса.
И наконец-то его всунули полностью. Начиная с новой ветки ядра Linux 3.0, которая появилась вместо 2.6.40 (так как от 2.6 почти ничего не осталось), Xen как Dom0 сможет запускаться без каких то манипуляций с ядром (патчинг и т.д.), так же как и KVM, VirtualBox и другие.
Может в будущем Дебиановцы передумают отказываться от Ксена 🙂

For the past two years, Xen infrastructure has been getting included in the Linux kernel piece by piece. It’s finally done. A nice coincidence is that new version we’ll be called 3.0 instead of 2.6.30 – just like Xen was the feature so important it justified the change (in reality, there was no single large addition, just the sum of small changes since 2.6.0 made today kernel something completely different).

Soon an ordinary Linux system will be able to run as Xen dom0 (host) without any changes in the kernel, just like it is with KVM, VirtualBox and some other virtualization solutions. I hope it will stop the decline of Xen: when it’s no harder to setup then its competitors and offers better performance, it’s becoming and interesting choice again.

Как вывести список всех установленных в системе пакетов с указанием флагов с которыми они были собраны?

Подборка всяких извращенных методов применительно в Gentoo 🙂

emerge -vpe world
find /var/db/pkg/* -mindepth 2 -maxdepth 2 | cut -d "/" -f 5-6 | sort -u | while read p; do printf "%s {" "${p}"; cat "/var/db/pkg/${p}/USE" | sed "s/$/}/"; done
cd /var/db/pkg/; grep "" -r */*/IUSE
qlist -IUv                #qlist входит в app-portage/portage-utils
for im in `find /var/db/pkg/ | grep /USE`; do appname=`dirname $im`; echo -n "`basename $appname` :: " && cat $im; done
eix -I                     #eix - это app-portage/eix

Навчальний курс по Qt

Qt

Qt

На сайті розробників Qt з’явився навчальний курс по цій же мові.
Навчальний курс розбитий на лекції по 2х45хв
Посилання на оригінальну статтю
http://qt.nokia.com/services-partners/qt-in-education/qt-in-education-course-material
Всі матеріали поширюються на умовах Creative Commons Attribution-Non-Commercial-Share Alike 2.5.
Курс буде перекладений на різні мови силами співтовариства.
Посилання на копію QtCourseMaterial L1-L10

ScreenShot of Qt

ScreenShot of Qt


Qt creator editor

Qt creator editor

Asterisk: импорт из Master.csv в Postgresql

postgres=# CREATE USER ast_user with password 'xxxxxxx';
CREATE ROLE
postgres=# CREATE DATABASE ast_db with owner ast_user;
CREATE DATABASE
postgres=#exit
 
psql ast_db ast_user
ast_db=> CREATE TABLE cdr (
calldate TIMESTAMP WITH TIME zone DEFAULT now() NOT NULL,
clid CHARACTER VARYING(80) DEFAULT '' NOT NULL,
src CHARACTER VARYING(80) DEFAULT '' NOT NULL,
dst CHARACTER VARYING(80) DEFAULT '' NOT NULL,
dcontext CHARACTER VARYING(80) DEFAULT '' NOT NULL,
channel CHARACTER VARYING(80) DEFAULT '' NOT NULL,
dstchannel CHARACTER VARYING(80) DEFAULT '' NOT NULL,
lastapp CHARACTER VARYING(80) DEFAULT '' NOT NULL,
lastdata CHARACTER VARYING(80) DEFAULT '' NOT NULL,
duration BIGINT DEFAULT 0::BIGINT NOT NULL,
billsec BIGINT DEFAULT 0::BIGINT NOT NULL,
disposition CHARACTER VARYING(45) DEFAULT '' NOT NULL,
amaflags BIGINT DEFAULT 0::BIGINT NOT NULL,
accountcode CHARACTER VARYING(20) DEFAULT '' NOT NULL,
uniqueid CHARACTER VARYING(32) DEFAULT '' NOT NULL,
userfield CHARACTER VARYING(255) DEFAULT '' NOT NULL
);
CREATE TABLE

Устанавливаем поддержку постгреса в Perl:

perl -e shell -MCPAN
install DBI::DBD
install DBD::Pg

Создаем скрипт для переноса даных:
Read more

Gentoo Xen 4

Повесть о том как я Xen4 мучал… или он меня…..
Что мы имеем:

uname -a
Linux Gentoo 2.6.34-xen-r4 #3 SMP Sat Jan 1 19:30:46 EET 2011 x86_64 AMD Phenom(tm) II X4 925 Processor AuthenticAMD GNU/Linux

И почти мертвый винт на 500Г

  5 Reallocated_Sector_Ct   0x0033   090   090   140    Pre-fail  Always   FAILING_NOW 873

Перед установкой пакетов необходимо снять с них архитектурное маскирование (~x64):

echo "app-emulation/xen
app-emulation/xen-tools
sys-kernel/xen-sources" >> /etc/portage/package.keywords

До начала сборки нужно выполнить следующие шаги:

1. Добавить в /etc/make.conf опции компилятора:

      CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer -mfpmath=sse -funroll-loops -mno-tls-direct-seg-refs"
      CXXFLAGS="${CFLAGS}"

2. Там же (в /etc/make.conf), можно включить опции сборки бинарных пакетов (готовые пакеты emerge разместит в /usr/portage/packages), они пригодятся для ускоренного развертывания domU:

      FEATURES="buildpkg"

3. Пересобрать текущее окружение с новой опцией компилятора, которая нужна корректной работы системного окружения с гипервизором xen (заодно построятся бинарные пакеты окружения):

      emerge -evat world

Предварительный этап окончен, можно запускать сборку/установку пакетов xen, xen-tools и исходников адаптированного для Xen ядра — xen-sources:

emerge -av xen-sources xen xen-tools

Read more

VirtualBox на сервере Gentoo без графической оболочки

Небольшой мануал для установки VirtualBox на сервер в котором нет Х-ов
Установку будем производить на Gentoo, клиентской машиной будет Debian

Ставим ВиртуалБокс

ACCEPT_KEYWORDS="~amd64" USE="headless -chm -hal -opengl -qt4 rdesktop-vrdp vboxwebsrv" emerge -av /usr/portage/app-emulation/virtualbox-bin/virtualbox-bin-3.2.12.ebuild

Создаем виртуальную машину (тоесть ее описание в конфигах)

VBoxManage createvm --name "Debian" --register --basefolder /data/Virtual/

Если нужно смотрим типы ОС

VBoxManage list ostypes

Настройки виртуалки

VBoxManage modifyvm 'Debian' --memory 256 --acpi on --boot1 dvd -nic1 nat --ostype Debian

Где мы указали, что сеть у нас за НАТом, грузится будем с cd\dvd, ну и урезали память до 256Мб

Создаем винт на 30Гб фиксированого размера.

VBoxManage createhd --filename "/data/Virtual/Debian.vdi" --size 30000 --variant Fixed --register

…пока он создается можно попить кофе
Добавляем сата контроллер (опционально)

VBoxManage storagectl 'Debian' --add sata --controller IntelAHCI --name "SATA Controller"

Качаем установочный образ ОС

wget http://cdimage.debian.org/debian-cd/5.0.7/i386/iso-cd/debian-507-i386-netinst.iso

Добавляем ISO в VirtualBox (чтоб он знал о ее существовании)

VBoxManage openmedium dvd debian-507-i386-netinst.iso

Добавляем IDE контроллер

VBoxManage storagectl "Ubuntu" --name "IDE Controller" --add ide --controller PIIX4

И на второй порт цепляем ISO

VBoxManage storageattach 'Debian' --storagectl "IDE Controller" --port 0 --device 1 --type dvddrive --medium /data/install/debian/debian-507-i386-netinst.iso

Включаем наш винт на первый порт

VBoxManage storageattach 'Debian' --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium /data/Virtual/Debian.vdi

Смотрим настройки

VBoxManage showvminfo Debian

Запускаемся с включенным RDP

VBoxManage startvm Debian --type vrdp

Можно еще запуститься с логином, чтоб у кого-то руки не чесались 🙂

VBoxManage setproperty vrdpauthlibrary "VRDPAuthSimple"
VBoxManage modifyvm "Debian" --vrdpauthtype external
VBoxManage setextradata "Debian" "VRDPAuthSimple/users/john" "secret

Waiting for the VM to power on…

VM has been successfully started.

проверяем подключение к консоли

netstat -anp | grep 33
 
tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN      32227/VBoxHeadless

Можно и инфу позырить

VBoxManage showvminfo Debian

Ну и подключаемся к терминалу любым терминальным клиентом …. все работает

Правила Rewrite для поддержки ЧПУ на серверах под управлением Nginx для DLE

После перехода на с Apache на связку Nginx+spawn-cgi у меня некоректно запустились сайті на DLE.
Причем проблемы была именно в ссылках ЧПУ. Обычные ссылки newsid=xxx прекласно работали.
Решение проблемы
В конфиге Nginx вместо :

#                            if (!-e $request_filename) {
#                            rewrite ^(.+)$ /index.php?q=$1 last;

Вставляем такой код:

rewrite ^/page/(.*)$ /index.php?cstart=$1 last;
 
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page,([0-9]+),([0-9]+),(.*).html(/?)+$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&cstart=$5&news_name=$6 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page,([0-9]+),(.*).html(/?)+$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/print:page,([0-9]+),(.*).html(/?)+$ /engine/print.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/(.*).html(/?)+$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_name=$4 last;
 
rewrite ^/([^.]+)/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$4&news_page=$2&cstart=$3 last;
rewrite ^/([^.]+)/page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$3&news_page=$2 last;
rewrite ^/([^.]+)/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /engine/print.php?news_page=$2&newsid=$3 last;
rewrite ^/([^.]+)/([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$2 last;
 
rewrite ^/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$3&news_page=$1&cstart=$2 last;
rewrite ^/page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$2&news_page=$1 last;
rewrite ^/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /engine/print.php?news_page=$1&newsid=$2 last;
rewrite ^/([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$1 last;
 
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)(/?)+$ /index.php?year=$1&month=$2&day=$3 last;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page/([0-9]+)(/?)+$ /index.php?year=$1&month=$2&day=$3&cstart=$4 last;
rewrite ^/([0-9]+)/([0-9]+)(/?)+$ /index.php?year=$1&month=$2 last;
rewrite ^/([0-9]+)/([0-9]+)/page/([0-9]+)(/?)+$ /index.php?year=$1&month=$2&cstart=$3 last;
rewrite ^/([0-9]+)(/?)+$ /index.php?year=$1 last;
rewrite ^/([0-9]+)/page/([0-9]+)(/?)+$ /index.php?year=$1&cstart=$2 last;
rewrite ^/tags/([^/]*)(/?)+$ /index.php?do=tags&tag=$1 last;
rewrite ^/tags/([^/]*)/page/([0-9]+)(/?)+$ /index.php?do=tags&tag=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/rss.xml$ /engine/rss.php?subaction=allnews&user=$1 last;
rewrite ^/user/([^/]*)(/?)+$ /index.php?subaction=userinfo&user=$1 last;
rewrite ^/user/([^/]*)/page/([0-9]+)(/?)+$ /index.php?subaction=userinfo&user=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/news(/?)+$ /index.php?subaction=allnews&user=$1 last;
rewrite ^/user/([^/]*)/news/page/([0-9]+)(/?)+$ /index.php?subaction=allnews&user=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/news/rss.xml(/?)+$ /engine/rss.php?subaction=allnews&user=$1 last;
rewrite ^/lastnews/(/?)+$ /index.php?do=lastnews last;
rewrite ^/lastnews/page/([0-9]+)(/?)+$ /index.php?do=lastnews&cstart=$1 last;
rewrite ^/catalog/([^/]*)(/?)+$ /index.php?catalog=$1 last;
rewrite ^/catalog/([^/]*)/page/([0-9]+)(/?)+$ /index.php?catalog=$1&cstart=$2 last;
rewrite ^/newposts(/?)+$ /index.php?subaction=newposts last;
rewrite ^/newposts/page/([0-9]+)(/?)+$ /index.php?subaction=newposts&cstart=$1 last;
rewrite ^/static/(.*).html(/?)+$ /index.php?do=static&page=$1 last;
rewrite ^/favorites(/?)+$ /index.php?do=favorites last;
rewrite ^/favorites/page/([0-9]+)(/?)+$ /index.php?do=favorites&cstart=$1 last;
 
rewrite ^/rules.html$ /index.php?do=rules last;
rewrite ^/statistics.html$ /index.php?do=stats last;
rewrite ^/addnews.html$ /index.php?do=addnews last;
rewrite ^/rss.xml$ /engine/rss.php last;
rewrite ^/sitemap.xml$ /uploads/sitemap.xml last;
 
rewrite ^/category/([^.]+)/(.*).html(/?)+$ /index.php?subaction=showfull&news_name=$2 last;
rewrite ^/category/([^.]+)/page/([0-9]+)(/?)+$ /index.php?do=cat&category=$1&cstart=$2 last;
rewrite ^/category/([^.]+)(/?)+$ /index.php?do=cat&category=$1 last;
 
if (!-d $request_filename) {
        rewrite ^/([^.]+)/page/([0-9]+)(/?)+$ /index.php?do=cat&category=$1&cstart=$2 last;
        rewrite ^/([^.]+)/?$ /index.php?do=cat&category=$1 last;
}
 
if (!-f $request_filename) {
        rewrite ^/([^<]+)/rss.xml$ /engine/rss.php?do=cat&category=$1 last;
        rewrite ^/page,([0-9]+),([^/]+).html$ /index.php?do=static&page=$2&news_page=$1 last;
        rewrite ^/print:([^/]+).html$ /engine/print.php?do=static&page=$1 last;
}
 
if (!-f $request_filename) {
        rewrite ^/([^/]+).html$ /index.php?do=static&page=$1 last;
}

Проблема с нумерацией сетевых интерфейсов в Gentoo

В случае если менять сетевые интерфейсы на системе с генту ( как вариант замена сгоревшей), то следующая новая сетевая карта получит индекс на единицу больший.
Но иногда это не оправдано, когда в системе 3 сетевые карты, а вы заменили 2 из них… в итоге получаем : eth1,eth3,eth4 … не очень удобно и не практично.
Чтоб немного разрулить эту ситуацию можно пойти двумя путями:
1. очистить содержимое файла /etc/udev/rules.d/70-persistent-net.rules с которого udev берет информацию.
После перезагрузки вы получите нумерацию eth0, eth1,eth2
2. Отредактировать вручную этот файл на свое усмотрение:

cat /etc/udev/rules.d/70-persistent-net.rules 
# This file was automatically generated by the /lib64/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
 
# PCI device 0x14e4:0x1648 (tg3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:81:34:2a:0b", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
 
# PCI device 0x14e4:0x1648 (tg3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:81:34:2a:0a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
 
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:07:e9:0b:28:e0", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
 
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:07:e9:0b:28:d5", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
 
# PCI device 0x8086:0x1229 (e100)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:81:34:2a:55", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth4"

Миграция Postgres с 8.4 на 9.0

Решились потренироваться делать репликацию Master-Slave, которая реализована в версии 9.0
Значит так-с…
1. Обновляем Portage

emerge --sync

2. Ставим новую БД

LINGUAS="ru" ACCEPT_KEYWORDS="~amd64" emerge -av  /usr/portage/dev-db/postgresql-server/postgresql-server-9.0.1.ebuild

3. Конфигурим

emerge --config =dev-db/postgresql-server-9.0.1

4. правим конфиг и запускаем на порту 6543, не выключая старый постгресс
5. производим миграцию БД

pg_dumpall -p 5432 | psql -d postgres -p 6543

6. стартуем новую БД на порту 5432 предварительно выключив старую

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

LINGUAS="ru" ACCEPT_KEYWORDS="~amd64" emerge -av  /usr/portage/dev-db/postgresql-server/postgresql-server-9.0.1.ebuild

Вносим изменения в Master, чтобы слэйв мог к нему подключится:

$ $EDITOR postgresql.conf
listen_addresses = '10.0.xx.yy'
 
$ $EDITOR pg_hba.conf
# The standby server must have superuser access privileges.
host  replication  postgres  10.0.xx.zz/22  trust

Read more

Осваиваем Git

Никогда не пользовался системами контроля версий, так как мало что творю на языках программирования, а скрипты можно просто хранить в папочке.
Ну и вот решил попробовать хранить скрипты (и не только) в каком-то хранилище, но при этом упустить освоение SVN И CVS, а сразу приступить к Git’у , так как мы не исчем легких путей 🙂

Для начала создаем собственный репозиторий с проэктом, который будет находится не на локальной машине, а где-то в сети.
Пишу по мотивам статьи How to set up your own private Git server on Linux
Сервер и клиенты (в основном) работают под управлением Gentoo.
Итак приступим.
Для начала добавим свой публичный ключ на сервер

cd ~/.ssh
ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub 'user'@'server':.ssh/authorized_keys

Теперь мы можем зайти по SSH на наш сервер и установить Git:

ssh <server>
ACCEPT_KEYWORDS="~amd64" USE="bash-completion cvs subversion" emerge -av git
</server>

Теперь добавим пользователя

useradd -d /home/git -m -s /bin/bash git

Теперь вам нужно добавить свой публичный ключ для пользователя Git

mkdir /home/git/.ssh
cp ~/.ssh/authorized_keys /home/git/.ssh/
chown -R git:git /home/git/.ssh
chmod 700 !$
chmod 600 /home/git/.ssh/*

Read more