вторник, 29 апреля 2008 г.

Трансляция спутникового канала в локальную сеть

Полтора месяца назад настроил трансляцию спутникового канала Вести в локальную сеть.


В связи с реорганизацией парка серверов пришлось переносить DVB-S карты и весь софт на другую машину.

Железо перекинуть не проблема (только не забывайте выключать оборудование перед отключением антенного фидера), а вот вспомнить что и как настроить в софте, оказалось проблематично.

Решил теперь все такие настройки организовывать в мануалы и оставлять на блоге - и себе и другим :)

Приступим.

Многое взято из статьи http://omsk.lug.ru/SatTVLinux

Однако в моей ситуации все сразу не получилось.

1. Ищем информацию по нашему спутнику.
Мне помог http://www.lyngsat.com
Спутник HotBird.


2. Составляем список каналов и записываем в /etc/channels.conf
У меня пока только:
Vesti:11034:v:0:27500:1020:1030:1710

3. Проверяем наличие сигнала:
#szap -c /etc/channels.conf -x -n 1 -a 2
-a определяет номер адаптера, у меня в машине их 3, выбираю третий.

4. Транслируем каналы мультикастом:
Много экспериментировал с трансляцией всего транспондера, но так и не получилось.
#/usr/local/bin/dvbstream -c 2 -i 224.1.2.10 -r 1234 -f 11034 -p V -s 27500 -ps -v 1020 -a 1030

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

Решение пришло неожиданно.
Оказалось что у машины нет DNS-записи типа А! - вот из-за чего падал dvbstream!!!

[Дополнение]
Необходимость в DNS-записи типа А была вызвана только тем, что в /etc/hosts небыло записи с настоящим именем машины. После добавления/изменения записи в данном файле необходимость в DNS вообще отпадает.

Так что, господа, незабываем сделать запись или лезем в исходники и фиксим...

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

В нашей сети используются интелектуальные коммутаторы hp 2824 и hp 2510-24.
Эти коммутаторы имеют возможности контроллирования распространения multicast-трафика - IGMP .

Описание этого процесса достойно отдельной статьи, либо прочтения руководства по настройке коммутатора ;)

С чего начинать оптимизацию MySQL?


10 апреля 2008, 23:27
Кролик надел очки.
— С чего начинать, Ваше Величество? — спросил он.
— Начни с начала, — важно ответил Король, — продолжай, пока не дойдешь до конца.
Льюис Кэрролл. Приключения Алисы в стране чудес.

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

Нужна ли оптимизация MySQL?

Итак, вы столкнулись с падением производительности веб-приложения, использующего MySQL. Приложение периодически недоступно, загрузка страниц вашего сайта происходит слишком долго или периодически выдается ошибка "Too many connections". Перед тем, как приступать к оптимизации MySQL, следует проверить следующее:

  • Наличие свободного места на диске в рамках дисковой квоты.
  • Отсутствие зацикливания в веб-приложении.
  • Время отклика вашего web-сервера (ping).
  • В случае виртуального хостинга, отсутсвие внешних замедляющих факторов (один из способов это проверить — остановить приложение и выполнить простейший запрос SELECT 2+2; в консоли mysql на сервере. Такой запрос должен выполниться за несколько сотых секунды).
  • Отсутствие задержки при подключении к mysql-серверу с сервера веб-приложения. Если такая задержка присутствует, это может быть связано с неправильной работой системы доменных имен (DNS).

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

Путь оптимизации

Предостережение, высказанное Дональдом Кнутом: «Преждевременная оптимизация - корень всех зол» справедливо и для MySQL. Нельзя начинать оптимизацию не выявив узкие места. Если вы создаете приложение, которое должно выдерживать в будущем большую нагрузку, то для нахождения узких мест потребуется создать искусственную нагрузку, аналогичную ожидаемой.

Перечислим различные методы оптимизации в одном из возможных порядков их применения:

  1. Анализ медленных запросов к базе данных. На этой стадии анализируется журнал медленных запросов (slow query log) и текущий поток запросов к базе (увидеть выполняемые в настоящий момент запросы к базе можно, выполнив команду SHOW FULL PROCESSLIST в консоли MySQL).
  2. Добавление ключевых полей, оптимизация запросов, оптимизация типов колонок, выбор оптимального механизма хранения (storage engine). На этой ступени устраняются наиболее распространенные причины медленности запросов - отсутствие ключей, неоптимальный выбор типа колонки и неоптимальная форма запроса.
  3. Переход на виртуальный выделенный сервер (VDS) или на выделенный физический сервер (если это еще не сделано). Время разработчика дорого, поэтому переход на более производительный сервер часто оптимальное решение (бывает, без этого и не обойтись). Кроме того, без прав суперпользователя невозможна оптимизация конфигурации MySQL, а на VDS невозможно гарантировать стабильную производительность, так как приложения других пользователей VDS могут блокировать доступ к диску.
  4. Оптимизация конфигурации MySQL и параметров операционной системы. На этой стадии настраиваются кэши и буферы MySQL, исходя из потребности приложений. Настраиваются другие параметры MySQL и некоторые параметры операционной системы. См. также статью «Использование кэшей индексов».
  5. Оптимизация структуры базы данных. На этой стадии производится необходимая нормализация или денормализация базы данных. Стадия наиболее трудоемкая в силу того, что изменение структуры данных может потребовать внесения значительных изменений в код приложений, использующих базу данных. К этому методу обычно прибегают на стадии проектирования приложения или если все, описанные выше методы, не дали результата.

Серебряной пули нет

Не существует одного метода, который быстро решил бы все проблемы производительности. Приведенный перечень методов не претендует на полноту, оптимизация производительности СУБД в каждом случае требует индивидуального анализа. Содержание каждого из названных методов постараемся осветить в будущих статьях. С чего начинать оптимизацию? Начните с узких мест и продолжайте, пока будет оставаться хотя бы одно узкое место.

суббота, 19 апреля 2008 г.

Простой DHCP-сервер + прозрачный прокси на Squid

Для начала опишу ситуацию, почему я установил у себя на компьютере связку dhcp-сервера и прозрачного прокси на squid. Все дело в том, что мне частенько приходится дома работать с несколькими компьютерами одновременно (что-нить настроить и т.п.), но постоянно каждому компьютеру прописывать ручками ip, а так же прописывать настройки прокси очень не удобно, можешь забыть, что ты уже использовал какой-то ip - поэтому и получаешь конфликты ip-адресов.
Хочу сразу предупредить, что описал лишь только те параметры конфигурационных файлов, которые необходимы для простой работы dhcp-сервера и прокси Squid. Так как этих параметров уйма, предлагаю вам самим с ними поразбираться, а не упрекать меня в том, что я что-то не описал.

Установка DHCP-сервера

1. Устанавливаем dnsmasq
$
sudo apt-get install dnsmasq

2. Редактируем файл /etc/dnsmasq.conf
$
sudo nano /etc/dnsmasq.conf

