Przydatne narzędzia kolejek postfix’a

Czasami bywają krytyczne sytuacje w kolejkami postfix’a. Pomocne są wtedy narzędzia będące elementami pakietu (portu) postfix’a. Nie trzeba więc niczego więcej instalować.

Narzędzia kolejek:

postqueue -p
wyświetla listę wszystkich wiadomości w kolejce

postsuper -d (Queue ID)
pozwala usuwać wiadomość z kolejki o danym ID

postsuper -d ALL
usuwa wszystkie wiadomości z kolejki

postsuper -h (Queue ID)
zatrzymanie wiadomośic w kolejce (kolejka hold)

postsuper -H (Queue ID)
przeniesienie wiadomości z powrotem do menadżera kolejek

postsuper -r ALL
zwraca wiadomości z powrotem do kolejki, wiadomości te otrzymują nowe identyfikatory i dodatkowy nagłówek Received

postcat -q
wyświetlanie zawartości pliku kolejki

postqueue -f
wypychanie wiadomości

postqueue -s domena.com
wypychanie wiadomości domeny domena.com

mailq -q /identyczne do sendmail -bp/
lista wiadomości w kolejce do obsłużenia

Bieżący podgląd zawartości loga postfix’a zapewnia polecenie:

tail -f /var/log/maillog

Ostatnie dwa polecenia są bardzo pomocne, jeśli chcemy ręcznie przyspieszyć obsługę kolejek (mailq -q) i jednocześnie przyjrzeć się czy faktycznie postfix coś z nimi robi (tail -f /var/log/maillog).

W sumie o takie czynności zawsze można poprosić administratora.

Windows Vista Service Pack 1 – co robić?

Nie wszyscy lubią system Windows Vista. Nie wszyscy są nim zachwyceni z uwagi na zasobożerność. Nie wszyscy lubią Windowsy.
Należę jednak do tej mniejszości, która potrafi poradzić sobie z każdym systemem, nawet z Vistą.

Od początku maja w repozytorium Microsoft Windows Update widnieje paczka Service Pack 1.
Dopiero dzisiaj udało mi się ją bezproblemowo zainstalować.

Otóż problem pojawiał się w momencie instalacji Etapu 3/3, gdzie w 78% postepu instalacji system się zawieszał.
Jedyną drogą powrotną było przywrócenie systemu do jakiegoś punktu przywracania z przeszłości.

Jak się okazuje, po uważnym przeczytaniu strony Microsoft Support (http://support.microsoft.com/kb/947366), wpadłem na pomysł totalnego wyłączenia antywirusa NOD32 oraz firewalla Jetico.

Dopiero teraz aktualizacja przebiegła pomyślnie. Wam również życzę powodzenia.

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) 2007\n\n”;

echo „\nThis script operates on autoloader existing in /dev location due to following backup policy:\n”;
echo ” slot 1 – monday\n”;
echo ” slot 2 – tuesday\n”;
echo ” slot 3 – wednesday\n”;
echo ” slot 4 – thursday\n”;
echo ” slot 5 – friday\n”;
echo ” slot 6 – last day of every 2nd week\n”;
echo ” slot 7 – last day of the month\n”;
echo ” slot 8 – last day of every 3rd month\n”;

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 cartridge\n”;
echo ” status – display autoloader status\n”;
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 slot\n”;
echo ” rewind – rewind the cartridge (if any) to begin\n”;
echo ” erase – erase entire cartridge (if any, it takes time)\n”;
echo „\nexamples:\n”;
echo ” „.$x[0].” status\t\t- display status\n”;
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].” unload\t\t- unload cartridge\n”;

}
echo „\n”;
?>

Zmiana portu dla Terminal Services (RDP)

Jak wiecie, standardowy port RDP (pulpit zdalny) to 3389. W przypadku gdy zachodzi potrzeba zmiany tego portu, np. ze względu na większe bezpieczeństwo, bądź w celu przejścia pakietów prze firewall, warto ten port zmienić.

Będąc zalogowanym jako administrator serwera, uruchamiamy Edytor rejestru:

menu Start -> Uruchom -> Regedit

Następnie zmieniamy wpis znajdujący się w drzewie

KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber

Zmiana numeru portu oraz restart serwera powinno rozwiązać problem.

W razie niejasności podaję linki do artykułów na stronie Microsoftu:

rsync Twoim przyjacielem

Oddaję do użytku skrypt mojego autorstwa napisany w php, wykonujący kopię synchronizacyjną plików znajdujących się w katalogu podanym jako pierwszy parametr wywołania.

