Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Установка backuppc, на внешний зашифрованный usb disk 
:(
    Опции темы
SparF
  Дата 19.8.2009, 10:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: 2
Всего: 18



Имеем:
  • сервер с 4х1 Гб дисками собраными в 2 Гб software raid10;
  • debian linux(lenny);
  • backuppc установленный из репозитория debian;
  • /var находится на reiser4 разделе занимающем 98% объема raid'а.
  • на сервере используется последнее ядро с kernel.org пропатченное для поддержки reiser4
  • 2х500 Гб внешних USB диска.
Необходимо:
  • Организовать резервное копирование не только на сервер, но и на внешние диски.
Требования:
  • Резервное копирование на сервер должно осуществляться параллельно с копированием на внешний диск и никоим образом не зависеть от него.
Почему reiser4

Кратко поясню, почему для хранения backup-данных была выбрана именно эта (reiser4) файловая система.

Явные минусы ее использования:
  • на данный момент reiser4 не включена в официальное ядро. Таким образом, для ее использования ядро необходимо как минимум патчить и пересобрать.
  • у разработчиков ядра есть свои, и, видимо, достаточно весомые причины не включать reiser4 в официальный релиз. 
    А это значит, что для нас риск потерять данные незначительно, но повышается.
Теперь перечислим плюсы:
  • В архитектуру reiser4 заложена модульность. Это позволяет включить прозрачное сжатие и(или) шифрование на уровне файловой системы. 
    (Плохой новостью для меня было то, что на данный момент в сети нет информации по настройке и использованию плагина шифрования. Судя по всему, этот функционал будет предоставлен позднее). 
  • Данная файловая система в числе прочего единственная позволяет использовать длину имени файла в 4032 байт [1].
 Казалось бы - зачем нам так много? История этой необходимости проходит корнями через особенности работы backuppc и уходит в те прекрасные времена, когда linux системы стали переходить на использование utf8 в качестве системной кодировки.
Столкнуться с этой ситуацией очень просто. Как это происходило у меня: на следующий день, после того, как на backup-сервера был установлен backuppc, оказалось, что ночной бэкап вывалился с ошибкой и оказался работать. При этом на тестовых каталогах backuppc отрабатывал просто прекрасно.
Утыкание патрона в патроннике происходило при обработки файла вот с таким вот забавным именеем:
    Московский Дом книги - Глазунов С_А_ «Новый англо-русский словарь современной разговорной лексики 16000 словарных статей, 45000 единиц перевода ».htm
Если кратко, то предпосылками этого милого бага является:
  •     - для унификации на всех серверах используется utf8.
  •     - для ext2/ext3 (и большинства других файловых систем) длина имени файла в 255 байт является максимальной.
  •     - для хранения символов национальных алфавитов используется 2 байта.
  •     - backuppc во время копирования дублирует структуру каталогов и файлов с машины, которую он бэкапит. 
    При этом, чтобы не плодить в своей файловой системе файлы, которые не изменились (за время, прошедшее с прошлого бэкапа), используются жесткие ссылки.
Это означает, что файл D:\Папка\Имя файла.doc на сервере server.domain.local 
превратится в: /var/lib/backuppc/pc/server.domain.local/23/fD$/fПапка/fИмя файла.doc
Примечание: предполагается, что используется копирование по протоколу smb с доступом через ресурс D$.
В нашем примере количество кириллических символов в строке имени файла немного переваливает за сотню. В итоге общая длина строки составляет 263 байт.
В итоге мы получаем ошибку создания файла (file name too long). Сразу отмечу, изменение системной кодировки на однобайтную (cp1251, к примеру) проблему не решает, так как backuppc все равно продолжает создавать файлы с именами в utf8. Единственная разница в том, что после изменения кодировки вы начинаете наблюдать кракозябры в своей файловой системе.
Файловая система reiser4 прекрасно решает эту проблему.

Решение.

К сожалению, backuppc спроектирован таким образом, что подразумевает использование только одного хранилища данных. Иначе говоря он сохраняет все данные только в одном каталоге. Можно указать другой каталог в настройках, можно вместо текущего каталога примонтировать другой, но он все равно останется только один.
Существующие варианты решения:
1. Монтировать наш внешний жесткий диск в /var/lib/backuppc;
2. Копировать на наш внешний жесткий диск данные из /var/lib/backuppc;
3. Каждый раз менять в настройках /var/lib/backuppc на путь, по которому примонтирован наш внешний жесткий диск.

Почему они не подходят:
1. Продолжительность полного бэкапа в системе может достигать более суток. Соответственно непрерывность процесса будет нарушена, так как мы сможем писать данные или на внешний диск или на сервер.
2. Доступный для бэкапов объем на сервере почти 2Тб. Объем внешнего диска 500Гб. Мало того, что первый больше второго в 4 раза, так там еще используется достаточно сложная для понимания сходу структура хранения данных с жесткими ссылками на файлы. Обычное копирование тут не подойдет. На корректное решение задачи при данной ее постановке уйдет больше времени, чем мы можем себе позволить.
3. Оставлю без комментариев)))