3. Ищем закомментированную строку (что то вроде этого):
#interface=eth0
и раскомментируем ее
interface=eth0
при этом не забываем поменять название сетевой карты - eth0 на название вашей сетевой карты, к которой будут конектиться другие компьютеры из вашей сети.
4. Дальше, в этом же файле, раскомментируем или добавляем свою строку: dhcp-range= . К примеру, вот как она выглядит у меня:
dhcp-range=192.168.0.2,192.168.0.15,12h
данная запись означает, что всем компьютерам подключающимся к моей сети, будут автоматически выдаваться ip-адреса, c 192.168.0.2 по 192.168.0.15. И аренда этих адресов будет составлять 12 часов.
5. Перезапускаем сервис dnsmasq:
$
sudo /etc/init.d/dnsmasq restart

6. Подключаем в сеть какой-нить компьютер, при этом не забываем поставить ему в сетевых настройках, получение ip-адреса автоматически. Если все верно - то компьютеру присвоится ip-адрес из заданного нами в настройках диапазона.

Установка прозрачного прокси.

1. Устанавливаем squid (и если потребуется, другие нужные пакеты, которые он запросит автоматически):
$
sudo apt-get install squid

2. Редактируем файл настроек squid:
$
sudo nano /etc/squid/squid.conf

3. Ищем параметр http_port , и выставляем ему следующее значение (к примеру, как у меня):
http_port 3128 transparent
ключевое слово здесь - это transparent, в результате его мы и получим "прозрачный" прокси. А 3128 - это порт для протокола http.
4. В этом же файле ищем параметр visible_hostname и выставляем ему следующее значение:
visible_hostname (название прокси)
где (название прокси) - можете заменить на любое слово или словосочетание. Если вы не заполните данный параметр - squid будет очень сильно ругаться ))
5. Ищем дальше. Теперь ищем параметр acl our_networks заменяем его на такие строки (вот как к примеру у меня):
acl our_networks src 192.168.0.0/255.255.0.0
http_access allow our_networks

Данными строками мы разрешили доступ к прокси для компьютеров из нашей сети 192.168.0.0
Проверяем настройки сквида
cat /etc/squid/squid.conf | sed '/ *#/d; /^ *$/d'


6. Перезапускаем сервис squid:
$
sudo /etc/init.d/squid restart

7. Ну и наконец-то завершающий аккорд. Добавим правило перенаправления портов в наш файервол.
$
sudo iptables -t nat -A PREROUTING -i eth0 -d ! 192.168.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 192.168.0.1:3128

8. Теперь компьютеры в вашей сети смогут выходить в интернет через ваш "прозрачный" прокси, при этом нам нигде не надо прописывать настройки прокси вручную !! Все работает автоматом.

P.S. Чтобы снова, при каждом включении компьютера, не запускать по новой правило для файервола, проделываем следующее:
1. Запускаем правило для файервола:
$
sudo iptables -t nat -A PREROUTING -i eth0 -d ! 192.168.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 192.168.0.1:3128

2. Сохраняем список всех правил файервола в файл:
$
iptables-save /etc/iptables.rules

3. Редактируем файл /etc/network/interfaces
$
sudo nano /etc/network/interfaces

и после блока про сетевую карту eth0 (к примеру, у меня так), вставляем строку
pre-up iptables-restore < /etc/iptables.rules

Вот собственно и все ))


понедельник, 14 апреля 2008 г.

Массовый хостинг с помощью mod_vhost_alias

Автор: Голышев С.В. (glsv)
e-mail: glsv@yandex.ru

В статье описывается работа с модулем Apache mod_vhost_alias. Данный модуль предназначен для уменьшения трудоемкости создания и поддержки большого количества виртуальных хостов на сервере Apache. Модуль организует динамическое создание виртуальных хостов на основе запрошенного доменного имени и не требует внесения изменений в конфигурационные файлы сервера при создании новых виртуальных хостов.

При большом числе виртуальных хостов (десятки и сотни) время запуска и перезагрузки веб-сервера занимает значительное время, в течение которого он недоступен посетителям. Такая ситуация является критической для хост-провайдеров и серверов на которых расположены популярные сайты. Уменьшить время запуска сервера и упростить работу c большим количеством виртуальных хостов может модуль Apache с названием mod_vhost_alias.

Данный модуль позволяет не создавать отдельный контейнер для каждого виртуального хоста, а динамически формирует пути к директориям сайтов на основе запрошенных доменных имен или IP-адресов. Для создания сотен виртуальных хостов модуль mod_vhost_alias использует всего 4 директивы, с помощью которых определяются правила формирования путей к директориям сайтов. 2 из них предназначены для работы с виртуальными хостами на основе имен и 2 для работы с виртуальными хостами на основе IP-адресов.

  • VirtualDocumentRoot – определение директории DocumentRoot на основе запрошенного доменного имени.
  • VirtualScriptAlias - определение директории для CGI-скриптов на основе запрошенного доменного имени.
  • VirtualDocumentRootIP– определение директории DocumentRoot на основе запрошенного IP-адреса.
  • VirtualScriptAliasIP- определение директории для CGI-скриптов на основе запрошенного IP-адреса.

В директивах модуля могут использоваться следующие параметры:

  • %% - символ %
  • %p – номер запрошенного порта
  • %N.M – имя хоста или часть имени, определяемая значениями N и M.

Параметр N определяет часть имени хоста, которое следует использовать. Параметр M определяет номер используемого символа из части N. Ниже показаны возможные значения параметра N и примеры на основе доменного имени www.st-host.ru.

Разбиение имен хостов на части происходит по символу точки слева направо. Т.е. для имени www.st-host.ru первой частью будет являться - www, а последней - ru.

%N Описание Пример
0% Полное имя www.st-host.ru
1% Первая часть имени www
2% Вторая часть имени st-host
3% Третья часть имени ru
-1% Последняя часть ru
-2% Предпоследняя часть st-host
%2+ Вторая и все поcледующие части st-host.ru
%-2+ Предпоследняя и все последующие части st-host.ru

Рассмотрим применение данных параметров на примере директивы VirtualDocumentRoot.

VirtualDocumentRoot /www/%-2/htdocs

При запросе по адресу http://www.st-host.ru директива VirtualDocumentRoot сгенерирует путь к файлу на основе запрошенного имени хоста и Apache будет искать файл на диске по адресу /www/st-host/htdocs/index.php

Параметр M определяет номер используемого символа в параметре N. При положительном значении M отсчитывается с левой стороны строки, при отрицательном – с правой стороны.

%N.M Пример
%0.1 w
%2.1 s
%2.2 t
%-2.1 s
%-2.-1 t

Ниже приведены примеры директивы VirtualDocumentRoot и сгенерированные пути для запроса http://www.st-host.ru/.

/www/%0/htdocs Путь: /www/www.st-host.ru/htdocs
/www/%-1/%-2/htdocs Путь: /www/ru/st-host/htdocs
/www/%-1/%-2.1/%-2/htdocs Путь: /www/ru/s/st-host/htdocs
/www/%-1/%-2.1/%-2.1%-2.2/%-2/htdocs Путь: /www/ru/s/st/st-host/htdocs

Если на сервере используется большое количество виртуальных хостов, то директории хранения сайтов удобно распределять по именам доменов первого уровня (ru, com, net, org и т.п.). При размещении нескольких сотен сайтов их можно распределять по папкам, имена которых соответствуют первым символам доменных имен.

Недостатки модуля mod_vhost_alias

