Настройка двусторонней синхронизации файлов с помощью unison

Настройка двусторонней синхронизации файлов с помощью unison

Для решения задачи по синхронизации данных между двумя машинами, в ситуации
когда изменения могут появиться на каждом из компьютеров, прекрасно подходит
утилита unison (http://www.cis.upenn.edu/~bcpierce/unison/). При синхронизации
между удаленными машинами в качестве транспорта может использоваться ssh. При
обнаружении конфликтов, например, когда на обоих машинах отредактирован один и
тот же файл, unison пытается разрешить конфликт автоматически, а если это не
удается предоставляет пользователю интерфейс для принятия решения.

Устанавливаем unison.

Fedora/RHEL/CentOS:

   sudo yum install unison

Debian/Ubuntu:

   sudo apt-get install unison

FreeBSD:

   $ cd /usr/ports/net/unison/ && make install

Синхронизируем две локальные директории:

   unison /test1 /test2

В процессе будет выводиться статистика и задаваться вопросы, касающаяся
синхронизации и разрешения конфликтов, направление копирования будет указано стрелкой.

Для синхронизации с удаленной директорией необходимо указать:

   unison /test1 ssh://testserver.test.ru//test1

Чтобы выполнить синхронизацию автоматически, без интерактивного взаимодействия
с пользователем необходимо использовать опцию «-batch». В случае конфликта,
выполнение будет прервано с выводом соответствующего уведомления.

Для определения сложной политики синхронизации можно создать файл конфигурации
с определением параметров.

Например, создаем файл ~/.unison/test.prf:

   # Определяем список директорий, которые будут синхронизированы
   root = /home/project
   root = /mnt/NFS/home/project
 
   # Указываем сохранять права доступа и владельца
   owner = true
   times = true
 
   # Определяем список поддиректорий, которые нужно синхронизировать, остальное игнорируем:
   path = cgi-bin
   path = htdocs
   path = conf
 
   # Определяем маски для файлов, которые не нужно синхронизировать
   ignore = Name .htaccess
   ignore = Name *~
   ignore = Name .*~
   ignore = Path conf/project.conf
   ignore = Path htdocs/rrd
   ignore = Path htdocs/mon
   ignore = Name *.o
   ignore = Name *.tmp
   ignore = Name *.log
   ignore = Name *.gz
   ignore = Name *.iso
   ignore = Name {,.}*{.old}
 
   # Копируем в резервные копии изменяемых файлов в отдельную  директорию
   backup = Name *
   backups = true
   backupdir = /home/project/backup
 
   # Определяем свою команду для отображения отличий между копиями файлов при конфликте
   #diff = diff -y -W 79 --suppress-common-lines
 
   # Сохраняем лог с результатами работы в отдельном файле
   log = true
   logfile = ./sync.log

При необходимости синхронизировать описанные в файле конфигурации директории, выполняем:

   unison test
By sysadmin on 01.10.2010 | FreeBSD, Linux
Метки: , , ,

Cоветы по использованию утилиты GNU Find

GNU find является одной из наиболее часто используемых программ. На первый взгляд опции find и их синтаксис выглядят слегка непонятными. Однако, немного попрактиковавшись с find, вы сможете быстро и без труда находить любой файл в вашей системе. Чтобы помочь вам начать работать с find, рассмотрите предлагаемые десять способов её использования.

Имейте ввиду, что не все версии find одинаковы, и та, которую вы используете в Linux, будет отличаться от версий для Mac, BSD или Solaris. В основном синтаксис одинаков во всех версиях, но местами встречаются небольшие различия.

Простой поиск

Давайте начнём с простого. Если вам известно имя файла, но вы не знаете точно в каком каталоге он расположен, синтаксис find будет предельно прост. Просто сообщите find имя искомого файла:

find -name имя_файла

Если файл с именем filename существует, то команда find покажет местоположение файла или файлов, которые соответствуют этому имени, следующим образом:

jzb@kodos:~$ find -name filename
./projects/filename
jzb@kodos:~$

Поиск по размеру

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

Для такого случая у find имеется опция -size, принимающая в качестве параметра размер, являющийся критерием поиска. Размер можно указывать начиная с байтов (b), заканчивая гигабайтами (G). Например, чтобы выполнить поиск файлов размером 100 килобайт, можно использовать команду:

find -size 100k

Однако такой вариант может не подойти в нашем случае. Более подходящим будет поискать файлы размеров больше (или меньше) заданного. Чтобы выполнить такой поиск, просто добавьте «+» или «-» к размеру, и find будет искать файлы большего или меньшего размера соответственно, чем указан. Например, следующая команда найдёт все файлы размеров более 100 килобайт:

find -size +100k

а эта — менее, чем 100 килобайт:

find -size -100k

Также, вы можете попросить find найти все пустые файлы:

find -empty -type f

Обратите внимание на указанную опцию -type с параметром «f», которая указывает find искать только обычные файлы. Если не указать это, то find выведет также и пустые каталоги.

Поиск по владельцу

Другой, часто используемый, вариант поиска — поиск по принадлежности файла какому-то пользователю или даже по его отсутствию. Например, вы переместили какие-то файлы в другую систему или же удалили какого-то пользователя, вероятно сделав файлы «сиротами». Отыскать такие файлы-сироты можно простой командой:

find -nouser

Для поиска файлов, принадлежащих какому-то конкретному пользователю, существуют опции -user и -uid. Первая опция принимает как имя пользователя, так и его идентификатор, а вторая — только идентификатор. Например, если мне нужно будет найти все файлы, владельцем которых я являюсь, я воспользуюсь одной из команд:

find -user jzb
find -user 1000
find -uid 1000

Также, вам может понадобиться найти файлы принадлежащие пользователю А или пользователю Б. Для этого необходимо объединить два условия поиска при помощи оператора «-o»:

find -user root -o -user www-data

Такая команда будет искать файлы, владельцем которых является пользователь root или же пользователь www-data. Если же, например, вы хотите найти файлы, владельцем которых пользователь не является, используйте оператор «-not»:

find -not -user www-data

Естественно, операторы работают и с другими опциями. К примеру, следующая команда найдёт файлы, владельцем которых является www-data и которые размером не более ста килобайт:

find -user www-data -not -size +100k

Поиск по группе-владельцу

Ещё один способ использования find — поиск файлов, принадлежащих какой-то группе пользователей. Для этого используется опция «-group», параметром которой должно быть имя группы или её идентификатор. Например:

find -group admin

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

Поиск по правам доступа

Иногда у вас может возникать необходимость найти файлы, доступные для записи кому угодно или файлы, имеющие какие-либо другие «плохие» разрешения. Подобный поиск find может осуществлять при помощи различных опций. Простейшие из них — это операторы -readable, -writable и -executable, которые работают применительно к пользователю, запустившему find. Имейте ввиду, что в слишком древних версиях find эти опции отсутствуют.

Другой способ искать файлы определённым режимом доступа — использование опции -perm, позволяющей точно определять права доступа искомых файлов. Например, если вы хотите найти файлы, биты выполнения которых установлены для владельца и группы, используйте команду:

find -type f -perm -110

Здесь параметр «110» сообщает find набор битов доступа, а «-» заставляет игнорировать все остальные. Таким образом, если файл имеет ко всему прочему установленные биты чтения и записи, он также будет соответствовать критерию поиска, поскольку для find важно лишь то, что установлены указанные биты выполнения.

Если вам необходимо точное совпадение с указанным режимом доступа, то уберите опцию «-».

А что, если вам необходимо найти файлы, исполняемые владельцем или группой? В это случае вместо «-» используйте «/»:

find -type f -perm /110

Поиск по правам доступа часто пригождается, хотя и не лишён некоторой сложности, и вам может потребоваться какое-то время, прежде, чем вы привыкните к его синтаксису. Особенно это касается новичков, которые ещё толком не разобрались с механизмом битов доступа файлов. В этом случае чтение man-страницы find особенно рекомендуется.

Использование регулярных выражений

Иногда вам может потребоваться использование регулярных выражений, чтобы определить критерии поиска. И find поддерживает их даже в большей степени, чем вы, возможно, ожидали. find не только поддерживает использование регулярных выражений, но и позволяет использовать различные их типы. Тип регулярного выражения можно определить при помощи опции -regextype, которая принимает параметры posix-awk, posix-egrep и тому подобные. В man-странице вы найдёте полный перечень поддерживаемых типов регулярных выражений вашей версией find.

Небольшой пример. Скажем, вам нужно найти файлы, имеющие расширения «.php» и «.js». Такое можно осуществить следующей командой:

find -regextype posix-egrep -regex '.*(php|js)$'

Выглядит страшновато, не так ли? Эта команда говорит find использовать синтаксис регулярных выражений egrep (-regextype posix-egrep), а затем сообщает само регулярное выражение. Выражение обрамлено одинарными кавычками, чтобы оболочка не пыталась по-своему интерпретировать спецсимволы, использующиеся в выражении. В самом выражении «.*» означает любой символ, повторяющийся ноль или более раз. Часть выражения «(php|js)» сообщает о необходимости искать «php» или «js» (символ вертикальной черты используется для определения оператора «или»). И, наконец, знак доллара в конце выражения сообщает о том, что предыдущая часть выражения должна искаться в конце строки.

Так же, как и с правами доступа, регулярные выражения можно комбинировать.

Работа со временем

Что, если вам понадобится найти файлы, основываясь на их возрасте? Иногда бывает, что знаешь, в каком промежутке времени файл был создан, а всё остальное — позабылось. Или же, вам может понадобиться отыскать какие-то старые файлы, которые пора удалить. В общем, причин может быть куча.

find в полном объёме умеет работать со временем, позволяя искать по времени последнего доступа к файлу (-atime), времени последнего изменения файла (-mtime), или по времени его создания (-сtime).

Например, давайте все найдём файлы, которые были изменены за последние два дня:

find -mtime +2

Параметры опций, работающих со временем, можно интерпретировать как «N раз по 24 часа» и в действительности означают промежуток времени. Если вы передадите find опцию «+1», то она поймёт это как «не менее, чем 24 часа назад, но не более, чем 48».

Эти опции вы также можете комбинировать, если нужно отыскать файлы, временные критерии поиска находятся в каком-то промежутке. Так, команда

find -mtime +2 -mtime -5

означает «два или более дня назад, но не более пяти дней назад».

Работа с минутами

Иногда бывает нужно найти файлы, изменённые за последние 24 часа, и в этом случае рассмотренные опции *time по понятным причинам не подойдут. Однако, на этот случай, у find припасены специальные опции -amin, -cmin, -mmin, которые работают подобно выше рассмотренным, с той разницей, что в качестве параметров они принимают минуты, а не сутки. Так что, если вам нужно найти какие-то файлы, изменённые, например, в течение рабочего дня — это те самые опции, которые вам помогут.

Ограничение поиска

Иногда find выдаёт намного больше результатов поиска, чем вам нужно. При помощи опции -maxdepth вы можете ограничить find таким образом, чтобы она не «зарывалась» слишком глубоко. Например, если вы хотите найти все файлы c расширением «js» в каталоге wordpress, можно воспользоваться командой:

find wordpress -name '*js'

Но что, если вас интересуют файлы лишь из каталога верхнего уровня? Нет проблем: ограничьте описк при помощи опции -maxdepth:

find wordpress -maxdepth 1 -name '*js'

Такая команда заставит искать find только в каталоге wordpress, не заходя в подкаталоги, которые в нём содержатся. Если вы хотите поискать в этих подкаталогах, но не соваться глубже — увеличьте параметр опции -maxdepth на единицу и т. д.
Действия над найденными файлами

Итак, вы нашли то, что искали. Что вы будете делать с найденным? Используя xargs или опцию find -exec, можно выполнять необходимые действия с найденными файлами.

Давайте представим, что вы хотите сменить владельца каких-то файлов с root на www-data. Для начала нужно все эти файлы найти, а затем уж сменять их владельца. Смена владельца вручную по списку, полученному от find звучит как-то скучно. Всё же, лучшим решением будет использовать опцию -exec:

find -user root -exec chown www-data {} \;

Такая команда заставляет find передавать пути всех найденных файлов утилите chown, которая и будет изменять владельца файлов. Легко и просто!

Заключение

Знание возможностей утилиты find является обязательным для всех пользователей Linux, которые хотят освоить свою систему. Когда используется рабочий стол, вы можете обойтись без утилиты find, но при администрировании системы вам нужно иметь свои приемы применения утилиты find. Если вы собираетесь использовать параметры -exec и xargs для внесения изменений в файлы или удаления файлов, сначала сделайте один или пару тестов с тем, чтобы убедиться, что команда работает так, как ожидается.

By sysadmin on 15.08.2010 | FreeBSD, Linux
Метки: , , , ,

Несколько советов по использованию bash

Тут приведены некоторые полезные хитрости, направленные на более удобное использование командной строки. Все мы не хотим повторно набирать какую-то длинную команду и ищем ее в истории. Тут — пара трюков от том, как можно энто самое удобство малость повысить.

1. Потеря комманд в .bash_history

Многие пользуются стандартными гномовским или кдешным эмуляторами терминала. У них есть возможность открывать в одном окне несколько оболочек — каждую в отдельной вкладке.

bash по умолчанию пишет в историю набранные за сеанс команды только при своем закрытии (перед самоликвидацией). Поэтому при открытии нового терминала в другой вкладке вы не увидите только что набранные команды из первой вкладки — они еще не записаны в хистори.

К тому же закрыв первый терминал, а потом второй вы не найдете в истории команд набранных в первом терминале. Потому что по умолчанию bash не дописывает файл .history, а переписывает.

Исправить ситуацию можно, дописав в конфигурационный файл ~/.bashrc пару строк

    shopt -s histappend
    PROMPT_COMMAND='history -a'

Теперь каждая введенная вами команда будет писаться в историю сразу же. Не бойтесь — дырку на жестком месте такая конфигурация не протрет. Не так уж часто вы команды в баше набираете. 🙂 Да и слава богу кеширование дисков пока еще рулит.

2. Эвристическое исправление ошибок директорий

Если дописать такую строчку

    shopt -s cdspell

то bash будет пытаться исправлять допущенные вами опечатки (пропуски и перестановки символов, например /ect/init.d вместо /etc/init.d) в пути у команды cd. Не бойтесь, у rm такая фича работать уже не будет. Только у cd.

3. Не писать в историю подряд идущие строки-дубликаты

Пишем в ~/.bashrc

    export HISTCONTROL="ignoredups"

А если вы не хотите, чтобы в историю попадали вызовы каких-то «неинформативных» команд, то их логирование можно запретить:

    export HISTIGNORE="&:ls:[bf]g:exit"

После этой команды в хистори не будут писаться команды &, ls, bg, fg, exit. Можно дописать и свои, через двоеточие, можно использовать шаблоны.

4. Не разрывать многострочные команды

Еще команда в конфигурационный файл

    shopt -s cmdhist

5. Поиск по истории команд

Иногда команды бывают большими и сложными, и чтобы заново ее не писать и не искать по истории 100 раз нажимая «вверх», можно воспользоваться поиском.

Если вы помните кусочек команды которую хотите найти, то можно просто нажать в bash’e комбинацию Ctrl + R и набрать этот кусочек. bash вам покажет последнюю команду с такой подстрокой. Можно продолжать нажимать Ctrl + R и bash будет выдавать более старые подходящие команды, подходящие под искомую строку.

6. Вернуться в предыдущую директорию

Когда мы работаем в какой-то директории, и нам нужно «выбраться» в другую директорию, что-то там поделать и вернуться назад, можно воспользоваться «cd -«, например

    [toor@localhost html]$ cd /var/www/html
    [toor@localhost html]$ cd /etc/
    [toor@localhost etc]$ vi my.cnf
    [toor@localhost etc]$ cd -
    /var/www/html
    [toor@localhost html]$

Эта команда вернет нас в директорию где мы были раньше.

7. Хранить дату выполнения в истории команд bash

По умолчанию утилита history, не сохраняет в .bash_history время исполнения каждой команды.

В баше трейтьей версии сделать это можно и весьма просто. Если объявить глобальную переменную HISTTIMEFORMAT с форматом выводимых данных, то утилита history будет сохранять и выводить эту дату.

Итак, пишем в ~/.bashrc строчку

export HISTTIMEFORMAT='%h %d %H:%M:%S '

После этого в .bash_history перед каждой командой появится коментарий с цифрой — временем выполнения этой команды в формате timestamp:

#1260787129
htop
#1260802594
export HISTTIMEFORMAT='%h %d %H:%M:%S '
#1260802598
history | grep squid
#1260802658
mc
#1260802777
chown -R svn:svn svn

А командочка history будет выдавать историю данных с датой в формате, который мы переменной задали (в похожем формате выдают дату и время утилита ls):

995  Dec 14 13:38:49 htop
996  Dec 14 17:56:34 export HISTTIMEFORMAT='%h %d %H:%M:%S '
997  Dec 14 17:56:38 history | grep squid
998  Dec 14 17:57:38 mc
999  Dec 14 17:59:37 chown -R svn:svn svn

Но можно сделать и по ГОСТУ, в приятном русскому глазу виде «ДД.ММ.ГГГГ»

export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S '

А можно и в формате ISO: «YYYY-MM-DD»

export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '
By sysadmin on 14.12.2009 | FreeBSD, Linux
Метки: , , , ,

Быстрое обновление и восстановление портов

Содержание:

Введение.

1. Скачивание и установка дерева портов.
2. Обновление и исправление базы данных портов.
3. Редактирование /etc/make.conf (оптимизация, etc).
4. Простое обновление.
5. Полезные опции portupgrade.
6. Простой скрипт обновления.
7. Скрипт обновления, усовершенствованный (Рекомендуемый).
8. Скрипт автоматического обновления (экспериментально).
9. Исправление некоторых проблем.

Введение

если нужно обновить (и(или)восстановить) порты, может быть запутанная ситуация (например, если не обновлять год), portupgrade очень часто с первого раза не исправляет ошибки

OS: FreeBSD 7.0, FreeBSD 7.1, FreeBSD 8.0

1. Скачивание и установка дерева портов.

для начало перейти в:

cd /usr

скачаем архив дерева портов, это будет быстрее чем обновлять через cvsup, ищем ближайщый ftp провайдера/города/страны

качаем:

wget 'ftp://ftp2.ua.freebsd.org/pub/FreeBSD/ports/ports/ports.tar.gz'

перед скачиваем нужно обратить внимание чтобы архив был создан не позже чем 1-2 дня назад (желательно), некоторые ftp редко синхронизируются!

rm -rf /usr/ports

можно не большой скрипт который быстрее разархивирует:

#!/usr/bin/perl
 
open (OPEN, "tar -tf ports.tar.gz |");
 
while (my $p = ) {
system("tar -xvzf ports.tar.gz $p > /dev/null &");
}
 
close OPEN;

(если perl не стоит, то скорее всего он будет из мира, по-моему путь #!/usr/local/bin/perl )

PS вообще-то, portsnap лучше, чем архив качать и еще есть rsyns

2. Обновление и исправление базы данных портов.

бэкап базы пакетов:

cp /var/log/dpkgdb.db /home/dpkgdb.db

можно заархивировать каталоги /etc/ /usr/local/etc программа может затереть конфиг (осторожно с символическими ссылками чтобы не удалить случайно важную информацию)

pkgdb -aF

-a all, -F исправлять не спрашивая, считается безопасный метод
если база сбита, то на крайняк можно pkgdb -fu

3. Редактирование /etc/make.conf (оптимизация, etc).

по-моему: в FreeBSD 7.2, FreeBSD 8.0 CURRENT) в CFLAGS присутствует скрытый дефект: -ffast-math, который оборачиваектся для нас -funsafe-math-optimizations -fno-math-errno http://www.freebsd.org/cgi/query-pr.cgi?pr=137869
будьте внимательны

ee /etc/make.conf
 
WITCH=BATCH=yes # не выдавать окно в котором спрашивать с чем компилировать
BATCH=yes
 
# параллельная сборка портов, появилась с FreeBSD 7.2 лучше  не включать
#
# MAKE_JOBS_SAFE=yes
# MAKE_JOBS_NUMBER=8
# FORCE_MAKE_JOBS=yes
# DISABLE_MAKE_JOBS=yes
# MAKE_JOBS_UNSAFE=yes
 
# FORCE_MAKE_JOBS=
#MAKE_JOBS_NUMBER!= let $$(sysctl -n kern.smp.cpus) \* 4
#
#.for port in \
#        emacs-devel cross-binutils libgpg-error perl5.8 libthai \
#        libiconv m17n-lib nasm tightvnc db47 subversion* \
#        ghostscript8 pth cdrtools* w3m* xmp libslang2 ezm3 dcget libxml2 \
#        vim gperf ffcall ORBit2 py-gtk2 xkeyboard-config ruby18 clisp \
#        jdk16 p7zip zsh libsndfile openjdk6 gettext stumpwm
#
#. if ${.CURDIR:M*/${port}}
#    MAKE_JOBS_UNSAFE=
#. endif
#.endfor
#
 
# оптимизация
# CPUTYPE=pentium4 # архитектура
# CFLAGS+=-g
# CFLAGS=-O2 -pipe -ffast-math -funit-at-a-time -fpeel-loops -ftracer
# -funswitch-loops -mmmx -msse -msse2 -march=pentium4 -mtune=pentium4
# COPTFLAGS=-O2 -pipe  -ffast-math -funit-at-a-time -fpeel-loops -ftracer
# -funswitch-loops -mmmx -msse -msse2 -march=pentium4 -mtune=pentium4
# CXXFLAGS+=-fconserve-space
# NO_PROFILE=true
# LOCALIZED_LANG=ru
 
CPUTYPE=pentium4 # архитектура
CFLAGS=-O2 -pipe -funit-at-a-time -fpeel-loops -ftracer
-funswitch-loops -mmmx -msse -msse2 -march=pentium4 -mtune=pentium4
COPTFLAGS=-O2 -pipe -funit-at-a-time -fpeel-loops -ftracer
 -funswitch-loops -mmmx -msse -msse2 -march=pentium4 -mtune=pentium4
CXXFLAGS+=-fconserve-space
NO_PROFILE=true
LOCALIZED_LANG=ru
 
# зеркало (указать свои)
 
MASTER_SITE_OVERRIDE?= \
ftp://ftp5.ua.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp7.ua.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.ua.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.gentoo.org.ua/distfiles/${DIST_SUBDIR}/ \
ftp://ftp2.ua.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp6.ua.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp8.ua.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.linux.kiev.ua/pub/Linux/Gentoo/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.lucky.net/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR} \
ftp://ftp3.ua.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \
ftp://ftp4.ua.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.ntu-kpi.kiev.ua/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.univ.kiev.ua/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.univ.kiev.ua/pub/OS/FreeBSD/distfile/${DIST_SUBDIR} \

4. Простое обновление.

если portupgrade не стоит, то поставить:
(потянет ruby)

cd /usr/ports/sysutils/portupgrade && make && make install && make clean

в headbook’е написано:

portupgrade -a

в других источниках сразу, рекомендуют:

portupgrade -arR

чтобы пройтись вдоль всех зависимостей

5. Полезные опции portupgrade.

полезные опции в portupgrade:
-W не чистить порт после обновления;
-w не чистить порт перед обновлением;
-F для того что скачать все исходники сразу, если проблемы с интернетом: portupgrade -aFrR
опции -f устанавливает дальше все зависимости, если даже где-то ошибка, то пытается продолжить дальше…;
-l /var/log/pport.log — записывает последнюю ошибку;
-L %s::%s создает файл в текущем каталоге, в котором записывает весь вывод установленных портов.

2 полезные команды make:
1) cd /usr/ports/deve/icu && make run-depends-list покажет зависимости данного порта,
2) make all-depends-list — все зависимости и зависимости тех портов которые зависят от порта

