Autoloader i freeBSD

Tym razem udostępniam (dla potrzebujących) skrypt (również mojego autorstwa) napisany w php, pomagający w operacjach na autoloaderze zamontowanym w systemie freeBSD.

Jak to działa? Skrypt potrzebuje max 2 parametrów wywołania. 1 - opcja, 2 - numer slotu autoloadera. To dopiero v1.0, więc jeszcze będą zmiany.

Generalnie uruchamiamy skrypt w taki sposób:

./backup_multi.php [option] [slot]

Przy czym opcjami mogą być:

backup - tworzy kopię na kasetce (cartridge) oznaczonej jako dany dzień tygodnia (albo z podaniem numeru kasetki)
list - wyświetla zawartość załadowanej lub wskazanej kasetki z taśmą (cartridge)
status - wyświetla status autoloadera
load - ładuje kasetkę z podanego slotu
unload - odkłada kasetkę do slotu, z którego została wcześniej pobrana
rewind - przewijanie taśmy do początku
erase - całkowite kasowanie taśmy

Skrypt ten ma następującą politykę tworzenia kopii zapasowych na tasiemkach w oparciu na istniejącym urzadzeniu o nazwie autoloader:

slot 1 - poniedziałek
slot 2 - wtorek
slot 3 - środa
slot 4 - czwartek
slot 5 - piątek
slot 6 - ostatni dzień co drugiego tygodnia (jeszcze nie działa)
slot 7 - ostatni dzień miesiąca (jeszcze nie działa)
slot 8 - ostatni dzień co trzeciego miesiąca (jeszcze nie działa)

Oto kod:

#! /usr/local/bin/php -f
# by Adam Kucza (c) 2007
<?
# the backup policy of this script
# slot 1 - monday
# slot 2 - tuesday
# slot 3 - wednesday
# slot 4 - thursday
# slot 5 - friday
# slot 6 - last day of every 2nd week
# slot 7 - last day of the month
# slot 8 - last day of every 3rd month

#settings
define („DATE”, date(„Y-m-d_H.i.s”));
define („DAY_OF_WEEK”, date(„N”));
define („LOGFILE”, „/var/log/backup/backup_”.DATE.”.log”);
define („TAPEDRIVE”, „-f /dev/sa0″);
define („CHANGER”, „/dev/pass1″);
define („TAR”, „/usr/bin/tar”);
define („MT”, „/usr/bin/mt”);
define („MTX”, „/usr/local/sbin/mtx”);
define („MAX_SLOTS”, „8”);
define („BACKUPLIST”, „/fox/ustawienia/backup/backup_multi.lst”);

$x = $_SERVER["argv"];

//print_r($x);

if (count($x)==2 || count($x)==3)
{
$z = „”;

switch ($x[1])
{
case „status”:
# show changer status
$z = MTX.” -f „.CHANGER.” status”;
system($z);
break;

case „load”:
# load cartridge from slot numbered as current day of the week
# mtx -f /dev/pass1 load 1

// firstly free device -> unload cartridge (for sure & safety)
$z = $x[0].” unload”;
system ($z);

//secondly load cartridge (by default or by specified)
$z = MTX.” -f „.CHANGER.” load „;
if ($x[2] && $x[2]>=1 && $x[2]<=MAX_SLOTS) $z .= $x[2]; else $z .= DAY_OF_WEEK;
system($z);
break;

case "unload":
# unload cartridge into slot
# mtx -f /dev/pass1 unload
$z = MTX." -f ".CHANGER." unload";
system($z);
break;

case "rewind":
# rewind the cartridge
$z = MT." ".TAPEDRIVE." rewind";
system($z);
break;

case "erase":
# erase the cartridge
$z = MT." ".TAPEDRIVE." erase";
system($z);
break;

case "list":
# list of contents of cartridge
# tar -f /dev/sa0 -tv

// if there is a slot
if ($x[2] && $x[2]>=1 && $x[2]<=MAX_SLOTS)
{
// replace the cartridge
$z = $x[0]." unload";
system ($z);
$z = MTX." -f ".CHANGER." load ".$x[2];
system($z);
}
$z = TAR." -tv ".TAPEDRIVE;
system($z);
break;

case "backup":
# make backup on cartridge
# tar -f /dev/sa0 -cv /etc

// reload the cartridge from correct slot
$z = MTX." -f ".CHANGER." load ";
if ($x[2] && $x[2]>=1 && $x[2]<=MAX_SLOTS) $z .= $x[2]; else $z .= DAY_OF_WEEK;
system($z);

# backup data
echo "nstarting backup...n";
$z = TAR." -cv ".TAPEDRIVE." -T ".BACKUPLIST;
system($z);

# put list of contents into logfile
$z = $x[0]." list >> „.LOGFILE;
system($z);
break;

} //end of switch

echo $z;

}
else
{
echo „nSimple AutoLoader BackUp Script v.1.0 by Adam Kucza (c) 2007nn”;

echo „nThis script operates on autoloader existing in /dev location due to following backup policy:n”;
echo ” slot 1 - mondayn”;
echo ” slot 2 - tuesdayn”;
echo ” slot 3 - wednesdayn”;
echo ” slot 4 - thursdayn”;
echo ” slot 5 - fridayn”;
echo ” slot 6 - last day of every 2nd weekn”;
echo ” slot 7 - last day of the monthn”;
echo ” slot 8 - last day of every 3rd monthn”;

echo „nusage:n”;
echo ” „.$x[0].” [option] [slot]n”;
echo „navailable options:n”;
echo ” backup - make backup on the cartridge from slot due to day of week (by default)n”;
echo ” list - display the list of contents on loaded cartridgen”;
echo ” status - display autoloader statusn”;
echo ” load - load cartridge from slot (1-8) numbered as day of the week (by default)n”;
echo ” unload - unload the cartridge into last used slotn”;
echo ” rewind - rewind the cartridge (if any) to beginn”;
echo ” erase - erase entire cartridge (if any, it takes time)n”;
echo „nexamples:n”;
echo ” „.$x[0].” statustt- display statusn”;
echo ” „.$x[0].” backup [slot]t- make backup (into [slot] if specified)n”;
echo ” „.$x[0].” load [slot]t- load cartridge (into [slot] - if specified)n”;
echo ” „.$x[0].” unloadtt- unload cartridgen”;

}
echo „n”;
?>