Таким образом, мы приходим к необходимости установки и настройке второго экземпляра backuppc на нашем сервере.
У нас есть два варианта:
1. Установка второго экземпляра на сервер и настройка его на хранение данных на внешнем диске.
2. Установка экземпляра на внешний диск. При этом (в самом простом случае) на сервере останутся только старт-стопные скрипты (для монтирования диска и запуска backuppc) и конфиг-файл apache.

Второй вариант мне нравится больше, так как уменьшает количество действий, которые придется предпринять в случае падения backupс-сервера. По сути, все сведется к копированию нескольких файлов на новый сервер и запуску одного из них. Единственным камнем преткновения является необходимость поддержки reiser4 ядром нового сервера. Однако, надеюсь, что в ближайшее время reiser4 все же войдет в ядро и этот вопрос будет исчерпан.

Ниже предполагается, что на backup-сервере уже установлен и функционирует backuppc. Поэтому некоторые моменты его конфигурирования и установки будут упущены, а другие будут рассмотрены более подробно.

Итак, поехали.
1. Настроим udev 
таким образом, чтобы при подключении нашего внешнего диска ему всегда присваивалось одно и то же имя в каталоге /dev. Для этого создадим файл
    /etc/udev/rules.d/10-external-backup-disks.rules
содержащий
Код

    SUBSYSTEM=="block", SUBSYSTEMS=="usb", ATTRS{product}=="LaCie Desktop Hard Drive", ATTRS{serial}=="ST3500830A*", NAME="backuphdd"

Теперь при подключении диска к backup-серверу вместо /dev/sde у меня появляется устройство /dev/backuphdd    
Более подробно (по пунктам) о написании правил udev можно прочитать здесь [2].

2. Теперь настроим прозрачное шифрование для этого диска. 
Устанавливаем cryptsetup:
    aptitude install cryptsetup
Сейчас и в дальнейшем будем предполагать, что все наши скрипты и ключевой файл лежат в каталоге /root/extbackup/
        mkdir /root/extbackup/
Запишем парольную фразу в файл external-backup-disk.key
        echo "verysecretpassword" > /root/extbackup/external-backup-disk.key
Создадим криптоконтейнер на нашем устройстве:
        cryptsetup luksFormat /dev/backuphdd /root/extbackup/external-backup-disk.key
Откроем его:
    cryptsetup luksOpen /dev/backuphdd cbackuphdd --key-file /root/extbackup/external-backup-disk.key
Теперь у нас в системе должно появится новое устройство:
    /dev/mapper/cbackuphdd    
После подключения контейнера работа с этим устройствам полностью аналогична работе с обычным диском. Наши данные будут прозрачно расшифровываться/шифроваться при чтении/записи.

Примечание: в данном случае для криптоконтейнера мы используем формат LUKS - Linux Unified Key Setup
Более подробно о cryptsetup и LUKS можно прочитать здесь [3]

3. Создадим на этом диске файловую систему reiser4
    mkfs.reiser4 /dev/mapper/cbackuphdd
Монтировать диск будем в каталог /external-backup-disk
    mkdir /external-backup-disk
    mount /dev/mapper/cbackuphdd /external-backup-disk/
    cd /external-backup-disk/

