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

понедельник, 14 октября 2013 г.

Как автоматически переключать каналы на сервере?

На сервере FreeBSD (Linux) нужно настроить автоматическое переключение каналов в случае падения основного канала на резервный. Думал-думал. Можно изящно сделать было на базе quagga (bgpd) и двух бгп-сессий. Но, в моем случае надо такое решение тщательно потестировать, а я не мог - в локалке сервера круглосуточно работают пользователи. И в моем случае один из каналов работает на mpd5 - туннель pptp. А второй ethernet.

Придумал простой способ: пускать регулярно один пинг с соурс-адресом каждого из обоих интерфейсов наружу, например на гугл-днс и по результату прохождения пинга принимать решение работает канал или нет. Чтобы схема работала нужно чтобы был на сервере настроен соурс-роутинг, то есть в зависимости от соурс-адреса пакет уходит на соответствующий шлюз (то есть в соответствующий маршрут).

Скрипт пускает пинг с разными соурс-адресами на днс-сервера гугла, и, если результат команді пинг успешный, то переменной задается значение 1. А потом проверяются занчения переменных, и по результатам проверок меняются маршруты. Естественно на обоих каналах организован НАТ.

Скрипт, который я написал для этого вот:

#!/bin/sh

rcpt="admin@example.com"

## PPTP link
ip1="87.k.m.p"
gw1="x.x.x.x"

## ETHERNET link
ip2="91.x.y.z"
gw2="91.x.y.n"

## default:
gw_default="$gw1"

## check what current default gw
current_dgw=`netstat -rn|grep ^default|awk '{print $2}'`;

gw1_good=0
gw2_good=0

## assign new value if ping ok:
ping -S $ip1 -c1 -i5 8.8.8.8 > /dev/null 2>&1 && gw1_good=1
ping -S $ip2 -c1 -i5 8.8.8.8 > /dev/null 2>&1 && gw2_good=1

if [ $gw1_good = 1 ] && [ $gw2_good = 1 ]; then
        if [ $current_dgw != $gw_default ]; then
                echo "Ping probe to both gateways OK. \
                Changed default route to default $gw_default."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        fi
        route change default $gw_default >/dev/null 2>&1
        exit;
fi

if [ $gw1_good = 0 ] && [ $gw2_good = 1 ]; then
        route change default $gw2 >/dev/null 2>&1
        echo "Ping probe via $gw1 failed. \
                Changed default route to $gw2."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        exit
fi

if [ $gw1_good = 1 ] && [ $gw2_good = 0 ]; then
        route change default $gw1 >/dev/null 2>&1
        echo "Ping probe via $gw2 failed. \
                Changed default route to $gw1."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        exit
fi

пятница, 27 сентября 2013 г.

FreeBSD: обновление устаревшего порта mysql

Порой надо на сервере обновить mysql. В портах FreeBSD уже удалили версию 5.0. Поэтому на тех серверах, где она еще стоит хорошо бы выполнить обновление.
Очень просто и быстро обновить mysql можно так:

portsnap fetch update
portupgrade -o databases/mysql55-client -f mysql-client-5.0.92
portupgrade -o databases/mysql55-server -f mysql-server-5.0.92
/usr/local/etc/rc.d/mysql-server restart
mysqlcheck -u root -p -A -c
mysqlcheck -u root -p -A -r
mysqlcheck -u root -p -A -a

четверг, 26 сентября 2013 г.

ZFS: root on zfs FreeBSD 9.1 или 9.2 и старше


Порой надо установить систему FreeBSD так, чтобы был зеркальный zfs-mirror, да и сделать надо это удаленно. Мне часто помогает такая схема - звонок человеку, который рядом с новым сервером с заданием: установка трех дисков на сервер и подготовка загрузочного DVD-диска. Далее, удаленный человек устанавливает по дефолту систему и заводит пользователя с gid=0, чтобы можно было удаленно получить права root, а также запускает автоматически sshd для удаленного доступа.


Далее дело техники. Остается только удаленно зайти на свежеустановленный сервер и дать следующие команды для двух оставшихся после установки дисков (ada1, ada2) чтобы создать root on zfs mirror (ada1+ada2):

gpart create -s gpt ada1
gpart add -a4k -b 34 -s 94 -t freebsd-boot ada1
gpart add -a4k -t freebsd-zfs -l disk0 ada1
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