есть один важный недостаток, бывает версия порта называется не совсем корректно, например cairo-1.8.6_1,1 и portupgrade может всегда писать что порт устаревший

6. Простой скрипт.

portupgrade -arR часто тоже может выдаст ошибку!!
есть вариант написать скрипт, который обновит те порты который устаревшие в месте с зависимостями:

#!/usr/bin/perl
 
$nn = 0;
 
while (1) {
 
    $nn++;
 
    open( OPERN, "portversion |" );
 
    @all = ;
 
    if ( $nn > 6 ) {
    print "while 6 exit";
    exit;
    }
 
    foreach (@all) {
 
        my ( $pp, $st ) = split( / /, $_, 2 );
 
        if ( $st =~ '<' ) {
 
            print "UPDATE: $pp\n";
 
            system("portupgrade -f $pp");  
 
        } else {
            print "ok UPDATE";
            exit;
        }
    }
 
}

при этом может быть очень часто что что-то пропустит из-за подзависимоти каких-то скорее всего, цикл идет в 2 этапов if ( !$nn > 2 )

если порты запутанные, можно написать чтобы обновляло и новую версия как не корректную if ( $st =~ ‘<‘ || $st =~ ‘>’) {

Важное примечание: при обновлении Desktop лучше сначала попробовать portupgrade -aRr, так как опция -R (portupgrade -Rf $all[0] для скрипта ниже) (ее lissyara рекламировал) будет устанавливать все зависимости по новому, если нужно обновить, к примеру, 4 программы evince/firefox3/xfce4, то они потянут около 20-60 зависимостей каждая (не считал), и одно и тоже portupgrade будет собирать (но имейте ввиду что эта опция -R надежная), более «мягче» есть вариант в данном случае поставить portupgrade -rf ports_old, при этом будут собираться только «ближайшие» зависимости, самый жесткий вариант portupgrade -Rrf ports_old скорее всего лучше использовать в редких случаях, например, если не хочет компилироваться /devel/icu, так же можно просто -f.

перед кажой установленной программой желательно пересмотреть еще раз список устаревших портов, чтобы не компилировать одно и тоже лишный раз, так как с опциями -R или -r многое уже может быть обновленно, portversion быстро смотрит какие версии установлены…

7. Скрипт обновления, усовершенствованный (Рекомендуемый).

вот маленький скрипт для этого + еще реализовал запись в лог файл, чтобы было видно какой порт обновляется и сколько время прошло:

#!/usr/bin/perl
 
$nn = 0;
 
while (1) {
 
    $nn++;
 
    open( OPERN, "portversion |" );
 
    my @all2 = ;
 
    close OPERN;
 
    my @all;
 
    for ( $i = 0 ; $i &lt; @all2 ; $i++ ) {
 
        my ( $pp, $st ) = split( / /, $all2[$i], 2 );
        if ( $st =~ '&lt;' ) {
 
            push @all, $pp;    # $all[$i] = $pp;
 
        }
 
    }
 
    exit if ( !$all[0] || $nn &gt; 2 );
 
    while (1) {
 
        last if !$all[0];
 
        print "$all[0]\n";
 
        logsave( get_time(), $all[0] );
 
        system("portupgrade -rf $all[0]");
      # system("portupgrade -Rf $all[0]");
 
      # первый порт попробовать обновить вдоль и поперек
      # (выше system нужно закомментировать)
      # if ($nn == 1) {
      #  system("portupgrade -rRf $all[0]");
      #  } else {
      #  system("portupgrade -rf $all[0]");
      #  }
 
   #  экспериментально:
   #  можно добавить чтобы скрипт автоматически нажимал на энтер
   #    use IO::Select;
   #     my $select = IO::Select-&gt;new;
   #    for(@array)
   #     open my $pipe, "|$_";
   #     $select-&gt;add($pipe);
   #    }
   #    my @waiters = $select-&gt;can_write($timeout);
   #    print $_ "\x0a" for @waiters; 
 
        logsave( get_time(), $all[0] );
 
        shift @all;
 
        my @all = old(@all);
 
    }
 
}
 
sub old {
 
    my @all = @_;
 
    open( OPEN2, "portversion |" );
 
    my @all_all = ;
 
    close OPEN2;
 
    my @old;
    my @no_old;
 
    foreach my $p (@all_all) {
 
        my ( $pname, $status ) = split( / /, $p, 2 );
 
        if ( $status =~ '&lt;' ) {
 
            push @old, $pname;
 
        }
        else {
            push @no_old, $pname;
        }
    }
 
    my %seen;
    @seen{@all} = ();
    delete @seen{@no_old};
    return keys %seen;
 
}
 
sub get_time {
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
      localtime(time);
    $mon++;
    $year += 1900;
    if ( $mday &lt; 10 ) { $mday = "0$mday"; }
    if ( $mon &lt; 10 )  { $mon  = "0$mon"; }
    if ( $min &lt; 10 )  { $min  = "0$min"; }
    my $date        = "$mday $mon $year";
    my $time        = "$hour:$min:$sec";
    my $cur_all_day = $mday + $mon * 30 + $year * 365;
    my $radate      = "$year-$mon-$mday $hour:$min:$sec";
    return $radate;
}
 
sub logsave {
    my ( $time, $ports ) = @_;
    my $logfile;
    $logfile = "\n time:  $time \n  ports: $ports \n\n";
    system("touch /var/log/portupgrade.log");
    open( DB2, "/var/log/portupgrade.log" ) || die "Cannot open file: $!";
    my @base = ;
    close(DB2);
    open( DB, "&gt;/var/log/portupgrade.log" ) || die "Cannot open file : $!";
    print DB @base;
    print DB $logfile;
    close(DB);
}

8. Скрипт автоматического обновления (экспериментально).

дальше я написал простейший скрипт для автоматического обновления, который обновит дерево портов и порты через cron, отправит на email какие порты он обновил, и какие были устаревшие, можно поставить раз в неделю в cron

нужно заменить email адрес на тот который будет отсылаться Вам, и проверить работоспособность ftp с которого архив порта скачать

#!/usr/bin/perl
 
system("rm -rf /usr/ports.tar.gz");
 
system(
"cd /usr &amp;&amp;
wget ftp://ftp2.ua.freebsd.org/pub/FreeBSD/ports/ports/ports.tar.gz");
 
system("rm -rf /usr/ports");
 
open( OPEN, "tar -tf /usr/ports.tar.gz |" );
 
while ( my $p =  ) {
    system("tar -xvzf /usr/ports.tar.gz /usr/$p &gt; /dev/null &amp;");
}
 
close OPEN;
 
my $db = '/home/pkgdb.db' . time;
 
system("cp /var/db/pkg/pkgdb.db  $db");
 
system("pkgdb -aF");
 
my $etc       = '/home/etc' . time;
my $etc_local = '/home/etc_local' . time;
 
system("tar -cf $etc /etc");
system("tar -cf $etc_local /usr/local/etc");
 
open( OLD, "portversion -F|" );
my @all_old =
;
close OLD;
 
foreach (@all_old) {
    my ( $pname, $status ) = split( / /, $_, 2 );
    push @old, $pname if ( $status =~ '&lt;' );
}
 
$nn = 0;
 
while (1) {
 
    $nn++;
 
    open( OPERN, "portversion |" );
 
    my @all2 = ;
 
    my @all;
 
    for ( $i = 0 ; $i &lt; @all2 ; $i++ ) {
 
        my ( $pp, $st ) = split( / /, $all2[$i], 2 );
        if ( $st =~ '&lt;' ) {
 
            push @all, $pp;    # $all[$i] = $pp;
 
        }
 
    }
 
    exit if ( !$all[0] || $nn &gt; 2 );
 
    while (1) {
 
        last if !$all[0];
 
        print "$all[0]\n";
 
        system("portupgrade -rf $all[0]");
 
        shift @all;
 
        my @all = old(@all);
 
    }
 
}
 
sub old {
 
    my @all = @_;
 
    open( OPEN2, "portversion |" );
 
    my @all_all = ;
 
    my @old;
    my @no_old;
 
    foreach my $p (@all_all) {
 
        my ( $pname, $status ) = split( / /, $p, 2 );
 
        if ( $status =~ '&lt;' ) {
            push @old, $pname;
        }
        else {
            push @no_old, $pname;
        }
    }
 
    my %seen;
    @seen{@all} = ();
    delete @seen{@no_old};
    return keys %seen;
 
}
 
open( NEW, "portversion -F|" );
my @all_new = ;
close NEW;
 
foreach (@all_new) {
    my ( $pname, $status ) = split( / /, $_, 2 );
    push @new, $pname if ( $status =~ '&lt;' );
}
 
open( SENDMAIL, "|/usr/local/sbin/sendmail -t" )
  or die "sendmail not ready";
print SENDMAIL "From: FreeBSD \n";
print SENDMAIL "Reply-To: FreeBSD
\n";
print SENDMAIL "Subject: UPDATE from portupgrade\n\n";
print SENDMAIL "list old\n\n";    #
print SENDMAIL "@old\n\n";
print SENDMAIL "list new\n\n";
print SENDMAIL "@new\n\n";
print SENDMAIL "#################\n";
print SENDMAIL "list ALL old\n\n";    #
print SENDMAIL "@all_old\n\n";
print SENDMAIL "list ALL new\n\n";
print SENDMAIL "@all_new\n\n";
close(SENDMAIL) or warn "sendmail didn`t close nicely";

пример как можно написать что-то подобное portupgrade:

#!/usr/bin/perl
 
open( OPEN2, "portversion -o  |" );
 
@all_all = ;
 
my @all;
 
foreach (@all_all) {
    my ( $pname, $status ) = split( / /, $_, 2 );
    $pname = '/usr/ports/' . $pname;
    $pname =~ s/^\s+//;
    $pname =~ s/\s+$//;
    push @all, $pname;
}
 
my $port;
 
my @old;
my @no_old;
 
foreach my $p (@all_all) {
 
    my ( $pname, $status ) = split( / /, $p, 2 );
 
    if ( $status =~ '&gt;' || $status =~ '&lt;' ) {
 
        $pname = '/usr/ports/' . $pname;
        $pname =~ s/^\s+//;
        $pname =~ s/\s+$//;
        push @old, $pname;
 
    }
    else {
        $pname = '/usr/ports/' . $pname;
        $pname =~ s/^\s+//;
        $pname =~ s/\s+$//;
        push @no_old, $pname;
    }
 
}
 
@to_port = `cd $old[0] &amp;&amp; make all-depends-list`;
 
foreach (@to_port) {
    $_ =~ s/^\s+//;
    $_ =~ s/\s+$//;
}
 
my %seen;
@seen{@to_port} = ();
delete @seen{@no_old};
@dep2 = keys %seen;
 
print "@dep2\n";

9. Исправление некоторых проблем.

если обновилось php, то нужно обновить его библиотеки:

pkg_info  | grep '^php5*' | awk '{print $1}' | xargs portupgrade -f
|| pkgdb -fFu &amp;&amp; portsclean -CLPP

для perl часто тоже может понадобиться:

pkg_info  | grep '^p5-*' | awk '{print $1}' | xargs portupgrade -f
|| pkgdb -fFu &amp;&amp; portsclean -CLPP

так же есть скрипт perl-after-upgrade

Java (jdk*) прийдеться руками ставить

очистить порты и каталог distfile:

portsclean -CDD

Источник

By sysadmin on 06.10.2009 | FreeBSD
Метки: , , , ,

Простая генерация паролей

Достаточно часто на практике приходится генерировать пароли для разных аккаунтов и сервисов — почты, ftp, samba и просто для нерадивых пользователей, теряющих и забывающих пароли при каждом удобном случае. Очевидно, что придумать новый пароль достаточно просто, но его устойчивость к взлому, как правило, будет сомнительной, поскольку любимые наши пароли — 111, 12345 и «интернет», а также год рождения, номер паспорта или мобильного телефона — известны всем и каждому.

Поэтому для себя я использовал простенький скрипт следующего вида (файл passgen.sh):

#!/bin/bash
echo `tr -cd [:digit:] < /dev/urandom | head -c8`

Этому скрипту необходимо дать права на выполенение

chmod u+x passgen.sh

и в дальнейшем использовать из консоли:

~$ ./passgen.sh
93723588

Как видно из примера, скрипт позволяет получить случайное восьмизначное число, которое и используется в качестве пароля. Немного поэкспериментировав, мы можем еще усилить стойкость пароля и улучшить его читабельность, изменив наш минискрипт следующим образом (файл genpass.sh):

#!/bin/bash
x=`tr -cd [:alnum:] < /dev/urandom | head -c8`
echo ${x:0:4}-${x:4:4}

«Расширенная» версия генератора позволит нам получать буквенно-цифровые пароли в формате XXXX-XXXX:

~$ ./genpass.sh
sv81-1AxP
By sysadmin on 18.06.2009 | FreeBSD, Linux
Метки: , , , ,

Освобождаем консоль

Большинство Linux-приложений с графическим пользовательским интерфейсом при запуске из консоли не освобождают консоль, а запирают сесию и начинают выводить в ней свои диагностические сообщения. Нажатие Ctrl+C в этом случае приводит к остановке приложения.Сейчас я покажу как заставить свои приложения освобождать консоль.

Добавляем в функцию main() своего приложения следующий код:

      if (fork() != 0){
          exit(0);
      }
 
      close(0);
      close (1);
      close(2);
 
      int fd = open("/dev/null", O_RDWR);
      dup2(fd, 0);
      dup2(fd, 1);
      dup2(fd, 2);

Первые три строки создают новую копию процесса нашей программы и убивают родительский процесс. Затем с помощью функции close() закрываем все дескрипторы ввода-вывода, унаследованные от родительского процесса, создаем новые дескрипторы, адресованные в /dev/null, и присваиваем их своей программе.

By sysadmin on 26.05.2009 | Development
Метки: , , , , , ,

Как удалить из кэша DNS сервера Bind конкретную запись, без перезагрузки всего кэша

Для удаления отдельной записи в кэше Bind нужно использовать команду «rndc flushname»

Запрашиваем имя mx.example.ru у сервера 127.0.0.1:

   $>  dig +short @127.0.0.1 mx.example.ru
   192.168.168.168

Сохраняем для изучения дамп с содержимым кэша:

   $>  rndc dumpdb -all

Находим в нем искомое имя, чтобы убедится, что оно в кэше:

   $> grep mx.example.ru /var/bind/named_dump.db
   mx.example.ru.             431988  A       192.168.168.168

Выполняем команду для удаления mx.example.ru из кэша:

   $> rndc flushname mx.example.ru.

Убедимся, что имя удалилось:

   rm /var/bind/named_dump.db 
   rndc dumpdb -all
   grep mx.example.ru /var/bind/named_dump.db
By sysadmin on 06.05.2009 | FreeBSD, Linux
Метки: , , , ,

Клонирование дисков во FreeBSD

Любой из нас хорошенько задумывается над тем, как правильно разбить HDD при установке FreeBSD. Действительно, потом будет весьма проблематично изменить размер патриции при необходимости. Проблема заключается в том, что на жестком диске находятся, так называемые, слайсы, а уже в них инкапсулированы партиции. Это не всегда так, потому что есть еще и второй метод разметки HDD без слайсов, но в данной статье он не рассматривается. Популярные программы для работы с разделами HDD, такие как Partition Magic, Acronis могут удалить слайс, копировать/переместить его посекторно, но никак не заглянуть внутрь и изменить размер той или иной партиции.

Итак, есть система (далее, система — это установленная ОС FreeBSD, включающая в себя MBR, корневой раздел, SWAP,  ополнительные разделы /tmp, /var и т.д.) на жестком диске объемом 80 ГБ. Задача: перенести систему на другой жесткий диск объемом 250 ГБ, увеличивая размеры партиций пропорционально увеличению объема HDD. В нашем случае это 250-80=170 ГБ. Вторая часть задачи: повторять эту процедуру автоматически, с определенным интервалом (для создания резервной копии системы). В обоих случаях, нужно скопировать систему полностью, т.е. не только файлы и каталоги, а и загрузочный сектор, загрузчик для сохранения возможности загрузки системы с полученной копии.

Для выполнения задачи воспользуемся утилиткой CloneHDD. Взять ее можно здесь: http://sourceforge.net/projects/clonehdd Качаем дистрибутив последней версии и выполняем:

        tar -zxvf clonehdd-2.0.3.tar.gz -C /home/user/

Можно сделать проще — установить из портов:

        make install -C /usr/ports/sysutils/clonehdd

После установки мы видим грозное предупреждение о том, что запуская clonehdd нужно семь раз отмерить а потом уже отрезать =)) Но все не так страшно, как кажется: программа изначально рассчитана так, что данные на исходном винте никогда и ни при каких условиях не подвергнутся записи.
Это сообщение больше относится к нашему новому, чистому винту. Поэтому, если вы купили чистый винт и хотите на него переехать, то вряд ли clonehdd чем то сможет навредить.

