27 Apr 2009

rsync autoresume

Jakiś czas temu byłem zmuszony pobrać dużo danych z serwera który systematycznie co 1GB zrywał połączenie a danych było sporo bo 15GB. Jedną z możliwości ich pobrania było połączenie się programem rsync. Jako, że zależało mi żeby pobrać je szybko, napisałem skrypt automatyzujący wznawianie transferów (wersja którą publikuje jest po drobnych poprawkach). Użycie jest bardzo intuicyjne, najpierw trzeba skrypt zrobić wykonywalnym:
chmod +x rsync2succ.sh
a następnie uruchomić np któreś z poniższych poleceń
  • Powoduje skopiowanie katalogu /sciezka/do/danych z serwera "serwer" do katalogu z którego wywołany jest skrypt
    ./rsync2succ.sh serwer:/sciezka/do/danych/ .
  • Robi to samo co wyżej, jednak nakazuje programowi rsync użyć maksymalnie 100kB/s
    ./rsync2succ.sh --bwlimit-rate 100 serwer:/sciezka/do/danych/ .

Notatki

  • Do skryptu można podać parametry do polecenie rsync (to co dostaje skrypt jest „przeklejane” niemalże bezpośrednio do wywołania komendy rsync)
  • Jako, że ja często zapominam co się dzieje jeśli wpiszę o jeden ukośnik za dużo (pobierana jest zawartość katalogu a nie cały katalog) zrobiłem sobie odcinanie ostatniego znaku /.
  • Mam nadzieję, że skrypt działa poprawnie - bo ja jakoś specjalnie mocno go nie testowałem.
  • Jeśli się np. nie uruchamia - upewnij się, że nie masz w źródle znaków UTF-8 (czasami blogger potrafi zamienić znaki komentarzy na jakieś inne - ale wyglądające tak samo)

rsync2succ.sh - źródło

#!/bin/bash

# Programy wykorzystywane w tym skrypcie.
RSYNC=`which rsync`
DATE=`which date`
SLEEP=`which sleep`
RM=`which rm`
MAXTRIES=2

# Gdzie idzie wyjscie
LOGFILE=log.txt

# pozwalamy tylko na dostep do programow powyzej
unset PATH

# Obsluga sygnalow - sluzy do zabicia dlugo dzialajacego procesu.
trap 'kill $$ ; exit 1' SIGINT

# Obsluga logowania
# jesli byla by koniecznosc umieszczenia informacji w logu systemowym
# nalezy skorzystac z programu logger (/usr/bin/logger)
function log {
 echo `$DATE "+%F %k:%M:%S"`" "$@ >>$LOGFILE
}

function rsync {
 log "starting rsync with params: "$@
 $RSYNC $@
}

