Dziękujemy za zainteresowanie się PLD Linux Distribution!
W tym rozdziale przedstawione zostaną różne aspekty dotyczące projektu PLD, takie jak jego historia, cele, model rozwoju, itp.
Aby jak najlepiej zrozumieć i przyswoić informacje zawarte w tym podręczniku, warto zapoznać się wpierw z użytymi konwencjami.
$ komenda |
W ten sposób opisywane są komendy, które wykonać możemy z uprawnieniami użytkownika.
# komenda |
Tutaj natomiast przedstawiona została komenda, którą należy wykonać z poziomu użytkownika root, czyli administratora.
Zbyt długie linie zrzutów ekranowych, które nie mieszczą się w jednej linii, podzielone są przy pomocy znaku \. Czyli:
# komenda z_bardzo_\ długim_parametrem |
należy zinterpretować jako:
# komenda z_bardzo_długim_parametrem |
W dokumentacji dosyć często korzysta się z następującej konstrukcji:
{$zmienna} |
Tak oznaczane są miejsca, w których użytkownik może lub musi samodzielnie dokonać wyboru i wstawić w miejsce ciągu znaków {$zmienna} odpowiednią wartość.
Niejdnokrotnie w nazwach plików pojawia się znak "gwiazdki", który należy odczytywać podobnie jak robi to powłoka (shell), a więc zastępuje dowolny ciąg znaków, przykładowo:
/katalog/plik.* |
Celem tego podręcznika jest pomoc w zainstalowaniu PLD Linux Distribution na Twojej maszynie. Nie jest to i nigdy nie będzie zamiennik dokumentacji systemowej. Jeśli będzie to Twoja pierwsza instalacja Linuksa, gorąco zachęcamy Cię do przeczytania wpierw tego podręcznika. Nawet jeśli jesteś doświadczonym użytkownikiem, warto przestudiować instrukcje dotyczące instalacji, aby upewnić się, że wszystko pójdzie gładko.
Oprócz niniejszej dokumentacji możemy szukać pomocy w wielu innych miejscach. Prężnie działają listy dyskusyjne oraz oficjalne kanały IRC (#PLD i #PLDhelp). Na często zadawane pytania (FAQ) odpowiedzi można znaleźć na głównej stronie WWW.
Jeśli uważasz, że dokumentacja jest niepełna,
znalazłeś błędy, lub chciałbyś do nas dołączyć prosimy
o wysłanie informacji na listę dyskusyjną
<pld-doc@pld-linux.org>
lub o kontakt z jednym z
autorów dokumentacji, których listę zamieszczono w
sekcja Autorzy dokumentacji PLD w rozdział O podręczniku
Wraz ze wzrostem zainteresowania Linuksem w Polsce, rosły naciski na stworzenie polskiej dystrybucji tego systemu. Niemal wszyscy jej chcieli, a niektórzy nawet mówili, że już takową robią. Nic jednak z tego nie wynikało. Wreszcie, w lipcu 1998, zawiązał się projekt mający na celu stworzenie polskiej dystrybucji Linuxa. Projekt PLD, czyli Polish(ed) Linux Distribution, był na tyle dobrze zorganizowany, by przetrwać trudne początki. Nie obeszło się oczywiście bez burzliwych dyskusji na temat kształtu dystrybucji, doboru oprogramowania jak również wersji jądra, na której projekt ma być rozwijany. W efekcie zdecydowano się prowadzić równolegle dwa projekty. Pierwszy został nazwany PLD-devel i był forpocztą dla obecnego PLD-stable. Prace nad 1.1 PLD (devel) koordynowali przede wszystkim Wojtek Ślusarczyk, Marcin Korzonek i Arek Miśkiewicz. Miała to być pierwsza dystrybucja Linuxa zgodna z nowym, promowanym przez OpenGroup, standardem - Unix98. Równolegle druga grupa, na czele z Tomkiem Kłoczko i Arturem Frysiakiem, pracowała nad podwalinami właściwej PLD-stable.
Nieco później, przede wszystkim z braku wolnego czasu z prac nad projektem wycofali się Wojtek Ślusarczyk, Andrzej Nakonieczny oraz Marcin Korzonek. Tomasz Kłoczko postanowił kontynuować prace nad PLD, gromadząc wokół siebie coraz to większą liczbę developerów. Pojawiła się domena pld.org.pl, a wraz z nią liczne adresy "funkcjonalne", takie jak ftp.pld.org.pl, www.pld.org.pl czy cvs.pld.org.pl. Ruch na listach mailingowych stawał się coraz większy, widać było, iż projekt zyskiwał na popularności.
22 listopada 2002 roku światło dzienne ujrzała pierwsza stabilna wersja dystrybucji PLD Linux Distribution 1.0 (Ra). Jeszcze w czasie jej stabilizacji rozpoczęły się prace nad kolejną wersją.
Twórcy projektu zakładali uniwersalność PLD, która pozwalałaby na korzystanie z dystrybucji przez użytkowników z całego świata, jednak pojawiły się obawy, że nazwa Polish(ed) Linux Distribution odstraszy potencjalnych odbiorców z innych krajów. Postanowiono, że zmieniona zostanie nazwa projektu. Pozostawiono charakterystyczny skrót "PLD" w niezmienionej postaci, zmieniono zaś jego rozwinięcie - nazwa "PLD" stała się rekurencyjnym skrótem od PLD Linux Distribution.
Pierwszego kwietnia 2007 roku wydana została wersja Ac, długi okres rozwoju przyzwyczaił użytkowników do nieustających aktualizacji oprogramowania. Taki model rozwoju dystrybucji okazał się na tyle wygodny, że postanowiono by kolejne wydanie miały być rozwijane bez końca. Oznacza to, że na razie nie są planowane żadne kolejne wydania, a do stabilnej gałęzi pakietów nieprzerwanie trafiają aktualizacje.
PLD-Linux jest dystrybucją rozwijaną głównie w Polsce. Jest to produkt grupy entuzjastów Linuksa chcącej stworzyć system operacyjny dopasowany do własnych potrzeb. Aktualnie rozwojem dystrybucji interesuje się około 200 osób, z pośród nich najbardziej aktywna jest grupa 50 deweloperów.
PLD jest jednym z najaktywniejszych projektów Open Source na świecie. Dzięki temu powstała jedna z największych dystrybucji Linuksa, w trakcie prac nad drugą wersją systemu (Ac) ilość dostępnych pakietów zbliżyła się do trzynastu tysięcy.
Jedną z największych bolączek administratorów jest chroniczny brak czasu, dlatego bardzo istotne jest zminimalizowanie nakładu pracy przy codziennych zajęciach administracyjnych. Mając to na uwadze, stworzono dystrybucję, która zapewnia wysokie bezpieczeństwo i łatwość administracji. PLD jest tak projektowane by w możliwie najkrótszym czasie uruchomić bezpieczny, wydajny i łatwy w zarządzaniu system produkcyjny. Założono, że administrator nie może tracić czasu na kompilację jądra, programów czy też pisania rc-skryptów.
PLD jest uniwersalną i elastyczną dystrybucją, dzięki czemu sprawdzi się w różnorodnych zastosowaniach. Przy jej tworzeniu, główny nacisk jest jednak kładziony na niezawodne działanie usług. Utarło się nawet powiedzenie, że PLD jest dystrybucją tworzoną przez administratorów dla administratorów, mamy więc do czynienia z systemem dobrze przygotowanym do pracy w roli serwera.
Nie oznacza to bynajmniej, że PLD nie nadaje się na system dla stacji roboczej, doskonale sprawdza się również w tym zastosowaniu. Zwykły użytkownik nie znajdzie tu wielu ułatwiających życie początkującym narzędzi, aby używać PLD konieczna jest solidna porcja wiedzy. Mamy nadzieję, że niniejszy podręcznik będzie pomocny w jej zdobyciu.
Poniżej przedstawiono zestawienie najciekawszych cech systemu.
w systemie dostępne są silnie zmodularyzowane jądra, dzięki czemu w ogromnej większości wypadków nie trzeba go kompilować na nowo; wystarczy wybrać właściwy kernel i załadować potrzebne moduły
w PLD zastosowano skrypty startowe (rc-skrypty) typu System-V, Pozwoliło to na maksymalne zautomatyzowanie procesu instalacji usług systemowych.
podobną koncepcją do rc-inetd kierowano się w tworzeniu pakietu rc-boot, pozwala on na łatwe zarządzania bootloaderami
używanie FHS 2.x jako specyfikacji struktury katalogów
całkowite odejście od termcap i libtermcap (w PLD nie ma pakietu z libtermcap i samego termcapa; ani jeden pakiet nie jest związany z termcapem)
uporządkowane rozmieszczenia plików w gałęzi /usr - żaden pakiet dystrybucyjny nie umieszcza plików w katalogach wewnątrz /usr/local
domyślne jądro zawiera grsecurity
restrykcyjne uprawnienia dla użytkowników
przystosowanie do łatwego przejścia systemu na alternatywne metody autoryzacji (i -- w zależności od potrzeb -- szyfrowania) komunikacji po sieci, jak PAM, czy GSAPI, TSL/SSL... Jest bardzo prawdopodobne, że już w niedługiej perspektywie dużą rolę zacznie tu odgrywać SASL. W praktyce owo łatwe dostosowywanie do np. kerberyzacji systemu jest realizowane także z użyciem rc-inetd, która to platforma ułatwia znakomicie podmianę różnych serwisów na wersje skerberyzowane czy też wykorzystujące inne mechanizmy jak np. socks5 (tutaj jeszcze jest mało zrobione, ale furtka jest szeroko i jednoznacznie otwarta)
mechanizm sys-chroot ułatwiający zarządzanie środowiskami typu chroot oraz dobre wsparcie dla środowisk Linux VServer
PLD posiada najlepszą obsługę przyszłościowego protokołu IPv6 z pośród innych dystrybucji Linuksa.
używanie iproute2 jako podstawowego narzędzia do operowania na interfejsach sieciowych, dzięki czemu np. skrypty startowe z PLD są prostsze i krótsze mimo większej funkcjonalności w stosunku do swoich odpowiedników z RH; inną zaletą jest wsteczna kompatybilność z opisem interfejsów sieciowych z tym, co jest stosowane w initscripts z RH; kolejną cechą skryptów startowych jest to, że -- w zależności od preferencji użytkownika -- mogą one wyświetlać wszystkie komunikaty po polsku
PLD zawiera rc-inetd - interfejs do zarządzania usługami typu inetd. Pozwala zarządzać takimi usługami (np.: telnetd, cvs-pserver) bez znaczenia jakiego typu demon inetd jest używany
PLD zawiera ogromne ilości gotowych, binarnych pakietów; pozwala to uniknąć instalacji oprogramowania spoza dystrybucji
w dystrybucji używane są pakiety typu RPM, do zarządzania nimi stworzono program o swojsko brzmiącej nazwie Poldek, można też używać klasycznego programu RPM
możliwość samodzielnego budowania pakietów RPM pozwoli na łatwe skompilowanie pakietu z nietypową funkcjonalnością
znaczna liczba programów podzielona jest na mniejsze pakiety, pozwalające instalować tylko te elementy systemu, które są akurat potrzebne
pakiety często są wstępnie skonfigurowane i gotowe do działania, ponadto nakładane są na nie istotne łaty
w PLD nie są faworyzowane żadne z usług czy programów. To czego używamy zależy tylko od nas
pełne przygotowanie pakietów do automatycznego uaktualnienia. Pakiety z RH kompletnie nie są na to przygotowane. Przygotowanie to wiąże się z restartowaniem serwisów przy ich uaktualnieniu, odpowiednim przygotowywaniem procedur uaktualnienia w taki sposób, by umożliwić automatyczną aktualizację nawet przy zmianie plików konfiguracyjnych
kompresowanie wszystkich plików dokumentacji z użyciem gzip (bzip2 nic w praktyce tu nie wnosi, a dostarcza tylko nowych kłopotów, czego doświadczają od czasu do czasu użytkownicy Mandrake)
separacja bibliotek statycznych w osobne podpakiety {$nazwa}-static (nie każdy tego potrzebuje), a nagłówków do {$nazwa}-devel
uzupełnianie opisów pakietów i dokumentacji w różnych językach. W dużej części robi się to niejako przy okazji. Użytkownik może sobie skonfigurować i zainstalować wybrane oprogramowanie ze wsparciem dla preferowanego zestawu języków, np.: angielski i niemiecki czy też angielski i polski (zasoby dla innych języków zostaną pominięte). Tak unikalną możliwość konfiguracji osiągamy dzięki konsekwentnemu oznaczaniu zasobów narodowych makrem %lang() w poszczególnych pakietach
PLD jest systemem przyjaznym dla programisty. Dostępne są narzędzia do tworzenia aplikacji w wielu językach programowania. Dotyczy wielu "standardowych" języków programowania takich jak C, C++, Perl czy Python. Dostępne są też kompilatory do nieco mniej znanych języków takich jak SML, Prolog, OCaml jak też eksperymentalne kompilatory: Cyclone, Ksi. Dodatkowo mamy wybór wielu narzędzi programistycznych i bibliotek.
maksymalna automatyzacja różnych powtarzalnych czynności (dotyczy to zarówno metodologii bieżącej pracy jak i zawartości pakietów)
dystrybucja jest przystosowana do obsługi wielu języków narodowych, a w tym języka polskiego. Jest to najlepiej przygotowana dystrybucja na potrzeby polskich użytkowników
brak nałożonych z góry ograniczeń co do zestawu pakietów, jakie mogą być w dystrybucji. W praktyce oznacza to, że użytkownik ma do dyspozycji wszystko, co udało się nam zebrać, Jeżeli coś zostanie opracowane i przystosowane do tego, żeby mogło współgrać z resztą pakietów, to znaczy, że komuś było potrzebne, więc może komuś przydać się w przyszłości
W PLD wersjom dystrybucji nadawane numery oraz dwuliterowe oznaczenia kodowe, które pochodzą od skrótowych oznaczeń pierwiastków. Pierwszej wersji PLD nadano oznaczenie Ra (Rad), zaś kolejne odpowiadają nazwom pierwiastków poukładanych zgodnie z kolejnością określoną przez ich liczbę atomową. Aktualnie mmy trzy oficjalne wydania: Ra, Ac, Th, jest też nieoficjalny fork Titanium prowadzony przez jednego z deweloperów.
Rozwój PLD Linux Distribution przebiega w sposób otwarty i elastyczny. Efekt końcowy to wynik nakładu wielu osób, nie tylko developerów posiadających prawo zapisu do repozytorium CVS (o którym poniżej), ale także użytkowników zgłaszających informacje o błędach lub nadsyłających poprawki lub propozycje zmian. Z chęcią przyjmiemy nowych developerów, a osoby chcące być bardziej związane z projektem powinny zapisać się na listę dyskusyjną developerów pld-devel-pl@lists.pld-linux.org.
Informacje o PLD i sposobie jego rozwoju:
Repozytorium CVS
Źródła PLD Linux Distribution trzymane są w repozytorium CVS (Concurrent Versions System, http://www.cyclic.com/CVS/index.html), wolnodostępnym systemie kontroli wersji dostarczanym wraz z naszą dystrybucją. Serwer CVS PLD Linux Distribution (http://cvs.pld-linux.org/) jest dostępny dla wszystkich w trybie tylko dla odczytu (Read Only), oraz dodatkowo w trybie do odczytu/zapisu (Read/Write) dla developerów. Repozytorium zostało podzielone na kilka modułów w celu ułatwienia pracy osobom doń commitującym (określenie commit pochodzi z podręcznika systemowego cvs).
Serwer DistFiles
W zamierzchłych czasach wszystkie pliki (a więc kody źródłowe, łatki (patche), poprawki, itp) potrzebne do zbudowania pakietów trzymane były w repozytorium. Niestety CVS nie został zaprojektowany do przechowywania plików binarnych (a archiwum tar.gz takim jest) i próba zmuszenia go do przechowywania takowych dostarczała różnych problemów. A to osoba posiadające stosunkowo wolne łącze zaczęła wrzucać kilkudziesięcio megabajtowy plik, skutecznie blokując możliwość pracy innym developerom na kilka godzin. Uciążliwe były też pozostające tzw. 'locki', czyli blokady na modułach repozytorium (przede wszystkim SOURCES/). Rozwiązaniem tych problemów było wprowadzenie w maju 2003 roku serwera DistFiles, do którego przeniesiono większość plików binarnych z CVS.
Core Developers Group
Gdyby PLD Linux Distribution było firmą, Core Developers Group najtrafniej można by określić jako Radę Nadzorczą. Jej celem jest podejmowanie w sposób demokratyczny krytycznych dla dystrybucji decyzji oraz rozwiązywanie konfliktów, których nie dało się zażegnać w inny sposób. W skład Grupy wchodzą developerzy aktywnie udzielający się w projekcie.
Lista dyskusyjna pld-devel-pl@lists.pld-linux.org
Na liście tej prowadzone są dyskusje na temat bieżących prac nad dystrybucją, jak również ustalane są plany na przyszłość. Jeśli nie posiadasz prawa zapisu do repozytorium, a chciałbyś podzielić się efektami swych prac z innymi, lista ta jest najlepszym miejscem na poinformowanie o tym fakcie.
Buildery
Mianem builderów określane są specjalnie przygotowane środowiska (często na dedykowanych maszynach), na których budowane są pakiety, które później zostaną umieszczone na serwerach FTP projektu. Każda z linii dystrybucji ma swoje oddzielne buildery, stworzone z pakietów dla niej przeznaczonych.
Nie wszyscy developerzy mają prawo do puszczania zleceń na buildery, czyli rozkazów zbudowania poszczególnych pakietów - przywiliej ten ma ledwie garstka osób, zaznajomionych z automatyką oraz znających potrzeby danej dystrybucji. Rzadko kiedy zachodzi potrzeba bezpośredniego grzebania w strukturze danego środowiska - codzienna praca opiera się na wysyłaniu odpowiednio przygotowanych maili, podpisanych kluczem PGP osoby uprawnionej.
Rescue CD
Jest to niewielka dystrybucja startująca z płyty CD, bez konieczności instalacji na twardym dysku. Zawiera zestaw wyspecjalizowanych narzędzi pomocnych w przypadku usuwania awarii systemu. Rescue CD oparto o jądro PLD i wyposażono w zestaw najbardziej niezbędnych programów, dzięki czemu udało się uzyskać niewielkie rozmiary dystrybucji. Pozwala to załadowanie całości do pamięci operacyjnej, a następnie a wyjęcie płyty CD z czytnika. Lista dostępnych programów jest umieszczona na domowej stronie WWW projektu.
PLD Live CD http://livecd.pl/
Pierwszy, oparty o PLD Ac projekt, mający na celu stworzenie kompletnej dystrybucji Linuksa startującej z płyty CD, zawiera znaczną ilość narzędzi i programów użytkowych. PLD Live jest przygotowane dla zwykłych użytkowników chcących bliżej poznać PLD, zawiera system X Window i liczne programy użytkowe. Z założenia w PLD Live dokonywano jak najmniej zmian w stosunku do bazowej dystrybucji.
PLD Live.th http://livecd.pld-linux.org
Wersja Live zbudowana na bazie Th i środowiska GNOME
PLD-Linux LiveCD http://kde4.livecd.pld-linux.org/index.php
Wersja Live zbudowana na bazie Titanium i środowiska KDE
Strona główna - http://pld-linux.org
Dokumentacja - http://pl.docs.pld-linux.org
Listy dyskusyjne - http://lists.pld-linux.org
Częściowe archiwa list dyskusyjnych - mail-archive.com, Gmane
Serwer IRC (freenode) http://irc.freenode.net
Serwer IRC (IRCnet) http://ircnet.org
Serwer PLDNet: irc.pld-linux.org
Istniejące kanały:
#pld - kanał przeznaczony dla Developerów.
#pldhelp - kanał użytkowników PLD
#pldlivecd - kanał użytkowników LiveCD
Kanały w powyższych sieciach są połączone za pomocą specjalnego bota. Przydatny w takich przypadkach może być skrypt do programu irssi znajdujący się na stronie http://vorlon.icpnet.pl/~agaran/forwardfix.pl lub w zasobach poldka (poldek -i irssi-script-forwardfix), który ma zadanie przekazywać wiadomości między sieciami.
System zgłaszania błędów - http://bugs.pld-linux.org
Rescue CD - http://rescuecd.pld-linux.org
PLD Live CD - http://livecd.pld-linux.org
Obrazy ISO są katalogowane wg. schematu {$serwer}/{$wersja}/{$arch} np.: ftp.iso.pld-linux.org/2.0/i586. Wersje systemu szerzej opisano w sekcja Oficjalne wersje PLD w rozdział Wprowadzenie, zaś architektury w sekcja Architektury pakietów w rozdział Zarządzanie pakietami.
Dla każdego z obrazów ISO dostępna jest suma MD5, umieszczona w pliku o rozszerzeniu md5. Dzięki niej będziemy mogli sprawdzić przed nagraniem czy pobrany obraz nie zawiera żadnych zmian. Do obliczenia skrótów MD5 w pod systemami uniksowymi posłużymy się programem md5sum, zaś w systemach Microsoftu użyjemy dostępnego na serwerze programu md5sum.exe.
Serwery FTP z obrazami ISO:
TASK, Gdańsk, Polska - ftp://ftp.iso.pld-linux.org
Pakiety są katalogowane wg. schematu {$serwer}/dists/{$wersja}/{$źródło}/{$arch} np.: ftp.pld-linux.org/dists/2.0/PLD/i586/. Wersje systemu szerzej opisano w sekcja Oficjalne wersje PLD w rozdział Wprowadzenie, źródła w sekcja Źródła pakietów w rozdział Zarządzanie pakietami, zaś architektury w sekcja Architektury pakietów w rozdział Zarządzanie pakietami.
PLD możemy zainstalować z sieci za pomocą protokołu FTP, HTTP lub RSYNC. Pakiety możemy pobierać z głównego serwera PLD lub z jednego z wielu lustrzanych.
FUH KERNEL, VNET.sk, Bratysława, Słowacja - ftp://ftp.pld-linux.org/ , ftp://ftp.sk.pld-linux.org/ ,
Gdańsk, Polska - ftp://ftp2.pld-linux.org/
Uniwersytet Kardynała Stefana Wyszyńskiego, Polska - ftp://ftp3.pld-linux.org/ , ftp://ftp.csi.pld-linux.org/
ATM S.A., Warszawa, Polska - ftp://ftp4.pld-linux.org/ , ftp://ftp.atm.pld-linux.org/
Uniwersytet Warszawski, Wydział Prawa i Administracji, Polska - ftp://ftp5.pld-linux.org/ , ftp://ftp.wpia.pld-linux.org/
TASK, Gdańsk, Polska - ftp://ftp6.pld-linux.org/ , ftp://ftp.task.pld-linux.org/
Politechnika Wrocławska, Polska - ftp://ftp.pwr.wroc.pl/pld/
ICM, Polska - ftp://ftp.icm.edu.pl/pub/linux/distributions/pld-linux/
Bratysława, Słowacja - ftp://spirit.bentel.sk/mirrors/PLD
Gdańsk, Polska - http://ftp2.pld-linux.org/
ATM S.A., Warszawa, Polska - http://ftp4.pld-linux.org/
TASK, Gdańsk, Polska - http://ftp.task.pld-linux.org/
Bratysława, Słowacja - http://spirit.bentel.sk/PLD/
Osoby zainteresowane udostępnianiem serwera lustrzanego przy
pomocy protokołu RSYNC proszone są o kontakt z nami w celu
uzyskania szczegółowych informacji:
<feedback@pld-linux.org>
Pomysł na nasze logo zrodził się w głowie Agnieszki Sloty. Projekt graficzny został stworzony przez Marcina Mierzejewskiego (Kevin) i Maćka Zielińskiego.
Może być używane tylko wtedy, gdy:
produkt z logiem jest używany zgodnie z udokumentowanymi na www.pld-linux.org zasadami (na przykład oficjalne płyty CD)
uzyskają aprobatę PLD Linuksa do używania loga w określonych celach
Część całkowitego produktu uznana jest oficjalnie za należącą do PLD (tak jak jest to opisane w punkcie pierwszym) i jeśli posiada wyraźnie zaznaczone informacje, że tylko ta cześć została zatwierdzona
Zastrzegamy sobie prawo do unieważnienia i modyfikacji licencji dla danego produktu
Pozwolenie na używanie oficjalnego loga zostało przyznane dla wszelkiego typu odzieży (t-shirty, czapki, itd) ale pod warunkiem, że są one wykonywane przez developerów PLD i nie są sprzedawane dla zysku.
Wyjaśnienie: Licencja "zapożyczona" z Debiana.
Powered by PLD Linux
To logo i jego zmodyfikowane wersje mogą być zamieszczane dla podkreślenia poparcia dla projektu, lecz nie oznacza ono, że dany produkt jest częścią projektu.
Przypomnienie: docenimy jeśli dodasz do obrazka link wskazujący na www.pld-linux.org i umieścisz go na swojej stronie.
To logo i jego zmodyfikowane wersje mogą być zamieszczane dla podkreślenia poparcia dla projektu, lecz nie oznacza ono, że dany produkt jest częścią projektu.
Przypomnienie: docenimy jeśli dodasz do obrazka link wskazujący na www.pld-linux.org i umieścisz go na swojej stronie.
Pod tym adresem http://www.inf.sgsp.edu.pl/pub/MALUNKI/PLD/ Karol Kreński "Mimooh" umieścił sporą galerię obrazków związanych z PLD Linux Distribution
Ten rozdział prezentuje instalację systemu.
Minimalne wymagania w przypadku architektury x86:
procesor minimum klasy 386
16 MB pamięci RAM (ze swapem przynajmniej 32MB)
50MB wolnego miejsca na dysku twardym
napęd CD-ROM lub stacja dyskietek 3,5 cala
Nośniki na których umieszczany jest instalator:
Główna płyta CD (base iso)
Jest to pierwsza z pełnych płyt CD, wystarcza do zainstalowania najważniejszych pakietów, aby zainstalować całość dystrybucji musisz zaopatrzyć się w pozostałe płyty. Lista serwerów z których pobierzemy obrazy ISO znajduje się w sekcja Źródła obrazów ISO w rozdział Zasoby sieciowe PLD.
Płyta MINI-ISO
Miniaturowa wersja dystrybucji przystosowana do nagrania płyty typu MINI-CD (płyty o średnicy 8cm). Zawiera najbardziej podstawowe pakiety. Lista serwerów z których pobierzemy obraz MINI-ISO znajduje się w sekcja Źródła obrazów ISO w rozdział Zasoby sieciowe PLD.
Dyskietki
Mamy do dyspozycji kilka dyskietek zawierających instalator lub dodatkowe moduły jądra. Oprócz nich konieczne będzie jeszcze jakieś źródło pakietów (sieć/CD-ROM/dysk twardy).
Główne obrazy dyskietek (bootdisk_cd.img, bootdisk_net.img, bootdisk_pcmcia.img) obsługują jedynie najpowszechniej używany sprzęt, jeśli nasz nie jest obsługiwany, to instalator poprosi o jedną z dodatkowych dyskietek z modułami jądra. Z tego względu na wszelki wypadek można pobrać pliki o nazwie addons{$numer}.img
Obraz dyskietki i resztę pakietów możemy pobrać z głównego serwera lub jednego z serwerów lustrzanych, listę adresów znajdziemy w sekcja Serwery z pakietami w rozdział Zasoby sieciowe PLD. Przykładowo użyjemy adresu: ftp.pld-linux.org/dists/{$wersja_PLD}/PLD/{$arch}/PLD/images/ ({$wersja_PLD} to interesująca nas wersja PLD zaś {$arch} oznacza architekturę procesora). Dostępne są obrazy dyskietek dla następujących architektur: i386, i586, i686 oraz athlon.
Jeżeli masz wystarczająco szybkie łącze możesz zainstalować system z sieci. W tym procesie mamy do wyboru instalację pakietów przy pomocy protokołów: FTP, HTTP lub NFS.
Możemy użyć MINI-ISO, pierwszej płyty instalacyjnej lub dyskietki. W przypadku dyskietki musimy użyć obrazu bootdisk_net.img lub bootdisk_pcmcia.img (urządzenia sieciowe PCMCIA).
Możemy też zainstalować rdzeń systemu z MINI-ISO lub pierwszej płyty instalacyjnej, a następnie kontynuować proces instalacji za pośrednictwem sieci z działającego już systemu.
Używamy w tym celu pierwszej z pełnych płyt CD (base) lub wszystkich dostępnych obrazów.
Jeśli BIOS naszej maszyny nie potrafi uruchamiać systemu operacyjnego z płyty CD, musimy wspomóc się dyskietką i obrazem bootdisk_cd.img. Po uruchomieniu instalatora z dyskietki jako źródło pakietów wybieramy CD-ROM.
Istnieje możliwość instalacji z lokalnego dysku twardego, użyjemy do tego obrazu dyskietki bootdisk_cd.img. Musimy jeszcze przegrać zawartość obrazu płyty CD do katalogu na jednej z partycji dyskowych.
Pobrane z internetu obrazy dyskietki nagrywamy poleceniem
# dd if=bootdisk.img of=/dev/fd0 |
lub przy pomocy programu rawrite.exe pod systemem Windows/DOS. Program rawrite.exe możemy pobrac przykładowo z ftp.pld-linux.org/dists/{$wersja_PLD}/PLD/{$arch}/PLD/dosutils/.
PLD jest przygotowane dla wielu architektur sprzętowych, zanim więc przystąpisz do instalacji upewnij się że wybierzesz właściwą wersję. Więcej na ten temat można znaleźć w sekcja Architektury pakietów w rozdział Zarządzanie pakietami
Jeżeli pierwszy raz instalujesz Linuksa, lub jesteś bardzo początkującym użytkownikiem warto abyś wiedział kilka rzeczy. Na początek zapoznaj się ze sposobem oznaczania dysków i partycji opisanych dokładniej w sekcja Nazewnictwo urządzeń masowych w rozdział Pamięci masowe
Kiedy już zaopatrzymy się we właściwy nośnik, uruchamiamy komputer i czekamy na pojawienie się ekranu instalatora. Zaczniemy od poznania sposobu poruszania się po instalatorze, do przesuwania/przewijania tekstu bądź opcji używasz "strzałek" na klawiaturze, wybór akceptujesz klawiszem ENTER. Klawiszem TAB poruszasz się pomiędzy opcjami instalatora.
Widząc standardowy ekran zgłoszeniowy naciskamy ENTER i czekamy aż uruchomi się instalator. Wybieramy język - w naszym przypadku polski. Przeczytawszy krótkie wprowadzenie jesteśmy w instalatorze.
Teraz pojawiło nam się menu, w którym mamy do wyboru sposoby instalacji. Jeżeli posiadasz większą niż podstawową wiedzę nt. linuksa możesz wybrać "Standartowe UI", gdzie większość opcji umieszczona jest na jednym przejrzystym ekranie. Także kolejne opcje pozwolą ustawić partycje, wybrać pakiety, prekonfigurować system oraz ustawić bootmanagera. Do edycji partycji mamy do wyboru program fdisk lub parted.
My wybieramy jednak opcję "Automagiczny Instalator", który sam przeprowadzi nas gładko przez proces instalacji.
Doszliśmy do momentu gdzie musimy ustawić parametry źródła, skąd będzie instalował się system. Jeżeli korzystamy z bootkietek musimy dobrać odpowiednią w stosunku do źródła z którego będziemy pobierali pakiety.
Powyżej widzimy ekran wyboru źródła ,ja wybrałem instalację z sieci, jednak instalacja z płyty cd, dysku twardego czy nfs-u nie będzie znacząco się różniła.
Następnie wybieram serwer ftp/http z którego chcę instalować system, oraz ścieżkę do źródeł. Jeżeli masz w pobliżu jakiś mirror pld możesz skorzystać z niego, zamiast oficjalnego serwera.
Kolejne dwa ekrany to konfiguracja karty oraz połączenia sieciowego. Wybrane parametry zależą od posiadanego sprzętu i topologii sieci, wiec nie ma co nad tym się rozwodzić.
Jeżeli instalujesz system z płytek musisz zaopatrzyć się albo w miniiso, albo przynajmniej w pierwszą (base) płytkę.
W menu wyboru źródła wybieramy cdrom. Nie jest ważne czy instalujemy cały system z płytek, czy tylko miniiso.
Teraz możemy wybrać urządzenie, które służy w naszym systemie jako cdrom. System powinien znaleźć i zaznaczyć istniejący w systemie napęd, jednak jeżeli mamy więcej niż jeden to tutaj należy zaznaczyć w którym znajduje się płytka instalacyjna. Możesz także ustawić katalog w którym znajdują się pakiety, jednak jeżeli używasz oficjalnych płytek nie należy nic tutaj zmieniać.
Możesz teraz przejść do kolejnego kroku, czyli ustawień partycji.
Nadszedł czas na konfigurowanie partycji. Możemy wybrać proponowane przez instalator ustawienia albo skorzystać z bardzo przyjemnego narzędzia o nazwie parted. Jako, że na dysku możemy mieć inny system (Windows) lepiej dla bezpieczeństwa ustawić partycje ręcznie.
Wybierając opcję "ustaw partycje ręcznie" przechodzimy do parted
Interfejs jak widać jest bardzo prosty i intuicyjny. Jeżeli mamy jakieś wolne miejsce możemy utworzyć nową partycje, stworzyć macierz RAID, albo przeedytować istniejącą już partycję. UWAGA! Jeżeli posiadasz nowy sprzęt, możesz mieć problemy z instalacją systemu na raidzie. Problem ten wynika z tego, iż system, który właśnie instalujesz może nie obsługiwać Twojego raida.
Wchodząc w menu "Akcje" przechodzimy do menu edycji partycji.
Możemy zmienić punkt montowania, system plików, rozmiar albo usunąć partycję.
Po dokonaniu edycji tablicy partycji, oraz ustawieniu punktów montowań możemy opuścić parted i przejść do dalszej części instalacji.
Przechodzimy teraz do kolejnej części instalacji, czyli wyboru pakietów.
Mamy do wyboru następujące gotowe zestawy pakietów. Przy każdym zestawie jest jego krótka charakterystyka, więc nie ma sensu się rozpisywać. Wybieramy taki zestaw jaki nam najbardziej pasuje, jednak nie warto przesadzać z pakietami, np stacja robocza z gnome nie będzie bardzo nadawała się na router. Po zainstalowaniu systemu będziesz zmuszony usunąć masę niepotrzebnych pakietów, przez co stracisz mnóstwo czasu.
Dalej mamy możliwość szczegółowej selekcji pakietów, jeżeli ufamy instalatorowi możemy pominąć ten krok, jeżeli natomiast znamy się trochę na linuksie wybieramy powyższą opcję i wchodzimy do menu.
Na ekranie widzimy zaznaczone grupy pakietów, możemy zaznaczać dodatkowe, albo zrezygnować z dotychczas wybranych. Możemy także rezygnować z pojedynczych pakietów z grup wchodząc w opcję standartowe pakiety. Pod linkiem "Wybierz opcjonalne pakiety" widzimy menu dzięki któremu mamy możliwość bardziej spersonalizowanego wyboru interesujących nas pakietów.
Kolejnym krokiem jest pytanie czy chcemy zainstalować dokumentację, na które lepiej odpowiedzieć twierdząco. Mamy także możliwość wyboru wersji językowych dokumentacji. Jeżeli nie jesteśmy pewni, możemy zostawić domyślne ustawienia, czyli "ALL", jednak gdy chcemy mieć dokumentację tylko po polsku i angielsku wpisujemy "pl:pl_PL:en:en_US". Należy pamiętać, że może zdarzyć się sytuacja iż pakiet nie ma jeszcze polskiej dokumentacji, więc zawsze warto zaznaczyć język angielski.
Następne kroki to prekonfiguracja instalowanego systemu.
Dotarliśmy do punktu gdzie musimy ustawić podstawowe parametry instalowanego systemu.
Pierwszym krokiem będzie ustawienie parametrów sieci (jeżeli mamy do niej dostęp). Jeżeli wcześniej wybraliśmy instalację przez sieć, możemy zastosować te same preferencje także w naszym systemie, jeżeli jednak instalujemy z jakiegoś nośnika (cdrom, dysk) należy ręcznie wpisać ustawienia, lub pobrać je z serwera dhcp.
Kolejny krok to ustawienie hasła użytkownika root. Ten punkt chyba nie wymaga komentarza. Należy ustawić w miarę bezpieczne hasło, bo jak wiadomo serwer jest tak bezpieczny jak jego najsłabsze ogniwo :) Możemy również zlecić wygenerowanie hasła instalatorowi.
Następną czynnością jest ustawienie kont(a) użytkowników, możemy zrobić to teraz, albo po instalacji używając polecenia useradd.
Pozostał jeszcze wybór strefy czasowej i synchronizacja (lub nie) zegara systemowego z UTC, i na tym kończymy prekonfigurację systemu.
Przyszła kolej na ustawienie bootmanagera. Jeżeli pld to nasz jedyny system na dysku możemy pominąć ten krok, w przeciwnym przypadku musimy dodać wpisy innych systemów, aby była możliwość uruchomienia ich przy starcie komputera. Oczywiście jeżeli nie chcemy teraz konfigurować bootmanagera można zawsze to zrobić po ukończeniu instalacji, edytując plik /etc/lilo.conf.
Wybieramy więc opcję "konfiguruj bootloader", która uruchamia skrypt konfigurujący.
Jak widać nie mamy jeszcze żadnych wpisów, wybieramy "Stwórz nową pozycję" aby dodać jakiś system operacyjny. Należy tutaj pamiętać iż wpisujemy istniejące systemy na lokalnych dyskach, oprócz tego, który właśnie instalujemy.
Pierwszym krokiem jest wybór systemu który chcemy ładować. Wybieramy np. DOS, następnie podajemy lokalizacje partycji na jakiej znajduje się system i przechodzimy do konfiguracji wpisu.
Jak widać na powyższym przykładzie, musimy wpisać etykietę - czyli nazwę jaka będzie nam się wyświetlała przy starcie komputera. Nazwa jest dowolna, jednak nie należy przesadzać z długością i lepiej nie używać polskich znaków. Dwa kolejne pola, czyli "system" i "katalog /" mamy już wypełnione automatycznie. Jeżeli dodajemy innego linuksa należy podać lokalizację jądra systemu (kernela) oraz initrd jeśli mamy. W systemie DOS/Windows te pola są zbędne.
Po ustawieniu etykiety i zatwierdzeniu zmian możemy obejrzeć nasz(e) wpis(y). Jeżeli mamy więcej systemów dodajemy je po kolei, po skończeniu opuszczamy konfigurator przechodząc do kolejnej opcji.
Ostatnią rzeczą jaką musimy zrobić aby zakończyć proces konfiguracji bootloadera to wybór urządzenia na jakim ma być on zainstalowany. Najlepszym rozwiązaniem jest instalacja go w MBR (Master Boot Record) dysku z którego jest ładowany system. Jeżeli jednak nie jesteśmy pewni co do tego (lub nie wiemy co to jest MBR) najlepiej zostawić opcję auto, dzięki której instalator sam wybierze najlepsze urządzenie.
Pozostała nam ostatnia rzecz, czyli instalacja pakietów. W tej części nie będziemy musieli nic robić, oprócz czekania. Więc jeżeli wybraliśmy instalację z sieci i jakiś większy zestaw pakietów możemy zaopatrzyć się w jakąś książkę i poczytać, bo proces instalacji trochę potrwa :)
Słowo komentarza na temat tego, co się dzieje na ekranie:
Tutaj widzimy jak system tworzy partycje, oraz system plików na nich. W zależności od wielkości partycji i szybkości dysku może to trochę potrwać.
Dalej po pobraniu indeksów system przechodzi do instalacji pakietów (więcej o tym co to są indeksy w rozdziale poświęconym poldkowi). To jest najdłuższa część instalacji.
Jeżeli nie wystąpiły żadne błędy zobaczysz taki ekran. Teraz wystarczy tylko zrestartować system, wyciągnąć płytkę/dyskietkę z napędu, bądź ustawić bootowanie z dysku na którym zainstalował się bootmanager (najczęściej /dev/hda) i mamy gotowy system :)
Po instalacji system uruchamiany jest w trzecim "poziomie pracy". Jeśli dana maszyna będzie korzystała z X-Window to zapewne zechcemy aby korzystała z piątego poziomu, o zarządzaniu poziomami pracy przeczytamy w sekcja Zmiana poziomu pracy systemu w rozdział Administracja.
Instalator pozostawił w systemie pliki zawierające szczegóły instalacji, oto ich lista:
/var/log/installer - szczegółowy dziennik instalacji
/etc/installer.conf - lista ustawień instalatora
/etc/installer.pkgs - lista wybranych pakietów
/etc/installer.sysconf - wstępna konfiguracja systemu
Jeśli wybraliśmy jedną z minimalnych wersji systemu, to teraz powinna nastąpić właściwa część instalacji pakietów. W tym celu należy użyć programu Poldek, jego opis odnajdziemy w sekcja Poldek w rozdział Zarządzanie pakietami
Instalacja systemu przy użyciu chroot
Mamy możliwość zainstalowania PLD przy użyciu innego systemu operacyjnego, sposób ten ma tę zaletę, że daje nam okazję dobrego poznania PLD już na etapie instalacji, a ponadto umożliwia wykonanie bardziej wyrafinowanych operacji, które są niedostępne z poziomu instalatora. Ta metoda instalacji pozwala zainstalować bardzo małą wersję systemu, (ok. 120MB), która wystarcza do uruchomienia systemu, skonfigurowania sieci, Poldka i pobrania kolejnych pakietów.
Do instalacji możemy użyć działającej dystrybucji, jednak najwygodniejsze będzie użycie dystrybucji typu live: RescueCD lub PLD-Live. Użycie systemu z płyty CD ma tą zaletę, że instalacja może być wykonywana na docelowej maszynie, co ułatwi nam stworzenie prawidłowego obrazu initrd. Do instalacji Th należy użyć RescueCD 2.90 lub nowszej (kiedy się pojawią), zaś do instalacji Ac - jednej ze starszych wersji np. 2.01.
Osoby ciekawe jak wygląda przebieg instalacji "na żywo", mogą obejrzeć nagranie przykładowej instalacji.
Uwaga! W niniejszym rozdziale nie zawarto wielu zbyt szczegółowych opisów, dlatego w przypadku drukowania na papierze może być konieczne dodrukowanie innych rozdziałów dokumentacji.
W przypadku instalacji z działającego systemu musimy podłączyć dysk twardy do komputera i uruchomić go. W przypadku płyty CD typu live - w BIOS-ie maszyny docelowej włączamy opcję startu systemu z płyty, a następnie umieszczamy nośnik w napędzie i czekamy na start systemu.
Współczesne dystrybucje typu live same wykrywają sprzęt i ładują odpowiednie moduły kernela, jeśli jednak to się nie powiedzie to musimy wtedy wykonać tę operację samodzielnie, więcej na ten temat w sekcja Statyczne zarządzanie modułami w rozdział Kernel i urządzenia. Interesują nas jedynie moduły kontrolera ATA/SATA/SCSI oraz interfejsu sieciowego.
System możemy zainstalować na klasycznych partycjach dyskowych, woluminach LVM lub programowych macierzach, instalacja z chroot-a daje w tej kwestii dużą swobodę. Opis tworzenia woluminów LVM przedstawiliśmy w sekcja LVM w rozdział Pamięci masowe zaś macierzy w sekcja RAID programowy w rozdział Pamięci masowe. Dla ułatwienia jednak dalsze przykłady będą dotyczyły zwykłych partycji.
Potrzebujemy co najmniej dwóch partycji: jednej na główny system plików i drugiej na obszar wymiany. Obszar wymiany nie jest wymagany do instalacji, jednak dla porządku utworzymy go już na tym etapie. Przykłady będą dotyczyły dysku /dev/sda. Nazewnictwo urządzeń masowych wyczerpująco przedstawiono w sekcja Nazewnictwo urządzeń masowych w rozdział Pamięci masowe.
Na uprzywilejowanej pozycją będą tym razem użytkownicy kompletnych systemów, które umożliwiają użycie programu GParted lub QTParted, w przeciwnym wypadku użyjemy programu fdisk lub cfdisk np.:
# cfdisk /dev/sda |
Inicjujemy obszar wymiany:
# mkswap /dev/sda1 |
# mkfs.ext3 /dev/sda2 |
Zapamiętujemy układ partycji i systemów plików, gdyż będzie on nam potrzebny do prawidłowego skonfigurowania pliku /etc/fstab. Teraz przyszedł czas na utworzenie punktu montowania i podmontowania partycji np.:
# mkdir /pldroot # mount /dev/sda2 /pldroot |
Jeśli system ma używać większej ilości partycji (np. dla /boot) to montujemy je wszystkie.
Założyliśmy, że będziemy instalować pakiety z sieci, dlatego musimy skonfigurować połączenie. W opisach przyjęliśmy, że maszyna jest podłączona do sieci Ethernet.
W przypadku RescueCD system domyślnie próbuje pobrać konfigurację z DHCP, dlatego od razu po uruchomieniu powinniśmy mieć działającą sieć. Jeśli w sieci nie ma takiego serwera to musimy statycznie przydzielić parametry połączenia. Zakładając, że chcemy ustawić adres 192.168.0.2 z maską /24 parametry pliku konfiguracji interfejsu (np.: /etc/sysconfig/interfaces/ifcfg-eth0) powinny mieć następujące wartości:
DEVICE=eth0 IPADDR=192.168.0.2/24 ONBOOT=yes BOOTPROTO=none |
eth0 default via 10.0.0.254 |
nameserver 193.192.160.243 |
# service network restart |
Jeśli potrzebujemy skorzystać z proxy ustawiamy odpowiednią zmienną środowiskową np.:
# export ftp_proxy=w3cache.dialog.net.pl:8080 |
Zaczynamy od ustawienia najlepiej dopasowanej
architektury instalowanych pakietów, za pomocą opcji
_pld_arch
w pliku
/etc/poldek/repos.d/pld.conf.
Więcej o architekturach pakietów w
sekcja Architektury pakietów w rozdział Zarządzanie pakietami.
Dobrym pomysłem jest ustawienie opcji, umożliwiającej precyzyjne
wybieranie alternatywnych pakietów (dla nieco bardziej zaawansowanych):
choose equivalents manually = yes |
Teraz tworzymy katalog na indeksy Poldka np.:
# mkdir -p /pldroot/var/cache/poldek-cache |
cachedir = /pldroot/var/cache/poldek-cache |
Zanim zaczniemy instalować pakiety musimy mieć świadomość, że zachodzi między nimi wiele zależności. Zostaną zainstalowane wszystkie wymagane dodatkowo pakiety, jednak nie mamy wpływu na kolejność instalacji. Zdarza się, że pakiet wymaga pliku lub programu, którego jeszcze nie ma w instalowanym systemie, przez co nie mogą być wykonane pewne operacje poinstalacyjne. Pojawią się nam wtedy na ekranie komunikaty błędów, nie należy się tym martwić, gdyż naprawimy ten problem reinstalując pakiet. Musimy jedynie wywołać instalację z opcją --reinstall
Instalację rozpoczynamy od inicjacji bazy danych pakietów:
# rpm --root /pldroot --initdb |
W tej części instalacji zainstalujemy kolejno pakiety: setup, FHS, dev, pwdutils, chkconfig, dhcpcd, poldek, vim (lub inny edytor), geninitrd, module-init-tools, cpio, bootloader lilo lub grub, mount oraz mingetty. Możemy dodatkowo zainstalować wiele innych pakietów, jednak możemy spokojnie to wykonać z działającego już systemu.
Mamy możliwość użycia trybu interaktywnego Poldka:
# poldek --root /pldroot poldek> install setup FHS dev pwdutils chkconfig dhcpcd poldek vim geninitrd \ module-init-tools cpio grub mount login mingetty |
# poldek --root /pldroot -i setup FHS dev pwdutils chkconfig \ dhcpcd poldek vim geninitrd module-init-tools cpio grub mount login mingetty |
Jeśli zdecydowaliśmy sie macierze dyskowe, to powinniśmy zainstalować dodatkowo pakiety: mdadm i mdadm-initrd (jeśli jest na głównym systemie plików). Jeśli używamy woluminów logicznych (LVM) to potrzebujemy pakiety odpowiednio lvm2 i lvm2-initrd.
Przed instalacją jądra musimy wykonać operacje konieczne do prawidłowego wygenerowania initrd:
Montujemy pseudo-system plików /proc:
# mount /proc /pldroot/proc -o bind |
Konfigurujemy plik /pldroot/etc/fstab, tak by wpisy odpowiadały wybranemu przez nas układowi partycji i systemów plików. Dla przykładów z początku rozdziału wpisy będą wyglądały następująco.:
/dev/sda1 swap swap defaults 0 0 /dev/sda2 / ext3 defaults 0 0 |
Dokonać odpowiednich koniecznych operacji konfiguracyjnych w przypadku korzystania z macierzy RAID (plik /etc/mdadm.conf) lub woluminów LVM (/etc/lvm/lvm.conf).
Musimy wybrać, który kernel zainstalujemy, na początek powinniśmy się zainteresować pakietami: kernel, kernel-grsecurity i ew. ich odmiany z SMP. W wyborze może pomóc nam opis kerneli w sekcja Jądro systemu w rozdział Kernel i urządzenia. Kiedy już wybraliśmy, instalujemy wybrany pakiet:
# poldek --root /pldroot -i kernel |
Jeśli wybraliśmy LILO jako bootloader to powinniśmy odpowiednio zmodyfikować plik konfiguracji (/pldroot/etc/lilo.conf), w przypadku użytej w przykładach konfiguracji będzie wyglądał on następująco:
boot=/dev/sda read-only lba32 prompt timeout=100 image=/boot/vmlinuz label=pld root=/dev/sda2 initrd=/boot/initrd |
Kiedy konfiguracja jest skończona wydajemy polecenie:
# chroot /pldroot /sbin/lilo |
W przypadku GRUB-a plik konfiguracji (/pldroot/boot/grub/menu.lst) powinien wyglądać tak:
timeout 10 title pld root (hd0,1) kernel /boot/vmlinuz boot=/dev/sda initrd /boot/initrd |
# chroot /pldroot /sbin/grub |
grub> root (hd0,1) grub> setup (hd0) grub> quit |
Konfigurację bootloadera wyczerpująco przedstawiono w sekcja Wstęp w rozdział Bootloader. Jeśli gałąź /boot ma być na macierzy to powinniśmy umieścić bootloader na wszystkich wchodzących w skład tej macierzy dyskach, szczegóły tej operacji przedstawiliśmy w sekcja RAID programowy w rozdział Pamięci masowe.
Jeśli chcemy używać systemu urządzeń udev, to jest doskonała okazja żeby go zainstalować. Podstawowe pakiety wymagają urządzeń z pakietu dev, dlatego możemy go zainstalować dopiero teraz:
# poldek --root /pldroot -i udev # poldek --root /pldroot -e dev |
Aby móc się zalogować do nowego systemu musimy nadać hasło dla root-a:
# chroot /pldroot /usr/bin/passwd |
Nic nie stoi na przeszkodzie, żeby utworzyć konta użytkowników i skonfigurować uprawnienia. W tym celu posłużymy się narzędziami z pakietu shadow lub pwdutils, zanim to jednak zrobimy musimy ustalić z jakiej powłoki będą korzystać użytkownicy. Domyślnie oba pakiety ustawiają użytkownikom powłokę /bin/bash, dlatego przy tworzeniu kont musimy ustawić ją na /bin/sh, lub zainstalować Basha.
Zakładając, że mamy zainstalowanego Basha dodajemy konto użytkownika następująco:
# chroot /pldroot /usr/sbin/useradd -m jkowalski |
# chroot /pldroot /usr/bin/passwd jkowalski |
Przed restartem musimy odmontować systemy plików:
# umount /pldroot/proc # umount /pldroot |
Na koniec wpisujemy polecenie reboot, wyjmujemy płytę z napędu i czekamy aż uruchomi się nowy system.
Aktualizacja systemu PLD z RA do AC
Gdy mamy zainstalowane już na dysku PLD 1.x, aby przejść do 2.0 (AC) nie musimy od nowa instalować całego systemu. Możemy posłużyć się skryptem ra2ac. Pakiety z tego skryptu standardowo pobierane są z ftp. Czynnością którą musimy wykonać zanim posłużymy się skryptem to aktualizacja kernela do wersji 2.4.x. Gotowe pakiety możemy pobrać z dwóch źródeł w zależności od architektury.
Dla architektur: i686 oraz ppc: ftp://ftp.pld-linux.org/dists/ra/updates/2.4/
Dla architektur: i386, i586, i686: ftp://atos.wmid.amu.edu.pl/pub/pld/ra-24/
Cała aktualizacja systemu sprowadzi się do uruchomienia skryptu i ręcznej rekonfiguracji nowych wersji usług.
Należy pamiętać, że AC jest na kernelu 2.6, lub 2.4 do wyboru, w tych kernelach nie ma ipchains-ów, zamiast tego jest narzędzie nazywające się iptables. Pomimo iż służy do tego samego, regułki mają inną składnie. W kernelach 2.4 i 2.6 niektóre moduły urządzeń inaczej się nazywają, więc na to też należy być przygotowanym.
Skrypt jest przeznaczony dla ludzi, którzy wiedzą co robią i mają ogólne pojęcie o linuksie, jeżeli jesteś początkującym użytkownikiem PLD, to lepszą decyzją będzie od nowa zainstalowanie systemu.
Pierwszym krokiem powinno być zrobienie kopii zapasowej plików konfiguracyjnych - najlepiej przekopiować gdzieś cały katalog /etc, jeżeli masz np. postgresa, to ważne jest abyś zrzucił gdzieś bazy. O innych ważnych usługach i zmianach w konfiguracjach powinniśmy poczytać wcześniej. Wiele nowszych pakietów, stare pliki konfiguracyjne przekopiuje do plików z rozszerzeniem *.old
Zainstalowanego na komputerze kde lub gnome najlepiej jest usunąć (łącznie z katalogami i plikami zaczynającymi się od .kde i .gnome w katalogach domowych użytkowników) - gdyż zmiany są bardzo duże i praca ze starymi ustawieniami powoduje często wadliwą prace. Generalnie ważne jest aby aktualizować jak najmniejszą liczbę pakietów, wtedy wszystko powinno pójść w miarę gładko. Resztę pakietów można później ręcznie doinstalować po aktualizacji.
Teraz pobieramy z cvsu skrypt ra2ac poleceniem:
# cvs -d :pserver:cvs@cvs.pld-linux.org:/cvsroot get raac-converter cvs server: Updating raac-converter U raac-converter/ChangeLog U raac-converter/TODO U raac-converter/ra2ac |
Lub korzystamy z adresu www
Następnie uruchamiamy ra2ac:
# sh raac-converter/ra2ac |
Czekamy aż skończy się instalowanie pakietów, na przewijające się niespełnione zależności i błędy nie zważamy :)
I na samym końcu najbardziej nieprzyjemna część aktualizacji - konfiguracja. Należy teraz większość usług jeszcze raz przekonfigurować, część usług będzie potrzebowała tylko przekopiowania konfigu z Ra, jednak inne (np. exim, postfix) wymagają od administratora edycji nowych plików konfiguracyjnych. Ważne jest żeby poczytać w dokumentacji o zmianach w plikach konfiguracyjnych między wersjami które mieliśmy w RA, a wersjami występującymi teraz po skończeniu działania skryptu.
W tym rozdziale znajdziesz podstawowe komendy i czynności, które powinieneś znać.
Dokument, który aktualnie czytasz zawiera minimalny zestaw instrukcji i porad koniecnych do instalacji i zarządzania dystrybucją PLD Linux. Większość opisywanych mechanizmów i narzędzi ma o wiele większe możliwości, aby je poznać powinniśmy używać podręczników systemowych info i man (przestarzały). Aby z nich korzystać musisz je zainstalować (o ile nie są już zainstalowane) poleceniami:
poldek -U man poldek -U info |
info {$hasło} |
Jeśli szukasz prostego narzędzia o konkretnych możliwościach możemy przejrzeć dokumentację systemową zestawu coreutils:
info coreutils |
Możesz również szukać pomocy na listach dyskusyjnych, IRC-u, czy forum. Listę tych jak i wielu innych użytecznych adresów odnajdziesz w sekcja Ważne adresy w rozdział Zasoby sieciowe PLD.
Tradycyjną metodą wyłączania komputera jest komenda shutdown, np.:
# shutdown -h now |
Lub poweroff dająca ten sam efekt.
Użycie komendy halt jest też właściwe.
# halt |
Aby zresetować system wpisujemy reboot albo korzystamy z kombinacji klawiszy CTRL+ALT+DEL.
W trakcie pracy możemy dowolnie przełączać się pomiędzy trybami pracy. Służy do tego polecenie init {$nr} ({$nr} to liczba oznaczająca tryb pracy) np.
# init 5 |
Zmianę poziomu pracy szerzej opisano tutaj: sekcja Zmiana poziomu pracy systemu w rozdział Administracja
Zawartość plików wyświetlamy poleceniem cat.
$ cat archiwum |
Jeśli chcemy przyjrzeć się plikowi, który nie mieści się na ekranie po wykonania cat możemy uzyskać poleceniem less. Możemy wtedy przeglądać plik używając "strzałek", a kiedy skończymy - naciskamy q.
$ less plik |
Komendą touch możemy modyfikować znaczniki czasu pliku, częściej jednak używa się jej do tworzenia pustych plików.
$ touch pusty_plik |
Polecenie mkdir tworzy katalog.
$ mkdir archiwum |
Za pomocą polecenia rmdir usuwamy puste katalogi.
$ rmdir archiwum |
Plik możemy przenieść, albo zmienić jego nazwę, za pomocą polecenia mv.
$ mv listing listing.old $ mv /home/listing.old /usr/src/ |
W podobny sposób operujemy na katalogach.
$ mv archiwum smietnik $ mvdir smietnik /usr/src/smietnik/ |
Do kopiowania służy polecenie cp.
$ cp listing podkatalog/ |
Kasujemy poleceniem rm.
$ rm plik // Kasuje plik. $ rm * // Kasuje wszystkie pliki w danym katalogu. $ rm * -i // Kasuje wszystkie pliki w danym katalogu z potwierdzeniem. $ rm * -f // Kasuje wszystkie pliki w danym katalogu bez pytania. $ rm -r // Kasuje wszystkie pliki, także te w podkatalogach $ rm -rf /home/ // Kasuje wszystkie pliki i katalogi w katalogu /home/ |
Do poruszania się w drzewie katalogów w trybie tekstowym można używać programu Midnight Commander uruchamianego poleceniem mc, jednak nie każdy go instaluje, więc warto zapoznać się z kilkoma poleceniami przedstawionymi w tym rozdziale.
Do poruszania się w drzewie katalogów używamy polecenia cd ścieżka np.:
$ cd /home/users/zenek/ |
Ten sam efekt uzyskamy poleceniem
$ cd users/zenek/ |
wykonanym w katalogu /home
Kilka innych przykładów przedstawiamy poniżej.
W systemach uniksowych wyróżniamy kilka rodzajów specjalnych katalogów. Najważniejszym w całym drzewie jest katalog główny -korzeń (ang. root) oznaczany przez ukośnik: "/"
$ cd / |
Często po lewej stronie ścieżki podaje się korzeń aby wskazać położenie katalogu lub pliku bez względu na miejsce z którego wydajemy polecenie np.:
$cd /etc/sysconfig |
Polecenie ls powoduje wyświetlenie zawartości katalogu. Należy po nim podać nazwę katalogu, który chcemy zobaczyć, w przeciwnym wypadku wyświetlona zostanie zawartość katalogu bieżącego.
$ls / bin dev home lib mnt proc sbin srv tmp var boot etc initrd media opt root selinux sys usr $cd /home $ls services users |
Parametr -a powoduje, że funkcja pokazuje również pliki ukryte (zaczynające się od kropki). -R powoduje wylistowanie również podfolderów.
Polecenie pwd powoduje wyświetlenie ścieżki bieżącego katalogu.
$cd users/bart $pwd /home/users/bart/ |
Ważnym katalogiem jest katalog domowy użytkownika - oznaczany znakiem tyldy (~). Każdy użytkownik może używać w ścieżce tego znaku i zawsze będzie oznaczał jego własny katalog domowy np.:
$ ls ~/dokumenty |
Kolejnym takim katalogiem jest katalog nadrzędny oznaczany za pomocą dwóch kropek. Będąc w katalogu: /home/users/zenek możemy przejść o jeden poziom do góry używając polecenia
cd .. |
Dzięki temu znajdziemy się w katalogu /home/users.
By wyświetlić aktualny czas i datę systemową posługujemy się komendą date:
$ date sob kwi 26 23:48:33 CEST 2003 |
Czas działania komputera sprawdzamy komendą uptime.
$ uptime 5:27pm up 6:51, 4 users, load average: 0.32, 0.08, 0.02 |
W sytuacji gdy chcemy z zmierzyć czas potrzeby na wykonanie operacji/czynności/procesu to posługujemy się komendą time.
$ time find /home/users/rennis/ HELLO real 0m13.297s user 0m0.060s sys 0m0.230s |
Przykład ten poszukuje pliku HELLO w moim katalogu domowym, co zajmuje systemowi ~13s.
W systemach z rodziny UNIXa konfiguracja systemu jest przechowywana w plikach tekstowych. Zaletą tego rozwiązania jest możliwość konfigurowania systemu przy pomocy bardzo prostych narzędzi, wadą zaś to że można łatwo popełnić błąd. Dlatego jeśli chcemy tylko przeglądać plik powinniśmy użyć programu less np.:
# less /etc/poldek/poldek.conf |
Jeśli jesteśmy pewni że chcemy dokonać zmian, powinniśmy wcześniej wykonać kopię zapasową pliku (pliki kopii zapasowej kończy się tyldą).
# cp /etc/poldek/poldek.conf /etc/poldek/poldek.conf~ |
Teraz możemy zacząć modyfikować plik, domyślnie instalowanym edytorem plików jest vim, dlatego dobrze jest umieć się nim posługiwać choćby w podstawowym zakresie. Bardzo użyteczną cechą Vima jest kolorowanie składni podstawowych plików konfiguracji (o ile nasz terminal jest kolorowy), dzięki czemu łatwo możemy zauważyć ewentualne błędy.
Aby otworzyć nim plik do edycji wydajemy polecenie
# vim /etc/poldek/poldek.conf |
Początkującym można zaproponować edytor mcedit będący częścią programu mc (Midnight Commander), inne nieco mniej popularne edytory to: emacs, pico, joe
Należy pamiętać o tym, że prawo zapisu plików w katalogu konfiguracji systemu (/etc) ma tylko superużytkownik (root) i z takimi uprawnieniami należy uruchamiać edytor. Pliki konfiguracyjne w linuksie muszą kończyć się znakiem nowej linii, dlatego przed zapisem należy pamiętać o sprawdzeniu czy jest wstawiony. Po raz kolejny swoją przewagę nad innymi edytorami pokazuje Vim, który automatycznie wstawia znak nowej linii.
Aby używać przedstawionych tu programów, należy mieć uprawnienia superużytkownika lub być zapisanym do odpowiedniej grupy. Listę grup i odpowiadających im uprawnień zamieszczono w sekcja Zarządzanie uprawnieniami w rozdział Administracja. Bardziej zaawansowane narzędzia sieciowe opisano w sekcja Narzędzia sieciowe w rozdział Zastosowania sieciowe.
Najczęściej używanym narzędziem diagnostycznym jest program ping - pozwala on zbadać istnienie połączenia między dwoma komputerami, drogę pomiędzy nimi, czas potrzebny na przejście pakietu oraz sprawdza czy drugi komputer pracuje w danym momencie w sieci. Przy okazji ping dokonuje tłumaczenia adresu domenowego na numer IP. Program ten jest przydatny do określania stanu sieci i określonych hostów, śledzenia i usuwania problemów sprzętowych, testowania, mierzenia i zarządzania siecią, oraz do badania sieci. Polecenie ping {$nazwa/$numer_IP} wysyła specjalne pakiety ICMP do wskazanego komputera i czeka na odpowiedź. Możemy podawać jako cel adres domenowy lub numer IP. Przy okazji program ten dokonuje tłumaczenia adresu domenowego na numer IP.
$ ping pld-linux.org PING pld-linux.org (81.0.225.27) 56(84) bytes of data. 64 bytes from 81.0.225.27: icmp_seq=1 ttl=44 time=135 ms 64 bytes from 81.0.225.27: icmp_seq=2 ttl=44 time=99.8 ms 64 bytes from 81.0.225.27: icmp_seq=3 ttl=44 time=149 ms --- pld-linux.org ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 99.840/128.084/149.144/20.761 ms |
pracę programu przerywamy skrótem ctrl+c
Na powyższym wydruku przedstawiono 3 odpowiedzi na wysłane pakiety. Jeden wiersz oznacza odpowiedź na jeden pakiet, dla każdego z nich podawane są parametry trasy pomiędzy komputerami. Najistotniejszym parametrem jest czas odpowiedzi (time). W przypadku problemów z siecią część pakietów może zostać zagubiona, będzie wskazywane przez specjalny licznik (icmp_seq) oraz przez końcowe statystyki. Brak jakiejkolwiek odpowiedzi można interpretować jako brak połączenia sieciowego z interesującym nas komputerem, blokadę tego typu pakietów na komputerze zdalnym lub zwyczajne wyłączenie maszyny. Na końcu wyświetlane są dodatkowo szczegółowe statystyki. Przy prawidłowym połączeniu czas odpowiedzi dla sieci lokalnej zazwyczaj nie przekracza 1 ms zaś w internecie może sięgnąć nawet kilkuset ms.
Komenda może dać również efekt podobny do poniższego:
[root@g82 ~]# ping google.pl PING google.pl (216.239.57.99) 56(84) bytes of data. From 192.168.6.1 icmp_seq=1 Packet filtered From 192.168.6.1 icmp_seq=2 Packet filtered --- google.pl ping statistics --- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1000ms |
Może to oznaczać, że w naszej sieci zabronione jest wysyłanie pingów poza LAN.
Nieco bardziej zaawansowanym programem jest traceroute. Pokazuje on trasę jaką przechodzą pakiety między naszym komputerem, a sprawdzanym przez nas hostem. Wskazuje on czasy przesłania pakietów pomiędzy sąsiadującymi ze sobą routerami (tzw. czasy przeskoków), znajdującymi się na trasie połączenia dwóch maszyn. Pozwala śledzić trasę pakietów oraz wykrywać różnego rodzaje problemy w sieciach np.: błądzenie pakietów w sieci, "wąskie gardła" sieci, oraz awarie połączeń.
$ traceroute pld-linux.org traceroute to pld-linux.org (81.0.225.27), 30 hops max, 38 byte packets 1 192.168.1.1 (192.168.1.1) 0.295 ms 0.608 ms 0.484 ms 2 217.153.188.173 (217.153.188.173) 1.012 ms 0.648 ms 0.495 ms 3 217.8.190.153 (217.8.190.153) 30.894 ms 28.983 ms 29.719 ms |
Jak widać, polecenie to wypisuje linie zawierające TTL, adres bramki oraz czas przebycia każdej z próbek z różnych gatewayów. Jeśli nie było odpowiedzi w ciągu trzech sekund to dla próbki drukowane jest '*'
Godnym uwagi programem jest MTR, jest narzędziem łączącym funkcje opisanych wcześniej programów. Program ten śledzi trasę połączenia między dwoma punktami podobnie jak traceroute i odświeża wyniki w regularnych odstępach czasu.
$ mtr pld-linux.org |
Zdarza się, że chcemy lub musimy korzystać z serwera pośredniczącego (proxy), w tym celu trzeba wskazać programowi jego adres i port. Konfiguracja proxy w GNU/Linuksie zależy od programu klienckiego i może być wykonana na jeden z trzech sposobów, oto ich lista:
zmienne środowiskowe - z nich korzystają głównie programy działające w trybie znakowym np.: lynx, wget, poldek. Definiujemy je następująco: {$protokół}_proxy np. serwer proxy dla FTP wskazujemy za pomocą zmiennej ftp_proxy zaś dla HTTP za pomocą http_proxy np.:
export ftp_proxy=w3cache.dialog.net.pl:8080 |
opcje programu - wiele bardziej rozbudowanych aplikacji używa własnej konfiguracji proxy. Są to przeważnie programy dla środowiska X-Window np.: gFTP, Firefox, Opera.
konfiguracja środowiska - programy ściśle związane ze środowiskami graficznymi Gnome lub KDE używają ustawień tychże środowisk. Do tego typu programów należą np.: Epiphany, Konqueror.
Tutaj opisano sposób badania zasobów systemu operacyjnego.
Wiele poleceń zwracających wielkości zajmowanej pamięci obsługuje parametr -h przedstawiający wielkości w jednostkach bardziej wygodnych dla człowieka.
Komenda df służy do pokazania ilości miejsca na zamontowanych partycjach.
$ df -h System plików rozm. użyte dost. %uż. zamont. na /dev/hdc1 36G 5.6G 29G 16% / |
Natomiast komendą du można sprawdzać objętość plików oraz całych katalogów. Uruchomienie du -h wyświetli listę plików, katalogów i ich objętości (z bieżącego katalogu)
$ du -h 4.1kB ./archiv/httpd 4.1kB ./archiv/mysql 4.1kB ./archiv/exim 17kB ./archiv 4.1kB ./httpd 4.1kB ./mysql 111kB ./exim 107kB ./ircd 4.1kB ./mail 2.1MB . |
Za pomocą opcji -s
uzyskamy sumę objętości
wszystkich plików
$ du -sh /bin 3,4M /bin |
Listę wszystkich uruchomionych procesów oraz dotyczące ich dane otrzymamy dzięki poleceniu ps
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1350 0.0 0.1 1788 868 ? Ss May27 0:00 syslog-ng zenek 2252 0.0 1.2 11316 6668 ? Ss May27 0:01 xfce4-session root 2301 0.0 0.3 2748 1556 tty2 Ss May27 0:00 -bash |
Oraz w formie drzewa procesów rodziców i procesów potomnych
$ ps xf PID TTY STAT TIME COMMAND 2459 ? S 0:32 xmms 2460 ? S 0:00 \_ xmms 2461 ? S 0:00 \_ xmms 2465 ? S 0:00 \_ xmms 2816 ? S 0:00 \_ xmms |
W przypadku potrzeby ciągłego śledzenia zmian w systemie możemy użyć programu top. Program ten pokazuje najbardziej zasobożerne procesy. Dodatkowo na bieżąco wyświetla całkowite zużycie procesora (CPU), pamięci operacyjnej(Mem) oraz zajętość przestrzeni wymiany (Swap).
$ top top - 01:38:54 up 3:28, 4 users, load average: 0.10, 0.08, 0.08 Tasks: 63 total, 2 running, 61 sleeping, 0 stopped, 0 zombie Cpu(s): 2.3% us, 1.3% sy, 0.0% ni, 96.1% id, 0.0% wa, 0.3% hi, 0.0% si Mem: 516244k total, 440344k used, 75900k free, 11840k buffers Swap: 1076312k total, 0k used, 1076312k free, 328012k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2240 root 15 0 62644 24m 45m S 1.6 4.9 7:37.40 X 2892 zenek 16 0 1880 928 1672 R 0.6 0.2 0:00.05 top 2695 zenek 16 0 6532 3824 5056 R 0.3 0.7 0:01.63 xterm 1 root 16 0 1532 584 1372 S 0.0 0.1 0:00.82 init |
Informacje o samej pamięci i przestrzeni wymiany uzyskamy dzięki komendzie free
$ free total used free shared buffers cached Mem: 516244 445536 70708 0 11880 332728 -/+ buffers/cache: 100928 415316 Swap: 1076312 0 1076312 |
Całkowita ilość zużytej pamięci (razem z buforami dyskowymi) mieści się w pierwszym wierszu w kolumnie USED. Zaś ilość pamięci zużytej jedynie przez programy mieści się w drugim wierszu w tej samej kolumnie.
Do śledzenia zmian zużycia zasobów systemu w funkcji czasu warto polecić program vmstat z liczbą sekund w parametrze. Podany czas jest odstępem pomiędzy pomiarami, program pokazuje zmiany w wykorzystaniu pamięci, obszaru wymiany, czasu procesora, przerwań czy wielkości transferu do i z urządzeń masowych:
# vmstat 2 procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 276896 980 89812 0 0 377 6 482 818 6 2 90 1 0 0 0 276780 980 89816 0 0 0 0 456 770 0 0 100 0 0 0 0 276772 980 89816 0 0 0 28 461 846 0 0 100 0 |
Do procesów których jesteśmy właścicielami możemy wysyłać sygnały (root może wysłać sygnał do każdego procesu). Aby zakończyć jakiś proces należy do procesu wysłać sygnał TERM. Dokonuje się tego poleceniem kill lub killall. Pierwsze zabija proces o podanym numerze PID (unikalnym identyfikatorze procesu) np.:
$ kill 2901 |
Drugie z poleceń zabija wszystkie procesy, które mają podaną nazwę np.:
$ killall xmms |
Sygnał TERM może być nieskuteczny w niektórych wypadkach, wtedy należy użyć bardziej brutalnej metody - sygnału KILL. Możemy go wysłać programem kill lub killall z odpowiednim parametrem: "-9" lub "-KILL":
kill -9 2901 |
W systemach uniksowych można ustawiać priorytety uruchamianym programom bądź też modyfikować bieżący priorytet działającego procesu. Priorytet jest nazywany jest "liczbą nice". Mówi ona jak mili jesteśmy dla systemu i innych użytkowników. Priorytet możemy ustawiać od -20 do +19, przy czym domyślna wartość zazwyczaj wynosi 0. Ujemne wartości oznaczają wyższy priorytet, zaś dodatnie niższy. Ujemną wartość może nadać tylko superużytkownik.
Aby uruchomić proces z priorytetem innym niż domyślny należy użyć programu nice np.:
$ nice -n +5 mc |
Działającym procesom można zmieniać priorytet. Aby to zrobić używamy polecenia renice:
$ renice +5 mc |
Pierwszą komendą jest who. Podaje ona nam nazwę użytkownika, terminal na którym jest zalogowany oraz czas rozpoczęcia pracy.
$ who gozda tty1 Apr 18 10:52 gozda pts/1 Apr 18 16:21 gozda pts/4 Apr 18 11:06 gozda pts/6 Apr 18 14:46 gozda pts/8 Apr 18 16:25 gozda pts/9 Apr 18 18:25 gozda pts/10 Apr 18 18:29 |
Kolejna komenda w pokazuje nam kto jest zalogowany i co robi na poszczególnych sesjach.
$ w 6:56pm up 8:05, 7 users, load average: 1.94, 1.75, 1.61 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT gozda tty1 - 10:52am 8:03m 16.67s 0.02s sh /usr/X11R6/bin/startx gozda pts/1 - 4:21pm 6:45 5.37s 5.32s irssi gozda pts/4 - 11:06am 37:46 3.22s 3.17s ekg gozda pts/6 - 2:46pm 10:17 12.66s 1.08s mp3blaster gozda pts/9 - 6:25pm 0.00s 0.12s 0.03s w gozda pts/10 - 6:29pm 22:07 3:58 0.02s ./mozilla-bin |
Komenda users. Pokazuje ona pseudonimy użytkowników zalogowanych w systemie.
$ users gozda gozda gozda gozda gozda gozda gozda |
Poleceniem whoami dowiadujemy się, jak nazywa się użytkownik, na którym pracujemy.
$ whoami gozda |
Ten rozdział opisuje metody zarządzania pakietami w systemie PLD.
Instalowanie, deinstalowanie oraz aktualizowanie składników systemu operacyjnego to jedne z najważniejszych zadań administratora. Zautomatyzowanie tych procesów pozwala na znaczne przyspieszenie i ułatwienie zarządzania systemem.
W świecie Otwartego Oprogramowania pomiędzy programami istnieją liczne powiązania, które w efekcie wymuszają konieczność instalacji dodatkowych programów i/lub bibliotek. Pominięcie tych zależności spowoduje problemy z działaniem programu lub całkowity jego brak. Śledzenie tych zależności może przyprawić o ból głowy większość administratorów. Na szczęście istnieją mechanizmy i narzędzia, które pomagają znacznie zautomatyzować ten proces.
Elementy systemu operacyjnego dostępne są w tzw. pakietach (pot. "paczkach"). W PLD zastosowano system pakietów RPM (RPM Packet Manager), który został stworzony przez twórców dystrybucji Red Hat Linux. Istnieje możliwość instalacji pakietów RPM przygotowanych dla innych dystrybucji, jednak nie skorzystamy wtedy z dobrodziejstwa zależności dotyczących danego pakietu. Wymagane dodatkowe pakiety należy wtedy zainstalować samodzielnie.
Do zarządzania pakietami (instalacja, deinstalacja, uzyskiwanie informacji) używa się specjalnych programów zwanych menadżerami pakietów:
Poldek
Poldek to domyślny menadżer pakietów dla PLD. Jest nakładką na RPM-a o ogromnych możliwościach, pozwalającym na znaczną automatyzację procesu zarządzania dużymi ilościami pakietów. Jest "wołem roboczym" odciążającym administratora w jego żmudnym zajęciu. Konfigurację i opis Poldka przedstawiono w sekcja Poldek.
PackageKit
Prosty zarządca pakietów, dla środowiska X-Window. Został stworzony pierwotnie dla Gnome, ma także wersję dla Qt. Jest to wygodne narzędzie, dobrze sprawujące się przy zrządzaniu niewielkimi ilościami pakietów. PackageKit wyświetla na tacce systemowej dostępność aktualizacji. PackageKit jest świetnym wyborem dla zupełnie niezaawansowanych użytkowników.
RPM
Niskopoziomowy zarzdca pakietów, używany zwykle w nietypowych i awaryjnych sytuacjach. Opis posługiwania się tym programem zamieszczono w sekcja RPM.
Jedną z najczęściej używanych form instalacji jest instalacja z sieci, dlatego jeśli nie zostanie podane inaczej to właśnie taka instalacja jest traktowana jako domyślna. Używamy tej metody nawet jeśli system był instalowany z lokalnego źródła (np. z dysku), choćby w celu aktualizacji systemu.
Menadżery pakietów są wstępnie skonfigurowane, Aby jednak instalować niestandardowe pakiety lub użyć innego źródła, musimy podać odpowiednie parametry. Konfiguracja w tym zakresie jest opisana w sekcja Serwery z pakietami w rozdział Zasoby sieciowe PLD.
Istotną cechą pakietów RPM jest mechanizm tzw. zależności, dzięki nim w trakcie instalacji pakietu instalowane są automatycznie dodatkowe wymagane pakiety. Niekiedy w ramach zależności wymagana jest funkcjonalność dostarczana przez więcej niż jeden pakiet. W takim wypadku zostaniemy zapytani o to który pakiet ma być zainstalowany. Wynika to z filozofii PLD, która dopuszcza bogaty wybór oprogramowania spełniającego tą samą rolę.
Istnieją zależności wymagające wzajemnego wykluczania się pakietów, tak aby w systemie była zainstalowany był tylko jeden program z pośród kilku dostępnych. Jako przykład można wskazać serwery usług tego samego rodzaju lub pakiety zawierające w nazwie słowa "inetd" oraz "standalone".
Dodatkowo system pakietów pilnuje, aby nie można było mieć zainstalowanych dwóch wersji tego samego pakietu. Próba instalacji pakietu starszego niż ten, który mamy w systemie zakończy się niepowodzeniem, zaś przy instalacji nowszego nastąpi jego aktualizacja.
Menadżery pakietów pozwalają na ignorowanie powyższych zależności, jest to jednak operacja nie zalecana, gdyż powoduje później trudny do ogarnięcia bałagan. Wyjątki od tej zasady powinny być robione jedynie w razie uzasadnionej konieczności, takim przypadkiem jest np. aktualizacja kernela, operacja ta została opisana w sekcja Jądro systemu w rozdział Kernel i urządzenia.
Dawniej zależności były budowane na podstawie nazw pakietów, w tej chwili stopniowo wprowadzane są zależności na podstawie plików (programów, bibliotek itd.). Zyskujemy w ten sposób elastyczność kosztem wygody w niektórych, rzadko spotykanych sytuacjach. W przypadku codziennej pracy z pakietami, nie odczujemy większych różnic i nie musimy się tym martwić.
Ważnymi elementami mechanizmu zależności są tzw. wymagania i własności. Pierwsza z cech wskazuje listę wymaganych dodatkowo elementów (pakietów, plików) do działania instalowanej aplikacji, druga zaś informuje, które z elementów są dostarczane wraz z pakietem. Aby poznać wymagania pakietu posłużymy się Poldkiem w trybie interaktywnym:
poldek:/all-avail> desc -r logrotate Package: logrotate-3.7-2 PreReqs: /bin/sh, fileutils Requires: /bin/mail, /bin/sh, config(logrotate) = 3.7-2, crondaemon, glibc, libc.so.6, libc.so.6(GLIBC_2.0), libc.so.6(GLIBC_2.1), libc.so.6(GLIBC_2.2), libc.so.6(GLIBC_2.3), libpopt.so.0, libselinux, libselinux.so.1, popt RPMReqs: rpmlib(CompressedFileNames) <= 3.0.4-1, rpmlib(PayloadFilesHavePrefix) <= 4.0-1, rpmlib(PayloadIsBzip2) <= 3.0.5-1 |
Sprawa nieco komplikuje się w przypadku własności, ponieważ w PLD nierzadko mamy dostępnych wiele pakietów spełniających podobne wymagania. Aby sprawdzić dostarczaną funkcjonalność ponownie użyjemy Poldka:
poldek:/all-avail> desc -p vixie-cron Package: vixie-cron-4.1-7 Provides: config(vixie-cron) = 4.1-7, crondaemon, crontabs >= 1.7, group(crontab) |
Własność crondaemon jest dostarczana przez większą ilość pakietów, możemy samodzielnie wybierać, który z pakietów ma być instalowany lub ustawić automatyczny wybór. O tym decyduje ustawienie opcji choose equivalents manually w konfiguracji Poldka. Jeśli ustawimy opcję na yes (zalecane) to instalacja programu może wyglądać następująco:
poldek:/all-avail> install logrotate Przetwarzanie zależności... Więcej niż jeden pakiet udostępnia właściwość "crondaemon": a) anacron-2.3-22 b) fcron-3.0.0-3 c) hc-cron-0.14-22 d) vixie-cron-4.1-7 Which one do you want to install ('Q' to abort)? [b] |
Pakiety mogą zawierać wiele małych programów i/lub bibliotek albo jeden duży program może być podzielony na kilka pakietów. W PLD najczęściej stosowane jest to drugie rozwiązanie: osobno przechowywane są pliki uruchomieniowe, osobno biblioteki, a jeszcze osobno moduły, wtyczki i dodatki. Ponadto jeśli tylko można to są umieszczane w pojedynczych pakietach, dzięki temu unikamy dużych, zbiorczych paczek. Pozwala to instalować tylko to co jest nam potrzebne. Przykładowo jeśli program ABC wymaga bibliotek programu XYZ to instalujemy tylko pakiet z bibliotekami tego drugiego. Skraca to czas instalacji (zwłaszcza przy pobieraniu plików z Internetu) i pozwala oszczędzać miejsce na dysku.
Nierzadko do osobnych pakietów trafiają elementy aplikacji, które zostały przewidziane przez jej twórców jako kompletna instalacja. Nie należy się tego obawiać, gdyż mechanizm zależności wymusi instalację wszystkich wymaganych dodatkowo pakietów.
Tak silne rozdrobnienie powoduje czasami, że do przy instalacji mechanizm zależności zaznacza sporą ilość dodatkowych pakietów. Potrafi to wprowadzić w konsternację, jednak nie należy się tego obawiać, gdyż są to zazwyczaj małe pakiety i po zainstalowaniu zajmują tyle samo lub mniej niż domyślna instalacja.
Aby ułatwić poruszanie się w tym gąszczu, możemy posłużyć się opisami pakietów:
poldek:/all-avail> desc proftpd-inetd |
poldek:/all-avail> desc -f proftpd-inetd |
poldek:/all-avail> search -f */sendmail |
Nazwy pakietów mają następującą budowę: {$nazwa}-{$wersja}.{$arch}.rpm np.: 0verkill-0.16-3.i686.rpm. Tak wyglądają nazwy pakietów w systemie plików lub na serwerze FTP. W menedżerach pakietów posługujemy się jedynie nazwą lub nazwą i wersją (nie licząc instalacji za pomocą rpm-a).
Tabela 1. Opis zawartości pakietów w zależności od ich nazwy
Nazwa pakietu | Zawartość |
---|---|
program, program-core | główny pakiet programu, zawiera pliki wykonywalne, dokumentację, skrypty startowe w przypadku usług, niekiedy biblioteki |
program-common | podstawowe, wspólne pliki; zwykle samodzielny taki pakiet jest bezużyteczny i wymaga zainstalowania dodatkowych pakietów |
program-libs | zestaw bibliotek stworzonych na potrzeby danego programu, są niekiedy wymagane przez inne programy |
program-tools, program-utils, program-progs | dodatkowe narzędzia, zwykle nie są konieczne do podstawowej pracy programu |
program-extras | dodatkowe, rzadziej używane elementy |
program-mod, program-plugin, program-applets, program-addon | różnej maści moduły, "wtyczki", applety i dodatki przeważnie nie są konieczne do podstawowej pracy programu |
program-skin(s), program-theme(s) | "skórki" i "tematy" modyfikujące wygląd programu |
program-driver | sterowniki |
program-backend | specjalne interfejsy służące do rozszerzania możliwości programu, łączenia z innymi programami, sprzętem itp. |
program-i18n | dodatkowe wersje językowe |
program-doc | dokumentacja programu |
program-devel | pakiety potrzebne dla programistów i osób które zajmują się własnoręczną kompilacją programów, bądź budowaniem pakietów. |
program-static | program skompilowany statycznie - nie wymaga bibliotek |
program-debuginfo | informacje dla debuggera - pliki użyteczne tylko dla osób badających problemy z działaniem programu |
lib_nazwa_biblioteki | zestaw uniwersalnych bibliotek, nie związanych z żadnym konkretnym programem. |
usługa-inetd, usługa-standalone | alternatywne pakiety służące do wyboru trybu pracy niektórych usług. Należy wybrać jeden z nich: uruchamianie przez Inetd lub praca w tle (standalone). Pakiety te wzajemnie się wykluczają na poziomie mechanizmu zależności. |
usługa-init | skrypty startowe programu |
metapackage-program | metapakiet |
program-legacy | starsze wersje programów lub sterowniki do starszych urządzeń |
kernel | pakiety okołokernelowe, zostały omówione w sekcja Jądro systemu w rozdział Kernel i urządzenia |
Wadą silnego rozdrobnienia pakietów jest pracochłonne zarządzanie, aby temu zaradzić stworzono tzw. metapakiety, zwane również pakietami wirtualnymi. Są to pakiety zawierający jedynie wymagania (requires), nie zawierają żadnych plików, ani własności (provides). Ich zadaniem jest zautomatyzowana instalacja większych grup pakietów oraz utrzymanie wstecznej zgodności w nazwach.
Część metapakietów łatwo odnajdziemy dzięki nazwie,
która zawiera słowo metapackage,
np. metapackage-gnome. Aby poznać
listę wymagań takiego pakietu, użyjemy opisanego nieco
wcześniej polecenia desc -r
trybu
interaktywnego Poldka.
Prace przy zarządzaniu pakietami niekiedy kończą się komunikatami skierowanymi do administratora, są to dość ważne informacje, dlatego powinniśmy je uważnie czytać. Zazwyczaj dotyczą plików konfiguracji, zarządzania użytkownikami/grupami, modyfikacji systemu rc-skryptów oraz zalecenia dalszego postępowania po instalacji pakietu. Dla przykładu poniżej przedstawiono komunikaty wyświetlane po instalacji Exim-a:
Adding group exim GID=79. Adding user exim UID=79. Run "/etc/rc.d/init.d/exim start" to start exim daemon. |
Pakiety, oprócz plików programu, zawierają dokumentację, przykładowe pliki konfiguracji, strony podręcznika systemowego (man, info) oraz automatykę. Owa automatyka jest uruchamiana w trakcie instalowania bądź odinstalowania pakietu i wykonuje konieczne prace w systemie, dzięki czemu zmniejsza się nakład pracy administratora do absolutnego minimum. Jest tak skonstruowana, aby nie zaskakiwać administratora w najmniej oczekiwanych momentach oraz zapewnić nieprzerwanie działanie systemu, poniżej przedstawiono kilka przykładów jej działania.
Jeśli instalujemy w systemie jakąś usługę to zostanie zapisana odpowiednia informacja do skryptów startowych i nowe oprogramowanie uruchomi się przy najbliższej zmianie trybu pracy lub restarcie systemu. Jeżeli jakaś usługa jest wyłączona z działania i nastąpi jej aktualizacja, to w dalszym ciągu nie będzie uruchamiana.
Jeśli działa usługa, a my ją zaktualizujemy lub doinstalujemy dodatkowy moduł, to zostanie ona automatycznie zrestartowana lub taka operacja zostanie zasugerowana przez pakiet. Będzie to zależało od ustawienia opcji RPM_SKIP_AUTO_RESTART w konfiguracji rc-skryptu lub globalnie w /etc/sysconfig/rpm - opcja przyjmuje wartość yes/no. Konfigurację rc-skryptów dokładniej omówiono w sekcja Zarządzanie podsystemami i usługami w rozdział Administracja.
Po aktualizacji pakietu nie są naruszanie istniejące pliki konfiguracji, nowe wersje tych plików są zapisywane z rozszerzeniem ".rpmnew". Przykładowo po zaktualizowaniu pakietu sudo obok pliku /etc/sudoers pojawi się nowy plik o nazwie /etc/sudoers.rpmnew, tak więc zaktualizowany program będzie używał starego pliku konfiguracji. W większości wypadków nie będzie to stanowić problemu, jednak dla pewności należy skonfigurować plik dostarczony z nowszym pakietem na wzór poprzedniej konfiguracji i zmienić mu nazwę poprzez usunięcie omawianego rozszerzenia. Jest to pierwsza rzecz, którą należy sprawdzić w razie problemów z działaniem programu po aktualizacji.
Kiedy odnajdziemy plik *rpmnew to możemy łatwo sprawdzić czym różni się jego zawartość w stosunku do obecnie używanego pliku konfiguracji. Posłużymy się w tym celu programem diff z pakietu diffutils np.:
# diff jakis_plik.conf jakis_plik.conf.rpmnew |
W przypadku niektórych programów, po odinstalowaniu pakietu, pozostawiane są jego pliki konfiguracji, posiadają one rozszerzenie ".rpmsave", możemy je zachować lub skasować jeśli uznamy że są nam zbędne.
Osoby chcące trzymać porządek w systemie powinny zajmować się plikami .rpmnew i .rpmsave od razu po pracy z menadżerem pakietów. Pliki łatwo odnajdziemy, gdyż występują zwykle w katalogu /etc, odszukamy je następująco:
$ find /etc -name "*rpmnew" $ find /etc -name "*rpmsave" |
W PLD programy są kompilowane dla wielu architektur sprzętowych, pozwala to na używanie systemu na bardziej różnorodnym sprzęcie oraz na lepsze dopasowanie do używanego procesora. Architekturę pakietu rozpoznamy po nazwie, jest to kilkuznakowe oznaczenie znajdujące się tuż przed rozszerzeniem pliku. W przypadku pakietu 0verkill-0.16-3.i686.rpm jego architektura to i686.
Aby sprawdzić architekturę komputera, używamy polecenia arch lub uname -m.
Pakiety zbudowane dla poszczególnych architektur są umieszczane w odpowiednich katalogach na serwerze. Ścieżka katalogów na serwerze wygląda następująco:
/dists/{$wersjaPLD}/PLD/{$architektura} |
Tabela 2. Lista nazw kodowych architektur i odpowiadających im rodzin procesorów:
Nazwa architektury | Obsługiwana platforma | Dostępna wersja PLD |
---|---|---|
alpha | DEC/Compaq/HP Alpha AXP | Ra, Ac |
amd64 / x86_64 | AMD K8: Opteron, Athlon 64, Sempron (socket: 754, 939), Intel EM64T | Ac, Th |
athlon | AMD K7: Athlon, Duron, Sempron (socket A) | Ac |
i386 | wszystkie procesory zgodne z i386 firmy Intel | Ra, Ac |
i486 | Intel 486, AMD K5 (socket 3) i nowsze | Th |
i586 | Intel 586 Pentium, Cyrix 5x86, Cyrix 6x86, AMD K5 (socket 7), AMD K6 i nowsze | Ra, Ac |
i686 | Intel Pentrium II, Pentium PRO, AMD K7 i nowsze | Ra, Ac, Th |
ppc | PowerPC | Ra, Ac |
sparc | Sun SPARC 32bit | Ra, Ac |
sparc64 | Sun SPARC 64bit | Ac |
noarch | dowolna | - |
Należy pamiętać by instalować pakiety wyłącznie przeznaczone dla używanej architektury. Wyjątkiem są pakiety z oznaczeniem noarch oraz pakiety przeznaczone dla procesorów Intel x86 i zgodnych: i386, i486, itd.
Architektury z rodziny x86 są bardziej lub mniej wyspecjalizowanymi grupami, najbardziej ogólna jest 386, zaś każda następna w kolejności jest bardziej wyspecjalizowana. Im węższa specjalizacja grupy tym mniej modeli procesorów obsługuje. Przykładowo na maszynie z procesorem Pentium III (i686) możemy zainstalować system w wersji i386, ale na procesorze 386 wersja i686 nie będzie działać. Jeśli mamy nowszy procesor, to będziemy mogli użyć bardziej wyspecjalizowanej architektury, a co za tym idzie lepiej wykorzystać jego potencjał.
W PLD jest kilka grup pakietów (źródeł) w ramach tej samej wersji dystrybucji, różnią się one wersjami pakietów i zastosowaniem. Ich listę uzyskamy za pomocą Poldka:
$ poldek -l |
main (np. th): główne źródło pakietów (domyślne), zawiera stabilne wersje, od chwili wydania danej wersji dystrybucji, nie są tu dokonywane żadne zmiany
obsolete (np. th-obsolete): stare pakiety, usunięte z main w wyniku aktualizacji. Dzięki temu źródłu, możemy wrócić do starszej wersji pakietu, jeśli zajdzie taka konieczność. Źródło wprowadzone w Th.
test (np. th-test): trafiają tu pakiety prostu z builderów, bez sprawdzenia czy w ogóle działają i czy są spełnione zależności. Używanie pakietów z tego źródła jest dosyć ryzykownym krokiem, dlatego należy go wykonywać wyłącznie w ostateczności
ready (np. th-ready): następny krok w życiu pakietu, jeśli pakiety działają bez zarzutu, to są przenoszone razem z zależnościami do main. Pakiety te są już wstępnie przetestowane, nadal jednak powinniśmy zachować ostrożność instalując pakiety z tego katalogu
debuginfo (np. th-debuginfo, th-ready-debuginfo): pakiety zawierające wyłącznie symbole potrzebne przy debugowaniu. Pakiety te są pomocne dla programistów i deweloperów.
home: źródło lokalne, pozwala łatwo instalować pakiety z katalogu ~/rpm/RPMS - miejsca domyślnego umieszczania własnoręcznie zbudowanych pakietów.
Multilib
W środowisku x86_64 możemy używać także aplikacji 32 bitowych, aby wygodnie instalować pakiety zostały przygotowane źródła multilib /etc/poldek/repos.d/pld-multilib.conf. Domyślnie są przygotowane dla i686.
Źródła używane w starszych wersjach PLD:
updates (np. ac-updates) - aktualizacje, zaleca się regularne sprawdzanie czy nie pojawiają się tu nowe pakiety, źródło stało się zbędne w Th i nie jest używane. W Th w roli updates używa się źródła ready. W Ra istniały dwa niezależne źródła pakietów z aktualizacjami: {$wersja}-updates-security i {$wersja}-updates-general. W Ac nastąpiło ich połączenie i od tej pory źródło nazywa się {$wersja}-updates.
supported (np. ac-updates) - nietypowe pakiety, które nie powinny być trzymane w głównym źródle. Są tu umieszczane pakiety rzadko używane lub starsze wersje, podobnie jak updates przestało mieć rację bytu w Th.
Aby wybrać źródło inne niż domyślne należy użyć
parametru -n
np.:
$ poldek -n th -n th-ready |
$ poldek -n debuginfo --up |
Poldek jest dostarczany z właściwie skonfigurowanymi etykietami, są one zdefiniowane w plikach /etc/poldek/source.conf i /etc/poldek/repos.d/pld.conf. Adresy oficjalnych serwerów i mirrorów znajdziemy w sekcja Serwery z pakietami w rozdział Zasoby sieciowe PLD. Etykieta źródła rozpoczyna się od przedrostka określającego wersję dystrybucji, zapisaną małymi literami, poniżej przedstawiono ją jako ciąg {$wersja}, który może mieć wartość np. ra, ac lub th. Ciąg {$arch} to architektura pakietów.
main: dists/{$wersja}/PLD/{$arch}/PLD/RPMS
obsolete: dists/{$wersja}/obsolete/{$arch}/RPMS
test: dists/{$wersja}/test/${arch}/
ready: dists/{$wersja}/ready/${arch}/
home: katalog lokalny: ~/rpm/RPMS
Zbudowany pakiet trafia do test gdzie oczekuje na zbudowanie zależności, następnie jest przenoszony przez RM-a do ready. kiedy wszytko jest w porządku trafia w końcu do main/updates. W przypadku bardziej krytycznych pakietów kiedy pojawia się aktualizacja to starsza wersja trafia do obsolete. Proces ten został szerzej opisany w podręczniku dewelopera.
W większości wypadków będziemy korzystali z gotowych pakietów, zdarza się jednak, że nie ma dostępnego jakiegoś pakietu lub nie odpowiadają nam opcje z jakimi został skompilowany. Co więcej może się zdarzyć, że będziemy potrzebować starszej, niedostępnej już wersji programu.
W takim wypadku nie powinniśmy pod żadnym pozorem kompilować samodzielnie programów, jeśli nie upewnimy się, że nie można go zbudować.
Budowanie jest operacją tworzenia pakietów na podstawie plików spec, do tego nie potrzeba umiejętności tworzenia speców ani wiedzy dewelopera. Wystarczy odpowiednio przygotować środowisko, zainstalować kilka pakietów i użyć odpowiedniego narzędzia. Tak utworzymy nasz własny, prywatny builder, który może nam wielokrotnie służyć.
Opis budowania pakietów odnajdziemy w przewodniku dla deweloperów PLD, wszystkie potrzebne informacje odnajdziemy pod adresem pld-linux.org/DevelopingPLD oraz w sekcja Co jest potrzebne w rozdział Możliwa droga do zostania szeregowym developerem PLD.
Jeśli utworzymy środowisko wg. podanych wskazówek pakiety będą umieszczane w katalogu ~/rpm/RPMS. Ułatwi to ich instalację, gdyż Poldek ma ustawione lokalne źródło dla tego katalogu. Zbudowany pakiet będziemy mogli instalować dowolną ilość razy, warto więc przechowywać je uznamy że mogą nam się jeszcze przydać.
Jeśli wymagamy od programu nietypowej funkcjonalności i budujemy pakiet z niestandardowymi opcjami to może się zdarzyć, że przy aktualizacji zastąpimy naszą wersję programu tą z pakietu dystrybucyjnego. Dlatego musimy być czujni przy operacji aktualizacji lub dopisać nazwę tego pakietu do opcji hold w pliku konfiguracji Poldka.
Poldek jest nakładką na program rpm, zapewniającą wygodny interfejs obsługi oraz kilka dodatkowych funkcji. Poldek jest pośrednikiem w pobieraniu pakietów, indeksuje ich listy oraz ułatwia zarządzanie wieloma źródłami, może pobierać pakiety lokalnie (dyski twarde, napędy optyczne) lub z sieci (FTP, HTTP, HTTPS, SMB, RSYNC). Obsługuje ponadto zależności miedzy pakietami, wykrywa konflikty itp. Poldek nie obsługuje jednak wszystkich operacji możliwych na pakietach RPM, dlatego nie może całkowicie zastąpić programu rpm.
Poldek do wielu operacji (pobieranie pakietów i indeksów, wyszukiwanie informacji itp.) nie wymaga praw administratora, wymagane są jednak do operacji zapisu w systemie, np. instalowanie, odinstalowanie, itp. Poldek w tym celu automatycznie używa programu sudo, z tego względu konieczne jest posiadanie skonfigurowanego sudo, w przeciwnym razie pozostaje nam uruchamianie programu z konta roota.
Konfiguracja Poldka jest dość złożona i wyjaśnienie wszystkich szczegółów zajęło by zbyt wiele miejsca, dlatego zajmiemy się jedynie najczęściej używanymi opcjami. Nie powinniśmy się jednak tym przejmować, program jest gotowy do działania od razu po zainstalowaniu i w większości wypadków nie ma potrzeby nic modyfikować. Musimy jednak się upewnić, że mamy dobrze skonfigurowane adresy serwerów i architekturę pakietów, co zostało omówione w dalszej części rozdziału.
Więcej informacji o poldku i jego konfiguracji odnajdziemy w podręczniku systemowym (man,info) oraz na witrynie projektu pod adresem http://poldek.pld-linux.org.
Konfiguracja Poldka jest przechowywana w kilku plikach wewnątrz katalogu /etc/poldek, to czy dany plik konfiguracji jest używany określa opcja %include, umieszczona w głównym pliku konfiguracji.
poldek.conf - główny plik konfiguracji, jeśli nie zostało zaznaczone inaczej to właśnie ten plik ma na myśli autor
aliases.conf - zawiera zdefiniowane aliasy poleceń dla trybu interaktywnego
fetch.conf - zawiera konfigurację alternatywnych programów do pobierania pakietów, domyślnie konfiguracja z tego pliku nie jest wczytywana.
repos.d/pld.conf - ustawienia źródeł pakietów dla PLD
source.conf - plik przeznaczony dla lokalnych źródeł pakietów
.poldekrc - plik konfiguracji użytkownika, który umieszczamy w katalogu domowym.
W pliku repos.d/pld.conf mamy dwie ważne opcje wskazujące skąd mają być pobierane pakiety. Opcja _pld_arch wskazuje architekturę sprzętową pakietów, zaś _pld_prefix mówi skąd mają być pobierane pakiety i dla jakiej wersji dystrybucji. Więcej o architekturach pakietów znajdziemy w sekcja Architektury pakietów, adresy serwerów i oficjalnych mirrorów zawarto w sekcja Serwery z pakietami w rozdział Zasoby sieciowe PLD.
Poldek zacznie korzystać z proxy po ustawieniu właściwych zmiennych środowiskowych - zarówno w przypadku wbudowanego klienta jak i klientów zewnętrznych (np. wget). Możemy też użyć opcji proxy. Konfigurację proxy dla Linuksa szerzej opisano w sekcja Proxy w rozdział Podstawy.
Poldek przechowuje indeksy pakietów w katalogu zdefiniowanym w opcji cachedir, domyślnie jest to $HOME/.poldek-cache. Jest to dobre rozwiązanie jeśli z Poldka korzysta jeden użytkownik, jeśli ma używać go więcej osób to lepiej ustawić wspólny katalog np. /var/cache/poldek-cache, w ten sposób unikniemy wielokrotnego pobierania indeksów.
use sudo - użycie sudo przy uruchomieniu z konta zwykłego użytkownika.
hold - blokuje aktualizację pakietów które znalazły się na jej liście.
ignore - opcja ukrywająca podane pakiety na liście dostępnych.
choose equivalents manually - pozwala wybierać użytkownikowi jeden z kilku pakietów oferujących tą samą funkcjonalność, domyślnie wyłączona przez co wybór następuje automatycznie. Pozwala bardzo precyzyjnie wybierać pakiety do zainstalowania.
Kolejną ważną jego cechą jest możliwość pracy zarówno w trybie wsadowym jak i interaktywnym. Pierwszy z nich nadaje do wszelkiej maści skryptów i automatyki, zaś drugi jest wygodniejszy do bezpośredniej obsługi przez użytkownika. Komfort pracy w trybie interaktywnym sprawia, że użytkownicy na co dzień korzystają niemal zawsze z niego. Stąd jeśli nie zostało to inaczej napisane to właśnie ten tryb autor ma na myśli.
Praca w trybie interaktywnym przypomina do złudzenia używanie powłoki systemowej (shella). Dostępne są: historia poleceń, pomoc, dopełnianie komend i nazw pakietów, aliasy, potoki itp. Na potrzeby tego rozdziału w przykładach taki tryb będziemy sygnalizować następującym znakiem zachęty:
poldek> |
Jedną z największych zalet trybu interaktywnego jest dopełnianie nazw pakietów i poleceń za pomocą tabulatora. Przykładowo naciśnięcie klawisza tab po poleceniu:
poldek> upgrade |
W przypadku nazw pakietów możemy używać "gwiazdki" jako znaku zastępczego (wildcard), który zastępuje dowolny ciąg znaków. Przedstawiono to na poniższym przykładzie, który spowoduje zainstalowanie wszystkich pakietów o nazwach zaczynających się od "gnome-theme"
poldek> install gnome-theme* |
Zazwyczaj nie ma potrzeby podawania wersji programu, jednak w pewnych przypadkach możemy mieć dostępnych kilka wersji tego samego pakietu (np. przy używaniu wielu źródeł na raz). Wtedy musimy podać jednoznacznie wersję pakietu.
Mamy do dyspozycji potoki:
poldek> ls perl* | grep curses |
Możemy również wywoływać polecenia zewnętrzne:
poldek> ls perl* | !wc -l |
W obsłudze źródeł i pakietów występuje wiele podobieństw do systemu plików. Źródła są traktowane jak katalogi zaś pakiety jak pliki, do poruszania się w tym środowisku używamy poleceń takich jak pwd, ls oraz cd.
Opis wszystkich parametrów trybu wsadowego uzyskamy dzięki poleceniu
$ poldek --help |
$ poldek --shcmd="desc apache" |
$ ipoldek desc apache |
Poldek uruchomiony po raz pierwszy (bez podawania parametrów) sprawdza czy istnieją indeksy dla źródeł, które ma automatycznie obsługiwać. Jeśli ich nie ma, to zostaną automatycznie pobrane i zapisane w miejscu wskazanym przez omówioną powyżej opcję cachedir. Po tej operacji zostanie uruchomiony Poldek trybie interaktywnym i będzie gotowy do pracy. Przed każdą kolejną pracą z programem musimy uaktualnić indeksy pakietów, na wypadek gdyby w źródłach nastąpiły zmiany, w przeciwnym razie możemy otrzymywać komunikaty o braku pakietów. Aby uaktualnić indeksy domyślnych źródeł wywołujemy następująco program z powłoki systemowej:
$ poldek --up |
--upa
,
dla pozostałych źródeł musimy podać ich nazwę po parametrze
-n
,
źródła pakietów zostały omówione w dalszej części rozdziału.
Po uruchomieniu programu mamy od razu możliwość zarządzania pakietami, aby zobaczyć listę dostępnych poleceń wpisujemy help i naciskamy klawisz Enter. Większość poleceń ma składnię:
poldek> {$polecenie} {$pakiet} {$opcje} |
poldek> {$polecenie} -? |
Aby opuścić program wpisujemy polecenie quit lub wciskamy ctrl+d
Mamy dostępne następujące polecenia zarządzania pakietami:
operacje instalacji (install), aktualizacji
pakietów (upgrade), usuwania pakietów
(uninstall), pobierania pakietów bez
instalacji (get). Ponadto mamy polecenia do
zbierania danych o pakietach: wyświetlanie listy dostępnych
(ls), wyświetlenia informacji
(desc) oraz przeszukiwania bazy
(search).
W wielu przypadkach pomocna będzie opcja -t
,
która przeprowadzi symulację całej operacji, dzięki której
dowiemy się jak duże i jak istotne zmiany zostaną dokonane
w systemie po operacji. Najczęściej jest używana przy
aktualizacji i usuwaniu pakietów.
Poniżej zamieszczono kilka przykładów zarządzania pakietami, na początek przykład wyświetlenia listy pakietów (wszystkich zaczynających się od zsh):
poldek> ls zsh* |
poldek> desc zsh |
poldek> install zsh |
poldek> uninstall zsh |
To jedynie podstawowe polecenia, więcej informacji znajdziemy w pomocy Poldka.
Poldek ma kilka zdefiniowanych źródeł pakietów w plikach source.conf i repos.d/pld.conf, pierwszy z plików jest głównym plikiem konfiguracji źródeł, drugi zaś zawiera wpisy dla oficjalnych źródeł PLD. Aby wyświetlić listę skonfigurowanych źródeł, wraz użytymi opcjami użyjemy polecenia:
$ poldek -l ac ftp://ftp.ac.pld-linux.org/dists/ac/PLD/athlon/PLD/RPMS/ (type=pndir) ac-ready ftp://ftp.ac.pld-linux.org/dists/ac/ready/athlon/ (noauto,type=pndir) ac-supported ftp://ftp.ac.pld-linux.org/dists/ac/supported/athlon/ (noauto,type=pndir) ac-test ftp://ftp.ac.pld-linux.org/dists/ac/test/athlon/ (noauto,type=pndir) ac-updates-general ftp://ftp.ac.pld-linux.org/dists/ac/updates/general/athlon/ (noauto,type=pndir) ac-updates-security ftp://ftp.ac.pld-linux.org/dists/ac/updates/security/athlon/ (type=pndir) home /home/users/qwiat/rpm/RPMS/ (noauto,noautoup,type=dir) |
Nie wszystkie źródła są obsługiwane automatycznie,
zależy to od ustawienia
opcji noauto w konfiguracji danego źródła
(zauważymy ją też na powyższym zrzucie ekranu).
Aby tymczasowo użyć innego zestawu źródeł przy uruchomieniu
musimy podać ich listę poprzedzonych parametrem
-n
np.:
$ poldek -n ac -n ac-ready |
Istnieje możliwość instalacji pakietów Poldkiem z lokalnych
źródeł, zamiast posługiwania się programem rpm.
W pliku source.conf zdefiniowane
jest źródło home, które służy do wygodnego
instalowania pakietów z katalogu
$HOME/rpm/RPMS, używanego powszechnie
do umieszczania samodzielnie budowanych
pakietów. Nie ma jednak potrzeby każdorazowego
umieszczania tam pakietów jeśli to uznamy za konieczne.
Możemy utworzyć tymczasowe źródło lokalne na podstawie
zawartości katalogu za pomocą
opcji -s
:
poldek -s /jakis/katalog |
Poldek po uruchomieniu tworzy dla wygody dodatkowe źródła wirtualne: all-avail i installed. Pierwsze zawiera sumę pakietów ze wszystkich wskazanych źródeł, drugie to lista zainstalowanych pakietów.
Przy pracy z samodzielnie podawanymi źródłami należy wskazywać też główne źródło pakietów (main), tak aby mogły zostać pobrane pakiety wymagane w ramach zależności. W przeciwnym razie możemy otrzymać błędy o nieistniejących pakietach.
Przy pracy z wieloma pakietami
możemy utracić możliwość przewinięcia ekranu
w celu odczytania najstarszych komunikatów.
Aby temu zaradzić użyjemy opcji --log
,
dzięki której, wskażemy plik do którego trafią
wszystkie komunikaty.
Używając programu rpm posługujemy się następującym schematem: rpm [opcje] pakiet.rpm
Instalacja pakietu jest dosyć prosta. Załóżmy że pobraliśmy
z sieci plik
docbook-dtd31-sgml-1.0-12.noarch.rpm,
teraz jedyną rzeczą jaką musimy wykonać jest wydanie polecenia
rpm z opcją -i
. Używając
kombinacji -ivh
dla procesu instalacji,
-Uvh
uzyskamy pasek postępu instalacji dla
poszczególnych instalowanych pakietów.
# rpm -i docbook-dtd31-sgml-1.0-12.noarch.rpm |
Brak ostrzeżeń lub błędów oznacza prawidłową instalację, teraz nieco skomplikujemy sytuację:
# rpm -i libghttp-devel-1.0.9-4.i686.rpm error: failed dependencies: libghttp = 1.0.9 is needed by libghttp-devel-1.0.9-4 |
Tym razem instalacja się nie powiodła, ponieważ pakiet libghttp-devel wymaga zainstalowanego pakietu libghttp. Aby instalacja pakietu się powiodła wykonujemy następujące polecenie:
# rpm -i libghttp-devel-1.0.9-4.i686.rpm libghttp-1.0.9-4.i686.rpm |
Teraz wszystko jest w porządku, oba pakiety są zainstalowane.
Możliwe jest instalowanie pakietu z opcją ignorowania
zależności: --nodeps
,
opcję tą stosujemy jednak w ostateczności.
Aktualizacja przebiega podobnie jak instalacja, tyle że używamy
przełącznika -U
np.:
# rpm -U docbook-dtd31-sgml-1.0-13.noarch.rpm |
Należy pamiętać o tym, że aktualizacja nastąpi tylko wtedy gdy w systemie jest zainstalowana starsza wersja, w przeciwnym wypadku zostaniemy poinformowani, że pakiet jest już zainstalowany. Aby dokonać reinstalacji pakietu wykonujemy polecenie
# rpm -i docbook-dtd31-sgml-1.0-13.noarch.rpm --force |
Zainstalowaliśmy kilka pakietów, teraz możemy spróbować je
odinstalować - wykonujemy to przy użyciu opcji
-e
.
# rpm -e libghttp-devel-1.0.9-4.i686.rpm libghttp-1.0.9-4.i686.rpm error: package libghttp-devel-1.0.9-4.i686.rpm is not installed error: package libghttp-1.0.9-4.i686.rpm is not installed |
Cóż tu się stało? Podano nieprawidłową nazwę pakietu, należy pamiętać o tym, że przy odinstalowaniu pakietu nie podaje się rozszerzenia pakietu. Poprawne polecenie przedstawiono poniżej:
# rpm -e libghttp-devel libghttp |
lub:
# rpm -e libghttp-devel-1.0.9-4 libghttp-1.0.9-4 |
Uwaga: pierwszy przykład stosuje się w przypadku zainstalowania jednej wersji pakietu, drugi zaś używa się w przypadku kilku różnych (np. dwie różne wersje jądra).
Program rpm posiada o wiele bogatsze opcje, przedstawiono tu zaledwie kilka najważniejszych, więcej można znaleźć w podręczniku systemowym (man/info).
Dobrym zwyczajem jest używanie Poldka z poziomu zwykłego użytkownika z włączoną obsługą sudo:
use sudo = yes |
W PLD mamy możliwość kontrolowania podpisów pakietów, dzięki czemu zyskujemy pewność, że instalujemy pakiety z zaufanego źródła. Importując klucz klucz publiczny GPG unikamy również zasypywania następującymi komunikatami:
Nagłówek V3 sygnatura DSA: NOKEY, key ID 1bbd5459 |
Zaczynamy od zaimportowania klucza publicznego (dla Ac) z serwera FTP:
rpm --import ftp://ftp.pld-linux.org/dists/2.0/PLD-2.0-Ac-GPG-key.asc |
signed = yes |
[source] type = %{_ac_idxtype} name = ac path = %{_pld_prefix}/PLD/%{_pld_arch}/PLD/RPMS/ signed = yes |
Teraz Poldek będzie ostrzegał przy instalacji niepodpisanego pakietu:
uwaga: rhythmbox-0.9.8-2.athlon.rpm: gpg/pgp nie znaleziono podpisu błąd: rhythmbox-0.9.8-2: signature verification failed Wystąpiły błędy weryfikacji podpisu. Kontynuować? [y/N] |
Więcej informacji w dokumentacji programu rpm i Poldka.
Jeśli chcemy utworzyć listę zainstalowanych pakietów w kolejności wg. daty instalacji to posłużymy się poleceniem
# rpm -qa --last |
Bywa, że pakiet w wyniku błędów w skryptach
nie pozwala się odinstalować, możemy go jednak
łatwo usunąć wydając polecenie deinstalacji z
parametrem --noscripts
np.:
# rpm -e lockdev-1.0.2-1 --noscripts |
Jeśli obawiamy się aktualizacji jakichś pakietów, możemy posłużyć się operacją repackage - ponownego umieszczenia plików w pakiecie rpm. Jeśli program po aktualizacji odmawia posłuszeństwa, wystarczy ponownie zainstalować pakiet w starszej wersji. Aby włączyć repakietację wystarczy, że ustawimy niezerową wartość dla makra %_repackage_all_erasures w pliku /etc/rpm/macros:
%_repackage_all_erasures 1 |
poldek> upgrade geninitrd-10000.18-6.noarch --pmop=--repackage |
# rpm -U --repackage geninitrd-10000.18-6.noarch |
Aby cofnąć wersję pakietu wykonujemy następującą operację:
rpm -U --oldpackage /var/spool/repackage/1189984560/geninitrd-10000.18-6.noarch |
Zdarza się, że potrzebujemy sprawdzić czy nie nastąpiły w systemie uszkodzenia jakichś plików lub ich modyfikacje. Takie zdarzenia mogą się pojawić w wypadku uszkodzenia systemu plików, błędu człowieka lub ataku crackera. W obu przypadkach możemy posłużyć się weryfikacją pakietów RPM. Kontrola przyniesie oczekiwany skutek tylko wtedy, gdy jesteśmy pewni, że sama baza RPM nie została skompromitowana lub uszkodzona.
Aby uzyskać listę zmodyfikowanych plików użyjemy programu rpm:
# rpm --verify --all ......G. /etc/cups S.5....T /usr/lib/libsasl2.so.2.0.22 S....... c /etc/xml/catalog .M...UG. c /etc/samba/smb.conf |
Załóżmy, że poznaliśmy listę zmodyfikowanych plików i chcemy na jej podstawie stworzyć listę pakietów do reinstalacji. Zaczynamy od odfiltrowania wszystkiego prócz nazw plików:
# rpm --verify --all | sed 's/.*\ //' > pliki.txt |
# cat pliki.txt | xargs rpm -qf --qf '%{NAME}\n' | sort -u > pakiety.txt |
# poldek --reinstall --pset pakiety.txt |
System pakietów RPM opiera się na bazie w postaci plików przechowywanych w katalogu /var/lib/rpm. Nagłe przerwanie pracy programu, który na niej operował może zaowocować błędami w jej strukturze. Na początek należy się upewnić, że żaden z procesów nie operuje na bazie:
# lsof | grep /var/lib/rpm |
# rm -f /var/lib/rpm/__db* |
# tar -czf rpm.tar.gz /var/lib/rpm/ |
# rpm --rebuilddb |
# rpm -qa |
--justdb
, powodującą jedynie
modyfikowanie bazy RPM.
Zdarza się, że potrzebujemy zainstalować na nowo wszystkie pakiety, np. w wypadku zainstalowania pakietów w niewłaściwej architekturze. Nie jest to pracochłonna operacja, wystarczy, że z powłoki Poldka wydamy polecenie:
poldek> install -F * --reinstall --nodeps --nofollow |
Ten rozdział zawiera dostępnych w PLD bootloaderów
Podczas startu naszego komputera z naszego dysku uruchamiany jest bootloader. To właśnie on odpowiada za załadowanie prawidłowego jądra systemu, czy też przekazywanie do jądra specjalnych parametrów. Dla architektur x86 mamy do wyboru jeden z dwóch bootloaderów: LILO oraz Grub (brak wersji 64 bit).
Oba bootloadery pozwalają na przekazywanie do jądra specjalnych parametrów, dzięki którym możemy wpływać na start lub pracę systemu jeszcze przed jego załadowaniem. Parametry przekazane przed startem systemu będą przesłaniać te użyte w konfiguracji bootloadera. W poniższej tabeli przedstawiono najczęściej używane opcje.
Przekazywanie parametrów jądra wygląda podobnie w obu wypadkach, po włączeniu specjalnego trybu w bootloaderze otrzymujemy wiersz, na końcu którego dopisujemy potrzebne nam parametry lub modyfikować istniejące. Poniżej przedstawiamy przykładowe dodanie parametru init w bootloaderze Grub:
grub append> root=/dev/sda2 init=/bin/sh |
Tabela 1. Parametry jądra
Parametr | Znaczenie | Przykład |
---|---|---|
{$nr}/single |
Cyfra (1-5) wskazująca który poziom uruchomieniowy (run level), opcja single to tryb jednego użytkownika. Dzięki nim opcjom można przesłonić ustawienie opcji initdefault z pliku /etc/inittab. Więcej o poziomach pracy w sekcja Zmiana poziomu pracy systemu w rozdział Administracja, zaś o pliku /etc/inittab przeczytamy w sekcja Kluczowe pliki w rozdział Konfiguracja systemu. | single lub 1 |
root={$urządzenie} |
Wskazanie urządzenia (partycji) na którym znajduje się główny system plików. Wartością parametru może być ścieżka do urządzenia w katalogu /dev (np. /dev/hda1) lub wartość liczbowa powstała z połączenia szesnastkowej wartości liczb major i minor urządzenia. Major podajemy w postaci jednej cyfry, natomiast minor powinien być już rozwinięty do dwóch. Przykładowo urządzenie o wartościach major 3 i minor 1 będzie przedstawiane jako 301, 0301 lub 0x301 (wartości 3 i 1 są takie same w systemie dziesiętnym i szesnastkowym). Urządzenia oraz liczby major i minor szerzej opisano w sekcja Urządzenia w rozdział Kernel i urządzenia | root=/dev/hda1 lub root=0x301 |
init={$program} | Wskazanie programu, który ma zostać użyty zamiast domyślnego programu Init; opcja używana w krytycznych sytuacjach, np. gdy system nie może zostać uruchomiony nawet w trybie single. | init=/bin/bash |
vga={$tryb} | Wskazanie trybu bufora ramki, więcej o buforze ramki w następnym rozdziale. | vga=0x303 |
Opis wybranych parametrów jądra zamieszczono na stronie http://www.jtz.org.pl/Html/BootPrompt-HOWTO.pl.html, zaś pełną ich listę odnajdziemy w dokumentacji jądra, w pliku /usr/src/linux/Documentation/filesystems/devfs/boot-options
Są również specjalne parametry, które przekazuje się do jądra w trakcie pracy systemu, opisaliśmy je w sekcja Parametry jądra w rozdział Kernel i urządzenia.
Oba bootloadery mają możliwość instalacji zarówno w obszarze MBR dysku, jak i bootsectorze partycji. Instalacja w MBR jest dosyć wygodna i o wiele bardziej popularna, dlatego właśnie tam powinniśmy instalować bootloader. Instalacja w bootsectorze w wypadku niektórych systemów plików (np. XFS) jest niemożliwa, gdyż ich superblok jest umieszczany na samym początku partycji - w miejscu które powinno być zarezerwowane dla bootloadera.
Frame Buffer (bufor ramki) to m.in. mechanizm pozwalający na pracę konsoli w wyższych rozdzielczościach. Aby go włączyć przekazujemy parametr vga przy uruchomieniu bootloadera lub dodajemy go do pliku konfiguracji np.:
vga=0x303 |
Wartość opcji vga to numer trybu graficznego dla danej rozdzielczości i głębi koloru, listę dostępnych trybów przedstawiono w poniższej tabeli. Kodowe oznaczenia trybów bufora ramki możemy podawać zarówno szesnastkowo jak i dziesiętnie, dlatego też w tabeli, obok wartości szesnastkowych umieszczono wartości w systemie dziesiętnym (w nawiasach).
Tabela 2. Tryby bufora ramki
Głębia koloru | 640x480 | 800x600 | 1024x768 | 1280x1024 |
---|---|---|---|---|
256 (8 bit) | 0x301 (769) | 0x303 (771) | 0x305 (773) | 0x307 (775) |
32k (15 bit) | 0x310 (784) | 0x313 (787) | 0x316 (790) | 0x319 (793) |
65k (16 bit) | 0x311 (785) | 0x314 (788) | 0x317 (791) | 0x31A (794) |
16M (24 bit) | 0x312 (786) | 0x315 (789) | 0x318 (792) | 0x31B (795) |
Zamiast wskazywać konkretny tryb możemy opcji vga przypisać wartość ask, dzięki temu jądro pozwoli wyświetlić listę trybów i wybrać jeden z nich. Więcej o buforze ramki dowiemy się z dokumentacji kernela, jeśli zainstalowaliśmy pakiet z dokumentacją jądra to znajdziemy ją w katalogu /usr/src/linux/Documentation/fb.
LILO (LInux LOader) jest najbardziej popularnym linuksowym bootloaderem. Jego instalacja polega na utworzeniu pliku konfiguracyjnego (/etc/lilo.conf) a następnie na wydaniu polecenia lilo w celu instalacji w MBR lub bootsektorze. Każda modyfikacja pliku konfiguracji, wygenerowanie nowego obrazu initrd lub instalacja nowego jądra pociąga za sobą konieczność ponownej instalacji obrazu.
O initrd poczytamy w sekcja Initrd w rozdział Kernel i urządzenia.
Poniżej, dla przykładu przedstawiony został bardzo prosty plik konfiguracji, ma on za zadanie umieścić lilo w MBR dysku twardego, umożliwiając w ten sposób uruchomienie naszej dystrybucji.
boot=/dev/hda read-only lba32 image=/boot/vmlinuz label=pld root=/dev/hda1 initrd=/boot/initrd |
Plik konfiguracji lilo dzieli się na dwie zasadnicze części: blok opcji głównych oraz opcje obrazu. W powyższym przykładzie opcje główne umieszczone są na samym początku (do pustego wiersza). Wartość zmiennej boot mówi gdzie ma zostać zainstalowany bootloader (bootsector/MBR), w tym wypadku jest o MBR dysku. Opcja read-only wymusza start systemu w trybie tylko do odczytu (później jest przemontowany na tryb do odczytu i zapisu), lba32 włącza wykorzystanie 32-bitowego adresowania (jest rozwiązaniem limitu cylindra 1024).
Następna sekcja (ustawienia obrazu) to konfiguracja dla konkretnego systemu operacyjnego (tutaj Linuksa). Każdy system, który mielibyśmy obsługiwać z poziomu lilo, musi mieć taką sekcję. Opcja image rozpoczyna sekcję i jednocześnie wskazuje ściekę do jądra, label to wyświetlana etykieta obrazu, root wskazuje urządzenie z głównym systemem plików, initrd to ścieżka do obrazu initrd (initial ramdisk).
Opcję root szerzej opisano w sekcja Wstęp. Z nazewnictwem urządzeń masowych zapoznamy się w sekcja Nazewnictwo urządzeń masowych w rozdział Pamięci masowe.
Dzięki powyższej konfiguracji bootloader bezzwłocznie uruchomi nasze PLD zainstalowane na pierwszej partycji dysku hda bez zadawania jakichkolwiek pytań. W wielu przypadkach będziemy chcieli przekazać do kernela specjalne parametry lub mieć możliwość wyboru innego systemu operacyjnego (o ile dodaliśmy do lilo taką możliwość). Wtedy konieczne będzie zdefiniowanie dwóch dodatkowych opcji:
prompt timeout=100 |
Istnieje możliwość uruchamiania wielu systemów operacyjnych z poziomu lilo, w tym celu do pliku konfiguracji musimy dodać odpowiednie obrazy i opisane wcześniej opcje prompt i timeout. Poniżej została umieszczona sekcja pozwalająca uruchomić system DOS/Windows umieszczony na dysku hda3.
other=/dev/hda3 label=windows |
Domyślnym obrazem wybranym przez bootloader jest pierwszy w kolejności z pliku konfiguracji. Możemy to ustawienie bardzo prosto modyfikować za pomocą opcji default wskazującej etykietę domyślnego obrazu, np.:
default=pld |
Frame Buffer (bufor ramki) to m.in. mechanizm pozwalający na pracę konsoli w wyższych rozdzielczościach. Aby go włączyć, do konfiguracji linuksowego obrazu lub do sekcji głównej dodajemy parametr jądra vga np.:
vga=0x303 |
image=/boot/vmlinuz label=pld root=/dev/hda1 initrd=/boot/initrd vga=0x303 |
Jeśli zdecydowaliśmy się na wyświetlanie menu początkowego (za pomocą opcji prompt) to możemy się pokusić o ustawienie graficznego menu. Z pakietem lilo dostajemy odpowiednio przygotowane bitmapy, musimy tylko dodać kilka opcji do głównej sekcji pliku konfiguracji.
Wskazujemy interesujący nas obrazek:
bitmap = /boot/lilo-pldblue8.bmp |
bmp-table = 17,9;1,14,16,4 bmp-colors = 0,213,137;152,24,1 bmp-timer = 2,29;152,52,1 |
Kiedy już skonfigurujemy nasz bootloader wydajemy polecenie lilo:
# lilo Added pld * |
GRUB (GRand Unified Bootloader) jest bootloaderem zdobywającym sporą popularność, ze względu na swoją elastyczność i duże możliwości. Jest tak rozbudowany, że musi trzymać część swoich danych na dysku twardym, z tego też względu obsługuje kilka systemów plików i może wykonywać proste operacje dyskowe. GRUB normalnie "widzi" pliki na dysku, a więc widzi własny plik konfiguracji, kernel i obraz initrd. Dzięki temu nie ma potrzeby robienia czegokolwiek po zmianie konfiguracji, wygenerowaniu initrd czy aktualizacji kernela. Jest za to czuły niekiedy na aktualizacje "samego siebie" i wymaga niekiedy ponownej instalacji do MBR-u/bootsectora, nie ma tu jednak żadnej jasnej reguły. GRUB na każdym etapie konfiguracji (w trybie interaktywnym) wspiera nas wbudowaną pomocą oraz dopełnianiem nazw plików, urządzeń i partycji.
Do największych zalet GRUB-a można zaliczyć możliwość zmiany konfiguracji startowej z poziomu działającego bootloadera. Kiedy uruchomiony zostanie bootloader wybieramy obraz a następnie wciskamy klawisz e. Wyświetlą nam się wiersze konfiguracji, możemy je modyfikować za pomocą wbudowanego prostego edytora tekstów. Po skończonej edycji wciskamy klawisz b, aby uruchomić system z wprowadzonymi zmianami.
Kolejną ważną jego cechą jest możliwość używania klawiatury USB, w przeciwieństwie do LILO, jedyną rzeczą jaką musimy zrobić w tym wypadku to włączyć obsługę klawiatury USB w BIOS-ie.
O initrd poczytamy w sekcja Initrd w rozdział Kernel i urządzenia.
Nie używamy nazw dysków opierających się na urządzeniach widniejących w /dev (np. /dev/hda). GRUB przy pomocy BIOS-u sprawdza istniejące dyski i numeruje je począwszy od zera. Dla przykładu, jeżeli posiadamy dwa dyski twarde (np. hda i hdc), pierwszy z nich zostanie oznaczony jako hd0, drugi jako hd1. Sytuacja z partycjami wygląda podobnie, również numerowane są od zera, natomiast pierwsza partycja logiczna będzie oznaczona numerem 4.
Obszar MBR oznaczany jako /dev/hda będzie widziany jako (hd0), partycja /dev/hda1 będzie rozpoznawana jako (hd0,0). Podane nawiasy nie są przypadkowe, jest to cecha składni poleceń GRUB-a.
Urządzenia masowe opisano szerzej w sekcja Nazewnictwo urządzeń masowych w rozdział Pamięci masowe.
Konfiguracja polega na odpowiednim skonfigurowaniu pliku /boot/grub/menu.lst i instalacji bootloadera w MBR/bootsektorze dysku. W poniższych przykładach założyliśmy, że zarówno / (rootfs) jak i /boot leżą na tej samej partycji pierwszego dysku twardego. W przykładowej konfiguracji będzie to /dev/hda1. Poniżej przedstawiono przykładową konfigurację:
timeout 15 title pld root (hd0,0) kernel /boot/vmlinuz root=/dev/hda1 initrd /boot/initrd |
Konfiguracja GRUB-a podzielona jest na sekcję główną i sekcje obrazów, sekcja główna są to ustawienia globalne, zaś konfiguracja obrazów to opcje dla każdego z obsługiwanych systemów operacyjnych. Powyżej mamy sekcję główną oraz sekcję obrazu oddzieloną pustym wierszem.
Opcja timeout w sekcji głównej to czas w sekundach oczekiwania na reakcję użytkownika.
Opcja title w sekcji obrazu to jego etykieta, root(hd0,0) to partycja na której GRUB będzie szukał swoich plików (w PLD GRUB trzyma swoje pliki w /boot/grub). Parametry kernel i initrd to ścieżki do plików kernela i initrd, w powyższym przykładzie będą szukane na urządzeniu (hd0,0) gdyż podane do nich ścieżki są względne. Parametr root= jest parametrem jądra wskazującym położenie głównego systemu plików, opisanym szerzej w sekcja Wstęp. Może mieć zarówno postać liczbową jak i postać nazwy urządzenia z katalogu /dev np. /dev/hda1.
Kiedy plik konfiguracji jest gotowy możemy przejść do instalacji GRUB-a.
Przejdźmy teraz do instalacji GRUB-a w MBR, rozpoczynamy od uruchomienia programu grub, mamy teraz do dyspozycji interaktywną powłokę, oferującą liczne polecenia, dopełnianie oraz pomoc. Rozpoczynamy od polecenia root z parametrem wskazującym miejsce gdzie znajdują się pliki GRUB-a, konieczne do jego instalacji.
grub> root (hd0,0) Filesystem type is xfs, partition type 0x83 |
grub> setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/xfs_stage1_5" exists... yes Running "embed /boot/grub/xfs_stage1_5 (hd0)"... 18 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+18 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded Done. |
grub> quit |
Zakładam, że chcemy dodać system Microsoftu zainstalowany na partycji /dev/hda2, oto sekcja jaką musimy dopisać do /boot/grub/menu.lst:
title Windows rootnoverify (hd0,1) chainloader +1 |
default 2 |
Frame Buffer (bufor ramki) to mechanizm pozwalający m.in. na pracę konsoli w wyższych rozdzielczościach. Aby go włączyć, do parametrów jądra w konfiguracji linuksowego obrazu dodajemy parametr vga np. vga=0x303. Przykładowa konfiguracja obrazu będzie wyglądała następująco:
title pld root (hd0,0) kernel /boot/vmlinuz root=0301 vga=0x303 initrd /boot/initrd |
W pakiecie z GRUB-em dostępne są grafiki, co sugeruje
możliwość wyświetlenia ich w menu, jednak GRUB w PLD
domyślnie ich nie obsługuje. Aby włączyć taką możliwość
musimy samemu zbudować pakiet z opcją
--with splashimage
.
Instalujemy zbudowany pakiet, a następnie do pliku konfiguracji, do sekcji głównej dodajemy opcję wskazującą bitmapę, która ma być wyświetlana np.:
splashimage=(hd0,0)/boot/grub/splash.xpm.gz |
foreground = ffffff background = 000000 |
Grafiki możemy tworzyć samemu, GRUB wymaga indeksowanej bitmapy o 14 kolorach i rozdzielczości 640x480, typu .xpm, plik musi być dodatkowo skompresowany programem Gzip.
Jak już zostało wspomniane, GRUB trzyma część swoich danych w systemie plików, co przy poważnym uszkodzeniu systemu plików może uniemożliwić start systemu. Rozwiązaniem tego problemu, może być umieszczenie gałęzi /boot na osobnej partycji, tak jak to było dawniej robione dla ominięcia ograniczeń starych wersji LILO. Więcej o podziale na partycje odnajdziemy w sekcja Podział na partycje w rozdział Pamięci masowe.
Dla większego bezpieczeństwa partycję taką można montować w trybie tylko do odczytu, musimy jednak wtedy pamiętać o konieczności przemontowania jej do trybu rw, przed każdą aktualizacją jądra, lub bootloadera.
W przypadku nietypowych konfiguracji będziemy zmuszeni do podawania ścieżek bezwzględnych do plików. Podajemy je następująco: (hdX,Y)/katalog/plik np.: (hd0,0)/boot/vmlinuz
GRUB wymaga kompletnej listy urządzeń w katalogu
/dev, stąd mogą pojawić się
problemy przy próbie instalacji go
z chroota opartego o udev. Należy w tym wypadku
podmontować z głównego system katalog
/dev z opcją
-bind
. Pliki urządzeń zostały
dokładniej opisane w sekcja Urządzenia w rozdział Kernel i urządzenia.
Osoby nie przepadające za konfiguracją powyższych bootloaderów, mogą skorzystać z narzędzia o nazwie rc-boot. Jest to proste i wygodne w użyciu narzędzie, stworzone dla potrzeb PLD, które zapewnia uniwersalny interfejs do zarządzania bootloaderem. Został stworzony w celu automatycznego aktualizowania bootloadera po zaktualizowaniu jądra, jednak nie zdobył szerszej popularności wśród użytkowników. Dzięki rc-boot możemy używać dowolnego bootloadera (np. LiLo, Grub), nie znając zasad ich działania czy składni plików konfiguracji.
W gruncie rzeczy korzystanie z rc-boot ma sens wyłącznie przy używaniu LiLo. Bootloader GRUB nie wymaga przeładowania po aktualizacji jądra, dlatego użytkownicy używają właśnie jego zamiast rc-boot.
Aby utworzyć bootloader omawianym narzędziem należy się posłużyć poleceniem rc-boot, to jaki bootloader zostanie użyty i jakie opcje będą ustawione, definiujemy w jednym uniwersalnym pliku konfiguracji: /etc/sysconfig/rc-boot/config. Dodatkowo wymagane są specjalne pliki "obrazów" odpowiadające każdemu systemowi operacyjnemu, który chcemy obsługiwać z poziomu bootloadera. Są to proste pliki konfiguracyjne umieszczane w katalogu /etc/sysconfig/rc-boot/images. Po zainstalowaniu systemu powinien tam być przynajmniej jeden taki plik.
Po zainstalowaniu pakietu rc-boot wymagane są poprawki w konfiguracji pliku /etc/sysconfig/rc-boot/config. Na początek odblokujemy działanie rc-boot:
DOIT=yes |
Kolejno wybieramy bootloader jaki chcemy używać, mamy do wyboru lilo oraz grub:
LOADER=grub |
Następnie ustalamy gdzie ma być zainstalowany bootloader np.: /dev/hda, /dev/hdb2 lub mbr. Wartość mbr oznacza że rc-boot stara się automatycznie wykryć gdzie jest twój MBR (Master Boot Record).
BOOT=mbr |
Jeśli posiadamy więcej niż jeden obraz, możemy wskazać domyślny, poprzez podanie nazwy pliku obrazu z katalogu /etc/sysconfig/rc-boot/images. Definiowanie tej opcji nie jest konieczne, gdyż rc-boot próbuje samemu wykryć domyślny system operacyjny, jednak w naszym przykładzie ustawimy to "na sztywno":
DEFAULT=pld |
Teraz możemy przejść do utworzenia plików obrazów. Mają one bardzo prostą budowę - są to pliki tekstowe składające się z kilku wierszy. Poniższa treść pliku jest wystarczającą konfiguracją do uruchomienia Linuksa, plikowi temu nadamy nazwę "pld".
TYPE=Linux ROOT=/dev/hda3 KERNEL=/boot/vmlinuz INITRD=/boot/initrd |
Opcja TYPE określa rodzaj systemu operacyjnego dla danego obrazu, mamy do wyboru następujące pozycje: Linux, DOS (DOS/Windows), BSD. Opcja ROOT wskazuje partycję na której znajduje się system, wartość podana powyżej jest tylko przykładem. Wartości KERNEL i INITRD są wskazaniami do pliku kernela i pliku initrd - muszą odnosić się do właściwych pozycji w katalogu /boot
Dla każdego kolejnego obsługiwanego systemu operacyjnego należy dodać kolejny plik obrazu. Jeśli chcemy używać systemu firmy Microsoft, należy utworzyć pusty plik o nazwie np. "windows" i umieścić w nim przykładową konfigurację:
TYPE=dos ROOT=/dev/hda1 |
Na koniec generujemy bootloader używając polecenia rc-boot.
# rc-boot pld taken as defult image image: pld * is linux on /dev/hda3 image: windows is dos on /dev/hda1 |
Program rc-boot nadpisze plik konfiguracji wybranego bootloadera, zanim więc użyjemy tego narzędzia powinniśmy na wszelki wypadek zrobić kopię bezpieczeństwa właściwego pliku.
Więcej szczegółów można uzyskać z podręcznika systemowego.
Jedną z silniejszych stron PLD są dobrze przygotowane jądra systemu, pozwala to szybko uruchomić system produkcyjny bez zbędnych przygotowań. Poniżej zamieszczono listę najistotniejszych cech jąder PLD:
funkcjonalność - nakładanych jest wiele łat rozszerzających możliwości domyślnego kernela.
modularność - jądro jest tak małe, jak to tylko możliwe; jeśli czegoś potrzebujemy to wystarczy załadować odpowiedni moduł. Konsekwencją takiego rozwiązania jest konieczność używania obrazu initrd, co zostało drobiazgowo omówione w sekcja Initrd.
elastyczność - mamy wybór kilku jąder, przygotowanych w postaci binarnych pakietów dla kilku najczęstszych zastosowań; dzięki temu unikamy czasochłonnej kompilacji. Dostępne jądra zostały opisane w dalszej części rozdziału.
bezpieczeństwo - domyślny kernel ma nakładaną łatę grsecurity (www.grsecurity.net), ponadto możemy mieć jądro z obsługą Linux VServers (linux-vserver.org).
Podsumowując można stwierdzić, że dla większości zastosowań jądra dystrybucyjne spełnią wszystkie stawiane przed nimi wymagania, bez konieczności rekompilacji.
Używaną wersję jądra sprawdzimy za pomocą programu uname:
# uname -r 2.6.14.7-5 |
# zcat /proc/config.gz |
# cat /usr/src/linux-2.6.27.13/config-dist |
Z PLD dostarczanych jest kilka kerneli, przygotowanych do różnych zastosowań, jedyną rzeczą jaka nam pozostaje to wybór właściwego jądra dla naszej maszyny. W poniższej tabeli zamieszczono przykładowe zestawienie dostępnych kerneli. Nie wszystkie z wymienionych poniżej pakietów bezpośrednio dostępne na liście pakietów, jeśli tak nie jest to trzeba je zbudować samodzielnie ze speca.
Powyższe zestawienie należy traktować orientacyjnie, gdyż kernel ciągle się zmienia. Aby poznać szczegóły, najlepiej jest sprawdzić plik spec dla konkretnego kernela. Ułatwieniem w poszukiwaniu właściwej rewizji, mogą być tagi zaczynające się od auto-, np.: auto-th-kernel-2_6_27_12-1. Tagi te są nadawane dla każdej wersji pakietu trafiającego na serwery FTP/HTTP.
W wersjach Ra i Ac istniał podział na kernel jednoprocesorowy (tzw. up) oraz wieloprocesorowy - SMP (symmetric multiprocessing). Dla odróżnienia te z obsługą wielu procesorów miały w nazwie pakietu przyrostek -smp. W Th i pakietach z ac-updates zaniechano takiego podziału i wszystkie jądra obsługują wiele procesorów i jednocześnie zrezygnowano z przyrostka -smp.
Należy zwrócić uwagę, na inne przyrostki po słowie kernel w nazwach pakietów, nie mówią one o rodzaju kernela ale o pakiecie z dodatkowymi modułami: kernel-net, kernel-sound, kernel-video, dokumentacją: kernel-doc i inną zawartością.
Kernel jest kluczową częścią systemu, dlatego zaleca się inaczej podejść do jego aktualizacji niż do innych pakietów, dobrym zwyczajem jest instalacja nowej wersji, zamiast aktualizacji np.:
poldek> install -I kernel-2.6.14.7-5 |
Gdyby nowy kernel okazał się niestabilny, to zawsze możemy powrócić do starej wersji. Aby ułatwić taką operację symlinki wskazujące na dotychczasowy kernel (/boot/vmlinuz) i initrd (/boot/initrd) automatycznie będą teraz dostępne pod nazwami /boot/vmlinuz.old i /boot/initrd.old. Dzięki temu, możemy w konfiguracji bootloadera mieć "obraz" konfiguracji dla starego kernela i użyć go w razie potrzeby.
Istnieje kilka pakietów, bardziej lub mniej zależnych od konkretnej wersji kernela. Ścisłe zależności będą dotyczyły pakietów z modułami np. kernel-vanilla-sound-alsa oraz pakietów ściśle współpracujących z kernelem np. moduł kernel-video-nvidia ze sterownikiem X.Org: xorg-driver-video-nvidia. Nieco mniej oczywisty jest związek kernela z pakietami iproute2 czy iptables, w ich przypadku mamy nieco swobody.
W wielu sytuacjach nie będziemy musieli się o to martwić, gdyż ten problem załatwiają nam zależności. Mimo to, że mamy tu dostępną automatykę, przy tego rodzaju pakietach powinniśmy zachować zdwojoną czujność. Dla ważnych maszyn produkcyjnych warto dodać kernel i pakiety okołokernelowe do opcji hold w Poldku, opcję tą omówiliśmy w sekcja Poldek w rozdział Zarządzanie pakietami. Więcej o zależnościach pomiędzy pakietami w sekcja Cechy pakietów w PLD w rozdział Zarządzanie pakietami.
Czasami zdarza się, że załamuje się praca systemu sygnalizowana za pomocą komunikatu Kernel Panic, jądro informuje nas, że nie wie co ma dalej zrobić i przerywa pracę. Warto ustawić system tak, by po takim zdarzeniu automatycznie następował restart, konfigurację takiego zachowania opisaliśmy w sekcja Podstawowe ustawienia w rozdział Konfiguracja systemu.
Mamy możliwość wpływania na pracę systemu, dzięki modyfikowaniu specjalnych parametrów jądra, parametry te można podzielić na dwie grupy: podawane przed startem kernela oraz podawane po wystartowaniu. Pierwszy rodzaj został opisany w sekcja Wstęp w rozdział Bootloader, drugi to zestaw specjalnych wpisów do pseudo-systemu plików /proc/sys.
Czytać wartości możemy za pomocą programu cat np.:
# cat /proc/sys/net/ipv4/ip_forward |
# echo "1" > /proc/sys/net/ipv4/ip_forward |
# /sbin/sysctl net.ipv4.ip_forward |
# /sbin/sysctl net.ipv4.ip_forward=1 |
Wadą powyższego rozwiązania jest powrót do poprzednich ustawień po restarcie maszyny. Rozwiązaniem problemu jest korzystanie z pliku /etc/sysctl.conf, w nim przypisujemy wartości odpowiednim zmiennym. W celu wprowadzenia ustawień wywołujemy polecenie:
# /sbin/sysctl -p |
Sterowniki mogą być wkompilowane do wnętrza jądra lub wydzielone jako osobne obiekty - moduły. Moduły jądra zostały stworzone po to by kernel zajmował mało pamięci operacyjnej i był zarazem uniwersalny. Ułatwiają one także prace ludziom zaangażowanym w rozwój jądra i dodatkowych modułów (nie potrzeba kompilować całego kernela by sprawdzić zmiany, wystarczy tylko sam moduł) Wyobraź sobie sytuację, w której masz wkompilowane do niego wszystko, a twój system nie posiada urządzeń, które kernel potrafi obsłużyć. Jest to duże marnotrawstwo, ponieważ w pamięci znajdą się nie potrzebne nam funkcje. Dodać należy fakt, ograniczenia wielkości jądra (można to zmienić odpowiednimi przeróbkami źródeł via Red Hat). Dlatego lubimy moduły. Dają nam one możliwość wyboru między tym co niezbędne, a brakiem wsparcia dla urządzeń. Podsumowując. Nie potrzebujesz to nie używasz.
By móc używać modułów potrzebujesz dwóch rzeczy. Kernela z
wkompilowaną opcją Loadable module support
oraz sterowników skompilowanych jako moduły. Ponieważ
używasz PLD to nie masz co się głowić ponieważ wszystko
to masz u siebie w systemie.
Istnieją dwie metody załadowania modułów:
statyczna - metoda tradycyjna, polega na wskazaniu modułów do załadowania przez administratora
dynamiczna - automatyczne ładowanie modułów, kiedy urządzenie zostaje wykryte
Plik /etc/modprobe.conf jest przeznaczony do ustawiania opcji dla ładowanych modułów. Warto dodać iż we wcześniejszych wersjach kernela ( < 2.6.0) plik nazywał się /etc/modules.conf. W pliku mamy dostępnych wiele opcji, my omówimy tylko najczęściej używane: alias, option i blacklist.
Aliasy - są to dodatkowe nazwy dla modułów, pozwalają na wczytanie go odwołując się do aliasu. Z aliasów korzysta wiele programów, które nie mogą wiedzieć z jakiego modułu mają korzystać i używają ustalonych nazw (aliasów) np.:
alias eth0 8139too |
alias parport_lowlevel parport_pc |
Opcje - często używa się możliwości przesłania do modułu ustawień. Przedstawię to na przykładzie drukarki podpiętej do portu LPT:
options parport_pc io=0x378, irq=7 |
Czarna lista - możemy zabronić ładowania jakiegoś modułu za pomocą słowa kluczowego blacklist np.:
blacklist rivafb |
W zależności od naszych wymagań oraz zastosowania systemu operacyjnego, będzie się zmieniać liczba wymaganych sterowników, w większości wypadków będzie to wartość od kilku do kilkunastu modułów. Jeśli tych modułów jest mało to samodzielne ładowanie może być lepszym rozwiązaniem.
Aby wskazać odpowiedni moduł, musimy poznać dane urządzenia. Najbardziej interesującymi informacjami są: producent i model urządzenia lub użyty chipset. W większości wypadków te informacje znajdują się w dokumentacji urządzenia. Jeśli tak nie zdobędziemy szukanych informacji to możemy spróbować użyć którąś z poniższych metod:
Organoleptycznie - jeśli mamy dostęp do sprzętu to możemy obejrzeć urządzenie, opis może być umieszczony na płytce drukowanej lub na chipsecie (zwykle największy układ scalony).
lshw - zaawansowany program służący do wyświetlania szczegółowych danych o sprzęcie, jego zaletą jest duża ilość sprawdzanych podsystemów i wyświetlanie nazw używanych modułów przez konkretne urządzenie.
lspci - program ten wyświetla listę wykrytych urządzeń PCI/AGP wraz z dodatkowymi informacjami. Warto użyć tu dodatkowo opcji "-v" - "-vv" w celu zwiększenia ilości danych. Program ten znajdziemy w pakiecie pciutils.
Komunikaty jądra - są to dosyć cenne informacje, możemy je odczytać w dzienniku kernela: /var/log/kernel lub przejrzeć to co zwraca program dmesg:
# dmesg | less |
Kiedy uzyskaliśmy informacje o sprzęcie, pozostaje nam odnaleźć moduł:
pcidev - program z pakietu pci-database - stara się wykryć używany przez nas sprzęt oraz podaje nazwę sugerowanego modułu. Należy wywołać program z parametrem wskazującym o interesujące nas urządzenie np:
# pcidev agp 10de01e0 nvidia-agp nVidia Corporation|nForce2 AGP (different version?) |
Internet - można założyć, że ktoś się już spotkał z podobnym problemem. Mamy do dyspozycji sporą skarbnicę wiedzy: WWW, listy i grupy dyskusyjne.
Po nazwie modułu: modprobe -l {$słowo_kluczowe} - tak możemy próbować odnaleźć moduł wg. szukanego klucza np:
# modprobe -l *snd* /lib/modules/2.6.11.6-4/kernel/sound/pcmcia/pdaudiocf/snd-pdaudiocf.ko.gz /lib/modules/2.6.11.6-4/kernel/sound/pcmcia/vx/snd-vxp440.ko.gz /lib/modules/2.6.11.6-4/kernel/sound/pcmcia/vx/snd-vx-cs.ko.gz /lib/modules/2.6.11.6-4/kernel/sound/pcmcia/vx/snd-vxpocket.ko.gz /lib/modules/2.6.11.6-4/kernel/sound/drivers/snd-serial-u16550.ko.gz /lib/modules/2.6.11.6-4/kernel/sound/drivers/mpu401/snd-mpu401-uart.ko.gz /lib/modules/2.6.11.6-4/kernel/sound/drivers/mpu401/snd-mpu401.ko.gz |
modinfo - program ten zwraca informacje o module, którego nazwę podajemy jako parametr. Program jest pomocny jeśli zawęziliśmy listę pasujących modułów do kilku pozycji.
Moduły są ze sobą powiązane i załadowanie danego modułu załaduje moduły od niego zależne (jeśli takie są), podobnie jest z ich usuwaniem z pamięci. Do zarządzania modułami zaleca się używanie programu modprobe z odpowiednimi parametrami zamiast programów insmod i rmmod
Listę załadowanych modułów i zależności między nimi otrzymamy po wydaniu polecenia lsmod np:
# lsmod Module Size Used by lp 8644 0 parport 29896 1 lp ext3 119304 1 amd74xx 11676 0 [permanent] psmouse 34840 0 ide_core 109560 2 ide_disk,amd74xx ide_disk 14336 9 |
Wczytanie modułu do pamięci:
# modprobe ne2k-pci |
# modprobe -r ne2k-pci |
# modprobe --show-depends ne2k-pci insmod /lib/modules/2.6.11.6-4/kernel/drivers/net/8390.ko.gz insmod /lib/modules/2.6.11.6-4/kernel/drivers/net/ne2k-pci.ko.gz |
# modprobe -l |
Po "ręcznym" załadowaniu modułu do pamięci będzie on dostępny do czasu ponownego uruchomienia komputera, aby moduł był automatycznie ładowany przy starcie systemu musimy użyć opisanych dalej plików: /etc/modules lub /etc/modprobe.conf.
Plik ten zawiera listę modułów, które zostaną załadowane podczas startu systemu (przez rc-skrypty). Znając nazwę modułu możemy dodać ją do tego pliku np:
echo "via82cxxx_audio" >> /etc/modules |
W sekcja Moduły jądra powiedzieliśmy, że plik /etc/modprobe.conf służy do konfiguracji modułów, jednak za pomocą pewnej sztuczki będziemy mogli wskazywać moduły do załadowania. Polega ona na utworzeniu aliasów o ustalonych nazwach i które będą ładowane np. przez rc-skrypty. Przykładowo utworzenie aliasu eth0 do odpowiedniego modułu karty sieciowej spowoduje załadowanie danego modułu przy próbie podniesienia interfejsu pierwszego interfejsu Ethernet. Przykładowy alias:
alias eth0 8139too |
eth{$Nr} - opisany powyżej alias dla karty sieciowej typu Ethernet.
ide_hostadapter, scsi_hostadapter - aliasy do modułów kontrolerów pamięci masowych, używane są m.in. przez skrypt geninitrd.
char-major-116, snd-card-{$Nr}, char-major-14, sound-* - aliasy dla modułów kart muzycznych (ALSA).
alias eth0 8139too alias scsi_hostadapter sata_sil alias char-major-116 snd alias snd-card-0 snd-intel8x0 |
Statyczne zarządzanie modułami kernela i urządzeniami w /dev było skomplikowane, uciążliwe i wymagało praw administratora, stąd narodziła się idea systemu, który zautomatyzuje te czynności. Tak oto powstał udev, współczesne wersje udeva (następcy DevFS) mają wbudowaną obsługę hotpluga i coldpluga. Dzięki temu mogą automatycznie ładować potrzebne moduły, ma to sens wyłącznie w przypadku modularnego kernela, jaki jest dostępny w PLD. Mimo włączenia hotpluga do udeva w PLD ciągle dostępne są pakiety z hotplugiem, są przechowywane jedynie dla wstecznej zgodności i nie będą nam już potrzebne.
Poza nielicznymi wypadkami nie będzie już konieczne dopisywanie nazw modułów do pliku /etc/modules, ani ich ręczne ładowanie za pomocą programu modprobe.
Więcej o plikach urządzeń znajdziemy w sekcja Urządzenia.
W systemie domyślnie instalowany jest pakiet dev, jeśli zechcemy przejść na udev to wystarczy, że zainstalujemy pakiet udev a następnie odinstalujemy dev np.:
# poldek -i udev # poldek -e dev |
Udev w większości wypadków nie wymaga żadnych operacji konfiguracyjnych, czasami tylko konieczne jest poprawienie lub dodanie regułki do katalogu /etc/udev/rules.d/. Zanim się tym zajmiemy powinniśmy zapoznać się z dokumentacją.
W Ac do wyboru są dwa tryby pracy: udevstart (domyślny) i udevsynthesize. Ten drugi wykrywa większą liczbę urządzeń, stąd warto się pokusić o wybór właśnie jego. Aby go używać wystarczy, że ustawimy odpowiednią opcję w pliku /etc/udev/udev.conf:
UDEV_STARTER="udevsynthesize" |
W Th powyższe opcje nie są już dostępne, ich miejsce zajął mechanizm udevtrigger.
Liczba załadowanych modułów przez udev może przywrócić o zawrót głowy, udev ładuje moduły znalezionych urządzeń bez względu czy w ogóle z niego korzystamy. Jedyną wadą takiego działania jest większe zużycie pamięci przez nieużywane sterowniki. Nie powinno przekroczyć 2MiB pamięci, więc dla ogromnej większości współczesnych komputerów nie będzie to stanowić żadnego problemu.
Mamy wpływ na listę ładowanych modułów, aby zablokować ładowanie jakiegoś modułu wystarczy dodać do pliku /etc/modprobe.conf nazwę modułu poprzedzoną słowem blacklist np.:
blacklist rivafb blacklist nvidiafb |
Powyższa metoda ma sens jedynie jeśli chcemy zablokować pojedyncze moduły, jeśli mamy komputer o bardzo małej ilości pamięci lepszym pomysłem będzie pozostanie przy statycznej metodzie ładowania modułów.
Jeśli mamy kilka kontrolerów urządzeń masowych (IDE/SATA/SCSI) to mogą występować problemy z wykrywaniem ich na czas, tak by były gotowe do zamontowania systemów plików określonych w /etc/fstab. Jedynym pewnym sposobem poradzenia sobie z tym kłopotem jest dodanie modułów kontrolerów do initrd.
Więcej o udev możemy poczytać w FAQ
Udev nie zajmuje się montowaniem przenośnych nośników danych, musimy robić to ręcznie (co wymaga uprawnień administratora), lub użyć HAL-a, D-Busa oraz np. gnome-volume-manager w przypadku środowiska Gnome.
W PLD wszystkie możliwe sterowniki są dostępne w postaci tzw. modułów, przez co nie są one "widoczne" dla jądra w trakcie startu systemu. Aby system wystartował wymaganych jest kilka modułów i innych komponentów koniecznych do zamontowania głównego systemu plików (root filesystem):
moduły kontrolera urządzeń masowych (IDE/SATA/SCSI) np.: sata_nv, sata_sil, sd_mod
systemu plików na głównej partycji systemowej np.: xfs, reiserfs
elementy konieczne do złożenia woluminów opartych o LVM lub programowy RAID
Jedynym sposobem dostarczenia tych sterowników jest umieszczenie ich w specjalnym "obrazie" zwanym initrd (initial ramdisk). Obraz ten jest plikiem wczytywanym przez bootloader, tak więc dodatkowo musimy właściwie skonfigurować bootloader - wskazać położenie obrazu. Obraz przechowywany jest w katalogu /boot i ma nazwę initrd-{$wersja_jądra}.gz, do niego zaś prowadzi łącze o nazwie initrd.
Initrd jest tworzony przy każdej instalacji/aktualizacji kernela. Bywa jednak, że nasz obraz nie jest wygenerowany prawidłowo i jesteśmy zmuszeni do utworzenia go samodzielnie. Źle utworzony uniemożliwi uruchomienie systemu, ujrzymy wtedy następujący komunikat:
Kernel panic: VFS: Unable to mount root fs... |
Systemu nie można uruchomić więc musimy skorzystać z operacji chroot-a, możemy w tym celu użyć dowolnej dystrybucji linuksa jednak chyba najwygodniejsze będzie użycie PLD-Live lub RescueCD.
Poniżej przedstawiono trzy metody generowania initrd. W większości wypadków wystarczy nam pierwszy ze sposobów, pozostałe są trudniejsze gdyż musimy znać nasz sprzęt i system plików partycji "/". Jeśli obraz nie jest tworzony prawidłowo przez pierwszą metodę musimy się zadowolić dwoma pozostałymi. Druga i trzecia metoda mają jedną zasadniczą przewagę nad pierwszą - mogą być przeprowadzane na dowolnej maszynie.
W dwóch pierwszych metodach użyjemy skryptu /sbin/geninitrd z pakietu geninitrd. Jest to wygodny automat, który stara się wykryć sprzęt, system plików i czy główny system plików jest stworzony na LVM/soft RAID. Skrypt geninitrd wymaga prawidłowych wpisów w /etc/fstab i podmontowanego /proc. Tak więc jeśli generujemy initrd w systemie typu chroot to wydajemy polecenie (z chroota):
# mount /proc |
Opis wykrywania sprzętu i dobierania właściwych modułów opisano w sekcja Statyczne zarządzanie modułami.
W razie potrzeby edytujemy plik /etc/sysconfig/geninitrd i ustawiamy jaki rodzaj urządzenia (SCSI, IDE, RAID) ma być automatycznie wykrywany:
## Do install SCSI modules (if / is on SCSI partition)? PROBESCSI=yes ## Do install IDE modules (if / is on IDE partition)? PROBEIDE=yes ## Do install RAID modules (if RAID is used)? PROBERAID=yes |
geninitrd [opcje] {$initrd} {$wersja_jądra} np.:
# geninitrd -v -f /boot/initrd-2.6.16.35-1.gz 2.6.16.35-1 |
Parametr -v
odpowiada za "gadatliwość" programu,
zaś -f
wymusza nadpisanie istniejącego obrazu.
Metoda ta wymaga precyzyjnej znajomości używanego sprzętu i systemu plików, gdyż sami musimy wskazać odpowiednie moduły. Jest jednak konieczna, w przypadku problemów z automatycznym wykryciem wymaganych sterowników lub jeśli chcemy operację wykonać na innej maszynie niż docelowa.
Możemy wpisać listę koniecznych modułów do odpowiedniej sekcji w pliku /etc/sysconfig/geninitrd:
## Basic modules to be loaded BASICMODULES="" ## Modules that should be loaded before anything (i.e. jbd for ext3) PREMODS="" |
geninitrd [opcje] --with={$nazwa_modułu} {$initrd} {$wersja_jądra}
Dużym ułatwieniem zadania jest automatyczne dołączanie modułów zależnych od wskazanego (o ile takie są). Poniżej zamieszczono przykładowe wywołanie geninitrd dla systemu plików ext3 i kontrolera IDE PDC20268 firmy Promise:
# geninitrd -v --with=ext3 --with=pdc202xx_new /boot/initrd-2.6.16.35-1.gz 2.6.16.35-1 |
Możemy zmodyfikować zawartość obrazu wygenerowanego przez geninitrd, aby to zrobić rozpoczynamy od skopiowania initrd w inne miejsce i rozpakowania go:
# gunzip initrd-2.6.16.35-1.gz |
mkdir /tmp/initrd-src # mount -o loop initrd-2.6.16.35-1 /tmp/initrd-src |
Tworzenie initrd rozpocznijmy od skopiowania zawartości katalogu w inne miejsce:
# cp -a /tmp/initrd-src initrd-moje cp: czytanie `initrd-src/bin/sh': Błąd wejścia/wyjścia |
Aby dodać moduł, musimy go skopiować z naszego systemu do odpowiedniego katalogu w initrd-moje/lib/modules/*/, następnie do skryptu initrd-moje/linuxrc dodać wpis "insmod {$moduł}" na wzór już istniejących ({$moduł} musi zawierać pełną ścieżkę do pliku).
Przyszedł czas na wygenerowanie initrd:
# genromfs -d initrd-moje -f initrd-nowy |
# gzip -9 initrd-nowy |
Musimy się upewnić czy łącze symboliczne /boot/initrd wskazuje na prawidłowy obraz. Jeśli używamy LiLo wydajemy polecenie:
# lilo |
W przypadku Grub-a nic nie musimy robić.
Na koniec restartujemy komputer i system powinien uruchomić się bez problemu. Konfigurację bootloaderów szerzej opisano w sekcja Wstęp w rozdział Bootloader.
Częste zmiany używanego obrazu initrd mogą być uciążliwe, można to obejść łącząc do jednego obrazu większą ilość modułów. Aby to zrobić możemy dopisać nazwy modułów do przedstawionych poniżej opcji w pliku /etc/sysconfig/geninitrd:
## Basic modules to be loaded BASICMODULES="" ## Modules that should be loaded before anything (i.e. jbd for ext3) PREMODS="" |
Podobnie jak w innych systemach uniksowych obowiązuje tutaj zasada "everything is a file", czyli wszystko jest plikiem. Dzięki takiemu podejściu uproszczono sposób komunikacji z urządzeniami, poprzez odwoływanie się do specjalnych plików, odpowiadających konkretnym urządzeniom. Pliki te są przechowywane w katalogu /dev, zwykły użytkownik nie musi się martwić o jego zawartość, wystarczy że będzie znał powiązania między fizycznymi urządzeniami a nazwami tych plików.
Z nazw urządzeń najczęściej korzysta się w przypadku operacji dyskowych, warto zatem znać zasadę ich określania, więcej szczegółów na ten temat podano w sekcja Nazewnictwo urządzeń masowych w rozdział Pamięci masowe.
Nazwy urządzeń nadawane są tak, aby ułatwiać życie użytkownikom, dla jądra są właściwie obojętne. Jądro rozróżnia urządzenia za pomocą pary liczb: major (głównej) i minor (pobocznej). To jakie są wartości tych liczb odczytamy następująco:
ls -l /dev/hda2 brw-rw---- 1 root disk 3, 2 2005-11-11 15:08 /dev/hda2 |
Jeśli potrzebujemy samodzielnie utworzyć plik urządzenia, to użyjemy do tego programu mknod np.:
# /bin/mknod /dev/zero c 1 5 |
Są dwa sposoby dostarczania plików urządzeń dla systemu: dev - statyczny i udev - dynamiczny. Każdy z nich ma wsparcie w PLD, jednak domyślnie instalowany jest pakiet udev. Jeśli chcemy użyć innego mechanizmu, wystarczy że odinstalujemy udev a zainstalujemy dev w jego miejsce, dla pewności tą operację lepiej przeprowadzać przy pomocy operacji chroot-a.
Najstarszym z rozwiązań jest pakiet dev, dzięki niemu w katalogu /dev zostanie utworzona spora ilość węzłów (nawet jeśli nie mamy danego rodzaju urządzenia), wystarczająca dla większości zastosowań. Jeśli jednak mamy jakieś egzotyczne urządzenie to będziemy musieli samemu utworzyć wymagane pliki. Pliki urządzeń tworzymy za pomocą opisanego wcześniej programu mknod.
W odróżnieniu od statycznej bazy plików urządzeń w ostatnim czasie popularność zdobywają systemy automatycznego tworzenia węzłów w katalogu /dev. W chwili podłączenia urządzenia lub startu systemu automatycznie tworzone są wymagane pliki. Jest to ogromne ułatwienie dla użytkowników, gdyż nie wymaga od nich wiedzy na ten temat.
Udev automatycznie tworzy pliki urządzeń, jednak sam potrzebuje kilku z nich, aby mógł zacząć działać, są to: /dev/console, /dev/null, /dev/zero. Pliki te są dostarczane razem z pakietem, a więc nie musimy się to martwić.
System udev jest wart uwagi dlatego, że nie tylko tworzy wymagane węzły urządzeń lecz dodatkowo ładuje wymagane moduły jądra dla danego urządzenia. Więcej informacji o udev znajdziemy w sekcja Udev - dynamiczna obsługa sprzętu
Należy pamiętać o tym, że udev jest wywoływany z rc-skryptów, i nie wystartuje przy użycia parametru jądra init lub przy próbie wykonania operacji chroota z innego systemu. Wtedy wymagane pliki nie zostaną utworzone, co może spowodować nieoczekiwane problemy z działaniem programów. W przypadku wykonania operacji chroota problem ten rozwiązujemy poprzez wcześniejsze podmontowanie katalogu /dev z systemu głównego. W pozostałych przypadkach uruchamiamy skrypt /etc/rc.d/rc.sysinit, w ostateczności tworzymy wymagane urządzenia za pomocą programu mknod lub skądś je kopiujemy. Operacja chroota została szerzej opisana w sekcja Ratowanie systemu w rozdział Administracja. Parametr jądra init jak i wiele innych szerzej opisano w sekcja Wstęp w rozdział Bootloader.
Na stacji roboczej bez zastanowienia można polecić udev, gdyż pozwoli na znaczne podniesienie komfortu pracy. W przypadku serwerów będzie to głównie zależało od preferencji administratora i wybór nie będzie miał tu większego znaczenia.
Zupełnie inaczej to wygląda w przypadku systemów zamkniętych typu chroot, zarówno plikami urządzeń jak i modułami zajmuje się system gospodarz, ponadto udev może stać się poważnym wyłomem w bezpieczeństwie klatki. W takim wypadku powinniśmy użyć statycznych plików (dev), których lista powinna zostać poważnie ograniczona do kilku niezbędnych.
Ten rozdział prezentuje metody konfiguracji parametrów systemu.
Plik /etc/sysconfig/system przechowuje zaawansowaną konfigurację systemu, w rozdziale tym opisano część z zawartych w nim opcji.
Zmienna określa czy skrypty startowe mają używać kolorów:
COLOR_INIT=yes |
Numer kolumny wyświetlania wyniku działania skryptu startowego:
INIT_COL=75 |
Szybsze uruchomienie systemu z pominięciem niektórych skryptów, startowych - m.in. skryptu od obsługi języków:
FASTRC=no |
Zezwolenie na interaktywny start rc-skryptów (pytanie o uruchomienie każdego z podsystemów) po wciśnięciu klawisza I:
RC_PROMPT=yes |
"Gadatliwość" kernela dla komunikatów wysyłanych na konsolę tekstową. Opcja jest jednoznaczna z wywołaniem polecenia dmesg -n {$nr} (domyślnie 1):
CONSOLE_LOGLEVEL=1 |
Czas w sekundach, po którym nastąpi restart maszyny jeśli wystąpił krytyczny błąd jądra (kernel panic). Ważna opcja w przypadku komputerów, do których nie mamy fizycznego dostępu:
PANIC_REBOOT_TIME=60 |
Uruchomienie programu sulogin (pytanie o hasło root-a) zamiast powłoki jeśli wystąpią problemy w trakcie uruchomienia:
RUN_SULOGIN_ON_ERR=yes |
Wartość "yes" poniższej zmiennej pozwala na zalogowanie się użytkowników dopiero po zakończeniu procesu ładowania systemu. Dzięki unikniemy potencjalnych problemów wynikających z przedwczesnym uzyskaniem dostępu, z drugiej jednak strony tracimy możliwość zalogowania się (np. przez SSH) jeśli pojawią się problemy przed końcem ładowania systemu. Może to być istotne dla systemów obsługiwanych na odległość.
DELAY_LOGIN=yes |
Opcja określa czy w czasie startu ma być usuwana zawartość katalogu /tmp:
CLEAN_TMP=yes |
Wskazuje czy ma być zamontowany podsystem devfs:
MOUNT_DEVFS=no |
Domyślny priorytet (liczba nice) dla usług, którym nie go zdefiniowano w zmiennej SERVICE_RUN_NICE_LEVEL umieszczanej w pliku podstawowej konfiguracji usługi (/etc/sysconfig/{$usługa}):
DEFAULT_SERVICE_RUN_NICE_LEVEL=0 |
Lista katalogów przechowujących systemy typu chroot, które mają być zarządzane przez skrypt /etc/init.d/sys-chroots:
SYSTEM_CHROOTS=/jakis_katalog |
Dzięki plikowi /etc/sysconfig/console możemy ustawić takie parametry jak czcionka konsoli, mapa klawiatury, kodowanie fontów oraz zarządzanie energią.
Aby zmienić czcionkę, edytujemy parametr:
CONSOLEFONT=lat2u-16 |
Do wyboru mamy czcionki zamieszczone w katalogu /usr/share/consolefonts.
Aby zmienić kodowanie znaków, edytujemy parametr:
CONSOLEMAP=8859-2 |
Aby zmienić mapowanie klawiatury edytujemy parametr:
KEYTABLE=pl2 |
Aby ustawić numery konsol dla których aplikowane są parametry, zmieniamy:
SET_FONT_TERMINALS="1 2 3 4 5 6 7 8" |
Przedstawiony parametr deklaruje zmianę ustawień dla konsol tty1-tty8.
Aby zmienić opcje zarządzania energią, edytujemy parametry:
POWER_SAVE=on BLANK_TIME=10 POWERDOWN_TIME=60 |
Parametr BLANK_TIME
określa liczbę minut nieaktywności do wygaszenia ekranu,
POWERDOWN_TIME
- do wyłączenia monitora.
Aby zmienić kolor czcionki lub tła, edytujemy parametr:
FOREGROUND_COLOUR=red BACKGROUND_COLOUR=green |
Do wyboru posiadamy kolory black|red|green|yellow|blue|magenta|cyan|white|default.
Aby zmienić domyślny tryb NUM Locka, edytujemy parametr:
NUM_LOCK=on |
Do wyboru posiadamy atrybut "on" lub "off".
Aby uaktywnić zmiany wykonujemy:
/sbin/service console start |
Częstym problemem początkującego użytkownika Linuksa jest ustawienie wyświetlania znaków diakrytycznych, walut oraz odpowiedniego języka. Ponieważ PLD jest dystrybucją dla zaawansowanych użytkowników, możemy w niej przystosować środowisko pracy do naszych indywidualnych potrzeb.
Zanim przystąpimy do instalowania poszczególnych paczek, musimy w pliku /etc/sysconfig/i18n ustawić odpowiednie zmiennie środowiskowe odpowiadające za język czcionkę systemową oraz kodowanie. W naszym przypadku wpis ten wygląda następująco:
SUPPORTED_LOCALES=pl_PL LANG=pl_PL LC_ALL=pl_PL LINGUAS=pl_PL SYSFONT=lat2u-16 UNIMAP=lat2u SYSFONTACM=iso02 |
Następnie instalujemy pakiety odpowiedzialne za ustawienia lokalne i klawiaturę:
# poldek -i localedb-src kbd |
Locale generujemy poleceniem localedb-gen, które domyślne ustawienia pobiera ze
zmiennej SUPPORTED_LOCALES
wiec jeśli chcielibyśmy mieć
obsługę również innego języka, to trzeba to zaznaczyć właśnie przy tej zmiennej.
Przykładowy zapis dla kilku języków w pliku /etc/sysconfig/i18n może wyglądać tak:
LANG=pl_PL # list of supported locales SUPPORTED_LOCALES="pl_PL/ISO-8859-2 de_DE/ISO-8859-2 \ en_GB/ISO-8859-1 en_US/ISO-8859-1" |
Można też zainstalować pakiet zawierający bazę danych locale dla wszystkich lokalizacji obsługiwanych przez glibc.
# poldek -i glibc-localedb-all |
Aby sprawdzić czy wszystko przebiegło pomyślnie wydajemy polecenie:
$ locale LANG=pl_PL LC_CTYPE="pl_PL" LC_NUMERIC="pl_PL" LC_TIME="pl_PL" LC_COLLATE="pl_PL" LC_MONETARY="pl_PL" LC_MESSAGES="pl_PL" LC_PAPER="pl_PL" LC_NAME="pl_PL" LC_ADDRESS="pl_PL" LC_TELEPHONE="pl_PL" LC_MEASUREMENT="pl_PL" LC_IDENTIFICATION="pl_PL" LC_ALL= |
Sprawdzamy czy wszystkie wpisy się zgadzają.
Jeśli chcemy aby ustawienia dopasowane były do naszych upodobań do dyspozycji mamy następujące zmienne LC_*:
Dostępne zmienne LC_*: * LC_CTYPE: Konwersja czcionki i wielkości liter. * LC_COLLATE: Porządek sortowania. * LC_TIME: Format wyświetlania daty i godziny. * LC_NUMERIC: Wyświetlanie liczb nie związanych z walutą * LC_MONETARY: Formaty walutowe. * LC_MESSAGES: Format wiadomości informacyjnych, diagnostycznych \ oraz określających interakcje programu. * LC_PAPER: Rozmiar papieru. * LC_NAME: Format nazw. * LC_ADDRESS: Format wyświetlania adresu i lokalizacji. * LC_TELEPHONE: Format wyświetlania numeru telefonu. * LC_MEASUREMENT: Jednostki miary (metryczna lub inna) * LC_IDENTIFICATION: Metadata o ustawieniach locale. |
Przykładowo jako domyślnego języka, możemy używać angielskiego jednak ze wsparciem dla polskich czcionek i polskich walut. Wszelkiego typu zmiany dokonujemy poprzez dodanie do pliku ~/.bash_profile odpowiednich wpisów:
LANG=en_EN export LANG LC_CTYPE=pl_PL export LC_CTYPE |
Niniejszy rozdział dotyczy uruchomienia obsługi myszy dla terminala znakowego, konfigurację myszy dla środowiska graficznego (X-Window) opisano w sekcja X-Server w rozdział X-Window. Proces konfiguracji rozpoczynamy od instalacji demona gpm:
# poldek -i gpm |
Dalsza część konfiguracji polega na załadowaniu właściwego modułu jądra i ustawieniu przynajmniej dwóch parametrów w pliku /etc/sysconfig/mouse: nazwy urządzenia (DEVICE) i typu myszy (MOUSETYPE).
Poniższy opis dotyczy kernela 2.6.x, w tej wersji jako urządzenia dla myszy PS2 i USB stosuje się /dev/input/mouse0, /dev/input/mouse1, ... lub urządzenie zbiorcze /dev/input/mice. Jednak dla wstecznej zgodności działa dalej /dev/psaux
Obsługa portu szeregowego RS-232 jest częścią jądra PLD, więc nie ładujemy żadnego modułu - urządzenia działają od razu po podłączeniu. W zależności od tego, na którym porcie mamy podpiętą mysz, ustawiamy odpowiednio parametr DEVICE, pamiętając, że /dev/ttyS0 to COM1, /dev/ttyS1 to COM2 ...
Typ myszy będzie zależał od modelu posiadanego urządzenia, w większości wypadków powinna zadziałać dla wartości "ms", "msc", lub "ms3". Szczegółowe informacje na ten temat znajdziemy w pomocy demona, którą wyświetlimy w sposób opisany na końcu rozdziału.
DEVICE=/dev/ttyS0 MOUSETYPE=ms3 |
W laptopach urządzenia wskazujące są zgodne z myszkami typu PS/2, stąd ich konfiguracja przebiega tak samo. Rozpoczynamy od załadowania modułu jądra:
# modprobe psmouse |
Podajemy urządzenie myszy i jej typ, który dla większości urządzeń ustawimy na "ps2" lub "imps2":
DEVICE=/dev/input/mice MOUSETYPE=ps2 |
Ładowanie modułów dla tego rodzaju urządzeń może być wykonane automatycznie przez mechanizm udev lub ręcznie. W drugim wypadku wydajemy następujące polecenia (zakładam że są już załadowane moduły dla kontrolera USB):
# modprobe usbhid # modprobe usbmouse |
Podajemy urządzenie myszy i jej typ, który dla większości urządzeń ustawimy na ps2 lub imps2:
DEVICE=/dev/input/mice MOUSETYPE=ps2 |
Teraz wystarczy tylko uruchomić usługę gpm:
# /etc/init.d/gpm start |
Wcześniej załadowane moduły można jeszcze wpisać do /etc/modules, aby ładowały się przy starcie systemu.
Większość dostępnych na rynku myszek powinna zadziałać z przedstawioną powyżej konfiguracją. Możliwe jednak, że nasza mysz używa nietypowego protokołu i należy ustawić inny typ urządzenia (MOUSETYPE). W takim wypadku pomocna może się okazać lista urządzeń i odpowiadających im typów wyświetlana w wyniku poniższego polecenia:
# gpm -m /dev/input/mice -t help |
Pożyteczną opcją jest BUTTON_COUNT, która definiuje liczbę przycisków myszy.
Zamiast wskazania pliku urządzenia, możemy użyć łącza symbolicznego o nazwie /dev/mouse wskazującego na właściwe urządzenie.
Strefy czasowe to specjalne ustawienia, pozwalające systemowi na łatwe przeliczanie czasu uniwersalnego (UTC) na lokalny i na odwrót. Zaczynamy od instalacji koniecznego pakietu:
$ poldek -i tzdata |
W Ac ustawiamy zmienne ZONE_INFO_AREA i TIME_ZONE. Opcje wskazują na katalog i plik opisujący strefę, jak zapewne czytelnik zauważy, część z nich nie jest przechowywania w podkatalogach, wtedy tą zmienną należy ustawić pustą. Dla Polski wybieramy podajemy następujące wartości:
ZONE_INFO_AREA="Europe" TIME_ZONE="Warsaw" |
W Th powyższe opcje zostały zastąpione przez TIMEZONE, tutaj wartości oddzielamy slashem:
TIMEZONE="Europe/Warsaw" |
Aby zmiany odniosły skutek musimy zrestartować odpowiedni skrypt startowy:
# service timezone restart |
Standardowo BIOS powinien używać czasu uniwersalnego (UTC), zegar systemowy powinien wtedy działać zgodnie z czasem lokalnym, określonym w pliku /etc/sysconfig/timezone. W ten sposób zmiany czasu letni/zimowy będą następowały automatycznie, bez modyfikowania ustawień zegara sprzętowego.
Wyjątkiem od tej reguły jest używanie na tym samym komputerze PLD i któregoś z produktów Microsoftu. Te ostatnie używają zgodnego czasu dla BIOS-u i systemu, co spowoduje różnice we wskazaniach zegarów. Jedynym rozwiązaniem tego problemu jest zmuszenie naszego PLD, by używał czasu BIOS-u jako czasu lokalnego. W tym wypadku zmianą czasu letni/zimowy może zająć się system Microsoftu lub możemy wykonać to samodzielnie.
Aby skorzystać z pierwszego rozwiązania synchronizujemy zegar sprzętowy z czasem uniwersalnym, a w pliku /etc/sysconfig/clock ustawiamy:
UTC="true" |
UTC="false" |
Zmienne środowiskowe to prosty sposób modyfikowania konfiguracji środowiska użytkownika. Listę zmiennych i przypisanych im wartości uzyskamy za pomocą polecenia powłoki set, na poniższym przykładzie przedstawiono fragment wyniku polecenia:
$ set BASH=/bin/bash BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="2" [4]="release" [5]="i686-pld-linux-gnu") BASH_VERSION='2.05b.0(2)-release' COLORTERM=gnome-terminal COLUMNS=125 |
Administrator może ustawić globalnie wszystkim użytkownikom zmienne środowiskowe. Do tego wykorzystuje się mechanizm env.d. Jest to katalog umieszczony w /etc, zawierający pliki tekstowe o nazwach takich samych jak nazwy zmiennych, wewnątrz każdego z nich podana nazwa zmiennej i jej wartość. Przykładowo zmienna EDITOR zostanie zainicjowana jeśli utworzymy plik /etc/env.d/EDITOR, jego treść może wyglądać następująco:
EDITOR=vim |
Zmiany w /etc/env.d są aktualizowane po ponownym zalogowaniu danego użytkownika.
Każdy użytkownik może zarówno tworzyć takie zmienne jak i nadpisywać te ustawione globalnie.
Zmienne możemy powoływać na czas sesji, dokonujemy tego przy pomocy powłoki (shell). W większości z nich (sh, zsh, bash, ksh) istnieje polecenie export które pozwala ustawić dowolna zmienną np.:
# export EDITOR=mcedit |
Tak ustawiona zmienna będzie funkcjonować do czasu wylogowania użytkownika
Aby ustawić na stałe zmienną użyjemy pliku konfiguracyjnego powłoki. Musimy jedynie wstawić do takiego pliku podane wyżej polecenie export. Każda z powłok posiada swoje własne pliki startowe, przykładowo powłoka BASH używa pliku ~/.bash_profile i ~/.bashrc, zaś ZSH ~/.zshenv. Więcej informacji na ten temat zawarto w manualu każdej z powłok.
Jeśli chcemy ustawić zmienną środowiskową tylko dla jednego uruchamianego programu, to podajemy jej definicję przed nazwą programu np.:
$ http_proxy=62.87.244.34:8080 wget http://foobar.com/plik.foo |
Pldconf jest narzędziem tworzonym z myślą o początkujących użytkownikach. Wiele opcji jest konfigurowanych automatycznie. Pldconf ma małe wymagania i jest niewielkim pakietem (ok. 150 kB) Jego instalacja sprowadza się do wydania polecenia:
# poldek -i pldconf |
Program zadaje minimalną ilość pytań i w podstawowej wersji (dla PLD RA 1.0) konfiguruje:
Serwer X: karta (auto), rozdzielczość, kolory, itd;
Sieć: bramka, DNS, karty sieciowe (auto), otoczenie sieciowe, SDI, NEO (ethernet);
Desktop: menedżer okien, kolory, czcionki i więcej;
Menedżer startu: menu z linuksem i windows, dyskietka startowa i więcej;
Dostęp do partycji windows;
tyle z podstawowych możliwości - pldconf potrafi więcej.
Obecnie pldconf rozwijany jest dla nadchodzącego PLD 2.0 (AC/DC/NEST). W nowej wersji dodano między innymi:
Konfiguracje karty dźwiękowej (alsa);
Konfiguracje drukarki (cups);
Optymalizacje dysku twardego (hdparm);
Konfiguracje fetchmail;
Konfiguracje tunera telewizyjnego
Zarządzanie kontami użytkowników
Wersja pldconf dla PLD 2.0 nieznacznie różni się od wersji dla PLD 1.0. Różnice dotyczą przede wszystkim zmiany ścieżek (np. /usr/X11R6/bin/mozilla w PLD 2.0 zmieniono na /usr/bin/mozilla) głównie w module do konfiguracji desktopu. W praktyce blisko 100% pldconf w najnowszej wersji (przeznaczonym dla PLD 2.0) działa poprawnie również w systemie PLD 1.0. W szczególności najnowszy pldconf potrafi przeprowadzić sieciową instalację PLD 2.0 - moduł instalacji zadziała poprawnie w systemie PLD 1.0. Innymi słowy, aby zainstalować PLD 2.0 spod uruchomionego PLD 1.0 należy zainstalować najnowszą wersję pldconf.
Uwaga: W przypadku instalacji nowego pldconf w systemie PLD 1.0 wymagana jest również instalacja pakietu perl-modules.
Strona domowa projektu
W tym rozdziale przedstawione są informacje o kluczowych plikach systemu operacyjnego. Zostały tu opisane jedynie podstawowe dane na ich temat, więcej można znaleźć w podręczniku systemowym man, oraz info
Plik /etc/inittab przechowuje konfigurację programu init, uruchamianego w trakcie startu systemu i działającego bez przerwy do chwili jego zamknięcia. Głównym zadaniem procesu init jest kontrola zachowania systemu w zależności od osiągniętego poziomu pracy systemu oraz w wypadku wystąpienia specjalnych zdarzeń. Poziomy pracy szczegółowo opisano w sekcja Zmiana poziomu pracy systemu w rozdział Administracja.
Oto najważniejsze opcje zawarte w pliku /etc/inittab:
Domyślny poziom uruchomienia - wskazuje programowi init jaki poziom uruchomienia ma być wybrany jeśli wywołano go bez parametrów lub w trakcie startu systemu. Wiersz określający tę opcję wygląda następująco: id:{$poziom}:initdefault: ($poziom to cyfra odpowiadająca poprawnemu poziomowi uruchomienia), ustawienie domyślnie trzeciego poziomu uruchomienia przedstawiono na poniższym przykładzie:
id:3:initdefault: |
Instrukcje uruchomienia programu mingetty na pierwszym terminalu wirtualnym (/dev/tty1), wywołania dla kolejnych będą bardzo podobne:
1:12345:respawn:/sbin/mingetty --noclear tty1 |
Poniższy wiersz uruchomi program agetty, łączący się z portem szeregowym /dev/ttyS0, w celu podłączenia terminala szeregowego:
0:12345:respawn:/sbin/agetty 9600 ttyS0 vt100 |
Wywołania skryptów startowych - opcje te bardzo rzadko wymagają ingerencji użytkownika:
si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 |
Obsługa specjalnych zdarzeń np. wciśnięcia kombinacji klawiszy ctrl+alt+del:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now |
Mamy sporą dowolność w zarządzaniu tym zdarzeniem, w powyższym przykładzie po naciśnięciu kombinacji ctrl+alt+del nastąpi przeładowanie systemu, aby nastąpiło zamkniecie powinniśmy użyć polecenia shutdown -h.
Plik ten przechowuje szczegółowe informacje o systemach plików, które mają być montowane do odpowiednich katalogów. Informacje w nim zawarte są odczytywane w trakcie startu systemu, dzięki temu automatycznie są montowane wszystkie woluminy (partycje) nie oznaczone opcją "noauto". Plik ten jest zazwyczaj tworzony przez instalator, jednak administrator ma możliwość, a nawet obowiązek dokonywać w nim zmian. Dla lepszego zrozumienia tematu przyjrzyjmy się przykładowemu plikowi i przeanalizujmy funkcje jakie spełniają poszczególne wpisy.
#(fs_spec) (fs_file)(fs_vfstype) (fs_mntops) (fs_freq) (fs_passno) /dev/hda2 / ext3 defaults 0 0 /dev/hda3 swap swap defaults 0 0 proc /proc proc defaults 0 0 pts /dev/pts devpts gid=5,mode=600 0 0 /dev/fd0 /media/floppy vfat noauto 0 0 /dev/cdrom /media/cdrom iso9660 noauto,ro,user,unhide 0 0 |
Jak widzimy plik jest podzielony na wiersze, z których każdy odpowiada jednemu obsługiwanemu woluminowi. Poszczególne pola oddzielone są od siebie spacją lub tabulatorem. Dane odpowiedniego rekordu wczytywane są przez skrypty startowe oraz programy takie jak: fsck, mount czy umount przez co muszą one być zapisane w uporządkowany sposób.
Pole (fs_spec) - określa urządzenie blokowe lub zasób sieciowy przeznaczony do zamontowania, na przykład partycję dysku, CDROM czy udział NFS. Opis urządzeń masowych przedstawiono w sekcja Nazewnictwo urządzeń masowych w rozdział Pamięci masowe, montowanie udziałów NFS przedstawiono w sekcja NFS - Network File System w rozdział Usługi dostępne w PLD.
Pole (fs_file) - wskazuje na miejsce, w którym ma być zamontowany dany system plików, na przykład dla partycji wymiany (ang. "swap partition") to pole powinno zawierać wartość "none", a dla CDROM-u "/media/cdrom".
Pole (fs_vfstype) - określa typ systemu plików jaki znajduje się na danym urządzeniu. Najbardziej powszechne obecnie i obsługiwane systemy plików to:
ext2 - podstawowy system plików w Linuksie
ext3 - j.w. tyle że z księgowaniem
reiserfs - zaawansowany system plików z księgowaniem
xfs - zaawansowany system plików z księgowaniem
vfat - używany w starszych systemach Microsoftu, znany również jako FAT32
ntfs - system plików współczesnych wersji systemów Microsoftu
iso9660 - używany na płytach CD-ROM
nfs - sieciowe udziały dyskowe NFS
swap - obszar wymiany
Pole (fs_mntops) udostępnia szereg znaczników systemowych, które mogą mieć kluczowe znaczenie dla bezpieczeństwa i wydajności naszego systemu. Przykładowo następujące znaczniki oznaczają:
defaults - domyślny zestaw opcji, użyteczny w większości wypadków.
nodev - zapobiega rozpoznawaniu przez jądro dowolnych plików urządzeń, znajdujących się w systemie plików
noexec - zapobiega wykonywaniu plików wykonywalnych w danym systemie plików
nosuid - zapobiega uwzględnianiu bitów set-UID oraz set-GID w przypadku dowolnego pliku wykonywalnego
ro - powoduje zamontowanie systemu plików w trybie tylko do odczytu, powstrzymując wszelkie modyfikacje informacji dotyczących plików, włączając w to na przykład czas dostępu do pliku
Pole (fs_freq) jest używane przez program dump do wykrywania, który system plików ma mieć wykonywaną kopię bezpieczeństwa. Jeżeli nie ma informacji o tym polu, zwracana jest wartość 0 i dump przyjmuje, że dany system plików nie musi być mieć robionych kopii danych. Jeśli nie korzystamy z tego programu możemy wszędzie ustawić wartość 0.
Pole (fs_passno) jest używane przez program fsck aby zadecydować, jaka powinna być kolejność sprawdzania systemów plików podczas ładowania systemu. Główny system plików powinien mieć (fs_passno) równą 1, zaś inne systemy plików powinny mieć (fs_passno) równe 2. Jeżeli to pole nie posiada żadnej wartości lub jest ona równa 0 to wtedy dany system plików nie jest sprawdzany. Sprawdzania nie wymagają właściwie systemy plików z księgowaniem, gdyż są bardzo odporne na awarie.
Uwaga! Najważniejszym woluminem w systemie jest ten przypisywany do korzenia drzewa katalogów (katalog "/"), dlatego należy bardzo ostrożnie dokonywać zmian jego konfiguracji. Błąd może spowodować problemy z uruchomieniem systemu operacyjnego.
Jeden z najważniejszych plików w systemie - przechowuje informacje o kontach wszystkich użytkowników. Jeden wiersz w tym pliku zawiera informacje o jednym użytkowniku. Każdy składa się z pól rozdzielonych dwukropkiem:
login:haslo:UID:GID:komentarz:katalog_domowy:powłoka np.: marek:x:502:1000:Marek Kowalski:/home/users/marek:/bin/bash |
Uwagi: Znak "x" w miejscu hasła oznacza że jest przechowywane w osobnym pliku (/etc/shadow). UID to unikalny identyfikator użytkownika, zaś GID to unikalny numer grupy głównej użytkownika - zdefiniowany w pliku /etc/group. Powłoka (shell) musi być zdefiniowana w pliku /etc/shells. Oznaczenie powłoki jako /bin/false oznacza że jest to konto użytkownika systemowego. Jest to specjalny rodzaj kont na które zwykli użytkownicy nie mogą się zalogować
Plik ten jak i opisany poniżej /etc/shadow mają kluczowe znaczenie dla systemu, dlatego nie należy ich edytować ręcznie. Narzędzia, służce do tego, opisano w sekcja Konta użytkowników w rozdział Administracja.
Plik zawierający zakodowane hasła i dodatkowe informacje dla systemu uwierzytelniania użytkowników np.:
marek:$1$qb/waABk$F3Y6dKw/6ekZPfcoTpzks/:12575:0:99999:5::: |
Plik zawierający nazwy utworzonych grup i przypisanych do nich użytkowników według schematu:
nazwa_grupy::GID:login1,login2,login3,... np.: audio::23:kasia,marek |
Uwagi: Pierwsze pole to unikalna nazwa grupy, drugie nie ma we współczesnych systemach uniksowych już zastosowania, GID to niepowtarzalny identyfikator grupy, trzecie pole zawiera listę identyfikatorów użytkowników zapisanych do tej grupy.
Podobnie jak dwa powyższe, ten plik też powinien być modyfikowany przez przeznaczone do tego programy, ich opis zawarto w sekcja Grupy w rozdział Administracja
Zawiera listę dostępnych dla użytkowników powłok np.:
/bin/ksh /bin/sh /bin/bash |
Aby użytkownik miał możliwość korzystania z danej powłoki musi być ona zdefiniowana w tym pliku
Wiadomość dnia (ang. Message of the day) - Powitanie użytkownika: treść tego pliku wyświetlana po uwierzytelnieniu się w systemie.
Plik tworzony przez administratora - blokuje możliwość logowania się użytkowników do systemu. Przy próbie logowania wyświetlana jest jego treść.
Ten rozdział opisuje operacje dyskowe takie jak podział na partycje, tworzenie systemów plików i inne zaawansowane zagadnienia
Uwaga! Wszelkie operacje dyskowe narażają nas na nieodwracalną utratę danych, dlatego zaleca się stworzenie kopii zapasowej danych i zachowanie szczególnej ostrożności.
W Linuksie mogą być obsłużone cztery partycje podstawowe lub trzy podstawowe i jedna rozszerzona. Takie partycje są numerowane od 1 do 4, zaś dyski logiczne kolejnymi numerami począwszy od 5. Podawanie numeru partycji ma sens wyłącznie w wypadku dysków twardych, nie podajemy ich dla urządzeń takich jak napędy optyczne (CD/DVD), dyskietki czy też woluminy logiczne. Nie podajemy go również w przypadku odwołania do urządzenia fizycznego np. używając programu fdisk lub hdparm.
Aby zorientować się w układzie partycji urządzenia możemy użyć programu fdisk np.:
# fdisk -l /dev/hda |
Urządzenia ATA nazywane są wg. schematu: /dev/hd{$x}{$Nr} np. /dev/hda1.
Parametr {$x} jest małą literą identyfikującą fizyczne urządzenie, zaś {$Nr} to omówiony powyżej numer partycji dyskowej. W odróżnieniu od urządzeń SATA i SCSI w interfejsie IDE litery te mają swoje specjalne znaczenie - wskazują sposób podłączenia urządzenia:
"a" -dysk nadrzędny (primary) podłączony do pierwszego kanału IDE
"b" -dysk podrzędny (slave) podłączony do pierwszego kanału IDE
"c" -dysk nadrzędny (primary) podłączony do drugiego kanału IDE
"d" -dysk podrzędny (slave) podłączony do drugiego kanału IDE
Dyski twarde i pamięci flash mają oznaczenia /dev/sd{$x}{$Nr} np. /dev/sda1. Symbol {$x} to oznaczenie fizycznego urządzenia, którym przypisywane są kolejne litery zaczynając od "a", zaś {$Nr} to opisany na początku numer partycji. Napędy optyczne (CD/DVD) są oznaczane jako /dev/sr{$Nr} np.: /dev/sr0.
Woluminy logiczne mają dowolne nazwy - nadawane przez administratora w trakcie ich zakładania. Jeśli pliki urządzeń nie są utworzone statycznie, to mogą być wykrywane automatycznie (przy starcie systemu) i wtedy nadawane są im nazwy w konwencji /dev/mapper/$VG-$LV np. /dev/mapper/sys-home.
Urządzenia mają nazwy wg. schematu: /dev/md{$nr}, np. /dev/md0, które z kolei jest symlinkiem do /dev/md/0.
GRUB ze względu na swoja wieloplatformowość używa własnego schematu nazewnictwa. Dyski fizyczne są widoczne jako (hd{$NR}), np. (hd1) zaś partycje jako (hd{$NR1},{$NR2}) np. (hd1,2). Urządzenia te nie są bezpośrednio powiązane z plikami urządzeń w katalogu katalogu /dev i programy poza GRUB-em nie mogą z nich korzystać. Więcej w opisie bootloadera, w sekcja GRUB w rozdział Bootloader.
Na dysku twardym możemy utworzyć do czterech partycji podstawowych (primary partition) lub do trzech partycji podstawowych i jednej rozszerzonej (extended partition). Partycję rozszerzoną możemy podzielić na liczne dyski logiczne (logical partitions).
Partycje szerzej opisano m.in. w Wikipedii, zaś sposób ich oznaczania przedstawiono w sekcja Nazewnictwo urządzeń masowych. Opis systemu plików-urządzeń z katalogu /dev odnajdziemy w sekcja Urządzenia w rozdział Kernel i urządzenia.
Operacje na partycjach mogą skończyć się utratą danych, dlatego warto najpierw zrobić zrzut tablicy partycji do pliku:
# sfdisk -d /dev/hda > hda.out |
# sfdisk /dev/hda < hda.out |
Wymagania dyskowe w PLD (nie licząc danych, logów i obszaru wymiany):
instalacja minimalna - poniżej 150MB
serwer - dużo zależy od zainstalowanych usług, należy założyć, że zajmie co najmniej 250MB; dla większej elastyczności i stabilności warto przeznaczyć większy zapas miejsca, niż w przypadku maszyn domowych.
stacja robocza z XWindow - należy przeznaczyć przynajmniej 1GB miejsca
Osobnym zagadnieniem jest wielkość obszaru wymiany, stara zasada mówiąca, aby swap był dwukrotnie większy niż pamięć operacyjna, sprawdza się większości wypadków. Należy jednak podejść do tego elastycznie i dobrać objętość obszaru wymiany odpowiednio do charakterystyki pracy maszyny.
Dla stacji roboczych zazwyczaj wystarczy podział na dwie partycje, które będą użyte dla: "/" (głównego drzewa) i obszaru wymiany (swap). W przypadku serwerów dużo będzie zależało od zastosowania maszyny i preferencji administratora, lecz jako minimum należy dodatkowo przydzielić partycję dla gałęzi /var.
W obu zastosowaniach dla wygody i bezpieczeństwa nierzadko tworzy się dodatkową partycję dla katalogu /home, pozwala to na łatwiejsze zarządzanie uprawnieniami i ułatwia wiele operacji. Partycję na katalogi domowe należy traktować jako obowiązkową jeśli na maszynie będą dostępne konta z dostępem do powłoki (shella). Jej wielkość bezpośrednio zależy od planowanej ilości przechowywanych danych.
Jeśli od maszyny wymagamy zwiększonej niezawodności można utworzyć małą partycję dla katalogu /boot, w którym są trzymane ważne pliki systemowe. Dane w katalogu /boot zaraz po zainstalowaniu nie powinny przekroczyć ok. 7MB, aby więc mieć możliwość instalacji kilku kerneli, musimy przeznaczyć na taką partycję co najmniej 25MB miejsca. Dzięki temu zwiększymy szanse na uruchomienie systemu z uszkodzonym głównym systemem plików. Jest to szczególnie zalecane w przypadku użycia bootloadera GRUB, ze względu na jego specyficzną konstrukcję, więcej na temat GRUB-a znajdziemy w sekcja GRUB w rozdział Bootloader.
fdisk - interaktywny program do zarządzania partycjami, wydane polecenia zostaną wykonane na samym końcu - po operacji zapisu zmian. Właśnie ten program zostanie użyty w naszych przykładach, wywołujemy go z parametrem określającym urządzenie z katalogu /dev.
cfdisk - wygodne narzędzie, wyposażone w semigraficzny interfejs użytkownika. Twórcy ułatwili życie początkującym, poprzez ukrywanie partycji rozszerzonych, tworzeniem i ich usuwaniem zajmuje się program bez naszego udziału. Podobnie jak fdisk zapisuje zmiany do tablicy partycji na samym końcu. Wywołujemy go z parametrem określającym urządzenie z katalogu /dev.
parted - jest potężnym narzędziem, umożliwiającym wiele operacji niedostępnych dla obu poprzednich programów. Oprócz podstawowych operacji na partycjach umożliwia takie operacje jak zmianę wielkości partycji, tworzenie obrazów partycji i inne. Istotną różnicą w działaniu w porównaniu dla powyższych narzędzi jest natychmiastowe wprowadzanie zmian, stąd zaleca się zachowanie dużej ostrożności przy korzystaniu z niego.
GParted/QtParted - programy dla X-Window oparte o parted. Mają interfejs wzorowany na programie Partion Magic z systemu MS Windows.
sfdisk - program obsługiwany za pomocą argumentów i danych przesyłanych na wejście standardowe. Jest dosyć trudny w obsłudze ale za to może być używany w skryptach.
Poniższe przykłady będą dotyczyć programu fdisk, cfdisk jest bardzo prosty w obsłudze i nikt nie powinien mieć nim problemów, zaś opis parted wykracza poza ramy tego rozdziału.
Aby sprawdzić czy na dysku /dev/sda są jakieś partycje użyjemy następującego polecenia:
# fdisk -l /dev/sda |
# fdisk /dev/sda Command (m for help): |
Command action e extended p primary partition (1-4) |
Dla kolejnych partycji powtarzamy cały proces, aż uzyskamy to co zaplanowaliśmy. Opcją p) wyświetlamy planowany układ partycji. Po zakończeniu podziału przypisujemy typy partycji opcją t) podając kolejno: numer partycji, Jeśli wybrany podział nam odpowiada to zapisujemy zmiany na dysk (do tablicy partycji) przez wybór opcji w.
Jeśli żadna z partycji nie była używana w trakcie podziału na partycje (np. zamontowana) to tablica partycji jest ponownie odczytywana i od razu możemy wykonywać dalsze prace. W przeciwnym wypadku musimy jeszcze przeładować system. Po zakończeniu dzielenia dysku pozostało nam utworzenie systemów plików, które zostało opisane w sekcja Systemy plików.
W tym rozdziale omówimy tworzenie jednej z dwóch możliwych struktur na partycji lub urządzeniu - systemu plików lub obszaru wymiany (swap).
Rodzaj użytego systemu plików zależy od planowanego zastosowania. W Linuksie najbardziej uniwersalnym i popularnym systemem plików jest ext2. Swoją pozycję uzyskał dzięki temu, że jest prostym i stosunkowo wydajnym systemem plików. Ponadto jako jeden z niewielu systemów plików nadaje się do użytku na dyskietkach i bardzo małych partycjach.
W pozostałych zastosowaniach możemy śmiało użyć systemów plików z tzw. księgowaniem (journaling) np.: ext3, ReiserFS, XFS, JFS ze względu na duże bezpieczeństwo przechowywania danych. Dla zastosowań wymagających wysokiej niezawodności najlepszy będzie ext3, pozostałe z wymienionych można polecić w systemach wymagających dużej wydajności i wszędzie tam gdzie występują duże ilości plików.
Aby z partycji mogły również korzystać systemy Microsoftu musimy utworzyć na niej system plików vfat. Utracimy jednak wtedy wszystkie zalety uniksowych systemów plików.
Programy do tworzenia konkretnych systemów plików różnią się nazwami, łatwo je rozpoznamy gdyż ich nazwy zaczynają się od "mkfs." np.:
/sbin/mkfs.ext2 /sbin/mkfs.ext3 /sbin/mkfs.reiserfs /sbin/mkfs.msdos /sbin/mkfs.vfat /sbin/mkfs.xfs |
Aby utworzyć system plików wywołujemy odpowiedni program z nazwą urządzenia jako parametrem, na poniższym przykładzie przedstawiono tworzenie systemu plików ext2 na drugiej partycji podstawowej:
# /sbin/mkfs.ext2 /dev/sda2 |
Powyżej przedstawiono jedynie skróconą listę wszystkich dostępnych programów, programy te są dostępne w odpowiednich pakietach, przykładowo narzędzia dla systemu plików xfs odnajdziemy w pakiecie xfsprogs.
Do tworzenia obszaru wymiany używamy programu mkswap np.:
# mkswap /dev/hda5 |
Partycje i obszary wymiany są montowane/włączane przez rc-skrypty w trakcie uruchamiania systemu wg. opcji zawartych w pliku /etc/fstab (o ile tam zostały dodane). W pozostałych wypadkach systemy plików montujemy poleceniem mount z odpowiednimi opcjami np.:
# mount /dev/sda2 /katalog_docelowy |
Obszary wymiany aktywujemy następująco:
# /sbin/swapon /dev/hda5 |
Szczegółowy opis pliku /etc/fstab oraz rc-skryptów przedstawiono w sekcja Kluczowe pliki w rozdział Konfiguracja systemu.
Aby dowiedzieć się jaki typ systemu plików jest na
danej partycji, użyjemy programu
file z opcją -s
:
# file -s /dev/hda2 /dev/hda1: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs) |
# blkid /dev/md/0: UUID="4f6fc9cc-9a3a-42bd-9e47-50ecfbeb090b" TYPE="xfs" /dev/hda1: UUID="6d7abd95-9731-4406-b154-78ee66fc6c7f" TYPE="ext2" /dev/sda: UUID="4f6fc9cc-9a3a-42bd-9e47-50ecfbeb090b" TYPE="xfs" /dev/sdb: UUID="4f6fc9cc-9a3a-42bd-9e47-50ecfbeb090b" TYPE="xfs" |
/dev/hda1 on /boot type ext2 (rw,sync) /dev/md/0 on /vservers type xfs (rw,noatime,usrquota) |
Obecnie nie formatuje się dysków twardych, można to robić jedynie z dyskietkami elastycznymi za pomocą narzędzia fdformat. Robi się to wyłącznie dla uzyskania jakiejś nietypowej pojemności nośnika, w pozostałych wypadkach operacja ta jest zbędna, gdyż dyskietki podobnie jak dyski twarde są formatowane fabrycznie. Takie formatowanie nazywane jest także tzw. formatowaniem niskopoziomowym.
To co obecnie potocznie określa się jako "formatowanie" jest złożeniem dwóch operacji: podziału na partycje a następnie utworzeniem systemów plików.
W systemie Linux istnieje możliwość tworzenia na dyskach programowych macierzy RAID poziomów 0, 1, 4, 5, 6, 10, 01. Służy do tego celu usługa mdadm. W przeciwieństwie do macierzy RAID sprzętowych które wymagają specjalnego kontrolera dysków (dość drogiego), macierze RAID programowe zakłada się na dyskach podłączonych do zwykłego kontrolera IDE, SATA lub SCSI i całą obsługę przekazuje do odpowiedniego oprogramowania (np: mdadm).
Macierze możemy zakładać zarówno na całych dyskach, jak i na odpowiednio przygotowanych partycjach, przy czym zakładanie na partycjach daje więcej możliwości konfiguracji. Zarówno korzystając z całych dysków jak i partycji należy pamiętać o tym że najmniejsza partycja lub dysk decyduje o wielkości zakładanej macierzy (miejsce ponad jest tracone), dlatego też należy raczej korzystać z takich samych rozmiarów dysków lub partycji.
Poniżej zamieszczono listę i opis dostępnych rodzajów macierzy dla mdadm, w nawiasach podano nazwy parametrów programu:
RAID 0 (raid0, 0, stripe) - striping czyli połączenie dwóch dysków (partycji) z przeplotem danych, zwiększa się wydajność w porównaniu z pojedynczym dyskiem, obniża odporność na awarie dysków - awaria jednego dysku to utrata wszystkich danych.
RAID 1 (raid1, 1, mirror) - kopie lustrzane, dyski są w dwóch jednakowych kopiach, w przypadku awarii jednego drugi przejmuje role pierwszego. Wydajność tak jak pojedynczy dysk, duże bezpieczeństwo, wadą jest duża strata pojemności (n/2 - n-liczba dysków w macierzy)
RAID 4 (raid4, 4) - dane są rozpraszane na kolejnych dyskach a na ostatnim zapisywane są dane parzystości, zwiększone bezpieczeństwo danych przy zachowaniu dużej pojemności (n-1). Wymaga przynajmniej trzech dysków, wydajność ograniczona przez dysk parzystości
RAID 5 (raid5, 5) - rozpraszane są zarówno dane jak i informacje o parzystości na wszystkich dyskach, dzięki czemu wydajność jest wyższa niż w RAID 4; pojemność n-1, wymaga przynajmniej trzech dysków.
RAID 6 (raid6, 6) - jest to rzadko stosowana, rozbudowana macierz typu 5. Jedyną różnicą jest dwukrotne zapisanie sum kontrolnych. Dzięki temu macierz może bez utraty danych przetrwać awarię dwóch dysków. Wymaga minimum czterech dysków, jej pojemność to n-2.
Tryb liniowy (linear) - czyli połączenie dwóch dysków w jeden w ten sposób że koniec pierwszego jest początkiem drugiego, nie zapewnia absolutnie żadnego bezpieczeństwa a wręcz obniża odporność na awarie dysków.
Instalujemy następujące pakiety:
# poldek -i mdadm |
# poldek -i mdadm-initrd |
# poldek -i dmraid |
Dosyć popularnym rozwiązaniem jest utworzenie identycznego zestawu partycji na każdym z dysków, a następnie spięcie odpowiednich partycji w macierze. Aby ułatwić sobie zadanie możemy najpierw podzielić jeden z dysków, a na następne urządzenia skopiować układ tablicy partycji np.:
# sfdisk -d /dev/sdc | sfdisk /dev/sdd |
Garść porad:
Kernel może być ładowany wyłącznie z macierzy RAID 1, jeśli więc będziemy chcieli używać np. RAID5 na głównym systemie plików to musimy umieścić gałąź /boot na osobnej, niewielkiej macierzy RAID1. Opis konfiguracji bootloadera do obsługi macierzy znajduje się w dalszej części artykułu.
Należy oprzeć się pokusie umieszczenia obszaru wymiany (swap) na RAID0, gdyż awaria jednego z dysków może doprowadzić do załamania systemu.
Urządzenia, z których składamy macierz powinny być równej wielkości, w przeciwnym razie wielkość macierzy będzie wyznaczana przez najmniejszą partycję.
Więcej informacji o podziale na partycje i planowaniu miejsca na dysku zdobędziemy w sekcja Podział na partycje.
Przystępujemy do zakładania macierzy na partycjach za pomocą polecenia mdadm:
mdadm -C {$dev_RAID} --level={$rodzaj} --raid-devices={$ilość_urzadzen} {$urzadzenia}
-C, --create
- utwórz nową macierz.
-l, --level
- ustaw poziom RAID np: linear,
raid0, 0, stripe, raid1, 1, mirror, raid4, 4, raid5, 5, raid6,
6; Jak możemy zauważyć niektóre opcje są synonimami.
Przy opcji Building pierwsze mogą być użyte: raid0, raid1, raid4, raid5.
-n, --raid-devices
- liczba aktywnych
urządzeń (dysków) w macierzy
-x, --spare-devices
- liczba zapasowych (eXtra)
urządzeń w tworzonej macierzy. Zapasowe dyski można dodawać i
usuwać także później.
-v --verbose
- tryb "gadatliwy"
--auto=yes
- automatyczne tworzenie urządzeń w
/dev/ przez mdadm (stosowane zwykle przy
użyciu UDEVa), więcej w Poradach na końcu rozdziału.
Przykłady tworzenia macierzy różnego typu:
RAID0 na dwóch partycjach - /dev/sda1 i /dev/sdb1 jako /dev/md0
# mdadm -C -v /dev/md0 --level=0 -n 2 /dev/sda1 /dev/sdb1 |
RAID1 na dwóch partycjach - /dev/sdc1 i /dev/sdd1 jako /dev/md1
# mdadm -C -v /dev/md1 --level=1 -n 2 /dev/sdc1 /dev/sdd1 |
RAID5 na 4 partycjach w tym jedna jako zapasowa (hot spare), jeśli nie podasz ile ma być zapasowych partycji domyślnie 1 zostanie zarezerwowana na zapasową
# mdadm -C -v /dev/md2 --level=5 -n 4 --spare-devices=1 \ /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 |
Po utworzeniu macierzy postępujemy z nią dalej jak z partycją, czyli zakładamy system plików i odwołujemy się do niej np: jako /dev/md0 np.:
# mkfs.xfs /dev/md0 |
Aby macierz była automatycznie składana przy starcie systemu musimy dodać odpowiednie wpisy do pliku /etc/mdadm.conf. Na początek dodajemy wiersz, w którym wymieniamy listę urządzeń z których budowane są macierze (można używać wyrażeń regularnych):
DEVICE /dev/sd[abcd][123] |
# mdadm --detail --scan >> /etc/mdadm.conf: |
ARRAY /dev/md0 devices=/dev/sda1,/dev/sdb1 ARRAY /dev/md1 devices=/dev/sdc1,/dev/sdd1 ARRAY /dev/md2 devices=/dev/sda3,/dev/sdb3,/dev/sdc3,/dev/sdd3 |
Macierze (inne niż rootfs) są składane przez rc-skrypt /etc/rc.d/rc.sysinit, na podstawie powyższych wpisów konfiguracyjnych, zatem po restarcie maszyny będziemy już z nich korzystać. Jeśli mamy macierz z głównym systemem plików, to musimy jeszcze przygotować initrd i bootloader (poniżej).
Przy ręcznym składaniu macierzy przydane może być polecenie skanujące urządzenia blokowe w poszukiwaniu istniejących macierzy:
# mdadm --examine --scan -v |
Jeśli główny system plików ma być na macierzy to musimy wygenerować obraz initrd z modułami, które pozwolą na złożenie macierzy. Na początek musimy mieć zainstalowany pakiet mdadm-initrd. Generowanie takiego initrd przebiega dokładnie tak samo jak dla zwykłego urządzenia blokowego, musimy się tylko upewnić, że do obrazu trafiły dodatkowo moduły: md-mod, odpowiednio raid0, raid1... i ewentualnie xor. Generowanie obrazu initrd szczegółowo zostało opisane w sekcja Initrd w rozdział Kernel i urządzenia.
Jeśli na raidzie ma się znaleźć główny system plików (bez /boot), to konfiguracja jest identyczna jak w przypadku klasycznych urządzeń blokowych.
Jeśli gałąź /boot ma się znaleźć na macierzy (wyłącznie RAID1) to powinniśmy zainstalować bootloader na każdym z dysków wchodzących w skład macierzy, dzięki czemu będziemy mogli uruchomić system mimo awarii jednego z dysków. RAID0 i RAID2-5 nie są obsługiwane przez LILO\GRUB
W LILO w pliku /etc/lilo.conf
należy podać odpowiednie
urządzenie dla opcji root
i boot
:
boot=/dev/md0 raid-extra-boot=mbr-only image=/boot/vmlinuz label=pld root=/dev/md0 initrd=/boot/initrd |
raid-extra-boot
wskazuje urządzenia
na których ma zostać zainstalowany bootloader (urządzenia wchodzące
w skład /dev/md0). Po zmodyfikowaniu
konfiguracji musimy zaktualizować bootloader
poleceniem lilo.
Jeśli używamy Grub-a wywołujemy z powłoki:
# grub grub> |
grub>find /boot/grub/stage1 |
(hd0,0) (hd1,0) Now you want to make sure that grub gets installed into the master boot record of your additional raid drives so that if id0 is gone then the next drive has a mbr loaded with grub ready to go. Systems will automatically go in drive order for both ide and scsi and use the first mbr and active partitions it finds so you can have multiple drives that have mbr's as well as active partitions and it won't affect your system booting at all. So using what was shown with the find above and already knowing that hd0 already has grub in mbr, we then run: Grub>device (hd0)/dev/sda (/dev/hda for ide) Grub>root (hd0,0) Grub>setup (hd0) |
Grub>device (hd1) /dev/sdb (/dev/hdb for ide) Grub>root (hd1,0) Grub>setup (hd1) Grub will then spit out all the commands it runs in the background of setup and will end with a successful embed command and then install command and end with .. succeeded on both of these commands and then Done returning to the grub> prompt. Notice that we made the second drive device 0. Why is that you ask? Because device 0 is going to be the one with mbr on the drive so passing these commands to grub temporarily puts the 2nd mirror drive as 0 and will put a bootable mbr on the drive and when you quit grub you still have the original mbr on sda and will still boot to it till it is missing from the system. You have then just succeeded in installing grub to the mbr of your other mirrored drive and marked the boot partition on it active as well. This will insure that if id0 fails that you can still boot to the os with id0 pulled and not have to have an emergency boot floppy. |
Skrócone informacje o macierzy:
# mdadm --query /dev/md0 |
# mdadm --detail /dev/md0 |
# cat /proc/mdstat |
Mając dwie macierze RAID1 np: /dev/md0 i /dev/md1, możemy utworzyć macierz RAID10 (strip dwóch mirrorów) jako /dev/md2
# mdadm -C -v /dev/md2 --level=1 -n 2 /dev/md0 /dev/md1 |
Aby samemu złożyć macierz (z np: PLD Live CD) wydajemy polecenie, które może wyglądać następująco:
# mdadm -A /dev/md0 /dev/hda /dev/hdb |
Jeśli macierz jest składana w trakcie startu systemu
to automatycznie tworzony jest plik urządzenia /dev/mdX.
W trakcie tworzenia macierzy, lub gdy macierz nie startuje wraz z systemem,
możemy skorzystać z gotowych urządzeń w /dev (pakiet dev)
lub samemu je utworzyć (pakiet udev).
Udev nie tworzy urządzeń /dev/md0,
więc musimy w tym celu użyć parametru --auto=yes
w wywołaniach programu mdadm, lub utworzyć je poleceniem
mknod. Urządzeniu nadajemy
major o wartości 9 i kolejny, niepowtarzalny
numer minor.
Nie musimy się martwić o moduły, są on ładowane automatycznie przez mdadm lub
initrd. Więcej o UDEV w sekcja Udev - dynamiczna obsługa sprzętu w rozdział Kernel i urządzenia.
Wraz z pakietem mdadm dostarczany jest rc-skrypt uruchamiający mdadm w trybie monitorowania (jako demona). Więcej szczegółów w dokumentacji programu mdadm.
LVM (Logical Volume Management) to system zaawansowanego zarządzania przestrzenią dyskową, który jest o wiele bardziej elastyczny, niż klasyczne partycje dyskowe. To wiąże się z bardziej złożoną konstrukcją, która składa się z następujących struktur:
PV (physical volumes) - fizyczne woluminy: są bezpośrednio związane z partycjami dyskowymi (np. /dev/hda1, /dev/sdb3).
VG (volume groups) - grupy woluminów: składają się z co najmniej jednego PV, ich wielkość to suma objętości wszystkich PV należących do danej grupy. Uzyskane miejsce dyskowe może być dowolnie dysponowane pomiędzy kolejne LV.
LV (logical volumes) - woluminy logiczne: są obszarami użytecznymi dla systemu (podobnie jak partycje dyskowe). LV są obszarami wydzielonymi z VG, zatem suma wielkości woluminów nie może zatem przekraczać objętości VG, do którego należą.
PV1 PV2 \ / VG / | \ LV1 LV2 LV3 |
Musimy wyznaczyć urządzenia blokowe których chcemy użyć do stworzenia struktur PV. Jeśli główny system plików ma być umieszczony na woluminie logicznym to musimy przeznaczyć małą partycję dla gałęzi /boot, gdyż bootloadery lilo i grub nie potrafią czytać danych z woluminów. Szczegółowy opis dzielenia dysków na partycje zamieściliśmy w sekcja Podział na partycje.
Załóżmy, że mamy dwa dyski twarde po 250GB (/dev/sda i /dev/sdb), których powierzchnię chcemy połączyć i rozdysponować pod system operacyjny. Jako, że rootfs także będzie na woluminie to rozplanowanie miejsca może wyglądać następująco:
/dev/sda1: mała partycja na /boot o pojemności 50MB
/dev/sda2: druga partycja dla woluminów (reszta dysku)
/dev/sdb: cały dysk dla woluminów
swap: 5GB
/ (rootFS): 25GB
/home: 370GB
Omawiamy implementację LVM2, zatem instalujemy pakiet lvm2, jeśli LVM ma być użyty jako główny system plików to potrzebujemy jeszcze pakiet lvm2-initrd do wygenerowania odpowiedniego obrazu initrd.
Ładujemy moduł device mappera:
# modprobe dm-mod |
Dzielimy dysk /dev/sda na dwie opisane powyżej partycje, a następnie wskazujemy urządzenia Physical Volumes:
# pvcreate /dev/sda2 /dev/sdb |
# vgcreate vgsys /dev/sda2 /dev/sdb |
# lvcreate -L 5GB -n swap vgsys # lvcreate -L 25GB -n rootfs vgsys # lvcreate -L 370GB -n home vgsys |
# mkswap /dev/vgsys/swap # mkfs.xfs /dev/vgsys/rootfs # mkfs.xfs /dev/vgsys/home |
# mkfs.ext2 /dev/sda1 |
Woluminy są automatycznie aktywowane przez rc-skrypt /etc/rc.d/rc.sysinit lub initrd. Moduł device mappera również jest ładowany automatycznie. Jeśli chcemy umieścić główny system plików na LV, to musimy jeszcze wygenerować nowy obraz initrd, z obsługą LVM. Zostało to szczegółowo przedstawione w sekcja Initrd w rozdział Kernel i urządzenia. W konfiguracji bootloadera ustawiamy opcję 'root=' na /dev/vgsys/rootfs. Teraz instalujemy system, instalujemy bootloader i możemy zrestartować maszynę.
Gdy zajdzie potrzeba "ręcznego" aktywowania woluminów (np. spod RescueCD), to na początek musimy się upewnić, że jest załadowany moduł dm-mod. Kernel nie zgłasza komunikatów o odnalezieniu woluminów, tak jak ma to miejsce z partycjami, należy je odszukać za pomocą odpowiednich narzędzi: lvmdiskscan i lvscan. Jeśli odnaleźliśmy żądane struktury, to możemy je aktywować:
# vgchange -a y |
Skrócone informacje o każdym z rodzaju komponentów (PV/VG/LV) wyświetlimy za pomocą programów pvs, vgs, lvs. Więcej informacji uzyskamy za pomocą programów: pvdisplay, vgdisplay, lvdisplay.
Do niektórych operacji z woluminami będziemy musieli je odmontować i deaktywować. Aby deaktywować wszystkie woluminy użyjemy polecenia
# vgchange -a n |
# vgchange -a y |
Teraz przedstawimy potęgę LVM-a: pokażemy jak powiększyć wolumin, gdy dochodzimy do wniosku, że przeznaczonego miejsca jest za mało. Załóżmy, że mamy woluminy utworzone zgodnie z wcześniejszymi przykładami i chcemy przeznaczyć całą dostępną wolną przestrzeń na naszym VG (100GB) dla /dev/vgsys/homes:
# lvextend -l 100%VG /dev/vgsys/home |
# xfs_growfs /home |
Woluminy LVM powodują zwiększone ryzyko uszkodzenia danych, gdyż awaria jednego dysku może spowodować utratę wszystkich danych. Z tego powodu zaleca się tworzenie woluminów na macierzach RAID.
Awarie dysków często są bolesne, a nierzadko dosyć kosztowne. Istnieje wiele narzędzi do odzyskiwania danych, jednak nigdy nie gwarantują sukcesu. Dlatego warto dokonywać regularnie kopie zapasowe danych.
Uszkodzenia fizyczne sprawdzamy programem badblocks z pakietu e2fsprogs, uruchamiamy go poleceniem:
# badblocks -s /dev/sda |
Nazwy programów, podobnie jak programy do tworzenia systemów plików, są ujednolicone (poza XFS). Zaczynają się od "fsck.":
fsck.ext2 fsck.reiserfs fsck.vfat fsck.jfs |
# xfs_repair /dev/sda2 |
Programy te nie pozwolą na sprawdzanie na systemie plików podmontowanym w trybie do odczytu i zapisu. Powinniśmy w ogóle nie montować takiego systemu plików, a przynajmniej podmontować w trybie tylko do odczytu.
Nieco bardziej złożone jest sprawdzanie głównego systemu plików jeśli uruchomiliśmy system w trybie jednego użytkownika. Problemem jest konieczność przemontowania systemu plików w tryb ro. Niektóre programy mogą sprawdzać w pliku /etc/mtab czy system plików jest w trybie tylko do odczytu. Może to dać nieprawidłowe wyniki, gdyż zazwyczaj gałąź /etc leży na głównym systemie plików i w pliku tym nie nastąpią żadne zmiany po takim przemontowaniu. Można to obejść wcześniej modyfikując wpis w /etc/mtab, kiedy już to zrobimy wykonujemy polecenie:
# mount / -o ro,remount |
Naprawienie systemu plików nie gwarantuje, że nie zostały uszkodzone żadne pliki. Jeśli na naprawianym systemie plików były jakieś dane systemowe, to powinniśmy wykonać kontrolę ich integralności, opisaną dokładnie w sekcja Zaawansowane operacje w rozdział Zarządzanie pakietami.
W tym rozdziale znajdziesz informacje dotyczące administracji systemem PLD
W tym rozdziale pokażemy co można zrobić w wypadku, jeśli nastąpiła awaria systemu, uniemożliwiająca normalne uruchomienie. Musimy uzyskać dostęp do urządzeń lub plików na dysku twardym, możemy w tym celu spróbować uruchomić system na niskim poziomie pracy, a jeśli to się nie powiedzie, to użyć operacji chroota z innego systemu np. dystrybucji typu live.
Możemy uruchomić system z pominięciem wielu czynności wykonywanych przez skrypty startowe. Operacja polega na przekazaniu do kernela odpowiednich parametrów, które wymuszą użycie przez proces init specjalnie przygotowanego zestawu rc-skryptów.
Interesuje nas poziom 1 lub single (tryb jednego użytkownika), tak też nazywają się parametry, które musimy przekazać do kernela. Parametry przekazujemy do jądra za pośrednictwem bootloadera, w trakcie uruchomienia systemu np.:
grub append> root=/dev/sda2 single |
Jako dystrybucję Live najlepiej wybrać RescueCD lub PLD Live. Oba projekty są dobrze przygotowane do pracy z naszą dystrybucją, gdyż zawierają program rpm i poldek.
Na początek musimy zadbać o to, aby system mógł się uruchomić z płyty CD, uzyskamy to modyfikując odpowiednią opcję BIOS-u komputera. Teraz uruchamiamy komputer z RescueCD umieszczonym w napędzie CD-ROM i czekamy aż system się uruchomi.
Aby dokonać napraw musi zostać załadowany moduł kontrolera masowego. Większość współczesnych dystrybucji typu live sama wykrywa sprzęt, jeśli jednak to się nie powiedzie lub używamy starej wersji RescueCD to musimy sami załadować moduł. Jeśli potrzebujemy obsłużyć kontroler typu IDE musimy załadować moduł ide-disk
# modprobe ide-disk |
# mdadm -A --auto=yes /dev/md0 /dev/hda /dev/hdb |
Teraz kiedy mamy załadowane odpowiednie moduły i dostęp do plików urządzeń (w katalogu /dev) możemy wykonać liczne operacje diagnostyczne i naprawcze (opisane dalej).
Do naprawy systemu plików konieczny jest tylko dostęp do plików urządzeń z katalogu /dev. Aby sprawdzić i naprawić system plików XFS wydajemy polecenie:
# xfs_repair /dev/sda2 |
W przypadku podniesienia systemu w trybie single mamy swobodny dostęp do plików konfiguracji, w przeciwnym wypadku musimy najpierw podmontować odpowiednią partycję aby uzyskać dostęp do plików. W tym celu tworzymy nowy katalog, a następnie montujemy do niego właściwe urządzenie np.:
# mkdir -p /mnt/rootfs # mount /dev/hda3 /mnt/rootfs |
# mount /dev/hda1 /mnt/rootfs/boot |
Jeśli uruchomiliśmy system z RescueCD i mamy podmontowane systemy plików to wielu wypadkach wygodniejsze, a czasami nawet konieczne będzie wykonanie tzw. chroot-a.. Polega to na podmianie głównego systemu plików używanego przez dany program na główny system plików ratowanego systemu operacyjnego. Będzie to konieczne przy problemach z jądrem, bootloaderem czy initrd. Aby wykonać tą operację należy wykonać komendę:
# chroot /mnt/rootfs |
To polecenie uruchomi powłokę /bin/sh w taki sposób, że wszystkie działania z jej poziomu będą odbywały się przeźroczyście na podmontowanym systemie plików. Zanim jednak zabierzemy się do pracy proszę o zapoznanie się z uwagami na końcu rozdziału. Jeśli używamy powłoki korzystającej z chroot-a, wystarczy że zakończymy jej pracę wydając polecenie exit lub skrótem klawiszowym ctrl+d. Na koniec odmontowujemy systemy plików jeśli takie są i restartujemy komputer.
Niektóre operacje w środowisku chroot wymagają (np. tworzenie initrd) podmontowania pseudo systemu plików /proc:
# mount /proc /mnt/rootfs/proc -o bind |
Użytkownicy udeva powinni pamiętać, że wiele operacji w podmontowanym środowisku wymagają istnienia kompletu plików urządzeń:
# mount /dev /mnt/rootfs/dev -o bind |
Może się zdarzyć, że poldek się nie uruchamia w chroocie. Sposobem na obejście tego jest uruchomienie go z flagą -r , np:
# poldek -r /mnt/rootfs |
Dużą zaletą RescueCD jest to, że automatycznie "podnosi" interfejs sieciowy z obsługą DHCP oraz serwer SSH. Pozwala to na zdalną naprawę, wystarczy, że ktoś umieści płytę z dystrybucją w napędzie i uruchomi komputer. My zalogujemy się na odpowiedni adres za pośrednictwem SSH; login: root, hasło: pld.
W systemie dostępne są specjalne skrypty, napisane w języku powłoki, zwane "skryptami startowymi" lub "rc-skryptami". W PLD zastosowano skrypty startowe typu System-V, dzięki temu praca administratora jest znacząco zautomatyzowana.
Za pomocą rc-skryptów pomocą możemy uruchamiać lub zatrzymywać podsystemy i usługi, kontrolować ich działanie oraz wiele innych. Można je podzielić na dwie zasadnicze grupy:
Skrypty podsystemów - specjalnych zadań mających za zadanie dokonać konfiguracji systemu operacyjnego. Do tego typu zadań należą: konfigurowanie sieci, ładowanie modułów, prace porządkowe i wiele innych. Te skrypty są integralną częścią systemu (pakiet rc-scripts) i zapewne są już u nas zainstalowane.
Skrypty zarządzania usługami - zarządzają programami działające w tle (demonami) np.: serwerem WWW, serwerem NFS. Skrypty te są instalowane automatycznie razem z pakietami usług. Wyjątek stanowią usługi z wydzielonymi w tym celu pakietami, rozpoznamy je po nazwie *-init i *-standalone. Więcej o nazewnictwie pakietów przedstawiono w sekcja Cechy pakietów w PLD w rozdział Zarządzanie pakietami.
Katalog /etc/rc.d przechowuje konfigurację uruchamiania usług i podsystemów, poniżej pokrótce omówiono składniki systemu rc-skryptów:
/etc/rc.d/init.d - katalog z skryptami startowymi usług
/etc/rc.d/rc{$NR}.d - katalogi tak oznaczone zawierają łącza symboliczne do skryptów zawartych w katalogu init.d. Wartość {$NR} jest liczbą wskazującą poziom pracy (run level), dla którego uruchamiana jest zawartość danego katalogu.
/etc/rc.d/rc - skrypt uruchamiający i zatrzymujący usługi
/etc/rc.d/rc.init - skrypt ustawiający opcje narodowe (język, waluta) pobiera konfigurację z pliku /etc/sysconfig/i18n
/etc/rc.d/rc.local - uruchamiany na samym końcu wszystkich skryptów, użytkownicy mogą dodawać tu swoje wpisy jeśli nie chcą używać init.d i rc{$NR}.d
/etc/rc.d/rc.serial - konfiguracja portów szeregowych
rc.sysinit - główny skrypt startowy uruchamiany jednokrotnie (w trakcie startu)
/etc/rc.d/rc.modules - załadowanie modułów z /etc/modules
/etc/rc.d/rc.shutdown - główny skrypt uruchamiany przy zatrzymaniu systemu lub restarcie.
/etc/profile - plik startowy przy pomocy którego są ustawiane głównie zmienne systemowe
Usługami/podsystemami zarządzamy ręcznie, wykonujemy to za pomocą uruchomienia odpowiedniego skryptu z katalogu /etc/rc.d/init.d/. Dodatkowo podajemy odpowiednim parametr określający akcję, którą skrypt ma wykonać. Uruchomienie bez parametru podaje listę możliwych dla niego akcji, dla przykładu wyświetlimy listę dostępnych parametrów podsystemu sieci:
# /etc/rc.d/init.d/network Usage: /etc/rc.d/init.d/network {start|stop|restart|status} |
Poniżej przedstawiono wyłączenie obsługi sieci, oraz ponowne jej uruchomienie. W ten sposób zmusza się usługę lub podsystem do ponownego odczytania swojej konfiguracji. W tym wypadku nastąpi skonfigurowanie na nowo interfejsów, zaktualizowanie ustawień, tablic routingu itd...
# /etc/rc.d/init.d/network stop Shutting down interface eth0.......................................[ DONE ] Shutting down interface eth1.......................................[ DONE ] # /etc/rc.d/init.d/network start Setting network parameters.........................................[ DONE ] Bringing up interface eth0.........................................[ DONE ] Bringing up interface eth1.........................................[ DONE ] |
Lista dostępnych parametrów będzie się zmieniać w zależności od usługi, w poniższej tabeli przedstawiono znacznie tych najczęściej spotykanych:
Tabela 1. Popularne akcje skryptów startowych
Parametr | Akcja |
---|---|
start | Uruchamia podsystem/usługę |
stop | Zatrzymuje podsystem/usługę |
reload, force-reload | Przeładowanie usługi poprzez wysłanie sygnału (zwykle HUP) do demona, często oba podane parametry mają takie same działanie. Operacja używana do ponownego odczytania konfiguracji demona. |
restart | Pełny restart usługi (zazwyczaj jest to kolejne wywołanie skryptu z parametrem start i stop). Operacja używana do ponownego odczytania konfiguracji demona. |
status | Wyświetla stan podsystemu/usługi, dzięki temu możemy łatwo określić czy czy jest uruchomiony. W niektórych wypadkach podawane są dodatkowe informacje. |
Niektóre usługi posiadają inne, użyteczne tylko dla nich parametry. Przykładem może być argument init, który zazwyczaj musi być użyty przed pierwszym uruchomieniem usługi.
Nieco wygodniej zarządza się skryptami przy pomocy programu service. Aby wykonać za jego pomocą taki sam efekt jak powyżej musimy go wywołać z dwoma parametrami, pierwszy to nazwa skryptu, drugi zaś to wybrana akcja:
# service network stop # service network start |
Domyślnie po zainstalowaniu nowego podsystemu lub usługi, dodawane są potrzebne skrypty startowe. Dzięki temu nowo zainstalowane oprogramowanie uruchamia się automatycznie w trakcie startu systemu lub przy zmianie poziomu pracy. Aby uruchomić dopiero co zainstalowany podsystem lub usługę musimy wykonać to "ręcznie".
Zarządzanie skryptami startowymi w trakcie instalacji/aktualizacji pakietów opisano w sekcja Cechy pakietów w PLD w rozdział Zarządzanie pakietami
Jeśli zechcemy utworzyć własny rc-skrypt to z pomocą przyjdzie nam szablon z pliku /usr/share/doc/rc-scripts{$wersja}/template.init.gz
Skryptów startowych typu System-V nie konfigurujemy bezpośrednio, w PLD służy ku temu zestaw plików konfiguracyjnych umieszczony w katalogu /etc/sysconfig. Znajdziemy w nim zarówno pliki konfiguracji systemu jak i konfiguracji zainstalowanych usług.
Większość tych plików jest bezpośrednio załączana do kodu rc-skryptów, zatem ich składnia musi odpowiadać składni powłoki wskazanej w skrypcie (w PLD jest to /bin/sh). Dotyczy to także plików konfiguracji interfejsów sieciowych w katalogu /etc/sysconfig/interfaces. W plikach tych występują jedynie konstrukcje przypisania zamiennych oraz ewentualne komentarze. Możemy co prawda umieszczać tam dowolne komendy wiersza poleceń, jednak należy być przy tym niezwykle ostrożnym i robić to tylko w uzasadnionych przypadkach. Jest jednak kilka plików konfiguracji, które są traktowane inaczej - mają własną składnię, przykładem tego rozwiązania są np. pliki /etc/sysconfig/static-*, nimi jednak nie będziemy się zajmować w tym rozdziale.
Opcje w plikach konfiguracji można podzielić na dwie grupy: ogólnego stosowania i specyficzne dla rc-skryptu. Pierwsza z nich to uniwersalne opcje, z którymi możemy się zetknąć w wielu w innych plikach konfiguracji np.:
SERVICE_RUN_NICE_LEVEL - priorytet procesów usługi (liczba nice)
RPM_SKIP_AUTO_RESTART - mówi programowi rpm czy usługa ma być automatycznie restartowana po aktualizacji, więcej o tej opcji w sekcja Cechy pakietów w PLD w rozdział Zarządzanie pakietami
Pomiędzy niektórymi demonami i podsystemami istnieją ścisłe powiązania, jako przykład można wymienić usługi sieciowe i podsystem sieci. Usługa jest zależna od działania sieci i próba wyłączenia najpierw tej drugiej może niekiedy zaowocować problemami, gdyż PLD nie dba o to za nas. Musimy samemu się zatroszczyć o wyłączanie usług we właściwej kolejności.
Pewną wskazówką będą numery przy nazwach łączy symbolicznych w katalogach /etc/rc.d/rc{$nr}.d (przy literze S). Numery te określają kolejność ładowania usług w trakcie startu systemu.
W PLD zastosowano klasyczny, oparty na rc-skryptach typu System-V system poziomów pracy. Poziomami na których pracują usługi można zarządzać ręcznie, jest to jednak niezalecany sposób, lepszym pomysłem jest użycie programu chkconfig. Aby wyświetlić listę usług uruchamianych przy w danych poziomach pracy wydajemy polecenie:
# chkconfig --list crond 0:wył. 1:wył. 2:wł. 3:wł. 4:wł. 5:wł. 6:wył. cups 0:wył. 1:wył. 2:wł. 3:wł. 4:wł. 5:wł. 6:wył. sshd 0:wył. 1:wył. 2:wył. 3:wł. 4:wł. 5:wł. 6:wył. gdm 0:wył. 1:wył. 2:wył. 3:wył. 4:wył. 5:wł. 6:wył. network 0:wył. 1:wył. 2:wł. 3:wł. 4:wł. 5:wł. 6:wył. sshd 0:nie 1:nie 2:nie 3:nie 4:tak 5:nie 6:nie |
W PLD najczęściej korzysta się z trybów 3 i 5 rzadziej z: 1, 2 i 4, nigdy nie ustawiamy trybu 0 (restart) i 6 (wyłączenie). Na powyższym przykładzie podsystem network jest uruchamiana dla poziomów: 2,3,4,5, zaś gdm tylko dla trybu 5. Aby włączyć/wyłączyć uruchamianie jakiejś usługi wywołujemy program następująco: chkconfig {$usługa} on/off. Wyłączenie usługi sshd (domyślnie jest włączona):
# chkconfig sshd off |
# chkconfig sshd on |
$ grep chkconfig /etc/init.d/sshd # chkconfig: 345 55 45 |
# chkconfig --level 5 sshd off |
Dodawanie lub usuwanie usług w poziomach pracy nie powoduje ich uruchomienia lub zatrzymywania, aby to zrobić musimy wykonać to ręcznie lub zmienić tryb pracy. Poziomy pracy zostały szerzej omówione w sekcja Zmiana poziomu pracy systemu.
PLD jest systemem uniksowym, a więc obsługuje tzw. poziomy pracy (ang. run levels). Poziom pracy jest to specjalna konfiguracja systemu, która pozwala zaistnieć tylko wytypowanym usługom bądź podsystemom. Mamy sporo swobody w wyborze usług pracujących bądź wyłączonych w danym poziomie pracy, opis jak nimi zarządzać znajdziemy w sekcja Zarządzanie podsystemami i usługami.
Tabela 2. Dostępne poziomy pracy
Poziom | Opis |
---|---|
1 | Konfiguracja z minimalną ilością uruchamianych podsystemów. Nie ma obsługi sieci i nie zezwala na logowanie się innym użytkownikom. |
2 | Rzadko używany tryb wielu użytkowników. Uruchamiana jest obsługa sieci i większości usług oprócz NFS. |
3 | Popularny tryb prac z dostępem wielu użytkowników i uruchomieniem wszystkich usług. Jest to typowy tryb dla maszyn obsługiwanych z konsoli tekstowej - np.: serwerów. |
4 | Rzadko używany tryb wielu użytkowników. - praca w konsoli tekstowej |
5 | Typowy tryb z dostępem wielu użytkowników uruchamiający system X-Window (uruchamia demon GDM lub KDM). Poziom używany na stacjach roboczych z GUI. Więcej o sposobach uruchamiania X-Window w sekcja X-Server w rozdział X-Window. |
single | Tryb jednego użytkownika (ang. Single user mode) - używany przez administratorów w sytuacjach awaryjnych. Uruchamia mniej skryptów startowych niż pierwszy poziom. Jego włączanie ma sens tylko przez przekazanie do jądra parametru single z poziomu bootloadera. |
Są jeszcze dwa tryby: tryb 0 i 6. Pierwszy jest używany w celu zatrzymania wszystkich usług i podsystemów przed zamknięciem systemu, drugi zaś przed ponownym uruchomieniem systemu. Z pośród wymienionych poziomów pracy najczęściej używa się poziomu 3 lub 5.
Poziomem pracy zarządza proces init. W celu określenia domyślnego poziomu pracy, init odczytuje swój plik konfiguracji (/etc/inittab) podczas uruchomienia systemu. Po uruchomieniu administrator może wymusić zmianę poziomu za pośrednictwem programu telinit (link symboliczny do programu init). Należy pamiętać o tym, że telinit nie dokonuje zmian w pliku /etc/inittab, tak więc przy ponownym uruchomieniu systemu wybrany zostanie ustawiony w nim poziom pracy. Więcej informacji o pliku /etc/inittab znajdziemy w sekcja Kluczowe pliki w rozdział Konfiguracja systemu.
Za domyślny poziom pracy odpowiada opcja "initdefault", może ona przyjąć wartość od 1 do 5 np.:
id:3:initdefault: |
Powyższy przykład włączy system na trzecim poziomie pracy, jest domyślna wartość w PLD.
W wyniku zmiany poziomu zostaną zatrzymane wszystkie wszystkie podsystemy wyłączone z pracy na tym poziomie, zaś te które mają działać zostaną uruchomione. Przykładowo jeśli chcemy przejść do trybu 2 użyjemy polecenia:
# telinit 2 |
Jeśli system do tej pory pracował w trybie 3 to wyłączona zostanie usługa NFS.
Możemy również określić poziom uruchomienia przed startem systemu, dokonujemy tego za pomocą parametrów przekazywanych za pośrednictwem bootloadera. Więcej szczegółów na ten temat znajdziemy w sekcja Wstęp w rozdział Bootloader.
W PLD zastosowano klasyczny dla systemów uniksowych system kont użytkowników, tak więc istnieje podział na dwa rodzaje kont: konta systemowe i konta użytkowników. Zarządzanie kontami systemowymi następuje automatycznie w trakcie instalowania bądż usuwania programów, które ich wymagają. Z tego powodu nie musimy się nimi zajmować, zajmiemy się więc tylko kontami zwykłych użytkowników.
W PLD domyślnie instalowanym pakietem do zarządzania kontami jest pakiet shadow. Możemy do jednak zastąpić zbiorem pwdutils, który zawiera narzędzia o większych możliwościach. Dzięki nim nie będzie już konieczności "ręcznego" edytowania plików systemowych, z tego względu opisane zostaną wyłączne narzędzia pwdutils.
Konto użytkownika dodajemy poleceniem useradd -m {$nazwa_użytkownika} np.:
# useradd -m jkowalski |
GROUP - identyfikator grupy głównej - domyślnie: 1000 (users)
HOME - miejsce przechowywania katalogów domowych - domyślnie: /home/users
SHELL - powłoka - domyślnie: /bin/bash
Drugi określa bardziej zaawansowane opcje, najważniejsze z nich to:
PASS_MAX_DAYS - liczba dni do wygaśnięcia hasła -domyślnie: 99999
PASS_MIN_DAYS - minimalna liczba dni do między zmianami hasła -domyślnie: 0
PASS_WARN_AGE - ilość dni przez które będzie pokazywane ostrzeżenie o wygaśnięciu hasła - domyślnie: 7
Wiele opcji kont zawartych w tych plikach można łatwo modyfikować, poprzez przekazanie odpowiednich parametrów do programu useradd oraz passwd, więcej informacji na ten temat uzyskamy w podręczniku systemowym. Jeśli chcemy utworzyć większa ilość kont o zmodyfikowanych parametrach to wygodniejsze będzie ustawienie interesujących nas wartości w podanych powyżej plikach.
Jeśli użytkownik ma konto na wielu maszynach dobrym zwyczajem jest nadawanie takiego samego numeru użytkownika (UID) dla każdego z kont. W przypadku programu useradd należy użyć opcji "-u".
Na koniec administrator musi ustawić hasło dla danego użytkownika.
Aby usunąć konto użyjemy programu userdel:
# userdel jkowalski |
Ze względów bezpieczeństwa można polecić blokowanie kont użytkowników w miejsce ich usuwania, w ten sposób możemy się ochronić przed sytuacją powrotu do użytku numeru UID usuniętego użytkownika.
Dane użytkownika modyfikujemy poleceniem usermod, dokładny opis tego programu znajdziemy w manualu.
Pierwsze hasło dla użytkownika jest nadawane przez administratora, każdą następną jego modyfikację użytkownik może wykonywać samodzielnie.
Ustawienie hasła przez administratora: passwd {$nazwa_użytkownika}
# passwd jkowalski Changing password for jkowalski. New UNIX password: Retype new UNIX password: |
# passwd -e jkowalski |
Hasło blokujemy poleceniem: passwd -l {$nazwa_użytkownika} np.:
# passwd -l jkowalski |
# passwd -u jkowalski |
# usermod -s /bin/false jkowalski |
W PLD zastosowano klasyczny dla systemów uniksowych system grup, tak więc istnieje podział na dwa rodzaje grup: grupy systemowe i grupy użytkowników. Grupy te rozróżniamy na podstawie identyfikatorów grupowych (GID), dla grup użytkowników przeznaczone są wartości 1000 i więcej. Ponadto grupy systemowe często przyjmują nazwy podobne jak nazwy usług np: ftp, named, itp.
Zarządzanie grupami systemowymi następuje automatycznie w trakcie instalowania bądź usuwania pakietów, z tego powodu nie należy w nie ingerować. W naszej dystrybucji zarządzanie grupami zazwyczaj sprowadza się do dodawania/usuwania własnych grup oraz zarządzania uczestnictwem w istniejących grupach.
W PLD domyślnie instalowanym pakietem do zarządzania grupami jest pakiet shadow. Możemy do jednak zastąpić zbiorem pwdutils, który zawiera narzędzia o większych możliwościach. Dzięki nim nie będzie już konieczności "ręcznego" edytowania plików systemowych, z tego względu opisane zostaną wyłączne narzędzia pwdutils.
Używamy polecenia groupadd {$nazwa_grupy} np.:
# groupadd kadry |
Jeśli tworzymy takie same grupy na wielu maszynach, to dobrym zwyczajem jest nadawanie takiego samego numeru grupy (GID) dla każdej z grup. Dowolny GID narzucamy w trakcie tworzenia grupy programem groupadd z użyciem opcji "-g".
Dzięki poleceniu id {$nazwa_użytkownika} sprawdzimy do jakich grup zapisany jest użytkownik, jeśli nie podamy nazwy konta to zostanie wyświetlona informacja o aktualnie używanym koncie np.
$id jkowalski uid=500(jkowalski) gid=1000(users) grupy=1000(users),10(wheel),19(floppy),23(audio) |
Zapisanie do grupy następuje po wykonaniu polecenia groupmod -A {$konto_użytkownika} {$grupa} np.
groupmod -A jkowalski kadry |
Aby wyrejestrować użytkownika z grupy musimy użyć parametru "-R" np.
groupmod -R jkowalski kadry |
Po każdej modyfikacji uczestnictwa w grupach, użytkownik musi się ponownie zalogować, aby wprowadzone zmiany zaczęły obowiązywać.
Zapisanie użytkownika do grupy służy podniesieniu jego uprawnień, listę przywilejów jakie uzyska zamieszczono w sekcja Zarządzanie uprawnieniami.
W PLD zastosowano restrykcyjny poziom bezpieczeństwa, zwykły użytkownik domyślnie ma minimalne możliwe uprawnienia. Aby je zwiększyć administrator musi zapisać użytkownika do odpowiednich grup, poniżej została przedstawiona skrócona ich lista i odpowiadające im "przywileje" lub funkcje.
Tabela 3.
GID | Nazwa | Właściciel/Uprawnienia |
---|---|---|
0 | root | grupa administracyjna - wysokie uprawnienia w całym systemie |
3 | sys | odczyt niektórych plików systemowych np. konfiguracji i logów systemu druku CUPS |
4 | adm | możliwość korzystania z narzędzi takich jak: tarcerouote, ping, arping, clockdiff |
6 | disk | bezpośredni dostęp do urządzeń masowych np. naprawy i tworzenie systemów plików, odtwarzanie i nagrywanie CD |
7 | lp | dostęp do portu drukarki: równoległego, USB |
9 | kmem | odczyt z urządzeń /dev/mem, /dev/kmem |
10 | wheel | możliwość korzystania z programu su |
17 | proc | dostęp do pseudosystemu plików /proc (np. wgląd do procesów innych użytkowników) |
19 | floppy | możliwość niskopoziomowego formatowania dyskietek i tworzenia na nich systemu plików |
22 | utmp | zapis do plików /var/run/utmpx, /var/log/wtmp, /var/log/lastlog |
23 | audio | dostęp do karty dźwiękowej |
27 | cdwrite | dostęp do narzędzi nagrywania płyt CD |
28 | fsctrl | grupa której można używać do nadawania praw dla plików na montowanych urządzeniach |
50 | ftp | grupa systemowa serwera FTP: odczyt plików konfiguracji |
51 | http | grupa systemowa serwera WWW |
117 | crontab | odczytywanie konfiguracji demona CRON |
123 | stats | grupa używana do potrzeb automatycznie generowanych statystyk (mrtg, calamaris, itd.) |
124 | logs | grupa odczytu niektórych logów |
138 | fileshare | możliwość udostępniania zasobów NFS i SMB (zapis do /etc/exports, /etc/samba/smb.conf) |
1000 | users | domyślna grupa główna dla zwykłych użytkowników |
Dużo więcej informacji o grupach i użytkownikach znajdziemy w dokumencie uid_gid.db.txt trzymanym w CVS-ie. Zapisywanie do grup opisano w sekcja Grupy.
Bezpieczeństwo systemów i danych to rozległy temat dlatego głównie skupimy się na aspektach dotyczących PLD.
PLD jako dystrybucja "robiona przez administratorów dla administratorów" ma duże zasoby programów użytecznych w zakresie bezpieczeństwa, poczynając od NetCata (nc), a na wiresharku i nessusie kończąc.
Nasza polityka bezpieczeństwa wymaga, aby użytkownik należał do grupy wheel, jeśli chce zwiększyć swoje uprawnienia za pomocą su i sudo. W ten sposób atakujący musi zgadnąć trzy parametry zamiast jednego (nazwa użytkownika, hasło i hasło administratora zamiast samego hasła administratora). Nie ma też możliwości zdalnego zalogowania się bezpośrednio na konto roota (z tych samych powodów). Dodatkowo root nie może zdalnie używać innych usług (ftp, imap, pop3, smtp) m.in z powodu niedostatecznie silnego szyfrowania transmisji.
Domyślnie zwykli użytkownicy nie mają prawa wykonania programów z ustawionym bitem SUID. Aby takie prawo uzyskać muszą być zapisani do odpowiedniej grupy. Przykładowo program ping wymaga zapisania do grupy adm. Poglądowe zestawienie grup zamieściliśmy w sekcja Zarządzanie uprawnieniami.
Domyślnie użytkownicy nie widzą żadnych procesów poza swoimi. Jest to nie tylko krok w stronę bezpieczeństwa, ale i w wygody, użytkownik nie głowi się nad długimi listami procesów generowanych przez program top czy ps. Podobnie jak z programami z bitem SUID jest to oparte o grupy, aby użytkownik widział wszystkie procesy należy go zapisać do grupy /proc.
PLD oferuje system sys-chroot, wbudowany w rc-skrypty, służący do wygodnego zarządzania środowiskami typu chroot. Usługi, które wspierają natywnie chrooty (np. Bind) działają w izolowanym środowisku od razu po instalacji.
PLD wspiera także mechanizm Linux VServers, zwany potocznie "chrootem na sterydach". Wymaga on zainstalowania odpowiedniej wersji kernela i odpowiedniego zestawu narzędzi.
Najważniejszym narzędziem administracyjnym jest edytor tekstu, dlatego nie powinniśmy pozostać bez takiego programu, co może mieć miejsce np. przy uszkodzeniu systemu plików. Tu z pomocą przychodzi nam statycznie zlinkowany VIM z pakietu vim-static. Aby nie kolidował ze "zwykłym" vimem, plik wykonywalny jest umieszczany w /bin/vim.
Zagadnienia związane z bezpieczeństwem zostały omówione w sekcja Bezpieczeństwo w rozdział Zarządzanie pakietami.
W tym rozdziale znajdziesz informacje dotyczące konfiguracji sieci
Pierwszą rzeczą jaką musimy zrobić to ustalić wszystkie konieczne parametry połączenia sieciowego. W razie wątpliwości należy skontaktować się z naszym dostawcą usług internetowych. Ten rozdział opisuje konfigurację interfejsów sieciowych, testowanie połączenia oraz inne prace diagnostyczne przeprowadzimy za pomocą narzędzi opisanych w sekcja Narzędzia sieciowe w rozdział Zastosowania sieciowe.
Zarządzanie całym podsystemem sieci (włączanie, wyłączanie, restart) dokonujemy za pomocą rc-skryptu network, więcej informacji o zarządzaniu rc-skryptami znajdziemy w sekcja Zarządzanie podsystemami i usługami w rozdział Administracja. Jest on integralną częścią PLD i startuje automatycznie w trakcie uruchomienia systemu. Aby skonfigurować sieć potrzebujemy jedynie ustawić podstawowe parametry sieci (opisane w następnym rozdziale) oraz prawidłowo skonfigurować interfejs(y).
Konfigurację proxy opisano szczegółowo w sekcja Proxy w rozdział Podstawy.
Jeśli mamy zamiar modyfikować konfigurację sieci na zdalnej maszynie (np. przez ssh), to zalecane jest użycie programu screen, aby mieć pewność, że cała procedura zakończy się poprawnie i nie utracimy kontaktu z hostem. Jeśli mamy program screen wystarczy że wydamy polecenie:
# screen service network restart |
W większości wypadków konfiguracja sieci (oprócz ustawień interfejsu sieciowego) będzie się składała ze wskazania domyślnej bramy i serwerów DNS dla resolvera. Wiele zaawansowanych opcji sieci (np. przekazywanie pakietów) ustawianych jest w pliku konfiguracji jądra: /etc/sysctl.conf, parametry te zostały omówione w sekcja Parametry jądra w rozdział Kernel i urządzenia.
Jeśli nie korzystamy z serwera DHCP ustawiamy statyczną trasę routingu do domyślnej bramy, w tym celu edytujemy plik /etc/sysconfig/static-routes - wpis może wyglądać następująco:
eth0 default via 192.168.0.1 |
Wskazanie serwerów DNS jest obowiązkową pozycją konfiguracji resolvera nazw. Operacja ta następuje automatycznie, o ile korzystamy z serwera DHCP, w przeciwnym wypadku musimy podać ich adresy samodzielnie. Serwery nazw ustawiamy edytując plik /etc/resolv.conf. Jeśli go nie ma, to możemy go utworzyć za pomocą dowolnego edytora lub poleceniem touch. Podajemy przynajmniej jeden (zazwyczaj nie więcej niż dwa) serwer nazw za pomocą słowa kluczowego nameserver np.:
nameserver 192.168.0.12 |
Możemy ustawić nazwę, za pomocą której nasza maszyna będzie się przedstawiała zalogowanym użytkownikom, i niektórym programom. W pliku /etc/sysconfig/network ustawiamy:
HOSTNAME=pldmachine |
Plik /etc/host.conf zawiera podstawowe opcje resolvera nazw, w większości wypadków wystarczy domyślna konfiguracja:
order hosts,bind multi on |
W pliku /etc/hosts można dodawać odwzorowania hostów, które są uzupełnieniem dla usługi DNS, jedyny wymagany wpis to wskazanie adresu IP pętli zwrotnej dla nazwy localhost:
127.0.0.1 localhost |
127.0.0.1 localhost styx |
213.25.115.88 platinum.elsat.net.pl |
Jeśli często odwołujemy się do maszyn w naszej domenie to możemy ułatwić sobie życie i ustawić domenę domyślną w pliku /etc/resolv.conf. Od tej pory podanie samej nazwy hosta (bez części domenowej), będzie uważane za podanie pełnego adresu. Przykładowe ustawienie domyślnej domeny (np. jakasdomena.cos) podano poniżej:
domain jakasdomena.cos |
Edytujemy plik /etc/sysconfig/network, domyślne wartości opcji z tego pliku w zupełności wystarczają do typowego korzystania z sieci i nie ma potrzeby nic modyfikować w nim.
NETWORKING=yes |
Ustawiamy na "yes" jeżeli w ogóle chcemy komunikować się z siecią.
IPV4_NETWORKING=yes |
Ustawiamy na "yes" jeżeli będziemy korzystać z protokołu IPv4 (wymagany do korzystania z Internetu).
NISDOMAIN= |
Domena NIS, jeśli nie korzystasz z tej usługi sieciowej, lub nie jesteś pewien pozostaw to pole puste.
GATEWAY=192.168.0.254 GATEWAYDEV=eth0 |
Opcje za pomocą których możemy ustawić trasę routingu do domyślnej bramy. Opcje te zostały uznane za przestarzałe, obecnie należy korzystać z pliku /etc/sysconfig/static-routes.
Większość dostępnych na rynku kart sieciowych jest oparta na układach Realteka, 3Com bądź Intela, dzięki temu nie będzie problemów z uruchomieniem urządzenia. Karty sieciowe są automatycznie wykrywane przez jądro i nadawane są im nazwy kolejno: eth0, eth1, eth2, itd. Jedyną rzeczą jaka pozostaje to załadowanie odpowiedniego modułu dla danego urządzenia, proces ten dokładnie opisano tutaj: sekcja Moduły jądra w rozdział Kernel i urządzenia.
Pliki konfiguracyjne interfejsów są przechowywane w katalogu /etc/sysconfig/interfaces, nazwy tych plików będą miały kolejno nazwy ifcfg-eth0, ifcfg-eth1, ifcfg-eth2, itd. W tym rozdziale założono, że konfigurujemy pierwszy interfejs (eth0). Pliki te modyfikujemy za pomocą dowolnego edytora tekstu np.
# vim /etc/sysconfig/interfaces/ifcfg-eth0 |
Zaczynamy od zmodyfikowania lub utworzenia pliku /etc/sysconfig/interfaces/ifcfg-eth0, aby karta działała poprawnie powinieneś mieć tam podobne ustawienia:
DEVICE="eth0" |
Powyższa opcja ta określa nazwę urządzenia.
IPADDR="192.168.0.2/24" |
Ta opcja określa adres karty sieciowej oraz maskę podsieci. Maskę podsieci podajemy w notacji CIDR - "/24" odpowiada masce 255.255.255.0.
ONBOOT="yes" |
Ustaw na "yes" jeśli chcesz aby interfejs automatycznie podnosił się razem z podsystemem sieci.
BOOTPROTO="none" |
Ta opcja pozwala dokonać wyboru, w jaki sposób karta sieciowa ma otrzymywać konfigurację. Powyższy wpis sprawia, że system pobiera wszystkie ustawienia z posiadanych plików konfiguracyjnych.
Na końcu aktywujemy sieć.
Na początek wybieramy jeden z programów klienckich: dhcpcd lub pump:
# poldek -i dhcpcd |
Nasze zadanie ogranicza się do zmiany jednego parametru w pliku /etc/sysconfig/interfaces/ifcfg-eth0. Odszukujemy w nim opcję BOOTPROTO i wskazujemy klienta DHCP, który ma być użyty:
BOOTPROTO="dhcp" |
Na koniec dokonujemy aktywacji interfejsu.
Mała uwaga: przy użyciu DHCP statyczne opcje sieciowe (adres IP, maska podsieci, brama) umieszczone w plikach konfiguracyjnych będą ignorowane, zaś zawartość pliku /etc/resolv.conf będzie nadpisywana informacjami przyznanymi przez serwer DHCP.
Ostatnią czynnością jest uruchomienie lub restart podsystemu sieci:
# /etc/rc.d/init.d/network start Ustawianie parametrów sieci....................[ ZROBIONE ] Podnoszenie interfejsu eth0....................[ ZROBIONE ] |
W przypadku laptopa dobrym pomysłem jest użycie jakiejś aplikacji X-Window do konfiguracji WiFi, z możliwością łatwego przełączania pomiędzy sieciami oraz automatycznym wykrywanie podłączenia kabla do karty Ethernet. Takie możliwości zapewnia np. NetworkManager (korzysta z aplikacji wpa_supplicant), przeznaczony dla środowiska Gnome. W przypadku stacjonarnych maszyn konfiguracja rc-skryptów powinna być wystarczająca w większości wypadków.
W naszych przykładach przedstawimy konfigurację dla sieci
bezprzewodowej działającej w trybie trybie infrastruktury
(managed), o określonym identyfikatorze SSID
i zabezpieczonej kluczem WEP
oraz
WPA2-PSK
(WPA2 Personal).
WEP zawiera zbyt dużo słabych punktów i jest
podatny na szybkie złamanie, dlatego o ile nie jesteśmy ograniczeni
sprzętem to należy używać właśnie WPA2.
Niektóre karty sieciowe WiFi mają dedykowane sterowniki i ich konfiguracja nie sprawia większych kłopotów, w pozostałych wypadkach posłużymy się sterownikami dla systemu Microsoft Windows, uruchomionymi dzięki aplikacji NdisWrapper. Jest to możliwe dzięki temu, że większość sterowników jest napisana zgodnie ze standardem NDIS. Po załadowaniu modułów, dalsza konfiguracja interfejsu w obu przypadkach przebiega niemal identycznie.
Do kernela w wersji 2.6.24 trafiło wiele modułów obsługujących sterowniki kart WLAN, sterowniki rozwijane niezależnie są dostępne w osobnych pakietach kernel-net-* Przykładowo zainstalujemy moduł dla kart Atheros:
$ poldek -i kernel-net-madwifi-ng |
# modprobe ath_pci |
Instalujemy pakiety kernel-net-ndiswrapper oraz ndiswrapper:
$ poldek -i ndiswrapper kernel-net-ndiswrapper |
Potrzebne nam będą teraz sterowniki windowsowe naszej karty sieciowej. Konkretnie chodzi o pliki z rozszerzeniami *.inf oraz *.sys. Możesz je skopiować z dostarczonej przez producenta płytki ze sterownikami
# mkdir /lib/windrivers # cd /lib/windrivers # cp /media/cdrom/sciezka/do/sterownikow/sterownik.inf . # cp /media/cdrom/sciezka/do/sterownikow/sterownik.sys . |
Musimy teraz zainstalować te sterowniki przy użyciu NdisWrappera.
# ndiswrapper -i /lib/windrivers/sterownik.inf |
Jeśli chcemy aby stworzył się alias w pliku /etc/modprobe.conf wykonujemy polecenie:
# ndiswrapper -m |
Domyślnie rc-skrypty do obsługi WLAN używają pakietu wireless-tools:
$ poldek -i wireless-tools |
DEVICE=wlan0 IPADDR=192.168.0.2/24 ONBOOT=yes BOOTPROTO=dhcp WLAN_ESSID=nasza_nazwa_sieci WLAN_KEY=A638FED41027EA086ECD6825B0 |
Jako urządzenie w opcji DEVICE wskazujemy nadaną przez kernel nazwę. Kartom nadawane są zwykle nazwy wlan0, wlan1, itd. Wyjątkiem od tej reguły są niektóre sterowniki, rozwijane niezależnie od kernela np. ath{$NR} dla kart z układami Atheros Communications, czy ra{$NR} dla Ralink Technology (w kernelach do 2.6.24). To jaka nazwa została przydzielona naszemu urządzeniu możemy odczytać z komunikatów jądra.
Poniżej przedstawione zostaną parametry sieci WLAN:
WLAN_ESSID=moja_siec |
WLAN_KEY=A638FED41027EA086ECD6825B0 |
Dodatkowo możemy ustawić szybkość interfejsu:
WLAN_BITRATE=auto |
Opisane powyżej wireless-tools nie potrafią używać szyfrowania WPA/WPA2, dlatego konieczny nam będzie pakiet wpa_supplicant:
$ poldek -i wpa_supplicant |
Edytujemy plik /etc/wpa_supplicant.conf, w którym definiujemy opcje sieci WLAN:
ap_scan=1 network={ ssid="nasza_nazwa_sieci" key_mgmt=WPA-PSK proto=RSN pairwise=CCMP TKIP group=CCMP TKIP WEP104 WEP40 psk=anejdlf7323e64ekjlkbdsxhjsldjf3fda } |
psk
może być jawne
lub kodowane za pomocą polecenia wpa_passphrase
Testujemy połączenie z WiFi:
# ifconfig wlan0 up # wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -dd |
-dd
włącza tryb debugowania i
jeżeli nie otrzymamy jakichś błędów, to przerywamy
działanie wpa_supplicant
skrótem ctr-c
Pozostała nam jeszcze edycja
/etc/sysconfig/interfaces/ifcfg-wlan0,
w celu wskazania, że chcemy korzystać z wpa_supplicant:
DEVICE=wlan0 IPADDR=192.168.0.2/24 ONBOOT=yes BOOTPROTO=dhcp WLAN_WPA=yes WLAN_WPA_DRIVER=wext |
Restartujemy ponownie naszą sieć:
# /etc/init.d/network restart |
Na wszelki wypadek powinniśmy się upewnić, że nasza maszyna jest w zasięgu sieci radiowej:
# iwlist wlan0 scan |
# /etc/rc.d/init.d/network start Ustawianie parametrów sieci....................[ ZROBIONE ] Podnoszenie interfejsu wlan0...................[ ZROBIONE ] |
# iwconfig lo no wireless extensions. eth0 no wireless extensions. wlan0 IEEE 802.11g ESSID:"nasza_nazwa_sieci" Nickname:"foo.com" Mode:Managed Frequency:2.412 GHz Access Point: 8A:1C:F0:6F:43:2D Bit Rate=300 Mb/s Sensitivity=-200 dBm RTS thr=2346 B Fragment thr=2346 B Encryption key:ABFA-155B-E90F-1D1C-FC34-66ED Security mode:restricted Power Management:off Link Quality:100/100 Signal level:-30 dBm Noise level:-96 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 |
W przypadku użycia pakietu wpa_supplicant możemy użyć programu wpa_cli:
wpa_cli status Selected interface 'wlan0' bssid=00:1e:e5:6d:62:5e ssid=nasza_nazwa_sieci id=0 pairwise_cipher=CCMP group_cipher=TKIP key_mgmt=WPA2-PSK wpa_state=COMPLETED ip_address=192.168.0.2 |
Jeżeli mamy kartę obsługującą tryb "n" może nam się przydać polecenie iwpriv z pakietu wireless-tools. Możemy przełączyć wtedy kartę wifi w szybszy tryb, ponieważ często z automatu włączony jest wolniejszy np. "g". Uruchamiamy więc:
# iwpriv wlan0 network_type n |
# iwlist bitrate lo no bit-rate information. eth0 no bit-rate information. wlan0 8 available bit-rates : 6 Mb/s 9 Mb/s 12 Mb/s 18 Mb/s 24 Mb/s 36 Mb/s 48 Mb/s 54 Mb/s Current Bit Rate=270 Mb/s |
Na samym początku musimy włączyć w biosie komputera port USB oraz zainstalować takie pakiety jak eagle oraz kernel-usb-eagle. Dodatkowo musimy jeszcze zainstalować pakiet ppp. Jeżeli zainstalowałeś system z płytki MINI-iso, powinieneś je tam znaleźć. W przypadku, kiedy instalowałeś system z dyskietki, znajdziesz je na jednej lub kilku dyskietek "addons" czyli dyskietek zawierających dodatkowe pakiety.
Przystępujemy do instalacji. Należy przejść do do lokalizacji w której znajdują się owe pakiety a następnie wydać następujące polecenie.
# rpm -Uvh kernel-usb-eagle* eagle-usb* ppp* |
Kiedy już upewniliśmy się, że mamy włączony port USB w biosie, musimy go zainicjować w systemie. Możemy to zrobić za pomocą pliku /etc/modules.conf w którym umieszczamy przykładową linijkę
alias usb-controller usb-uhci |
Jeżeli posiadasz zainstalowany kernel z serii 2.6.x powinieneś umieścić następujący wpis w pliku /etc/modprobe.conf
alias usb-controller uhci-hcd |
Po ponownym uruchomieniu komputera powinniśmy posiadać w systemie obecny moduł usb-uhci (uhci-hcd dla jądra 2.6.x). W przypadku, kiedy ten moduł po prostu nie zadziała spróbuj załadować usb-ohci (ohci-hcd dla jądra 2.6.x). Jeżeli podłączyłeś modem do portu USB 2.0 powinieneś użyć modułu usb-ehci (ehci-hcd dla jądra 2.6.x).
Możemy teraz podłączyć modem do komputera. Nasze urządzenie zostanie od razu wykryte i zainicjowane w systemie. Poprawna inicjalizacja powinna zakończyć się załadowaniem do pamięci modułu adiusbadsl. UWAGA! Jeżeli posiadasz kernel 2.6.x powinieneś załadować moduł eagle-usb.
Możemy zacząć od pliku /etc/resolv.conf. Opis znajdziecie w rozdziale poświęconym konfiguracji sieci. Przystępujemy teraz do konfiguracji pliku /etc/eagle-usb/eagle-usb.conf. Należy w nim zmienić wartość opcji VPI na taką jaką widzicie poniżej.
VPI=00000000 |
Skonfigurujemy teraz demona PPP. Utworzonemu w wyniku instalacji plikowi /etc/ppp/options zmieniamy nazwę na options.old. Tworzymy nowy plik options z zawartością taką jaka została przedstawiona na poniższym listingu. Najważniejszą rzeczą jest podanie w nim nazwy użytkownika, która jest konieczna do ustanowienia połączenia. Możemy również dopisać opcję debug, jeśli chcemy być informowani o tym co się dzieje.
# cat /etc/ppp/options user "user@neostrada.pl" mru 1492 mtu 1492 noipdefault defaultroute usepeerdns noauth #ipcp-accept-remote #ipcp-accept-loacal nobsdcomp nodeflate nopcomp novj novjccomp #novaccomp -am noaccomp -am #włączam debug. debug |
Musimy jeszcze wpisać hasło. Aby tego dokonać wyedytujmy plik /etc/ppp/chap-secrets. UWAGA! Jeżeli się pomylisz i wpiszesz hasło do /etc/ppp/pap-secrets, hasło nie zadziała.
# cat /etc/ppp/chap-secrets user@neostrada.pl * haslo * |
Na tym zakończymy konfigurację połączenia z Neostradą. Jesteśmy już gotowi aby wszystko uruchomić.
Najbardziej wygodnym sposobem będzie wykorzystanie mechanizmu rc-scripts do uruchamiania usługi. Do tego potrzebny będzie odpowiedni plik konfiguracji, przykładowy taki plik umieszczono w katalogu /usr/share/doc/rc-scipts/ oraz na poniższym wydruku:
DEVICE=ppp0 ONBOOT=yes PPPOA_EAGLE=yes AUTH=no MTU=1452 PERSIST=yes DEFROUTE=yes USEPEERDNS=yes PAPNAME=XXX@neostrada.pl # put password in /etc/ppp/pap-secrets or install # ppp-plugin-ifcfg-password and uncommend following lines # PLUGIN_IFCFG_PASSWORD=yes # PASSWORD=YYYY |
Plik zapisujemy jako /etc/sysconfig/interfaces/ifcfg-ppp0 i wydajemy polecenie:
# ifup ppp0 |
Dzięki opcji ONBOOT=yes
połączenie będzie nawiązywane wraz z
uruchamianiem systemu.
Możemy sprawdzić np. pingiem łączność z jakimś zewnętrznym serwerem, np. ping www.pld-linux.org. Jeżeli posiadasz jakąś sieć LAN, lub kilka komputerów w mieszkaniu, powinieneś przeczytać rozdział poświęcony maskaradzie.
Oto krótka lista tego, co będzie nam potrzebne do uruchomienia modemu.
Port USB w komputerze
Jądro z serii 2.4 lub 2.6
Programy: modem_run oraz pppoa3
Pakiet: ppp-plugin-pppoatm
Firmware do modemu.
Firmware dla modemu można ściągnąć z stąd: http://speedtouch.sourceforge.net/files/firmware.bin.
Jeżeli już upewniłeś się, że masz wszystkie wymagane rzeczy, możemy przystąpić do instalacji.
W pierwszej kolejności musimy zainicjować w systemie USB, oraz kilka modułów do obsługi ppp. Możemy to zrobić wykonując następujące polecenie
# for i in usbcore uhci acm ppp_generic \ ppp_synctty;do modprobe $i;done |
Komentarza wymaga tutaj obsługa USB. W przykładzie został podany moduł uhci. Jeżeli nie załaduje się poprawnie (zostaniesz o tym poinformowany) powinieneś wybrać jeden z następujących: usb-uhci, usb-ohci lub dla USB 2.0 usb-ehci. Posiadacze jąder z serii 2.6 mają do wyboru następujący zestaw modułów: uhci-hcd, ohci-hcd lub ehci-hcd. Ta różnorodność jest uwarunkowana sprzętowo, w zależności od rodzaju chipsetu obsługującego porty USB. Ważną rolę tutaj odgrywa moduł acm, gdyż bez niego nie będzie możliwe załadowanie firmware do modemu. W kernelach z serii 2.6.x odpowiednikiem acm jest moduł cdc-acm.
Posiadacze kernela z serii 2.6.x mogą użyć poniższej pętli która załaduje wszystkie potrzebne moduły. Oczywiście należy zwrócić uwagę aby załadować odpowiedni dla Twojego sprzętu moduł obsługujący kontroler USB na płycie głównej.
# for i in usbcore uhci-hcd cdc-acm ppp_generic ppp_synctty;do modprobe $i;done |
Następnym krokiem jest podmontowanie systemu plików w proc.
# mount none /proc/bus/usb -t usbfs |
W tym momencie możemy sprawdzić, czy SpeedTouch rzeczywiście jest widziany przez system. Aby tego dokonać wykonaj poniższe polecenie
# cat /proc/bus/usb/devices [...] S: Manufacturer=ALCATEL S: Product=Speed Touch 330 [...] |
Musisz teraz zainstalować oprogramowanie do modemu. Robimy to wydając następujące polecenie:
# poldek -U speedtouch |
Podłącz modem do komputera. Będzie on potrzebował do działania specjalnego pliku, tak zwanego firmware. Program modem_run potrafi odczytywać firmware w formatach przygotowanych dla Linuksa, Windowsa oraz MacOS. Jakie są możliwości pobrania pliku firmware? Możemy pobrać go z adresu podanego na początku rozdziału. Jest to firmware przygotowany dla systemu MacOS. Linuksowy firmware możemy pobrać ze strony Alcatela: www.speedtouchdsl.com/dvrreg_lx.htm. Wymagana jest rejestracja. Możemy również go wziąć z płytki dostarczonej przez TPSA. Powinien on znajdować się w archiwum Linux/ThomsonST330/pliki.tar.gz. Po jego rozpakowaniu powinniśmy mieć coś takiego jak: drivers/speedmgmt.tar.gz. Posiadając już plik speedmgmt.tar.gz możemy sobie zbudować pakiet rpm z firmwarem przy użyciu speedtouch-firmware.spec. Musimy tylko skopiować archiwum do katalogu ~/rpm/SOURCES. Dalsze instrukcje dotyczące budowania pakietów znajdziesz w tej dokumentacji w rozdziale: Tworzenie PLD. Po zainstalowaniu zbudowanego pakietu z firmwarem, możemy go załadować wydając poniższe polecenie:
# modem_run -v 1 -m -f /ścieżka/do/firmware |
Ładowanie firmware do modemu może trochę potrwać. Jeżeli chcesz widzieć co się dzieje wpisz następujące polecenie
# tail -f /var/log/messages |
W trakcie ładowania pliku firmware, zaczną migać diody urządzenia. Będzie to oznaczać synchronizację linii. Po kilkunastu sekundach modem się ustabilizuje. Diody powrócą do zielonego koloru.
Jeżeli masz zainstalowany kernel z serii 2.6 lub 2.4.22+ wykonaj poniższe polecenia:
# modprobe speedtch # modem_run -k -m -v 1 -f /usr/share/speedtouch/mgmt.o # modprobe pppoatm |
Moduł speedtch jest potrzebny do użycia opcji -k (może być ładowany automatycznie przez hotplug. Z kolei pppoatm będzie potrzebny do uruchomienia pppd. Nie ładuje się on automatycznie, dlatego należy go dopisać np. do /etc/modules.
W porządku. Po zakończonej operacji ładowania firmware jesteśmy gotowi aby skonfigurować nasze ppp do neostrady. Zanim to zrobimy będziemy musieli zainstalować pakiet ppp-plugin-pppoatm.
# poldek -U ppp-plugin-pppoatm |
W zależności od wersji zainstalowanego kernela (2.6 lub 2.4) konfiguracja demona pppd będzie się różniła kilkoma szczegółami. Poniżej przedstawiam przykłady dla obu serii jąder.
Linux z serii 2.4
# cat /etc/ppp/peers/neostrada debug lock noipdefault defaultroute pty "/usr/sbin/pppoa3 -v 1 -e 1 -c -m 1 -vpi 0 -vci 35" asyncmap 0 lcp-echo-interval 2 lcp-echo-failure 7 sync user "user@neostrada.pl" noauth holdoff 3 persist maxfail 25 mru 1500 mtu 1500 |
Linux z serii 2.6 lub 2.4.22+
# cat /etc/ppp/peers/neostrada noauth usepeerdns noipdefault defaultroute pty "/usr/sbin/pppoa3 -e 1 -v 1 -m 1 -c -vpi 0 -vci 35" sync user nasz_login noaccomp nopcomp noccp holdoff 4 persist maxfail 25 |
Ważną rolę odgrywa tu parametr -e 1
, gdyż bez niego nie uzyskamy
połączenia.
Oczywiście musimy jeszcze odpowiednio skonfigurować pap-secrets oraz chap-secrets
# cat /etc/ppp/chap-secrets user@neostrada.pl * haslo * |
W celu nawiązania połączenia, które uprzednio skonfigurowaliśmy, wydajemy takie oto polecenie
pppd call neostrada |
Jeżeli nie chcemy, bądź z jakichś powodów nie możemy korzystać z programu hotplug nie musimy tego robić. Nie jest on tak naprawdę niezbędny. W takim przypadku za każdym razem będziemy musieli ładować firmware modemu programem modem_run.
Coraz więcej dostawców usług internetowych oferuje dzierżawę linii xDSL z portem LAN typu Ethernet, takie usługi oferują np. Telekomunikacja Polska (Internet DSL) oraz Dialog (DIALNET DSL).
W celu uruchomienia usługi, wystarczy jedynie skonfigurować interfejs sieciowy Ethernet w naszym komputerze, zgodnie z informacjami uzyskanymi od dostawcy łącza (konfiguracja statyczna). Poniżej przedstawiono skrócony opis konfiguracji tego typu interfejsu, szczegółowy opis znajdziemy tutaj: sekcja Ethernet
Podniesienie interfejsu eth0 możemy osiągnąć tworząc lub edytując (jeśli istnieje) plik /etc/sysconfig/interfaces/ifcfg-eth0 i wpisując dane otrzymane od dostawcy:
DEVICE="eth0" IPADDR="80.55.203.222/30" ONBOOT="yes" BOOTPROTO="none" |
Istotną kwestią jest przypisanie odpowiedniego prefiksu (maski podsieci) przy podaniu adresu IP zarezerwowanego dla abonenta. Prefiks wykorzystywane w usłudze InternetDSL, to: /30 Internet DSL 512 oraz Internet DSL 1 (przydzielone 4 adresy IP, co odpowiada masce podsieci 255.255.255.252), /29 Internet DSL 2 (przydzielone 8 adresów IP, co odpowiada masce podsieci 255.255.255.248). Należy pamiętać że 3 adresy IP są zarezerwowane do obsługi połączenia (adres sieci,brama,broadcast)
Ostatnią zmianą potrzebną do prawidłowego działania sieci jest wyedytowanie pliku /etc/sysconfig/network. Należy tam podać adres bramy (IP modemu DSL).
GATEWAY="80.55.203.221" GATEWAYDEV="eth0" |
Na koniec pozostaje nam uruchomienie podsystemu sieci:
# service network start |
Jeśli przy łączu Internet DSL 1 zdarzają się przypadki zerwania połączenia, należy przywiązać wszystkie 5 adresów IP jako wirtualne interfejsy
IPADDR1="ip1/29" IPADDR2="ip2/29" IPADDR3="ip3/29" IPADDR4="ip4/29" IPADDR5="ip5/29" |
HotPlug jest mechanizmem pozwalającym na automatyczne konfigurwanie systemu po podłączeniu określonego urządzenia. W przypadku urządzeń sieciowych PCMCIA i USB możliwe jest automatyczne aktywowanie interfejsu od razu po podłączeniu urządzenia.
Aby uruchomić ten mechanizm musimy najpierw zainstalować odpowiednie oprogramowanie:
# poldek -i hotplug* |
Kolejnym krokiem będzie umieszczenie odpowiedniego wpisu w pliku konfiguracji interfejsu sieciowego. Dodajemy opcję:
HOTPLUG=yes |
Narzędzia do zarządzania i diagnostyki interfejsów sieciowych opisano w sekcja Narzędzia sieciowe w rozdział Zastosowania sieciowe.
Zaawansowane opcje sieciowe interfejsów nie są umieszczane w plikach generowanych w trakcie instalacji systemu. Ich opis znajdziemy w pliku /usr/share/doc/rc-scripts/ifcfg-description.gz.
Wiele przykładowych konfiguracji interfejsów sieciowych odnajdziemy w katalogu z dokumentacją do rc-skryptów: /usr/share/doc/rc-scripts. Są to pliki tekstowe zarchiwizowane programem Gzip.
W tym rozdziale znajdziesz informacje dotyczące konfiguracji sieci
Podstawowe trasy do podsieci są automatycznie tworzone przy konfiguracji interfejsów sieciowych na podstawie podanego adresu IP i maski podsieci. Trasa domyślna jest konfigurowana na podstawie ustawień w pliku /etc/sysconfig/network. Operacje te zostały opisane w poprzednim rozdziale, w przypadku bardziej zaawansowanych zastosowań musimy samodzielnie skonfigurować trasy pakietów.
Konfigurację routingu obowiązkowo rozpoczynamy od włączenia przekazywania pakietów między interfejsami sieciowymi, opcję tą możemy ustawić tymczasowo wykonując polecenie
# echo "1" > /proc/sys/net/ipv4/ip_forward |
Możemy też w pliku /etc/sysctl.conf ustawić następująca opcję:
net.ipv4.ip_forward = 1 |
# service network restart |
Aby wyświetlić tablicę routingu posłużymy się poleceniem ip route:
# ip route 10.0.0.4/32 dev eth0 proto kernel scope link src 10.0.0.4 10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1 default via 10.0.0.100 dev eth0 onlink |
Zarządzenia routingiem na kilku przykładach:
Dodanie trasy do hosta
# ip route add 10.0.0.4/32 dev eth0 |
Dodanie trasy do podsieci
# ip route add 10.0.0.0/24 dev eth1 |
Wskazanie bramy domyślnej:
# ip route add 0/0 via 10.0.0.100 dev eth0 |
dodatkowe opcje:
src {$adres_IP} - adres źródłowy nowo tworzonych pakietów, opcja ma istotne znaczenie m.in. w przypadku przypisania kilku adresów IP do tego samego interfejsu.
protocol {$nazwa/$numer} - opcja ważna w przypadku łączenia trasowania statycznego z dynamicznym. Najczęściej stykamy się z protokołami: redirect, kernel, boot, ra. Ich pełną listę wraz z odpowiadającym im numerom znajdziemy w pliku /etc/iproute2/rt_protos. Dla samego statycznego routowania nie ma potrzeby jej definiowania.
Usuwanie regułek jest bardzo podobne do dodawania, musimy użyć opcji "del" zamiast "add".
Dodane przez nas regułki możemy zapisac na stałe, w ten sposób zostaną automatycznie wczytanie po "podniesieniu" podsystemu sieci. W tym celu modyfikujemy plik /etc/sysconfig/static-routes np.:
eth0 10.0.0.0/24 eth1 192.168.0.0/24 src 192.168.0.4 |
Jądro używa specjalnego cache do wydajniejszego trasowania pakietów, ma to jednak pewną wadę: zmiany w nim nie następują od razu po zmodyfikowaniu tablicy routingu. Aby wymusić natychmiastowe wyczyszczenie cache należy użyć poniższego polecenia:
# ip route flush cache |
NAT (Network Address Translation) w Linuksie można zrobić na dwa sposoby:
wykorzystując infrastrukturę netfilter jądra 2.4 i 2.6.
korzystając z narzędzi do kontrolowania sieci z pakietu iproute2.
Oryginalna dokumentacja Netfilter w języku angielskim
Najlepszym sposobem jest wykorzystanie możliwości netfilter, gdyż wykonuje on nat przed (PREROUTING) lub po (POSTROUTING) routingu, co daje nam możliwość tak skonfigurowania firewalla, jak by nie było wykonywane NAT. NAT w iptables tworzymy dodając regułki do tabeli "nat". Żeby sprawdzić jakie są dostępne "Chains" w tabeli nat, należy wykonać takie polecenie:
# iptables -t nat -L |
W poniższych przykładach założyliśmy, że 1.2.3.4 jest adresem IP podniesionym na interfejsie zewnętrznym ($if_wan) zaś 192.168.1.0/16 to adresy na interfejsie sieci lokalnej ($if_lan).
W PREROUTING są regułki do wykonania DNAT (Destination NAT). Zamienia to adres hosta docelowego na nasz prywatny, w ten sposób możemy przekierować ruch na dowolny host w sieci prywatnej:
# iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT --to 192.168.1.2 |
Można określić na jakim interfejsie będzie wykonany NAT poprzez opcję -i $inteface. Opcja -o w PREROUTING nie jest dostępna.
Możemy też dokonać przekierowania ruchu kierowanego na konkretny port, zwanego potocznie przekierowaniem portu:
# iptables -t nat -A PREROUTING -i $if_wan -p TCP -d 1.2.3.4 --dport 8000 -j DNAT --to 192.168.1.11:80 |
SNAT (Source NAT) zmienia to adres nadawcy np. z puli adresów prywatnych na adres z puli publicznej, co jest wykorzytywane zwykle do "dzielenia łącza".
# iptables -t nat -A POSTROUTING -s 192.168.1.2 -j SNAT --to 1.2.3.4 |
Jeśli podamy maskę podsieci, zostanie wykorzystana większa ilość adresów.
MASQUERADE wykonuje to samo co SNAT z tym, że na adres interfejsu jakim wychodzi pakiet. Używać go należy tylko kiedy nasz adres publiczny zmienia się. (np. w połączeniach ze zmiennym IP publicznym)
Po ustawieniu DNAT na adres wewnętrzny zauważymy, że jest problem z dostępem do ip 1.2.3.4 z wewnątrz sieci. Dzieje się tak dlatego, że adres source zostaje bez zmian, dlatego też pakiet nie wraca do bramy. Musimy więc zmusić, aby host wysyłał odpowiedź do bramy. Możemy wykonać to w następujący sposób:
# iptables -t nat -A POSTROUTING -o $if_lan -s 192.168.0.0/16 \ -d 1.2.3.4 -j SNAT --to 192.168.0.1 |
Gdzie $if_lan to interfejs lokalnej sieci, a 192.168.0.1 to adres na tym interfejsie.
Administratorzy sieci osiedlowych często natrafiają na problemy z programami p2p. Potrafią one skutecznie zapychać łącza. Jednym z możliwych rozwiązań jest zablokowanie takiego ruchu, a drugim opisanym w tym dokumencie, jest przekierowanie go na jedno z łącz - odciążając tym samym drugie.
Jednym z możliwych problemów może być "zatykanie" modemu, więc należy się dowiedzieć ile modem może obsłużyć aktywnych połączeń i ograniczyć wyjście przez iptables do tej wartości.
Ograniczenie można wykonać w ten sposób:
# iptables -t filter -A FORWARD -s 192.168.3.0/24 -o eth1 -p tcp -m mark \ --mark 0x0 -m connlimit --connlimit-above 300 --connlimit-mask 32 \ -j REJECT --reject-with tcp-reset |
Co powoduje ograniczenie użytkownikom do 300 wychodzących połączeń TCP. Wyeliminuje to problem, kiedy pakiety nie są w stanie wyjść w świat gdyż za dużo jest aktywnych połączeń i modem się zawiesza.
Drugim sposobem jest ograniczenie pasma wychodzącego w taki sposób, żeby router pilnował, aby na modemie nie było zbyt dużego ruchu sieciowego.
# tc qdisc del dev eth1 root # tc qdisc add dev eth1 root handle 1 cbq bandwidth 256Kbit \ avpkt 1000 cell 8 # tc class change dev eth1 root cbq weight 32bit allot 1514 # tc class add dev eth1 parent 1: classid 1:2 cbq bandwidth 256Kbit \ rate 216Kbit weight 27Kbit prio 1 allot 1514 cell 8 maxburst 20 \ avpkt 1000 bounded # tc qdisc add dev eth1 parent 1:2 handle 2 tbf rate 216Kbit \ buffer 10Kb/8 limit 15Kb mtu 1500 # tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 \ match ip src $ip_nat classid 1:2 |
Gdzie $ip_nat to adres ip serwera
Trzecim sposobem jest zakupienie drugiego, taniego łącza i puszczenie nim niechcianego ruchu np tak:
Cały niezidentyfikowany ruch przekierowywany jest na łącze dodatkowe, a zidentyfikowany na łącze drugie (szybsze).
Na początek ustawimy w tabeli mangle takie regułki, służąc do oznaczania odpowiednich pakietów:
// przywrócenie wartości mark dla nawiązanych już połączeń # iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark // jeśli się okaże, że jakieś p2p działa na portach preferowanych to // zaznaczy je i wtedy nie przepuści # iptables -t mangle -A PREROUTING -p tcp -m ipp2p --ipp2p \ -j MARK --set-mark 0x1214 # iptables -t mangle -A PREROUTING -p tcp -m ipp2p --ipp2p-data \ -j MARK --set-mark 0x1214 // zachowanie dla potomności # iptables -t mangle -A PREROUTING -p tcp -m mark --mark 0x1214 \ -j CONNMARK --save-mark // jeśli jakiś pakiet jest już oznaczony to wychodzi // z tabeli mangle i sprawdza kolejne regułki iptables # iptables -t mangle -A PREROUTING -m mark ! --mark 0x0 -j RETURN // znakuje uprzywilejowane servisy # iptables -t mangle -A PREROUTING -p icmp -s 192.168.0.0/16 \ -j MARK --set-mark 0x1 # iptables -t mangle -A PREROUTING -p udp -s 192.168.0.0/16 \ -j MARK --set-mark 0x1 // porty 1:1024 # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 1:1024 -j MARK --set-mark 0x1 // mysql # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 3306 -j MARK --set-mark 0x1 // gg # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 8074 -j MARK --set-mark 0x1 // cache # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 8080 -j MARK --set-mark 0x1 // gra americans army # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 1716:1718 -j MARK --set-mark 0x1 // irc # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 --dport 6665:6667 -j MARK --set-mark 0x1 // gra enemy terrytory # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 27960 -j MARK --set-mark 0x1 // gra MU Online # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 55201 -j MARK --set-mark 0x1 # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ --dport 44405 -j MARK --set-mark 0x1 // wszystkie porty dobrze znanych serwerów // www.wp.pl # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ -d 212.77.100.101 -j MARK --set-mark 0x1 // czat.wp.pl # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ -d 212.77.100.113 -j MARK --set-mark 0x1 // www.onet.pl # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ -d 213.180.130.200 -j MARK --set-mark 0x1 //strona z grami Online www.miniclip.com # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ -d 69.0.241.20 -j MARK --set-mark 0x1 // www.kurnik.pl # iptables -t mangle -A PREROUTING -p tcp -s 192.168.0.0/16 \ -d 217.17.45.25 -j MARK --set-mark 0x1 // no i jeszcze zachować dla potomności # iptables -t mangle -A PREROUTING -p tcp -m mark --mark 0x1 \ -j CONNMARK --save-mark |
Jeśli już mamy oznaczone pakiety należy je odpowiednio przekierować. Możemy skorzystać z dobrodziejstwa iproute2 i dodać następujące regułki:
# ip route add from 192.168.0.0/16 fwmark 0x1214 lookup TABLE_SMIECI # ip route add from 192.168.0.0/16 fwmark 0x1 lookup TABLE_PRIORYTET // ta regułka kieruje cały nieoznakowany ruch na łącze śmieci // potrzebne jeśli domyślne jest inne łącze # ip route add from 192.168.0.0/18 lookup TABLE_SMIECI |
Oczywiście trzeba dodać do tabeli odpowiednie wpisy default i informacje o sieciach obsługiwanych przez ten router. Należy jeszcze wykonać te polecenia dla interfejsu z wyjściem w świat:
# echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter |
Po takich zabiegach użytkownicy powinni odczuć znaczny wzrost wydajności łącza PRIORYTET
Niestety łącze SMIECI jest maksymalnie zapchane, więc należy przygotować się na narzekania użytkowników którzy są przekierowani na to łącze.
Przy takim rozwiązaniu należy mieć stałą kontrolę nad usługami, które mają działać na łączu PRIORYTET i stale uaktualniać tabelę mangle o odpowiednie wpisy.
Nie udało się niestety przekierować samego ruchu p2p gdyż podczas nawiązywania połączenia nie wiemy jeszcze czy jest to pakiet należący do p2p. Dzisiejsze programy p2p potrafią działać na portach poniżej 1024 np 80 (http) więc rozróżnienie ich po portach nic nie da
Innym rozwiązaniem może być wydzielenie portów dla programów p2p i ogłoszenie ich użytkownikom sieci. Należy wtedy zablokować ruch p2p na wszystkie porty oprócz tych wydzielonych i jeśli ktoś się nie dostosuje to nie będzie miał transferu. To rozwiązanie ma jednak wadę: będzie generowało dużo połączeń nawiązywanych (pakiety SYN) na obu łączach, gdyż iptables nie pozwoli na transfer dopiero po nawiązaniu połączenia i rozpoznaniu połączania jako należącego do p2p.
Zaletą tego rodzaju tunelu jest to, że jego działanie opiera się na jednych z bardziej popularnych protokołach PPP oraz SSH. Komunikacja odbywa się na porcie 22. Dzięki temu nie zachodzi potrzeba otwierania dodatkowych portów komunikacyjnych w konfiguracji zapory ogniowej. Interfejsy tunelu uruchamiane są przez demona pppd. Posłużą nam one do zestawienia trasy między dwoma hostami lub sieciami w zależności od potrzeb. Do naszych celów będzie potrzebny demon pppd będący implementacją protokołu ppp oraz klient i serwer ssh implementujący protokół ssh.
Zanim przystąpimy do konfiguracji musimy zdecydować który komputer będzie serwerem a który klientem. Klient będzie inicjował połączenie z serwerem uruchamiając demona pppd.
Zanim przystąpimy do konfiguracji należy sprawdzić czy system wyposażony jest w demona ppp oraz serwer ssh. Pakiety które to udostępniają to odpowiednio ppp oraz openssh-server. Przydatnym może się okazać pakiet openssh-clients zawierający jak sama nazwa wskazuje klienta ssh.
Po zainstalowaniu wyżej wymienionych pakietów przechodzimy do konfiguracji systemu. W pierwszej kolejności zakładamy konto użytkownika oraz przydzielamy mu grupę.
# groupadd vpn-users # useradd -m -s /usr/sbin/pppd -g vpn-users vpn # passwd vpn New UNIX password: Retype new UNIX password: passwd: password updated successfully |
Efekt wykonanych poleceń możesz zobaczyć na listingu poniżej
# grep vpn /etc/passwd vpn:x:506:1005::/home/users/vpn:/usr/sbin/pppd #grep vpn-users /etc/group vpn-users:x:1005: |
Wynik tych poleceń powinien odpowiadać temu co tutaj widać. GID grupy vpn-users wynosi 1005 czyli odpowiada GID ustawionemu w pliku /etc/passwd. Poleceniem passwd ustawiamy hasło dla tego konta, które zostało wpisane do /etc/shadow.
Istotnym dla konfiguracji elementem w katalogu użytkownika vpn jest katalog ~/.ssh. Możemy go stworzyć (o ile wcześniej zainstalowaliśmy) przy pomocy klienta ssh. Robimy to w dwóch krokach które obrazuje poniższy przykład
# su - vpn -s /bin/bash $ ssh domena.pl Warning: Permanently added 'domena.pl,xxx.xxx.xx.x' \ (RSA) to the list of known hosts. Password: ^C |
Można też ręcznie utworzyć z poziomu konta vpn ten katalog poleceniem mkdir. Aby umożliwić użytkownikowi prawo do wykonania po zalogowaniu polecenia /usr/sbin/pppd należy nadać temu plikowi suida.
# chmod 4755 /usr/sbin/pppd |
Konfigurację warstwy ssh mamy już za sobą. Możemy teraz przystąpić do konfiguracji demona pppd. Demon
nie będzie wymagał autoryzacji, więc w pliku /etc/ppp/options wyszukujemy opcję
auth
i zmieniamy ją na noauth
. Musimy teraz skonfigurować wierzchołek
(tzw. peer) końca tunelu. Tworzymy więc plik /etc/ppp/peers/tunel określający
wszystkie niezbędne parametry połączenia. Na listingu poniżej przykładowa konfiguracja
wierzchołka.
# cat /etc/ppp/peers/tunel 192.168.1.100:192.168.1.101 noauth lcp-echo-interval 5 lcp-echo-failure 3 |
W pierwszej linijce oddzielone są dwukropkiem adresy IP wierzchołków tunelu. Ten po lewej stronie zostanie ustawiony na interfejsie serwera, ten po prawej klienta. Przedstawioną konfigurację należy potraktować jako przykład i dostosować ją do rzeczywistej. Oczywiście, jeżeli spełnia ona Twoje wymagania możesz ją zastosować.
noauth
- wyłączamy autoryzację ppp
lcp-echo-interval
- wartość przy tej opcji określa interwał w sekundach
z jakim wysyłana będzie do peera ramka żądania o echo LCP. Demon sprawdza w ten sposób
czy połączenie nadal jest aktywne.
lcp-echo-failure
- wartość podana przy tej opcji określa ile żądań o
echo LCP ma zostać wysłanych jeżeli peer nie dał odpowiedzi. Po tylu próbach demon
stwierdzi, że połączenie zostało utracone.
Konfiguracja po stronie klienta sprowadza się do wygenerowania kluczy rsa oraz odpowieniego ustawienia demona pppd. Klucze nam są potrzebne do autentykacji nie interaktywnej ssh. Inaczej nie uda nam się nawiązać połączenia z serwerem. Do zestawienia połączenia z serwerem po stronie klienta wymagana jest instalacja pakietów ppp oraz openssh-clients. Jeżeli ich nie posiadasz musisz je niezwłocznie zainstalować.
Przystępujemy do dalszej konfiguracji usługi po stronie klienta. Zaczniemy od wspomnianego na wstępie generowania kluczy.
$ ssh-keygen -b 1024 -f ~/.ssh/klucz -t rsa -P "" Generating public/private rsa key pair. Your identification has been saved in /home/users/foo/.ssh/klucz. Your public key has been saved in /home/users/foo/.ssh/klucz.pub. The key fingerprint is: c9:d8:17:bd:ba:82:a0:f0:47:7c:32:c2:e8:7e:32:e8 foo@pldmachine |
Do generowania kluczy służy znajdujące się w pakiecie openssh-clients polecenie ssh-keygen. Użyliśmy go z następującymi parametrami:
-b
- długość klucza w bitach. Wartość
podana na listingu jest minimalną długością klucza
która jest akceptowana przez demona
sshd.
-f
- nazwa pliku (można podać ścieżkę
do niego) zawierającego klucz prywatny.
-t
- typ klucza. Na listingu jest to
RSA. RSA jest algorytmem służącym do generowania
kluczy.
-P
- hasło klucza. Na potrzeby tunelu
hasło musi pozostać puste. Inaczej tunel nie zadziała.
Demon sshd będzie czekał na potwierdzenie hasłem
klucza co nigdy nie nastąpi, gdyż sesja ssh będzie
inicjowana poprzez demona pppd uniemożliwiając nam w
sposób interaktywny jej przejęcie.
Kolejnym krokiem jest skopiowanie zawartości pliku klucz.pub do pliku ~vpn/.ssh/authorized_keys na serwerze. Możemy tego dokonać w następujący sposób.
$ scp ~/.ssh/klucz.pub vpn@domena.pl:~/.ssh/authorized_keys |
Polecenie to zadziała tylko wtedy, kiedy na koncie vpn znajdującym się na serwerze zmienimy tymczasowo powłokę z /usr/sbin/pppd na standardową /bin/bash. Na tym etapie kończy się cała konfiguracja dotycząca ssh po obu stronach. Możemy więc przywrócić na serwerze w pliku /etc/passwd dla użytkownika vpn powłokę na /usr/sbin/pppd. Przystępujemy teraz do skonfigurowania demona pppd, który będzie wywoływał podczas ustanawiania połączenia klienta ssh.
Podobnie jak po stronie serwera w pliku
/etc/ppp/options musimy opcję
auth
zmienić na noauth
. Kiedy już
to zrobimy, przystąpimy do konfiguracji wierzchołka (tzw. peera) dla
klienta, który będzie inicjował połączenie. Nazwa pliku może być taka
sama jak na serwerze. Poniżej na listingu znajduje się przykładowa
konfiguracja wierzchołka dla klienta.
# cat /etc/ppp/peers/tunel 192.168.1.101:192.168.1.100 debug noauth pty "ssh -i ~/.ssh/klucz vpn@domena.pl" connect-delay 5000 |
Pierwsza linijka w pliku to dwa adresy IP oddzielone znakiem dwukropka. Adres po lewej stronie jest adresem tego końca tunelu, który właśnie konfigurujemy. Pamiętamy, że adres 192.168.1.100 został już przydzielony jako adres wierzchołka serwera. Pozostałe opcje zostały objaśnione poniżej.
debug
- włączamy raportowanie szczegółów połączenia ppp.
noauth
- wyłączamy autoryzację.
pty
- dzięki tej opcji możemy wykorzystać zewnętrzny skrypt
jako ośrodek komunikacji zamiast konkretnego urządzenia terminalowego.
Wykorzystujemy tutaj ssh.
connect-delay
- określony w milisekundach czas oczekiwanie na
prawidłowy pakiet PPP od peera. Jeżeli taki w tym czasie nadejdzie pppd
rozpocznie negocjację wysyłając pierwszy pakiet LCP.
W przypadku problemów z połączeniem możemy zwiększyć wartość connect-delay
nawet dziesięciokrotnie jeżeli łącza pomiędzy którymi zestawiamy tunel będą sporo
obciążone. Również po stronie klienta musimy nadać bit suid plikowi
/usr/sbin/pppd.
# chmod 4755 /usr/sbin/pppd |
Na tym kończymy konfigurację tunelu. Możemy przejść do fazy jego uruchomienia.
Skonfigurowane połączenie należy teraz zainicjować wykonując polecenie:
$ /usr/sbin/pppd call tunel |
Udana próba połączenia połączenia powinna zaowocować zapisami w logach takimi jak poniżej na listingu.
Sep 2 12:35:34 pldmachine pppd[6623]: pppd 2.4.2b3 started by foo, uid 501 Sep 2 12:35:34 pldmachine pppd[6623]: Using interface ppp0 Sep 2 12:35:34 pldmachine pppd[6623]: Connect: ppp0 <--> /dev/pts/0 Sep 2 12:35:37 pldmachine pppd[6623]: Deflate (15) compression enabled Sep 2 12:35:37 pldmachine pppd[6623]: Cannot determine ethernet \ address for proxy ARP Sep 2 12:35:37 pldmachine pppd[6623]: local IP address 192.168.1.101 Sep 2 12:35:37 pldmachine pppd[6623]: remote IP address 192.168.1.100 |
Wykonując po obu stronach polecenie ifconfig zauważysz, że utworzone zostały interfejsy ppp służące do komunikacji. Wykorzystamy je do zestawienia prostej trasy pomiędzy dwoma sieciami.
Zakładając, że jedna sieć po stronie serwera ma adresację 192.168.0.0/24 a po stronie klienta 192.168.2.0/24 routing będzie wyglądał w sposób następujący.
Po stronie serwera:
# route add -net 192.168.2.0/24 gw 192.168.1.100 |
Po stronie klienta:
# route add -net 192.168.0.0/24 gw 192.168.1.101 |
W ten sposób oba komputery będą przechowywały w swoich tablicach routingu informacje o sieciach połączonych dzięki interfejsom tunelu.
VTun umożliwia tworzenie tuneli poprzez sieci TCP/IP wraz z przydzielaniem pasma, kompresją, szyfrowaniem danych w tunelach. Wspierane typy tuneli to: PPP, IP, Ethernet i większość pozostałych protokołów szeregowych. VTun jest łatwy i elastyczny w konfiguracji. Może zostać wykorzystany do takich sieciowych zastosowań jak VPN, Mobil IP, łącza o określonym paśmie oraz innych. Działa w warstwie user space.
Opis procesu konfiguracji tunelu podzielony został na część klient oraz serwer. Adresacja użyta na listingach może zostać użyta o ile nie będzie się ona kłóciła z bieżącą konfiguracją Twojej sieci. Zaczynamy od instalacji pakietu vtun na obu maszynach będących końcami tunelu. Dodatkowo ładujemy moduł tun do pamięci.
# modprobe tun |
Na tym kończy się wstępne przygotowanie systemu do konfiguracji tunelu.
Po zainstalowaniu pakietu, opcja VTUND_MODE
w pliku
/etc/sysconfig/vtun powinna
być ustawiona tak jak na listingu poniżej
# grep VTUND_MODE /etc/sysconfig/vtun VTUND_MODE="server" |
Plikiem konfiguracyjnym dla VTuna jest /etc/vtund.conf. Po instalacji pakietu jest on wypełniony przykładami konfiguracji różnego rodzaju tuneli po obu stronach (klient - serwer). Warto je sobie zostawić. W tym celu wystarczy jedynie zmienić nazwę pliku.
# mv /etc/vtund.conf /etc/vtund.conf.orig |
Przy użyciu ulubionego edytora stwórzmy nowy plik
/etc/vtund.conf. Możemy w nim wyodrębnić kilka
sekcji: options
, default
,
nazwa
, up
oraz
down
. Sekcje up oraz down są podsekcjami sekcji
nazwa.
options
- opcje dotyczące działania demona oraz
wykorzystywanych przez niego programów.
options { port 5000; syslog daemon; ppp /usr/sbin/pppd; ifconfig /sbin/ifconfig; route /sbin/route; firewall /sbin/iptables; ip /sbin/ip; } |
port
- port na którym ma nasłuchiwać demon.
syslog
- sposób logowania zdarzeń na interfejsie tunelu.
ppp ifconfig route firewall ip
- zmienne, które zawierają
ścieżki do wykorzystywanych przez VTun programów.
default
- domyślne ustawienia transmisji danych.
default { compress yes; speed 0; } |
compress
- kompresja pakietów w trakcie transmisji.
speed
- prędkość transmisji. Wartość 0
oznacza brak ograniczeń.
vpn1
- wymieniona wcześniej nazwa
tunelu. W tym miejscu
znajduje się właściwa konfiguracja parametrów połączenia.
vpn1 { passwd tajne.haslo; type tun; proto tcp; compress zlib:9; encrypt yes; keepalive yes; up { ... }; down { ... }; } |
passwd
- hasło, które posłuży do szyfrowania połączenia.
type
- typ tunelu (w przykładzie tunel IP)
proto
- protokół warstwy transmisyjnej tunelu.
compress
- metoda oraz stopień kompresji.
encrypt
- włączenie szyfrowania transmisji.
keepalive
- utrzymywanie połączenia
up, down
- co ma się wykonać po nawiązaniu połączenia oraz
jego zakończeniu. Szerzej o tym poniżej.
up
- akcje wykonywane po nawiązaniu połączenia.
up { ifconfig "%% 192.168.2.10 pointopoint 192.168.2.11 mtu 1450"; route "add -host 192.168.2.11 gw 192.168.2.10"; }; |
Po nawiązaniu połączenia należy uruchomić odpowiedni interfejs. Jego nazwa zostanie rozwiązana dzięki zmiennej %%. Określamy oczywiście typ interfejsu oraz jego MTU. Kolejną czynnością jest podanie trasy do drugiego końca tunelu. Adres IP po prawej stronie jest oczywiście adresem naszego (czyli serwera) końca i przez niego prowadzi droga na drugą stronę.
down
- czynności następujące po wyłączeniu tunelu.
down { ifconfig "%% down"; ifconfig "%% delete"; route "delete -host 192.168.2.11" }; |
Po zakończeniu działania połączenia powinniśmy wyłączyć oraz skasować interfejs który nam do
niego służył. Usuwamy również zbędną trasę do drugiego końca tunelu z tablicy routingu. Zwróć
uwagę na konstrukcję tych dwóch podsekcji. polecenie "argument"
. Polecenie
zostało określone w sekcji options
, natomiast argumentami są odpowiednie
parametry danego polecenia.
Na tym kończy się konfiguracja serwera. Możemy przystąpić teraz do konfiguracji klienta.
Konfigurację klienta zaczniemy od edycji pliku /etc/sysconfig/vtun. Opcje w nim zawarte powinieneś ustawić zgodnie z tym co jest przedstawione na listingu.
VTUND_MODE="client" VTUND_SESSION="vpn1" VTUND_SERVER_ADDR="123.45.67.89" VTUND_SERVER_PORT="5000" |
VTUND_MODE
- tryb pracy demona.
VTUND_SESSION
- nazwa sesji, którą ustawimy w pliku
konfiguracyjnym
VTUND_SERVER_ADDR
- publiczny adres IP serwera.
VTUND_SERVER_PORT
- port na którym nasłuchuje serwer.
Również po stronie klienta musimy wyedytować plik /etc/vtund.conf. Także i tutaj możemy mu zmienić nazwę na vtund.conf.orig, aby zachować przykłady konfiguracji. Krok po kroku omówię sekcje vtund.conf po stronie klienta.
options { type stand; port 5000; syslog daemon; timeout 60; ppp /usr/sbin/pppd; ifconfig /sbin/ifconfig; route /sbin/route; firewall /sbin/iptables; ip /sbin/ip; } |
type
- tryb pracy VTuna. Na listingu ustawiony został
standalone
.
port
- port na którym nasłuchuje VTun.
syslog
- logi VTuna zbierane będą przez syslog.
timeout
- timeout VTuna.
ppp, ifconfig, route, firewall, ip
- ścieżki do programów
wykorzystywanych w czasie konfiguracji.
Przystępujemy teraz do konfiguracji połączenia o nazwie vpn1. Jak pamiętasz nazwa została już wstępnie określona w pliku /etc/sysconfig/vtun.
vpn1 { passwd tajne.haslo; type tun; proto tcp; compress zlib:9; encrypt yes; keepalive yes; stat yes; persist yes; up { ... }; down { ... }; } |
passwd
- hasło które posłuży nam do szyfrowania
połączenia.
type
- typ tunelu, w przykładzie jest to tunel IP.
proto
- protokół warstwy transmisyjnej tunelu.
compress
- typ oraz stopień kompresji. Na listingu ustawiona
została kompresja przy użyciu zlib dziewiątego stopnia.
encrypt
- włączamy szyfrowanie połączenia.
keepalive
- utrzymywanie połączenia w przypadku braku
ruchu na interfejsie tunelu.
stat
- statystyki pracy tunelu, które VTun będzie zapisywał
do sysloga co pięć minut.
persist
- opcja ustawiona tak jak na listingu sprawi, że w przypadku
zerwania połączenia z serwerem klient będzie nawiązywał połączenie.
up, down
- programy wykonywane po nawiązaniu połączenia i po jego
zerwaniu.
up { ifconfig "%% 192.168.2.11 pointopoint 192.168.2.10 mtu 1450"; route "add -host 192.168.2.10 gw 192.168.2.11"; }; |
Poleceniem ifconfig uruchamiamy interfejs naszego tunelu o parametrach
takich jakie zostały podane w przykładzie. Następnym krokiem jest wyznaczenie trasy do naszego
serwera, czyli drugiego końca tunelu. Jak doskonale widać, ta część konfiguracji jest
analogiczna do serwera. Należy tylko zwrócić uwagę na adresację. Adres następujący po
parametrze gw
określa nasz (czyli klienta) koniec tunelu. Przez niego wiedzie
droga na drugi koniec.
down { ifconfig "%% down"; ifconfig "%% delete"; route "del -host 192.168.2.10"; }; |
Polecenia które się wykonają po zamknięciu połączenia. Kolejno, wyłączamy oraz kasujemy interfejs tunelu. Następnie kasujemy z tablicy routingu trasę do serwera.
Na tym kończy się etap konfiguracji VTuna. Możemy przejść do jego uruchomienia.
Uruchomienie VTuna sprowadza się do wykonania jednego polecenia na serwerze oraz kliencie.
# /etc/rc.d/init.d/vtund start |
Po jego wykonaniu na komputerach będących końcami tunelu za kilka chwil powinny się utworzyć interfejsy tun0. Numeracja zaczyna się od "0". Nazwy kolejnych interfejsów będą kończyć się następną w kolejności liczbą naturalną.
W PLD głównym pakietem narzędzi sieciowych jest iproute2, oferuje on większe możliwości oraz bardziej ujednolicony interfejs obsługi w stosunku do narzędzi z pakietu net-tools (ifconfig, route, arp, ifup, ifdown). Sercem pakietu iproute2 jest program ip zawierający funkcjonalność kilku starszych narzędzi w jednym. Z tego względu będzie naszym podstawowym narzędziem sieciowym.
Jako dodatek do niniejszego rozdziału, pragnę polecić lekturę opisu najprostszych narzędzi sieciowych (ping, traceroute), który można znaleźć w sekcja Podstawowe narzędzia kontroli sieci TCP/IP w rozdział Podstawy oraz opis zarządzania routingiem statycznym zamieszczony w sekcja Routing statyczny.
Aby wyświetlić konfigurację interfejsów użyjemy polecenia ip addr.
# ip addr 1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:50:8d:e1:e8:83 brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.22/24 brd 10.0.0.255 scope global secondary eth0 inet6 fe80::250:8dff:fee1:e883/64 scope link valid_lft forever preferred_lft forever 3: sit0: <NOARP> mtu 1480 qdisc noop link/sit 0.0.0.0 brd 0.0.0.0 |
Polecenie wyświetliło listę dostępnych interfejsów, każdy z nich oznaczony jest numerem porządkowym. W większości wypadków najbardziej interesujące są dla nas interfejsy fizyczne (eth0 na powyższym przykładzie). Interfejsy lo oraz sit0, są "wirtualnymi" interfejsami, pierwszy z nich to interfejs pętli zwrotnej (loopback), drugi służy do tunelowania protokołu IPv6 wewnątrz IPv4.
Tryb pracy urządzenia jest wyświetlany wewnątrz trójkątnych nawiasów, oto kilka oznaczeń:
UP - urządzenie działa
LOOPBACK - interfejs pętli zwrotnej
BROADCAST - urządzenie ma możliwość wysyłania komunikatów rozgłoszeniowych
MULTICAST - interfejs może być używany do transmisji typu multicast
PROMISC - tryb nasłuchiwania, używany przez monitory sieci i sniffery
NO-CARRIER - brak nośnej, komunikat spotykany zwykle w wypadku braku fizycznego połączenia z siecią
Poniżej omawianego wiersza wyświetlone zostały informacje o adresach związanych z urządzeniem (adresy IP i maski podsieci są przedstawione w notacji CIDR):
-link/ether - adres fizyczny karty sieciowej (MAC)
-inet - dane protokołu IPv4
-inet6 - dane protokołu IPv6
Do najczęstszych operacji tego typu należy włączanie i wyłączanie interfejsów, w tym celu użyjemy następującego polecenia:
ip link set {$interfejs} {up/down}
# ip link set eth0 up # ip link set eth0 down |
Dodawanie/usuwanie adresów IP interfejsu:
ip addr {add/del} {$adresIP}/{$maska} dev {$interfejs}
# ip addr add 10.1.1.1/24 dev eth0 # ip addr del 10.1.1.1/24 dev eth0 |
Do odczytania adresu sprzętowego lokalnych kart sieciowych możemy użyć opisanego wcześniej polecenia ip addr. Aby odczytać MAC zdalnej maszyny użyjemy programu arping {$nazwa/$IP} np.:
# arping 10.0.0.100 ARPING 10.0.0.100 from 10.0.0.1 eth0 Unicast reply from 10.0.0.100 [00:04:ED:07:25:F8] 4.250ms Unicast reply from 10.0.0.100 [00:04:ED:07:25:F8] 0.976ms Unicast reply from 10.0.0.100 [00:04:ED:07:25:F8] 0.929ms |
Dowolny adres MAC karty sieciowej ustawimy poleceniem:
ip link set {$interfejs} address {$MAC-adres}
# ip link set eth0 address 01:01:01:01:01:01 |
Aby adres sprzętowy za każdym razem był ustawiany dla interfejsu, powinniśmy dokonać odpowiedniego wpisu w pliku konfiguracyjnym interfejsu. W przypadku urządzenia eth0 musimy zmodyfikować plik /etc/sysconfig/interfaces/ifcfg-eth0, i dodać zmienną MACADDR np.:
MACADDR="01:01:01:01:01:01" |
Aby wyświetlić tablicę ARP należy użyć polecenia ip neighbour:
# ip neighbour 10.0.0.140 ether 00:E0:7D:A1:8B:E2 C eth0 10.0.0.2 ether 4C:00:10:54:19:50 C eth0 10.0.0.100 ether 00:04:ED:07:25:F8 C eth0 |
Tablica ARP wypełnia się w miarę komunikowania się z innymi hostami, aby wymusić zbadanie działania protokołu ARP wystarczy zainicjować komunikację. Możemy użyć do tego programu ping.
Możemy stworzyć własną, statyczną tablicę ARP, posłuży nam do tego plik /etc/sysconfig/static-arp w którym umieszczamy wpisy zawierające kolejno: interfejs, adres MAC, adres IP oraz status wpisu.
eth0 00:80:48:12:c2:3c 192.168.10.10 permanent eth0 00:c0:df:f9:4e:ac 10.0.0.7 permanent |
Do odpytywania serwerów DNS możemy użyć programu host z pakietu bind-utils. Pozwala na szybkie sprawdzenie poprawności konfiguracji domeny (strefy).
host {$nazwa/$IP} {$dns_nazwa/$dns_IP}
Pierwszy parametr to nazwa domeny lub IP maszyny, drugi parametr nie jest obowiązkowy - wskazuje na serwer nazw, który chcemy odpytać. Jeśli nie podamy drugiego parametru użyty zostanie serwer zdefiniowany w pliku /etc/resolv.conf.
Odpytanie serwera DNS o domenę, wpisanego do pliku /etc/resolv.conf
$ host pld-linux.org pld-linux.org has address 217.149.246.8 |
Odpytanie o adres IP (odwzorowanie odwrotne)
$ host 217.149.246.8 8.246.149.217.in-addr.arpa domain name pointer webmachine.pld-linux.org. |
Odpytanie dowolnego serwera DNS
$ host pld-linux.org ns4.pld-linux.org. Using domain server: Name: ns4.pld-linux.org. Address: 217.149.246.7#53 Aliases: pld-linux.org has address 217.149.246.8 |
Aby odczytać konkretny rekord domeny użyjemy parametru "-t". Dla przykładu spróbujemy określić rekord MX dla domeny pld-linux.org:
$ host -t mx pld-linux.org pld-linux.org mail is handled by 0 a.mx.pld-linux.org. |
W celu poznania szczegółów zarejestrowanej domeny (np. obsługujące ją serwery nazw) możemy posłużyć się programem whois:
$ whois pld-linux.org |
Aby sprawdzić przepustowość sieci pomiędzy dwoma hostami możemy użyć programu iperf. Jest to program typu klient-serwer sprawdzający na kilka sposobów przepustowość połączenia. Rozpoczynamy od instalacji programu na obu interesujących nas maszynach, następnie na jednej z maszyn uruchamiamy program w trybie serwera:
$ iperf -s |
$ iperf -c 192.168.0.5 |
Po chwili odczytujemy wyniki testu.
Nawiązane połączenia i otwarte porty protokołu TCP/IP możemy kontrolować za pomocą programu netstat np.:
# netstat -tua Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:blackjack *:* LISTEN tcp 0 0 *:ircs *:* LISTEN tcp 0 0 *:netbios-ssn *:* LISTEN tcp 0 0 *:ipp *:* LISTEN tcp 0 0 *:microsoft-ds *:* LISTEN tcp 0 0 gargamel:ircs 192.168.1.3:rapidmq-reg ESTABLISHED tcp 0 0 gargamel:imaps 192.168.1.6:ttc-etap-ds ESTABLISHED tcp 0 0 gargamel:td-postman host-92.gadugadu.p:8074 ESTABLISHED tcp 0 0 gargamel:cma chrome.pl:5223 ESTABLISHED tcp 0 0 *:1024 *:* LISTEN udp 0 0 gargamel:netbios-ns *:* udp 0 0 *:netbios-ns *:* udp 0 0 *:ipp *:* |
Na powyższym przykładzie zostały wyświetlone dane dotyczące protokołu TCP (opcja: -t) oraz UDP (-u). Dodatkowo zostały wyświetlone gniazda nasłuchujące (-a). Warte uwagi są jeszcze dwa parametry: -n i -p, pierwszy wyświetla porty i adresy w postaci liczb, drugi zaś wyświetla nazwy programów korzystających z danych gniazd.
Do analizowania wielkości ruchu sieciowego na interfejsie polecam program nload, jest to proste narzędzie rysujące wykresy pomocą znaków ASCII. Podstawowe statystyki możemy przeglądać dzięki programowi ip np. ip -s link, dokładniejsze dane otrzymamy dzięki programowi iptraf.
Wygodnym sposobem śledzenia wybranego ruchu sieciowego jest użycie regułek linuksowego filtra pakietów. Do śledzenia ruchu służy cel "-j LOG" np.:
# iptables -A INPUT -p TCP --dport 80 -s 10.0.0.3 -j LOG |
Dużo bardziej szczegółowe informacje o ruchu sieciowym otrzymamy dzięki programowi tcpdump, jest to rozbudowany sniffer i program do analizy pakietów.
W przypadku modyfikacji plików konfiguracji w większości wypadków trzeba dokonać restartu podsystemu sieci.
W tym rozdziale opisano niewielki fragment możliwości dostępnych narzędzi sieciowych. Poniższa lista przedstawia miejsca gdzie można znaleźć szerszy opis niektórych zagadnień.
NET-3-HOWTO z http://www.jtz.org.pl/
Zaawansowany routing: http://echelon.pl/pubs/NET4.pdf
Dokumentacja iproute2 http://www.policyrouting.org/iproute2-toc.html
W rozdziale tym przedstawimy opis instalacji i konfiguracji ważniejszych usług dostępnych w PLD
Usługi w PLD są przygotowane do natychmiastowego uruchomienia, wystarczy wyedytować pliki konfiguracji i można korzystać z programu. Zanim jednak zaczniemy pracować z usługami warto zapoznać się z opisem zarządzania usługami zawartym w sekcja Zarządzanie podsystemami i usługami w rozdział Administracja.
Z wieloma demonami dostarczane są przykładowe pliki konfiguracji, którymi możemy się sugerować przy konfigurowaniu aplikacji, przykłady te są umieszczane w dokumentacji programu, w katalogu /usr/share/doc. Ponadto, zanim uruchomimy usługę, powinniśmy przyjrzeć się konfiguracji startowej demona, która umieszczana jest w pliku konfiguracji rc-skryptu - plik ten przychodzi wraz z pakietem i umieszczany jest w katalogu /etc/sysconfig. Zwykle zamieszczone w nim opcje odpowiadają argumentom programu demona, są też opcje określające np. priorytet programu i inne właściwości.
W trakcie uruchamiania usługi zdarzają się trudne do odnalezienia
problemy. Pierwszą rzeczą jaką powinniśmy w takim wypadku zrobić
to przeczesać logi programu, w takich wypadkach niejednokrotnie
pomaga włączenie większej "gadatliwości" demona. Wygodnym sposobem
szukania błędów jest uruchomienie demona na pierwszym planie
(bez przejścia w tło), w takich wypadkach często demony wysyłają
komunikaty na standardowe wyjście. W trudniejszych przypadkach
będziemy zmuszeni użycia programu strace
w celu śledzenia wywołań systemowych aplikacji. W wypadku
demonów powinniśmy użyć opcji -f
, aby śledzić
również procesy potomne lub uruchomić demona z wyłączonym
forkowaniem procesów. Opisane tu
czynności są specyficzne dla każdego z demonów, zatem musimy
skorzystać z dokumentacji właściwej aplikacji.
Aktualizacja niektórych demonów wiąże się z pewnymi czynnościami przygotowawczymi i poprawkami, problem ten dotyczy szczególnie silników baz danych. Zanim bezmyślnie zaktualizujemy pakiet, należy dokładnie zapoznać się z dokumentacją produktu, aby uchronić się przed unieruchomieniem usługi na dobre.
W PLD usługi, podobnie jak inne oprogramowanie, kompilowane jest z najczęściej używanymi opcjami, jeśli program nie obsługuje jakichś funkcji, to powinniśmy sprawdzić czy uzyskamy je samodzielnie budując pakiet, więcej na ten temat odnajdziemy w sekcja Budowanie pakietów w rozdział Zarządzanie pakietami.
Obecnie w Linuksie do obsługi dźwięku stosuje się system ALSA (ang: Advanced Linux Sound Architecture), będący następcą systemu OSS. ALSA to zestaw modułów jądra oraz kilku narzędzi pomocniczych, moduły możemy ładować za pomocą systemu UDEV lub statycznie, obydwie metody będą opisane w tym rozdziale. Druga z metod jest bardziej złożona, dlatego początkujących zachęcamy do korzystania z metody opartej o system UDEV.
Zaczynamy od pakietu zawierającego moduły kernela:
$ poldek -i kernel-sound-alsa |
$ poldek -i alsa-utils |
Niezaawansowanym zalecamy użycie udeva zamiast statycznej konfiguracji (opisanej dalej), ze względu na łatwiejszą konfigurację. Zakładam, że w systemie mamy działający UDEV, instalujemy pakiet z rc-skryptem, koniecznym do zapisywania stanu miksera (inicjacja miksera jest wykonywana bezpośrednio przez UDEV):
$ poldek -i alsa-udev |
# /etc/init.d/alsa-udev start |
Konfiguracja statyczna jest alternatywną metodą w stosunku do powyższej. Zaczynamy od zainstalowania pakietu alsa-utils-init:
$ poldek -i alsa-utils-init |
samodzielnie - za pomocą dowolnego edytora tekstu; wpisy możemy skopiować z opisu Driver & Docs, urządzenia odnalezionego na liście obsługiwanego sprzętu
za pomocą programu alsaconf, który wykryje urządzenie i dokona koniecznych wpisów
# /usr/sbin/alsaconf |
Po ukazaniu się ekranu z napisem "Searching sound cards" czekamy ok. 10 sekund i wciskamy ctrl-c (konfigurator szybko znajduje naszą właściwą kartę - a ponieważ szuka również kart starego typu oraz różnych egzotycznych, co zajmuje mu bardzo dużo czasu dlatego przerywamy wyszukiwanie). Następne okno pokazuje nam listę znalezionych kart muzycznych (zwykle jedną). Zatwierdzamy wyświetloną kartę i na pytanie:
Do you want to modify /etc/modprobe.conf? |
Odpowiadamy twierdząco, spowoduje to dopisanie odpowiednich aliasów modułów do pliku konfigurującego. Kiedy progam zakończy działanie, uruchamiamy rc-skrypt:
# /etc/init.d/alsasound start |
Domyślnie wszystkie "suwaki" miksera są ustawione na zero i dodatkowo włączone jest wyciszenie (mute), aby to zmienić musimy uruchomić program alsamixer lub amixer:
# /usr/bin/alsamixer |
# /usr/bin/aplay test.wav |
# /usr/bin/alsaplayer -o alsa test.mp3 |
To już praktycznie koniec instalacji. Pamiętać należy, że do niektórych programów należy doczytać odpowiednie wtyczki, które umożliwią prace z ALSA-ą. Wtyczki te łatwo rozpoznać po dopisce "alsa" w nazwie pakietu.
Na koniec pozostaje nam nadać uprawnienia wybranym użytkownikom, do obsługi dźwięku. Musimy zapisać użytkowników do grupy audio np.:
# usermod -A jkowalski audio |
W wielu przypadkach okazuje się, że posiadamy kartę muzyczną, która nie potrafi miksować dźwięku sprzętowo - co powoduje m.in., że jednocześnie może z karty korzystać jeden program lub proces. Zdarza się także, że niektóre programy na sztywno próbują połączyć się np. z OSS w celu obsługi dźwięku (np. Skype). W takim przypadku możemy skorzystać z wtyczki ALSA-y o nazwie dmix. Wbrew nazwie nie musimy niczego dogrywać - wszystko odbywa się w plikach tekstowych: /etc/asound (gdy chcemy ustawień globalnych) lub ~/.asoundrc (czyli indywidualnych ustawień dla każdego użytkownika). Przykładowy wpis przedstawimy poniżej - po więcej szczegółów odsyłamy na strony projektu ALSA (www.alsa-project.org):
# definiujemy urządzenie wirtualne nazwane przez nas demixer # do którego później będziemy się odwoływać: pcm.demixer { type dmix # typ urządzenia, tutaj "dmix" ipc_key 1024 # numer musi być unikalny slave { pcm "hw:0,0" # you cannot use a "plug" device here, darn. period_time 0 buffer_time 0 period_size 1024 # must be power of 2 and much smoother # than 1024/8192! buffer_size 8196 # must be power of 2 and for Audiophile # card (ICE1712 chip) or a VIA VT82xx # (snd-via82xx) must be less 6652 #format "S32_LE" periods 128 rate 44100 # with rate 44100 Hz you *will* hear, # if demixer is used } # bindings are cool. This says, that only the first # two channels are to be used by dmix, which is enough for # (most) oss apps and also lets multichannel chios work # much faster: # # Wskazujemy że tylko dwa pierwsze kanały bedą używane # przez demixer (czyli tutaj dmix) bindings { 0 0 # from 0 => to 0 1 1 # from 1 => to 1 } } # koniec konfiguracji wirtualnego urządzenia demixer # następnie ustawiamy przekierowanie z wybranych # urządzeń do wirtualnego urządzenia demixer: # możemy przekierowywać z następujących urządzeń OSS: # /dev/audio # /dev/dsp # /dev/dspW # /dev/midi # /dev/mixer # /dev/music # /dev/sequencer (recording doesn't work yet) # /dev/sequencer2 # dla /dev/dsp0 pcm.dsp0 { type plug slave.pcm "demixer" } # dla /dev/dsp pcm.dsp { type plug slave.pcm "demixer" } # Software mixing for all aplications # uses ALSA "default" device # # Wszystkie aplikacje korzystające z urządzenia # default ALSA-y przekierowujemy do miksera # czyli wszystko przechodzi przez dmix pcm.!default { type plug slave.pcm "demixer" } # OSS device /dev/mixer0 use hardware # Urządzenie OSS /dev/mixer0 bez zmian # obsługuje pierwszą (0) kartę audio bezpośrednio ctl.mixer0 { type hw card 0 } |
Jeśli chcemy jedynie przekierować dźwięk z programów obsługujących tylko OSS do ALSA, bez programowego miksowania (czyli bez używania dmix) wystarczy że wpiszemy tylko:
# from /dev/dsp0 to ALSA pcm.dsp0 { type plug slave.pcm "hw:0" } # lub: # pcm.dsp0 pcm.default # jeśli "default" nie było redefiniowane ctl.mixer0 { type hw card 0 } |
Natomiast najprostsze przekierowanie z /dev/dsp0 do dmix wygląda tak:
pcm.dsp0 { type plug slave.pcm "dmix" } |
Dla chipsetów nvidia nforce(2) (intel8x0) oraz C-media konfiguracja powinna wyglądać na przykład tak:
pcm.nforce-hw { type hw card 0 } pcm.!default { type plug slave.pcm "nforce" } pcm.nforce { type dmix ipc_key 1234 slave { pcm "hw:0,0" period_time 0 period_size 1024 buffer_size 4096 #rate 44100 rate 48000 } } ctl.nforce-hw { type hw card 0 } |
Następnie możemy przetestować nasz "dmix" czyli urządzenie demixer
alsaplayer -o alsa -d demixer test.mp3 |
ponieważ wcześniej zdefiniowaliśmy urządzenie "default", ALSA kieruje wszystko na urządzenie "demixer" - co jest równoważne:
alsaplayer -o alsa test.mp3 |
To tylko podstawowe przykłady działania jakie daje nam ALSA, a dzięki olbrzymim możliwościom definiowania dowolnych urządzeń wirtualnych i przekierowywania dźwięku, możemy uzyskać ciekawe i różnorodne efekty. Więcej o konfiguracji urządzeń PCM znajdziemy tutaj: www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html.
Przy pracy z pluginem "dmix" nie należy zapomnieć o wyłączeniu demonów ARTs i ESD gdyż w przeciwnym razie mogą pojawić się opóźnienie w odtwarzaniu dźwięków i zakłócenia w niektórych programach, gdyż wiele z nich próbuje najpierw korzystać z w/w demonów dźwięku.
Każdy, nawet początkujący użytkownik sieci internet zetknął się z apaczem świadomie lub nie. Apache jest oprogramowaniem, które można powiedzieć zdominowało w pewnym stopniu rynek aplikacji serwerowych. Do działania wykorzystuje on protokół HTTP (RFC2616). Jak sama nazwa wskazuje Apache (a patche server) składa się z wielu modułów. Można to zauważyć już na pierwszy rzut oka. W tym rozdziale zostanie opisana autoryzacja, obsługa języka PHP, CGI, virtualhosts oraz ogólna jego konfiguracja. Przedstawiona poniżej oparta została o apache z serii 2.x.
Apache w PLD jest podzielony na wiele małych pakietów, możemy dzięki instalować tylko potrzebne moduły. Jeśli nie możemy się połapać w tym gąszczu to możemy posłużyć się metapakietem apache, który za pośrednictwem mechanizmu zależności zainstaluje najważniejsze pakiety.
# poldek -i apache |
# service httpd start |
$ elinks localhost/test.html |
Tytułem wstępu pragnę powiedzieć, że niniejszy dokument nie może być traktowany jako dokumentacja do Apache. Ma on na celu ułatwienie użytkownikowi zapoznania się z usługą oraz kilkoma jej możliwościami. Po bardziej szczegółowe informacje odsyłam do stron podręcznika systemowego (man) oraz dokumentacji on-line
/etc/httpd/httpd.conf - w tym katalogu przechowywane są pliki konfiguracyjne demona. Po instalacji poszczególnych składników Apache, właśnie w tym miejscu należy szukać plików konfiguracyjnych od nich.
/home/services/httpd - pliki domyślnej strony Apache, katalog z komunikatami o błędach oraz katalog przeznaczony dla skryptów cgi.
/usr/lib/apache - moduły potrzebne do działania Apache oraz poszczególnych jego składników. Warto o tym pamiętać w przypadku problemów z uruchomieniem usługi.
/usr/sbin - jest to katalog należący stricte do Apache, jednak warto o nim wspomnieć ze względu na to iż przechowywane są w nim jego binaria. Aby się dowiedzieć które należą do niego wydaj następujące polecenie
# rpm -ql apache |grep ^\/usr\/sbin |
Aby nasz serwer obsługiwał dodatkowe funkcje musimy zainstalować odpowiednie moduły, wraz z modułami dostarczane, są pliki konfiguracji z dyrektywami konfiguracyjnymi dla tego modułu.
Apache domyślnie działa z uprawnieniami zwykłego użytkownika (http), dlatego trzeba zadbać o to by demon miał prawo do odczytu plików ze stronami WWW.
Bardzo pożyteczną cechą Apache jest możliwość tworzenia lokalnych plików konfiguracji, dzięki którym możemy modyfikować niektóre opcje konfiguracji. Pliki te mają nazwę .htaccess i może ich używać każdy, kto ma tylko dostęp do katalogu ze stroną WWW. Wygoda w ich używaniu polega na tym, że nie ma potrzeby restartowania demona po każdorazowej ich modyfikacji.
Głównym plikiem konfiguracyjnym jest /etc/httpd/apache.conf. Spośród wielu opcji w tym pliku zajmiemy się dwiema podstawowymi:
ServerAdmin root@example.net |
Powinieneś tutaj wpisać kontaktowy adres e-mail do siebie jako administratora tego serwera.
Poniżej znajduje się opcja ServerName
. Powinna ona
wyglądać tak jak w poniższym przykładzie.
ServerName example.net:80 |
Dosłownie jest to nazwa tego serwera. A dokładniej nazwa domenowa skonfigurowana na serwerze nazw opiekującym się Twoją domeną. Jeżeli nie posiadasz zarejestrowanej domeny, powinieneś wpisać tutaj adres IP.
Teraz zajmiemy się opcją DocumentRoot
, którą odnajdziemy w
/etc/httpd/conf.d/10_common.conf
Określa ona domyślny
katalog w którym będzie przechowywana strona internetowa. Wpisując
nazwę lub adres IP określony przez ServerName
właśnie
z tego katalogu zostaną pobrane i wczytane przez przeglądarkę pliki
strony.
DocumentRoot "/home/services/httpd/html" |
Domyślnie wszystkie żądania są tutaj skierowane. Ta lokalizacja nie jest obligatoryjna, więc nie musisz się jej trzymać. Może zostać zmieniona przy użyciu dowiązań symbolicznych lub aliasów wskazujących w inne miejsca.
Zgodnie z obecnym standardem tworzenia stron internetowych, domyślnym plikiem który jest automatycznie wczytywany po wpisaniu w przeglądarce adresu jest index, który w zależności od konstrukcji strony może mieć różne rozszerzenia. A więc skąd Apache wie, co ma zostać wczytane jako pierwsze? Do tego właśnie służy pakiet apache-mod_dir. Jego plikiem konfiguracyjnym jest /etc/httpd/httpd.conf/59_mod_dir.conf
Poprzez dyrektywę DirectoryIndex
określa się czego i w
jakiej kolejności ma szukać przeglądarka.
DirectoryIndex index.html index.html.var index.htm index.shtml \ index.cgi index.php |
Oczywiście możemy podawać tutaj różne nazwy plików startowych stron w zależności od naszych potrzeb.
Swobodne publikowanie stron internetowych przez użytkowników
jest możliwe dzięki pakietowi apache-mod_userdir.
Opcja UserDir
w pliku 16_mod_userdir.conf
definiuje nazwę katalogu przechowującego strony użytkowników wewnątrz
ich katalogów domowych.
UserDir public_html |
Aby strona się wyświetliła należy ustawić odpowiednie prawa dostępu - tak by Apache (domyślnie z prawami użytkownika http) miał prawo do odczytu. Katalog domowy jan powinien mieć ustawione prawa 711. Katalog przechowujący jego stronę czyli public_html powinien mieć 755. Każdy katalog zawierający elementy strony powinien mieć również uprawnienia 755. Pliki strony natomiast 644.
Mechanizm hostów wirtualnych pozwala obsługiwać strony o różnych adresach domenowych na jednej maszynie. Mechanizm ten jest realizowany na dwa sposoby: hosty oparte o adresy IP oraz oparte o nazwy, pierwsza z metod wymaga osobnego adresu IP dla każdego wirtualnego hosta, drugi zaś korzysta z jednego. Z oczywistych względów dużo bardziej popularna jest druga z metod i właśnie ją będziemy opisywać.
Obsługa hostów wirtualnych jest związana z odpowiednią konfiguracją domen w systemie DNS - wymaga wpisów typu IN A wskazujących na nasz serwer WWW. Konfigurację serwera DNS opisano w sekcja BIND - Serwer Nazw i będzie docelowo konieczna, jednak dla potrzeb testowych wystarczą nam wpisy w pliku /etc/hosts, który z kolei został opisany w sekcja Podstawowa konfiguracja sieci w rozdział Interfejsy sieciowe.
W naszym przykładzie dodamy obsługę domeny moja-strona.com, na początku należy stworzyć dodatkowy plik konfiguracji (dla porządku) o nazwie np. vhosts.conf, który umieścimy w katalogu /etc/httpd/httpd.conf/. Zakładamy, że wszystkie vhosty będziemy trzymać w katalogu /home/services/httpd/vhosts/. Plik będzie się zaczynał od następującego zestawu opcji:
NameVirtualHost * <Directory /home/services/httpd/vhosts> Order allow,deny Allow from all </Directory> <VirtualHost _default_> DocumentRoot /home/services/httpd/html/ </VirtualHost> |
<VirtualHost *> ServerName moja-strona.com DocumentRoot /home/services/httpd/vhosts/moja_strona </VirtualHost> |
Istnieje możliwość masowego konfigurowania vhostów, bez konieczności tworzenia wpisów dla każdego po kolei, służy do tego moduł vhost-alias dostarczany wraz z pakietem apache-mod_vhost_alias. Jego opis wykracza poza ramy tego rozdziału, więcej na jego temat odnajdziemy w dokumentacji serwera.
Czasami chcemy ograniczyć możliwość przeglądania stron dla konkretnych adresów lub klas adresowych. W tym celu użyjemy modułu apache-mod_authz_host, dzięki niemu będziemy mogli chronić przed dostępem do wskazanych katalogów. Jeżeli potrzebujesz chronić jedynie jeden lub kilka plików, stwórz w obrębie strony katalog o dowolnej nazwie i umieść je w nim. Oczywiście musisz pamiętać o przekonstruowaniu linków na stronie.
Do konfiguracji Apache dodajemy podobną konstrukcję konstrukcję:
<Directory "/home/users/jan/public_html/intra"> Order allow,deny Allow from 123.45.0.0/255.255.0.0 Allow from 56.67.9.34 </Directory> |
Dostęp do katalogu intra mają wszystkie komputery z
określonej w przykładzie sieci oraz jeden komputer (bądź urządzenie
udostępniające NAT) o wymienionym adresie. Wszystkie połączenia nie pasujące
do tych kryteriów traktowane są jako deny
, zgodnie z
porządkiem wyznaczonym przez dyrektywę Order
.
Apache udostępnia mechanizm autoryzacji, który używany jest do wyodrębnienia z serwisu pewnej części przeznaczonej dla upoważnionych użytkowników. Ograniczenie działa na poziomie katalogów i podobnie jak w ograniczeniu dla adresu (opisanego powyżej) nie można w ten sposób chronić poszczególnych plików.
Apache wspiera wiele rodzajów źródeł uwierzytelniających: pliki tekstowe, konta systemowe, bazy LDAP i inne. My będziemy zajmować się autoryzacją za pomocą plików tekstowych, ze względu na popularność i prostotę tego rozwiązania. Istnieją dwa protokoły przesyłania hasła Basic i Digest (w postaci skrótu). Metoda Digest jest bezpieczniejsza jednak praktycznie nie jest obsługiwana przez przeglądarki WWW, tak więc pozostaje nam używanie metody Basic.
Zaczynamy od instalacji metapakietu apache-mod_auth oraz pakietu htpasswd-apache. Teraz dodajemy do któregoś z plików konfiguracji regułkę chroniącą katalog :
<Directory "/home/users/jan/public_html/private"> AuthType Basic AuthBasicProvider file AuthName "Witaj Janie, zaloguj sie." AuthUserFile /home/services/httpd/.htpasswd Require valid-user </Directory> |
AuthUserFile
wskazuje plik z
loginami i hasłami użytkowników, jak widać ścieżka ta
jest inna niż chroniony katalog ze względów bezpieczeństwa.
Opcja Require
określa jacy użytkownicy
są akceptowani - tutaj każdy autoryzowany.
Teraz tworzymy plik z hasłami, poprzez dodanie pierwszego konta:
# htpasswd -c /home/services/httpd/.htpasswd jan New password: Re-type new password: Adding password for user jan |
# chmod 600 /home/services/httpd/.htpasswd # chown http.http /home/services/httpd/.htpasswd |
Po restarcie każde odwołanie do katalogu będzie wymagało podania loginu jan i hasła. Istnieje także możliwość dodania obsługi grup - mechanizmu zbliżonego działaniem do uniksowych grup systemowych.
W wielu wypadkach będziemy chcieli dać możliwość
użytkownikom tworzenia plików z hasłami z wraz z
plikami .htaccess w katalogu
określonym przez DocumentRoot
. Stanowi
to zagrożenie bezpieczeństwa, ze względu na możliwość
wyświetlenia zawartości tych plików. Możemy się
zabezpieczyć przed tym instalując pakiet
apache-mod_authz_host,
dzięki któremu m.in. nie zostaną wysłane do przeglądarki
pliki .ht*
Ze względu na dużą funkcjonalność język PHP stał się już w zasadzie pewnym standardem w tworzeniu interaktywnych stron internetowych. Współczesne serwisy wykorzystują m. in. bazy danych, dlatego zostanie również opisane jak taką obsługę zapewnić. Przeglądając listę dostępnych do zainstalowania pakietów z PHP na pierwszy rzut oka widać nacisk twórców dystrybucji jaki został nałożony na modularność. Daje to niesamowitą wolność w wyborze tego co jest Ci dokładnie potrzebne.
Zaczynamy od instalacji pakietu apache-mod_php, w ten sposób otrzymamy podstawową wersję PHP, dodatkowe pakiety instalujemy wtedy gdy potrzebna nam jest jakaś funkcjonalność. Najlepszą metodą sprawdzenia czy PHP działa jest użycie funkcji phpinfo(), aby z niej skorzystać stwórz plik z zawartością taką jak poniżej:
<? phpinfo(); ?> |
Obsługa różnego typu systemów bazodanowych rozbita jest na osobne pakiety zawierające definicje funkcji PHP które ją zapewniają. Poniżej w tabeli znajduje się lista która to odzwierciedla.
Tabela 1. Obsługa baz danych
Nazwa pakietu | Baza Danych |
---|---|
php-dba | Moduł dla PHP dodający obsługę dla baz danych opartych na plikach (DBA). |
php-dbase | Moduł PHP ze wsparciem dla DBase. |
php-filepro | Moduł PHP dodający możliwość dostępu (tylko do odczytu) do baz danych filePro. |
php-interbase | Moduł PHP umożliwiający dostęp do baz danych InterBase i Firebird. |
php-mssql | Moduł PHP dodający obsługę baz danych MS SQL poprzez bibliotekę FreeTDS. |
php-mysql | Moduł PHP umożliwiający dostęp do bazy danych MySQL. |
php-odbc | Moduł PHP ze wsparciem dla ODBC. |
php-pgsql | Moduł PHP umożliwiający dostęp do bazy danych PostgreSQL. |
php-sybase | Moduł PHP dodający obsługę baz danych Sybase oraz MS SQL poprzez bibliotekę SYBDB. |
php-sybase-ct | Moduł PHP dodający obsługę baz danych Sybase oraz MS SQL poprzez CT-lib. |
Aby skorzystać z którego kolwiek modułu wystarczy go po prostu zainstalować. Przeprowadzając instalację w trybie wsadowym pamiętaj o zrestartowaniu usługi apache, o czym zostaniesz przez poldka poinformowany. Dystrybucja nie posiada niestety pakietów do obsługi bazy danych Oracle. Jeżeli jest Ci ona potrzebna musisz zbudować PHP włączając obsługę oracla z serwera CVS, instalując uprzednio Oracla którego posiadasz.
Warto jeszcze wspomnieć o narzędziach wspomagających zarządzanie bazami danych. Do obsługi bazy MySQL służy pakiet phpMyAdmin natomiast do PostgreSQL zainstaluj phpPgAdmin. Szerzej o tych aplikacjach w dokumentacji do tych systemów.
Aby nasz Apache obsługiwał programy CGI wystarczy zainstalować pakiet apache-mod_cgi. Po przeładowaniu demona programy CGI obsługiwane będa w katalogu /home/services/httpd/cgi-bin, zgodnie z ustawieniami w pliku /etc/httpd/apache.conf.
Żeby przetestować CGI wystarczy że utworzymy plik o następującej treści:
#!/bin/sh echo "Content-type: text/html\n\n" echo "Hello, World." |
Jeśli zechcemy wskazać więcej katalogów w których pozwolimy uruchamiać
aplikacje CGI (np. dla hostów wirtualnych) wystarczy, że do któregoś
z plików konfiguracji dodamy odpowiednio skonfigurowaną opcję
ScriptAlias
np.:
ScriptAlias /cgi-bin/ "/home/users/jan/cgi-bin/" |
DocumentRoot
.
Mechanizm ten wykorzystuje się w serwisach wymagających od użytkownika autoryzacji. Najbardziej typowymi aplikacjami tego typu są różnego rodzaju klienci poczty. SSL zapewnia szyfrowany kanał dla informacji przepływającej od użytkownika do serwera. Dzięki temu niemożliwe jest podsłuchanie hasła. UWAGA! Jeden certyfikat SSL może zostać przypisany tylko dla jednego adresu IP.
Konfigurację zaczynamy od zainstalowania pakietu apache-mod_ssl. W wyniku instalacji utworzony zostanie plik /etc/httpd/httpd.conf/40_mod_ssl.conf. Zanim zaczniemy go konfigurować należy wygenerować certyfikaty. Służy do tego polecenie openssl. Program ten znajduje się w pakiecie openssl-tools.
# openssl genrsa -out /etc/httpd/ssl/apache.key 1024 |
W wyniku tego polecenia zostanie utworzony plik apache.key który posłuży do tworzenia certyfikatu. Robimy to w następujacy sposób.
# openssl req -new -x509 -days 365 -key /etc/httpd/ssl/apache.key \ -out /etc/httpd/ssl/apache.crt |
Proces tworzenia certyfikatu będzie wymagał podania kilku informacji. Zostaniesz o nie poproszony trakcie jego trwania.
Country Name (2 letter code) [AU]:PL State or Province Name (full name) [Some-State]:Województwo Locality Name (eg, city) []:Miasto Organization Name (eg, company) [Internet Widgits Pty Ltd]: Firma Organizational Unit Name (eg, section) []:Web Server Common Name (eg, YOUR name) []:example.net Email Address []:root@example.net |
Pola, które widzisz w powyższym przykładzie należy wypełnić
zgodnie z tym jak zostało to przedstawione. W przypadku
kiedy serwer jest prywatną własnością i nie należy do żadnej
firmy, w polu Organization Name
możesz
wpisać imię i nazwisko. Para plików: klucz oraz
certyfikat powinny mieć takie uprawnienia, aby użytkownik
http mógł je odczytywać.
Możemy teraz wyedytować plik
/etc/httpd/httpd.conf/40_mod_ssl.conf.
Pośród szeregu opcji interesuje nas w zasadzie tylko
konfiguracja katalogu, do którego połączenie będzie
szyfrowane oraz ścieżki do plików z kluczem oraz
certyfikatem. Musimy odnaleźć początek sekcji o nazwie
VirtualHost
.
<VirtualHost _default_:443> DocumentRoot "/home/services/httpd/html/webmail" ServerName mail.example.net:443 ServerAdmin root@example.net ErrorLog /var/log/httpd/error_log TransferLog /var/log/httpd/access_log |
Jak widać jej początek nie różni się niczym od konfiguracji VirtualHosts
.
Zwróć uwagę na opcję ServerName
. Powinna ona kończyć się ciągiem
:443 który oznacza port na którym ma nasłuchiwać demon. Przechodzimy
dalej i zmieniamy takie opcje jak SSLCertificateFile
oraz
SSLCertificateKeyFile
.
SSLCertificateFile /etc/httpd/ssl/apache.crt SSLCertificateKeyFile /etc/httpd/ssl/apache.key |
Podajemy tutaj ścieżki do plików które wygenerowaliśmy w poprzednim etapie.
Po zapisaniu i zakończeniu edycji pliku restartujemy Apache, aby nasze zmiany odniosły skutek. Aby nawiązać połączenie szyfrowane z webmailem należy w przeglądarce wpisać adres https://example.net/webmail. Aby ustanowić połączenie szyfrowane i za każdym razem nie wpisywać https://, powinieneś użyć mechanizmu vhosts. Stwórz katalog /home/services/httpd/html/mail dla którego zrobisz wpis w pliku 20_mod_vhost_alias.conf. Czyli zgodnie z tym czego już się dowiedziałeś, robisz wpis w pliku strefy domeny oraz konfigurujesz apache. Natomiast w katalogu /home/services/httpd/html/mail tworzysz plik o nazwie index.php z zawartością taką jak w przykładzie.
<?php /** * index.php -- Displays the main frameset * * Copyright (c) 1999-2002 The SquirrelMail Project Team * Licensed under the GNU GPL. For full terms see the file COPYING. * * Redirects to the login page. * * $Id: index.php,v 1.13 2002/02/19 15:05:03 philippe_mingo Exp $ */ header("Location: https://poczta.example.net\n\n"); exit(); ?> |
Oczywiście domena, która jest podana na listingu musi odnosić się do vhosta z opcją
DocumentRoot
ustawioną na
/home/services/httpd/html/mail.
Jest to bardzo przydatna funkcja, pozwalająca w łatwy sposób udostępnić zawartość katalogu na serwerze. Aby umożliwić indeksowanie musimy zainstalować moduł apache-mod_autoindex.
poldek -i apache-mod_autoindex |
Indexes
.
W domyślnej konfiguracji, Apache ma włączone indeksy
dla wszystkich podkatalogów wewnątrz /home/services/httpd/html
(w pliku 10_common.conf). Jeśli
ustawiliśmy inaczej to musimy włączać tą opcję dla
każdego z katalogów osobno np.:
<Directory /home/services/httpd/html/katalog> Options Indexes </Directory> |
DirectoryIndex
.
Po każdej zmianie konfiguracji w katalogu /etc/httpd/httpd.conf konieczne jest przeładowanie demona, aby na nowo odczytał swoje pliki konfiguracji. Możemy użyć w tym celu odpowiedniego wywołania rc-skryptu:
# service httpd restart |
# apachectl configtest Syntax OK |
Na szczególną uwagę zasługują parametry rc-skryptu: reload|force-reload|graceful np.:
# service httpd reload |
DNS jest systemem hierarchicznym. Na samym szczycie owej hierarchii stoją tzw. TLD (Top Level Domains), czyli domeny najwyższego rzędu. Zaliczają się do nich takie domeny jak .com (komercyjne), .pl (krajowe), .net (sieci) i inne. Są to domeny powstałe na podstawie odpowiednich postanowień, opisane w specjalnych dokumentach. Każda z wymienionych (lub też nie wymienionych) tutaj TLD's posiada swoje subdomeny, np. pld-linux.org. Z kolei każda powstała w wyniku rejestracji danej nazwy domena może mieć swoje poddomeny, np. www.pld-linux.org. W ten sposób można tworzyć bardzo zagęszczone hierarchie w obrębie danej domeny. Niniejszy rozdział dotyczy implementacji Bind określanego czasem jako named - jednego z najpopularniejszych serwerów DNS.
Każda domena (zwana również strefą) musi mieć co najmniej dwa serwery DNS, jest to wymóg registrarów, czyli instytucji oferujących możliwość rejestracji domen. Jeden z serwerów określa się jako podstawowy (również master lub primary) a drugi jako zapasowy (slave lub secondary).
Bind w PLD dziala w środowisku chroot, w katalogu /var/lib/named, musimy o tym pamiętać, przy niektórych operacjach diagnostycznych. Głównym plikiem konfiguracyjnym jest /etc/named.conf, który jest symlinkiem do /var/lib/named/etc/named.conf. Struktura katalogu /var/lib/named wygląda następująco:
dev/ etc/ M/ S/ named.pid root.hint |
Dodawanie stref DNS polega na definiowaniu obsługiwanych domen w pliku /etc/named.conf, oraz tworzenia plików konfiguracji stref.
Głównym plikiem konfiguracyjnym serwera Bind jest /etc/named.conf. Znajdują się w nim podstawowe opcje usługi oraz informacje na temat obsługiwanych stref. Poniżej zamieszczono domyślne wpisy, które znajdują się w tym pliku
options { directory "/"; pid-file "named.pid"; auth-nxdomain yes; datasize default; }; zone "localhost" IN { type master; file "M/localhost.zone"; allow-update { none; }; allow-transfer { any; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "M/127.0.0.zone"; allow-update { none; }; allow-transfer { any; }; }; zone "." IN { type hint; file "root.hint"; }; |
Na samym początku pliku konfiguracyjnego znajduje się sekcja options
.
Najbardziej istotną opcją jest tutaj directory
. Wskazuje ona na
główny katalog przechowywania plików stref. Być może zdziwi Cię nieco parametr
powyższej opcji. Jak już wcześniej wspominałem Bind w PLD posiada własne
chrootowane środowisko, dlatego można taki zapis zastosować.
Zanim przejdę do omawiania pozostałych wpisów, należy się jeszcze słowo wyjaśnienia na temat konstrukcji samego pliku. Na pierwszy rzut oka poszczególne wpisy są podzielone na sekcje. Te z kolei ograniczone są klamrami. Znak ; również pełni tutaj rolę ogranicznika dla poszczególnych opcji jak i całych sekcji ujętych w klamry. Warto o tym wiedzieć ze względu na ewentualne szukanie błędów powstałych na skutek edycji tego pliku.
Poniżej mamy zdefiniowane trzy sekcje stref zaczynających się słowem kluczowym
zone
. W powyższym przykładzie przedstawione są wpisy określające
localhosta. Są one typu master. Plik strefy w każdej z nich wskazany jest opcją
file
. Strefa nie musi być aktualizowana, ani synchronizowana z
serwerem slave, więc dwie pozostałe opcje mają parametr none
oraz
any
. Ostatnia strefa służy do komunikacji naszego binda z Root serwerami
o których była mowa we wstępie. Bez tej strefy nie mógłby on wyszukiwać nazw w internecie.
Mówiąc w przenośni byłby ślepy.
Każdorazowe odpytywanie Root Servers może się okazać mało
wydajne, ze względu na duże czasy odpowiedzi. Dlatego, jeżeli chcemy przyspieszyć ten proces
powinniśmy sekcję option
zmodyfikować o wpis taki jak poniżej
options { forwarders { 194.204.159.1; 194.204.152.34; }; } |
Oczywiście nie musimy posługiwać się takimi adresami jak w przykładzie. Możemy sobie wybrać takie serwery DNS, które będą nam odpowiadały najszybciej np. serwery naszego ISP.
W PLD zaleca się, aby wszystkie pliki stref w zależności od typu domeny były przechowywane w katalogach /var/lib/named/M oraz /var/lib/named/S. Tak naprawdę o ścieżce do tych katalogów decydują wpisy w named.conf. Struktura plików stref dla obu typów domen jest taka sama.
Zaczniemy od konfiguracji /etc/named.conf, budowa tego pliku była wyjaśniona w poprzedniej części tego rozdziału. Poniżej został zamieszczony przykładowy wpis dla strefy na serwerze podstawowym:
zone "example.net" { type master; file "M/example.net"; allow-transfer { 123.45.67.89; }; notify yes; }; |
Poszczególne opcje tej sekcji zostały omówione już na początku tego rozdziału. Podsumujmy więc dostępne informacje skupiając się na powyższym przykładzie:
zone "example.net"
- nazwa strefy
type master
- rodzaj serwera
file "M/example.net"
- nazwa pliku z konfiguracją strefy
allow-transfer { 123.45.67.89; }
- adres serwera,
który ma możliwość transferu całej strefy, Jeżeli posiadasz więcej
niż jeden taki DNS, możesz je wpisać pomiędzy klamry pamiętając o tym,
aby rozdzielić poszczególne adresy IP, znakiem
';'.
notify yes
- opcja ta włącza powiadamianie zapasowego
serwera DNS o zmianach w naszej domenie.
Musimy teraz utworzyć plik strefy dla domeny example.net
wskazany przez opcję file
. Poniżej zamieszczam treść przykładowego pliku strefy:
$TTL 86400 $ORIGIN example.net. @ IN SOA ns1.example.net. root.example.net. ( 2004022300 ;; serial 1200 ;; refresh 1200 ;; retry 2419200 ;; expire 86400 ;; TTL ) @ IN NS ns1.example.net. @ IN NS ns2.example.net. @ IN MX 10 mail.example.net. @ IN A 123.45.67.8 ns1 IN A 123.45.67.8 ns2 IN A 90.12.34.237 mail IN A 123.45.67.8 www IN A 34.5.6.78 ftp IN CNAME www |
Plik strefy można podzielić na trzy odrębne sekcje. Pierwsza określa nazwę domeny oraz okres ważności wpisów. Druga, kto tą domeną zarządza. W trzeciej znajduje się cała jej zawartość. Bardziej szczegółowy opis znajduje się w poniższym wykazie. Kilka zdań o wyrażeniach stosowanych w plikach stref. Warto o nich pamiętać. Wszystkie wpisy poprzedzone ;; będą ignorowane i traktowane jak komentarz. Kolejnym ważnym znakiem jest znak kropki. Jego znaczenie omówię poniżej w przykładzie.
@ IN NS ns1.example.net. |
Jeżeli w powyższym wpisie pominęlibyśmy końcowy znak kropki, wówczas Bind dokleiłby na końcu nazwę domeny. Wówczas z ns1.example.net zrobiłby się wpis ns1.example.net.example.net, co oczywiście nie jest pożądane. następnym znakiem specjalnym na który warto zwrócić uwagę jest @. Otóż można go potraktować jako pewnego rodzaju zmienną, która przechowuje nazwę example.net. Jednym słowem, example.net i @ to to samo.
$TTL 86400
- czas ważności rekordów
w domenie wyrażony w sekundach; 86400 s. to jedna doba
$ORIGIN example.net.
- domena jaką będzie opisywał
bieżący plik strefy.
@ IN SOA ns1.example.net. root.example.net.
-
Rekord typu SOA czyli Start Of Authority. Możemy się
z niego dowiedzieć, kto zarządza domeną
(root@example.net), jaki jest adres serwera primary
DNS. Zwróć uwagę, że w adresie root@example.net
zamiast znaku @ użyta została
kropka. Rekord SOA posiada swoją własną strukturę o
której poniżej. Zawarta jest ona pomiędzy znakami
( ).
2004022300 ;; serial
- numer seryjny domeny. Powinien
on być zwiększany wraz z każdą
jej modyfikacją. W dobrym tonie jest utrzymywanie go w
formacie YYYYMMDDnn czyli rok, miesiąc,
dzień oraz numer modyfikacji w danym dniu.
1200 ;; refresh
-
To pole rekordu SOA definiuje jak często serwery
slave mają sprawdzać czy dane o domenie
nie zmieniły się na masterze. Według
RFC 1035
wartość ta powinna się zawierać pomiędzy 1200 a 43200 (czyli
od dwudziestu minut do dwunastu godzin). W praktyce najlepsza
wartość zawiera się między 3600 a 7200 sekund.
1200 ;; retry
-
Czas po jakim secondary ma ponowić próbę
kontaktu z masterem, gdy taka się nie
powiedzie. Zalecana wartość pomiędzy 120 a 7200 sekund.
2419200 ;; expire
-
Ta wartość określa czas po jakim dane domeny mają zostać uznane
za nieaktualne gdy serwer secondary
nie będzie mógł się skontaktować z
primary. Zalecana wartość zawiera się
pomiędzy 1209600 a 2419200 sekund, czyli od dwóch do czterech
tygodni.
86400 ;; TTL
-
Time To Live. Określa ile czasu informacja o danym rekordzie
ma być ważna. Jest to okres przez jaki informacja o naszej
domenie będzie przechowywana przez serwer DNS, który ją
pobrał. Zalecana wartość zawiera się między 86400 a 432000
sekund, czyli przez okres od jednego do pięciu dni.
Bezpośrednio pod rekordem SOA definiujemy, które serwery DNS będą obsługiwały naszą domenę.
Jeszcze raz przypominam aby właściwie zamknąć ten rekord. Bez tego nasza domena nie będzie działać.
Do definiowania serwerów DNS służą wpisy typu IN NS
.
@ IN NS ns1.example.net. @ IN NS ns2.example.net. |
Powyższy wpis mówi, że domenę example.net obsługuje serwer DNS ns1.example.net oraz ns2.example.net. Jeżeli obie nazwy dotyczą komputerów, które wcześniej nie pełniły roli serwerów DNS, powienieś dodać wpisy takie jak poniżej.
ns1 IN A 123.45.67.8 ns2 IN A 90.12.34.237 |
ns1 oczywiście może wskazywać na adres serwera DNS który zapewne
konfigurujesz; ns2 powinien wskazywać na Twojego
secondary. Zrobiliśmy to posługując się wpisami typu
IN A
. Jak zapewne pamiętasz, brak końcowej kropki powoduje doklejenie
do wpisanej nazwy tego co znajduje się w zmiennej $ORIGIN
. Możemy więc
uznać to co widzisz w powyższym przykładzie za postać skróconą poniższego wpisu.
ns1.example.net. IN A 123.45.67.8 ns2.example.net. IN A 90.12.34.237 |
Wpisy typu IN A
służą do określania, że właśnie ten adres IP ma przypisaną
taką a nie inną nazwę. Oczywiście do jednego adresu IP możesz stworzyć kilka takich wpisów.
Jeżeli posiadasz serwer poczty, powinieneś zrobić wpis mówiący o tym, że będzie on obsługiwał
pocztę dla domeny example.net.
@ IN MX 10 mail.example.net |
Dokładnie tak jak wcześniej wspomniałem, poczta, dla domeny example.net
kierowana jest do serwera mail.example.net o priorytecie 10. Jest on
tzw. MX'em. Rekord typu IN MX
służy właśnie do definiowania w DNS serwera
poczty. Priorytet przydaje się wtedy, kiedy posiadasz kilka serwerów poczty w swojej domenie.
Służy on do ustalenia porządku; do którego serwera poczta ma trafić w pierwszej kolejności.
Mniejszy priorytet zapewnia pierwszeństwo.
Pozostałe wpisy dotyczą takich standardowych usług jak www czy ftp. Umieszczanie ich w pliku strefy nie jest obowiązkowe. Jednak domenę rejestruje się zazwyczaj na potrzeby www, ftp czy poczty, dlatego zostały one wymienione w przykładzie.
ftp IN CNAME www |
Powyżej umieszczono przykład rekordu typu IN CNAME
, tworzy on dodatkową subdomenę
dla hosta przypisanego już do innej nazwy. Specjaliści radzą by tego rodzaju rekordy
wskazywały wyłącznie na rekordy typu IN A
.
Po zakończeniu konfiguracji musimy jeszcze uruchomić usługę.
# /etc/rc.d/init.d/named start |
Konfiguracja serwera secondary sprowadza się do dokonania poniższego wpisu w pliku /etc/named.conf.
zone "example.net" IN { type slave; file "S/example.net"; masters { 123.45.67.8; }; }; |
Jak widać wpis wygląda podobnie jak w przypadku serwera primary. Opcja
type
tym razem ma wartość slave. Musimy też wskazać
serwer primary
. Robimy to używając opcji masters
, której
wartość zawiera adres serwera primary DNS.
Podobnie jak większość usług w dystrybucji BIND posiada wsparcie dla protokołu
IPv6 (IPng). Oczywiście wcześniej komputer musi być podłączony do tej sieci.
W tej części rozdziału zostanie omówiona konfiguracja dla stref
IN A
oraz strefy odwrotnej. Narzędziem wspomagającym
konfigurację będzie ipv6calc znajdujący się w pakiecie
o tej samej nazwie. Jak sama nazwa wskazuje jest to kalkulator adresów
IPv6.
IN AAAA
Odpowiednikiem w IPv6 strefy IN A
jest wpis
IN AAAA
. Każda z dotychczasowych stref stworzona do tej
pory dla protokołu IPv4 może mieć swój odpowiednik w sieci IPv6. Możemy
również stworzyć zupełnie nowe wpisy, które będą widoczne jedynie w tej
sieci.
moja IN AAAA 3ffe:1a:2b:3c::1 |
Umieszczenie powyższego wpisu w pliku strefy /var/lib/named/M/example.net spowoduje przypisanie nazwy moja.example.net adresowi 3ffe:1a:2b:3c::1. Aby wpis zaczął obowiązywać należy zrestartować usługę.
IN PTR
Konfigurację strefy odwrotnej zaczniemy od stworzenia odpowiedniego wpisu w pliku /etc/named.conf. Jak sama nazwa wskazuje będzie on przypominał lustrzane odbicie adresu w zwykłej postaci. Aby mieć pewność, że nasza strefa będzie poprawnie zapisana posłużymy się wspomnianym we wstępie narzędziem ipv6calc.
$ ipv6calc -r 3ffe:1a:2b:3c::/64 No input type specified, try autodetection...found type: ipv6addr c.3.0.0.b.2.0.0.a.1.0.0.e.f.f.3.ip6.int. |
Uzyskaliśmy w ten sposób informacje, że dla sieci o adresie 3ffe:1a:2b:3c::/64, strefa odwrotna posiada postać taką jak na powyższym listingu. Wystarczy teraz to zapisać w pliku konfiguracyjnym BIND'a.
zone "c.3.0.0.b.2.0.0.a.1.0.0.e.f.f.3.ip6.int" IN { type master; file "M/ipv6"; allow-transfer { 90.12.34.237; }; }; |
Jak widać na pierwszy rzut oka, konfiguracja niczym się praktycznie nie różni od konfiguracji
strefy dla IPv4. Jako nazwę strefy podaliśmy to co nam zwrócił ipv6calc.
Przyjrzyjmy się teraz jak powinien wyglądać plik dla tej strefy wskazany dyrektywą
file
.
$TTL 86400 $ORIGIN 0.1.0.0.e.2.0.0.c.0.0.4.e.f.f.3.ip6.int. |
Pierwszy parametr to omawiany już wcześniej okres ważności rekordów. Jak widać na listingu
wynosi on jeden dzień. Drugi z nich to de facto nazwa tej strefy. Sama opcja
$ORIGIN
to swojego rodzaju zmienna, której wartość jest podstawiana w
miejsce @ oraz doklejana do tych nazw które nie posiadają na końcu
specjalnego znaku kropki.
@ IN SOA ns1.example.net. root.example.net. ( 2004050600 3H 15M 1W 1D ) |
Jak widać rekord IN SOA
nie różni się niczym od
tego dla domeny IPv4.
@ IN NS ns1.example.net. @ IN NS ns2.example.net. |
Określamy które serwery przechowują naszą domenę odwrotną. Również tutaj wszystko wygląda identycznie jak dla protokołu IPv4. Możemy teraz przystąpić do konfigurowania strefy odwrotnej.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR moja.example.net. |
Dlaczego tyle zer? Odpowiedź na to znajdziesz obliczając przy użyciu programu
ipv6calc adres odwrotny dla 3ffe:1a:2b:3c::1.
Robimy to w sposób identyczny do poprzedniego przykładu jego użycia. W wyniku obliczeń
będzie on wyglądał tak:
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.3.0.0.b.2.0.0.a.1.0.0.e.f.f.3. Jak
łatwo zauważyć, po ostatnim zerze w listingu nie postawiliśmy kropki, a więc zostanie
doklejona po nim zawartość $ORIGIN
.
Narzędziem pomocnym w odpytywaniu serwerów DNS, jest program host. Można nim również odpytywać o nazwy skonfigurowane dla protokołu IPv6. Jak by wyglądało zapytanie o nazwę moja.example.net?
$ host -n -i 3ffe:1a:2b:3c::1 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.3.0.0.b.2.0.0.a.1.0.0.e.f.f.3.\ ip6.int domain name pointer moja.example.net |
Przełącznik -n
oznacza, że będziemy odpytywali strefę odwrotną, natomiast
-i
, że jest to adres typu int. Domyślnie
host szuka nazw typu arpa.
Zanim zarejestrujemy domenę musimy mieć skonfigurowany podstawowy i zapasowy serwer nazw. Mamy możliwość zarejestrowania własnej domeny, bądź skorzystać z usług darmowego oddelegowania nam subdomeny zarejestrowanej już domeny. Ceny rejestracji domen spadły w ostatnich latach tak bardzo, że używanie "obcej" domeny stało się mało profesjonalne i warto zarejestrować własną.
Jeżeli nie posiadasz serwera secondary, możesz poszukać firmy lub organizacji, która za darmo utrzymuje zapasowe DNS-y. Możemy też umówić się z administratorem innej firmy na wzajemne prowadzenie serwerów secondary.
Jeśli chcemy przetestować poprawność składni pliku strefy, powinniśmy skorzystać z narzędzia named-checkzone. Program sprawdzi poprawność pliku strefy i poda w której linii wystąpił błąd np.:
# /usr/sbin/named-checkzone example.net /var/lib/named/M/example.net |
Named generuje logi typu daemon, domyślnie syslogd umieszcza takie wpisy w pliku /var/log/daemon. Jeśli jednak nastąpił problem z uruchomieniem demona, uniemożliwiający mu pisanie do logów, to możemy sprawdzić co się dzieje uruchamiając go bez przejścia w tło i z wypisaniem komunikatów na standardowe wyjście:
/usr/sbin/named -g -t /var/lib/named |
Aby ostatecznie sprawdzić poprawność konfiguracji możemy odpytać nasz serwer za pomocą protokołu DNS. Użyjemy do tego programu host z pakietu bind-utils np.:
# /usr/sbin/host -t mx example.net |
Uwaga! Named nie powinien być resolwerem nazw dla maszyny na której pracuje, powinien nim być inny serwer DNS aby nie powstawały zapętlenia zapytań. Wyjątek stanowią usługi pracujące w osobnych środowiskach chroot/vserver. Więcej o konfiguracji resolwera nazw znajdziemy w sekcja Podstawowa konfiguracja sieci w rozdział Interfejsy sieciowe.
CRON jest ważnym demonem systemowym, którego zadaniem jest uruchamianie programów cyklicznie lub o określonej porze. Omówiona zostanie instalacja vixie-cron, który oprócz standardowych usług posiada dodatkowe opcje konfiguracyjne i zwiększone bezpieczeństwo
Program instalujemy za pomocą poldka:
# poldek -i vixie-cron |
# /etc/rc.d/init.d/crond start |
W cronie istnieje podział na zadania systemowe i zadania użytkowników. Pierwszych zwykle używa się do prac administracyjnych, z drugich korzystają użytkownicy wedle własnych potrzeb (o ile mają do tego prawo). Główna konfiguracja demona (systemowa) umieszczona jest w pliku /etc/cron.d/crontab, konfiguracje lokalne użytkowników przechowywane są w plikach /var/spool/cron/{$login}. O ile /etc/cron.d/crontab może być swobodnie modyfikowany za pomocą edytora tekstu, o tyle użytkownicy powinni używać w tym celu odpowiedniego narzędzia (opisanego w dalszej części).
Pliki konfiguracji crona nazywane są tabelami, zarówno główny plik konfiguracji jak i konfiguracje użytkowników mają bardzo podobną budowę. Są to pliki tekstowe o ściśle ustalonej składni, w których jeden wiersz odpowiada jednemu zadaniu. Wiersz tabeli systemowej ma następującą składnię:
{$data-czas} {$użytkownik} {$zadanie}
Nieco prostszą budowę mają tabele użytkowników:
{$data-czas} {$zadanie}
Pierwsze pole określa jak często wykonywane jest zadanie, pole {$użytkownik} występuje jedynie w konfiguracji globalnej (w /etc/cron.d/crontab) i wskazuje z jakimi prawami uruchamiane ma być zadanie. Trzecie pole to operacja która ma być wykonywana. W tabelach użytkowników nie podaje się nazwy użytkownika, gdyż polecenia tam zawarte są automatycznie wykonywane z prawami ich właściciela.
Przykładowe zadania w /etc/cron.d/crontab:
02 01 * * * root find /home -size +100M > /root/duze_pliki.txt |
30 * * * * backup.sh |
W tabelach oprócz zadań możemy definiować zmienne środowiskowe np.:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=jakis_user NICE=15 |
Sekcja {$użytkownik} i {$zadanie} nie wymagają komentarza więc opisane zostanie jedynie pole {$data-czas}. Pole to składa się z pięciu kolumn:
1-sza kolumna (zakres 0-59) oznacza minuty.
2-ga kolumna (zakres 0-23) oznacza godzinę.
3-cia kolumna (zakres 0-31) oznacza dzień miesiąca.
4-ta kolumna (zakres 0-12) oznacza miesiąc. (0 i 1 to styczeń)
5-ta kolumna (zakres 0-7) oznacza dzień tygodnia (0 i 7 to niedziela)
6-ta kolumna określa komendę jaka powinna zostać wykonana dla danego wiersza.
Gwiazdka "*" oznacza cały zakres z możliwego przedziału. Same zakresy w pierwszych pięciu kolumnach mogą być reprezentowane w różny sposób. Więcej szczegółów na ten temat dowiemy się wywołując polecenie man 5 crontab
Program vixie-cron posiada także mało udokumentowany format wykonywania poleceń
Nazwa Działanie ------ ------- @reboot Uruchom jeden raz przy starcie systemu @yearly Uruchom jeden raz w roku, "0 0 1 1 *" @annually To samo co @yearly @monthly Uruchom jeden raz w miesiącu, "0 0 1 * *" @weekly Uruchom jeden raz w tygodniu, "0 0 * * 0" @daily Uruchom jeden raz dziennie, "0 0 * * *" @midnight To samo co @daily @hourly Uruchom raz na godzinę, "0 * * * *" Przykład: @reboot /usr/bin/rdate -s ntp.task.gda.pl |
Główną konfigurację systemu tworzymy za pomocą naszego ulubionego edytora tekstu, poprzez modyfikację pliku /etc/cron.d/crontab. Jego zawartość będzie podobna do poniżej przedstawionego przykładu:
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=admin@foobar.foo NICE=15 # run-parts 01 * * * * root /bin/run-parts /etc/cron.hourly 02 1 * * * root /bin/run-parts /etc/cron.daily 02 2 * * 0 root /bin/run-parts /etc/cron.weekly 02 3 1 * * root /bin/run-parts /etc/cron.monthly 0-59/10 * * * * root /bin/run-parts /etc/cron.10min 15 18 * * 1-5 root /bin/run-parts /etc/cron.gielda |
Poniżej napisu # run-parts umieszczone są konfiguracje zadań, pierwsze cztery linijki stanowią domyślną konfigurację demona. Program run-parts służy do uruchamiania o jednej porze wszystkich programów we wskazanym katalogu. Dzięki takim opcjom możemy dodawać programy lub skrypty do odpowiednich katalogów bez konieczności pisania regułek cron-a. Poniżej umieszczono opisy powyższych przykładów:
Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.hourly codziennie, co godzinę - zaczynając od pełnej pierwszej minuty (np. 02:01, 03:01 itd.):
01 * * * * /bin/run-parts /etc/cron.hourly |
Wykonanie poleceń zawartch w pliku (plikach) katalogu /etc/cron.daily raz dzienie (o godz. 01:02):
02 1 * * * /bin/run-parts /etc/cron.daily |
Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.weekly raz w tygodniu (w niedziele o godz. 02:02):
02 2 * * 0 /bin/run-parts /etc/cron.weekly |
Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.monthly raz na miesiąc (w pierwszy dzień miesiąca o godz. 03:02):
02 3 1 * * /bin/run-parts /etc/cron.monthly |
Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.gielda raz dziennie w dni robocze (od poniedziałku do piątku o godz. 18:15):
15 18 * * 1-5 /bin/run-parts /etc/cron.gielda |
Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.10min co 10 minut (każdego dnia, zaczynając od pełnej godziny - czyli np. 01:00, 01:10, 01:20 itd.):
0-59/10 * * * * /bin/run-parts /etc/cron.10min |
Domyślnie użytkownicy nie mogą tworzyć własnych zadań cron-a, aby im na to zezwolić każdy nich musi zostać dopisany do pliku /etc/cron/cron.allow.
Użytkownicy powinni używać narzędzia crontab, program ten pozwala na bardzo łatwe zarządzanie tabelą użytkownika. Przyjmuje parametry określające rodzaj działania, które ma być wykonane na tabeli. Polecenie crontab -l wyświetla listę zdefiniowanych zadań, wywołanie crontab -e otworzy plik konfiguracji do edycji, zaś crontab -r usunie całą zawartość konfiguracji użytkownika.
Wybranie opcji edycji tabeli spowoduje otworzenie edytora tekstu określonego zmienną środowiskową EDITOR, po skończonej edycji plik zostanie automatycznie poddany kontroli poprawności i zapisany jako /var/spool/cron/{$login}. Najczęściej popełniane błędy przez użytkowników to zły format daty/czasu lub brak znaku nowej linii po ostatnim wierszu.
Root ma dodatkowo do dyspozycji możliwość zarządzania zadaniami dowolnego użytkownika, w tym celu stosuje się opcję -u z podaną nazwą użytkownika.
Cron rejestruje wszystkie swoje prace do pliku /var/log/cron za pośrednictwem demona syslogd, dodatkowo można wskazać adres e-mail, na który mają docierać informacje o wystąpieniu błędów w wykonywaniu zadań. Jeśli nie zdefiniuje zmiennej MAILTO w tabeli to poczta zostanie wysłana na lokalne konto właściciela tej tabeli. Poczta elektroniczna jest jedyną formą informowania zwykłych użytkowników o ewentualnych błędach zadań, gdyż nie mają oni dostępu do logów.
Wysyłanie poczty elektronicznej zarówno do użytkowników lokalnych jak i zewnętrznych będzie wymagało instalacji lokalnego serwera poczty MTA. Może to być niemal dowolny demon pocztowy, np.: Exim (opis w sekcja Exim - Transport poczty elektronicznej (MTA)) lub Postfix (opis w sekcja Postfix - Transport poczty elektronicznej (MTA)).
Aby łatwiej było analizować problemy, do wiadomości wysyłanej przez demon, dodawane są nagłówki X-Cron-Env, zawierające dane środowiska np.:
X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin> X-Cron-Env: <MAILTO=root> X-Cron-Env: <NICE=15> X-Cron-Env: <HOME=/root> X-Cron-Env: <LOGNAME=root> X-Cron-Env: <USER=root> |
CUPS jest nowoczesnym i uniwersalnym systemem druku dla systemów uniksowych. Może być stosowany zarówno do drukowania lokalnego jak i do drukowania w sieci - obsługuje domyślnie protokół IPP. Po poprawnym skonfigurowaniu urządzenia będziemy mogli drukować z niemal każdego programu, CUPS akceptuje wywołania poleceń drukowania w stylu klasycznego systemu LPD.
System CUPS może być zarówno serwerem jak i klientem, o tym jaką funkcję będzie pełnić zainstalowane "urządzenie" decyduje wybór specjalnego sterownika interfejsu: backendu(poza IPP) i konfiguracji.
Podstawowa część CUPS:
$ poldek -i cups cups-clients |
Następnie instalujemy jeden lub więcej kontrolerów interfejsów drukarki (protokół IPP nie wymaga backendu):
cups-backend-parallel - port równoległy (parallel port)
cups-backend-serial - port szeregowy RS-232 (serial port)
cups-backend-usb - port szeregowy USB (usb printer)
cups-backend-smb - drukowanie zdalne w sieci SMB
W przypadku drukarek nie obsługujących PostScriptu konieczne będą dodatkowe pakiety:
$ poldek -i cups-filter-pstoraster ghostscript-esp |
Do zdalnej administracji (za pomocą HTTPS), konieczny będzie program openssl:
$ poldek -i openssl-tools |
Czas uruchomić demona:
$ /etc/rc.d/init.d/cups start |
Operacje takie jak dodawanie, czy konfigurowanie drukarek mogą być dokonywane na kilka sposobów:
HTTP
Popularnym sposobem jest konfiguracja przy pomocy przeglądarki internetowej, CUPS posiada wbudowany niewielki serwer WWW, z którym łączymy się dowolną przeglądarką na adres serwera i port 631 np.:
$ lynx localhost:631 |
Z poziomu tej strony mamy dostęp do wielu opcji administracyjnych: konfiguracji drukarek, zarządzania klasami, zadaniami druku i innymi. Ten sposób zarządzania systemem CUPS w niniejszej publikacji jest traktowany jako domyślny.
lpadmin
lpadmin jest programem administracyjnym dostarczanym z CUPS-em, obsługiwany jest całkowicie z linii wiersza poleceń. Jest to narzędzie zaawansowane, przez co stosunkowo trudne w obsłudze, jego dokładny opis zawarto w dokumentacji.
Inne
Dla CUPS powstały wygodne programy zarządzające przeznaczone działające w środowiskach GNOME i KDE. Szczególnie pozytywnie przedstawia się system-config-printer - wygodna aplikacja, której układ opcji przypomina konfigurację przez WWW.
W tym rozdziale przedstawiono ogólny opis instalacji urządzenia, szczegółowe informacje umieszczono w rozdziałach: Szczegóły dodawania drukarki lokalnej i Szczegóły dodawania drukarki zdalnej.
Możemy użyć programu system-config-printer lub narzędzia dostępnego przez stronę WWW:
$ lynx localhost:631 |
Określamy nazwę drukarki oraz opcjonalnie komentarz i lokalizację, następnie wybieramy jeden z dostępnych na liście kontrolerów interfejsów drukarki (backend). Na koniec wybieramy producenta i model drukarki.
System CUPS jest dostarczany z niewielką ilością sterowników drukarek, jednak nie należy się jednak martwić jeśli na liście nie odnajdziemy szukanego urządzenia. Coraz więcej producentów dostarcza ze sprzętem pliki PPD (w CUPS są używane również dla drukarek niepostcriptowych), możemy także skorzystać z bazy Foomatic zawierającej ogromną liczbę sterowników.
Sterowniki Foomatic możemy zainstalować w postaci zbiorczego pakietu sterowników danego producenta. Przykładowo jeśli chcemy zainstalować sterowniki drukarek firmy Samsung to instalujemy pakiet cups-foomatic-db-Samsung. Możemy również pobrać pojedyncze pliki PPD z z witryny http://www.linuxprinting.org, po wyszukaniu modelu drukarki (Driver Listings) należy kliknąć link download PPD w celu pobrania sterownika. Plik wskazujemy przy dodawaniu drukarki lub kopiujemy go do katalogu /usr/share/cups/model i uruchamiamy na nowo demona cupsd:
# /etc/rc.d/init.d/cups restart |
Po tej operacji przeprowadzamy normalną instalację drukarki. Możemy ich wiele zainstalować, to do której będą trafiać dokumenty zależy od tego, którą z nich ustawimy jako domyślną.
Dodanie drukarki lokalnej dotyczy drukarek podłączonych bezpośrednio podłączonych do komputera, na którym zainstalowany jest CUPS, w tym wypadku interesują nas interfejsy: Parallel, Serial i USB. Zanim zaczniemy proces konfiguracji, musimy sie upewnić, że są załadowane odpowiednie moduły jądra (w przeciwnym wypadku dany backend może być nieaktywny).
Drukarka podłączona do portu równoległego będzie wymagała modułów lp, parport i parport_pc. Moduł lp dopisujemy do pliku /etc/modules, jeśli nie używamy udeva to pozostałe moduły także. Drukarki podłączane pod port LPT są dostępne za pomocą urządzeń /dev/lp*. W przypadku drukarek USB konieczny będzie moduł usblp oraz rzecz jasna moduł kontrolera USB, urządzenia te będą dostępne za pomocą /dev/usb/lp*. Więcej o modułach jądra i ich zarządzaniu odnajdziemy w sekcja Moduły jądra w rozdział Kernel i urządzenia.
CUPS od wersji 1.3 wymaga zdefiniowania opcji Group w pliku /etc/cups/cupsd.conf, która wskazuje jaki użytkownik ma być używany dla uruchamiania zewnętrznych programów - w tym backendów. Jako że urządzenia w katalogu /dev mają grupę ustawioną na lp, taką też podamy jako wartość parametru:
Group lp |
Dalszą instalację przeprowadzamy zgodnie z zaprezentowanym wcześniej opisem Dodanie drukarki.
IPP
Aby CUPS było klientem IPP musimy dodać drukarkę z backendem IPP oraz podać prawidłowy URI zasobu, jako producenta wybieramy Raw, zaś jako model Raw Queue. URI powinno mieć następującą postać:
ipp://{$serwer}/printers/{$drukarka}
($serwer to nazwa lub IP serwera druku, zaś $drukarka to nazwa drukarki). Adres taki może wyglądać następująco:
ipp://10.0.0.3/printers/laserowa |
SMB
Jedyne co musimy zrobić to dodać drukarkę z użyciem odpowiedniego backendu - Windows Printer via SAMBA i podać prawidłowy URI, na koniec musimy wskazać sterownik danej drukarki. W przypadku systemów MS z serii 95/98/Me URI powinno mieć następującą postać:
smb://{$serwer}/{$drukarka}
($serwer to nazwa lub IP serwera druku, zaś $drukarka to nazwa drukarki). Adres taki może wyglądać następująco:
smb://wodzu/laserowa |
W przypadku systemów z serii NT (NT4, 2000, XP Professional) może być konieczne podanie konta użytkownika i hasła:
smb://{$użytkownik}:{$hasło}@{$serwer}/{$drukarka}
np.:
smb://jasio:mojehasło@wodzu/laserowa |
Aby udostępnić w sieci zainstalowaną drukarkę, musimy odpowiednio skonfigurować demona cupsd, jego konfiguracja jest przechowywana w pliku /etc/cups/cupsd.conf.
Domyślnie CUPS pozwala jedynie na drukowanie lokalne, aby uzyskać dostęp z sieci musimy dokonać zmian w pliku konfiguracji. Należy odszukać sekcję oznaczoną znacznikami <Location /></Location>. Dostęp z innych maszyn konfigurujemy za pomocą opcji Allow From {$klient} ($klient to nazwa lub adres IP lub klasa adresów, którym udostępniamy drukarkę). Poniższy przykład przedstawia udostępnienie drukarek dla lokalnego interfejsu i maszyny o adresie 10.0.0.12.
<Location /> Order Deny,Allow Deny From All Allow From 127.0.0.1 Allow From 10.0.0.12 </Location> |
Jeśli chcemy mieć możliwość zdalnej administracji za pośrednictwem HTTP/HTTPS powinniśmy dodatkowo ustawić dostęp (zgodnie z powyższymi wskazówkami) dla sekcji: /admin, /admin/conf.
IPP
Protokół IPP jest używany domyślnie przez CUPS i nie wymaga żadnych dodatkowych przygotowań.
SMB
W systemie musi być zainstalowany i działający pakiet Samba. Aby systemy Microsoftu mogły "widzieć" drukarki CUPS należy dokonać modyfikacji w głównym pliku konfiguracji Samby - /etc/samba/smb.conf. Należy usunąć z niego wszystkie opcje dotyczące druku z sekcji [global], zaś w ich miejsce wstawić poniższe linijki:
printing = cups printcap name = cups |
Na koniec należy przygotować sekcję drukarek. Prosty przykład pliku konfiguracji pakietu Samba może wyglądać następująco:
[global] netbios name = shilka workgroup = pod_cisami security = share printing = cups printcap name = cups [printers] comment = Drukarki printable = yes path = /var/spool/samba |
Jako, że Windows pre-formatuje dokumenty zanim wyśle je przez sieć do drukarki, musimy nauczyć CUPS'a odpowiednio takie pre-formatowane dokumenty obsługiwać. W tym celu musimy wyedytować plik /etc/cups/mime.convs i odkomentować w nim linijkę
application/octet-stream application/vnd.cups-raw 0 - |
w pliku /etc/cups/mime.types zaś, należy odkomentować linijkę
application/octet-stream |
Po tych operacjach wymagany jest oczywiście restart usługi CUPS.
# /etc/rc.d/init.d/cups restart |
Przy tak skonfigurowanym serwerze drukarkę w MS Windows dodajemy standardowo, musimy jedynie samemu dostarczyć odpowiedni sterownik. Istnieje możliwość umieszczenia takiego sterownika na serwerze Samba, wymaga to jednak dodatkowych operacji konfiguracyjnych. Więcej na ten temat odnajdziemy w dokumentacji Samby.
Zarządzanie wydrukami jest możliwe z poziomu przeglądarki internetowej, programów dla X-Window oraz z poziomu linii wiersza poleceń. Z pośród tych ostatnich mamy do dyspozycji: lpstat, lpmove, cancel, lpq oraz lprm. Programy te znajdują się w pakiecie cups-clients.
Drukarka powinna działać od razu po zainstalowaniu, można to przetestować z poziomu panelu konfiguracji drukarki drukując stronę testową. W razie problemów pierwszą rzeczą jaką należy zrobić to przejrzeć plik rejestrowania błędów (log): /var/log/cups/error_log. Jeśli ciągle nie możemy odnaleźć źródła problemu możemy spróbować włączyć wysoki poziom raportowania błędów. Dokonujemy to przez edycję w pliku /etc/cups/cupsd.conf i przestawienie ustawienia opcji "LogLevel" z "info " na "debug" lub " debug2" np.:
LogLevel debug2 |
Kiedy rozwiążemy problem należy przywrócić poprzedni poziom raportowania ze względu na szybki przyrost objętości logów. Po każdej modyfikacji pliku konfiguracji należy przeładować demona:
# /etc/rc.d/init.d/cups restart |
DHCP to protokół pozwalający urządzeniom pracującym w sieci LAN na pobieranie ich konfiguracji IP (adresu, maski podsieci, adresu rozgłoszeniowego itp.) z serwera. Ułatwia on administrację dużych i średnich sieci.
Aby uruchomić serwer DHCP musimy oczywiście zainstalować go. Instalacja w PLD jest prosta:
# poldek -i dhcp |
Konfiguracja usługi przechowywana jest w pliku /etc/dhcpd.conf , z pakietem dostarczona jest przykładowa konfiguracja, pozwalająca uruchomić usługę po zmianie zaledwie kilku wartości. Przedstawiona poniżej sekcja zawiera parametry dla określonej podsieci. Dla większej jasności w poniższym przykładzie użyto skróconej wersji konfiguracji.
ddns-update-style ad-hoc; # Sekcja konfiguracji hostów z podsieci o podanym adresie i masce subnet 192.168.0.0 netmask 255.255.255.0 { # domyślna brama sieciowa option routers 192.168.0.1; # maska option subnet-mask 255.255.255.0; # nazwa domeny (FQDN) option domain-name "domain.org"; # adres serwera DNS (kolejne dodajemy po przecinku) option domain-name-servers 192.168.1.1; # zakres dzierżawionych adresów IP (z włączoną obsługą protokołu BOOTP) range dynamic-bootp 192.168.0.128 192.168.0.255; # domyślny czas dzierżawy (w sekundach) default-lease-time 21600; # maksymalny czas dzierżawy (w sekundach) max-lease-time 43200; } |
Wewnątrz przedstawionej sekcji (ograniczonej nawiasami klamrowymi) umieszczane są opcje jakie zwykle podajemy przy statycznej konfiguracji interfejsu sieci. Powyższa konfiguracja będzie przydzielać komputerom dynamiczne adresy IP z zakresu 192.168.0.128 - 192.168.0.255 na okres 21600 sekund, jednak nie większy niż 43200 sekund.
I to już prawie koniec, teraz zostaje nam sprawdzenie pliku /etc/sysconfig/dhcpd . Znajdujemy w nim linijki:
# The names of the network interfaces on which dhcpd should # listen for broadcasts (separated by space) DHCPD_INTERFACES="" |
W cudzysłów wpisujemy nazwy interfejsów na których będzie nasłuchiwał dhcpd (np. eth1). Po tej operacji wystarczy uruchomić lub zrestartować usługę.
Aby komputery mogły za każdym razem uzyskać taką samą konfigurację, musimy dla każdego z nich dodać odpowiednie wpisy w pliku konfiguracji. Konfiguracje hostów umieszczamy wewnątrz przedstawionej powyżej sekcji konfiguracji podsieci (uwaga na nawiasy klamrowe).
host nazwa_hosta { hardware ethernet 12:34:56:78:AB:CD; fixed-address 192.168.0.20; } |
Poszczególne komputery identyfikujemy za pomocą adresów sprzętowych kart sieciowych (MAC). Powyższy przykład wymusza przydzielenie adresu IP 192.168.0.20 maszynie o MAC-u 12:34:56:78:AB:CD. Adresy MAC odczytamy za pomocą programu ip, lub iconfig, szczegóły na ten temat odnajdziemy w sekcja Narzędzia sieciowe w rozdział Zastosowania sieciowe.
Poniżej zamieszczono przykłady innych nieco rzadziej używanych opcji.
Domena NIS:
option nis-domain "domain.org"; |
Opcje protokołu NetBIOS:
#Adres serwera WINS option netbios-name-servers 192.168.1.1; #Rodzaj węzła NetBIOS option netbios-node-type 2; |
Adres serwera czasu NTP:
option ntp-servers 192.168.1.1; |
Szczegółowy opis konfiguracji klienta DHCP umieszczono w sekcja Ethernet w rozdział Interfejsy sieciowe. Jeśli zechcemy sprawdzić poprawność konfiguracji przydzielonej hostowi to wystarczy użyć programu ip, lub iconfig, szczegóły odnajdziemy w sekcja Narzędzia sieciowe w rozdział Zastosowania sieciowe.
W większości wypadków najlepszym wyborem będzie przypisywanie niezmiennych adresów IP dla każdej z maszyn, pozwoli to zachować porządek i lepszą kontrolę nad siecią. Jest to absolutnie konieczne w wypadku serwerów oraz routerów, jednak przy tego typu maszynach zaleca się zrezygnowanie z DHCP na korzyść statycznej konfiguracji.
Domyślnie logi demona są rejestrowane przez syslog-a z ustawionym źródłem (facility) na "daemon". Tego rodzaju komunikaty zwykle są zapisywane do pliku /var/log/daemon , dlatego tam właśnie powinniśmy szukać informacji jeśli wystąpią jakieś problemy.
Usługa MTA (ang. message transfer agent) jest odpowiedzialna za przesył m.in. e-mail między serwerami. Najpopularniejszymi przedstawicielami tego typu usług są: Sendmail, Postfix czy opisany przez nas Exim. Oto zalety jakie przemawiają za wybraniem Exim-a jako naszego MTA:
Ponieważ Sendmail nie posiada nawet połowy jego funkcji
Autoryzacja w Exim-ie zaimplementowana jest domyślnie
Współpracuje z bazami MySQL i z Postgres-em, a także ze zwykłymi plikami tekstowymi
Tom Kistner napisał do Exim użyteczna łatkę, rozbudowywującą Exim o obsługę programów antywirusowych, demona SpamAssasin (skanera antyspamowego) oraz wykrywania błędów MIME - dzięki temu nie potrzebujemy wielkich i zasobożernych programów w perlu
Za to Tomasz Kojm napisał bardzo dobry program antywirusowy: Clam AntiVirus - darmowy, w dodatku rewelacyjnie współpracujący z Exiscanem
Podsumowując - Exim jest rewelacyjnym MTA. Jego możliwości konfiguracji pozwoliły mi na zbudowanie dosyć rozbudowanego serwera poczty obsługującego zarówno konta lokalne jak i konta zapisane w bazie danych MySQL. Dodatkowe możliwości to np. przeszukiwanie plików konfiguracyjnych serwera cvs w poszukiwaniu adresów docelowych dla aliasów w domenie cvs.rulez.pl. O rzeczach takich jak klasyfikowanie maili czy są spamem czy nie już nawet nie wspomnę. W dodatku Exim jest całkiem bezpiecznym MTA (wersja 4.x wg. securityfocus jak narazie dorobiła się jednego błędu - w końcu jakaś cena musi być za te wodotryski). Zresztą konstrukcja omawianego MTA na początku doprowadzała mnie do szału, gdyż Exim nie może sobie poradzić z smtp-auth via PAM z racji braku uruchamiania autoryzacji z własnego uid/gid zamiast root ;-)
Instalacja pakietu jest prosta. Uruchamiamy program: poldek i wykonujemy:
poldek -i exim |
Oczywiście zanim wykonamy zalecenie startu demona powinniśmy dokonać konfiguracji, którą opisuje następny rozdział.
Wszelkich zmian w konfiguracji dokonujemy w pliku /etc/mail/exim.conf. Na początek wyjaśnimy jak zorganizowany jest plik konfiguracyjny, wygląda to mniej więcej tak:
# główna sekcja ... opcje i dyrektywy sekcji głównej begin sekcja1 opcje i dyrektywy sekcji1 begin sekcja3 ... |
Tak więc plik ten jest zbudowany z sekcji, które rozpoczynają się słowem begin nazwa, z wyjątkiem sekcji głównej, która jest na samym początku pliku i nie posiada swojego begina. Sekcje również nie mają żadnych słów kluczowych, które by je zamykały - po prostu początek begin nowej sekcji oznacza zakończenie poprzedniej. I tak, standardowo mamy następujące sekcje:
główna - odpowiedzialna za podstawowe ustawienia Exim
acl - listy kontroli dostępu, filtrowania, odrzucania i akceptowania poczty
routers - hm, najprościej jest to przetłumaczyć jako routery, czyli reguły kierowania wiadomości do odpowiednich transporterów
transports - tutaj tworzymy sposoby doręczenia poczty
retry - ustawienia ponowień
rewrite - reguły do przepisywania nagłówków
authenticators - reguły do autoryzacji
Co to są te całe 'transportery' i 'routery'? Właściwie to serce Exima. Jeżeli Exim dostaje jakiegoś maila to najpierw puszcza go przez routery, które można porównać do reguł ipchains/iptables - jeżeli mail załapie się na jakąś regułę (router) to jest przekazywany do transportu określonego przez ten router. Inaczej mówiąc router w Eximie kieruje maila do odpowiedniego transportera. Transporter natomiast robi już z mailem co należy - doręcza go lokalnie, albo przekierowywuje gdzieś indziej albo odsyła do innego serwera. Wiem, że w tym momencie może wydawać się to skomplikowane, ale nie przejmujcie się, to tylko wiedza teoretyczna która na początku nie będzie wam potrzebna. Musiałem natomiast wam wytłumaczyć, że są sekcje i że musicie nauczyć się tego, iż jak napiszę 'dopisać w sekcji głównej' to należy coś dopisać na początku pliku.
Zanim zaczniemy konfigurację demona SMTP, musimy koniecznie dodać rekord MX do każdej strefy DNS obsługiwanej przez nasz serwer. Informacje na ten temat zawarto w sekcja BIND - Serwer Nazw.
Domeny lokalne to takie, które Exim ma traktować jako 'swoje' domeny. Mail zaadresowany @jakas.domena.lokalna który dotrze do Exim zostanie dostarczony lokalnie. Domeny takie definiuje w dyrektywie domainlist local_domains. Standardowo, przyjmowana jest poczta wysyłana do domeny identycznej jak hostname serwera:
domainlist local_domains = @ |
Znak @ oznacza właśnie 'moja nazwa'. Aby dopisać kolejne domeny wystarczy dodać je do tej listy rozdzielając je dwukropkami:
domainlist local_domains = @ : domena.pl : baseciq.org : \ /etc/mail/local_domains |
Poza domena.pl, baseciq.org, Exim będzie teraz także akceptował domeny wypisane w pliku /etc/mail/local_domains. Domeny tam należy wpisywać w oddzielnych linijkach. Exim o tyle fajnie działa, że po dopisaniu ścieżki do pliku, wystarczy go raz zrestartować. Jakiekolwiek kombinacje w /etc/mail/local_domains nie będą wymagały restartu. Tak więc najwygodniej będzie dopisać do pliku konfiguracyjnego:
domainlist local_domains = @ : /etc/mail/local_domains |
I po prostu powpisywać wszystkie domeny do /etc/mail/local_domains.
Domeny dla których mamy być zapasowym MX'em tworzy się bardzo łatwo. Linijkę pod domainlist local_domains jest domainlist relay_to_domain. Działa to w taki sam sposób jak konfiguracja domen lokalnych, czyli, piszemy:
domainlist relay_to_domains = /etc/mail/relay_to_domains |
Od teraz, Exim będzie akceptował każdą pocztę zaadresowaną do domen zawartych w pliku /etc/mail/relay_to_domains. A co z nią zrobi? Jak wiadomo, jeżeli domena ma kilka MX'ów, to Exim będzie starał się ją dostarczyć do serwera o najniższym priorytecie MX. Chyba że on ma najniższy, to wygeneruje błąd.
Relaying, czyli określenie kto może przez nasz serwer wysyłać pocztę. I tutaj, listę adresów i hostów buduje się w podobny sposób do local_domains i relay_to_domains. Wystarczy stworzyć listę o nazwie relay_from_hosts:
hostlist relay_from_hosts = 127.0.0.1 : 192.168.0.0/16 |
Uwaga! Już w tym momencie możemy sprawdzić działania serwera. Wystarczy że przeładujemy demona i wyślemy e-mail do istniejącego konta użytkownika. Przy takiej konfiguracji poczta będzie docierała do skrzynek typu mbox.
Exim potrafi umieszczać pocztę zarówno w skrzynkach typu mbox (pliki tekstowe w /var/mail/) jak i coraz popularniejszych skrzynkach typu Maildir (pliki przechowywanie w katalogu umieszczonym w katalogu domowym użytkownika). Ze względu na wsteczną zgodność Exim domyślnie używa tych pierwszych, aby używać Maildir-a wykonujemy następujące czynności:
W sekcji konfiguracji transporterów odszukujemy opcję "local_delivery", tam wstawiamy znak komentarza przed opcją "file =" i dodajemy linijki:
maildir_format = true directory=${home}/Mail/Maildir |
local_delivery: driver = appendfile # file = /var/mail/$local_part delivery_date_add envelope_to_add return_path_add group = mail mode = 0660 maildir_format = true directory=${home}/Mail/Maildir |
Możemy przekazać dostarczanie poczty do skrzynek programowi Procmail. Wystarczy, że w sekcji routerów usuniemy znaki komentarza z kolejnych wierszy zaczynających się od "procmail:", podobnie postępujemy w sekcji transporterów w miejscu zaczynającym się od wiersza "procmail_pipe:". Na koniec musimy jeszcze tylko umieścić plik konfiguracji Procmaila: .procmailrc w katalogu domowym użytkownika.
Czasami (czytaj: gdy mamy sieczkę w /etc/hosts) Exim zgłasza się nie jako serwer.domena.pl a jako sam 'serwer'. Jeżeli zmiana wpisów w /etc/hosts nie pomaga, albo gdy chcemy aby nasze MTA przedstawiało się inaczej niż hostname maszyny na którym stoi wystarczy ustawić (bądź dodać gdy jej nie ma) opcję primary_hostname w głównej sekcji:
primary_hostname = serwer.domena.pl |
W czasach zabawy z Sendmail-em podawałem także sposób
na ograniczenie bannera, który się pojawiał po telnecie
na port 25. W Exim-ie nie jest to skomplikowane i służy
do tego opcja smtp_banner
w sekcji głównej:
smtp_banner = $primary_hostname ESMTP $tod_full |
Spowoduje to wyświetlanie następującego tekstu jako bannera:
220 serwer.domena.pl ESMTP Wed, 23 Jul 2003 15:18:04 +0200 |
Chyba nie muszę tłumaczyć, że aby usunąć datę należy
wywalić $tod_full
?
Teraz zajmiemy się aliasami. Plik z aliasami powinien znajdować się w /etc/mail/aliases. Jest to czysty plik tekstowy, wprowadzone w nim zmiany wymagają wydania polecenia newaliases. Restart demona nie jest konieczny. Jeżeli jednak nie macie pewności czy tam powinien być plik z aliasami, w sekcji routers odszukajcie ciąg system_aliases: - jest to definicja routera odpowiedzialnego za rozwiązywanie aliasów. Tam też, w linijce data widać ścieżkę do pliku z aliasami:
system_aliases: driver = redirect allow_fail allow_defer data = ${lookup{$local_part}lsearch{/etc/mail/aliases}} file_transport = address_file pipe_transport = address_pipe |
Jeżeli z naszego SMTP korzystają użytkownicy spoza sieci lokalnej przyda nam się autoryzacja. Sprawa w Exim-ie jest dosyć zawiła. Otóż Exim zbyt wcześnie zrzuca uprawnienia root, tak że opisywany na wielu stronach opis zrobienia autoryzacji via PAM najczęściej nie działa. Z pomocą przyjdzie nam pakiet cyrus-sasl, a dokładniej pwcheck daemon (w PLD cyrus-sasl-saslauthd). W sekcji AUTHENTICATORS wpisujemy następujące linijki (lub kasujemy komentarze #)
plain: driver = plaintext public_name = PLAIN server_prompts = : server_condition = ${if saslauthd{{$1}{$3}}{1}{0}} # powyższy wpis zadziała przy saslauthd -a shadow, jeżeli # uruchomicie saslauthd -a pam (np. PLD) wpiszcie wtedy: # server_condition = ${if saslauthd{{$1}{$3}{smtp}}{1}{0}} server_set_id = $2 login: driver = plaintext public_name = LOGIN server_prompts = "Username:: : Password::" server_condition = ${if saslauthd{{$1}{$2}}{1}{0}} # powyższy wpis zadziała przy saslauthd -a shadow, jeżeli # uruchomicie saslauthd -a pam (np. PLD) wpiszcie wtedy: # server_condition = ${if saslauthd{{$1}{$2}{smtp}}{1}{0}} server_set_id = $1 |
Ostatnią rzeczą przy saslauthd (uruchomionym z opcją -a
pam) jaką trzeba
stworzyć (lub sprawdzić czy jest) to plik
/etc/pam.d/smtp:
#%PAM-1.0 # # example PAM file for saslauthd - place it as /etc/pam.d/ # (e.g. /etc/pam.d/smtp if you want to use saslauthd for SMTP # AUTH) # auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/security/blacklist onerr=succeed auth required /lib/security/pam_unix.so auth required /lib/security/pam_tally.so file=/var/log/faillog onerr=succeed no_magic_root auth required /lib/security/pam_nologin.so account required /lib/security/pam_tally.so deny=0 file=/var/log/faillog onerr=succeed no_magic_root account required /lib/security/pam_unix.so session required /lib/security/pam_unix.so |
Pozostaje mi tylko wam przypomnieć, że przed sprawdzaniem autoryzacji należy także uruchomić pwcheck saslauthd
# echo 'pwcheck_method:saslauthd' > /etc/sasl/smtpd.conf |
Exim sobie bardzo dobrze radzi z połączeniami szyfrowanymi przy użyciu protokołu SSL (wspiera metodę STARTTLS). Wystarczy wygenerować odpowiednie certyfikaty:
$ openssl genrsa -out /etc/mail/exim.key 1024 Generating RSA private key, 1024 bit long modulus .......++++++ ..............................++++++ e is 65537 (0x10001) $ openssl req -new -x509 -days 365 -key /etc/mail/exim.key -out \ /etc/mail/exim.crt Using configuration from /var/lib/openssl/openssl.cnf You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:PL State or Province Name (full name) [Some-State]:Mazowsze Locality Name (eg, city) []:Warsaw Organization Name (eg, company) [Internet Widgits Pty Ltd]:Baseciq Ltd. Organizational Unit Name (eg, section) []:Baseciq's Mail Server Common Name (eg, YOUR name) []:viper.baseciq.org Email Address []:baseciq@baseciq.org |
Oczywiście na pytania odpowiadajcie podając swoje dane... Po takim zabiegu do sekcji głównej Exim należy dopisać:
tls_certificate = /etc/mail/exim.crt tls_privatekey = /etc/mail/exim.key tls_advertise_hosts = * |
Po tym zabiegu i restarcie Exim powinien bez problemu komunikować się po SSL, co zresztą widać w logach:
2003-09-07 01:48:36 19vmnC-0006EG-27 <= bensonzow@beer.com H=plug.atn.pl [217.8.186.28] U=exim P=esmtp X=TLSv1:DES-CBC3-SHA:168 S=2909 id=ebb601c374e2$80dace00$cab00a12@fv |
Dawniej Exim mógł nasłuchiwać porcie 465 jedynie przy użyciu inetd, w nowszych wersjach wystraczy że ustawimy odpowiednie opcje:
daemon_smtp_ports = 25 : 465 tls_on_connect_ports = 465 |
Warto by było, żeby także pop3d obsługiwał SSL natywnie ssl (bez jakichś stunneli i innych wynalazków). Ja osobiście polecam demonik tpop3d, którego konfiguracja jest bardzo prosta. Instalujemy tpop3d:
# poldek -i tpop3d |
a następnie wystarczy że standardowe listen-address w pliku /etc/tpop3d.confzmienimy na takie:
listen-address: 0.0.0.0;tls=stls,/etc/mail/exim.crt,/etc/mail/exim.key \ 0.0.0.0;tls=immediate,/etc/mail/exim.crt,/etc/mail/exim.key |
Od teraz tpop3d na porcie 110 będzie obsługiwał SSL po wykonaniu komendy STLS (np. TheBat potrafi tak zacząć sesję SSL) a na porcie 995 będzie od razu używał SSL (TheBat, Outlook Express).
Generalnie nie ma sensu męczyć kernela i filesystemu żeby pilnował quoty na pocztę. Szczególnie gdy MTA samo sobie może z tym poradzić. Służy do tego parametr quota w konfiguracji transportów. I tak, w najprostszy sposób można lokalną quotę per user ustawić w konfiguracji transportu local_delivery (odpowiedzialnego za lokalne dostarczanie poczty):
local_delivery: driver = appendfile file = /var/mail/$local_part delivery_date_add envelope_to_add return_path_add # A tutaj dodajemy quotę w wysokości 20MB: quota = 20M |
Proste, prawda? Tak naprawdę ma to zastosowanie w systemach poczty wirtualnej gdzie możemy w bazie danych przechowywać quotę użytkownika i można skonstruować zapytanie SQL do odpytania ile miejsca ma dany użytkownik. Ale jeżeli nie możecie sobie poradzić z quotą systemową, możecie zamiast quota = 20M dopisać coś takiego:
quota = ${lookup{$local_part}lsearch{/etc/mail/quota.conf}{$value}{0M}} |
Od tego momentu w pliku /etc/mail/quota.conf możesz trzymać wielkości skrzynek dla poszczególnych użytkowników. Jeżeli ktoś nie zostanie tam wymieniony, to nie będzie miał żadnych limitów na swoją skrzynkę pocztową. Plik taki powinien wyglądać mniej więcej tak:
lukasz: 100M kflis: 5M ania: 20M |
I tak oto ja mam 100mb na pocztę, kubuś tylko 5, a siostra 20 MB ;) Podobnym parametrem każdego transportera jest message_size_limit. Wystarczy wpisać:
message_size_limit = 10M |
Podobnie jak powyżej, można zrobić to na bazie pliku - wystarczy zamiast /etc/mail/quota.conf użyć np. /etc/mail/size_limits.conf ;-) BTW. na końcu linijki z quotą, gdzie mamy '0M' możemy wstawić np. '20M'. Wtedy, osoby nie dopisane do /etc/mail/quota.conf będą miały 20MB limitu (limit domyślny).
Oczywiście jak na Exim przystało, od quoty jest więcej bajerków. Chyba najbardziej pożądanym będzie opcja quota_warn_message. Jest to nic innego jak mail ostrzegający usera o tym, że skrzynka jest zapchana po same brzegi. Zanim jednak polecisz to wdrażać, zainteresuj się jak to działa. Otóż po dostarczeniu każdego maila Exim będzie sprawdzał czy został przekroczony konkretny próg (podany w megabajtach lub w procentowo). Jeżeli tak, wygeneruje on odpowiednią wiadomość. I tak, dodajemy do molestowanego przez nas local_delivery następujące opcje:
quota_warn_message = "\ Content-Type: text/plain; charset=ISO-8859-2\n\ To: $local_part@$domain\n\ Reply-to: Administratorzy sieci <admins@twojadomena.pl>\n\ Subject: Informacja o Twoim koncie pocztowym\n\ \n\ *** Ta wiadomość została wygenerowana automatycznie ***\n\ \n\ Uprzejmie informujemy, iż skrzynka pocztowa została zapełniona w 90%\n\ swojej pojemności. W przypadku 100% nie będą dostarczane\n\ do Ciebie nowe wiadomości. Opróżnij skrzynkę pocztową ze starych\n\ wiadomości.\n" quota_warn_threshold = 90% |
Aby Exim współpracował z jakimś antywirusem należy najpierw wybrać i zainstalować program antywirusowy. Doświadczenie uczy, że najlepszy jest program Clamav.
Instalujemy więc Clamav
# poldek -i clamav clamav-database |
Po zainstalowaniu Clamav musimy zmodyfikować plik konfiguracyjny /etc/mail/exim.conf w sekcji głównej ustawiamy typ antywirusa:
av_scanner = clamd:/var/lib/clamav/clamd.socket |
Po dwukropku ustawiamy ścieżkę do socketu antywirusa (w przypadku clamav - zajrzyj do pliku /etc/clamav.conf). W miejscu gdzie wpisaliśmy clamd, możemy wpisać także i inny typ skanera. Niestety, żaden z innych obsługiwanych (sophie, kavdaemon, drweb) skanerów nie jest darmowy. Jeżeli natomiast wolicie mks, to możecie użyć takiej opcji:
av_scanner = mksd |
Kolejnym etapem, jest stworzenie reguł do filtrowania maili z wirusami. W tym celu, dopisujemy do sekcji głównej pliku konfiguracyjnego Exim:
acl_smtp_data = exiscan |
Teraz zaczynamy grzebanie w sekcji acl, gdzie dopisujemy (najlepiej na samym początku):
exiscan: deny message = Znaleziono wirusa. \n\ Virus or other harmful content found: $malware_name delay = 1s malware = * warn message = X-MIME-Warning: Serious MIME defect detected ($demime_reason) demime = * condition = ${if >{$demime_errorlevel}{2}{1}{0}} warn message = Message-ID: <E$message_id@$primary_hostname> condition = ${if !def:h_Message-ID: {1}} accept |
Pierwszy wpis odpowiednio skanuje cały e-mail i jeśli zostanie znaleziony wirus lub inna zawartość uznana za szkodliwą przez skaner antywirusowy to taki mail jest odrzucany oraz informacja o znalezionym wirusie zostaje wyświetlona z jednosekudnowym opóźnieniem. Te opóźnienie ma na celu unikniecia ewentualnego zapchania serwera poczty poprzez uciążliwego użytkownika co chwila próbujacego wysłać pocztę uznaną za szkodliwą. Kolejny warunek spowoduje iż maile z uszkodzonymi nagłówkami MIME zostaną odpowiednio oznaczone (czyli, także, duże maile podzielone na części, o czym niestety autor exiscana (aut. łatki dla Exim-a) nie wspomina, dlatego ich nie odrzucamy). Ostatni warunek ma na celu wyeliminowanie sytuacji gdy jakaś wiadomość, która dotarła do naszego serwera poczty nie posiada unikalnego identyfikatora. W takim przypadku generujemy i dopisujemy własny Message-ID.
Aby skaner av mógł sprawdzać pocztę Exima musi zostać dodany do grupy exim. Dokonujemy tego poleceniem groupadd albo edytując po prostu plik /etc/group:
[...] exim:x:79:clamav,mail [...] |
Kolejny feature jaki daje exiscan to odrzucanie plików z załącznikiem o określonym rozszerzeniu. W tym celu dopisujemy zaraz po exiscan: następujące linijki:
deny message = Niedozwolone zalaczniki. \n\ Blacklisted file extension ($found_extension) detected. condition = ${if match \ {${lc:$mime_filename}} \ {\N(\.exe|\.pif|\.bat|\.scr|\.lnk|\.vbs)$\N} \ {1}{0}} delay = 1s log_message = Blacklisted file extension ($found_extension) detected. |
Powyższa regółka ma na celu zablokowanie możliwości wysyłanie wiadomości, których załącznikami są pliki: *.exe, *.pif, *.bat, *.scr, *.lnk oraz *.vbs. Teraz, jeżeli nie chcemy aby skanowane były maile pochodzące od danych adresów ip dopisujemy (jeżeli chcemy aby Ci ludzie też nie mogli wysyłać plików *.com, to po poprzedniej regułce, jeżeli oni będą mogli, to przed):
accept hosts = /etc/mail/dontscan |
Teraz, w pliku /etc/mail/dontscan umieszczamy adresy IP bądź klasy adresowe z których poczta ma nie być skanowana.
Jeżeli natomiast chcecie, by poczta przeskanowana u was w przypadku gdy wróci w jakiś sposób z powrotem do naszego serwera (np. poprzez alias na innym serwerze) nie była ponownie skanowana, możecie zacząć oznaczać pocztę odpowiednimi znacznikami oraz przyjąć że poczta z tym znacznikiem nie była ponownie skanowana. Tak więc, przed końcowym accept dodajemy:
warn message = X-Scan-Signature: ${hmac{md5}{atutajwpiszhaslo} \ {$body_linecount}} |
Exim spowoduje dodanie zaszyfrowanego ciągu znaków składającego się z hasła i wielkości maila. Dzięki temu ktoś kto nie pozna waszego hasła nie będzie mógł sfałszować informacji o tym że mail został już zeskanowany. Teraz, aby taka poczta przechodziła bez skanowania, na samym początku po exiscan: dopisujemy:
accept condition = ${if eq {${hmac{md5}{atutajwpiszhaslo} \ {$body_linecount}}}{$h_X-Scan-Signature:} {1}{0}} |
Ustawienie takich regułek z tym samym hasłem na kilku serwerach spowoduje że gdy mail będzie przechodził przez kilka z nich, tylko jeden będzie musiał go przeskanować.
Zjawisko spamu jest niezwykle uciążliwe. W niektórych Stanach w USA
traktowane jest w kategoriach kryminalnych. Zapewne znasz jego
definicję lub przynajmniej wiesz jak spam wygląda. W skrócie jest to
wiadomość e-mail, której nie chciałeś otrzymać. Exim posiada wbudowaną obsługę
filtra antyspamowego opartego na technice dnsbl, może wykorzystwać zarówno
czarne listy
jak i białe listy
nadawców oraz adresów serwerów.
Kolejnym bardzo prostym ale niezwykle skutecznym w walce ze spamem jest maksymalne opóźnianie procesu komunikacji pomiedzy klientem wysyłającym poczte a serwerem MTA. Nie tylko odcina to część robotów spamerskich ale także zmiejsza ryzyko przeciążenia serwera.
Przejdźmy do konfiguracji. Wszystkie te wpisy powinny znaleść się w sekcji ACL CONFIGURATION w obrębie acl_check_rcpt:.
Wymuszamy helo/ehlo
deny message = Wymagane RFC HELO/EHLO zanim wyslesz wiadomosc. \n\ RFCs mandate HELO/EHLO before mail can be sent. condition = ${if or{{!def:sender_helo_name}{eq{$sender_helo_name}{}}}{yes}{no}} delay = 5s log_message = No HELO/EHLO. |
Definujemy własne białe listy
.
Jeśli nasz zestaw regół okazałby się zbyt restrycyjny możemy oznaczyć aby pewne domeny
były traktowane "ulgowo".
accept domain = +local_domains condition = /etc/mail/whitelist |
Sprawdzamy czy serwer nadawcy figuruje na listach RBL
deny message = Serwer nadawcy figuruje na liscie RBL \n\ Server $sender_host_address is at RBL: \ $dnslist_domain\n$dnslist_text delay = 5s dnslists = blackholes.mail-abuse.org : \ dialup.mail-abuse.org : \ dnsbl.njabl.org : \ sbl.spamhaus.org : \ list.dsbl.org : \ cbl.abuseat.org : \ relays.ordb.org : \ bl.spamcop.net hosts = ! +relay_from_hosts log_message = Listed at RBL list: $dnslist_domain\n$dnslist_text. deny message = Serwer nadawcy figuruje na liscie RBL \n\ Server $sender_host_address is at RBL: $dnslist_domain. hosts = ! +relay_from_hosts dnslists = bogusmx.frc-ignorant.org/$sender_host_name : \ dns.rfc-ignorant.org/$sender_host_name delay = 5s log_message = Listed at RFC-Ignorant. |
Teraz dokonujemy weryfikacji podanego HELO
HELO nie może być postaci localhost.localhomain
deny message = Niepoprawne HELO. \n\ $sender_helo_name is a stupid HELO. hosts = !+relay_from_hosts condition = ${if match {$sender_helo_name}{\N^(127\.0\.0\.1|localhost(\.localdomain)?)$\N}{yes}{no}} delay = 5s log_message = Stupid localhost HELO. |
HELO musi być nazwą domenową (hostname)
deny message = HELO musi byc nazwa domenowa. \n\ HELO must be hostname. hosts = !+relay_from_hosts condition = ${if !match {$sender_helo_name}\ {\N.*[A-Za-z].*\N}{yes}{no}} delay = 5s log_message = Helo must be hostname. |
Według RFC821 HELO musi być pełną nazwą domenową (Fully Qualifield Domain Name).
deny message = HELO nie wyglada poprawnie. Zobacz RFC 821. \n\ HELO must contain a Fully Qualifield Domain Name. See RFC821. hosts = !+relay_from_hosts condition = ${if !match{$sender_helo_name} \ {\N.*[A-Za-z].*\..*[A-Za-z].*\N}{yes}{no}} delay = 5s log_message = HELO is not a FQDN. |
Eliminujemy sytuację gdy nadawca jako HELO podaje serwer z naszej domeny np. domena.pl
deny message = Wykryto zafalszowane RFC HELO. \n\ Fake HELO detected: $sender_helo_name. condition = ${if eq{$sender_helo_name}\ {\N^(.*\.)?domena\.pl$\N}{yes}{no}} hosts = !+relay_from_hosts delay = 5s log_message = Fake HELO from host $sender_helo_name. |
Kolejne dwa warunki są bardzo restrycyjnymi testami. Formalnie przez RFC nie jest wymagane aby domena miała zdefiniowany rekord MX. Lecz każdy szanujący się administrator poważnej domeny zawsze zadba aby odpowiednie serwery figurowaly jako MX. RFC zaleca aby jeśli już jest zdefiniowany rekord MX dla domeny, to aby był on postaci FQDN
deny message = Brak zdefiniowanego rekordu MX dla domeny. \n\ No MX envelope sender domain $sender_address_domain. hosts = ! : !+relay_from_hosts senders = ! : condition = ${if eq{${lookup dnsdb{mx=$sender_address_domain}{$value}fail}}{fail}{yes}{no}} delay = 5s log_message = No MX record in DNS. deny message = Rekord MX w DNS musi byc postaci FQDN. \n\ MX for transport sender domain $sender_address_domain must be FQDN. hosts = ! : !+relay_from_hosts senders = ! : condition = ${if !match {${lookup dnsdb{mx=$sender_address_domain}{$value}fail}}\ {\N.*[A-Za-z].*\..*[A-Za-z].*\N}{yes}{no}} delay = 5s log_message = MX record is not a FQDN. |
Krótkie wyjaśnienie wykorzystanych opcji
deny message
Określamy jaka informacja zwrotna pojawi się u nadawcy.
delay
Opóźnienie po jakim komunikat określnony jako message zostanie zwrócony nadawcy.
dnslist
Lista systemów z bazami blokującymi serwery open relay
.
Wymienione tutaj powinny skutecznie powstrzymać spam. Jeżeli
nadal dostajesz niechciane maile, wykonaj następujące
czynności. Sprawdź w nagłówku wiadomości adres IP serwera,
który przekazał Twojemu MTA pocztę. Wejdź na stronę:
www.ordb.org/lookup/
i wpisz adres IP do sprawdzenia. Jeżeli wyszukiwanie w bazie
ordb.org nie przyniesie rezultatów, wejdź tutaj:
http://www.ordb.org/lookup/rbls/?host=w.x.y.z, gdzie zamiast symbolicznego zapisu podajemy adres IP.
Skonstruowane w ten sposób zapytanie dokona sprawdzenia, czy dany adres IP figuruje na
innych czarnych listach. Pozytywny rezultat testu powinien zwrócić w odpowiedzi
listę systemów RBL (Relay Black List). Można ją wykorzystać
dopisując do naszej regułki. Uważaj na system
block.blars.org figuruje w nim smtp.wp.pl.
hosts
Podana lista serwerów. W powyższym przykładzie jest to !+relay_from_hosts co oznacza, że cała regółka dotyczy połączeń z wszystkich serwerów za wyjątkiem tych zdefiniowanych jako relay_from_hosts.
log_message
Informacja jaka zostanie zapisana w dzienniku systemowym exima czyli /var/log/exim/main.log
Teraz należałoby włączyć wszystkie usługi jakie zainstalowaliśmy
# /etc/rc.d/init.d/exim start # /etc/rc.d/init.d/saslauthd start # /etc/rc.d/init.d/clamd start # /etc/rc.d/init.d/tpop3d start # /etc/rc.d/init.d/rc-inetd restart |
Na koniec przykładowy zapis z dziennika systemowego Exima
2004-03-04 21:05:24 H=(sina.com) [218.79.119.92] F=< jin@sina.com > \ rejected RCPT < user@domena.pl >: \ Serwer 218.79.119.92 figuruje na czarnej liście dnsbl.sorbs.net |
Jeżeli czytasz tą część opisu konfiguracji exima stanąłeś przed problemem obsługi przez niego więcej niż jednej domeny. Exim jest jak najbardziej do tego przystosowany. Poniżej zamieszczam listing z pliku /etc/mail/exim.conf
virtusertable_alias: driver = redirect allow_fail allow_defer data = ${lookup{$local_part@$domain}lsearch{/etc/mail/virtusertable}} file_transport = address_file pipe_transport = address_pipe virtusertable_defaultalias: driver = redirect allow_fail allow_defer data = ${lookup{@$domain}lsearch{/etc/mail/virtusertable}} file_transport = address_file pipe_transport = address_pipe |
Powyższy przykład umieść umieść na początku sekcji routers
. Dla przypomnienia
dodam, że początek sekcji oznacza się słowem kluczowym begin
.
Jak słusznie zauważyłeś, wpisy z virtusertable
do złudzenia przypominają
te z system_aliases
. Działa to właściwie w ten sam sposób. Podczas
odbierania przesyłki exim czyta linijkę data
. Ma w niej zdefiniowane, że
ma szukać na podstawie local_part
czyli to co jest przed znakiem
@ oraz domain
czyli części domenowej adresu. Wartości
które zostaną podstawione zamiast tych zmiennych zostaną porównane z plikiem
/etc/mail/virtusertable. Jeżeli wynik porównania wypadnie pomyślnie
poczta zostanie dostarczona do odpowiedniego użytkownika, jeżeli zaś nie, odpytane zostaną
aliasy systemowe. Jeżeli i tam użytkownik nie zostanie odnaleziony, zostanie wysłana
wiadomość z odpowiednią informacją do nadawcy z komunikatem błędu. Część
defaultalias
jest prawie identyczna. Różnica tkwi jedynie w opcji
data
. Sprawdzana jest jedynie część domenowa. Poniżej zamieszczam listing
z pliku /etc/mail/virtusertable
user@domena.pl user mister@sample.com user2 @jakasdomena.pl user3 |
Jak widać budowa pliku jest prosta i czytelna. User3 będzie otrzymywał całą pocztę z domeny jakasdomena.pl. Po tych zabiegach exim powinien być już przygotowany do obsługi wielu domen. Musisz pamiętać aby go zrestartować po dokonaniu modyfikacji jego pliku konfiguracyjnego.
# /etc/rc.d/init.d/exim restart |
W przypadku, gdy masz zamiar gdzieś wyjechać na dłużej i nie będziesz miał dostępu do poczty, dobrym pomysłem jest ustawienie automagicznej odpowiedzi dla ludzi, którzy do Ciebie piszą. Tu z pomocą przychodzi nam opcja w Eximie.
Na początku edytujemy plik /etc/mail/exim.conf i w sekcji routers
przed localuser router
dodajemy następujące linijki:
user_vacation: driver = accept check_local_user # nie odpisujemy na błędy bądź listy dyskusyjne condition = "${if or {{match {$h_precedence:} {(?i)junk|bulk|list}} {eq {$sender_address} {}}} {no} {yes}}" no_expn require_files = /var/mail/vacation/${local_part}/vacation.msg # nie odpisujemy na maile od list dyskusyjnych oraz na powiadomienia o błędach senders = " ! ^.*-request@.*:\ ! ^.*@list*.*:\ ! ^owner-.*@.*:\ ! ^postmaster@.*:\ ! ^listmaster@.*:\ ! ^mailer-daemon@.*\ ! ^root@.*" transport = vacation_reply unseen user = ${local_part} no_verify |
Następnie tworzymy katalog /var/mail/vacation , w którym będą się znajdować katalogi
zawierające nazwę użytkownika oraz pliki z informacjami o powodzie jego nieobecności. Powód taki
wpisujemy do pliku vacation.msg znajdującego się w
/var/mail/vacation/NAZWA_UŻYTKOWNIKA/. Gdy już mamy te ustawienia za sobą w sekcji
transport
dodajemy następujące linijki:
vacation_reply: driver = autoreply file = /var/mail/vacation/$local_part/vacation.msg file_expand from = System Automatycznej Odpowiedzi <$original_local_part@$original_domain> log = /var/mail/vacation/$local_part/vacation.log once = /var/mail/vacation/$local_part/vacation.db once_repeat = 7d subject = ${if def:h_Subject: {Re: ${quote:${escape:${length_50:$h_Subject:}}} (autoreply)} {Informacja} } text = "\ Witaj $h_from\n\n\ Ta wiadomość została wygenerowana automatycznie\n\ Tekst poniżej zawiera informację od użytkownika:\n\ ====================================================\n\n\ " to = "$sender_address" |
Ważną częścią tutaj jest opcja once_repeat
, która sprawdza jak często nadawcy będą otrzymywać
odpowiedzi. W tej konfiguracji jest to co 7dni.
To wszystko, teraz musimy jeszcze zrestartować Exima i możemy jechać na urlop.
# /etc/rc.d/init.d/exim restart |
Heimdal jest implementacją nowoczesnego sieciowego protokołu uwierzytelniania użytkowników Kerberos. Użytkownik po standardowym zalogowaniu za pomocą hasła na czas trwania sesji otrzymuje specjalny unikalny klucz (w terminologii kerberos'a nazywany biletem (ang. ticket)) za pomocą którego może uzyskać dostęp do innych usług w sieci już bez konieczności dodatkowego podawania hasła.
Każda sieć posiada wydzielony serwer Kerberos, zwany KDC (Key Distibution Center) którego zadaniem jest zarządzanie centralną bazą kluczy (m.in. wydawanie nowych kluczy oraz odpowiadanie na pytania dotyczące ich autentyczności).
Uwaga:Kerberos nie zapewnia dystrybucji bazy użytkowników w sieci - do tego celu najlepiej użyć usługi NIS.
Za pomocą poldka instalujemy serwer i narzędzia heimdal'a:
# poldek -i heimdal heimdal-server |
Edytujemy plik konfiguracyjny /etc/heimdal/krb5.conf. Plik ten używany jest przez biblioteki heimdal'a i powinien być obecny na wszystkich maszynach, na których będziemy używali kerberos'a (na serwerze i klientach)
[libdefaults] default_realm = FOO.PL clockskew = 300 v4_instance_resolve = false [realms] FOO.PL = { kdc = kdc.foo.pl kpasswd_server = kdc.foo.pl admin_server = kdc.foo.pl } [domain_realm] .foo.pl = FOO.PL foo.pl = FOO.PL |
default_realm
określa domyślną domenę kerberos'a.
Zamiast FOO.PL wpisujemy wybraną nazwę domeny, typowo jest to
pisana wielkimi literami nazwa naszej domeny dns.
kdc.foo.pl zastępujemy adresem serwera, na którym uruchomiony jest
serwer KDC heimdal'a.
clockskew
określa maksymalną różnicę czasu (w sekundach) pomiędzy
serwerem a klientami (jeżeli różnica czasu będzie większa niż podana,
kerberos odmówi współpracy) dlatego dobrze w sieci uruchomić także usługę
synchronizacji czasu ntp.
Sekcja [realms]
definiuje domeny kerberosa. Można tu wymienić kilka
niezależnych domen, określając dla nich lokalizację serwerów kerberosa.
kdc.foo.pl zastępujemy oczywiście nazwą hosta na którym będzie uruchomiona
usługa kdc.
Ostatnia sekcja [domain_realm]
określa mapowanie nazw dns na domeny
kerberosa. Na tej podstawie heimdal wie na podstawie nazwy dns hosta w jakiej
domenie kerberos'a się znajduje. Nazwa dns zaczynająca się od kropki pasuje do
dowolnej poddomeny podanej domeny.
uruchamiamy usługę dystrybucji kluczy KDC:
# service heimdal start |
Do zarządzania domeną kerberos'a używamy narzędzia kadmin. Inicjalizujemy domenę i dodajemy użytkownika, w tym przypadku mrk (zostawiając domyślnie proponowane wartości):
# kadmin -l kadmin>init FOO.PL kadmin>add mrk |
Opcja -l uruchamia kadmin w trybie lokalnym, program musi być uruchomiony z konta root. Możemy także dopisać do pliku /etc/heimdal/krb5.acl:
mrk@FOO.PL all |
dając użytkownikowi mrk@FOO.PL prawo do administracji kerberosem - w tym przypadku
kadmin wołamy z parametrem -p użytkownik
Logujemy się w systemie na koncie zwykłego użytkownika (w naszym przykładzie mrk) i próbujemy się zalogować do domeny kerberosa:
$ kinit |
kinit domyślnie próbuje uzyskać bilet dla zalogowanego użytkownika, można to zmienić podając użytkownika jako parametr.
Sprawdzamy, czy kerberos wystawił nam bilet (ticket):
$ klist Credentials cache: FILE:/tmp/krb5cc_1000_pSN1Vv Principal: mrk@FOO.PL Issued Expires Principal Apr 13 11:02:40 Apr 13 21:02:40 krbtgt/FOO.PL@FOO.PL |
Instalujemy moduł pam-pam_krb5.
# poldek -i pam-pam_krb5 |
Zmieniamy wybrane pliki /etc/pam.d/*, dodając dodatkowo sprawdzanie hasła za pomocą nowego modułu:
Przykładowo /etc/pam.d/login wykorzystywany przez program login poprawiamy tak:
#zmieniamy linijkę
auth required pam_unix.so |
na:
auth sufficient pam_unix.so auth required pam_krb5.so use_first_pass |
i dodajemy:
session optional pam_krb5.so |
W ten sposób możemy się zalogować przy użyciu standardowej metody sprawdzania haseł w /etc/shadow (pam_unix.so) lub w domenie kerberos'a (pam_krb5.so)
Analogicznie poprawiamy inne pliki, np. /etc/pam.d/gdm, /etc/pam.d/xscreensaver
Po tych poprawkach powinniśmy móc zalogować się już podając hasło kerberos'a. Po zalogowaniu możemy jeszcze za pomocą polecenia klist sprawdzić czy kerberos wystawił nam bilet:
$ klist |
Kolejnym etapem jest "skerberyzowanie" poszczególnych usług w naszej sieci tak,
by uwierzytelniały użytkownika na podstawie wystawionego biletu kerberos'a.
Zaprezentujemy to na przykładzie sshd, cyrus-imap'a oraz apache'a - opis postępowania
w przypadku innych usług obsługujących uwierzytelnianie kerberos jest podobny,
Każda skerberyzowana usługa musi mieć utworzone własne konto w domenie Kerberos'a
(tzw. service account). Z kontem tym związany jest klucz, który musi być
znany zarówno kdc i usłudze. Konto usługi przeważnie jest w postaci:
nazwa_usługi/hostname
, przy czym hostname musi być
pełną nazwą hosta wraz z domeną, czyli tym, co zwraca hostname:
$ hostname --fqdn |
Ponadto należy zadbać o poprawne odwzorowanie tej nazwy w DNS - opis jak właściwie ustawić hostname znajduje się podstawach konfiguracji sieci
Tworzymy konto dla daemona sshd. Konto musi miec nazwę w postaci:
host/hostname
# kadmin -l kadmin> add -r host/host.foo.pl |
Parametr -r
powoduje, że do konta zostanie przypisany
losowy klucz (hasło). Klucz ten jest zapisany jako jeden z atrybutów
użytkownika w bazie użytkowników domeny Kerberos'a
(dokładnie w /var/lib/heimdal/heimdal.db).
By sshd miał także dostęp do tego klucza robimy:
kadmin> ext_keytab host/host.foo.pl |
Powyższe polecenie zapisuje klucz związany z kontem usługi do tzw. tablicy kluczy (keytab), z której to tablicy sshd może go pobrać. Klucz zostaje zapisany w domyślnej tablicy kluczy znajdującej się w pliku /etc/heimdal/krb5.keytab. Z tej tablicy kluczy domyślnie korzystają usługi używające kerberos'a.
By sshd uwierzytelniał użytkowników za pomocą kerberos'a do pliku /etc/ssh/sshd_config dodajemy jeszcze linijki:
GSSAPIAuthentication yes |
do pliku konfiguracyjnego klienta /etc/ssh/ssh_config dopisujemy:
GSSAPIAuthentication yes GSSAPIDelegateCredentials yes |
Opcja GSSAPIDelegateCredentials
określa, czy bilet kerberosa
ma być przekazany na maszynę, na którą się logujemy.
Po restarcie sshd, jeżeli mamy wystawiony bilet kerberosa powinniśmy móc zalogować się przez ssh na nasz serwer bez pytania o hasło.
Powyższy opis dotyczy sytuacji, gdy serwer sshd znajduje się na tej samej maszynie co kdc. Jeżeli sshd jest na innej maszynie w sieci, musimy wyeksportować klucz do innej tablicy kluczy:
kadmin> ext_keytab host/host.foo.pl sshd.keytab |
a następnie przenieść plik sshd.keytab na maszynę na której mamy uruchomione sshd. Trzeba jeszcze poinformować sshd, że ma szukać klucza w innej lokalizacji niż standardowe krb5.keytab. W pliku /etc/sysconfig/sshd dopisujemy:
export KRB5_KTNAME=/etc/heimdal/sshd.keytab |
Doinstalowujemy plugin gssapi do sasl'a
# poldek -i cyrus-sasl-gssapi |
Tworzymy konto dla cyrrus'a. Konto ma mieć nazwę w postaci
imap/hostname
:
kadmin> add -r imap/host.foo.pl |
exportujemy klucz do tablicy kluczy:
kadmin> ext_keytab /etc/heimdal/cyrus.keytab |
Wybieramy inną niż domyślna tablicę kluczy, ponieważ cyrus imap pracuje z uprawnieniami użytkownika 'cyrus' i jako taki nie ma prawa czytania domyślnej tablicy /etc/heimdal/krb5.keytab.
Dajemy dostęp do tablicy kluczy użytkownikowi cyrus:
chown cyrus.root /etc/heimdal/cyrus.keytab chmod 660 /etc/heimdal/cyrus.keytab |
Na koniec musimy jeszcze poinformować cyrus'a gdzie ma szukać klucza. W pliku /etc/sysconfig/cyrus-imapd dodajemy:
export KRB5_KTNAME=/etc/heimdal/cyrus.keytab |
Przykładowe programy klienckie, które potrafią użyć protokołu kerberos do uwierzytelnienia użytkownika to evolution i mutt
Doinstalowujemy moduł apache'a obsługujący uwierzytelnianie za pomocą kerberos'a:
# poldek -i apache-mod_auth_kerb |
Dodajemy konto usługi w domenie kerberos'a:
kadmin> add -r HTTP/hostname |
hostname zastępując nazwą hosta na którym uruchomiony jest apache.
Exportujemy klucz, zmieniamy uprawnienia:
kadmin> ext HTTP/hostname /etc/heimdal/httpd.keytab # chown http.root /etc/heimdal/httpd.keytab # chmod 660 /etc/heimdal/httpd.keytab |
lokalizację tablicy kluczy możemy tak jak wcześniej podać apache'owi globalnie przez zmienną środowiskową, dopisując do /etc/sysconfig/apache:
export KRB5_KTNAME=/etc/heimdal/httpd.keytab |
Można to także zrobić za pomocą dyrektywy Krb5Keytab w pliku konfiguracyjnym apache'a
Przykładowa konfiguracja dostępu może wyglądać następująco:
<Directory "/home/users/mrk/public_html/kerberos"> AuthType Kerberos AuthName "Kerberos Login" KrbMethodNegotiate on KrbMethodK5Passwd on KrbAuthRealms FOO.PL Krb5Keytab /etc/heimdal/httpd.keytab require user mrk@FOO.PL </Directory> |
Próba dostępu z prawdopodobnie zakończy się pytaniem o hasło. Naszym celem jest jednak dostęp do serwisu www'a za pomocą biletu kerberos'a, bez zbędnego podawania hasła. W firefox'ie wpisujemy url: about:config, i szukamy pozycji:
network.negotiate-auth.delegation-uris network.negotiate-auth.trusted-uris |
Określają one url'e, dla których przeglądarka ma zastosować rozszerzenie negotiate. Wpisujemy tam nazwy dns naszego serwisu www oddzielone przecinkami. Teraz, jeśli mamy aktualny bilet (sprawdzamy przez klist), powinniśmy zostać wpuszczeni bez pytania o hasło. Rozszerzenie negotiate oprócz firefox'a powinny obsługiwać także mozilla i epiphany - o innych mi nie wiadomo.
Protokół jabber służy głównie do przesyłania wiadomości typu Instant Messaging (czyli działa podobnie jak inne znane komunikatory np. icq, tlen, gadu-gadu itp.). Zaletą jabbera jest to, że jest otwarty, zapewnia darmową i pełną infrastrukturę (serwery, a także klienty) dla osób prywatnych i użytkowników komercyjnych. Charakteryzuje się także dużym bezpieczeństwem - rozmowy, a także komunikacja między serwerami może być szyfrowana.
W PLD jest kilka serwerów obsługujących komunikację protokołu XMPP, który jest fundamentem Jabbera - zatwierdzonym przez IETF w formie RFC (RFC od 3920 do 3923). Używany przez wielu ISP jabberd w wersji 1.4, zdobywający popularność ejaberd czy opisywany poniżej jabberd w wersji 2.0.
Opisana zostanie podstawowa konfiguracja, umożliwiająca połączenia szyfrowane, a do składowania danych przez jabberd2 wykorzystamy silnik SQL Postgresql.
Pakiet jabberd2 instalujemy za pomocą poldka:
poldek> install jabber-common jabberd |
Oczywiście, jeżeli do tej pory nie mamy zainstalowanego Postgresql należy zainstalować go także. Należy pamiętać, że jabberd2 może współpracować także z MySQL, sqlite3, a także znacznie prostrzą wersją bazy db.
Zanim zaczniemy, musimy stworzyć domenę, która jednoznacznie będzie wskazywała na maszynę Jabbera. Dodamy także rekordy SRV, które służą do zapytań domenowych przez demony Jabbera.
Przykład konfiguracji zostanie przedstawiony dla serwera nazw Bind. Zmian dokonujemy w odpowiednim pliku stref w katalogu /var/lib/named/M.
; Jabber jabber IN A 10.1.1.1 ;Tu wpisujemy IP naszej domeny _jabber._tcp.jabber IN SRV 20 0 5269 domena.org. _xmpp-server._tcp.jabber IN SRV 20 0 5269 domena.org. _xmpp-client._tcp.jabber IN SRV 20 0 5222 domena.org. |
Oczywiście nie możemy zapomnieć o zmianie rekordu serial w strefie domeny i restarcie demona named
W przypadku wykorzystwania zapór ogniowych w systemie powinniśmy otworzyć porty tcp dla następujących portów:
5222 - Dla komunikacji klienckiej (połączenie nieszyfrowane)
5223 - Dla komunikacji klienckiej (połączenie szyfrowane SSL)
5269 - Dla komunikacji między serwerami Jabbera
5347 - Dla komunikacji między serwerami Jabbera, wykorzystany przez dodatkowe transporty (np. transport GG)
Pamiętać należy, że powyższe porty są ustalone umownie i w plikach konfiguracyjnych demona Jabber, a także rekordach SRV możemy je zmienić (np. dla portu klienckiego ustalić port 80) - jednak zaleca się pozostawić proponowane wyżej porty.
Oczywiście, jeżeli nie chcemy aby nasz serwer był widoczny na zewnątrz naszej sieci (np. jest przeznaczony tylko dla wewnętrzej sieci intranetowej) nie otwieramy portu przeznaczonego do komunikacji między serwerami (u nas to porty 5269 i 5347).
Możemy wreszcie skonfigurować wstępnie usługę jabberd2. Wszystkie pliki konfiguracyjne znajdują się w katalogu /etc/jabber.
W pliku /etc/jabber/c2s.xml w okolicy tagu "local" dodajemy naszą domenę:
<!-- Local network configuration --> <local> <!-- Who we identify ourselves as. This should correspond to the ID (host) that the session manager thinks it is. You can specify more than one to support virtual hosts, as long as you have additional session manager instances on the network to handle those hosts. The realm attribute specifies the auth/reg or SASL authentication realm for the host. If the attribute is not specified, the realm will be selected by the SASL mechanism, or will be the same as the ID itself. Be aware that users are assigned to a realm, not a host, so two hosts in the same realm will have the same users. If no realm is specified, it will be set to be the same as the ID. --> <id>jabber.domena.org</id> |
W pliku /etc/jabber/sm.xml w pierwszych linijkach także dodajemy naszą domenę:
<sm> <!-- Our ID on the network. Users will have this as the domain part of their JID. If you want your server to be accessible from other Jabber servers, this ID must be resolvable by DNS.s (default: localhost) --> <id>jabber.domena.org</id> |
Jeżeli chcemy, aby nasz serwer komunikował się z innymi serwerami w pliku /etc/jabber/jabberd.cfg kasujemy "#" w linijce z "s2s":
# After sm and c2s are configured to use a fully qualified domain name # and proper SRV records are set in DNS uncoment this to enable # communication # with other Jabber servers s2s /etc/jabber/s2s.xml |
Podstawowa konfiguracja jest już zrobiona. Domyślne ustawienie tzw. "storage" czyli sposobu trzymania przez jabbera informacji o użytkownikach jest zrobione w PLD w db. Przy małej ilości użytkowników jest to wystarczający sposób. Jednak przy większej ich ilości, bardziej praktyczne jest trzymanie tych danych w bazie SQL.
Przy poprawnie działającym postgresie, z uprawnionego dla niego użytkownika tworzymy bazę jabberd2
$ createdb -U postgres jabberd2 |
Następnie przypisujemy do tej bazy użytkownika jabberd2 i ustalamy dla niego hasło i opcje dostępu do bazy:
$ createuser -P -U postgres jabberd2 Enter password for user "jabberd2": Enter it again: Shall the new user be allowed to create databases? (y/n) n Shall the new user be allowed to create more new users? (y/n) n CREATE USER |
Teraz musimy wypełnić nowoutworzoną bazę odpowiednimi tabelami i polami. Z katalogu /usr/share/doc/jabberd-2* należy rozpakować (najlepiej do katalogu użytkownika, który może działać na bazie postgresa) plik db-setup.pgsql.gz. Po rozpakowaniu przechodzimy do katalogu, gdzie został rozpakowany plik db-setup.pgsql i wykonujemy:
$ psql -U jabberd2 jabberd2 jabberd2=>\i db-setup.pgsql |
Baza postgresa jest gotowa. Połączenie z bazą będzie odbywać się po localhost, tak więc musimy zadbać o to, żeby postgres umożliwiał takie połączenie
Została nam jeszcze konfiguracja w plikach jabbera.
W pliku /etc/jabber/sm.xml szukamy sekcji "storage" i zmieniamy na:
<!-- Storage database configuration --> <storage> <!-- By default, we use the MySQL driver for all storage --> <driver>pgsql</driver> |
Dla porządku dodamy, że zamiast pgsql, możemy także wykorzytać: mysql, ldap, sqlite (w zależności od mechanizmu jaki wybraliśmy).
W tym samym pliku szukamy następnie sekcji "pgsql" aby w odpowiednim miejscu wpisać hasło dostępu do bazy jabberd2. Możemy tam także zmienić sposób dostępu:
<!-- PostgreSQL driver configuration --> <pgsql> <!-- Database server host and port --> <host>localhost</host> <port>5432</port> <!-- Database name --> <dbname>jabberd2</dbname> <!-- Database username and password --> <user>jabberd2</user> <pass>tu_wpisujemy_hasło_do_bazy</pass> |
Podobne zmiany wykonujemy w pliku /etc/jabber/c2s.xml. Umożliwiają one autentykacje użytkowników jabbera:
<!-- Authentication/registration database configuration --> <authreg> <!-- Backend module to use --> <module>pgsql</module> |
I dalej w tym samym pliku (sekcja "pgsql")
<!-- PostgreSQL module configuration --> <pgsql> <!-- Database server host and port --> <host>localhost</host> <port>5432</port> <!-- Database name --> <dbname>jabberd2</dbname> <!-- Database username and password --> <user>jabberd2</user> <pass>tu_wpisujemy_hasło_do_bazy</pass> </pgsql> |
Po zrestartowaniu demona jabberd możemy się już cieszyć bardziej zaawansowaną funkcjonalnością naszego komunikatora.
Przed konfiguracją samego jabbera, musimy sprawdzić czy mamy pakiet openssl i wygenerować klucz:
# openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem |
sam parametr -days 3650 możemy ustawić na krótszy lub dłuższy (oznacza on długość ważności certyfikatu - w naszym przypadku 10 lat).
Po wykonaniu powyższego polecenia i wpisaniu odpowiedzi na zadane pytania (zwróćmy tylko uwagę, abyśmy w polu Common Name wpisali naszą domenę, obsługiwaną przez serwer jabbera) usuniemy hasło z klucza prywatnego:
# openssl rsa -in privkey.pem -out privkey.pem |
Następnie połączymy oba klucze w jeden plik i skasujemy klucz prywatny:
# cat privkey.pem >> server.pem # rm privkey.pem |
Zmieniamy nazwę naszego certyfikatu (dla porządku), przenosimy w odpowiednie miejsce i nadajemy prawa:
# mv server.pem /var/lib/openssl/certs/jabber.pem # chown root:jabber /var/lib/openssl/certs/jabber.pem # chmod 640 /var/lib/openssl/certs/jabber.pem |
Została nam jeszcze konfiguracja Jabbera. W pliku /etc/jabber/c2s.xml znajdujemy tag "ssl-port" i odkomentujemy go:
<!-- Older versions of jabberd support encrypted client connections via an additional listening socket on port 5223. If you want this (required to allow pre-STARTTLS clients to do SSL), uncomment this --> <ssl-port>5223</ssl-port> </local> |
Zdejmujemy komentarz także z tagu "require-starttls" (kilka linijek wyżej):
<!-- Require STARTTLS. If this is enabled, clients must do STARTTLS before they can authenticate. Until the stream is encrypted, all packets will be dropped. --> <require-starttls/> |
Teraz w każdym z pięciu plików konfiguracyjnych znajdujących się w /etc/jabber tj. router.xml, sm.xml, resolver.xml, s2s.xml, c2s.xml znajdujemy zakomentowany ciąg wskazujący na nasz certyfikat:
<!-- <pemfile>/etc/jabber/server.pem</pemfile> --> |
Kasujemy komentarze (czyli <!-- i -->) i wpisujemy odpowiednią scieżkę do naszego certyfikatu:
<pemfile>/var/lib/openssl/certs/jabber.pem</pemfile> |
Kolejny restart demona jabber i możemy cieszyć się połączeniami szyfrowanymi.
Opisane powyżej sposoby konfiguracji nie wyczerpują oczywiście wszystkich aspektów. Zachęcamy do odwiedzenia strony z oryginalną dokumentacją jabbera. Mimo, że niektórym może sprawić problem język angielski, to podane przykłady w jasny sposób omawiają także zaawansowane zagadnienia.
MySQL jest Systemem Zarządzania Relacyjnymi Bazami Danych. Znany i ceniony jest przede wszystkim ze względu na swoją niebywałą wydajność i szybkość działania. Świetnie nadaje się do obsługi projektów internetowych, ale nie tylko - z powodzeniem używany jest również w wielkich projektach informatycznych organizacji, takich jak chociażby NASA. Przeciwnicy MySQL'a często mówią, jak to bardzo brakuje mu wielu ficzerów, które posiadają prawdziwe, duże systemy baz danych. Ze swojego doświadczenia wiem, że część z tych ludzi nawet nie rozróżnia wersji systemu, które oferuje nam firma MySQL AB (producent MySQL).
Napisany w C i C++ (wydajność!).
API dla wielu języków programowania: C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, Tcl.
Pełna wielowątkowość, korzystająca z wątków kernela. Oznacza to, że MySQL będzie pracował na maszynie wieloprocesorowej, jeśli tylko taką posiadasz.
Opcjonalna obsługa transakcji.
B-drzewa z kompresowanymi indeksami. To wam się przyda, jakbyście mieli wieeeelkie bazy ;) Wystarczy powiedzieć, że znacząco wpływa na czas wyszukiwania i pobierania danych (wierszy) z bazy.
Istnieje możliwość "osadzenia" (ang. embed) serwera MySQL w aplikacji, którą piszemy. Jeśli ktoś potrzebuje funkcjonalności systemu baz danych, a niekoniecznie chce się bawić w klient-serwer, to czemu nie?
Duża liczba typów danych w kolumnach. Liczby, ciągi znakowe, obiekty binarne (BLOB), data & czas, typy wyliczeniowe, zestawy. Na uwagę zasługuje fakt, że w MySQL możemy daną kolumnę dostosować do pewnej wielkości danych, które zamierzamy w niej przechowywać (np. TINYINT, a nie INT), tym samym uzyskujemy większą wydajność i mniejsze zużycie pamięci (również dyskowej). Istnieje możliwość definiowania niektórych typów danych jako narodowych (różne standardy kodowania chociażby).
Obsługa klauzul agregujących i grupujących SQL.
Złączenia zewnętrzne (LEFT & RIGHT).
Komenda SHOW pozwalająca przeglądać informacje na temat baz, tabel i indeksów. Komenda EXPLAIN opisująca pracę optymalizatora zapytań.
Bardzo prosty (z punktu widzenia administratora) system zabezpieczeń. Wszystkie hasła są szyfrowane.
Połączenia z serwerem przez: TCP/IP, ODBC, JDBC.
Lokalizacja (w sensie językowym) serwera. Komunikaty m.in. po polsku.
Instalację oprogramowania przeprowadzimy oczywiście z pomocą naszego poldka. Logujemy się jako root, bądź używamy polecenia sudo, jeżeli mieliśmy je skonfigurowane do tego celu. Pierwszą rzeczą, którą będziemy musieli zrobić, jest ściągnięcie i zainstalowanie odpowiednich pakietów z repozytorium PLD. Można zrobić to używając zarówno trybu wsadowego, jak i interaktywnego. Podam oba sposoby, wybierz sobie ten, który bardziej Ci odpowiada :) (osobiście wolę tryb interaktywny, ze względu na tab-completion).
Najpierw uruchamiamy poldka. Można podać mu flagę
-n
, która oznacza źródło, z którego
zamierzamy ściągać pakiety. Jeśli nie podamy tej
flagi, wówczas poldek skorzysta z pierwszego źródła
wpisanego do pliku
/etc/poldek.conf. Ja korzystam ze
słowackiego serwera firmy Bentel Ltd., ale to nie ma
znaczenia.
W trybie wsadowym poldka, instalacja wygląda następująco:
# poldek -n bentel -i mysql mysql-client mysql-libs |
W trybie interaktywnym poldka, instalacja wygląda tak:
# poldek -n bentel Wczytywanie ftp://spirit.bentel.sk/mirrors/PLD/[...]/packages.dir.gz... Przeczytano 5116 pakietów Wczytywanie /root/.poldek-cache/packages.dir.dbcache.var.lib.rpm.gz... Przeczytano 450 pakietów Witaj w poldkowym trybie interaktywnym. Wpisz "help" aby otrzymać pomoc. poldek> |
Teraz przystępujemy do instalacji pakietów MySQL:
poldek> install mysql mysql-client mysql-libs |
poldek sam zadba o spełnienie wymaganych zależności.
Żeby móc sprawnie (i bezpiecznie) używać naszego świeżo zainstalowanego serwera, musimy go odpowiedno skonfigurować.
Otworzymy naszym ulubionym edytorem tekstu plik konfiguracyjny demona MySQL. W przypadku użycia edytora Vim wydajemy następującą komendę:
# vim /etc/mysql/clusters.conf |
Jeżeli nie zamierzamy zmieniać lokacji, w której będzie u nas pracował MySQL,
to po prostu odkomentujmy linijkę z MYSQL_DB_CLUSTERS
,
a jeżeli zamierzamy umieścić serwer MySQL w innym miejscu,
to należy tą linijkę odkomentować, ale dodatkowo zmienić ścieżkę.
# standard setting MYSQL_DB_CLUSTERS="/var/lib/mysql" |
Upewniamy się, że jesteśmy zalogowani na konsoli jako root i wydajemy polecenie:
# /etc/rc.d/init.d/mysql init |
Polecenie to będzie nam potrzebne tylko przy pierwszym uruchomieniu serwera - służy ono zainicjalizowaniu klastra baz danych. Powiedzmy, że nasz katalog jest "formatowany", ok? ;) Jeżeli pojawiłby wam się błąd, mówiący o duplikacie wpisu localhost-mysql dla klucza 1 - możecie go zignorować.j
Teraz możemy przystąpić już do edycji właściwiego pliku konfiguracyjnego RDBMS. Używając naszego ulubionego edytora otwieramy plik /var/lib/mysql/mysqld.conf
# vim /var/lib/mysql/mysqld.conf |
Teraz możemy przystąpić do jego edycji. Pierwszą grupą opcji, na jaką trafiamy jest:
# This section must be the first! [mysqld] datadir = /var/lib/mysql/mysqldb/db pid-file = /var/lib/mysql/mysqldb/mysql.pid port = 3306 socket = /var/lib/mysql/mysqldb/mysql.sock user = mysql |
datadir to oczywiście katalog, w którym składowane będą nasze bazy. Można zostawić tak jak jest.
user to użytkownik "pod którym" będzie działał nasz serwer, w sensie - uruchomienie serwera wygląda tak, jakby to ten użytkownik, reprezentowany przez zmienną user go uruchomił (proces należy do niego). Można zmienić, chociaż nie polecam. Nie zalecane jest wykorzystanie do tego użytkownika root!
To co nas natomiast bardzo interesuje, z dwóch względów, to opcja port
.
Chodzi o dwa przypadki:
Chcemy umożliwić dostęp do
naszego serwera baz danych z
zewnątrz, a admin naszej sieci
"łaskawie" przekierował nam
jakiś port z bramki na nasz
komputer, ale niestety nie
jest to port 3306, z którego
standardowo korzysta MySQL.
Edytujemy sobie opcje
port
w ten
sposób, żeby wskazywała na
ten, który mamy dostępny.
Mamy maszynę z zewnętrznym IP
(taką, do której można się
podłączyć z Internetu), nie
blokowaliśmy jednak dostępu do
MySQL, ale chcielibyśmy
podnieść choć troszeczkę
poziom bezpieczeństwa i
udostępnić serwer MySQL na
innym porcie. Wybieramy i
jakiś i wpisujemy go jako
wartość opcji
port
.
# Don't allow connections over the network by default skip-networking |
Jeżeli chcemy zablokować dostęp do serwera MySQL z
zewnątrz (z sieci), to... nie robimy nic. A jeśli
chcemy umożliwić innym komputerom łączenie się z
naszym serwerem, to należy wykomentować (dodać #)
linijkę z skip-networking
.
Gdyby nam się kiedyś coś popsuło (zapomnieliśmy hasła, nie możemy dostać się do bazy), to przyda się odkomentowanie tej opcji:
# Emergency option. Use only if you really need this. #skip-grant-tables |
Przydatną rzeczą (ale w sumie tylko, jeśli zamierzamy udostępniać bazy na zewnątrz), będzie włączenie logowania połączeń i zapytań (zwalnia pracę serwera). Dodam, że można oczywiście zmienić standardową ścieżkę, do której zapisywane są logi.
# Log connections and queries. It slows down MySQL so # it's disabled by default # log = /var/log/mysql/log |
Opcje z grupy set-variable wpływają bezpośrednio na pracę i wydajność serwera, nie będę się więc w nie zagłębiał. To trochę trudniejszy temat. Jak ktoś chce bardzo zoptymalizować pracę swojego serwera, to polecam lekturę dokumentacji MySQL. Przydatna jest również znajomość zagadnień relacyjnych baz danych i SQL'a. Przykładowo zerkniemy na jedną zmienną:
#set-variable = max_connections=100 |
Odkomentowanie tej linijki pozwoli nam na ustawienie maksymalnej liczby połączeń, które nasz MySQL będzie mógł przyjąć i obsłużyć w danej chwili. Wszystko zależy od tego, w jakim celu używamy naszego RDBMS - należy postawić sobie pytanie - "ile osób może chcieć podłączyć się do mojego serwera w jednej chwili i ile takich połączeń przypada średnio na jedną osobę?". Odpowiedź wpisujemy w zmienną max_connections. Innym pytaniem mogłoby być "czy skrypty obsługujące moje strony www korzystają ze stałych (persistent) połączeń?"
Ponieważ "Polacy nie gęsi i swój język mają" odkomentujemy jeszcze jedną linijkę w pliku konfiguracyjnym, aby włączyć polskie komunikaty:
# Language language = polish |
W tej chwili nasz serwer powinien być już skonfigurowany do pracy. Upewniamy się, że jesteśmy zalogowani na konsoli jako root i wydajemy polecenie:
# /etc/rc.d/init.d/mysql start |
Wywołanie tego skryptu startowego spowoduje uruchomienie demona MySQL w systemie. Upewnijmy się jeszcze, że nasz serwer baz danych rzeczywiście "wstał":
# /etc/rc.d/init.d/mysql status MySQL cluster /var/lib/mysql: running |
Jak widać na załączonym obrazku serwer działa. Ponieważ w tej chwili jest zainstalowany w sposób domyślny i dlatego mało bezpieczny, należy ustawić jakieś hasło dla użytkownika mysql:
# mysqladmin -u mysql -S /var/lib/mysql/mysqldb/mysql.sock password 'naszehaslo' |
Po opcji -S
podajemy scieżkę do pliku mysql.sock,
który powinien znajdować się w katalogu, w którym umieściliśmy MySQL.
Demon MySQL standardowo startuje wraz z systemem, ale przydaje się znać dwie komendy. Aby włączyć lub wyłączyć serwer, będąc zalogowanym jako root, bądź używając komendy sudo, wydajemy polecenie:
# /etc/rc.d/init.d/mysql start | stop |
wstawiając oczywiście opcje start
lub stop
,
w zależności od tego, co chcemy zrobić.
mysqladmin jest narzędziem, za pomocą którego
możemy tworzyć i usuwać bazy oraz przeładowywać konfigurację.
Nie będziemy go używać do wyłączania serwera,
bo od tego jest skrypt omówiony powyżej.
Narzędzie wywołuje się poleceniem mysqladmin,
a flagi i argumenty (opcje) polecenia służą do wykonywania określonych zadań.
Ponieważ wcześniej zmieniliśmy hasło dla użytkownika
mysql, winniśmy przy każdym poleceniu dodać
-u mysql
i -p
na końcu
(aby klient zapytał nas o hasło), np tak dla komendy status:
# mysqladmin -u mysql status -p Enter password: Uptime: 6720 Threads: 1 Questions: 1 Slow queries: 0 Opens: 6 \ Flush tables: 1 Open tables: 0 Queries per second avg: 0.000 |
Kilka przydatnych komend:
create nazwabazy - tworzy nową bazę danych o nazwie nazwabazy.
drop nazwabazy - usuwa bazę danych o nazwie nazwabazy
flush-privileges albo reload - obie opcje robią to samo - przeładowują tablice uprawnień. Powinniśmy wykonać przeładowanie zawsze, gdy dodamy np nowego użytkownika do jakiejś bazy, ponieważ do czasu przeładowania takie konto jest nieaktywne.
mysqldump to program, służący do "zrzucania" danych - czyli do robienia kopii zapasowych. Polecenie to jest przydatne w przypadku wykonywania kopii zapasowych podczas aktualizacji MySQL czy też przenoszenia danych na inny serwer.
Kilka przydatnych opcji:
--databases baza1 baza2...
- zrzuca dane z baz, których nazwy podaliśmy
w liście oddzielonymi spacjami.
--all-databases
- to samo
co wyżej ale dla wszystkich bazy.
--add-drop-table
-
dodaje DROP TABLE
do skryptów tworzących tabele z backup-u
(jak będziemy przywracać dane).
Przydatne, kiedy np chcemy przywrócić już istniejącą tabelę.
Spowoduje to najpierw jej usunięcie, a następnie
utworzenie od nowa z danych, które mieliśmy
w kopii zapasowej. Ogólnie, żeby uniknąć
ewentualnych problemów z duplikatami wierszy, itp.
warto tą opcję włączyć.
--no-create-info
- w kopii nie
zostanie zawarta informacja o tworzeniu tabel
(nazwy tabel, typy pól, indeksy itp.).
Przydatne, jeżeli chcemy zrobić kopię tylko danych,
a nie całej struktury bazy.
--no-data
- Ta opcja pozwala zapisać
samą informację o strukturze bazy i tabel,
nie zapisuje natomiast danych.
--opt nazwabazy
- tworzy kopię bazy
nazwabazy wraz z rozszerzonymi
informacjami MySQL, blokowaniem tabel, itd.
Chyba najczęściej stosowana opcja przy robieniu kopii zapasowych.
Należy pamiętać, że wynik polecenia mysqldump należy przekierować (>) do jakiegoś pliku. Podam może kilka przykładów użycia tego programu. Zrzucenie zawartości bazy baza1 do pliku baza1_bkp.sql:
# mysqldump -u mysql --databases baza1 > baza1_bkp.sql -p |
Stworzenie kopii zapasowej struktury bazy (bez danych) baza2 i zapisanie jej w pliku baza2_str.sql:
# mysqldump -u mysql --databases --no-data baza2 > baza2_str.sql -p |
Niezwykle przydatną opcją jest --opt
omówiona wcześniej.
Polecam jej stosowanie do wykonywania kopii całej bazy,
włącznie ze strukturą tabel i samymi danymi.
Aby stworzyć pełną kopię zapasową bazy baza1
i zapisać ją w pliku baza1_kopia.sql:
# mysqldump -u mysql --opt baza1 > baza1_kopia.sql -p |
Przywracanie baz wykonanych poleceniem mysqldump wygląda tak:
# mysql -u mysql baza1 < baza1_kopia.sql -p |
Inna metoda (w sumie różniąca się zapisem):
# mysql -u mysql -e 'source /sciezka_do_pliku/baza1_kopia.sql' baza1 -p |
NFS jest to usługa pozwalająca udostępniać zasoby dyskowe komputerom w sieci. Serwer udostępnia katalog(i) klientom, którzy mogą je podmontować i działać jak na lokalnym systemie plików. Ponadto można z niego uruchamiać stacje bezdyskowe lub tworzyć rozproszone systemy plików.
Najpierw instalujemy demona portmap (o ile nie jest już zainstalowany) oraz demona NFS poleceniem:
# poldek -i portmap nfs-utils |
Serwer NFS jest gotowy do pracy od razu po zainstalowaniu, wystarczy jedynie uruchomić usługę portmap, a następnie nfs (dokładnie w tej kolejności). Teraz możemy przejść do konfiguracji udziałów sieciowych. Do podstawowej pracy serwera nie ma potrzeby konfigurowania czegokolwiek, w pozostałych wypadkach należy przyjrzeć się plikowi /etc/sysconfig/nfsd, który może wyglądać następująco:
SERVICE_RUN_NICE_LEVEL="+0" #RPCMOUNTOPTIONS="--no-nfs-version 3" RPCNFSDCOUNT=8 NFSDTYPE=K |
SERVICE_RUN_NICE_LEVEL
- ustala priorytet serwera
#RPCMOUNTOPTIONS="--no-nfs-version 3"
- opcja dla jąder z serii 2.2, dla współczesnych
kerneli powinna być zakomentowana
RPCNFSDCOUNT
-
podaje liczbę instancji serwera, czyli ilu klientów
może obsłużyć jednocześnie
NFSDTYPE
- podaje czy serwer ma
pracować jako oddzielny demon (U), czy w trybie jądra (K).
Zalecane jest to drugie z rozwiązań, gdyż zapewnia
większą wydajność.
Modyfikacja pliku konfiguracji wymaga restartu uslugi.
Uruchomiliśmy serwer, teraz przyszedł czas na udostępnienie zasobów. W pliku /etc/exports definiuje się udostępniane katalogi, ich listę podajemy w postaci wierszy, które mają następującą składnię:
$katalog $klient1($opcja1,$opcja2,...) $klient2($opcja1,$opcja2,...) |
$katalog - udostępniony katalog. Warto tutaj wspomnieć, że jeżeli udostępniamy dany katalog to nie możemy udostępnić w nowej regułce katalogu będącego jego ojcem jak i synem, jeżeli leżą na tym samym systemie plików. Udostępnianie partycji FAT, itp. też nie jest dobrym rozwiązaniem.
$klient - IP lub nazwa komputera, któremu udostępniamy katalog. Można podać także całą sieć, wtedy zezwolimy wszystkim komputerom w sieci na przeglądanie i/lub zapisywanie do katalogu.
$opcje - tutaj możemy ustalić m.in. czy zasób ma być udostępniony tylko do odczytu, czy także do zapisu, oraz nałożyć inne ograniczenia. Wszystkie opcje opisane są w manualu (man exports).
Oto przykładowe wpisy do /etc/exports:
/srv/pub 192.168.0.1(ro) 192.168.0.2(rw) /home 192.168.0.0/255.255.255.0(rw) |
Pomijając sensowność wpisów, pierwszy wiersz daje prawo odczytu katalogu /srv/pub komputerowi 192.168.0.1 i prawo odczytu i zapisu komputerowi 192.168.0.2. Drugi z kolei daje prawo zapisu do katalogu /home komputerom z podsieci 192.168.0.0/24. Jeżeli modyfikujemy /etc/exports w trakcie pracy serwera to musimy poinformować demona, żeby ponownie odczytał plik konfiguracji. Przed tym możemy sprawdzić czy nasze wpisy są poprawne:
# exportfs -v |
Polecenie to wyświetli listę katalogów gotowych do wyeksportowania, jeśli któryś z udziałów nie jest wyświetlony, to prawdopodobnie popełniliśmy jakiś błąd w składni. Gdy jesteśmy pewni, że chcemy udostępnić udziały NFS, to wydajemy polecenie:
# exportfs -rv |
W PLD stworzono grupę systemową fileshare, która ma prawo do modyfikowania konfiguracji udziałów sieciowych (NFS i SMB), bez konieczności posiadania praw root-a. Aby nadać użytkownikowi takie prawo wystarczy zapisać go do tej grupy, opis zarządzania grupami użytkowników opisano w sekcja Grupy w rozdział Administracja.
Konfigurację klienta rozpoczynamy od zainstalowania i uruchomienia usługi portmap. Jeśli chcemy, aby zasoby NFS były montowane w trakcie startu systemu, instalujemy pakiet nfs-utils-clients, dostarczający wymagany rc-skrypt: /etc/rc.d/init.d/nfsfs.
Teraz przyszedł czas na połączenie się z zasobem NFS, w tym celu musimy go zamontować np.:
# mount serwer.net:/srv/pub /mnt/net -t nfs |
serwer.net to IP bądź nazwa naszego serwera, /srv/pub jest przykładowym udostępnionym katalogiem na serwerze (wpisaliśmy go wcześniej do /etc/exports). Katalog /mnt/net to przykładowe miejsce podmontowania zasobu. Można użyć dodatkowo flagi -o a po niej podać potrzebne nam opcje montowania. Pełną listę opcji znajdziemy w podręczniku systemowym: man 5 nfs.
Jeśli nic nie stoi na przeszkodzie abyśmy podłączali zasób przy starcie systemu, to dodajemy wpis do /etc/fstab:
192.168.0.1:/srv/pub /mnt/net nfs rw,hard,intr 0 0 |
Wpis wygląda znajomo, ale uwagę zwracają opcje hard i intr. Otóż hard oznacza, że programy korzystające z zasobów NFS w momencie awarii serwera zostaną zawieszone w oczekiwaniu na dostęp do danych i nie będzie możliwości ich odwieszenia w postaci polecenia kill, chyba, że dodamy opcję intr dzięki czemu będziemy mogli zabić dany proces. Zamiast hard możemy użyć opcji soft, jednak w przypadku awarii serwera NFS sygnalizuje błąd programom korzystającym z zasobów. Wadą tego rozwiązania jest to, że nie wszystkie programy potrafią poradzić sobie z takim komunikatem i może dojść do utraty danych.
Musimy zadbać o bezpieczeństwo naszego serwera, podstawowym sposobem zabezpieczania zasobu jest ograniczenie dostępu. Możemy go ograniczać za pomocą ustawień w pliku /etc/exports, za pomocą filtra pakietów lub plików /etc/tcpd/hosts.allow i /etc/tcpd/hosts.deny, co zostało przedstawione poniżej.
Najpierw blokujemy wszystkim dostęp do naszych usług wpisując do pliku pliku /etc/tcpd/hosts.deny:
portmap:ALL lockd:ALL mountd:ALL rquotad:ALL statd:ALL |
Następnie w /etc/tcpd/hosts.allow wpisujemy komputery, którym zezwalamy na korzystanie z wymienionych usług. Możemy zarówno wpisać adresy IP komputerów jak i całą podsieć.
portmap: 192.168.0.0/255.255.255.0 lockd: 192.168.0.0/255.255.255.0 rquotad: 192.168.0.0/255.255.255.0 mountd: 192.168.0.0/255.255.255.0 statd: 192.168.0.0/255.255.255.0 |
NFS nie obsługuje autoryzacji na poziomie użytkownika, a jedynie na poziomie hosta. Z tego względu nie bardzo nadaje się do udostępniania w Internecie, jeśli to tylko możliwe lepiej użyć protokołu FTP lub WebDAV.
Wolne działanie protokołu NFS wskazuje przeważnie na brak odpowiedniego dostrojenia połączenia, wystarczy ustawić kilka opcji by uzyskać zaskakująco duży wzrost wydajności. Podane poniżej zalecenia dotyczą konfiguracji klienta.
Na początek zajmiemy się opcjami rsize i wsize. Dzięki nim możemy zwiększyć szybkość odczytu i zapisu plików na serwer. Manual systemowy radzi by ustawić im na wartości: rsize=8192 i wsize=8192. Linijka w pliku /etc/fstab będzie wyglądać teraz następująco:
192.168.0.1:/usr/local /usr/local nfs rw,hard,intr,rsize=8192,wsize=8192 0 0 |
Domyślnie NFS działa w oparciu o protokół UDP, doświadczenie pokazuje jednak, że przełączenie w tryb TCP może w niektórych wypadkach zwiększyć szybkość przesyłu danych. Niestety nie każdy serwer NFS obsługuje połączenia TCP, więc nie wszędzie możemy użyć tej opcji. Na szczęście PLD zawiera demona pozwalającego na używanie TCP. Aby włączyć tą opcję do linijki w pliku /etc/fstab dodajemy wpis tcp np.:
192.168.0.1:/usr/local /usr/local nfs rw,hard,intr,tcp 0 0 |
W przypadku protokołu NFS należy trochę eksperymentować z ustawieniami, na początek dobrym pomysłem może być użycie obu powyższych wskazówek. Więcej o dostrajaniu NFS-a można odnaleźć w podręczniku systemowym.
Power DNS zwany w dalszej części tego dokumentu jako PDNS jest zaawansowanym i bardzo efektywnym serwerem nazw. Jego możliwości współpracy z LDAP lub bazami SQL (Mysql i Postgresql) dają szerokie możliwości tworzenia skryptów lub interface zarządzających. Sam PDNS jest uważany za zdecydowanie bezpieczniejszy niż Bind, a także od niego szybszy - zwłaszcza przy większej ilości obsługiwanych domen.
W tym rozdziale zostanie omówiona podstawowa instalacja, konfiguracja z bazą Postgresql, a także wstępna konfiguracja przykładowej domeny. Oczywiście więcej szczegółów możemy znaleźć w oryginalnej dokumentacji.
Instalacja przebiega standardowo za pomocą poldka.
poldek> install pdns |
Do poprawnego działania naszej bazy potrzebujemy także postgresql (możemy także wykorzystać mysql lub ldap, a nawet pliki konfiguracyjne Bind-a). Tak więc jeżeli nie mamy Postgresql to instalujemy go i poprawnie konfigurujemy.
Następnym krokiem będzie stworzenie bazy obsługiwanej przez PDNS w Postgresql. W tym celu możemy wykorzystać klienta dostarczanego razem z Postgresql - psql. Możemy także do tego celu użyć innych wygodnych narzędzi np. phpPgAdmin
Najpierw z konta użytkownika uprawnionego do operacji na bazie tworzymy bazę:
$ createdb -U postgres powerdns |
Tworzymy także użytkownika dla w/w bazy:
$ createuser -P -U postgres pdns Enter password for user "pdns": Enter it again: Shall the new user be allowed to create databases? (y/n) n Shall the new user be allowed to create more new users? (y/n) n CREATE USER |
Teraz za pomocą swojego ulubionego klienta Postgresql wykonujemy poniższe polecenia SQL w celu stworzenia szkieletu bazy:
create table domains ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, master VARCHAR(20) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(6) NOT NULL, notified_serial INT DEFAULT NULL, account VARCHAR(40) DEFAULT NULL ); CREATE UNIQUE INDEX name_index ON domains(name); CREATE TABLE records ( id SERIAL PRIMARY KEY, domain_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(6) DEFAULT NULL, content VARCHAR(255) DEFAULT NULL, ttl INT DEFAULT NULL, prio INT DEFAULT NULL, change_date INT DEFAULT NULL, CONSTRAINT domain_exists FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ); CREATE INDEX rec_name_index ON records(name); CREATE INDEX nametype_index ON records(name,type); CREATE INDEX domain_id ON records(domain_id); create table supermasters ( ip VARCHAR(25) NOT NULL, nameserver VARCHAR(255) NOT NULL, account VARCHAR(40) DEFAULT NULL ); GRANT SELECT ON supermasters TO pdns; GRANT ALL ON domains TO pdns; GRANT ALL ON domains_id_seq TO pdns; GRANT ALL ON records TO pdns; GRANT ALL ON records_id_seq TO pdns; |
W /etc/pdns/pdns.conf konfigurujemy działanie programu PDNS. Przykładowa konfiguracja PDNSa współpracującego z bazą Postgresql może wyglądać następująco:
#chroot=/some/where # If set, chroot to this directory for more security config-dir=/etc/pdns/ # Location of configuration directory (pdns.conf) launch=gpgsql # Launch this backend #gpgsql-socket=/var/lib/pgsql/postmaster.pid gpgsql-dbname=powerdns # Nazwa bazy danych w psql gpgsql-user=pdns # Użytkownik bazy w psql gpgsql-password=hasło_do_bazy_pdns module-dir=/usr/lib/pdns # Default directory for modules #load-modules= # Load this module - supply absolute or relative path #local-address=0.0.0.0 # Local IPv4 address to which we bind #local-ipv6=:: # Local IPv6 address to which we bind #use-logfile=no # Use a log file or syslog #logfile=var/log/pdns.log # Logfile to use allow-recursion=IP_ZEWN_DNS/maska,IP_ZEWN_DNS/maska # Tu podajemy adresy zewn. serwerów DNS np. # allow-recursion=194.204.152.34/24,194.204.159.1/24 # nameserver setgid=djbdns # If set, change group id to this gid for more security setuid=pdns # If set, change user id to this uid for more security #slave=no # Act as a slave (Ustawiamy na YES w przypadku # pracy serwera PDNS jako SLAVE) socket-dir=/var/run # Where the controlsocket will live webserver=yes # Włączenie usługi monitorowania pracy PDNS przez WWW webserver-address=10.1.1.1 # Adres IP strony monitorującej pracę PDNS webserver-password=hasło_do_strony_monitorującej webserver-port=8088 # port strony monitorującej |
Krzyżyk "#" na początku oznacza komentarz bądź wyłączenie danej opcji. Oryginalne teksty komentarzy są na tyle czytelne, że tylko niektóre opcje skomentowalismy po polsku.
Praktycznie PDNS jest gotowy do pracy. Musimy jeszcze wypełnić treścią bazę - czyli dodać domenę (domeny). Przykładową domenę zaprezentujemy w formie tzw. "dump-a" bazy. Jest to na tyle czytelne, że skomentowane zostaną tylko niektóre aspekty.
-- -- PostgreSQL database dump -- SET client_encoding = 'UNICODE'; SET check_function_bodies = false; SET client_min_messages = warning; SET search_path = public, pg_catalog; -- -- Name: domains_id_seq; Type: SEQUENCE SET; Schema: public; Owner: pdns -- SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('domains', 'id'), 1, true); -- -- Name: records_id_seq; Type: SEQUENCE SET; Schema: public; Owner: pdns -- SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('records', 'id'), 16, true); -- -- Data for Name: domains; Type: TABLE DATA; Schema: public; Owner: pdns -- INSERT INTO domains VALUES (1, 'foo.com', NULL, NULL, 'NATIVE', NULL, NULL); INSERT INTO domains VALUES (2, '1.1.10.in-addr.arpa', NULL, NULL, 'NATIVE', NULL, NULL); -- W pierwszym ID podajemy domenę 'foo.com' -- W drugim ID definiujemy domenę odwrotną dla danego IP -- -- Data for Name: records; Type: TABLE DATA; Schema: public; Owner: pdns -- -- Poniżej zgodnie z określonymi ID definiowane są kolejno strefy INSERT INTO records VALUES (2, 1, 'localhost.foo.com', 'A', '127.0.0.1', 120, NULL, NULL); INSERT INTO records VALUES (3, 1, 'www.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (5, 1, 'dns.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (6, 1, 'ftp.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (7, 1, 'poczta.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (8, 1, 'pop3.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (9, 1, 'smtp.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (10, 1, 'ssh.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (11, 1, 'jabber.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (1, 1, 'foo.com', 'SOA', 'localhost user.foo.com 1', 86400, NULL, NULL); INSERT INTO records VALUES (16, 1, 'foo.com', 'TXT', 'Serwer PDNS', 300, NULL, NULL); INSERT INTO records VALUES (17, 1, 'foo.com', 'NS', 'ns.foo.com', 300, NULL, NULL); INSERT INTO records VALUES (4, 1, 'mail.foo.com', 'A', '10.1.1.1', 120, NULL, NULL); INSERT INTO records VALUES (18, 1, 'foo.com', 'MX', 'mail.foo.com', 300, 5, NULL); INSERT INTO records VALUES (19, 1, 'foo.com', 'A', '10.1.1.1', 300, 0, NULL); -- Poniżej definiujemy rekordy SRV dla serwera Jabber INSERT INTO records VALUES (12, 1, '_jabber._tcp.jabber.foo.com', 'SRV', '0 5269 foo.com', 300, 10, NULL); INSERT INTO records VALUES (13, 1, '_xmpp-server._tcp.jabber.foo.com', 'SRV', '0 5269 foo.com', 300, 10, NULL); INSERT INTO records VALUES (14, 1, '_xmpp-client._tcp.jabber.foo.com', 'SRV', '0 5222 foo.com', 300, 10, NULL); -- Domena odwrotna INSERT INTO records VALUES (15, 2, '1.1.1.10.in-addr.arpa', 'PTR', 'foo.com', 86400, NULL, NULL); INSERT INTO records VALUES (20, 2, '1.1.10.in-addr.arpa', 'SOA', 'localhost root.localhost', 86400, NULL, NULL); INSERT INTO records VALUES (21, 2, '1.1.10.in-addr.arpa', 'NS', 'nc.foo.com', 86400, NULL, NULL); -- -- Data for Name: supermasters; Type: TABLE DATA; Schema: public; Owner: pdns -- -- -- PostgreSQL database dump complete -- |
Wszelkie zmiany lub dodawanie nowych domen możemy wykonywać na bazie danych lub wykorzystując do tego odpowiednie skrypty. Teraz możemy uruchomić demona PDNS wykorzystując skrypt:
# /etc/init.d/pdns start |
Należy pamiętać, że jeżeli wcześniej używalismy BINDa bądź innnego demona do obsługi nazw domenowych, należy go przed uruchomieniem PDNS wyłączyć.
Po uruchomieniu serwisu możemy za pomocą przeglądarki http wejść na stronę monitorującą pracę PDNS (odpowiednie opcje dotyczące tej usługi znajdziemy w /etc/pdns/pdns.conf). Wywołanie zgodne z przykładowym wpisem w pdns.conf to http://10.1.1.1:8088. Na stronie tej możemy odnaleźć wiele cennych informacji dotyczących pracy naszego serwera nazw.
Postfix jest MTU czyli w wielkim skrócie demonem poczty elektronicznej. No tak, w sumie powiecie ściągamy poldkiem instalujemy i działa... działa ale chcemy coś więcej... chcemy by nasz smtpd był ładnie skonfigurowany.
Ściągamy to co nam będzie potrzebne. Wiadomo... postfix i dodatki, które mu są potrzebne:
poldek -i postfix cyrus-sasl cyrus-sasl-plain cyrus-sasl-saslauthd \ cyrus-sasl-login |
A tutaj coś co będzie nam potrzebne do tworzenia certyfikatów.
poldek -i openssl-tools |
A tutaj coś żebyśmy mogli pobrać pocztę z serwera.
poldek -i tpop3d inetd rc-inetd |
Przyszedł czas na konfigurację postfix-a.
# echo 'pwcheck_method:saslauthd' > /etc/sasl/smtpd.conf |
Należy jeszcze sprawdzić czy w /etc/pam.d/ znajduje się plik smtp, jeżeli nie to należy przegrać na to miejsce przykładowy konfig z /usr/share/doc/cyrus-sasl-saslauthd-*/cyrus.pam.gz , rozpakować i nazwać plik smtp.
Uruchom saslauthd:
# /etc/rc.d/init.d/saslauthd start |
Uruchom postfix-a:
# /etc/rc.d/init.d/postfix start |
Teraz chcemy, żeby postfix wymagał autentykacji:
# postconf -e smtpd_sasl_auth_enable=yes # postconf -e smtpd_recipient_restrictions=permit_mynetworks, \ reject_sender_login_mismatch,permit_sasl_authenticated, \ reject_unauth_destination |
Teraz linijka dla popsutych Outlook-ów.
# postconf -e broken_sasl_auth_clients=yes # postconf -e mynetworks=127.0.0.0/8,192.168.1.1/32 |
Restart postfix-a:
# /etc/rc.d/init.d/postfix restart |
No i to wszystko razem powinno wyglądać tak:
# postconf -n alias_database = hash:/etc/mail/aliases alias_maps = hash:/etc/mail/aliases biff = no broken_sasl_auth_clients = yes command_directory = /usr/sbin config_directory = /etc/mail daemon_directory = /usr/lib/postfix debug_peer_level = 2 default_privs = nobody mail_owner = postfix mail_spool_directory = /var/mail myhostname = networking.ee mynetworks = 127.0.0.0/8, 192.168.1.1/32, 192.168.1.1/32 myorigin = $myhostname queue_directory = /var/spool/postfix setgid_group = maildrop smtpd_recipient_restrictions = permit_mynetworks, \ reject_sender_login_mismatch,permit_sasl_authenticated, \ reject_unauth_destination smtpd_sasl_auth_enable = yes |
Włączamy teraz szyfrowanie wysyłania poczty oraz transmisji między MX-ami dla różnych domen
Następnie generujemy certyfikat SSL. Podczas generowania certyfikatu będziesz musiał odpowiedzieć na kilka prostych pytań.
Robimy to w sposób następujący:
# openssl genrsa -out key.pem 1024 # openssl req -new -x509 -key key.pem -out cert.pem # cat cert.pem >> key.pem; mv -f key.pem cert.pem # cp cert.pem /var/lib/openssl/certs/nasza.domena.pl.pem |
Do pliku /etc/mail/main.cf należy dodać 4 linijki, takie jak poniżej:
smtpd_tls_cert_file = /var/lib/openssl/certs/nasza.domena.pl.pem smtpd_tls_key_file = $smtpd_tls_cert_file smtpd_use_tls = yes smtp_use_tls = yes |
W pliku /etc/mail/master.cf należy zastąpić aktualną linijkę czyli tą z domyślnej instalacji:
#smtps inet n - n - - smtpd na naszą aktualną: smtps inet n - y - - smtpd -o smtpd_tls_wrappermode=yes \ -o smtpd_sasl_auth_enable=yes |
Jeżeli posiadamy więcej niż jedną domenę na serwerze to w /etc/mail/main.cf dopisujemy:
mydestination = $myhostname, jakas.domena.pl, \ costam.gdziestam.pl, PLD.biz.pl |
Jeżeli chcemy aby nasz postfix obsługiwał wirtualne domeny (przyznawał się do nich) dopisujemy w /etc/mail/main.cf takie trzy linijki:
relay_domains = hash:/etc/mail/domains virtual_maps = hash:/etc/mail/virtual smtpd_sender_login_maps = hash:/etc/mail/virtual |
Tworzymy /etc/mail/domains i robimy nastepujące wpisy:
# plik domains, w nim wpisane domeny dla których nasz serwer #pocztę będzie przyjmował. pld-linux.org relay 81.0.225.27 relay |
Do /etc/mail/virtual dopisujemy na przykład coś takiego:
# plik virtual, w nim wpisane są konta w domenach które obsługujemy # schemat wpisu # ktostam.nazwisko@domena.pl konto_w_systemie rafal.drozd@networking.ee grifter rafal.drozd@jakas.domena.pl grifter rafal.drozd@costam.gdziestam.pl grifter rafal.drozd@PLD.biz.pl grifter virusalert@networking.ee grifter # to ostatnie będzie nam później do amavisa potrzebne :) |
Teraz musimy wklepać
# postmap /etc/mail/domains # postmap /etc/mail/virtual |
No i restart postfixa
# /etc/rc.d/init.d/postfix restart |
Dodatkowe wpisy które poprawią pracę naszego postfix-a Edytujemy /etc/mail/main.cf i dodajemy następujące wpisy:
disable_vrfy_command = yes # liczba odbiorców max 100 dla jednego maila smtpd_recipient_limit = 100 smtpd_error_sleep_time = 5 smtpd_hard_error_limit = 10 smtpd_helo_required = yes # ogranicz do 2 mega [2000000] wielkość przesyłki, właściwie mając \ # dobre łącze można # wpisać 10 mega [10000000] message_size_limit = 2000000 # spam fight! :> header_checks = regexp:/etc/mail/header_checks mail_name = PLD - $myhostname smtpd_banner = $myhostname ESMTP $mail_name. We block/report all spam. smtpd_soft_error_limit = 60 default_process_limit = 3 maps_rbl_domains = relays.ordb.org smtpd_client_restrictions = reject_maps_rbl |
Tworzymy /etc/mail/header_checks i dopisujemy:
/^To: .*friend@public/ REJECT Header-To address revoked \ due to too much spam. /^Subject: ADV\W/ REJECT Header-Subject beginning with \ "spam" ADV tag rejected. |
# postconf -n alias_database = hash:/etc/mail/aliases alias_maps = hash:/etc/mail/aliases biff = no broken_sasl_auth_clients = yes command_directory = /usr/sbin config_directory = /etc/mail daemon_directory = /usr/lib/postfix debug_peer_level = 2 default_privs = nobody default_process_limit = 3 disable_vrfy_command = yes header_checks = regexp:/etc/mail/header_checks mail_name = PLD - $myhostname mail_owner = postfix mail_spool_directory = /var/mail maps_rbl_domains = relays.ordb.org message_size_limit = 2000000 myhostname = networking.ee mynetworks = 127.0.0.0/8,192.168.1.1/32 myorigin = $myhostname queue_directory = /var/spool/postfix relay_domains = hash:/etc/mail/domains setgid_group = maildrop smtp_use_tls = yes smtpd_banner = $myhostname ESMTP $mail_name. We block/report all spam. smtpd_client_restrictions = reject_maps_rbl smtpd_error_sleep_time = 5 smtpd_hard_error_limit = 10 smtpd_helo_required = yes smtpd_recipient_limit = 100 smtpd_recipient_restrictions = permit_mynetworks, \ reject_sender_login_mismatch,permit_sasl_authenticated, \ reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_soft_error_limit = 60 smtpd_tls_cert_file = /var/lib/openssl/certs/nasza.domena.pl.pem smtpd_tls_key_file = $smtpd_tls_cert_file smtpd_use_tls = yes virtual_maps = hash:/etc/mail/virtual smtpd_sender_login_maps = hash:/etc/mail/virtual |
Zawartość master.cf
# grep -v ^# /etc/mail/master.cf smtp inet n - n - - smtpd smtps inet n - y - - smtpd -o smtpd_tls_wrappermode=yes \ -o smtpd_sasl_auth_enable=yes pickup fifo n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr fifo n - n 300 1 qmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce flush unix n - n 1000? 0 flush smtp unix - - n - - smtp showq unix n - n - - showq error unix - - n - - error local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - n - - lmtp cyrus unix - n n - - pipe flags=R user=cyrus \ argv=/usr/lib/cyrus/deliver -e -m ${extension} ${user} uucp unix - n n - - pipe flags=Fqhu user=uucp \ argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) ifmail unix - n n - - pipe flags=F user=ftn \ argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient) bsmtp unix - n n - - pipe flags=Fq. user=foo \ argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient |
tpop3d, czyli coś dzięki czemu będziemy mogli pobrać pocztę z serwera.
No i włączamy tpop3d-a
# /etc/rc.d/init.d/tpop3d start |
Przystępujemy do instalacji i konfiguracji amavisa + mks :)
Instalujemy poldkiem mks, serwer mksd, bazy, oraz skrypt aktualizujący bazy
poldek -i mks mksd mks-bases mks-updater mksd-clients |
Teraz ściągamy jakiegoś wirusa i sprawdzamy czy mks32 działa...
# wget http://www.eicar.org/download/eicar.com # mks32 eicar.com mks_vir: init... 1.9.0 for Linux i386, 2003.07.02 mks_vir: database version 2003 7 11 13 23 mks_vir: init OK, scan mode mks_vir: check file(s) mks_vir: file: eicar.com mks_vir: --heuristic for virus Eicar.Test mks_vir: --heuristic for virus Eicar.Test mks_vir: status: virus found: eicar.com mks_vir: exit code: 0x01 |
Jeśli dostaliście coś takiego, tzn. że wszystko jest ok ;)
Teraz przetestujemy czy mksd działa poprawnie.
# /etc/rc.d/init.d/mksd start # mkschk /root/skaner/eicar.com VIR Eicar.Test /root/skaner/eicar.com |
Jeśli dostałeś coś takiego, tzn. że wszystko jest okej. mksd przyśpiesza znacznie pracę na słabych maszynach... wtedy znacznie odczujesz.
Instalujemy teraz amavisa
poldek -i amavisd-new |
No i teraz najgorsze ;)
Edytujemy /etc/amavisd.conf
Odkomentuj linię:
@bypass_spam_checks_maps = (1); # uncomment to DISABLE anti-spam code |
Pozmieniaj odpowiednie linie
$mydomain = 'twoja.domena.pl'; # (no useful default) $daemon_user = 'amavis'; # (no default; customary: vscan or amavis) $daemon_group = 'amavis'; # (no default; customary: vscan or amavis) |
Możemy tutaj ustawić użytkownika amavis. Dodatkowo należy dopisać mksd do grupy amavis, dzięki czemu będzie on mógł korzystać z katalogów z częściami maili amavisa.
# grep amavis /etc/group amavis:x:116:mksd |
Zakomentuj linię:
#$unix_socketname = "$MYHOME/amavisd.sock"; # amavis helper protocol socket |
Jeśli nie chcesz żeby amavis używał pewnych pakerów to zakomentuj odpowiednie linie, np.
#$unrar = 'unrar'; |
Usuń wszystkie wpisy na temat antywirusów (@av_scanners = ) i zastąp to wpisem z pliku README z archiwum mksd:
['MkS_Vir daemon', 'mksscan', '-s -Q {}', [0], [1..7], qr/^... (\S+)/ ], |
Usuń wpisy z @av_scanners_backup =
W swoim systemie pocztowym (postfix) utwórz użytkownika (lub alias) "virusalert" lub pozmieniaj wpisy:
$mailfrom_notify_admin $mailfrom_notify_recip $virus_admin |
My zrobiliśmy wcześniej aliasa dla virusalert ;)
Ja sobie jeszcze dopisałem:
$hdrfrom_notify_sender = $mailfrom_notify_admin; |
Jeśli nie chcesz aby nadawcy listów oraz admini dostawali informacje o wirusach w domyślnym języku (English) to odkomentuj linie i zrób własne wpisy w /var/amavis/*.txt
# $notify_sender_templ = read_text('/var/amavis/notify_sender.txt'); # $notify_virus_sender_templ=read_text('/var/amavis/notify_virus_sender.txt'); # $notify_virus_admin_templ = read_text('/var/amavis/notify_virus_admin.txt'); # $notify_virus_recips_templ=read_text('/var/amavis/notify_virus_recips.txt'); i zmień #$bdy_encoding = 'iso-8859-1'; # (default: 'iso-8859-1') na $bdy_encoding = 'iso-8859-2'; # (default: 'iso-8859-1') |
Według licencji powinieneś umieścić w notify_sender.txt reklamę http://www.mks.com.pl gdyż jest do warunek licencji na używanie mks. Na końcu pliku /usr/sbin/amavisd znajdują się przykładowe szablony.
W pliku /etc/mail/master.cf dopisujemy nową linię:
localhost:10025 inet n - n - - smtpd |
No i restart postfix-a, amavisd-a i mks
# /etc/rc.d/init.d/postfix restart # /etc/rc.d/init.d/mksd restart # /etc/rc.d/init.d/amavisd restart |
Teraz testujemy amavis-a:
# telnet 127.0.0.1 10024 Trying 127.0.0.1.10024... Connected to localhost. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready MAIL FROM: <root> 250 2.1.0 Sender root OK RCPT TO: <root> 250 2.1.5 Recipient root OK DATA 354 End data with <CR><LF>.<CR><LF> Subject: test bez wirusa test . 250 2.6.0 Ok, id=29569-01, from MTA: 250 Ok: queued as A1017FD1E |
Dostałeś 250? To znaczy, ze amavisd sprawdził przesyłkę :) nie wierzysz? tail -n 100 -f /var/log/maillog
A teraz sprawdzimy jak reaguje na przesyłkę z wirusem:
# telnet 127.0.0.1 10024 Trying 127.0.0.1.10024... Connected to localhost. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready MAIL FROM: <root> 250 2.1.0 Sender root OK RCPT TO: <root> 250 2.1.5 Recipient root OK DATA 354 End data with <CR><LF>.<CR><LF> Subject: test z wirusem X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* . 250 2.5.0 Ok, but 1 BOUNCE |
No i znalazł wirusa :) w logach mamy:
Jul 14 04:17:43 networking amavis[29569]: (29569-02) INFECTED (Eicar.Test), <root> -> <root>, quarantine virus-20030714-041716-29569-02, \ Message-ID: , Hits: - |
Teraz jeszcze mała obróbka plików cf od postfix-a ;)
Edytujemy /etc/mail/master.cf
Linijkę: smtp inet n - n - - smtpd zamieniamy na: smtp inet n - n - - smtpd -o \ content_filter=smtp-amavis:[127.0.0.1]:10024 |
oraz dodajemy jeszcze:
smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o disable_dns_lookups=yes |
Restart postfix-a:
# /etc/rc.d/init.d/postfix restart |
i powinno wszystko nam pięknie latać:)
Wyślij sobie eicar.com w załączniku a zobaczysz, że smtp odrzuci i dostaniesz maila z alertem :]
PostgreSQL: Najbardziej zaawansowany system zarządzania bazą danych na świecie typu OpenSource - w taki oto sposób grupa rozwijająca SZBD PostgreSQL reklamuje swój produkt. SZBD PostgreSQL jest implementacją języka SQL, która zawiera w sobie bardzo wiele jego elementów, a na dodatek wprowadza wiele własnych rozszerzeń. Porównywany z mySQL oddaje mu pola przy małych instalacjach, które w prosty, a szybki sposób mają obsługiwać bazę danych - typu małe portale internetowe, proste bazy, i tym podobne. Jednakże SZBD PostgreSQL dostaje skrzydeł w większych projektach, jest często porównywany do bardzo rozbudowanego SZBD Oracle. Cechy SZBD PostgreSQL to między innymi:
osadzane języki proceduralne wykonywane przez bazę danych (plperl, pl/perlu, plpgsql, plpython, pltcl, pl/tcl)
możliwość tworzenia funkcji w PostgreSQLu w języku C, kompilowanych do bibliotek dynamicznych
sterowniki dostępu do bazy z języków C, C++, python, perl, czy Java (poprzez JDBC), ODBC
wysoce zaawansowana implementacja standardu SQL, obejmująca SQL/92
obsługa BLOB (Binary Large OBjects) -- dużych obiektów binarnych, takich jak pliki graficzne, itp.
obsługa pól typu AUTOINCREMENT jako SERIAL lub SEQUENCE
licencję BSD, która umożliwia zamykanie kodu SZBD PostgreSQL przy dokonywaniu modyfikacji, co jest istotne w rozwiązaniach biznesowych
Uruchamiamy program poldek:
# poldek |
Wykonujemy:
poldek>ls -l postgresql-* |
Przykładowy wynik to:
poldek> ls -l postgresql-* package build date size postgresql-7.4-0.8 2003/12/16 20:45 8.8 MB postgresql-backend-devel-7.4-0.8 2003/12/16 20:45 1.4 MB postgresql-clients-7.4-0.8 2003/12/16 20:45 1.5 MB postgresql-devel-7.4-0.8 2003/12/16 20:45 93.0 KB postgresql-doc-7.4-0.8 2003/12/16 20:45 5.3 MB postgresql-ecpg-7.4-0.8 2003/12/16 20:45 479.0 KB postgresql-ecpg-devel-7.4-0.8 2003/12/16 20:45 17.0 KB postgresql-libs-7.4-0.8 2003/12/16 20:45 252.0 KB postgresql-module-pgcrypto-7.4-0.8 2003/12/16 20:45 91.0 KB postgresql-module-plperl-7.4-0.8 2003/12/16 20:45 30.0 KB postgresql-module-plpgsql-7.4-0.8 2003/12/16 20:45 100.0 KB postgresql-module-plpython-7.4-0.8 2003/12/16 20:45 35.0 KB postgresql-module-pltcl-7.4-0.8 2003/12/16 20:45 44.0 KB postgresql-static-7.4-0.8 2003/12/16 20:45 303.0 KB postgresql-tcl-7.4-0.8 2003/12/16 20:45 38.0 KB postgresql-tcl-devel-7.4-0.8 2003/12/16 20:45 0.0 KB postgresql-tcl-static-7.4-0.8 2003/12/16 20:45 36.0 KB 17 packages, 18.6 MB poldek> |
Do poprawnego działania SZBD PostgreSQL konieczne są następujące pakiety:
postgresql
postgresql-clients
postgresql-libs
Zatem można przystąpić do ich instalacji, wpisując następujące polecenie:
# poldek -i postgresql postgresql-clients postgresql-libs |
Aby SZBD PostgreSQL skorzystał z wewnętrznych języków plpgsql czy też plphpython należy doinstalować pakiety postgresql-module-plpgsql
# poldek -i postgresql-module-plpgsql |
oraz
root# poldek -i postgresql-module-plpython |
Edytujemy plik /etc/sysconfig/postgresql:
# vim /etc/sysconfig/postgresql |
I wybieramy odopowiednie podejście do bazy danych. Polecam standard setting. Po edycji wykonanie komendy
# grep PG_DB_CLUSTERS /etc/sysconfig/postgresql | egrep -v ^# |
powinno dać wynik:
PG_DB_CLUSTERS="/var/lib/pgsql" |
poldek -i localedb-src && localedb-gen -l pl_PL && echo LANG=pl_PL \ >>/etc/sysconfig/i18n |
TODO: locale tylko dla PostgreSQLa.
Wykonujemy polecenie:
# service postgresql init |
Podczas inicjalizacji SZBD PostgreSQL stworzy pliki potrzebne mu do przechowywania tabel, tabele systemowe jak i bazy danych template0 i template1 konieczne do jego dalszego działania. Inicjalizacja PostgreSQLa nie jest równoznaczna z jego uruchomieniem, o czym dalej.
W punkcie (3) (<- TODO, shufla docbook lame) został zainicjalizowany cluster, w którym to można dodawać bazy danych. Trzeba teraz odpowiednio skonfigurować tenże cluster. Przyda się edycja plików ${PG_DB_CLUSTERS}/{postgresql.conf,pg_hba.conf}:
# vim /var/lib/pgsql/{postgresql.conf,pg_hba.conf} |
Przydatna opcja to tcpip_socket = true
w pliku /var/lib/pgsql/postgresql.conf.
# su - postgres -c 'psql template1' template1=# CREATE USER uzytkownik WITH ENCRYPTED PASSWORD 'hasło' \ CREATEUSER CREATEDB; CREATE USER |
Użytkownik `uzytkownik' będzie miał możliwość tworzenia baz danych (za pomocą createdb lub CREATE DATABASE z poziomu psql) jak i dodawania użytkowników (createuser lub CREATE USER z poziomu psql).
$ psql -h 127.0.0.1 template1 template-1=# SELECT count(*) FROM pg_database; count ------- 2 (1 row) |
Warto włączyć obsługę PostgreSQLa w PHP, instalując pakiet php-pgsql, również w perl-u perl-DBD-Pg lub perl-Pg, oraz w python-ie python-postgresql. Pakiet postgresql-devel jest przydatny przy pisaniu aplikacji w C/C++ korzystających z PostgreSQLa. Dokumentacja do PostgreSQLa znajduje się, a jakże, w pakiecie postgresql-doc.
# poldek -i php-pgsql # poldek -i perl-DBD-Pg # poldek -i perl-Pg # poldek -i python-postgresql # poldek -i postgresql-devel # poldek -i postgresql-doc |
/usr/share/doc/postgresql-*/FAQ_polish.gz - Lokalna wersja FAQ, instalowana z pakietem postgresql (może być także w oddzielnej paczce z dokumentacją).
Dużą zaletą ProFTPD jest jego prostota. Plik konfiguracyjny demona do złudzenia przypomina ten od Apache. Jego zrozumienie nie powinno sprawiać trudności.
Zanim przystąpisz do instalacji powinieneś zdecydować w jakim trybie ma pracować usługa. Jako demon, czy ma być uruchamiana poprzez superserwer inetd. Tryb inetd polega na tym, że proces proftpd zostanie uruchomiony dopiero po odebraniu przez inetd żądania o tę usługę. Natomiast w trybie daemon ProFTPD jest uruchomiony cały czas i pracuje niezależnie od inetd. Tak więc, jeżeli Twój komputer, który przeznaczysz na serwer nie jest zbyt szybki, powinieneś wybrać ProFTPD uruchamianego poprzez inetd. Dystrybucja udostępnia obie te możliwości. Pakiet proftpd-inetd zapewnia uruchamianie poprzez inetd, natomiast po zainstalowaniu usługi z pakietu proftpd-standalone uruchamiana ona będzie w trybie daemon. W opisie posłużymy się wersją daemon. Instalujemy pakiet proftpd-standalone
Jak już wspomniałem we wstępie, ProFTPD jest jednym z prostszych w konfiguracji programów serwerowych. Wszystkie pliki potrzebne do jego skonfigurowania znajdują się w katalogu /etc/ftpd.
# ls -1 /etc/ftpd ftpusers proftpd.conf |
W pliku ftpusers znajduje się lista użytkowników, którym odebrana została możliwość logowania się do serwera ftp. Poszczególne pozycje z tej listy zakończone są znakiem nowej linii, tak więc każda pozycja jest rozmieszczona jedna pod drugą. Natomiast plik proftpd.conf zawiera właściwą konfigurację usługi.
ServerName "ProFTPD" ServerIdent off ServerType standalone DeferWelcome off DefaultServer on DefaultRoot ~ |
ServerName
określa nazwę serwera wyświetlaną łączącym się z nim użytkownikom.
ServerIdent
pozwala na wyświetlenie wiadomości powitalnej
podczas połączenia, np. zawartości pliku .message.
Domyślnie wyłączona.
ServerType
ustawia tryb pracy demona ProFTPD
DeferWelcome
Nie pokazuje wiadomości powitalnej dopóki
użytkownik się nie zautoryzuje.
DefaultServer
Określamy konfigurację jako domyślną
DefaultRoot
Wyznaczamy nadrzędny dla każdego użytkownika katalog spoza
którego nie będzie mógł wyjść. W listingu powyżej będzie to katalog domowy.
Poniżej znajduje się szereg zakomentowanych opcji pozwalających na konfigurację połączeń bezpieczną metodą przy użyciu SSL. Jeżeli jesteś zainteresowany ich użyciem powinieneś zapoznać się z dokumentacją on line serwera ProFTPD. Przechodzimy teraz do dalszej konfiguracji.
Port 21 Umask 022 User ftp Group ftp AuthPAMAuthoritative on |
Port
Definiujemy tutaj port na którym serwer będzie oczekiwał
nadchodzących połączeń
Umask
Tryb umask 022 jest typowym standardem dla ogolnie dostępnych
plików i katalogów
User
Konto użytkownika na którego uprawnieniach pracuje usługa
Group
Grupa do której należy konto użytkownika usługi
AuthPAMAuthoritative
Dajemy możliwość autoryzacji użytkowników poprzez
moduł PAM jeśli jest to możliwe.
Przedstawione tutaj wartości poszczególnych opcji są domyślnie ustawiane w pliku konfiguracyjnym w trakcie instalacji pakietu. Jak najbardziej możesz z nich korzystać. Na pewno nie powinieneś zmieniać takich ustawień jak użytkownik czy grupa, port oraz sposób autoryzacji.
<Directory /> AllowOverwrite on </Directory> |
Zezwalamy na nadpisywanie plików w obrębie katalogu do którego użytkownik się zaloguje. Poniżej
w pliku znajduje się przykładowa konfiguracja dla użytkownika anonimowego. Sekcja mieści się
wewnątrz znacznika <Anonymous ~ftp></Anonymous>
.
Poniższy wykaz omawia najczęściej wykorzystywane dyrektywy w tej sekcji.
User ftp Group ftp AnonRequirePassword off RequireValidShell off |
User
- konto użytkownika którego prawa będzie uzyskiwała osoba
logująca się do serwera
Group
- grupa do której należy powyższe konto.
AnonRequirePassword
- w powyższym przykładzie wyłączona.
Umożliwia użytkownikom anonimowym logowanie się bez hasła.
RequireValidShell
- opcja ta powoduje, że ProFTPD nie sprawdza
czy dany użytkownik, który się loguje posiada przypisaną w
/etc/shells powłokę.
UserAlias anonymous ftp MaxClients 10 DisplayLogin welcome.msg DisplayFirstChdir .message AllowStoreRestart on |
UserAlias
- przyporządkowuje nazwę użytkownika do systemowego
konta. W przykładzie anonymous został przypisany kontu ftp.
MaxClients
- ilość jednoczesnych połączeń anonimowych które
będą realizowane przez serwer.
DisplayLogin
- określamy plik którego zawartość będzie
wyświetlana po starcie.
DisplayFirstChdir
- plik którego zawartość będzie wyświetlana
po pierwszym wejściu do katalogu.
AllowStoreRestart
- pozwala klientom wznawiać upload.
<Limit WRITE> DenyAll </Limit> |
Zabraniamy klientom pisania do katalogu /home/services/ftp/pub.
<Directory /home/services/ftp/pub/Incoming> <Limit READ> DenyAll </Limit> <Limit WRITE> AllowAll </Limit> <Limit STOR> AllowAll </Limit> </Directory> |
Katalogowi Incoming zostały precyzyjnie określone prawa dostępu. W powyższym przykładzie każdy ma dostęp do zapisu w tym katalogu natomiast nikt nie posiada prawa do jego odczytywania.
Dostęp do serwera ftp możemy ograniczać na kilka sposobów. Można limitować ilość jednoczesnych połączeń, stworzyć listę adresów IP, które będą miały prawo do zapisu czy odczytu określonych katalogów.
Na tym zakończymy podstawową konfigurację serwera ProFTPD. Więcej informacji na jego temat znajdziesz na stronach z jego dokumentacją.
W tym rozdziale przedstawiona zostanie konfiguracja samby w roli serwera domeny Microsoft Windows NT4 (PDC).
Do realizacji tego zadania potrzebne będą pakiety: samba i samba-clients. Znaczenie poszczególnych pakietów:
samba - pakiet ten zawiera serwer samby
samba-clients - zestaw narzędzi przydatnych w poruszaniu się w środowisku Microsoft Networks.
Proces instalacji pakietów przedstawiony został w dziale Zarządzanie pakietami.
Przy użyciu dowolnego edytora otwieramy plik /etc/samba/smb.conf. Całą konfigurację należy wykonać w sekcji [global]
. Przyjęta w nim została następująca konwencja: <opcja> = <wartość>. Jeżeli dana opcja ma kilka wartości,
oddziela się je znakiem spacji. Poszczególne opcje umieszczane są w osobnych liniach. Komentarze w pliku rozpoczynają się znakiem "#" lub ";". Poniżej znajduje się wykaz najważniejszych opcji które należy ustawić podczas realizacji zadania.
workgroup = DOM server string = File Server announce as = NT Server |
Ustawiamy nazwę domeny której członkiem będzie nasz serwer oraz opcjonalnie komentarz (opis) komputera i typ serwera (opcjonalnie).
domain logons = yes domain master = yes preferred master = yes local master = yes wins support = yes os level = 255 |
Ustawiamy logowanie do domeny oraz bycie kontrolerem domeny Windows NT4 i główną przegladarką komputerów w sieci.
security = user |
Określamy poziom bezpieczeństwa. Nasza konfiguracja wymaga ustawień zabezpieczeń na poziomie użytkownika.
nt acl support = yes nt pipe support = yes |
Ustawiamy
time server = yes |
Ustawiamy bycie serwerem czasu (opcjonalnie).
Następnie restartujemy SAMBĘ i przystępujemy do dalszej konfiguracji. W bazie użytkowników Samby musi znaleźć się konto administratora. Będzie ono wymagane przy dołączaniu stacji klienckich do domeny.
# smbpasswd -a root New SMB password: Retype new SMB password: Added user root. |
Hasło roota Samby nie powinno być identyczne z hasłem administratora systemu! następnie tworzymy konta użytkowników - podobnie jak przy zwykłym serwowaniu plików, tak i tutaj potrzebujemy nie tylko wpisu w bazie Samby, ale i konta uniksowego.
# useradd -g users jurek |
Pamiętajmy też o utworzeniu wpisu w bazie użytkowników Samby:
# smbpasswd -a jurek |
następnie ustawiamy mapowanie grup w linux na odpowiednie grupy windows-a, poleceniem net groupmap. Domyślne ustawienia Samby (mapowanie na uniksową grupę -1) wymaga zmiany, którą wprowadzi polecenie net groupmap add:
# net groupmap add ntgroup="Domain Admins" unixgroup=domadmin type=d Updated mapping entry for Domain Admins |
Podobnie modyfikujemy wpisy dla grup Domain Users - decydując się na wybór grupy users oraz Domain Guests - nobody: net groupmap.
# net groupmap add ntgroup="Domain Users" unixgroup=users type=d Updated mapping entry for Domain Users # net groupmap add ntgroup="Domain Guests" unixgroup=nobody type=d Updated mapping entry for Domain Guests # net groupmap add ntgroup="Users" unixgroup=users type=d Add mapping entry for Users |
Sprawdźmy, czy zmiany będą widoczne:
# net groupmap list ... Domain Admins (S-1-5-21-353545269-2518139598-3611003224-512) -> domadmin Domain Users (S-1-5-21-353545269-2518139598-3611003224-513) -> users Domain Admins (S-1-5-21-353545269-2518139598-3611003224-514) -> nobody Users (S-1-5-21-353545269-2518139598-3611003224-3001) -> users .. |
Praca komputera w domenie wymaga założenia mu konta - tzw. Machine Trust Account. Jest to specyficzne konto, gdyż jego hasło ustalane jest przy podłączaniu komputera do domeny i znane tylko parze klient-serwer. Dzięki temu istnieje możliwość sprawdzenia tożsamości próbującego się logować komputera - nawet gdy ktoś dołączy maszynę o tej samej nazwie, to nie powinien uzyskać możliwości dostępu do domeny. Nazwy kont odpowiadają nazwom NetBIOS komputerów, ale z dołączonym na końcu symbolem dolara. Dla stacji biuro będzie to więc biuro$. Konto to powinno być zablokowane, by niemożliwe było uzyskanie dostępu poprzez ssh, czy też inne usługi systemu operacyjnego. Nie jest także konieczny katalog domowy, w zamian za to zdecydujemy się na umieszczenie kont w grupie machines - pozwoli to w jakimś stopniu ogarnąć szybko zwiększającą się liczbę użytkowników systemu serwera.
# groupadd machines # useradd -c "Komputer biurowy" -g machines -d /dev/null -s /bin/false biuro$ # passwd -S biuro$ Password locked. |
Wydaje się, że powinniśmy teraz utworzyć odpowiedni wpis w bazie haseł Samby - nie jest to jednak konieczne. Przy próbie podłączenia komputera do domeny czynność ta zostanie wykonana automatycznie. Gdy jednak zajdzie potrzeba ręcznego utworzenia wpisu, do wywołania smbpasswd dodać musimy parametr -m (machine):
# smbpasswd -a -m ksiegowosc |
W tym przypadku nie podajemy symbolu $. Oczywiście cały proces dodawania kont maszyn można zautomatyzować w tym celu należy dodać do /etc/samba/smb.conf:
add machine script = /usr/sbin/useradd -d /var/lib/nobody -g machines -c 'Konto Maszyny %I' -s /bin/false %u passwd chat debug = no passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authentication*tokens*updated*successfully* passwd program = /usr/bin/smbpasswd -L -a %u |
i oczywiście utworzyć katalog /var/lib/nobody
# mkdir /var/lib/nobody |
należy sie też upewnić czy nie mamy w smb.conf wpisu
# kto nie moze sie logowac do samby invalid users = root |
Aby dodać Windows XP Profesional lub Microsoft Windows NT Server 4.0 Standard Edition (wersja Home nie obsługuje modelu domenowego w żaden sposób) należy w rejestrze zmienić:
REGEDIT4
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\netlogon\parameters
"RequireSignOrSeal"=dword:00000000
lub z poziomu Local Group Policy wyłączając (Disabled) Security Options | Domain Member | Digitally encrypt or sign secure channel data (always)
wiecej:
/usr/share/doc/samba-doc/Registry/WinXP_SignOrSeal.reg
Brian Getsinger (Apple Corp). Mac OS X Server Samba Primary Domain Controller Configuration http://www.afp548.com/Articles/system/sambapdc.html Sherlock Error logging a Win XP machine into a domain running Samba.
W tym rozdziale przedstawiona zostanie konfiguracja samby w roli serwera członkowskiego domeny Microsoft Windows NT4. Zaletą takiej konfiguracji jest możliwość budowania polityki praw dostępu do zasobów zgromadzonych na serwerze w oparciu o konta użytkowników lokalnego serwera PDC.
Do realizacji tego zadania potrzebne będą trzy pakiety: samba, samba-clients oraz samba-winbindd. Znaczenie poszczególnych pakietów:
samba - pakiet ten zawiera serwer samby
samba-clients - zestaw narzędzi przydatnych w poruszaniu się w środowisku Microsoft Networks.
samba-winbindd - demon pozwalający na pobieranie uprawnień z serwera PDC.
Proces instalacji pakietów przedstawiony został w dziale Zarządzanie pakietami.
Przy użyciu dowolnego edytora otwieramy plik /etc/samba/smb.conf. Całą konfigurację z której będzie
również korzystał demon winbindd należy wykonać w sekcji [global]
. Przyjęta w nim została następująca konwencja: <opcja> = <wartość>. Jeżeli dana opcja ma kilka wartości,
oddziela się je znakiem spacji. Poszczególne opcje umieszczane są w osobnych liniach. Komentarze w pliku rozpoczynają się
znakiem "#" lub ";". Poniżej znajduje się wykaz najważniejszych opcji które należy
ustawić podczas realizacji zadania. Wykraczają one nieco poza czystą konfigurację winbindd ale są
konieczne do jego prawidłowego działania.
workgroup = DOM server string = File Server |
Ustawiamy nazwę domeny której członkiem będzie nasz serwer oraz opcjonalnie komentarz (opis) komputera.
security = domain |
Określamy poziom bezpieczeństwa. Nasza konfiguracja wymaga ustawień zabezpieczeń typu domenowego.
password server = PDC |
Nazwa netbiosowa serwera PDC. To z tego właśnie serwera demon winbind będzie pobierał uprawnienia.
To tyle, jeżeli chodzi o ogólną konfigurację samby. Teraz czas na dodanie kilku opcji potrzebnych winbindowi.
winbind separator = + idmap uid = 10000-20000 idmap gid = 10000-20000 winbind enum users = yes winbind enum groups = yes client signing = yes |
winbind separator
- znak, którym oddzielana będzie nazwa użytkownika bądź grupy od nazwy domeny. Np. "DOM+jan"
idmap uid
- zakres uidów w systemie zarezerwowanych na użytkowników domenowych
idmap gid
- zakres gidów w systemie przeznaczonych na grupy domenowe
Na tym możemy zakończyć edycję pliku konfiguracyjnego samby. Aby nasza konfiguracja stała się aktywna musimy przerestartować usługę.
/etc/rc.d/init.d/smb restart |
W ślad za usługą smb zostaną przerestartowane także nmbd oraz interesujący nas winbindd. Czynnością którą musimy bezwzględnie wykonać jest podłączenie naszego serwera do domeny. Aby to uczynić wykonujemy poniższe polecenie:
# net rpc join -S PDC -U Administrator%hasło Joined the domain DOM |
Jeżeli w tym momencie miałbyś problemy ze skomunikowaniem się z serwerem domeny możesz dodać do polecenia opcję -I
a po niej adres
IP serwera PDC. Po pomyślnej operacji podłączenia możemy sprawdzić działanie winbinda.
# wbinfo -g DOM+Administrator DOM+Basia DOM+Darek ... # wbinfo -g DOM+Domain Admins DOM+Domain Users ... |
Opcja -u
pokazuje listę użytkowników, natomiast -g
listę grup.
Jeżeli wynik obu poleceń wygląda podobnie jak na listingu oznacza to, że winbind pracuje poprawnie.
Jakie korzyści płyną z takiej konfiguracji samby? Otóż sprawdza się ona w środowisku sieciowym w którym zasoby udostępniają zarówno serwery pracujące pod kontrolą Windows jak i linuksa. Pozwala to na budowanie spójnej polityki bezpieczeństwa w oparciu o uwierzytelnianie użytkownika na poziomie domeny. Drugą z zalet jest prostota w implementacji. Dzięki winbindd dostęp do grup oraz użytkowników domenowych odbywa się w taki sam sposób jak do ich odpowiedników lokalnych.
# chown DOM+Administrator.DOM+Domain\ Users plik.txt |
Snort to bardzo silny sieciowy system wykrywania ataków (ang. Network Intrusion Detection System, NIDS), który daje szeroki zakres mechanizmów detekcji, mogących w czasie rzeczywistym dokonywać analizy ruchu i rejestrowania pakietów w sieciach opartych na protokołach IP/TCP/UDP/ICMP. Potrafi przeprowadzać analizę strumieni pakietów, wyszukiwać i dopasowywać podejrzane treści, a także wykrywać wiele ataków i anomalii, takich jak przepełnienia bufora, skanowanie portów typu stealth, ataki na usługi WWW, SMB, próby wykrywania systemu operacyjnego i wiele innych.
Przed instalacją Snorta warto zaopatrzyć się w bazę danych (w opisie wykorzystano MySQL) i serwer Apache z obsługą PHP. W bazie będą składowane logi, a za wygodny interfejs do przeglądania alarmów posłuży ACID (ang. Analysis Console for Intrusion Databases).
Gdy mamy już bazę danych i serwer WWW z PHP, instalujemy następujące pakiety.
# poldek -i snort acid |
Przed konfiguracja środowiska NIDS zakładamy dwie bazy, dla Snorta i dla archiwum alarmów.
# mysql -u mysql -p Enter password: mysql> create database snort_log; Query OK, 1 row affected (0.01 sec) mysql> create database snort_archive; Query OK, 1 row affected (0.01 sec) mysql> quit |
Dodajemy tabele w taki sam sposób dla obu baz.
# gzip -d /usr/share/doc/snort-{wersja}/create_mysql.gz # mysql -D snort_log -u mysql -p < \ /usr/share/doc/snort-{wersja}/create_mysql # gzip -d /usr/share/doc/acid-{wersja}/create_acid_tbls_mysql.sql.gz # mysql -D snort_log -u mysql -p < \ /usr/share/doc/acid-{wersja}/create_acid_tbls_mysql.sql # mysql -D snort_archive -u mysql -p < \ /usr/share/doc/snort-{wersja}/create_mysql # mysql -D snort_archive -u mysql -p < \ /usr/share/doc/acid-{wersja}/create_acid_tbls_mysql.sql |
Następnie (najprościej przy użyciu popularnego narzędzia phpMyAdmin) tworzymy użytkownika i nadajemy mu prawa dla stworzonych baz.
Przechodzimy do edycji pliku /etc/acid_conf.php, w którym dodajemy parametry dla połączenia się z bazami.
[...] /* Alert DB connection parameters */ [...] $alert_dbname = "snort_log"; $alert_host = "localhost"; $alert_port = "3306"; $alert_user = "login"; $alert_password = "haslo"; /* Archive DB connection parameters */ $archive_dbname = "snort_archive"; $archive_host = "localhost"; $archive_port = "3306"; $archive_user = "login.; $archive_password = "haslo"; [...] |
Teraz strona z interfejsem jest dostępna pod adresem http://twoje_ip/acid. Oczywiście dla bezpieczeństwa zalecane jest zastosowanie protokołu SSL do komunikacji z zasobem i autoryzacji poprzez pakiet apache-mod_auth.
Snort zależnie od środowiska w jakim działa może generować dużą ilość zbędnych alertów, te bardziej istotne można przenosić do drugiej bazy za pomocą ACID, dla przejrzystości ogółu.
Do działania jako sieciowy system wykrywania włamań, Snort potrzebuję sprecyzowania zasad funkcjonowania całości w głównym pliku konfiguracyjnym snort.conf. W starszych wersjach systemu, wszystkie opcje, łącznie z regułami ataków znajdowały się w jednym pliku. Ciągła rozbudowa Snorta, rosnąca liczba sygnatur i ogólna funkcjonalność, wymusiła rozdzielenie niektórych części konfiguracyjnych, w tym reguł ataków. Przejrzystość i spójność snort.conf została przywrócona przy użyciu polecenia include, którym dołącza się odpowiednie zestawy sygnatur i inne części konfiguracyjne, np.:
include: ścieżka_do_pliku/nazwa |
Bazy reguł charakteryzują się nazwą pliku z końcówką .rules, pierwszy człon nazwy zawiera rodzaj usługi lub typ ataku, którego dotyczy dany zestaw.
Pozostałymi plikami konfiguracyjnymi są:
classification.config - zawierający klasyfikatory rodzajów ataków z nadanym priorytetem zagrożenia, tak jak poniżej:
config classification: web-application-attack,Web Application Attack,1 |
reference.config - posiadający skróty adresów do stron organizacji z bazą opisów ataków, np.:
config reference: bugtraq http://www.securityfocus.com/bid/ |
threshold.conf - metody łagodzenia licznych, fałszywych alarmów,
unicode.map - zestaw kodowanych znaków unicode, na potrzeby preprocesora http_inspect.
Główny plik konfiguracyjny można podzielić na cztery sekcje. Pierwsza, odpowiedzialna jest za ustalanie zmiennych var, wykorzystywanych w składni reguł ataków.
Przyjmijmy że docelowo Snort ma monitorować dwie podsieci o adresach 192.168.1.0/24 i 192.168.2.0/24, jego pliki konfiguracyjne znajdują się bezpośrednio w katalogu /etc/snort, a regułki w /etc/snort/rules.
# Adres sieci lokalnej var HOME_NET [192.168.1.0/24,192.168.2.0/24] # Adres sieci zewnetrznej var EXTERNAL_NET !$HOME_NET # Lista adresow serwerow znajdujacych sie w strefie chronionej var DNS_SERVERS $HOME_NET var SMTP_SERVERS $HOME_NET var HTTP_SERVERS $HOME_NET var SQL_SERVERS $HOME_NET var TELNET_SERVERS $HOME_NET var SNMP_SERVERS $HOME_NET # Lista portow var HTTP_PORTS 80 var SHELLCODE_PORTS !80 var ORACLE_PORTS 1521 # Lista serwerow czat, komunikatorow var AIM_SERVERS [64.12.24.0/24,64.12.25.0/24,64.12.26.14/24,64.12.28.0/24,] # Scieżka do katalogu z regulami atakow var RULE_PATH /etc/snort/rules |
W tej samej sekcji znajduje się zestaw parametrów
uruchomieniowych, zaczynających się od wyrażenia
config
(pełna
ich lista znajduję się w dokumentacji):
# wybor interfejsu do nasłuchu (jeden demon Snorta moze # obslugiwac tylko jeden interfejs sieciowy) config interface: eth0 |
Druga część głównego pliku konfiguracyjnego, zawiera ustawienia preprocesorów. Parametry domyślne nie będą przedstawione w poniższym opisie. Kompletną listę opcji, można znaleźć w dokumentacji Snorta. Oto przykłady ustawień preprocesorów:
Frag2:
# detect_state_problems . zwraca alarm przy pokrywaniu sie fragmentow. preprocessor frag2: detect_state_problems |
Stream4, Stream4_reassemble:
# disable_evasion_alerts - brak alarmow przy nakladaniu sie #pakietow TCP, detect_scans - detektor prob cichego skanowania, # detect_state_problems - detektor nienaturalnego zachowania # pakietow. preprocessor stream4: disable_evasion_alerts \ detect_scans detect_state_problems # both - skladanie sesji TCP w obu kierunkach pomiedzy # klientem i serwerem, # ports - lista portow, na ktorych ma dzialac reasemblacja. preprocessor stream4_reassemble: both ports [ 21 25 80 143 110 ] |
Http_inspect:
# iis_unicode_map - wskazuje plik z kodowaniem unicode i wybiera standardowe. preprocessor http_inspect: global is_unicode_map unicode.map 1252 # profile - wybor profilu ustawien dla serwerow typu iis, apacze i all. preprocessor http_inspect_server: server adres_IP_serwera_MS_IIS \ profile iis \ ports { 80 } preprocessor http_inspect_server: server adres_IP_serwera_Apache \ profile apache \ ports { 80 } |
Powyższy przykład przedstawia możliwość profilowania ustawień dla poszczególnych serwerów, które podlegają ochronie. Serwery IIS i Apache, pracują w odmienny sposób, a zarazem posiadają inne słabe punkty wykorzystywane podczas ataków. Operacja dostosowania ustawień skupia mechanizmy ochronne na odpowiednich metodach ataków dla danego typu serwera bądź ich grupy w danej sieci objętej ochroną.
RPC_decode, Back Orfice, Telnet_decode, Arpspoof, Performance Monito:
# alert_fragments . wlacza alarm, przy fragmentowaniu pakietow RPC, # Domyślne porty: 111 i 32771. preprocessor rpc_decode: 111 32771 alert_fragments preprocessor bo preprocessor telnet_decode preprocessor arpspoof preprocessor arpspoof_detect_host: adresy_IP \ przypisane_do_nich_adresy_MAC # console . wyswietlanie statystyk na ekranie, # flow i events . statystyki badanego ruchu i ilosci dopasowanych # regul, # time . aktualizacja danych co 10s. preprocessor perfmonitor: console flow events time 10 |
Flow i Flow-portscan:
# stats_interval . zapisywanie statystyk, 0 - wylaczone, # hash . wybor metody mieszania. preprocessor flow: stats_interval 0 hash 2 # server-watchnet . adresy IP, na ktorych flow bedzie # prowadzic badania, # server-learning-time . czas utrzymania punktow dla danego adresu IP, # server-scanner-limit . ilosc zapytan decydujacych o przyznaniu # statusu # skanowania z danego adresu, # src-ignore-net, dst-ignore-net . lista ignorowanych adresow docelowych # i zrodlowych. preprocessor flow-portscan: \ server-watchnet [xxx.xxx.xxx.xxx/xx] \ server-learning-time 14400 \ server-scanner-limit 10 \ src-ignore-net [xxx.xxx.xxx.xxx/xx, xxx.xxx.xxx.xxx/xx] \ dst-ignore-net [xxx.xxx.xxx.xxx/xx] |
Trzecia sekcja snort.conf, zawiera metody konfiguracji modułów wyjściowych, czyli różnych sposobów logowania wyników i tzw. akcji reguł. Na potrzeby tego opisu wymieniony będzie tylko przykład logowania do bazy MySQL.
output database: alert, mysql, user=login password=haslo \ dbname=snort_log host=127.0.0.1 |
Za pomocą reguł akcji można tworzyć własne rodzaje reakcji na wykryte zdarzenie, np.:
ruletype czerwony_alarm { type log # zapis do demona syslogd, lokalnie output alert_syslog: LOG_ALER } # Przykladowa regula: czerwony_alarm $HOME_NET any -> $HOME_NET 6667 (msg:"Internal \ IRC Server";) |
Czwarta, ostatnia część, głównego pliku konfiguracyjnego, zawiera odniesienia do zestawów reguł i wcześniej już opisanych plików, classification.config, reference.config, threshold.conf (przykład poniżej).
include classification.config include reference.config include $RULE_PATH/bad-traffic.rules include $RULE_PATH/exploit.rules include $RULE_PATH/telnet.rules include $RULE_PATH/rpc.rules include $RULE_PATH/dos.rules (...) # dodatkowy zestaw regul Bleeding Snort - # http://www.bleedingsnort.com include $RULE_PATH/bleeding.rules include threshold.conf |
Dostosowanie Snorta do swoich potrzeb obejmuje, obok konfiguracji preprocesorów przede wszystkim decyzje, jakie zbiory reguł mają być brane pod uwagę (czyli jakie pliki z regułami mają być dołączane za pomocą polecenia include). W środowisku, w którym wszystkie serwery WWW to Apache, reguły chroniące serwer IIS będą generowały zupełnie niepotrzebne alarmy. Jeśli nie udostępniamy FTP, reguły opisujące ataki na tę usługę będą tylko spowalniały pracę całego systemu. To sprawy oczywiste, jednak właściwe dostosowanie NIDS do swoich potrzeb wymaga wiele pracy. Dobranie odpowiednich dla danego środowiska reguł jest kluczowe dla działania całego systemu, duża ilość fałszywych alarmów nie tylko zużywa zasoby (każda z reguł musi być przecież przeanalizowana), ale może również bardzo skutecznie "zaciemnić" obraz, sprawiając, że prawdziwy atak może przejść niezauważony w zalewie informacji mało istotnych. Obecna baza sygnatur liczy sobie około 2500 reguł i jest praktycznie każdego dnia wzbogacana o nowe opisy ataków. Dla przybliżenia występujących w bazie kategorii sygnatur, opiszę jakiego rodzaju ataki wykrywają:
attack-responses - odpowiedzi usług na próbę ataku;
backdoor - działalność tzw. tylnych drzwi, trojanów, rootkitów;
bad-traffic - nieprawidłowy ruch, np. na port 0;
chat - aktywność różnego rodzaju komunikatorów;
ddod, dos - zmasowane ataki Distributed Denial of Service (rozproszony atak typu - blokada usługi);
deleted - reguły przestarzałe, wykasowane;
dns - ataki na usługę Domain Name System;
experimental - zestaw eksperymentalnych reguł;
exploit - programy mające na celu wykorzystywanie błędów w oprogramowaniu;
icmp-info, icmp - komunikaty ICMP z różnych programów, testujących ruch;
imap, pop2, pop3, smtp - ataki na systemy pocztowe;
info - próby logowania na usługi Telnet, Ftp;
local - zestaw własnych reguł;
misc - różne, dotyczące usług CVS, MS Terminal, BOOT, UPnP itd.;
multimedia - strumienie audio, wideo;
mysql, sql, oracle - ataki na znane serwer baz danych;
netbios - anomalia związane z protokołem Netbios/SMB;
nntp - ataki na serwer grup dyskusyjnych;
other-ids - działalność innych systemów IDS;
p2p - aktywność programów Peer to Peer;
policy - próby ataków na usługi policy ftp itp.
porn - aktywność stron pornograficznych;
rpc - ataki na usługi Remote Procedure Call;
finger, rservices, telnet - ataki na dość słabo zabezpieczone usługi uniksowe: finger, rlogin, rsh, rexec, telnet;
scan - różnego rodzaju techniki skanowania portów;
shellcode - wykorzystanie nieprawidłowego kodu do prób przepełnienia bufora;
snmp - ataki na usługi SNMP;
tftp, ftp - zdarzenia związane z przesyłaniem plików poprzez serwer ftp;
virus - transfer poczty z podejrzanym załącznikiem;
web-attacks, web-misc, web-client, web-cgi, web-php, web-coldfusion, web-frontpage, web-iis - ataki na różnego typu serwery WWW, przeważnie z wykorzystaniem błędów w skryptach cgi, php;
x11 - aktywności sesji serwera XFree86.
Do aktualizacji sygnatur posłuży nam perlowy skrypt Oinkmaster. Ma on duże możliwości które pozwalają w prosty sposób zarządzać regułami Snorta. Wymagane pakiety do uruchomienia to: perl, perl-base, perl-modules i vixie-cron albo hc-cron .
Ściągamy archiwum tar, rozpakowujemy, skrypt wgrywamy do katalogu /usr/local/bin, a konfig do /etc:
# wget --passive-ftp \ ftp://ftp.it.su.se/pub/users/andreas/oinkmaster/oinkmaster-1.0.tar.gz # tar -zxvpf oinkmaster-1.0.tar.gz # cp oinkmaster-1.0/oinkmaster.pl /usr/local/bin/ # cp oinkmaster-1.0/oinkmaster.conf /etc/ |
Operacja aktualizacji odbywa się po następującej sekwencji komend:
# /usr/local/bin/oinkmaster.pl -o /etc/snort/rules/ |
Dodanie innego źródła reguł:
# /usr/local/bin/oinkmaster.pl -o /etc/snort/rules/ -q -u \ http://www.bleedingsnort.com/bleeding.rules.tar.gz |
Aby aktualizacja odbywała się automatycznie, w katalogu /etc/cron.daily tworzymy plik uprules.
# touch /etc/cron.daily/uprules # chmod 700 /etc/cron.daily/uprules |
I dodajemy do niego następującą zawartość, podając adres e-mail na który ma zostać wysłany raport z codziennej aktualizacji jeśli pojawia się coś nowego:
TMP=`mktemp /tmp/oinkmaster.XXXXXXXX` && (/usr/local/bin/oinkmaster.pl -o /etc/snort/rules/ \ -q > $TMP 2>&1; if [ -s $TMP ]; then mail -s "Update Snort Rules" root@twoja_domena < $TMP; fi; rm $TMP) # dodatkowy zestaw regul Bleeding Snort - http://www.bleedingsnort.com TMP=`mktemp /tmp/oinkmaster.XXXXXXXX` && (/usr/local/bin/oinkmaster.pl -o /etc/snort/rules/ -q -u \ http://www.bleedingsnort.com/bleeding.rules.tar.gz > $TMP 2>&1; if [ -s $TMP ]; then mail -s "Update Bleeding Rules" \ root@twoja_domena < $TMP; fi; rm $TMP) /etc/rc.d/init.d/snort restart |
Warto przyjżeć się bliżej ciekawym funkcjonalnościom oinkmastera. W pliku konfiguracyjnym mamy możliwość wyłączania poszczególnych regułek po nr sid, dodawania do nich własnych modyfikacji itp. Wtedy jest pewność że po aktualizacji, nasze zmiany w plikach reguł nie będą nadpisywane.
Snort jest logicznie podzielony na kilka komponentów, które współpracują ze sobą by wykrywać ataki i generować wyniki w odpowiednim formacie. Głównymi składnikami systemu są: dekoder pakietów (sniffer), preprocesory, silnik detekcji i moduł wyjściowy.
W swej najprostszej formie Snort może działać jako sniffer. Przechwytuje pakiety z warstwy łącza danych za pomocą biblioteki pcap. Rozpoznaje różne protokoły modelu OSI - Ethernet, 802.11, Token Ring oraz wiele protokołów działających w wyższych warstwach jak: IP, TCP, UDP i ICMP. Surowe pakiety z warstwy łącza danych (np. ramki Ethernetowe) po zdekodowaniu wądrują do preprocesorów (warstwa transportowa), gdzie są testowane i w razie konieczności obrabiane na potrzeby silnika detekcji (warstwa sesji). Tam dokonywana jest analiza pakietów pod kątem zbioru zadanych reguł. Następnie po wykryciu próby ataku bądź anomalii sieciowych, system przekazuje odpowiednie dane do modułu wyjściowego, który to decyduje o zapisaniu wyniku wykrycia w logach lub wszczęciu alarmu.
Snort umożliwia dużą swobodę konfiguracji, za pomocą wielu parametrów, które pozwalają kontrolować trzy podstawowe tryby pracy programu: sniffer, packet logger i network intrusion detection.
Sniffer Mode - wychwytuje wszystkie pakiety w
danym segmencie sieci i przedstawia ich
zawartość na ekranie. Najprostszym sposobem
użycia tego trybu jest uruchomienie programu z
parametrem -v
w wyniku, czego Snort będzie
wyświetlać informacje o nagłówkach IP,
TCP/UDP/ICMP. Do uzyskania bardziej
szczegółowych danych o wychwyconych pakietach,
służą parametry -d
(aby monitorować ładunek
pakietów) i -e
(dodatkowe nagłówki warstwy
łącza danych). Parametry można łączyć razem,
bez znaczenia jest ich kolejność (np.
snort -ved). Aby zakończyć pracę w tym trybie należy
użyć sekwencji klawiszy CTRL+C.
Packet Logger Mode - logowanie pakietów
poprzez zapis na dysku. Czynność ta odbywa się
po użyciu opcji -l
, którą wskazujemy katalog,
gdzie Snort będzie zapisywać w odpowiednio
nazwanych podkatalogach i plikach, zawartość
zebranych pakietów. Program potrafi także
zapisywać dane w formie binarnej tak jak robi
to znany sniffer
tcpdump. Służy do tego opcja
-b
, po jej użyciu nie trzeba stosować
dodatkowych kombinacji parametrów
-ved
,
ponieważ format tcpdump, określa to, co ma być
logowane (np. snort -b -l ./log). Uzyskane w
ten sposób informacje, można wykorzystać do
późniejszej analizy za pomocą programów
rozpoznających format binarny tcpdump (np.
Ethereal). Oczywiście można tą samą czynność
wykonać z wykorzystaniem Snorta, używając
opcji -r
, po czym przetworzyć sczytane pakiety
dostępnymi trybami.
Snort czytając swoje dzienniki (tak samo
działając w trybie sniffera) przyjmuje
parametry w formacie BPF (Berkeley Packet
Filter), dzięki którym możemy sprecyzować (na
podstawie nagłówków), jakie konkretnie pakiety
chcemy obserwować (np. określić adres hosta,
protokół, port). Jeśli np. interesuje nas
tylko ruch na porcie 80 można uruchomić Snorta
poleceniem: snort -r /var/log/snort/snort.log
port www, jeśli chcemy wyświetlić tylko
odpowiedzi serwera www:
snort -vde src port www.
Aby ignorować cały ruch z sieci np.
192.168.1.0 na port 80:
snort -vde not ( src net 192.168.1 and dst port 80).
Połączenie Snorta z filtrami BPF znacznie
zwiększa wydajność całego systemu, gdyż
filtrowanie BPF odbywa się w warstwie łącza
danych (a więc na poziomie biblioteki pcap).
Określając w ten sposób, jakie pakiety nas
interesują (lub jakie chcemy zignorować) można
dość dokładnie "zawęzić" obszar poszukiwań.
Filtry BPF można również zapisać w oddzielnym
pliku i załadować w trakcie uruchamiania
Snorta parametrem -F
:
snort -r snort.log -F plik_z_bdf.
Więcej na temat możliwości
oferowanych przez BPF można poczytać na
stronach podręcznika zarówno Snorta, jak i
Tcpdump.
Network Intrusion Detection Mode
- sieciowy system wykrywania włamań. Jest najbardziej
skomplikowanym trybem działania programu. Za
pomocą parametru -c
, wskazujemy plik
konfiguracyjny, w którym określane są zasady
badania przechwyconego ruchu sieciowego,
ustawienia preprocesorów, a także zestaw
sygnatur ataków. Aby program działał w tle
jako demon, należy użyć opcji
-D
(np.
snort -d -D -c snort.conf).
Reszta operatorów i ich
opisy, jakie można wykorzystać przy starcie
programu, przedstawia parametr
-h
.
Preprocesory zostały wprowadzone do Snorta w wersji 1.5. Pozwalają użytkownikom i programistom w prosty sposób na rozbudowę funkcjonalności całego systemu poprzez pisanie dodatkowych modułów (ang. plugins).
Preprocesory analizują pakiety przed wykorzystaniem ich przez silnik detekcji. W ten sposób zwiększają możliwości całego procesu wykrywania ataków sieciowych, wzbogacając go o zdolność składania (reasemblacji) pakietów, wykonywania specyficznych dla poszczególnych protokołów operacji (np. konwersja na ASCII znaków z URI zakodowanych szesnastkowo, usuwanie ciągów binarnych z sesji FTP czy Telnet, normalizacja żądań RPC), jak i wykrywania niezgodności z tymi protokołami.
Poniżej pokrótce opiszemy standardowy zestaw preprocesorów wchodzących w skład darmowej dystrybucji Snorta w wersji 2.1.3.
Frag2 - defragmentuje i normalizuje dane przychodzące w postaci fragmentów, co utrudnia ukrywanie ataków prowadzonych za pomocą nieprawidłowo sfragmentowanych pakietów IP. W tym celu wykorzystuje ustalony przez użytkownika bufor pamięci, w której przez określony czas przetrzymuje do badania pakiety z tablicy stanów połączeń. Im większa liczba sfragmentowanych pakietów tym wymagany jest większy bufor. Defragmentacja, układając datagramy IP w jedną całość, ułatwia dalszą analizę danych poprzez pozostałe preprocesory i silnik detekcji. Frag2 umożliwia wychwytywanie znanych ataków wykorzystujących zniekształcenia fragmentów pakietów np. teardrop, fragroute.
Stream4 - rozwija model detekcji oparty na testowaniu pojedynczych pakietów umożliwiając śledzenie sesji (stanu połączenia) TCP i składanie (reasemblacji) strumieni TCP, co nie byłoby możliwe w mechanizmie opartym na wyszukiwaniu wzorców. Na tym poziomie działa także wykrywanie niektórych prób skanowania portów, gdzie wymagane jest notowanie prób łączenia się z poszczególnymi usługami w określonych odstępach czasu oraz wykrywanie prób oszukania Snorta za pomocą narzędzi takich, jak np. Stick lub Snot, które generują pojedyncze (niewchodzące w skład poprawnych sesji TCP) pakiety mające za zadanie zalać mechanizm detekcji masą fałszywych alarmów (są to pakiety budowane na losowo wybranych sygnaturach). Snort broni się przed takimi technikami wykorzystując stream4 preprocesor - losowe pakiety są dość łatwo identyfikowane (i ignorowane), ponieważ nie należą do prawidłowej sesji TCP. Stream4 wychwytuje próby skanowania technikami: stealth, null, xmas, fin; wykrywanie systemu operacyjnego - fingerprint i inne anomalia związane z protokołem TCP.
Flow i Flow-Portscan - posiada mechanizm śledzenia połączeń, zapisując całość do tablicy stanów w celu dalszego przetwarzania. Na tej podstawie flow-portscan wykrywa próby skanowania w bardziej wyrafinowany sposób niż preprocesory stream4 i portscan. Celem wykrywania, są skany z jednego hosta do wielu i z jednego hosta na wiele portów. Flow-portscan prowadzi statystyki na podstawie punktacji różnych rodzajów połączeń, np. jeśli jakaś usługa jest popularna i na jej port przychodzi dużo zapytań, jednocześnie dostaje najmniej punktów w ogólnej skali. Preprocesor posiada bardzo wiele opcji za pomocą, których reguluje się skale punktacji, rozmiary tablicy wyników, tolerancję niepowtarzalności zdarzeń itp.
HTTP Inspect - jest ogólnym dekoderem protokołu HTTP na poziomie warstwy aplikacyjnej. Za pomocą ustalonego bufora wynajduje odpowiednią składnie HTTP i ją normalizuje. HTTP Inspekt działa w obydwu trybach jednocześnie: client requests (pol. zapytania klienta) i server responses (pol. odpowiedzi serwera). Mnoga liczba dostępnych opcji w konfiguracji preprocesora, umożliwia dostosowanie ustawień do konkretnego typu serwera WWW. Głównymi zadaniami http_inspect jest przetwarzanie adresów URI, konwertując na ASCII znaki zakodowane w postaci szesnastkowej. Utrudnia to ukrycie ataku przed modułem wykrywającym sygnatury ataków przez zakodowanie typowych sekwencji. Dekoduje także znaki zakodowane jako Unicode, oraz wykrywa nielegalne kodowania, wykorzystywane m.in. w ostatnich dziurach MS IIS.
Portscan Detector - wykrywa próby skanowania portów, polegające na przekroczeniu pewnej progowej liczby prób połączeń z różnymi portami w określonym przedziale czasu. Ze względu na brak możliwości uniknięcia fałszywych alarmów w typowych przypadkach (np. obciążony serwer DNS), istnieje możliwość wyłączenia alarmów wzbudzanych przez określone adresy IP używając dodatkowego procesora portscan-ignorehosts. Pozwala także, zapisać wyniki w oddzielnym pliku dziennika.
Telnet Decode - usuwa z sesji TELNET i FTP binarne ciągi mogące utrudnić wyszukiwanie z udziałem sygnatur ataków.
RPC Decode - normalizuje żądania po protokole RPC, utrudniając ukrywanie podejrzanych pakietów za pomocą mniejszych operacji.
Back Orifice detektor - wyszukuje w pakietach UDP próby połączeń konia trojańskiego Back Orifice i próbuje złamać zabezpieczające je słabe kodowanie.
Arpspoof - wykrywa podejrzane pakiety ARP, mogące sygnalizować próby ARP spoofingu.
Performance Monitor - udostępnia wszelkiego rodzaju statystyki liczbowe, odnośnie ilości przeanalizowanych pakietów, zużycia procesora itp. Całość wyświetlana jest na ekranie konsoli lub zapisywana do pliku, wg ustalonych wcześniej wartości.
Zarówno preprocesory, jak i mechanizm detekcji mogą zareagować w określony sposób. Po wychwyceniu pakietów, spełniających warunki nadane konfiguracją preprocesorów lub regułami, podejmowane jest odpowiednie działanie (np. zapisanie pakietów bądź alarm).
Główny mechanizm systemu detekcji zagrożeń polega na dopasowaniu przetworzonych pakietów i ich zrekonstruowanych strumieni z bazą sygnatur. System detekcji porównuje cechy pakietu ze zbiorem reguł. Po dopasowaniu, zostaje podjęta odpowiednia akcja. Do porównywalnych cech należą atrybuty główne - adresy, porty źródłowe i docelowe oraz opcje pomocnicze: flagi TCP identyfikujące np. żądania związane z WWW, różne typy pakietów ICMP, opcje IP czy wreszcie sama treść pakietu. Na razie w głównej części reguł możliwe jest śledzenie protokołów IP, ICMP, TCP i UDP. Autorzy przewidują rozszerzenie Snorta o następne protokoły sieciowe, m.in. IPX, GRE, czy protokoły wymiany informacji między routerami - RIP, OSPF oraz IGRP.
Reguły identyfikowania ataku pozwalają na podjęcie pięciu rodzajów akcji: przepuszczenia pakietu (pass), zapisania informacji do dziennika (log), ogłoszenia alarmu (alert), alarmowania i podjęcia do działania innej dynamicznej reguły (activate) i pozostanie w spoczynku do czasu aktywowania przez regułę activate, po czym działanie jako reguła log (dynamic).
Sygnatury Snorta zazwyczaj składają się z dwóch głównych sekcji - nagłówka i ciała (treści). Nagłówek określa m.in., jaką akcję należy podjąć po przypasowaniu reguły, informacje o wykorzystanym protokole, adresy bądź porty źródłowe i docelowe. Ciało reguły pozwala rozwinąć informacje zawarte w nagłówku, tu także podaje sią treść wzbudzanych alarmów i różnego rodzaju informacje dodatkowe (np. odniesienia do bazy z opisami danego naruszenia, tzw. referencje - Bugtraq, CERT czy CVE).
Najprostsze sygnatury obejmują wskazanie akcji, protokołu, kierunku, adresów i portów będących przedmiotem obserwacji, jak np. poniższa reguła, stanowiąca reakcję na próbę skorzystania z usługi pop3 (port 110):
log tcp any any -> 192.168.1.0/24 110 |
W sygnaturach można umieszczać zmienne zdefiniowane jako adresy sieci (wg CIDR) lub porty zapisane w pliku konfiguracyjnym snort.conf:
log tcp $EXTERNAL_NET -> $HOME_NET 110 |
W podanych powyżej regułach wykorzystany był jednokierunkowy operator "->". Język sygnatur umożliwia zadeklarowanie reguły, który dopasuje pakiety poruszające się w obu stronach operatorem dwukierunkowym "<>", np.:
alert tcp any any <> $HOME_NET 23 |
Do zasadniczej części reguły można dodać ograniczone okrągłymi nawiasami pole opcjonalne (tzw. ciało), zawierające definicję bardziej złożonych i wyrafinowanych działań związanych z przejęciem danego pakietu. Użytkownik może także sformułować własny komunikat, np.:
log tcp $EXTERNAL_NET -> $HOME_NET 110 \ ("msg: Proba polaczenia z pop3";) |
Podjęte działania nie muszą być ograniczone do pojedynczej czynności. Średnik separuje deklaracje poszczególnych działań, jak w poniższym przykładzie, w którym opcją content testowana jest treść przesyłanego strumienia TCP, a w razie odnotowania podejrzanego ciągu znaków generowany jest odpowiedni komunikat:
alert tcp any any -> 192.168.1.0/24 80 (content: "/cgi-bin/phf"; \ msg: "PHF probe!";) |
Opcji content
można użyć nawet kilka razy w jednej regule.
Pozwala to na wyszukiwanie wielu różnych ciągów znaków w
obrębie przesyłanych treści.
Warto nadmienić, iż do przeszukania treści pakietów i reasemblowanych strumieni używany jest obecnie najbardziej efektywny algorytm - Boyera-Moore'a, którego wydajność rośnie wraz z długością poszukiwanych ciągów. Możliwość rekonstrukcji całych strumieni transmisji TCP, wglądu w warstwę aplikacyjną i efektywne wyszukiwanie treści pozwala na walkę przy użyciu Snorta również z zainfekowanymi załącznikami elektronicznych listów. Oprócz przeszukiwania treści pakietów możemy badać pod różnymi kątami ich nagłówki, m.in. pola i kody ICMP, pole TTL, rozmiary fragmentacji czy numery sekwencji.
Bardzo silną konstrukcją w regułach Snorta jest możliwość aktywowania kolejnych reguł po pierwszym dopasowaniu. Konstrukcja ta nosi nazwę activate/dynamic rules i wygląda w następujący sposób:
activate tcp any any -> $HOME_NET 143 (flags: PA; content: \ "|E8C0FFFFFF|bin|;activates: 1; msg: "IMAP buffer overflow!";) dynamic tcp any any -> $HOME_NET 143 (activated_by: 1; count: 50;) |
Opcje activates
i
activated_by
wiążą reguły
activate
i
dynamic
. W powyższym przykładzie wykrycie ataku typu buffer
overflow na serwer IMAP powoduje uruchomienie kolejnej,
dynamicznej reguły, która zbiera treść następnych 50 pakietów
(opcja count) w celu późniejszej analizy. Druga opcja w reguły
dynamicznej jest obligatoryjna - reguła zawierająca wyłącznie
opcję dowiązania do innej, macierzystej konstrukcji jest
bezużyteczna.
Następne godne uwagi parametry, to
resp
i react
wspierają
mechanizm elastycznego reagowania na atak. Opcja
resp
może
doprowadzić do zerwania połączenia, np. poprzez wysłanie do
atakującego komunikatu ICMP o niedostępności trasy do
zaatakowanego komputera, natomiast react
służy do blokowania
dostępu do usług związanych z WWW.
Nessus - sieciowy tester bezpieczeństwa, przydatny do określania skuteczności skonfigurowanego przez nas Snorta.
SnortALog - skrypt Perlowy pozwalający na generowanie różnego rodzaju raportów, grafów i statystyk. Korzystając z logów Snorta, format wygenerowanych raportów może stanowić plik tekstowy, HTML, a nawet PDF.
Snort Inline - poprawka dla Snorta, umożliwiająca współprace z regułami firewalla IPtables, stosowanego w systemach opartych na jądrze Linux. Specjalnie sformułowane sygnatury Snorta, reagują na atak i blokują bądź przekierowują za pomocą ściany ogniowej drogę pakietów pochodzących od intruza.
SnortSam - jest to zestaw pluginów do Snorta pełniących podobną funkcje jak Snort Inline, ale wspomagająca większą liczbę różnego rodzaju zapór ogniowych (m.in. Checkpoint Firewall-1, Cisco PIX, Cisco Routers z ACL, Netscreen, IP Filter dla *BSD, Linux IPchains, Linux IPtables, WatchGuard Firebox).
FLoP - projekt ma na celu, przyspieszenie logowania w procesie wykrywania włamań. Do tego wykorzystuje odpowiednie bufory i możliwość szybkiego zapisu przez gniazdo unixowe do baz danych MySQL i PostgreSQL. Bardzo przydatne narzędzie przy pracy w sieciach o dużej przepustowości.
W PLD domyślnie instalowanym systemem magazynowania zdarzeń systemowych (logów) jest syslog-ng (syslog - new generation), zajął on miejsce klasycznego tandemu syslogd i kalogd. Jest to program o bogatych opcjach konfiguracji, zapewniający większą pewność działania, a co za tym idzie większe bezpieczeństwo logów.
Większe bezpieczeństwo zapewnia możliwość użycia protokołu TCP w komunikacji z tzw. loghostem, aby jednak korzystać z dobrodziejstw tego protokołu na obu maszynach musi być użyty demon "nowej generacji". Możliwa jest także komunikacja z klasycznym syslogiem, w tym wypadku musimy użyć protokołu UDP i portu 514 (wartość domyślna dla syslog-ng).
Syslog-ng jest dostarczany z rozbudowanym plikiem konfiguracji, znajdziemy w nim wiele gotowych do wykorzystania przykładów.
Konfiguracja demona polega na zdefiniowaniu pewnych obiektów, a na następnie połączenie ich ze sobą w reguły. Mamy trzy rodzaje obiektów: źródła, filtry i cele. Źródła wskazują miejsca pochodzenia komunikatów, filtry pozwalają selekcjonować dane, cele zaś wskazują sposób i miejsce magazynowania logów (zwyczajowo jako pliki tekstowe w katalogu /var/log). Całą konfigurację umieszczamy w jednym pliku: /etc/syslog-ng/syslog-ng.conf.
Źródła - definiujemy je następująco:
source $nazwa { $źródło($opcje); };
najpopularniejsze źródła komunikatów to:
internal - komunikaty demona syslog-ng
tcp - komunikaty od innych komputerów w sieci (TCP)
udp - komunikaty od innych komputerów w sieci (UDP)
pipe - nazwane potoki
unix-stream - gniazda uniksowe
source src { internal(); }; source udp { udp(); }; source tcp { tcp(ip(192.168.1.5) port(1999) max-connections(20)); }; |
Pierwszy z przykładów jest źródłem komunikatów syslog-a. Drugi tworzy źródło komunikatów wysyłanych z dowolnej maszyny w sieci - nasłuch na domyślnym porcie (514 UDP). Trzeci oczekuje komunikatów od komputera 192.168.1.5 na porcie 1999 z ograniczeniem do 20 połączeń.
Filtry:
filter $nazwa { $rodzaj($wartość); };
rodzaje:
facility - pochodzenie zdarzenia: cron, daemon, mail, ... - szczegóły w dodatku
level - priorytet: emerg, alert, crit, ... - szczegóły w dodatku
host - filtrowane po nazwie hosta z użyciem wyrażeń regularnych
program - filtrowane po nazwie programu z użyciem wyrażeń regularnych
filter f_emergency { level(emerg); }; filter f_daemon { facility(daemon); }; filter f_foo { host("foo"); }; filter f_su_sudo { program("^su|sudo$"); }; |
W filtrach możemy używać operatorów logicznych (and, or, not):
filter f_syslog { not facility(authpriv, cron, lpr, mail, news); }; filter f_ppp { facility(daemon) and program(pppd) or program(chat); }; |
Cele - ogólna definicja:
destination $nazwa { $cel($miejsce); };
najpopularniejsze cele:
file - plik tekstowy / urządzenie znakowe (/dev/)
usertty - ekran terminala wskazanego użytkownika
tcp - komunikaty do loghosta (TCP)
udp - komunikaty do loghosta (UDP)
destination kernel { file("/var/log/kernel"); }; destination console_all { file("/dev/tty12"); }; destination root { usertty("root"); }; destination loghost { udp("10.0.0.1"); }; |
Regułki - budujemy je na samym końcu, kiedy mamy już zdefiniowane źródła, filtry i cele:
log { source($źródło); destination($cel); };
log { source($źródło); filter($filtr1); filter($filtr2); destination($cel); };
np.:
log { source(src); destination(console_all); }; log { source(src); filter(f_emergency); destination(loghost); }; |
Aby zmiany weszły w życie oraz utworzone zostały nowe pliki dzienników, należy ponownie uruchomić demona:
# service syslog-ng reload |
Najlepszą metodą sprawdzenia konfiguracji sysloga jest wysłanie własnych komuników systemowych. Posłużymy się w tym celu programem logger, pozwalającym wysyłać dowolne komunikaty z wiersza poleceń. Dla naszych potrzeb wywołujemy program następująco:
logger -p {$źródło}.{$poziom} {$komunikat} np.:
# logger -p mail.warning Test ostrzeżenia |
Podobnie jak poprzednik nie kontroluje objętości logów, tak więc nie można zapomnieć o programie rotującym np. logrotate.
Domyślnie demon nie nasłuchuje komunikatów z sieci, definicja źródła za to odpowiedzialna jest wykomentowana.
W ramach ochrony przed atakami DoS syslog-ng obsługuje domyślnie do 10 połączeń sieciowych, aby to zmienić należy użyć parametru "max-connections" w opcjach źródła (patrz przykłady).
System operacyjny posiada wewnętrzny, niezależny od demona logów, schemat klasyfikowania zdarzeń, dzielą się one na dwie grupy:
Pochodzenie komunikatów (facility):
Priorytety (level):
Rozdział opisuje konfigurację środowiska graficznego.
W rozdziale tym postaramy pomóc w stworzeniu systemu "biurkowego", czyli systemu z X-Window. Będziemy tu opisywać implementację X.Org, więcej na jej temat można znaleźć na witrynie projektu http://www.x.org/wiki/. Sam proces tworzenia desktopu możemy podzielić na dwa etapy:
Instalacja i konfiguracja serwera protokołu X11
Instalacja i konfiguracja menedżera okienek dla X.org (przedstawimy tutaj KDE i GNOME)
Od razu należy przestrzec, że środowisko graficzne jest obsługiwane przez skończoną liczbę urządzeń (dotyczy to zwłaszcza kart graficznych) i może się niestety zdarzyć, że posiadamy kartę graficzną, która nie jest obsługiwana. Dotyczy to głównie najnowszego sprzętu, starsze modele mają dosyć dobre wsparcie.
W przypadku kart firm firm ATI i NVIDIA, mamy dostępne zarówno sterowniki będące częścią X.Org jak i sterowniki zamknięte, tworzone przez samych producentów. Nielicznymi zaletami tych drugich jest bardzo dobra wydajność i pełne wsparcie dla akceleracji grafiki trójwymiarowej.
Na początku, korzystając z programu poldek instalujemy konieczne pakiety. W przypadku Ac będą to:
$ poldek -i X11 X11-modules X11-fonts-100dpi-ISO8859-2 X11-setup \ X11-imake X11-libs X11-Xserver X11-OpenGL-libs X11-fonts \ X11-common X11-fonts-base X11-xauth X11-fonts \ X11-fonts-75dpi-ISO8859-2 X11-OpenGL-core X11-fonts-100dpi \ X11-fonts-ISO8859-2 X11-sessreg |
W Th zmieniły się nazwy pakietów i są o wiele bardziej rozdrobnione, zaczynamy od instalacji rdzenia X-Serwera i podstawowych sterowników:
$ poldek -i xorg-xserver-server \ xorg-driver-input-keyboard \ xorg-driver-input-mouse |
$ poldek -i xorg-driver-video-nv |
$ poldek -i xorg-driver-video-ati |
$ poldek -i xorg-driver-video-vesa |
Użytkownicy myszek PS/2 lub USB, którzy nie korzystają z dobrodziejstw udeva muszą załadować oprócz modułu huba USB moduły:
# modprobe psmouse # modprobe usbhid |
Aby moduły ładowały się za każdym razem, gdy uruchamiamy system, należy dodać ich nazwy do pliku /etc/modules. Więcej o zarządzaniu modułami w sekcja Statyczne zarządzanie modułami w rozdział Kernel i urządzenia.
X.Org nie wymaga pliku konfiguracji do podstawowego działania, po uruchomieniu automatycznie próbuje wykryć dołączony sprzęt. X-Serwer uruchamiamy następująco:
# X |
Teraz możemy przejść do konfiguracji X-Servera lub do uruchomienia środowiska graficznego. Warto przeprowadzić przynajmniej podstawową konfigurację, by uzyskać większą ergonomię pracy, ustawić układ klawiatury dla danego języka, czy obsłużyć dodatkowe możliwości sprzętu.
Generujemy wstępną konfigurację serwera X11:
# X -configure |
W wyniku działania w/w polecenia w katalogu domowym użytkownika (w tym wypadku /root/) powstanie plik xorg.conf.new. X-Server stara się rozpoznać używany przez nas sprzęt i ustawia właściwe parametry w pliku konfiguracji.
Przenosimy plik we właściwe miejsce:
# mv ~/xorg.conf.new /etc/X11/xorg.conf |
Teraz możemy spróbować, czy serwer nam się uruchamia:
# X |
W ten oto sposób mamy wstępnie skonfigurowany X-Server i możemy rozpocząć pracę w środowisku graficznym. Wskazówki bardziej wyrafinowanej konfiguracji odnajdziemy w sekcja Zaawansowane. Część z nich będziemy mogli dokonać za pomocą poniżej opisanych programów (np. xorgcfg -textmode), bardziej zaawansowane opcje ustawimy wyłącznie edytując plik konfiguracji.
Z aplikacją dostarczane są dodatkowo dwa programy do konfiguracji, obydwie można użyć do generowania pliku konfiguracji zamiast operacji X -configure, pozwalają na precyzyjnie ustawianie parametrów X-Servera X -configure, jednak wymagają też więcej wiedzy i pracy.
xorgcfg -
program który może działać w dwóch trybach: graficznym i
tekstowym (z użyciem parametru -textmode
). Program
ma tą zaletę, że może modyfikować istniejący plik konfiguracji.
O ile wygodę trybu graficznego można uznać za dyskusyjną, o tyle
tryb tekstowy nie powinien sprawiać nikomu problemów.
xorgconfig - jest to konsolowe narzędzie, które prowadzi krok po kroku przez kolejne etapy konfiguracji. W zasadzie to przydaje się do generowania pliku konfiguracji po raz pierwszy (zamiast X -configure), jeśli chce się dokonać jakiejkolwiek zmiany trzeba przechodzić przez wszystkie kroki na nowo. Program ten dodatkowo dodaje do pliku liczne komentarze, co nie wszystkim odpowiada.
Jeżeli pojawi się jakiś problem musimy przeanalizować komunikaty wypisywane na ekran i do pliku /var/log/Xorg.0.log. Błędy są oznaczane dwoma literkami EE np.:
(EE) Failed to load module "ati" (module does not exist, 0) |
Do wyboru mamy dwa potężne, zintegrowane środowiska: KDE i Gnome, nieco mniejsze XFCE4, czy całkiem proste np. : blackbox, fluxbox będące jedynie zarządcami okien i pulpitu. środowiska opisaliśmy w dalszych rozdziałach. Oprócz środowiska musimy wybrać sposób jego uruchamiania. Możemy uruchamiać je z wiersza poleceń za pomocą skryptu startx lub demonów GDM/KDM. Zagadnienia te szczegółowo omówiliśmy w sekcja Uruchamianie środowiska graficznego.
W tym miejscu zajmiemy się bardziej zaawansowaną konfiguracją X-Servera. Zakładam, że istnieje wstępnie skonfigurowany plik /etc/X11/xorg.conf, za pomocą polecenia X -configure. Wiele opisanych tu czynności konfiguracyjnych dla konkretnych podsystemów, wykonujemy za pomocą programu xorgcfg, uruchamiamy go w trybie tekstowym :
# xorgcfg -textmode |
Bardziej zaawansowane będą wymagały ingerencji za pomocą edytora tekstu, przypominam, że "obrabiamy" plik # /etc/X11/xorg.conf.
Zakładam, że w programie wybraliśmy sekcję konfiguracji myszki.
Dla współczesnych myszek, w konfiguracji protokołu wybieramy
Auto
, dla myszek szeregowych wybierzemy
Microsoft
. Następnie konfigurator spyta o to,
czy dla myszek dwuprzyciskowych włączyć emulację trzeciego klawisza,
w przypadku myszek o większej ilości przycisków odpowiadamy
negatywnie. Jako urządzenie
wybieramy /dev/input/mice.
Po zapisaniu wybranej konfiguracji, otrzymamy w sekcji
ustawień myszy w pliku /etc/X11/xorg.conf
fragment o zbliżonej konstrukcji:
Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "Auto" Option "Device" "/dev/input/mice" Option "ZAxisMapping" "4 5 6 7" EndSection |
Jeśli posiadamy myszkę z wieloma klawiszami i rolkami, a standardowy sterownik nie radzi sobie z obsługą wszystkich zdarzeń, to możemy wybrać bardziej nowoczesny i elegancki sposób na uruchomienie naszego sprzętu - evdev. Przykładowa instalacja i konfiguracja zostanie przedstawiona dla popularnej myszki Logitech MX500. Pierwszym krokiem jest załadowanie modułu jądra modprobe evdev oraz instalacja pakietu xorg-driver-input-evdev (X11-driver-evdev dla Ac). Następnie odszukujemy w /proc/bus/input/devices numer urządzenia eventX naszej myszki i wpisujemy do konfiga X.Org poniższą sekcję:
Section "InputDevice" Identifier "Mouse1" Driver "evdev" Option "Device" "/dev/input/event1" Option "Buttons" "10" EndSection |
Nowo wygenerowany plik konfiguracji nie zawiera opcji lokalnych,
aby je ustawić, z menu programu wybieramy Configure keyboard,
Jako model (Keyboard model)
wybieramy np. Generic 104-key PC
,
a w Keyboard layout ustawiamy Poland
.
Powyższa operacja wygeneruje następującą konfigurację klawiatury:
Section "InputDevice" Identifier "Keyboard0" Driver "kbd" Option "XkbModel" "pc104" Option "XkbLayout" "pl" EndSection |
Jeśli posiadamy klawiaturę multimedialną i chcemy wykorzystywać jej dodatkowe klawisze, to musimy wybrać odpowiedni model klawiatury. Nasz wybór będzie dotyczył wartości parametru XkbModel, następnie musimy sprawdzić za pomocą programu xev czy wszystkie zdarzenia z klawiszy multimedialnych są prawidłowo obsługiwane przez X-serwer.
Właściciele monitorów LCD/Plasma są na uprzywilejowanej pozycji, jeśli sterownik karty graficznej potrafi "porozumieć się" z monitorem (za pomocą DDC), to nie są wymagane żadne czynności konfiguracyjne. Aby detekcja następowała automatycznie musimy w pliku konfiguracji postawić znak komentarza ("#") przed opcjami HorizSync, VertRefresh.
W pozostałych przypadkach musimy określić parametry monitora. Wybierając opcje programu Configure monitor, będziemy będziemy mogli wybrać jakiś monitor z listy lub podać parametru własnego urządzenia: Enter your own horizontal sync range. Tu podajemy wartości HorizSync (w kHz) i VertRefresh w (Hz) zgodne ze specyfikacją naszego urządzenia. Po zapisaniu pliku konfiguracji otrzymamy:
Section "Monitor" Identifier "Monitor0" HorizSync 31.5 - 96.0 VertRefresh 50 - 100 Option "DPMS" EndSection |
O ile HorizSync jest opcją ściśle zależną od możliwości monitora i pod żadnym pozorem nie powinniśmy jej dowolnie zmieniać, o tyle VertRefresh daje więcej swobody. Za jej pomocą ustawiamy odświeżanie obrazu, Nie możemy oczywiście przekroczyć parametrów monitora, ale możemy ustawić minimalne odświeżanie, np. 85 - 85 wymusi częstotliwość 85Hz. (oczywiście pod warunkiem, że nasz monitor, przy danej rozdzielczości pozwala na wyświetlanie z taką wartością).
Wstępnie plik konfiguracji nie zawiera żadnych definicji rozdzielczości i będzie ona ustalana automatycznie, co jest wskazane przy monitorach LCD/Plasma. W przypadku monitorów CRT, zapewne będziemy chcieli użyć najbardziej ergonomicznej. Mamy tu dwa wyjścia, możemy nic nie ustawiać w X.Org, ale za to ustawić ją w aplikacjach konfiguracyjnych środowisk Gnome/KDE, lub ustawić ją na stałe w konfiguracji X-serwera. Możliwości ustawień konfiguratorów w środowiskach graficznych są dosyć skromne, dlatego niektórzy pokuszą się zapewne o ustawienie odpowiednich wartości na stałe.
Po wybraniu Configure screen w programie, zostaniemy zapytani o ilość dostępnych kolorów, dla współczesnego sprzętu bez zastanowienia możemy wybrać 24bity na piksel a następnie wybieramy listę rozdzielczości, które mają być dostępne. W większości wypadków wystarczy nam jedna rozdzielczość. Oczywiście musi być obsługiwana przez monitor. Zapisana konfiguracja może wyglądać następująco:
Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" SubSection "Display" Viewport 0 0 Depth 24 Modes "1024x768" EndSubSection EndSection |
X.Org pozwala na wskazanie DPI (dots per inch), w celu lepszego dopasowania wielkości wyświetlanych czcionek ekranowych. W przypadku współczesnych monitorów, za pomocą DDC odczytywany jest rozmiar obszaru wyświetlania, by automatycznie określić DPI. Dla monitorów, które nie posiadają takiej możliwości lub podają ją nieprawidłowo, będziemy mogli sami ten parametr ustawić. Wartość DPI można też ustawić bezpośrednio w konfiguracji środowiska (np. w Gnome) my jednak pokażemy jak zrobić do w X-serwerze. W sekcji Monitor pliku konfiguracji należy dodać opcję:
DisplaySize $x $y |
gdzie parametry $x i $y są wymiarami w milimetrach, odczytanymi z dokumentacji urządzenia lub po prostu zmierzonymi linijką. Sekcja konfiguracji monitora może wyglądać następująco:
Section "Monitor" Identifier "Monitor0" HorizSync 31.5 - 96.0 VertRefresh 50 - 100 DisplaySize 269 201 EndSection |
Zaczynamy od instalacji serwera XFS(Th): xorg-app-xfs, w przypadku Ac jest to pakiet X11-xfs. Dla wygody założymy także, że będziemy korzystać z serwera czcionek X11-xfs, który uruchamiamy poleceniem /etc/init.d/xfs start. Dlatego też sekcja dotycząca czcionek w pliku xorg.conf.new powinna wyglądać podobnie do podanego niżej przykładu:
Section "Files" RgbPath "/usr/X11R6/lib/X11/rgb" # FontPath "/usr/X11R6/lib/X11/fonts/local/" # FontPath "/usr/X11R6/lib/X11/fonts/misc/" # FontPath "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled" # FontPath "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled" # FontPath "/usr/X11R6/lib/X11/fonts/Type1/" # FontPath "/usr/X11R6/lib/X11/fonts/Speedo/" # FontPath "/usr/X11R6/lib/X11/fonts/75dpi/" # FontPath "/usr/X11R6/lib/X11/fonts/100dpi/" FontPath "unix/:7100" # ModulePath "/usr/X11R6/lib/modules" EndSection |
Czyli komentujemy wszystkie wywołania bezpośrednie do czcionek i przekazujemy obsługę zarządzania czcionkami serwerowi xfs.
Parametry monitora mogą być odczytywane za pomocą modułu DDC, o ile monitor jest włączony. Powinniśmy zatem włączać monitor przed uruchomieniem X-Servera lub ustawić "na sztywno" jego parametry, inaczej w skrajnym wypadku obraz będzie miał rozdzielczość 640x480, przy odświeżaniu 60Hz.
GNOME jest rozbudowanym środowiskiem, dodatkowo filozofia mikropakietów w PLD nie ułatwia jego instalacji początkującym. Aby temu zaradzić stworzone zostały metapakiety, które oszczędzą nam sporej ilości pracy, oto ich zestawienie:
metapackage-gnome - główna część środowiska
metapackage-gnome-extras - dodatki
metapackage-gnome-extras-accessibility - narzędzie ułatwień dostępu
metapackage-gnome-office - pakiet aplikacji biurowych
poldek> install metapackage-gnome |
Jeśli jednak jesteśmy zwolennikami instalacji tylko tego co jest potrzebne, musimy instalować każdy pakiet z osobna:
poldek> install gnome-desktop gnome-session nautilus xscreensaver-gnome2 gnome-themes \ gnome-icon-theme gnome-panel gnome-splash-gnome metacity \ gnome-applets |
Lista komponentów i aplikacji dla GNOME jest w PLD imponująca, aby łatwiej było się odnaleźć w tym gąszczu, zachęcamy do zapoznania się z zestawieniem aplikacji w dalszej części rozdziału.
Aby GNOME i GDM obsługiwały język inny niż angielski, należy ustawić tzw. Locale, co zostało opisane w sekcja Internacjonalizacja w rozdział Konfiguracja systemu, a następnie wybrać preferowany język: Language z menu GDM-a.
Zakładam, że już została skonfigurowana już ALSA, zgodnie ze wskazówkami opisanymi w sekcja ALSA - Dźwięk w Linuksie w rozdział Usługi dostępne w PLD. Od GNOME 2.26 dźwięk jest obsługiwany przez aplikację pulseaudio, zapewniającą programowe miksowanie dźwięku z wielu źródeł, czy też przesyłanie strumienia za pośrednictwem sieci. Instalujemy:
$ poldek -i pulseaudio pulseaudio-gconf pulseaudio-alsa gstreamer gstreamer-audiosink-esd |
$ poldek -i gstreamer-audio-formats gstreamer-mad |
$ poldek -i gnome-media gnome-applets-mixer totem gnome-audio |
Zanim uruchomimy środowisko, musimy się upewnić, czy nazwa hosta (opcja HOSTNAME z pliku /etc/sysconfig/network) jest przypisana do adresu IP. Aby to ustawić, należy dodać odpowiedni wpis do pliku /etc/hosts, zgodnie ze wskazówkami zawartymi w sekcja Podstawowa konfiguracja sieci w rozdział Interfejsy sieciowe, np.:
127.0.0.1 pldmachine |
GST to zestaw wygodnych narzędzi administracyjnych, obsługujących PolicyKit. Pozwala na zarządzanie m.in. usługami, użytkownikami oraz siecią. Instalacja:
$ poldek -i gnome-system-tools system-tools-backends |
# /etc/init.d/system-tools-backends start |
# groupmod -A jkowalski adm |
O wygodzie pracy w środowisku czasami decydują drobiazgi, oto lista takich niewielkich narzędzi, przydatnych w codziennej pracy:
gnome-volume-manager - narzędzie do zarządzania woluminami wymiennymi: montowaniem nośnikow, odtwarzaniem muzyki i innymi
gnome-utils-screenshot - program do szybkiego wykonywania zrzutów ekranu.
nautilus-cd-burner - rozszerzenie do nautilusa służące do nagrywania płyt CD/DVD
gnome-system-monitor - monitor zasobów i procesów
gnome-utils-search-tool - wyszukiwarka plików
Zaletą złożonych środowisk takich jak GNOME czy KDE jest duża liczba programów, które dobrze integrują się ze środowiskiem, poniżej została zamieszczona lista użytecznych programów.
gnome-terminal - rozbudowany emulator terminala z obsługą zakładek
gcalctool - wielofunkcyjny kalkulator
totem - odtwarzacz audio i video.
Exaile, Quod Libet i Rhythmbox - wygodne odtwarzacze audio z dobrą obsługą dużych bibliotek muzyki, wszystkie obsługują gstreamera.
eog - Eye of GNOME - narzędzie do przeglądania obrazków
evince - program służący do przeglądania dokumentów w formatach pdf, postscript i wielu innych.
gedit2 - edytor tekstu z obsługą kolorowania składni języków programowania i wtyczek.
epiphany - przeglądarka WWW z silnikiem renderującym Gecko
evolution - rozbudowany klient poczty i narzędzie do planowania zadań
gajim - klient Jabbera
file-roller - zarządca archiwów - jest graficznym interfejsem dla własciwych narzędzi archiwizacji danych
Brasero (dawniej Bonfire) - komfortowe narzędzie do nagrywania płyt CD/DVD.
Więcej na stronie www.gnome.org/projects/, warto też odwiedzić stronę www.gnomefiles.org, będącej bogatym zestawieniem aplikacji bardziej lub mniej związanych ze środowiskiem.
GNOME jest dostarczane z pokaźną dokumentacją - niestety brak jest polskiego tłumaczenia. Jest dostępna dla aktywnego okna po wciśnięciu przycisku F1 lub po wywołaniu programu yelp - przeglądarki dokumentacji. Musimy tylko doinstalować konieczne pakiety:
$ poldek -i gnome-user-docs yelp |
Jeśli natkniemy się na jakieś problemy z działaniem aplikacji, na początek powinniśmy zajrzeć do specjalnego dziennika błędów:
$ cat ~/.xsession-errors |
Poniżej przedstawiamy listę zalecanych pakietów dla KDE:
kdeaddons-ark kdeadmin-kpackage kdebase-desktop kdebase-kate \ kdebase-konsole kdebase-kwrite kdegraphics-kfile \ kdegraphics-kghostview kdegraphics-kpdf kdemultimedia-akode \ kdemultimedia-juk kdemultimedia-kaboodle kdemultimedia-kfile \ kdemultimedia-kmid kdemultimedia-kmix kdemultimedia-kscd \ kdemultimedia-mpeglib kdenetwork-kget kdesdk-kfile \ kdeutils-ark kdeutils-kcalc kdeutils-kedit kdeutils-kfloppy \ kdeutils-kwalletmanager konqueror |
Aby móc uruchomić KDE dla danego użytkownika, w jego katalogu domowym wykonujemy polecenie:
$ echo "kde" >.desktop |
Od tej chwili, domyślnym środowiskiem graficznym dla tego użytkownika jest KDE, które możemy uruchomić za pomocą polecenia startx.
Blackbox jest lekkim menedżerem okien dla XFree86. Jest napisany w C++, a jego projekt zakładał wydajność, niskie użycie pamięci oraz brak zależności od zewnętrznych bibliotek. Blackbox zabiera bardzo niewiele miejsca na ekranie na dekoracje okien. Mimo swojego minimalizmu, jest bardzo wygodny i funkcjonalny. Zawiera wszystko, czego oczekuje się od menedżera okien - obsługę wirtualnych pulpitów, okna typu sticky, zwijanie okien, okna pozbawione dekoracji. Posiada też pasek dokowania, zwany slitem, na którym mogą umieszczać się aplety w stylu NEXTstep (np. Window Maker, AfterStep) oraz okna w trybie withdrawn (np. gkrellm). Te cechy sprawiły, że Blackbox stał się całkiem popularny wśród osób nie lubiących przeładowania towarzyszącego środowiskom KDE i GNOME
Dzięki swoim zaletom Blackbox stał się na tyle znany, że wypączkowało z niego kilka odmian z nowymi cechami. Należą do nich Fluxbox, Openbox i Kahakai. Blackbox i jego pochodne są doskonałym wyborem, jeśli pożądane jest oszczędzanie pamięci i niskie wykorzystanie procesora. Są też dobre dla tych, którzy wolą elegancję ponad nadmiar elementów, jaki występuje w popularnych środowiskach. My w tym opisie zajmiemy się instalacją Blackbox.
Czas zainstalować potrzebne nam pakiety.
# poldek -i blackbox vfmg xinitrc |
Instalacja zajmuje bardzo mało czasu, ponieważ jak już wspomniane zostało wcześniej Blackbox jest bardzo mało wymagający jeżeli chodzi o zasoby.
Teraz aby Blackbox był naszym domyślnym menadżerem okien należy ustawić go w pliku /etc/sysconfig/desktop
# cat /etc/sysconfig/desktop # PREFERRED can be GNOME, KDE or empty # when left empty $DEFAULTWM will be started PREFERRED=blackbox DEFAULTWM= # Default window manager to use. Should be basename of file from # /etc/sysconfig/wmstyle/ WMSTYLE= |
W tym momencie mamy już skonfigurowanego Blackbox i w zasadzie można by go już uruchomić ale my skonfigurujemy sobie menu, aby było zgodne z zainstalowanymi przez nas programami
W tym celu z pomocą przyjdzie nam program vfmg, który już wcześniej zainstalowaliśmy. Komendy które są poniżej należy wykonywać w katalogu domowym ~/
# mkdir ~/.blackbox # vfmg blackbox > .blackbox/menu |
Mamy już gotowe menu, ale nie ma w nim opcji "Wyjście", która jest niewątpliwie przydatną opcją.
W ~/.blackbox/menu należy pod sam koniec dopisać "Wyjście" tak, aby 3 ostatnie linijki wyglądały następująco:
# tail -3 ~/.blackbox/menu [end] [exit] (Wyjście) [end] |
Dodatkowo należy edytować plik ~/.blackboxrc i zmienić w nim linijkę session.menuFile na:
# grep menu .blackboxrc session.menuFile: .blackbox/menu |
Mając już menu Blackbox możemy go wreszcie uruchomić:
# startx |
Aby wszystko poprawnie funkcjonowało należy zapoznać się z działem "Konfiguracja środowiska graficznego", który znajduje się w dokumentacji PLD.
Młodszym bratem BlackBoxa jest Fluxbox, bazujący na kodzie Blackboxa. Fluxbox wygląda tak samo jak Blackbox, który korzysta z tych samych styli, kolorów, położenia okien i generalnie jest zachowana pełna kompatybilność z Blackboxem.
Jakie są więc różnice? Odpowiedź brzmi: DUŻE. Np:
Konfigurowalne taby okien
Pasek ikon (do zminimalizowanych okien)
Scroll myszki używany do zmiany obszarów roboczych.
Wsparcie dla KDE i GNOME, a także rozszerzone wsparcie dla WindowMakera.
i jeszcze wiele innych udogodnień.
Czas zainstalować potrzebne nam pakiety.
# poldek -i fluxbox fluxconf |
Właściwie do pracy potrzebny nam jest tylko fluxbox, ale fluxconf trochę ułatwia konfiguracje.
Aby fluxbox był naszym domyślnym menadżerem okien w .Xclients dajemy wpis.
exec fluxbox |
wygląd menu można zmieniać edytując plik ~/.fluxbox/menu
Przykładowy wpis:
[begin] (Fluxbox) [exec] (aterm) {aterm -tr} [exec] (Run) {fbrun } [submenu] (Net) [exec] (PSI) {psi} [end] [end] |
Możemy także automatycznie wygenerować menu korzystając z programu vfmg. Instalujemy go poleceniem:
# poldek -i vfmg |
Następnie wydajemy polecenia:
# mkdir ~/.fluxbox # vfmg blackbox > ~/.fluxbox/menu |
Mamy już gotowe menu, ale nie ma w nim opcji "Wyjście", która jest niewątpliwie przydatną opcją.
W ~/.fluxbox/menu należy pod sam koniec dopisać "Wyjście" tak, aby 3 ostatnie linijki wyglądały następująco:
# tail -3 ~/.blackbox/menu [end] [exit] (Wyjście) [end] |
Chcąc dodać tło pulpitu możemy się posłużyć np. programem dispalay z pakietu ImageMagik. Instalujemy go:
# poldek -i ImageMagick |
dodatkowo konieczne jest doinstalowanie modułów kodera dla plików np. jpeg, png i tiff
# poldek -i ImageMagick-coder-jpeg-5.5.7.12-2 ImageMagick-coder-png-5.5.7.12-2 ImageMagick-coder-tiff-5.5.7.12-2 |
następnie w pliki ~/.fluxbox/init odszukujemy wpis:
session.screen0.rootCommand: i dodajemy: display -size ROZDZIELCOZŚĆ -window root NAZWA_PLIKU_Z_GRAFIKA |
u mnie wpis ten wygląda następująco:
session.screen0.rootCommand: display -size 1024x768 \ -window root ~/DREAMVISIONS.jpg |
I to by było właściwie już tyle, można już uruchomić naszego menagera okien poleceniem
# startx |
Istnieją dwie metody uruchamiania środowiska, pierwszą jest uruchamianie systemu na trzecim poziomie pracy (domyślnie) i autoryzowaniu się w terminalu tekstowym. Po zalogowaniu uruchamiamy program startx. Drugą możliwością jest instalacja jednego ze specjalnych demonów: gdm (dla Gnome) kdm (dla KDE) lub xdm i dokonywanie autoryzacji za ich pośrednictwem. Demony te działają na piątym poziomie pracy, dlatego musimy skonfigurować system by domyślnie startował na tym poziomie. Estetyka i wygoda to nie jedyne zalety demonów, są one silnie zintegrowane ze swoimi środowiskami, dzięki czemu zapewniają wiele dodatkowych funkcji.
W tej metodzie po zalogowaniu się w terminalu, użytkownik wydaje polecenie startx. Na podstawie wpisu w pliku .xinitrc (w katalogu użytkownika) uruchamiane jest wskazane tam środowisko. Aby używać tej metody, musimy doinstalować potrzebne pakiety, w przypadku Ac wykonujemy polecenie:
$ poldek -i xinitrc-ng |
$ poldek -i xinitrc-ng xorg-app-xinit |
$ echo "gnome-session" >~/.xinitrc |
$ echo "exec gnome-session" >~/.xinitrc |
$ startx |
Gnome: gnome-session
KDE: startkde
XFCE: startxfce4
fluxbox: fluxbox
icewm: icewm
Zaczynamy od instalacji demona GDM:
poldek> install gdm gdm-init |
# service gdm start |
Instalujemy KDM
# poldek -i kdm |
Dla lokalnej pracy nie trzeba nic specjalnie konfigurować, więc od razu możemy uruchomić demona poleceniem:
# /etc/init.d/kdm start |
Pozostało nam jeszcze poinformować nasz system, że chcemy, aby nasz zarządca uruchamiał się po starcie systemu (na piątym poziomie).
W przypadku demonów GDM/KDM powinniśmy jeszcze skonfigurować system tak, by domyślnie uruchamiał się na piątym poziomie. pracy. Owe usługi uruchamiają się tylko na tym poziomie, poza tym jest to domyślny poziom dla aplikacji X-Window. Powinniśmy zmodyfikować plik /etc/inittab, zgodnie ze wskazówkami przedstawionymi w sekcja Zmiana poziomu pracy systemu w rozdział Administracja. Wiersz z opcją initdefault powinien wyglądać następująco:
id:5:initdefault: |
Należy za wszelką cenę unikać logowania się jako administrator (root), jeśli chcemy używać aplikacji wymagających wysokich uprawnień, powinniśmy je uruchamiać za pomocą programu sudo.
Do zainstalowania kart graficznych firmy NVIDIA zalecamy wykorzystać firmowe sterowniki nvidia. Z serwerem X11 dostarczany jest sterownik nv jednak w stosunku do firmowych sterowników jest zdecydowanie wolniejszy, chociaż w przypadku wykorzystania rivafb jesteśmy zmuszeni do użycia otwartych sterowników nv.
Aby wczytać sterowniki firmowe, należy za pomocą programu poldek zainstalować pakiety:
# X11-driver-nvidia kernel-video-nvidia |
Następnie w wygenerowanym pliku konfiguracyjnym serwera X11 dokonujemy zmian w sekcji Device Card0:
Identifier "Card0" Driver "nvidia" VendorName "nVidia Corporation" BoardName "NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]" BusID "PCI:1:0:0" Option "HWCursor" "on" Option "CursorShadow" "on" Option "DPMS" "on" Option "noDCC" "on" Option "NoLogo" "on" |
Czyli praktycznie zamieniamy ciąg znaków w linijce Driver z nv na nvidia.
Teraz wracamy do serwera X11 i jego testowego uruchomienia. W przypadku problemów standardowo zaglądamy w logi.
Do zainstalowania kart graficznych firmy ATI zalecamy wykorzystać firmowe sterowniki firegl. Z serwerem X11 dostarczane są także otwarte sterowniki X11-driver-ati - jednak nie wykorzystują one wszystkich możliwości jakie dają sterowniki firegl i dopiero przy dużych problemach z nimi możemy jako awaryjne skonfigurować serwer X11 z otwartymi sterownikami ATI.
Aby wczytać firegl, należy za pomocą programu poldek zainstalować pakiety:
# X11-driver-firegl kernel-video-firegl |
Następnie za pomocą programu fglrxconfig generujemy plik konfiguracyjny dla serwera X11. Oprócz pytań związanych z serwerem odpowiemy na szereg pytań dotyczących karty graficznej i monitora (możemy np. zdecydować o tym czy chcemy pracować w systemie jedno-monitorowym, czy też z monitorem i odbiornikiem TV).
Wygenerowany plik, tak jak przedstawiono to w rozdziale dotyczącym instalacji X11 należy z katalogu domowego użytkownika root do katalogu /etc/X11/ i dokonać ewentualnych korekt dotyczących myszy i obsługi czcionek
Aby karta graficzna została poprawnie zainicjowana musimy wczytać odpowiednie moduły kernela. Na początku musi to być moduł, który umożliwi nam prace karty z AGP - moduł ten jest zależny od posiadanej płyty głównej. Przykładowo dla płyt z chipsetem nforce2 jest to moduł:
# modprobe nvidia-agp |
Następnie wczytujemy moduł kernela obsługujący karty ATI:
# modprobe fglrx |
Aby zmiany były trwałe, dopiszmy oba moduły do pliku /etc/modules i wykonajmy polecenie depmod -a
Na koniec musimy się upewnić, że mamy zamontowany pseudo-system plików shm używany do obsługi dzielonej pamięci POSIX. Wymagany wpis w /etc/fstab wygląda następująco:
none /dev/shm tmpfs defaults 0 0 |
Teraz możemy wrócić do konfigurowania serwera X11 i jego testowego uruchomienia. Kiedy uruchomimy X-Window możemy sprawdzić poprawność konfiguracji pomocą programów glxinfo oraz glxgears uruchamianych z emulatora terminala (np. xterm-a). Pierwszy z nich wyświetla dokładne informacje o naszej karcie i sterowniku, zaś drugi to program do testowania wydajności. Dobrze skonfigurowana karta graficzna pozwala osiągnąć wydajność kilku tysięcy klatek na sekundę. W przypadku problemów standardowo zaglądamy w logi.
Każdego użytkownika Linuxa pracującego na swojej maszynie nachodziła refleksja na tematy filozoficzne - kto to wymyślił? kto to zrobił? i jak to zrobił? Pytania ciekawe - Prezentując sposób pracy przy PLD możemy częściowo zrozumieć mechanizmy tworzenia takich projektów.
Naszym miejscem pracy będzie samo PLD i dodatki, które poniżej spróbuje opisać. W chwili pisania tego tekstu była to wersja 1.0 ''Ra''. Później jest już z górki - instalujemy parę pakietów - sam proces instalacji w praktycznie zostanie pominięty, gdyż użytkownicy już powinni wiedzieć co to jest poldek i jak się go używa.
# rpm -qa |grep rpm rpm-4.0.2-106 rpm-build-tools-4.0.2-106 rpm-utils-4.0.2-106 rpm-perlprov-4.0.2-106 rpm-build-4.0.2-106 rpm-devel-4.0.2-106 rpm-pythonprov-4.0.2-106 # rpm -qa |grep cvs cvs-1.11.5-2 # rpm -qa |grep mc mc-4.5.55-10 |
Zwrócę uwagę tylko na CVS. Sposób instalacji środowiska bardzo dobrze opisuje Baseciq - ten krok należy wykonać ze szczególną starannością
Innym ważnym pakietem jest rpm plus dodatki. Głównym zajęciem szeregowego developera jest tworzenie lub modyfikacja plików .spec, które są głównym czynnikiem budowania pakietów RPM. Są jeszcze potrzebne różne inne pakiety i źródła - ale to już w zależności od tego co będziemy budować.
Największą skarbnicą wiedzy o RPMie i budowaniu pakietów możemy znaleźć w publikacji Maximum RPM - opis jest w języku angielskim i nie jest mi znane tłumaczenie na nasz język. Na szczęście są jeszcze inne źródełka, a także i niniejszy opis - więc powinno nam być lżej przyswajać wiedzę. Szczególnie polecam stronę Grzegorza Niewęgłowskiego (lub lokalną kopię) gdzie dużo teorii i praktycznych rad może nam rozjaśnić w naszych głowach czym jest praca ze "specami".
Jest dostępny także opis stworzony przez Developera PLD lecz z tego co się dowiedziałem jest już trochę leciwy i niektóre dane mogą być nieścisłe.
Po tej bombie teorii jaką niestety musimy przejść, czeka nas przestudiowanie jeszcze jednego dokumentu, którego najnowszą wersję możemy ściągnąć z CVS PLD. Będzie to nasze pierwsze ćwiczenie.
Uruchamiamy terminal (czy to zwykły, czy też np. przez SSH) i wykonujemy kroki:
$ cd rpm $ cvs get PLD-doc/devel-hints-pl.txt U PLD-doc/devel-hints-pl.txt $ |
Jak widać kroki wykonujemy jako zwykły użytkownik (nie root) i tej zasady będziemy się konsekwentnie trzymali.
Do katalogu ~/rpm/PLD-doc/ ściągneliśmy z repozytorium PLD dokument tekstowy devel-hints-pl.txt. W tym dokumencie zawarte są zalecenia i ustalenia jakich powinniśmy się trzymać aby tworzyć właściwe dla PLD pakiety RPM.
Teraz spróbujemy ściągnąć jakiś .spec z CVS PLD i zbudujemy sobie jakąś paczkę - np. pakiet tar (przykład budowania 'ekg' mogliśmy obejrzeć także podczas instalacji CVS na stronie Baseciq):
$ cd rpm $ cvs get SPECS/tar.spec U SPECS/tar.spec $ cd SPECS/ $ rpmbuild -ba tar.spec błąd: File /home/users/marekc/rpm/SOURCES/tar-1.13.25.tar.gz: \ Nie ma takiego pliku ani katalogu $ ./getsrc tar.spec Trying to download sources for tar-1.13.25-7 Searching for file: tar-1.13.25.tar.gz Trying CVS... OK Searching for file: tar-non-english-man-pages.tar.bz2 Trying CVS... OK Searching for file: tar-man_from_debian_tar_1.13.25-2.patch Trying CVS... OK Searching for file: tar-info.patch Trying CVS... OK Searching for file: tar-pipe.patch Trying CVS... OK Searching for file: tar-namecache.patch Trying CVS... OK Searching for file: tar-error.patch Trying CVS... OK Searching for file: tar-sock.patch Trying CVS... OK Searching for file: tar-nolibrt.patch Trying CVS... OK Searching for file: tar-man.patch Trying CVS... OK Searching for file: tar-ac25x.patch Trying CVS... OK Searching for file: tar-dots.patch Trying CVS... OK Searching for file: tar-pl.po-fix.patch Trying CVS... OK Download opreation completed: all files retrieved successfully |
W przykładzie, za szybko chcieliśmy zbudować pakiet - zaraz po ściągnięciu ''tar.spec''.
Sam .spec bez źródeł jest jak karabin bez amunicji... Można wykorzystać skrypt 'builder' (i później nawet zalecam go używać) w katalogu SPECS, który to sam przeanalizuje potrzeby i ściągnie odpowiedniego .speca (oczywiście jeżeli tylko zawiera go repozytorium CVS), źródła i wykona paczki rpm i srpms - ale my nie będziemy tutaj sobie za bardzo ułatwiać pracy :-)
Po ściągnięciu plików dobrze jest obejrzeć danego .speca aby zobaczyć, co jest jeszcze potrzebne do zbudowania - można to zrobić zwykłym edytorem tekstowym lub wykonać:
$ cat tar.spec |grep BuildReq BuildRequires: autoconf BuildRequires: automake BuildRequires: bison BuildRequires: gettext-devel |
Wiemy już co nam jest potrzebne - Teraz sprawdzimy czy mamy te pakiety w naszym PLD:
$ rpm -q autoconf autoconf-2.53a-1 $ rpm -q automake automake-1.6.3-1 $ rpm -q bison pakiet bison nie jest zainstalowany $ rpm -q gettext-devel pakiet gettext-devel nie jest zainstalowany $ |
Czyli dwóch, potrzebnych pakietów brak. A więc 'poldek' rusza do boju (tutaj już lepiej użyć konta 'root' - chyba że mamy poldka skonfigurowanego do pracy 'sudo'):
# poldek Wczytywanie ftp://ftp.pld-linux.org/dists/[...]/RPMS/packages.dir.gz... Wczytywanie ftp://ftp.pld-linux.org/dists/ra/[...]/packages.dir.gz... Wczytywanie ftp://ftp.pld-linux.org/dists/ra/[...]/packages.dir.gz... Wczytywanie ftp://ep09.kernel.pl/pub/People/[...]/packages.dir.gz... Wczytywanie ftp://ftp.pld-linux.org/dists/[...]/packages.dir.gz... Wczytywanie http://pld.mysza.eu.org/Ra/i686/packages.dir.gz... Przeczytano 6814 pakietów Usunięto 16 zdublowanych pakietów z listy dostępnych Wczytywanie /root/.poldek-cache/packages.dir.dbcache.var.lib.rpm.gz... Przeczytano 559 pakietów Witaj w poldekowym trybie interaktywnym. Wpisz "help" aby otrzymać pomoc. poldek> install bison gettext-devel Przetwarzanie zależności... Zaznaczono 1 pakiet do instalacji: I bison-1.35-5 Pobieranie ftp://ftp.pld-linux.org/dists/[...]/bison-1.35-5.i686.rpm... .................................................. 100.0% [196.5K] Uruchamianie rpm --upgrade -vh --root / --noorder... Preparing... ########################################### [100%] 1:bison ########################################### [100%] Installing set #2 Przetwarzanie zależności... Zaznaczono 1 pakiet do instalacji: I gettext-devel-0.10.40-4 Pobieranie ftp://[...]/gettext-devel-0.10.40-4.i686.rpm... .................................................. 100.0% [295.6K] Uruchamianie rpm --upgrade -vh --root / --noorder... Preparing... ########################################### [100%] 1:gettext-devel ########################################### [100%] poldek> |
I jak tu nie kochać Poldka? :-)
Mamy już teoretycznie wszystko aby zbudować pakiet 'tar'. Wracamy więc do naszego zwykłego konta i:
$ rpmbuild -ba tar.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.22007 Patch #0 (tar-man_from_debian_tar_1.13.25-2.patch): Patch #1 (tar-info.patch): Patch #2 (tar-pipe.patch): Patch #3 (tar-namecache.patch): Patch #4 (tar-error.patch): Patch #5 (tar-sock.patch): Patch #6 (tar-nolibrt.patch): Patch #7 (tar-man.patch): Patch #8 (tar-ac25x.patch): Patch #9 (tar-dots.patch): Patch #10 (tar-pl.po-fix.patch): Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.97619 [...] Zapisano: /home/users/marekc/rpm/SRPMS/tar-1.13.25-7.src.rpm Zapisano: /home/users/marekc/rpm/RPMS/tar-1.13.25-7.i686.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.54009 + umask 022 + cd /home/users/marekc/rpm/BUILD + _autoreqprov=n + [ n = y ] + cd tar-1.13.25 + rm -rf /home/users/marekc/tmp/tar-1.13.25-root-marekc + exit 0 $ |
[...] oznacza, wycięte przeze mnie komunikaty jakie generuje kompilowany 'tar'.
Polecenie 'rpmbuild -ba ' każe nam zbudować ze speca kompletny pakiet - ale to już wiemy z teoretycznych szkoleń ;-)
Wszelkie komunikaty w razie jakiegoś błędu podczas budowania możemy odnaleźć w pliku: '/var/tmp/rpm-tmp.22007'
Widzimy, że gotowe pakiety mamy w określonych katalogach i możemy je spokojnie zainstalować. A komunikat 'exit 0' oznacza brak błędów podczas budowania.
Nasz pierwszy pakiet został zbudowany.
Pozostaje jednak niedosyt - ciągle czujemy, że jak na razie korzystamy z czyjeś pracy, a w końcu pragniemy także coś zrobić dla potomności i sami chcemy stworzyć plik .spec
No to zaczynamy. Naszym pierwszym (a właściwie moim) wykonanym specem będzie Mantis czyli system kontroli błędów oparty o stronę WWW (PHP) i bazę SQL Mysql.
Tutaj mała dygresja - większość pakietów powstaje dlatego, że danemu Developerowi był on akurat potrzebny; oznacza to że nie ma sensu pisanie na listę dyskusyjną z prośbą o stworzenie określonego pakietu bo można otrzymać parę przykrych komentarzy (w najlepszym razie).
Pierwszą czynnością jest zainstalowanie pakietu ze źródeł. Potem notujemy sobie co należy zrobić aby dany pakiet zaczął działać - wszystko po to aby przewidzieć co dany .spec powinien zrobić aby pakiet pracował w miarę bezproblemowo po instalacji RPMa - Można to zanotować np. na kartce papieru - ale od czego mamy komputery?
Moje notatki wyglądały tak:
// MANTIS // Mysql init # cd /etc/rc.d/init.d # ./mysql init # /usr/bin/mysqladmin -u mysql password 'password' // Tworzenie bazy w mysql # mysqladmin -umysql -p create bugtracker # cd /mantis/sql # mysql -umysql -p bugtracker < db_generate.sql // Plik config_inc.php // Sprawdzenie i poprawka http:/mantis/admin/check.php // Pierwsze logowanie u: administrator p: root Dodać nowe i skasować stare :-) // co potrzebne do uruchomienia - mysql - mysql-client - php - php-common - php-pcre - php-mysql - apache // do rpma (zmiany w związku z językiem) plik: config_defaults_inc.php $g_default_language = 'english'; $g_default_language = 'polish'; // Zamiana łańcucha w config_defaults_inc.php sed -e s/$g_default_language = 'english';/$g_default_language = 'polish';/g config_defaults_inc.php // Zamiana usera z root na mysql w config_inc.php |
Do każdego pakietu należy podchodzić indywidualnie - dlatego parę słów o samym mantisie. System jest oparty o gotowe pliki składające się na stronę WWW, dokumentacje i plik potrzebny do stworzenia odpowiedniej bazy Mysql. Nie będziemy dokonywali żadnych kompilacji - więc uprości to nasz proces budowania i testowania pakietu.
Łącząc informacje zawarte w dostarczonej dokumentacji i własnych notatek wiemy już że głównym zadaniem naszego RPMa będzie takie zaprojektowanie go, aby odpowiednie pliki PHP zostały przekopiowane w odpowiednie miejsce, dokonać niezbędnych poprawek w plikach konfiguracyjnych lub innych poprawek, które naszym zdaniem mogą ułatwić pracę przyszłym użytkownikom. Pamiętajmy jednak żeby nie przedobrzyć.
Niestety nie wszystko uda nam się zautomatyzować - dlatego stworzymy dwa pliki tekstowe (w dwóch wersjach językowych PL i EN) z krótkim opisem, co należy wykonać aby system zadziałał.
Wydaje mi się także, że dobrym zwyczajem jest po zainstalowaniu źródeł przewidzieć właściwe zależności, aby nasz pakiet działał bez problemu na innym komputerze. Na przykład w instrukcji do instalacji mantisa w wymaganiach jest wymieniony m.in. pakiet PHP - W PLD po instalacji samego PHP, mantis będzie wyświetlał błędy. Okazuje się że pakiety w PLD są maksymalnie ''rozdrobnione'' i do działania potrzebny jest jeszcze pakiet 'php-pcre' - a do tego, żeby strony PHP odpowiednio komunikowały się z bazą 'mysql' jest potrzeba zainstalowania 'php-mysql'. Zależności może być wiele i moim skromnym zdaniem lepiej żebyśmy umieścili jakiś nadmiarowy pakiet w zależnościach niż żeby jakiegoś brakowało.
W naszym przypadku po zainstalowaniu i uruchomieniu pakietu Mantis ze źródeł, wystarczy wykonać np. 'rpm -qa |grep php' aby wybrać odpowiednie pliki. To samo robimy z 'mysql' i 'apache'.
Zaczynamy od stworzenia pliku (możemy użyć polecenia 'touch') lub korzystamy z innego pliku .spec w celu modyfikacji do naszych potrzeb (np. 'cvs get SPECS/template.spec' spowoduje ściągnięcie szkieletu z CVS PLD). Otwieramy go w naszym ulubionym edytorze tekstowym (vim, emacs, pico, mcedit itp.)
Summary: The Mantis Bug Tracker Summary(pl): Mantis - System Kontroli Błędów Name: mantis Version: 0.18.0a4 # define _alpha a4 Release: 1 License: GPL Group: Development/Tools [...] |
Zaczynamy wypełniać tzw. preambułę, czyli wstęp w którym opisujemy nasz pakiet - myślę, że wyjaśnianie powyższego nie jest specjalnie potrzebne. Zwrócę tylko uwagę na linię 'Version' i 'Ralease' - zgodnie z devel-hints-pl.txt powinno ono raczej wyglądać tak (ponieważ ta wersja mantis'a jest określona jako alpha):
Version: 0.18.0 %define alpha a4 Release: 0.%{_alpha}.1
ale u mnie powodowało to błąd przy budowaniu, gdyż jak dalej zobaczymy nazwa źródeł korzysta z pola 'Version' i każda manipulacja na nim powoduje potrzebę przebudowania .speca lub zmianę nazwy archiwum w którym są źródła (co jest bardzo złym nawykiem i karygodnym błędem!). Tak więc w końcu zostawiłem tak jak jest i nikt specjalnie nie zwrócił mi na to uwagi :-) (przyp. autora: jednak późniejsza praktyka pokaże nam, że zmiany takie są jednak chlebem powszednim więc nie bójmy się ich dokonywać)
[...] Source0: http://dl.sourceforge.net/mantisbt/%{name}-%{version}.tar.gz # Source0-md5: 4c730c1ecf7a2449ef915387d85c1952 Source1: %{name}-doc-PLD.tar.gz URL: http://mantisbt.sourceforge.net/ [...] |
Dalej mamy opis źródełek - w PLD podaje się go najczęściej w formie linku plus fraza %{name}-%{version}.tar.gz i tak naprawdę ta fraza jest najważniejsza do zbudowania pakietu, ponieważ URL (w naszym przypadku http://dl.sourceforge.net/mantisbt/) jest ignorowany. Tak więc z makra %name i %version budowana jest nazwa pakietu i taka nazwa jest wyszukiwana w ~/rpm/SOURCES/
Źródeł programu może być kilka. U nas występuje jeszcze Source1 - jest to dodatkowa dokumentacja składająca się z dwóch plików tekstowych zawierająca dodatkowe wskazówki po instalacyjne. Pierwotnie próbowałem zrobić to korzystając z mechanizmu Patch i polecenia:
diff -urN katalog_z_oryginałem katalog_z_poprawionym_oryginałem > źródła-powód.patch
opisanego w devel-manual (rozdział 1.2.2), ale mechanizm ten nie pozwala tworzyć nowych plików więc pozostało tylko wykonać dodatkowe źródła.
Pamiętajmy także aby w żadnym przypadku nie modyfikować ręcznie źródeł programu. Prawidłowy .spec powinien wykorzystywać natywne źródła, a wszelkie zmiany dokonujemy w %build, %install lub za pomocą patch'ów.
Sygnatura md5 po # jest wynikiem wykorzystania tzw. distfiles i na razie to musi nam wystarczyć. Distfiles omówimy gdy będziemy zapisywać do CVS PLD - czyli nieprędko ;-)
[...] Requires: apache >= 1.3.27-4 Requires: apache-mod_dir >= 1.3.27-4 Requires: php >= 4.0.3 Requires: php-mysql >= 4.0.3 Requires: php-pcre >= 4.3.1-4 Requires: php-common >= 4.3.1-4 Requires: mysql >= 3.23.2 Requires: mysql-client >= 3.23.56-1 Requires: sed BuildArch: noarch BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n) [...] |
W 'Requires' podajemy zależności, czyli co musi być zainstalowane aby dany pakiet działał lub żeby wykonały się poprawnie polecenia wykonywane przez .spec (np. sekcja %post)
W 'BuildArch' architekturę pod który przeznaczony jest RPM - u nas jest to 'noarch' czyli bez żadnej konkretnej architektury - z moich obserwacji wynika że developerzy PLD omijają to pole - chyba że jest to właśnie 'noarch'.
'BuildRoot' jest bardzo ważnym tagiem - na szczęście występuje zawsze w takiej postaci jak u nas - a oznacza katalog w którym rpm będzie budował pakiet z sekcji %install naszego .speca.
[...] %define _mantisdir /home/services/httpd/mantis # define _mantisdir /home/httpd/html/mantis %description Mantis is a web-based bugtracking system. %description -l pl Mantis jest systemem kontroli błędów opartym na interfejsie \ WWW i MySQL. [...] |
W tej części wykorzystujemy przydatną właściwość RPMa czyli definiowanie stałych. W naszym przykładzie '_mantisdir' jest katalogiem w którym będą zainstalowane pliki dla serwera WEB. Tutaj mała uwaga dotycząca komentarza '#' - Gdy definiujemy makro wtedy komentarz nie działa, dlatego usunęliśmy '%' przed słowem 'define' (możemy także użyć frazy '%%') czyli gdybyśmy napisali:
%define _mantisdir /home/services/httpd/mantis
# %define _mantisdir /home/httpd/html/mantis
To wtedy stała '_mantisdir' miała by wartość /home/httpd/html/mantis, mimo że nie taka jest nasz intencja - Nie muszę chyba wyjaśniać jakie to może spowodować problemy?
W '%description' opisujemy krótko charakterystykę pakietu, a niżej widzimy jak to zrobić dla opisu w języku polskim - później RPM wykorzystując zmienne locale wyświetla odpowiednią wersję językową 'description' gdy sobie tego od RPMa życzymy.
[...] %prep %setup -q -a1 [...] |
Od tego momentu skończyliśmy wypełniać dane preambuły. Sekcja %prep może wykonać skrypt potrzebny przed instalacją plików. My akurat nic przed instalacją robić nie musimy dlatego sekcja ta jest pusta.
Dalej jest '%setup -q -a1' - czyli rozpakowanie źródeł do katalogu zdefiniowanego wcześniej przez 'BuildRoot'. Dodatkowe parametry tego tagu wyłączają komunikaty przy rozpakowaniu '-q', a parametr '-a1' określa które źródła należy rozpakować. Po '%setup' możemy także korzystać z makra '%patch' który nakłada łatki na źródła. Umożliwia to taką modyfikację źródeł jakie tylko chcemy bez potrzeby zmian w samych źródłach (o czym pisaliśmy wcześniej).
[...] %install rm -rf $RPM_BUILD_ROOT install -d $RPM_BUILD_ROOT%{_mantisdir} cp -af *.php admin core css graphs images lang sql \ $RPM_BUILD_ROOT%{_mantisdir} sed -e 's/root/mysql/g' config_inc.php.sample > \ $RPM_BUILD_ROOT%{_mantisdir}/config_inc.php [...] |
Tak naprawdę w większości pakietów przed '%install' wykonywane jest makro '%build', które kompiluje nam źródła, a w najprostszej postaci wygląda tak:
%build %configure make
U nas nie ma potrzeby wykonywania żadnych kompilacji więc od razu wykonywana jest sekcja '%install'. Na początku czyścimy sobie katalog w którym będziemy instalowali nasz program (czyli 'fake root') - mimo że prawdopodobnie jest pusty - ale lepiej dmuchać na zimne. Potem dokonujemy instalacji pakietu przekazując mu w parametrze '-d' że docelowo ma być zainstalowany w 'fake root', ale same pliki pojawią się w naszym katalogu tymczasowym (TMPDIR), dlatego później za pomocą polecenia 'cp' kopiujemy pliki, jakie są potrzebne, do właściwego 'fake root' - zauważmy że pominęliśmy np. katalog 'doc'.
Następnie jeszcze za pomocą komendy 'SED' dokonujemy drobnej poprawki w pliku konfiguracyjnym mantisa - zamieniając domyślnego użytkownika MYSQL z 'root' na 'mysql'. Taką poprawkę mogliśmy wykonać wcześniej w sekcji '%prep' i tagu '%patch' ale przy tak małych poprawkach bardziej efektywniej jest to zrobić tutaj.
[...] %clean rm -rf $RPM_BUILD_ROOT [...] |
Tag '%clean' jest w .specach tworzonych dla PLD obowiązkowy i określa co należy zrobić gdy cały pakiet zostanie zbudowany. Tutaj mała uwaga - ten tag w tym miejscu nie oznacza że jest w tej chwili wykonany - jeżeli by tak było, to występujący później tag '%files' miałby niejakie problemy z nieistniejącymi już plikami. Czyli po poprawnym zbudowaniu pakietu, wykonywane jest makro '%clean', a w przypadku jakiegokolwiek błędu, nie jest - czyli rozpakowane i zainstalowane źródła pozostają. Umożliwia nam to np. diagnostykę w przypadku błędów podczas budowania pakietu.
[...] %post if [ "$LANG" = "pl_PL" ]; then #sed -e "s/= 'english';/= 'polish';/g" \ %{_mantisdir}/config_defaults_inc.php > \ #%{_mantisdir}/config_defaults_inc_PLD.php #mv -f %{_mantisdir}/config_defaults_inc_PLD.php \ %{_mantisdir}/config_defaults_inc.php echo echo "Mantis zapisany..." echo "Więcej: /usr/share/doc/mantis-%{version}/PLD_Install_PL.txt.gz" echo else echo echo "Mantis loaded..." echo "More: /usr/share/doc/mantis-%{version}/PLD_Install_EN.txt.gz" echo fi [...] |
Tutaj mamy przykład co możemy zrobić z plikami, które będą instalowane po zbudowaniu pakietu. Makro '%post' wykonywane jest przez RPM podczas instalacji pakietu. Zakomentowane polecenia umożliwiają zmianę w zainstalowanym pliku 'config_defaults_inc.php' zgodnie z zawartością zmiennej locale 'LANG'. Później w zależności od tej zmiennej wyświetlany jest komunikat w języku PL lub EN.
Zadacie pytanie dlaczego część tych poleceń jest ''wyłączona" - otóż, później gdy dany .spec chcemy już udostępnić ogółowi zostanie on sprawdzony pod względem ''czystości rasowej'' :-) - W tym przypadku okazało się, że taka zmiana w plikach konfiguracyjnych, może spowodować kłopoty podczas np. zmiany użytkownika. Programy korzystające z 'locale' powinny odpowiednio reagować na zmiany 'locale' - np. po modyfikacji LANG na 'EN_en' zacząć pracować po angielsku - W naszym przypadku strona PHP nie zacznie pracować po angielsku, dlatego dodany został w/w komentarz, a w pliku 'PLD_Install_PL.txt.gz', który jest dodatkową instrukcją, co należy zrobić po instalacji pakietu RPM aby 'mantis' po uruchomieniu rozmawiał z nami po polsku.
[...] %files %defattr(644,root,root,755) %doc doc/* PLD_Install_PL.txt PLD_Install_EN.txt config_inc.php.sample %dir %{_mantisdir} %{_mantisdir}/admin/ %{_mantisdir}/core/ %{_mantisdir}/css/ %{_mantisdir}/graphs/ %{_mantisdir}/images/ %{_mantisdir}/lang/ %{_mantisdir}/sql/ %{_mantisdir}/account* %{_mantisdir}/bug* %{_mantisdir}/core.* %{_mantisdir}/csv* %{_mantisdir}/docum* %{_mantisdir}/file* %{_mantisdir}/history* %{_mantisdir}/index* %{_mantisdir}/jump* %{_mantisdir}/log* %{_mantisdir}/ma* %{_mantisdir}/me* %{_mantisdir}/news* %{_mantisdir}/print* %{_mantisdir}/proj* %{_mantisdir}/set* %{_mantisdir}/sig* %{_mantisdir}/sum* %{_mantisdir}/view* %config(noreplace) %{_mantisdir}/config_inc.php %config(noreplace) %{_mantisdir}/config_defaults_inc.php %exclude %{_mantisdir}/core/.cvsignore [...] |
Dochodzimy powoli do finału :-). W sekcji tej określamy co, gdzie i jak ma zostać zainstalowane u użytkownika instalującego naszego RPMa. Tag %files jest bardzo ważny gdyż błędy spowodowane tutaj mogą uniemożliwić działanie pakietu u końcowego użytkownika. W 'podtagu':
%defattr(644,root,root,755)
określamy domyślne atrybuty instalowanych plików - możemy oczywiście określać atrybuty dla każdego pliku osobno.
Następnie w:
%doc doc/* PLD_Install_PL.txt PLD_Install_EN.txt config_inc.php.sample
określamy nasze pliki, które znajdą się w dokumentacji. Czyli katalog 'doc/' z katalogu 'TMPDIR' i pliki z 'SOURCE1' oraz 'config_inc.php.sample' zostaną spakowane i przy instalacji pakietu RPM umieszczone w domyślnym katalogu dokumentacji - w PLD jest to /usr/share/doc/...
I wreszcie w:
%dir %{_mantisdir}
nakazujemy podczas instalacji RPM'a stworzenie katalogu zgodnie ze stałą '%{_mantisdir}' i kopiujemy pliki jakie są poniżej tego tagu. Na początku nie wypisywałem wszystkich tych katalogów i plików indywidualnie, a po prostu użyłem frazy:
%{_mantisdir}
Jednak przy takiej konstrukcji i wykorzystaniu makra %config(noreplace), pojawi się błąd podczas budowania pakietu:
[...] RPM build errors: File listed twice: /home/services/httpd/mantis/config_defaults_inc.php File listed twice: /home/services/httpd/mantis/config_inc.php |
Czyli dwa pliki miały podwójne znaczenie - występowały na liście do skopiowania i jako pliki konfiguracyjne. Dlatego trzeba niestety zrobić listę plików jak to my zrobiliśmy minus pliki, które znajdą się w makro '%config'. Samo makro '%config' pozwala szczególnie traktować pliki konfiguracyjnie podczas kasowania RPMa lub jego aktualizacji.
Ostatnie makro:
'%exclude %{_mantisdir}/core/.cvsignore'
nakazuje wyłączenie pliku z pakietu RPM - w tym przypadku jest to pozostałość po CVS mantisa.
I to już koniec naszej pracy. Po wykonaniu polecenia 'rpmbuild -ba mantis.spec' powinien nam zbudować się pakiet rpm i srpm. Zostaje jeszcze przetestowanie czy wszystkie pliki są tam gdzie chcieliśmy, czy mają odpowiednie prawa i czy pakiet działa tak jak powinien. Jeszcze ewentualne poprawki i musimy przepuścić naszą pracę przez zestaw adaptujący 'adapter.awk'.
Ściągamy go z CVSu:
$ cvs get SPECS/adapter.awk U SPECS/adapter.awk $ |
następnie zmieniamy nazwę pliku .speca dodając na końcu np. org i wykonujemy:
$ ./adapter.awk mantis.spec.org > mantis.spec $ |
W wyniku tej operacji otrzymamy 'mantis.spec' który zostaje przystosowany do wymagań PLD. Zainteresowanych zmianami, zapraszam do przestudiowania 'nowego' .speca.
Teraz możemy szukać kogoś, kto umieści naszego .speca i źródła w repozytorium CVS PLD. Mamy do dyspozycji listę developerów: w mailu umieszczając załącznik z naszym .specem (oczywiście bez źródeł - lub jeżeli mamy jakieś własne źródła to umieszczamy je na jakieś stronie WWW lub innym ftp. i podajemy linka - źródła natywne powinny dać się ściągnąć z lokacji jaką umieściliśmy w naszym .specu.). Załącznik powinien być typu plain-text.
Można także spróbować na grupie IRC #PLD znaleźć ofiarę, która umieści naszą pracę w repozytorium.
Dobrze też w czasie nauki robienia .speców podglądać jak to robią inni - W repozytorium CVS jest naprawdę z czego wybierać. A my nabywając umiejętność czytania plików .spec możemy skupić się już tylko na odpowiednim ich napisaniu.
W końcu otrzymamy możliwość zapisu do CVS i wtedy czytamy następną część poradnika ''W krainie CVS''
Umiemy już w miarę klecić nowe spece, naprawiać stare - chcemy dołączyć do drużyny PLD... Musimy mieć więc możliwość pogrania na boisku, a nie tylko zasiadać na trybunach jako widz. Naszym boiskiem będzie CVS a możliwość czytania i pisania do niego (Read-Write) naszym sposobem na grę :)
Jak to życiu, aby coś dostać musimy najpierw się postarać i wykonać parę czynności.
Żeby otrzymać własne konto CVS należy uzyskać poparcie już aktywnych deweloperów. Zwykle osoby wykazujące się aktywnością na listach dyskusyjnych (podsyłające patche, itp.) prędzej czy później są wręcz proszone o zgłoszenie się po konto. W typowym przypadku wystarczy, że trzech deweloperów wyrazi poparcie kandydata na dewelopera (trzeci z nich powinien wskazać mu dokąd powinien się zgłosić po konto). Osoba popierająca kandydata jednocześnie staje się jego opiekunem i nadzoruje jego działania w początkowej fazie. W przypadku gdyby, mimo poparcia przez niektórych, osoba kandydata wywoływała kontrowersje, decyzja o jego przyjęciu (lub nie) będzie podjęta zgodnie z obowiązującą procedurą rozwiązywania konfliktów.
Kiedy już zostaniemy przyjęci, musimy wymyśleć sobie ksywkę i hasło. Potem z linii poleceń wykonujemy jednolinijkowe polecenie - wstawiając za login i haslo odpowiednie dane:
perl -e 'print "login:" . crypt("haslo", join "", (".", "/", 0..9, "A".."Z", "a".."z")[rand 64, rand 64]) . "\n"'
w wyniku którego otrzymamy ciąg znaków podobny do:
login:/APGG.cfeqPpk
Ciąg ten kopiujemy do listu e-mail z prośbą o możliwość RW na CVS PLD i wysyłamy na adres cvsadmin@pld-linux.org
To na razie wszystko co możemy zrobić - trzeba czekać na odpowiedź od władzy CVS. Po kilku, kilkunastu lub kilkudziesięciu dniach przyjdzie mail z odpowiedzią. U mnie była to wiadomość podobna do:
Quoting Marek Ciesielski <marekc@adres.email>: > Prosze o dostep RW do CVS PLD. > dane do <login>:/APGG.cfeqPpk // oczywiście tej linii // w mailu nie ma - dodałem ją dla przykładu :) Witam, twoje konto zostało założone, proszę dopisz się do CVSROOT/users -- Admin CVS <imię i nazwisko> :) |
Czyli pierwsze formalności mamy za sobą. Możemy już działać na CVS. Jednak proponuję znowu trochę teorii - tym razem zdecydowana większość dokumentacji jest w języku angielskim. Mamy więc bardzo dobry, oficjalny podręcznik CVS (uwaga ponad 800KB), książkę kucharską CVS (uwaga ponad 600KB) - jest także opis po polsku - stworzony przez developerów PLD, a także książka z cyklu leksykon kieszonkowy "CVS" Gregor N. Purdy (koszt ok. 10PLN) - tak więc jest w czym wybierać.
Jeszcze raz zwróćmy uwagę na maila którego otrzymaliśmy. Jest tam coś o dopisaniu "users". Musimy wykonać zalecenie. Aby to zrobić musimy znowu przygotować sobie środowisko CVS - albo modyfikując istniejące, dotychczasowe konto "anonymous" albo tworząc od początku środowsko w nowym katalogu. Ja wybrałem pierwszy sposób (trochę wbrew zaleceniom z dokumentacji - ale za to szybszy), polega on na modyfikacji każdego pliku "Root" w podkatalogach "CVS" - należy tam wpisać frazę:
:pserver:<nasz_login>@cvs.pld-linux.org:/cvsroot
Czyli w naszym przypadku wchodzimy do katalogu ./rpm i wchodzimy do każdego podkatalogu "CVS" i zmieniamy ręcznie plik "Root" - nie ma w tej chwili tych katalogów wiele, więc nie powinno to sprawić kłopotu.
Proponuję także poustawiać sobie zmienne CVS np. CVSEDITOR itp. (szczegóły - oczywiście dokumentacja).
Następnie możemy już spróbować zalogować się do CVS PLD:
$ cvs login Logging in to :pserver:<nasz_login>@cvs.pld-linux.org:2401/cvsroot CVS password: $ |
Wpisujemy hasło które wymyśleliśmy i jesteśmy zalogowani. Każdy komunikat błędu oznacza że coś wcześniej źle wykonaliśmy, albo że np. nie działa sieć. Login wykonujemy praktycznie raz i dopóki nie wykonamy polecenia "cvs logout" jesteśmy ciągle gotowi do pracy.
Czas już zabrać się za plik "users"
$ cvs get CVSROOT/users U CVSROOT/users $ |
Do naszego lokalnego repozytorium, do katalogu CVSROOT ściągneliśmy plik users, który służy w PLD do wpisania aliasu pocztowego - przy okazji możemy zobaczyć w jakim towarzystwie przyjdzie nam pracować :)
nasz_login:użytkownik_mail@domena_naszego_email:Imię i Nazwisko:user@jabber.domena
Ostatnie pole jest opcjonalne - wypełniamy je tylko jeśli posiadamy swój własny JID (o ile go posiadamy). Jeśli z różnych przyczyn nie korzystamy z Jabbera - omijamy tę część i zatrzymujemy się na imieniu i nazwisku. Dla zainteresowanych - istnieje oficjalny serwer Jabbera projektu PLD Linux - konta na nim zakłada Mariusz Mazur.
Edytujemy odpowiednio więc plik users (pamiętajmy, żeby zachować alfabetyczną kolejność wpisów) - wystarczy tylko drobna znajomość alfabetu i robimy nasz pierwszy commit - czyli potwierdzamy zmiany.
$ cvs ci CVSROOT/users // po tym poleceniu edytujemy log Checking in CVSROOT/users; /cvsroot/CVSROOT/users,v <-- users new revision: 1.40; previous revision: 1.39 done cvs server: Rebuilding administrative file database Mailing the commit message $ |
Po wydaniu polecenia cvs ci CVSROOT/users otworzy się nasz ulubiony edytor i pojawi się coś podobnego do:
- added nasz_login // tu wpisujemy komentarz z kreseczką i po angielsku!!! CVS: --------------------------------------------------------------------- CVS: Enter Log. Lines beginning with `CVS:` are removed automatically CVS: CVS: Committing in . CVS: CVS: Updated Files: CVS: CVSROOT/users CVS: --------------------------------------------------------------------- |
Właśnie dokonaliśmy pierwszej zmiany w repozytorium PLD. Od tej chwili każdy mail adresowany na <nasz_login>@pld-linux.org trafi na naszą skrzynkę pocztową.
Dalsza część naszych rozważań będzie już w formie konkretnych przykładów, ponieważ to co chcemy zrobić w repozytorium CVS PLD zależy od konkretnych potrzeb. Od tej chwili nikt już nas za rączkę nie będzie prowadził, a czekają nas pot, krew, łzy i pierwsze "recenzje" naszych poczynań - np. na grupie PLD-devel czy kanale #PLD - a jedynymi nagrodami będzie brak tych recenzji, zdobyta wiedza, satysfakcja i działające paczki, których przez chwilę nikt na świecie nie będzie miał :)
Każdy nowy plik, który chcemy umieścić w repozytorium należy dodać za pomocą polecenia "cvs add"
$ cvs add nasz_nowy_pakiet.spec cvs server: scheduling file `nasz_nowy_pakiet.spec' for addition cvs server: use 'cvs commit' to add this file permanently $ |
Jak widać z komentarza, aby zakończyć dodanie pliku należy zatwierdzić zmianę za pomocą polecenia "cvs ci" (polecenia podaję w formie skróconej) - Samo zatwierdzanie (commit) robiliśmy już wcześniej przy okazji pliku "users".
Pliki możemy zaktualizować względem CVS - jeżeli nasz plik jest nowszy nie zostanie dokonana żadna zmiana na naszym lokalnym repozytorium. Aktualizacją nie dokonujemy zmian na zdalnym repozytorium.
Jeżeli w danym katalogu mamy już zdefiniowaną kartotekę (czyli mamy już odpowiedni podkatalog CVS) to aktualizacją możemy ściągnąć nowy plik.
$ cvs up python.spec P python.spec $ |
W powyższym przykładzie dokonaliśmy aktualizacji pliku "python.spec". Literka "P" określa stan aktualizacji. Poniżej przedstawię możlwe kody:
"A" - Plik dodany. Oznacza że na pliku dokonano operacji "ADD" (czyli dodanie do repozytorium) ale nie wykonano commitu (zatwierdzenia)
"C" - Plik aktualizowany jest w konflikcie ze zdalnym repozytorium. Czyli np. dokonaliśmy zmian na lokalnym repozytorium i nasz plik jest "nowszy" względem zdalnego repozytorium.
"M" - Plik został zmodyfikowany w zdalnym repozytorium ale nie było żadnych konfliktów.
"P" - Plik był "łatany" przez serwer (kod podobny do "U")
"R" - Plik usunięty ale nie zatwierdzony. Czyli dokonano operacji "cvs remove" ale nie zatwierdzono zmian (poleceniem "cvs ci")
"U" - Plik został zaktualizowany
"?" - Plik jest w naszym repozytorium lokalnym ale nie ma go w zdalnym repozytorium CVS
Sam przykład zatwierdzania zmian mogliśmy poznać wcześniej. Jest to najczęściej wykonywana operacja na CVS.
Jednak chciałbym zwrócić uwagę na inny sposób składowania źródeł natywnych. W pewnym momencie okazuje się, że składowanie wszystkich plików w repozytorium CVS jest mało efektywne i powoduje zbyt duże obciążenia serwerów. Dlatego też w PLD zastosowano mechanizm Distfiles którego krótki opis możemy odszukać tu. W wielkim skrócie oznacza to że preparując odpowiednio spec (pamiętacie tajemnicze md5?) i korzystając z odpowiednich opcji programu ./builder możemy sterować ściąganiem plików do distfiles. Tak naprawdę najczęściej wykorzystane są dwie opcje ./builder - "5" i "U". Jest to także powód używania programu ./builder (a nie frazy "rpmbuild -ba"), którego kopię najlepiej ściągnąć z CVS. Pamiętajmy także o tym, że w systemie istnieje inny builder, który jest dostarczany z narzędziami rpm ale oczywiście nie ma on możliwości pracy z distfiles. I jeszcze jedna uwaga: Distfiles jest przeznaczony tylko dla źródeł natywnych - wszelkie patche i nasze pliki dodajemy normalnie do CVS (najczęściej do katalogu SOURCES).
Oto przykłady użycia ./builder z odpowiednimi opcjami:
$ ./builder -5 mantis.spec # $Revision: 6218 $, $Date: 2004-09-26 17:31:14 +0200 (nie, 26 wrz 2004) $ --20:32:59-- http://dl.sourceforge.net/mantisbt/mantis-0.18.0a4.tar.gz => `mantis-0.18.0a4.tar.gz' Translacja dl.sourceforge.net... zrobiono. Łączenie się z dl.sourceforge.net[193.1.219.87]:80... połączono się. Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK Długość: 485,797 [application/x-tar] 100%[====================================>] 485,797 17.99K/s ETA 00:00 20:33:25 (17.99 KB/s) - zapisano `mantis-0.18.0a4.tar.gz' [485797/485797] Updating source-0 md5. $ |
Opcje "5" i "U" są podobne, z tym że "5" próbuje poprawić md5 korzystając z istniejącego sources w lokalnym repozytorium. Natomiast "U" próbuje zawsze ściągnąć źródła z podanego przez spec URL. Taka jest teoria. Ja praktycznie używam opcji "U" kasując wcześniej źródła z lokalnego repozytorium, ponieważ w innym przypadku wyskakują dziwne błędy o konflikcie z parametrem -nd
$ ./builder -U mantis.spec # $Revision: 6218 $, $Date: 2004-09-26 17:31:14 +0200 (nie, 26 wrz 2004) $ --20:44:39-- http://dl.sourceforge.net/mantisbt/mantis-0.18.0a4.tar.gz => `mantis-0.18.0a4.tar.gz' Translacja dl.sourceforge.net... zrobiono. Łączenie się z dl.sourceforge.net[193.190.198.97]:80... połączono się. Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK Długość: 485,797 [application/x-gzip] 100%[====================================>] 485,797 18.80K/s ETA 00:00 20:45:04 (18.80 KB/s) - zapisano `mantis-0.18.0a4.tar.gz' [485797/485797] Updating source-0 md5. $ |
W każdym większym CVSie, projekty główne rozgałęziają się tworząc tzw. branche - W przypadku PLD np. istnieje stabilny, lecz już troche leciwy branch "RA-branch", który wywodzi się z brancha głównego HEAD. W pewnym momencie RA-branch został "zamrożony" i dokonywane są na nim tylko zmiany zawierające poprawki poważnych błędów lub aktualizacje związane z bezpieczeństwem. Branch HEAD "żyje" dalej i są w nim dokonywane zmiany i powstają nowe pakiety. Odgałęzień może być (i jest) wiele, co na początku troche gmatwa spojrzenie na CVS ale później doceniamy zalety tego rozwiązania. Dane odnogi mają przydzielone odpowiednie etykiety "lepkie" (ang. sticky tag) - czyli etykieta jest przekazywana każdej następnej wersji w danej odnodze. Zwykłe etykiety (ang. tag) możemy użyć np. do okreslenia indywidualnego stanu danego pliku - określając np. tag STABLE, UNSTABLE lub DEVELOP.
Jeżeli chodzi o etykietowanie to trzeba zachować rozwagę. Musimy być pewni że wiemy co chcemy osiągnąć, bo możemy popsuć pracę komuś innemu (dotyczy to także zmian w cudzych specach).
Praktycznie najczęściej wykorzystywane są następujące opcje związane z odnogami i etykietami:
$ cvs status -v mldonkey.spec // Statystyka odnóg i etykiet =================================================================== File: mldonkey.spec Status: Up-to-date Working revision: 1.14.2.8 // Rewizja (wersja) robocza na lokalnym CVS Repository revision: 1.14.2.8 /cvsroot/SPECS/mldonkey.spec,v // Rewizja na zdalnym CVS Sticky Tag: RA-branch (branch: 1.14.2) // Dane dotyczące lepkiej etykiety - związanej z branchem (odnogą) Sticky Date: (none) Sticky Options: (none) Existing Tags: // Istniejące etykiety zwykłe mldonkey-2_5_3-2 (revision: 1.14.2.7) STABLE (revision: 1.14.2.7) mldonkey-2_5-1 (revision: 1.14.2.2) RA-branch (branch: 1.14.2) $ |
Sam sposób robienia odnóg pozostawiam innym - lepiej poczytać np. opis CVS PLD bo sam tego jeszcze nie robiłem :). Etykietowanie możemy wykonać np.: mając plik w naszym lokalnym repozytorium wydajemy polecenie:
cvs tag UNSTABLE plik.spec
czyli plik.spec otrzymał etykietę UNSTABLE.
Ostatnim przykładem będzie przenoszenie zmian między odnogami (branchami). Robiąc jakiś spec w głównej odnodze HEAD doszliśmy do wniosku, że zmiany można ogłosić w odnodze RA-branch. Można spróbować wykonać polecenie:
cvs update -r RA-branch -j HEAD mldonkey.init
ale najczęściej różnice między wersjami w odnogach są tak duże, że otrzymamy komunikat o braku automatycznej możliwości przeniesienia zmian. Wtedy można rozwiązać ten problem innym sposobem. Tworzymy np. w podkatalogu "SPECS" katalog "RA-branch" (nazwa katalogu jest nieistotna, ale pomocna). W podkatalogu "RA-branch" wykonujemy:
$ cvs get -A SPECS/plik.spec // parametr "A" usuwa tag $ cd SPECS $ cvs tag -b RA-branch plik.spec // nowy tag dla odnogi RA-branch $ cp z_HEAD_plik.spec // podmieniamy plik na właściwy z HEAD $ cvs commit -r RA-branch plik.spec // zatwierdzamy zmiany jako RA-branch $ |
Myślę że komentarze są czytelne. Gdy zrobimy co najmniej jedną taką operację, to istniejący katalog RA-branch może nam służyć do późniejszych operacji kopiowania zmian między odnogami (np. korzystając z opcji "cvs up".
Zdarza się często, że chcemy dać sygnał iż dany pakiet powinien zostać przebudowany przez buildery PLD (czyli takie zdalne komputery-muły robocze, które przygotowują pakiety) - wtedy podczas wpisywania komentarza po wydaniu polecenia "cvs ci" należy napisać np.
- updated to version 2.5.3. Release 1 STBR for RA update general
STBR jest skrótem od "Send To Builder Request"
Zbliżamy się do końca naszego praktycznego poradnika. Nie zostało poruszonych wiele kwestii, które wyjdą w codziennej pracy. Dlatego mamy do pomocy dokumentację, listy dyskusyjne, IRC, zasoby CVS i przeglądarkę GOOGLE ;). Praca ta miała na celu wprowadzić w świat pracy developerskiej i pokazać praktyczne rozwiązania niektórych problemów - reszta zależy od naszej wiedzy i pracowitości - i pamiętajmy, że najważniejsze to rozwijać swoje zdolności, bo od tego zależy nasza przyszłość i przyszłość projektu dla którego pracujemy :)
W tworzeniu tej pracy pośrednio lub bezpośrednio udział wzieli (w kolejności alfabetycznej):
Abramowicz Michał (abram)
Boguszewski Paweł (pawelb) <pawelb.at.pld-linux.org>
Buziak Tomasz (uho) <uho.at.xhost.one.pl>
Chomicki Arkadiusz (ChomAr) <chomar.at.wla.pl>
Ciesielski Marek (ciesiel) <ciesiel.at.pld-linux.org>
Doliński Marcin <averne.at.pld-linux.org>
Drozd Rafał (Grifter)
Gandecki Łukasz (gozda) <gozda.at.pld-linux.org>
Gołębiowski Adam (adamg) <adamg.at.pld-linux.org>
Krakowiak Paweł
Królikowski Krzysztof <krolik.at.pld-linux.org>
Kwiatkowski Paweł (qwiat) <qwiat.at.o2.pl>
Mozer Łukasz Jarosław (Baseciq)
Nowak Łukasz (Shufla) <Lukasz.at.Nowak.eu.org>
Panasiewicz Michał (wolvverine) <wolvverine.at.pld-linux.org>
Paszkiewicz Sławomir (PaSzCzUs) <paszczus.at.pld-linux.org>
Pawłowicz Sergiusz (Ser)
Poślad Marcin (Lop)
Rudnicki Daniel Dominik (sardzent)<sardzent.at.pld-linux.org>
Sikora Paweł <pluto.at.pld-linux.org>
Szafko Bartłomiej
Wojtaszek Marek (speedo) <speedo.at.linux.pl>
Niniejsza dokumentacja jest wydawana na licencji GNU Wolnej Dokumentacji. Oryginalny tekst licencji wersji 1.2 w języku angielskim możemy odnaleźć na stronie GNU Free Documentation License. Tłumaczenie starszej wersji 1.1 zostanie tutaj przytoczone i znajduje się na stronie GNU.org.pl. Różnice między wersją 1.1 a 1.2 niniejszej licencji w wersji angielskiej możemy przeczytać korzystając z tego odnośnika
Copyright (c) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Zezwala się na kopiowanie i rozpowszechnianie wiernych kopii niniejszego dokumentu licencyjnego, jednak bez prawa wprowadzania zmian.
Celem niniejszej licencji jest zagwarantowanie wolnego dostępu do podręcznika, treści książki i wszelkiej dokumentacji w formie pisanej oraz zapewnienie każdemu użytkownikowi swobody kopiowania i rozpowszechniania wyżej wymienionych, z dokonywaniem modyfikacji lub bez, zarówno w celach komercyjnych, jak i nie komercyjnych. Ponad to Licencja ta pozwala przyznać zasługi autorowi i wydawcy przy jednoczesnym ich zwolnieniu z odpowiedzialności za modyfikacje dokonywane przez innych.
Niniejsza Licencja zastrzega też, że wszelkie prace powstałe na podstawie tego dokumentu muszą nosić cechę wolnego dostępu w tym samym sensie co produkt oryginalny. Licencja stanowi uzupełnienie Powszechnej Licencji Publicznej GNU (GNU General Public License), która jest licencją dotyczącą wolnego oprogramowania.
Niniejsza Licencja została opracowana z zamiarem zastosowania jej do podręczników do wolnego oprogramowania, ponieważ wolne oprogramowanie wymaga wolnej dokumentacji: wolny program powinien być rozpowszechniany z podręcznikami, których dotyczą te same prawa, które wiążą się z oprogramowaniem. Licencja ta nie ogranicza się jednak do podręczników oprogramowania. Można ją stosować do różnych dokumentów tekstowych, bez względu na ich przedmiot oraz niezależnie od tego, czy zostały opublikowane w postaci książki drukowanej. Stosowanie tej Licencji zalecane jest głównie w przypadku prac, których celem jest instruktaż lub pomoc podręczna.
Niniejsza Licencja stosuje się do podręczników i innych prac, na których umieszczona jest pochodząca od właściciela praw autorskich informacja, że dana praca może być rozpowszechniana wyłącznie na warunkach niniejszej Licencji. Używane poniżej słowo "Dokument" odnosić się będzie do wszelkich tego typu publikacji. Ich odbiorcy nazywani będą licencjobiorcami.
"Zmodyfikowana wersja" Dokumentu oznacza wszelkie prace zawierające Dokument lub jego część w postaci dosłownej bądź zmodyfikowanej i/lub przełożonej na inny język.
"Sekcją drugorzędną" nazywa się dodatek opatrzony odrębnym tytułem lub sekcję początkową Dokumentu, która dotyczy wyłącznie związku wydawców lub autorów Dokumentu z ogólną tematyką Dokumentu (lub zagadnieniami z nią związanymi) i nie zawiera żadnych treści bezpośrednio związanych z ogólną tematyką (na przykład, jeżeli Dokument stanowi w części podręcznik matematyki, Sekcja drugorzędna nie może wyjaśniać zagadnień matematycznych). Wyżej wyjaśniany związek może się natomiast wyrażać w aspektach historycznym, prawnym, komercyjnym, filozoficznym, etycznym lub politycznym.
"Sekcje niezmienne" to takie Sekcje drugorzędne, których tytuły są ustalone jako tytuły Sekcji niezmiennych w nocie informującej, że Dokument został opublikowany na warunkach Licencji.
"Treść okładki" to pewne krótkie fragmenty tekstu, które w nocie informującej, że Dokument został opublikowany na warunkach Licencji, są opisywane jako "do umieszczenia na przedniej okładce" lub "do umieszczenia na tylnej okładce".
"Jawna" kopia Dokumentu oznacza kopię czytelną dla komputera, zapisaną w formacie, którego specyfikacja jest publicznie dostępna. Zawartość tej kopii może być oglądana i edytowana bezpośrednio za pomocą typowego edytora tekstu lub (w przypadku obrazów złożonych z pikseli) za pomocą typowego programu graficznego lub (w przypadku rysunków) za pomocą ogólnie dostępnego edytora rysunków. Ponadto kopia ta stanowi odpowiednie dane wejściowe dla programów formatujących tekst lub dla programów konwertujących do różnych formatów odpowiednich dla programów formatujących tekst. Kopia spełniająca powyższe warunki, w której jednak zostały wstawione znaczniki mające na celu utrudnienie dalszych modyfikacji przez czytelników, nie jest Jawna. Kopię, która nie jest "Jawna", nazywa się "Niejawną".
Przykładowe formaty kopii Jawnych to: czysty tekst ASCII bez znaczników, format wejściowy Texinfo, format wejściowy LaTeX, SGML lub XML wykorzystujące publicznie dostępne DTD, standardowy prosty HTML przeznaczony do ręcznej modyfikacji. Formaty niejawne to na przykład PostScript, PDF, formaty własne, które mogą być odczytywane i edytowane jedynie przez własne edytory tekstu, SGML lub XML, dla których DTD i/lub narzędzia przetwarzające nie są ogólnie dostępne, oraz HTML wygenerowany maszynowo przez niektóre procesory tekstu jedynie w celu uzyskania danych wynikowych.
"Strona tytułowa" oznacza, w przypadku książki drukowanej, samą stronę tytułową oraz kolejne strony zawierające informacje, które zgodnie z tą Licencją muszą pojawić się na stronie tytułowej. W przypadku prac w formatach nieposiadających strony tytułowej "Strona tytułowa" oznacza tekst pojawiający się najbliżej tytułu pracy, poprzedzający początek tekstu głównego.
Licencjobiorca może kopiować i rozprowadzać Dokument komercyjnie lub niekomercyjnie, w dowolnej postaci, pod warunkiem zamieszczenia na każdej kopii Dokumentu treści Licencji, informacji o prawie autorskim oraz noty mówiącej, że do Dokumentu ma zastosowanie niniejsza Licencja, a także pod warunkiem nie umieszczania żadnych dodatkowych ograniczeń, które nie wynikają z Licencji. Licencjobiorca nie ma prawa używać żadnych technicznych metod pomiarowych utrudniających lub kontrolujących czytanie lub dalsze kopiowanie utworzonych i rozpowszechnianych przez siebie kopii. Może jednak pobierać opłaty za udostępnianie kopii. W przypadku dystrybucji dużej liczby kopii Licencjobiorca jest zobowiązany przestrzegać warunków wymienionych w punkcie 3.
Licencjobiorca może także wypożyczać kopie na warunkach opisanych powyżej, a także wystawiać je publicznie.
Jeżeli Licencjobiorca publikuje drukowane kopie Dokumentu w liczbie większej niż 100, a licencja Dokumentu wymaga umieszczenia Treści okładki, należy dołączyć kopie okładek, które zawierają całą wyraźną i czytelną Treść okładki: treść przedniej okładki, na przedniej okładce, a treść tylnej okładki, na tylnej okładce. Obie okładki muszą też jasno i czytelnie informować o Licencjobiorcy jako wydawcy tych kopii. Okładka przednia musi przedstawiać pełny tytuł; wszystkie słowa muszą być równie dobrze widoczne i czytelne. Licencjobiorca może na okładkach umieszczać także inne informacje dodatkowe. Kopiowanie ze zmianami ograniczonymi do okładek, dopóki nie narusza tytułu Dokumentu i spełnia opisane warunki, może być traktowane pod innymi względami jako kopiowanie dosłowne.
Jeżeli napisy wymagane na którejś z okładek są zbyt obszerne, by mogły pozostać czytelne po ich umieszczeniu, Licencjobiorca powinien umieścić ich początek(taką ilość, jaka wydaje się rozsądna) na rzeczywistej okładce, a pozostałą część na sąsiednich stronach.
W przypadku publikowania lub rozpowszechniania Niejawnych kopii Dokumentu w liczbie większej niż 100, Licencjobiorca zobowiązany jest albo dołączyć do każdej z nich Jawną kopię czytelną dla komputera, albo wymienić w lub przy każdej kopii Niejawnej publicznie dostępną w sieci komputerowej lokalizację pełnej kopii Jawnej Dokumentu, bez żadnych informacji dodanych -- lokalizację, do której każdy użytkownik sieci miałby bezpłatny anonimowy dostęp za pomocą standardowych publicznych protokołów sieciowych. W przypadku drugim Licencjobiorca musi podjąć odpowiednie środki ostrożności, by wymieniona kopia Jawna pozostała dostępna we wskazanej lokalizacji przynajmniej przez rok od momentu rozpowszechnienia ostatniej kopii Niejawnej (bezpośredniego lub przez agentów albo sprzedawców) danego wydania.
Zaleca się, choć nie wymaga, aby przed rozpoczęciem rozpowszechniania dużej liczby kopii Dokumentu, Licencjobiorca skontaktował się z jego autorami celem uzyskania uaktualnionej wersji Dokumentu.
Licencjobiorca może kopiować i rozpowszechniać Zmodyfikowaną wersję Dokumentu na zasadach wymienionych powyżej w punkcie 2 i 3 pod warunkiem ścisłego przestrzegania niniejszej Licencji. Zmodyfikowana wersja pełni wtedy rolę Dokumentu, a więc Licencja dotycząca modyfikacji i rozpowszechniania Zmodyfikowanej wersji przenoszona jest na każdego, kto posiada jej kopię. Ponadto Licencjobiorca musi w stosunku do Zmodyfikowanej wersji spełnić następujące wymogi:
A. Użyć na Stronie tytułowej (i na okładkach, o ile istnieją) tytułu innego niż tytuł Dokumentu i innego niż tytuły poprzednich wersji (które, o ile istniały, powinny zostać wymienione w Dokumencie, w sekcji Historia). Tytułu jednej z ostatnich wersji Licencjobiorca może użyć, jeżeli jej wydawca wyrazi na to zgodę.
B. Wymienić na Stronie tytułowej, jako autorów, jedną lub kilka osób albo jednostek odpowiedzialnych za autorstwo modyfikacji Zmodyfikowanej wersji, a także przynajmniej pięciu spośród pierwotnych autorów Dokumentu (wszystkich, jeśli było ich mniej niż pięciu).
C. Umieścić na Stronie tytułowej nazwę wydawcy Zmodyfikowanej wersji.
D. Zachować wszelkie noty o prawach autorskich zawarte w Dokumencie.
E. Dodać odpowiednią notę o prawach autorskich dotyczących modyfikacji obok innych not o prawach autorskich.
F. Bezpośrednio po notach o prawach autorskich, zamieścić notę licencyjną zezwalającą na publiczne użytkowanie Zmodyfikowanej wersji na zasadach niniejszej Licencji w postaci podanej w Załączniku poniżej.
G. Zachować w nocie licencyjnej pełną listę Sekcji niezmiennych i wymaganych Treści okładki podanych w nocie licencyjnej Dokumentu.
H. Dołączyć niezmienioną kopię niniejszej Licencji.
I. Zachować sekcję zatytułowaną "Historia" oraz jej tytuł i dodać do niej informację dotyczącą przynajmniej tytułu, roku publikacji, nowych autorów i wydawcy Zmodyfikowanej wersji zgodnie z danymi zamieszczonymi na Stronie tytułowej. Jeżeli w Dokumencie nie istnieje sekcja pod tytułem "Historia", należy ją utworzyć, podając tytuł, rok, autorów i wydawcę Dokumentu zgodnie z danymi zamieszczonymi na stronie tytułowej, a następnie dodając informację dotyczącą Zmodyfikowanej wersji, jak opisano w poprzednim zdaniu.
J. Zachować wymienioną w Dokumencie (jeśli taka istniała) informację o lokalizacji sieciowej, publicznie dostępnej Jawnej kopii Dokumentu, a także o podanych w Dokumencie lokalizacjach sieciowych poprzednich wersji, na których został on oparty. Informacje te mogą się znajdować w sekcji "Historia". Zezwala się na pominięcie lokalizacji sieciowej prac, które zostały wydane przynajmniej cztery lata przed samym Dokumentem, a także tych, których pierwotny wydawca wyraża na to zgodę.
K. W każdej sekcji zatytułowanej "Podziękowania" lub "Dedykacje" zachować tytuł i treść, oddając również ton każdego z podziękowań i dedykacji.
L. Zachować wszelkie Sekcje niezmienne Dokumentu w niezmienionej postaci (dotyczy zarówno treści, jak i tytułu). Numery sekcji i równoważne im oznaczenia nie są traktowane jako należące do tytułów sekcji.
M. Usunąć wszelkie sekcje zatytułowane "Adnotacje". Nie muszą one być załączane w Zmodyfikowanej wersji.
N. Nie nadawać żadnej z istniejących sekcji tytułu "Adnotacje" ani tytułu pokrywającego się z jakąkolwiek Sekcją niezmienną.
Jeżeli Zmodyfikowana wersja zawiera nowe sekcje początkowe lub dodatki stanowiące Sekcje drugorzędne i nie zawierające materiału skopiowanego z Dokumentu, Licencjobiorca może je lub ich część oznaczyć jako sekcje niezmienne. W tym celu musi on dodać ich tytuły do listy Sekcji niezmiennych zawartej w nocie licencyjnej Zmodyfikowanej wersji. Tytuły te muszą być różne od tytułów pozostałych sekcji.
Licencjobiorca może dodać sekcję "Adnotacje", pod warunkiem, że nie zawiera ona żadnych treści innych niż adnotacje dotyczące Zmodyfikowanej wersji -- mogą to być na przykład stwierdzenia o recenzji koleżeńskiej albo o akceptacji tekstu przez organizację jako autorytatywnej definicji standardu.
Na końcu listy Treści okładki w Zmodyfikowanej wersji, Licencjobiorca może dodać fragment "do umieszczenia na przedniej okładce" o długości nie przekraczającej pięciu słów, a także fragment o długości do 25 słów "do umieszczenia na tylnej okładce". Przez każdą jednostkę (lub na mocy ustaleń przez nią poczynionych) może zostać dodany tylko jeden fragment z przeznaczeniem na przednią okładkę i jeden z przeznaczeniem na tylną. Jeżeli Dokument zawiera już treść okładki dla danej okładki, dodaną uprzednio przez Licencjobiorcę lub w ramach ustaleń z jednostką, w imieniu której działa Licencjobiorca, nowa treść okładki nie może zostać dodana. Dopuszcza się jednak zastąpienie poprzedniej treści okładki nową pod warunkiem wyraźnej zgody poprzedniego wydawcy, od którego stara treść pochodzi.
Niniejsza Licencja nie oznacza, iż autor (autorzy) i wydawca (wydawcy) wyrażają zgodę na publiczne używanie ich nazwisk w celu zapewnienia autorytetu jakiejkolwiek Zmodyfikowanej wersji.
Licencjobiorca może łączyć Dokument z innymi dokumentami wydanymi na warunkach niniejszej Licencji, na warunkach podanych dla wersji zmodyfikowanych w części 4 powyżej, jednak tylko wtedy, gdy w połączeniu zostaną zawarte wszystkie Sekcje niezmienne wszystkich oryginalnych dokumentów w postaci niezmodyfikowanej i gdy będą one wymienione jako Sekcje niezmienne połączenia w jego nocie licencyjnej.
Połączenie wymaga tylko jednej kopii niniejszej Licencji, a kilka identycznych Sekcji niezmiennych może zostać zastąpionych jedną. Jeżeli istnieje kilka Sekcji niezmiennych o tym samym tytule, ale różnej zawartości, Licencjobiorca jest zobowiązany uczynić tytuł każdej z nich unikalnym poprzez dodanie na jego końcu, w nawiasach, nazwy oryginalnego autora lub wydawcy danej sekcji, o ile jest znany, lub unikalnego numeru. Podobne poprawki wymagane są w tytułach sekcji na liście Sekcji niezmiennych w nocie licencyjnej połączenia.
W połączeniu Licencjobiorca musi zawrzeć wszystkie sekcje zatytułowane "Historia" z dokumentów oryginalnych, tworząc jedną sekcję "Historia". Podobnie ma postąpić z sekcjami "Podziękowania" i "Dedykacje". Wszystkie sekcje zatytułowane "Adnotacje" należy usunąć.
Licencjobiorca może utworzyć zbiór składający się z Dokumentu i innych dokumentów wydanych zgodnie z niniejszą Licencją i zastąpić poszczególne kopie Licencji pochodzące z tych dokumentów jedną kopią dołączoną do zbioru, pod warunkiem zachowania zasad Licencji dotyczących kopii dosłownych we wszelkich innych aspektach każdego z dokumentów.
Z takiego zbioru Licencjobiorca może wyodrębnić pojedynczy dokument i rozpowszechniać go niezależnie na zasadach niniejszej Licencji, pod warunkiem zamieszczenia w wyodrębnionym dokumencie kopii niniejszej Licencji oraz zachowania zasad Licencji we wszystkich aspektach dotyczących dosłownej kopii tego dokumentu.
Kompilacja Dokumentu lub jego pochodnych z innymi oddzielnymi i niezależnymi dokumentami lub pracami nie jest uznawana za Zmodyfikowaną wersję Dokumentu, chyba że odnoszą się do niej jako do całości prawa autorskie. Taka kompilacja jest nazywana zestawieniem, a niniejsza Licencja nie dotyczy samodzielnych prac skompilowanych z Dokumentem, jeśli nie są to pochodne Dokumentu.
Jeżeli do kopii Dokumentu odnoszą się wymagania dotyczące Treści okładki wymienione w części 3 i jeżeli Dokument stanowi mniej niż jedną czwartą całości zestawienia, Treść okładki Dokumentu może być umieszczona na okładkach zamykających Dokument w obrębie zestawienia. W przeciwnym razie Treść okładki musi się pojawić na okładkach całego zestawienia.
Tłumaczenie jest uznawane za rodzaj modyfikacji, a więc Licencjobiorca może rozpowszechniać tłumaczenia Dokumentu na zasadach wymienionych w punkcie 4. Zastąpienie Sekcji niezmiennych ich tłumaczeniem wymaga specjalnej zgody właścicieli prawa autorskiego. Dopuszcza się jednak zamieszczanie tłumaczeń wybranych lub wszystkich Sekcji niezmiennych obok ich wersji oryginalnych. Podanie tłumaczenia niniejszej Licencji możliwe jest pod warunkiem zamieszczenia także jej oryginalnej wersji angielskiej. W przypadku niezgodności pomiędzy zamieszczonym tłumaczeniem a oryginalną wersją angielską niniejszej Licencji moc prawną ma oryginalna wersja angielska.
Poza przypadkami jednoznacznie dopuszczonymi na warunkach niniejszej Licencji nie zezwala się Licencjobiorcy na kopiowanie, modyfikowanie, czy rozpowszechnianie Dokumentu ani też na cedowanie praw licencyjnych. We wszystkich pozostałych wypadkach każda próba kopiowania, modyfikowania lub rozpowszechniania Dokumentu albo cedowania praw licencyjnych jest nieważna i powoduje automatyczne wygaśnięcie praw, które licencjobiorca nabył z tytułu Licencji. Niemniej jednak w odniesieniu do stron, które już otrzymały od Licencjobiorcy kopie albo prawa w ramach niniejszej Licencji, licencje nie zostaną anulowane, dopóki strony te w pełni się do nich stosują.
W miarę potrzeby Free Software Foundation może publikować nowe poprawione wersje GNU Free Documenation License. Wersje te muszą pozostawać w duchu podobnym do wersji obecnej, choć mogą się różnić w szczegółach dotyczących nowych problemów czy zagadnień. Patrz http://www.gnu.org/copyleft/. Każdej wersji niniejszej Licencji nadaje się wyróżniający ją numer. Jeżeli w Dokumencie podaje się numer wersji Licencji, oznaczający, iż odnosi się do niego podana "lub jakakolwiek późniejsza" wersja licencji, Licencjobiorca ma do wyboru stosować się do postanowień i warunków albo tej wersji, albo którejkolwiek wersji późniejszej opublikowanej oficjalnie (nie jako propozycja) przez Free Software Foundation. Jeśli Dokument nie podaje numeru wersji niniejszej Licencji, Licencjobiorca może wybrać dowolną wersję kiedykolwiek opublikowaną (nie jako propozycja) przez Free Software Foundation.
Załącznik: Jak zastosować tę Licencję dla swojego dokumentu.
Aby zastosować tę Licencję w stosunku do dokumentu swojego autorstwa, dołącz kopię Licencji do dokumentu i zamieść następującą informację o prawach autorskich i uwagi o licencji bezpośrednio po stronie tytułowej.
Copyright (c) ROK TWOJE IMIE I NAZWISKO Udziela się zezwolenia do kopiowania rozpowszechniania i/lub modyfikację tego dokumentu zgodnie z zasadami Licencji GNU Wolnej Dokumentacji w wersji 1.1 lub dowolnej późniejszej opublikowanej przez Free Software Foundation; wraz z zawartymi Sekcjami Niezmiennymi LISTA TYTUŁÓW SEKCJI, wraz z Tekstem na Przedniej Okładce LISTA i z Tekstem na Tylnej Okładce LISTA. Kopia licencji załączona jest w sekcji zatytułowanej "GNU Free Documentation License"
Jeśli nie zamieszczasz Sekcji Niezmiennych, napisz "nie zawiera Sekcji Niezmiennych" zamiast spisu sekcji niezmiennych. Jeśli nie umieszczasz Teksu na Przedniej Okładce wpisz "bez Tekstu na Okładce" w miejsce "wraz z Tekstem na Przedniej Okładce LISTA", analogicznie postąp z "Tekstem na Tylnej Okładce"
Jeśli w twoim dokumencie zawarte są nieszablonowe przykłady kodu programu, zalecamy abyś także uwolnił te przykłady wybierając licencję wolnego oprogramowania, taką jak Powszechna Licencja Publiczna GNU, w celu zapewnienia możliwości ich użycia w wolnym oprogramowaniu.