FreeBSD

Обновление FreeBSD c 7.4 до 9.2 (обновление через 8.4)

Имеем рабочий сервер под управлением FreeBSD 7.4

Необходимо обновить его до последней стабильной версии – 9.2

Основная причина – окончание поддержки FreeBSD 7.x и множество нерабочих портов.

Сразу обновить с 7.4 до 9.2 не получится, для начала надо сделать промежуточное обновление до 8.4.

Поехали…

1. Обновление 7.4 -> 8.4

удаляем старые исходники:

# rm -r /usr/obj

# rm -r /usr/src

закачиваем новые:

# svn co svn://svn.freebsd.org/base/stable/8 /usr/src

# cd /usr/src

# mergemaster -p

# make -j4 buildworld

# make -j4 buildkernel

# make installkernel

# make installworld

# mergemaster -iU

и получаем ошибку:

—-

*** Creating the temporary root environment in /var/tmp/temproot

*** /var/tmp/temproot ready for use

*** Creating and populating directory structure in /var/tmp/temproot

*** FATAL ERROR: Cannot ‘cd’ to /usr/src and install files to

the temproot environment

—-

поможет перезагрузка

# reboot

повторяем еще раз

# mergemaster -iU

ошибка не повторилась,

подтверждал все вопросы системы про удаление или выполнение(y)

# reboot

проверяем версию обновленной системы:

# uname -r

8.4-STABLE

2. теперь обновляю 8.4 -> 9.2

все аналогично предыдущему обновлению:

# rm -r /usr/obj

# rm -r /usr/src

# svn co svn://svn.freebsd.org/base/stable/9 /usr/src

# cd /usr/src

# mergemaster -p

# make -j4 buildworld

# make -j4 buildkernel

# make installkernel

# make installworld

# mergemaster -iU

# reboot

ОС не поднялась, ошибка загрузки системы “gm0s1a failed with error 19″:

Mounting from ufs:/dev/mirror/gm0s1a failed with error 19.

Loader variables:

vfs.root.mountfrom=ufs:/dev/mirror/gm0s1a

vfs.root.mountfrom.options=rw

Manual root filesystem specification:

: [options]

Mount using filesystem

and with the specified (optional) option list.

eg. ufs:/dev/da0s1a

zfs:tank

cd9660:/dev/acd0 ro

(which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /)

? List valid disk boot devices

. Yield 1 second (for background tasks)

Abort manual input

mountroot>

т.к. сервер HP ProLiant DL120 G5, то зашел в iLo и перегрузил сервер,

после чего в loader prompt и выполнены команды:

OK set kern.geom.part.check_integrity=0

OK boot

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

iLO remote console crashes with error “com.serverengines.rdr.EndOfStream: EndOfStream”

проблема с iLo решена по этому мануалу.

поехали дальше…

проблема с загрузкой ОС возникает при наличии программного RAID – gmirror

проверить можно так:

# gpart status

Name Status Components

mirror/gm0s1 CORRUPT mirror/gm0

# gpart show

=> 63 488397104 mirror/gm0 MBR (232G) [CORRUPT]

63 488397105 1 freebsd [active] (232G)

=> 0 488397105 mirror/gm0s1 BSD (232G)

0 20971520 1 freebsd-ufs (10G)

20971520 8288698 2 freebsd-swap (4G)

29260218 20971520 4 freebsd-ufs (10G)

50231738 204800000 5 freebsd-ufs (97G)

255031738 233365367 6 freebsd-ufs (111G)

======================

есть три решения:

1) отключить механизм целостности разделов:

# echo “kern.geom.part.check_integrity=0″ >> /boot/loader.conf

2) временно отключить проверку и последовательно пересоздать каждую из нод зеркала

3) временно отключить проверку и загрузится в single mode и прогнать fsck

до окончания обновления выбран 1-й вариант, продолжение следует

проверяем версию обновленной системы:

# uname -r

9.2-STABLE

3. обновление портов

удаляем старые исходники портов:

# rm -r /usr/ports

получаем новые:

# portsnap fetch

# portsnap extract