и тоже самое для ada2.

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

zpool create -o altroot=/mnt -o 
cachefile=/var/tmp/zpool.cache zroot mirror /dev/gpt/disk*

zpool set bootfs=zroot zroot
zfs set checksum=fletcher4 zroot

zfs create zroot/var
zfs create zroot/usr
zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/db
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
zfs create -o exec=off -o setuid=off zroot/var/empty
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
zfs create -o exec=off -o setuid=off zroot/var/run
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp


Создаю своп:

zfs create -V 4G zroot/swap
zfs set org.freebsd:swap=on zroot/swap
zfs set checksum=off zroot/swap


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

sh
mkdir /tmp/cdrom
mount_cd9660 /dev/cd0 /tmp/cdrom
cd /tmp/cdrom/usr/freebsd-dist
export DESTDIR=/mnt/zroot
for file in base.txz lib32.txz kernel.txz doc.txz ;\
 do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); \
 done


Затем надо прописать в новом /etc/rc.conf следующие настройки (подправьте свои названия интерфейсов):

hostname="srv-zfs"
background_fsck="NO"
zfs_enable="YES"
ifconfig_re0="inet 192.168.0.198/24"
defaultrouter="192.168.0.254"
sshd_enable="YES"

А в новом /mnt/zroot/boot/loader.conf хорошо бы задать открытый файервол и опции загрузки системы:

zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"
alias_ftp_load="YES"
alias_pptp_load="YES"
autoboot_delay="2"
net.inet.ip.fw.default_to_accept=1
net.inet.ip.fw.verbose=1
ipfw_load="YES"
ipfw_nat_load="YES"

На новом сервере нужно создать пользователя, часовой пояс и, возможно еще какие-то дополнительные настройки:

chroot /mnt/zroot/
pw useradd user -g 0 -m
passwd user
tzsetup

Затем надо создать файл /etc/fstab, выйти из режима chroot, скопировать кэш zfs-пула и задать правильные точки монтирования:

touch /etc/fstab
exit
cp /var/tmp/zpool.cache /mnt/zroot/boot/zfs/zpool.cache
zfs set mountpoint=legacy zroot
zfs set mountpoint=/tmp zroot/tmp
zfs set mountpoint=/usr zroot/usr
zfs set mountpoint=/var zroot/var

Перегрузить сервер и пользоваться!
Данная процедура работает нормально на установках системы 9.1 и 9.2.

вторник, 27 августа 2013 г.

Создание виртуального 802.1q интерфейса во FreeBSD 9

Для чтобы создать виртуальный интерфейс во FreeBSD 9 с тегированным виланом (vlan 802.1q) и переименовать его в собственное имя нужно в /etc/rc.conf прописать следующие строки:

vlans_em1="lan0"
create_args_lan0="vlan 100"
ifconfig_em1="up"
ifconfig_lan0="inet 192.168.34.1/24"
ifconfig_lan0_alias0="inet 192.168.209.1/24"

в результате будет создан при загрузке сервера интерфейс с такими настройками:

# ifconfig lan0
lan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=3<RXCSUM,TXCSUM>
        ether 00:0c:29:19:81:c2
        inet 192.168.34.1 netmask 0xffffff00 broadcast 192.168.34.255
        inet6 fe80::20c:29ff:fe19:81c2%lan0 prefixlen 64 scopeid 0x6
        inet 192.168.209.1 netmask 0xffffff00 broadcast 192.168.209.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        vlan: 100 parent interface: em1

пятница, 6 апреля 2012 г.

Как задать мак-адрес на интерфейсе во FreeBSD?

Появилась потребность поднять сетевой интерфейс с подмененным МАК-адресом. Ну изменить МАК-адрес на сетевушке. В добавок я стараюсь на машинках-роутерах с FreeBSD переименовывать интерфейс в что-то типа wan0, lan0 и тд. Да и адрес еще надо назначить. Чтобы это все в автозагрузке работало, надо указать в /etc/rc.conf:

ifconfig_re0="ether 00:11:6b:41:ba:00 -rxcsum -txcsum -wol_magic -wol_ucast -wol_mcast descr WAN"
ifconfig_re0_alias0="inet 62.x.y.z/28 name wan0"
ifconfig_wan0="up"

