Home FreeBSD FreeBSD File System and SMB
FreeBSD File System and SMB

NFS - сетевая файловая система

E-mail Печать PDF

NFS - сетевая файловая система

Автор: lissyara.
Оригинал: http://www.lissyara.su/articles/freebsd/file_system/mount_nfs/

Количество серверов выросло - начал задумываться об автоматизации отдельных телодвижений и о дублировании. Конкретно - обновление портов и прочее. Четыре сервера стоят в локалке, на всех 4-х хранится дерево портов и куча дистрибутивов. После обновления на всех 4-х самбы, кламава и ещё чего-то немелкого задумался - всё это обошлось в сотню мегабайт траффика, а можно было сделать вчетверо меньше - если руками всё перетаскивать с одного на другой. Но - руками не хотелось :))) Подумавши, вспомнил про NFS - ибо сеть локальная - т.е. трафик бесплатен, скорость сто мегабит - местами вообще гигабит. Сойдёт. Решил привернуть на совсем локальную машину - один из серверов занимается архивацией, работает полсуток, и то по ночам. LAN на нём гигабитный (правда на остальных сотка - но это уже мелочи :)) - вообще прекрасно. Тема в хандбуке оказалась хорошо окучена, так что делаем всё по хандбуку. (Кстати, там как вариант применения NFS - расшаривание директории /usr/ports/distfiles, хотя я слышал про использование её на WWW-серверах, когда собран кластер - для расшаривания директории с контентом, но сам такого не пробовал, потому не утверждаю)
На сервере (на котором и будем расшаривать директорию с деревом портов) в /etc/rc.conf заносим такие строки:# NFS
# удалённый вызов процедур - необходим для фунциклирования NFS
rpcbind_enable="YES"
# запуск nfsd
nfs_server_enable="YES"
# флаги для nfsd:
# "-u" - используем тока протокол UDP - причина - это не инет, потери пакетов
# весьма малы, а по ресурсоёмкости UDP выгодней. TCP - весьма `дорогой`
# протокол, требует больше ресурсов
# "-t" - использовать протокол TCP (можно использовать и TCP и UDP одновременно
# - выбор, в конечном итоге, за клиентом)
# "-n 5" - максимальное число одновременно подключенных клиентов
# "-h 192.168.20.251" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех. Может быть указана неоднократно. У меня на этой машине
# всего один интерфейс (не считая lo0 :)) потому её наличие бессмысленно.
nfs_server_flags="-u -n 5"
# демон монтированя - принимает подключения от клиентов. Запускается
# автоматически при опции nfs_server_enable="YES". Ключи:
# "-r" - для обслуживания файлов а не тока каталогов (если я правильно понимаю
# значение - то можно расшарить файл, а не каталог. Может для кого-то и имеет
# смысл...)
# "-l" - регистрация всх запросов на монтирование
# "-n" - для возможности монтированя из-под винды (вернее, никсовую
# шару на форточки)
mountd_flags="-r"


После чего я собрался было править файл /etc/exports - но его не оказалось. Кстати, если его не существует, то nfsd и mountd не запускаются. Ну да ладно, сделал сам - из двух строк:# То, что расшариваем по NFS
/usr/ports -maproot=root -network 192.168 -mask 255.255.0.0


В данном случае я расшарил каталог /usr/ports для всей частной сети (192.168.0.0/16 - или 192.168.0.0/255.255.0.0 - ибо локалочка-то немаленькая), и дал в нём права root`a для всех root`ов с удалённых машин. Причём можно было это сделать для любого удалённого пользователя - хоть для nobody :)
После чего перезагружаем сервер, и после перезагрузки (в принципе, можно всё находу запустить руками - но в данном случае это некритичная машина и я предпочёл перезагрузиться. Если хотите находу - идите повышеприведённой ссылочке на хандбук) смотрим:/usr/home/lissyara/>ps -axj | grep nfsd
root 382 1 382 382 0 Is ?? 0:00,01 nfsd: master (nfsd)
root 384 382 382 382 0 I ?? 0:00,00 nfsd: server (nfsd)
lissyara 8450 628 8449 628 2 R+ p0 0:00,00 grep nfsd
/usr/home/lissyara/>
/usr/home/lissyara/>ps -axj | grep mountd
root 380 1 380 380 0 Is ?? 0:00,00 /usr/sbin/mountd -r
lissyara 8762 628 8761 628 2 R+ p0 0:00,00 grep mountd
/usr/home/lissyara/>


Ну а затем, на клиентских машинах прописываем такие строки в /etc/rc.conf:# Эта опция в-общем-то и не нужна, всё прекрасно монтируется и без неё,
# но с ней подрубается демон nfsiod, позволяющий проводить чтение-запись
# асинхронно, не дожидаясь окончания предыдущей операции.
nfs_client_enable="YES"
# скока демонов запускать (по одному на примонтированный ресурс)
nfs_client_flags="-n 1"


И пробуем подмонтровать (в хандбуке советуют на клиентах выполнить команду nfsiod -n 4, но у меня и без неё заработало, но, вероятно, оно работало несколько медленней :)))):/usr/home/lissyara/>mount_nfs 192.168.20.251:/usr/ports /usr/ports
/usr/home/lissyara/>df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 126M 43M 72M 37% /
/dev/ad0s1h 85G 65G 14G 83% /smb
/dev/ad0s1e 756M 15M 681M 2% /tmp
/dev/ad0s1g 16G 4.8G 9.7G 33% /usr
/dev/ad0s1f 7.9G 2.1G 5.1G 29% /var
procfs 4.0K 4.0K 0B 100% /proc
192.168.20.251:/usr/ports 24G 12G 9.9G 56% /usr/ports
/usr/home/lissyara/>


Всё работает. Строку эту я поместил в такой скрипт:/usr/local/etc/rc.d/>cat /usr/local/etc/rc.d/mount_nfs.sh
#!/bin/sh

# Скрипт монтирования портов по NFS
case "$1" in
start)
/sbin/mount_nfs -i 192.168.20.251:/usr/ports /usr/ports
echo "/usr/ports mounted"
;;
stop)
/sbin/umount /usr/ports
;;
*)
echo ""
echo "Usage: `basename $0` { start | stop }"
echo ""
exit 64
;;
esac
/usr/local/etc/rc.d/>


В принципе (и наверно даже более правильно) можно добавить в /etc/fstab такую строчку:192.168.20.251:/usr/ports /usr/ports nfs rw,-b,-i 0 0


Опция -b нужна для того, чтобы в случае, если не удастся примонтировать ФС сразу, продолжать попытки сделать, а не ждать. Иначе комп может вообще не загрузиться, так и остановившись на этом моменте (у NFS неприлично большой таймаут), а -i нужна чтобы при пропадании удалённого компа из сети не зависнуть по команде ls, например, выполненной на сетевой файловой системе. При её наличии можно будет первать команду с помощью Ctrl+C, иначе - никак :))
Ну, вот и всё. Конечно, по сети оно работает несколько медленней, чем с локальной машиной. Также есть и недостатки - если один клиент что-то собирает то другому лучше это же не делать :) Ничем хорошим не кончится :)))
P.S. Не забудте удалить содержимое /usr/ports на локальной машине - иначе место не освободится. Хотя - я, например, удалил тока distfiles - остальное оставил. На всякий случай. :)))
P.S.2 - бывают проблемы с блокировкой, при сборке чего-либо из портов, тогда надо монтировать с ключиком -L, и всё будет нормально. Как вариант - перенос рабочей директории в локальную ФС (WRKDIRPREFIX=/tmp/port_wrk в файл make.conf)

