Показаны сообщения с ярлыком freebsd. Показать все сообщения
Показаны сообщения с ярлыком freebsd. Показать все сообщения

среда, 9 февраля 2011 г.

Как не переходить на зимнее время на серверах


Наконец-то случилось то, на что все разумные люди уже много лет робко надеялись - клоунада с переводом стрелок отменена! Осталось понять, как мы сообщим об этом радостном событии серверам. Итак, задача: 30 октября 2011 навсегда остаться в московском летнем времени. Сервера у меня под CentOS и FreeBSD, потому все последующие упражнения проверялись именно для этих систем.
До сегодняшнего дня я считал, что летнее московское время соответствует времени GMT+4. Ничего подобного! Простые опыты показали, что все как раз наоборот - GMT-4. Убедиться в этом легко с помощью команды zdump:
$ zdump Europe/Moscow
Europe/Moscow  Wed Feb  9 09:48:59 2011 MSK
$ zdump Etc/GMT-3
Etc/GMT-3  Wed Feb  9 09:49:12 2011 GMT-3
$ zdump Etc/GMT+3
Etc/GMT+3  Wed Feb  9 03:49:15 2011 GMT+3
(проверяется -3, а не -4 потому, что у нас с вами пока зимнее время).
Дальше все достаточно просто (одинаково и для Linux и для FreeBSD):
# ln -sf /usr/share/zoneinfo/Etc/GMT-4 /etc/localtime
(если директории /usr/share/zoneinfo и /etc находятся на разных устройствах, то безопаснее будет использовать не ln, а cp).
В CentOS можно еще поправить параметр ZONE в файле /etc/sysconfig/clock, но - судя по коменту в том же файле, это значение на реальную работу системы не влияет.
Потом на каком-нибудь сервачке, который не жалко, можно заранее поставить время без пяти три 30 октября - и убедиться, что с переходом через 3 часа никакого зимнего времени не наступит.

среда, 14 апреля 2010 г.

Странное поведение mktime относительно летнего времени


На опыте столкнулся с тем, что результат, возвращаемый функцией mktime(3) не учитывает перехода на зимнее/летнее время (т.е. результаты для "лета" оказываются на час больше, чем нужно). Проверено на linux 2.6.18 и FreeBSD 8.0 с корректно установленной зоной MSK/MSD - так что, вероятно, именно такое странное поведение соответствует спецификации POSIX. Самое смешное в том, что (в полном соответствии с документацией) функция mktime не только возвращает типа значение time_t, но и "нормализует" содержимое переданной в нее по указателю struct timespec, заполняя совершенно корректными (учитывающеми перевод времени) значениями поля tm_isdst, tm_gmtoff и tm_zone. Очевидно, где-то в этом направлении и лежит путь борьбы с этой функцией. Т.е вместо очевидного:

struct timespec ts;

time_t tm = mktime(&ts);

Пишем теперь так:

struct timespec ts;

time_t tm = mktime(&ts) - ts.tm_isdst * 3600;

Эстетам же и забывчивым можно предложить определить вот такой макрос:

#define mktime(t) (mktime(t) - (t)->tm_isdst * 3600)

и использовать mktime, как обычно.

Еще идеи?

вторник, 2 февраля 2010 г.

nsswitch.conf для FreeBSD, пересобранной без NIS



Дальнейшие опыты проверены на FreeBSD 8.0

NIS в наше время используется достаточно редко, так что при пересоборке мира существует соблазн добавить в /etc/src.conf строку WITHOUT_NIS=YES (для более ранних версий править надо файл /etc/make.conf). После пересборки с этой опцией все вроде работает, но порой замечаются легкие странности - например, демон cron не отправляет стандартный вывод выполенных комманд по почте, а в /var/log/cron пишет:
NSSWITCH(_nsdispatch): nis, passwd_compat, endpwent, not found, and no fallback provided
Очевидно, проблему надо искать в /etc/nsswitch.conf
Там по умолчанию стоит:
passwd: compat
man-страница nsswitch.conf(5) сообщает, что compat означает подержку в файлах /etc/passwd и /etc/group строк + и - , что на самом деле имеет какой-то смысл только при использовании NIS (кто с ней знаком, помнит, зачем это надо - прочим нормальным людям едва ли необходимо об этом знать). Очевидно, система, собранная без поддержки NIS, просто перестает понимать какой-такой это compat - и пасует. Решение представляется очевидным. Меняем строку на банальное:
passwd: files