Работа с программой предельно проста. Для осуществления задуманного нам нужно всего один раз запустить утилиту с нужными параметрами. Вот о параметрах теперь поподробнее.

-src=[device] Это исходный девайс на котором находится наша система. Чтобы узнать имя текущего винта, нужно выполнить команду «mount». Мы увидим таблицу, в первой колонке которой указаны имена примонтированных устройств. Вот, например, «/dev/ad0s1f». «/dev/» это папка, в которой находятся все устройства, «ad0» это нужное нам имя самого винта, «s1» слайс под номером 1, «f» имя партиции на слайсе. Вывод: значение этому параметру присваиваем «ad0»

-dst=[device] Это девайс назначения. Именно сюда переедет ваша система. Узнать его можно, например, командой «cat /var/run/dmesg.boot». На экране появится список сообщений ядра при загрузке. Обычно, сообщения о найденных винтах находятся в самом конце. Ни одна партиция не должна быть примонтирована с этого винта, иначе CloneHDD выдасть ошибку.

-swap=[size in MB] Размер будущего раздела SWAP.

-freespace=[Required free space on dst partition] Если клонирование производится на винт меньшего размера, на DST винте после клонирования должен остаться небольшой кусочек свободного места, для того чтобы винт небыл на 100% заполнен после клонирования. По умолчанию — это 100МБ. Этим параметром его можно изменить.