Таким образом у меня получился интерфейс wan0 с собственным описанием, измененным МАК-адресом (mac address change) и все это при старте сервера. Очень важно поднять интерфейс (up) после того, как изменится МАК-адрес и назначится IP-адрес.

четверг, 15 сентября 2011 г.

Создание шифрованного пула zfs в FreeBSD

Для шифрования в ядре FreeBSD есть GELI.
Достаточно быстрая и надежная штука.
Мне надо создать сервер, на котором будут хранится данные, доступ к которым не смогут получить нежелательные люди.

[root@new /]# geli init /dev/gpt/0disk2t
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_0disk2t.eli and
can be restored with the following command:

        # geli restore /var/backups/gpt_0disk2t.eli /dev/gpt/0disk2t

[root@new /]# geli init /dev/gpt/1disk2t
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_1disk2t.eli and
can be restored with the following command:

        # geli restore /var/backups/gpt_1disk2t.eli /dev/gpt/1disk2t

[root@new /]#

Далее надо подключить шифрованные диски в систему для создания пула:
[root@new /]# geli attach /dev/gpt/0disk2t
Enter passphrase:
[root@new /]# geli attach /dev/gpt/1disk2t
Enter passphrase:
[root@new /]#

Затем создать пул:
[root@new /]# zpool create data1 raidz /dev/gpt/0disk2t.eli /dev/gpt/1disk2t.eli

Сразу же решил проверить скорость записи, которая была на нешифрованном пуле в районе 32-34МБ в секунду, а скорость чтения была на уровне 86-95МБ в секунду.
Результаты такие:

[root@new /data1]# dd if=/dev/random of=5G bs=1024 count=5123600
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 255.912170 secs (20501434 bytes/sec)
[root@new /data1]# dd if=5G of=/dev/null bs=1024
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 147.344312 secs (35607526 bytes/sec)
[root@new /data1]#
Скорость стала заметно ниже и на чтении и на записи. Эх... что не сделаешь ради безопасности данных. :)

Запуск системы с zfs пулом из шифрованных дисков.
Я сомневался, что данные будут доступны в пуле raidz, если один из двух дисков будет недоступен. Поэтому до установки в бой решил провести тест.


Создал в пуле файл, сохранил его md5 сумму.
Перегрузил сервер с пулом data1 (см. выше).
После старта запустил команды:
[root@new ~]# geli attach /dev/gpt/0disk2t
[root@new ~]# zfs mount data1
и посмотрел на содержимое пула.
Файл с правильной суммой был на месте! Ура!
Однако zpool status ругался:
[root@new ~]# zpool status
  pool: data1
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scan: none requested
config:

        NAME                 STATE     READ WRITE CKSUM
        data1                DEGRADED     0     0     0
          raidz1-0           DEGRADED     0     0     0
            gpt/0disk2t.eli  ONLINE       0     0     0
            gpt/1disk2t.eli  UNAVAIL      0     0     0  cannot open

errors: No known data errors


Я ввел правильно пароль и подключил шифрованный диск 1disk2t.eli.
Дал команду:
[root@new ~]# zpool online  data1 gpt/1disk2t.eli
И пул у меня стал снова ONLINE!

Ура!
Можно не боятся потери бойцадиска даже с raidz!
Попробую сервер в тестовый бой поставить и посмотреть результаты.

Замерял скорость записи и чтения в zfs/mfs

Привет!
Довелось мне собрать сервер FreeBSD 8.2-STABLE за сентябрь 2011 года для одной организации. Было свободное время для теста.
Решил провести измерения скорости чтения и записи с дисков в разных вариантах создания пула zfs.

Диски, которые я использовал:
ad5: 1907729MB <Seagate ST32000641AS CC13> at ata2-slave UDMA100 SATA
ad7: 1907729MB <Seagate ST32000641AS CC13> at ata3-slave UDMA100 SATA

Материнка на этом сервере старая, поэтому и не включено и не используется ahci и поэтому диски adX, а не adaX.

Процессор и память на сервере:
Intel(R) Core(TM)2 Duo CPU     E4600  @ 2.40GHz (2402.36-MHz K8-class CPU)
real memory  = 4294967296 (4096 MB)
avail memory = 4093345792 (3903 MB)

