Файлов сървър под Samba с Previous Version

Вместо увод

В Windows има нещо, което се нарича volume shadow copy. От версия Vista в Properties на всеки файл или папка има таб Previous Versions, което позволява да се възстанови от предварително запазен снапшот или от бекъп предишна версия на файла. Това е доста удобно в случаите в които много потребители работят на един и същи споделен файлов ресурс и се случва от време на време някой да презапише файл на друг. Понеже възстановяването от резервно копие обикновено изисква намесата на администратор, то това не винаги е подходящо. Снапшотът първо се извършва доста по-бързо и с изнесения интерфейс в Windows Explorer дава лесен начин всеки сам да се оправя при проблем.

Това което ще опиша се поддържа от специализираната ОС FreeNAS, базирана на FreeBSD. Ако ограниченията й Ви допадат, не е нужно да продължавате с четенето нататък. Ако обаче идеята да имате само 2гб изображение върху флашка, не Ви допада или искате да пускате и други услуги освен файлово споделяне, то тогава това което ще опиша по-нататък може да Ви е полезно.

Какво е положението към момента

За да работят нещата традиционно имаше нужда от Windows Server 2008 и нагоре, върху който да се настроят създаването на снапшоти на определения дял. Същата функционалност може да се постигне и с Samba, като се използва ZFS като файлова система отдолу. Защо ZFS – защото тя поддържа снапшоти. Какво следва от това – ако се търси стабилен файлов сървър, който да е с отворен код, трябва да се използва FreeBSD като сървърска ОС. При Linux ситуацията към момента не е цветуща. Съществува проект на SuSE, наречен snapper, който все още се разработва, работи стабилно върху btrfs, използването му върху ext4 е експериментално, а в Samba има поддръжка от версия 4.2 нагоре. От тук нататък няма да се занимавам с Linux поддръжката, а ще се разгледам как се прави файлов сървър под FreeBSD.

Инсталация на FreeBSD

За тези, които не са се занимавали до сега с FreeBSD, мога да кажа, че инсталацията протича изключително лесно. Няма да се спирам на подробности, ос-а има страхотен хендбук, а и има страшно много други материали по въпроса. Експериментът който направих беше върху виртуална машина (VirtualBox). Като диск за инсталация направих виртуален диск 4гб (ако ще инсталирате samba от ports колекцията както направих аз, направете диска поне 8гб), също така добавих още един виртуален диск 50гб, който в последствие форматирах под ZFS за споделяне. Още няколко насоки – трябват Ви около 2гб рам за да работи добре ZFS и минимум 4гб за пълния набор от фийчъри. Настройте мрежата да е с бриджната към някой интерфейс на машината, а не да ползва маскиране – както е по подразбиране.

Бих препоръчал да дръпнете disk1 iso изображението и да пробвате с него. Докато инсталирате FreeBSD може да изберете основният диск да е UFS, а не ZFS, също така при инсталация изберете да инсталирате ports колекцията.

Форматиране на втория диск с zfs

Пълната документация за работа с zfs може да прегледате тук. Аз използвах един по-съкратен вариант, който свърши чудесна работа.

Ако приемем, че вторият диск е /dev/ad1 то създаваме zfs върху целия диск по следния начин:

# zpool create -m /mnt/share shpool /dev/ad1

Горе оказваме къде да се монтира новия том (/mnt/share), името на тома (shpool) и на кой диск ще се създаде. Може да се ползва цял диск, както е в случая, или в отделен дял (примерно на втори дял на втори диск би било /dev/ad1p2). Трябва да се има в предвид, че zfs обединява в себе си както логическо управление на томове, като lvm, така и нормална файлова система, като ext4 да речем. За да проработи при  зареждане трябва да се активира zfs демона. Първо проверяваме дали не е активирано по следния начин:

# service zfs rcvar

и ако не е пишем:

# echo 'zfs_enable="YES"' >> /etc/rc.conf

Интересно нещо в zfs е, че може да си правиш различни файлови системи с отделни настройки, които да изглеждат като директории в тома. За нашия случай ще направим smb файлова система, и ще я настроим със специални настройки, които ще бъдат използвани от samba, така.

zfs create shpool/smb
zfs set aclmode=passthrough shpool/smb
zfs set aclinherit=passthrough shpool/smb

Втори и трети ред са нужни за експортиране на ACL към Windows клиентите. В настройките на samba ще обърнем внимание на това. След като напишем zfs list трябва да имаме вече следното:

NAME         USED  AVAIL  REFER  MOUNTPOINT
shpool       165K  48.2G    19K  /mnt/share
shpool/smb    41K  48.2G    21K  /mnt/share/smb

 Инсталиране на Samba през ports

Лично аз обичам да инсталирам софтуер от сорсове, ако става въпрос за експерименти. Инсталацията на samba през ports става по следния начин:

cd /usr/ports/net/samba41/
make install

Избрал съм да инсталирам последната версия 4.1.x. Ако ви трябва някоя по-стара може да видите кои са наличните към момента в /usr/ports/net/ директорията. Ще излезе екран за избор на зависимости, гледайте да държите зависимостите малки. Моите настройки са следните:

[x] ACL_SUPPORT
[x] AIO_SUPPORT    Asyncronous IO support
[x] CUPS           CUPS printing system support
[x] DNSUPDATE      Dynamic DNS update(require ADS)
[x] EXP_MODULES    Experimental modules
[x] FAM_SUPPORT    File Alteration Monitor support
[x] PAM_SMBPASS    PAM authentication via passdb backends
[x] PTHREADPOOL    Pthread pool
[x] QUOTAS         Disk quota support
[x] SYSLOG         Syslog logging support
[x] UTMP           UTMP accounting support
(*) NSUPDATE       Use internal DNS with NSUPDATE utility
(*) AVAHI          Zeroconf support via Avahi

Поддръжката на cups не е нужна, но съм я включил, за да покажа как може да се изключи в конфигурационния файл 🙂 Принципно прекомпилираните версии на samba са с cups поддръжка и е полезно да се знае как става. Като леко гъделче за OSX клиентите съм включил и AVAHI поддръжката на zeroconf/bonjour протокола. За поддръжка на асинхронно I/O е нужно да се зареди модул в ядрото. Това става по следния начин:

# echo 'aio_load="YES"' >> /boot/loader.conf
# kldstat -q -m aio || kldload aio

Първият ред гарантира, че модулът ще се зарежда всеки път при старт на системата. В последствие трябва да окажем на samba да ползва и това.

Като последна подготовка преди конфигурация на samba трябва да създадем потребител, под който Guest потребителя да се оторизира пред системата. Първо създаваме потребител, например winshare с командата  adduser. Добра идея е да се укаже шел nologin, без домашна директория и без парола, за да не може да се логва към конзола. След това може да добавим потребителя към samba по следния начин:

# smbpasswd -a winshare

Тук може да зададем парола, така че клиентите да се оторизират с нея към споделените папки по желание, но този акаунт ще го ползваме главно за публичен достъп.

Настройка на Samba

При инсталация, samba не създава конфигурационен файл, така че трябва да си го създадем сами. Местоположението му е в /usr/local/etc.

За Linux потребителите ще напомня, че FreeBSD не е дистрибуция, а цялостна ос. Конкретно това означава, че програмите и библиотеките, които са част от операционната система се инсталират в /, а всеки допълнителен софтуер, който не е част от нея в /usr/local/. По тази логика настройките на външните програми се намират в /usr/local/etc. Създаваме конфигурационни файл по следния начин:

# cd /usr/local/etc
# ee smb4.conf

За демонстрация ще настроим нещата по следния начин – тип на мрежата – работна група, единствен том за писане от всички през Guest потребител, няма да експортираме принтери.

Настройка на секция [global]

[global]

# Logging
log level = 0
log file = /var/log/samba4/%m.log
max log size = 50

# Domain controller & Workgroups
workgroup = WORKGROUP
server string = %h Server (FreeBSD Server)
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
aio read size = 16384

Горе оказваме позицията на лог файловете, името на уъркгрупата и някои настойки на мрежата, като и на асинхронното i/o, за което споменахме по-горе. За да излезе сървърът директно в полето Network на Windows Explorer, работните групи на сървъра и Windows клиента трябва да съвпадат.

# Security model
security = user
guest account = winshare
map to guest = Bad User

Тези опции са стандартни за повечето инсталации и няма да се спирам подробно на всеки ред. Забележете настройката с която правим winshare guest потребителя в системата.

# Veto files
veto files = /.DS_Store/
delete veto files = yes

Горното са настройки за палавите OSX клиенти, които много обичат да цапат всичко до което се докоснат (флашки, мрежови томове) с техните си .DS_Store файлове. С горите редове ги изтриваме, да не пречат.

# Shadow copy
shadow:snapdir = .zfs/snapshot
shadow:format = %Y-%m-%d
shadow:sort = desc

Гоните редове са най-важните за работа на Previous Verison. Модулът в samba, който имитира работа на Windows Server и експортира снапшотите се нарича shadow_copy2. Това представлява обект на виртуална файлова система в samba терминологията. Специално shadow_copy2 ще го заредим малко по-нататък. Първият ред оказва къде се намират снапшотите, вторият ред е много важен, понеже форматът който изберем тук, трябва да съвпада с формата са снапшота който ние създаваме, иначе нещата няма да се показват на Windows клиентите. Третият ред указва как да се сортират експортираните снапшоти.

# Store DOS attributes in extended attributes (no mapping)
map hidden = no
map system = no
map archive = no
map readonly = no
store dos attributes = yes
ea support = yes

Понеже zfs поддържа разширени атрибути ние можем да съхраняваме специфичните NTFS атрибути директно във файловата система, без да се правят магии за мапване към UNIX права.

# Behaviour when setting ACL
nfs4:mode = special
nfs4:acedup = merge
nfs4:chown = yes
map acl inherit = yes