Обновлено 28.05.2010 13:39
 

Удалённая миграция с UFS на ZFS

E-mail Печать PDF

Удалённая миграция с UFS на ZFS

Автор: lissyara.
Оригинал: http://www.lissyara.su/articles/freebsd/file_system/remote_migration_from_ufs_to_zfs/

Итак, решил что пора мигрировать на ZFS - много всего хорошего рассказывают, да и в рассылке народ активировался - уже с raidZ можно грузиться, плюс в ожидаемом релизе 8-ки оно будет "реди фор продакшен". Значит - пора ставить на свой любимый тестовый тазик =)
Ожидаемые проблемы - тазик капризный до памяти - да и мало на нём её - всего 128Mb. Для ZFS рекомендовано минимум 512. Поэтому, проблемы обязательно будут =). До кучи, хочеться всё сделать через ssh - т.е. без однопользовательского режима, всяких IP-КВМ и т.п.
Итак, обновляемся до 8-ки (у меня там 7.2 стояла пустая), получаем следующее:2xPIII-500MHz$ uname -a
FreeBSD 2xPIII-500MHz 8.0-PRERELEASE FreeBSD 8.0-PRERELEASE #0:
Thu Nov 12 18:25:58 UTC 2009
root@2xPIII-500MHz:/usr/obj/usr/src/sys/GENERIC i386
2xPIII-500MHz$


Система стоит на небольшом сказёвом диске, на отдельном контроллере. Переносить буду с использованием дополнительного диска:2xPIII-500MHz$ dmesg | grep -E "amrd[0-9]|ad[0-9]"
ad0: 176700MB <IC35L180AVV207 1 V26OA63A> at ata0-master UDMA33
amrd0: <LSILogic MegaRAID logical drive> on amr0
amrd0: 8700MB (17817600 sectors) RAID 0 (optimal)
Trying to mount root from ufs:/dev/amrd0s1a
2xPIII-500MHz$


Разбит одним шматком, смонтирован асинхронно (да, я извращенец =) Но - машинка тестовая - чё хочу то и делаю):2xPIII-500MHz$ df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/amrd0s1a 7.7G 3.5G 3.7G 48% /
devfs 1.0K 1.0K 0B 100% /dev
2xPIII-500MHz$
2xPIII-500MHz$ mount
/dev/amrd0s1a on / (ufs, asynchronous, local)
devfs on /dev (devfs, local, multilabel)
2xPIII-500MHz$


Загрузчик (loader), в 8-ке, по-умолчанию собран без поддержки загрузки с ZFS. Вернее, даже не так. Для ZFS используется отдельный загрузчик, и изначально его нет. Поэтому, вносим такую строку в make.conf:2xPIII-500MHz$ grep -i zfs /etc/make.conf
# for zfs boot
LOADER_ZFS_SUPPORT=yes
2xPIII-500MHz$


и пересобираем всё что касается загрузки системы:2xPIII-500MHz$ cd /usr/src/sys/boot && make obj depend all install


Прописываем загрузку модуля ZFS:2xPIII-500MHz$ grep zfs /boot/loader.conf
zfs_load="YES"
2xPIII-500MHz$


и монтирование файловых систем при загрузке:2xPIII-500MHz$ grep zfs /etc/rc.conf
zfs_enable="YES"
2xPIII-500MHz$


Создаём пул (о том что такое пул, и с чем его едят можно почитать в доке по утилите zpool, ну а вкратце - это набор девайсов, предоставляющих физическое хранилищще для ZFS):2xPIII-500MHz$ zpool create rootFS /dev/ad0


Смотрим, чё получилось:2xPIII-500MHz$ zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
rootFS 172G 73,5K 172G 0% ONLINE -
2xPIII-500MHz$
2xPIII-500MHz$ zpool status
pool: rootFS
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
ad0 ONLINE 0 0 0

errors: No known data errors
2xPIII-500MHz$


Экспортируем пул - чтобы ZFS, при дальнейших наших действиях, точно не трогала диск на котором он живёт:2xPIII-500MHz$ zpool export rootFS
2xPIII-500MHz$ zpool list
no pools available


Записываем загрузчики - для первой и второй стадии загрузки:2xPIII-500MHz$ dd if=/boot/zfsboot of=/dev/ad0 bs=512 count=1
1+0 records in
1+0 records out
512 bytes transferred in 0.000513 secs (997901 bytes/sec)
2xPIII-500MHz$
2xPIII-500MHz$
2xPIII-500MHz$ dd if=/boot/zfsboot of=/dev/ad0 bs=512 skip=1 seek=1024
64+0 records in
64+0 records out
32768 bytes transferred in 0.020961 secs (1563299 bytes/sec)
2xPIII-500MHz$


Цепляем пул обратно:2xPIII-500MHz$ zpool import rootFS
2xPIII-500MHz$ zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
rootFS 172G 73,5K 172G 0% ONLINE -
2xPIII-500MHz$


В установках пула, выставляем отсутствие точки монтирования (корень ("/"), выставить сразу не можем - потому как пустой пул тут же будет примонтирован в качестве корневой системы, и повествование свернёт в другую сторону - на рассказ по теме "чё же делать если всё пошло не так")):2xPIII-500MHz$ zfs set mountpoint=none rootFS
2xPIII-500MHz$ zfs get mountpoint rootFS
NAME PROPERTY VALUE SOURCE
rootFS mountpoint none local
2xPIII-500MHz$


Монтируем файловую систему куда вам удобно - мне - в /mnt:2xPIII-500MHz$ mount rootFS /mnt/
mount: rootFS : No such file or directory
2xPIII-500MHz$ mount -t zfs rootFS /mnt/


Смотрим:2xPIII-500MHz$ df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/amrd0s1a 7.7G 3.5G 3.7G 48% /
devfs 1.0K 1.0K 0B 100% /dev
rootFS 169G 0B 169G 0% /mnt
2xPIII-500MHz$ mount
/dev/amrd0s1a on / (ufs, asynchronous, local)
devfs on /dev (devfs, local, multilabel)
rootFS on /mnt (zfs, local)
2xPIII-500MHz$


Переносим систему:2xPIII-500MHz$ dump -0Lf - / | (cd /mnt/; restore -rf -)