-safe [Required safe mode for `dump`] Включает режим безопасного копирования. В этом режиме сначала создается образ каждого раздела в папке .snap, а потом делается перенос. В «небезопасном» режиме, копирование производится на лету. Вся проблема в том что размер этого образа равен размеру данных на разделе. А т.к. образ будет записан на тот же раздел с которого производится копирование, на разделе долно быть минимум 50% свободного места. Вернемся к параметру -safe. Если параметр отсутствует, клонирование будет произведено в безопасном режиме если достаточно свободного места или в небезопасном режиме если этого места недостаточно. Если параметр задан, небезопасного копирования не будет, и
разделы с недостатком свободного места склонированы не будут.

-fstab=[Device name to write in fstab] После клонирования будет сгенерирован файл /etc/fstab на полученном винте. Параметр задает Имя девайса, который будет записан в этот файл. По умолчанию: девайс, заданный параметром -src.

-force [Do not ask any questions] При выполнении второй части задачи, утилита будет выполняться из cron’а и нам не нужны лишние вопросы, в ходе выполнения программы. Данный параметр отключает интерактивный режим и вопрос «Are you sure?» задаваться не будет.

Вернемся к нашей задаче. Мой исходный винт: ad0, новый винт: ad1.

        srv# clonehdd -src=ad0 -dst=ad1 -swap=1024
        Clone parameters:
        Source partition: /dev/ad0
        Dest partition: /dev/ad1
        Swap size: 1024 MB
        Safe dumping: Disabled
        Free space on DST: 100 MB
        Fstab device name: ad0
        ---
        [OK] Found devices for clone procedure
        [OK] DST partition is not in use
        ---
        Source partition
        /usr size: 64489MB, used: 10563MB
        /var size: 4958MB, used: 144MB
        / size: 1483MB, used: 82MB
        /tmp size: 1483MB, used: MB
        Total: 72415 MB, used: 10790 MB
        ---
        [OK] Device ad1 has enough free space
        Wait 10 seconds before start: 10 9 8 7 6 5 4 3 2 1
        [OK] Device /dev/ad1 made clean
        [OK] New slice created
        ---
        Destination device partitions:
        SWAP size: 1024 MB
        / size 1588 MB
        /tmp size 1588 MB
        /var size 5306 MB
        /usr size 69026 MB
        ---
        [INF] Last partition were increased for 3 blocks
        [OK] Partitions were created successfully
        ---
 
        [OK] Partition /tmp was formatted successfully
        Starting dump/restore procedure...	[OK]
 
        [OK] Partition /var was formatted successfully
        Starting dump/restore procedure...	[OK]
 
        [OK] Partition /usr was formatted successfully
        Starting dump/restore procedure...	[OK]
 
        [OK] Partition / was formatted successfully
        Starting dump/restore procedure...	[OK]
 
        [OK] file /etc/fstab generated successfully