Удобный способ создания виртуальных хостов с помощью модуля mod_vhost_alias не лишен ряда недостатков.

  • Нельзя разделить логи сервера по виртуальных хостам – все обращения к разным сайтам записываются в общий журнальный файл.
  • Для эффективного использования модуля mod_vhost_alias конфигурация всех виртуальных хостов должно быть одинакова. В противном случае, для настройки каждого виртуального хоста необходимо применять контейнер , что лишает модуль mod_vhost_alias своего основного преимущества.

Индивидуальная настройка виртуальных хостов, созданных mod_vhost_alias

Модуль mod_vhost_alias не имеет средств индивидуальной настройки виртуальных хостов и вследствие этого конфигурации всех виртуальных хостов, созданных модулем, получаются одинаковыми. При необходимости индивидуального конфигурирования виртуальных хостов применяется контейнер , в котором производится настройка работы Apache индивидуально для каждой директории.

Рассмотрим пример. Необходимо произвести уникальную настройку сайта www.mega-site.ru. При этом для создания виртуальных хостов используется модуль mod_vhost_alias со следующими директивами.

VirtualDocumentRoot /www/%-1/%-2/htdocs

Согласно директиве VirtualDocumentRoot файлы сайта www.mega-site.ru должны храниться в директории /www/ru/mega-site/htdocs. Для того чтобы настроить работу Apache для этой директории необходимо в файле httpd.conf создать следующие директивы.


# Директивы конфигурирования
# уникальные для сайта www.mega-site.ru

Внутри контейнера необходимо разместить директивы, которые необходимо применить к конкретному сайту (виртуальному хосту).

Примечание

Частичное конфигурирование виртуальных хостов можно производить также через файлы .htaccess, размещаемые непосредственно в директории сайта.

Русская версия English

суббота, 12 апреля 2008 г.

Шифрование домашнего раздела в GNU/Linux. Ещё одна инструкция.

Решил на днях поиграться с шифрованием разделов. Но не нашёл инструкции, которая была бы мне понятно и содержала нужные и правильные для меня советы и объяснения. Как известно, в мире свободного ПО хорошо действует принцип "если тебе чего-то не хватает, то сделай это сам". Потому и пишу эту инструкцию - не только для других, но и для себя.

Итак, имеется следующая задача:
- зашифровать домашний раздел - при его монтировании система запрашивает пароль.
- при подключении жесткого диска с домашним разделом к другому компьютеру, операционной системе и программам по разметке жестких дисков раздел должен видиться как пустой неразмеченный.
Один из минусов данного подхода - если ноутбук (для десктопа я считаю это не актуальным) переводится в режим гибернации (hibernate), то при возвращении его к жизни запроса пароля, к сожалению (а хотелось бы), ещё раз не происходит - т.к. домашний раздел уже подмонтирован. Возможно, проблему решит шифрование swap-раздела.

Update
: танцы с бубном вокруг шифрования swap-раздела к успеху не привели...

Примечание. Перед началом операции во-первых, НАСТОЯТЕЛЬНО рекомендуется сбэкапить все важные данные. Во-вторых, перед вводом команд необходимо перейти в режим суперпользователя. Думаю, если Вы решили зашифровать раздел, Вам не надо рассказывать, что такое режим суперпользователя и как в этот самый режим перейти.

В попытках найти уже существующие решения, наткнулся на три статьи, но ни одна из них не покрывала мою задачу так, как это нужно мне:
Tuxedo Live - ряд ошибок, в том числе грубых; некоторые команды и применённые принципы не пояснены.
Прикладная Дебианавтика - инструкция правильная, но слишком исчерпывающая; решение описано скорее для серверных машин с применением LVM-разделов.
Продвинутый способ шифрования разделов в Linux@Форум "Античат" - пособие грамотное, но слишком уж параноидальное. Единственное, что оттуда подчерпнул - инструкция о том, как забить раздел случайными данными и как узнать, сколько ещё осталось:
узнаём PID процесса: ps ax | grep "dd if"; а затем получаем информацию о том, сколько случайных данных уже записано: kill -USR1 pid

Возможно, структура этой заметки покажется читателю странной, но, как было сказано выше, заметка в первую очередь публикуется для автора, а так автору понятней всего.
Приступим.
0. Устанавливаем необходимые пакеты. Для шифрования будут использоваться cryptsetup и dm-crypt.
1. Форматируем будущий домашний раздел в целевую файловую систему.
2. Забиваем раздел случайными данными, чтобы в обычном состоянии раздел казался пустым - если Вам это не надо, то можете пропустить этот шаг.

Примечание: наполнение раздела случайными данными - очень длительная процедура. В моём случае домашний раздел на 60GB наполнился за 5-8 часов. Т.е. в этом случае имеет смысл сделать такую процедуру перед сном. Тогда на утро раздел будет готов.

Если же Вам не нужно делать раздел "неработающим", тогда будет наблюдаться интереснейшая вещь - если Вы после этого подключите зашифрованный, но не забитый случайными данными раздел к компьютеру, на котором установлена ОС GNU/Linux с пакетами для шифрования, то выскочет окно с сообщением о том, что этот раздел зашифрован и необходимо ввести пароль. Если пароль правильный, то раздел подмонтируется и Вы получите к разделу доступ.

3. Шифруем домашний раздел; с необходимыми параметрами шифрования и паролем.
4. Редактируем любимым текстовым редактором файл /etc/crypttab в соответствии с параметрами шифрования.
5. Перезапускаем службу шифрования дисков cryptdisks. Если всё правильно, то появится предложение ввести LUKS-пароль. Если пароль введён правильно и нигде нет ошибок, то служба шифрования успешно перезапустится. Если нет, то появится предупреждение или ошибка. Значит где-то что-то неправильно.
6. Форматируем уже зашифрованный домашний раздел в целевую файловую систему.
7. Редактируем, опять же, любимым текстовым редактором, /etc/fstab таким образом, чтобы в качестве домашнего раздела монтировался свежезашифрованный раздел.
8. Монтируем зашифрованный будущий домашний раздел.
9. Копируем на него структуру раздела /home без изменений.
10. Перезагружаем систему, вводим при загрузке пароль и работаем с домашним зашифрованным разделом на отдельном логическом диске.