# portsnap fetch update

указываем нужную версию питона

# echo “DEFAULT_VERSIONS=python=2.7 python2=2.7 python3=3.3″ >> /etc/make.conf

сперва обновляем утилиту обновления портов:

# portupgrade -frR portupgrade

а потом и все остальные порты:

# portupgrade -farR

Взято от сюда http://www.net-adm.ru/articles/57-upgrade-freebsd-7-to-9.html

Настройка доступа по ssh к консоли с помощью putty

Для настройки доступа по ssh к консоли с помощью putty необходимо в терминале сервера сгенерировать пару ключей:
1) Создать каталог в домашней папке пользователя ~user/.ssh (обычно ~user находится в /home/user)
mkdir ~user/.ssh
cd ~user/.ssh
2) Сгенерировать ключ, указав путь файла ~user/.ssh/id_rsa
ssh-keygen -t rsa -b 2048
3) Появятся два файла id_rsa и id_rsa.pub. Это файлы чачтного и публичного ключей.
На сервере хранится публичный ключ. Скопируем в тот файл, который используется sshd.
cp id_rsa authorized_keys
4) authorized_keys должен лежать в каталоге ~user/.ssh. Он будет использоваться sshd для проверки частного ключа. Частный ключ отправим безопасно пользователю:
ssh-copy-id -i private_key_file user@machine (где private_key_file это файл rsa)
или небезопасно его можно просто скопировать любым доступным способом на машину пользователя.
5) Далее, если подключение будет происходить с помощью putty, то необходимо сгенерировать специальный ключ утилитой “PUTTY Key Generator” (ее надо качать отдельно) таким образом:
Запускае утилиту. Нажимаем кнопку Load, и открываем файл private_key_file. Далее нажимаем Save private key. Сохранится файл с ключем под названием private_key_file.ppk