#! /usr/local/bin/php -f
# by Adam Kucza (c) 2007
<?
$x = $_SERVER[„argv”];

if (count($x)==4)
{
//print_r($x);

$rsync = „/usr/local/bin/rsync”;

$srv = $x[1];
$src = $x[2];
$dst = $x[3];

$t = getdate();
//print_r($t);
if (strlen($t[‚mon’])<10) $t['mon']="0".$t['mon']; if (strlen($t['mday'])<10) $t['mday']="0".$t['mday']; $l = "/var/log/rsync/".$x[1]."_".$t['year']."-".$t['mon']."-".$t['mday']."_".$t['hours'].".".$t['minutes'].".".$t['seconds']; $o = ""; $o .= "-a "; $o .= "-v "; $o .= "-z "; $o .= "--delete "; $o .= "--ignore-errors "; $o .= "--force "; $o .= "--stats "; $o .= "--log-file=".$l." "; //$o .= "--dry-run "; //$o .= "--modify-window=1 "; //$o .= "--iconv=UTF-8,CP1251 "; //$o .= "--blocking-io "; //$o .= "--delete-after "; //$o .= "--delete-before "; //$o .= "--progress "; //$o .= "--delete-excluded "; //$o .= "--exclude-from=$EXCLUDES "; //$o .= "--backup --backup-dir=/$BACKUPDIR -a "; $z = $rsync." ".$o." ".$src." ".$srv."::".$dst; echo $z."\n"; system($z); } else { echo "\nusage: ".$x[0]." server_address source_folder destination_module\n"; echo "\nexample: ".$x[0]." 192.168.1.100 /home/user/ backup_module\n"; } echo "\n"; ?>

Przykład jego wywołania wygląda np. tak:

./rsync.php /home/users/ backup_server

enjoy! 🙂

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.

rsync i „Bad file descriptor (9)” na freeBSD

Postanowiłem przybliżyć nieco problem związany z rsync.
Podczas synchronizacji widać oraz w logach widzimy błędy identyczne do następujących

[3193] rsync: readlink „jakis_plik” (in intranet) failed: Bad file descriptor (9)
[3193] rsync: recv_generator: failed to stat „jakis_plik” (in intranet): Bad file descriptor (9)
[3197] rsync: stat „jakis_plik” (in intranet) failed: Bad file descriptor (9)
[3197] rsync error: some files could not be transferred (code 23) at main.c(977) [sender=2.6.9]

Czasami nie zawsze pojawiają się tego typu błędy, aczkolwiek administrator widząc readlink … Bad file descriptor (9) zastanawia się czy przypadkiem nie ma uszkodzonego dysku i czy nie jest to błąd odczytu pliku…

W pewnym sensie jest to prawda, bowiem przy konfigurowaniu rsynca należy pamiętać aby system plików (filesystem type) na obu serwerach, a dokładniej na partycjach (źródłowej i docelowej) był dokładnie taki sam.

Mój problem polegał na tym, że zamontowana partycja na serwerze źródłowym posiadała likuksowy system plików ext2fs (subtype=131), a partycja, a raczej rsyncowy moduł docelowy – system plików freebsd (subtype=165).

Stąd te błędy. Korekte systemu plików mozna zrobić „w locie” bez konieczności restartowania serwera, a co ważniejsze – utraty danych (przynajmniej u mnie wszystko pozostało bez zmian).
Dla pewności proponowałbym zrobić uprzednio kopię zapasową danych znajdujących się na partycji, której chcemy zmienić system plików –> przezorny zawsze ubezpieczony.

Zmianę systemu plików dokonujemy następująco:

sysinstall –> configure –> fdisk

Po zamianie ext2fs –> freebsd, wszystko śmiga jak należy i zapominamy o błędach typu bad file descriptor.

mc i problem z subshell_pty

Od pewnego czasu (w sumie nie wiem jak to się stało), przy uruchamianiu Midnight Commandera dostaję następujący komunikat:

freeBSD# mc
read (subshell_pty…): No such file or directory (2)

Co jest grane?
Otóż dziwnym trafem ustawienia aplikacji mówią nam, że jest problem z tzw. subshell (podpowłoka).
Error i brak możliwości usuchomienia programu występuje nawet po reinstalacji mc.
Najszybszym rozwiązaniem jest uruchamianie Midnight Commandera bez subshella w następujący sposób:

mc -u

Innym rozwiązaniem jest ponowne skompilowanie mc bez shubshella.
Polecam również manuala:

man mc