...и ожидаем новых сюрпризов. Мораль - хочешь спать спокойно, нечего править /etc/src.conf ;)

среда, 5 ноября 2008 г.

Создание интерфейсов VLAN во FreeBSD 7.0 и Mandriva 2008.1



Задача - нужно создать два VLAN интерфейса (для определенности - номера VLAN: 62 и 99) на одной сетевой карте (пусть в Linux она будет eth0, во freebsd - em0). Кособокость обеих способов примерно одинакова, так что дальше нет ни слова пропаганды - просто констатация.

FreeBSD
Пересобираем ядро, добавив в конфиг строку
device vlan
или пишем в /boot/loader.conf
if_vlan_load="YES"
потом пишем в /etc/rc.conf такое:
cloned_interfaces="vlan62 vlan99"
ifconfig_vlan99="inet x.x.x.x netmask y.y.y.y vlan 99 vlandev em0"
ifconfig_vlan62="inet z.z.z.z netmask w.w.w.w vlan 62 vlandev em0"
после перезагрузки должны появиться интерефейсы vlan62 и vlan99

Mandriva
(аналогично все завелось на CentOS 5.2, в инете сообщалось, что та же схема работает и в других redhat-подобных дисрибутивах)
Должен быть установлен пакет, содержащий команду vconfig. В мандриве этот пакет звался vlan-utils и по умолчанию не был установлен - в CentOS 5.2 пакет vconfig стоял по умолчанию - ну там вообще много всего лишнего ;)
Короче говоря, делаем
$ which vconfig
и при отрицательном ответе хватаемся за urpmf (для мандривы) или yum search для CentOS.
Потом создаем файл /etc/sysconfig/network-scripts/ifcfg-eth0.62
в нем пишем такое:
DEVICE=eth0.62
VLAN=yes
BOOTPROTO=static
IPADDR=x.x.x.x
NETMASK=y.y.y.y
ONBOOT=yes
аналогично создаем и файл ifcfg-eth0.99
После команды
# /etc/init.d/network restart
у нас должны появиться интерфейсы eth0.62 и eth0.99
Для других семейств Linux привожу "сырые" команды оболочки (в самом крайнем случае, их можно и вписать в /etc/rc.local). Создание VLAN интерфейса:
# vconfig add eth0 62
удаление: (мне пригодилось и в мандриве ;)
# vconfig rem eth0.62

P.S. интерфейся Linux вида eth0.62 для комады sysctl будут выглядеть как eth0/62 - лишняя точка сбила бы команду с толку.
P.P.S. ежели используется VirtualBox, то следует заметить что на драйверах Intel PRO (em(4)) vlan не заведется - это не мной первым замечено - нужно использовать PCnet (le(4)).

среда, 1 октября 2008 г.

Запуск ntpd под FreeBSD


Как это ни странно, но в стандартной поставке FreeBSD болванки для файла конфигурации ntpd (8) нет ни в /etc, ни в /usr/share/examples. Поэтому восполняю это досадное упущение. Взято из FreeBSD Handbook и http://support.ntp.org/bin/view/Servers/StratumOneTimeServers (список публичных ntp-серверов 1 страты). Называется файл конфигурации /etc/ntp.conf, минимально необходимое содержимое его такое:
# это сервера, откуда берем время
# если используется restrict, лучше брать те сервера, у которых
# 1 адрес, а не пул - а то придетс яписать доступ всем
server clock.nc.fukuoka-u.ac.jp prefer
server ntp1.mmo.netnod.se
server ntp.nic.cz
# а это ACL
restrict default ignore
restrict 127.0.0.1
# это те, от кого мы берем дату
restrict ntp.nic.cz noquery notrap
restrict ntp1.mmo.netnod.se noquery notrap
restrict clock.nc.fukuoka-u.ac.jp noquery notrap
# а это - наши клиенты
restrict x.x.x.x mask y.y.y.y nomodify notrap
restrict z.z.z.z mask w.w.w.w nomodify notrap

