<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4428473564097379725</id><updated>2012-01-31T23:23:02.320+06:00</updated><category term='dovecat'/><category term='lighttpd'/><category term='ufanet'/><category term='Xinerama'/><category term='getty'/><category term='clutch'/><category term='cups'/><category term='юмор'/><category term='icewm'/><category term='kqemu'/><category term='lightdm'/><category term='pppoe'/><category term='CUFlow'/><category term='firefox'/><category term='pppd'/><category term='cisco'/><category term='audio'/><category term='awk'/><category term='windows xp'/><category term='apt-cacher'/><category term='СКС'/><category term='rdp'/><category term='torrent'/><category term='alsa'/><category term='freebsd'/><category term='перевод'/><category term='postgrey'/><category term='minicom'/><category term='pbr'/><category term='wget'/><category term='bind'/><category term='flow-tools'/><category term='переводы'/><category term='racoon'/><category term='serial'/><category term='virtualbox'/><category term='TV'/><category term='centos'/><category term='fastcgi'/><category term='dovecot'/><category term='fancontrol'/><category term='mysql'/><category term='quake2'/><category term='pptp'/><category term='deadbeef'/><category term='bash'/><category term='dyndns'/><category term='gui'/><category term='wordpress'/><category term='sf2'/><category term='ntfsclone'/><category term='photo'/><category term='tynef smtpd'/><category term='dns'/><category term='gawk'/><category term='mp3'/><category term='dhcp'/><category term='clamav'/><category term='ubuntu'/><category term='spampd'/><category term='quotas'/><category term='exif'/><category term='xdm'/><category term='postfixadmin'/><category term='two-isp'/><category term='mail'/><category term='doom'/><category term='мысли'/><category term='ipsec'/><category term='ipfw'/><category term='audio players'/><category term='cron-apt'/><category term='игры'/><category term='freerdp'/><category term='postfix'/><category term='rp-pppoe'/><category term='midi'/><category term='pptpd'/><category term='flowscan'/><category term='sharepoint'/><category term='timidity'/><category term='prboom'/><category term='resolvconf'/><category term='fprobe'/><category term='debian'/><category term='windows'/><category term='rtorrent'/><category term='nexuiz'/><category term='фото'/><category term='ape'/><category term='grub2'/><category term='netbsd'/><category term='rdesktop'/><category term='debootstrap'/><category term='linux'/><category term='man'/><category term='ethernet'/><category term='pppoe-relay'/><category term='rutorrent'/><category term='id3'/><category term='php'/><category term='шрифты'/><category term='transmission'/><category term='jigdo'/><category term='deb'/><category term='gprs'/><category term='iproute'/><category term='ad'/><category term='pure-ftpd'/><category term='nat'/><category term='CUGrapher'/><category term='spamassassin'/><category term='bluetooth'/><category term='quake'/><category term='clamsmtpd'/><category term='autofs'/><category term='flac'/><category term='spawn-fcgi'/><category term='xfce'/><category term='X-Window'/><category term='qemu'/><category term='vpn'/><category term='iptables'/><category term='dnat'/><category term='squirrelmail'/><category term='netflow'/><category term='remmina'/><title type='text'>Ещё один блог сисадмина</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>96</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-1650760556616835422</id><published>2012-01-31T22:58:00.004+06:00</published><updated>2012-01-31T23:23:02.333+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='lightdm'/><title type='text'>Дисплейный менеджер LightDM</title><content type='html'>LightDM - это относительно новый Display Manager. До сих пор я пользовался XDM, но теперь (хотя на самом деле уже полгода) пользуюсь LightDM. Установил его из репозитория Debian Wheezy, вместе с XFCE 4.8, когда пытался в очередной раз разобраться с монтированием сменных устройств.&lt;br /&gt;&lt;br /&gt;К слову сказать, теперь это стало довольно просто - всеми настройками разрешений управляет демон polkit-1, дисками - демон udisks, питанием - upower, сеансами и включением-выключением компьютера - демон consolekit. Последние три демона обращаются за проверкой доступности запрашиваемого действия для данного пользователя к первому. Всё это хозяйство работает через dbus и интегрируется с любым DE. Но - об этом лучше отдельно.&lt;br /&gt;&lt;br /&gt;До XDM я уже пробовал различные DM, но большинство из них мне не понравились по одной из трёх причин: тяжёлые (тянут тяжёлый тулкит и dbus), некрасивые (некоторые из них), не поддерживают XDMCP (тоже некоторые). Тогда я остановился на XDM как на лёгком, поддерживающем XDMCP и поддающемся обработке напильником до терпимого состояния. Кроме XDM пробовал я тогда KDM, GDM, WDM и ещё какой-то, название которого я уже забыл.&lt;br /&gt;&lt;br /&gt;Для настройки запуска двух X-серверов я откорректировал файл /etc/lightdm/lightdm.conf, так что в нём теперь есть (кроме всего прочего) пара таких строчек:&lt;br /&gt;&lt;pre&gt;[Seat:0]&lt;br /&gt;xserver-command=/usr/bin/X :0 vt7 -nolisten tcp&lt;br /&gt;&lt;br /&gt;[Seat:1]&lt;br /&gt;xserver-command=/usr/bin/X :1 vt8 -nolisten tcp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Между обоими X-серверами можно переключаться точно так же, как и в XDM - нажатием Ctrl-Alt-F7 и Ctrl-Alt-F8.&lt;br /&gt;&lt;br /&gt;В файле /etc/lightdm/lightdm-gtk-greeter.conf я настроил фоновую картинку и используемый по умолчанию шрифт, так что конфиг в целом принял следующий вид:&lt;br /&gt;&lt;pre&gt;[greeter]&lt;br /&gt;background=/root/wallpapers/canyon.jpg&lt;br /&gt;font-name=Liberation Sans 12&lt;br /&gt;xft-hintstyle=hintfull&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Выглядит всё это вот так:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-58pGBDG4QlU/TygfIlZc25I/AAAAAAAABK4/VQwjTWuim3U/s1600/P1318168.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-58pGBDG4QlU/TygfIlZc25I/AAAAAAAABK4/VQwjTWuim3U/s320/P1318168.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5703843160403008402" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-1650760556616835422?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/1650760556616835422/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=1650760556616835422' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1650760556616835422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1650760556616835422'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2012/01/lightdm.html' title='Дисплейный менеджер LightDM'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-58pGBDG4QlU/TygfIlZc25I/AAAAAAAABK4/VQwjTWuim3U/s72-c/P1318168.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8391576650409720073</id><published>2012-01-27T16:03:00.018+06:00</published><updated>2012-01-27T17:43:44.644+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CUFlow'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='fprobe'/><category scheme='http://www.blogger.com/atom/ns#' term='flowscan'/><category scheme='http://www.blogger.com/atom/ns#' term='netflow'/><category scheme='http://www.blogger.com/atom/ns#' term='CUGrapher'/><category scheme='http://www.blogger.com/atom/ns#' term='flow-tools'/><title type='text'>Настройка fprobe, flow-capture, flowscan, CUFlow и CUGrapher</title><content type='html'>В прошлом уже приходилось пользоваться всей этой честной компанией, а сейчас выдался случай вспомнить.&lt;br /&gt;&lt;br /&gt;Что всё это такое?&lt;br /&gt;&lt;br /&gt;fprobe - это сенсор NetFlow, который собирает статистику по пакетам, проходящим через определённый интерфейс или все интерфейсы сразу. После заполнения буфера сенсор отправляет накопленную информацию коллектору NetFlow в виде UDP-пакета.&lt;br /&gt;&lt;br /&gt;flow-capture - это коллектор NetFlow из пакета flow-tools, который ловит UDP-пакеты, агрегирует информацию из них и периодически складывает информацию в файл. В пакете flow-tools есть ещё масса полезных инструментов, с помощью которых можно разнообразным образом обрабатывать собранную информацию.&lt;br /&gt;&lt;br /&gt;flowscan - Perl-скрипт, который работает в связке с одним или несколькими из трёх модулей отчётов: CUFlow, CampusIP, SubNetIO. Мы будем использовать модуль отчёта CUFlow, который находится в пакете flowscan-cuflow. Совместно они извлекают информацию из файлов с сохранёнными NetFlow-потоками и делают две вещи: аккумулируют статистику по трафику в файлы в формате RRD, а также создают HTML-файлы со статистикой самых активных узлов за последние 5 минут и за весь период наблюдения. Созданные RRD- и HTML-файлы складываются в указанные каталоги.&lt;br /&gt;&lt;br /&gt;CUGrapher - CGI Perl-скрипт из пакета flowscan-cugrapher, который строит графики по RRD-файлам, созданным flowscan/CUFlow.&lt;br /&gt;&lt;br /&gt;Итак, приступим к настройке. Для начала, установим необходимые пакеты:&lt;br /&gt;&lt;pre&gt;# apt-get install fprobe flow-tools flowscan flowscan-cuflow flowscan-cugrapher&lt;/pre&gt;&lt;br /&gt;Настроим сенсор fprobe. Для этого в файле /etc/default/fprobe пропишем строки:&lt;br /&gt;&lt;pre&gt;INTERFACE="any"&lt;br /&gt;FLOW_COLLECTOR="localhost:9001"&lt;br /&gt;OTHER_ARGS="-fip"&lt;/pre&gt;&lt;br /&gt;Строчка &lt;b&gt;INTERFACE&lt;/b&gt; указывает, что следует перехватывать трафик на всех доступных интерфейсах.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FLOW_COLLECTOR&lt;/b&gt; указывает IP-адрес и порт, на котором коллектор будет принимать UDP-пакеты.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OTHER_ARGS&lt;/b&gt; указывает прочие опции. В данном случае указан фильтр, отбирающий только IP-пакеты (ARP-пакеты учитываться не будут).&lt;br /&gt;&lt;br /&gt;Теперь нужно настроить коллектор flow-capture. Для этого в файл /etc/flow-tools/flow-capture.conf пропишем следующую строку:&lt;br /&gt;&lt;pre&gt;-w /var/flow/ufa -n 287 -N 0 0/127.0.0.1/9001&lt;/pre&gt;&lt;br /&gt;В этом файле каждая строчка настраивает отдельный коллектор, так что если потребуется настроить два или три коллектора - достаточно просто добавить дополнительные строчки.&lt;br /&gt;&lt;br /&gt;Опция &lt;b&gt;-w&lt;/b&gt; указывает, куда будут складываться файлы.&lt;br /&gt;&lt;br /&gt;Опция &lt;b&gt;-n&lt;/b&gt; задаёт количество ротаций в день (287 соответствует 288 файлам в день или одному файлу в 5 минут).&lt;br /&gt;&lt;br /&gt;Опция &lt;b&gt;-N&lt;/b&gt; задаёт структуру каталогов для хранения файлов (0 соответствует настройке без использования вложенных каталогов - все файлы складываются прямо в указанный каталог).&lt;br /&gt;&lt;br /&gt;Последняя опция указывает, что NetFlow пакеты будут приниматься с любого адреса на адрес 127.0.0.1 на UDP-порт 9001.&lt;br /&gt;&lt;br /&gt;Создадим каталог для файлов:&lt;br /&gt;&lt;pre&gt;# mkdir /var/flow&lt;/pre&gt;&lt;br /&gt;Теперь можно запустить коллектор:&lt;br /&gt;&lt;pre&gt;# /etc/init.d/flow-capture start&lt;/pre&gt;&lt;br /&gt;С настройкой коллектора покончили, теперь будем настраивать flowscan. Для этого отредактируем файл /etc/flowscan/flowscan.cf таким образом, чтобы он принял следующий вид:&lt;br /&gt;&lt;pre&gt;FlowFileGlob /var/flow/ufa/ft-*&lt;br /&gt;ReportClasses CUFlow&lt;br /&gt;WaitSeconds 300&lt;br /&gt;Verbose 1&lt;/pre&gt;&lt;br /&gt;Настройка &lt;b&gt;FlowFileGlob&lt;/b&gt; задаёт шаблон для файлов, которые необходимо обрабатывать.&lt;br /&gt;&lt;br /&gt;В настройке &lt;b&gt;ReportClasses&lt;/b&gt; через запятую указываются используемые модули отчётов.&lt;br /&gt;&lt;br /&gt;Настройка &lt;b&gt;WaitSeconds&lt;/b&gt; задаёт интервал времени в секундах, через который указанный шаблон будет проверяться на соответствие файлам.&lt;br /&gt;&lt;br /&gt;Настройка &lt;b&gt;Verbose&lt;/b&gt; задаёт выдачу диагностических сообщений (для начала рекомендую оставить её включенной).&lt;br /&gt;&lt;br /&gt;Стоит отметить, что по умолчанию flowscan удаляет обработанные файлы. Если они вам нужны, создайте в каталоге с файлами подкаталог saved, тогда flowscan будет перемещать обработанные файлы в него. Так как я собираюсь использовать эти файлы для самых разных целей, я создаю этот каталог:&lt;br /&gt;&lt;pre&gt;# mkdir /var/flow/ufa/saved&lt;/pre&gt;&lt;br /&gt;Теперь нужно настроить модуль отчёта CUFlow. Его настройки находятся в файле /etc/flowscan/CUFlow.cf и у меня они приняли следующий вид:&lt;br /&gt;&lt;pre&gt;Subnet 192.168.80.0/24&lt;br /&gt;Subnet 192.168.81.0/24&lt;br /&gt;Subnet 92.50.0.1/32&lt;br /&gt;&lt;br /&gt;Network 192.168.80.0/24 lan&lt;br /&gt;Network 192.168.81.0/24 vpn&lt;br /&gt;&lt;br /&gt;OutputDir /var/cuflow&lt;br /&gt;&lt;br /&gt;Multicast&lt;br /&gt;&lt;br /&gt;Scoreboard 10 /var/www/cuflow/ /var/www/cuflow/topten.html&lt;br /&gt;&lt;br /&gt;AggregateScore 10 /var/cuflow/agg.dat /var/www/cuflow/overall.html&lt;br /&gt;&lt;br /&gt;Router 127.0.0.1 ufa&lt;br /&gt;&lt;br /&gt;Service 20-21/tcp ftp&lt;br /&gt;Service 22/tcp ssh&lt;br /&gt;Service 25/tcp smtp&lt;br /&gt;Service 53/udp,53/tcp dns&lt;br /&gt;Service 80/tcp,81/tcp http&lt;br /&gt;Service 110/tcp pop3&lt;br /&gt;Service 443/tcp https&lt;br /&gt;Service 1433/udp,1433/tcp ms-sql&lt;br /&gt;Service 3389/tcp ms-rdp&lt;br /&gt;Service 4899/udp,4899/tcp radmin&lt;br /&gt;&lt;br /&gt;Protocol 1 icmp&lt;br /&gt;Protocol 6 tcp&lt;br /&gt;Protocol 17 udp&lt;br /&gt;Protocol 47 gre&lt;br /&gt;&lt;br /&gt;#TOS 0 normal&lt;br /&gt;#TOS 1-255 other&lt;br /&gt;#ASNumber 1 Genuity&lt;/pre&gt;&lt;br /&gt;Настройка &lt;b&gt;Subnet&lt;/b&gt; указывает сети, которые считаются локальными. Эти сети используются для определения типа трафика: входящий или исходящий.&lt;br /&gt;&lt;br /&gt;В настройках &lt;b&gt;Network&lt;/b&gt; указываются сети, для которых будут создаваться отдельные RRD-файлы.&lt;br /&gt;&lt;br /&gt;Настройка &lt;b&gt;OutputDir&lt;/b&gt; задаёт каталог, в который будут складываться RRD-файлы.&lt;br /&gt;&lt;br /&gt;Если необходимо учитывать мультикаст-трафик, укажите опцию &lt;b&gt;Multicast&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Настройка &lt;b&gt;Scoreboard&lt;/b&gt; задаёт количество адресов в хит-параде интенсивности трафика за последние 5 минут, каталог, где будут храниться отчёты за произвольные 5 минут и файл, в котором будет храниться отчёт за последнюю пятиминутку.&lt;br /&gt;&lt;br /&gt;Аналогично, настройка &lt;b&gt;AggregateScore&lt;/b&gt; задаёт количество адресов в хит-параде интенсивности трафика за всю историю наблюдений, dat-файл, где будут храниться суммированные данные и HTML-файл с хитпарадом за всю историю наблюдений.&lt;br /&gt;&lt;br /&gt;В настройке &lt;b&gt;Router&lt;/b&gt; можно указать один или несколько IP-адресов (через запятую), соответствующих адресам, с которых сенсоры NetFlow отправляют информацию. Информация с этих сенсоров будет собираться в отдельный RRD-файл.&lt;br /&gt;&lt;br /&gt;В настройке &lt;b&gt;Service&lt;/b&gt; задаются номера портов протоколов UDP и TCP, которые будут учитываться в отдельном RRD-файле.&lt;br /&gt;&lt;br /&gt;Настройка &lt;b&gt;Protocol&lt;/b&gt; имеет аналогичный смысл, но распространяется уже на протоколы. &lt;br /&gt;&lt;br /&gt;Настройка &lt;b&gt;TOS&lt;/b&gt; позволяет вести учёт пакетов по классам обслуживания в отдельном RRD-файле. Такая информация мне не интересна, поэтому соответствующие строчки я закоментировал.&lt;br /&gt;&lt;br /&gt;Настройка &lt;b&gt;ASNumber&lt;/b&gt; позволяет вести статистику по трафику номерам автономных систем в сетях с маршрутизацией BGP (Интернет). У каждого провайдера есть по крайней мере один номер автономной системы, так что можно учитывать статистику по трафику по направлению от и к определённым провайдерам. fprobe не предоставляет такую информацию, да она и не интересна мне, поэтому эту опцию я тоже закоментировал.&lt;br /&gt;&lt;br /&gt;Теперь нужно создать каталоги для хранения RRD-файлов и HTML-отчётов:&lt;br /&gt;&lt;pre&gt;# mkdir /var/cuflow /var/www/cuflow&lt;/pre&gt;&lt;br /&gt;Каталоги готовы, можно делать тестовый запуск flowscan:&lt;br /&gt;&lt;pre&gt;# flowscan&lt;/pre&gt;&lt;br /&gt;flowscan должен начать обрабатывать доступные файлы из каталога /var/flow/ufa. По завершении обработки он уснёт на указанные нами в настройках 300 секунд, после чего его можно прервать нажатием Ctrl-C. В каталоге /var/cuflow должны появиться RRD-файлы, а в каталоге /var/www/cuflow - файлы topten.html и overall.html, а также каталоги с файлами подобными topten.html за предыдущие пятиминутки наблюдений.&lt;br /&gt;&lt;br /&gt;Если у вас настроен веб-сервер, вы можете зайти на него при помощи браузера и посмотреть HTML-файлы.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-HdGW9gePmlY/TyKKTfkf6-I/AAAAAAAABKU/Pk8nVU5yBtk/s1600/topten.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 306px;" src="http://1.bp.blogspot.com/-HdGW9gePmlY/TyKKTfkf6-I/AAAAAAAABKU/Pk8nVU5yBtk/s320/topten.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5702272145701202914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-jSJ2fat2QKg/TyKKcC3OwCI/AAAAAAAABKg/bCijbzsTEyQ/s1600/overall.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 133px;" src="http://3.bp.blogspot.com/-jSJ2fat2QKg/TyKKcC3OwCI/AAAAAAAABKg/bCijbzsTEyQ/s320/overall.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5702272292613963810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Если flowscan во время обработки файлов будет выдавать предупреждения вроде этого:&lt;br /&gt;&lt;pre&gt;Use of uninitialized value in numeric gt (&gt;) at /usr/share/perl5/HTML/Table.pm line 2685.&lt;/pre&gt;&lt;br /&gt;Не беспокойтесь, программа работает штатно.&lt;br /&gt;&lt;br /&gt;Осталось настроить CUGrapher. Его настройки хранятся в файле  /etc/flowscan/CUGrapher.cf и у меня они выглядят следующим образом:&lt;br /&gt;&lt;pre&gt;OutputDir /var/cuflow&lt;br /&gt;Organization My Insurance Company&lt;br /&gt;&lt;br /&gt;Width 1024&lt;br /&gt;Height 320&lt;br /&gt;&lt;br /&gt;DefaultGraph report=bits&amp;hours=12&amp;imageType=png&amp;width=1024&amp;height=320&amp;duration=&amp;router=all&amp;all_all_services=1&amp;router=ufa&amp;title=Well+Known+Protocols%2FServices&amp;legend=1&lt;br /&gt;&lt;br /&gt;AggregateScore /var/www/cuflow/overall.html&lt;br /&gt;Scoreboard /var/www/cuflow/topten.html&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OutputDir&lt;/b&gt; - каталог, где хранятся RRD-файлы.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Organization&lt;/b&gt; - название вашей компании.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Width&lt;/b&gt; и &lt;b&gt;Height&lt;/b&gt; - ширина и высота графика в пикселях.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DefaultGraph&lt;/b&gt; - адрес страницы с графиком по умолчанию. Достаточно зайти на страницу, перейти на нужный график и скопировать в эту опцию текст из адресной строки браузера после знака ?. Также можно удалить из строки опцию &amp;showmenu=1.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AggregateScore&lt;/b&gt; - местоположение файла overall.html&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scoreboard&lt;/b&gt; - местоположение файла topten.html&lt;br /&gt;&lt;br /&gt;Можно зайти браузером по адресу /cgi-bin/CUGrapher.pl и смотреть графики.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/--Tc3Ll68brc/TyKKk-cywlI/AAAAAAAABKs/PTRFMcBO48Y/s1600/cugrapher.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://2.bp.blogspot.com/--Tc3Ll68brc/TyKKk-cywlI/AAAAAAAABKs/PTRFMcBO48Y/s320/cugrapher.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5702272446048158290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Кое-какие предупреждения и пояснения.&lt;br /&gt;1. fprobe перехватывает весь трафик, проходящий через все интерфейсы компьютера, поэтому для высоконагруженных серверов или маршрутизаторов такое решение непригодно.&lt;br /&gt;2. flowscan/CUFlow/CUGrapher избыточны в ситуациях, когда нужно всего лишь наблюдать за графиком загрузки интерфейса. Для таких простых задач существуют более простые программы.&lt;br /&gt;3. flowscan/CUFlow/CUGrapher - это относительно старые программы, поэтому не ждите от них красоты и удобства.&lt;br /&gt;&lt;br /&gt;Статья написана по мотивам статьи Игоря Чубина &lt;a href="http://xgu.ru/wiki/NetFlow"&gt;NetFlow&lt;/a&gt;. Некоторые моменты переосмыслены. Переосмысление в основном заключается в том, что в Debian теперь все пакеты из комплекта flowscan/CUFlow/CUGrapher обновлены до их последних версий, поэтому скачивать и обновлять ничего не нужно. Также переосмыслен способ настройки CUGrapher, у которого для настройки есть собственный конфигурационный файл.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8391576650409720073?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8391576650409720073/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8391576650409720073' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8391576650409720073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8391576650409720073'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2012/01/fprobe-flow-capture-flowscan-cuflow.html' title='Настройка fprobe, flow-capture, flowscan, CUFlow и CUGrapher'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-HdGW9gePmlY/TyKKTfkf6-I/AAAAAAAABKU/Pk8nVU5yBtk/s72-c/topten.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-1904986755915578882</id><published>2011-11-24T15:05:00.008+06:00</published><updated>2011-11-25T10:13:44.957+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dovecot'/><category scheme='http://www.blogger.com/atom/ns#' term='quotas'/><category scheme='http://www.blogger.com/atom/ns#' term='postfix'/><title type='text'>Настройка квот в Dovecot и Postfix с хранением счётчиков и правил в словаре MySQL</title><content type='html'>Уже третий день подряд мучился с настройкой квот в Dovecot прямо на работающем сервере. Мучился очень аккуратно и имея в запасе бэкапы рабочих конфигураций на начало каждого дня.&lt;br /&gt;&lt;br /&gt;Хранение счётчиков квот в MySQL настроил быстро, формирование правил квот по данным из MySQL тоже настроил быстро. Однако после настройки текущие значения счётчиков квот становились отрицательными и со временем только уменьшались. Я сразу подумал, что POP3-сервер обновляет счётчики квот, т.к. его задача лишь забирать почту из ящика, а вот LDA (агент локальной доставки) - не обновляет, т.к. именно он кладёт почту в ящики и должен увеличивать значения счётчиков.&lt;br /&gt;&lt;br /&gt;В конечном итоге оказалось, что вместо LDA delivery из Dovecot по-прежнему используется LDA virtual из Postfix. Произошло это потому что действие настройки virtual_transport = dovecot перекрывается настройкой transport_maps = mysql:/etc/postfix/sql/transport.cf, где для тестируемого домена был настроен транспорт virtual. Здесь можно поблагодарить Вьетце Венема за отличную документацию - это я прочитал прямо в man 5 postconf. Dovecot практически не документирован, а вики-страницы с Howto по настройке различных фишек Dovecot за документацию я не считаю.&lt;br /&gt;&lt;br /&gt;После исправления значения транспорта в базе данных возникло ещё несколько проблем:&lt;br /&gt;1. В настройках LDA Dovecot не был указан параметр postmaster_address,&lt;br /&gt;2. Не был настроен сокет /var/run/dovecot/auth-master,&lt;br /&gt;3. Имена каталогов, в которые LDA delivery из Dovecot складывал почту, были строчными, а имена существующих каталогов почтовых ящиков, в которые складывал почту LDA virtual из Postfix, содержали символы в разном регистре.&lt;br /&gt;&lt;br /&gt;Проблемы решались следующим образом:&lt;br /&gt;1. Указан параметр postmaster_address,&lt;br /&gt;2. Прописана секция master в секции socket listen из секции auth default,&lt;br /&gt;3.1. Добавлены буквы L в настройке mail_location, которые указывают принудительно использовать нижний регистр для каталогов почтовых ящиков.&lt;br /&gt;3.2. Использована команда rename 'y/A-Z/a-z/' * для того, чтобы переименовать каталоги почтовых ящиков. Некоторые каталоги, из которых уже успели попробовать забрать почту, пришлось обрабатывать вручную - нужно было перенести письма из старых каталогов в новые, а старые затем удалить.&lt;br /&gt;&lt;br /&gt;Итоговые конфигурационные файлы Dovecot помещаю сюда, чтобы в следующий раз не наступать на те же грабли:&lt;br /&gt;&lt;pre&gt;protocols = pop3&lt;br /&gt;disable_plaintext_auth = no&lt;br /&gt;log_timestamp = "%Y-%m-%d %H:%M:%S "&lt;br /&gt;mail_location = maildir:/var/mail/virtual/%Ld/%Ln&lt;br /&gt;first_valid_uid = 999&lt;br /&gt;first_valid_gid = 999&lt;br /&gt;&lt;br /&gt;dict {&lt;br /&gt;  quotadict = mysql:/etc/dovecot/dovecot-dict-mysql.conf&lt;br /&gt;}&lt;br /&gt;plugin {&lt;br /&gt;  quota = dict:user::proxy::quotadict&lt;br /&gt;  # Квота по умолчанию - объём ящика 1 гигабайт,&lt;br /&gt;  # не более 1000 писем в ящике&lt;br /&gt;  # Эта квота заменяется квотой, найденной в БД&lt;br /&gt;  quota_rule = *:storage=1G:messages=1000&lt;br /&gt;}&lt;br /&gt;protocol pop3 {&lt;br /&gt;  mail_plugins = quota&lt;br /&gt;  mail_executable = /etc/dovecot/pop-update-lastlog.sh&lt;br /&gt;}&lt;br /&gt;protocol lda {&lt;br /&gt;  # Ящик администратора почтовой системы&lt;br /&gt;  postmaster_address = postadmin@domain.tld&lt;br /&gt;  mail_plugins = quota&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Домен по умолчанию для пользователей, пытающихся&lt;br /&gt;# аутентифицироваться в Dovecot без указания домена&lt;br /&gt;auth_default_realm = domain.tld&lt;br /&gt;&lt;br /&gt;auth default {&lt;br /&gt;  mechanisms = plain login&lt;br /&gt;  passdb sql {&lt;br /&gt;    args = /etc/dovecot/dovecot-mysql.conf&lt;br /&gt;  }&lt;br /&gt;  userdb sql {&lt;br /&gt;    args = /etc/dovecot/dovecot-mysql.conf&lt;br /&gt;  }&lt;br /&gt;  socket listen {&lt;br /&gt;    client {&lt;br /&gt;      path = /var/spool/postfix/private/auth&lt;br /&gt;      mode = 0660&lt;br /&gt;      user = postfix&lt;br /&gt;      group = postfix&lt;br /&gt;    }&lt;br /&gt;    master {&lt;br /&gt;      path = /var/run/dovecot/auth-master&lt;br /&gt;      mode = 0660&lt;br /&gt;      user = vmail&lt;br /&gt;      group = vmail&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Уже знакомый скрипт /etc/dovecot/pop-before-smtp.sh для аутентификации POP before SMTP:&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;mysql -u&lt;b&gt;user&lt;/b&gt; -p&lt;b&gt;password&lt;/b&gt; -h127.0.0.1 mail &amp;lt;&amp;lt;END&lt;br /&gt;UPDATE users SET lasttime = NOW(), lastip='$IP' WHERE login = '$USER';&lt;br /&gt;END&lt;br /&gt;exec &lt;b&gt;/usr/lib/dovecot/pop3&lt;/b&gt; "$@"&lt;/pre&gt;&lt;br /&gt;Файл настроек для хранения счётчиков квот в БД MySQL /etc/dovecot/dovecot-dict-mysq.conf:&lt;br /&gt;&lt;pre&gt;connect = host=127.0.0.1 dbname=mail user=&lt;b&gt;user&lt;/b&gt; password=&lt;b&gt;password&lt;/b&gt;&lt;br /&gt;map {&lt;br /&gt;  pattern = priv/quota/storage&lt;br /&gt;  table = users&lt;br /&gt;  username_field = login&lt;br /&gt;  value_field = bytes&lt;br /&gt;}&lt;br /&gt;map {&lt;br /&gt;  pattern = priv/quota/messages&lt;br /&gt;  table = users&lt;br /&gt;  username_field = login&lt;br /&gt;  value_field = messages&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Файл настроек для проверки учётных данных пользователя и его квот по таблице в БД MySQL /etc/dovecot/dovecot-mysql.conf:&lt;br /&gt;&lt;pre&gt;driver = mysql&lt;br /&gt;connect = host=127.0.0.1 dbname=mail user=&lt;b&gt;user&lt;/b&gt; password=&lt;b&gt;password&lt;/b&gt;&lt;br /&gt;default_pass_scheme = CRYPT&lt;br /&gt;password_query = SELECT password FROM users WHERE login = '%u'&lt;br /&gt;user_query = SELECT CONCAT(SUBSTRING_INDEX(login, '@', -1), '/', SUBSTRING_INDEX(login, '@', 1), '/'), \&lt;br /&gt;                    999 AS uid, \&lt;br /&gt;                    999 AS gid, \&lt;br /&gt;                    CONCAT('*:bytes=', max_bytes, ':messages=', max_messages) AS quota_rule \&lt;br /&gt;             FROM users \&lt;br /&gt;             WHERE login = '%u'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В настройки postfix добавлен LDA delivery из Dovecot, в файл /etc/postfix/master.cf добавлены две строчки:&lt;br /&gt;&lt;pre&gt;dovecot unix - n n - - pipe&lt;br /&gt;  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}&lt;/pre&gt;&lt;br /&gt;Столбцы со счётчиками и со значениями квот для пользователей добавлены с помощью четырёх SQL-запросов:&lt;br /&gt;&lt;pre&gt;ALTER TABLE users ADD COLUMN bytes bigint default 0;&lt;br /&gt;ALTER TABLE users ADD COLUMN messages integer default 0;&lt;br /&gt;ALTER TABLE users ADD COLUMN max_bytes bigint default 1073741824;&lt;br /&gt;ALTER TABLE users ADD COLUMN max_messages bigint default 1000;&lt;/pre&gt;&lt;br /&gt;Значения квот по умолчанию можете поменять на свои. Я поставил ограничения в 1 гигабайт на общий объём ящика и не более 1000 писем в одном почтовом ящике.&lt;br /&gt;&lt;br /&gt;В таком виде Dovecot не будет принимать от Postfix письма для адресатов, превысивших квоту. Но такие письма будут просто попадать в очередь отложенных писем Postfix. Нужно же, чтобы письмо не занимало дисковое пространство ни в почтовом ящике получателя, ни в очереди отложенных писем, а отклонялось сразу же с соответствующим сообщением отправителю о том, что адресат превысил квоту.&lt;br /&gt;&lt;br /&gt;Для этого нужно настроить проверку квот при приёме почты самим Postfix'ом. Для этого воспользуемся правилом check_recipient_access mysql:/etc/postfix/sql/quotas.cf, которое нужно поместить в том числе до правил permit_mynetworks и permit_sasl_authenticated. Если поместить его после этих двух проверок, то квоты получателя просто не будут проверяться, если отправитель аутентифицировался на почтовом сервере или он отправляет почту из доверенной сети.&lt;br /&gt;&lt;br /&gt;Файл /etc/postfix/sql/quotas.cf для проверки квоты получателя:&lt;br /&gt;&lt;pre&gt;user = &lt;b&gt;user&lt;/b&gt;&lt;br /&gt;password = &lt;b&gt;password&lt;/b&gt;&lt;br /&gt;dbname = mail&lt;br /&gt;hosts = 127.0.0.1&lt;br /&gt;query = SELECT '452 Mailbox is over quota'&lt;br /&gt;        FROM users&lt;br /&gt;        WHERE login = '%s'&lt;br /&gt;          AND ((bytes &amp;gt;= max_bytes AND max_bytes &amp;gt; 0)&lt;br /&gt;            OR (messages &amp;gt;= max_messages AND max_messages &amp;gt; 0))&lt;/pre&gt;&lt;br /&gt;О расширенных статусах REJECT я прочитал в man 5 access, а подходящий код статуса подобрал в RFC2821 на этой странице: http://tools.ietf.org/html/rfc2821.&lt;br /&gt;&lt;br /&gt;В случае если квота по объёму или по количеству сообщений равна нулю, то этот SQL-запрос такую квоту не проверяет. Таким образом значения 0 в полях max_bytes или max_messages означают, что ограничение по этому параметру не действует.&lt;br /&gt;&lt;br /&gt;При попытке отправить письмо на ящик, превысивший квоту, Outlook Express сообщает следующее:&lt;br /&gt;&lt;blockquote&gt;Не удается отправить сообщение, поскольку сервер отказался принять адрес одного из получателей. В письме был указан адрес: 'user@domain.tld'. Тема 'test1', Учетная запись: 'mail', Сервер: 'domain.tld', Протокол: SMTP, Ответ сервера: '452 4.7.1 &amp;lt;user@domain.tld&amp;gt;: Recipient address rejected: Mailbox is over quota', Порт: 25, Защита (SSL): Нет, Ошибка сервера: 452, Код ошибки: 0x800CCC79&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-1904986755915578882?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/1904986755915578882/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=1904986755915578882' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1904986755915578882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1904986755915578882'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/11/dovecot-postfix-mysql.html' title='Настройка квот в Dovecot и Postfix с хранением счётчиков и правил в словаре MySQL'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8249656645598531444</id><published>2011-11-17T14:45:00.011+06:00</published><updated>2011-11-18T21:37:31.855+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='dovecot'/><title type='text'>Обновление времени последнего входа пользователя dovecot и авторизация POP before SMTP</title><content type='html'>Захотел сделать так, чтобы Dovecot, при подключении пользователя по протоколу POP3, отмечал в базе данных текущее время. Нужно это для того, чтобы определить, какими ящиками давно не пользуются. Нашёл такую вот страницу в wiki Dovecot: &lt;a href="http://wiki.dovecot.org/PostLoginScripting"&gt;http://wiki.dovecot.org/PostLoginScripting&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Для начала нужно узнать текущее значение mail_executable. Для этого воспользуемся командой:&lt;br /&gt;&lt;pre&gt;# dovecot -a | grep mail_executable&lt;/pre&gt;&lt;br /&gt;У меня это значение равно /usr/lib/dovecot/pop3. Именно это значение мы и заменим, так чтобы наш скрипт вызывался до этой программы, обновлял информацию в базе данных, а затем запускал первоначальную программу.&lt;br /&gt;&lt;br /&gt;Cкрипт /etc/dovecot/pop-update-lastlog.sh, обновляющий информацию в базе данных:&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;mysql -u&lt;b&gt;user&lt;/b&gt; -p&lt;b&gt;password&lt;/b&gt; -h127.0.0.1 mail &amp;lt;&amp;lt;END&lt;br /&gt;UPDATE users SET lasttime = NOW(), lastip='$IP' WHERE login = '$USER';&lt;br /&gt;END&lt;br /&gt;exec &lt;b&gt;/usr/lib/dovecot/pop3&lt;/b&gt; "$@"&lt;/pre&gt;&lt;br /&gt;Установил на него права доступа чтобы простые пользователи не смогли узнать пароль от базы данных и чтобы этот скрипт мог выполняться:&lt;br /&gt;&lt;pre&gt;# chmod +x,o= pop-update-lastlog.sh&lt;/pre&gt;&lt;br /&gt;Затем этот скрипт я прописал в /etc/dovecot.conf:&lt;br /&gt;&lt;pre&gt;protocol pop3 {&lt;br /&gt;  mail_executable = /etc/dovecot/pop-update-lastlog.sh&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Затем добавил пару столбцов в базу данных (структура базы данных - самодельная, не взята от какого-либо веб-интерфейса администрирования):&lt;br /&gt;&lt;pre&gt;$ mail -u&lt;b&gt;user&lt;/b&gt; -p&lt;b&gt;password&lt;/b&gt; mail &amp;lt;&amp;lt;END&lt;br /&gt;ALTER TABLE users ADD COLUMN lasttime datetime DEFAULT '1900-01-01 00:00:00';&lt;br /&gt;ALTER TABLE users ADD COLUMN lastip varchar(32) DEFAULT '0.0.0.0';&lt;br /&gt;END&lt;/pre&gt;&lt;br /&gt;И перезапустил dovecot:&lt;br /&gt;&lt;pre&gt;# /etc/init.d/dovecot restart&lt;/pre&gt;&lt;br /&gt;В базе данных начали появляться отметки о времени последнего входа и об IP-адресе клиента, с которого входили последний раз.&lt;br /&gt;&lt;br /&gt;Если у вас настроен также imap-сервер, вы можете создать для него похожий скрипт.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Дополнение от 18 ноября 2011 года.&lt;/b&gt; Информацию из таблиц можно использовать для авторизации POP before SMTP в Postfix (перед отправкой почты по SMTP нужно авторизоваться на POP-сервере).&lt;br /&gt;&lt;br /&gt;В /etc/postfix/main.cf можно прописать следующее:&lt;br /&gt;&lt;pre&gt;mynetworks = 127.0.0.1/8, mysql:/etc/postfix/sql/pop-before-smtp.cf&lt;/pre&gt;&lt;br /&gt;А в файле /etc/postfix/sql/pop-before-smtp.cf указать запрос и параметры подключения к базе данных:&lt;br /&gt;&lt;pre&gt;user = &lt;b&gt;user&lt;/b&gt;&lt;br /&gt;password = &lt;b&gt;password&lt;/b&gt;&lt;br /&gt;dbname = mail&lt;br /&gt;hosts = 127.0.0.1&lt;br /&gt;query = SELECT DISTINCT lastip FROM users WHERE lastip = '%s' AND ADDTIME(lasttime, '0:1:0') &amp;gt; NOW()&lt;/pre&gt;&lt;br /&gt;Запрос возвращает IP-адрес только в том случае, если этот IP-адрес аутентифицировался на POP-сервере в течение последней минуты. В случае, если этот IP-адрес в течение последней минуты аутентифицировался на нескольких учётных записях POP-сервера, то возвращается только один IP-адрес.&lt;br /&gt;&lt;br /&gt;Не забудьте защитить прописанные в файле пароли доступа к базе данных почтового сервера от обычных пользователей:&lt;br /&gt;&lt;pre&gt;# chmod o= pop-before-smtp.cf&lt;/pre&gt;&lt;br /&gt;Попробовал - POP before SMTP действительно работает. Если с момента последнего подключения к POP серверу прошло не больше минуты, то почта отправляется. Если больше или ровно минута - то почта уже не уходит. Получилось такое вот, на мой взгляд, довольно изящное решение.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8249656645598531444?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8249656645598531444/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8249656645598531444' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8249656645598531444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8249656645598531444'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/11/dovecot.html' title='Обновление времени последнего входа пользователя dovecot и авторизация POP before SMTP'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5276420390856204646</id><published>2011-11-11T23:30:00.004+06:00</published><updated>2011-11-12T00:14:13.204+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='windows xp'/><category scheme='http://www.blogger.com/atom/ns#' term='grub2'/><category scheme='http://www.blogger.com/atom/ns#' term='ntfsclone'/><title type='text'>Перенос Windows XP на другой диск средствами Linux</title><content type='html'>Для начала хочу предупредить, что это не точная инструкция как и что делать. Это описание ключевых моментов, для правильного применения которых нужно ещё приложить собственную голову. Если вы не уверены в своих силах, то лучше воспользуйтесь специализированными программами (Acronis True Image или Norton Ghost), а не этим способом, который описывает только средства из Linux.&lt;br /&gt;&lt;br /&gt;Перенос средствами Linux оказался не настолько простым делом, как это могло показаться первоначально. Не буду рассказывать обо всём, что мне довелось попробовать и на какие грабли наступить, я просто резюмирую весь полученный опыт.&lt;br /&gt;&lt;br /&gt;У меня стоит загрузчик GRUB2, но почему-то не стояло очень важного компонента - os-prober. Он умеет при подсовывании ему дискового раздела определять, что за операционная система там стоит. Его наличие позволит упростить настройку GRUB2. Также, поскольку мы будем переносить систему Windows XP с раздела NTFS на раздел NTFS, нам потребуется пакет ntfsprogs. Ну и если у вас ещё нет раздела на диске, в который вы хотите перенести Windows, вам могут потребоваться fdisk и/или parted. Полезным может оказаться и модуль ntfs-3g для монтирования NTFS-раздела в режиме записи.&lt;br /&gt;&lt;pre&gt;# apt-get install os-prober ntfsprogs hexedit&lt;/pre&gt;&lt;br /&gt;Останавливаться на создании раздела для Windows я не стану, т.к. это дело тривиальное и, на мой взгляд, не требующее объяснений.&lt;br /&gt;&lt;br /&gt;Первым делом скопируем NTFS-раздел. Делается это командой ntfsclone:&lt;br /&gt;&lt;pre&gt;# ntfsclone --overwrite /dev/sdb3 /dev/sda1&lt;/pre&gt;&lt;br /&gt;/dev/sda1 - это исходный раздел с Windows,&lt;br /&gt;/dev/sdb3 - это целевой раздел, на который мы переносим систему.&lt;br /&gt;БУДЬТЕ ВНИМАТЕЛЬНЫ, ничего не перепутайте! Посмотреть, какие разделы есть на дисках, можно с помощью команды:&lt;br /&gt;&lt;pre&gt;# fdisk -l&lt;/pre&gt;&lt;br /&gt;Если возникают сомнения, смонтируйте разделы и убедитесь в том, что вы точно знаете, с какого на какой раздел нужно перенести систему. У меня таких проблем не было, т.к. диска было всего два, на одном из дисков было аж 6 разделов, а на другом - только 1, поэтому перепутать их было трудно.&lt;br /&gt;&lt;br /&gt;После клонирования мы получим раздел в точности повторяющий исходный. Ловушка заключается в том, что загрузчик Windows, располагающийся в начале раздела (NTFS Boot Record), содержит в себе информацию о геометрии диска, положении раздела и о серийном номере этого раздела.&lt;br /&gt;&lt;br /&gt;На данном этапе мне помогла статья &lt;a href="http://jalada.co.uk/2010/10/26/relocating-windows-to-a-new-hard-drive.html"&gt;Relocating Windows to a new Hard Drive&lt;/a&gt;, в которой есть ссылка на исходный текст простенькой программы, которая исправляет загрузчик NTFS так, чтобы он узнал о новой геометрии диска. Эту программу я на всякий случай скопировал себе и разместил тут: &lt;a href="http://wheel69.narod.ru/ntfsreloc.c"&gt;ntfsreloc.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Соберём её (для этого может потребоваться установить компилятор языка Си, который у меня уже стоял, т.к. я иногда на нём пишу сам):&lt;br /&gt;&lt;pre&gt;$ gcc -o ntfsreloc ntfsreloc.c&lt;/pre&gt;&lt;br /&gt;Теперь её нужно запустить:&lt;br /&gt;&lt;pre&gt;# ntfsreloc -w -p /dev/sdb3&lt;/pre&gt;&lt;br /&gt;Затем нужно смонтировать диск и исправить в файле boot.ini в корневом каталоге номер раздела, с которого будет грузиться Windows. Раньше у меня это был раздел №1, а теперь - №3.&lt;br /&gt;&lt;pre&gt;[boot loader]&lt;br /&gt;timeout=30&lt;br /&gt;default=multi(0)disk(0)rdisk(0)partition(&lt;b&gt;3&lt;/b&gt;)\WINDOWS&lt;br /&gt;[operating systems]&lt;br /&gt;multi(0)disk(0)rdisk(0)partition(&lt;b&gt;3&lt;/b&gt;)\WINDOWS="Microsoft Windows XP Professional RU" /noexecute=optin /fastdetect&lt;/pre&gt;&lt;br /&gt;Теперь нужно исправить карту дисков GRUB, которая находится в файле /boot/grub/device.map:&lt;br /&gt;&lt;pre&gt;(fd0)   /dev/fd0&lt;br /&gt;(hd0)   /dev/disk/by-id/ata-WDC_WD10EADS-65L5B1_WD-WCAU4A888959&lt;br /&gt;(hd1)   /dev/disk/by-id/ata-ST34313A_6CR0J30R&lt;/pre&gt;&lt;br /&gt;Диском (hd0) должен быть тот, на который мы переносим систему. Или можно исправить номер диска в файле boot.ini Windows, так чтобы номер загрузочного диска совпадал с номером диска в device.map. Полезно также перед этим настроить привязку дисков в /etc/fstab к UUID раздела или к метке раздела, чтобы в случае путаницы с номерами дисков Linux всё-таки загрузился. Практически во всех современных системах Linux это уже так, т.к. с заменой драйвера IDE на унифицированный драйвер дисков, номер, под которым определится диск, стал непредсказуем.&lt;br /&gt;&lt;br /&gt;Дальше нужно обновить конфигурацию GRUB2:&lt;br /&gt;&lt;pre&gt;# update-grub&lt;/pre&gt;&lt;br /&gt;И можно перезагружаться. При первой загрузке нам потребуются оба диска, т.к. в реестре Windows сохранилась привязка к идентификатору прежнего диска. После загрузки системы запускаем regedit и редактируем раздел HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices. В нём нужно поменять буквы дисков C и того, который по содержимому идентичен диску C. У меня это были диски C и D. Сделал я это в три приёма:&lt;br /&gt;C -&gt; Z&lt;br /&gt;D -&gt; C&lt;br /&gt;Z -&gt; D&lt;br /&gt;После этого завершаем работу, отключаем старый диск и пробуем загрузиться снова. Если всё было сделано правильно, система загрузится с нового диска.&lt;br /&gt;&lt;br /&gt;Я таким образом смог отключить противно свистящий старый диск, на котором у меня стоял Windows XP. Сама эта заметка является, по сути, продолжением предыдущей: &lt;a href="http://vladimir-stupin.blogspot.com/2011/11/fancontrol.html"&gt;Настройка fancontrol - демона управления вентиляторами компьютера&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Желаю вам удачного переноса Windows!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5276420390856204646?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5276420390856204646/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5276420390856204646' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5276420390856204646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5276420390856204646'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/11/windows-xp-linux.html' title='Перенос Windows XP на другой диск средствами Linux'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-3889089092876404741</id><published>2011-11-11T22:13:00.009+06:00</published><updated>2011-11-11T23:30:14.713+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fancontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='xfce'/><title type='text'>Настройка fancontrol - демона управления вентиляторами компьютера</title><content type='html'>Надоело слушать постоянное жужжание домашнего компьютера, поэтому решил заняться вопросом. Первым делом были закуплены и установлены тихие вентиляторы на процессор и корпус.&lt;br /&gt;&lt;br /&gt;Шум хоть и стал меньше, меня он всё равно не устроил. Компьютер и, соответственно, корпус у меня 2006 года, поэтому что-либо совсем уж тихое найти было сложновато. Опытным путём было выяснено, что больше всего шума даёт корпусной вентилятор (для этого достаточно на секунду остановить все вентиляторы поочерёдно пальцем или другим подходящим предметом). Поскольку на вентиляторе имелся не только стандартный 3-контактный разъём, но и разъём Molex, нашлось простое решение - перекинуть контакты, так чтобы снизилось питающее вентилятор напряжение. Подробнее это можно увидеть в разделе &lt;a href="http://www.ixbt.com/cpu/pc-cooling-construction.shtml#FanPower"&gt;"Подключение вентиляторов"&lt;/a&gt; из статьи &lt;a href="http://www.ixbt.com/cpu/pc-cooling-construction.shtml"&gt;"Конструируем систему охлаждения компьютера"&lt;/a&gt;. Жёлтый провод я всё-же воткнул в 3-контактный разъём на положенное место, дабы следить за скоростью вращения вентилятора, о чем будет написано чуть ниже.&lt;br /&gt;&lt;br /&gt;Вторым кандидатом на настройку стал вентилятор процессора. В BIOS я узнал, что моя материнская плата поддерживает функцию PWM - управление скоростью вращения вентилятора в зависимости от показаний температурного датчика. Простейшее трёхскоростное управление я настроил прямо из BIOS, и если оно вас устроит, то нужды настраивать fancontrol в принципе нет. Меня эти три режима не устроили, захотелось более плавного разгона вентилятора по мере нагревания процессора.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-nkSfpUrUmAc/Tr1ZFERmHmI/AAAAAAAABJw/0Ti7R1QxfSQ/s1600/PB078033.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-nkSfpUrUmAc/Tr1ZFERmHmI/AAAAAAAABJw/0Ti7R1QxfSQ/s320/PB078033.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5673789049138454114" /&gt;&lt;/a&gt;&lt;br /&gt;Поскольку я пользуюсь Linux (Debian 6), то и настраивать управление будем в нём.&lt;br /&gt;&lt;br /&gt;Первым делом, установим пакет для слежения за сенсорами и запустим обнаружение сенсоров:&lt;br /&gt;&lt;pre&gt;# apt-get install lm-sensors&lt;br /&gt;# sensors-detect&lt;/pre&gt;&lt;br /&gt;Отвечаем на все вопросы буквой y. Это важно, т.к. на один из вопросов ответ по умолчанию - n. Без этого пункта у меня не находились сенсоры материнской платы.&lt;br /&gt;&lt;pre&gt;Now follows a summary of the probes I have just done.&lt;br /&gt;Just press ENTER to continue: &lt;br /&gt;&lt;br /&gt;Driver `it87':&lt;br /&gt;  * ISA bus, address 0x290&lt;br /&gt;    Chip `ITE IT8712F Super IO Sensors' (confidence: 9)&lt;br /&gt;&lt;br /&gt;Driver `k8temp' (autoloaded):&lt;br /&gt;  * Chip `AMD K8 thermal sensors' (confidence: 9)&lt;br /&gt;&lt;br /&gt;To load everything that is needed, add this to /etc/modules:&lt;br /&gt;#----cut here----&lt;br /&gt;# Chip drivers&lt;br /&gt;it87&lt;br /&gt;#----cut here----&lt;br /&gt;If you have some drivers built into your kernel, the list above will&lt;br /&gt;contain too many modules. Skip the appropriate ones!&lt;/pre&gt;&lt;br /&gt;Теперь можно заглянуть в /etc/modules и проверить, появились ли там новые модули, добавленные sensors-detect.&lt;br /&gt;&lt;br /&gt;Чтобы не перезагружать систему, загрузим эти модули вручную. У меня был добавлен модуль it87, поэтому я подгружаю его:&lt;br /&gt;&lt;pre&gt;# modprobe it87&lt;/pre&gt;&lt;br /&gt;Теперь можно посмотреть информацию, предоставляемую сенсорами:&lt;br /&gt;&lt;pre&gt;$ sensors&lt;br /&gt;&lt;br /&gt;k8temp-pci-00c3&lt;br /&gt;Adapter: PCI adapter&lt;br /&gt;Core0 Temp:  +32.0°C                                    &lt;br /&gt;&lt;br /&gt;it8712-isa-0290&lt;br /&gt;Adapter: ISA adapter&lt;br /&gt;in0:         +1.07 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;in1:         +2.58 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;in2:         +3.33 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;in3:         +2.21 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;in4:         +3.02 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;in5:         +1.76 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;in6:         +2.00 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;in7:         +2.35 V  (min =  +0.00 V, max =  +4.08 V)   &lt;br /&gt;Vbat:        +4.08 V&lt;br /&gt;fan1:          0 RPM  (min =    0 RPM, div = 8)&lt;br /&gt;fan3:       1670 RPM  (min =    0 RPM, div = 8)&lt;br /&gt;temp1:       +25.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor&lt;br /&gt;temp2:       +29.0°C  (low  = +127.0°C, high = +60.0°C)  sensor = thermistor&lt;br /&gt;temp3:       +70.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor&lt;br /&gt;cpu0_vid:   +1.100 V&lt;/pre&gt;&lt;br /&gt;У меня есть сенсоры температуры на процессоре и на материнской плате (не знаю, в каких именно местах).&lt;br /&gt;&lt;br /&gt;Теперь установим пакет для управления скоростью вращения вентиляторов.&lt;br /&gt;&lt;pre&gt;# apt-get install fancontrol&lt;/pre&gt;&lt;br /&gt;И запустим программу для автоматизированной настройки fancontrol:&lt;br /&gt;&lt;pre&gt;# pwmconfig&lt;/pre&gt;&lt;br /&gt;Программа сразу после запуска сообщает информацию об обнаруженных ею сенсорах температуры, устройствах управления вентиляторами и сенсорах скорости вращения вентиляторов:&lt;br /&gt;&lt;pre&gt;Found the following devices:&lt;br /&gt;   hwmon0/device is k8temp&lt;br /&gt;   hwmon1/device is it8712&lt;br /&gt;&lt;br /&gt;Found the following PWM controls:&lt;br /&gt;   hwmon1/device/pwm1&lt;br /&gt;   hwmon1/device/pwm2&lt;br /&gt;   hwmon1/device/pwm3&lt;br /&gt;&lt;br /&gt;Giving the fans some time to reach full speed...&lt;br /&gt;Found the following fan sensors:&lt;br /&gt;   hwmon1/device/fan1_input     current speed: 2556 RPM&lt;br /&gt;   hwmon1/device/fan3_input     current speed: 1654 RPM&lt;/pre&gt;&lt;br /&gt;Лучше всего сразу куда-нибудь скопировать эту информацию, чтобы понимать, что за устройства программа имеет в виду, когда спрашивает вас о чём-то. Например, для меня было важно, что hwmon0/device - это процессор, а hwmon1/device - это материнская плата.&lt;br /&gt;&lt;br /&gt;Дальше программа по очереди пытается остановить каждый из вентиляторов и пытается по сенсорам вращения вентиляторов установить соответствие между устройством управления скоростью вращения вентилятора и связанным с ним сенсором.&lt;br /&gt;&lt;br /&gt;У меня было обнаружено только одно соответствие:&lt;br /&gt;&lt;pre&gt;Testing pwm control hwmon1/device/pwm1 ...&lt;br /&gt;  hwmon1/device/fan1_input ... speed was 2556 now 0&lt;br /&gt;    It appears that fan hwmon1/device/fan1_input&lt;br /&gt;    is controlled by pwm hwmon1/device/pwm1&lt;/pre&gt;&lt;br /&gt;После этого программа предложила составить таблицу соответствия между значениями управляющего байта (от 0 до 255) и скоростью вращения вентилятора:&lt;br /&gt;&lt;pre&gt;Would you like to generate a detailed correlation (y)?&lt;/pre&gt;&lt;br /&gt;Я ответил утвердительно.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    PWM 255 FAN 2596&lt;br /&gt;    PWM 240 FAN 2596&lt;br /&gt;    PWM 225 FAN 2556&lt;br /&gt;    PWM 210 FAN 2556&lt;br /&gt;    PWM 195 FAN 2556&lt;br /&gt;    PWM 180 FAN 2556&lt;br /&gt;    PWM 165 FAN 2596&lt;br /&gt;    PWM 150 FAN 2556&lt;br /&gt;    PWM 135 FAN 2556&lt;br /&gt;    PWM 120 FAN 2596&lt;br /&gt;    PWM 105 FAN 2596&lt;br /&gt;    PWM 90 FAN 2596&lt;br /&gt;    PWM 75 FAN 2556&lt;br /&gt;    PWM 60 FAN 2556&lt;br /&gt;    PWM 45 FAN 2445&lt;br /&gt;    PWM 30 FAN 2280&lt;br /&gt;    PWM 28 FAN 2250&lt;br /&gt;    PWM 26 FAN 2191&lt;br /&gt;    PWM 24 FAN 2163&lt;br /&gt;    PWM 22 FAN 2109&lt;br /&gt;    PWM 20 FAN 2057&lt;br /&gt;    PWM 18 FAN 1985&lt;br /&gt;    PWM 16 FAN 1917&lt;br /&gt;    PWM 14 FAN 1834&lt;br /&gt;    PWM 12 FAN 1721&lt;br /&gt;    PWM 10 FAN 1622&lt;br /&gt;    PWM 8 FAN 1493&lt;br /&gt;    PWM 6 FAN 1339&lt;br /&gt;    PWM 4 FAN 1171&lt;br /&gt;    PWM 2 FAN 964&lt;br /&gt;    PWM 0 FAN 0&lt;br /&gt;    Fan Stopped at PWM = 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Программа не обнаружила, каким из вентиляторов управляло устройство hwmon1/device/pwm2 и спросила меня, слышал или видел ли я, что какой-то из вентиляторов во время теста останавливался.&lt;br /&gt;&lt;pre&gt;Did you see/hear a fan stopping during the above test (n)?&lt;/pre&gt;&lt;br /&gt;Я этого не видел и не заметил уменьшения шума, поэтому ответил n.&lt;br /&gt;&lt;br /&gt;То же самое произошло и с устройством hwmon1/device/pwm3. Я также ответил n.&lt;br /&gt;&lt;br /&gt;Затем программа говорит о том, что программа fancontrol может следить за температурой устройств, управляя скоростью вращения вентиляторов. pwmconfig предлагает мне настроить fancontrol. Я соглашаюсь.&lt;br /&gt;&lt;pre&gt;The fancontrol script can automatically respond to temperature changes&lt;br /&gt;of your system by changing fanspeeds.&lt;br /&gt;Do you want to set up its configuration file now (y)?&lt;/pre&gt;&lt;br /&gt;Задаёт вопрос о том, где должен находиться файл конфигурации fancontrol. Можно нажать enter и тем самым согласиться на предложенный файл, а можно ввести другое имя файла.&lt;br /&gt;&lt;pre&gt;What should be the path to your fancontrol config file (/etc/fancontrol)?&lt;/pre&gt;&lt;br /&gt;Дальше программа предлагает настроить устройство управления только одним из вентиляторов, для которого установлено соответствие канала управления и сенсора скорости вращения.&lt;br /&gt;&lt;pre&gt;Select fan output to configure, or other action:&lt;br /&gt;1) hwmon1/device/pwm1  3) Just quit       5) Show configuration&lt;br /&gt;2) Change INTERVAL     4) Save and quit&lt;/pre&gt;&lt;br /&gt;Пункт 2 позволяет настроить периодичность проверки температуры и коррекции скорости вращения.&lt;br /&gt;&lt;br /&gt;Пункт 3 позволяет просто выйти.&lt;br /&gt;&lt;br /&gt;Пункт 4 - сохранить настройки и выйти.&lt;br /&gt;&lt;br /&gt;Пункт 5 - показать конфигурацию.&lt;br /&gt;&lt;br /&gt;Выбираем пункт 1, чтобы указать, какой из сенсоров температуры следует использовать для управления вентилятором. У меня таких сенсоров 4, я выбираю первый из них, который соответствует сенсору температуры на процессоре.&lt;br /&gt;&lt;pre&gt;Select a temperature sensor as source for hwmon1/device/pwm1:&lt;br /&gt;1) hwmon0/device/temp1_input&lt;br /&gt;2) hwmon1/device/temp1_input&lt;br /&gt;3) hwmon1/device/temp2_input&lt;br /&gt;4) hwmon1/device/temp3_input&lt;br /&gt;5) None (Do not affect this PWM output)&lt;br /&gt;select (1-n):&lt;/pre&gt;&lt;br /&gt;Остальные сенсоры - это сенсоры температуры на материнской плате. Их положение мне неизвестно, да и управлять больше у меня нечем, кроме как скоростью вращения вентилятора на процессоре. Есть ещё корпусной вентилятор, но он, судя по тестам pwmconfig, фактически не управляется.&lt;br /&gt;&lt;br /&gt;Дальше нужно ответить на несколько простых вопросов. Нам понадобится составленная выше таблица зависимости скорости вращения вентилятора от значения управляющего сигнала и немного здравого смысла. Судя по таблице, вентилятор работает на максимальной скорости уже при значении сигнала управления 105. Останавливается он при значении 2, а запускается при значении 4 (это я смог узнать только пробуя разные значения этого параметра в конфигурации fancontrol).&lt;br /&gt;&lt;br /&gt;Как я выбирал предельные температуры? Очень просто - температура воздуха дома сейчас около 30 градусов Цельсия (на системнике висит магнит с термометром). Не вижу смысла насиловать кулер, заставляя его охлаждать процессор простым обдувом комнатным воздухом до 30 градусов или ниже - это просто невозможно. Накидываю 5 градусов и считаю такую температуру процессора нормальной. Пока температруа процессора ниже 35 градусов, включать охлаждение особого смысла нет. Включать его на полную мощность следует только при той температуре, при которой BIOS начнёт предупреждать о перегреве звуковым сигналом. У меня это 60 градусов Цельсия. Пока не достигнута эта температура, разгоняем вентилятор плавно, не в полную силу.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Ovnz0wvm4N4/Tr1YtXltwiI/AAAAAAAABJk/DHG3uSAO-dg/s1600/PB078032.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://2.bp.blogspot.com/-Ovnz0wvm4N4/Tr1YtXltwiI/AAAAAAAABJk/DHG3uSAO-dg/s320/PB078032.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5673788642006254114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;Enter the low temperature (degree C)&lt;br /&gt;below which the fan should spin at minimum speed (20): 35&lt;/pre&gt;&lt;br /&gt;Указать самую высокую температуру, выше которой вентилятор должен включаться на полную мощность.&lt;br /&gt;&lt;pre&gt;Enter the high temperature (degree C)&lt;br /&gt;over which the fan should spin at maximum speed (60): 60&lt;/pre&gt;&lt;br /&gt;Минимальное значение канала управления, при котором вентилятор останавливается.&lt;br /&gt;&lt;pre&gt;Enter the minimum PWM value (0-255)&lt;br /&gt;at which the fan STOPS spinning (press t to test) (100): 2&lt;/pre&gt;&lt;br /&gt;Минимальное значение канала управления, при котором вентилятор начинает вращаться.&lt;br /&gt;&lt;pre&gt;Enter the minimum PWM value (4-255)&lt;br /&gt;at which the fan STARTS spinning (press t to test) (150): 4&lt;/pre&gt;&lt;br /&gt;Значение канала управления, если температура ниже минимальной.&lt;br /&gt;&lt;pre&gt;Enter the PWM value (0-4) to use when the temperature&lt;br /&gt;is below the low temperature limit (0): 0&lt;/pre&gt;&lt;br /&gt;Значение канала управления, если температура выше максимальной.&lt;br /&gt;&lt;pre&gt;Enter the PWM value (4-255) to use when the temperature&lt;br /&gt;is over the high temperature limit (255): 105&lt;/pre&gt;&lt;br /&gt;Теперь можно посмотреть конфигурацию (пункт 5) или сохранить изменения и закончить настройку (пункт 4). Можно снова ответить на вопросы, выбрав канал управления из списка.&lt;br /&gt;&lt;br /&gt;Все эти настройки вносятся в файл /etc/fancontrol, где их можно отредактировать вручную:&lt;br /&gt;&lt;pre&gt;# Configuration file generated by pwmconfig, changes will be lost&lt;br /&gt;INTERVAL=5&lt;br /&gt;DEVPATH=hwmon0=devices/pci0000:00/0000:00:18.3 hwmon1=devices/platform/it87.656&lt;br /&gt;DEVNAME=hwmon0=k8temp hwmon1=it8712&lt;br /&gt;FCTEMPS= hwmon1/device/pwm1=hwmon0/device/temp1_input&lt;br /&gt;FCFANS= hwmon1/device/pwm1=hwmon1/device/fan1_input&lt;br /&gt;MINTEMP= hwmon1/device/pwm1=35&lt;br /&gt;MAXTEMP= hwmon1/device/pwm1=60&lt;br /&gt;MINSTART= hwmon1/device/pwm1=4&lt;br /&gt;MINSTOP= hwmon1/device/pwm1=2&lt;br /&gt;MAXPWM=hwmon1/device/pwm1=105&lt;/pre&gt;&lt;br /&gt;Осталось только запустить службу fancontrol и вентиляторы будут управляться автоматически:&lt;br /&gt;&lt;pre&gt;# /etc/init.d/fancontrol start&lt;/pre&gt;&lt;br /&gt;Самое главное, что нужно от pwmconfig - это установить соответствие между сенсорами скорости вращения вентилятора, температуры и каналом управления скоростью вращения вентилятора. Остальное можно настраивать уже простым редактированием файла /etc/fancontrol с последующим перезапуском демона fancontrol. Следить за индикаторами можно с помощью команд watch sensors. Именно таким образом я настроил подходящие параметры fancontrol.&lt;br /&gt;&lt;br /&gt;С такими настройками я могу редактировать тексты при полностью остановленном вентиляторе. При полной загрузке процессора температура его поднимается до 45 градусов и держится на этом уровне стараниями fancontrol.&lt;br /&gt;&lt;br /&gt;Я пользуюсь XFCE и нашёл для него два интересных плагина для более удобного наблюдения за температурой и процессором: xfce4-cpufreq-plugin и xfce4-sensors-plugin.&lt;br /&gt;&lt;br /&gt;Установим их вместе с другими рекомендованными пакетами:&lt;br /&gt;&lt;pre&gt;# apt-get install xfce4-cpufreq-plugin xfce4-sensors-plugin xsensors hddtemp cpufreq&lt;/pre&gt;&lt;br /&gt;Дальше их нужно просто добавить в панель и настроить. Всё это делается через меню панели.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-TpsjtJ_EHU0/Tr1aSl7XKSI/AAAAAAAABJ8/985bLuoYFaI/s1600/applets.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 109px; height: 62px;" src="http://1.bp.blogspot.com/-TpsjtJ_EHU0/Tr1aSl7XKSI/AAAAAAAABJ8/985bLuoYFaI/s320/applets.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5673790381021931810" /&gt;&lt;/a&gt;&lt;br /&gt;Рядом с двумя индикаторами температур (процессора и жёсткого диска) удобно разместился индикатор текущей частоты процессора. Мой процессор умеет вдвое уменьшать свою рабочую частоту, когда он не сильно загружен - с 2 Гигагерц до 1 Гигагерца.&lt;br /&gt;&lt;br /&gt;Впрочем, я не стремлюсь превратить свой компьютер в кабину самолёта, поэтому эти апплеты будут висеть в панели лишь некоторое время, пока конфигурация может потребовать доработки. Затем я скорее всего уберу эти апплеты, поскольку никакой жизненно важной информации они не предоставляют.&lt;br /&gt;&lt;br /&gt;После всех этих манипуляций самым громким источником шума стал старенький жёсткий диск Seagate на 4,3 Гигабайта, на котором у меня установлена Windows XP. Во время работы он издаёт раздражающий свист. Осталось перенести Windows XP на менее шумный жёсткий диск WD на 1 Терабайт, где у меня установлена основная система - Debian GNU/Linux 6.0.&lt;br /&gt;&lt;br /&gt;Неожиданно, сделать это оказалось непросто. Но об этом - в следующей заметке.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-3889089092876404741?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/3889089092876404741/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=3889089092876404741' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3889089092876404741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3889089092876404741'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/11/fancontrol.html' title='Настройка fancontrol - демона управления вентиляторами компьютера'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-nkSfpUrUmAc/Tr1ZFERmHmI/AAAAAAAABJw/0Ti7R1QxfSQ/s72-c/PB078033.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-1869269124879027384</id><published>2011-10-26T11:23:00.007+06:00</published><updated>2011-10-26T12:18:30.511+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spawn-fcgi'/><category scheme='http://www.blogger.com/atom/ns#' term='lighttpd'/><category scheme='http://www.blogger.com/atom/ns#' term='fastcgi'/><title type='text'>Настройка FastCGI и PHP с индивидуальными правами пользователей</title><content type='html'>Перевод статьи: &lt;a href="http://redmine.lighttpd.net/wiki/1/HowToSetupFastCgiIndividualPermissions"&gt;Setup FastCGI and PHP with individual user permissions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Автор: silverjam и другие.&lt;br /&gt;&lt;br /&gt;Примечания переводчика: для порядка я иногда перевожу материалы, которыми собираюсь воспользоваться. Начав делать этот перевод, я сразу же пожалел о том, что ввязался в это гиблое дело - статья разжёвывает элементарные вещи вроде заведения пользователей, групп, членство в группах и права доступа. Ну и запуск сценариев инициализации из cron'а я, конечно, не одобряю. Кроме того, автор использовал FreeBSD 6.2, в которой существовало ограничение на максимальное количество групп для одного пользователя. В качестве решения автор предлагает перейти на FreeBSD 8.0, однако я думаю, что есть по меньшей мере ещё два решения: 1. воспользоваться TCP-сокетами, вместо сокетов домена Unix, 2. воспользоваться каким-нибудь дистрибутивом Linux.&lt;br /&gt;&lt;br /&gt;Перво-наперво отметим, что этот рецепт является только примером, поэтому не предъявляйте претензий, если предпочитаете делать такие вещи другим способом, или рассердили клиентов или что-то в этом роде...&lt;br /&gt;&lt;br /&gt;Execwrap или php-fpm можно использовать в тех же целях, но этот рецепт не касается этих методов.&lt;br /&gt;&lt;br /&gt;Замечание: Этот рецепт работает только на операционных системах типа Unix. Я не знаю, как сделать подобное на Windows.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Введение&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Запуск хостинга веб-сайтов для обслуживания индивидуальных пользователей/клиентов потребует дополнительного доведения до ума настроек вашего веб-сервера.&lt;br /&gt;&lt;br /&gt;Для начала, нужно назначить каждому пользователю собственную учётную запись на веб-сервере. Пользователь загрузит файлы своих скриптов PHP в его собственный виртуальный корневой каталог документов.&lt;br /&gt;&lt;br /&gt;Нужно, чтобы все файлы скриптов PHP выполнялись с правами того же пользователя, который управляет этим виртуальным узлом. Если это так, то можно быть уверенным, что ни один из пользователей не сможет увидеть чужие скрипты PHP.&lt;br /&gt;&lt;br /&gt;Рассмотрим следующий скрипт PHP, выполняемый на веб-сервере без индивидуальных разрешений пользователя (не пытайтесь сделать это, поскольку вы можете кончить тем, что полиция постучится в вашу дверь!):&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;  $filename = "/path_to_other_users_vhost_root/index.php";&lt;br /&gt;  $handle = fopen($filename, "rb");&lt;br /&gt;  $contents = fread($handle, filesize($filename));&lt;br /&gt;  fclose($handle);&lt;br /&gt;  echo $contents;&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;Этот сценарий прочитает и покажет исходный код скрипта PHP какого-то другого пользователя. Исходный код может содержать пароли, используемые для подключения к пользовательским базам данных MySQL, или другую интересную информацию. Можно даже сделать скрипт PHP, который сможет перезаписать файлы в каталогах пользователя другого виртуального узла!&lt;br /&gt;&lt;br /&gt;Мы хотим этого избежать!&lt;br /&gt;&lt;br /&gt;Как насчёт встроенного в PHP безопасного режима safe_mode?&lt;br /&gt;&lt;br /&gt;Я не хочу сказать что-то плохое о PHP, но я не рекомендую использовать PHP с возможностями встроенного безопасного режима safe_mode. (Обратитесь к &lt;a href="http://www.php.net/manual/en/features.safe-mode.php"&gt;документации по safe_mode на php.net&lt;/a&gt; за более подробным описанием.)&lt;br /&gt;&lt;br /&gt;Однако, некоторые настройки php.ini могут предотвратить или замедлить большинство видов атак без необходимости изменять исходный код. Для предотвращения удалённого доступа из php воспользуйтесь &lt;a href="http://www.php.net/manual/en/ref.filesystem.php#ini.allow-url-fopen"&gt;allow_url_fopen&lt;/a&gt;, а для предотвращения вставки удалённых файлов в php вы можете воспользоваться &lt;a href="http://www.php.net/manual/en/ref.filesystem.php#ini.allow-url-include"&gt;allow_url_include&lt;/a&gt;. Настройка &lt;a href="http://www.php.net/manual/en/features.safe-mode.php#ini.open-basedir"&gt;open_basedir&lt;/a&gt; - это хороший способ усложнить работу взломщика, но этот способ не заменит разрешений пользователей. Для замедления некоторых видов угона сеансов можно отключить опцию &lt;a href="http://www.php.net/manual/en/ref.session.php#ini.session.use-trans-sid"&gt;session.use_trans_sid&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Но всё же будет лучше, если положиться на возможности ограничения доступа пользователей, встроенные в операционную систему.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Установка&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Подразумевается, что на сервере уже установлены Lighttpd и PHP с поддержкой FastCGI. (&lt;a href="http://trac.lighttpd.net/trac/wiki/TutorialLighttpdAndPHP"&gt;Как установить PHP с поддержкой FastCGI&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Чтобы выполнить установку, нужно войти под пользователем root.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;1. Добавим пользователей в операционную систему&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Это необходимо только в том случае, если пользователи ещё не добавлены.)&lt;br /&gt;&lt;br /&gt;Нужно добавить учётную запись пользователя в операционную систему для каждого пользователя, права которого требуется отделить, чтобы предотвратить возможность доступа к чужому исходному коду.&lt;br /&gt;&lt;br /&gt;Предположим, что таких пользователей три (fred, george и ron).&lt;br /&gt;&lt;br /&gt;Выполним следующие команды:&lt;br /&gt;&lt;pre&gt;# useradd fred&lt;br /&gt;# useradd george&lt;br /&gt;# useradd ron&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;2. Добавим группы пользователей в операционную систему&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Нужно добавить по одной группе для каждого из добавленных выше пользователей. Для простоты назовём группы так же, как и пользователей:&lt;br /&gt;&lt;br /&gt;Выполним следующие команды:&lt;br /&gt;&lt;pre&gt;# groupadd fred&lt;br /&gt;# groupadd george&lt;br /&gt;# groupadd ron&lt;/pre&gt;&lt;br /&gt;Теперь нужно добавить каждого пользователя в его группу. В каждой группе пользователей будет два члена: сам пользователь и пользователь демона lighttpd.&lt;br /&gt;&lt;br /&gt;Группы пользователей можно настроить, отредактировав файл /etc/group в любом текстовом редакторе.&lt;br /&gt;&lt;br /&gt;Файл должен выглядеть примерно так (номера групп могут отличаться):&lt;br /&gt;&lt;pre&gt;... [пропущенные строки]&lt;br /&gt;fred:x:441:fred,lighttpd&lt;br /&gt;george:x:442:george,lighttpd&lt;br /&gt;ron:x:443:ron,lighttpd&lt;/pre&gt;&lt;br /&gt;Можно также воспользоваться командой sed:&lt;br /&gt;&lt;pre&gt;# sed -i "s/^\(fred.*\)$/\1,fred,lighttpd/g" /etc/group&lt;br /&gt;# sed -i "s/^\(george.*\)$/\1,george,lighttpd/g" /etc/group&lt;br /&gt;# sed -i "s/^\(ron.*\)$/\1,ron,lighttpd/g" /etc/group&lt;/pre&gt;&lt;br /&gt;Эти команды добавят самого пользователя и пользователя lighttpd в группы.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;3. Настроим структуру файловой системы&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Предположим, что мы хотим сохранить все связанные с веб-сервером файлы виртуальных узлов в подкаталогах "/var/www". (Конечно, вы можете выбрать другое место, просто удостоверьтесь, что созданные пользователи имеют права на чтение и выполнение их каталогов. (Например,  "chmod 755 /var/www &amp;&amp; chown root:root /var/www").&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;3.1 Создадим корневой каталог&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь, создадим два каталога: один для нескольких сценариев запуска, к которому будет иметь доступ только пользователь root, и другой для всех виртуальных узлов:&lt;br /&gt;&lt;br /&gt;Выполним следующие команды:&lt;br /&gt;&lt;pre&gt;# cd /var/www&lt;br /&gt;# mkdir fastcgi&lt;br /&gt;# mkdir vhosts&lt;br /&gt;# chown lighttpd:lighttpd *&lt;br /&gt;# chmod 755 *&lt;br /&gt;# ls -l /var/www&lt;br /&gt;drwxr-xr-x 2 lighttpd lighttpd 4096 Feb 15 12:17 fastcgi&lt;br /&gt;drwxr-xr-x 9 lighttpd lighttpd 4096 Feb 15 11:21 vhosts&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;3.2 Создадим каталог для каждого из виртуальных узлов&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь создадим каталог для каждого из виртуальных узлов в каталоге "/var/www/vhosts" и зададим соответствующие права для их пользователей:&lt;br /&gt;&lt;br /&gt;Выполним следующие команды:&lt;br /&gt;&lt;pre&gt;# cd /var/www/vhosts&lt;br /&gt;# mkdir fred-weasley.com&lt;br /&gt;# mkdir george-weasley.com&lt;br /&gt;# mkdir ron-weasley.com&lt;br /&gt;# chown fred:fred fred-weasley.com&lt;br /&gt;# chown george:george george-weasley.com&lt;br /&gt;# chown ron:ron ron-weasley.com&lt;br /&gt;# chmod 750 *&lt;br /&gt;# ls -l /var/www/vhosts&lt;br /&gt;drwxr-x--- 7 fred fred 4096 Feb 15 20:18 fred-weasley.com&lt;br /&gt;drwxr-x--- 6 george george 4096 Feb 15 11:02 george-weasley.com&lt;br /&gt;drwxr-x--- 6 ron ron 4096 Feb 15 11:23 ron-weasley.com&lt;/pre&gt;&lt;br /&gt;Теперь у нас есть три каталога, в которых три пользователя не могут увидеть файлы друг друга, однако демон lighttpd может видеть их все.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;3.3 Создадим структуру каталогов для каждого виртуального узла&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь нужно создать структуру каталогов для каждого виртуального узла:&lt;br /&gt;&lt;br /&gt;Выполним следующие команды:&lt;br /&gt;&lt;pre&gt;# cd /var/www/vhosts/fred-weasley.com&lt;br /&gt;# mkdir html&lt;br /&gt;# mkdir includes (не обязательно)&lt;br /&gt;# mkdir logs&lt;br /&gt;# chown fred:fred *&lt;br /&gt;# chown lighttpd:fred logs&lt;br /&gt;# chmod 750 *&lt;br /&gt;# ls -l /var/www/vhosts/fred-weasley.com&lt;br /&gt;drwxr-x--- 14 fred fred 4096 Feb 17 11:55 html&lt;br /&gt;drwxr-x--- 2 fred fred 4096 Feb 15 12:05 includes&lt;br /&gt;drwxr-x--- 2 lighttpd fred 4096 Feb 15 11:11 logs&lt;/pre&gt;&lt;br /&gt;Нужно повторить эти команды для каждого из пользователей виртуального узла, заменяя имя пользователя "fred" на имя соответствующего пользователя.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;3.4 Создадим каталог FastCGI для каждого пользователя&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь мы готовы приступить к самому интересному!&lt;br /&gt;&lt;br /&gt;Теперь, перейдём в каталог "/var/www/fastcgi", где мы хотим создать каталог каждого из пользователей. (Когда мы закончим, эти каталоги будут содержать сокеты процессов сервера FastCGI):&lt;br /&gt;&lt;br /&gt;Выполним следующие команды:&lt;br /&gt;&lt;pre&gt;# cd /var/www/fastcgi&lt;br /&gt;# mkdir fred&lt;br /&gt;# mkdir george&lt;br /&gt;# mkdir ron&lt;br /&gt;# chown fred:fred fred&lt;br /&gt;# chown george:george george&lt;br /&gt;# chown ron:ron ron&lt;br /&gt;# chmod 750 *&lt;br /&gt;# ls -l /var/www/fastcgi&lt;br /&gt;drwxr-x--- 7 fred fred 4096 Feb 15 20:18 fred&lt;br /&gt;drwxr-x--- 6 george george 4096 Feb 15 11:02 george&lt;br /&gt;drwxr-x--- 6 ron ron 4096 Feb 15 11:23 ron&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(Отметим, что пользователь lighttpd может читать все каталоги, в то время как три пользователя имеют доступ только к собственным каталогам.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;4. Создадим скрипт запуска FastCGI для каждого пользователя&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Создадим каталог, который будет содержать все скрипты запуска FastCGI, выполнив следующие команды:&lt;br /&gt;&lt;pre&gt;# cd /var/www/fastcgi&lt;br /&gt;# mkdir startup&lt;br /&gt;# chmod 750 startup&lt;br /&gt;# ls -l /var/www/fastcgi&lt;br /&gt;drwxr-x--- 7 fred fred 4096 Feb 15 20:18 fred&lt;br /&gt;drwxr-x--- 6 george george 4096 Feb 15 11:02 george&lt;br /&gt;drwxr-x--- 6 ron ron 4096 Feb 15 11:23 ron&lt;br /&gt;drwxr-x--- 6 root root 4096 Feb 15 11:23 startup&lt;/pre&gt;&lt;br /&gt;Теперь, перейдём в каталог "/var/www/fastcgi/startup", создадим скрипт запуска для пользователя fred (давайте назовём его fred-startup.sh), воспользовавшись любым текстовым редактором:&lt;br /&gt;&lt;br /&gt;Скрипт оболочки:&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;## АБСОЛЮТНЫЙ путь к двоичному файлу spawn-fcgi&lt;br /&gt;SPAWNFCGI="/usr/bin/spawn-fcgi" &lt;br /&gt;&lt;br /&gt;## АБСОЛЮТНЫЙ путь к двоичному файлу PHP&lt;br /&gt;FCGIPROGRAM="/usr/bin/php-cgi" &lt;br /&gt;&lt;br /&gt;## Прослушивание порта TCP на localhost&lt;br /&gt;FCGISOCKET="/var/www/fastcgi/fred/fred.socket" &lt;br /&gt;&lt;br /&gt;## Раскомментируйте строку PHPRC, если имеется дополнительный файл php.ini для этого пользователя&lt;br /&gt;## Положите этот файл php.ini в /var/www/fastcgi/fred/php.ini&lt;br /&gt;## С помощью этого файла php.ini можно увеличить безопасность системы&lt;br /&gt;## Просто настройте параметр open_basedir на веб-каталоги пользователей&lt;br /&gt;## Например: (добавьте эту строку в ваш настроенный файл php.ini)&lt;br /&gt;## open_basedir = /var/www/vhosts/fred/html&lt;br /&gt;#PHPRC="/var/www/fastcgi/fred/" &lt;br /&gt;&lt;br /&gt;## Количество детей PHP порождаемых дополнительно к основным. Минимум 2.&lt;br /&gt;## Действительное количество детей = PHP_FCGI_CHILDREN + 1&lt;br /&gt;PHP_FCGI_CHILDREN=5&lt;br /&gt;&lt;br /&gt;## Количество запросов выполненных сервером к одному процессу php, прежде чем этот процесс будет перезапущен&lt;br /&gt;PHP_FCGI_MAX_REQUESTS=1000&lt;br /&gt;&lt;br /&gt;## IP-адреса, с которых PHP должен принимать соединения серверов&lt;br /&gt;FCGI_WEB_SERVER_ADDRS="127.0.0.1" &lt;br /&gt;&lt;br /&gt;# Доступные переменные окружения, разделённые пробелами&lt;br /&gt;ALLOWED_ENV="PATH USER" &lt;br /&gt;&lt;br /&gt;## Если этот скрипт запускается от имени пользователя root, то fastcgi переключится на следующего пользователя:&lt;br /&gt;USERID=fred&lt;br /&gt;GROUPID=fred&lt;br /&gt;&lt;br /&gt;################## После этой строки настроек нет&lt;br /&gt;if test x$PHP_FCGI_CHILDREN = x; then&lt;br /&gt;  PHP_FCGI_CHILDREN=5&lt;br /&gt;fi&lt;br /&gt;export PHP_FCGI_MAX_REQUESTS&lt;br /&gt;export FCGI_WEB_SERVER_ADDRS&lt;br /&gt;export PHPRC&lt;br /&gt;ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS PHPRC"&lt;br /&gt;&lt;br /&gt;# Скопируем доступные переменные окружения&lt;br /&gt;E=&lt;br /&gt;for i in $ALLOWED_ENV; do&lt;br /&gt;  E="$E $i=$(eval echo "\$$i")" &lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;# Очистим переменные окружения и настроим новые&lt;br /&gt;env - $E $SPAWNFCGI -s $FCGISOCKET -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN&lt;br /&gt;chmod 770 $FCGISOCKET&lt;/pre&gt;&lt;br /&gt;Будьте аккуратны с путями, USERID и GROUPID.&lt;br /&gt;&lt;br /&gt;Отметим, что в этом примере процессы php запускаются от имени пользователя, созданного ранее ("fred"). Это означает, что код php будет иметь права доступа к файлам html и php. Это может быть удобно, но может быть менее безопасно.&lt;br /&gt;&lt;br /&gt;В качестве альтернативы можно задать USERID значение "nobody" (или любого другого пользователя без каких-либо особых разрешений), чтобы запретить процессу php запись.&lt;br /&gt;&lt;br /&gt;Нужно повторить процесс и создать скрипт запуска для каждого пользователя из каталога "/var/www/fastcgi/startup". (Просто скопируйте фалй и замените FCGISOCKET, USERID и GROUPID на правильные значения).&lt;br /&gt;&lt;br /&gt;Не забудьте установить разрешения на выполнение всех скриптов запуска:&lt;br /&gt;&lt;br /&gt;Выполним следующие команды:&lt;br /&gt;&lt;pre&gt;# cd /var/www/fastcgi/startup&lt;br /&gt;# chmod 750 *&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;5. Проверим настройку PHP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Если вы не знаете точно, где находится файл php.ini, просто выполните следующие команды:&lt;br /&gt;&lt;pre&gt;$ php-cgi -i | grep php.ini&lt;/pre&gt;&lt;br /&gt;Удостоверьтесь, что в файле php.ini имеется следующая строка:&lt;br /&gt;&lt;pre&gt;cgi.fix_pathinfo=1&lt;/pre&gt;&lt;br /&gt;Если вы раскомментировали строку PHPRC в скрипте из раздела 4, проверьте владельца и права доступа к файлу php.ini. Чтобы он использовался, нужно выполнить команды:&lt;br /&gt;&lt;pre&gt;# chmod 644 php.ini&lt;br /&gt;# chown root:root php.ini&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;6. Запустим все скрипты запуска FastCGI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь запустим все процессы-серверы FastCGI, выполнив следующие команды:&lt;br /&gt;&lt;pre&gt;# /var/www/fastcgi/startup/fred-startup.sh&lt;br /&gt;spawn-fcgi.c.170: child spawned successfully: PID: xxxxx&lt;br /&gt;# /var/www/fastcgi/startup/george-startup.sh&lt;br /&gt;spawn-fcgi.c.170: child spawned successfully: PID: xxxxx&lt;br /&gt;# /var/www/fastcgi/startup/ron-startup.sh&lt;br /&gt;spawn-fcgi.c.170: child spawned successfully: PID: xxxxx&lt;/pre&gt;&lt;br /&gt;Если будут какие-то сообщения об ошибках, проверьте скрипты запуска и права доступа к каталогу "/var/www/fastcgi", включая все подкаталоги.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;7. Настроим виртуальные узлы на сервере lighttpd&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Отредактируем файл "/etc/lighttpd.conf" в любом текстовом редакторе:&lt;br /&gt;&lt;pre&gt;...[некоторое количество строк конфигурации]...&lt;br /&gt;$HTTP["host"] =~ "(^|\.)fred-weasley.com$" {&lt;br /&gt;  server.document-root = "/var/www/vhosts/fred-weasley.com/html" &lt;br /&gt;  accesslog.filename = "/var/www/vhosts/fred-weasley.com/logs/access_log" &lt;br /&gt;  fastcgi.server = ( ".php" =&gt;&lt;br /&gt;    (&lt;br /&gt;      ( "socket" =&gt; "/var/www/fastcgi/fred/fred.socket",&lt;br /&gt;        "broken-scriptfilename" =&gt; "enable" &lt;br /&gt;      )&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$HTTP["host"] =~ "(^|\.)george-weasley.com$" {&lt;br /&gt;  server.document-root = "/var/www/vhosts/george-weasley.com/html" &lt;br /&gt;  accesslog.filename = "/var/www/vhosts/george-weasley.com/logs/access_log" &lt;br /&gt;  fastcgi.server = ( ".php" =&gt;&lt;br /&gt;    (&lt;br /&gt;      ( "socket" =&gt; "/var/www/fastcgi/george/george.socket",&lt;br /&gt;        "broken-scriptfilename" =&gt; "enable" &lt;br /&gt;      )&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$HTTP["host"] =~ "(^|\.)ron-weasley.com$" {&lt;br /&gt;  server.document-root = "/var/www/vhosts/ron-weasley.com/html" &lt;br /&gt;  accesslog.filename = "/var/www/vhosts/ron-weasley.com/logs/access_log" &lt;br /&gt;  fastcgi.server = ( ".php" =&gt;&lt;br /&gt;    (&lt;br /&gt;      ( "socket" =&gt; "/var/www/fastcgi/ron/ron.socket",&lt;br /&gt;        "broken-scriptfilename" =&gt; "enable" &lt;br /&gt;      )&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Обратите внимание на пути к сокетам FastCGI каждого виртуального узла.&lt;br /&gt;&lt;br /&gt;Условные блоки НЕ оказывают действия на server.errorlog, все сообщения об ошибках попадают в последний указанный файл журнала. Поэтому используется один глобальный журнал.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;8. Перезапустим процесс демона lighttpd&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Просто выполним следующую команду:&lt;br /&gt;&lt;pre&gt;# /etc/init.d/lighttpd restart&lt;/pre&gt;&lt;br /&gt;Если будут какие-то сообщения об ошибках, проверьте файл конфигурации "/etc/lighttpd.conf".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;9. Здравствуй мир!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь, войдём под пользователем fred и создадим скрипт PHP в его виртуальном узле (например, "/var/www/vhosts/fred-weasley.com/html/index.php"):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;  echo "&amp;lt;h1&amp;gt;Здравствуй мир!&amp;lt;/h1&amp;gt;";&lt;br /&gt;  echo "&amp;lt;p&amp;gt;Идентификатор текущего пользователя: ". posix_getuid();&lt;br /&gt;  echo "&amp;lt;p&amp;gt;Идентификатор текущей группы: ". posix_getgid();&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;Убедитесь, что вы задали разрешения на доступ к файлу:&lt;br /&gt;&lt;br /&gt;Выполните следующие команды:&lt;br /&gt;&lt;pre&gt;# chown fred:fred /var/www/vhosts/fred-weasley.com/html/index.php&lt;br /&gt;# chmod 640 /var/www/vhosts/fred-weasley.com/html/index.php&lt;br /&gt;# ls -l /var/www/vhosts/fred-weasley.com/html&lt;br /&gt;-rw-r----- 1 fred fred 116 Jul 25 2004 index.php&lt;/pre&gt;&lt;br /&gt;Теперь, запустим веб-браузер и проверим вывод скрипта PHP. (Здесь: http://www.fred-weasley.com/index.php)&lt;br /&gt;&lt;br /&gt;Если всё хорошо, вы увидите страницу, на которой будут отображены идентификаторы пользователя и группы fred. (Вы можете увидеть эти идентификаторы в файлах "/etc/passwd" и "/etc/group").&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic; font-weight: bold;"&gt;10. Автоматический вызов скриптов запуска FastCGI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;При желании можно также создать запись в планировщике задач crontab для автоматического вызова скриптов запуска FastCGI при загрузке сервера.&lt;br /&gt;&lt;br /&gt;Воспользуемся следующей командой для редактирования заданий планировщика crontab:&lt;br /&gt;&lt;pre&gt;# crontab -e&lt;/pre&gt;&lt;br /&gt;Теперь добавим следующую строку:&lt;br /&gt;&lt;pre&gt;@reboot for i in /var/www/fastcgi/startup/*.sh; do $i; done&lt;/pre&gt;&lt;br /&gt;А затем введём ":x" для сохранения и выхода.&lt;br /&gt;&lt;br /&gt;Эта запись в планировщике задач crontab выполнит все файлы с расширением .sh, найденные в каталоге /var/www/fastcgi/startup, после загрузки сервера.&lt;br /&gt;&lt;br /&gt;Поздравляю! Теперь у вас есть быстрый сервер, настроенный с отдельными правами для пользователей.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ограничения&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Таким образом мы создали отдельные группы процессов fastcgi для каждого пользователя. Это означает, что у этих процессов нет общей памяти. Поэтому, если этот способ используется на компьютере с большим количеством пользователей, потребуется значительное количество доступной оперативной памяти. Также, если используется какой-нибудь кэш транслированного кода PHP, например, xcache, apc или eaccelerator, этот способ приведёт к созданию собственного кэша у каждого из пользователей (что полезно для повышения безопасности, но приводит к увеличению использования памяти). Можно уменьшить использование памяти с помощью файлов php.ini, в которых настроить ускоритель с разными объёмами кэша, а также изменить значение переменной PHP_FCGI_CHILDREN в каждом из пользовательских скриптов startup.sh.&lt;br /&gt;&lt;br /&gt;В FreeBSD (6.2) каждый пользователь может состоять максимум в 14 группах. Этот верхний предел экземпляров fastcgi для виртуальных узлов, поскольку пользователю lighttpd (www) необходим доступ к этим сокетам. Я настроил мой веб-сервер 1-2 года назад этим способом и столкнулся с проблемой несколько недель назад, когда добавил пользователя www в пятнадцатую группу. Не было никаких сообщений об ошибках, иди-свищи ответа у google. Но всё-таки, есть ли решение? ;) Да, в FreeBSD 8.0 этот предел был поднят до 1024.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Разрешения&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;У mod_fastcgi имеется опция check-local. Если она включена, Lighttpd использует своего пользователя для проверки существования файла в document-root. Если вы хотите, чтобы пользователь Lighttpd не имел доступа к document-root, нужно отключить эту опцию.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-1869269124879027384?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/1869269124879027384/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=1869269124879027384' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1869269124879027384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1869269124879027384'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/10/fastcgi-php.html' title='Настройка FastCGI и PHP с индивидуальными правами пользователей'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-1981714735200787223</id><published>2011-10-14T14:22:00.005+06:00</published><updated>2011-10-15T01:38:41.886+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><category scheme='http://www.blogger.com/atom/ns#' term='postfix'/><title type='text'>Postfix maildir umask</title><content type='html'>Захотел написать небольшое веб-приложение для управления почтовым сервером. Одна из функций этого приложения - удаление почтового ящика из БД. Стандартная задача, которая обычно возникает при удалении почтового ящика, - это создать пересылку с удалённого адреса на другой и перенести уже принятые письма в каталог преемника.&lt;br /&gt;&lt;br /&gt;Пример: сотрудник раздавал клиентам визитки со своим электронным адресом. Сотрудник уволился, но его электронную почту нужно обрабатывать, чтобы не потерять клиентов. Для этого можно создать пересылку на другой почтовый ящик, уже полученные письма перенести в почтовый ящик преемника, а сам почтовый ящик уволившегося сотрудника удалить.&lt;br /&gt;&lt;br /&gt;Переносом писем по задумке должно заниматься веб-приложение, работающее с правами веб-сервера. Чтобы веб-сервер мог перенести письма, ему нужно иметь соответствующие права доступа. Для этого я включил пользователя www-data в группу vmail, затем дал группе vmail права rwx на каталоги почтовых ящиков.&lt;br /&gt;&lt;br /&gt;Каталоги почтовых ящиков создаёт программа virtual почтовой системы Postfix. Можно задать uid и gid, с которыми будет работать эта программа. Это делается с помощью параметров virtual_uid и virtual_gid. Я для пробы решил создать один почтовый ящик и отправить на него письмо. virtual создал каталоги почтового ящика, но выставил для группы vmail права доступа, которые не позволяют ей делать ничего с этим ящиком.&lt;br /&gt;&lt;br /&gt;Я прочитал man virtual в надежде найти какой-нибудь параметр вроде virtual_umask, но не нашёл. Попробовал выставить umask в файле /etc/init.d/postfix, перезапустил его, удалил каталог почтового ящика и снова отправил тестовое письмо. Каталог создался с теми же правами. В недоумении я стал искать в интернете, не сталкивался ли кто с такой же проблемой.&lt;br /&gt;&lt;br /&gt;Оказалось - &lt;a href="http://irbs.net/internet/postfix/0510/0699.html"&gt;сталкивались&lt;/a&gt;. А параметра virtual_umask нет и не будет. Вьетце Венема аргументирует свою позицию тем, что он сисадмин с 20-летним стажем и доступ к письмам со стороны левых программ может отрицательно отразиться на безопасности почтовой системы. Никаких других доводов он слышать не желает. В том числе он не желает слышать о том, что система прав в Unix задумана такой не для того, чтобы искусственно обходить её стороной. Патчи, если кто такие и напишет, судя по молчанию Вьетце, приняты в основную ветку не будут.&lt;br /&gt;&lt;br /&gt;Единственное приемлемое решение моей задачи, по мнению Вьетце Венема, - это забрать почту по протоколу POP из этого ящика и отправить её на другой ящик по протоколу SMTP.&lt;br /&gt;&lt;br /&gt;У меня отношение к этому простое - безопасность ради безопасности не нужна. Я лучше постараюсь заменить Courier на какую-нибудь другую программу, которая сама умеет складывать письма в почтовые ящики и имеет собственный модуль доставки для Postfix или умеет работать по протоколу LMTP. В качестве замены исправно работающего много лет Courier воспользуюсь Dovecot.&lt;br /&gt;&lt;br /&gt;В общем, если что - не удивляйтесь невменяемости этого уважаемого всеми товарища.&lt;br /&gt;&lt;br /&gt;P.S. Настроил Dovecot вместо Courier и... всё то же самое. Настройка umask у Dovecot в прошлом была, но потом была удалена. Вместо неё придумали плагины для работы с общими почтовыми ящиками. Не смешно, но для такой простой операции, видимо, придётся воспользоваться чем-то вроде fetchmail. Хотя, можно воспользоваться sudo, в конфиге которой прописать одну строго ограниченную команду, можно сделать скрипт, работающий по cron'у, можно пропатчить сам Dovecot, а вот использование LMTP из Dovecot тоже не поможет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-1981714735200787223?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/1981714735200787223/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=1981714735200787223' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1981714735200787223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1981714735200787223'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/10/postfix-maildir-umask.html' title='Postfix maildir umask'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-535378596815580266</id><published>2011-10-04T20:17:00.008+06:00</published><updated>2011-10-04T20:33:16.047+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rdp'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='remmina'/><category scheme='http://www.blogger.com/atom/ns#' term='xfce'/><title type='text'>Remmina</title><content type='html'>Сегодня вновь посмотрел на программу Remmina и на этот раз она мне понравилась, т.к. я нашёл в ней функцию подключения по протоколу RDP через SSH-туннель, а также нашёл удобный апплет для XFCE.&lt;br /&gt;&lt;br /&gt;Сама Remmina в Debian находится в пакете remmina и по умолчанию поддерживает только протоколы SSH и SFTP. Плагин для подключения по RDP находится в пакете remmina-rdp, а апплет находится в пакете remmina-xfce.&lt;br /&gt;&lt;br /&gt;Для начала поставим всё это хозяйство:&lt;br /&gt;&lt;pre&gt;# apt-get install remmina remmina-rdp remmina-xfce&lt;/pre&gt;&lt;br /&gt;Разобраться в настройках легко, я просто покажу как она выглядит.&lt;br /&gt;&lt;br /&gt;Главное окно Remmina:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-mvvUVAIKctQ/TosWnwbY9II/AAAAAAAABF4/LIPzdqMKXL4/s1600/remmina-main.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 304px;" src="http://1.bp.blogspot.com/-mvvUVAIKctQ/TosWnwbY9II/AAAAAAAABF4/LIPzdqMKXL4/s320/remmina-main.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5659642228991652994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Окно настройки RDP:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-CkVmGg5hgx8/TosWykMTDwI/AAAAAAAABGA/4fvvPx8HIAA/s1600/remmina-rdp1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 312px; height: 320px;" src="http://3.bp.blogspot.com/-CkVmGg5hgx8/TosWykMTDwI/AAAAAAAABGA/4fvvPx8HIAA/s320/remmina-rdp1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5659642414685687554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-dGO240cKTjg/TosW4UowaMI/AAAAAAAABGI/6dz5aDjPaPw/s1600/remmina-rdp2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 312px; height: 320px;" src="http://3.bp.blogspot.com/-dGO240cKTjg/TosW4UowaMI/AAAAAAAABGI/6dz5aDjPaPw/s320/remmina-rdp2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5659642513589299394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Окно настройки SSH:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-dkPMvMzG4_M/TosXI3ZwFWI/AAAAAAAABGQ/JE74kahJw0A/s1600/remmina-ssh.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 316px; height: 320px;" src="http://1.bp.blogspot.com/-dkPMvMzG4_M/TosXI3ZwFWI/AAAAAAAABGQ/JE74kahJw0A/s320/remmina-ssh.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5659642797799511394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Окно настройки SFTP:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-ZuqvIbO7e5A/TosXQ4EdQhI/AAAAAAAABGY/O2bbE3aWPqQ/s1600/remmina-sftp.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 316px; height: 320px;" src="http://2.bp.blogspot.com/-ZuqvIbO7e5A/TosXQ4EdQhI/AAAAAAAABGY/O2bbE3aWPqQ/s320/remmina-sftp.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5659642935417586194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Кусочек экрана с апплетом для XFCE:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-u-stCPPfVHs/TosXZLUgBOI/AAAAAAAABGg/xyXnuBMUenw/s1600/remmina-xfce.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 152px;" src="http://2.bp.blogspot.com/-u-stCPPfVHs/TosXZLUgBOI/AAAAAAAABGg/xyXnuBMUenw/s320/remmina-xfce.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5659643078024103138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Удалённый рабочий стол, открытый по протоколу RDP с помощью Remmina:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-k4IeXik026I/TosY6qejoDI/AAAAAAAABGo/c6s1k8P3-ds/s1600/remote-desktop.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/-k4IeXik026I/TosY6qejoDI/AAAAAAAABGo/c6s1k8P3-ds/s320/remote-desktop.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5659644752835092530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Теперь подключаться к удалённым компьютерам стало значительно удобнее!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-535378596815580266?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/535378596815580266/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=535378596815580266' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/535378596815580266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/535378596815580266'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/10/remmina.html' title='Remmina'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-mvvUVAIKctQ/TosWnwbY9II/AAAAAAAABF4/LIPzdqMKXL4/s72-c/remmina-main.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-4528627181023409629</id><published>2011-10-03T15:35:00.014+06:00</published><updated>2011-10-13T15:04:48.364+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Программы, которыми я пользуюсь в Debian GNU/Linux</title><content type='html'>Решил выложить обновлённую заметку &lt;a href="http://vladimir-stupin.blogspot.com/2009/01/linux.html"&gt;Программы, которыми я пользуюсь в Linux&lt;/a&gt;. С тех пор много воды утекло и теперь я пользуюсь другими программами.&lt;br /&gt;&lt;br /&gt;Пользуюсь средой XFCE. До этого я пользовался KDE3, но эта ветка прекратила своё существование в пользу более новой - KDE4, которая мне не понравилась. Я последовательно перепробовал IceWM, затем LXDE, и остановился на XFCE, которым сейчас и пользуюсь. Смена графической среды повлекла за собой замену многих программ из лагеря KDE/Qt на аналогичные из лагеря Gnome/GTK.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Сеть:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Torrent-клиент - Transmission.&lt;br /&gt;2. FTP-клиент&lt;br /&gt;&lt;br /&gt;Iceweasel или Chromium - когда нужно просто скачать несколько файлов.&lt;br /&gt;&lt;br /&gt;lftp или ncftp - когда я работаю в консоли или мне нужно работать с FTP-сервером из скрипта.&lt;br /&gt;&lt;br /&gt;3. Web-браузер - Iceweasel или Chromium.&lt;br /&gt;4. Почтовый клиент - пользуюсь GMail.&lt;br /&gt;5. RDP-клиент - Remmina.&lt;br /&gt;6. Эмулятор терминала - Terminal (пакет xfce4-terminal).&lt;br /&gt;7. IM-клиент - Pidgin.&lt;br /&gt;&lt;br /&gt;Раньше пользовался Psi. Сейчас стал пользоваться Pidgin по двум причинам:&lt;br /&gt;1. America Online продала ICQ компании Mail.ru. Mail.ru поменяли политику - открыли протокол, перестали его менять, разрешили использовать альтернативные ICQ-клиенты. Поэтому я вновь стал пользоваться ICQ, в дополнение к Jabber.&lt;br /&gt;2. KDE4 мне не понравился, поэтому с KDE3 я перешёл на XFCE. Для XFCE родным тулкитом является GTK, поэтому вместо логичного для KDE мультипротокольного клиента Kopete я выбрал Pidgin, который лучше подходит для XFCE.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Офисные программы:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Офисный пакет - Openoffice.org.&lt;br /&gt;&lt;br /&gt;В дальнейшем, видимо, будет заменён на LibreOffice. Почему - я думаю понятно без объяснений.&lt;br /&gt;&lt;br /&gt;2. Калькулятор - KCalc или bc.&lt;br /&gt;3. Просмотр PDF, DjVu, PostScript - Evince.&lt;br /&gt;4. Просмотр FB2 - fbreader.&lt;br /&gt;5. Файловый менеджер - Thunar и bash.&lt;br /&gt;6. Архиватор - Xarchiver или консольные tar, bzip2/bunzip2, gzip/gunzip, unzip, unrar.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Картинки:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Просмотр картинок - GPicView.&lt;br /&gt;2. Редактор картинок - KolourPaint (альтернатив не искал, т.к. практически не пользуюсь).&lt;br /&gt;3. Скриншоты - ScreenShooter из XFCE (пакет xfce4-screenshooter).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Мультимедиа:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. CD-риппер - консольный риппер ripit.&lt;br /&gt;2. Запись CD/DVD - K3b (увы, лучше него пока ничего не нашёл).&lt;br /&gt;3. Аудио-плеер - DeadBeef.&lt;br /&gt;4. Простановка тегов в музыкальных треках - ExFalso.&lt;br /&gt;5. Видеоплеер - SMPlayer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Разработка:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Редактор кода, в том числе C и HTML - Geany или vim-lite.&lt;br /&gt;2. Текстовый редактор - LeafPad, MousePad.&lt;br /&gt;3. Переводы страниц руководства - POEdit и po4a.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Разное:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Учёт личных финансов - GNUCash.&lt;br /&gt;&lt;br /&gt;Ещё я пользуюсь рядом самописных и подсмотренных где-то скриптов. В частности это скрипты для конвертирования кодировок текстовых файлов (на основе iconv), конвертирования кодировок в тегах mp3-файлов (на основе mid3iconv из пакета python-mutagen), конвертирования из doc, rtf и html в текст (antidoc, unrtf и unhtml соответственно), скрипты переименования фотографий по EXIF-тегам (exiftool из пакета libimage-exiftool-perl), скрипты разбивки FLAC-файлов (shntool).&lt;br /&gt;&lt;br /&gt;Я перестал пользоваться клиентами DC++, т.к. в уфанетовском хабе с некоторых пор наблюдается голяк. На первый план вышли torrent-трекеры.&lt;br /&gt;&lt;br /&gt;Перестал пользоваться менеджером дисков Gnome Catalog, так как купил жёсткий диск на 1 Терабайт. Кроме того, запись дисков отнимает очень много времени, которого у меня теперь мало. Да и барахольщиком нынче быть не очень выгодно, т.к. тарифы на интернет стали очень дешёвыми - что угодно можно найти и быстро скачать из Интернета в любой момент.&lt;br /&gt;&lt;br /&gt;Перестал вообще пользоваться двухпанельными менеджерами файлов. Это связано со предыдущими пунктами: дешёвые тарифы на интернет, распространение торрентов, объёмный жёсткий диск, нехватка времени - теперь реже нужно разгребать завалы файлов.&lt;br /&gt;&lt;br /&gt;Перестал играть в компьютерные игры - нет времени. Стал читать вместо этого книги. Обычные, бумажные.&lt;br /&gt;&lt;br /&gt;Изменения от 4 октября 2011:&lt;br /&gt;&lt;br /&gt;Для просмотра PDF, PostScript и DjVu вместо программ KPDF, KGhostView и DjView4 теперь пользуюсь Evince.&lt;br /&gt;&lt;br /&gt;Вместо FreeRDP теперь использую Remmina - менеджер подключений SSH, SFTP и RDP (и других, которыми не пользуюсь). Плагин RDP использует для подключения FreeRDP. Использую апплет Remmina для XFCE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-4528627181023409629?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/4528627181023409629/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=4528627181023409629' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4528627181023409629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4528627181023409629'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/10/debian-gnulinux.html' title='Программы, которыми я пользуюсь в Debian GNU/Linux'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-2013794194356574076</id><published>2011-07-31T16:35:00.002+06:00</published><updated>2011-07-31T16:48:07.919+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='flac'/><title type='text'>Перекодирование FLAC</title><content type='html'>Попались нестандартные FLAC-файлы с битрейтом 96 килогерц и с 24-битными сэмплами. Переделал в 44100-герцовые и 16-битные с помощью трёх команд:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;flac -d infile.flac -o temp1.wav&lt;br /&gt;sox temp1.wav -b 16 -r 44100 -t .wav temp2.wav&lt;br /&gt;flac temp2.wav -o outfile.flac&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Решил записать на память - может понадобится в будущем, а голову ломать второй раз не хочется.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-2013794194356574076?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/2013794194356574076/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=2013794194356574076' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2013794194356574076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2013794194356574076'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/07/flac.html' title='Перекодирование FLAC'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8146114538821055871</id><published>2011-07-21T23:44:00.003+06:00</published><updated>2011-07-21T23:52:39.656+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dns'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='dyndns'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Настройка DynDNS</title><content type='html'>Давно не приходилось пользоваться DynDNS, а потому не заметил, что у ddclient поменялся формат файла конфигурации. Теперь в файле конфигурации можно указывать несколько записей для обновления и мне теперь больше не нужны трюки, к которым я прибегал в заметке &lt;a href="http://vladimir-stupin.blogspot.com/2008/08/dyndns-debian.html"&gt;Настройка DynDNS на Debian&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Всё стало очень просто, как и должно быть. Файл конфигурации /etc/ddclient.conf:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pid=/var/run/ddclient.pid&lt;br /&gt;&lt;br /&gt;protocol=dyndns2, \&lt;br /&gt;server=members.dyndns.org, \&lt;br /&gt;login=username, \&lt;br /&gt;password='mypassword', \&lt;br /&gt;use=if, \&lt;br /&gt;if=eth0, \&lt;br /&gt;ufadeb.homelinux.org&lt;br /&gt;&lt;br /&gt;protocol=dyndns2, \&lt;br /&gt;server=members.dyndns.org, \&lt;br /&gt;login=username, \&lt;br /&gt;password='mypassword', \&lt;br /&gt;use=if, \&lt;br /&gt;if=ppp0, \&lt;br /&gt;stupin.homelinux.org&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Файл настройки параметров демона /etc/default/ddclient:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;run_ipup="false"&lt;br /&gt;run_daemon="true"&lt;br /&gt;daemon_interval="60"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Затем я запустил демона с помощью команды&lt;br /&gt;&lt;pre&gt;/etc/init.d/ddclient start&lt;/pre&gt;&lt;br /&gt;и всё заработало.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8146114538821055871?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8146114538821055871/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8146114538821055871' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8146114538821055871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8146114538821055871'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/07/dyndns.html' title='Настройка DynDNS'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-6136422296614398216</id><published>2011-07-13T11:28:00.017+06:00</published><updated>2011-07-13T21:51:39.960+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xinerama'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><category scheme='http://www.blogger.com/atom/ns#' term='X-Window'/><title type='text'>Xinerama: монитор и телевизор</title><content type='html'>Примерно год назад у меня дома случилась перестановка мебели, в результате которой телевизор стал стоять недалеко от компьютера. Тогда же мне пришла в голову мысль подключить телевизор к компьютеру для более удобного просмотра фильмов. Но, прошёл почти год, прежде чем у меня появилось достаточно свободного времени, чтобы этим заняться. Сейчас я в отпуске и решил этим заняться.&lt;br /&gt;&lt;br /&gt;Хочу заранее сказать, что я не любитель отслеживать разного рода новинки в области компьютерной и видеотехники. Телевизор этот купила моя жена, когда ещё начала работать, с ней мы тогда не были знакомы. Компьютер с этой видеокартой (NVidia GeForce 6600) я купил где-то в начале 2006 года, когда мой старый компьютер стал намертво виснуть при повышенной нагрузке на процессор (архивирование, просмотр некоторых фильмов, просмотр флеша). Старый компьютер модернизации не подлежал и поэтому из старого компьютера в новый попал только привод DVD-RW, который позже сломался и был заменён на другой.&lt;br /&gt;&lt;br /&gt;Есть люди, которым нравится покупать все новинки компьютерной и видеотехники. Им вряд ли будет интересно читать всё нижеследующее, потому что всё это уже давно устарело. Эти люди будут любят задавать вопросы "зачем тебе этот хлам" и раздавать ценные советы вида "купи себе то-то и то-то и не возись с этим барахлом". Заранее прошу таких людей не беспокоить меня.&lt;br /&gt;&lt;br /&gt;Итак, перво-наперво, нужно было купить кабели для соединения телевизора и компьютера.&lt;br /&gt;&lt;br /&gt;Я обследовал видеокарту и нашёл там разъём S-Video (собственно, я и так знал, что он там есть). Один друг мне до этого рассказывал, что он тоже подключал телевизор к компьютеру (правда под Windows) и сказал, что с этим кабелем он намучился, потому что их бывает несколько разных видов. Я это вспомнил, внимательно рассмотрел разъём и поискал его в интернете. Нашёл вот такую статью &lt;a href="http://www.hius.com.ua/index.php?str=help04_06&amp;w=0&amp;s="&gt;Разъёмы S-Video, применяемые в видеокартах&lt;/a&gt; и убедился в том, что у меня на видеокарте именно разъём S-Video, стандартный 4-контактный.&lt;br /&gt;&lt;br /&gt;Этот разъём может работать в двух режимах:&lt;br /&gt;&lt;br /&gt;1. Композитный - по одному проводу передаются все три сигнала Y (яркость), Cr или U (разница между яркостью и синим), и Cb или V (разница между яркостью и красным). Сигналы мультиплексирются видеокартой и демультиплексируются телевизором. Обеспечивает менее качественную картинку, поскольку не может устранить взаимовлияние сигналов яркости и цвета.&lt;br /&gt;&lt;br /&gt;2. S-Video - по одному проводу передаётся сигнал яркости Y, а по другому - мультиплексированный сигнал цвета Cr или U (разница между яркостью и синим), и Cb или V (разница между яркостью и красным). Обеспечивает более качественную картинку, поскольку исключается взаимовлияние сигнала яркости и сигнала цветности. Более подробно об этом написано в статье &lt;a href="http://www.stoik.ru/print.php?src=article&amp;id=2000_05_99_1&amp;cat_id=2&amp;subcat_id=1"&gt;Особенности преобразования сигналов VGA в TV&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Самым лучшим вариантом был бы компонентный сигнал, при котором каждый компонент передаётся по отдельному проводу. Но, к сожалению, мой разъём S-Video такого варианта обеспечить не может, его могут обеспечить 7-контактный или 9-контактный варианты разъёма S-Video. Подробнее об этом можно почитать, например, здесь: &lt;a href="http://www.hifinews.ru/advices/details/104.htm"&gt;Подключение компьютера к телевизору&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ещё можно было бы попробовать воспользоваться разъёмом DVI, имеющимся на видеокарте, но забегая вперёд скажу, что переходников DVI на 3 RCA я не нашёл ни в каком виде. Если найду - опробую этот вариант.&lt;br /&gt;&lt;br /&gt;Затем я обследовал телевизор. На телевизоре оказалось огромное количество разъёмов типа "Тюльпан", которые правильно называются RCA.&lt;br /&gt;&lt;br /&gt;Фото задней панели телевизора:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-UmoaW0KIEqk/Th1rtEpfwWI/AAAAAAAABDE/siP9lJ0EYy4/s1600/P7137054.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-UmoaW0KIEqk/Th1rtEpfwWI/AAAAAAAABDE/siP9lJ0EYy4/s320/P7137054.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5628773531369062754" /&gt;&lt;/a&gt;&lt;br /&gt;Разъёмы на задней панели выделены в 3 группы:&lt;br /&gt;1 группа. 5 разъёмов для подключения DVD-плеера с развёрткой на 480 строк:&lt;br /&gt;1) Y,&lt;br /&gt;2) U или Cr,&lt;br /&gt;3) V или Cb,&lt;br /&gt;4) левый аудио,&lt;br /&gt;5) правый аудио.&lt;br /&gt;&lt;br /&gt;2 группа. 3 разъёма для видеовхода:&lt;br /&gt;1) композитный,&lt;br /&gt;2) левый аудио,&lt;br /&gt;3) правый аудио.&lt;br /&gt;&lt;br /&gt;3 группа. 3 разъёма для видеовыхода:&lt;br /&gt;1) композитный,&lt;br /&gt;2) левый аудио,&lt;br /&gt;3) правый аудио.&lt;br /&gt;&lt;br /&gt;Фото передней панели телевизора:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-w0IoErX_9VY/Th1rjg7M-RI/AAAAAAAABC8/EeRELnoo2LY/s1600/P7137057.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-w0IoErX_9VY/Th1rjg7M-RI/AAAAAAAABC8/EeRELnoo2LY/s320/P7137057.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5628773367160830226" /&gt;&lt;/a&gt;&lt;br /&gt;Разъёмы на передней панели:&lt;br /&gt;4 группа:&lt;br /&gt;1) композитный,&lt;br /&gt;2) левый аудио,&lt;br /&gt;3) правый аудио.&lt;br /&gt;&lt;br /&gt;Соответственно, вариантов подключения у меня оказалось не много - либо к группе 2 на задней панели, либо к группе 4 на передней панели. При этом используется композитный видеосигнал и два аудиосигнала. Это вариант подключения, обеспечивающий самое низкое качество видеосигнала.&lt;br /&gt;&lt;br /&gt;Расстояние между телевизором и компьютером - примерно 2 метра. Итак, с кабелями я определился - мне нужны кабель S-Video-RCA и MiniJack-2RCA. Первая же попытка найти такие кабели в магазинах бытовой электроники окончилась неудачей - именно таких кабелей нигде не было. Вторая попытка оказалась успешной - я купил их в магазине, специализирующемся на продаже электронных компонентов. Были кабели длиной 1,5 метра и 3 метра, я взял трёхметровые.&lt;br /&gt;&lt;br /&gt;Теперь дело стало за настройкой. Для начала воспользовался вот этой заметкой &lt;a href="http://www.opennet.ru/opennews/art.shtml?num=6921"&gt;Подключение двух мониторов: Xinerama или TwinView?&lt;/a&gt;. Настроил Xinerama, т.к. мне показался этот способ более естественным для X-сервера.&lt;br /&gt;&lt;br /&gt;Получился вот такой файл конфигурации /etc/X11/xorg.conf:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Section "ServerLayout"&lt;br /&gt;    Identifier     "X.org Configured"&lt;br /&gt;    Screen         "Screen0" 0 0&lt;br /&gt;    Screen         "Screen1" RightOf "Screen0"&lt;br /&gt;    InputDevice    "Mouse0" "CorePointer"&lt;br /&gt;    InputDevice    "Keyboard0" "CoreKeyboard"&lt;br /&gt;    Option         "Xinerama" "On"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Files"&lt;br /&gt;    ModulePath      "/usr/lib/xorg/modules"&lt;br /&gt;    FontPath        "/usr/share/fonts/X11/misc"&lt;br /&gt;    FontPath        "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Module"&lt;br /&gt;    Load           "glx"&lt;br /&gt;    Load           "dbe"&lt;br /&gt;    Load           "record"&lt;br /&gt;    Load           "extmod"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "ServerFlags"&lt;br /&gt;    Option         "AutoAddDevices" "False"&lt;br /&gt;    Option         "AllowEmptyInput" "False"&lt;br /&gt;    Option         "DontZap" "True"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;    Identifier     "Keyboard0"&lt;br /&gt;    Driver         "kbd"&lt;br /&gt;    Option         "XkbRules" "xorg"&lt;br /&gt;    Option         "XkbModel" "pc104"&lt;br /&gt;    Option         "XkbLayout" "us,ru"&lt;br /&gt;    Option         "XkbOptions" "grp:alt_shift_toggle"&lt;br /&gt;    Option         "XkbVariant" ",winkeys"&lt;br /&gt;    Option         "AutoRepeat" "250 30"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;    Identifier     "Mouse0"&lt;br /&gt;    Driver         "mouse"&lt;br /&gt;    Option         "Protocol" "auto"&lt;br /&gt;    Option         "Device" "/dev/input/mice"&lt;br /&gt;    Option         "ZAxisMapping" "4 5 6 7"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;    Identifier     "Monitor0"&lt;br /&gt;    VendorName     "LG"&lt;br /&gt;    ModelName      "Flatron L1730S"&lt;br /&gt;    DisplaySize     338    270&lt;br /&gt;    HorizSync       30.0 - 80.2&lt;br /&gt;    VertRefresh     56.0 - 75.0&lt;br /&gt;    ModeLine       "1280x1024_75.00" 138.54 1280 1368 1504 1728 1024 1025 1028 1069 -hsync +vsync&lt;br /&gt;    ModeLine       "1024x768_75.00" 81.80 1024 1080 1192 1360 768 769 772 802 -hsync +vsync&lt;br /&gt;    ModeLine       "800x600_75.00" 48.91 800 840 920 1040 600 601 604 627 -hsync +vsync&lt;br /&gt;    ModeLine       "640x480_75.00" 30.72 640 664 728 816 480 481 484 502 -hsync +vsync&lt;br /&gt;    Option         "DPMS"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;    Identifier     "Monitor1"&lt;br /&gt;    VendorName     "LG"&lt;br /&gt;    ModelName      "Flatron RT-21FA32X"&lt;br /&gt;    DisplaySize    450 350&lt;br /&gt;    HorizSync      15.625 - 15.625&lt;br /&gt;    VertRefresh    50.0 - 50.0&lt;br /&gt;    Option         "DPMS"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;    Identifier     "Card0"&lt;br /&gt;    Driver         "nvidia"&lt;br /&gt;    VendorName     "nVidia Corporation"&lt;br /&gt;    BoardName      "NV43 [GeForce 6600]"&lt;br /&gt;    BusID          "5:0:0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;    Identifier     "Card1"&lt;br /&gt;    Driver         "nvidia"&lt;br /&gt;    VendorName     "nVidia Corporation"&lt;br /&gt;    BoardName      "NV43 [GeForce 6600]"&lt;br /&gt;    BusID          "5:0:0"&lt;br /&gt;    Screen         1&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;    Identifier     "Screen0"&lt;br /&gt;    Device         "Card0"&lt;br /&gt;    Monitor        "Monitor0"&lt;br /&gt;    DefaultDepth    24&lt;br /&gt;    SubSection     "Display"&lt;br /&gt;        Viewport    0 0&lt;br /&gt;        Depth       8&lt;br /&gt;        Modes      "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"&lt;br /&gt;    EndSubSection&lt;br /&gt;    SubSection     "Display"&lt;br /&gt;        Viewport    0 0&lt;br /&gt;        Depth       24&lt;br /&gt;        Modes      "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"&lt;br /&gt;    EndSubSection&lt;br /&gt;    SubSection     "Display"&lt;br /&gt;        Viewport    0 0&lt;br /&gt;        Depth       32&lt;br /&gt;        Modes      "1280x1024_75.00" "1024x768_75.00" "800x600_75.00" "640x480_75.00"&lt;br /&gt;    EndSubSection&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;    Identifier      "Screen1"&lt;br /&gt;    Device          "Card1"&lt;br /&gt;    Monitor         "Monitor1"&lt;br /&gt;    DefaultDepth    24&lt;br /&gt;    SubSection      "Display"&lt;br /&gt;        Depth           24&lt;br /&gt;        #Modes           "768x576"&lt;br /&gt;        Modes           "800x600"&lt;br /&gt;    EndSubSection&lt;br /&gt;EndSection&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Возможно, что некоторые настройки здесь избыточны и не необходимы для нормальной работы. Действительное разрешение S-Video 768x576 точек, поэтому я указал наиболее похожее из доступных - 800x600. Частоты вертикальной и горизонтальной развёртки для режима S-Video - 15,625 КГц и 50 Гц. Геометрические размеры растровой сетки телевизионного экрана - 450 на 350 мм (замерял линейкой). &lt;br /&gt;&lt;br /&gt;Настройки монитора перекочевали из предыдущей конфигурации, где они были заданы явно, поскольку видеокарта по протоколу EDID принимает от монитора несколько заниженные режимы.&lt;br /&gt;&lt;br /&gt;Действительные настройки видеокарты я смотрел с помощью программы nvidia-settings. Там можно найти доступные видеорежимы, посмотреть частоту вертикальной развёртки (действительная частота оказалась равной 60,32 Гц), можно отцентрировать картинку, задать её размеры на экране, настроить насыщенность цвета.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-VP3yi4_MgiI/Th2--_0yKsI/AAAAAAAABDU/amUMe9W9FIc/s1600/P7137074.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-VP3yi4_MgiI/Th2--_0yKsI/AAAAAAAABDU/amUMe9W9FIc/s320/P7137074.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5628865098776980162" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-6136422296614398216?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/6136422296614398216/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=6136422296614398216' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/6136422296614398216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/6136422296614398216'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/07/xinerama.html' title='Xinerama: монитор и телевизор'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-UmoaW0KIEqk/Th1rtEpfwWI/AAAAAAAABDE/siP9lJ0EYy4/s72-c/P7137054.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5531481942523699388</id><published>2011-04-22T13:56:00.003+06:00</published><updated>2011-04-22T14:43:25.377+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgrey'/><title type='text'>Базы данных postgrey</title><content type='html'>Сегодня я заинтересовался содержимым баз данных Postgrey. Как известно, база данных Postgrey находится в каталоге /var/lib/postgrey/ и имеет формат Berkeley DB.&lt;br /&gt;&lt;br /&gt;Собственно вся база находится в двух основных файлах: postgrey.db и postgrey_clients.db.&lt;br /&gt;&lt;br /&gt;Для их просмотра нам понадобится пакет db4.6-utils. Точную версию необходимого пакета можно выяснить, если изучить зависимости самого postgrey. У меня в дистрибутиве Debian Squeeze было три различных версии этого пакета, из которых подошла только версия 4.6.&lt;br /&gt;&lt;br /&gt;В файле postgrey.db находятся триплеты тестируемых отправителей.&lt;br /&gt;&lt;br /&gt;Просмотреть их можно следующей командой:&lt;br /&gt;&lt;pre&gt;db4.6_dump -p postgrey.db | less&lt;/pre&gt;&lt;br /&gt;Нашему взору предстанет таблица с записями двух видов:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; 95.111.111.9/uzowu@sender.hu/ufa03@receiver.ru&lt;br /&gt; 1303233971,1303234277&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;и&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; 95.138.211.0/vasiliy@sender.ru/sln@receiver.ru&lt;br /&gt; 1303295139,1303295139,90&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Это два способа записи одной и той же информации. Первый вид расшифровывается следующим образом:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; IP-адрес отправителя/почтовый адрес отправителя/почтовый адрес получателя&lt;br /&gt; отметка времени первой попытки отправки,отметка времени второй попытки отправки&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Второй вид, насколько я понял анализируя исходник postgrey, соответствует случаю если в PTR-записи IP-адреса отправителя найдено одно последнее число из IP-адреса или два последних числа IP-адреса. То есть соответствует случаю заведомо динамического IP-адреса отправителя. Очень редко в домен попадает последнее число IP-адреса или сразу два последних числа из IP-адреса - в основном это соответствует именно случаю динамического IP-адреса. В таком случае postgrey откусывает у IP-адреса последнее число, заменяя его на ноль. Само откушенное число добавляется в конец записи. Указанный выше случай соответствует IP-адресу 95.138.211.90. То есть во втором случае формат такой:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; IP-адрес отправителя с последним числом заменённым на 0/почтовый адрес отправителя/почтовый адрес получателя&lt;br /&gt; отметка времени первой попытки отправки,отметка времени второй попытки отправки, последнее число из IP-адреса&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Не совсем понимаю зачем это сделано, я с этим не разбирался. Скорее всего - для ускорения поиска динамических клиентов-отправителей. Такому клиенту скорее всего каждый раз будет выдаваться не сильно отличающийся от предыдущего IP-адрес, поэтому чтобы не множить триплеты и не заставлять такого клиента каждый раз пробиваться через процедуру проверки, повторные проверки выполняются только в случае отличия одного из первых трёх чисел IP-адреса. Но это - всего лишь мои догадки. Если вам интересно - изучайте исходники внимательнее.&lt;br /&gt;&lt;br /&gt;Второй файл postgrey_clients.db используется для автоматического помещения IP-адресов отправителей в белый список. Посмотреть его можно следующей командой:&lt;br /&gt;&lt;pre&gt;db4.6_dump -p postgrey_clients.db | less&lt;/pre&gt;&lt;br /&gt;Видим много записей следующего вида:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; 1.122.11.90&lt;br /&gt; 1,1303296308&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Что здесь что?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; IP-адрес отправителя&lt;br /&gt; количество удачных отправок,отметка времени последней отправки&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Опция --auto-whitelist-clients=10, заданная в настройках демона, указывает, после какого количества успешных отправок IP-адрес отправителя будет помещён в белый список. Эта база используется как раз для отслеживания клиентов, претендующих на помещение в белый список.&lt;br /&gt;&lt;br /&gt;Опция --max-age=30 действует на оба списка и говорит о том, что записи, время последней отправки которых старше 30 дней, будут удалены. Таким образом записей с последней попыткой отправки бывшей более 30 дней назад, в базе быть не должно.&lt;br /&gt;&lt;br /&gt;Для того, чтобы загнать отредактированную информацию обратно в базу данных, можно воспользоваться командой db4.6_load:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;db4.6_dump -p postgrey.db &gt; base&lt;br /&gt;vi base&lt;br /&gt;db4.6_load postgrey.db &lt; base&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Возможно перед загрузкой информации в базе данных придётся остановить postgrey. И не забудьте при экспериментах по редактированию делать резервные копии. Лучше - всего каталога после остановки postgrey.&lt;br /&gt;&lt;br /&gt;Как воспользоваться полученной информацией, я пока не придумал. Например, можно составить рейтинг отправителей по IP-адресам, а можно составить рейтинг пар отправитель/получатель. Можно добавлять записи вручную (только зачем?), а можно удалять записи. Если придумали что-нибудь интересное, отпишитесь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5531481942523699388?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5531481942523699388/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5531481942523699388' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5531481942523699388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5531481942523699388'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/04/postgrey.html' title='Базы данных postgrey'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8347683744258225955</id><published>2011-04-14T09:29:00.007+06:00</published><updated>2011-04-14T10:00:29.977+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Настройка автодополнения адреса в Firefox</title><content type='html'>Меня уже пару лет подбешивает автодополнение адреса в Firefox. Когда я ввожу адрес в адресную строку вручную, то я ввожу известный мне адрес сайта. Кроме адресов сайтов я туда больше никогда и ничего не ввожу. Но услужливый Firefox при вводе первой же буквы вываливает на меня чуть ли не всё содержимое адресной книги, журнала посещённых страниц, скопированных и вставленных откуда-нибудь ссылок и введённых в прошлом сайтов. Из всего этого хлама мне пригодился бы только последний пункт. Но я, будучи обладателем ангельского терпения и чудовищной лени, постоянно забивал на это всю эту пару лет.&lt;br /&gt;&lt;br /&gt;И вот, наконец-то, я решил уделить полчаса своего времени на поиск решения и на его описания на будущее, если оно мне вдруг снова потребуется.&lt;br /&gt;&lt;br /&gt;Итак, интересующие нас настройки находятся, понятное дело, на странице с адресом about:config. За настройки адресной строки отвечают параметры с именами, начинающимися с browser.urlbar. Из всех этих настроек мне нужны только две: &lt;a href="http://kb.mozillazine.org/Browser.urlbar.default.behavior"&gt;browser.urlbar.default.behavior&lt;/a&gt; и &lt;a href="http://kb.mozillazine.org/Browser.urlbar.matchBehavior"&gt;browser.urlbar.matchBehavior&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Параметр &lt;b&gt;browser.urlbar.default.behavior&lt;/b&gt; представляет собой шестибитное значение, каждый из битов которого указывает, по каким источникам осуществлять автодополнение. Значение этого параметра может быть представлено в виде суммы следующих чисел:&lt;br /&gt;&lt;br /&gt;1 Ограничить поиск только историей&lt;br /&gt;2 Ограничить поиск только закладками&lt;br /&gt;4 Ограничить поиск только метками&lt;br /&gt;8 Искать совпадения в названии страницы&lt;br /&gt;16 Искать совпадение в адресе страницы&lt;br /&gt;32 Искать совпадение только с ранее введёнными адресами&lt;br /&gt;&lt;br /&gt;Итак, моему желанию соответствует сумма 16 и 32, поэтому я задаю значение этого параметра равным 48.&lt;br /&gt;&lt;br /&gt;Параметр &lt;b&gt;browser.urlbar.matchBehavior&lt;/b&gt; может принимать одно из следующих значений:&lt;br /&gt;&lt;br /&gt;0 Искать где угодно в доступном тексте, не обращая внимания на границы слов.&lt;br /&gt;1 Искать в пределах слов перед тем, как искать во всём доступном тексте, не обращая внимания на границы слов. (По умолчанию)&lt;br /&gt;2 Искать только в пределах слов в автодополнении адресной строки.&lt;br /&gt;3 Подходят только начала адресов и названий страниц.&lt;br /&gt;&lt;br /&gt;Мне нравится значение 3.&lt;br /&gt;&lt;br /&gt;После этих настроек в строке адреса выпадают только те ресурсы, адреса которых начинаются с указанных букв.&lt;br /&gt;&lt;br /&gt;Всё описанное выше сработало для Firefox версии 3.6.16.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8347683744258225955?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8347683744258225955/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8347683744258225955' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8347683744258225955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8347683744258225955'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/04/firefox.html' title='Настройка автодополнения адреса в Firefox'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-521167186872417492</id><published>2011-03-25T16:25:00.005+05:00</published><updated>2011-03-25T17:09:37.353+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cisco'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='netflow'/><category scheme='http://www.blogger.com/atom/ns#' term='flow-tools'/><title type='text'>Настройка NetFlow сенсора на Cisco и коллектора на Debian</title><content type='html'>В прошлом году, в середине декабря, вышестоящее руководство по моему департаменту запросило суточную статистику в разрезе по IP-адресам по загрузке канала, соединяющего наш филиал с корпоративной сетью. Канал этот с нашей стороны заходит на один из портов маршуртизатора Cisco 2821. Недолго думая я решил прибегнуть к проверенному средству - NetFlow и пакету flow-tools. Может потом когда-нибудь пригодится мне или кому-нибудь ещё.&lt;br /&gt;&lt;br /&gt;Для начала настроим NetFlow-сенсор на маршрутизаторе:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ip flow-export version 5&lt;br /&gt;ip flow-export destination 192.168.0.1 9000&lt;br /&gt;ip flow-export source GigabitEthernet 0/0&lt;br /&gt;ip cef&lt;br /&gt;&lt;br /&gt;interface GigabitEthernet 0/1&lt;br /&gt; ip flow ingress&lt;br /&gt; ip flow egress&lt;br /&gt; ip route-cache flow&lt;br /&gt; no ip mroute-cache&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;192.168.0.1 - это адрес компьютера, на котором настроен коллектор,&lt;br /&gt;9000 - это UDP-порт на этом компьютере, куда будет сыпаться статистика,&lt;br /&gt;GigabitEthernet 0/0 - это интерфейс, с которого будет исходить поток статистики,&lt;br /&gt;GigabitEthernet 0/0 - это интерфейс, статистика трафика которого будет сниматься.&lt;br /&gt;&lt;br /&gt;Теперь пришёл черёд NetFlow-коллектора. Поставим пакет flow-tools:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# apt-get install flow-tools&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И зададим настройки коллектора в файле /etc/flow-tools/flow-capture.conf:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-w /var/flow/cisco2821 -n 24 -N 3 192.168.0.1/192.168.0.2/9000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;/var/flow/cisco2821 - каталог с отловленными файлами потоков,&lt;br /&gt;192.168.0.1 - адрес компьютера, а точнее - того интерфейса, на который льётся поток,&lt;br /&gt;192.168.0.2 - адрес маршуртизатора Cisco 2821, с которого будет идти поток,&lt;br /&gt;9000 - UDP-порт компьютера, на который будет сваливаться поток,&lt;br /&gt;24 - количество ротаций журналов с потоком в сутки (по какой-то непонятной причине количество ротаций и момент их срабатывания всё-же не поддаются точному расчёту, поэтому это лишь приблизительная настройка),&lt;br /&gt;3 - расфасовка файлов по подкаталогам вида YYYY/YYYY-MM/YYYY-MM-DD/&lt;br /&gt;&lt;br /&gt;Обязательно нужно создать каталог для файлов /var/flow/cisco2821/:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# mkdir -p /var/flow/cisco2821/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И можно запускать коллектор:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# /etc/init.d/flow-capture start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;С помощью следующей команды нужно убедиться, что коллектор запустился и приступил к работе:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# netstat -4nlp | grep 9000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Нужно также не забыть проковырять дырочку в пакетном фильтре, чтобы он не отбрасывал пакеты (это вы сделайте сами).&lt;br /&gt;&lt;br /&gt;Пока статистика собирается, можно заняться фильтрами. Например, можно создать фильтр, отбирающий статистику только за рабочее время (хотя была запрошена в первую очередь суточная статистика). Например, в файл /etc/flow-tools/cfg/filter.cfg пропишем вот такие правила:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;filter-primitive work-time-start&lt;br /&gt; type time&lt;br /&gt; permit gt 9:00&lt;br /&gt;&lt;br /&gt;filter-primitive work-time-end&lt;br /&gt; type time&lt;br /&gt; permit lt 18:00&lt;br /&gt;&lt;br /&gt;filter-definition work-time&lt;br /&gt; match start-time work-time-start&lt;br /&gt; match end-time work-time-end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь этот фильтр можно использовать в команде flow-nfilter, которую можно включить в конвейер:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cd /var/flow/cisco2821/2010/2010-12/2010-12-16/&lt;br /&gt;$ flow-cat ft-v05.2010-12-16.1* \&lt;br /&gt; | flow-nfilter -f /etc/flow-tools/cfg/filter.cfg -Fwork-time \&lt;br /&gt; | flow-stat -f10 &gt; stat.txt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;flow-cat объединяет отобранные файлы за сутки 2010-12-16,&lt;br /&gt;flow-filter отбирает из объединённого потока ту информацию, которая соответствует правилу work-time,&lt;br /&gt;flow-stat с опцией -f10 создаёт отчёт из пяти колонок: IP-адрес отправителя, IP-адрес получателя, количество соединений (уникальных триплетов протокол/порт-отправителя/порт-получателя), количество байт, количество пакетов.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-521167186872417492?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/521167186872417492/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=521167186872417492' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/521167186872417492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/521167186872417492'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/03/netflow-cisco-debian.html' title='Настройка NetFlow сенсора на Cisco и коллектора на Debian'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-4414786732100053491</id><published>2011-03-25T12:25:00.007+05:00</published><updated>2011-03-25T14:47:14.297+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tynef smtpd'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='postfix'/><title type='text'>Декодирование писем в формате TNEF в Postfix</title><content type='html'>Вчера столкнулся с интересной проблемой, корень которой в очередной раз нашёлся в Microsoft. Один из сотрудников пожаловался, что некоторые письма к нему приходят без вложений. Я попытался разобраться в ситуации и выяснил, что письма в почтовом клиенте имеют точно такой же размер, какой они имеют, когда их принимает Postfix. Стало быть почтовый сервер, почтовый клиент, антивирус на сервере и на компьютере почтового клиента никаких изменений в письма не вносят.&lt;br /&gt;&lt;br /&gt;Потом я обратил внимание на размер письма (несколько сотен килобайт) и на отображаемый в клиенте текст. Письмо было явно слишком большим для такого небольшого объёма информации. Я заглянул в исходный текст письма и обнаружил, что в нём имеется вложение с именем файла "winmail.dat" и MIME-типом "application/ms-tnef".&lt;br /&gt;&lt;br /&gt;Я заинтересовался, а что же это вообще такое и обнаружил, что это изобретённый Microsoft новый формат для писем, а понимают его только почтовые клиенты Outlook и те клиенты, разработчики которых специально озаботились этой проблемой. Письмо открывалось с помощью изделия той же фирмы Microsoft - Outlook Express, но изделие молча игнорировало попытки старшего брата донести до него информацию.&lt;br /&gt;&lt;br /&gt;Первым делом я нашёл рецепт отключения этой фичи в Outlook отправителя  &lt;br /&gt;&lt;a href="http://www.mail.ru/pages/help/181.html"&gt;Файлы winmail.dat в письмах&lt;/a&gt; и отправил эту ссылку отправителю.&lt;br /&gt;&lt;br /&gt;Предвидя возможные повторы этой проблемы и необходимость снова и снова отправлять эту ссылку разным людям, я поискал, а нельзя ли этот TNEF преобразовывать прямо на сервере? Нашёл следующую заметку &lt;a href="http://www.mahno.su/freebsd/mail/postfix-ytnef-filter"&gt;Postfix + ytnef filter&lt;/a&gt;, которая, к слову, была написана всего полтора месяца назад. Так что если бы я столкнулся с проблемой раньше, возможно мне так и пришлось бы отправлять людям ссылку.&lt;br /&gt;&lt;br /&gt;Там описывается настройка прокси-конвертера ytnef smtpd для FreeBSD. Поскольку у меня сервер работает под Debian Lenny, я решил выложить тут адаптированный вариант, а иначе просто ограничился бы ссылкой.&lt;br /&gt;&lt;br /&gt;Итак, перво-наперво, ставим сам конвертер ytnef и python:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# aptitude install --with-recommends ytnef&lt;br /&gt;# aptitude install python&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Качаем архив со скриптом по ссылке и распаковываем его:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ wget &lt;a href="http://www.viraj.org/ytnef_smtpd/ytnef_smtpd-1.1.tar.gz"&gt;http://www.viraj.org/ytnef_smtpd/ytnef_smtpd-1.1.tar.gz&lt;/a&gt;&lt;br /&gt;$ tar xzvf ytnef_smtpd-1.1.tar.gz&lt;br /&gt;$ cd ytnef_smtpd-1.1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Копируем скрипт туда, где ему положено лежать:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# cp ytnef_smtpd.py /usr/local/bin/&lt;br /&gt;# chmod +x /usr/local/bin/ytnef_smtpd.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И меняем настройки скрипта, которые находятся в нём самом-же. У меня в Postfix уже есть два прокси, первый сканирует письма на предмет наличия вирусов, а второй проставляет оценки уровня спама. Наша задача - встроить новый прокси в начало цепочки, чтобы сначала письмо преобразовывалось, а затем уже проверялось и оценивалось.&lt;br /&gt;&lt;br /&gt;Приведу лишь изменённые строки:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;LISTEN_PORT = 10028&lt;br /&gt;REMOTE_PORT = 10026&lt;br /&gt;YTNEF_BIN = '/usr/bin/ytnef'&lt;br /&gt;FILE_BIN = '/usr/bin/file'&lt;br /&gt;LOG_FILE = '/var/log/ytnef_smtpd.log'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Скрипт будет ожидать подключений к порту 10028, а преобразованное письмо будет отправлять на порт 10026, где его будет ловить уже антивирус.&lt;br /&gt;&lt;br /&gt;Теперь создадим скрипт автозапуска /etc/init.d/ytnef_smtpd.sh (он немного отличается от оригинала):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;        if [ -f /var/run/ytnef_smtpd.pid ]&lt;br /&gt;        then&lt;br /&gt;                echo "Script already launched. PID: "\&lt;br /&gt;                        `cat /var/run/ytnef_smtpd.pid`&lt;br /&gt;        else&lt;br /&gt;                echo "Starting ytnef smtpd..."&lt;br /&gt;                /usr/local/bin/ytnef_smtpd.py &amp;&lt;br /&gt;                echo $! &gt; /var/run/ytnef_smtpd.pid&lt;br /&gt;                echo "...Done!"&lt;br /&gt;        fi&lt;br /&gt;        ;;&lt;br /&gt;stop)&lt;br /&gt;        if [ -f /var/run/ytnef_smtpd.pid ]&lt;br /&gt;        then&lt;br /&gt;                echo "Shutting down ytnef smtpd..."&lt;br /&gt;                kill -TERM `cat /var/run/ytnef_smtpd.pid` &amp;&amp; \&lt;br /&gt;                        rm -f /var/run/ytnef_smtpd.pid &amp;&amp; echo "...Done!"&lt;br /&gt;        else&lt;br /&gt;                echo "ytnef smtpd not launched."&lt;br /&gt;        fi&lt;br /&gt;        ;;&lt;br /&gt;*)&lt;br /&gt;        echo "Use start script for: { start | stop }" &gt;&amp;2&lt;br /&gt;        exit 1&lt;br /&gt;        ;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пропишем его автозапуск и запустим:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# chmod +x /etc/init.d/ytnef_smtpd.sh&lt;br /&gt;# update-rc.d ytnef_smtpd.sh defaults&lt;br /&gt;# /etc/init.d/ytnef_smtpd.sh start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь скрипт должен прослушивать порт 10028, это можно проверить следующей командой:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# netstat -nlp4 | grep 10028&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Если это так, значит пока что всё идёт нормально.&lt;br /&gt;&lt;br /&gt;Теперь нужно перенастроить Postfix, так чтобы он перенаправлял только что полученные письма на обработку ytnef smtpd.&lt;br /&gt;&lt;br /&gt;В файле /etc/postfix/main.cf прописываем порт первого прокси в цепочке (в нашем случае это порт ytnef smtpd - 10028):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;content_filter = scan:127.0.0.1:10028&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И если до этого у вас не было прокси, добавляем в файл /etc/postfix/master.cf следующие строчки (обратите внимание на пробелы в начале всех строк, кроме первой):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;127.0.0.1:10025 inet n - n - 16 smtpd&lt;br /&gt; -o content_filter=&lt;br /&gt; -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks&lt;br /&gt; -o smtpd_helo_restrictions=&lt;br /&gt; -o smtpd_client_restrictions=&lt;br /&gt; -o smtpd_sender_restrictions=&lt;br /&gt; -o smtpd_recipient_restrictions=permit_mynetworks,reject&lt;br /&gt; -o mynetworks_style=host&lt;br /&gt; -o smtpd_authorized_xforward_hosts=127.0.0.0/8&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Эти строчки настроят ещё один smtp-сервер, который будет принимать письма на порту 10025 только от локальных программ, но при этом не будет отправлять письма на дальнейшую проверку. Именно этот порт необходимо указать в настройке "REMOTE_PORT", если у вас больше нет никаких прокси в цепочке.&lt;br /&gt;&lt;br /&gt;Осталось перезапустить postfix и всё должно заработать:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# /etc/init.d/postfix restart&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Я специально ради этого устанавливал себе на компьютер Outlook, отправил из него письмо в формате tnef и принял в Outlook Express. Письмо прочиталось вместе с вложениями.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-4414786732100053491?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/4414786732100053491/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=4414786732100053491' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4414786732100053491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4414786732100053491'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/03/tnef-postfix.html' title='Декодирование писем в формате TNEF в Postfix'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5480411235089491950</id><published>2011-03-25T12:17:00.004+05:00</published><updated>2011-03-30T16:18:07.107+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='перевод'/><title type='text'>Что случится, когда компьютеры перестанут уменьшаться?</title><content type='html'>Перевод статьи: &lt;a href="http://www.salon.com/life/feature/2011/03/19/moores_law_ends_excerpt/index.html"&gt;What happens when computers stop shrinking?&lt;/a&gt;&lt;br /&gt;Переводчики: Владимир Ступин, Егор Калиничев.&lt;br /&gt;Пепеведено на сайте коллективных переводов &lt;a href="http://translated.by"&gt;translated.by&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;19 марта 2011, Мичио Каку (Michio Kaku)&lt;br /&gt;&lt;br /&gt;Примерно в 2020, эпоха уменьшающихся интегральных схем подойдёт к концу -- и нам лучше подготовиться к этому&lt;br /&gt;&lt;br /&gt;Эта статья является сокращённым изложением из новой книги Мичио Каку, "Физика будущего."&lt;br /&gt;&lt;br /&gt;Я отлично помню, как я сидел в офисе Марка Вейсера в Кремниевой Долине почти двадцать лет назад, когда он объяснял мне его видение будущего. Жестикулируя руками, он азартно объяснял мне, что должна была произойти новая революция, которая изменит мир. Вейсер был членом компьютерной элиты, работавшей в исследовательском центре Xerox в Пало Альто (том самом, где были созданы первый персональный компьютер, лазерный принтер и оконная среда с графическим интерфейсом пользователя), но он был бунтарём, протестовавшим против значков, что противоречило общепринятому соглашению, а также он был членом неистовой рок-группы.&lt;br /&gt;&lt;br /&gt;В то время (кажется, будто это было в прошлой жизни) персональные компьютеры были новы и только-только начинали проникать в жизнь людей, поскольку они медленно приходили к мысли о покупке огромных, неуклюжих настольных компьютеров для анализа таблиц и простой обработки текстов. Интернет всё ещё был огромной изолированной провинцией учёных вроде меня, записывающих формулы для приятелей-учёных на мистическом языке.&lt;br /&gt;&lt;br /&gt;Тогда шли жаркие дебаты о том, что этот настольный ящик может обесчеловечить цивилизацию, сделать её холодной, бесчувственной. Даже политолог Уильям Ф. Бакли принялся защищать текстовые процессоры от интеллектуалов, которые их избегали и отказывались прикасаться к компьютеру, называя его инструментом обывателей.&lt;br /&gt;&lt;br /&gt;Это была эпоха споров, для которой Вейсер придумал выражение "вездесущих компьютеров." Заглядывая в далёкое прошлое персонального компьютера, он предсказал, что микросхемы однажды станут настолько дешёвыми и доступными, что они проникнут во всю окружающую обстановку -- в нашу одежду, мебель, стены, в наши тела. И они все будут подключены к Интернет, предоставляя доступ к данным друг друга, делая нашу жизнь более приятной, отражая все наши желания. Куда бы мы ни направились, микросхемы будут незаметно выполнять наши желания. Среда станет живой.&lt;br /&gt;&lt;br /&gt;По тем временам, мечты Вейсера были нелепыми, абсурдными. Большинство персональных компьютеров были всё ещё дорогими и не были подключены к Интернет. Идея, что эти миллиарды крохотных микросхем однажды станут так же дёшевы как проточная вода, считалась безумием.&lt;br /&gt;&lt;br /&gt;И тогда я спросил его, почему он настолько уверен в этой революции. Он спокойно ответил, что мощность компьютеров растёт экспоненциально, а конца этому пока не видать. В математическом плане. Только это тогда имело значение. (К сожалению, Вейсер не прожил достаточно долго, чтобы увидеть что его революция произошла, он умер от рака в 1999.)&lt;br /&gt;&lt;br /&gt;Основополагающим источником пророческой мечты Вейсера было нечто называемое законом Мура, эмпирическое правило, которое двигало компьютерную промышленность в течение пятидесяти, а то и больше, лет. Оно задавало темп современной цивилизации как часовой механизм. Закон Мура просто говорил, что мощность компьютеров удваивается каждые восемнадцать месяцев. В соответствии с ним, каждый Новый год вы получаете новые компьютерные игры как минимум в два раза мощнее (в терминах количества транзисторов), чем в прошлом году. Кроме того, по прошествии лет, эта увеличивающаяся шкала превратилась в колоссальную. Например, когда вы получаете по почте поздравительную открытку, она часто снабжена микросхемой, которая поёт вам поздравительную песню. Удивительно, что эта микросхема обладает большей вычислительной мощностью, чем все Союзные войска в 1945. Гитлер, Черчиль или Рузвельт могли бы убить ради этой микросхемы. Но что мы с ней делаем? После праздника мы выбрасываем открытку вместе с микросхемой. Сегодня ваш мобильный телефон обладает большей вычислительной мощностью, чем всё оборудование NASA, которое позволило им в 1969 высадить двоих астронавтов на луне. Видеоигры, требующие чудовищной вычислительной мощности для моделирования трёхмерных сцен, используют больше вычислительной мощности, чем мэйнфреймы предыдущего десятилетия. Сегодня Sony PlayStation, которая стоит $300, обладает мощностью военного суперкомпьютера 1997, который стоил миллионы долларов.&lt;br /&gt;&lt;br /&gt;Итак, прежняя концепция (одна микросхема внутри настольного компьютера или ноутбука, подключенного к компьютеру) была вытеснена новой (сотни микросхем, рассеянных внутри каждой вещи, такой как мебель, техника, картины, стены, автомобили, одежда, всё общается друг с другом и подключено к Интернет).&lt;br /&gt;&lt;br /&gt;Если эти микросхемы будут встроены в технику, она чудесным образом преобразится. Если микросхемы встроить в печатные машинки, они становятся текстовыми процессорами. Если вставить их в телефоны, они становятся мобильными телефонами. Если их встроить в камеры, они становятся цифровыми камерами. Автоматы для игры в пинбол становятся видеоиграми. Аудиопроигрыватели становятся iPod'ами. Самолёты становятся смертельными беспилотниками Predator. После каждого революционного преобразования промышленность перерождается. Со временем, практически всё вокруг станет умным. Микросхемы станут настолько дешёвыми, что они станут стоить меньше пластиковой упаковки и смогут заменить штрих-код. Компании, не сделавшие свою продукцию умной могут оказаться выброшенными за борт конкурентами, которые сделают.&lt;br /&gt;&lt;br /&gt;Конечно, мы по-прежнему будем окружены мониторами компьютеров, но они примут вид обоев, фоторамок или семейных фотографий, а не компьютеров. Представьте все картины и фотографии, украшающие ваш сегодняшний дом; теперь представьте, что каждая из них стала анимированной, движущейся и подключенной к Интернет. Когда мы выйдем наружу, мы сможем увидеть движущиеся картинки, поскольку они будут стоить так же мало, как и неподвижные.&lt;br /&gt;&lt;br /&gt;Предназначение компьютеров -- как и других массовых технологий вроде электричества, бумаги и водопровода -- стать незаметными, так чтобы раствориться в структуре нашей жизни, быть повсюду и постоянно, тихо и незаметно выполняя наши желания.&lt;br /&gt;&lt;br /&gt;Сегодня входя в комнату мы не задумываясь начинаем искать выключатель для света, поскольку подразумевается, что в стенах проложена электропроводка. В будущем первой вещью, которую мы будем искать при входе в комнату - это окно в Интернет, потому что мы будем подразумевать, что комната умная. Как однажды сказал писатель-романист Макс Фрищ, "Технология - это привычка упорядочивать мир, который мы не можем прочувствовать."&lt;br /&gt;&lt;br /&gt;Нам хочется спросить: до каких пор будет продолжаться эта компьютерная революция? Если закон Мура будет действовать следующие пятьдесят лет, вполне возможно, что компьютеры смогут скоро превзойти вычислительную мощность человеческого мозга. К середине века возникнет новая закономерность. Как однажды сказал Джордж Харрисон, "Всё когда-нибудь проходит". Закон Мура тоже должен закончиться, а с ним и значительный рост вычислительной мощности, который подпитывал рост экономики последние полвека.&lt;br /&gt;&lt;br /&gt;Сейчас мы принимаем это как должное, веря что нам от рождения дано право обладать компьютерной продукцией с постоянно растущей мощностью и сложностью. Вот почему мы покупаем новую компьютерную продукцию каждый год, зная что она становится почти вдвое мощнее прошлогодних моделей. Но если закон Мура перестанет действовать -- и каждое новое поколение компьютерной продукции будет обладать почти такой же мощностью и скоростью, что и предыдущее поколение -- зачем беспокоиться о покупке новых компьютеров?&lt;br /&gt;&lt;br /&gt;Поскольку микросхемы используются в самой разной продукции, это окажет разрушительное воздействие на всю экономику. Все промышленные мощности остановятся, миллионы могут потерять работу, а экономика может быть дестабилизирована.&lt;br /&gt;&lt;br /&gt;Много лет назад, когда мы, физики, указывали на неизбежность краха закона Мура, промышленность обычно лишь иронизировала над нашими предупреждениями, относясь к нам, как к волкам, воющим на луну. Конец закона Мура предрекался неоднократно, но они просто не могли в это поверить.&lt;br /&gt;&lt;br /&gt;Но не теперь.&lt;br /&gt;&lt;br /&gt;Два года назад, я был ключевым докладчиком на конференции Microsoft в их штаб-квартире в Сиэтле, штат Вашингтон. Три сотни ведущих инженеров Microsoft присутствовали на этой встрече, ожидая услышать мою речь о будущем компьютеров и телекоммуникаций. Возвышаясь над огромной толпой, я мог видеть лица молодых, полных энтузиазма инженеров, которые создавали программы для настольных компьютеров и ноутбуков. Я резко высказался о законе Мура, и сказал что промышленность должна готовиться к грядущему кризису. Десятилетие назад я мог вызвать громкий смех или сдавленное хихиканье. Но в этот раз я видел только согласные кивки головами.&lt;br /&gt;&lt;br /&gt;Коллапс закона Мура будет иметь международное значение, сопряжённое со ставками в миллиарды долларов. Но определённо, как он закончится и что его заменит, зависит от законов физики. Ответ на вопросы физики станет краеугольным камнем экономической структуры капитализма.&lt;br /&gt;&lt;br /&gt;Чтобы понять сложившуюся ситуацию, важно понимать, что выдающийся успех компьютерной революции основывается на нескольких физических принципах. Первое, компьютер обладает умопомрачительной скоростью, поскольку электрические сигналы распространяются со скоростью близкой к скорости света, которая является максимальной скоростью во вселенной. За одну секунду луч света может совершить путешествие вокруг земли семь раз или достичь луны. Электроны также легко перемещаются и слабо связаны с атомом (и их можно соскрести при расчёсывании волос, при ходьбе по ковру или при надевании одежды -- это причина, по которой вещи липнут). Сочетание слабой привязанности электронов и их огромной скорости позволяет нам отправлять электрические сигналы в невероятном темпе, что привело к революции электричества в прошлом веке.&lt;br /&gt;&lt;br /&gt;Второе, в сущности не существует предела объёма совокупной информации, которую можно поместить на лазерный луч. Световые колебания, поскольку они колеблются гораздо быстрее звуковых колебаний, могут нести значительно больше информации, нежели звук. (Например, представьте длинный кусок натянутой верёвки а затем быстро потрясите один из концов. Чем быстрее вы трясёте один конец, тем больше сигналов вы можете отправить вдоль верёвки. Следовательно, совокупность информации, которую вы втисните в волну растёт с увеличением скорости, с которой вы трясёте верёвку, то есть с увеличением частоты колебаний.) Свет - это волна, колеблющаяся с частотой порядка 10^14 циклов в секунду (это 1 с 14 нулями). Чтобы передать один бит информации (1 или 0), требуется множество циклов. Это означает, что оптоволоконный кабель может нести примерно 10^11 бит информации на одной частоте. И это число можно увеличить, если пустить по одному оптическому волокну несколько сигналов, а затем связать несколько волокон в одном кабеле. Это означает, что увеличив количество каналов в кабеле, а затем увеличив количество кабелей, можно передавать информацию практически с неограниченной скоростью.&lt;br /&gt;&lt;br /&gt;Третье и наиболее важное, компьютерная революция проистекала из уменьшения размеров транзисторов. Транзистор - это заслонка, или переключатель, управляющий потоком электричества. Если электрическую схему сравнить с гидравлической, тогда транзистор будет аналогом вентиля, контролирующего поток жидкости. Как простой поворот вентиля может управлять огромным объёмом воды, так и транзистор позволяет небольшому потоку электричества управлять гораздо более объёмным потоком, усиливая его мощность.&lt;br /&gt;&lt;br /&gt;В сердце этой революции находится компьютерная микросхема, которая может содержать сотни миллионов транзисторов на кремниевой подложке размером с ноготь вашего пальца. Внутри вашего ноутбука имеется микросхема, транзисторы на которой можно увидеть только через микроскоп. Это исключительно крохотные транзисторы, созданные тем же образом, каким создаются надписи на футболках.&lt;br /&gt;&lt;br /&gt;Проектирование надписи для массовой футболки начинается с создания трафарета с очертаниями образца того, что вы хотите создать. Затем трафарет помещается над одеждой и используется окраска спреем. Только там, где были прорези, краска попадёт на одежду. Когда трафарет удалён, получается совершенная копия шаблона на футболке.&lt;br /&gt;&lt;br /&gt;Точно так же создается трафарет, содержащий сложные очертания миллионов транзисторов. Он помещается на пластину, содержащую множество слоёв чувствительного к свету кремния. Потом трафарет подвергается облучению ультрафиолетом, который проникает сквозь прорези в трафарете и засвечивает кремниевую пластину.&lt;br /&gt;&lt;br /&gt;После этого пластина погружается в кислоту, которая вытравливает очертания схем и создаёт сложный дизайн миллионов транзисторов. Так как пластина состоит из множества проводящих и полупроводниковых слоёв, кислота может вырезать куски различной формы и глубины, позволяя создавать неимоверно сложные схемы.&lt;br /&gt;&lt;br /&gt;Причина неуклонного увеличения мощности микросхем по закону Мура состоит в том, что ультрафиолетовое излучение позволяет уменьшать и уменьшать длину волны, делая возможным вытравливание все более мелких транзисторов на кремниевых пластинах. Поскольку ультрафиолетовое излучение имеет длину волны в 10 нанометров (нанометр это одна миллиардная доля метра), самый маленький транзистор, который вы можете вытравить, имеет размер около 30 атомов в ширину.&lt;br /&gt;&lt;br /&gt;Но этот процесс не может продолжаться вечно. В какой-то момент станет физически невозможно вытравливать транзисторы, сравнимые с размером атома. Вы даже можете примерно подсчитать, когда закон Мура окончательно перестанет действовать: когда размер транзистора будет равен размеру отдельного атома.&lt;br /&gt;&lt;br /&gt;Около 2020 года или чуть позднее, закон Мура окончательно перестанет соответствовать действительности, и Кремниевая Долина может медленно превратиться в Ржавый Пояс*, если не найдёт замену этой технологии. Транзисторы станут так малы, что квантовая механика и ядерная физика будут действовать на них, и электроны будут утекать из проводов. Например, самый тонкий слой внутри вашего компьютера будет около пяти атомов шириной. На этом уровне, согласно законам физики, вступает в свои права квантовая механика. Принцип неопределённости Гейзенберга утверждает, что вы не можете одновременно знать положение и скорость некоторой частицы. Это может звучать нелогично, но на уровне атомов вы просто не можете знать, где находится электрон, так что он никогда не может быть заперт в ультратонком слое или проводе и обязательно утечет наружу, вызывая короткое замыкание. Согласно законам физики, в конечном итоге Эпоха Кремния подойдёт к концу, и мы вступим в Пост-Кремниевую Эру.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;*) Ржавый Пояс - северо-восточная и средне-западная часть США, характеризующиеся устаревающей промышленностью, старыми заводами и снижением населения. Центром её являются города по производству стали в Пенсильвании и Огайо. (прим. перев.)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Выдержки из "Физика Будущего", Мичио Каку. (c) 2011 Мичио Каку. Взято с разрешения Doubleday, подразделения Random House, Inc. Все права защищены. Никакая часть из этих выдержек не может быть воспроизведена или напечатана без письменного разрешения издателя.&lt;br /&gt;&lt;br /&gt;Мичио Каку - профессор физики в CUNY Graduate Center, со-основатель полевой теории струн и автор нескольких научных работ. Его новая книга - "Физика Будущего."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5480411235089491950?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5480411235089491950/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5480411235089491950' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5480411235089491950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5480411235089491950'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/03/blog-post.html' title='Что случится, когда компьютеры перестанут уменьшаться?'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-3839759282249525778</id><published>2011-02-18T19:39:00.004+05:00</published><updated>2011-02-21T09:48:20.100+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><title type='text'>Сайт в отрубе</title><content type='html'>&lt;iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/XP34FHKleiY" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Иногда админов считают бездельниками и раздолбаями. Кто в этом ролике настоящий бездельник и раздолбай - поймут скорее всего только админы. Может быть вы считаете, что бездельник - это тот, кто играет в компьютерные игры в рабочее время? Я считаю, что бездельник - это тот, кто за 8-9 лет не навёл порядок на рабочем столе, не видит разницы в том, какой именно сайт не открывается, играет на работе в пасьянсы, посещает сайты типа "секс с овощами" и подключается к Интернету через модем, только потому что у него там 4000 бесплатных часов, игнорируя Интернет по оптоволокну, за который компания платит штуки баксов. Один такой чудак может напрячь десяток человек и привести к перерыву в работе нескольких серверов.&lt;br /&gt;&lt;br /&gt;P.S. Хотя админ тоже заигрался. Он должен был насторожиться уже в тот момент, когда увидел, что с сайтом всё в порядке, подключиться к компу этого Чипа и попросить его показать что именно не работает.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-3839759282249525778?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/3839759282249525778/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=3839759282249525778' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3839759282249525778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3839759282249525778'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/02/blog-post.html' title='Сайт в отрубе'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/XP34FHKleiY/default.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-7512126639153644890</id><published>2011-02-18T15:12:00.004+05:00</published><updated>2011-02-18T18:01:43.071+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='переводы'/><title type='text'>Новости проекта manpages.ylsoftware.com</title><content type='html'>Некоторое время назад проект завершил очередной этап своего развития: все переводы страниц руководства, сделанные в рамках проекта, были сконвертированы в проекты для программы po4a. Одним из важнейших следующих этапов было предоставить посетителям веб-сайта просматривать переводы страниц руководства прямо на сайте, причём содержимое сайта должно обновляться автоматически с изменением перевода.&lt;br /&gt;&lt;br /&gt;Лучшей программой, которая бы позволила это сделать, оказалась программа &lt;a href="http://www.squarebox.co.uk/users/rolf/download/manServer.shtml"&gt;manServer&lt;/a&gt;, написанная на Perl. На хостинге возникли некоторые сложности с Perl, суть которых я опущу.&lt;br /&gt;&lt;br /&gt;Таким образом, очередной этап развития сайта оказался трудновыполнимым. Я надолго потерял к сайту интерес. Но на днях я попробовал извернуться и не запускать скрипт прямо на хостинге, а запустил его на своём компьютере. Дальше с помощью wget, find и sed, tidy всё активное содержимое, доступное через скрипт, зеркалировалось в виде статических HTML-файлов. Дополнительно, я отказался от DokuWiki, поскольку необходимость в нём давно отпала. Ранее DokuWiki нужна была для выкладывания переводов, но затем переводы стали выполняться в программе po4a и выкладывать их на сайте стало не нужным. Поэтому сконвертировал все информационные страницы сайта в обычные HTML-страницы и получил новый сайт, выполненный полностью в виде статических HTML-страниц.&lt;br /&gt;&lt;br /&gt;Заходите посмотреть на обновлённый сайт: &lt;a href="http://manpages.ylsoftware.com"&gt;http://manpages.ylsoftware.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-7512126639153644890?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/7512126639153644890/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=7512126639153644890' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/7512126639153644890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/7512126639153644890'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2011/02/manpagesylsoftwarecom.html' title='Новости проекта manpages.ylsoftware.com'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5897246422453590250</id><published>2010-11-02T23:22:00.007+05:00</published><updated>2010-11-03T12:50:53.839+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xdm'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Настройка xdm</title><content type='html'>После перехода с Lenny на Squeeze начал пользоваться xdm. Сегодня дошли руки до настройки более приятного вида этого дисплейного менеджера.&lt;br /&gt;&lt;br /&gt;В файл /etc/X11/xdm/Xresources я добавил следующие строчки:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;xlogin.Login.x:                 320&lt;br /&gt;xlogin.Login.y:                 352&lt;br /&gt;xlogin.Login.width:             640&lt;br /&gt;xlogin.Login.height:            320&lt;br /&gt;xlogin.Login.foreground:        black&lt;br /&gt;xlogin.Login.face:              Liberation Sans-18&lt;br /&gt;xlogin.Login.greeting:          Welcome to CLIENTHOST&lt;br /&gt;xlogin.Login.greetFace:         Liberation Sans-24&lt;br /&gt;xlogin.Login.greetColor:        darkred&lt;br /&gt;xlogin.Login.namePrompt:        Login:    &lt;br /&gt;xlogin.Login.passwdPrompt:      Password: &lt;br /&gt;xlogin.Login.promptFace:        Liberation Sans-18:bold&lt;br /&gt;xlogin.Login.promptColor:       black&lt;br /&gt;xlogin.Login.fail:              Login incorrect&lt;br /&gt;xlogin.Login.failFace:          Liberation Sans-18&lt;br /&gt;xlogin.Login.failColor:         red&lt;br /&gt;xlogin.Login.failTimeout:       5&lt;br /&gt;xlogin.Login.hiColor:           black&lt;br /&gt;xlogin.Login.shdColor:          black&lt;br /&gt;xlogin.Login.frameWidth:        3&lt;br /&gt;xlogin.Login.innerFrameWidth:   3&lt;br /&gt;xlogin.Login.sepWidth:          1&lt;br /&gt;xlogin.Login.logoFileName:      /usr/share/X11/xdm/pixmaps/debian.xpm&lt;br /&gt;xlogin.Login.logoPadding:       10&lt;br /&gt;xlogin.Login.useShape:          true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В файл /etc/X11/xdm/Xsetup поместил следующую строчку:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;xsetroot -solid grey&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Если кому интересно, как запустить два X-сервера, то на всякий случай описываю и это. В файл /etc/X11/xdm/Xservers нужно прописать желаемое количество локальных X-серверов (мне хватает двух - один на консоли 7, второй на консоли 8):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;:0 local /usr/bin/X :0 vt7 -nolisten tcp&lt;br /&gt;:1 local /usr/bin/X :1 vt8 -nolisten tcp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Соответственно, вид настроенного xdm показан на нижеследующей фотографии:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4d7KNUc1lVw/TNBYVhtqnvI/AAAAAAAAA64/Y9R1HYnoplU/s1600/PB026575.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_4d7KNUc1lVw/TNBYVhtqnvI/AAAAAAAAA64/Y9R1HYnoplU/s320/PB026575.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5535021068888743666" /&gt;&lt;/a&gt;&lt;br /&gt;К сожалению, снимок экрана программно сделать не удалось, хотя я знаю о существовании Xnest и Xephyr, но мне лень было с ними разбираться ради такой ерунды.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5897246422453590250?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5897246422453590250/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5897246422453590250' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5897246422453590250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5897246422453590250'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/11/xdm.html' title='Настройка xdm'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4d7KNUc1lVw/TNBYVhtqnvI/AAAAAAAAA64/Y9R1HYnoplU/s72-c/PB026575.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-318361054724902346</id><published>2010-10-27T21:36:00.005+06:00</published><updated>2010-10-27T22:56:40.020+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rdesktop'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='freerdp'/><title type='text'>FreeRDP</title><content type='html'>Сегодня в &lt;a href="http://www.opennet.ru/opennews/art.shtml?num=28427"&gt;новостях&lt;/a&gt; услышал о существовании преемника rdesktop - freerdp. Судя по описанию в новости и по отзывам в комментариях, в нём устранены проблемы с несинхронным переключением раскладки на локальном и удалённом компьютере и устранены проблемы с залипанием клавиши Alt. Попробовал - и в самом деле, отлично работает. Ещё поправили глюк, когда вместо символа / вводился \. Наконец-то удалённое администрирование Windows-машин из Linux-компьютера превратилось в удовольствие! Спасибо добрым людям за то, что довели глючную поделку до ума.&lt;br /&gt;&lt;br /&gt;В Debian пакет называется freerdp-x11, а команда для подключения - xfreerdp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-318361054724902346?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/318361054724902346/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=318361054724902346' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/318361054724902346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/318361054724902346'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/10/freerdp.html' title='FreeRDP'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-2881624295485715503</id><published>2010-10-27T20:00:00.006+06:00</published><updated>2010-10-27T21:16:48.349+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='autofs'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Автомонтирование с помощью autofs</title><content type='html'>Давно мечтал настроить автомонтирование с помощью autofs. Вроде бы всё очень просто, но до сих пор до меня не доходила одна очень простая, но ключевая вещь. Но об этом попозже, сначала опишу настройку.&lt;br /&gt;&lt;br /&gt;Сначала, как водится, нужно установить autofs:&lt;br /&gt;&lt;pre&gt;# apt-get install autofs5&lt;/pre&gt;&lt;br /&gt;Затем задать ему настроечные файлы. Первый файл называется /etc/auto.master и содержит всего одну строчку:&lt;br /&gt;&lt;pre&gt;/mnt/.autofs    /etc/auto.misc --timeout=60&lt;/pre&gt;&lt;br /&gt;Эта строчка говорит о том, что все обращения к каталогу /mnt/.autofs будут обрабатываться демоном automount, настройки которого указаны в файле /etc/auto.misc. Опция --timeout=60 сообщает, что если к какому-либо диску не обращались в течение 60 минут, его нужно автоматически размонтировать.&lt;br /&gt;&lt;br /&gt;Второй файл, как вы уже наверное догадались, называется /etc/auto.misc, у меня на компьютере он содержит следующие строчки:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cdrom           -fstype=auto,ro         :/dev/sr0&lt;br /&gt;floppy          -fstype=auto,umask=000  :/dev/fd0&lt;br /&gt;usb1            -fstype=auto,umask=000  :/dev/sdc1&lt;br /&gt;usb2            -fstype=auto,umask=000  :/dev/sdd1&lt;br /&gt;usb3            -fstype=auto,umask=000  :/dev/sdc&lt;br /&gt;usb4            -fstype=auto,umask=000  :/dev/sdd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В первом столбце сообщается название каталога, в который будет смонтирован диск, во второй колонке перечисляются опции монтирования, в третьей колонке - имя файла устройства. Двоеточие на самом деле является разделителем имени компьютера и диска на нём. Autofs может автоматически монтировать не только файловые системы на локальных устройствах, но и каталоги NFS или Samba.&lt;br /&gt;&lt;br /&gt;Перед запуском autofs можно создать в каталоге /mnt/.autofs подкаталоги cdrom, floppy, usb1, usb2, usb3, usb4 и проставить на них права доступа. Например, я ограничился двумя группами - cdrom для устройства, с которого можно только читать, и floppy для устройств, на которые можно и читать и писать:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# cd /mnt/.autofs&lt;br /&gt;# chgrp cdrom cdrom&lt;br /&gt;# chmod 550 cdrom&lt;br /&gt;# chgrp floppy floppy usb1 usb2 usb3 usb4&lt;br /&gt;# chmod 770 floppy usb1 usb2 usb3 usb4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь можно добавить в группы floppy и cdrom пользователей, которые должны иметь доступ к дискетам/USB-дискам и приводу компакт- и DVD-дисков. Например, вот так:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# adduser stupin cdrom&lt;br /&gt;# adduser stupin floppy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь можно запустить autofs:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# /etc/init.d/autofs start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь о простой, но очень важной детали. Если теперь просто зайти в каталог /mnt/.autofs, то окажется, что он пуст. Не смотря на то, что мы создавали в каталоге /mnt/.autofs подкаталоги cdrom, floppy, usb1, usb2, usb3, usb4, эти каталоги после запуска демона autofs не отображаются. На самом деле мы создавали их только для того, чтобы определить права для смонтированных файловых систем.&lt;br /&gt;&lt;br /&gt;Эти каталоги не появятся в /mnt/.autofs до тех пор, пока мы не попытаемся к ним обратиться! &lt;br /&gt;&lt;br /&gt;Например, заходим в каталог /mnt/.autofs и видим, что там ничего сейчас нет:&lt;br /&gt;&lt;pre&gt;# cd /mnt/.autofs&lt;br /&gt;# ls&lt;/pre&gt;&lt;br /&gt;Не обращая на это внимания, пытаемся обратиться к каталогу /mnt/.autofs/usb1, как будто он есть:&lt;br /&gt;&lt;pre&gt;# ls usb1&lt;br /&gt;1  2&lt;/pre&gt;&lt;br /&gt;При обращении к этому каталогу autofs активировал скрытый каталог и смонтировал в него USB-диск. Теперь, пока каталог не успел ещё отмонтироваться, его можно увидеть:&lt;br /&gt;&lt;pre&gt;# ls&lt;br /&gt;usb1&lt;/pre&gt;&lt;br /&gt;Так вот, для того, чтобы вас не смущало отсутствие каталогов и вы не гадали, какие каталоги там могут появиться, если к ним обратиться по имени, можно создать в /mnt символические ссылки, которые сами всегда будут существовать и указывать на нужные каталоги:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# cd /mnt&lt;br /&gt;# ln -s .autofs/cdrom cdrom&lt;br /&gt;# ln -s .autofs/floppy floppy&lt;br /&gt;# ln -s .autofs/usb1 usb1&lt;br /&gt;# ln -s .autofs/usb2 usb2&lt;br /&gt;# ln -s .autofs/usb3 usb3&lt;br /&gt;# ln -s .autofs/usb4 usb4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь можно зайти в каталог /mnt и увидеть все диски, которые смонтированы в настоящее время статически или монтируются автоматически при обращении к ним:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# cd /mnt&lt;br /&gt;# ls # ls&lt;br /&gt;cdrom  disk_c disk_d floppy iso  usb1  usb2  usb3  usb4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Можно зайти в любой из каталогов и увидеть его содержимое. При этом автоматически монтируемые диски смонтируются при обращении к каталогу.&lt;br /&gt;&lt;br /&gt;Есть, правда, и несколько неприятные вещи. Например, умные файловые менеджеры не меняют текущий каталог для того, чтобы отобразить его содержимое. Как следствие, когда мы переходим по ссылке, происходит обращение к автоматически монтируемой файловой системе и она монтируется. Создаётся список файлов в точке монтирования, этот список выводится файловым менеджером на экран. Если теперь человек надолго задумается, диск автоматически отмонтируется, т.к. он никем не занят и к нему не было обращений. Подсистема inotify сразу же сообщит об исчезновении файлов из каталога файловому менеджеру и файловый менеджер обновит содержимое каталога - покажет пустоту.&lt;br /&gt;&lt;br /&gt;Поэтому удобно пользоваться таким автомонтированием только из командной строки, из Midnight Commander и из других файловых менеджеров, которые меняют текущий каталог.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4d7KNUc1lVw/TMhBHp9fZ2I/AAAAAAAAA6w/N4dqm8eT-X0/s1600/screen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://4.bp.blogspot.com/_4d7KNUc1lVw/TMhBHp9fZ2I/AAAAAAAAA6w/N4dqm8eT-X0/s320/screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5532743742003308386" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-2881624295485715503?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/2881624295485715503/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=2881624295485715503' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2881624295485715503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2881624295485715503'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/10/autofs.html' title='Автомонтирование с помощью autofs'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4d7KNUc1lVw/TMhBHp9fZ2I/AAAAAAAAA6w/N4dqm8eT-X0/s72-c/screen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-4222151232526730499</id><published>2010-10-27T16:48:00.005+06:00</published><updated>2010-10-27T21:20:08.249+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='dhcp'/><title type='text'>Перенос DHCP-сервера</title><content type='html'>Встала задача - перенести настройки с DHCP-сервера Windows на DHCP-сервер в Linux. Основные настройки можно перенести и вручную, а вот таблицу с привязками имени, MAC- и IP-адреса каждого компьютера переносить вручную мне было лень. Было лень настолько, что я принялся писать конвейер для командной строки, который преобразует мне всю таблицу из одного формата в другой.&lt;br /&gt;&lt;br /&gt;Для начала я снял дамп настроек DHCP-сервера в Windows:&lt;br /&gt;&lt;pre&gt;netsh dhcp server \\11.11.11.1 dump &gt; dump.txt&lt;/pre&gt;&lt;br /&gt;Потом я перенёс этот файл в Linux, сменил его кодировку и после получаса мучений, наваял такой конвейер (для того, чтобы увидеть целиком, придётся, видимо, скопировать его и вставить в текстовый редактор):&lt;br /&gt;&lt;pre&gt;grep "Dhcp Server" dump.txt | \&lt;br /&gt;        cut - -f8,9,10 -d" " | \&lt;br /&gt;        grep domain | \&lt;br /&gt;        cut -d. -f1-4 | \&lt;br /&gt;        sed -e 's/\"//g' - | \&lt;br /&gt;        sed -e 's/\(.*\) \(.*\) \(.*\)/\2 \1 \3/g' - | \&lt;br /&gt;        sed - -e 's/^\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)/\1\2:\3\4:\5\6:\7\8:\9/g' | \&lt;br /&gt;        sed - -e 's/:\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)\([0-9a-f]\)/:\1\2:\3\4/g' | \&lt;br /&gt;        sed -e 's/\(.*\) \(.*\) \(.*\)/\thost \3 {\n\t\thardware ethernet \1;\n\t\tfixed-address \2;\n\t}/g' - \&lt;br /&gt;        &gt; hosts.txt&lt;/pre&gt;&lt;br /&gt;Эта строчка находит в файле dump.txt строки вида:&lt;br /&gt;&lt;pre&gt;Dhcp Server 11.11.11.1 Scope 11.0.0.0 Add reservedip 11.11.11.11 00AABBCCDDEE "computer.domain" "" "DHCP"&lt;/pre&gt;&lt;br /&gt;И переделывает их в строки вида:&lt;br /&gt;&lt;pre&gt;        host computer {&lt;br /&gt;                hardware ethernet 00:AA:BB:CC:DD:EE;&lt;br /&gt;                fixed-address 11.11.11.11;&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;Которые записывает в текстовый файл hosts.txt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-4222151232526730499?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/4222151232526730499/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=4222151232526730499' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4222151232526730499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4222151232526730499'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/10/dhcp.html' title='Перенос DHCP-сервера'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-1038584429084274480</id><published>2010-10-18T20:34:00.004+06:00</published><updated>2010-10-18T21:30:46.988+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='audio players'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='deadbeef'/><title type='text'>Аудиоплееры в Debian</title><content type='html'>С аудиоплеерами в Linux, на мой взгляд, сложилась парадоксальная ситуация. Плееров много, но выбрать из них нечего. Даже с видеоплеерами и то лучше - можно выбрать практически любой и он не будет написан на Python, mono или завязан на KDE4. А вот в случае с аудиоплеерами всё не так.&lt;br /&gt;&lt;br /&gt;Недавно я не вытерпел и перешёл с Lenny на Squeeze - в Lenny оказалось неожиданно много глюков. Судя по графику глюков, Squeeze уже сейчас содержит глюков меньше, чем Lenny. По случаю этого обновления мной на пробу были протестированы несколько плееров:&lt;br /&gt;&lt;br /&gt;1. Exaile - написан на Python, практически точная копия Amarok. По непонятной причине не захотел играть mp3. Разбираться было лень, т.к. есть много других плееров - как грязи.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4d7KNUc1lVw/TLxmX1bF28I/AAAAAAAAA6I/aLxRRJuezXo/s1600/exaile.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 225px;" src="http://3.bp.blogspot.com/_4d7KNUc1lVw/TLxmX1bF28I/AAAAAAAAA6I/aLxRRJuezXo/s320/exaile.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529407002167860162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Banshee - написан на mono. Даже смотреть не стал.&lt;br /&gt;&lt;br /&gt;3. Audacious - вполне себе неплохой плеер с WinAMP-подобным интерфейсом. Всё бы ничего, но мне во-первых не очень нравятся программы со шкурками. Во-вторых, он не позволяет выбрать дорожку из многодорожечных FLAC-файлов. А в третьих, натерпелся я от него в Lenny глюков: неработающая поддержка MIDI, мёртвое зависание при попытке посмотреть свойства MIDI-файла, работающее через раз групповое добавление файлов.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4d7KNUc1lVw/TLxm6pqFHNI/AAAAAAAAA6Q/G1zQmPgCvD8/s1600/audacious.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 188px;" src="http://2.bp.blogspot.com/_4d7KNUc1lVw/TLxm6pqFHNI/AAAAAAAAA6Q/G1zQmPgCvD8/s320/audacious.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529407600304921810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. Audacious GTK - вроде бы то, что надо, но невозможно двигать треки в списке, невозможно удалить несколько треков из списка за раз. Многодорожечные FLAC-файлы также не работают. Одним словом, покоцаный Audacious.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4d7KNUc1lVw/TLxnSozBMsI/AAAAAAAAA6Y/New2NdQfbqc/s1600/audacious-gtk.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://2.bp.blogspot.com/_4d7KNUc1lVw/TLxnSozBMsI/AAAAAAAAA6Y/New2NdQfbqc/s320/audacious-gtk.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529408012390838978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. Listen Music Player - написан на Python. При обновлении библиотеки добавлял вновь обнаруженных артистов, альбомы и жанры в случайное место списка. В результате во время сканирования попытка запустить хоть какую-нибудь песню превращалась в увлекательную игру - попытка попасть мышью в только что увиденного артиста, который мгновенно убегал совершенно неожиданно то ли вверх по списку, то ли вниз. Уже выделенный однажды элемент так же неожиданно подменялся на другой случайный.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4d7KNUc1lVw/TLxnqYshhII/AAAAAAAAA6g/uRvSOtF7mMs/s1600/listen-music-player.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://1.bp.blogspot.com/_4d7KNUc1lVw/TLxnqYshhII/AAAAAAAAA6g/uRvSOtF7mMs/s320/listen-music-player.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529408420385490050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. Amarok 2. Тяжёл и неповоротлив, как и всё современное KDE 4. Раньше пользовался Amarok, Amarok 2 пробовать не стал.&lt;br /&gt;&lt;br /&gt;7. Quod Libet, написан на Python. Просто не запустился!&lt;br /&gt;&lt;br /&gt;8. mpd - маргинальный плеер с клиент-серверной архитектурой.&lt;br /&gt;&lt;br /&gt;9. mocp - см. пункт 8.&lt;br /&gt;&lt;br /&gt;10. XMMS2 - после установки сообщил, что он будет работать только в режиме командной строки и вообще, что он deprecated и заменён на nyxmms2. Поиск такого пакета завершился молчаливым завершением пакетного менеджера - нет такого пакета.&lt;br /&gt;&lt;br /&gt;11. BMP (Beep Media Player) - нет такого в пакетах.&lt;br /&gt;&lt;br /&gt;12. QMMP - WinAMP-подобный плеер на основе Qt. Для Debian есть только в виде пакета для нестабильной (Sid) ветки. Ставить не стал.&lt;br /&gt;&lt;br /&gt;13. Decibel Audio Player - без сканирования фонотеки добавить в список воспроизведения хотя бы файлик не дал (нужно лезть в настройки, чтобы можно было выбрать файлы из определённой папки). Во время сканирования коллекции с плеером ничего невозможно сделать - он не отображает уже отсканированные песни и не позволяет их запустить прямо сейчас, пока будет сканироваться остальное.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4d7KNUc1lVw/TLxoF1tSZbI/AAAAAAAAA6o/C3Sy3TbNXP8/s1600/decibel-audio-player.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 233px;" src="http://4.bp.blogspot.com/_4d7KNUc1lVw/TLxoF1tSZbI/AAAAAAAAA6o/C3Sy3TbNXP8/s320/decibel-audio-player.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529408892029789618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;14. DeaDBeeF - плеер, стремящийся стать аналогом Foobar2000. Установил из репозитория проекта пакет для Squeeze. Поддерживает многодорожечные FLAC. Но, не позволяет воспроизводить MIDI через ALSA, можно воспроизводить MIDI только через собственный хиленький программный синтезатор с примитивным звучанием типа OPL3. Остановился пока на нём.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4d7KNUc1lVw/TLxl2xxQngI/AAAAAAAAA6A/rTC7KKoIsGY/s1600/deadbeef.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_4d7KNUc1lVw/TLxl2xxQngI/AAAAAAAAA6A/rTC7KKoIsGY/s320/deadbeef.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5529406434251415042" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-1038584429084274480?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/1038584429084274480/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=1038584429084274480' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1038584429084274480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/1038584429084274480'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/10/debian.html' title='Аудиоплееры в Debian'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4d7KNUc1lVw/TLxmX1bF28I/AAAAAAAAA6I/aLxRRJuezXo/s72-c/exaile.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8394848276103705585</id><published>2010-10-08T15:23:00.002+06:00</published><updated>2010-10-08T15:36:02.497+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><title type='text'>Добавление альтернативных имён портала SharePoint Services</title><content type='html'>Пишу себе на память. Вот по этой ссылке можно найти всю интересующую информацию по сабжу: &lt;a href="http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=39"&gt;Update to using External URLs with WSS v3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Можно воспользоваться "Центром администрирования", меню "Операции", пунктом "Сопоставления для альтернативного доступа" и прописать там альтернативное имя портала.&lt;br /&gt;&lt;br /&gt;Я воспользовался командой следующего вида:&lt;br /&gt;&lt;pre&gt;STSADM.EXE -o addalternatedomain -url http://portal -incomingurl &lt;br /&gt;                http://anothername -urlzone intranet&lt;/pre&gt;&lt;br /&gt;Затем добавил новое имя на DNS-сервере и портал стал доступен под двумя именами одновременно.&lt;br /&gt;&lt;br /&gt;Делается это с целью последующего переименования сервера в имя, соответствующее корпоративному стандарту. Затем сервер будет переведён из домена филиала в общекорпоративный домен по уже обкатанной мной технологии: &lt;a href="http://vladimir-stupin.blogspot.com/2010/06/sharepoint-services-active-directory.html"&gt;Миграция портала SharePoint Services в домен Active Directory&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8394848276103705585?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8394848276103705585/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8394848276103705585' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8394848276103705585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8394848276103705585'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/10/sharepoint-services.html' title='Добавление альтернативных имён портала SharePoint Services'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-4802294121911355905</id><published>2010-08-23T20:49:00.008+06:00</published><updated>2011-03-25T15:28:34.322+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='flac'/><category scheme='http://www.blogger.com/atom/ns#' term='ape'/><title type='text'>flac &amp; cue в mp3</title><content type='html'>Иногда попадаются рипы компакт-дисков, сделанные аудиофилами. Аудиофилам обычно очень важно, чтобы рип представлял собой точную копию компакт-диска, поэтому они часто делают рипы всего диска в виде одного файла формате flac, который они сопровождают ещё и файлом со списком дорожек в формате cue.&lt;br /&gt;&lt;br /&gt;Чтобы закачать такую музыку на аудио-плеер, умеющий воспроизводить только mp3 или ogg, приходится разбивать flac на отдельные mp3-треки.&lt;br /&gt;&lt;br /&gt;Кроме разбивки flac-файла на отдельные файлы и преобразования каждого из файлов в формат mp3 полезно также перенести всю полезную информацию из cue-файла в теги mp3-файла. Для этого нам понадобятся следующие пакеты: shntool, cuetools, lame, enca. Установим их:&lt;br /&gt;&lt;pre&gt;# apt-get install shntool cuetools lame enca&lt;/pre&gt;&lt;br /&gt;shntool потребуется для того, чтобы разбить flac-файл на отдельные wav-файлы, cuetools понадобится для извлечения полезной информации из cue-файла, lame - для кодирования wav-файлов в формат mp3 и простановки тегов, enca используется для автоматического определения кодировки текста в cue-файле (поскольку cue-файл мог быть создан как в Windows, так и в Linux и может иметь символы самых разных алфавитов).&lt;br /&gt;&lt;br /&gt;Теперь можно попытаться соединить всё это в единый скрипт:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;FROMCP=`enca -e *.cue`&lt;br /&gt;iconv -f $FROMCP -t UTF-8 *.cue &amp;gt; /tmp/list.cue&lt;br /&gt;&lt;br /&gt;DATE=`grep "REM DATE" /tmp/list.cue | sed -e 's/REM DATE \(.*\)/\1/g'`&lt;br /&gt;GENRE=`grep "REM GENRE" /tmp/list.cue | sed -e 's/REM GENRE \(.*\)/\1/g'`&lt;br /&gt;COMMENT=`grep "REM COMMENT" /tmp/list.cue | sed -e 's/REM COMMENT \(.*\)/\1/g'`&lt;br /&gt;NUMBER=`cueprint -d "%N" /tmp/list.cue`&lt;br /&gt;&lt;br /&gt;shntool split -f /tmp/list.cue *.flac -t %n&lt;br /&gt;&lt;br /&gt;for((I=1;I&amp;lt;=NUMBER;I++));&lt;br /&gt;do&lt;br /&gt;        cueprint -n $I -t "ARTIST=\"%p\"\nALBUM=\"%T\"\nTRACKNUMBER=\"%n\"\nTITLE=\"%t\"\n" /tmp/list.cue &amp;gt; /tmp/tags&lt;br /&gt;        . /tmp/tags&lt;br /&gt;        J=`printf "%02d" $I`&lt;br /&gt;        lame -b 192 --cbr \&lt;br /&gt;                --ty "$DATE" \&lt;br /&gt;                --tg "$GENRE" \&lt;br /&gt;                --tc "$COMMENT" \&lt;br /&gt;                --ta "$ARTIST" \&lt;br /&gt;                --tl "$ALBUM" \&lt;br /&gt;                --tn "$TRACKNUMBER" \&lt;br /&gt;                --tt "$TITLE" \&lt;br /&gt;                --add-id3v2 \&lt;br /&gt;                --id3v2-only \&lt;br /&gt;                $J.wav $J.mp3&lt;br /&gt;        rm $J.wav&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;rm /tmp/list.cue /tmp/tags&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Скрипт рассчитан на то, что в текущем каталоге имеется только один cue-файл и один flac-файл.&lt;br /&gt;&lt;br /&gt;Иногда вместо flac используется ape, который с лицензионной стороны намного хуже flac'а. В частности, существовавший когда-то на просторах опенсорса проект mac (Monkey's Audio Codec), исчез именно из-за лицензионных проблем. Не смотря на это, кое-где ещё можно найти как исходники, так и deb-пакет. После установки пакета shntool можно использовать прежним образом, единственное отличие будет заключаться лишь в том, что вместо flac-файла нужно будет указать ape-файл.&lt;br /&gt;&lt;br /&gt;Обновлено 3 сентября 2010 года. При обновлении этой заметки и скрипта был использован комментарий к моей старой заметке &lt;a href="http://vladimir-stupin.blogspot.com/2008/08/flac-mp3-debian.html"&gt;Конвертируем FLAC в MP3 под Debian&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-4802294121911355905?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/4802294121911355905/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=4802294121911355905' title='Комментарии: 15'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4802294121911355905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/4802294121911355905'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/flac-cue-mp3.html' title='flac &amp; cue в mp3'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5440798154041415463</id><published>2010-08-21T00:18:00.007+06:00</published><updated>2010-08-21T01:04:44.457+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='игры'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Duke Nukem 3D в Debian GNU/Linux</title><content type='html'>Продолжаю серию заметок о запуске старых игр - стрелялок от первого лица:&lt;br /&gt;1. &lt;a href="http://vladimir-stupin.blogspot.com/2009/01/quake-linux.html"&gt;Quake в Linux&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://vladimir-stupin.blogspot.com/2009/01/quake-nexuiz.html"&gt;Запуск Quake на движке Nexuiz&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://vladimir-stupin.blogspot.com/2010/07/quake2-debian-gnulinux.html"&gt;Quake2 на Debian GNU/Linux&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На этот раз я откопал современный порт Duke Nukem 3D, который называется Eduke32. Официальный сайт проекта находится по следующему адресу: &lt;a href="http://www.eduke32.com/"&gt;http://www.eduke32.com/&lt;/a&gt; Для установки движка игры воспользуемся репозиторием Debian на сайте проекта. На странице &lt;a href="http://wiki.eduke32.com/wiki/APT_repository"&gt;Apt Repository&lt;/a&gt; находим интересующий нас раздел &lt;a href="http://wiki.eduke32.com/wiki/APT_repository#Lenny"&gt;Lenny&lt;/a&gt;. В соответствии с инструкциями добавляем репозиторий в систему, прописав следующие две строчки в файл /etc/apt/sources.list:&lt;br /&gt;&lt;pre&gt;deb http://apt.duke4.net lenny main&lt;br /&gt;deb-src http://apt.duke4.net lenny main&lt;/pre&gt;&lt;br /&gt;Теперь добавим PGP-ключ репозитория с помощью следующей команды:&lt;br /&gt;&lt;pre&gt;# wget http://apt.duke4.net/key/eduke32.gpg -O- | apt-key add -&lt;/pre&gt;&lt;br /&gt;Обновим список пакетов:&lt;br /&gt;&lt;pre&gt;# apt-get update&lt;/pre&gt;&lt;br /&gt;И установим интересующие нас пакеты с движком игры и с условно-бесплатной версией самой игры:&lt;br /&gt;&lt;pre&gt;# apt-get install eduke32 duke3d-shareware&lt;/pre&gt;&lt;br /&gt;Кроме этих двух пакетов в репозитории имеются ещё два пакета: build-engine-utils - коллекция инструментов, предназначенных для манипуляции данными игр, основанных на движке Build (из таковых я припоминаю ещё игры Blood, Redneck Rampage и Outlaws) и mapster32 - редактор карт, работающий в режиме OpenGL. В общем, в этом репозитории, похоже, есть всё необходимое, чтобы делать новые карты и модификации игры.&lt;br /&gt;&lt;br /&gt;Но это ещё не всё. Ещё я нашёл проект &lt;a href="http://hrp.duke4.net/"&gt;High Resolution Pack&lt;/a&gt;, в рамках которого люди занимаются повышением разрешения текстур и заменой всех спрайтов на модели: &lt;a href="http://www.duke4.org/files/nightfright/beta/polymer_hrp132.zip"&gt;polymer_hrp132.zip&lt;/a&gt;, архивчик уже достиг объёма 466 мегабайт!&lt;br /&gt;&lt;br /&gt;Скачаем последний релиз HRP и распакуем его в каталог с настройками личными игры текущего пользователя:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ wget http://www.duke4.org/files/nightfright/beta/polymer_hrp132.zip&lt;br /&gt;$ unzip polymer_hrp132.zip -d ~/.eduke32&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь при запуске игры, в окошке выбора разрешения нужно указать использование движка Polymer, который как раз и умеет рисовать трёхмерные модели.&lt;br /&gt;&lt;br /&gt;Вот так игра выглядит на разрешении 1280x1024 без использования HRP:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4d7KNUc1lVw/TG7Pxa9E62I/AAAAAAAAA5Y/bODhgIiCV2A/s1600/duke0000.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_4d7KNUc1lVw/TG7Pxa9E62I/AAAAAAAAA5Y/bODhgIiCV2A/s320/duke0000.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5507567842276731746" /&gt;&lt;/a&gt;&lt;br /&gt;А вот так выглядит на разрешении 800x600 с использованием HRP:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4d7KNUc1lVw/TG7QCfK6mGI/AAAAAAAAA5g/mKuwoh4ruBg/s1600/duke0003.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_4d7KNUc1lVw/TG7QCfK6mGI/AAAAAAAAA5g/mKuwoh4ruBg/s320/duke0003.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5507568135466293346" /&gt;&lt;/a&gt;&lt;br /&gt;Ещё пара снимков с использованием HRP. Этот с разрешением 1280x1024:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4d7KNUc1lVw/TG7Qn_rPBoI/AAAAAAAAA5o/FU42Wxnd4AY/s1600/duke0001.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_4d7KNUc1lVw/TG7Qn_rPBoI/AAAAAAAAA5o/FU42Wxnd4AY/s320/duke0001.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5507568779846944386" /&gt;&lt;/a&gt;&lt;br /&gt;Этот с разрешением 800x600:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4d7KNUc1lVw/TG7QxLEg8RI/AAAAAAAAA5w/xkD87xly57g/s1600/duke0002.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_4d7KNUc1lVw/TG7QxLEg8RI/AAAAAAAAA5w/xkD87xly57g/s320/duke0002.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5507568937524588818" /&gt;&lt;/a&gt;&lt;br /&gt;Имеются, однако, и недостатки - игра довольно сильно тормозит, требует много ресурсов (на моём компьютере игра отъела полгигабайта памяти в режиме без HRP), отчего иногда замораживается секунд на 5-10 и иногда падает. Если хотите поиграть в игру полноценно, советую найти полную, не условно-бесплатную версию файла ресурсов и уменьшить настройки качества картинки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5440798154041415463?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5440798154041415463/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5440798154041415463' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5440798154041415463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5440798154041415463'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/duke-nukem-3d-debian-gnulinux.html' title='Duke Nukem 3D в Debian GNU/Linux'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4d7KNUc1lVw/TG7Pxa9E62I/AAAAAAAAA5Y/bODhgIiCV2A/s72-c/duke0000.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8922042663856974285</id><published>2010-08-13T09:29:00.003+06:00</published><updated>2010-08-13T10:31:40.756+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lighttpd'/><title type='text'>Lighttpd и gamin</title><content type='html'>Ранее я уже писал, что начал пользоваться Mathopd: &lt;a href="http://vladimir-stupin.blogspot.com/2010/02/mathopd.html"&gt;Биография одного домашнего сервера и настройка Mathopd&lt;/a&gt;. Тогда я решил попробовать его, потому что привычный Lighttpd отказывался устанавливаться в отсутствии famd, а famd конфликтовал с gamin, который я установил, чтобы избежать внезапных зависаний программ: &lt;a href="http://vladimir-stupin.blogspot.com/2009/01/famd-vs-gamin.html"&gt;famd vs gamin&lt;/a&gt;. Нужно было пересобрать Lighttpd с gamin вместо famd, но мне тогда было лень этим заниматься, т.к. это было прекрасным поводом попробовать Mathopd :)&lt;br /&gt;&lt;br /&gt;На днях Mathopd мне наконец надоел и я решил всё-таки собрать Lighttpd с gamin. Рецептом сборки этой связки я и хочу поделиться.&lt;br /&gt;&lt;br /&gt;Для начала, скачаем исходники:&lt;br /&gt;&lt;pre&gt;$ apt-get source lighttpd&lt;/pre&gt;&lt;br /&gt;И перейдём в каталог с распакованными исходниками и информацией для сборки:&lt;br /&gt;&lt;pre&gt;$ cd lighttpd-1.4.19&lt;/pre&gt;&lt;br /&gt;Затем, заглянем в файл debian/control и просмотрим список зависимостей для сборки пакета (Build-Depends): debhelper (&gt;= 5.0.0), cdbs, mime-support, libssl-dev, zlib1g-dev, libbz2-dev, libattr1-dev, libpcre3-dev, libmysqlclient15-dev, libfam-dev, libldap2-dev, libfcgi-dev, libgdbm-dev, libmemcache-dev, liblua5.1-0-dev, quilt, patchutils, pkg-config, uuid-dev, libsqlite3-dev, libxml2-dev, libkrb5-dev, perl&lt;br /&gt;&lt;br /&gt;Установим всё это хозяйство, за исключением libfam-dev, который мы заменим на libgamin-dev:&lt;br /&gt;&lt;pre&gt;# apt-get install debhelper cdbs mime-support libssl-dev zlib1g-dev libbz2-dev \&lt;br /&gt;libattr1-dev libpcre3-dev libmysqlclient15-dev libgamin-dev libldap2-dev libfcgi-dev \&lt;br /&gt;libgdbm-dev libmemcache-dev liblua5.1-0-dev quilt patchutils pkg-config uuid-dev \&lt;br /&gt;libsqlite3-dev libxml2-dev libkrb5-dev perl&lt;/pre&gt;&lt;br /&gt;Теперь отредактируем файл debian/control, заменив в нём libfam-dev на libgamin-dev.&lt;br /&gt;&lt;br /&gt;Далее, опишем изменения, сделанные в пакете с помощью dch:&lt;br /&gt;&lt;pre&gt;$ dch -i&lt;/pre&gt;&lt;br /&gt;Я внёс следующее описание сделанных изменений:&lt;br /&gt;&lt;pre&gt;lighttpd (1.4.19-5+lenny1gamin) stable-security; urgency=low&lt;br /&gt;&lt;br /&gt;  * Changed dependency from libfam-dev to libgamin-dev.&lt;br /&gt;&lt;br /&gt; -- Vladimir Stupin &lt;wheelof@gmail.com&gt;  Fri, 13 Aug 2010 10:17:22 +0600&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Осталось лишь собрать изменённый пакет:&lt;br /&gt;&lt;pre&gt;$ dpkg-buildpackage -b -us -uc -rfakeroot&lt;/pre&gt;&lt;br /&gt;Всё. Переходим в каталог выше, где и находятся собранные пакеты:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;lighttpd_1.4.19-5+lenny1gamin_i386.deb&lt;br /&gt;lighttpd-doc_1.4.19-5+lenny1gamin_all.deb&lt;br /&gt;lighttpd-mod-cml_1.4.19-5+lenny1gamin_i386.deb&lt;br /&gt;lighttpd-mod-magnet_1.4.19-5+lenny1gamin_i386.deb&lt;br /&gt;lighttpd-mod-mysql-vhost_1.4.19-5+lenny1gamin_i386.deb&lt;br /&gt;lighttpd-mod-trigger-b4-dl_1.4.19-5+lenny1gamin_i386.deb&lt;br /&gt;lighttpd-mod-webdav_1.4.19-5+lenny1gamin_i386.deb&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Устанавливаем нужные пакеты с помощью dpkg и пользуемся:&lt;br /&gt;&lt;pre&gt;# dpkg -i lighttpd_1.4.19-5+lenny1gamin_i386.deb&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8922042663856974285?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8922042663856974285/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8922042663856974285' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8922042663856974285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8922042663856974285'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/lighttpd-gamin.html' title='Lighttpd и gamin'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-3824658510298108326</id><published>2010-08-04T15:09:00.001+06:00</published><updated>2010-08-04T15:11:00.279+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='X-Window'/><title type='text'>Доступ к буферу обмена X Window System из командной строки с помощью xclip</title><content type='html'>Перевод статьи: &lt;a href="http://www.linuxjournal.com/content/access-x-window-system-clipboard-command-line-xclip"&gt;Access the X Window System Clipboard from the Command Line with xclip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;17 марта 2009, Эрик Фэлор (Erik Falor)&lt;br /&gt;&lt;br /&gt;Вы когда-нибудь выделяли текст в окне терминала, чтобы скопировать его в X-приложение? Отбросьте мышь и воспользуйтесь вместо неё xclip. С помощью xclip вы просто перенаправляете через конвейер в xclip тот текст, который вы хотите скопировать:&lt;br /&gt;&lt;pre&gt;$ lspci | xclip&lt;/pre&gt;&lt;br /&gt;Теперь перейдите в X-приложение и вставьте захваченный вывод в программу. xclip также позволит вам “вставить” выбранный текст в терминал. Просто воспользуйтесь опцией -o для вывода выделенного текста:&lt;br /&gt;&lt;pre&gt;$ xclip -o&lt;/pre&gt;&lt;br /&gt;xclip можно найти на sourceforge.net/projects/xclip.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-3824658510298108326?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/3824658510298108326/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=3824658510298108326' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3824658510298108326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3824658510298108326'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/x-window-system-xclip.html' title='Доступ к буферу обмена X Window System из командной строки с помощью xclip'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-7931774616434551000</id><published>2010-08-04T14:50:00.002+06:00</published><updated>2010-08-04T15:00:39.970+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='alsa'/><category scheme='http://www.blogger.com/atom/ns#' term='перевод'/><title type='text'>Изменение громкости из сценария Bash</title><content type='html'>Перевод статьи: &lt;a href="http://www.linuxjournal.com/content/change-volume-bash-script"&gt;Change Volume From a Bash Script&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;24 сентября 2008, Митч Фрэзер (Mitch Frazier)&lt;br /&gt;&lt;br /&gt;Если вы пользуетесь звуковой системой ALSA, вы можете воспользоваться функциями, содержащимися в представленном сценарии, для получения и установки громкости звука вашей системы. Вы можете использовать его, если у вас запущен сторожевой сценарий и вы хотите увеличить громкость сигнала во время тревоги, а затем вернуть громкость обратно к предыдущему уровеню.&lt;br /&gt;&lt;br /&gt;Функция get просто использует amixer для вывода информации о канале управления миксером "Master" и затем использует grep для вырезания нужного значения из выведенной информации.&lt;br /&gt;&lt;br /&gt;Функция set также использует amixer для задания громкости. Она использует опцию "cset" программы amixer.&lt;br /&gt;&lt;br /&gt;Сценарий следующий:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;#####################################################################&lt;br /&gt;# Получить текущую громкость.&lt;br /&gt;function get_volume()&lt;br /&gt;{&lt;br /&gt;    mixer=$(amixer get Master | grep 'Front Left:')&lt;br /&gt;    echo $mixer | cut -d ' ' -f 4&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#####################################################################&lt;br /&gt;# Задать громкость.&lt;br /&gt;function set_volume()&lt;br /&gt;{&lt;br /&gt;    amixer cset iface=MIXER,name="Master Playback Volume" $1 &gt;/dev/null&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if [[ $(basename $0 .sh) == 'sound' ]]; then&lt;br /&gt;    sound_file=~/Documents/sounds/notify.wav&lt;br /&gt;    if [[ "$1" ]]; then sound_file="$1"; fi&lt;br /&gt;&lt;br /&gt;    ovol=$(get_volume)&lt;br /&gt;    echo "Текущая громкость: $ovol"&lt;br /&gt;    aplay $sound_file&lt;br /&gt;    sleep 2&lt;br /&gt;&lt;br /&gt;    vol=40&lt;br /&gt;    echo "Воспроизведение на громкости: $vol"&lt;br /&gt;    set_volume $vol&lt;br /&gt;    aplay $sound_file&lt;br /&gt;    sleep 2&lt;br /&gt;&lt;br /&gt;    echo "Возвращение к громкости: $ovol"&lt;br /&gt;    set_volume $ovol&lt;br /&gt;    aplay $sound_file&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# vim: tabstop=4: shiftwidth=4: noexpandtab:&lt;br /&gt;# kate: tab-width 4; indent-width 4; replace-tabs false;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Если вы сохраните этот сценарий под именем sound.sh и запустите его самого, передав имя звукового файла, сценарий воспроизведёт файл на текущей громкости, затем поднимет громкость и воспроизведёт его снова, и наконец, восстановит громкость и воспроизведёт его последний раз. Если вы откроете средство управления миксером перед запуском сценария, вы должны увидеть как громкость главного канала изменяется под действием сценария. Вы можете изменить значение громкости в строке vol=40 на значение, которое вам нужно.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Митч Фрэзер (Mitch Frazier) является помощником редактора в Linux Journal и веб-редактором в linuxjournal.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-7931774616434551000?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/7931774616434551000/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=7931774616434551000' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/7931774616434551000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/7931774616434551000'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/bash.html' title='Изменение громкости из сценария Bash'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-2443139713601400027</id><published>2010-08-04T14:24:00.002+06:00</published><updated>2010-08-04T14:26:51.266+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wget'/><title type='text'>Скачать весь веб-сайт с помощью wget</title><content type='html'>Перевод статьи: &lt;a href="http://www.linuxjournal.com/content/downloading-entire-web-site-wget"&gt;Downloading an Entire Web Site with wget&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;05 сентября 2008, Дашамир Хоксха (Dashamir Hoxha)&lt;br /&gt;&lt;br /&gt;Если вам когда-нибудь потребуется скачать целый веб-сайт, например для просмотра без доступа в интернет, wget может это сделать -- например:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ wget \&lt;br /&gt;    --recursive \&lt;br /&gt;    --no-clobber \&lt;br /&gt;    --page-requisites \&lt;br /&gt;    --html-extension \&lt;br /&gt;    --convert-links \&lt;br /&gt;    --restrict-file-names=windows \&lt;br /&gt;    --domains website.org \&lt;br /&gt;    --no-parent \&lt;br /&gt;        www.website.org/tutorials/html/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Эта команда скачает веб-сайт www.website.org/tutorials/html/.&lt;br /&gt;&lt;br /&gt;Используются следующие опции:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;--recursive: скачивать весь веб-сайт.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;--domains website.org: не переходить по ссылкам вне сайта website.org.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;--no-parent: не переходить по ссылкам вне каталога tutorials/html/.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;--page-requisites: собрать все элементы, относящиеся к странице (изображения, CSS и так далее).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;--html-extension: сохранять файлы с расширением .html.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;--convert-links: преобразовывать ссылки так, чтобы они работали локально, без доступа в интернет.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;--restrict-file-names=windows: изменять имена файлов таким образом, чтобы они работали в Windows.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;--no-clobber: не заменять какие-либо существующие файлы (используется в случае, если скачивание было прервано и возобновлено).&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-2443139713601400027?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/2443139713601400027/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=2443139713601400027' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2443139713601400027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2443139713601400027'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/wget.html' title='Скачать весь веб-сайт с помощью wget'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-7908893030231367240</id><published>2010-08-04T14:11:00.002+06:00</published><updated>2010-08-04T14:14:12.886+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gawk'/><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><title type='text'>Наслаждайтесь Gawk</title><content type='html'>Перевод статьи: &lt;a href="http://www.linuxjournal.com/content/tech-tip-fun-gawk"&gt;Fun With Gawk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;15 февраля 2010, Джеймс Хайннэнт (James Hinnant)&lt;br /&gt;&lt;br /&gt;Когда grep и sed бывает недостаточно, gawk может предоставить дополнительную лошадиную силу, которая вам необходима. Следующий совет содержит образец того, что можно делать с помощью gawk.&lt;br /&gt;&lt;br /&gt;Выделить последний столбец из текстового файла, столбцы которого разделены пробелами:&lt;br /&gt;&lt;pre&gt;cat myfile | gawk '{print $NF}'&lt;/pre&gt;&lt;br /&gt;или:&lt;br /&gt;&lt;pre&gt;gawk '{print $NF}' myfile&lt;/pre&gt;&lt;br /&gt;Вывести количества файлов, которыми владеет каждый из пользователей в текущем каталоге:&lt;br /&gt;&lt;pre&gt;/bin/ls -l | \&lt;br /&gt;    gawk 'NR &amp;gt; 1 {counts[$3]++;}&lt;br /&gt;        END {for (s in counts) {&lt;br /&gt;            printf(" %-15s : % 5d\n",&lt;br /&gt;                s, counts[s]);}}' | \&lt;br /&gt;        sort&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Завершить ваши процессы (одно из применений - завершить зависший сеанс, если вы можете удалённо войти на рабочую станцию с другого компьютера):&lt;br /&gt;&lt;pre&gt;ps -elf | \&lt;br /&gt;    gawk -v me="$USER" '$3 == me {print $4}' | \&lt;br /&gt;        egrep -v $$ | \&lt;br /&gt;            xargs -i@@ kill -9 @@; kill -9 $$&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-7908893030231367240?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/7908893030231367240/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=7908893030231367240' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/7908893030231367240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/7908893030231367240'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/gawk.html' title='Наслаждайтесь Gawk'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-2237870665139419497</id><published>2010-08-04T13:57:00.004+06:00</published><updated>2010-08-04T14:31:33.955+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='перевод'/><title type='text'>Преобразовать имена файлов к нижнему регистру</title><content type='html'>Перевод статьи: &lt;a href="http://www.linuxjournal.com/content/convert-filenames-lowercase"&gt;Convert Filenames to Lowercase&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;25 июля 2008, Фил Хьюз (Phil Hughes)&lt;br /&gt;&lt;br /&gt;Я собирался сказать, что я написал это вчера, но отметка времени файла указывает на то, что это было 22 ноября 1998. Ничего нового, ничего особенного, это просто работает.&lt;br /&gt;&lt;br /&gt;Вернёмся в старое-доброе время операционных систем, не понимавших разницы между NAME и name. В результате, если иногда приходится копировать файлы с гибких дисков (помните такие?), созданных на Давно Онемевшей Системе, можно получить свалку каталогов с именами файлов в верхнем регистре. Поскольку мы, опытные старожилы UNIX, пользуемся хитрой уловкой для вывода имён каталогов до имён файлов файлов по команде ls (а именно - начинаем имена каталогов с букв в верхнем регистре), наличие имён файлов с символами в верхнем регистре нас раздражает.&lt;br /&gt;&lt;br /&gt;Поскольку я слишком часто пользовался командой mv и ввод команд типа mv FILE.TXT file.txt меня окончательно изнурил, я написал этот сценарий. Я думал, что я просто сделал косметический ремонт, но на самом деле сценарий делает работу и в нём легко разобраться. (Номера строк приведены просто для того, чтобы на них ссылаться.)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; 1   #!/bin/sh&lt;br /&gt; 2   # lowerit&lt;br /&gt; 3   # преобразовывает имена всех файлов в текущем каталоге к нижнему регистру&lt;br /&gt; 4   # работает только над обычными файлами -- не меняет имена каталогов&lt;br /&gt; 5   # запрашивает подтверждение перед заменой существующего файла&lt;br /&gt; 6   for x in `ls`&lt;br /&gt; 7   do&lt;br /&gt; 8     if [ ! -f $x ]; then&lt;br /&gt; 9       continue&lt;br /&gt;10     fi&lt;br /&gt;11     lc=`echo $x | tr '[A-Z]' '[a-z]'`&lt;br /&gt;12     if [ $lc != $x ]; then&lt;br /&gt;13       mv -i $x $lc&lt;br /&gt;14     fi&lt;br /&gt;15   done&lt;/pre&gt;&lt;br /&gt;Строка 6 начинает цикл (который заканчивается в строке 15). Команда ls возвращает список имён файлов, которые последовательно назначаются переменной оболочки x. if test (строки с 8 по 10) проверяет, является ли имя текущего файла именем простого файла. Если нет, остаток выражения в текущего прохода цикла пропускается.&lt;br /&gt;&lt;br /&gt;Если выполняется строка 11, то известно, что обрабатывается обычный файл. С помощью tr мы приводим имя файла в нижний регистр и присваиваем новое имя переменной оболочки lc. Затем в строке 12 происходит проверка, что имя файла в нижнем регистре отличается от исходного. Если это так, то выполняется 13 строка, которая меняет исходное имя файла на новое имя в нижнем регистре. Опция -i заставляет mv спрашивать подтверждение, если команда собирается перезаписать существующий файл.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Фил Хьюз (Phil Hughes)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-2237870665139419497?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/2237870665139419497/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=2237870665139419497' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2237870665139419497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2237870665139419497'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/blog-post.html' title='Преобразовать имена файлов к нижнему регистру'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-3407324121738562167</id><published>2010-08-04T12:20:00.004+06:00</published><updated>2010-08-04T12:29:53.950+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='перевод'/><title type='text'>Проверка правильности IP-адресов из сценария Bash</title><content type='html'>Перевод статьи: &lt;a href="http://www.linuxjournal.com/content/validating-ip-address-bash-script"&gt;Validating an IP Address in a Bash Script&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;26 июня 2008, Митч Фрэзер (Mitch Frazier)&lt;br /&gt;&lt;br /&gt;Я часто пишу об использовании массивов bash и о регулярных выражениях bash, поэтому решил привести более полезный пример их использования для проверки правильности IP-адресов.&lt;br /&gt;&lt;br /&gt;Задача очевидна: IP-адреса являются 32-битными значениями, записанными как четыре числа (отдельные байты IP-адреса), разделённых точками. Каждое из четырёх чисел может принимать значение в диапазоне от 0 до 255.&lt;br /&gt;&lt;br /&gt;Следующий сценарий bash содержит функцию, которая возвращает истину, если её передан правильный IP-адрес и ложь в противном случае. В bash под истиной понимают завершение с нулевым кодом, всё остальное означает ложь. Код команды/функции bash помещается в переменную "$?".&lt;br /&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;# Проверка правильности IP-адреса:&lt;br /&gt;# Способ применения:&lt;br /&gt;#      valid_ip IP_АДРЕС&lt;br /&gt;#      if [[ $? -eq 0 ]]; then echo good; else echo bad; fi&lt;br /&gt;#   ИЛИ&lt;br /&gt;#      if valid_ip IP_ADDRESS; then echo good; else echo bad; fi&lt;br /&gt;#&lt;br /&gt;function valid_ip()&lt;br /&gt;{&lt;br /&gt;    local ip=$1&lt;br /&gt;    local stat=1&lt;br /&gt;&lt;br /&gt;    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then&lt;br /&gt;        OIFS=$IFS&lt;br /&gt;        IFS='.'&lt;br /&gt;        ip=($ip)&lt;br /&gt;        IFS=$OIFS&lt;br /&gt;        [[ ${ip[0]} -le 255 &amp;&amp; ${ip[1]} -le 255 \&lt;br /&gt;            &amp;&amp; ${ip[2]} -le 255 &amp;&amp; ${ip[3]} -le 255 ]]&lt;br /&gt;        stat=$?&lt;br /&gt;    fi&lt;br /&gt;    return $stat&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# При непосредственном запуске выполним несколько проверок.&lt;br /&gt;if [[ "$(basename $0 .sh)" == 'valid_ip' ]]; then&lt;br /&gt;    ips='&lt;br /&gt;        4.2.2.2&lt;br /&gt;        a.b.c.d&lt;br /&gt;        192.168.1.1&lt;br /&gt;        0.0.0.0&lt;br /&gt;        255.255.255.255&lt;br /&gt;        255.255.255.256&lt;br /&gt;        192.168.0.1&lt;br /&gt;        192.168.0&lt;br /&gt;        1234.123.123.123&lt;br /&gt;        '&lt;br /&gt;    for ip in $ips&lt;br /&gt;    do&lt;br /&gt;        if valid_ip $ip; then stat='good'; else stat='bad'; fi&lt;br /&gt;        printf "%-20s: %s\n" "$ip" "$stat"&lt;br /&gt;    done&lt;br /&gt;    fi&lt;/pre&gt;&lt;br /&gt;Если сохранить этот сценарий под именем "valid_ip.sh" и запустить его напрямую, он проведёт несколько проверок и выведет результаты:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  # sh valid_ip.sh&lt;br /&gt;  4.2.2.2             : good&lt;br /&gt;  a.b.c.d             : bad&lt;br /&gt;  192.168.1.1         : good&lt;br /&gt;  0.0.0.0             : good&lt;br /&gt;  255.255.255.255     : good&lt;br /&gt;  255.255.255.256     : bad&lt;br /&gt;  192.168.0.1         : good&lt;br /&gt;  192.168.0           : bad&lt;br /&gt;  1234.123.123.123    : bad&lt;/pre&gt;&lt;br /&gt;В функции valid_ip, чтобы удостовериться в том, что рассматриваемый IP-адрес состоит из четырёх разделённых точками чисел, используется регулярное выражение в операторе if:&lt;br /&gt;&lt;pre&gt;  if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then&lt;/pre&gt;&lt;br /&gt;Если проверка пройдена, код внутри оператора if разделяет рассматриваемый IP-адрес на четыре части по точкам и помещает части в массив:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  OIFS=$IFS&lt;br /&gt;  IFS='.'&lt;br /&gt;  ip=($ip)&lt;br /&gt;  IFS=$OIFS&lt;/pre&gt;&lt;br /&gt;Эти действия меняют переменную bash, которая называется "внутренний разделитель полей" (Internal Field Separator). Обычно она используется для обработки слов, разделённых пробелами, по после этого bash будет использовать для разделения полей точки. Поместим значение рассматриваемого IP-адреса внутрь скобок и присвоим их значение массиву, поместив каждое из полей, разделённых точками, в отдельную ячейку массива. Теперь проверим отдельные поля, чтобы удостовериться в том, что они меньше или равны 255. Результат проверки сохраним, так чтобы его можно было вернуть в качестве значения функции:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  [[ ${ip[0]} -le 255 &amp;&amp; ${ip[1]} -le 255 \&lt;br /&gt;          &amp;&amp; ${ip[2]} -le 255 &amp;&amp; ${ip[3]} -le 255 ]]&lt;br /&gt;  stat=$?&lt;/pre&gt;&lt;br /&gt;Отметим, что не обязательно проводить проверку равно ли число нулю или оно больше нуля, так как проверка регулярным выражением уже отфильтровала всё, что не состоит из точек и цифр.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Митч Фрэзер (Mitch Frazier) является помощником редактора в Linux Journal и веб-редактором в linuxjournal.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-3407324121738562167?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/3407324121738562167/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=3407324121738562167' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3407324121738562167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3407324121738562167'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/08/ip-bash.html' title='Проверка правильности IP-адресов из сценария Bash'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-3778004929289480608</id><published>2010-07-25T20:20:00.003+06:00</published><updated>2010-07-25T20:58:20.877+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quake2'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Quake2 на Debian GNU/Linux</title><content type='html'>Ранее я уже писал про то, как можно запустить Quake в Linux:&lt;br /&gt;1. &lt;a href="http://vladimir-stupin.blogspot.com/2009/01/quake-linux.html"&gt;Quake в Linux&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://vladimir-stupin.blogspot.com/2009/01/quake-nexuiz.html"&gt;Запуск Quake на движке Nexuiz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Запуск Quake 3 тоже не представляет проблем, если воспользоваться для этого игрой OpenArena.&lt;br /&gt;&lt;br /&gt;Вот чего мне до сих пор не удавалось, так это приличным образом запустить в Debian любимый мной Quake 2, который во времена студенчества мы с тремя моими друзьями перевели на русский язык. Но теперь я нашёл готовые deb-пекеты для установки Quake 2 в Debian: &lt;a href="http://www.yamagi.org/quake2/"&gt;Yamagi Quake II Client&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для установки Quake 2 скачиваем три пакета вот отсюда &lt;a href="http://www.yamagi.org/quake2/debian.html"&gt;Debian packages of Yamagi Quake II&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;$ wget http://deponie.yamagi.org/quake2/debs/i386/yamagi-quake2_2.11-1_i386.deb&lt;br /&gt;$ wget http://deponie.yamagi.org/quake2/debs/all/quake2-data_16_all.deb&lt;br /&gt;$ wget http://deponie.yamagi.org/quake2/debs/i386/yamagi-quake2-addons_1.1_i386.deb&lt;/pre&gt;&lt;br /&gt;И незамедлительно устанавливаем их:&lt;br /&gt;&lt;pre&gt;# dpkg -i yamagi-quake2_2.11-1_i386.deb&lt;br /&gt;# dpkg -i quake2-data_16_all.deb&lt;br /&gt;# dpkg -i yamagi-quake2-addons_1.1_i386.deb&lt;/pre&gt;&lt;br /&gt;Теперь достаём с полки диск с Quake 2 и копируем содержимое каталога baseq2 в каталог /usr/share/games/quake2/baseq2. Достаточно скопировать только файл pak0.pak:&lt;br /&gt;&lt;pre&gt;# cp /cdrom/BASEQ2/PAK0.PAK /usr/share/games/quake2/baseq2/pak0.pak&lt;/pre&gt;&lt;br /&gt;И запускаем:&lt;br /&gt;&lt;pre&gt;$ yamagiq2&lt;/pre&gt;&lt;br /&gt;Как всегда, без ложки дёгтя в бочке мёда не обходится.&lt;br /&gt;&lt;br /&gt;Во-первых, для работы quake2 необходимо наличие в системе пакетов libogg0 (&gt;= 1.1.3), libsdl1.2debian (&gt;= 1.2.10-1), libvorbis0a (&gt;= 1.1.2), libvorbisfile3 (&gt;= 1.1.2), zlib1g (&gt;= 1:1.2.1). Проверяем наличие нужных пакетов и устанавливаем недостающие.&lt;br /&gt;&lt;br /&gt;Во-вторых, звук в игре по непонятной мне причине немного заикается и хрипит. Как я ни пытался улучшить звук, ничего особого не получилось. С помощью следующей команды:&lt;br /&gt;&lt;pre&gt;$ yamagiq2 +s_khz 44 +s_loadas8bit 0 +snd_restart&lt;/pre&gt;&lt;br /&gt;Удалось лишь немного улучшить качество звука в те моменты, когда он не заикается и не хрипит. Но заикаться и хрипеть от этого он всё равно не перестал.&lt;br /&gt;&lt;br /&gt;И ещё - для запуска игры необходимо наличие видеокарты, поддерживающей аппаратное ускорение OpenGL. Поддержка программной отрисовки из этого пакета была нещадно выпилена.&lt;br /&gt;&lt;br /&gt;Из приятного можно отметить следующее:&lt;br /&gt;&lt;br /&gt;1. Можно играть не только в классический Quake 2, но и в его моды Reckoning от Xatrix и Ground Zero от Rogue.&lt;br /&gt;&lt;br /&gt;2. Можно слушать музыку с компакт-диска без компакт-диска, благо в состав пакета входит скрипт, который может снять треки с диска, закодировать их в OGG/Vorbis и положить на жёсткий диск, откуда и можно в дальнейшем воспроизводить треки.&lt;br /&gt;&lt;br /&gt;Для добавления модов скопируем каталоги с модами в соответствующее место, откуда их может взять движок игры.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# cp -R /home/stupin/quake2/Quake2Mods/RecKoning/xatrix /usr/share/games/quake2/&lt;br /&gt;# cp -R /home/stupin/quake2/Quake2Mods/GroundZero/rogue /usr/share/games/quake2/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь для запуска одного из модов можно воспользоваться следующими командами:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ yamagiq2 +s_khz 44 +s_loadas8bit 0 +snd_restart +set game xatrix&lt;br /&gt;$ yamagiq2 +s_khz 44 +s_loadas8bit 0 +snd_restart +set game rogue&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Для съёма треков с компакт-диска можно воспользоваться примером скрипта, находящимся в одном из пакетов с игрой: /usr/share/doc/yamagi-quake2/examples/cdripper.sh&lt;br /&gt;&lt;br /&gt;Ну и напоследок, снимок на память:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4d7KNUc1lVw/TExQmvAgT2I/AAAAAAAAA5M/H6bP6-RwtzE/s1600/quake3"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_4d7KNUc1lVw/TExQmvAgT2I/AAAAAAAAA5M/H6bP6-RwtzE/s320/quake3" border="0" alt=""id="BLOGGER_PHOTO_ID_5497857871496367970" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-3778004929289480608?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/3778004929289480608/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=3778004929289480608' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3778004929289480608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/3778004929289480608'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/07/quake2-debian-gnulinux.html' title='Quake2 на Debian GNU/Linux'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4d7KNUc1lVw/TExQmvAgT2I/AAAAAAAAA5M/H6bP6-RwtzE/s72-c/quake3' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8535603991778749917</id><published>2010-06-19T23:35:00.005+06:00</published><updated>2010-06-20T01:41:26.109+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ad'/><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><title type='text'>Миграция портала SharePoint Services в домен Active Directory</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Предупреждение.&lt;/span&gt; Всё нижеследующее вы можете использовать на свой страх и риск! Автор не несёт никакой ответственности за возможные риски: утерю информации, некорректное функционирование программного обеспечения и т.п.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Постановка задачи.&lt;/span&gt; Имеется веб-портал SharePoint Services 3.0, аутентификация пользователей в котором происходит по локальным учётным записям на самом сервере. Требуется ввести сервер в домен Active Directory и использовать для аутентификации на портале учётные записи из домена.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Получение информации об имеющихся на портале учётных записях&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Запускаем MS SQL Enterprise Manager, открываем базу данных WSS_Content. Информация о пользователях находится в таблице UserInfo. Запускаем из Enterprise Manager'а инструмент SQL Query Analyzer, в которм выполняем следующий запрос:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select tp_SystemID, tp_Login, tp_Title&lt;br /&gt;from UserInfo;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Полученную информацию копируем в таблицу Excel. В выбранных колонках находятся: SID пользователя, логин пользователя вместе с доменом в виде "ДОМЕН\Логин", строка описания пользователя. SID пользователя в базе данных хранится в двоичном виде, а Query Analyzer выводит его в шестнадцатеричном виде.&lt;br /&gt;&lt;br /&gt;После этого в таблице должны иметься следующие столбцы:&lt;br /&gt;A - шестнадцатеричный SID локальной учётной записи,&lt;br /&gt;B - логин локальной учётной записи,&lt;br /&gt;C - описание локальной учётной записи.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Добавляем в полученный список столбец с учётными записями пользователей из домена&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Каждой учётной записи, используемой для входа на портал, нужно сопоставить учётную запись из домена. Возможно, на этом этапе понадобится завести в домене учётные записи недостающих пользователей.&lt;br /&gt;&lt;br /&gt;После этого в таблице должны иметься следующие столбцы:&lt;br /&gt;A - шестнадцатеричный SID локальной учётной записи,&lt;br /&gt;B - логин локальной учётной записи,&lt;br /&gt;C - описание локальной учётной записи,&lt;br /&gt;D - логин доменной учётной записи.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Получение SID пользователей из домена&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Берём программу user2sid Евгения Рудного по ссылке &lt;a href="http://evgenii.rudnyi.ru/programming.html#sid2user"&gt;http://evgenii.rudnyi.ru/programming.html#sid2user&lt;/a&gt;. Копируем столбец D в текстовый файл, а в начале каждой строки добавляем команду user2sid. Копируем получившийся bat-файл в каталог с программой. Запускаем bat-файл, перенаправив вывод из него в другой текстовый файл. В полученном текстовом файле убираем всё, кроме SID'ов, так чтобы в каждой строчке файла было по одному SID'у. Информацию из текстового файла добавляем в столбец E файла Excel.&lt;br /&gt;&lt;br /&gt;После этого в таблице должны иметься следующие столбцы:&lt;br /&gt;A - шестнадцатеричный SID локальной учётной записи,&lt;br /&gt;B - логин локальной учётной записи,&lt;br /&gt;C - описание локальной учётной записи,&lt;br /&gt;D - логин доменной учётной записи,&lt;br /&gt;E - SID доменной учётной записи.&lt;br /&gt;&lt;br /&gt;Будьте внимательны! В списке должны присутствовать ровно столько SID'ов пользователей, сколько их имелось в первоначальном столбце. Также они должны следовать точно в таком же порядке, как в Excel-файле. Если что-то идёт не так, нужно поправить Excel-таблицу и bat-файл и повторить этот этап снова.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. Конвертирование доменных SID в шестнадцатеричный вид&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для понимания того, каким образом SID хранится в двоичном виде в системе, можно воспользоваться следующей статьёй: &lt;a href="http://www.selfadsi.org/deep-inside/microsoft-sid-attributes.htm"&gt;Microsoft Security Descriptor(SID)Attributes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Пишем на PHP сценарий для конвертирования SID:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?&lt;br /&gt;&lt;br /&gt;function swap($hexdword)&lt;br /&gt;{&lt;br /&gt;  $res = "";&lt;br /&gt;  for($i = 6; $i &gt;= 0 ; $i -= 2)&lt;br /&gt;    $res .= $hexdword[$i] . $hexdword[$i+1];&lt;br /&gt;  return $res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function sid2hex($sid)&lt;br /&gt;{&lt;br /&gt;  $sidl = explode("-", $sid);&lt;br /&gt;&lt;br /&gt;  $hex_sid = "0x" .&lt;br /&gt;             sprintf("%02X", $sidl[1]+0) .&lt;br /&gt;             sprintf("%02X", $sidl[2]+0) .&lt;br /&gt;             "000000000005";&lt;br /&gt;&lt;br /&gt;  for($i = 0; $i &lt; $sidl[2]; $i++)&lt;br /&gt;    $hex_sid .= swap(sprintf("%08X", $sidl[3+$i]+0));&lt;br /&gt;&lt;br /&gt;  return $hex_sid;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function hex2sid($hex_sid)&lt;br /&gt;{&lt;br /&gt;  $hex_sid = trim($hex_sid);&lt;br /&gt;  $sidl[0] = "S";&lt;br /&gt;  $sidl[1] = hexdec(substr($hex_sid, 2, 2));&lt;br /&gt;&lt;br /&gt;  $sidl[2] = hexdec(substr($hex_sid, 4, 2));&lt;br /&gt;&lt;br /&gt;  for($i = 0; $i &lt; $sidl[2]; $i++)&lt;br /&gt;    $sidl[3+$i] = hexdec(swap(substr($hex_sid, 18+$i*8, 8)));&lt;br /&gt;&lt;br /&gt;  $sid = implode("-", $sidl);&lt;br /&gt;  return $sid;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$sids = "S-1-5-21-583367659-4273102991-479599032-4176&lt;br /&gt;S-1-5-21-583367659-4273102991-479599032-4450";&lt;br /&gt;&lt;br /&gt;$sidsl = explode("\n", $sids);&lt;br /&gt;&lt;br /&gt;foreach ($sidsl as $sid)&lt;br /&gt;  echo sid2hex($sid) . "&amp;lt;br&amp;gt;";&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Для того, чтобы быть уверенным в правильности написанных функций, я написал их пару. Проверив, что преобразование SID в шестнадцатеричный вид и обратно, не искажает его, я удостоверился, что функции написаны правильно.&lt;br /&gt;&lt;br /&gt;В вышеприведённом сценарии я оставил только пару SID'ов. Вам следует вставить на место этих двух SID'ов содержимое столбца E. Полученный после выполнения сценария результат нужно скопировать в столбец F. &lt;br /&gt;&lt;br /&gt;После этого в таблице должны иметься следующие столбцы:&lt;br /&gt;A - шестнадцатеричный SID локальной учётной записи,&lt;br /&gt;B - логин локальной учётной записи,&lt;br /&gt;C - описание локальной учётной записи,&lt;br /&gt;D - логин доменной учётной записи,&lt;br /&gt;E - SID доменной учётной записи,&lt;br /&gt;F - шестнадцатеричный SID доменной учётной записи.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5. Получение SQL-запросов для миграции портала на доменные учётные записи&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Забегая вперёд, я хочу сказать, что обнаружил в базе данных ещё одну таблицу, в которой упоминаются логины пользователей. Эти логины не используются для проверки входа пользователей, они используются лишь для вывода информации о пользователе. Можно не менять их - в конце концов мы занимаемся не вполне чистым делом, а грязным хаком, а можно поменять, чтобы несоответствие реального логина и информации о логине не бросалось в глаза. итак, эта информация находилась в таблице AllUserData в поле nvarchar3.&lt;br /&gt;&lt;br /&gt;Теперь мы можем написать в Excel'е формулы, которые сгенерируют нам SQL-запросы, необходимые для внесения необходимых изменений в БД SharePoint Services.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;G ="update UserInfo set tp_Login = '" &amp; D2 &amp;"', tp_SystemID = " &amp; F2 &amp; " where tp_Login = '" &amp; B2 &amp;"' "&lt;br /&gt;&lt;br /&gt;H ="update AllUserData set nvarchar3 = '" &amp; D2 &amp;"' where nvarchar3 = '" &amp; B2 &amp;"' "&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Чтобы не бросаться голой задницей на амбразуру, подготовим SQL-запросы для отката навороченного:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;I ="update UserInfo set tp_Login = '" &amp; B2 &amp;"', tp_SystemID = " &amp; A2 &amp; " where tp_Login = '" &amp; D2 &amp;"' "&lt;br /&gt;&lt;br /&gt;J ="update AllUserData set nvarchar3 = '" &amp; B2 &amp;"' where nvarchar3 = '" &amp; D2 &amp;"' "&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;После этого в таблице должны иметься следующие столбцы:&lt;br /&gt;A - шестнадцатеричный SID локальной учётной записи,&lt;br /&gt;B - логин локальной учётной записи,&lt;br /&gt;C - описание локальной учётной записи,&lt;br /&gt;D - логин доменной учётной записи,&lt;br /&gt;E - SID доменной учётной записи,&lt;br /&gt;F - шестнадцатеричный SID доменной учётной записи,&lt;br /&gt;G - SQL-запрос для обновления информации в таблице UserInfo,&lt;br /&gt;H - SQL-запрос для обновления информации в таблице AllUserData,&lt;br /&gt;I - SQL-запрос для отката обновления таблицы UserInfo,&lt;br /&gt;J - SQL-запрос для отката обновления таблицы AllUserData.&lt;br /&gt;&lt;br /&gt;Создаём два текстовых файла - update.txt и rollback.txt. В первый копируем столбцы G и H, а во второй - I и J.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;6. Миграция&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для миграции нужно выделить перерыв обслуживания примерно в 15 минут. За это время можно будет выполнить SQL-запросы из файла update.txt и ввести компьютер в домен. На случай если что-то пойдёт не так, лучше увеличить паузу до 30 минут, чтобы вывести компьютер из домена и выполнить SQL-запросы из файла rollback.txt.&lt;br /&gt;&lt;br /&gt;На случай же если же что-то пойдёт совсем не так, следует заготовить резервную копию базы данных. Перед снятием резервной копии нужно перевести базу данных портала в режим "Только чтение" через "Центр администрирования" SharePoint Services, вкладку "Управление приложениями", пункт "Квоты и блокировки семейства узлов", а затем снять резервную копию средствами MS SQL Enterprise Manager. После восстановления следует не забыть восстановить режим "Нет блокировки".&lt;br /&gt;&lt;br /&gt;Я выполнял обновление из дома, глубоким вечером, разумеется проработав в рабочее время сценарий миграции и текстовые файлы с SQL-запросами.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;7. Кое-что ещё&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Дополнительно, я поменял учётную запись администратора SharePoint Services в "Центре администрирования" на доменную. Поменял я её в базе данных SharePoint_Admincontent_многобукв в таблицах AllUserData и UserInfo. Это уже не столь критично и не столь сложно. Администраторов мало и они, в отличие от пользователей, могут выдержать и больший перерыв в обслуживании.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8535603991778749917?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8535603991778749917/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8535603991778749917' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8535603991778749917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8535603991778749917'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/06/sharepoint-services-active-directory.html' title='Миграция портала SharePoint Services в домен Active Directory'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-6528721432477813073</id><published>2010-06-18T12:35:00.005+06:00</published><updated>2010-06-20T02:04:39.517+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ad'/><title type='text'>Применение групповых политик</title><content type='html'>На днях боролся с групповыми политиками Active Directory.&lt;br /&gt;&lt;br /&gt;У нас на работе действует стандарт по обеспечению безопасности, предписывающий использовать сложные длинные пароли и периодически менять их (конкретные требования в этом изложении роли не играют). В то же время, есть несколько служебных учётных записей, которые используются большим количеством людей. Например, для доступа к порталу Share Point из агентств, используются учётные записи agent и readonly. Эти учётные записи имеют простые пароли, совпадающие с именем пользователя.&lt;br /&gt;&lt;br /&gt;Сейчас эти учётные записи заведены на том же компьютере, где установлен Share Point. Этот компьютер не введён в домен. Чтобы упростить жизнь людям, хочется использовать учётные записи из домена Active Directory. Люди, работающие под той же учётной записью, под которой они входят на портал, смогли бы больше не задумываться о пароле и автоматически попадать на портал под своей учётной записью. Пароль личной учётной записи постоянно менялся бы синхронно со сменой пароля "на вход в компьютер", чем достигалась бы повышенная безопасность.&lt;br /&gt;&lt;br /&gt;Перед вводом сервера в домен и переводом портала на использование учётных записей из Active Directory нужно завести недостающих пользователей портала в домене. Как минимум, это учётные записи agent и readonly, обладающие простыми паролями. Соответственно, для того, чтобы их можно было завести с теми же паролями, необходимо смягчить политику безопасности паролей. Для этого я создал в Active Directory новое подразделение, для которого создал новую групповую политику "Простые пароли". Я применил её к подразделению, и попробовал завести пользователей. Но пользователей завести не удалось, т.к. их пароли не удовлетворяли требованиям безопасности.&lt;br /&gt;&lt;br /&gt;Я посмотрел результирующую групповую политику и увидел следующее:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4d7KNUc1lVw/TBsP0lD_54I/AAAAAAAAA3w/9bbhC1NGc60/s1600/resgp.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 84px;" src="http://3.bp.blogspot.com/_4d7KNUc1lVw/TBsP0lD_54I/AAAAAAAAA3w/9bbhC1NGc60/s320/resgp.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5483994367230207874" /&gt;&lt;/a&gt;&lt;br /&gt;При просмотре любого из параметров в окошке свойств параметра выводится следующий текст:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4d7KNUc1lVw/TBsQIikXoMI/AAAAAAAAA34/SksU7U67Sds/s1600/prioritygp.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 253px;" src="http://3.bp.blogspot.com/_4d7KNUc1lVw/TBsQIikXoMI/AAAAAAAAA34/SksU7U67Sds/s320/prioritygp.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5483994710158057666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Цитирую, чтобы мой пост легче находился поиском: "GPO, расположенные выше, имеют более высокий приоритет. Процессор обработки политики не пытался настроить параметр. Дополнительная информация приведена в %windir%\security\logs\winlogon.log на целевом компьютере."&lt;br /&gt;&lt;br /&gt;Я долго искал в интернете ответ на вопрос почему это не работает. В конце концов вышел на обсуждение &lt;a href="http://social.technet.microsoft.com/forums/ru-RU/windowsserverru/thread/19901270-3a2e-40c3-9194-ee6c81734052"&gt;Применение групповых политик&lt;/a&gt;, где нашёл следующий ответ:&lt;br /&gt;&lt;i&gt;&lt;quote&gt;&lt;br /&gt;Дело в том, что политика паролей (как и все политики учетных записей) применяется к доменным учетным записям, которые находятся на контроллерах домена, а не на рабочих станциях. Поэтому всякие запреты наследования бесполезны, т.к. применяются не там.&lt;br /&gt;&lt;br /&gt;К сожалению, невозможно предложить что-либо разумное, не создавая отдельный домен. Разве что внедрить для группы пользователей аутентификацию по смарт-картам - руководству обычно это нравится.&lt;br /&gt;&lt;br /&gt;Вы можете назначить иную политику паролей на уровне OU, но она будет применяться только к локальным учетным записям пользователей, которые могут быть определены на компьютерах, входящих в данную OU. К доменным пользователям применяется единая политика паролей, определенная на уровне домена.&lt;br /&gt;&lt;br /&gt;Так что ваша задача не имеет решения в рамках одного домена.&lt;br /&gt;&lt;/quote&gt;&lt;/i&gt;&lt;br /&gt;Поясню простыми словами. Ограничить требования к безопасности паролей можно только в политике компьютера. Политика компьютера применяется к учётным записям, хранящимся на самом компьютере, то есть к локальным учётным записям этого компьютера. Единственными компьютерами, на которых хранятся доменные учётные записи пользователей, являются контроллеры домена. Поэтому политика безопасности паролей по отношению к доменным учётным данным едина.&lt;br /&gt;&lt;br /&gt;Причём отвечающие говорят об этом, как о достаточно известном fuck'те. Как я понимаю, обойти это можно только поменяв быстренько, пока никто не заметил, политику безопасности, завести нужных пользователей или поменять пароли, а затем так же быстро и незаметно вернуть прежнюю политику =D Вам смешно? Мне тоже. Хотя для кое-кого, это всё было бы смешно, если бы не было столь грустно. Например, для тех, кто не имеет возможности поменять политику домена - для администраторов подразделений.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-6528721432477813073?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/6528721432477813073/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=6528721432477813073' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/6528721432477813073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/6528721432477813073'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/06/blog-post.html' title='Применение групповых политик'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4d7KNUc1lVw/TBsP0lD_54I/AAAAAAAAA3w/9bbhC1NGc60/s72-c/resgp.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-785275113864186971</id><published>2010-06-10T17:10:00.007+06:00</published><updated>2010-06-10T18:02:22.526+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cisco'/><category scheme='http://www.blogger.com/atom/ns#' term='freebsd'/><category scheme='http://www.blogger.com/atom/ns#' term='racoon'/><category scheme='http://www.blogger.com/atom/ns#' term='ipsec'/><title type='text'>Настройка IPSEC туннеля между Cisco и FreeBSD</title><content type='html'>Не очень люблю дублировать лишний раз информацию, поэтому просто сошлюсь на статью, по которой я настроил IPSec-туннель между Cisco и FreeBSD: &lt;a href="http://www.opennet.ru/base/cisco/cisco_freebsd_ipsec.txt.html"&gt;Настройка IPSEC туннеля между Cisco и FreeBSD&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;От себя лишь хочу добавить вот что.&lt;br /&gt;&lt;br /&gt;1. Если все соединения настроены по данной статье, тогда sainfo в конфигурации racoon будет везде совпадать. А это значит, что вместо повторения одной и той же секции, можно написать секцию sainfo один раз, заменив секции вида:&lt;br /&gt;&lt;pre&gt;sainfo subnet 10.5.3.0/24 any address 10.11.16.0/23 any {&lt;br /&gt;  pfs_group 2;&lt;br /&gt;  lifetime time 24 hour;&lt;br /&gt;  encryption_algorithm aes;&lt;br /&gt;  authentication_algorithm hmac_sha1;&lt;br /&gt;  compression_algorithm deflate;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;на одну секцию вида&lt;br /&gt;&lt;pre&gt;sainfo anonymous{&lt;br /&gt;  pfs_group 2;&lt;br /&gt;  lifetime time 24 hour;&lt;br /&gt;  encryption_algorithm aes;&lt;br /&gt;  authentication_algorithm hmac_sha1;&lt;br /&gt;  compression_algorithm deflate;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;2. Реальные таблицы маршрутизации бывают много сложнее выдуманных книжных.&lt;br /&gt;&lt;br /&gt;Во всех найденных мной статьях между собой связываются два не пересекающихся диапазона IP-адресов. Например, сети 192.168.0.0/24 и 172.16.1.0/25 или 10.0.1.0/24 и 10.0.2.0/24 и т.п.&lt;br /&gt;&lt;br /&gt;Но реальные ситуации могут оказаться гораздо сложнее. Например, на одном из маршрутизаторов под управлением FreeBSD могут оказаться три интерфейса:&lt;br /&gt;1. Интернет-интерфейс, через который идёт трафик по-умолчанию, и трафик на сеть 192.168.1.0/24,&lt;br /&gt;2. Локальный интерфейс, к которому подключена сеть 10.0.0.0/25,&lt;br /&gt;3. Некий дополнительный интерфейс, через который нужно направлять шифрованный трафик из локальной сети в сеть 192.168.0.0/16.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        LAN 10.0.0.0/25&lt;br /&gt;             |&lt;br /&gt;             |&lt;br /&gt;         ____|______&lt;br /&gt;        |           |&lt;br /&gt;        |  FreeBSD  |------&gt; Internet, LAN 192.168.1.0/24&lt;br /&gt;        |___________|&lt;br /&gt;             ||&lt;br /&gt;             || IPSec&lt;br /&gt;        _____||_____&lt;br /&gt;       |            |&lt;br /&gt;       |   Cisco    |&lt;br /&gt;       |____________|&lt;br /&gt;             |&lt;br /&gt;             |&lt;br /&gt;             |  &lt;br /&gt;       LAN 192.168.0.0/16      &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Что мы видим в этом случае? Два пересекающихся диапазона IP-адресов: 192.168.1.0/24 и 192.168.0.0/16. В файле ipsec.conf FreeBSD можно указать лишь сети, для которых будет осуществляться шифрование, но нельзя указать интерфейс, для которого действует это правило. В итоге может получиться, что будет шифроваться весь трафик из сети 10.0.0.0/25 в сеть 192.168.0.0/16, &lt;b&gt;включая&lt;/b&gt; трафик на сеть 192.168.1.0/24, уходящий через Интернет-интерфейс, где никто не ожидает, что он будет зашифрован.&lt;br /&gt;&lt;br /&gt;Или другой подобный случай. Есть большая IPSec-сеть, в которой филиальные маршрутизаторы FreeBSD соединяются только с центральным офисом компании. Маршрутизаторов много, скажем три-четыре десятка, за каждым из них закреплён свой диапазон 10.0.x.0/24. Что делать, если к центральному офису будет подключен ещё один филиальный маршрутизатор? Нужно будет прописывать эту сеть в политики шифрования каждого из остальных филиальных маршрутизаторов? А не устанешь?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        LAN 10.0.x.0/24&lt;br /&gt;             |&lt;br /&gt;             |&lt;br /&gt;         ____|______&lt;br /&gt;        |           |&lt;br /&gt;        |  FreeBSD  |&lt;br /&gt;        |  10.1.0.x |&lt;br /&gt;        |___________|&lt;br /&gt;             ||&lt;br /&gt;             || IPSec&lt;br /&gt;        _____||_____           ___________&lt;br /&gt;       |            |         |           |&lt;br /&gt;       |   Cisco    |  IPSec  |  FreeBSD  |&lt;br /&gt;       |  10.1.0.1  |=========| 10.1.0.y  |--------LAN 10.0.y.0/24&lt;br /&gt;       |____________|         |___________|&lt;br /&gt;             ||&lt;br /&gt;             || IPSec&lt;br /&gt;         ____||_____&lt;br /&gt;        |           |&lt;br /&gt;        |  FreeBSD  |&lt;br /&gt;        | 10.1.0.z  |&lt;br /&gt;        |___________|&lt;br /&gt;              |&lt;br /&gt;              |&lt;br /&gt;              |&lt;br /&gt;        LAN 10.0.z.0/24&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В таком случае было бы хорошо настроить на маршрутизаторах филиалов некое подобие маршрута по умолчанию. Например, прописать, что филиальный маршрутизатор должен шифровать трафик между сетями 10.0.0.0/8 в центральном офисе и 10.0.x.0/24 в филиале. Но если написать так в ipsec.conf, то маршрутизатор будет шифровать трафик между своей локальной сетью 10.0.x.0/24 и собой 10.0.x.1, поскольку его собственный адрес 10.0.x.1 формально тоже находится в "большой сети" 10.0.0.0/8. А ведь FreeBSD может быть не только маршрутизатором, а и, например, почтовым сервером. В таком случае почтой в локальной сети филиала пользоваться не смогут.&lt;br /&gt;&lt;br /&gt;Именно на такую ловушку я и попался. Хорошо, что я перед настройкой на реальном оборудовании собрал тестовый стенд, на котором и выявил такую проблему.&lt;br /&gt;&lt;br /&gt;В подобных случаях можно исключить некую подсеть из большой сети следующим образом:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;spdadd 10.0.8.0/24 10.0.8.0/24 any -P out none;&lt;br /&gt;spdadd 10.0.8.0/24 10.0.8.0/24 any -P in none;&lt;br /&gt;spdadd 10.0.8.0/24 10.0.0.0/8 any -P out ipsec esp/tunnel/10.1.0.8-10.1.0.1/unique;&lt;br /&gt;spdadd 10.0.0.0/8 10.0.8.0/24 any -P in ipsec esp/tunnel/10.1.0.1-10.1.0.8/unique;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В этом примере мы исключаем из шифрования сети 10.0.0.0/8 подсеть 10.0.8.0/24.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-785275113864186971?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/785275113864186971/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=785275113864186971' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/785275113864186971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/785275113864186971'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/06/ipsec-cisco-freebsd.html' title='Настройка IPSEC туннеля между Cisco и FreeBSD'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-6399166907232544592</id><published>2010-05-30T02:32:00.009+06:00</published><updated>2010-05-30T16:10:47.729+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><title type='text'>Недостатки инициализации сети в CentOS</title><content type='html'>На днях пытался настроить сеть в CentOS по образу и подобию того, как я делал это ранее в статьях &lt;a href="http://vladimir-stupin.blogspot.com/2009/01/vpn.html"&gt;Два VPN-подключения к Уфанет&lt;/a&gt; и &lt;a href="http://vladimir-stupin.blogspot.com/2009/04/vpn-ethernet.html"&gt;VPN-подключение к Уфанет и локальные ресурсы через Ethernet&lt;/a&gt;. Попробовал и понял: приличных средств для реализации такой настройки нет.&lt;br /&gt;&lt;br /&gt;Для начала - у меня на компьютере имеются два интерфейса Ethernet, определились они под именами eth0 и eth1, как и положено. Только вот мне вдруг невтерпёж захотелось их поменять именами. Сказано - сделано, в RedHat и им подобным (включая CentOS) для привязки интерфейса к MAC-адресу кошерно использовать не udevd, а опцию HWADDR. Прописал необходимое значение этой опции в файлах /etc/sysconfig/network-scripts/ifcfg-eth0 и /etc/sysconfig/network-scripts/ifcfg-eth1. Попытки применить настройки скриптами инициализации сети и udev ни к чем не привели, поэтому пришлось перезагрузиться. После перезагрузки интерфейсы получили необходимые имена.&lt;br /&gt;&lt;br /&gt;К слову, смена MAC-адреса на сетевой карте осуществляется с помощью опции MACADDR, но совместное использование HWADDR и MACADDR не допускается, т.к. может привести к непредсказуемым последствиям. То ли дело в Debian, где привязки имён интерфейсов к MAC-адресам осуществляются автоматически с помощью udev, а для смены привязок достаточно отредактировать уже имеющиеся правила. Для смены MAC-адреса в файле /etc/network/interfaces можно прописать опцию hwaddress ether XX:XX:XX:XX:XX:XX, а для надёжности, чтобы udevd не присвоил интерфейсу с этим MAC-адресом другое имя интерфейса, скопипастить одно правило udevd, прописав в него новый MAC-адрес, так что интерфейс с этими MAC-адресами будет иметь одно и то же имя.&lt;br /&gt;&lt;br /&gt;Далее, хотел отключить прописывание маршрута по умолчанию, полученного по DHCP с помощью опции DHCLIENT_IGNORE_GATEWAY=yes. Игнорировать маршрут от DHCP? Отвечаем "да". Как бы не так. Я не сразу понял, почему оно не работает, а не работает оно из-за бага: &lt;a href="http://bugs.centos.org/view.php?id=4201"&gt;/sbin/dhclient-script gets DHCLIENT_IGNORE_GATEWAY test backwards&lt;/a&gt;, который зарепорчен аж 16 февраля 2010 года, да ещё и актуальной в тот момент версией CentOS была 5.4, а я обнаружил этот баг в 5.5. Может не хотят исправлять ради сохранения совместимости с Enterprise-системой от Red Hat? Это, дескать, не баг, а фича.&lt;br /&gt;&lt;br /&gt;Далее. Для настройки собственных маршрутов и правил маршрутизации можно создавать файлы /etc/sysconfig/network-scripts/route-* и /etc/sysconfig/network-scripts/rule-*. При чём для файла маршрутов есть два формата: устаревший и актуальный. Устаревшим считается формат, в котором можно было прописывать команды ip route, а новым - жалкие пронумерованные по порядку переменные     ADDRESSn, NETMASKn, GATEWAYn. Захотел в новом формате удалить или закомментировать какой-нибудь маршрут из середины, как перед тобой встаёт выбор: либо все следующие маршруты перестанут работать, либо тебе нужно перенумеровать все оставшиеся маршруты так, чтобы их нумерация не прерывалась и шла строго по порядку.&lt;br /&gt;&lt;br /&gt;Казалось бы - наплюй на этот новый формат, да воспользуйся вменяемым старым. Но нет! Я хотел написать нечто такое:&lt;br /&gt;&lt;pre&gt;81.30.176.0/20 via $GATEWAY dev $DEVICE src $IPADDR table main&lt;/pre&gt;&lt;br /&gt;а в правила - нечто такое:&lt;br /&gt;&lt;pre&gt;from $IPADDR table lunlim&lt;/pre&gt;&lt;br /&gt;думая, что переменные $GATEWAY, $IPADDR, $DEVICE должны быть определены и взяты либо из файла /etc/sysconfig/network-scripts/ifcfg-eth0, либо получены по DHCP. Нет! Этих переменных там нет!&lt;br /&gt;&lt;br /&gt;Ну что я могу сказать? Это Enterprise, детка. Для настройки маршрутов используются графические конфигурялки, баги признают фичами, а в скриптах не допускается самодеятельность, дабы не ввести в заблуждение железобетонную логику системы. Всё как у военных - строго по уставу, не важно что квадратное приходится катать, а круглое таскать.&lt;br /&gt;&lt;br /&gt;Может среди прочитавших эту заметку попадутся знатоки Red Hat, CentOS и Fedora? Люди, будьте добры, подскажите, можно ли сделать то, что я хочу, какими-нибудь простыми средствами?&lt;br /&gt;&lt;br /&gt;Видимо придётся воспользоваться для настройки маршрутов всё теми-же нестандартными скриптами dhcp-клиента и скриптами /etc/ppp/ip-up.local и /etc/ppp/ip-down.loclal.&lt;br /&gt;&lt;br /&gt;Источники:&lt;br /&gt;1. &lt;a href="http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/ref-guide/s1-networkscripts-interfaces.html"&gt;Interface Configuration Files&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://content.hccfl.edu/pollock/AUnix1/SysconfigFilesDesc.txt"&gt;Files in /etc/sysconfig&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://www.n-ix.com/ipesin/2009/05/%D0%BA%D0%B0%D0%BA-%D0%B8%D0%B7%D0%B1%D0%B5%D0%B6%D0%B0%D1%82%D1%8C-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8/"&gt;Как избежать неправильной нумерации сетевых карт в системах Red Hat Enterprise Linux с несколькими сетевыми интерфейсами?&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://www.n-ix.com/ipesin/2009/06/%d0%ba%d0%b0%d0%ba-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b8%d1%82%d1%8c-%d0%b4%d0%be%d0%bf%d0%be%d0%bb%d0%bd%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d0%bc%d0%b0%d1%80%d1%88%d1%80%d1%83/"&gt;Как настроить дополнительные маршруты в Red Hat Enterprise Linux?&lt;/a&gt;&lt;br /&gt;5. &lt;a href="http://habrahabr.ru/blogs/linux/47230/"&gt;Настройка сети в Linux через конфиг-файлы, ч.1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Дополнение от 30 мая 2010.&lt;br /&gt;&lt;br /&gt;При попытке настроить нестандартный скрипт dhclient наступил на selinux, ударивший меня в лоб: он запрещал dhclient'у обращаться к каким-то левым, по мнению selinux, файлам. Разбираться с политиками selinux я не стал и просто отключил его. dhclient после этого сработал нормально. Прописал все настройки pptp, скрипты для добавления и удаления маршрутов. Попытался поднять соединение и обломился: про pptp-клиент я-то забыл. Ну, думаю, сейчас из репов поставлю и всё нормально. Поискал в репах, а pptp-клиента нет! Вот чёрт, опять Enterprise...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-6399166907232544592?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/6399166907232544592/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=6399166907232544592' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/6399166907232544592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/6399166907232544592'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/05/centos.html' title='Недостатки инициализации сети в CentOS'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-76035282178527006</id><published>2010-05-21T19:03:00.005+06:00</published><updated>2010-05-25T17:16:16.983+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Резервная копия настроек сервера</title><content type='html'>Всё написанное ниже ни в коем случае не стоит воспринимать как руководство к действию, это лишь информация к размышлению.&lt;br /&gt;&lt;br /&gt;Для резервного копирования настроек сервера можно использовать простенький скрипт, ежедневно отправляющий на почтовый ящик резервную копию настроек сервера (для отправки используется пакет biabam). Главное достоинство таких резервных копий - их малый объём, а процесса резервного копирования - очень высокая скорость. Сам скрипт может быть, например, таким:&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;DATE=`date "+%Y-%m-%d"`&lt;br /&gt;&lt;br /&gt;dpkg --get-selections &gt; /root/backups/dpkg.list&lt;br /&gt;mysqldump -u root --password=password --all-databases &gt; /root/backups/mysql.sql&lt;br /&gt;&lt;br /&gt;tar -cjvf /root/backup-$DATE.tbz --files-from=- &lt;&lt; END&lt;br /&gt;/etc//root/bin/&lt;br /&gt;/home/stupin/bin/&lt;br /&gt;/usr/local/bin/&lt;br /&gt;/var/cache/bind/&lt;br /&gt;/var/spool/cron/crontabs/&lt;br /&gt;/root/backups/dpkg.list&lt;br /&gt;/root/backups/mysql.sql&lt;br /&gt;END&lt;br /&gt;rm /root/backups/dpkg.list /root/backups/mysql.sql&lt;br /&gt;&lt;br /&gt;echo "This is a Backup of your Debian Server!!! Keep this!" |\&lt;br /&gt;   biabam /root/backup-`date "+%Y-%m-%d"`.tbz \&lt;br /&gt;   -s "Daily backup Debian Server Configs: $DATE" stupin@mydomain.ru&lt;br /&gt;rm /root/backup-$DATE.tbz&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Будьте осторожны, т.к. злоумышленник, получивший доступ к этому сообщению, фактически получает полный доступ к серверу.&lt;br /&gt;&lt;br /&gt;Файлик dpkg.list позволяет быстро установить все необходимые пакеты (перед этим лучше сначала перенести учётные записи).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;dpkg --set-selections &lt; dpkg.list&lt;br /&gt;apt-get dselect-upgrade&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Файлик mysql.sql позволяет быстро восстановить состояние БД mysql:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql -u root --password=password &lt; mysql.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Что делать с остальными файлами - я думаю вы догадаетесь сами. Можно, например, сделать rsync нужных каталогов:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rsync /root/backup/var/cache/bind/ /var/cache/bind/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Можно сделать rsync каталога /etc/, но тут стоит соблюдать осторожность. Если восстановление происходит на другом оборудовании, то как минимум не стоит бездумно копировать /etc/fstab и /etc/udev/. Если перенос осуществляется ещё и на другую систему, то стоит подумать также о том, можно ли безболезненно скопировать /etc/passwd и /etc/shadow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-76035282178527006?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/76035282178527006/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=76035282178527006' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/76035282178527006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/76035282178527006'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/05/blog-post.html' title='Резервная копия настроек сервера'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5939343623047439825</id><published>2010-01-09T18:01:00.004+05:00</published><updated>2010-01-20T19:26:42.160+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='exif'/><category scheme='http://www.blogger.com/atom/ns#' term='фото'/><title type='text'>Переименование фотографий по EXIF-тегам</title><content type='html'>В августе-сентябре прошлого года я ездил в отпуск в компании из пяти человек. На всю компанию было два цифровых фотоаппарата. Отдыхали в другом часовом поясе и в середине отпуска мне приспичило выставить на своём фотоаппарате второе время. По приезду из отпуска мы обменялись фотографиями. Я слил все фотографии в один каталог, попутно переименовав их в соответствии со временем из EXIF-тегов.&lt;br /&gt;&lt;br /&gt;Время на фотоаппаратах несколько различалось в начале поездки, поэтому итоговые фотографии были слегка перемешаны, к чему я был готов. Но вот что было неожиданным, так это то, что функция двойного времени на моём фотоаппарате не прописывала оба времени в снимок. Если задано одно время, то в EXIF-теги прописывалась информация о первом времени, а если заданы оба времени, то в EXIF-теги прописывалась информация из второго времени. Поэтому кроме небольшого перемешивания в начале, с некоторого момента фотографии с разных фотоаппаратов перемешались с разницей в 2 часа.&lt;br /&gt;&lt;br /&gt;Для начала я решил всё вернуть на место и разделить фотографии по фотоаппаратам. Один из фотоаппаратов прописывал в EXIF-теги название модели "Canon PowerShot A560", поэтому я выделил с помощью grep и xargs все фотографии с этого фотоаппарата в отдельный каталог:&lt;br /&gt;&lt;pre&gt;$ mkdir canon&lt;br /&gt;$ grep -Ul "Canon PowerShot A560" | xargs -n1 -I'{}' mv '{}' canon/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Оставшиеся фотографии были с первого фотоаппарата и я поместил их в другой каталог под именем olympus.&lt;br /&gt;&lt;br /&gt;Далее, просматривая фотографии, я сначала нашёл тот момент, когда я прописал второе время. А затем нашёл два практически одинаковых снимка, сделанных с разных фотоаппаратов, но в разных ракурсах. Так я узнал разницу в синхронизации часов - она составляла 36 секунд.&lt;br /&gt;&lt;br /&gt;Теперь о главном. В результате поиска инструмента, который бы мог перевести время в EXIF-тегах, я нашёл утилиту exiftool. Оказалось, что эта утилита не только умеет менять время в EXIF-тегах, но и умеет переименовывать фотографии в соответствии с тегами. Она также поддерживает редактирование не только EXIF-информации из JPEG-файлов, но и редактирование тегов музыкальных файлов, например MP3. Подробнее об утилите можно прочитать здесь: &lt;a href="http://www.sno.phy.queensu.ca/~phil/exiftool/"&gt;http://www.sno.phy.queensu.ca/~phil/exiftool/&lt;/a&gt;. Я же остановлюсь на тех полезных функциях, которые мне пригодились именно для решения моих проблем: корректировка времени в EXIF-тегах и переименование.&lt;br /&gt;&lt;br /&gt;Для начала поставим пакет с утилитой:&lt;br /&gt;&lt;pre&gt;# aptitude install libimage-exiftool-perl&lt;/pre&gt;&lt;br /&gt;Теперь, для корректировки времени можно воспользоваться следующей командой (сначала я скорректировал разницу в часах между двумя фотоаппаратами):&lt;br /&gt;&lt;pre&gt;$ exiftool "-AllDates-=0:0:0 0:0:36" olympus/moscow-time/&lt;br /&gt;$ exiftool "-AllDates-=0:0:0 0:0:36" olympus/ufa-time/&lt;/pre&gt;&lt;br /&gt;Потом я ещё раз скорректировал время (ликвидировав разницу в часовых поясах между снимками):&lt;br /&gt;&lt;pre&gt;$ exiftool "-AllDates+=0:0:0 2:0:0" olympus/moscow-time/&lt;/pre&gt;&lt;br /&gt;Знак плюс или минус говорит о том, нужно ли прибавить разницу к показаниям часов или отнять её. Следующие шесть цифр, разделённых двоеточиями и пробелами, указывают разницу в годах, месяцах, днях, часах, минутах и секундах.&lt;br /&gt;&lt;br /&gt;И так, теперь время во всех EXIF-тегах фотоснимков синхронизировано и нужно их переименовать. Раньше я это делал с помощью пакета exifprobe, в соответствии с этой статьёй: &lt;a href="http://strannick.blogspot.com/2007/03/blog-post.html"&gt;Цифровые фотографии. Наводим порядок.&lt;/a&gt; Однако exiftool оказался способен заменить эту статью одной строчкой:&lt;br /&gt;&lt;pre&gt;$ exiftool -r -d %Y%m%d-%H%M%S%%-c.jpg "-filename&amp;lt;DateTimeOriginal" .&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Опция -r означает, что фотографии нужно искать и в подкаталогах указанного каталога - рекурсивно.&lt;br /&gt;&lt;br /&gt;Строка %Y%m%d кодирует 4 цифры года, две цифры месяца, две цифры дня. Строка %H%M%S кодирует две цифры часов в 24-часовом формате, две цифры минут, две цифры секунд. Строка %%-c используется при наличии нескольких файлов с одинаковым именем, при повторах она добавляет знак минус и номер файла. Строка .jpg указывает расширение файла.&lt;br /&gt;&lt;br /&gt;Теперь все фотографии синхронизированы по времени, переименованы в соответствии с датой и временем, одновременно сделанные фотографии снабжены номером.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5939343623047439825?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5939343623047439825/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5939343623047439825' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5939343623047439825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5939343623047439825'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2010/01/exif.html' title='Переименование фотографий по EXIF-тегам'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5389310301527222356</id><published>2009-12-22T09:01:00.008+05:00</published><updated>2010-11-28T16:42:23.169+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='man'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='переводы'/><title type='text'>Легкий перевод страниц руководства с помощью po4a</title><content type='html'>Страницы руководства (man'ы) переводить тяжело. Ещё тяжелее поддерживать перевод в актуальном состоянии. Тяжело потому, что нужно изучать разметку по шаблону groff_man и при переводе нужно выискивать среди директив и управляющих последовательностей сам текст, который нужно перевести. Можно, конечно, сконвертировать страницу руководства в текстовый формат, перевести, а потом проставить разметку по аналогии с исходным текстом. Но представьте объём и муторность работы! Проделав всё это хотя бы раз с одним большим переводом, вы решите больше не заниматься этой неблагодарной работой.&lt;br /&gt;&lt;br /&gt;Примерно год назад я тоже попробовал сконвертировать несколько текстовых переводов в формат man вручную. Я попробовал, ужаснулся и решил больше этим не заниматься, а стал просто выкладывать переводы в wiki-систему: &lt;a href="http://manpages.ylsoftware.com"&gt;http://manpages.ylsoftware.com&lt;/a&gt;. Всё это время я надеялся на то, что когда-нибудь они кому-то пригодятся, если повезёт, то кто-нибудь возьмётся сконвертировать их в подобающий формат, отправит разработчикам соответствующих программ или ментейнерам и мои переводы попадут в дистрибутивы.&lt;br /&gt;&lt;br /&gt;Несколько месяцев назад я даже написал на PHP простенький конвертер из wiki-формата в man, но разметка некоторых кусков wiki-формата оставалась по-прежнему недоступной регэкспам конвертера и переводы всё-же необходимо было доводить до готовности вручную. Ещё один минус такого подхода заключается в том, что перевод не соответствует оригинальной странице руководства из дистрибутива и поддерживать его актуальность по-прежнему тяжело.&lt;br /&gt;&lt;br /&gt;Но теперь я нашёл великолепный пакет, с помощью которого можно с легкостью переводить и поддерживать актуальность переводов страниц руководства. Это пакет po4a - Portable Object For Anything. Он имеется в составе дистрибутива Debian и я считаю очень странным то, что о нём нет ни одного упоминания на русском языке (а англоговорящим людям этот пакет и не нужен). Поставим пакет:&lt;br /&gt;&lt;pre&gt;# aptitude install po4a&lt;/pre&gt;&lt;br /&gt;Этот пакет позволяет переводить тексты в следующих форматах:&lt;br /&gt;&lt;pre&gt;$ po4a-gettextize --help-format&lt;br /&gt;Список допустимых форматов:&lt;br /&gt;  - dia: несжатые диаграммы Dia.&lt;br /&gt;  - docbook: Docbook XML.&lt;br /&gt;  - guide: формат документации Gentoo Linux xml.&lt;br /&gt;  - ini: формат .INI.&lt;br /&gt;  - kernelhelp: описание каждого параметра компиляции ядра.&lt;br /&gt;  - latex: формат LaTeX.&lt;br /&gt;  - man: формат страниц руководства.&lt;br /&gt;  - pod: формат документации языка Perl.&lt;br /&gt;  - sgml: форматы debiandoc или docbook DTD.&lt;br /&gt;  - texinfo: формат страницы info.&lt;br /&gt;  - tex: обобщенные документы TeX (смотрите также latex).&lt;br /&gt;  - text: простой текстовый документ.&lt;br /&gt;  - wml: WML documents.&lt;br /&gt;  - xhtml: документы XHTML.&lt;br /&gt;  - xml: обобщенные документы XML (смотрите также docbook).&lt;/pre&gt;&lt;br /&gt;Перевод обычных файлов HTML не поддерживается, они обязательно должны быть приведены к формату XHTML.&lt;br /&gt;&lt;br /&gt;Приступим к созданию проекта перевода страниц руководства. Перво-наперво поставим пакет, страницы из которого мы будем переводить:&lt;br /&gt;&lt;pre&gt;# aptitude install pppoe&lt;/pre&gt;&lt;br /&gt;Теперь создадим каталог для проекта перевода:&lt;br /&gt;&lt;pre&gt;$ mkdir pppoe&lt;/pre&gt;&lt;br /&gt;Скопируем страницы руководства из системы в этот каталог и распакуем их:&lt;br /&gt;&lt;pre&gt;cd pppoe&lt;br /&gt;dpkg -L pppoe | grep man | xargs -I {} cp {} .&lt;br /&gt;gunzip *&lt;/pre&gt;&lt;br /&gt;Теперь напишем файл конфигурации проекта po4a.conf:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[po4a_langs] ru&lt;br /&gt;[po4a_paths] pppoe.pot ru:pppoe.ru.po&lt;br /&gt;[type: man] pppoe.8 ru:pppoe.ru.8 add_ru:pppoe.ru.8.add&lt;br /&gt;[type: man] pppoe-connect.8 ru:pppoe-connect.ru.8 add_ru:pppoe-connect.ru.8.add&lt;br /&gt;[type: man] pppoe-start.8 ru:pppoe-start.ru.8 add_ru:pppoe-start.ru.8.add&lt;br /&gt;[type: man] pppoe-stop.8 ru:pppoe-stop.ru.8 add_ru:pppoe-stop.ru.8.add&lt;br /&gt;[type: man] pppoe-status.8 ru:pppoe-status.ru.8 add_ru:pppoe-status.ru.8.add&lt;br /&gt;[type: man] pppoe-sniff.8 ru:pppoe-sniff.ru.8 add_ru:pppoe-sniff.ru.8.add&lt;br /&gt;[type: man] pppoe-server.8 ru:pppoe-server.ru.8 add_ru:pppoe-server.ru.8.add&lt;br /&gt;[type: man] pppoe-relay.8 ru:pppoe-relay.ru.8 add_ru:pppoe-relay.ru.8.add&lt;br /&gt;[type: man] pppoe-setup.8 ru:pppoe-setup.ru.8 add_ru:pppoe-setup.ru.8.add&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Первая строка перечисляет список кодов языков, на которые будем осуществлять перевод. Можно переводить на несколько языков сразу, но мы укажем только русский язык.&lt;br /&gt;&lt;br /&gt;Во второй строке задаём файл-шаблон и список файлов-переводов для каждого языка. В файле-шаблоне будут все строки, подлежащие переводу, в остальных файлах будут храниться пары оригинал-перевод.&lt;br /&gt;&lt;br /&gt;В последующих строках указываются формат переводимого документа, сам документ. С префиксами ru указываются файлы с переводами на русский язык. С префиксами add_ru указываются аддендум-файлы - файлы с дополнительным текстом, который нужно вставить в перевод (например, информация об авторах перевода).&lt;br /&gt;&lt;br /&gt;Например, в моём случае аддендумы были двух видов. Файлы pppoe-relay.ru.8.add, pppoe.ru.8.add, pppoe-server.ru.8.add, pppoe-sniff.ru.8.add выглядят так:&lt;br /&gt;&lt;pre&gt;PO4A-HEADER:mode=after;position=АВТОРЫ;beginboundary=\.SH&lt;br /&gt;&lt;br /&gt;.SH "АВТОР ПЕРЕВОДА"&lt;br /&gt;Перевод на русский язык выполнил Владимир Ступин &amp;lt;wheelof@gmail.com&amp;gt;.&lt;/pre&gt;&lt;br /&gt;А файлы pppoe-connect.ru.8.add, pppoe-setup.ru.8.add, pppoe-start.ru.8.add, pppoe-status.ru.8.add, pppoe-stop.ru.8.add выглядят так:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;PO4A-HEADER:mode=after;position=АВТОР;beginboundary=\.SH&lt;br /&gt;&lt;br /&gt;.SH "АВТОР ПЕРЕВОДА"&lt;br /&gt;Перевод на русский язык выполнил Владимир Ступин &amp;lt;wheelof@gmail.com&amp;gt;.&lt;/pre&gt;&lt;br /&gt;Аддендумы, фактически, написаны по образу и подобию примеров из страниц руководства po4a. Они предписывают вставить текст после текста "АВТОРЫ" или "АВТОР", разметка которого выполнена с помощью шаблона ".SH". Подробнее о разметке страниц руководства можно прочитать на странице руководства groff_man(7). Некоторое время назад я начал её перевод и в последующем постараюсь довести его до конца.&lt;br /&gt;&lt;br /&gt;Теперь главное, выполняем компиляцию проекта:&lt;br /&gt;&lt;pre&gt;po4a po4a.conf&lt;/pre&gt;&lt;br /&gt;В каталоге проекта появятся файлы pppoe.pot и pppoe.ru.po. Файл po теперь можно переводить с помощью любого редактора po-файлов. Например, я использую poedit. Вам может понравиться gtranslate или kbabel.&lt;br /&gt;&lt;br /&gt;В переводимом тексте встречается разметка, которая однако намного проще разметки groff_man и легко редактируется вручную. Например, текст B&amp;lt;pppoe&amp;gt; означает разметку жирным шрифтом будет выглядеть так: &lt;span style="font-weight:bold;"&gt;pppoe&lt;/span&gt;, текст I&amp;lt;pppoe&amp;gt; означает разметку курсивным шрифтом и будет выглядеть так: &lt;span style="font-style:italic;"&gt;pppoe&lt;/span&gt;. Знаки больше и меньше имеют вид E&amp;lt;gt&amp;gt; и E&amp;lt;lt&amp;gt;. Например, текст E&amp;lt;gt&amp;gt;htmlE&amp;lt;lt&amp;gt будет выглядеть на печати следующим образом: &amp;lt;html&amp;gt;. Другие способы разметки я не встречал.&lt;br /&gt;&lt;br /&gt;После перевода файла po, можно скомпилировать проект снова. Для оригинальных страниц, у которых переведено более 80% текста, будут созданы страницы-переводы. Впрочем, принудительно посмотреть незаконченный перевод можно и вручную:&lt;br /&gt;&lt;pre&gt;po4a-translate -f man -m pppoe.8 -p pppoe.ru.po -l pppoe.ru.8 -a pppoe.ru.8.add -k 0&lt;br /&gt;man ./pppoe.ru.8&lt;/pre&gt;&lt;br /&gt;Не всегда разметка исходных страниц руководства бывает идеальной, а потому для успешной компиляции проекта бывает нужно отредактировать исходную страницу. Иногда встречаются неэкранированные знаки минуса или точки, иногда - неправильные теги разметки текста, например вместо \fB может встретиться \fb. На этот случай нужно вооружиться groff_man(7) и исправить неправильные участки страницы руководства.&lt;br /&gt;&lt;br /&gt;Также, в процессе перевода, может пригодиться знание пакета gettext. Например, мне очень пригодилась команда msgmerge для слияния нескольких po-файлов в один.&lt;br /&gt;&lt;br /&gt;Пример этого и других переведённых проектов можно взять из svn-репозитория: &lt;a href="https://man-ylsoftware.svn.sourceforge.net/svnroot/man-ylsoftware/"&gt;https://man-ylsoftware.svn.sourceforge.net/svnroot/man-ylsoftware/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Если кто-то заинтересован в том, чтобы помочь мне в оформлении переводов, можете зарегистрироваться на сайте &lt;a href="http://www.transifex.net/projects/p/manpages-ylsoftware-ru/"&gt;http://www.transifex.net/projects/p/manpages-ylsoftware-ru/&lt;/a&gt; и попроситься в команду перевода на русский. Укажите в профиле адрес своей электронной почты - я свяжусь с вами и мы поговорим о том, каким образом вы можете помочь проекту.&lt;br /&gt;&lt;br /&gt;В рамках проекта планируется следующая деятельность: перевод страниц руководства из различных пакетов, сбор готовых переводов из интернета с последующим конвертированием переводов в формат проекта po4a, актуализация имеющихся переводов, помощь в конвертировании готовых переводов в формат страниц руководства. Проект на сайте transifex.net и svn-репозиторий на sourceforge планирует приобщить к своему дистрибутиву русское сообщество Fedora. Можете предлагать другие способы взаимодействия и прочую посильную помощь. Удачных и лёгких переводов!&lt;br /&gt;&lt;br /&gt;Дополнение. Чтобы получить po-файл для одной страницы руководства, можно воспользоваться следующей командой:&lt;br /&gt;&lt;pre&gt;po4a-gettextize -f man -m apt-cache.8 -p apt-cache.ru.po&lt;/pre&gt;&lt;br /&gt;Если нужно получить новую версию po-файла, то можно указать уже имеющийся po-файл с переводом старой версии:&lt;br /&gt;&lt;pre&gt;po4a-gettextize -f man -m apt-cache.8 -l apt-cache.ru.po.old -p apt-cache.ru.po.new&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Обновлено: 28 ноября 2010 года.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5389310301527222356?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5389310301527222356/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5389310301527222356' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5389310301527222356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5389310301527222356'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/12/po4a.html' title='Легкий перевод страниц руководства с помощью po4a'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-663757405260104159</id><published>2009-11-05T16:48:00.005+05:00</published><updated>2009-11-05T17:25:46.059+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clamsmtpd'/><category scheme='http://www.blogger.com/atom/ns#' term='spamassassin'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='lighttpd'/><category scheme='http://www.blogger.com/atom/ns#' term='spampd'/><category scheme='http://www.blogger.com/atom/ns#' term='squirrelmail'/><category scheme='http://www.blogger.com/atom/ns#' term='postfixadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='postgrey'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='clamav'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='postfix'/><title type='text'>Настройка почтовой системы на основе Postfix, Dovecot, PostfixAdmin</title><content type='html'>Перед тем, как приступить к настройке почтового сервера, необходимо убедиться в том, что на сервере имеется прямой доступ в Интернет, то есть на одном из интерфейсов имеется так называемый «белый» IP. Также на сервере должна быть доступна служба DNS. Поскольку почтовый сервер очень часто обращается к службе DNS, может потребоваться настроить локальный кэширующий DNS-сервер для снижения нагрузки на сеть и повышения отзывчивости подсистемы DNS.&lt;br /&gt;&lt;br /&gt;Настраиваемая почтовая система обладает возможностями по администрированию доменов и почтовых ящиков через веб-интерфейс PostfixAdmin, в качестве основного домена в статье фигурирует домен stupin.homelinux.org, все учётные записи при этом хранятся в базе данных MySQL. Имеется почтовый клиент с веб-интерфейсом SquirrelMail, фильтрация спама средствами PostGrey, фильтрация вирусов средствами ClamSMTPd, отметка подозрительных писем с помощью SpamPd и SpamAssassin.&lt;br /&gt;&lt;br /&gt;Не смотря на то, что настройка почтовой системы рассмотрена довольно подробно, данная статья конечно же не претендует на полноту. За кадром остаётся настройка защищённого подключения к веб-серверу, тонкая настройка фильтрации почты с помощью SpamAssassin, Postfix и PostGrey, повышение безопасности почтовой системы посредством запуска отдельных подсистем от имени непривилегированных пользователей и т.п. Статью можно использовать в качестве опорной для построения более развитой почтовой системы.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка Lighttpd&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Первым делом устанавливаем веб-сервер lighttpd, php.&lt;br /&gt;&lt;pre&gt;# aptitude install lighttpd php5-cgi php5-json&lt;/pre&gt;&lt;br /&gt;Включаем модуль fastcgi веб-сервера lighttpd:&lt;br /&gt;&lt;pre&gt;# lighty-enable-mod fastcgi&lt;/pre&gt;&lt;br /&gt;Заменяем в конфигурации модуля &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/lighttpd/conf-enabled/10-fastcgi.conf&lt;/span&gt;&lt;/span&gt; интерпретатор PHP4 на PHP5:&lt;br /&gt;&lt;pre&gt;fastcgi.server = ( &amp;quot;.php&amp;quot; =&amp;gt;&lt;br /&gt;  ((&lt;br /&gt;    &amp;quot;bin-path&amp;quot; =&amp;gt; &amp;quot;/usr/bin/php5-cgi&amp;quot;,&lt;br /&gt;    &amp;quot;socket&amp;quot; =&amp;gt; &amp;quot;/tmp/php.socket&amp;quot;,&lt;br /&gt;    &amp;quot;max-procs&amp;quot; =&amp;gt; 2,&lt;br /&gt;    &amp;quot;idle-timeout&amp;quot; =&amp;gt; 20,&lt;br /&gt;    &amp;quot;bin-environment&amp;quot; =&amp;gt; (&lt;br /&gt;      &amp;quot;PHP_FCGI_CHILDREN&amp;quot; =&amp;gt; &amp;quot;4&amp;quot;,&lt;br /&gt;      &amp;quot;PHP_FCGI_MAX_REQUESTS&amp;quot; =&amp;gt; &amp;quot;10000&amp;quot;&lt;br /&gt;&lt;br /&gt;    ),&lt;br /&gt;    &amp;quot;bin-copy-environment&amp;quot; =&amp;gt; (&lt;br /&gt;      &amp;quot;PATH&amp;quot;, &amp;quot;SHELL&amp;quot;, &amp;quot;USER&amp;quot;&lt;br /&gt;    ),&lt;br /&gt;    &amp;quot;broken-scriptfilename&amp;quot; =&amp;gt; &amp;quot;enable&amp;quot;,&lt;br /&gt;    &amp;quot;check-local&amp;quot; =&amp;gt; &amp;quot;disable&amp;quot;&lt;br /&gt;&lt;br /&gt;  ))&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;Перезапускаем веб-сервер:&lt;br /&gt;&lt;pre&gt;# /etc/init.d/lighttpd restart&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка PostfixAdmin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Качаем последнюю стабильную версию PostfixAdmin со страницы &lt;a href="http://sourceforge.net/projects/postfixadmin/files/"&gt;http://sourceforge.net/projects/postfixadmin/files/&lt;/a&gt;. Для Debian существует готовый пакет postfixadmin_2.2.1.1_all.deb, его и скачаем:&lt;br /&gt;&lt;pre&gt;$ wget &amp;quot;http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.2.1.1/postfixadmin_2.2.1.1_all.deb?use_mirror=sunet&amp;quot;&lt;/pre&gt;&lt;br /&gt;Установим пакет в систему:&lt;br /&gt;&lt;pre&gt;# dpkg -i postfixadmin_2.2.1.1_all.deb&lt;/pre&gt;&lt;br /&gt;Пакет устанавливает все файлы проекта в каталог /usr/share/postfixadmin, файлы документации - в каталог /usr/share/doc/postfixadmin. Также создаются файлы с настройками самого PostfixAdmin - /etc/postfixadmin/config.inc.php и настройками Apache 2 - /etc/apache2/conf.d/postfixadmin.&lt;br /&gt;&lt;br /&gt;Поскольку я собираюсь пользоваться PostfixAdmin на web-сервере Lighttpd, заглянем в файл /etc/apache2/conf.d/postfixadmin:&lt;br /&gt;&lt;pre&gt;Alias /postfixadmin /usr/share/postfixadmin&lt;/pre&gt;&lt;br /&gt;И создадим на его основе настройки для Lighttpd - в файл &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/lighttpd/lighttpd.conf&lt;/span&gt;&lt;/span&gt; нужно будет добавить строчки:&lt;br /&gt;&lt;pre&gt;alias.url += (&lt;br /&gt;        &amp;quot;/postfixadmin&amp;quot; =&amp;gt; &amp;quot;/usr/share/postfixadmin&amp;quot;,&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;Дополнительно, защитим каталог на web-сервере от случайных зевак:&lt;br /&gt;&lt;pre&gt;auth.backend                   = &amp;quot;htdigest&amp;quot;&lt;br /&gt;auth.backend.htdigest.userfile = &amp;quot;/etc/lighttpd/htdigest&amp;quot;&lt;br /&gt;auth.require = ( &amp;quot;/posfixadmin&amp;quot; =&amp;gt;&lt;br /&gt;        (&lt;br /&gt;                &amp;quot;method&amp;quot; =&amp;gt; &amp;quot;digest&amp;quot;,&lt;br /&gt;                &amp;quot;realm&amp;quot; =&amp;gt; &amp;quot;PostfixAdmin&amp;quot;,&lt;br /&gt;                &amp;quot;require&amp;quot; =&amp;gt; &amp;quot;user=morbo&amp;quot;&lt;br /&gt;&lt;br /&gt;        )&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;И с помощью утилиты htdigest из пакета apache2-utils задаём пароль для пользователя morbo и рилма PostfixAdmin:&lt;br /&gt;&lt;pre&gt;$ htdigest /etc/lighttpd/htdigest &amp;quot;PostfixAdmin&amp;quot; morbo&lt;/pre&gt;&lt;br /&gt;Настроим Postfix Admin в соответствии с вашей спецификой (например, зададим подходящий пароль к базе данных, настроим домен по умолчанию и т.п.)&lt;br /&gt;&lt;br /&gt;Отредактируем файл /usr/share/postfixadmin/config.inc.php и укажем следующее:&lt;br /&gt;&lt;pre&gt;# vi config.inc.php&lt;br /&gt;[...]&lt;br /&gt;$CONF[&amp;#039;configured&amp;#039;] = true;&lt;br /&gt;$CONF[&amp;#039;postfix_admin_url&amp;#039;] = &amp;#039;http://stupin.homelinux.org/postfixadmin&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;database_type&amp;#039;] = &amp;#039;mysql&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;database_host&amp;#039;] = &amp;#039;localhost&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;database_user&amp;#039;] = &amp;#039;postfixadmin&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;database_password&amp;#039;] = &amp;#039;SecretPassword!&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;database_name&amp;#039;] = &amp;#039;postfix&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;domain_path&amp;#039;] = &amp;#039;YES&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;domain_in_mailbox&amp;#039;] = &amp;#039;NO&amp;#039;;&lt;br /&gt;$CONF[&amp;#039;encrypt&amp;#039;] = &amp;#039;cleartext&amp;#039;;&lt;/pre&gt;&lt;br /&gt;Просмотрите остаток файла, если вам захочется сделать более тонкие настройки.&lt;br /&gt;&lt;br /&gt;Вы можете быстро заменить домен по умолчанию на ваш собственный:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;replace &amp;quot;change-this-to-your.domain.tld&amp;quot; &amp;quot;stupin.homelinux.org&amp;quot; - /usr/share/postfixadmin/config.inc.php&lt;/pre&gt;&lt;br /&gt;Создайте базу данных и пользователя в mysql:&lt;br /&gt;&lt;pre&gt;shell&amp;gt; mysql -u root -p&lt;br /&gt;mysql&amp;gt; create database postfix;&lt;br /&gt;mysql&amp;gt; grant all privileges on postfix.* to &amp;#039;postfixadmin&amp;#039;@&amp;#039;localhost&amp;#039; identified by &amp;#039;SecretPassword!&amp;#039;;&lt;br /&gt;mysql&amp;gt; flush privileges;&lt;br /&gt;mysql&amp;gt; q&lt;/pre&gt;&lt;br /&gt;Откройте браузер и перейдите по ссылке &lt;a href="http://stupin.homelinux.org/postfix/setup.php"&gt;http://stupin.homelinux.org/postfix/setup.php&lt;/a&gt; или http://ваш-IP/postfixadmin/. Будет предложено запустить процесс настройки. Удостоверьтесь, что все проверки установщика сообщают &amp;#039;OK&amp;#039;.&lt;br /&gt;&lt;br /&gt;Рекомендуется удалить setup.php.&lt;br /&gt;&lt;br /&gt;Теперь перейдите по ссылке &lt;a href="http://stupin.homelinux.org/postfixadmin/admin"&gt;http://stupin.homelinux.org/postfixadmin/admin&lt;/a&gt;. Вы должны получить приглашение. Войдите с использованием почтового ящика администратора, заведённого ранее на странице настройки. Отсюда вы можете добавлять домены, почтовые ящики и т.п. Но Postfix этого не увидит. Нам нужно установить Postfix и настроить его.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка Postfix&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Установим Postfix и SASL2 с поддержкой MySQL:&lt;br /&gt;&lt;pre&gt;# aptitude install postfix-mysql postfix-tls libsasl2-modules-sql libsasl2-modules&lt;/pre&gt;&lt;br /&gt;Добавим в файл /etc/postfix/main.cf следующие строки:&lt;br /&gt;&lt;pre&gt;virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf&lt;br /&gt;virtual_gid_maps = static:106&lt;br /&gt;virtual_mailbox_base = /var/spool/mail/virtual&lt;br /&gt;virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf&lt;br /&gt;virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf&lt;br /&gt;virtual_minimum_uid = 106&lt;br /&gt;virtual_transport = virtual&lt;br /&gt;virtual_uid_maps = static:106&lt;br /&gt;broken_sasl_auth_clients = yes&lt;br /&gt;smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,&lt;br /&gt;    reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient,&lt;br /&gt;    reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname&lt;br /&gt;smtpd_sasl_auth_enable = yes&lt;br /&gt;smtpd_sasl_local_domain = $myhostname&lt;br /&gt;smtpd_sasl_security_options = noanonymous&lt;/pre&gt;&lt;br /&gt;ЗАМЕЧАНИЕ: UID и GID равные 106 на вашей системе могут быть другими. Посмотрите на UID и GID пользователя postfix (или vmail) в файле /etc/passwd и укажите их. Например, на моём сервере:&lt;br /&gt;&lt;pre&gt;# grep postfix /etc/passwd&lt;br /&gt;postfix:x:102:105::/var/spool/postfix:/bin/false&lt;br /&gt;--&amp;gt; uid: 102; gid: 105&lt;/pre&gt;&lt;br /&gt;Создайте следующие файлы в каталоге &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/postfix/mysql_virtual_alias_maps.cf&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;user = postfix&lt;br /&gt;password = SecretPassword!&lt;br /&gt;hosts = 127.0.0.1&lt;br /&gt;dbname = postfix&lt;br /&gt;table = alias&lt;br /&gt;select_field = goto&lt;br /&gt;where_field = address&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;mysql_virtual_domains_maps.cf&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;user = postfix&lt;br /&gt;password = SecretPassword!&lt;br /&gt;hosts = 127.0.0.1&lt;br /&gt;dbname = postfix&lt;br /&gt;table = domain&lt;br /&gt;select_field = domain&lt;br /&gt;where_field = domain&lt;br /&gt;additional_conditions = and backupmx = &amp;#039;0&amp;#039; and active = &amp;#039;1&amp;#039;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;mysql_virtual_mailbox_maps.cf&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;user = postfix&lt;br /&gt;password = SecretPassword!&lt;br /&gt;hosts = 127.0.0.1&lt;br /&gt;dbname = postfix&lt;br /&gt;table = mailbox&lt;br /&gt;select_field = maildir&lt;br /&gt;where_field = username&lt;/pre&gt;&lt;br /&gt;Если вы хотите разрешить ретрансляцию почты через ваш сервер после SMTP AUTH, пропишите в файле &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/postfix/sasl/smtpd.conf&lt;/span&gt;&lt;/span&gt; следующие настройки:&lt;br /&gt;&lt;pre&gt;pwcheck_method: auxprop&lt;br /&gt;mech_list: PLAIN LOGIN&lt;br /&gt;auxprop_plugin: sql&lt;br /&gt;sql_verbose: yes&lt;br /&gt;sql_engine: mysql&lt;br /&gt;sql_hostnames: 127.0.0.1&lt;br /&gt;sql_user: postfix&lt;br /&gt;sql_passwd: SecretPassword!&lt;br /&gt;sql_database: postfix&lt;br /&gt;sql_select: select password from mailbox where username = &amp;#039;%u@%r&amp;#039;&lt;/pre&gt;&lt;br /&gt;Создайте структуру каталогов, включая каталог для первого домена. Вы так же можете войти в PostfixAdmin и создать учётную запись &amp;#039;test&amp;#039; для домена stupin.homelinux.org.&lt;br /&gt;&lt;pre&gt;# mkdir -p /var/spool/mail/virtual/stupin.homelinux.org/test&lt;br /&gt;# chmod -R 770 /var/spool/mail/virtual&lt;br /&gt;# chown -R postfix:postfix /var/spool/mail/virtual&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка Dovecot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Установим Dovecot с поддержкой MySQL:&lt;br /&gt;&lt;pre&gt;# aptitude install dovecot-common dovecot-imapd dovecot-pop3d&lt;/pre&gt;&lt;br /&gt;Отредактируем файл &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/dovecot/dovecot-mysql.conf&lt;/span&gt;&lt;/span&gt; с настройками Dovecot/MySQL, воспользовавшись следующими опциями:&lt;br /&gt;&lt;pre&gt;driver = mysql&lt;br /&gt;connect = dbname=postfix user=postfixadmin host=127.0.0.1 password=SecretPassword!&lt;br /&gt;default_pass_scheme = PLAIN&lt;br /&gt;password_query = SELECT password FROM mailbox WHERE username = &amp;#039;%u&amp;#039;&lt;br /&gt;user_query = SELECT maildir, 106 AS uid, 106 AS gid FROM mailbox WHERE username = &amp;#039;%u&amp;#039;&lt;/pre&gt;&lt;br /&gt;Теперь настроим Dovecot на использование MySQL, задав следующие опции в файле &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/dovecot/dovecot.conf&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;protocols = imap imaps pop3 pop3s&lt;br /&gt;disable_plaintext_auth = no&lt;br /&gt;log_timestamp = &amp;quot;%Y-%m-%d %H:%M:%S &amp;quot;&lt;br /&gt;mail_location = maildir:/var/spool/mail/virtual/%d/%n&lt;br /&gt;mail_access_groups = mail&lt;br /&gt;first_valid_uid = 106&lt;br /&gt;first_valid_gid = 106&lt;br /&gt;protocol imap {&lt;br /&gt;}&lt;br /&gt;protocol pop3 {&lt;br /&gt;    pop3_uidl_format = %08Xu%08Xv&lt;br /&gt;}&lt;br /&gt;auth default {&lt;br /&gt;    mechanisms = digest-md5 plain&lt;br /&gt;    passdb sql {&lt;br /&gt;        args = /etc/dovecot/dovecot-mysql.conf&lt;br /&gt;    }&lt;br /&gt;    userdb sql {&lt;br /&gt;        args = /etc/dovecot/dovecot-mysql.conf&lt;br /&gt;    }&lt;br /&gt;    user = root&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Перезапустим Dovecot и Postfix и проверим их.&lt;br /&gt;&lt;br /&gt;По завершении вы должны получить возможность добавлять новые домены, почтовые ящики, псевдонимы с помощью PostfixAdmin и получить правильно работающую систему, включая SMTP-аутентификацию. Отметим, что для работы SMTP-аутентификации saslauthd не требуется.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка SquirrelMail&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Устанавливаем пакет squirrelmail:&lt;br /&gt;&lt;pre&gt;# aptitude install squirrelmail&lt;/pre&gt;&lt;br /&gt;В файл &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/lighttpd/lighttpd.conf&lt;/span&gt;&lt;/span&gt; нужно будет добавить строчки:&lt;br /&gt;&lt;pre&gt;alias.url += (&lt;br /&gt;  &amp;quot;/mail&amp;quot; =&amp;gt; &amp;quot;/usr/share/squirrelmail&amp;quot;&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;Настройку SquirrelMail можно осуществить с помощью ncurses-утилиты squirrelmail-configure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка плагина SquirrelMail PosfixAdmin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для того, чтобы пользователи имели возможность самостоятельно менять свои пароли, можно установить расширение postfixadmin для squirrelmail. Адрес проекта &lt;a href="http://squirrelmail-postfixadmin.palepurple.co.uk/"&gt;http://squirrelmail-postfixadmin.palepurple.co.uk/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Чтобы скачать исходники проекта, необходимо поставить утилиты subversion:&lt;br /&gt;&lt;pre&gt;# aptitude install subversion&lt;/pre&gt;&lt;br /&gt;Создадим каталог для скачиваемых из svn исходников плагина, скачаем исходники, скопируем необходимое нам, а лишнее удалим:&lt;br /&gt;&lt;pre&gt;$ mkdir ~/squirrelmail-postfixadmin&lt;br /&gt;$ cd ~/squirrelmail-postfixadmin&lt;br /&gt;$ svn co -r 35 http://squirrelmail-postfixadmin.palepurple.co.uk/svn&lt;br /&gt;$ mkdir ~/squirrelmail&lt;br /&gt;$ cp ~/squirrelmail-postfixadmin/svn/tags/squirrelmail-postfixadmin-0.4.3/* ~/postfixadmin/&lt;br /&gt;$ rm -R ~/squirrelmail-postfixadmin&lt;/pre&gt;&lt;br /&gt;Почистим исходники плагина от служебных файлов subversion:&lt;br /&gt;&lt;pre&gt;$ find ~/postfixadmin/ -name .svn -type d -exec rm -R \{\} \;&lt;/pre&gt;&lt;br /&gt;Установим плагин в каталог squirrelmail:&lt;br /&gt;&lt;pre&gt;# cp ~/postfixadmin /usr/share/squirrelmail/plugins/&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Тонкая настройка Postfix&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Во-первых, я задаю имя, которое будет использовать Postfix при отправке почты на другие почтовые серверы (в команде HELO или EHLO) или при приёме почты на 25 порту в приглашении (например, «220 stupin.homelinux.org ESMTP Postfix»):&lt;br /&gt;&lt;pre&gt;myhostname = stupin.homelinux.org&lt;br /&gt;myorigin = $myhostname&lt;/pre&gt;&lt;br /&gt;Во-вторых, укажем сети, имеющие право отправки почты без прохождения авторизации:&lt;br /&gt;&lt;pre&gt;mynetworks = 10.16.7.0/24, 127.0.0.1&lt;/pre&gt;&lt;br /&gt;Далее, мой провайдер поместил все клиентские сети в список динамических IP, так называемый DUL. Из-за этого подавляющее большинство почтовых серверов отказываются принимать от меня почту. Чтобы отправка почты всё-таки работала, мой провайдер позволяет отправлять почту через его почтовый сервер mail.ufanet.ru:&lt;br /&gt;&lt;pre&gt;relayhost = [mail.ufanet.ru]&lt;/pre&gt;&lt;br /&gt;И, наконец, я хочу чтобы Postfix не пытался складывать локальную почту в локальные же файлы mailbox. Вместо этого, он должен обрабатывать такую почту, как и всю остальную, то есть передавать её dovecot&amp;#039;у. Для этого пропишем следующую опцию:&lt;br /&gt;&lt;pre&gt;local_transport = virtual&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка PostGrey&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Установим postgrey:&lt;br /&gt;&lt;pre&gt;aptitude install postgrey&lt;/pre&gt;&lt;br /&gt;Поменять настройки можно в файле /etc/default/postgrey. Я добавил одну дополнительную опцию, которая помещает отправителя в белый список после 5 удачно пройденных тестов:&lt;br /&gt;&lt;pre&gt;POSTGREY_OPTS=&amp;quot;--inet=127.0.0.1:60000 --auto-whitelist-clients=5&amp;quot;&lt;/pre&gt;&lt;br /&gt;Настраиваем postfix на использование сервера политик postgrey. В файле /etc/postfix/main.cf к опции smtpd_recipient_restrictions в конец списка добавляем «check_policy_service inet:127.0.0.1:60000». После этого опция smtpd_recipient_restrictions в моей системе приняла следующий вид:&lt;br /&gt;&lt;pre&gt;smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,&lt;br /&gt;    reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient,&lt;br /&gt;    reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname,&lt;br /&gt;    check_policy_service inet:127.0.0.1:60000&lt;/pre&gt;&lt;br /&gt;Теперь, чтобы настройки вступили в силу, можно перезапустить postgrey и postfix:&lt;br /&gt;&lt;pre&gt;/etc/init.d/postgrey restart&lt;br /&gt;/etc/init.d/postfix reload&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка ClamSMTPD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Устанавливаем clamsmtpd (если на сервере установлен стабильный релиз Debian, то лучше подключить дополнительный репозиторий volatile, в который помещаются обновления антивирусных баз данных и систем фильтрации спама):&lt;br /&gt;&lt;pre&gt;aptitude install clamsmtpd&lt;/pre&gt;&lt;br /&gt;Обновляем антивирусные базы:&lt;br /&gt;&lt;pre&gt;freshclam -v&lt;/pre&gt;&lt;br /&gt;Настраиваем порты демона в файле &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;/etc/clamsmtpd.conf&lt;/span&gt;&lt;/span&gt; (я изменил их следующим образом):&lt;br /&gt;&lt;pre&gt;OutAddress: 10026&lt;br /&gt;Listen: 127.0.0.1:10025&lt;/pre&gt;&lt;br /&gt;Настраиваем postfix на передачу файла в clamsmtp. Во-первых добавим в файле /etc/postfix/main.cf следующие опции:&lt;br /&gt;&lt;pre&gt;content_filter = scan:127.0.0.1:10025&lt;br /&gt;receive_override_options = no_address_mappings&lt;/pre&gt;&lt;br /&gt;Во-вторых, в файл /etc/postfix/master.cf добавляем следующее:&lt;br /&gt;&lt;pre&gt;scan      unix  -       -       n       -       16      smtp&lt;br /&gt;        -o smtp_send_xforward_command=yes&lt;br /&gt;&lt;br /&gt;127.0.0.1:10026 inet  n -       n       -       16      smtpd&lt;br /&gt;        -o content_filter=&lt;br /&gt;        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks&lt;br /&gt;        -o smtpd_helo_restrictions=&lt;br /&gt;        -o smtpd_client_restrictions=&lt;br /&gt;        -o smtpd_sender_restrictions=&lt;br /&gt;        -o smtpd_recipient_restrictions=permit_mynetworks,reject&lt;br /&gt;        -o mynetworks_style=host&lt;br /&gt;        -o smtpd_authorized_xforward_hosts=127.0.0.0/8&lt;/pre&gt;&lt;br /&gt;Перезапускаем clamsmtpd и postfix:&lt;br /&gt;&lt;pre&gt;/etc/init.d/clamsmtp restart&lt;br /&gt;/etc/init.d/postfix restart&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка SpamPd&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Устанавливаем spampd:&lt;br /&gt;&lt;pre&gt;aptitude install spampd&lt;/pre&gt;&lt;br /&gt;Настраиваем spampd, в файле /etc/default/spampd меняем следующие опции:&lt;br /&gt;&lt;pre&gt;LISTENPORT=10026&lt;br /&gt;DESTPORT=10027&lt;/pre&gt;&lt;br /&gt;Также необходимо поменять настройки входного порта postfix, на котором письмо принимается без дополнительных проверок. В файле /etc/postfix/master.cf меняем строку&lt;br /&gt;&lt;pre&gt;127.0.0.1:10026 inet  n -       n       -       16      smtpd&lt;/pre&gt;&lt;br /&gt;на строку&lt;br /&gt;&lt;pre&gt;127.0.0.1:10027 inet  n -       n       -       16      smtpd&lt;/pre&gt;&lt;br /&gt;Для вступления настроек в силу перезапускаем postfix и spampd:&lt;br /&gt;&lt;pre&gt;/etc/init.d/postfix restart&lt;br /&gt;/etc/init.d/spampd restart&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Пояснение принципов фильтрации писем&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь clamsmtpd и spampd работают последовательно. Postfix получая новое письмо на порт 25, передаёт письмо на проверку на порт 10025, где его принимает clamsmtpd. Далее, проверив письмо, clamsmtpd передаёт письмо на порт 10026, где его принимает spampd. Далее, после проверки, spampd возвращает письмо Posfix&amp;#039;у на порт 10027. Postfix, получив письмо на порт 10027, принимает его без дополнительных проверок.&lt;br /&gt;&lt;br /&gt;clamsmtpd работает в связке с clamav-daemon, последовательно передавая ему на проверку все секции и вложения письма.&lt;br /&gt;&lt;br /&gt;spampd тоже работает в связке с демоном spamassassin, передавая ему на проверку письмо целиком. Важно, что в данном примере настройки, не происходит автоматическое удаление писем, похожих на спам. Вместо этого в начало темы подозрительного письма добавляется текст «*****SPAM***** », а в заголовок письма помещаются метки SpamAssassin, свидетельствующие о количестве набранных спам-баллов и описанием каждого признака спама. Для удаления подозрительных писем необходимо воспользоваться дополнительными компонентами почтовой системы.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ссылки&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://vladimir-stupin.blogspot.com/2008/07/clutch.html"&gt;Настройка веб-интерфейса Clutch&lt;/a&gt; - взята часть про настройку Lighttpd и PHP. Не пропадать же однажды уже написанному добру?!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://squirrelmail-postfixadmin.palepurple.co.uk/"&gt;Squirrelmail - PostfixAdmin plugin&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;Перевод этой и следующих двух статей я сделал отчасти для того, чтобы потом по ней написать этот мануал:&lt;br /&gt;&lt;li&gt;&lt;a href="http://vladimir-stupin.blogspot.com/2009/09/postfixadmin-debian.html"&gt;PostfixAdmin на Debian&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.citforum.ru/operating_systems/linux/clamav_postfix/"&gt;ClamAV + clamsmtpd + Postfix&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://vladimir-stupin.blogspot.com/2009/09/postfix-postgrey.html"&gt;Postfix и Postgrey: Проактивный способ фильтрации спама&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-663757405260104159?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/663757405260104159/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=663757405260104159' title='Комментарии: 28'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/663757405260104159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/663757405260104159'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/11/postfix-dovecot-postfixadmin.html' title='Настройка почтовой системы на основе Postfix, Dovecot, PostfixAdmin'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5067992326576754408</id><published>2009-10-25T22:18:00.006+05:00</published><updated>2009-11-02T09:01:17.700+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='prboom'/><category scheme='http://www.blogger.com/atom/ns#' term='midi'/><category scheme='http://www.blogger.com/atom/ns#' term='timidity'/><category scheme='http://www.blogger.com/atom/ns#' term='sf2'/><category scheme='http://www.blogger.com/atom/ns#' term='doom'/><title type='text'>Музыка MIDI - улучшаем звук</title><content type='html'>У меня есть вся музыка из Doom, Doom 2, Doom Final: Plutonia Experiment, Doom Final: TNT в формате MIDI. При проигрывании музыки с помощью timidity, запущенной из консоли я обнаружил, что timidity ругается на отсутствие сэмплов некоторых музыкальных инструментов:&lt;br /&gt;&lt;pre&gt;$ timidity BUNNY.MID&lt;br /&gt;Requested buffer size 32768, fragment size 8192&lt;br /&gt;ALSA pcm 'default' set buffer size 30104, period size 3760 bytes&lt;br /&gt;Playing /home/stupin/music/Doom/Doom/BUNNY.MID&lt;br /&gt;MIDI file: /home/stupin/music/Doom/Doom/BUNNY.MID&lt;br /&gt;Format: 1  Tracks: 13  Divisions: 120&lt;br /&gt;No instrument mapped to tone bank 0, program 31 - this instrument will not be heard&lt;br /&gt;No instrument mapped to tone bank 0, program 123 - this instrument will not be heard&lt;br /&gt;((c) 1994 by &lt;IRC:#doom:just_joe&gt; Productions.)(MUS2MIDI v0.9 - joakim.erdfelt@swsbbs.com)(prelim DEU Music/Sound project for 'DOOM')(DEU (c) 1993,1994 by Raphael Quinet)(DOOM (c) 1993,1994 by id software)Playing time: ~65 seconds&lt;br /&gt;Notes cut: 0&lt;br /&gt;Notes lost totally: 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;При этом, соответственно, слышны не все инструменты, что портит восприятие музыки. Например в первом эпизоде на третьем уровне вместо музыки фактически слышно один только монотонно повторяющийся синт-бас. Я стал искать музыкальные сэмплы для недостающих инструментов.&lt;br /&gt;&lt;br /&gt;Выяснилось, что в Debian есть MIDI-секвенсор fluidsynth, в комплекте с которым идут два банка музыкальных инструментов ф ормате Sound Font 2. Эти банки находятся в пакетах с именами fluid-soundfont-gm и fluid-soundfont-gs. Сам секвенсор мне запустить так и не удалось. Честно говоря мне этого и не особо-то хотелось, моей задачей было услышать полноценную музыку из Doom. Но зато я нашёл каким образом можно прикрутить эти банки к секвенсору timidity. Итак, пройдём весь процесс по шагам.&lt;br /&gt;&lt;br /&gt;Сначала установим банки:&lt;br /&gt;&lt;pre&gt;aptitude install fluid-soundfont-gm fluid-soundfont-gs&lt;/pre&gt;&lt;br /&gt;Вносим исправления в настройки freepats - программы, предоставляющей timidity сэмплы инструментов. В файле /etc/timidity/freepats.cfg добавляем следующие строчки (я добавил в начало):&lt;br /&gt;&lt;pre&gt;dir /usr/share/sounds/sf2/&lt;br /&gt;soundfont FluidR3_GM.sf2 order=0&lt;br /&gt;soundfont FluidR3_GS.sf2 order=1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И перезапускаем секвенсор:&lt;br /&gt;&lt;pre&gt;/etc/init.d/timidity restart&lt;/pre&gt;&lt;br /&gt;Теперь можно запускать timidity для прослушивания музыки из Doom. Кроме появления недостающих инструментов улучшилось общее качество воспроизведения: исчезли щелчки и искажения звука. Единственным недостатком секвенсора можно считать то, что он требует для своей работы изрядной вычислительной мощности процессора. Загрузка моего 2-гигагерцового Athlon доходила до 30-40%.&lt;br /&gt;&lt;br /&gt;Кстати, с помощью timidity можно слушать не только MIDI-файлы. timidity хорошо воспроизводит IT-, STM- и XM-файлы. В таком формате была музыка в недрах Unreal и Unreal Tournament, которую я когда-то из них извлёк. Теперь я могу слушать эту музыку и в Linux!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5067992326576754408?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5067992326576754408/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5067992326576754408' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5067992326576754408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5067992326576754408'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/10/prboom_25.html' title='Музыка MIDI - улучшаем звук'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-8265610960908182576</id><published>2009-10-17T18:07:00.006+06:00</published><updated>2009-10-17T18:38:52.672+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='prboom'/><category scheme='http://www.blogger.com/atom/ns#' term='midi'/><category scheme='http://www.blogger.com/atom/ns#' term='timidity'/><category scheme='http://www.blogger.com/atom/ns#' term='doom'/><title type='text'>Музыка в PrBoom</title><content type='html'>Продолжая тему запуска старых игр от id Software в Linux, хочу написать о PrBoom. PrBoom - это свободный движок игры Doom. У меня в Debian эта игра запускалась со звуком, но почему-то без музыки. Как оказалось, исправить этот недостаток довольно просто.&lt;br /&gt;&lt;br /&gt;Во-первых, ставим пакет timidity:&lt;br /&gt;&lt;pre&gt;aptitude install timidity&lt;/pre&gt;&lt;br /&gt;Во-вторых, вносим в файл /etc/default/timidity следующие изменения:&lt;br /&gt;&lt;pre&gt;TIM_ALSASEQ=true&lt;/pre&gt;&lt;br /&gt;В-третьих, перезапускаем MIDI-секвенсор:&lt;br /&gt;&lt;pre&gt;/etc/init.d/timidity restart&lt;/pre&gt;&lt;br /&gt;В каталоге /dev/ должно появиться устройство midi:&lt;br /&gt;&lt;pre&gt;ls -la /dev/midi&lt;br /&gt;crw-rw---- 1 root audio 14, 2 Окт 17 17:29 /dev/midi&lt;/pre&gt;&lt;br /&gt;Нужно убедиться, что пользователь который будет запускать игру, будет иметь доступ к этому устройству. Для этого пользователя достаточно включить в группу audio и при необходимости завершить сеанс и войти снова.&lt;br /&gt;&lt;br /&gt;После всех этих действий prboom всё равно не воспроизводил музыку и я обратился к страницам руководства. После непродолжительного чтения, я узнал что все настройки prboom'а находятся в файле ~/.prboom/prboom.cfg.&lt;br /&gt;&lt;br /&gt;Поиск по файлу конфигурации слова music дал следующие две опции: music_card, music_volume.&lt;br /&gt;&lt;br /&gt;Опция music_card располагалась под опцией sound_card, но в отличие от неё имела другое значение:&lt;br /&gt;&lt;pre&gt;sound_card                   -1&lt;br /&gt;music_card                   0&lt;/pre&gt;&lt;br /&gt;После того, как я заменил значение опции music_card на -1, музыка заработала.&lt;br /&gt;&lt;br /&gt;В игре можно включить использование OpenGL и задать размер экрана (смотрите настройки в меню игры и конфигурационный файл). Спрайты объёмными от этого не станут, но качество картинки станет лучше.&lt;br /&gt;&lt;br /&gt;Чтобы поиграть в оригинальный Doom, нужно взять от игры для DOS файл с расширением WAD и указать PrBoom'у использовать его. Например вот так можно запустить первый Doom:&lt;br /&gt;&lt;pre&gt;prboom -IWAD DOOM.WAD&lt;/pre&gt;&lt;br /&gt;Игра хоть и старая, но кто однажды стал её фанатом, тот её никогда не забудет. Я умею играть на сложности Ultra Violence пользуясь только лишь одной клавиатурой. Да и тем, кто её никогда не видел, может понравиться, если не рассматривать её как замену более поздним играм, а относиться к ней как какой-нибудь казуальной игре вроде тетриса или зумы.&lt;br /&gt;&lt;br /&gt;Ну и на последок, несколько скриншотов.&lt;br /&gt;&lt;br /&gt;FreeDoom:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4d7KNUc1lVw/Stm58GEhTQI/AAAAAAAAAxk/ivAUgjOQnsg/s1600-h/freedom.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_4d7KNUc1lVw/Stm58GEhTQI/AAAAAAAAAxk/ivAUgjOQnsg/s320/freedom.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393546470825741570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Doom Ultimate E1M1. Перед входом в первую мясорубку:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4d7KNUc1lVw/Stm6MebuGyI/AAAAAAAAAxs/McD_hS2PdMs/s1600-h/doom1-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_4d7KNUc1lVw/Stm6MebuGyI/AAAAAAAAAxs/McD_hS2PdMs/s320/doom1-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393546752243407650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Doom Ultimate E1M1. После выхода из мясорубки осталось мало здоровья - или бейся или фоткай:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4d7KNUc1lVw/Stm6Xl2bbsI/AAAAAAAAAx0/wmxOV799Kuo/s1600-h/doom1-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_4d7KNUc1lVw/Stm6Xl2bbsI/AAAAAAAAAx0/wmxOV799Kuo/s320/doom1-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393546943213039298" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-8265610960908182576?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/8265610960908182576/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=8265610960908182576' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8265610960908182576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/8265610960908182576'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/10/prboom.html' title='Музыка в PrBoom'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4d7KNUc1lVw/Stm58GEhTQI/AAAAAAAAAxk/ivAUgjOQnsg/s72-c/freedom.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-973105696236381521</id><published>2009-10-14T14:43:00.006+06:00</published><updated>2009-10-14T16:08:25.914+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lighttpd'/><category scheme='http://www.blogger.com/atom/ns#' term='rtorrent'/><category scheme='http://www.blogger.com/atom/ns#' term='rutorrent'/><title type='text'>rtorrent + rutorrent</title><content type='html'>В последнее время нахожусь в поисках оптимального torrent-клиента. Когда-то я пользовался transmission-daemon в купе с web-интерфейсом clutch, затем пересел на rtorrent, запущенный в сеансе screen. При необходимости управлял им через ssh.&lt;br /&gt;&lt;br /&gt;Недавно снова попробовал свежую версию transmission-daemon. Как оказалось, в свежей версии transmission-daemon web-клиент уже встроен вовнутрь демона. Работает без падений - всё отлично, но хочется рассмотреть по возможности побольше вариантов, чтобы выбрать оптимальный.&lt;br /&gt;&lt;br /&gt;Недавно я наткнулся на лестные отзывы о web-интерфейсе rutorrent для rtorrent. Сам интерфейс очень похож на web-интерфейс (и на GUI-интерфейс) программы uTorrent.&lt;br /&gt;&lt;br /&gt;web-интерфейс будет обслуживаться web-сервером lighttpd, а rtorrent будет запущен в screen-сеансе. Для работы web-интерфейса нам понадобится PHP, а для настройки ограничения доступа - утилита htdigest из пакета apache2-utils. Если вы не хотите её устанавливать, то вместо неё можете воспользоваться следующим сценарием &lt;a href="http://wheel69.narod.ru/lightdigest.sh"&gt;lightdigest.sh&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Поставим необходимое нам:&lt;br /&gt;&lt;pre&gt;aptitude install rtorrent screen lighttpd php5-cgi apache2-utils&lt;/pre&gt;&lt;br /&gt;Для начала я создал простенький файл конфигурации ~/.rtorrent.rc для rtorrent в домашнем каталоге пользователя, от имени которого будет работать rtorrent:&lt;br /&gt;&lt;pre&gt;port_range = 6925-6925&lt;br /&gt;directory = /home/rtorrent&lt;br /&gt;session = /home/rtorrent/.rtorrent-session/&lt;br /&gt;load_start = /home/rtorrent/torrents/*&lt;br /&gt;scgi_port = 127.0.0.1:5000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;port_range - опция задаёт диапазон TCP-портов, который будет прослушиваться в ожидании подключения других torrent-клиентов и будет анонсироваться трекерам. В данном случае это всего один TCP-порт 6925. Если его не указать, то при каждом запуске rtorrent будет слушать и анонсировать случайный диапазон портов. Задаю я этот параметр по одной простой причине - чтобы потом проковырять в фаерволле соответствующую дырочку.&lt;br /&gt;&lt;br /&gt;directory - опция задаёт каталог, в который будет производиться закачка.&lt;br /&gt;&lt;br /&gt;session - опция задаёт каталог, в который будут помещаться активные торренты. При перезапуске rtorrent эти торренты автоматически будут возобновлены.&lt;br /&gt;&lt;br /&gt;load_start - задаёт имена торрент-файлов, которые необходимо добавить к текущему сеансу.&lt;br /&gt;&lt;br /&gt;scgi_port - настраивает прослушивание управляющего TCP-порта. Управление происходит по протоколу XML-RPC.&lt;br /&gt;&lt;br /&gt;Теперь настроим lighttpd, добавим в файл /etc/lighttpd/lighttpd.conf следующие настройки:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;server.modules   += ( "mod_fastcgi" )&lt;br /&gt;&lt;br /&gt;fastcgi.server    = ( ".php" =&gt;&lt;br /&gt;        ((&lt;br /&gt;                "bin-path" =&gt; "/usr/bin/php5-cgi",&lt;br /&gt;                "socket" =&gt; "/tmp/php.socket",&lt;br /&gt;                "max-procs" =&gt; 2,&lt;br /&gt;                "idle-timeout" =&gt; 20,&lt;br /&gt;                "bin-environment" =&gt; (&lt;br /&gt;                        "PHP_FCGI_CHILDREN" =&gt; "1",&lt;br /&gt;                        "PHP_FCGI_MAX_REQUESTS" =&gt; "10000"&lt;br /&gt;                ),&lt;br /&gt;                "bin-copy-environment" =&gt; (&lt;br /&gt;                        "PATH", "SHELL", "USER"&lt;br /&gt;                ),&lt;br /&gt;                "broken-scriptfilename" =&gt; "enable"&lt;br /&gt;        ))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;server.modules += ( "mod_scgi" )&lt;br /&gt;&lt;br /&gt;scgi.server = (&lt;br /&gt;                "/RPC2" =&gt;&lt;br /&gt;                  ( "127.0.0.1" =&gt;&lt;br /&gt;                    (&lt;br /&gt;                      "host" =&gt; "127.0.0.1",&lt;br /&gt;                      "port" =&gt; 5000,&lt;br /&gt;                      "check-local" =&gt; "disable",&lt;br /&gt;                      "disable-time" =&gt; 0,&lt;br /&gt;                    )&lt;br /&gt;                  )&lt;br /&gt;              )&lt;br /&gt;&lt;br /&gt;server.modules                += ( "mod_auth" )&lt;br /&gt;&lt;br /&gt;auth.backend                   = "htdigest"&lt;br /&gt;auth.backend.htdigest.userfile = "/etc/lighttpd/htdigest"&lt;br /&gt;&lt;br /&gt;auth.require = ( "/RPC2" =&gt;&lt;br /&gt;        (&lt;br /&gt;                "method" =&gt; "digest",&lt;br /&gt;                "realm" =&gt; "rTorrent RPC",&lt;br /&gt;                "require" =&gt; "user=rtorrent"&lt;br /&gt;        )&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;Этот фрагмент включает и настраивает три плагина lighttpd:&lt;br /&gt;1. fastcgi - для обслуживания php-сценариев web-интерфейса,&lt;br /&gt;2. scgi - для проксирования обращений к URL'у "/RPC2" на локальный TCP-сокет 5000,&lt;br /&gt;3. auth - для ограничения доступа к этому URL'у по имени пользователя и паролю.&lt;br /&gt;&lt;br /&gt;С помощью утилиты htdigest создадим файл с паролем для пользователя rtorrent и области "rTorrent RPC":&lt;br /&gt;&lt;pre&gt;htdigest -c /etc/lighttpd/htdigest "rTorrent RPC" rtorrent&lt;/pre&gt;&lt;br /&gt;Если в файле паролей уже есть какие-то записи, то предыдущую команду выполним без опции "-c", чтобы файл не был перезаписан, а был только лишь дополнен новой записью. Соответственно, если вы уже использовали авторизацию по htdigest, файл паролей может находиться в другом месте, в том куда вы его до этого положили. В таком случае нужно поправить путь к файлу паролей в опции auth.backend.htdigest.userfile, указанной в фрагменте /etc/lighttpd/lighttpd.conf выше.&lt;br /&gt;&lt;br /&gt;Теперь пришло время скачать со страницы &lt;a href="http://code.google.com/p/rutorrent/downloads/list"&gt;http://code.google.com/p/rutorrent/downloads/list&lt;/a&gt; архив rtorrent с файлами web-интерфейса rutorrent. Остальные перечисленные на этой странице файлы являются плагинами к rutorrent.&lt;br /&gt;&lt;pre&gt;wget http://rutorrent.googlecode.com/files/rtorrent-2.7.tar.gz&lt;/pre&gt;&lt;br /&gt;Создадим каталог для размещения файлов из архива:&lt;br /&gt;&lt;pre&gt;cd /var/www&lt;br /&gt;mkdir rutorrent&lt;/pre&gt;&lt;br /&gt;И распакуем архив в него:&lt;br /&gt;&lt;pre&gt;tar xzvf rtorrent-2.7.tar.gz -C /var/www/rutorrent&lt;/pre&gt;&lt;br /&gt;Видим, что файлы распаковались в каталог /var/www/rutorrent/rtorrent. Мне это не понравилось, я переместил файлы так, как и было изначально мной задумано:&lt;br /&gt;&lt;pre&gt;cd /var/www/rutorrent&lt;br /&gt;mv rtorrent/* .&lt;br /&gt;rmdir rtorrent&lt;/pre&gt;&lt;br /&gt;Теперь дадим приложению права на запись в каталоги torrents и settings:&lt;br /&gt;&lt;pre&gt;chown www-data:www-data torrents settings&lt;/pre&gt;&lt;br /&gt;Заходим по адресу http://ваш-IP/rutorrent, проходим аутентификацию и изучаем интерфейс:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4d7KNUc1lVw/StWbwHrTvZI/AAAAAAAAAxE/G_EmyLQ7N8o/s1600-h/rutorrent.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_4d7KNUc1lVw/StWbwHrTvZI/AAAAAAAAAxE/G_EmyLQ7N8o/s320/rutorrent.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5392387379842760082" /&gt;&lt;/a&gt;&lt;br /&gt;Примечания:&lt;br /&gt;1. При работе web-интерфейса выяснилось, что он неплохо умеет ронять rtorrent.&lt;br /&gt;2. Пищу для дальнейших размышлений на тему улучшения системы даёт сообщение web-интерфейса: "rTorrent скомпилирован с некорректной версией библиотеки xmlrpc-c, без поддержки 8-байтовых целых. Версия библиотеки должна быть &gt;= 1.11. Часть функциональности будет недоступна."&lt;br /&gt;3. Заметка пока-что оставляет за кадром вопросы автозапуска rtorrent в сеансе screen, возможно в скором времени я доберусь до этого вопроса.&lt;br /&gt;4. Возможно я пропустил установку и настройку каких-то жизненно важных для работы связки пакетов.&lt;br /&gt;&lt;br /&gt;Список использованных материалов:&lt;br /&gt;1. &lt;a href="http://code.google.com/p/rutorrent/wiki/Main"&gt;rutorrent - главная страница&lt;/a&gt;&lt;br /&gt;2. &lt;a href="Using XMLRPC with rtorrent"&gt;http://libtorrent.rakshasa.no/wiki/RTorrentXMLRPCGuide&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModFastCGI"&gt;Lighttpd - mod_fastcgi&lt;/a&gt; - настройки модуля fastcgi один в один совпадают с настройками модуля sgci, поэтому документацию на модуль scgi нужно смотреть тоже здесь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-973105696236381521?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/973105696236381521/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=973105696236381521' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/973105696236381521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/973105696236381521'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/10/rtorrent-rutorrent.html' title='rtorrent + rutorrent'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4d7KNUc1lVw/StWbwHrTvZI/AAAAAAAAAxE/G_EmyLQ7N8o/s72-c/rutorrent.PNG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-2192230038573023156</id><published>2009-09-25T11:22:00.006+06:00</published><updated>2009-09-25T13:01:14.555+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='dovecat'/><category scheme='http://www.blogger.com/atom/ns#' term='postfixadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='postfix'/><title type='text'>PostfixAdmin на Debian</title><content type='html'>Перевод статьи: &lt;a href="http://bliki.rimuhosting.com/space/knowledgebase/linux/mail/postfixadmin+on+debian"&gt;PostfixAdmin on Debian&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/postfixadmin/"&gt;Postfix Admin&lt;/a&gt; - это web-интерфейс для настройки пользователей почтового сервера на основе Postfix и MySQL.&lt;br /&gt;&lt;br /&gt;Он позволяет создавать пользователей и псевдонимы в пределах домена.&lt;br /&gt;&lt;br /&gt;Этот урок рассматривает установку Postfix Admin, Postfix в связке с MySQL и включенной SMTP-аутентификацией, и Dovecot (для POP3/POP3S/IMAP/IMAPS) в связке с MySQL.&lt;br /&gt;&lt;br /&gt;Не смотря на то, что этот урок был проверен на Debian Etch, настройка Postfix/MySQL одинакова и должна правильно работать на большинстве дистрибутивов.&lt;br /&gt;&lt;br /&gt;Если вы хотите настроить фильтрацию почты каждого пользователя от спама и вирусов, обратитесь к следующему уроку: &lt;a href="http://bliki.rimuhosting.com/space/knowledgebase/linux/mail/postfix+with+amavis+and+mysql"&gt;http://bliki.rimuhosting.com/space/knowledgebase/linux/mail/postfix+with+amavis+and+mysql&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Postfixadmin теперь есть в официальных репозиториях Debian и Ubuntu. Просто воспользуйтесь apt-get для его установки:&lt;br /&gt;&lt;pre&gt;apt-get install postfixadmin&lt;/pre&gt;&lt;br /&gt;&lt;blockquote&gt;ЗАМЕЧАНИЕ: Пакет не попал в репозитории Ubuntu. Просто скачайте файл со страницы &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=191583&amp;package_id=225300"&gt;http://sourceforge.net/project/showfiles.php?group_id=191583&amp;package_id=225300&lt;/a&gt; и выполните:&lt;br /&gt;&lt;pre&gt;dpkg -i postfixadmin_2.2.0_all.deb&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Postfixadmin будет установлен в каталог /usr/share/postfixadmin/, также будут установлен файл конфигурации /etc/postfixadmin/config.inc.php, а в конфигурацию apache будет добавлен дополнительный псевдоним посредством файла /etc/apache2/conf.d/postfixadmin:&lt;br /&gt;&lt;pre&gt;Alias /postfixadmin /usr/share/postfixadmin&lt;/pre&gt;&lt;br /&gt;Если вы решите воспользоваться установкой из архива с исходными текстами, это всё можно сделать вручную.&lt;br /&gt;&lt;br /&gt;Настроим Postfix Admin в соответствии с вашей спецификой (например, зададим подходящий пароль к базе данных, настроим домен по умолчанию и т.п.)&lt;br /&gt;&lt;br /&gt;Отредактируем файл /usr/share/postfixadmin/config.inc.php и укажем следующее:&lt;br /&gt;&lt;pre&gt;vi config.inc.php&lt;br /&gt;[...]&lt;br /&gt;$CONF['configured'] = true;&lt;br /&gt;$CONF['postfix_admin_url'] = 'http://ваш-домен.ru/postfixadmin';&lt;br /&gt;$CONF['database_type'] = 'mysql';&lt;br /&gt;$CONF['database_host'] = 'localhost';&lt;br /&gt;$CONF['database_user'] = 'postfixadmin';&lt;br /&gt;$CONF['database_password'] = 'SecretPassword!';&lt;br /&gt;$CONF['database_name'] = 'postfix';&lt;br /&gt;$CONF['domain_path'] = 'YES';&lt;br /&gt;$CONF['domain_in_mailbox'] = 'NO';&lt;br /&gt;$CONF['encrypt'] = 'cleartext';&lt;/pre&gt;&lt;br /&gt;Просмотрите остаток файла, если вам захочется сделать более тонкие настройки.&lt;br /&gt;&lt;br /&gt;Вы можете быстро заменить домен по умолчанию на ваш собственный:&lt;br /&gt;&lt;pre&gt;replace "change-this-to-your.domain.tld" "ваш-домен.ru" -- /usr/share/postfixadmin/config.inc.php&lt;/pre&gt;&lt;br /&gt;Создайте базу данных и пользователя в mysql:&lt;br /&gt;&lt;pre&gt;shell&amp;gt; mysql -u root -p&lt;br /&gt;mysql&amp;gt; create database postfix;&lt;br /&gt;mysql&amp;gt; grant all privileges on postfix.* to 'postfixadmin'@'localhost' identified by 'SecretPassword!';&lt;br /&gt;mysql&amp;gt; flush privileges;&lt;br /&gt;mysql&amp;gt; q&lt;/pre&gt;&lt;br /&gt;Откройте браузер и перейдите по ссылке http://ваш-домен.ru/postfixadmin/ или http://ваш-IP/postfixadmin/. Будет предложено запустить процесс настройки. Удостоверьтесь, что все проверки установщика сообщают 'OK'.&lt;br /&gt;&lt;br /&gt;Рекомендуется удалить setup.php.&lt;br /&gt;&lt;br /&gt;Теперь перейдите по ссылке http://ваш-домен.ru/postfixadmin/admin. Вы должны получить приглашение. Войдите с использованием почтового ящика администратора, заведённого ранее на странице настройки. Отсюда вы можете добавлять домены, почтовые ящики и т.п. Но Postfix этого не увидит. Нам нужно установить Postfix и настроить его.&lt;br /&gt;&lt;br /&gt;Установим Postfix и SASL2 с поддержкой MySQL&lt;br /&gt;&lt;pre&gt;apt-get install postfix-mysql postfix-tls libsasl2-modules-sql libsasl2-modules&lt;/pre&gt;&lt;br /&gt;Добавим в файл /etc/postfix/main.cf следующие строки:&lt;br /&gt;&lt;pre&gt;virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf&lt;br /&gt;virtual_gid_maps = static:106&lt;br /&gt;virtual_mailbox_base = /home/vmail&lt;br /&gt;virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf&lt;br /&gt;virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf&lt;br /&gt;virtual_minimum_uid = 106&lt;br /&gt;virtual_transport = virtual&lt;br /&gt;virtual_uid_maps = static:106&lt;br /&gt;broken_sasl_auth_clients = yes&lt;br /&gt;smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,&lt;br /&gt;    reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient,&lt;br /&gt;    reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname&lt;br /&gt;smtpd_sasl_auth_enable = yes&lt;br /&gt;smtpd_sasl_local_domain = $myhostname&lt;br /&gt;smtpd_sasl_security_options = noanonymous&lt;/pre&gt;&lt;br /&gt;&lt;blockquote&gt;ЗАМЕЧАНИЕ: UID и GID равные 106 на вашей системе могут быть другими. Посмотрите на UID и GID пользователя postfix (или vmail) в файле /etc/passwd и укажите их. Например, на моём сервере:&lt;br /&gt;&lt;pre&gt;# grep postfix /etc/passwd&lt;br /&gt;postfix:x:102:105::/var/spool/postfix:/bin/false&lt;/pre&gt;&lt;br /&gt;--&amp;gt; uid: 102; gid: 105&lt;/blockquote&gt;&lt;br /&gt;Создайте следующие файлы в каталоге /etc/postfix/:&lt;br /&gt;mysql_virtual_alias_maps.cf&lt;br /&gt;&lt;pre&gt;user = postfix&lt;br /&gt;password = SecretPassword!&lt;br /&gt;hosts = localhost&lt;br /&gt;dbname = postfix&lt;br /&gt;table = alias&lt;br /&gt;select_field = goto&lt;br /&gt;where_field = address&lt;/pre&gt;&lt;br /&gt;mysql_virtual_domains_maps.cf&lt;br /&gt;&lt;pre&gt;user = postfix&lt;br /&gt;password = SecretPassword!&lt;br /&gt;hosts = localhost&lt;br /&gt;dbname = postfix&lt;br /&gt;table = domain&lt;br /&gt;select_field = domain&lt;br /&gt;where_field = domain&lt;br /&gt;additional_conditions = and backupmx = '0' and active = '1'&lt;/pre&gt;&lt;br /&gt;mysql_virtual_mailbox_maps.cf&lt;br /&gt;&lt;pre&gt;user = postfix&lt;br /&gt;password = SecretPassword!&lt;br /&gt;hosts = localhost&lt;br /&gt;dbname = postfix&lt;br /&gt;table = mailbox&lt;br /&gt;select_field = maildir&lt;br /&gt;where_field = username&lt;/pre&gt;&lt;br /&gt;Если вы хотите разрешить ретрансляцию почты через ваш сервер после SMTP AUTH, пропишите в файле /etc/postfix/sasl/smtpd.conf следующие настройки:&lt;br /&gt;&lt;pre&gt;pwcheck_method: auxprop&lt;br /&gt;mech_list: PLAIN LOGIN&lt;br /&gt;auxprop_plugin: sql&lt;br /&gt;sql_verbose: yes&lt;br /&gt;sql_engine: mysql&lt;br /&gt;sql_hostnames: localhost&lt;br /&gt;sql_user: postfix&lt;br /&gt;sql_passwd: SecretPassword!&lt;br /&gt;sql_database: postfix&lt;br /&gt;sql_select: select password from mailbox where username = '%u@%r'&lt;/pre&gt;&lt;br /&gt;Создайте структуру каталогов, включая каталог для первого домена. Вы так же можете войти в PostfixAdmin и создать учётную запись 'test' для домена ваш-домен.ru.&lt;br /&gt;&lt;pre&gt;mkdir -p /home/vmail/yourdomain.com/test&lt;br /&gt;chmod -R 770 /home/vmail&lt;br /&gt;chown -R postfix:postfix /home/vmail/&lt;/pre&gt;&lt;br /&gt;Установим Dovecot с поддержкой MySQL&lt;br /&gt;&lt;pre&gt;apt-get install dovecot-common dovecot-imapd dovecot-pop3d&lt;/pre&gt;&lt;br /&gt;Отредактируем файл /etc/dovecot/dovecot-mysql.conf с настройками Dovecot/MySQL, воспользовавшись следующими опциями:&lt;br /&gt;&lt;pre&gt;driver = mysql&lt;br /&gt;connect = dbname=postfix user=postfixadmin host=localhost password=SecretPassword!&lt;br /&gt;default_pass_scheme = PLAIN&lt;br /&gt;password_query = SELECT password FROM mailbox WHERE username = '%u'&lt;br /&gt;user_query = SELECT maildir, 106 AS uid, 106 AS gid FROM mailbox WHERE username = '%u'&lt;/pre&gt;&lt;br /&gt;Теперь настроим Dovecot на использование MySQL, задав следующие опции в файле /etc/dovecot/dovecot.conf:&lt;br /&gt;&lt;pre&gt;protocols = imap imaps pop3 pop3s&lt;br /&gt;disable_plaintext_auth = no&lt;br /&gt;log_timestamp = "%Y-%m-%d %H:%M:%S "&lt;br /&gt;mail_location = maildir:/home/vmail/%d/%n&lt;br /&gt;mail_access_groups = mail&lt;br /&gt;first_valid_uid = 106&lt;br /&gt;first_valid_gid = 106&lt;br /&gt;protocol imap {&lt;br /&gt;}&lt;br /&gt;protocol pop3 {&lt;br /&gt;    pop3_uidl_format = %08Xu%08Xv&lt;br /&gt;}&lt;br /&gt;auth default {&lt;br /&gt;    mechanisms = digest-md5 plain&lt;br /&gt;    passdb sql {&lt;br /&gt;        args = /etc/dovecot/dovecot-mysql.conf&lt;br /&gt;    }&lt;br /&gt;    userdb sql {&lt;br /&gt;        args = /etc/dovecot/dovecot-mysql.conf&lt;br /&gt;    }&lt;br /&gt;    user = root&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Перезапустим Dovecot и Postfix и проверим их.&lt;br /&gt;&lt;br /&gt;По завершении вы должны получить возможность добавлять новые домены, почтовые ящики, псевдонимы с помощью PostfixAdmin и получить правильно работающую систему, включая SMTP-аутентификацию. Отметим, что для работы SMTP-аутентификации saslauthd не требуется.&lt;br /&gt;&lt;br /&gt;Примечание переводчика:&lt;br /&gt;&lt;br /&gt;1. В репозитории Debian Lenny и выше на момент перевода готовый пакет PostfixAdmin обнаружен не был.&lt;br /&gt;2. После редактирования файла /etc/postfixadmin/config.inc.php нужно перейти не по ссылке http://ваш-домен.ru/postfix/, а по ссылке http://ваш-домен.ru/postfix/setup.php&lt;br /&gt;3. Чтобы http://ваш-домен.ru/postfix/setup.php не выдавал ошибки, нужно поставить пакет php5-imap и включить использование модуля imap в PHP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-2192230038573023156?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/2192230038573023156/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=2192230038573023156' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2192230038573023156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/2192230038573023156'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/09/postfixadmin-debian.html' title='PostfixAdmin на Debian'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5085108298565669075</id><published>2009-09-18T15:23:00.003+06:00</published><updated>2009-09-18T21:27:55.450+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='serial'/><category scheme='http://www.blogger.com/atom/ns#' term='перевод'/><category scheme='http://www.blogger.com/atom/ns#' term='minicom'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Как настроить клиент последовательной консоли</title><content type='html'>Перевод статьи: &lt;a href="http://www.debuntu.org/how-to-set-up-a-serial-console-client"&gt;How-To set up a serial console client&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В двух предыдущих статьях я остановился на настройке последовательной консоли в Ubuntu и Debian.&lt;br /&gt;&lt;br /&gt;В этом уроке мы покажем как подключиться к этой последовательной консоли с помощью другого компьютера и программы minicom.&lt;br /&gt;&lt;br /&gt;minicom - это программа для связи через последовательные устройства, которая используется для подключения к последовательной консоли. После нескольких этапов настройки, мы сможем получить доступ через SSH или напрямую через виртуальную консоль.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Перво-наперво...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Нам нужно удостовериться, что два компьютера соединены с помощью так называемого нуль-модемного кабеля. Другие типы последовательных кабелей работать не будут!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Установка Minicom&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для minicom имеются готовые пакеты в Debian и Ubuntu, так что нам нужно лишь выполнить команду:&lt;br /&gt;&lt;pre&gt;# apt-get install minicom&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Настройка minicom&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В этом уроке последовательный порт используется для подключения к последовательной консоли на ttyS0. Вы можете получить список обнаруженных ядром устройств с помощью команды:&lt;br /&gt;&lt;pre&gt;$ dmesg | grep ttyS&lt;br /&gt;[ 12.282348] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A&lt;br /&gt;[ 12.282928] 00:0c: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A&lt;/pre&gt;&lt;br /&gt;Теперь запустим minicom от имени пользователя root:&lt;br /&gt;&lt;pre&gt;$ sudo minicom&lt;/pre&gt;&lt;br /&gt;Нажмите Ctrl-A O чтобы попасть в настройки последовательного порта и нажмите Enter, введите A и что устройство указывает на /dev/ttyS0, затем нажмите Enter, чтобы подтвердить.&lt;br /&gt;&lt;br /&gt;Нажмите E и удостоверьтесь, что здесь стоит значение 115200, нажмите Enter, чтобы подтвердить. Снова нажмите Enter, чтобы вернуться к предыдущему экрану и, наконец, перейдите к пункту настройки "Save setup as dfl", нажмиет Enter чтобы подтвердить, Esc чтобы вернуться назад к первому экрану и нажмите Ctrl-A Q чтобы выйти.&lt;br /&gt;&lt;br /&gt;Теперь перезапустите:&lt;br /&gt;&lt;pre&gt;$ sudo minicom&lt;/pre&gt;&lt;br /&gt;И вы должны подключиться!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5085108298565669075?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5085108298565669075/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5085108298565669075' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5085108298565669075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5085108298565669075'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/09/blog-post.html' title='Как настроить клиент последовательной консоли'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-5313559287355751663</id><published>2009-09-18T14:50:00.003+06:00</published><updated>2009-09-18T14:59:06.419+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getty'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='serial'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Как настроить консоль на последовательном порту в Ubuntu</title><content type='html'>Перевод статьи: &lt;a href="http://www.debuntu.org/how-to-set-up-a-serial-console-on-ubuntu"&gt;How-To set up a serial console on Ubuntu&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Этот урок проведёт вас через этапы, необходимые для настройки консоли на последовательном порту в Ubuntu Linux.&lt;br /&gt;&lt;br /&gt;В отличие от других дистрибутивов, Ubuntu использует upstart вместо sysvinit и поэтому есть некоторые отличия этого урока от большинства уроков, которые вы можете найти в Интернете, описывающих настройку последовательной консоли.&lt;br /&gt;&lt;br /&gt;Последовательная консоль становится необходимой, если она запущена на "безголовом" сервере (то есть не имеющим клавиатуры и экрана) или если вы не можете подключиться к серверу из-за неполадок в сети.&lt;br /&gt;&lt;br /&gt;В этом уроке мы настроим последовательную консоль на сервере, компьютере к которому мы хотим получить доступ. Настройка клиента последовательной консоли описана в другой статье.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Проверка последовательных устройств&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Чтобы найти устройства, доступные на компьютере, вы можете запустить:&lt;br /&gt;&lt;pre&gt;$ dmesg | grep tty&lt;br /&gt;serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A&lt;br /&gt;00:0c: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A&lt;/pre&gt;&lt;br /&gt;Из выведенного можно определить, что имеется один последовательный интерфейс (/dev/ttyS0). Возможно на вашем компьютере будет более одного интерфейса. В этом уроке будем считать, что мы используем первое устройство (ttyS0). Если вы используете второе устройство, вам нужно заменить ttyS0 на ttyS1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Настройка последовательной консоли на сервере&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;На сервере мы настроим:&lt;br /&gt;* Последовательную консоль на ttyS0&lt;br /&gt;* Отправку загрузочных сообщений на последовательную консоль&lt;br /&gt;* Заставим Grub выводить сообщения на последовательную консоль&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;2.1. Последовательная консоль&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для настройки последовательной консоли нам потребуется создать новый файл /etc/event.d/ttyS0, чтобы порождать getty на последовательном устройстве. getty позаботится о выводе приглашения для ввода имени пользователя и пароля.&lt;br /&gt;&lt;br /&gt;Отредактируем /etc/event.d/ttyS0 и добавим:&lt;br /&gt;&lt;pre&gt;# ttyS0 - getty&lt;br /&gt;#&lt;br /&gt;# Служба сопровождает getty на ttyS0 начиная с момента&lt;br /&gt;# запуска системы и до её остановки.&lt;br /&gt;start on runlevel 2&lt;br /&gt;start on runlevel 3&lt;br /&gt;start on runlevel 4&lt;br /&gt;start on runlevel 5&lt;br /&gt;stop on runlevel 0&lt;br /&gt;stop on runlevel 1&lt;br /&gt;stop on runlevel 6&lt;br /&gt;respawn&lt;br /&gt;exec /sbin/getty -L 115200 ttyS0 vt102&lt;/pre&gt;&lt;br /&gt;Чтобы разрешить вход пользователю root (если вы включили учётную запись пользователя root на вашем компьютере) через последовательную консоль, вам нужно отредактировать файл /etc/securetty и добавить:&lt;br /&gt;&lt;pre&gt;ttyS0&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;2.2. Заставим grub выводить сообщения в ttyS0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;grub можно настроить на вывод сообщений в последовательную консоль. Отредактируйте меню grub и добавьте:&lt;br /&gt;&lt;pre&gt;serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1&lt;br /&gt;terminal --timeout=10 serial console&lt;/pre&gt;&lt;br /&gt;В разделе до различных ядер. Это приведёт к тому, что grub будет отображаться на последовательной консоли и вы сможете управлять grub через последовательную консоль или загружаться с использованием другого ядра.&lt;br /&gt;&lt;br /&gt;Если используется ttyS1, замените --unit=0 на --unit=1.&lt;br /&gt;&lt;br /&gt;Также, чтобы сообщения о загрузке выводились на последовательную консоль, вам нужно добавить к строке вашего ядра следующее:&lt;br /&gt;&lt;pre&gt;console=ttyS0,115200n8 console=tty0&lt;/pre&gt;&lt;br /&gt;Тогда строка ядра будет выглядеть следующим образом:&lt;br /&gt;&lt;pre&gt;kernel /boot/vmlinuz-2.6.24-16-generic root=UUID=uuuuuu-iii3-dddd-uuuu-iiiiiddddd&lt;br /&gt;  ro quiet splash console=ttyS0,115200n8 console=tty0&lt;/pre&gt;&lt;br /&gt;Теперь, при следующей перезагрузке вы сможете подключиться прямо к вашему компьютеру через последовательную консоль!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4428473564097379725-5313559287355751663?l=vladimir-stupin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vladimir-stupin.blogspot.com/feeds/5313559287355751663/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4428473564097379725&amp;postID=5313559287355751663' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5313559287355751663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4428473564097379725/posts/default/5313559287355751663'/><link rel='alternate' type='text/html' href='http://vladimir-stupin.blogspot.com/2009/09/ubuntu.html' title='Как настроить консоль на последовательном порту в Ubuntu'/><author><name>morbo</name><uri>http://www.blogger.com/profile/16650057587203469226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4428473564097379725.post-2390140014319489097</id><published>2009-09-18T14:11:00.003+06:00</published><updated>2009-09-18T14:21:49.838+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getty'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='serial'/><category scheme='http://www.blogger.com/atom/ns#' term='перевод'/><title type='text'>Как настроить консоль на последовательном порту в Debian</title><content type='html'>Перевод статьи: &lt;a href="http://www.debuntu.org/how-to-set-up-a-serial-console-on-debian"&gt;How-To set up a serial console on Debian&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Этот урок проведёт вас через этапы, необходимые для настройки консоли на последовательном порту в Debian Linux.&lt;br /&gt;&lt;br /&gt;Debian использует sysvinit для управления процессом загрузки, среди различных задач которого есть и эта. Существуют некоторые отличия этого урока от большинства уроков, которые вы можете найти в Интернете, описывающих настройку последовательной консоли.&lt;br /&gt;&lt;br /&gt;Последовательная консоль становится необходимой, если она запущена на "безголовом" сервере (то есть не имеющим клавиатуры и экрана) или если вы не можете подключиться к серверу из-за неполадок в сети.&lt;br /&gt;&lt;br /&gt;В этом уроке мы настроим последовательную консоль на сервере, компьютере к которому мы хотим получить доступ. Настройка клиента последовательной консоли описана в другой статье.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Проверка последовательных устройств&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Чтобы найти устройства, доступные на компьютере, вы можете запустить:&lt;br /&gt;&lt;pre&gt;$ dmesg | grep tty&lt;br /&gt;serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A&lt;br /&gt;serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A&lt;br /&gt;00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A&lt;br /&gt;00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A&lt;/pre&gt;&lt;br /&gt;Из выведенного можно определить, что имеется два последовательных интерфейса (/dev/ttyS0 и /dev/ttyS1). В этом уроке будем считать, что мы используем первое устройство (ttyS0). Если вы используете второе устройство, вам нужно заменить ttyS0 на ttyS1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Настройка последовательной консоли на сервере&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;На сервере мы настроим:&lt;br /&gt;* Последовательную консоль на ttyS0&lt;br /&gt;* Отправку загрузочных сообщений на последовательную консоль&lt;br /&gt;* Заставим Grub выводить сообщения 