kopia zapasowa na FreeBSD

Czas na garść informacji o wykonywaniui kopii zapasowych na urządzenach taśmowych w systemie freeBSD.

Proponuję zaprzyjaźnić się z poniższymi poleceniami, które tak naprawdę dotyczą standardowych programów każdego freeBSD.
Przy czym chciałbym dodać, iż parametr -f /dev/sa0 określa urządzenie SCSI Tape Drive.

Kilka poleceń programu mt (magnetic tape manipulating program):

sprawdzenie stanu taśmy (ang. status)

mt -f /dev/sa0 status

kasowanie taśmy (ang. erase)

mt -f /dev/sa0 erase

przewinięcie taśmy (ang. rewind)

mt -f /dev/sa0 rewind

retensja (ang. retension), czyli naciągnięcie taśmy (przewijanie do końca i do początku naciągając taśmę)

mt -f /dev/sa0 retension

wysunięcie taśmy z urządzenia (ang. eject)

mt -f /dev/sa0 offline

Kopię zapasową można wykonać za pomocą znanego już zapewne programu tar (manipulate tape archives):

wykonanie kopii zapasowej (kasuje poprzedni zapis na tasmie):

tar -cv /usr/data/dir
tar -cv /usr/data/dir /usr/data/test

po parametrze -cv, wypisujemy katalogi bądź pliki, które chcemy zarchiwizować

wylistowanie zawartości taśmy

tar -tv

odzyskanie danych z taśmy:

tar -xv
tar -xv usr/data/test/filename.ext

po parametrze -xv, wypisujemy katalogi bądź pliki, które chcemy odzyskać

Dodatkowe informacje

Gdy nię będziemy zalogowani w systemie jako root, wykonując jakiekolwiek operacje na urządzeniu taśmowym dostaniemy komunikat:

mt: /dev/nsa0: Permission denied

Jeśli urządzenie taśmowe będzie puste (bez taśmy wewnątrz), to dostaniemy komunikat:

mt: /dev/nsa0: Device not configured

W przypadku, gdy urządzenie taśmowe będzie wykonywało jakąkolwiek operację na taśmie, a my będziemy chcieli zrobić z nią cokolwiek, dostaniemy następujący komunikat:

mt: /dev/nsa0: Device busy

Natomiast jeśli urządzenie będzie wolne od zadań, po wykonaniu polecenia mt status dostaniemy coś takiego:

Mode Density Blocksize bpi Compression
Current: 0x25:DDS-3 variable 97000 DCLZ
———available modes———
0: 0x25:DDS-3 variable 97000 DCLZ
1: 0x25:DDS-3 variable 97000 DCLZ
2: 0x25:DDS-3 variable 97000 DCLZ
3: 0x25:DDS-3 variable 97000 DCLZ
———————————
Current Driver State: at rest.
———————————
File Number: 0 Record Number: 0 Residual Count 0

Jeśli użyjemy polecenia tar -tv a taśma nie będzie sformatowana, uzyskamy komunikat:

tar: Unrecognized archive format: Inappropriate file type or format

Jeśli skorzystamy z polecenia tar -tv, a taśma będzie czysta zobaczymy coś takiego:

tar: Error opening archive: Error reading „/dev/sa0″: Input/output error

Myślę, że powyższy FAQ przybliży nieco archiwizowanie danych na tasiemkach.