не забыть конечно добавить в /etc/rc.conf такое:
ntpd_enable="YES"
работает ntpd на порте 123 по протоколу UDP - так что эти порт должен быть открыт в firewall
Тестирование с UNIX-like клиента такой командой:
$ ntpdate -d your_server_addr
По ее выводу легко понять, какая дата получена с сервера (и получена ли вообще). Опция -d означает не устанавливать дату фактически, зато показать отладочную информацию (что нам и нужно).
Много полезного можно узнать, запуская на сервере команду ntpq (8) - напр. про соседей нам расскажут субкоманды peer и ass (sic!)

P.S. Во FreeBSD 7.1-PRERELEASE столкнулся со странным поведением стартового скрипта /etc/rc.d/ntpd - он зачем-то запускат два процесса ntpd (с клиента все выглядит нормально, но на сервере второй процесс переодически грязно ругается в логи). На всякий случай, если у кого-нибудь вдруг произойдет тоже самое (в чем лично я сильно сомневаюсь), сообщаю, что методом тыка удалось найти на эту беду управу. Помогает строчка
ntpdate_enable="YES"
в файле /etc/rc.conf Почему помогает - не знаю сам - придумалось оно путем сложных ассоциаций на тему строки REQUIRE в скрипте /etc/rc.d/ntpd

вторник, 16 сентября 2008 г.

Обновление приложений во FreeBSD и в CentOS



Старая как мир задача - что-то где-то обновилось (напр. clamav), нужно броситься вдогонку за новой версией. Что делаем? (только pls не ищите ниже очередного гундения на тему, что круче - линух или фря - это просто записки на память) Версии систем у меня такие: FreeBSD 7.0 и CentOS 5.2.
FreeBSD
  • Если нет никакого еще дерева портов (это кажется не наш случай, но на всякий пожарный), то # portsnap fetch extract update;
  • Если уже запускался ранее portsnap(8) (искать его следы в /var/db/portsnap - если командой portsnap не пользовались, то он будет пустой), то # portsnap fetch update;
  • Если есть старое дерево портов и supfile для портов (болванку брать в /usr/share/examples/cvsup/ports-supfile), то # csup ports-supfile;
Потом:
# cd /usr/ports/dir/ourport
# make deinstall reinstall clean
Если какие-то пакеты зависят от нашего, make reinstall не обращает на это никакого внимания, толтко сообщает о несчастных в консоль (чтобы потом не забыли похоронить трупы и эвакуировать выживших ;)
Если обновляли демона - не забыть:
# /usr/local/etc/rc.d/ourdaemon restart
и смотреть в логи на результаты
CentOS
Ищем где-нибудь на просторах инета нужный src.rpm (допустимые платформы rhel или centos - желательно, fc - фопустимо, с mdv и suse лучше не связываться). Для начала можно попробовать поискать на офинциальных зеркалах - напр. тут, но там мало чего есть. Порой помогает rpmfind или сайты приложений). Допустим, нашли:
# rpm -i myprog.src.rpm
# cd /usr/src/redhat/SPECS
ищем specfile нашего приложения - и нещадно правим. Потом:
# rpmbuild -bb myprog.spec
установочный пакадж образуется в папке ../RPMS/arch (arch может быть noarch, i386, i586 и т. д.), его и ставим:
# rpm -U ../RPMS/myarch/myprog.rpm
Если это был демон, перзапускаем:
# /etc/init.d/mydaemon restart
и тоже идем читать логи ;)
Удалить srpm, если исходники уже не нужны, можно командой:
# rpmbuild --rmsource myprog.spec