## MAIN:
if [ $# -lt 2 ] ; then
 log "no parameters to rsync passed"
 log "at least two parameters must be set"
 exit 1
fi

# filtruj paramatry
for PARAM in $@ ; do 
 # usun znak / z konca argumentu i dodaj go do parametrow
 ARGV=( "${ARGV[@]}" ${PARAM%/} )
done

# usun plik log jesli istnieje
if [ -f $LOGFILE ] ; then
 $RM $LOGFILE
fi

STATUS=1
TRIES=1
while [ $STATUS -ne 0 ] ; do 
 rsync -avzP ${ARGV[@]}
 STATUS=$?

 if [ $STATUS -ne 0 ] ; then
  # wystapil blad przed powtorna proba czekamy 10 sekund
  log "rsync failed with status $STATUS - restarting"
  $SLEEP 10
  if [ $TRIES -ge $MAXTRIES ] ; then
   log "Maximum tries reached ($MAXTRIES) exiting"
   exit 1
  fi
  TRIES=$((TRIES+1))
 else
  log "rsync command completed succesfully"
 fi
done
ps: jeśli chciałbyś się nauczyć pisać w Bashu to zapraszam na moje wiki, natomiast jeśli znasz już ten język a chciałbyś coś o nim napisać - to skontaktuj się ze mną - np. poprzez komentarze.

22 Apr 2009

Perl CGI - Szybki start

Perl do chwili obecnej często jest nazywany "klejem łączącym sieć web", dzięki możliwością przetwarzania tekstu (głównie chodzi o bardzo zaawansowane wyrażenia regularne) bardzo dobrze nadaje się do pisania aplikacji konwertujących dane tekstowe. Rozpoczęcie przygody z Perlem oraz serwisami internetowymi jest dosyć proste (zakładam, że czytelnik ma jakiekolwiek obycie z systemem Linux - w tym wypadku Debian i coś tam słyszał o Apache). By móc wykonywać skrypty Perla po stronie serwera należy:
  • Skonfigurować serwer http np. Apache 2 (zakładamy, że moduł CGI jest ładowany automatycznie do apache - isnieje plik: /etc/apache2/mods-enabled/cgi.load)
  • Napisać skrypt CGI oraz go umieścić na serwerze

Konfiguracja wirtualnego hosta

Pliki znajdują się w katalogu /etc/apache2/hosts-enabled/ .
<VirtualHost *:80>

 ServerAdmin admin@host.pl
 DocumentRoot /home/services/service

 ServerName service.0x1fff.com
 ServerSignature Off
 LogLevel warn
 TransferLog /var/log/apache2/cgi_service_access.log
 ErrorLog /var/log/apache2/cgi_service_error.log

 AddHandler cgi-script .cgi .pl 

 #ScriptAlias /cgi-bin/ /home/services/service/cgi-bin/
 <Directory "/home/services/service/cgi-bin">
  SetHandler cgi-script
  AllowOverride None
  Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
  Order allow,deny
  Allow from all
 </Directory>

</VirtualHost>
W powyższym przykładzie VirtualHosta należy zmodyfikować odpowiednie dane.

Prosty skrypt CGI

Skrypt ten wykorzystuje kodowanie UTF8, oraz pozwala na proste debugowanie poprzez obserwację logów (żadne błędy nie są widoczne w przeglądarce użytkownika). Dodatkowo skrypt ten wykorzystuje moduły (apt-get install libcgi-perl libcgi-pm-perl):
  • Fatal - pozwala na zmniejszenie ilości sprawdzanych warunków np. przy otwieraniu plików
  • CGI - usprawnia pracę programisty w środowisku WEB np. przetwarzanie argumentów
  • CGI::Debug - ułatwia debugowanie aplikacji sieciowych
  • Funkcje ceil i floor są również imporotwane (zobacz: zaokrąglanie wartośći w Perlu)
#!/usr/bin/perl

use utf8;
use warnings;
use strict;

use Fatal qw{ open close mkdir };
use POSIX qw(ceil floor);    # short url
use CGI;                     # CGI Stuff

# Ten moduł musi być zainstalowany z CPAN :(
# ale do debugowania chyba jest jednym z lepszym
#use CGI::Debug(
# report => [
#  'everything', 'errors',  'empty_body', 'time',
#  'params',     'cookies', 'environment',
# ],
# on => [ 'fatals', 'warnings' ],
# to => {
#  browser => 0,
#  log     => 1,
# },
# #header => 'control',
# set => { error_document => 'html/error.html' },
#);
# jesli nie ma mozliwosci jego instalacji pozostaje CGI::Carp;


# Global variables:
my $page = new CGI;
$page->charset('utf-8');
$CGI::POST_MAX = 1024 * 5000;

# Jeśli nie ma moduły CGI sami musimy zadbać o Content-Type.
# Ponizsze dwie linie dokonują przekierowania na mój blog.
#print "Content-type: text/plain\n";
#print "Location: http://blog.0x1fff.com/\n\n";

# wypisz całą sekcję head
print $page->header;


print '<table>';
foreach my $var (sort(keys(%ENV))) {
    my $val = $ENV{$var};
    $val =~ s|\n|\\n|g;
    $val =~ s|"|\\"|g;
    print "<tr><td>".${var}."</td><td>".${val}."</td></tr>\n";
}
print '</table>';

my $test = $query->param("test");
print $page->escapeHTML($test);
Skrypt ten należy umieścić w pliku: /home/services/service/cgi-bin/test.pl. Strona wygenerowana przez skrypt może być znaleziona pod adresem: http://service.0x1fff.com/cgi-bin/test.pl (oczywiście po odpowiednich modyfikacjach). Często podczas tworzenia aplikacji przydaje się zmodyfikować plik /etc/hosts żeby od razu móc działać "pod właściwym adresem". Ale to każdy powinien już sobie sam zrobić.

Frameworki ułatwiające pisanie skryptów CGI w Perlu

  • Catalyst - obecnie najpopularniejszy framework do tworzenia aplikacji sieciowych (model MVC)
  • CGI - jeden ze starszych modułów pomagający pisać aplikacje sieciowych

Jak można inaczej generować dynamiczne strony w Perlu?

Co ciekawe CGI to nie tylko Perl - ale także C, C++, Bash i wiele innych języków.

21 Apr 2009

Dostałem NetBeans Pen drive!

Jakiś czas temu wziąłem udział w promocji refer-a-friend Suna a dokładniej środowiska programistycznego NetBeans.

Zasady były proste, należało nakłonić co najmniej 4 znajomych do używania NetBeans (a przynajmniej do jego ściągnięcia) a w zamian za to firma Sun Microsystems przysłała 2GB Pendrive.

Czym wyróżnia się NetBeans na tle konkurencji?

Obsługuje następujące języki programowania

  • Java SE - czyli desktopowe aplikacje
  • Java EE - czyli servlety
  • Java ME - czyli pisanie MIDLetów dla komórek - łącznie z wizualnym tworzeniem aplikacji
  • PHP - całkiem fajne wsparcie, chyba nawet troszkę lepsze niż PDT (Eclipsowe)
  • C/C++
  • Ruby
  • Groovy
Uważam, że NetBeans to bardzo wygodne i ciekawe narzędzie do tworzenia nowoczesnych aplikacji. A dzięki NetBeans Platform jest bardzo łatwo rozszerzalne, przez dowolną osobę (wystarczy de facto napisać coś w Swingu!).

Cechy które mi szczególnie przypadły do gustu, to

  • wizualny edytor formatek
  • bardzo przyjemne dopełnianie składni
  • intuicyjny interfejs
  • tryb fullscreen
Mam nadzieję, że wygodnie Wam się pracuje z NetBeansem, ale miałem pisać o Pendrive, więc: jest fajny i przyszedł mi wprost do domu - jednocześnie napakowany materiałami o NetBeans.

20 Apr 2009

Czy normalna zdrowa ryba ...

Ci co kiedyś byli u mnie na starym blogu pamiętają ten rysunek może ;). A notka miała treść: *Czy normalna zdrowa ryba, może ... wieloryba?*

