<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jared.kiev.ua &#187; FreeBSD</title>
	<atom:link href="http://jared.kiev.ua/tags/freebsd/feed/" rel="self" type="application/rss+xml" />
	<link>http://jared.kiev.ua</link>
	<description>Сетап как стиль жизни</description>
	<lastBuildDate>Tue, 06 Dec 2011 13:58:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Поиск в логах Exim</title>
		<link>http://jared.kiev.ua/2011/12/exim-search-log/</link>
		<comments>http://jared.kiev.ua/2011/12/exim-search-log/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 13:58:43 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Скрипты]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=259</guid>
		<description><![CDATA[<p>Часто бывает, что кто-то просит найти письмо такого-то пользователя, которое было отправлено позавчера, например. Можно перерывать логи руками, а можно воспользоваться скриптом, который любезно прислал один из читателей:</p>
<p><code>#!/bin/sh</p>
<p>to_grep="$*"</p>
<p>if [ ${#to_grep} = 0 ]<br />
then<br />
    echo "<br />
    STOP: Where is search string?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</code></p>
<p><a href="http://jared.kiev.ua/2011/12/exim-search-log/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Часто бывает, что кто-то просит найти письмо такого-то пользователя, которое было отправлено позавчера, например. Можно перерывать логи руками, а можно воспользоваться скриптом, который любезно прислал один из читателей:</p>
<p><code>#!/bin/sh</p>
<p>to_grep="$*"</p>
<p>if [ ${#to_grep} = 0 ]<br />
then<br />
    echo "<br />
    STOP: Where is search string?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>tmp_major_filename="/tmp/searchmajortmp$$"<br />
rm -f "${tmp_major_filename}"</p>
<p># Мониторим Ctrl+C чтобы не оставлять хвостов из временных файлов.<br />
trap 'rm -f ${tmp_major_filename} ;echo ; exit 13' TERM INT</p>
<p>exlog_log="/var/log/exim/mainlog"</p>
<p>if [ ! -r "${exlog_log}" ]<br />
then<br />
    echo "<br />
        STOP: Where is exim log?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>today_is=`date +%Y-%m-%d`</p>
<p>echo "1" | awk -v today_is="${today_is}" -v rex_log="${exlog_log}" '{<br />
    dl_cn = 0                                   # устанавливаем счетчик дней в 0<br />
    # Получаем список файлов лога exim-a, считаем их количество.<br />
    cmd_get_file_list=("ls "rex_log"*")<br />
    while ((cmd_get_file_list |getline)> 0) {<br />
        ++fl_cn<br />
    }<br />
    close (cmd_get_file_list)</p>
<p>    # Узнаем что у нас за ОС<br />
    cmd_what_os=("uname -s")<br />
    cmd_what_os |getline os_is<br />
    close(cmd_what_os)</p>
<p>    while (dl_cn < fl_cn) {<br />
        # Получаем три значения в массиве (год, месяц, день) - текущая дата.<br />
        if (dl_cn == 0) {<br />
            split(today_is,TEMPTODAY,"-")<br />
            today_is_month = TEMPTODAY[2]<br />
            month_arg = TEMPTODAY[2]<br />
        } else {<br />
            cmd_month_arg = (today_is_month - month_arg)<br />
            # Получаем три значения в массиве (год, месяц, день) - последнее число нужного нам предыдущего месяца.<br />
            if (os_is == "FreeBSD" || os_is == "Darwin") {<br />
                cmd_date_last_month=("date -v-"cmd_day_arg"d -v-"cmd_month_arg"m +%Y-%m-%d")<br />
            } else {<br />
                cmd_date_last_month=("date -d \""cmd_day_arg" days ago "cmd_month_arg" months ago\" +%Y-%m-%d")<br />
            }<br />
            cmd_date_last_month |getline<br />
            split($0,TEMPTODAY,"-")<br />
            close (cmd_date_last_month)<br />
        }</p>
<p>        # Выясняем до какого числа месяца будем делать декремент.<br />
        days_until = (fl_cn - dl_cn)<br />
        if (days_until > 0) {<br />
            day_until = 1<br />
        } else {<br />
            day_until = days_until<br />
        }</p>
<p>        cmd_day_arg = TEMPTODAY[3]</p>
<p>        # Получаем список дат в нисходящем порядке, забиваем в массив.<br />
        for (tmp_td=TEMPTODAY[3];tmp_td>=day_until;tmp_td--) {<br />
            # Заодно пририсовываем нули для красоты.<br />
            if (length(tmp_td) == 1) {<br />
                day_number = ("0"tmp_td)<br />
            } else {<br />
                day_number = tmp_td<br />
            }<br />
            FILESLIST[++dl_cn] = (TEMPTODAY[1]"-"TEMPTODAY[2]"-"day_number)<br />
        }</p>
<p>        # Проверяем первая ли у нас итерация цикла.<br />
        if (month_arg != today_is_month) {<br />
            month_arg--<br />
        }<br />
        split("",TEMPTODAY)<br />
    }</p>
<p>    # Печать массива.<br />
    printf "\n"<br />
    for (xs=1;xs<=fl_cn;xs++) {<br />
        printf "\t%s%s%s\t%s\n" , "(", xs, ")", FILESLIST[xs]<br />
    }<br />
    split("",FILESLIST)<br />
        printf "\n\t"<br />
    exit<br />
}'</p>
<p>read -p "Enter Digit:   " num_to_grep</p>
<p>if [ ${#num_to_grep} = 0 ]<br />
then<br />
    echo "<br />
        STOP: Where is digit?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>awk -v tmfname="${tmp_major_filename}" -v today_is="${today_is}" -v num_to_grep="${num_to_grep}" -v rex_log="${exlog_log}" -v to_grep="${to_grep}" '{<br />
    # Проверяем пользовательский ввод. Устанавливаем переменную w_show.<br />
    if ($0 ~ /^[1-3]$/) {<br />
        w_show=$0<br />
        exit<br />
    } else {<br />
        printf "\n\t%s\n\n", msg_wrong_number > err_log<br />
        split("",QUEUEARR)<br />
        split("",REJARRAY)<br />
        was_error = 1<br />
        exit 1<br />
    }<br />
} BEGIN {<br />
    q_cn = 0<br />
    r_cn = 0<br />
    err_log = "/dev/stderr"</p>
<p>    # Сообщения<br />
    msg_nothing_to_show = "STOP: Nothing to show."<br />
    msg_no_records = "STOP: No Records."<br />
    msg_wrong_number = "STOP: Wrong number."<br />
    msg_header_major = "SUCCESS"<br />
    msg_header_minor = "FAILURE"<br />
    msg_header_summ = "SUMMARY"</p>
<p>    # Паттерн очереди<br />
    patt_QUEbe = "^[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]-[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]-[A-Za-z0-9][A-Za-z0-9]$"</p>
<p>    # Получаем список файлов лога exim-a, добавляем их в массив, считаем их количество.<br />
    cmd_get_file_list=("ls "rex_log"*")<br />
    while ((cmd_get_file_list |getline)> 0) {<br />
        FILESLIST[++fl_cn] = $0<br />
    }<br />
    close (cmd_get_file_list)</p>
<p>    # Проверяем пользовательский ввод. Получаем имя файла, проверяем заархивирован ли он, устанавливаем необходимые переменные.<br />
    if (num_to_grep ~ /^[0-9]+$/ &#038;&#038; (num_to_grep <= fl_cn &#038;&#038; num_to_grep != 0)) {<br />
        ex_log = FILESLIST[num_to_grep]<br />
        tmpfilename_parts = split(FILESLIST[num_to_grep],TMPFILENAME,".")<br />
        if (TMPFILENAME[tmpfilename_parts] == "gz") {<br />
            first_grep = ("zgrep -ni \""to_grep"\" "ex_log)<br />
            second_grep = ("zgrep -f "tmfname" "ex_log)<br />
            pr_ex_log = ("zcat "ex_log)<br />
        } else {<br />
            first_grep = ("grep -ni \""to_grep"\" "ex_log)<br />
            second_grep = ("grep -f "tmfname" "ex_log)<br />
            pr_ex_log = ("cat "ex_log)<br />
        }<br />
        split("",TMPFILENAME)<br />
        split("",FILESLIST)<br />
    } else {<br />
        printf "\n\t%s\n\n", msg_wrong_number > err_log<br />
        was_error = 1<br />
        exit 1<br />
    }</p>
<p>    # Запускаем греп лога екзима. Если в строке в нужном месте есть совпадение с паттерном очереди, и это не реджект,<br />
    # добавляем очередь в массив очередей. Иначе номер строки лога в массив номеров строк лога.<br />
    while ((first_grep |getline)> 0) {<br />
        if (split($0,TMPLINE,":")>0) {<br />
            testqueue = substr(TMPLINE[4],4,16)<br />
            if (testqueue ~ patt_QUEbe) {<br />
                if (substr(TMPLINE[4],21,8) == "rejected") {<br />
                    REJARRAY[++r_cn] = TMPLINE[1]<br />
                } else if ((testqueue in QUEUEARR) == 0) {<br />
                    QUEUEARR[testqueue]<br />
                    ++q_cn<br />
                }<br />
            } else {<br />
                REJARRAY[++r_cn] = TMPLINE[1]<br />
            }</p>
<p>        }<br />
        split("",TMPLINE)<br />
    }<br />
    printf "\n"<br />
    close (first_grep)</p>
<p>        # Считаем и печатаем сколько мы всего нашли. Заодно приглашение ввода номера того что хочется увидеть если чего-то нашли.<br />
        printf "\t%s\t%s\t%s\n", "(1)", msg_header_major, q_cn<br />
        printf "\t%s\t%s\t%s\n", "(2)", msg_header_minor, r_cn<br />
        printf "\t%s\t%s\t%s\n", "(3)", msg_header_summ, (q_cn+r_cn)<br />
        if ((q_cn+r_cn) == 0) {<br />
            printf "\n\t%s\n\n", msg_nothing_to_show > err_log<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            was_error = 1<br />
            exit 1<br />
        } else {<br />
            printf "\n\t%s\t" , "Enter Digit:"<br />
        }<br />
} END {<br />
    if (was_error == 1) {<br />
        exit 1<br />
    }</p>
<p>    # Получаем значение год-месяц-день из лога который будем показывать.<br />
    pr_ex_log | getline<br />
    close (pr_ex_log)<br />
    actdte = substr($0,1,10)</p>
<p>    # Устанавливаем переменные - элементы декора.<br />
    header_major = sprintf("%s%s%s%s%s", "-------------------------------- ",msg_header_major," ---------------------------------------- ",actdte," ----------------------")<br />
    header_minor = sprintf("%s%s%s%s%s", "-------------------------------- ",msg_header_minor," ---------------------------------------- ",actdte," ----------------------")<br />
    footer = sprintf("%s%s%s\n", "------------------------------------------------------------------------------- ",actdte," ----------------------")<br />
    splitter_completed = sprintf("%s", "+ ------------ c -- o -- m -- p -- l -- e -- t -- e -- d ---------------------- +")</p>
<p>    cmd_more = "more"</p>
<p>    # Пользователь возжелал увидеть очереди.<br />
    if (w_show == 1) {<br />
        if (q_cn == 0) {<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            printf "\n\t%s\n\n", msg_no_records > err_log<br />
            exit 1<br />
        } else {<br />
            y = 1<br />
            z = 0<br />
            # Сбрасываем содержимое массива очередей во временный файл<br />
            for (tq in QUEUEARR) {<br />
                print (tq) >> tmfname<br />
            }<br />
            print(header_major)<br />
            # Грепаем лог екзима используя временный файл в качестве файла паттернов.<br />
            while ((second_grep |getline)> 0) {<br />
                if (length($0) == 46) {<br />
                    if (substr($0,38,9) == "Completed") {<br />
                        print (splitter_completed) | cmd_more<br />
                    } else {<br />
                        print(substr($0,12)) | cmd_more<br />
                    }<br />
                } else {<br />
                    print(substr($0,12)) | cmd_more<br />
                }<br />
            }<br />
            close (second_grep)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }</p>
<p>    # Пользователь возжелал увидеть отлупы.<br />
    } else if (w_show == 2) {<br />
        if (r_cn == 0) {<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            printf "\n\t%s\n\n", msg_no_records > err_log<br />
            exit 1<br />
        } else {<br />
            y = 1<br />
            z = 0<br />
            print(header_minor)<br />
            while ((pr_ex_log |getline)> 0) {<br />
                z++<br />
                if(z == REJARRAY[y]){<br />
                    print(substr($0,12)) | cmd_more<br />
                    y++<br />
                }<br />
            }<br />
            close (pr_ex_log)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }</p>
<p>    # Пользователь возжелал увидеть все.<br />
    } else if (w_show == 3) {<br />
        if (r_cn != 0) {<br />
            y = 1<br />
            z = 0<br />
            print(header_minor)<br />
            while ((pr_ex_log |getline)> 0) {<br />
                z++<br />
                if(z == REJARRAY[y]){<br />
                    print(substr($0,12)) | cmd_more<br />
                    y++<br />
                }<br />
            }<br />
            close (pr_ex_log)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }<br />
        if (q_cn != 0) {<br />
            y = 1<br />
            z = 0<br />
            # Сбрасываем содержимое массива очередей во временный файл<br />
            for (tq in QUEUEARR) {<br />
                print (tq) >> tmfname<br />
            }<br />
            print(header_major)<br />
            # Грепаем лог екзима используя временный файл в качестве файла паттернов.<br />
            while ((second_grep |getline)> 0) {<br />
                if (length($0) == 46) {<br />
                    if (substr($0,38,9) == "Completed") {<br />
                        print (splitter_completed) | cmd_more<br />
                    } else {<br />
                        print(substr($0,12)) | cmd_more<br />
                    }<br />
                } else {<br />
                    print(substr($0,12)) | cmd_more<br />
                }<br />
            }<br />
            close (second_grep)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }<br />
    }<br />
    split("",QUEUEARR)<br />
    split("",REJARRAY)<br />
}' -</p>
<p>rm -f "${tmp_major_filename}"</p>
<p># Настройки логгирования в конфиге exim:<br />
# --<br />
# log_file_path = /var/log/exim/exim_%s.log<br />
# write_rejectlog = no<br />
#<br />
# log_selector = \<br />
#    +all_parents \<br />
#    +connection_reject \<br />
#    -host_lookup_failed \<br />
#    -incoming_interface \<br />
#    -lost_incoming_connection \<br />
#    +received_sender \<br />
#    +received_recipients \<br />
#    +smtp_confirmation \<br />
#    +smtp_syntax_error \<br />
#    +smtp_protocol_error \<br />
#    -queue_run<br />
#<br />
# syslog_timestamp = yes<br />
#<br />
# --<br />
#<br />
# Ver 1.1<br />
#</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/12/exim-search-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сборка gmirror без перезагрузки</title>
		<link>http://jared.kiev.ua/2011/08/gmirror/</link>
		<comments>http://jared.kiev.ua/2011/08/gmirror/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 22:15:40 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Общее]]></category>
		<category><![CDATA[Gmirror]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=253</guid>
		<description><![CDATA[<p>В сети есть достаточное количество описаний, как на FreeBSD собрать программный RAID-1, он же gmirror. Все они требуют в определенный момент перезагрузки сервера между включением в зеркало первого диска и остальных. Однако, бывают ситуации, когда она нежелательна либо невозможна. Прямо сейчас строю такую машинку, соответственно, пришлось выкручиваться. Итак, начнем:</p>
<p><a href="http://jared.kiev.ua/2011/08/gmirror/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>В сети есть достаточное количество описаний, как на FreeBSD собрать программный RAID-1, он же gmirror. Все они требуют в определенный момент перезагрузки сервера между включением в зеркало первого диска и остальных. Однако, бывают ситуации, когда она нежелательна либо невозможна. Прямо сейчас строю такую машинку, соответственно, пришлось выкручиваться. Итак, начнем:</p>
<p>Включаем в ядро поддержку gmirror после перезагрузки:<br />
<code># echo 'geom_mirror_load=YES' >> /boot/loader.conf</code></p>
<p>Даем системе доступ для изменения конфигурации дисков:<br />
<code># sysctl kern.geom.debugflags=16<br />
kern.geom.debugflags: 0 -> 16</code></p>
<p>Вставляем первый диск:<br />
<code># gmirror label -v -b round-robin gm0 /dev/ad4<br />
Metadata value stored on /dev/ad4.<br />
Done.</code></p>
<p>Правим /etc/fstab. В нем меняем все вхождения /dev/ad4 на /dev/mirror/gm0, например, /dev/ad4s1a станет /dev/mirror/gm0s1a и т.п.</p>
<p>Дальше самая хитрость &#8211; вместо перезагрузки подгружаем ядру модуль gmirror и вставляем второй диск:<br />
<code># kldload geom_mirror<br />
# gmirror insert gm0 /dev/ad6<br />
</code></p>
<p>Проверяем:<br />
<code># gmirror list<br />
Geom name: gm0<br />
State: DEGRADED<br />
Components: 2<br />
Balance: round-robin<br />
Slice: 4096<br />
Flags: NONE<br />
GenID: 0<br />
SyncID: 1<br />
ID: 1867633513<br />
Providers:<br />
1. Name: mirror/gm0<br />
   Mediasize: 750156373504 (699G)<br />
   Sectorsize: 512<br />
   Mode: r1w0e0<br />
Consumers:<br />
1. Name: ad4<br />
   Mediasize: 750156374016 (699G)<br />
   Sectorsize: 512<br />
   Mode: r1w1e1<br />
   State: ACTIVE<br />
   Priority: 0<br />
   Flags: NONE<br />
   GenID: 0<br />
   SyncID: 1<br />
   ID: 129648194<br />
2. Name: ad6<br />
   Mediasize: 750156374016 (699G)<br />
   Sectorsize: 512<br />
   Mode: r1w1e1<br />
   State: SYNCHRONIZING<br />
   Priority: 0<br />
   Flags: DIRTY, SYNCHRONIZING<br />
   GenID: 0<br />
   SyncID: 1<br />
   Synchronized: 0%<br />
   ID: 3539837274<br />
</code></p>
<p>Видим, что зеркало соорудилось и пошла синхронизация. Далее остается периодически поглядывать за ее ходом:<br />
<code># gmirror status<br />
      Name    Status  Components<br />
mirror/gm0  DEGRADED  ad4<br />
                      ad6 (22%)<br />
</code></p>
<p>По окончании процесса можно и перегрузиться с собранным зеркалом.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/08/gmirror/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exim: автоблокировка спам-хостов</title>
		<link>http://jared.kiev.ua/2011/05/exim-autoblock-spam/</link>
		<comments>http://jared.kiev.ua/2011/05/exim-autoblock-spam/#comments</comments>
		<pubDate>Mon, 16 May 2011 11:38:27 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[Spamassassin]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=246</guid>
		<description><![CDATA[<p>Несмотря на то, что моя конфигурация Exim вышла довольно удачной, некоторое количество спама через нее все же проходит. Как правило, сыпется он с одних и тех же спам-серверов, которые можно блокировать. Однако, каждый раз ходить на сервер через некоторое время становится лениво, потому автоматизируем процесс:</p>
<p><a href="http://jared.kiev.ua/2011/05/exim-autoblock-spam/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Несмотря на то, что моя конфигурация Exim вышла довольно удачной, некоторое количество спама через нее все же проходит. Как правило, сыпется он с одних и тех же спам-серверов, которые можно блокировать. Однако, каждый раз ходить на сервер через некоторое время становится лениво, потому автоматизируем процесс:</p>
<pre>#!/bin/sh

for file in `find /var/mail/yourdomain.com/spamreport/new -type f`
do
    cat $file | grep "Subject: block=" | sed 's/Subject: block=//' >> /usr/local/etc/exim/spam-hosts
done

rm -f /var/mail/yourdomain.com/spamreport/new/*
</pre>
<p>Осталось внести изменения в конфигурацию Exim. Добавляем в /usr/local/etc/exim/100.main.conf: </p>
<pre>hostlist bad_hosts = net-iplsearch;/usr/local/etc/exim/spam-hosts</pre>
<p>В /usr/local/etc/exim/configure правим ту часть, где описывается acl_check_rcpt:</p>
<pre># Эти правила срабатывают для каждого письма
acl_check_rcpt:

warn set acl_c_lp       = $local_part@$domain

deny   message = Relay not permitted
       hosts = +bad_hosts
</pre>
<p>Создаем файл и перезапускаем Exim:</p>
<pre># touch /usr/local/etc/exim/spam-hosts
# /usr/local/etc/rc.d/exim restart
</pre>
<p>Для успешной работы надо создать почтовый ящик spamreport@yourdomain.com и вставить вызов скрипта в Cron. Теперь на spamreport@yourdomain.com можно отправлять письма с темой &laquo;block=123.32.14.56&#8243;, где 123.32.14.56 &#8211; ip спам-сервера.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/05/exim-autoblock-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Спасение данных с умирающего диска</title>
		<link>http://jared.kiev.ua/2010/09/bad-blocks-gmirror/</link>
		<comments>http://jared.kiev.ua/2010/09/bad-blocks-gmirror/#comments</comments>
		<pubDate>Fri, 24 Sep 2010 23:58:43 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Gmirror]]></category>
		<category><![CDATA[RAID]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=232</guid>
		<description><![CDATA[<p>Не далее, чем вчера пришлось заниматься вытаскиванием данных с диска, по которому строевым шагом пошли бедблоки. Методика некоторое время обдумывалась, потом была приведена в исполнение. Логика проста: ставим в сервер рядом с проблемным диском такой же по размеру (в моем случае это были Seagate и WD, так что производитель не суть важен, хотя новый честно подбирал похожий по параметрам) и вместо конвульсий в виде dd и прочего копирования пробуем по-тихому отзеркалить все на новый диск. Итак, приступим:</p>
<p><a href="http://jared.kiev.ua/2010/09/bad-blocks-gmirror/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Не далее, чем вчера пришлось заниматься вытаскиванием данных с диска, по которому строевым шагом пошли бедблоки. Методика некоторое время обдумывалась, потом была приведена в исполнение. Логика проста: ставим в сервер рядом с проблемным диском такой же по размеру (в моем случае это были Seagate и WD, так что производитель не суть важен, хотя новый честно подбирал похожий по параметрам) и вместо конвульсий в виде dd и прочего копирования пробуем по-тихому отзеркалить все на новый диск. Итак, приступим:</p>
<pre># echo 'geom_mirror_load=YES' &gt;&gt; /boot/loader.conf
# sysctl kern.geom.debugflags=16</pre>
<p>Здесь мы включили модуль geom_mirror при загрузке системы и режим отладки, при котором возможно создание программного зеркала. Создаем массив и запихиваем туда проблемный диск:</p>
<pre># gmirror label -v -b round-robin gm0 /dev/ad4
Metadata value stored on /dev/ad4.
Done.</pre>
<p>Далее надо поправить /etc/fstab, заменив подстроку /dev/ad4 на /dev/mirror/gm0. В итоге вместо записей вида</p>
<pre>/dev/ad4s1a             /               ufs     rw              1       1</pre>
<p>получится</p>
<pre>/dev/mirror/gm0s1a             /               ufs     rw              1       1</pre>
<p>Перезагружаемся в <strong>single user mode</strong> (Это важный момент, его нет в статьях по настройке gmirror &#8211; обычно все отрабатывает нормально и без него. Но в случае с проблемным диском он может и не отзеркалиться.) Далее:</p>
<pre># gmirror insert gm0 /dev/ad7</pre>
<p>После чего команда gmirror status некоторое время будет показывать приблизительно следующее:</p>
<pre>Name    Status  Components
 mirror/gm0  DEGRADED  ad4
                  ad7 (1%)</pre>
<p>Что будет означать, что идет процесс перестройки зеркала. после того, как DEGRADED сменится на COMPLETE, можно тушить сервер и заменять проблемный диск новым. После чего загружаемся и разбираем зеркало. Сначала попросим gmirror забыть о лишнем диске ad7 (теперь он стал ad4):</p>
<pre># gmirror forget gm0</pre>
<p>Теперь gmirror status покажет такое:</p>
<pre>Name    Status  Components
mirror/gm0  COMPLETE ad4</pre>
<p>После чего опять правим /etc/fstab, меняем /dev/mirror/gm0 назад на /dev/ad4 и просим gmirror вытащить из массива последний диск:</p>
<pre># gmirror remove gm0 /dev/ad4</pre>
<p>Машина самостоятельно уходит в перезагрузку, по окончании которой зеркала нет, новый диск называется точно так, как старый и данные на нем остались те, что надо.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/09/bad-blocks-gmirror/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Exim &#8211; ошибка в конфиге</title>
		<link>http://jared.kiev.ua/2010/07/exim-bug/</link>
		<comments>http://jared.kiev.ua/2010/07/exim-bug/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 11:10:09 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[SpamAssassin]]></category>
		<category><![CDATA[Почта]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[Spamassassin]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=228</guid>
		<description><![CDATA[<p>К сожалению, в мою <a href="http://jared.kiev.ua/2010/01/isp-mailserver-1-exim/">конфигурацию</a> Экзима закралась ошибка, которая хоть и появлялась редко, была довольно досадной. В частности, при определенных условиях, ACL, который проверяет почту на спам, не видел переменную, в которой хранился адрес адресата и не отрабатывал. В основную статью изменения уже добавлены, решил выложить дополнительный пост для тех, кто ее не будет перечитывать. Итак, надо поправить 2 файла: 500.acl-check-data.conf и configure.</p>
<p><a href="http://jared.kiev.ua/2010/07/exim-bug/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>К сожалению, в мою <a href="http://jared.kiev.ua/2010/01/isp-mailserver-1-exim/">конфигурацию</a> Экзима закралась ошибка, которая хоть и появлялась редко, была довольно досадной. В частности, при определенных условиях, ACL, который проверяет почту на спам, не видел переменную, в которой хранился адрес адресата и не отрабатывал. В основную статью изменения уже добавлены, решил выложить дополнительный пост для тех, кто ее не будет перечитывать. Итак, надо поправить 2 файла: 500.acl-check-data.conf и configure.</p>
<p>500.acl-check-data.conf: после &laquo;.ifdef USE_SPAMD&raquo; добавляем строку:</p>
<pre>warn set acl_m5 = $acl_c_lp
</pre>
<p>configure: после строки &laquo;acl_check_rcpt:&raquo; вставляем:</p>
<pre>warn set acl_c_lp       = $local_part@$domain</pre>
<p>Перед обоими вставками лучше вставить пустую строку.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/07/exim-bug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Обновляем систему по-быстрому</title>
		<link>http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/</link>
		<comments>http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 14:12:33 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[cvsup]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=224</guid>
		<description><![CDATA[<p>Почти во всех руководствах по FreeBSD для обновления системы прелдагают использовать классический cvsup, либо как вариант &#8211; cvsup-without-gui. Однако, то же самое можно делать, не устанавливая в систему никаких дополнительных пакетов и гораздо быстрее. Для этого мы воспользуемся аналогом cvsup, поставляемым с базовой системой &#8211; csup.</p>
<p><a href="http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Почти во всех руководствах по FreeBSD для обновления системы прелдагают использовать классический cvsup, либо как вариант &#8211; cvsup-without-gui. Однако, то же самое можно делать, не устанавливая в систему никаких дополнительных пакетов и гораздо быстрее. Для этого мы воспользуемся аналогом cvsup, поставляемым с базовой системой &#8211; csup.</p>
<p>Файлы для обновления портов и системы сразу после установки доступны в каталоге /usr/share/examples/cvsup. Там же и поправим нужный: в моем случае &#8211; файл обновления портов ports-supfile:</p>
<pre># ee /usr/share/examples/cvsup/ports-supfile

<span style="color: #000000;"># Сервер, с которого обновляться, в моем случае ftp6.ua.FreeBSD.org</span>
*default host=ftp6.ua.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix

*default compress

# Обновлять все дерево портов
ports-all
</pre>
<p>Вот и все, дальше остается только запустить обновление командой:</p>
<pre># csup /usr/share/examples/cvsup/ports-supfile
</pre>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Мониторинг с помощью Zabbix: установка Zabbix</title>
		<link>http://jared.kiev.ua/2010/03/zabbix-install/</link>
		<comments>http://jared.kiev.ua/2010/03/zabbix-install/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 22:06:34 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[jail]]></category>
		<category><![CDATA[Zabbix]]></category>
		<category><![CDATA[Мониторинг]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=210</guid>
		<description><![CDATA[<p style="text-align: justify;">Как и многие коллеги-администраторы, долгое время я пользовался для мониторинга всего и вся либо Nagios, либо чем-то самописным &#8211; так сложилось исторически. В последнее время стало изрядно лениво лазить по конфигурационным файлам, чтоб добавить хост, сервис и т.п., а потом еще и проверять в веб-интерфейсе, все ли видно хорошо. Захотелось некой удобной софтины для мониторинга, с конфигурацией в БД, удобным веб-интерфейсом и прочими прелестями. В качестве таковой был выбран Zabbix и честно говоря, вполне себя оправдывает, разве что ресурсов ест многовато. Им сегодня и займемся:</p>
<p><a href="http://jared.kiev.ua/2010/03/zabbix-install/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Как и многие коллеги-администраторы, долгое время я пользовался для мониторинга всего и вся либо Nagios, либо чем-то самописным &#8211; так сложилось исторически. В последнее время стало изрядно лениво лазить по конфигурационным файлам, чтоб добавить хост, сервис и т.п., а потом еще и проверять в веб-интерфейсе, все ли видно хорошо. Захотелось некой удобной софтины для мониторинга, с конфигурацией в БД, удобным веб-интерфейсом и прочими прелестями. В качестве таковой был выбран Zabbix и честно говоря, вполне себя оправдывает, разве что ресурсов ест многовато. Им сегодня и займемся:</p>
<pre># cd /usr/ports/net-mgmt/zabbix-server
# make install
┌────────────────────────────────────────────────────────────────────┐
 │                Options for zabbix-server 1.8.1,2                   │
 │ ┌────────────────────────────────────────────────────────────────┐ │
 │ │         [X] MYSQL   Use MySQL backend                          │ │
 │ │         [ ] PGSQL   Use PostgreSQL backend                     │ │
 │ │         [ ] SQLITE  Use SQLite backend                         │ │
 │ │         [ ] IPV6    Support for IPv6                           │ │
 │ │         [ ] LDAP    Support for checking LDAP servers          │ │
 │ │         [X] JABBER  Use jabber media type                      │ │
 │ │         [X] FPING   Use fping for pinging hosts                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 ├─└────────────────────────────────────────────────────────────────┘─┤
 │                       [  OK  ]       Cancel                        │
 └────────────────────────────────────────────────────────────────────┘
</pre>
<p style="text-align: justify;">Пока он ставится, немного расскажу о идеологии софтины. Состоит она из нескольких частей: сервера, агента, фронтенда. Сервер умеет опрашивать агентов или сами объекты мониторинга (в случае с последними поддерживаются протоколы SNMP и IPMI). Агент ставится на объект мониторинга (версии агента есть для широкого перечня операционных систем, включая винды) и шлет данные на сервер, также умеет выполнять на объекте заданные команды, фронтенд стоит на веб-сервере и показывает весь процесс. К базе данных обращаются сервер и фронтенд, агентам она не нужна. Создаем ее (исходим из того, что MySQL у нас на том же хосте, где zabbix-сервер):</p>
<pre># mysql
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'zabbixpassword';
GRANT USAGE ON * . * TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbixpassword' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE IF NOT EXISTS `zabbix` ;
GRANT ALL PRIVILEGES ON `zabbix` . * TO 'zabbix'@'localhost';
quit;
# cd /usr/local/share/zabbix/server/create
# cat schema/mysql.sql data/data.sql data/images_mysql.sql | mysql -uzabbix -pzabbixpassword zabbix
# echo zabbix_server_enable=\"YES\" &gt;&gt; /etc/rc.conf
# cp /usr/local/etc/zabbix/zabbix_server.conf.sample /usr/local/etc/zabbix/zabbix_server.conf
# ee /usr/local/etc/zabbix/zabbix_server.conf
</pre>
<p>Настройки по умолчанию достаточно разумны, потому файл /usr/local/etc/zabbix/zabbix_server.conf небольшой, для справки потом можно будет заглянуть в дефолтный файл:</p>
<pre><span style="color: #000000;"># Исходящий IP, с него будут осуществляться соединения с агентами и объектами мониторинга
</span>SourceIP=192.168.1.10

<span style="color: #000000;"># Лог-файл
</span>LogFile=/var/log/zabbix_server.log

<span style="color: #000000;"># Размер лог-файла, в мегабайтах, 0 отключает ротацию лога
</span>LogFileSize=10

<span style="color: #000000;"># Уровень дебага, 0 - отключить, 1 - критические ошибки, 2 - ошибки, 3 - предупреждения, 4 - дебаг
</span>DebugLevel=3

<span style="color: #000000;"># Хост БД
</span>DBHost=localhost

<span style="color: #000000;"># Название БД
</span>DBName=zabbix

<span style="color: #000000;"># Пользователь БД
</span>DBUser=zabbix

<span style="color: #000000;"># Пароль БД
</span>DBPassword=zabbixpassword

<span style="color: #000000;"># Путь к Mysql-сокету
</span>DBSocket=/tmp/mysql.sock

<span style="color: #000000;"># Порт SQL-сервера, если используем сокет - не надо
</span># DBPort=3306
</pre>
<p>Если заббикс стоит, как в моем случае, в джейле, то на хост-машине надо в /etc/sysctl.conf добавить:</p>
<pre>security.jail.sysvipc_allowed=1
kern.ipc.shmall=2097152
kern.ipc.shmmax=2147483648</pre>
<p>На этом все, сервер можно запускать:</p>
<pre># touch /var/log/zabbix_server.log
# chown zabbix:zabbix /var/log/zabbix_server.log
# /usr/local/etc/rc.d/zabbix_server start</pre>
<p>Теперь займемся фронтендом.</p>
<pre># cd /usr/ports/math/php5-bcmath
# make install
# cd /usr/ports/net-mgmt/zabbix-server/work/zabbix-1.8.1/frontends/php
# cp -R * /usr/local/www/vhosts/zabbix.jared.kiev.ua
# cd /usr/local/www/vhosts/zabbix.jared.kiev.ua/conf/
# cp zabbix.conf.php.example zabbix.conf.php
# ee zabbix.conf.php
</pre>
<p>Тут вписываем параметры доступа к БД и прочее:</p>
<pre>&lt;?php
global $DB;

$DB["TYPE"]             = "MYSQL";
$DB["SERVER"]           = "localhost";
$DB["PORT"]             = "0";
$DB["DATABASE"]         = "zabbix";
$DB["USER"]             = "zabbix";
$DB["PASSWORD"]         = "zabbixpassword";
$ZBX_SERVER             = "localhost";
$ZBX_SERVER_PORT        = "10051";
$ZBX_SERVER_NAME        = "";

$IMAGE_FORMAT_DEFAULT   = IMAGE_FORMAT_PNG;
?&gt;
</pre>
<p>Все, теперь можно смело заходить в фронтенд с логином Admin и паролем zabbix и заниматься дальнейшей настройкой системы.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/03/zabbix-install/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Fastest CVSUP &#8211; обновляемся быстро</title>
		<link>http://jared.kiev.ua/2010/02/fastest-cvsup/</link>
		<comments>http://jared.kiev.ua/2010/02/fastest-cvsup/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 20:15:34 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[cvsup]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=208</guid>
		<description><![CDATA[<p>При обновлении системы, портов и т.п. неизменно хочется, чтоб оно прошло побыстрее. В этом нам поможет утилита fastest cvsup, которая подберет самый быстрый cvsup-сервер. В установке и настройке она очень проста:</p>
<p><a href="http://jared.kiev.ua/2010/02/fastest-cvsup/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>При обновлении системы, портов и т.п. неизменно хочется, чтоб оно прошло побыстрее. В этом нам поможет утилита fastest cvsup, которая подберет самый быстрый cvsup-сервер. В установке и настройке она очень проста:</p>
<pre># cd /usr/ports/sysutils/fastest_cvsup
# make install

 ┌────────────────────────────────────────────────────────────────────┐
 │                Options for fastest_cvsup 0.2.9_6                   │
 │ ┌────────────────────────────────────────────────────────────────┐ │
 │ │           [ ] ROUNDTRIP  Build with round-trip patch           │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 ├─└────────────────────────────────────────────────────────────────┘─┤
 │                       [  OK  ]       Cancel                        │
 └────────────────────────────────────────────────────────────────────┘</pre>
<p>Опции у утилиты достаточно просты и по большому счету, нам понадобится только опция -c, после которой задается 2-буквенный код страны. Дальше она выбирает самый близкий по пингу к нам официальный sup-сервер:</p>
<pre># fastest_cvsup -c ua
&gt;&gt;  Querying servers in countries: ua
--&gt; Connecting to cvsup.ua.freebsd.org [83.218.232.71]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 14.70 ms
--&gt; Connecting to cvsup2.ua.freebsd.org [62.244.55.197]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.15 ms
--&gt; Connecting to cvsup3.ua.freebsd.org [212.42.64.9]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.93 ms
--&gt; Connecting to cvsup4.ua.freebsd.org [82.193.96.50]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 1.81 ms
--&gt; Connecting to cvsup5.ua.freebsd.org [213.186.196.224]...
 * error: connect: timeout
--&gt; Connecting to cvsup6.ua.freebsd.org [62.149.2.9]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 1.99 ms
--&gt; Connecting to cvsup7.ua.freebsd.org [213.186.196.224]...
 * error: connect: timeout
--&gt; Connecting to cvsup8.ua.freebsd.org [83.218.232.71]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.31 ms
--&gt; Connecting to cvsup9.ua.freebsd.org [80.249.224.11]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 12.62 ms
--&gt; Connecting to cvsup10.ua.freebsd.org [78.152.160.14]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 16.40 ms
--&gt; Connecting to cvsup11.ua.freebsd.org [217.20.163.35]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.46 ms

&gt;&gt;  Speed Daemons:
 - 1st: cvsup4.ua.freebsd.org
 - 2nd: cvsup6.ua.freebsd.org
 - 3rd: cvsup2.ua.freebsd.org</pre>
<p>Вот и все, теперь осталось только вписать понравившийся сервер в конфиг.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/02/fastest-cvsup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ищем ошибки в работе exim</title>
		<link>http://jared.kiev.ua/2010/02/exim-debug/</link>
		<comments>http://jared.kiev.ua/2010/02/exim-debug/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 15:21:20 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Почта]]></category>
		<category><![CDATA[e-mail]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=204</guid>
		<description><![CDATA[<p>Бывает, что какое-либо письмо не проходит и в логах видно что-то странное, причем методы диагностики без включения полных логов не помогают. Тогда  приходится делать так:</p>
<pre># /usr/local/etc/rc.d/exim stop
# exim -bd -d+all &#62; /var/log/exim-debug.log 2&#62;&#38;1
</pre>
<p>Здесь мы потушили Exim и пустили его в ручном режиме с выводом полной информации о его работе (-d+all). Неприятная особенность заключается в том, что Exim пишет лог своей работы в stderr, с которым довольно неудобно работать. Потому конструкция &#171;&#62; /var/log/exim-debug.log 2&#62;&#38;1&#8243; перенаправляет stderr в файл /var/log/exim-debug.log.</p>
<p><a href="http://jared.kiev.ua/2010/02/exim-debug/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Бывает, что какое-либо письмо не проходит и в логах видно что-то странное, причем методы диагностики без включения полных логов не помогают. Тогда  приходится делать так:</p>
<pre># /usr/local/etc/rc.d/exim stop
# exim -bd -d+all &gt; /var/log/exim-debug.log 2&gt;&amp;1
</pre>
<p>Здесь мы потушили Exim и пустили его в ручном режиме с выводом полной информации о его работе (-d+all). Неприятная особенность заключается в том, что Exim пишет лог своей работы в stderr, с которым довольно неудобно работать. Потому конструкция &laquo;&gt; /var/log/exim-debug.log 2&gt;&amp;1&#8243; перенаправляет stderr в файл /var/log/exim-debug.log.</p>
<p>Все, теперь можно ждать копии проблемного письма, другие пользователи при этом продолжат спокойно работать. После того, как собрали нужное для устранения ошибки количество информации, останавливаем ручной режим нажатием Ctrl-C и запускаем Exim в нормальном режиме работы:</p>
<pre># /usr/local/etc/rc.d/exim start</pre>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/02/exim-debug/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FreeBSD jail по-быстрому</title>
		<link>http://jared.kiev.ua/2010/02/freebsd-quick-jail/</link>
		<comments>http://jared.kiev.ua/2010/02/freebsd-quick-jail/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 22:53:44 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[jail]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=196</guid>
		<description><![CDATA[<p>Итак, как следует из названия, сейчас мы будем в ускоренном темпе поднимать jail на FreeBSD 7.2. Почему в ускоренном? В сети есть масса статей на эту тему, там все разжевывается достаточно подробно и, как правило, с кучей лишних действий, которые в современной системе уже не обязательны. Потому мы обойдемся без лишних движений и сделаем так, чтоб все работало. Итак, начнем с обновления системных исходников:</p>
<p><a href="http://jared.kiev.ua/2010/02/freebsd-quick-jail/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Итак, как следует из названия, сейчас мы будем в ускоренном темпе поднимать jail на FreeBSD 7.2. Почему в ускоренном? В сети есть масса статей на эту тему, там все разжевывается достаточно подробно и, как правило, с кучей лишних действий, которые в современной системе уже не обязательны. Потому мы обойдемся без лишних движений и сделаем так, чтоб все работало. Итак, начнем с обновления системных исходников:</p>
<pre># pkg_add -r cvsup-without-gui
# ee /usr/share/examples/cvsup/stable-supfile
</pre>
<p>Правим *default host=CHANGE_THIS.FreeBSD.org на хост, который нам подходит, в моем случае это ftp6.ua.freebsd.org. Потом подготовим структуру каталогов для джейла (мой джейл будет носить гордое имя mon) и запускаем сам процесс обновления:</p>
<pre># mkdir -p /usr/local/jails/mon
# cvsup -g -L 2 /usr/share/examples/cvsup/stable-supfile
</pre>
<p>Пока он идет,  добавим несколько строк в файл /etc/rc.conf :</p>
<pre><span style="color: #000000;"># Говорим syslogd не логгировать ничего из сети, чтоб не мешать логи в кучу</span>
syslogd_flags="-ss"

<span style="color: #000000;"># Общие настройки для всех джейлов</span>
jail_enable="YES"
jail_devfs_enable="YES"
jail_procfs_enable="YES"

<span style="color: #000000;"># Тут список джейлов, которые надо запускать при старте системы, указываются через пробел</span>
jail_list="mon"

<span style="color: #000000;"># Интерфейс, на который система повесит алиасы для джейлов, на самих интерфейсах прописывать ничего не надо</span>
jail_interface="lo0"

jail_exec_start="/bin/sh /etc/rc"
jail_exec_stop="/bin/sh /etc/rc.shutdown"

<span style="color: #000000;"># Настройки для джейла mon</span>
jail_mon_rootdir="/usr/local/jails/mon"
jail_mon_hostname="mon.jared.kiev.ua"
jail_mon_ip="192.168.10.1"</pre>
<p>Заодно поправим /etc/ssh/sshd_config, чтоб при попытке попасть по SSH в джейл мы не попадали на хост-машину:</p>
<pre>ListenAddress 192.168.23.1
</pre>
<p>Теперь, когда исходники обновили, можем собирать всю конструкцию воедино:</p>
<pre># cd /usr/src
# make buildworld
# make installworld DESTDIR=/usr/local/jails/mon
# cd /usr/src/etc
# make distribution DESTDIR=/usr/local/jails/mon
</pre>
<p>Все, взлетаем и проверяем наличие нашего джейла:</p>
<pre># /etc/rc.d/jail start
Configuring jails:.
Starting jails: mon.jared.kiev.ua.
# jls
   JID  IP Address      Hostname                      Path
     1  192.168.10.1    mon.jared.kiev.ua             /usr/local/jails/mon
</pre>
<p>Теперь, набрав на хост-машине jexec 1 tcsh, мы запустим в джейле с JID 1 оболочку tcsh и окажемся внутри нашей виртуальной машины.</p>
<p>Полезные sysctl-переменные для джейлов:<br />
security.jail.set_hostname_allowed &#8211; если 1, то внутри jail можно поменять имя хоста;<br />
security.jail.socket_unixiproute_only &#8211; если 1 , то сокет в jail можно создать только для доменов PF_LOCAL, PF_INET или PF_ROUTE, иначе, возвращается ошибка;<br />
security.jail.sysvipc_allowed &#8211; если 1, то то в jail можно получить доступ к глобальному System V IPC;<br />
security.jail.getfsstatroot_only &#8211; если 1, то в jail можно получить информацию (df)только о той файловой системе на которой создан jail;<br />
security.jail.allow_raw_sockets &#8211; если 1, то в jail можно создавать raw sockets;<br />
security.jail.chflags_allow &#8211; если 1, то процессы в jail могут модифицировать флаги ФС.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"><span style="font-family: Verdana;"><span style="color: #3366ff;"># ee /usr/share/examples/cvsup/stable-supfile<br />
</span>Там правим *default host=CHANGE_THIS.FreeBSD.org на хост, который нам подходит, в моем случае это был ftp2.ua.freebsd.org.</p>
<p></span><span style="font-family: Verdana;"><span style="color: #0000bb;"><span style="color: #3366ff;"># cvsup -g -L 2 /usr/share/examples/cvsup/stable-supfile</span></span></span></div>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/02/freebsd-quick-jail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

