Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
wiki:samba_shadow_copy [2010/05/28 12:01] |
wiki:samba_shadow_copy [2010/12/27 23:20] (текущий) |
||
---|---|---|---|
Строка 15: | Строка 15: | ||
comment = Users shared folders | comment = Users shared folders | ||
path = /var/data/users/ | path = /var/data/users/ | ||
- | admin users = "@DNCM\Администраторы домена" | + | admin users = "@DOMAIN\Администраторы домена" |
read only = No | read only = No | ||
create mask = 0600 | create mask = 0600 | ||
Строка 55: | Строка 55: | ||
path = /var/data/users/ | path = /var/data/users/ | ||
# Пользователи с правами редактирования галочек ;) | # Пользователи с правами редактирования галочек ;) | ||
- | admin users = "@DNCM\Администраторы домена" | + | admin users = "@DOMAIN\Администраторы домена" |
hide unreadable = yes | hide unreadable = yes | ||
read only = no | read only = no | ||
Строка 111: | Строка 111: | ||
# Библиотека функций работы со снапшотами. | # Библиотека функций работы со снапшотами. | ||
# Author: Nevorotin Vadim aka Malamut | # Author: Nevorotin Vadim aka Malamut | ||
- | # Лицензия: используйте как посчитаете нужным | + | # Лицензия: GPLv3 |
use 5.010; | use 5.010; | ||
Строка 198: | Строка 198: | ||
# Монтируем | # Монтируем | ||
- | if (system "mount -r /dev/$vg/$sn_name $path/\@GMT-$sn_name") { | + | if (system "mount -o ro,acl,user_xattr /dev/$vg/$sn_name $path/\@GMT-$sn_name") { |
!system "lvremove -f /dev/$vg/$sn_name 1>/dev/null" or warn "Very big error: I can't remove a snapshot :("; | !system "lvremove -f /dev/$vg/$sn_name 1>/dev/null" or warn "Very big error: I can't remove a snapshot :("; | ||
rmdir "$path/\@GMT-$sn_name" or warn "Very big error: I can't remove a directory for snapshot :("; | rmdir "$path/\@GMT-$sn_name" or warn "Very big error: I can't remove a directory for snapshot :("; | ||
Строка 307: | Строка 307: | ||
} | } | ||
unless (isIn($sn_name, @mounted)) { | unless (isIn($sn_name, @mounted)) { | ||
- | if (system "mount -r /dev/$vg/$sn_name $path/\@GMT-$sn_name") { | + | if (system "mount -o ro,acl,user_xattr /dev/$vg/$sn_name $path/\@GMT-$sn_name") { |
rmdir "$path/\@GMT-$sn_name" or warn "Very big error: I can't remove a directory for snapshot $sn_name!:(\n"; | rmdir "$path/\@GMT-$sn_name" or warn "Very big error: I can't remove a directory for snapshot $sn_name!:(\n"; | ||
die "I can't mount a snapshot $sn_name to it's directory!\n"; | die "I can't mount a snapshot $sn_name to it's directory!\n"; | ||
Строка 319: | Строка 319: | ||
rmdir "$path/\@GMT-$_" or die "Error: I can't remove an unused directory $_!:(\n"; | rmdir "$path/\@GMT-$_" or die "Error: I can't remove an unused directory $_!:(\n"; | ||
} | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # Удаляет все снапшоты для заданного тома | ||
+ | sub removeAllSnapshots { | ||
+ | @_ == 3 or die "removeAllSnapshots - OOPS!\n"; | ||
+ | my ($lv, $vg, $path) = @_; | ||
+ | |||
+ | my %snapshots = getActive($lv, $vg); | ||
+ | |||
+ | # Удаляем все снапшоты | ||
+ | foreach (keys %snapshots) { | ||
+ | removeSnapshot($_, $vg, $path); | ||
} | } | ||
} | } | ||
Строка 326: | Строка 339: | ||
</code> | </code> | ||
- | А вот файл ротации снапшотов для упоминавшегося выше тома ''/var/data/users'': | + | А вот файл управления снапшотами для упоминавшегося выше тома ''/var/data/users'': |
<code perl> | <code perl> | ||
#!/usr/bin/perl -w | #!/usr/bin/perl -w | ||
+ | # Скрипт управления ротацией снапшотов. | ||
+ | # Author: Nevorotin Vadim aka Malamut | ||
+ | # Лицензия: GPLv3 | ||
use 5.010; | use 5.010; | ||
+ | use Getopt::Long; # Для разбора опций | ||
- | require "/etc/samba/libsnapshot.pm"; | + | # Библиотека с необходимыми функциями |
+ | require "/etc/samba/snapshots/libsnapshot.pm"; | ||
- | # | + | ######################################## |
- | ## Parameters | + | # Параметры тома для ротации снапшотов # |
- | # | + | ######################################## |
# Группа томов | # Группа томов | ||
Строка 350: | Строка 368: | ||
# Начальный размер снапшота, Gb | # Начальный размер снапшота, Gb | ||
- | $sn_size = 10; | + | $sn_size = 5; |
# Предел заполнения до ресайза, % | # Предел заполнения до ресайза, % | ||
$sn_limit = 80; | $sn_limit = 80; | ||
# Шаг увеличения снапшота при переполнении, Gb | # Шаг увеличения снапшота при переполнении, Gb | ||
- | $sn_add = 5; | + | $sn_add = 3; |
- | ################################ | + | ######################################### |
- | snapshotsRotate($lv, $vg, $path, $count, $sn_size, $sn_limit, $sn_add); | + | $clear = 0; |
- | </code> | + | $rotate = 0; |
+ | $remount = 0; | ||
- | Его необходимо запускать по cron, я делаю это раз в сутки в 00:12. | + | Getopt::Long::Configure ("bundling"); # Конфигурирование getopt дабы воспринимать склейку коротких аргументов |
+ | GetOptions( | ||
+ | "clear|c" => \$clear, # Удалить все снапшоты | ||
+ | "rotate|r" => \$rotate, # Провести ротацию | ||
+ | "remount|m" => \$remount, # Перемонтировать имеющиеся снапшоты | ||
+ | "help|h" => \$help); # Помощь же | ||
- | Кстати, не забудьте после рестарта сервера перемонтировать все снапшоты, для этого пригодится такой скрипт: | + | if (@ARGV or $help) { |
+ | die "Usage: snapshots.pl [--clear|--rotate|--remount]\n\t-c = --clear\n\t-r = --rotate\n\t-m = --remount\n"; | ||
+ | } elsif ($clear) { | ||
+ | removeAllSnapshots($lv, $vg, $path); | ||
+ | } elsif ($rotate) { | ||
+ | snapshotsRotate($lv, $vg, $path, $count, $sn_size, $sn_limit, $sn_add); | ||
+ | } elsif ($remount) { | ||
+ | snapshotsRemount($lv, $vg, $path); | ||
+ | } else { | ||
+ | die "Usage: snapshots.pl [--clear|--rotate|--remount]\n\t-c = --clear\n\t-r = --rotate\n\t-m = --remount\n"; | ||
+ | } | ||
+ | </code> | ||
- | <code perl> | + | Его необходимо запускать по **cron** с опцией **-r** (ротация), я делаю это раз в сутки в 00:12. |
- | #!/usr/bin/perl -w | + | |
- | use 5.010; | + | Также надо не забыть после рестарта сервера перемонтировать все снапшоты, для этого нужно запустить скрипт с параметром **-m**.Сделать это можно из ''/etc/rc.local''. Если же вы решите удалить все снапшоты, то вызовите скрипт с параметром **-c**. |
- | + | ||
- | require "/etc/samba/libsnapshot.pm"; | + | |
- | + | ||
- | # | + | |
- | ## Parameters | + | |
- | # | + | |
- | + | ||
- | # Группа томов | + | |
- | $vg = 'data'; | + | |
- | # Логический том | + | |
- | $lv = 'users'; | + | |
- | # Точка монтирования | + | |
- | $path = '/var/data/users'; | + | |
- | + | ||
- | ################################ | + | |
- | + | ||
- | snapshotsRemount($lv, $vg, $path); | + | |
- | </code> | + | |
- | Его вызов можно добавить в ''/etc/rc.local''. | + | Естественно, вам нужно будет поменять все параметры, присвоив им нужные значения. Кроме того, для каждого тома необходимо будет создать свою копию скрипта с нужными параметрами. |
===== Ссылки ===== | ===== Ссылки ===== |