4. Скопируем настройки
Так как один экземпляр backuppc у нас уже настроен, то просто скопируем его настройки:
    mkdir etc
    cp -r /etc/backuppc/ ./etc/
Создадим каталоги, необходимые для работы backuppc на нашем диске
    mkdir /external-backup-disk/backuppc
    mkdir -p /external-backup-disk/usr/share/backuppc
    mkdir -p /external-backup-disk/usr/share/backuppc/cgi-bin
Подправим конфиг backuppc
    mcedit /external-backup-disk/etc/backuppc/config.pl
Примечание: здесь и далее я использую текстовый редактор mcedit (входит в пакет mc). Вы можете использовать любой другой.
Необходимо установить следующие параметры:
Код

    $Conf{CgiURL} = 'http://your_backup_server_name/backuppc-external/index.cgi';
    ...
    $Conf{TopDir} = '/external-backup-disk/backuppc';
    $Conf{ConfDir} = '/external-backup-disk/etc/backuppc';
    $Conf{LogDir} = '';
    $Conf{InstallDir} = '/external-backup-disk/usr/share/backuppc';
    $Conf{CgiDir} = '/external-backup-disk/usr/share/backuppc/cgi-bin';
    ...
    $Conf{CgiImageDir} = '/external-backup-disk/usr/share/backuppc/image';
    $Conf{CgiImageDirURL} = '/backuppc-external/image';

Теперь все готово к установке нового экземпляра.

5. Произведем установку backuppc
Скачаем последнюю стабильную версию с сайта проекта:
wget http://downloads.sourceforge.net/project/b...PC-3.1.0.tar.gz
Примечание: в данной статье рассматривается установка версии 3.1.0 (последней стабильной на данный момент). Возможно, при установке более ранних или поздних версий, что-то придется делать немного иначе.
Разархивируем ее и запустим установщик:
    tar -xzvf BackupPC-3.1.0.tar.gz
    cd BackupPC-3.1.0
    ./configure.pl --config-path /external-backup-disk/etc/backuppc/config.pl
Во время первого запуска configure.pl начал ругаться:
    bash: ./configure.pl: /bin/perl: плохой интерпретатор: Нет такого файла или каталога
Вылечил так:
    ln -s /usr/bin/perl /bin/perl