Видим сообщения об успешном клонировании. Теперь сделаем выполнение задачи по расписанию: выполнять каждый день в 2 часа ночи клонирование рабочего винта на запасной. Добавляем в файл /etc/crontab строку

        0 2 * * * root clonehdd -src=ad0 -dst=ad1 -swap=1024 -force >/dev/null

Обратите внимание, что >/dev/null убивает не все сообщения. Только обычные сообщения будут опущены. Все сообщения об ошибках отсылаются на выход STDERR, не попадают на /dev/null и будут отправлены cron’ом по
почте системному администратору.

By sysadmin on 08.04.2009 | FreeBSD
Метки: ,

Установка модулей Perl вручную и используя CPAN

Установка модулей для Perl требуется для работы различных утилит, применяемх в повседневной рутине администрирования. Установка Perl модулей вручную с удоволетворением всех зависимостей это довольно скучный и нудный процесс.

Установка Perl модулей с испоьльзованием CPAN намного более лучшее решение, так как все зависимости определятся и установятся автоматически. В это статье я опишу оба метода установки модулей.

Когда какой-либо нужный модуль не установлен, приложение которое его использует будет показывать следующую ошибку. В данном случае отсутствует модуль XML:Parser.

<strong>Can’t locate</strong> XML/parser.pm in @INC (@INC contains:
/usr/lib/perl5/5.10.0/i386-linux-thread-multi
/usr/lib/perl5/5.10.0
/usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi
/usr/local/lib/perl5/site_perl/5.10.0
/usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl
/usr/lib/perl5/site_perl/5.10.0 .)