пятница, 12 сентября 2008 г.

Изменение объема памяти, максимально доступной процессу, во FreeBSD


Как это не прискорбно, программы, которым нужно очень много памяти, существуют не только в Window$ ;(
По умолчанию во FreeBSD 7.0 на платформе i386 программе доступно максимально:
  • на стек - 64 Мб,
  • на сегмент текста - 128 Мб,
  • на сегмент данных - 512 Мб
Если этого мало, есть два пути:
1. в файле конфигурации ядра можно задать опции MAXDSIZ, MAXSSIZ и MAXTSIZ. Синтаксис такой:
options MAXDSIZ=(2048UL*1024*1024)
(примеры смотреть в /usr/src/sys/conf/NOTES)
2. в /boot/loader.conf можно установить переменные kern.maxdsiz, kern.maxssiz и kern.maxtsiz
синтаксис:
kern.maxdsiz="1073741824"
Документация утверждает, что установки в /boot/loader.conf имеют приоритет над установками в конфиге ядра.

среда, 10 сентября 2008 г.

Перенос FreeBSD на другой диск


...и такое в жизни бывает :( Диск начал грязно ругаться в dmesg на ошибки чтения-записи. Значит, надо переезжать. Система у меня версии 7.0, но, кажется, процедура эта уже давно не изменялась.
Выключаемся, вставляем новый диск (у меня он ad2). Он у меня немного поменьше, потому внимательно смотрим
$ df -m
- и думаем, какую файловую систему насколько можно ужать.
Подумали - можно приступать.
# sysinstall
идем в меню Configure->Fdisk, в нем удаляем существующие партиции и создаем одну новую на весь диск. Сложностей никаких. Есть тонкость - выходить нужно по Q, не нажимая W. (Если в задумчивости нажали, катастрофы нет - но перед следующей операцией придется перегружаться).
На вопрос про Boot Manager отвечаем Standard.
Переходим в пункт меню Label.
Здесь нас поджидает еще одна тонкость. Будущий корневой раздел должен быть создан с меткой ad2s1a, но sysinstall не позволяет задавать метку вручную, а при указании точки монтирования отличной от / автоматически присваеват имя ad2s1d. У меня сработала такая последовательность: сперва создал раздел с точкой монтирования / - и он получил правильную метку, а потом нажал M - и изменил точку монтирования на /tmp/root.
Далее без каких-либо сложностей создаются раздел подкачки ad2s1b и файловые системы с точками монтирования /tmp/usr и /tmp/var (соотношение меток и точек монтирования сверяйте с вашим /etc/fstab - если, конечно, у вас нет охоты переделать все по-новому).
Выход из Label нажатием W (появляется большое ругательное окно, с вопросом, понимаете ли вы, что творите. Нужно ответить Yes) и потом Q.
Выходим из sysinstall и смотрим на новые файловые системы:
$ mount
Теперь переносим на них содержимое старого диска:
# cd /
# find . -xdev -print | cpio -p -m /tmp/root
# cd /usr
# find . -xdev -print | cpio -p -m /tmp/usr
# cd /var
# find . -xdev -print | cpio -p -m /tmp/var
Чтобы веселее было ждать конца копирования, у cpio можно добавить опцию --verbose
(команда копирования может быть и такой: pax -rw -X -pe . /tmp/root - так короче, но вариант find+cpio просто привычнее - и переносимее - кто-нибудь видел pax напр. под Linux? - про другие unix-like системы уже молчу).
Вот и весь процесс. Выключаемся, ставим новый диск на место старого - и грузим систему.

вторник, 9 сентября 2008 г.

Пересборка мира в FreeBSD 7.0


0. Задача
Обновление свежеустановленной FreeBSD 7.0 до STABLE, а дерева портов - до CURRENT. В качестве методического руководства использовался FreeBSD Handbook. Написание этой заметки вызвано тем, что в Handbook нужная информация "размазана" по большому количеству страниц (на каждой из которых страшно много букв - да еще и нерусских :), а тут я попробовал собрать все в кучу - и описать процедуру как неветвящуюся последовательность.

1. Установка FreeBSD
Ставим FreeBSD как обычно, только не забываем исходные тексты (src) и коллекцию портов (FreeBSD ports).

2. Получение свежей версии исходных текстов
Для синхронизации использовался csup (1) (рекомендуемый в handbook cvsup нужно ставить из /usr/ports/net/cvsup, а он хочет еще компилятор языка Modula 3 (кто когда последний раз на таком программировал? :) - а нам зачем все это надо?) Болванки для supfile лежат в /usr/share/examples/cvsup.
Чтобы их использовать, нужно изменить строку
*default host=CHANGE_THIS.FreeBSD.org
на какой-то реальный адрес. Я поставил cvsup4.ru.FreeBSD.org, но на всякий случай - вот здесь есть полный список зеркал. Нам интересны два файла stable-supfile и ports-supfile. Правим их - и поехали:
# csup stable-supfile
# csup ports-supfile


3. Пересборка пользовательского окружения
Если не хочется собирать много лишнего, можно создать файл /etc/make.conf (по умолчанию не существут) и добавить в него что-нибудь типа:
CPUTYPE=pentium4
WITHOUT_INET6=YES
WITHOUT_IPX=YES
WITHOUT_ZFS=YES
(представление о возможных опциях можно получить, изучая содержимое файлов /usr/share/examples/etc/make.conf и /usr/share/mk/bsd.own.mk)
Крайне не рекомендую писать WITHOUT_FORTH - если, конечно, вы не знаете точно, чего хотите от этой опции добиться - дело в том, что интерпретатор экзотического языка Forth входит в загрузчик FreeBSD. У меня собранная с этой опцией система насмерть зависала при начале загрузки ядра.

А теперь собственно пересборка:
# cd /usr/src
# make buildworld


4. Пересборка ядра
Обычно нужно что-то подправить в конфиге GENERIC (напр. закоментить options INET6 и device trm), так что создадим свой конфиг:
# cd /usr/src/sys/i386/conf
# cp GENERIC MYCFG

... правим его...
# cd ../../..
# make buildkernel KERNCONF=MYCFG

# make installkernel KERNCONF=MYCFG

на всякий случай перед обновлением системы забекапим файлы конфигурации. Например, так:
# mkdir -p ~/tmp/etc
# cd /etc
# find . -print | cpio -p -m ~/tmp/etc

5. Перезагрузка в однопользовательском режиме
Теперь перегружаемся - и в меню загрузки FreeBSD выбираем Single user mode (Клавиша 4). Когда видим приглашение для /bin/sh нажать RETURN, жмем этот самый RETURN - и начинается самое увлекательное:
# fsck -p
# mount -u /
# mount -a -t ufs

# swapon -a

(эти операции не относятся к пересборке - просто Single user mode ничего лишнего не запускал - вот мы ручками и поднимаем более-менее работоспособное окружение - примонтируем на чтение-запись файловые системы и подключаем раздел подкачки).
А теперь - пора за дело:
# cd /usr/src
# mergemaster -p
# make installworld

# mergemaster -U
опции последней команды задают автоматическое обновление всех файлов в /etc , которые не изменялись пользователем.
И - на перезагрузку. Теперь уже - обычную.

6. Пейзаж после битвы
Перезагрузились? Любуемся на новый вывод команды
$ uname -a
И - если все остались живы - самое время убрать после себя мусор:
# cd /usr/src
# make delete-old
(перед тем, как дать эту команду можно посмотреть
$ make check-old
увидим список того, что предполагается удалить. А то вдруг там что-то ценное? :)
# rm -rf /usr/obj