После этого этот файл можно использовать при подключении по ssh через Putty.
6) Осталось настроить sshd на сервере. Для этого корректируем файл sshd_config:
vim /etc/ssh/sshd_config
Закомментировать (знаком #) строки
PasswordAuthentication yes
PermitEmptyPasswords no
Параметр LoginGraceTime (время, за которое необходимо ввести пароль) установить равным 15 сек.
LoginGraceTime 15
Также можно использовать для ограничения доступа только для определенных пользователей строку:
AllowUsers user user1 user2 user3
Сохраняем файл и перезапускаем sshd. На redhat таким образом:
service sshd restart

Автозагрузка FreeBSD, RedHat

В redhat добавить в автозагрузку:

chkconfig –add [имя]

Пример

chkconfig –add postfix

Посмотреть список

chkconfig –list

 

В FreeBSD найти файл /etc/rc.conf и добавить строку

[имя]_enable=”YES”

Пример

defaultrouter=”xx.xx.xx.xx”
gateway_enable=”YES”
hostname=”freebsdhost.ru”
ifconfig_em1=”inet yy.yy.yy.yy  netmask 255.255.0.0″
inetd_enable=”YES”
keymap=”ru.koi8-r”
linux_enable=”YES”
moused_enable=”YES”
sshd_enable=”YES”
mysql_enable=”YES”
gdm_enable=”YES”
gdm_lang=”ru_RU.UTF-8″

Сами скрипты, которые запускает rc.conf лежат в директории /etc/rc.d.

Более подробно все есть в man rc.conf. Там же описывается что такое ifconfig_em1, hostname.

 

 

Обновление часовых поясов в linux

Сначала надо скачать базу с часовыми поясами с сайта www.iana.org/time-zones.

Далее этой базой заменим старую в системе.

Рассмотрим обновление на примере московского часового пояса.

Посмотрим расхождение с UTC

zdump -v /usr/share/zoneinfo/Europe/Moscow

Сделаем резервную копию
cp /usr/share/zoneinfo/Europe/Moscow /usr/share/zoneinfo/Europe/Moscow.bkp

Скачаем базу tzdata2013d.tar.gz в каталог /tmp
cd /tmpwget www.iana.org/time-zones/repository/releases/tzdata2013d.tar.gz
mkdir /tmp/tzdata2013d
tar xfv tzdata2013d.tar.gz -C /tmp/tzdata2013d

Компилируем и заменяем старый файл
zic -d zoneinfo europe
cp zoneinfo/Europe/Moscow /usr/share/zoneinfo/Europe/Moscow

Далее выставляем в системе часовой поясcp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Устанавливаем времяntpdate x.x.x.x

где х.х.х.х - адрес ntp, например, с сайта http://www.ntp-servers.net/servers.html

Смотрим

date

Cron

Основные настройки крона находятся в файле /etc/crontab

Структура строки конфигурации:

# *    *    *    *    *  [команда для выполнения]
# ┬    ┬    ┬    ┬    ┬
# │    │    │    │    │
# │    │    │    │    │
# │    │    │    │    └───── день недели (0 - 6) (0 to 6 are Sunday to Saturday, or use names)
# │    │    │    └────────── месяц (1 - 12)
# │    │    └─────────────── день месяца (1 - 31)
# │    └──────────────────── час (0 - 23)
# └───────────────────────── минута (0 - 59)
 # выполнять каждый день в 0 часов 5 минут, результат складывать в log/daily
 5 0 * * * $HOME/bin/daily.job >> $HOME/log/daily 2>&1
 # выполнять 1 числа каждого месяца в 14 часов 15 минут
 15 14 1 * * $HOME/bin/monthly
 # каждый рабочий день в 22:00
 0 22 * * 1-5 echo "Пора домой" | mail -s "Уже 22:00" john

 23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д."
 5 4 * * sun echo "Выполняется в 4:05 в воскресенье"
 0 0 1 1 * echo "С новым годом!"
 15 10,13 * * 1,4 echo "Эта надпись выводится в понедельник и четверг в 10:15 и 13:15"
 0-59 * * * * echo "Выполняется ежеминутно"
 0-59/2 * * * * echo "Выполняется по четным минутам"
 1-59/2 * * * * echo "Выполняется по нечетным минутам"
 # каждые 5 минут
 */5 * * * * echo "Прошло пять минут"

Перезапустить cron в freebsd/etc/rc.d/cron restart
Перезапустить cron в red hatservice crond restart

Установка postgrey

Необходимо наличие пакета perl 5.6 версии и выше.

На Red Hat, например, проверим:

rpm -qa perl

Установить, если не установлен, NetServer

>cpan [ENTER]
>install Net::Server

или, например, для RedHat

rpm -i perl-Net-Server-version.rpm

То же самое для IO::Multilex

>cpan [ENTER]
>install IO::Multilex

Также установить модули perl, если не установились или не установлены:

BerkeleyDB (Perl module)

Berkeley DB (Library, version ≥ 4.1)

perl-Net-DNS

perl-Digest-HMAC

perl-Digest-SHA1

perl-Parse-Syslog

Сам postgrey лежит на сайте here. Там же есть ссылки на вышеперечисленные пакеты.

Распакуем пакет:

tar -xvzf postgrey-1.34.tar.gz

Копируем файлы. Для большинства linux систем каталоги находятся там, где написано ниже (Однако нужно проверить и подкорректировать под свою систему):

cp postgrey /usr/sbin/
cp postgrey_whitelist_clients /etc/postfix/
cp postgrey_whitelist_recipients /etc/postfix/
сp contrib/postgreyreport /usr/sbin/

Далее возможно (для redhat EL5 наверняка потруется) ставим дополнительно еще из компилированного пакета. Пример ниже для Red hat (пакет взят из here):

rpm -i postgrey-version.rpm

Проверить наличие каталога /var/spool/postfix/postgrey и прав доступа к нему:
    chown postfix:postfix /var/spool/postfix/postgrey
    chmod 770 /var/spool/postfix/postgrey

Для работы postgrey совместно с postfix внесем изменения в конфигурационный  файл main.cf (в данном примере, вместо параметра smtpd_recipient_restrictions использован параметр smtpd_client_restrictions. Разработчик рекомендует использовать smtpd_recipient_restrictions) :

smtpd_client_restrictions =
…,
…,
check_policy_service inet:127.0.0.1:60000

Внесем в файл /etc/postfix/ postgrey_whitelist_clients известные ip-адреса, домены почтовых сервисов, которые будут в белом списке (один адрес на одной строке).

Внесем в файл /etc/postfix/ postgrey_whitelist_recipient адреса получателей, к которым почта должна поступать незамедлительно:
postmaster@domain.tld
Administrators@domain.tld
root@domain.tld

Проверим наличие каталога /var/run/postgrey (если не существует – создать!!!), права на каталог root:postfix.
Откорректируем скрипт запуска сервиса postgrey /etc/init.d/postgrey. Параметр delay указывает время задержки сообщения в секундах :
prog=postgrey
postgrey=/usr/sbin/$prog
DBPATH=/var/spool/postfix/postgrey
SOCKET=$DBPATH/socket
OPTIONS=”-v –inet=127.0.0.1:60000 –delay=300 –user=postfix –group=postfix –pidfile=/var/run/postgrey/postgrey.pid”

Проверка работы сервиса postgrey
Запустим скрипт /etc/init.d/postgrey и проверим наличие процессов

    >ps –aux | grep postgrey

postfix  14464  0.6  1.4  34580 29940 ?        Ss   Jun10 282:53 /usr/sbin/postgrey -d -v –inet=127.0.0.1:60000 –delay=300 –user=postfix –group=postfix –pidfile=/var/run/postgrey/postgrey.pid
root     29172  0.0  0.0   3892   700 pts/6    S+   16:59   0:00 grep postgrey

    > netstat -pan | grep postgrey
tcp        0      0 127.0.0.1:6060              0.0.0.0:*                   LISTEN      19224/postgrey.pid
tcp        0      0 127.0.0.1:6060              127.0.0.1:48744             ESTABLISHED 19224/postgrey.pid
unix  2      [ ]         DGRAM                    72023  19224/postgrey.pid

Выполним команды
    service postgrey restart
    service postfix restart

В результате в логах postfix должны появиться подобные строки:
    > grep “action=” /var/log/mail/maillog
postgrey[23219]: action=greylist, reason=new, client_name=unknown, client_address=x.x.x.x, sender=test@domain.tld, recipient=testreception@domain2.tld

Установка времени и часового пояса во FreeBSD

#cp /usr/share/zoneinfo/America/New_York /etc/localtime
#date +%z

Установка времени:
Автоматически -> /usr/bin/ntpdate 195.2.64.5
Вручную -> date yymmddhhss

Замена ereg (eregi) на preg_match в PHP 5.3 (устаревание POSIX)

В PHP 5.3 разработчки решили, наконец, избавиться от POSIX регулярных выражений – в самом деле, зачем нужны две библиотеки для работы с регулярными выражениями, если можно обойтись одной? К тому же, POSIX регулярные выражения гораздо медленнее чем Perl совместимые регулярные выражения (PCRE).

Теперь, разработчики в срочном порядке исправляют свой код, заменяя функции ereg, eregi, ereg_replace, ereg_replacei соответствующими PCRE аналогами, благо, замена получилась довольно простой:

1. заменить ereg и eregi на preg_match, ereg_replace и ereg_replacei на preg_repalce;
2. добавить // разделители в начало и конец регулярного выражения;
3. если POSIX функция кончается на i (eregi, ereg_replacei) то добавить i в конец регулярного выражения после разделителя.
4. заменить POSIX спецсимволы соответствуюущими PCRE аналогами: [:alnum:] – \w или [0-9a-z], [:digit:] – \d или [0-9], [:space:] – \s, [:alpha:] – [a-z]

примеры:

ereg(‘expression’) -> preg_match(‘/expression/’)

eregi(‘expression’) -> preg_match(‘/expression/i’)

eregi(‘^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$’) -> preg_match(‘/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i’)

Кроме того, оказывается шаг четвертый не обязателен – спецсимволы типа [[:alnum:]] теперь поддерживаются в PCRE!

Сброс пароля Mysql

Для изменения забытого пароля root для входа в mysql необходимо следующее.

1. Останавливаем mysql
RedHat:
service mysqld stop
FreeBSD:
/usr/local/etc/rc.d/mysql-server.sh stop

2. Запускаем mysql следующей командой:
RedHat:
/usr/bin/mysqld_safe –skip-grant-tables –user=root &
FreeBSD:
/usr/local/bin/mysqld_safe -user=mysql &

3. Запускаем клиента mysql
mysql -u root

4. Выполняем sql запрос
UPDATE mysql.user SET Password=PASSWORD(’newpwd’) WHERE User=’root’;
где newpwd – новый пароль.

5. Применяем изменения
FLUSH PRIVILEGES;

6. Выходим из mysql клиента, выполнив в нем команду exit (или \q)

7. Перегружаем mysql сервер.
RedHat:
service mysqld restart
FreeBSD:
/usr/local/etc/rc.d/mysql-server.sh restart

Статистика сайта Awstats для FreeBSD + Apache2

Программа awstats для составления отчетов о посещение сайтов и вывода статистики использует лог Apache.

Установим awstats:

cd /usr/ports/www/awstats && make install clean

Это установка из портов, поэтому желательно иметь свежий набор портов. Как обновить порты, отдельная статья в рубрике FreeBSD этого блога.

Дальше редактируем настройки Apache

    # Алиас для jar-файлов
    Alias /awstatsclasses “/usr/local/www/awstats/classes/”

    # Алиас для таблиц стилей
    Alias /awstatscss “/usr/local/www/awstats/css/”

    # Алиас для путей к иконкам
    Alias /awstatsicons “/usr/local/www/awstats/icons/”

    # Алиас для CGI-скриптов
    ScriptAlias /awstats/ “/usr/local/www/awstats/cgi-bin/”

    # Имя виртуального хоста
    ServerName site.ru

    # Корень виртуального хоста
    DocumentRoot /usr/local/www/awstats

    # Настройки доступа к директории
   
        Allow from all
        AllowOverride All
   

    # Логи виртуального хоста
    CustomLog “/var/log/httpd-stat.site.ru-access.log” combined
    ErrorLog “/var/log/httpd-stat.site.ru-error.log”

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

Перезапускаем Apache:

apachectl -k restart

Переходим к настройке awstats.

cd /usr/local/www/awstats/cgi-bin

cp awstats.model.conf awstats.site.ru.conf

Необходимо дать необходимые права на файл awstats.site.ru.conf.

Например, самые небезопасные настройки могут выполнены с помощью команд chmod и chown слудующим образом:

chmod root:wheel awstats.site.ru.conf

chown 777 awstats.site.ru.conf

Далее редактируем файл awstats.site.ru.conf. Изменяем следующие строки:

LogFile=”/var/log/httpd-stat.site.ru-access.log” — указуем путь к логам

AllowToUpdateStatsFromBrowser=1 — это добавит на страницу ссылоку обновить сейчас.

Lang=ru и DirData=”путь для отчетов” по усмотрению

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

55 * * * * root /usr/local/www/awstats/cgi-bin/awstats.pl -update -config=site.ru > /dev/null

Теперь все готово. Для просмотра, набираем в браузере:

http://site.ru/awstats/awstats.pl?config=site.ru

Следующее можно делать по желанию:

1. Вход по паролю. Нужно в нашем случае (см настройки apache) в каталоге /usr/local/www/awstats создать файл с логином и паролем .htpasswd. Для этого используется команда htpasswd.

Команда htpasswd -c /usr/local/www/awstats/.htpasswd username
А в файл конфигурации apache2 добавить:
<Directory /usr/local/www/awstats>
   AuthType Basic
   AuthName “Some Name”
   AuthUserFile /usr/local/www/awstats/.htpasswd
   require valid-user
</Directory>

2. Вход не через доменное имя site.ru, а через поддоменное stat.site.ru. Нужно изменить в настройках apache строку ServerName site.ru на ServerName stat.site.ru, а также добавить DNS запись в зоне у вашего доменного регистратора.