Установка Perl модулей вручную

Download Perl module

Перейдите на веб-сайт CPAN Search и найдите модуль который вам нужно скачать. В этом пример мы скачаем и установим модуль XML:Parser Perl. Я скачаю XML-Parser-2.36.tar.gz в /home/download

$ cd /home/download
$ gzip -d XML-Parser-2.36.tar.gz
$ tar xvf XML-Parser-2.36.tar
$ cd XML-Parser-2.36

Собираем модуль

$ perl Makefile.PL
Checking if your kit is complete…
Looks good
Writing Makefile for XML:Parser::Expat
Writing Makefile for XML:Parser
$ make
$ make test

Устанавливаем модуль

$ make install

Это простой модуль без зависимостей, поэтому он установился без проблем. Обычно, любой модуль Perl имеет несколько зависимостей. Ставить все модули поочередно описанным выше методом скучнейшая задача. Я рекомендую использовать для установки CPAN метод, описанный ниже. Вручную стоит собирать модули в случае отсутсвия подключения к интернету.

Автоматическая установка Perl модулей с использованием CPAN

Проверяем установлен ли CPAN

Для установки Perl модулей используя CPAN, убедитесь что команда cpan работает. В этом примере, модуль CPAN ещё не установлен.

$ cpan
-bash: cpan: command not found
$ perl -MCPAN -e shell
Can’t locate CPAN.pm in @INC (@INC contains:
/usr/lib/perl5/5.10.0/i386-linux-thread-multi
/usr/lib/perl5/5.10.0
/usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi
/usr/local/lib/perl5/site_perl/5.10.0
/usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.10.0
/usr/lib/perl5/vendor_perl /usr/lib/perl5/site_perl/5.10.0 .).
BEGIN failed–compilation aborted.