Подведём итоги. Магические слова:
{
/dev/sdaN - раздел, который будет зашифрован и станет домашним;
name - имя, эдакая метка зашифрованного раздела.
В моём случае N=3; name=home; файловая система - ext3; текстовый редактор - gedit
}
0. apt-get install dmsetup cryptsetup fuse-utils
1. mkfs -t ext3 /dev/sdaN
2. dd if=/dev/urandom of=/dev/sdaN
3. cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat /dev/sdaN
4. gedit /etc/crypttab
добавляем строчку:
name /dev/sdaN none luks,cipher=aes-cbc-essiv:sha256
5. /etc/init.d/cryptdisks restart
6. mkfs -t ext3 /dev/mapper/name
7. gedit /etc/fstab
комментируем строку с /home, если она была;
добавляем другую:
/dev/mapper/name /home ext3 defaults
8. mkdir /mnt/home; mount /dev/mapper/name /mnt/home
9. cp -axv /home/* /mnt/home/
10. reboot

И помните, если Вы не страдаете паранойей, то это ещё вовсе не означает, что ОНИ за Вами не наблюдают... :-)

пятница, 11 апреля 2008 г.

Размер директорий

du -ah --max-depth=1

или с сортировкой

du -a --max-depth=1 | sort -n

Восстановление загрузчика GRUB

Последнее время часто экспериментирую с операционными системами, и при установке некоторых из них, таких как Linux, Mac OS X или Windows, затирается главная загрузочная запись (MBR). Для восстановления ее можно использовать LiveCD дистрибутив Линукс (Ubuntu, Knoppix), также можно восстановить с помощью Debian "Etch".

Этот пример показывает как восстановить загрузчик GRUB Loader при помощи LiveCD Ubuntu Linux

Прежде всего ставим в BIOS загрузку с CD. [First Boot]
Далее запускаемся с LiveCD дистрибутива...

..и работаем в консоли (терминале):

~$ sudo grub
> _
утилита будет ожидать ваших действий

ищем загрузчик:
> find /boot/grub/stage2
(hd0,2)

подменили рута
> root (hd0,2)

устанавливаем GRUB на hd0:
> setup (hd0)

На этом всё ;)

среда, 9 апреля 2008 г.

Добавляем информацию для восстановления архивов с помощью par2

В этой заметке я предложу способ чтения данных с поцарапанных, погрызанных собакой или обработанных шредером компакт-дисков.

Итак, к делу: регулярно, при записывании данных на диск, остается некоторое количество свободного места. Лет 5 назад можно было положить диск на полочку, пометив, что еще 30 мегабайт можно забить каким-нибудь хламом, но сейчас стоимость болванки - 10 рублей, такой аргумент не действует. И, соответственно, привычку оставлять место “на потом” надо искоренять. Мне кажется, наиболее разумным было бы добавить на диск данные для восстановления - т.н. корректирующие коды Рида-Соломона, которые могу пригодится, в случае, если диск будет поврежден.

Собственно весь заговор выглядит следующим образом:
#sudo aptitude install par2
#man par2
#cd backups
#ls
dump.sql.gz
#par2 create -v -r10 -n1 -m500 dump.sql.gz
#ls
dump.sql.gz dump.sql.gz.par2 dump.sql.gz.vol000+100.par2

Эта команда добавит 10% избыточной информации к данным, запишет все это в один файл, при этом программе par2 разрешено использовать 500 мегабайт оперативной памяти. Файлы *.par2 следует записать на диск вместе с дампом.

Мне эта программа понравилась, я захотел ее проверить в боевых условиях. Сделал архив размером около 400 Мб, добавил данные для восстановления - еще 200Мб - *.par2 файлы (50% избыточность, по умолчанию - 5%). Все это я записал на CD-RW, в котором потом сделал, простите, дырку. В итоге стандартными средствами удавалось прочитать только первые 150 Кб данных. Чтобы восстановить файл нужно сначала все считать пускай с ошибками - для этого есть программа dd_rescue, которая является практчески полным аналогом dd с одним исключением - она умеет игнорировать ошибки чтения:

диск с дыркой

#sudo dd_rescue -Av -b 1048576 -B 1048576 /dev/scd0 brokencd.iso(-A - заполняь нулями те участки файла, которые считать не удалось, v - verbose, -b - размер блока данных, -B - размер блока данных для проблемных областей диска)
# sudo mount -o loop brokencd.iso mnt # монтируем получившийся образ диска
# cp mnt/* dump; cd dump # копируем содержимое
# par2 r archive.par2 # приводим в изначальный вид

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

Постоянная ссылка: 2008-04-10 02:08

ubuntu 7.10 with 9600 gt

Отсюда

Делать было нечего, дело было вечером. Вот решил немного по тестировать линукс для x86_64. Выбор пал на ubuntu 7.10. Загрузка сразу не удалась, наверно виновата видео карточка 9600 gt. Пришлось запуститься в безопасном графическом режиме. Загрузка шла “вслепую” (без splash screen), лишь похрустывание hdd и моргание диодов на системнике, ни давало отчаиваться. После диких переживаний и практически полной потери веры в успех загрузки, длившихся в течении 30 секунд. Ubuntu спела.

С установкой проблем ни возникло - так же как и в 32 битной версии. Правда, после установки, первый запуск свеженькой системы длился о-о-о-очень долго. После запуска Ubuntu быстренько обнаружила для себя - 204 обновления.

Обновился и система загрузилась быстро, сразу понял, что ни зря ей понадобились эти обновления. Правда загрузка происходит, без splash screen, но напильник поможет с этим разобраться, а пока разберемся с видео. А то cooler на видео крутиться как ненормальный - драйверов просит.

Я с просил у google, как мне драйвера получить, и ответил google envy . Но envy ни подерживает установку драйверов 171.06 - хотя он помог установить всё, что нужно для ручной установки. Качаем драйвера с сайта nvidia в свой домашний каталог.

И так процедура проста. жмём ctrl+ alt+f1. Логинемся под своей учёткой, вводим команду sudo su вводим свой пароль и вот вы всемогущий root.

sh ~wild/NVIDIA-Linux-x86_64-171.06-pkg2.run отвечаем на всякие вопросики.

теперь правим файлик

nano /etc/default/linux-restricted-modules-common

DISABLED_MODULES=”nv” #добавляем nv что бы он не мешал драйверам от nvidia

Перезагружаемся и вот в момент появления gdm вентилятор видео карточки находит покой. compiz-fusion начинает работать.

Решил зайти на youtube, firefox преложил установить flash - плагин. Мой выбор пал adobe flash. Плагин установился, ФФ попросил перезапуститься. Просьбу выполнил, а flash ни заработал.

p.s.: Данная статья ни претендует на руководство.

p.p.s: Данная статья - вообще ни претендует.

p.p.p.s: А главное в этой “сказки” то что 4GB оперативки показывается как 3,9gb а ни 3,2gn как в 32х битной версии.

Вместо happy end:

До выхода 8.04 осталось чуть-чуть.

понедельник, 7 апреля 2008 г.

Bontmia скрипт бакупа

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

Домашняя страница

MySql backup

скрипт для инкрементного бакупа баз MySql

#!/bin/bash
#
# MySQL Backup Script
# VER. 2.5 - http://sourceforge.net/projects/automysqlbackup/
# Copyright (c) 2002-2003 wipe_out@lycos.co.uk
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#=====================================================================
#=====================================================================
# Set the following variables to your system needs
# (Detailed instructions below variables)
#=====================================================================

# Username to access the MySQL server e.g. dbuser
USERNAME=dbuser

# Username to access the MySQL server e.g. password
PASSWORD=password

# Host name (or IP address) of MySQL server e.g localhost
DBHOST=localhost

# List of DBNAMES for Daily/Weekly Backup e.g. "DB1 DB2 DB3"
DBNAMES="DB1 DB2 DB3"

# Backup directory location e.g /backups
BACKUPDIR="/backups"

# Mail setup
# What would you like to be mailed to you?
# - log : send only log file
# - files : send log file and sql files as attachments (see docs)
# - stdout : will simply output the log to the screen if run manually.
# - quiet : Only send logs if an error occurs to the MAILADDR.
MAILCONTENT="stdout"

# Set the maximum allowed email size in k. (4000 = approx 5MB email [see docs])
MAXATTSIZE="4000"

# Email Address to send mail to? (user@domain.com)
MAILADDR="user@domain.com"


# ============================================================
# === ADVANCED OPTIONS ( Read the doc's below for details )===
#=============================================================

# List of DBBNAMES for Monthly Backups.
MDBNAMES="mysql $DBNAMES"

# List of DBNAMES to EXLUCDE if DBNAMES are set to all (must be in " quotes)
DBEXCLUDE=""

# Include CREATE DATABASE in backup?
CREATE_DATABASE=yes

# Separate backup directory and file for each DB? (yes or no)
SEPDIR=yes

# Which day do you want weekly backups? (1 to 7 where 1 is Monday)
DOWEEKLY=6

# Choose Compression type. (gzip or bzip2)
COMP=gzip

# Compress communications between backup server and MySQL server?
COMMCOMP=no

# Additionally keep a copy of the most recent backup in a seperate directory.
LATEST=no

# The maximum size of the buffer for client/server communication. e.g. 16MB (maximum is 1GB)
MAX_ALLOWED_PACKET=

# For connections to localhost. Sometimes the Unix socket file must be specified.
SOCKET=

# Command to run before backups (uncomment to use)
#PREBACKUP="/etc/mysql-backup-pre"

# Command run after backups (uncomment to use)
#POSTBACKUP="/etc/mysql-backup-post"

#=====================================================================
# Options documantation
#=====================================================================
# Set USERNAME and PASSWORD of a user that has at least SELECT permission
# to ALL databases.
#
# Set the DBHOST option to the server you wish to backup, leave the
# default to backup "this server".(to backup multiple servers make
# copies of this file and set the options for that server)
#
# Put in the list of DBNAMES(Databases)to be backed up. If you would like
# to backup ALL DBs on the server set DBNAMES="all".(if set to "all" then
# any new DBs will automatically be backed up without needing to modify
# this backup script when a new DB is created).
#
# If the DB you want to backup has a space in the name replace the space
# with a % e.g. "data base" will become "data%base"
# NOTE: Spaces in DB names may not work correctly when SEPDIR=no.
#
# You can change the backup storage location from /backups to anything
# you like by using the BACKUPDIR setting..
#
# The MAILCONTENT and MAILADDR options and pretty self explanitory, use
# these to have the backup log mailed to you at any email address or multiple
# email addresses in a space seperated list.
# (If you set mail content to "log" you will require access to the "mail" program
# on your server. If you set this to "files" you will have to have mutt installed
# on your server. If you set it to "stdout" it will log to the screen if run from
# the console or to the cron job owner if run through cron. If you set it to "quiet"
# logs will only be mailed if there are errors reported. )
#
# MAXATTSIZE sets the largest allowed email attachments total (all backup files) you
# want the script to send. This is the size before it is encoded to be sent as an email
# so if your mail server will allow a maximum mail size of 5MB I would suggest setting
# MAXATTSIZE to be 25% smaller than that so a setting of 4000 would probably be fine.
#
# Finally copy automysqlbackup.sh to anywhere on your server and make sure
# to set executable permission. You can also copy the script to
# /etc/cron.daily to have it execute automatically every night or simply
# place a symlink in /etc/cron.daily to the file if you wish to keep it
# somwhere else.
# NOTE:On Debian copy the file with no extention for it to be run
# by cron e.g just name the file "automysqlbackup"
#
# Thats it..
#
#
# === Advanced options doc's ===
#
# The list of MDBNAMES is the DB's to be backed up only monthly. You should
# always include "mysql" in this list to backup your user/password
# information along with any other DBs that you only feel need to
# be backed up monthly. (if using a hosted server then you should
# probably remove "mysql" as your provider will be backing this up)
# NOTE: If DBNAMES="all" then MDBNAMES has no effect as all DBs will be backed
# up anyway.
#
# If you set DBNAMES="all" you can configure the option DBEXCLUDE. Other
# wise this option will not be used.
# This option can be used if you want to backup all dbs, but you want
# exclude some of them. (eg. a db is to big).
#
# Set CREATE_DATABASE to "yes" (the default) if you want your SQL-Dump to create
# a database with the same name as the original database when restoring.
# Saying "no" here will allow your to specify the database name you want to
# restore your dump into, making a copy of the database by using the dump
# created with automysqlbackup.
# NOTE: Not used if SEPDIR=no
#
# The SEPDIR option allows you to choose to have all DBs backed up to
# a single file (fast restore of entire server in case of crash) or to
# seperate directories for each DB (each DB can be restored seperately
# in case of single DB corruption or loss).
#
# To set the day of the week that you would like the weekly backup to happen
# set the DOWEEKLY setting, this can be a value from 1 to 7 where 1 is Monday,
# The default is 6 which means that weekly backups are done on a Saturday.
#
# COMP is used to choose the copmression used, options are gzip or bzip2.
# bzip2 will produce slightly smaller files but is more processor intensive so
# may take longer to complete.
#
# COMMCOMP is used to enable or diable mysql client to server compression, so
# it is useful to save bandwidth when backing up a remote MySQL server over
# the network.
#
# LATEST is to store an additional copy of the latest backup to a standard
# location so it can be downloaded bt thrid party scripts.
#
# If the DB's being backed up make use of large BLOB fields then you may need
# to increase the MAX_ALLOWED_PACKET setting, for example 16MB..
#
# When connecting to localhost as the DB server (DBHOST=localhost) sometimes
# the system can have issues locating the socket file.. This can now be set
# using the SOCKET parameter.. An example may be SOCKET=/private/tmp/mysql.sock
#
# Use PREBACKUP and POSTBACKUP to specify Per and Post backup commands
# or scripts to perform tasks either before or after the backup process.
#
#
#=====================================================================
# Backup Rotation..
#=====================================================================
#
# Daily Backups are rotated weekly..
# Weekly Backups are run by default on Saturday Morning when
# cron.daily scripts are run...Can be changed with DOWEEKLY setting..
# Weekly Backups are rotated on a 5 week cycle..
# Monthly Backups are run on the 1st of the month..
# Monthly Backups are NOT rotated automatically...
# It may be a good idea to copy Monthly backups offline or to another
# server..
#
#=====================================================================
# Please Note!!
#=====================================================================
#
# I take no resposibility for any data loss or corruption when using
# this script..
# This script will not help in the event of a hard drive crash. If a
# copy of the backup has not be stored offline or on another PC..
# You should copy your backups offline regularly for best protection.
#
# Happy backing up...
#
#=====================================================================
# Restoring
#=====================================================================
# Firstly you will need to uncompress the backup file.
# eg.
# gunzip file.gz (or bunzip2 file.bz2)
#
# Next you will need to use the mysql client to restore the DB from the
# sql file.
# eg.
# mysql --user=username --pass=password --host=dbserver database < /path/file.sql
# or
# mysql --user=username --pass=password --host=dbserver -e "source /path/file.sql" database
#
# NOTE: Make sure you use "<" and not ">" in the above command because
# you are piping the file.sql to mysql and not the other way around.
#
# Lets hope you never have to use this.. :)
#
#=====================================================================
# Change Log
#=====================================================================
#
# VER 2.5 - (2006-01-15)
# Added support for setting MAXIMUM_PACKET_SIZE and SOCKET parameters (suggested by Yvo van Doorn)
# VER 2.4 - (2006-01-23)
# Fixed bug where weekly backups were not being rotated. (Fix by wolf02)
# Added hour an min to backup filename for the case where backups are taken multiple
# times in a day. NOTE This is not complete support for mutiple executions of the script
# in a single day.
# Added MAILCONTENT="quiet" option, see docs for details. (requested by snowsam)
# Updated path statment for compatibility with OSX.
# Added "LATEST" to additionally store the last backup to a standard location. (request by Grant29)
# VER 2.3 - (2005-11-07)
# Better error handling and notification of errors (a long time coming)
# Compression on Backup server to MySQL server communications.
# VER 2.2 - (2004-12-05)
# Changed from using depricated "-N" to "--skip-column-names".
# Added ability to have compressed backup's emailed out. (code from Thomas Heiserowski)
# Added maximum attachment size setting.
# VER 2.1 - (2004-11-04)
# Fixed a bug in daily rotation when not using gzip compression. (Fix by Rob Rosenfeld)
# VER 2.0 - (2004-07-28)
# Switched to using IO redirection instead of pipeing the output to the logfile.
# Added choice of compression of backups being gzip of bzip2.
# Switched to using functions to facilitate more functionality.
# Added option of either gzip or bzip2 compression.
# VER 1.10 - (2004-07-17)
# Another fix for spaces in the paths (fix by Thomas von Eyben)
# Fixed bug when using PREBACKUP and POSTBACKUP commands containing many arguments.
# VER 1.9 - (2004-05-25)
# Small bug fix to handle spaces in LOGFILE path which contains spaces (reported by Thomas von Eyben)
# Updated docs to mention that Log email can be sent to multiple email addresses.
# VER 1.8 - (2004-05-01)
# Added option to make backups restorable to alternate database names
# meaning that a copy of the database can be created (Based on patch by Rene Hoffmann)
# Seperated options into standard and advanced.
# Removed " from single file dump DBMANES because it caused an error but
# this means that if DB's have spaces in the name they will not dump when SEPDIR=no.
# Added -p option to mkdir commands to create multiple subdirs without error.
# Added disk usage and location to the bottom of the backup report.
# VER 1.7 - (2004-04-22)
# Fixed an issue where weelky backups would only work correctly if server
# locale was set to English (issue reported by Tom Ingberg)
# used "eval" for "rm" commands to try and resolve rotation issues.
# Changed name of status log so multiple scripts can be run at the same time.
# VER 1.6 - (2004-03-14)
# Added PREBACKUP and POSTBACKUP command functions. (patch by markpustjens)
# Added support for backing up DB's with Spaces in the name.
# (patch by markpustjens)
# VER 1.5 - (2004-02-24)
# Added the ability to exclude DB's when the "all" option is used.
# (Patch by kampftitan)
# VER 1.4 - (2004-02-02)
# Project moved to Sourceforge.net
# VER 1.3 - (2003-09-25)
# Added support for backing up "all" databases on the server without
# having to list each one seperately in the configuration.
# Added DB restore instructions.
# VER 1.2 - (2003-03-16)
# Added server name to the backup log so logs from multiple servers
# can be easily identified.
# VER 1.1 - (2003-03-13)
# Small Bug fix in monthly report. (Thanks Stoyanski)
# Added option to email log to any email address. (Inspired by Stoyanski)
# Changed Standard file name to .sh extention.
# Option are set using yes and no rather than 1 or 0.
# VER 1.0 - (2003-01-30)
# Added the ability to have all databases backup to a single dump
# file or seperate directory and file for each database.
# Output is better for log keeping.
# VER 0.6 - (2003-01-22)
# Bug fix for daily directory (Added in VER 0.5) rotation.
# VER 0.5 - (2003-01-20)
# Added "daily" directory for daily backups for neatness (suggestion by Jason)
# Added DBHOST option to allow backing up a remote server (Suggestion by Jason)
# Added "--quote-names" option to mysqldump command.
# Bug fix for handling the last and first of the year week rotation.
# VER 0.4 - (2002-11-06)
# Added the abaility for the script to create its own directory structure.
# VER 0.3 - (2002-10-01)
# Changed Naming of Weekly backups so they will show in order.
# VER 0.2 - (2002-09-27)
# Corrected weekly rotation logic to handle weeks 0 - 10
# VER 0.1 - (2002-09-21)
# Initial Release
#
#=====================================================================
#=====================================================================
#=====================================================================
#
# Should not need to be modified from here down!!
#
#=====================================================================
#=====================================================================
#=====================================================================
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin
DATE=`date +%Y-%m-%d_%Hh%Mm` # Datestamp e.g 2002-09-21
DOW=`date +%A` # Day of the week e.g. Monday
DNOW=`date +%u` # Day number of the week 1 to 7 where 1 represents Monday
DOM=`date +%d` # Date of the Month e.g. 27
M=`date +%B` # Month e.g January
W=`date +%V` # Week Number e.g 37
VER=2.5 # Version Number
LOGFILE=$BACKUPDIR/$DBHOST-`date +%N`.log # Logfile Name
LOGERR=$BACKUPDIR/ERRORS_$DBHOST-`date +%N`.log # Logfile Name
BACKUPFILES=""
OPT="--quote-names --opt" # OPT string for use with mysqldump ( see man mysqldump )

# Add --compress mysqldump option to $OPT
if [ "$COMMCOMP" = "yes" ];
then
OPT="$OPT --compress"
fi

# Add --compress mysqldump option to $OPT
if [ "$MAX_ALLOWED_PACKET" ];
then
OPT="$OPT --max_allowed_packet=$MAX_ALLOWED_PACKET"
fi

# Create required directories
if [ ! -e "$BACKUPDIR" ] # Check Backup Directory exists.
then
mkdir -p "$BACKUPDIR"
fi

if [ ! -e "$BACKUPDIR/daily" ] # Check Daily Directory exists.
then
mkdir -p "$BACKUPDIR/daily"
fi

if [ ! -e "$BACKUPDIR/weekly" ] # Check Weekly Directory exists.
then
mkdir -p "$BACKUPDIR/weekly"
fi

if [ ! -e "$BACKUPDIR/monthly" ] # Check Monthly Directory exists.
then
mkdir -p "$BACKUPDIR/monthly"
fi

if [ "$LATEST" = "yes" ]
then
if [ ! -e "$BACKUPDIR/latest" ] # Check Latest Directory exists.
then
mkdir -p "$BACKUPDIR/latest"
fi
eval rm -fv "$BACKUPDIR/latest/*"
fi

# IO redirection for logging.
touch $LOGFILE
exec 6>&1 # Link file descriptor #6 with stdout.
# Saves stdout.
exec > $LOGFILE # stdout replaced with file $LOGFILE.
touch $LOGERR
exec 7>&2 # Link file descriptor #7 with stderr.
# Saves stderr.
exec 2> $LOGERR # stderr replaced with file $LOGERR.


# Functions

# Database dump function
dbdump () {
mysqldump --user=$USERNAME --password=$PASSWORD --host=$DBHOST $OPT $1 > $2
return 0
}

# Compression function plus latest copy
SUFFIX=""
compression () {
if [ "$COMP" = "gzip" ]; then
gzip -f "$1"
echo
echo Backup Information for "$1"
gzip -l "$1.gz"
SUFFIX=".gz"
elif [ "$COMP" = "bzip2" ]; then
echo Compression information for "$1.bz2"
bzip2 -f -v $1 2>&1
SUFFIX=".bz2"
else
echo "No compression option set, check advanced settings"
fi
if [ "$LATEST" = "yes" ]; then
cp $1$SUFFIX "$BACKUPDIR/latest/"
fi
return 0
}


# Run command before we begin
if [ "$PREBACKUP" ]
then
echo ======================================================================
echo "Prebackup command output."
echo
eval $PREBACKUP
echo
echo ======================================================================
echo
fi


if [ "$SEPDIR" = "yes" ]; then # Check if CREATE DATABSE should be included in Dump
if [ "$CREATE_DATABASE" = "no" ]; then
OPT="$OPT --no-create-db"
else
OPT="$OPT --databases"
fi
else
OPT="$OPT --databases"
fi

# Hostname for LOG information
if [ "$DBHOST" = "localhost" ]; then
HOST=`hostname`
if [ "$SOCKET" ]; then
OPT="$OPT --socket=$SOCKET"
fi
else
HOST=$DBHOST
fi

# If backing up all DBs on the server
if [ "$DBNAMES" = "all" ]; then
DBNAMES="`mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST --batch --skip-column-names -e "show databases"| sed 's/ /%/g'`"

# If DBs are excluded
for exclude in $DBEXCLUDE
do
DBNAMES=`echo $DBNAMES | sed "s/\b$exclude\b//g"`
done

MDBNAMES=$DBNAMES
fi

echo ======================================================================
echo AutoMySQLBackup VER $VER
echo http://sourceforge.net/projects/automysqlbackup/
echo
echo Backup of Database Server - $HOST
echo ======================================================================

# Test is seperate DB backups are required
if [ "$SEPDIR" = "yes" ]; then
echo Backup Start Time `date`
echo ======================================================================
# Monthly Full Backup of all Databases
if [ $DOM = "01" ]; then
for MDB in $MDBNAMES
do

# Prepare $DB for using
MDB="`echo $MDB | sed 's/%/ /g'`"

if [ ! -e "$BACKUPDIR/monthly/$MDB" ] # Check Monthly DB Directory exists.
then
mkdir -p "$BACKUPDIR/monthly/$MDB"
fi
echo Monthly Backup of $MDB...
dbdump "$MDB" "$BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql"
compression "$BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql"
BACKUPFILES="$BACKUPFILES $BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql$SUFFIX"
echo ----------------------------------------------------------------------
done
fi

for DB in $DBNAMES
do
# Prepare $DB for using
DB="`echo $DB | sed 's/%/ /g'`"

# Create Seperate directory for each DB
if [ ! -e "$BACKUPDIR/daily/$DB" ] # Check Daily DB Directory exists.
then
mkdir -p "$BACKUPDIR/daily/$DB"
fi

if [ ! -e "$BACKUPDIR/weekly/$DB" ] # Check Weekly DB Directory exists.
then
mkdir -p "$BACKUPDIR/weekly/$DB"
fi

# Weekly Backup
if [ $DNOW = $DOWEEKLY ]; then
echo Weekly Backup of Database \( $DB \)
echo Rotating 5 weeks Backups...
if [ "$W" -le 05 ];then
REMW=`expr 48 + $W`
elif [ "$W" -lt 15 ];then
REMW=0`expr $W - 5`
else
REMW=`expr $W - 5`
fi
eval rm -fv "$BACKUPDIR/weekly/$DB_week.$REMW.*"
echo
dbdump "$DB" "$BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql"
compression "$BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql"
BACKUPFILES="$BACKUPFILES $BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql$SUFFIX"
echo ----------------------------------------------------------------------

# Daily Backup
else
echo Daily Backup of Database \( $DB \)
echo Rotating last weeks Backup...
eval rm -fv "$BACKUPDIR/daily/$DB/*.$DOW.sql.*"
echo
dbdump "$DB" "$BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql"
compression "$BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql"
BACKUPFILES="$BACKUPFILES $BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql$SUFFIX"
echo ----------------------------------------------------------------------
fi
done
echo Backup End `date`
echo ======================================================================


else # One backup file for all DBs
echo Backup Start `date`
echo ======================================================================
# Monthly Full Backup of all Databases
if [ $DOM = "01" ]; then
echo Monthly full Backup of \( $MDBNAMES \)...
dbdump "$MDBNAMES" "$BACKUPDIR/monthly/$DATE.$M.all-databases.sql"
compression "$BACKUPDIR/monthly/$DATE.$M.all-databases.sql"
BACKUPFILES="$BACKUPFILES $BACKUPDIR/monthly/$DATE.$M.all-databases.sql$SUFFIX"
echo ----------------------------------------------------------------------
fi

# Weekly Backup
if [ $DNOW = $DOWEEKLY ]; then
echo Weekly Backup of Databases \( $DBNAMES \)
echo
echo Rotating 5 weeks Backups...
if [ "$W" -le 05 ];then
REMW=`expr 48 + $W`
elif [ "$W" -lt 15 ];then
REMW=0`expr $W - 5`
else
REMW=`expr $W - 5`
fi
eval rm -fv "$BACKUPDIR/weekly/week.$REMW.*"
echo
dbdump "$DBNAMES" "$BACKUPDIR/weekly/week.$W.$DATE.sql"
compression "$BACKUPDIR/weekly/week.$W.$DATE.sql"
BACKUPFILES="$BACKUPFILES $BACKUPDIR/weekly/week.$W.$DATE.sql$SUFFIX"
echo ----------------------------------------------------------------------

# Daily Backup
else
echo Daily Backup of Databases \( $DBNAMES \)
echo
echo Rotating last weeks Backup...
eval rm -fv "$BACKUPDIR/daily/*.$DOW.sql.*"
echo
dbdump "$DBNAMES" "$BACKUPDIR/daily/$DATE.$DOW.sql"
compression "$BACKUPDIR/daily/$DATE.$DOW.sql"
BACKUPFILES="$BACKUPFILES $BACKUPDIR/daily/$DATE.$DOW.sql$SUFFIX"
echo ----------------------------------------------------------------------
fi
echo Backup End Time `date`
echo ======================================================================
fi
echo Total disk space used for backup storage..
echo Size - Location
echo `du -hs "$BACKUPDIR"`
echo
echo ======================================================================
echo If you find AutoMySQLBackup valuable please make a donation at
echo http://sourceforge.net/project/project_donations.php?group_id=101066
echo ======================================================================

# Run command when we're done
if [ "$POSTBACKUP" ]
then
echo ======================================================================
echo "Postbackup command output."
echo
eval $POSTBACKUP
echo
echo ======================================================================
fi

#Clean up IO redirection
exec 1>&6 6>&- # Restore stdout and close file descriptor #6.
exec 1>&7 7>&- # Restore stdout and close file descriptor #7.

if [ "$MAILCONTENT" = "files" ]
then
if [ -s "$LOGERR" ]
then
# Include error log if is larger than zero.
BACKUPFILES="$BACKUPFILES $LOGERR"
ERRORNOTE="WARNING: Error Reported - "
fi
#Get backup size
ATTSIZE=`du -c $BACKUPFILES | grep "[[:digit:][:space:]]total$" |sed s/\s*total//`
if [ $MAXATTSIZE -ge $ATTSIZE ]
then
BACKUPFILES=`echo "$BACKUPFILES" | sed -e "s# # -a #g"` #enable multiple attachments
mutt -s "$ERRORNOTE MySQL Backup Log and SQL Files for $HOST - $DATE" $BACKUPFILES $MAILADDR < $LOGFILE #send via mutt
else
cat "$LOGFILE" | mail -s "WARNING! - MySQL Backup exceeds set maximum attachment size on $HOST - $DATE" $MAILADDR
fi
elif [ "$MAILCONTENT" = "log" ]
then
cat "$LOGFILE" | mail -s "MySQL Backup Log for $HOST - $DATE" $MAILADDR
if [ -s "$LOGERR" ]
then
cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR
fi
elif [ "$MAILCONTENT" = "quiet" ]
then
if [ -s "$LOGERR" ]
then
cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR
cat "$LOGFILE" | mail -s "MySQL Backup Log for $HOST - $DATE" $MAILADDR
fi
else
if [ -s "$LOGERR" ]
then
cat "$LOGFILE"
echo
echo "###### WARNING ######"
echo "Errors reported during AutoMySQLBackup execution.. Backup failed"
echo "Error log below.."
cat "$LOGERR"
else
cat "$LOGFILE"
fi
fi

if [ -s "$LOGERR" ]
then
STATUS=1
else
STATUS=0
fi

# Clean up Logfile
eval rm -f "$LOGFILE"
eval rm -f "$LOGERR"

exit $STATUS

среда, 2 апреля 2008 г.

Настройка переключателя раскладки в KDE - прощайте, тормоза!

взято отсюда

Переключалка раскладки KDE (kxkb) - пожалуй, одна из наиболее известных компонент этой замечтательной среды. Она является объектом многочисленных шуток в адрес KDE, и неоспоримым аргументом в холиварах на тему "Gnome vs KDE". Действительно, очень странно, что у разработчиков так и не дошли руки привести переключатель в порядок. Те,м не менее, это не конец света. Есть простой и довольно известный способ избавиться от проблем с переключателем.

Итак, чтобы избавиться от проблем с переключателем раскладки KDE, можно воспользоваться простым и надежным способом: отключить его! А Вы думали, я расскажу, как правильно его настраивать? С Первым апреля Вас! :-)

Тема, пожалуй, довольно избитая, но, как ни странно, далеко не все еще удосужились отключить kxkb. Если Вы тоже не в восторге от него, советую Вам это сделать. А если Вы еще не успели его настроить, то и не делайте это. С задачей переключения раскладки куда лучше справляется Xorg. На него мы и возложим эту задачу.

Рецепт:
1. Возьмите кофиг Xorg:

$ sudo vim /etc/X11/xorg.conf

2. Найдите раздел, описывающий конфигурацию клавиатуры. У меня он выглядел следующим образом.

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
EndSection

3. Добавьте сюда русскую раскладку. Вот что у меня вышло в итоге.

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us,ru"
Option "XkbVariant" ",winkeys"
Option "XkbOptions" "grp_led:caps,grp:caps_toggle"
EndSection

Ключевыми элементами конфига являются следующие опции.

"XkbLayout" "us,ru" - включаем две раскладки клавиатуры.

"XkbVariant" ",winkeys" - указываем вариант раскладки для русского языка. Я включил стандартный для Windows вариант, т.к. уже довольно сильно привык к нему. Если не указывать эту опцию, то знаки пунктуации и другие спец символы в русской раскладке будут расположены подругому.

"XkbOptions" "grp_led:scroll,grp:caps_toggle" - дополнительные настройки. "grp_led:casp" - индикация раскладки с помощью лампочки Caps Lock. "grp:caps_toggle" - переключение раскладки с помощью клавиши Caps Lock. Если не нравится переключать капсом, можете указать "grp:ctrl_shift_toggle" или другое по своему вкусу.

4. Если вы уже успели включить переключатель kxkb, то запустите центр управления и отключите его.

5. Перезапустите Xorg. Для этого завершите сеанс, и затем нажмите Ctrl+Alt+BackSpace.

Все! Теперь вы можете наслаждаться молниеносной реакцией клавиатуры на требование переключить раскладку. К тому же, имхо, этот способ настройки переключателя гораздо более прозрачный и простой, чем настройка с помощью центра управления. С последним мне пришлось немало повоевать прежде, чем переключатель заработал.

Однако, все-таки, это не совсем все. Теперь у нас нет индикатора раскладки клавиатуры :-) Но это поправить еще проще. Просто установите kkbswitch:

$ sudo apt-get install kkbswitch

Запустите его: Alt+F2, kkbswitch. Через контекстное меню настройте по вкусу и включите автозапуск.

Стоит заметить, что текущая версия kkbswitch в репозитории Debian Lenny и Ubuntu довльно глючная. Индикатор иногда вылетает во время настройки, а также отказывается отображать коды языков. Я установил отображение флагов и больше не трогаю его - мне этого вполне достаточно. Если же Вас это не устраивает, то предыдущая статья - Вам в помощь. В ней Mak_s рассказал о своих сражениях с этим индикатором, которые, надо сказать, завершились довольно успешно :-)

обновляем время

ставим нормальный редактор по умолчанию (nano , kwrite)


squid:/home/kmb # which kwrite
/opt/kde3/bin/kwrite
squid:/home/kmb # export EDITOR=/opt/kde3/bin/kwrite
squid:/home/kmb # crontab -e

и добавляем
* 0 * * * ntpdate ntp.ru


список серверов до кучи

Использование wget

взято отсюда

Пратические примеры применения wget. В принципе, всё ниже изложенное вы можете узнать набрав в командной строке man wget. Здесь я записываю примеры из своей повседневной практики.

wget --limit-rate=50k -с -i download.lst

Позволяет скачать список файлов из файла download.lst. URL каждого файла записывается на отдельной строчке.

*
Ключик -i указывает на файл со списком.
*
Ключик –limit-rate= позволяет ограничить скорость скачивания.
*
Ключик -c указывает, что если файл с таким именем уже существует, его следует докачать. Иначе файл будет скачан в новый файл с добавленым числовым индексом.

wget -r -np -c

Позволяет выкачать сайт целиком. Рекурсивно проходится по всем найденным на странице ссылкам, выкачивает их. Если выкачана новая страница - повторяет. В результате весь сайт с картинками и файлами у вас в кармане.

*
Ключик -r указывает, что надо рекурсивно ходить по ссылкам.
*
Ключик -np не даёт wget'у выкачать весь сайт целиком, если вам нужна только какая-то часть. К примеру, если вы задали URL http://www.linuxcenter.ru/lib/articles/programming/?pid=4706 то будут выкачаны только статьи по программированию.

wget -p -k

Выкачивает указанную страницу с картинками и оформлением.

*
Ключ -p указывает, что дополнительно к странице нужно скачать файлы необходимые для корректного отображения страницы в оффлайн.
*
Ключ -k заставляет wget преобразовать все внешние, по отношению к странице, ссылки таким образом, что бы они вели на оригинальный сайт.

— Ivan A-R 02.04.2008 12:13

вторник, 1 апреля 2008 г.

RegExp сервис

отсюда

Еще о RegExp: TXT2re.com

Не скажу, что сервис отличается практичностью, но идея заложена здравая и реализация вроде неплохая, но как-то несколько однобокая что ли...

В общем, здесь, наборот, - пишем строку символов, из которой надо что-то выделить. А потом по разобранному шаблону строим Regexp.

Сразу выдается код на полутора десятке языков - от перла до vb.net.
Не рекомендовал бы использовать этот код как универсальный. В общем, чисто академический инетерес.