Горе са показани настройките за съхранение на NTFS ACL в ZFS с използването на модула zfsacl. Заради това настроихме aclmode и aclinherit параметрите в zfs към passthrough докато създавахме файловите системи по-горе.

# Unix specific
wide links = no
unix extensions = yes
unix charset = UTF8

Горните настройки са за предотвратяване на опасността от използване на символни връзки в unix, за позволяване на unix клиентите да използват специфични неща по споделените папки и стандартизиране на използваните кодови таблици.

vfs object = netatalk
load printers = no
printcap name = /dev/null
disable spoolss = yes

Горе зареждаме глобално модула netatalk, който има за цел да улесни споделянето на папки паралелно по smb и по netatalk протокол –  отново свързано с проблеми с OSX клиентите. Ред от 2 до 4 са за изключване на споделянето на принтери по мрежата.

Настройки на споделянето [share]

Самата папка се споделя по следния начин:

[Share]
comment = Share
path = /mnt/share/smb
available = yes
browsable = yes
read only = no
writable = yes
guest ok = yes
vfs objects = streams_xattr shadow_copy2 zfsacl

Настройките са стандарти за всеки публичен samba том. Единственото интересно в случая е зареждането на модулите с vfs objects директивата на samba shadow_copy2 за поддръжка на previous version и zfsacl за ACL правата.

Внимание активирането на streams_xattr може да се окаже риск за сигурността и да скрие вируси, както е описано тук.

Следва да излезем с esc от ee редактора и да съхраним файла.

Активиране са Samba сървъра

Вече сме готови да тестваме конфигурацията, която сме направили. Това става с комнадата testparam. Ако всичко е наред можем да стартираме сървъра:

# service samba_server start

И да го активираме за първоначално зареждане с:

# echo 'samba_server_enable="YES"' >> /etc/rc.conf

Вече можем да закачим някой клиент и да видим как работи връзката. Можем да създадем примерна файлова структура. Това ще ни трябва за да тестваме снапшотите.

Създаване на примерен снапшот в zfs

Създаването на снапшот в zfs става с командата:

# zfs snapshot shpool/mnt@2014-11-22

Където всичко след @ е името на снапшота. Името трябва да съвпада със стойността на параметъра  shadow:format в smb4.conf и понеже го настроихме да е във формат година-месец-ден и за това кръстихме снапшота 2014-11-22. Можем да проверим дали всичко е създадено правилно с командата:

# zfs list -t snapshot

От тук нататък е въпрос на лично виждане как да се направи скрипт, който да се пуска през cron демона за създаване на снапшоти и управлението им.

Направете файл, направете снапшот, отворете същия файл и го променете. Ако всичко работи както трябва, ще видим нещо подобно.

previous version

previous version

Малки гъдели за OSX клиенти

По време на компилация на samba активирахме avahi и този демон трябва да е вече инсталиран на системата, заедно с dbus. Ако искаме OSX клиентите по-лесно да откриват сървъра в мрежата може да настроим zeroconf услугата по следния начин. Създаваме файл в /usr/local/etc/avahi/service с име smb.service и със следното съдържание:

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
 <name replace-wildcards="yes">%h</name>
 <service>
   <type>_smb._tcp</type>
   <port>445</port>
 </service>
 <service>
   <type>_device-info._tcp</type>
   <port>0</port>
   <txt-record>model=RackMac</txt-record>
 </service>
</service-group>

Активираме dbus и avahi както следва:

# echo 'dbus_enable="YES" ' >> /etc/rc.conf
# echo 'avahi_daemon_enable="YES" ' >> /etc/rc.conf
# echo 'avahi_dnsconfd_enable="YES" ' >> /etc/rc.conf

Стартираме услугите и ако не сме объркали нещо се получава:

share_avahi

За финал предлагам връзките към материалите в Интернет от където почерпих информация за материала.

http://www.sysadmin-cookbook.net/samba/
http://www.macdweller.org/2012/05/13/samba-bonjour-with-avahi/
https://docs.oracle.com/cd/E19253-01/819-5461/6n7ht6r4f/index.html
http://antmeetspenguin.blogspot.com/2013/08/samba-server-disable-cups.html
https://www.freebsd.org/cgi/man.cgi?loader.conf%285%29
https://www.freebsd.org/doc/handbook/network-samba.html
https://www.freebsd.org/doc/handbook/configtuning-rcd.html
https://docs.oracle.com/cd/E19253-01/819-5461/gaztn/index.html
http://www.bsdnow.tv/tutorials/zfs
https://wiki.freebsd.org/ZFSQuickStartGuide
https://www.freebsd.org/doc/en_US.ISO8859-1/articles/remote-install/zfs.html
Публикувано на IT мрънкане и тагнато, , , , , . Запазване в отметки на връзката.

Вашият коментар

Попълнете полетата по-долу или кликнете върху икона, за да влезете:

WordPress.com лого

В момента коментирате, използвайки вашия профил WordPress.com. Излизане /  Промяна )

Facebook photo

В момента коментирате, използвайки вашия профил Facebook. Излизане /  Промяна )

Connecting to %s