Установка модуля CPAN с помощью yum

$ yum install perl-CPAN

Результат работы команды:

Loaded plugins: refresh-packagekit
updates-newkey                       | 2.3 kB     00:00
primary.sqlite.bz2                   | 2.4 MB     00:00
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
Transaction Summary
=============================================================================
Install      5 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 1.0 M
Is this ok [y/N]: y
Downloading Packages:
(1/5): perl-ExtUtils-ParseXS-2.18-31.fc9.i386.rpm     |  30 kB     00:00
(2/5): perl-Test-Harness-2.64-31.fc9.i386.rpm         |  70 kB     00:00
(3/5): perl-CPAN-1.9205-31.fc9.i386.rpm               | 217 kB     00:00
(4/5): perl-ExtUtils-MakeMaker-6.36-31.fc9.i386.rpm   | 284 kB     00:00
(5/5): perl-devel-5.10.0-31.fc9.i386.rpm              | 408 kB     00:00
 
Installing     : perl-ExtUtils-ParseXS                             [1/5]
Installing     : perl-devel                                        [2/5]
Installing     : perl-Test-Harness                                 [3/5]
Installing     : perl-ExtUtils-MakeMaker                           [4/5]
Installing     : perl-CPAN                                         [5/5]
 
Installed: perl-CPAN.i386 0:1.9205-31.fc9
Dependency Installed:
  perl-ExtUtils-MakeMaker.i386 0:6.36-31.fc9
  perl-ExtUtils-ParseXS.i386 1:2.18-31.fc9
  perl-Test-Harness.i386 0:2.64-31.fc9
  perl-devel.i386 4:5.10.0-31.fc9
Complete!

Настраиваем span

При первом вызове cpan вы должны указать некоторые конфигурационные параметры как показано ниже. Я покажу только важные параметры конфигурации. Значения по умолчанию принимаются нажатием клавиши enter.

$ cpan
Sorry, we have to rerun the configuration dialog for CPAN.pm due
to some missing parameters…
CPAN build and cache directory? [/root/.cpan]
Download target directory? [/root/.cpan/sources]
Directory where the build process takes place? [/root/.cpan/build]
Always commit changes to config variables to disk? [no]
Cache size for build directory (in MB)? [100]
Let the index expire after how many days? [1]
Perform cache scanning (atstart or never)? [atstart]
Cache metadata (yes/no)? [yes]
Policy on building prerequisites (follow, ask or ignore)? [ask]
Parameters for the ‘perl Makefile.PL’ command? []
Parameters for the ‘perl Build.PL’ command? []
Your ftp_proxy? []
Your http_proxy? []
Your no_proxy? []
Is it OK to try to connect to the Internet? [yes]
First, pick a nearby continent and country by typing in the number(s)
(1) Africa
(2) Asia
(3) Central America
(4) Europe
(5) North America
(6) Oceania
(7) South America
Select your continent (or several nearby continents) [] 5
(1) Bahamas
(2) Canada
(3) Mexico
(4) United States
Select your country (or several nearby countries) [] 4
(2) ftp://carroll.cac.psu.edu/pub/CPAN/
(3) ftp://cpan-du.viaverio.com/pub/CPAN/
(4) ftp://cpan-sj.viaverio.com/pub/CPAN/
(5) ftp://cpan.calvin.edu/pub/CPAN
(6) ftp://cpan.cs.utah.edu/pub/CPAN/
e.g. ‘1 4 5′ or ‘7 1-4 8[] 2-16
cpan[1]> o conf commit
commit: wrote ‘/usr/lib/perl5/5.10.0/CPAN/Config.pm’
cpan[2]> quit
No history written (no histfile specified).
Lockfile removed.

Установка Perl модулей с использованием CPAN

Вы можете использовать один из указанных тут методов для установки новых модулей:

$ /usr/bin/perl -MCPAN -einstall Email::Reply’
(или)
$ cpan
cpan shell — CPAN exploration and modules installation (v1.9205)
ReadLine support available (maybe install Bundle::CPAN or Bundle::CPANxxl?)
cpan[1]> install “Email::Reply”;

В результате выполнения команды вы увидите

CPAN: Storable loaded ok (v2.18)
Going to read /root/.cpan/Metadata
Database was generated on Mon, 15 Sep 2008 11:02:52 GMT
Running install for module 'Email::Reply'
Running make for R/RJ/RJBS/Email-Reply-1.202.tar.gz
CPAN: LWP::UserAgent loaded ok (v2.036)
CPAN: Time::HiRes loaded ok (v1.9711)
Fetching with LWP:
ftp://carroll.cac.psu.edu/pub/CPAN/authors/id/R/RJ/RJBS/Email-Reply-1.202.tar.gz
CPAN: checksum security checks disabled because Digest::SHA not installed.
Please consider installing the Digest::SHA module.
CPAN: Compress::Zlib loaded ok (v2.008)
Email-Reply-1.202/
Email-Reply-1.202/Changes
CPAN: File::Temp loaded ok (v0.18)
Warning: prerequisite Email::Abstract 2.01 not found.
Warning: prerequisite Email::MIME::Creator 1.41 not found.
Writing Makefile for Email::Reply
---- Unsatisfied dependencies detected during ----
----       RJBS/Email-Reply-1.202.tar.gz      ----
Email::Abstract [requires]
Email::MIME::Creator [requires]
Shall I follow them and prepend them to the queue
of modules we are processing right now? [yes]
[Note: CPAN automatically detects that Email::Abstract
       and Email::MIME::Creator is required]
Fetching with LWP:
ftp://server/pub/CPAN/authors/id/R/RJ/RJBS/Email-Abstract-2.134.tar.gz
make — OK
make install  — OK
Fetching with LWP:
ftp://server/pub/CPAN/authors/id/R/RJ/RJBS/Email-MIME-Creator-1.454.tar.gz
make — OK
make install  — OK
Warning: prerequisite Email::Simple::Creator 1.4 not found.
Writing Makefile for Email::MIME::Creator
Email::Simple::Creator [requires]
Shall I follow them and prepend them to the queue
of modules we are processing right now? [yes]
[Note: CPAN automatically detects that Simple::Creator is required]
Fetching with LWP:
ftp://carroll.cac.psu.edu/pub/CPAN/authors/id/R/RJ/RJBS/Simple-Creator.tar.gz
make — OK
make install  — OK
Fetching with LWP:
CPAN.pm: Going to build R/RJ/RJBS/Email-Reply-1.202.tar.gz
make — OK
make install  — OK

В примере выше Email::Reply зависит от нескольких других модулей. CPAN автоматически определил зависимости и установил Email::Reply и все другие необходимые модули.