Porządki na dysku jakiś czas temu były i takie rzeczy znalazłem.

16 Apr 2009

Debian GNU/Linux - Kompilacja jądra

Będzie to artykuł z serii tych, lekkich łatwych i przyjemnych oraz tych które można znaleźć w sieci :), jednak powstanie - bo gdzieś na dysku miałem zapisane informacje, że coś takiego miałem napisać kiedyś. W Debianie trochę inaczej niż np. w Gentoo instaluje się jądro systemu. W skrócie wygląda to tak, że:
  1. Pobieramy źródło jądra, konfigurujemy je
  2. Tworzymy paczkę ze zbudowanym jądrem, a następnie ją instalujemy

Konwencje nazewnicze występujące w tym tekście

Wszystkie wystąpienia {$LINUX_VERSION} powinny być zamienione na wersję jaką posiadamy. Jeśli by ktoś chciał użyć tego poradnika przy pisaniu skryptu kompilacji, wystarczy że stworzy sobie zmienną LINUX_VERSION.
$LINUX_VERSION=2.6.29.1

Wymagane pakiety

apt-get install kernel-package libncurses5-dev fakeroot fakeroot wget bzip2 build-essential zlib1g-dev zlib1g

Pobieranie źródeł jądra

Nowe źródła jądra można pobrać ze strony http://kernel.org/, źródła powinny być pobrane do katalogu /usr/src, można zrobić to w sposób następujący:
# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-{$LINUX_VERSION}.tar.bz2