Вот тут начались грабли. Через несколько минут словил панику - ругалось что мало рамы ядру. Добавил рамы до 320Mb. После ребута, и монтирования раздела с ZFS сделал:2xPIII-500MHz$ rm -rf /mnt/*


Снова паника с теми же симптомами. Грустно... Обычной SDRAM у меня больше не было. Пришлось дёрнуть с ближайшего старенького сервера 2 планки SDRAM ECC по 2Gb - на этой машине они увиделись как 2x256. Снова запустил dump/restore - снова паника. Нашёл в заначке ещё одну на гиг - тоже увиделась как 256 - всего получилось 700 с чем-то мегов - процесс прошёл нормально.
Прописываем в loader.conf откуда монтировать корневой раздел:2xPIII-500MHz$ grep zfs /boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:rootFS"
2xPIII-500MHz$


Убираем из fstab, что на разделе с ZFS все записи:2xPIII-500MHz$ more /mnt/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
#/dev/amrd0s1b none swap sw 0 0
#/dev/amrd0s1a / ufs rw,async 1 1
#/dev/acd0 /cdrom cd9660 ro,noauto 0 0
2xPIII-500MHz$


Перезагружаемся, видим такую картинку:2xPIII-500MHz$ df -h
Filesystem Size Used Avail Capacity Mounted on
rootFS 169G 3.5G 166G 2% /
devfs 1.0K 1.0K 0B 100% /dev
2xPIII-500MHz$ mount
rootFS on / (zfs, local)
devfs on /dev (devfs, local, multilabel)
2xPIII-500MHz$


Итак, что имеем - загрузка ядра, всё ещё, произошла по старому - с первого SCSI диска, с UFS. А вот файловая система уже монтируется с другого - на котором ZFS. Дальше, стрёмный момент - убиваем всё содержимое первого диска - именно ради него, чуть раньше, я прописывал загрузчики на второй диск - если после убиения, но до конца переноса машина будет перезагружена - можно будет загрузиться со второго диска. Если же на него не прописать загрузчик - грузиться будет не с чего. Итак, убиваем всё на загрузочном диске:2xPIII-500MHz$ ll /dev/amrd0*
crw-r----- 1 root operator 0, 83 13 ноя 14:15 /dev/amrd0
crw-r----- 1 root operator 0, 83 13 ноя 14:15 amrd0s1
crw-r----- 1 root operator 0, 83 13 ноя 14:15 amrd0s1a
crw-r----- 1 root operator 0, 83 13 ноя 14:15 amrd0s1b
2xPIII-500MHz$
2xPIII-500MHz$ dd if=/dev/zero of=/dev/amrd0 bs=1m count=1
1+0 records in
1+0 records out
1048576 bytes transferred in 0.079149 secs (13248126 bytes/sec)
2xPIII-500MHz$


Проверяем, что все разделы пропали:2xPIII-500MHz$ ll /dev/amrd0*
crw-r----- 1 root operator 0, 83 13 ноя 14:15 /dev/amrd0
2xPIII-500MHz$


Прописываем загрузчики:2xPIII-500MHz$ dd if=/boot/zfsboot of=/dev/amrd0 bs=512 count=1
1+0 records in
1+0 records out
512 bytes transferred in 0.017034 secs (30058 bytes/sec)
2xPIII-500MHz$ dd if=/boot/zfsboot of=/dev/amrd0 bs=512 skip=1 seek=1024
64+0 records in
64+0 records out
32768 bytes transferred in 0.030083 secs (1089247 bytes/sec)
2xPIII-500MHz$


А теперь, финт ушами - говорим zpool, что надо поменять один диск на другой:2xPIII-500MHz$ zpool replace rootFS /dev/ad0 /dev/amrd0
cannot replace /dev/ad0 with /dev/amrd0: device is too small


Обломалося земноводное зелёного цвета... (&copy; "Красная Плесень", какой-то из рассказов про Гену и Чебурашку). Вначале надо до конца читать ман, а потом делать. Девайс нельзя заменить девайсом меньшего размера (непонятно лишь почему - данных там меньше чем размер самого маленького диска. Видимо, для замены используется зеркалирование, и отключение второго диска от зеркала), тока такого же или большего размера. Тут пришлось начать думать и плотно раскуривать доку (а с первого диска я уже всё снёс =))). Ключ "force" не помог:2xPIII-500MHz$ zpool replace -f rootFS /dev/ad0 /dev/amrd0
cannot replace /dev/ad0 with /dev/amrd0: device is too small
2xPIII-500MHz$


Ладно. Тогда попробуем реплицировать - в мане есть пример удалённого, должно и локально прокатить. Создаём новый пул, на SCSI диске:2xPIII-500MHz$ zpool create rootVG /dev/amrd0


(VG - виртуальная группа, такое именование в AIX принято. Куда удобней чем tank'и из доки по ZFS) Посмотрим, срослось ли:2xPIII-500MHz$ zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
rootFS 172G 3,50G 169G 2% ONLINE -
rootVG 8,44G 72K 8,44G 0% ONLINE -
2xPIII-500MHz$


Делаем снимок файловой системы:2xPIII-500MHz$ zfs snapshot rootFS@now
2xPIII-500MHz$ zfs get all | grep @now
rootFS@now type snapshot -
rootFS@now creation пт ноя 13 14:46 2009 -
rootFS@now used 538K -
rootFS@now referenced 3,50G -
rootFS@now compressratio 1.00x -
rootFS@now devices on default
rootFS@now exec on default
rootFS@now setuid on default
rootFS@now shareiscsi off default
rootFS@now xattr on default
rootFS@now version 3 -
rootFS@now utf8only off -
rootFS@now normalization none -
rootFS@now casesensitivity sensitive -
rootFS@now nbmand off default
rootFS@now primarycache all default
rootFS@now secondarycache all default
2xPIII-500MHz$


Передаём снимок с одной файловой системы на другую:2xPIII-500MHz$ zfs send rootFS@now | zfs receive rootVG
cannot receive new filesystem stream: destination 'rootVG' exists
must specify -F to overwrite it
warning: cannot send 'rootFS@now': Канал разрушен
2xPIII-500MHz$ zfs send rootFS@now | zfs receive -F rootVG
2xPIII-500MHz$


Процесс, заметим, весьма ресурсоёмкий. Но, происходит быстрей чем dump/restore - в разы (но сильно медленней чем зеркалирование через zfs - там вообще всё очень шустро). Посмотрим, что получилось:2xPIII-500MHz$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rootFS 3,50G 166G 3,50G none
rootVG 3,50G 4,81G 3,49G /rootVG
2xPIII-500MHz$


Цепляю в другую точку монтирования - для своего удобства, вначале выставляю отстуствие её для этого пула (заметим, в /rootVG оно автоматом примонтировалось, видимо, во время предыдущей операции, также, замечу, что убрать эту точку монтирования надо обязательно - иначе на загрузке вместо "/" пул смонтируется в "/rootVG" - это не совсем то, что нам надо =)):2xPIII-500MHz$ zfs set mountpoint=none rootVG
2xPIII-500MHz$


Раздел при этом, автоматически отмонтируется - если не было открытых файлов:2xPIII-500MHz$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rootFS 3,50G 166G 3,50G none
rootVG 3,50G 4,81G 3,49G none
2xPIII-500MHz$


Монтирую:2xPIII-500MHz$ mount -t zfs rootVG /mnt/
2xPIII-500MHz$ df -h
Filesystem Size Used Avail Capacity Mounted on
rootFS 169G 3.5G 166G 2% /
devfs 1.0K 1.0K 0B 100% /dev
rootVG 8.3G 3.5G 4.8G 42% /mnt
2xPIII-500MHz$


Подправляем loader.conf - это надо сделать в любом случае, неважно, были и проблемы с меньшим диском, как у меня, или у вас первый диск был больше/равен второму - ибо предыдущий раз этот файл трогали после зеркалирования, на диске который уже убили:2xPIII-500MHz$ grep zfs /mnt/boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:rootVG"
2xPIII-500MHz$


Товарисчи с большими/равными дисками должны прописать "rootFS" а не "rootVG". Теперь можно перезагрузиться, и посмотреть чё вышло:2xPIII-500MHz$ df -h
Filesystem Size Used Avail Capacity Mounted on
rootVG 8.3G 3.5G 4.8G 42% /
devfs 1.0K 1.0K 0B 100% /dev
2xPIII-500MHz$ mount
rootVG on / (zfs, local)
devfs on /dev (devfs, local, multilabel)
2xPIII-500MHz$ zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
rootFS 172G 3,50G 169G 2% ONLINE -
rootVG 8,44G 3,50G 4,94G 41% ONLINE -
2xPIII-500MHz$


Экспотрируем "rootFS" - чтоб не мешалось:2xPIII-500MHz$ zpool export rootFS
2xPIII-500MHz$ zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
rootVG 8,44G 3,50G 4,94G 41% ONLINE -


Создаём раздел в полгига размером - под свап. Тут тоже моё упущение - свап рекомендуют размещщать в начале диска, у меня он получился в середине. Надо было эти действия сделать сразу после создания пула, до переноса данных:2xPIII-500MHz$ zfs create -V 512Mb rootVG/swap
2xPIII-500MHz$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rootVG 4,00G 4,31G 3,49G none
rootVG/swap 512M 4,81G 16K -


Выставляем переменные для раздела - тип файловой системы, и отключаем подсчёт контрольных сумм:2xPIII-500MHz$ zfs set org.freebsd:swap=on rootVG/swap
2xPIII-500MHz$ zfs set checksum=off rootVG/swap
2xPIII-500MHz$


Дальше, я попытался этот свап подцепить:2xPIII-500MHz$ zfs mount -a
2xPIII-500MHz$ swapinfo
Device 1K-blocks Used Avail Capacity
2xPIII-500MHz$


Неподцепился. Логично - это не файловая система же. Тогда, пойдём обычным путём:2xPIII-500MHz$ swapon /dev/zvol/rootVG/swap
2xPIII-500MHz$ swapinfo
Device 1K-blocks Used Avail Capacity
/dev/zvol/rootVG/swap 524288 0 524288 0%
2xPIII-500MHz$


Дальше по желанию. Диск я буду отцеплять, поэтому на втором убиваю файловую систему:2xPIII-500MHz$ dd if=/dev/zero of=/dev/ad0 bs=1m count=1
1+0 records in
1+0 records out
1048576 bytes transferred in 0.091236 secs (11493023 bytes/sec)
2xPIII-500MHz$ zpool import rootFS
cannot import 'rootFS': no such pool available
2xPIII-500MHz$


Теперь потестим то, что получилось. Накатил MySQL, apache2, php5, раскатал архив своего форума. Словил жёсткий зависон на попытке получить страницу через fetch. Мда. Ладно. За прошедшие выходные нашёл ещё рамы - 512Mb ECC, которая увиделась как 128. До гига так и не дотянул - получилось 917Mb. Краш-тест, в виде параллельного скачивания форума в 200 потоков система пережила. LA был 160, свап заюзан на 10%.
Нарисовал в loader.conf такие переменные (получено приблизительной экстраполяцией, и дальнейшей подгонкой значений из стабильно работающей системы с 768Mb рамы), и уменьшил количество ОЗУ до 256Mb:vm.kmem_size="200M"
vm.kmem_size_max="180M"
vfs.zfs.arc_max="16M"
vfs.zfs.vdev.cache.size="5M"


не упало - тестил переносом всего с однойго пула на другой, через:cd / && pax -p eme -X -rw . /mnt


Правда, перед тем как вышел на эти значения оно у меня три раза падало. Значит направление мысли было верное. Оттестил ещё раз, запустив в параллель к pax скачиваться форум в 200 потоков, и индексировать базу самого форума. Полёт нормальный.


Выводы. Работоспособно. Даже на небольшом количестве рамы, и архитектуре x32 можно допилить чтоб работало стабильно. Под amd64 всё и само будет стабильно работать.
Тем не менее - рамы рекомендуется 1Gb и более и архитектуру amd64 - там работа с памятью грамотней организована.

Обновлено 28.05.2010 13:39
 

FreeBSD: Мониторинг RAID из командной строки (CLI)

E-mail Печать PDF

FreeBSD: Мониторинг RAID из командной строки (CLI)

Автор: mvalery.
Оригинал: http://www.lissyara.su/articles/freebsd/file_system/raid_monitoring/

0. Введение

Выложили деньги, поставили RAID. Теперь избыточность надежно защищает ваши данные. И успокоились. Зря. Рано или поздно выйдет из строя какой-то жесткий диск, но на поведении системы это никак не отразится. Просто избыточность исчезнет и как результат, отказ очередного HDD внезапно обвалит систему. Систему, которая возможно находится очень и очень далеко от вас. По этому, необходимо постоянно наблюдать за состоянием RAID, чтобы вовремя заметить вышедшие из строя накопители.

Задача статьи - помочь вам установить необходимую утилиту и убедиться, что утилита работоспособна и что ваш RAID так же работоспособен. Далее вы сможете по дополнительной документации найти какие-то необходимые вам команды.
Драйверы для всех упомянутых ниже типов RAID уже включены в систему. Ставим только соответствующие утилиты мониторинга.
Поразительно, что для такой важной компоненты сервера отсутствует стандартизованный интерфейс командной строки. Для каждого типа RAID приходится искать собственную программу мониторинга и если повезет найти, то ломать голову как они ставятся и как управляется. Данная статья отличная иллюстрация того, с каким "зверинцем" приходится иметь дело.

1. Как определить тип используемого RAID

Для нашего случая оказалось достаточно просмотреть директорию /dev.
Это связано с тем, что в системе FreeBSD одинаковые имена получают устройства, идентичные с точки зрения управляемости.
Чаще всего единое имя получает группа устройств построенная на базе общего набора чипов.

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

И так, далее мы поговорим о следующих типах RAID:
/dev/mirror/gm0 - программный RAID gmirror
/dev/twa0 или /dev/twe0 - RAID контроллер компании AMCC 3ware (напр. 9650SE)
/dev/hptrr - RAID контроллер компании HighPoint (напр. RocketRAID 2310)
/dev/mfi0 - либо Dell Perc 5/i (чип LSI MegaRAID SAS 8408E) либо Dell PERC 6/i (чип LSI SAS1078)

Существует несколько других способов, позволяющие определить характеристики вашего железа.

В частности вы можете:
(1) просмотреть файл /var/run/dmesg.boot:# less /var/run/dmesg.boot


(2) воспользоваться утилитой dmidecode : # dmidecode


(3) или утилитой pciconf:# pciconf -l -cv


Попробуйте. Узнаете много интересного.

2. Программный RAID gmirror (/dev/mirror/gm0)

Программный RAID не нуждается в установке специальной утилиты. Чтобы убедиться, что RAID исправен даем команду:# gmirror status


Этот тип RAID отлично документирован. В многочисленной литературе вы найдете дополнительные команды управления.

Программный RAID использует компоненты сервера как аппаратную часть, а компоненты операционной системы как программную часть. В связи с большим количеством компонент, вовлеченных в функционирование программного RAID, его наработка на отказ заметно ниже, чем у RAID выполненного в виде в виде специализированного контроллера. У меня были случаи, когда на нагруженных серверах программный RAID рассыпался через 2-3 месяца круглосуточной работы. Деньги, которые я сэкономил на покупке железного RAID, были потрачены на первой же поездке к провайдеру, где установлены сервера и на работах по восстановлению файловой системы.

3. AMCC 3ware (/dev/twa0 или /dev/twe0)

Ставим утилиту мониторинга из портов:# cd /usr/ports/sysutils/tw_cli/ && make install clean


Доступны следующие команды:

(1) Статус RAID и отдельных дисков массива узнаем так:# tw_cli /c0 show


(2) Общие сведения о контроллере RAID# tw_cli show


(3) Лог аварийных сообщений# tw_cli show alarms


(4) Лог диагностических сообщений.# tw_cli show diag


(5) Развернутая информация о типах контроллеров, поддерживаемых утилитой и сведения о некоторых дополнительных командах.# man tw_cli




4. HighPoint (/dev/hptrr)

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

(1) Создаем временную директорию# mkdir RocketRAID && cd RocketRAID


(2) Скачиваем архив# wget \
http://www.highpoint-tech.com/BIOS_Driver/HRM/FreeBSD/CLI-FreeBSD-3.2-081224.tar.gz


(3) Распаковываем# tar xf CLI-FreeBSD-3.2-081224.tar.gz && cd CLI-FreeBSD-3.2-081224


В текущую директорию распаковываются 4 файла:
hptsvr-3.13-4.tbz ; hptraidconf-3.2-1.tbz ; HPT_CLI_Guide.pdf ; README.txt

(4) Устанавливаем серверную часть (демона) # pkg_add hptsvr-3.13-4.tbz


(5) Устанавливаем клиентскую часть.# pkg_add hptraidconf-3.2-1.tbz


(6) Переносим на рабочую станцию файл HPT_CLI_Guide.pdf. Документ содержит подробный перечень команд, в котором на первых порах тяжеловато разобраться.

После установки, демон запускается автоматически. Далее его можно останавливать и снова запускать как всякий обычный демон командами:# /usr/local/etc/rc.d/hptdaemon.sh stop
# /usr/local/etc/rc.d/hptdaemon.sh start


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

Командная строка для всех команд будет начинаться одинаково:# hptraidconf -u RAID -p hpt <команда>


здесь ключи "-u RAID -p hpt" это username и password соответственно. Вы не можете их менять.

(7) А теперь подробнее поговорим о командах:

(7.1) Получить список RAID - контроллеров :# hptraidconf -u RAID -p hpt query controllers


Первая колонка - номера контроллера. Нумерация начинается с единицы.

(7.2) Получить статус всех RAID, построенных на этих контроллерах:# hptraidconf -u RAID -p hpt query arrays


Номер RAID совпадает с номером контроллера, однако некоторые RAID - составные. Например RAID10, состоящий из четырех дисков на первом контроллере, имеет номер 1, а входящие в него зеркала, каждый из двух дисков имеют номера 1-1 и 1-2 соответственно.

(7.3) Получить информацию о RAID по его номеру:# hptraidconf -u RAID -p hpt query arrays 1


(Получаем статус 1-го RAID)
Если же вас интересует дополнительная информация, о входящих в него RAID, тогда делаем так:# hptraidconf -u RAID -p hpt query arrays 1-2


(Получаем статус 2-го RAID, вложенного в 1-й RAID)

(7.4) Получить статус всех дисков:# hptraidconf -u RAID -p hpt query devices


Диски нумеруются через дробь в формате номер_контроллера/номер_диска. Например 1/3 - это 3-й диск на 1-м контроллере.
Соответственно, указав этот ID, вы можете получить еще более детальную информацию об этом диске:# hptraidconf -u RAID -p hpt query devices 1/3


(7.5) Контроллер ведет свой лог событий, который вам доступен по команде:# hptraidconf -u RAID -p hpt events


(7.6) Если вы заменили испорченный диск на новый, его необходимо инициировать:# hptraidconf -u RAID -p hpt init 1/3


(7.7) Добавить инициированный диск в RAID # hptraidconf -u RAID -p hpt rebuild 1 1/3


(добавить в 1-й RAID 3-й диск)

Далее читайте HPT_CLI_Guide.pdf. Документ довольно подробный и корректный.


5. Dell Perc 5/i (LSI MegaRAID SAS 8408E) и Dell PERC 6/i (LSI SAS1078) (/dev/mfi0)

Для этого типа RAID, в портах имеется утилита (ура!), но только под Linux (ну как же).

Примечание:
(1)Читатель weec утверждает, что по его сведениям ожидается коммит порта sysutils/megacli, который не будет требовать linux-окружения. На сегодняшний день такого порта еще нет.
(2) Читатель av советует воспользоваться фирменной утилитой от LSI:
Mega CLI FreeBSD (MegaRAID Release 3.6) ver 4.0.11. Качается с сайта lsi.com.)

Ничего не могу сказать по поводу замечаний наших коллег. Поэтому, продолжаю рассказывать о том что я опробовал и что точно работает.
Для начала, разбираемся - установлена ли у нас поддержка Linux.
Если модуль linux.ko загружен, поддержка уже присутствует. Проверяем.

(1) Даем команду:# kldstat | grep linux


Правильный ответ - что-то вроде:5 1 0xc6c88000 16000 linux.ko


(2) Если модуль linux.ko не подгружен, попытаемся его подгрузить:# kldload linux


а затем опять идем в п.1 и проверяем

(Вдумчивый читатель может возразить, что достаточно запросить информацию о наличии установленного пакета, который называется linux_base-fc:# pkg_version -v -s"linux_base-fc"


и будет почти прав. Если бы не одно НО: Эта команда ничего не покажет, если поддержка Linux была включена в процессе инсталляции системы.)

Выполнение п.3 и 4 длится довольно долго. Убедитесь, что у вас достаточно времени, чтобы дождаться завершения.

(3) Если поддержка Linux уже установлена, переходите к п.4. Иначе ставим поддержку Linux:# cd /usr/ports/emulators/linux_base-fc4/ && make install clean


(4) Затем собственно утилиту мониторинга:# cd /usr/ports/sysutils/linux-megacli2/ && make install clean




(5) Готовимся к первому запуску.

(5.1) Загружаем модуль совместимости с Linux:# kldload linux


(5.2) Выставляем системную переменную:# sysctl compat.linux.osrelease=2.6.12


(по умолчанию 2.4.2 )

(5.3) Монтируем соответствующие элементы файловой системы:# mount -t linprocfs linproc /compat/linux/proc
# mount -t linsysfs linsys /compat/linux/sys


(5.4) Запускаем утилиту, чтобы убедиться, что все сделели правильно:# megacli -AdpAllInfo -aALL


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

Тогда продолжаем.

(6) Вносим изменения в конфигурационные файлы.

(6.1) Файл /etc/rc.conf. Добавитьlinux_enable="YES"


(6.2) Файл /etc/sysctl.conf. Добавить# For MegaCLi
compat.linux.osrelease=2.6.12


(6.3) Файл /etc/fstab. Добавить# For MegaCLi
linproc /compat/linux/proc linprocfs rw 0 0
linsys /compat/linux/sys linsysfs rw 0 0




(7) А теперь перечень самых необходимых команд.

(7.1) Информация обо всех RAID контроллерах данного типа, присутствующих в системе:# megacli -AdpAllInfo -aALL


(7.2) Статус всех логических дисков, присутствующих в системе. Все они должны быть в состоянии "optimal":# megacli -LDInfo -LALL -aALL | grep "State"


(7.3) Статус всех физических жестких дисков для всех адаптеров. Все они должны быть в состоянии "Online":# megacli -PDList -aALL | grep "Firmware state"


(7.4) Получить внутренний лог всех адаптеров:# megacli -AdpEventLog -GetEvents -f events.log -aALL && cat events.log




(8) список важнейших команд (только на английском) вы можете найти здесь.
http://tools.rapidsoft.de/perc/perc-cheat-sheet.html


6. Общий скрипт для контроля за состоянием всех типов RAID.

Создайте скрипт типа того, что приведен ниже. Я свой назвал raid-status.sh и раскопировал по всем серверам. Теперь на любом из моих серверов, команда# ~/raid-status.sh


сообщает мне о состоянии моих RAID.
#!/bin/sh

# -- for gmirror
if [ -r /dev/mirror/gm0 ] ; then
echo gmirror
gmirror status

# -- for HighPoint RocketRAID 2310
elif [ -r /dev/hptrr ] ; then
echo "HighPoint RocketRAID 2310"
hptraidconf -u RAID -p hpt query arrays

# -- for AMCC 3ware 9650SE-4LP
elif [ -r /dev/twa0 ] ; then
echo "AMCC 3ware 9650SE"
tw_cli /c0 show

# -- For Dell PowerAge 1950 (Perc 5/i, Perc 6/i)
elif [ -r /dev/mfi0 ] ; then
echo "Dell PowerAge 1950 (Perc 5/i, Perc 6/i)"
echo RAID status:
megacli -LDInfo -LALL -aALL | grep "State"
echo DISKS status:
megacli -PDList -aALL | grep "Firmware state"
rm MegaSAS.log
else
echo "unnown RAID or doesn't present anyone"
fi




Примечание:
В процессе обсуждения на форуме всплыли описания утилит для еще двух типов RAID. Вы можете прочитать о них, если перейдете по ссылке, приведенной в нижней части статьи, после слов "Ссылка на обсуждение".
(1) /dev/amr - утилита для RAID типа Dell Perc и LSI MegaRAID. Предыдущие модели. Полный список можно получить в справке: # man 4 amr
(2) /dev/??? - утилита для RAID комании Areca(Tekram)

Обновлено 28.05.2010 13:40
 

Самба как контроллер домена без использования LDAP

E-mail Печать PDF

Самба как контроллер домена без использования LDAP

Автор: lissyara.
Оригинал: http://www.lissyara.su/articles/freebsd/programms/samba_as_pdc_without_ldap/


Это - обновление старой одноимённой статьи. Как и старая - эта полностью копи-пастная - всё работает "из коробки" =) Причина обновления - недоработки старой статьи, кривости в некоторых местах (дополнительные параметры пользователя не редактировались). Ну и столкнулся с практической реализаций решения - попросили сделать в одной конторе.
Задача - поднять домен с целью централизованного хранения учётных записей пользователей, выполнения каких-то скриптов при логине и т.п. Больше оно и не может - ибо уровень домена - NT4.

Система - FreeBSD 7.2-STABLE. Ставим самбу:server$ cd /usr/ports/net/samba3
server$ make install clean


В вылезшем окошке выбираем следующие опции:[X] WINBIND With WinBIND support
[X] ACL_SUPPORT With ACL support
[X] SYSLOG With Syslog support
[X] QUOTAS With Disk quota support
[X] UTMP With UTMP accounting support
[X] POPT With system-wide POPT library
[X] PCH With precompiled headers optimization


Рисуем конфиг /usr/local/etc/smb.conf:#
[global]
workgroup = SRO
netbios name = SERVER
server string = SAMBA Domain Controller For SRO


# Скрипт добавления пользователя
add user script = /usr/local/etc/samba/add_user_script.sh "%u"
# Скрипт удаления пользователя
delete user script = /usr/sbin/pw userdel "%u" -r
# Скрипт переименованя пользователя
# (следующие две строки - на самом деле одна. невлезает ..)
rename user script =
/usr/local/etc/samba/rename_user_script.sh "%uold" "%unew"
# Скрипт перезапуска самбы (Вообще, в man smb.conf, предлагается
# ребутить или класть всю машину. Перебор, по моему... Хотя -
# у меня это не работает. Такчто - пофиг.)
shutdown script = /usr/local/etc/samba/shutdown_script.sh
# Скрипт добавления новой группы
add group script = /usr/sbin/pw groupadd "%g"
# Скрипт удаления группы
delete group script = /usr/sbin/pw groupdel "%g"
# Скрипт добавления пользователя в группу
# (следующие две строки - это одна, в ширину сайта на вписывается)
add user to group script =
/usr/local/etc/samba/add_user_to_group_script.sh "%g" "%u"
# Скрипт установки первичной группы для пользователя
set primary group script = /usr/sbin/pw usermod "%u" -g "%g"
# Скрипт удаления пользователя из группы
# (следующие две строки - это одна, в ширину сайта на вписывается)
delete user from group script =
/usr/local/etc/samba/delete_user_from_group_script.sh "%g" "%u"
# Скрпит для добавления аккаунта компьютера
add machine script = /usr/local/etc/samba/add_machine_script.sh "%u"
# Скрипт проверки пароля (чтобы не пихали 12345 и прочее. Должен вернуть 0
# если пароль нормальный, и что-то другое - если нет. Пароль передаётся
# на стандартный ввод скрпита)
check password script = /path/to/password/check/script.sh
# Скрпит - чё елать при получении сообщений по winpopup (из man`a)
message command = /bin/mail -s 'message from %f on %m' root < %s; rm %s

# added by lissyara 2009-09-04 in 08:50
passdb backend = tdbsam:/usr/local/etc/samba/passdb.tdb
# added by lissyara 2009-09-04 in 09:36
display charset = koi8-r
unix charset = koi8-r
dos charset = koi8-r


# Где лежат скрпиты, выполняемые доменными компами при загрузке
#logon script = scripts\logon.bat
logon script = net_map.bat
domain logons = Yes
os level = 85
preferred master = Yes
domain master = Yes
idmap uid = 5000-9999
idmap gid = 5000-9999

# Кого не пускать
# в итоге она у меня раскомментирована, но настройку
# я делал с закомменченой.
# настоятельно рекомендую расккомментить, после настройки и введения
# самой машины в домен
#invalid users = root


#interfaces = 192.168.120.253/24
security = user
# Включаем поддержку WINS
wins support = yes
# Указываем виндовый WINS из другого домена - на время, пока он ещё жив
# wins server = 192.168.0.251
dns proxy = yes
time server = True

# Перемещаемые профили (если не указать эти пункты пустыми -
# профили у пользователей будут перемещаемые)
# logon path = \\lissyara\profiles\%U
logon path =
logon home =
template homedir =

# логгинг
# log level = 10 passdb:10 auth:10 winbind:10
# log level = 6
log file = /var/log/samba/log.%m

# added by lissyara 2009-09-04 in 16:22 MSK
admin users = "@SRO\Domain Admins"


[IPC$]
path = /tmp


[print$]
comment = Printer Drivers Share
path = /usr/home/samba/drivers

[netlogon]
path = /nethome/samba/netlogon
read only = no
browseable = yes

[profiles]
path = /nethome/samba/profiles
browseable = yes
create mask = 0600
directory mask = 0700
read only = no
guest ok = yes


Набор шар - опционален, обязательны лишь первые три. Далее - рисуем описанные в конфиге скрипты по управлению пользователями и группами, но, не забываем добавить в /etc/rc.conf такую строку:samba_enable="YES"


Скрипт добавления пользователя для компьютера добавляемого в домен - add_machine_script.sh:#!/bin/sh

# скрипт добавления машины
/usr/sbin/pw useradd "$1" -d /dev/null \
-s /sbin/nologin -L "russian" -m \
-g computers -c "computer_account"

# отладка
echo "added komp '$@' in `date +%Y-%m-%d` `date +%H:%M:%S`" \
>> /tmp/`basename $0`.log


Скрипт добавления пользователя - add_user_script.sh:#!/bin/sh

# скрипт добавления пользователей
#/usr/sbin/pw useradd "$1" -d /usr/home/samba/profiles/"$1" \
# -s /sbin/nologin -L "russian" -m -g ntusers -c "$1"
/usr/sbin/pw useradd "$1" -d /dev/null \
-s /sbin/nologin -L "russian" -m -g ntusers -c "$1"
# отладка
echo "added user '$@' in `date +%Y-%m-%d` `date +%H:%M:%S`" \
>> /tmp/`basename $0`.log


Добавление пользователя в группу - add_user_to_group_script.sh:#!/bin/sh

/usr/sbin/pw groupmod "$1" -m "$2"

# отладка
echo "added user '$2' to group '$1' ($@) in `date +%Y-%m-%d` \
`date +%H:%M:%S`" >> /tmp/`basename $0`.log


Скрипт для удаления пользователя из группы - delete_user_from_group_script.sh:#!/bin/sh

/usr/sbin/pw groupmod $1 -d $2


echo "deleted user '$2' from group '$1' ($@) in `date +%Y-%m-%d` \
`date +%H:%M:%S`" >> /tmp/`basename $0`.log


Скрипт переименовывания пользователя - rename_user_script.sh:#!/bin/sh

/usr/sbin/pw usermod $1 -l $2

echo "renamed user '$1' --> '$2' ($@) in `date +%Y-%m-%d` \
`date +%H:%M:%S`" >> /tmp/`basename $0`.log


Скрипт перезапуска сервиса - shutdown_script.sh:#!/bin/sh

# Перезапукаем самбу (в бакгроунде - обязательно!)
/usr/local/etc/rc.d/samba restart &


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

Написанные скрипты делаем исполняемыми и запускаем самбу:server$ chmod +x /usr/local/etc/samba/*.sh
server$ /usr/local/etc/rc.d/samba restart


Заводим пользователя root в самбе (в принципе, опять же, не обязательно - можно дальше действовать от административного пользователя, котрый и будет позднее постоянно использоваться. Но - на этом этапе так будет прощще):server$ smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root.


Рисуем скрипт добавления нужных системных групп, и маппинга виндовых групп на системные:#!/bin/sh
#!/bin/bash
#### Keep this as a shell script for future re-use

pw groupadd ntadmins
pw groupadd ntusers
pw groupadd computers


net groupmap add ntgroup="Domain Admins" unixgroup=ntadmins rid=512 type=d
net groupmap add ntgroup="Domain Users" unixgroup=ntusers rid=513 type=d
net groupmap add ntgroup="Domain Guests" unixgroup=nobody rid=514 type=d
net groupmap add ntgroup="Domain Computers" unixgroup=computers type=d


Как вы его обзовёте и куда положите - ваше дело. Использоваться он будет лишь один раз. Запускаем:server$ sh samba_group.sh
Successfully added group Domain Admins to the mapping db as a domain group
Successfully added group Domain Users to the mapping db as a domain group
Successfully added group Domain Guests to the mapping db as a domain group
No rid or sid specified, choosing a RID
Got RID 3007
Successfully added group Domain Computers to the mapping db as a domain group


Добавляем в администраторов будущего домена нужных пользователей (они, разуммется должны уже быть в системе. Я добавляю рута и nik - человек который будет на том конце провода заниматься машинками с виндой):pw groupmod ntadmins -m root
pw groupmod ntadmins -m nik
server$ id nik
uid=1001(nik) gid=0(wheel) groups=0(wheel),1982(ntadmins)
server$


Зачем рута? Просто все кому делал первым делом пытались залезть на виндовые машины и порулить доменом именно им. (с учётом что я не описываю как заводил того же nik в самбе - так же как и рута - вполне наверно логично...)
Вводим контроллер домена в домен:server$ net join server
Password:
Joined domain SRO.
server$


Всё. Для верности можно рестартануть самбу и пытаться ввести в домен машины/залогиниться на них юзерами (опять же - если дословно по статье сделано - то только root получиться. ибо в самбе пока больше нет других пользователей).

Оговорки и примечания. В общем - повторяюсь то же что и к предыдущей статье - при удалении пользователя из самбы - грохается системная учётка. Делайте проверку, или юзайте отдельную учётку. При наличии в системе учётки совпадающей по логину с создаваемой - новйо не создаётся - используется существующая.
Сразу отвечаю на впорос - почему не самба 3.3 а 3.0. В 3.3 скрипты, по какой-то причине, выполняются от обычного пользователя, который в винде галки ставит - nik в данном случае. Естессно они не работают. Либо sudo мутить, и ловить остальные глюки, либо - использовать проверенное решение. Я предпочёл последнее.
Для администрирования качаем утилиты http://support.microsoft.com/kb/173673/sr-cs/




Обновлено 28.05.2010 13:52
 

SAMBA и ClamAV - антивирусная защита.

E-mail Печать PDF

SAMBA и ClamAV - антивирусная защита.

Автор: lissyara.
Оригинал: http://www.lissyara.su/articles/freebsd/programms/samba_+_clamav/


На фрёвой машине, хранились кое какие доки пользователей, также она же использовалась для обмена документами. Решил привернуть проверку на вирусы к самбе. Порыскав по портам, по ключевому слову `samba`, нашёл антивирь - samba-vscan. Почитал - сойдёть. Будем ставить. В качестве антивируса поставим ClamAV:/usr/home/lissyara/>cd /usr/ports/security/clamav
/usr/ports/security/clamav/>make && make install && make clean


Вылезет окно - где ничё не надо выбирать.[ ] MILTER Compile the milter interface
[ ] CURL Support URL downloading
[ ] LIBUNRAR Support for external Unrar library


После сборки обновляем антивирусные базы:/usr/ports/security/clamav/>cd /usr/local/etc/
/usr/local/etc/>freshclam
ClamAV update process started at Tue Jan 24 16:30:46 2006
main.cvd is up to date (version: 35, sigs: 41649, f-level: 6, builder: tkojm)
Downloading daily.cvd [*]
daily.cvd updated (version: 1248, sigs: 852, f-level: 7, builder: diego)
Database updated (42501 signatures) from database.clamav.net (IP: 62.181.41.8)
ERROR: Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd
connect(): No such file or directory
/usr/local/etc/>


Добаляем строку в /etc/rc.conf, запускаем clamd и проверяем, запустился ли:
/usr/local/etc/>echo '' >> /etc/rc.conf
/usr/local/etc/>echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
/usr/local/etc/>
/usr/local/etc/>/usr/local/etc/rc.d/clamav-clamd.sh start
Starting clamav_clamd.
/usr/local/etc/>ps -ax | grep clam
63829 ?? Ss 0:00.00 /usr/local/sbin/clamd
63831 p0 S+ 0:00.01 grep clam
/usr/local/etc/>


После чего можно переходить к самбе.
Для начала, неплохо бы, эту самую самбу обновить, какая-то старая версия у меня стоит:/usr/ports/>pkg_info | grep samba
samba-3.0.14a,1 A free SMB and CIFS client and server for UNIX
/usr/ports/>portupgrade samba-3.0.14a,1
[Updating the portsdb <format:bdb1_btree> in /usr/ports ...
- 14052 port entries found .........1000......14000 ..... done]
** Port marked as IGNORE: net/samba3:
broken dependency between OpenSSL, OpenLDAP and
Heimdal for FreeBSD 4.x. Disable ADS support
/usr/ports/>
/usr/ports/>cat /var/db/ports/samba3/options
# This file is auto-generated by 'make config'.
# No user-servicable parts inside!
# Options for samba-3.0.14a,1
_OPTIONS_READ=samba-3.0.14a,1
WITH_LDAP=true
WITH_ADS=true
WITH_CUPS=true
WITH_WINBIND=true
WITHOUT_ACL_SUPPORT=true
WITH_SYSLOG=true
WITHOUT_QUOTAS=true
WITH_UTMP=true
WITHOUT_MSDFS=true
WITHOUT_SAM_XML=true
WITHOUT_SAM_MYSQL=true
WITHOUT_SAM_PGSQL=true
WITHOUT_SAM_OLD_LDAP=true
WITHOUT_PAM_SMBPASS=true
WITHOUT_EXP_MODULES=true
WITH_POPT=true
/usr/ports/>


Обновляться не захотела - пришлось отрихтовать файл /var/db/ports/samba3/option - заменить строчку:
WITH_ADS=true
на:
WITHOUT_ADS=true
После чего она прекрасно обновилась. Затем собираем антвирусный модуль:/usr/ports/>cd /usr/ports/security/samba-vscan
/usr/ports/security/samba-vscan/>make && make install && make clean


После инсталляции вылазиет инструкция по применению:
You have installed the samba-vscan package.

The vfs object's is in /usr/local/lib/samba.

The configuration files is in /usr/local/etc/samba-vscan.

Edit /usr/local/etc/smb.conf and add the following entry if you are using
samba 2.X (that's only an example):

[vscan]
comment = virus-protected /tmp directory
path = /tmp
vfs object = /usr/local/lib/samba/vscan-oav.so
vfs options = config-file = /usr/local/etc/samba-vscan/vscan-oav.conf
writeable = yes
browseable = yes
guest ok = yes

If you are using samba 3.X:

Edit /etc/smb.conf and add the following entry (that's only an example):
[vscan]
comment = virus-protected /tmp directory
path = /tmp
vfs object = vscan-oav
vscan-oav: config-file = /usr/local/etc/samba-vscan/vscan-oav.conf
writeable = yes
browseable = yes
guest ok = yes

Basically you have to add a vfs object line to your shares
which should be virus-protected by this module. If you'd like to use the
run-time configuration file, simply add the
vfs options = config-file = /path/config-file
(different settings for several shares can be achieved by using a different
name of the configuration file for each share). If you want to protect _all_
shares your Samba server offers, simply add the vfs object line (and the
vfs options line, if you like) to the [global] section.

Then restart samba.


По ней всё и делаем - рихтуем /usr/local/etc/smb.conf[global]
workgroup = main_workgroup_name
netbios name = FREEBSD
server string = BSD_4-11
interfaces = sis0
bind interfaces only = Yes
security = SHARE
encrypt passwords = No
lanman auth = No
ntlm auth = No
client lanman auth = No
client plaintext auth = No
announce version = 4.11
wins support = Yes
ldap ssl = no
create mask = 0666
security mask = 0666
directory mask = 0777

[main_bsd_share]
comment = примечание к шаре
path = /usr/local/smb_fs
# добавлены следующие две строки:
vfs object = vscan-clamav
vscan-clamav: config-file = /usr/local/etc/samba-vscan/vscan-clamav.conf
read only = No
guest ok = Yes


После чего приводим конфиг vscan к такому виду:
/usr/local/etc/samba-vscan/vscan-clamav.conf
[samba-vscan]

max file size = 0
; не забудте, после отладки, поставить
; следующую строчку в `no`
verbose file logging = yes
scan on open = yes
scan on close = yes
deny access on error = no
deny access on minor error = no
send warning message = yes
; в карантин у мя не перемещает -
; порылся в инете - не я один такой. Так и оставил.
; а хотел уже новую коллекцию вирей собирать...
infected file action = delete
quarantine directory = /tmp/smb_infected
quarantine prefix = vir-
max lru files entries = 100
lru file entry lifetime = 5
exclude file types =
clamd socket name = /var/run/clamav/clamd
libclamav max files in archive = 1000
libclamav max archived file size = 10485760
libclamav max recursion level = 5


Ну и всё. Перезапускаем самбу (у меня она остановилась в результате обновления :))
/usr/local/etc/>/usr/local/etc/rc.d/samba.sh restart
Stopping /usr/local/sbin/nmbd.
Waiting for PIDS: 56778.
Stopping /usr/local/sbin/smbd.
Starting SAMBA: removing stale tdbs :
/var/db/samba/connections.tdb
/var/db/samba/messages.tdb
/var/db/samba/sessionid.tdb
/var/db/samba/unexpected.tdb
/var/db/samba/brlock.tdb
/var/db/samba/locking.tdb
Starting nmbd.
Starting smbd.
/usr/local/etc/>


и наблюдаем следующую активность в /var/log/messages: Jan 24 14:17:50 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/A4-2a.jpg is clean
Jan 24 14:17:50 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/A4-1ob.jpg'
Jan 24 14:17:51 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/A4-1ob.jpg is clean
Jan 24 14:17:51 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/Vnytr1.jpg'
Jan 24 14:17:51 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vnytr1.jpg is clean
Jan 24 14:17:51 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/Vnutr.jpg'
Jan 24 14:17:52 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vnutr.jpg is clean
Jan 24 14:17:52 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/Vkatalog1.tif'
Jan 24 14:17:53 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vkatalog1.tif is clean
Jan 24 14:17:53 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/Vkatalog.tif'
Jan 24 14:17:53 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vkatalog.tif is clean
Jan 24 14:17:53 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/RazvRod.tif'
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/RazvRod.tif is clean
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/A5Kolle.tif was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/A5.jpg was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/A4-2a.jpg was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/A4-2.jpg was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/A4-1ob.jpg was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vnytr1.jpg was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vnutr.jpg was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/RazvRod.jpg'
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/RazvRod.jpg is clean
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vkatalog1.tif was not modified - not scanned
Jan 24 14:18:05 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Vkatalog.tif was not modified - not scanned
Jan 24 14:18:06 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/Razvorot2.jpg'
Jan 24 14:18:06 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Razvorot2.jpg is clean
Jan 24 14:18:06 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/Razvorot1.jpg'
Jan 24 14:18:07 mail2 smbd_vscan-clamav[58022]: INFO: file /usr/smb/Nastia/Razvorot1.jpg is clean
Jan 24 14:18:07 mail2 smbd_vscan-clamav[58022]: INFO: Scanning file : '/usr/smb/Nastia/Razvorot.tif'


Всё пучком. :) Меняем `verbose file logging` на `no` и перезапускаем самбу ещё раз.
Конечно же, стало медленней - но не так уж и сильно. Работать можно.

P.S. У меня почему-то на заражённые файлы ругается так: ERROR: string overflow by 1 (24 - 23) in safe_strcpy [main_bsd_share]


Пока не разобрался, но - ещё не вечер...

 

Обновлено 28.05.2010 13:46
 


Страница 2 из 3.

  • Вопросы по поводу написанных статей можно обсудить в нашем сообществе в Вконтакте / Questions about written articles can be discussed in our community in Vkontakte Вопросы по поводу написанных статей можно обсудить в нашем сообществе в  Вконтакте / Questions about written articles can be discussed in our community in Vkontakte
Яндекс.Метрика