By sysadmin on 02.03.2009 | Development
Метки: , , , ,

mysqladmin — примеры использования

В 15 примерах использования команд mysqladmin ниже, используется пароль root Mysql tmppassword. Поменяйте его на ваш пароль

1. Как изменить пароль root на Mysql?

$ mysqladmin -u root -ptmppassword password 'newpassword'
$ mysql -u root -pnewpassword
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.25-rc-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

2. Как проверить работает ли MySQL сервер?

$ mysqladmin -u root -p ping
Enter password:
mysqld is alive

3. Как посмотреть какая версия MySQL используетсяI am running?

Эта команда так же отображает текущий статус сервера.

$ mysqladmin -u root -ptmppassword version
mysqladmin  Ver 8.42 Distrib 5.1.25-rc, for redhat-linux-gnu on i686
Copyright (C) 2000-2006 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Server version          5.1.25-rc-community
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 107 days 6 hours 11 min 44 sec
Threads: 1  Questions: 231976  Slow queries: 0  Opens: 17067
Flush tables: 1  Open tables: 64  Queries per second avg: 0.25

4. Как посмотреть статус MySQL сервера?

$ mysqladmin -u root -ptmppassword status
Uptime: 9267148
Threads: 1  Questions: 231977  Slow queries: 0  Opens: 17067
Flush tables: 1  Open tables: 64  Queries per second avg: 0.25

Команда status отображает следующую информациюcommand displays the following information:

  • Uptime: Время безотказной работы в секундах
  • Threads: Общее количество клиентов, подключенных к серверу.
  • Questions: Общее количество запросов к серверу с момента запуска.
  • Slow queries: Общее количество запросов, чьё время выполнения было больше чем значение переменной long_query_time.
  • Opens: Total number of tables opened by the server.
  • Flush tables: How many times the tables were flushed.
  • Open tables: Total number of open tables in the database.

5. Как просмотреть статус переменных MySQL и их текущее значение?

$ mysqladmin -u root -ptmppassword extended-status
+-----------------------------------+-----------+
| Variable_name                       | Value     |
+-----------------------------------+-----------+
| Aborted_clients                       | 579       |
| Aborted_connects                    | 8         |
| Binlog_cache_disk_use             | 0         |
| Binlog_cache_use                    | 0         |
| Bytes_received                       | 41387238  |
| Bytes_sent                            | 308401407 |
| Com_admin_commands          | 3524      |
| Com_assign_to_keycache        | 0         |
| Com_alter_db                        | 0         |
| Com_alter_db_upgrade           | 0         |

6. Как отобразить все системные переменные MySQL сервера и их значения?

$ mysqladmin  -u root -ptmppassword variables
+---------------------------------+---------------------------------+
| Variable_name                   | Value                           |
+---------------------------------+---------------------------------+
| auto_increment_increment        | 1                               |
| basedir                         | /                               |
| big_tables                      | OFF                             |
| binlog_format                   | MIXED                           |
| bulk_insert_buffer_size         | 8388608                         |
| character_set_client            | latin1                          |
| character_set_database          | latin1                          |
| character_set_filesystem        | binary                          |
skip.....
| time_format                     | %H:%i:%s                        |
| time_zone                       | SYSTEM                          |
| timed_mutexes                   | OFF                             |
| tmpdir                          | /tmp                            |
| tx_isolation                    | REPEATABLE-READ                 |
| unique_checks                   | ON                              |
| updatable_views_with_limit      | YES                             |
| version                         | 5.1.25-rc-community             |
| version_comment                 | MySQL Community Server (GPL)    |
| version_compile_machine         | i686                            |
| version_compile_os              | redhat-linux-gnu                |
| wait_timeout                    | 28800                           |
+---------------------------------+---------------------------------+

7. Как отобразить все запущенные процессы/запросы в базе mysql?

$ mysqladmin -u root -ptmppassword processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 20 | root | localhost |    | Sleep   | 36   |       |                  |
| 23 | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

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

$ mysqladmin -u root -ptmppassword -i 1 processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 20 | root | localhost |    | Sleep   | 36   |       |                  |
| 23 | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 24 | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

8. Как создать базу MySQL?

$ mysqladmin -u root -ptmppassword create testdb
$ mysql -u root -ptmppassword
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 705
Server version: 5.1.25-rc-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| sugarcrm           |
| testdb             |
+--------------------+
4 rows in set (0.00 sec)

Замечание: Для отображения все таблиц в базе данных, общего количества колонок, строк, индексов и прочее…. используйте команду mysqlshow.

9. Как удалить существующую базу MySQL?

$ mysqladmin -u root -ptmppassword drop testdb
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'testdb' database [y/N] y
Database “testdb” dropped
$ mysql -u root -ptmppassword
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 707
Server version: 5.1.25-rc-community MySQL Community Server (GPL)
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| mysql              |
| sugarcrm           |
+——————–+
3 rows in set (0.00 sec)

10. Как перегрузить все привилегии и права на таблицы?

$ mysqladmin -u root -ptmppassword reload;

Команда Refresh сбросит все таблица и закроет/откроет лог-файлы.

$ mysqladmin -u root -ptmppassword refresh

11. Как образом выполнить безопасную остановку MySQL сервера?

$ mysqladmin -u root -ptmppassword shutdown
$ mysql -u root -ptmppassword
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/var/lib/mysql/mysql.sock'

Вы можете использовать команду “/etc/rc.d/init.d/mysqld stop” для остановки сервера. Для запуска выполните “/etc/rc.d/init.d/mysql start”

12. Список всех mysqladmin flush комманд.

$ mysqladmin -u root -ptmppassword flush-hosts
$ mysqladmin -u root -ptmppassword flush-logs
$ mysqladmin -u root -ptmppassword flush-privileges
$ mysqladmin -u root -ptmppassword flush-status
$ mysqladmin -u root -ptmppassword flush-tables
$ mysqladmin -u root -ptmppassword flush-threads
  • flush-hosts: Сбросить всю информацию в кэше хостов.
  • flush-privileges: Перезагрузить права.
  • flush-status: Очистить статус переменных.
  • flush-threads: Flush the thread cache.

13. Как убить подвешенный клиентский процесс в MySQL ?

Сперва определите подвешенный процесс используя команду processlist.

$ mysqladmin -u root -ptmppassword processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 20 | root | localhost |    | Sleep   | 64   |       |                  |
| 24 | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

Затем используйте команду kill и нужный process_id. Для завершения нескольких процессов разделите process id запятыми.

$ mysqladmin -u root -ptmppassword kill 20
$ mysqladmin -u root -ptmppassword processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 26 | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

14. Как запустить или остановить репликацию MySQL на slave-сервер?

$ mysqladmin  -u root -ptmppassword stop-slave
Slave stopped
$ mysqladmin  -u root -ptmppassword start-slave
mysqladmin: Error starting slave: The server is not configured as slave;
fix in config file or with CHANGE MASTER TO

15. Как скомбинировать несколько команд mysqladmin вместе?

В примере ниже скомбинированы команды process-list, status и version для полного вывода статуса сервера.

$ mysqladmin  -u root -ptmppassword process status version
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 43 | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
Uptime: 3135
Threads: 1  Questions: 80  Slow queries: 0  Opens: 15  Flush tables: 3
Open tables: 0  Queries per second avg: 0.25
mysqladmin  Ver 8.42 Distrib 5.1.25-rc, for redhat-linux-gnu on i686
Copyright (C) 2000-2006 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Server version          5.1.25-rc-community
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 52 min 15 sec

Вы можете также использовать краткую форму записи:

$ mysqladmin  -u root -ptmppassword pro stat ver

Используйте опцию -h для подключения к удаленному MySQL серверу и выполнения команды.

$ mysqladmin  -h 192.168.1.112 -u root -ptmppassword pro stat ver
By sysadmin on | MySQL
Метки: , , , ,