Rozpakowywanie źródeł jądra

Po pobraniu źródeł powinniśmy je rozpakować, oraz przygotować się do kompilacji:
# tar xjf linux-{$LINUX_VERSION}.tar.bz2
# rm linux
# ln -s linux-{$LINUX_VERSION} linux
# cd /usr/src/linux

Przygotwanie do kompilacji jądra (opcjonalnie)

  • Nakładanie ewentualnych patchy na kernel
    # cd /usr/src/linux
    # bzip2 -dc /usr/src/patch-2.6.29.1-rc2.bz2 | patch -p1 --dry-run
    # bzip2 -dc /usr/src/patch-2.6.29.1-rc2.bz2 | patch -p1
    
  • Kopiowanie bazowego pliku kofniguracyjnego dla nowego jądra systemu (jeśli wersje jąder bardzo się różnią ten krok może nie zadziałać)
    # cp /boot/config-2.6.26-1-686 /usr/src/linux/.config
    

Konfiguracja jądra

make menuconfig

Kompilacja jądra oraz budowanie paczki *.deb

# make-kpkg clean
# fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Notatki:
  • Po opcji --append-to-version= można wprowadzić dowolną nazwę pozwalającą nam zidentyfikować jądro, która zaczyna się od znaku - i nie zawiera białych znaków (spacji).
  • Kompilację polecam uruchomić na screenie i zdetachować.
  • Jeśli kompilacja odbywa się ze wszystkimi dostępnymi modułami (config dystrybucyjny) to potrwa pewnie długo - spacer wydaje się być dobrą opcją.
  • Jeśli ktoś stworzył sobie kernel (np. tak: fakeroot make-kpkg --revision=-custom.1.0 kernel_image) bez initrd to może go zbudować później w ten sposób (ale tego nie obejmuje ten artykuł):
    # cd /boot/
    # mkinitrd -o /boot/initrd.img-{$LINUX_VERSION} {$LINUX_VERSION}
    

Instalacja paczki z nowym jądrem

Jeśli paczka z nowym jądrem jest już przygotowana, pozostaje tylko ją zainstalować.
# cd ../
# dpkg -i linux-image-2.6.29.1-custom_2.6.29.1-custom-10.00.Custom_i386.deb
# dpkg -i linux-headers-2.6.29.1-custom_2.6.29.1-custom-10.00.Custom_i386.deb

To wszystko - pora ponownie urochmić system

# shutdown -r now
Po uruchomieniu sprawdzamy wersję kernela:
$ uname -a
Linux pilum 2.6.29.1-custom #1 SMP Thu Apr 16 06:51:26 CEST 2009 i686 GNU/Linux

Problemy jakie się mogą pojawić

  • Czasami bootloader nie zostaje zaktualizowany, rozwiązaniem tego problemu może być edycja pliku /etc/kernel-img.conf oraz dodanie takiej linii:
    postinst_hook = /sbin/update-grub postrm_hook = /sbin/update-grub do_bootloader = no
    To zapewni, że komenda update-grub będzie uruchomiona zasze po instalacji nowego jądra z paczki.
  • Nie wszystkie moduły, które są w systemie zostały przekompilowane (np. moduły do maszyn wirtualnych, kamer internetowych - te niebędące włączone do głównej gałęzi jądra) użytkownik musi sam przekompilować.

9 Apr 2009

Operacje na plikach obrazów płyt w systemie Linux