Сперва я создал два диска в системе для простого пула zfs со всем доступным объемом и создаю пул:
[root@new /]# gpart create -s gpt ad5
ad5 created
[root@new /]# gpart create -s gpt ad7
ad7 created
[root@new /]# gpart add -t freebsd-zfs -l 0disk2t ad5

ad5p1 added

[root@new /]# gpart add -t freebsd-zfs -l 1disk2t ad7

ad7p1 added

[root@new /]# zpool create data1 /dev/gpt/0disk2t /dev/gpt/1disk2t
[root@new /]# zpool status data1
  pool: data1
 state: ONLINE
 scan: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        data1          ONLINE       0     0     0
          gpt/0disk2t  ONLINE       0     0     0
          gpt/1disk2t  ONLINE       0     0     0

errors: No known data errors
[root@new /]#

Далее в пул данных я решил записать и прочитать 5Гб данных из /dev/random (для полноты теста) одинаковыми блоками по 1024 байт:
[root@new /data1]# dd if=/dev/random of=5G bs=1024 count=5123600
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 153.215957 secs (34242950 bytes/sec)
[root@new /data1]# dd if=/dev/random of=5G bs=1024 count=5123600
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 154.269003 secs (34009207 bytes/sec)
[root@new /data1]# dd if=5G of=/dev/null bs=1024
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 55.372681 secs (94750088 bytes/sec)
[root@new /data1]# dd if=5G of=/dev/null bs=1024
5123600+0 records in
5123600+0 records out
5246566400 bytes transferred in 51.155295 secs (102561551 bytes/sec)
[root@new /data1]#
Таким образом средняя скорость записи получилась 34126078.5 байт в секунду, а чтения 98655819.5 байт в секунду.

Далее я создал пул mirror с этих же дисков и провел точно такие же эксперименты. Средняя скорость за два запуска dd вышла для записи 33746148.5 байт в секунду, а для чтения 75503666.0 байт в секунду.

Я попробовал пул из одного диска, средние скорости записи и чтения вышли 33665851.5 и 97765927.0 байт в секунду.


Потом сделал пул с одним из дисков, а второй диск отдал под log. Опять провел два запуска для записи и для чтения. Средняя скорость в этот раз вышла для записи 34071757.5 байт в секунду, а для чтения
 96930171.0 байт в секунду.

Еще сделал пул с одним диском, а второй отдал под cache. Средняя скорость записи 33854437.5, а чтения - 49479337.0 байт в секунду.

Создал пул raidz из двух дисков. Средние скорости записи и чтения вышли: 33169249.0 и 84283989.0 байт в секунду.

Создал пул raidz с кэшем в RAM:
[root@new /]# mdconfig -a -t malloc -s 128M
md0
[root@new /]# zpool create data1  raidz /dev/gpt/0disk2t /dev/gpt/1disk2t cache /dev/md0

Cредняя скорость записи вышла 32541843.5 байт в секунду, а чтения 84148245.5 байт в секунду.

Попробовал еще 128М из памяти добавить для log. Итого, пул получился raidz с cache и log по 128М. Средняя скорость записи вышла 32503220.0, а чтения - 84458088.0 байт в секунду.

Попробовал создать пул raidz с кешем 1024М. Существенного отличия в скоростях не получил.

Примонтировал /dev/md0 в /mnt. Попробовал там на размере в 900М те же тесты. И получил среднюю скорость записи 50817911.0, а чтения - 531232665.5 байт в секунду. Вау! :)

Выводы, которые я сделал.
Скорость записи на диски SATA в режиме UDMA100 не будет выше 32-34МБ в секунду. Хоть тресни! А вот скорость чтения в режиме работы mirror оказалась не такой высокой, как ожидалось. Скорость чтения в обычном пуле из двух дисков вышла самая высокая. Но мне для работы нужен надежный пул, который бы смог пережить потерю бойца диска. Поэтому остается mirror или raidz. Я выбрал второй вариант - raidz. Тем, кому нужен пул без всякой надежности на случай выхода из строя диска(-ов), то лучше всего использовать простой пул из дисков, он дает полный объем всех дисков и высокую скорость. Тем, кто создает надежный пул лучше использовать raidz и несколько дисков. Для быстрых файловых систем остается только использовать memory disk из RAM, минус которой пока только один - не сохраняется ничего после перезагрузки.