Во время установки нам будет задано несколько вопросов. Необходимо убедится, что на них даны ответы, соответствующие конфигурации нашей системы:
    --> Full path to existing main config.pl [/external-backup-disk/etc/backuppc/config.pl]?
    --> BackupPC will run on host [your_backup_server_name]?
    --> BackupPC should run as user [backuppc]?
    --> Install directory (full path) [/external-backup-disk/usr/share/backuppc]?
    --> Data directory (full path) [/external-backup-disk/backuppc]?
    --> CGI bin directory (full path) [/external-backup-disk/usr/share/backuppc/cgi-bin]?
    --> Apache image directory (full path) [/external-backup-disk/usr/share/backuppc/image]?
    --> URL for image directory (omit http://host; starts with '/') [/backuppc-external/image]?

Теперь скопируем на диск стартовый скрипт для демона backuppc:
    cp init.d/debian-backuppc /external-backup-disk/etc/init.d/
    chmod 755 /external-backup-disk/etc/init.d/debian-backuppc
Дадим права пользователю backuppc изменять свои конфиги
    chown -R backuppc:backuppc /external-backup-disk/etc/backuppc
Подправим символическую ссылку на каталог с конфигами хостов (напомню: мы скопировали эти конфиги из /etc/backuppc)
    ls -l /external-backup-disk/etc/backuppc
    lrwxrwxrwx 1 backuppc backuppc    13 Июл 22 20:29 pc -> /etc/backuppc
    rm /external-backup-disk/etc/backuppc/pc
    ln -s /external-backup-disk/etc/backuppc/ /external-backup-disk/etc/backuppc/pc
К сожалению, configure.pl несколько некорректно устанавливает настройки backuppc (или я не правильно понимаю логику его работы) и запустить его сейчас у нас не получится. Для того, чтобы исправить ситуацию подправим один из файлов backuppc
    mcedit /external-backup-disk/usr/share/backuppc/lib/BackupPC/Lib.pm
Необходимо заменить вот это:
Код

    if ( $useFHS ) {
        ...
        } else {
            $paths = {
                useFHS     => $useFHS,
                TopDir     => $topDir,
                InstallDir => $installDir,
                ConfDir    => $confDir eq "" ? "$topDir/conf" : $confDir,
                LogDir     => "$topDir/log",
            };
        }

на:
Код

        if ( $useFHS ) {
        ...
        } else {
            $paths = {
                useFHS     => $useFHS,
                TopDir     => $topDir,
                InstallDir => $installDir,
                ConfDir    => '/external-backup-disk/etc/backuppc',
                LogDir     => "$topDir/log",
            };
        }

Судя по всему, мейнтейнер пакета для debian тоже столкнулся с этой проблемой. Обошел он ее также.
Теперь запуск демона backuppc должен произойти успешно:
    /external-backup-disk/etc/init.d/debian-backuppc start
    Starting backuppc: ok.

6. Настроим apache для отображения web-интерфейса нашего экземпляра backuppc
Для этого создадим файл /etc/apache2/conf.d/backuppc-external.conf со следующим содержимым:
Код

    <Directory /var/www/backuppc-external/>
            AllowOverride None

            # Uncomment the line below to ensure that nobody can sniff importanti
            # info from network traffic during editing of the BackupPC config or
            # when browsing/restoring backups.
            # Requires that you have your webserver set up for SSL (https) access.
            #SSLRequireSSL

            Options ExecCGI FollowSymlinks
            AddHandler cgi-script .cgi
            DirectoryIndex index.cgi

            AuthGroupFile /etc/backuppc/htgroup
            AuthUserFile /etc/backuppc/htpasswd
            AuthType basic
            AuthName "BackupPC admin"
            require valid-user

    </Directory>

Создадим этот каталог в файловой системе сервера:
    mkdir /var/www/backuppc-external
Положим в него индексный файл-заглушку index.cgi содержащий
Код

    #!/usr/bin/perl
    print "Content-Type: text/html\n\n";
    print "<HTML><BODY>";
    print "<h4>Please connect USB-disk!!!</h4>";
    print "</BODY></HTML>";

Разрешим выполнение этого файла:
    chmod 554 /var/www/backuppc-external/index.cgi
и сделаем его резервную копию (связано с блокировками, подробности смотри ниже)
    cp /var/www/backuppc-external/index.cgi /var/www/backuppc-external/index.cgi.old
Перезапустим apache
    /etc/init.d/apache2 restart
Проверим, что наша заглушка открывается:
    http://your_backup_server_name/backuppc-external/index.cgi
Теперь посмотрим на работу веб-интерфейса самого backuppc
    ln -sf /external-backup-disk/usr/share/backuppc/cgi-bin/index.cgi /var/www/backuppc-external/index.cgi
    ln -sf /external-backup-disk/usr/share/backuppc/image /var/www/backuppc-external/image
После создания этих символических ссылок по адресу
    http://your_backup_server_name/backuppc-external/index.cgi
Должен открываться интерфейс backuppc, при этом в нем мы должны увидеть настройки хостов идентичные настройкам первого экземпляра.
В будущем, перед тем как размонтировать диск, нам необходимо будет восстановить удалить эти ссылки и восстановить заглушку:
    rm /var/www/backuppc-external/index.cgi
    rm /var/www/backuppc-external/image
    cp /var/www/backuppc-external/index.cgi.old /var/www/backuppc-external/index.cgi

7. Напишем скрипты для монтирования и размонтирования диска
В первом выполняется все действия, выполненные нами выше вручную
external-backup-disk_mount.sh
Код

    #!/bin/bash

    KEYFILE='/root/extbackup/external-backup-disk.key'
    DEVNAME='/dev/backuphdd'
    CDEVNAME='cbackuphdd'
    MOUNTPOINT='/external-backup-disk'
    WWWDIR='/var/www/backuppc-external'

    cryptsetup luksOpen $DEVNAME $CDEVNAME  --key-file "$KEYFILE"
    mount /dev/mapper/$CDEVNAME "$MOUNTPOINT"
    "$MOUNTPOINT/etc/init.d/debian-backuppc" start
    ln -sf "$MOUNTPOINT/usr/share/backuppc/cgi-bin/index.cgi" "$WWWDIR/index.cgi"
    ln -sf "$MOUNTPOINT/usr/share/backuppc/image" "$WWWDIR/image"


Второй служит для отключения диска и восстановления заглушки
external-backup-disk_umount.sh
Код

    #!/bin/bash

    CDEVNAME='cbackuphdd'
    MOUNTPOINT='/external-backup-disk'
    WWWDIR='/var/www/backuppc-external'

    rm "$WWWDIR/index.cgi"
    rm "$WWWDIR/image"
    cp "$WWWDIR/index.cgi.old" "$WWWDIR/index.cgi"
    "$MOUNTPOINT/etc/init.d/debian-backuppc" stop
    umount "$MOUNTPOINT"
    cryptsetup luksClose $CDEVNAME


В дальнейшем предполагается, что эти скрипты лежат в каталоге /root/extbackup/
Проверим работу этих скриптов: 
при запуске external-backup-disk_mount.sh должно происходить монтирование зашифрованного диска и запуск экземпляра backuppc c него.
после запуске external-backup-disk_umount.sh диск должен быть отмонтирован и может быть извлечен.
Примечание: во время тестирования работы этих скриптов будьте внимательны. Так, например, диск может использоваться - и не будет отмонтирован. Реакция на ошибки в скрипты мной на данном этапе не закладывалась.

8. Автоматизируем процесс монтирования диска
Применение udev для присваивания диску определенного имени на этом не ограничивается. Можно так же заставить его при подключении диска выполнять определенную программу. В нашем случае это будет скрипт /root/extbackup/external-backup-disk_mount.sh

Для этого незначительно изменим файл /etc/udev/rules.d/10-external-backup-disks.rules добавив в него параметр RUN
Код

    SUBSYSTEM=="block", SUBSYSTEMS=="usb", ATTRS{product}=="LaCie Desktop Hard Drive", 
                                                         ATTRS{serial}=="ST3500830A*", NAME="backuphdd", RUN+="/root/extbackup/external-backup-disk_mount.sh"

Теперь монтирование и запуск backuppc должен производится автоматически при подключении USB-диска к серверу.
Примечание: Необходимо отметить, что автоматическое подключение выполняется чуть дольше чем при запуске скрипта с консоли. Помимо того, при выполнении скрипта udev проявляются блокировки. Так, первая версия скрипта работающая по логике:
    mv index.cgi index.cgi.old
    ln -s /external-backup-disk/usr/share/backuppc/cgi-bin/index.cgi /var/www/backuppc-external/index.cgi
    ln -s /external-backup-disk/usr/share/backuppc/image /var/www/backuppc-external/image
прекрасно отрабатывала при запуске вручную и дико сбоила при запуске udev: 
    вместо создания резервной копии index.cgi с именем index.cgi.old 
    создавалась ссылка index.cgi.old на /external-backup-disk/usr/share/backuppc/cgi-bin/index.cgi

9. Автоматизируем процесс размонтирования диска
Установим sudo
    aptitude install sudo
Cоздадим  файл /var/www/backuppc-external/stop.cgi
Код

    #!/usr/bin/perl


    my $ful_script_path     = "/root/extbackup/external-backup-disk_web_umount.sh";
    my $button              = "YES";
    my $page_name           = "backuppc stop and umount";
    my $title               = "Are you sure want to stop backuppc and umount USB disk";

    #Дальше не трогать
    #############################################################
    print "Content-type: text/html\n\n";

    use CGI qw/:standard/;
    use HTML::Entities;

    print start_html($page_name);

            if (param('run') eq $button) {
                    open(my $fh, "-|",$ful_script_path)
                        or die print "can't exec program: $!";
                    while (<$fh>) {
                        $_ = encode_entities($_, "\200-\377");
                        if(/^\s/){
                            s{(.*)s}        {<PRE>\n$1</PRE>\n}s;
                        }
                        else {
                            s{&}            {&amp};
                            s{<}            {&lt};
                            s{>}            {&gt};
                            s{\n}           {<BR>\n};
                        }
                        $outp .= $_;
                    }
                    print '<B>DONE</B><BR><BR>';
                    print $outp;
            }
            else {
                    print h3($title),
                    start_form,
                    submit('run',$button),
                    end_form;
            }

    print end_html;

    
Создадим файл /root/extbackup/external-backup-disk_web_umount.sh
Код

    #!/bin/bash
    sudo /root/extbackup/external-backup-disk_umount.sh


И разрешим пользователю www-data выполнять его от имени root. Для этого пропишем в /etc/sudoers
Код

    Cmnd_Alias USBBACKDISK_STOP = /root/extbackup/external-backup-disk_umount.sh
    www-data        ALL = NOPASSWD: USBBACKDISK_STOP

Примечание: вы, конечно, знаете, что непосредственная правка /etc/sudoers не рекомендуется, и изменения в него необходимо вносить с помощью команды visudo

И последний штрих: добавим ссылку на stop.cgi в интерфейс backuppc. Для этого необходимо в файле config.pl 
    mcedit /external-backup-disk/etc/backuppc/config.pl
изменить параметр $Conf{CgiNavBarLinks} Сейчас у меня он выглядит так:
Код

    $Conf{CgiNavBarLinks} = [
      {
        'link' => '?action=view&type=docs',
        'lname' => 'Documentation',
        'name' => undef
      },
      {
        'link' => 'http://backuppc.wiki.sourceforge.net',
        'lname' => undef,
        'name' => 'Wiki'
      },
      {
        'link' => 'http://backuppc.sourceforge.net',
        'lname' => undef,
        'name' => 'SourceForge'
      },
      {
        'link' => 'stop.cgi',
        'lname' => undef,
        'name' => 'STOP and UMOUNT'
      }
    ];

    
Примечание: перед нажатием на кнопку YES необходимо завершить все выполняемые на данный момент задания.
    
И все. Теперь монтирование выполняется автоматически при подключении диска к серверу, а размонтирование и отключение доступно через веб-интерфейс. Необходимости входить на консоль нет.

10. И все же на последок.
А если вдруг настанет большой кабздец и бэкап сервер со всеми дисками перейдет в мир иной. То для восстановления информации с внешнего зашифрованного диска понадобится:
    как минимум:   ключевой файл (или ключевая фраза из него) /root/extbackup/external-backup-disk.key
    в идеале:            ядро с поддержкой reiser4
                                сервер с apache на борту
                                конфиг апача:        /etc/apache2/conf.d/backuppc-external.conf
                                скрипты:                  /root/extbackup/external-backup-disk_mount.sh
                                                                /root/extbackup/external-backup-disk_umount.sh
                                                                /root/extbackup/external-backup-disk_web_umount.sh
                                                                /etc/udev/rules.d/10-external-backup-disks.rules
                            
11. А что дальше. 
На текущий момент данная конфигурация полностью удовлетворяет моим требованиям.    Однако я вижу, что кое что еще можно усовершенствовать.
    а. Cделать возможность загрузки с внешнего диска. При этом автоматически поднимать на нем apache и backuppc. Добиться того, чтобы этот backuppc подхватывал конфиги и данные находящиеся на зашифрованном диске. В этом случае данный usb-диск станет самодостаточным для восстановления информации.
    б. Усовершенствовать скрипты и предусмотреть принудительное завершение заданий при получении команды на отмонтирование.


Станислав Жельнио aka SparF
август 2009 г.    
    
Источники:
1. Сравнение файловых систем — Википедия
2. Writing udev rules by Daniel Drake (dsd)
3. Работа с зашифрованными дисками в Linux, FreeBSD, NetBSD, OpenBSD by Mark Silinio
4. BackupPC


Это сообщение отредактировал(а) SparF - 20.2.2011, 11:48


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Администрирование"
ZeeLax
Imple
nerezus
Этот форум предназначен для решения вопросов по администрации *n?x-систем, в частности по настройке сложных сетей и обслуживанию серверного оборудования.

  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Администрирование *NIX систем | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.