Notatka: Większość tych informacji znalazłem na sieci i postanowiłem je umieścić w jednym miejscu, razem z przydatnymi odnośnikami. Cały artykuł powstał bo zapomniałem jak nazywa się program bchunk :(. Właściwie gdzieś już takie coś widziałem z tym, że po hiszpańsku chyba, więc pora na wersję polską.

Konwencja nazewnicza jest następująca

  • # - komendy poprzedzone takim znakiem muszą być wykonane z podwyższonymi prawami (roota)
  • $ - komendy poprzedzone takim znakiem mogą być wykonane przez zwykłego użytkownika
  • {} - argument niezbędny do poprawnego działania komendy
  • [] - argument opcjonalny
Skoro wszystko zostało już ustalone, pora przejść do opisywania rozwiązań

Konwersja/montowanie/przeglądanie plików

Pliki typu iso
Montowanie pliku typu iso w jakimś katalogu:
# mount -o loop,ro -t iso9660 {filename}.iso {mountpoint}
Wyświetlanie zawartości pliku iso bez potrzeby jego montowania:
$ isoinfo -f -i {filename}.iso
Konwersja plików typu BIN i CUE do ISO
Plików typu BIN i CUE nie można bezpośrednio zamontować pod systemem Linux (przynajmniej obecnie). Ale istnieją narzędzia pozwalające na konwersję plików w formacie BIN/CUE do formatu ISO i następnie je zamontować. Jednym z takich narzędzi jest bchunk (dostępny w repozytoriach Debiana).
$ bchunk {filename}.bin {filename}.cue {outputfilename}.iso
Istnieje również druga metoda, która pozwala na bezpośredni zamontowanie obrazu bin/cue przy użyciu CDEmu.
$ cdemu 0 {filename}.cue
$ mount -t iso9660,ro /dev/cdemu/0 {mountpoint}
Istnieje jeszcze program bin2iso - ale tutaj go nie opiszę, niemniej jednak można spróbować go użyć jeśli np do pliku BIN nie ma dołączonego pliku CUE. Jeżeli brakuje pliku CUE, można spróbować go stworzyć samemu (instrukcja wg. linuxtent.com):
  FILE "{filename}.bin" BINARY
  TRACK 01 MODE1/2352
  INDEX 01 00:00:00
  
podstawiając w miejsce {filename} odpowiednia nazwe pliku BIN. (Uwaga na cudzysłowy - Blogger je prawdopodobnie zamieni na znaki UTF8, więc dla własnego bezpieczeństwa polecam je również nadpisać). Z brakiem pliku CUE podobno też sobie radzi program Ultraiso - ale on jest pod Windowsa.
Konwersja/montowanie plików typu NRG (Nero Burning Rom) do ISO
Do konwersji plików NRG do formatu ISO służy narzędzie nrg2iso (jest w repozytorium Debiana).
$ nrg2iso {filename}.nrg {filename}.iso
Jeśli nie posiadamy np. dostępu do internetu istnieje możliwość zamontowania obrazu płyty w systemie Linux.
# mount -t iso9660 -o loop,offset=307200 {filename}.nrg {mountpoint}
Konwersja plików typu MDF i MDS do ISO
Do konwersji plików MDF i MSD na format ISO zostało stworzone narzędzie mdf2iso (znajduje się w repozytoriach Debiana).
$ mdf2iso {filename}.mdf {filename}.iso
Konwersja plików typu IMG do ISO
Obrazy IMG pochodzą np. z programu CloneCD do ich konwersji można wykorzytsać narzędzie: ccd2iso
$ ccd2iso imagen.img imagen.iso
Konwersja plików typu DAA do ISO
Pliki formatu DAA pochodzą z programu Poweriso, którego wersja istnieje także na Linuxa. Tak więc by dokonać konwersji na format ISO:
  1. Pobieramy program na Linuxa, rozpakowujemy go (tar -xvzf poweriso-*.tar.gz)
  2. Dokonujemy konwersji (będąc w katalogu gdzie mamy program Poweriso):
    $ ./poweriso convert {filename}.daa -o {filename}.iso

Podsumowując

Oto zbiór programów pozwalających na różne akcje na plikach obrazów płyt:
Nazwa programuObsługiwane formaty
bchunkBIN/CUE
nrg2isoNRG
mdf2isoMDF, MDS
ccd2isoIMG
cdemuBIN/CUE, CCD, CIF, C2D

Dodatkowe odnośniki

Jeśli się komuś chce, może dodać obsługę jakiegoś formatu do FUSE ja najczęściej spotykam się z formatem BIN/CUE - więc najbardziej by mi na nim zależało.

5 Apr 2009

DNS (Domain Name System) krótkie wprowadzenie

DNS to system serwerów oraz protokół komunikacyjny (działający w oparciu o UDP) zapewniający zamianę adresów symbolicznych (np. 0x1fff.com) znanych użytkownikom Internetu na adresy zrozumiałe dla urządzeń tworzących sieć komputerową (np. 192.168.0.1). Budowa systemu została opisana już w roku 1982 w dokumencie IETF-RFC819, natomiast dokumenty z roku 1983 RFC 882 i RFC 883 były oficjalną specyfikacją protokołu DNS, aż do roku 1989. Obecnie system DNS jest zdefiniowany, przez następujące RFC: RFC 1034, RFC 1035, RFC 1918 Żeby zacząć przygodę z DNS, wypadało by poznać jeszcze parę pojęć:
Co to jest FQDN? (za Wikipedią)
FQDN (ang. Fully Qualified Domain Name) - pol. pełna, jednoznaczna nazwa domenowa, określająca położenie danego węzła w systemie DNS. Składa się zwykle z nazwy hosta i co najmniej jednej domeny (etykiety) wyższego poziomu rozdzielonych symbolem "." i kończy się zawsze domeną najwyższego poziomu. Na przykład www.wikipedia.org jest pełną nazwą domenową: www oznacza hosta, wikipedia jest domeną drugiego poziomu, a .org domeną najwyższego poziomu.
W systemie DNS FQDN zawsze kończy się kropką, nazw bezwzględne kończą się kropką - jest bardzo ważne (np: ns1.0x1fff.com.).

Typy rekordów i ich przeznaczenie

By system DNS mógł działać, każda domena musi mieć swój serwer autorytatywny (master) dostarczający informacje o domenie. Serwer taki posiada rekord SOA - Start Of Authority Record - w którym są zapisane informacje techniczne o domenie.

Parametry rekordu SOA

  1. Numer seryjny domeny - jakakolwiek zmiana w konfiguracji domeny, powinna być poprzedzona zmianą numeru seryjnego (najczęściej wpisywana jest data zmiany)
  2. Czas życia (Time To Live) decyduje o tym, jak długo serwery cachujące mogą przetrzymywać informację o rekordach w swoich buforach
  3. Częstość odświeżania (refresh) decyduje o tym, jak często serwery dodatkowe będą sprawdzać, czy ich dane na temat strefy są aktualne.
  4. Częstość powtórek (retry) jeśli serwerowi dodatkowemu nie uda się skontaktować z serwerem podstawowym po czasie odświeżania, to próbuje co co czas określony w polu retry.
  5. Czas wygaśnięcia (expire) Jeśli serwerowi dodatkowemu nie uda się skontaktować z serwerem podstawowym przez czas wygaśnięcia, to zaczyna usuwać stare dane. Czas wygaśnięcia zawsze powinien być znacznie większy od częstości odświeżania i powtórek.
Przykład wykorzystania tych danych wygląda tak:
$TTL 64
0x1fff.com. IN SOA      batnet.pl. root.batnet.pl. (
                        2009032514      ; serial
                        8H              ; refresh
                        2H              ; retry
                        1W              ; expire
                        1D)             ; ttl

Najważniejsze typy rekordów DNS, oraz ich znaczenie

Rekordy serwerów nazw (ang. name server record - NS)
Rekordy NS pozwalają na mapowanie nazwy domenowej na listę serwerów DNS dla tej domeny. Wpis rekordu NS powinien zawierać adresy/nazwy serwerów, które obsługują domenę.
   IN  NS ns1.host.pl.
 
Rekordy adresów (ang. address record - A)
Rekordy A przypisują nazwom 32 bitowe adresy IPv4. Pierwsze pole wpisu zawsze jest rozwijane do FQDN, aby temu zapobiec należy dodać użyć bezwzględnego wpisu z kropką na końcu lub znakiem '@' (at).
 test IN A 127.0.0.1 ; to samo co niżej
 test.0x1fff.com. IN A 127.0.0.1 ; to samo co wyżej
 test.0x1fff.com@ IN A 127.0.0.1 ; to samo co wyżej
 test.0x1fff.com. IN A 192.168.0.1 ; i jeszcze to
 
Jest możliwość mapowania jednej nazwy na kilka adresów IP celem rozładowania obciążenia - algorytm miał być podobny do Round Robina, ale ze względu na specyfikę (rozproszoność, cachowanie) systemu DNS - średnio takie coś działa. Niemniej jednak, by uzyskać taką funkcjonalność należy wpisać różne rekordy A z taką samą nazwą, ale z różnymi adresami IP.
  IN A 192.168.0.1 ; wpis dla calej domeny 0x1fff.com => 192.168.0.1
 test IN A 192.168.0.1
 test IN A 192.168.0.2
 test.0x1fff.com. IN A 192.168.0.3
 
Rekordy adresów IPv6 (ang. IPv6 address record - AAAA)
Rekordy AAAA przypisują nazwom 128-bitowe adresy IPv6. Wpisy wyglądają i mają taka samą funkcjonalności jak w przypadku rekordu A, oraz również zezwalają na load balancing.
 testv6 IN AAAA 2001:db8::1428:57ab
 testv6.0x1fff.com. IN AAAA 2001:db8::1428:57ab  ; to samo co wyzej
 @  IN AAAA 2001:db8::1428:57ab ; dla głównej domeny
 
Rekordy aliasów (ang. canonical name record - CNAME)
Rekord CNAME pozwala na stworzenie aliasu nazwy domeny. Wszystkie wpisy DNS oraz pod domeny są poprawne także dla aliasu. Przykładem zastosowania rekordu typu CNAME, może być sytuacja w której rekord A "tp-link" wskazujący na adres IP 192.168.0.1, to kolejna nazwa (np. "router") wskazująca na ten sam aders IP powinna być rekordem CNAME wskazującym na istniejącą już nazwę. Inne przykłady zastosowania to:
  • jest wiele nazw domenowych dla tego samego adresu IP.
  • wskazywany rekord jest poza bieżącą strefą (np. przekierowanie usług na serwery Google) - tutaj trzeba pamiętać o kropce na końcu wpisu
  • jeśli wymagane jest przechwycenie wszystkich odwołań do strefy (rekord CNAME wieloznaczny)
  tp-link  IN A 192.168.0.1
  router  IN CNAME tp-link
  moj-router IN CNAME tp-link.0x1fff.com.
  *  IN CNAME  tp-link ; rekord wieloznaczny
 
Rekordy wymiany poczty (ang. mail exchange record - MX)
Rekordy MX służą do obsługi poczty, wpis rekordu składa się adresu komputera do którego poczta ma być kierowana, oraz tzw. liczby preferowanej - ustalającej priorytet w tym wypadku jest to kolejność łączenia się z serwerami poczty. Jeśli domena posiada kilka wpisów MX, domyślnym będzie ten z najniższą liczbą preferowaną.
   IN             MX      1       ASPMX.L.GOOGLE.COM.
   IN             MX      5       ALT1.ASPMX.L.GOOGLE.COM.
   IN             MX      5       ALT2.ASPMX.L.GOOGLE.COM.
   IN             MX      10      ASPMX2.GOOGLEMAIL.COM.
   IN             MX      10      ASPMX3.GOOGLEMAIL.COM.
   IN             MX      10      ASPMX4.GOOGLEMAIL.COM.
   IN             MX      10      ASPMX5.GOOGLEMAIL.COM.
 
Rekordy PTR (ang. pointer record)
Zamienia adres IPv4 lub IPv6 na nazwę kanoniczną hosta. Określenie rekordu PTR dla nazwy hosta (ang. hostname) w domenie in-addr.arpa (IPv4), bądź ip6.arpa (IPv6), który odpowiada adresowi IP, pozwala na dokonanie odwrotnej translacji adresów DNS (ang. reverse DNS lookup). By móc zmodyfikować strefę odwrotną trzeba mieć odpowiednie prawa. Jednemu adresowi IPv4 i IPv6 może być przypisana jedna nazwa kanoniczna (w przypadku innych rekordów nie ma takiego ograniczenia).
  130             IN      PTR     rev130.0x1fff.com.
  131             IN      PTR     rev131.0x1fff.com.
  132             IN      PTR     rev132.0x1fff.com.
  133             IN      PTR     rev133.0x1fff.com.
 
Rekordy (TXT) tekstowe
Rekordy TXT mogą służyć do dołączenia dowolnego tekstu i nazwy do rekordu DNS. Często są używane do zaimplementowania informacji o tym, które adresy z danej domeny mogą wysyłać pocztę (systemy antyspamowe - specyfikacja Sender Policy Framework).
  TXT     "v=spf1 ip4:195.82.172.129 ip4:195.82.172.28 a mx ~all"
 
Rekordy serwisów (ang. service record - SRV)
Zawierają dodatkowe informacje dotyczące usług, którą udostępnia serwer wskazywany przez adres DNS. Nazwy rekordów SRV powstają ze sklejenia nazwy usługi, protokołu (tcp lub udp) i nazwy domeny (w bieżącej strefie). Np. "_sip._tcp" dla rekordu SRV dla VoIP. Rekordy te sa powszechnie używane w usłudze Jabber.
  ; srvce.prot.name  ttl  class   rr  pri  weight port target
  _xmpp-server._tcp.0x1fff.com. IN SRV 5 0 5269 xmpp-server.l.google.com.
  _xmpp-server._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server1.l.google.com.
  _xmpp-server._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server2.l.google.com.
  _xmpp-server._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server3.l.google.com.
  _xmpp-server._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server4.l.google.com.
  _jabber._tcp.0x1fff.com. IN SRV 5 0 5269 xmpp-server.l.google.com.
  _jabber._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server1.l.google.com.
  _jabber._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server2.l.google.com.
  _jabber._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server3.l.google.com.
  _jabber._tcp.0x1fff.com. IN SRV 20 0 5269 xmpp-server4.l.google.com.
  _xmpp-client._tcp.0x1fff.com. IN SRV 5 0 5269 talk.l.google.com.
  _xmpp-client._tcp.0x1fff.com. IN SRV 20 0 5269 talk1.l.google.com.
  _xmpp-client._tcp.0x1fff.com. IN SRV 20 0 5269 talk2.l.google.com.
  _xmpp-client._tcp.0x1fff.com. IN SRV 20 0 5269 talk3.l.google.com.
  _xmpp-client._tcp.0x1fff.com. IN SRV 20 0 5269 talk4.l.google.com.
 
Inne typy rekordów w systemie DNS
To był opis najczęściej używanych typów rekordów DNS - by uzyskać więcej informacji, np. o tym jak działa cały system, jak przetwarzane są zapytania itp. polecam zajrzeć do referencji umieszczonych na dole artykułu.
Oprócz tych ustawień serwer BIND posiada plik konfiguracyjny w którym podaje się jakie domeny są hostowane, oraz jakie inne hosty mogą ją transferować całą jej zawartość. Zwykle te komputery to dodatkowe serwery DNS dla strefy. W celu ochrony lista ta nie powinna być za duża, przykładowy plik do włączenia strefy wygląda następująco:
 zone "0x1fff.com" {
  type master;
  file "master/0x1fff.com";
  allow-update { none; };
  allow-query { any; };
  allow-transfer { 193.111.27.194; 194.145.96.21;  };
 };
 

Rodzaje odpowiedzi na zapytania DNS

autorytatywne
dotyczące domeny w strefie, nad którą dany serwer DNS ma zarząd, pochodzą one bezpośrednio z bazy danych serwera
nieautorytatywne
dane które zwraca serwer pochodzą spoza zarządzanej przez niego strefy (np. serwer cachujący)

Narzędzia przydatne podczas testowania usług DNS

Darmowe serwery DNS

Więcej informacji

W sumie ostatnio koledze coś konfigurowałem z domeną graniec.pl i powiem, że zostałem pozytywnie zaskoczony szybkością reakcji serwisu u którego domena była wykupiona (domenyonline.pl), więc właśnie dlatego podlinkuje do nich.