Historia zmian | |
---|---|
Zmiana $Rev: 12145 $ | |
beta |
Spis treści
Spis rysunków
Spis tabel
Spis treści
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.*
oznacza wszytskie pliki zaczynjące się od
plik.
w katalogu
/katalog
.
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
„Autorzy dokumentacji PLD”
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
Spis treści
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
„
Oficjalne wersje PLD
”, zaś architektury w
„Architektury pakietów”.
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
„
Oficjalne wersje PLD
”, źródła w
„Źródła pakietów”, zaś architektury w
„Architektury pakietów”.
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
FUH KERNEL, VNET.sk, Bratysława, Słowacja - http://ftp.pld-linux.org/
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>
Spis treści
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™
Spis treści
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 „Statyczne zarządzanie modułami”. 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 „LVM” zaś macierzy w „RAID programowy”. 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
„Nazewnictwo urządzeń masowych”.
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
Podział dysku na partycje szerzej opisano w „Podział na partycje”. Zakładamy, że na pierwszej partycji dysku IDE umieścimy obszar wymiany, zaś na drugiej główny system plików.
Inicjujemy obszar wymiany:
# mkswap /dev/sda1
Tworzymy system plików (np. ext3):
# mkfs.ext3 /dev/sda2
Powyższe operacje omówiliśmy dokładnie w „Systemy plików”.
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
W pliku /etc/sysconfig/static-routes
dodajemy trasę routingu do bramy (np.: 10.0.0.254):
eth0 default via 10.0.0.254
W pliku /etc/resolv.conf
podajemy przynajmniej jeden adres serwera DNS:
nameserver 193.192.160.243
Na koniec przeładowujemy podsystem sieci:
# service network restart
Konfigurację sieci szerzej opisano w „Wstęp”.
Jeśli potrzebujemy skorzystać z proxy ustawiamy odpowiednią zmienną środowiskową np.:
# export ftp_proxy=w3cache.dialog.net.pl:8080
Szczegóły konfiguracji proxy odnajdziemy w „Proxy”.
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
„Architektury pakietów”.
Dobrym pomysłem jest ustawienie opcji, umożliwiającej precyzyjne
wybieranie alternatywnych pakietów (dla nieco bardziej zaawansowanych):
choose equivalents manually = yes
w pliku
/etc/poldek/poldek.conf
.
Teraz tworzymy katalog na indeksy Poldka np.:
# mkdir -p /pldroot/var/cache/poldek-cache
Następnie w konfiguracji Poldka musimy wskazać ten katalog,
odszukujemy w pliku /etc/poldek/poldek.conf
opcję cachedir
, w której definiujemy ścieżkę
do katalogu:
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
lub wsadowego
# 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
Więcej w „Kluczowe pliki”.
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 „Jądro systemu”.
Kiedy już wybraliśmy, instalujemy wybrany pakiet:
# poldek --root /pldroot -i kernel
Jeśli nie pominęliśmy żadnego kroku, to powinien nam się wygenerować prawidłowy obraz initrd, w przeciwnym wypadku musimy to wykonać samodzielnie wg. opisu zamieszczonego w „Initrd”.
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
Teraz instalujemy bootloader:
# chroot /pldroot /sbin/grub
Kiedy zgłosi się nam powłoka GRUB-a kolejno wydamy następujące polecenia:
grub> root (hd0,1) grub> setup (hd0) grub> quit
Konfigurację bootloadera wyczerpująco przedstawiono w
„Wstęp”. 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 „RAID programowy”.
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
Urządzenia dev oraz udev zostały opisane w „Urządzenia”.
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
Szczegółowy opis narzędzi z pakietu pwdutils znajdziemy w „Konta użytkowników”.
Spis treści
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.
Spis treści
Spis treści
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
W skrócie z podręcznika korzystamy następująco:
info {$hasło}
{$hasło}
może być nazwą programu, biblioteki,
pliku konfiguracyjnego. Dodatkową dokumentację odnajdziemy
w katalogu /usr/share/doc
,
tam też możemy odnaleźć przykładowe pliki konfiguracji,
historię zmian programu, licencje i wiele innych informacji.
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 „Ważne adresy”.
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: „Zmiana poziomu pracy systemu”
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
Oprócz możliwości wyświetlania daty i czasu w niemal dowolnym formacie, pozwoli nam na ustawianie czasu systemowego. Szczegółowy opis programu znajdziemy w podręczniku man.
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
Po otworzeniu pliku jesteśmy w trybie wydawania poleceń, aby przejść do trybu edycji naciskamy klawisz i. Teraz możemy wprowadzać zmiany. Po wykonaniu zmian naciskamy klawisz Esc aby powrócić do trybu wydawania poleceń. Teraz należy opuścić program jednym z poniższych poleceń: :q - wyjście z programu jeśli nie dokonaliśmy żadnych zmian; :wq - wyjście z zapisaniem zmian do pliku; :q! - wyjście z programu bez zapisywania dokonanych zmian.
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 „Zarządzanie uprawnieniami”. Bardziej zaawansowane narzędzia sieciowe opisano w „Narzędzia 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 '*'
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
Są programy, które akceptują nazwy tych zmiennych napisanych wyłącznie wielkimi literami, tak więc dla wygody i pewności możemy zdefiniować obie wersje. Więcej o zmiennych środowiskowych znajdziemy w „Zmienne środowiskowe”.
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
Szczegółowy opis oznaczeń kolumn odnajdziemy w podręczniku systemowym man/info.
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
Spis treści
Spis treści
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 „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 „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 „Serwery z pakietami”.
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 „Jądro systemu”.
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
Powyższe polecenie ma zadanie czysto informacyjne, gdyż jak już wspomniano zależnościami zajmie sie menedżer pakietów.
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)
Analizując powyższe przykłady można dopatrzyć się
informacji o dostarczaniu własności
crondaemon
przez vixie-cron, która
z kolei jest wymagana przez logrotate.
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]
Na powyższym przykładzie widać listę pakietów
mogących pełnić funkcję demona
zegarowego (crondaemon
),
dodatkowo podana jest domyślna wartość wyboru, nie
zawsze jest to najlepszy wybór dla konkretnej
instalacji, dlatego powinniśmy się upewnić, że
wybieramy najwłaściwszy pakiet. Więcej informacji o
obsłudze i konfiguracji Poldka odnajdziemy w
„Poldek”.
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
lub listami plików dostarczanych przez pakiet:
poldek:/all-avail> desc -f proftpd-inetd
Zdarza się, że znamy nazwę pliku, ale nie wiemy w jakim pakiecie się znajduje. Do odnalezienia pakietu posłużymy się poleceniem:
poldek:/all-avail> search -f */sendmail
Dodatkowo możemy korzystać z zamieszczonej dalej tabeli.
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 8.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 „Jądro systemu” |
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 „Zarządzanie podsystemami i usługami”.
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}
Przykładowo adres
ftp://ftp.pld-linux.org/dists/2.0/PLD/i686/
dotyczy systemu w wersji 2.0 (Ac)™ z
wybraną architekturą "i686
".
Poldek instaluje pakiety z tej architektury, do której należał
pakiet z Poldkiem, co w zasadzie jest jednoznaczne z architekturą, która została
wybrana przy instalacji. Konfiguracja źródeł pakietów w Poldku została opisana
w „Poldek”.
Tabela 8.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
W większości wypadków, będziemy korzystać z głównego źródła (main), jednak od czasu do czasu potrzeba zaktualizować system lub pobrać niestandardowe wersje pakietów, właśnie wtedy z nich skorzystamy. Źródła są oznaczane za pomocą etykiet:
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
Należy pamiętać, że użycie każdego źródła będzie możliwe dopiero po pobraniu aktualnych indeksów:
$ 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 „Serwery z pakietami”.
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 „Co jest potrzebne”.
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
„Architektury pakietów”,
adresy serwerów i oficjalnych mirrorów zawarto w
„Serwery z pakietami”.
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
„Proxy”.
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
spowoduje wyświetlenie listy pakietów, dla których są dostępne aktualizacje.
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
Jest tam całe bogactwo
opcji, dzięki którym będziemy mogli ułatwić sobie pracę.
Na szczególną uwagę zasługuje parametr --shcmd
pozwalający wydawać polecenia w trybie wsadowym jak w trybie
powłoki np.:
$ poldek --shcmd="desc apache"
Możemy w tym celu użyć również polecenia ipoldek, np.:
$ 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
Aby pobrać na nowo indeksy wywołujemy Poldka z parametrem
--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}
Opis dodatkowych parametrów znajdziemy w pomocy danego polecenia, po napisaniu:
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*
wyświetlenie informacji o pakiecie:
poldek> desc zsh
instalacja pakietu:
poldek> install zsh
deinstalacja:
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
Teraz lista dostępnych pakietów będzie się składała z
zawartości źródeł ac
i
ac-ready
,
jeśli chcemy, aby zawsze korzystał z niestandardowego
zestawu źródeł wygodniej będzie zmodyfikować ustawienie opcji
noauto
. Oficjalne źródła PLD
zostały wyczerpująco omówione w
„Źródła pakietów”.
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.
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).
Dobrym zwyczajem jest używanie Poldka z poziomu zwykłego użytkownika z włączoną obsługą sudo:
use sudo = yes
Jest to domyślne zachowanie Poldka, dzięki temu dla operacji wymagających uprawnień superużytkownika używany jest program sudo. Oczywiście w systemie musi być zainstalowany pakiet sudo, a dany użytkownik musi być uprawniony do jego używania.
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
Od tej pory nie zobaczymy żadnych komunikatów z ostrzeżeniami,
warto dodatkowo zabezpieczyć się przed przypadkowym zainstalowaniem
niepodpisanych pakietów. Wystarczy, że do każdego z podpisanych źródeł
zdefiniowanych w pliku /etc/poldek/pld-source.conf
dodajemy wiersz:
signed = yes
przykładowe źródło będzie wyglądało następująco:
[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
Od tej pory każda aktualizacja rozpocznie się od ponownego złożenia pakietu. Dla pojedynczych pakietów nie ma sensu modyfikować pliku z makrami, lepiej przekazać parametr do rpm-a:
poldek> upgrade geninitrd-10000.18-6.noarch --pmop=--repackage
W przypadku bezpośredniego użycia rpm-a:
# rpm -U --repackage geninitrd-10000.18-6.noarch
Tak zbudowane pakiety
trafiają do katalogu /var/spool/repackage
Repakietacja jest czasochłonna, ponadto dodatkowo
zajmowane jest miejsce na dysku, dlatego najlepiej używać tej
funkcji tylko dla wybranych programów.
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
szczegółowy opis oznaczeń znajdziemy w manualu programu rpm. Musimy pamiętać, że wiele plików konfiguracyjnych (oznaczanych literką "c") jest modyfikowanych po instalacji programu, dlatego ich obecność na liście jest naturalna.
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
Taką listę możemy teraz sobie obejrzeć i ewentualnie zmodyfikować, kiedy lista już nam odpowiada sprawdzamy z jakich pakietów pochodzą pliki:
# cat pliki.txt | xargs rpm -qf --qf '%{NAME}\n' | sort -u > pakiety.txt
Powyższy ciąg poleceń stworzy listę składającą się wyłącznie z nazw pakietów, by uniknąć problemów w przypadku różnic w wersjach pakietów: tych zainstalowanych z dostępnymi do instalacji. Mając listę unikalnych nazw pakietów, możemy wywołać polecenie ich reinstalacji:
# 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
jeśli nie wyświetlą nam się żadne informacje to
możemy usunąć pliki blokad, łatwo je rozpoznamy,
gdyż zaczynają się od __db
# rm -f /var/lib/rpm/__db*
Teraz możemy spróbować czy sytuacja się poprawiła, jeśli nie to musimy spróbować przebudować bazę. Zaczynamy od wykonania kopii bezpieczeństwa:
# tar -czf rpm.tar.gz /var/lib/rpm/
następnie wydajemy polecenia przebudowania:
# rpm --rebuilddb
W większości wypadków ta operacja pomoże nam odzyskać bazę, może się jednak zdarzyć, że odtworzy nam się tylko jej część. Do oszacowania strat konieczne będzie utworzenie listy pakietów w bazie:
# rpm -qa
Kiedy ustalimy listę brakujących pozycji,
najłatwiejszym sposobem dodania brakujących
wpisów będzie instalacja pakietów z opcją
--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
Tryb modyfikacji parametrów startowych w Grubie aktywujemy przez wciśnięcie klawisza e, w przypadku LILO wpisujemy etykietę obrazu, jeśli to jest graficzne LILO to użyjemy klawisza tab.
Tabela 9.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
Więcej o poziomach pracy w
„Zmiana poziomu pracy systemu”, zaś o pliku
|
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
Urządzenia oraz liczby major i minor szerzej opisano w „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 „Parametry jądra”.
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
Sposób dodania tej opcji do pliku konfiguracji bootloadera opisano w dotyczących ich rozdziałach.
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 9.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 „Initrd”.
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
„Wstęp”. Z nazewnictwem
urządzeń masowych zapoznamy się w
„Nazewnictwo urządzeń masowych”.
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
Pierwsza włącza tryb interaktywny, druga zaś ustawia czas oczekiwania na naszą reakcję, podawany w dziesiątych częściach sekundy. W tej chwili możemy wygenerować lilo i zrestartować maszynę aby sprawdzić czy dokonaliśmy prawidłowej konfiguracji.
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
Opcję default
umieszczamy w głównej
części konfiguracji.
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
Przykładowa konfiguracja obrazu będzie wyglądała następująco:
image=/boot/vmlinuz label=pld root=/dev/hda1 initrd=/boot/initrd vga=0x303
Listę dostępnych trybów zamieszczono w „Wstęp”.
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
Określamy kolory i położenie tekstu na ekranie:
bmp-table = 17,9;1,14,16,4 bmp-colors = 0,213,137;152,24,1 bmp-timer = 2,29;152,52,1
Musimy pamiętać że powyższe dane są dobrane dla konkretnego obrazka i dla innego mogą nie być dobre.
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 „Initrd”.
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 „Nazewnictwo urządzeń masowych”.
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 „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
Teraz uruchamiamy instalację bootloadera w MBR dysku, wydajemy polecenie setup z odpowiednim parametrem:
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.
Komunikaty wskazują poprawność operacji, więc pozostaje nam tylko wyjście z powłoki programu.
grub> quit
W ten oto sposób staliśmy się posiadaczami GRUB-a w naszym systemie, możemy teraz zrestartować maszynę.
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
Domyślnym obrazem wybranym przez bootloader jest ten
pierwszy w kolejności w pliku konfiguracji. Możemy to
ustawienie bardzo prosto modyfikować za pomocą opcji
default
wskazującej numer obrazu. Obrazy
są numerowane wg. kolejności począwszy od 0 np.:
default 2
Omawianą opcję wstawiamy do sekcji głównej pliku konfiguracji.
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
Listę dostępnych trybów zamieszczono w „Wstęp”.
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
Aby napisy pozostały czytelne możemy ustalić ich kolor za
pomocą opcji foreground
i
background
np.:
foreground = ffffff background = 000000
Pierwsza z opcji wskazuje główny kolor liter, druga zaś określa kolor ich cienia, oba parametry przyjmują szesnastkowe wartości. Teraz restartujemy komputer, aby sprawdzić czy wszystko działa poprawnie.
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
„Podział na partycje”.
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 „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
Spis treści
Abstrakt
Jak zapewne większości z was wiadomo jądro (kernel) jest najważniejszym elementem każdego systemu. W uproszczeniu można powiedzieć, że zajmuje się ono nadzorowaniem komunikacji wszystkich elementów systemu.
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
„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
Jeśli interesuje nas konfiguracja danego jądra, to
możemy ją odczytać z pliku /proc/config.gz
(w Th
plik jest dostępny po uprzednim załadowaniu modułu configs) np.:
# zcat /proc/config.gz
lub z pliku config-dist
dostarczanego z właściwym
pakietem kernel-headers np.:
# 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.
Tabela 10.1. Kernele
Nazwa | Cechy |
---|---|
kernel | uniwersalny kernel z wieloma dodatkowymi funkcjami przydatnymi na serwerach, będzie dobry dla większości zastosowań (w PLD Th i w Ac z ac-updates obsługuje Linux VServers™). |
kernel-grsecurity | kernel z obsługą grsecurity™ (przyrostek "grsecurity" wprowadzono w PLD Ac) - przeznaczony raczej dla serwerów |
kernel-desktop | przeznaczony dla stacji roboczych: obsługa m.in.: squashfs, bootsplash; pakiet jest budowany z kernel-desktop.spec |
kernel-laptop | odmiana kernel-desktop, przeznaczona przede wszystkim dla komputerów przenośnych |
kernel-vanilla | Kernel bez jakichkolwiek modyfikacji (tzw. waniliowy), zwykle dostarcza najaktualniejszą wersję jądra. Brakuje mu wielu funkcji z głównego w PLD jądra, niekiedy jednak bywa od niego szybszy. |
kernel-mosix | jądro z obsługą klastrów openMOSIX™ |
kernel24 | rodzina kerneli z serii 2.4.x - obecnie przestarzała, ciągle jednak dostępna w Ac. |
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
Po tej operacji zostanie na nowo wygenerowany obraz
initrd
, użytkownicy LiLo muszą dodatkowo
wydać polecenie lilo.
W ten sposób mamy zainstalowane dwa jądra,
przy czym po ponownym uruchomieniu użyta zostanie nowa
wersja.
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
„Poldek”. Więcej o zależnościach pomiędzy
pakietami w „Cechy pakietów w PLD”.
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 „Podstawowe ustawienia”.
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
„Wstęp”, 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
Parametry możemy wysłać za pomocą programu echo np.:
# echo "1" > /proc/sys/net/ipv4/ip_forward
Możemy do tego również użyć programu sysctl, który
za nazwę węzła
przyjmuje nazwy katalogów rozdzielone kropkami, z pominięciem
"/proc/sys
". Poniżej umieszczono przykład
odczytania opcji:
# /sbin/sysctl net.ipv4.ip_forward
oraz przypisania:
# /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
Niektóre rc-skrypty wywołują automatycznie program
sysctl, przykładowo robi to skrypt podsystemu
sieci, gdyż plik /etc/sysctl.conf
zawiera
istotne opcje sieciowe.
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
Obydwie metody zostaną przedstawione w dalszych rozdziałach.
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
Dzięki tej linijce wszelkie odwołania przy ładowaniu modułów
załadują automatycznie moduł 8139too
.
alias parport_lowlevel parport_pc
W tym fragmencie pliku /etc/modprobe.conf
widzimy już znany alias
z tym, że w trochę innej
formie. Ponieważ występuje tu nazwa_jednego_modułu i
nazwa_drugiego_modułu
. Oznacza to, że jak będzie potrzeby
moduł parport_lowlevel
, to zostanie też automatycznie
załadowany moduł 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
Linijka przesyła jako parametr do modułu parport_pc
argumenty we/wy i przerwania. Więcej informacji o dostępnych opcjach modułu
można uzyskać po wydaniu polecenia modinfo parport_pc.
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?)
drugi zwrócony łańcuch jest nazwą szukanego modułu. Aby otrzymać listę parametrów jakie przyjmuje program należy uruchomić go bez parametru. Uwaga: w celu określenia modułu kontrolera dysku nie należy używać parametru 'ide', tylko 'sata', gdyż linia sterowników IDE jest przestarzała. Zamiast niej należy używać tych opartych na libata.
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.
Kiedy sądzimy że odnaleźliśmy właściwy moduł możemy go bez obaw wczytać i przetestować nasze urządzenie, jeśli próba zakończyła się sukcesem to możemy zapisać jego nazwę do odpowiedniego pliku aby został załadowany przy każdym starcie systemu. Opis tego znajduje się w dalszej części rozdziału.
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
Usuwanie modułu z pamięci (możliwe tylko jeśli nie jest używany):
# modprobe -r ne2k-pci
Wyświetlenie listy modułów zależnych od podanego:
# 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
Wyświetlenie listy dostępnych modułów:
# 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 „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
spowoduje załadowanie modułu 8139too. Nic nie stoi na przeszkodzie żeby
taki moduł został dopisany do /etc/modules
, jednak
metoda oparta na aliasach jest bardziej czytelna i elegancka (zwłaszcza
przy większej ilości kart sieciowych).
Poniżej została przedstawiona lista takich aliasów:
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).
Przykładowa konfiguracja:
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 „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
Osoby nie ufające do końca dynamicznemu tworzeniu urządzeń, nie usuwają z systemu statycznego deva tak jak to zrobiliśmy powyżej. Praktyka pokazuje jednak, że nie ma powodów do obaw i poza wyjątkowo ważnymi instalacjami systemu nie ma takiej potrzeby.
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...
Jądro mówi nam, że nie może zamontować głównego systemu plików, gdyż brakuje mu jakiegoś komponentu. Może się to zdarzyć, że nasz sprzęt nie został prawidłowo wykryty lub próbujemy uruchomić PLD z naszego dysku na innym komputerze (o innym kontrolerze urządzeń masowych).
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 „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
Teraz przyszedł czas na wygenerowanie obrazu wg schematu
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=""
lub zmodyfikować wywołanie geninitrd poprzez użycie parametru --with:
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
rozpakowany plik montujemy jako loop:
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
Pomimo tego błędu dobrze się skopiowało, warto jednak sprawdzić uprawnienia i atrybuty pliku (ewentualnie poprawić na takie jak w oryginale)
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
Kompresujemy nowy initrd:
# gzip -9 initrd-nowy
Teraz już pozostało tylko skopiowanie pliku
initrd-nowy.gz
do
/boot
i nadanie mu odpowiedniej
nazwy.
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 „Wstęp”.
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=""
możemy też użyć opcji --with programu geninitrd. Warto pamiętać żeby nie przesadzać z ich ilością, może to spowodować wolniejszy start systemu i niepotrzebne zużycie pamięci operacyjnej przez nieużywane sterowniki.
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 „Nazewnictwo urządzeń masowych”.
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
Na powyższym przykładzie major jest równa 3, zaś minor jest równa 2. Pierwsza literka w łańcuchu opisującego uprawnienia określa rodzaj pliku, znak "b" (jak na powyższym przykładzie) oznacza urządzenie blokowe, zaś "c" urządzenie znakowe.
Jeśli potrzebujemy samodzielnie utworzyć plik urządzenia, to użyjemy do tego programu mknod np.:
# /bin/mknod /dev/zero c 1 5
Numery major i minor oraz inne informacje odnajdziemy w dokumentacji
kernela, jeśli zainstalujemy pakiet kernel-doc to
powinniśmy zapoznać się z zawartością pliku
/usr/src/linux/Documentation/devices.txt
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 „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
„Ratowanie systemu”.
Parametr jądra init
jak i wiele innych
szerzej opisano w „Wstęp”.
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.
Spis treści
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 „X-Server”. 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
Aby wskazać strefę czasową modyfikujemy plik
/etc/sysconfig/timezone
,
jego ustawienia wskazują na odpowiednie pliki i katalogi
w /usr/share/zoneinfo
, które z kolei odpowiadają
strefom czasowym. Nazwy plików odpowiadają pewnym punktom
geograficznym tak aby łatwiej było określić właściwą strefę.
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
Więcej informacji o strefach czasowych znajdziemy na witrynie www.timeanddate.com
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"
W przeciwnym wypadku ustawiamy czas lokalny i wybieramy wartość
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
„Zmiana poziomu pracy systemu”.
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
Jeśli nie używamy tego rodzaju urządzeń to powyższe wywołania są dla nas zbyteczne.
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 „Nazewnictwo urządzeń masowych”, montowanie udziałów NFS
przedstawiono w „NFS - Network File System”.
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
„Konta użytkowników”.
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 „Grupy”
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.
Spis treści
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 „GRUB”.
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
„Nazewnictwo urządzeń masowych”.
Opis systemu plików-urządzeń z katalogu /dev
odnajdziemy w „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
Jeśli zechcemy powrócić do poprzedniego układu partycji wystarczy, że wydamy polecenie:
# 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
Logi i dane mogą zajmować bardzo duże ilości miejsca, dlatego musimy podejść do tego indywidualnie.
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 „GRUB”.
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
Założyłem, że na dysku nie ma innych partycji, jeśli w naszym wypadku takie są to musimy je najpierw usunąć. Kiedy dysk jest gotowy uruchamiamy program fdisk:
# fdisk /dev/sda Command (m for help):
wybieramy opcję n (nowa partycja)
Command action e extended p primary partition (1-4)
Program pyta o rodzaj rodzaj partycji, którą ma utworzyć. Tu wybór zależy od nas ale jeśli dysk ma mieć nie więcej niż cztery partycje, to śmiało możemy zostać przy partycjach podstawowych - w naszym przykładzie wybieramy opcję p (podstawowa partycja). Dalej program zapyta nas o numer partycji, pierwszy i rozmiar partycji. Rozmiar możemy podać w cylindrach, KiB, MiB lub GiB.
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 „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
Więcej o nazewnictwie urządzeń masowych w „Nazewnictwo urządzeń masowych”.
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
System plików zostanie automatycznie wykryty a opcje zostaną ustawione na wartość "defaults". Więcej na ten temat odnajdziemy w podręczniku systemowym.
Obszary wymiany aktywujemy następująco:
# /sbin/swapon /dev/hda5
Szczegółowy opis pliku /etc/fstab
oraz rc-skryptów przedstawiono w
„Kluczowe pliki”.
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)
Listę urządzeń z utworzonymi do tej pory systemami plików uzyskamy za pomocą programu blkid:
# 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"
Aby zobaczyć systemy plików podmontowanych urządzeń możemy użyć programu mount:
/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.
Najczęściej stosuje się macierze RAID1 i RAID5, do specyficznych zastosowań używa się RAID0, pozostałe są rzadziej spotykane.
Instalujemy następujące pakiety:
# poldek -i mdadm
A jeśli zaplanowaliśmy umieszczenie głównego systemu plików (/) na macierzy, musimy dodatkowo zainstalować pakiet mdadm-initrd:
# poldek -i mdadm-initrd
oraz możemy opcjonalnie dla dysków ATA przy korzystaniu z device-mapera zainstalować dodatkowo:
# 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
jak się łatwo domyśleć w powyższym przykładzie kopiujemy z dysku
/dev/sdc
na /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 „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
Teraz możemy dokonać odpowiednich wpisów w pliku
/etc/fstab
.
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]
Następnie dodajemy definicje macierzy, możemy to zrobić automatem:
# mdadm --detail --scan >> /etc/mdadm.conf:
lub samodzielnie, poprzez dodanie następujących wierszy:
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 „Initrd”.
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
Opcja w opcji 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>
następnie szukamy gdzie znajdują sie pliki bootloadera,
grub>find /boot/grub/stage1
jeśli
/boot
jest oddzielną partycją to
/grub/stage1
i otrzymujemy wynik, np:
(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)
i to samo dla dysku drugiego czyli:
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.
Bootloadery szczegółowo opisaliśmy w „Wstęp”.
Skrócone informacje o macierzy:
# mdadm --query /dev/md0
Poniżej podałem przykłady dwóch poleceń, które pozwalają odczytać dokładne dane macierzy i jej stan:
# 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
analogicznie RAID01 tworzymy mając dwie macierze RAID0.
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 „Udev - dynamiczna obsługa sprzętu”.
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żą.
Schemat LVM-u, który zostanie użyty jako przykład w tym rozdziale:
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 „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
VG będzie miało rozmiar ~500GB miejsca, z czego 400GB przydzielimy do użytku, a resztę pozostawimy dla przyszłych, nieokreślonych na razie zastosowań. Miejsce na VG rozdysponujemy następująco:
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
tworzymy Volume Group o nazwie "vgsys" z wskazanych powyżej PV:
# vgcreate vgsys /dev/sda2 /dev/sdb
W powstałej VG tworzymy woluminy o podanych pojemnościach (-L) i dowolnych nazwach (-n):
# lvcreate -L 5GB -n swap vgsys # lvcreate -L 25GB -n rootfs vgsys # lvcreate -L 370GB -n home vgsys
na naszym VG pozostaje 100GB wolnego miejsca, które
możemy rozdysponować w przyszłości (przykład dalszej części
rozdziału). Rzucającą się w oczy cechą woluminów logicznych jest
możliwość swobodnego nadawania im nazw, co znacznie ułatwia
utrzymanie porządku. Do utworzonych
powyżej woluminów odwołujemy się za pomocą utworzonych
przed chwilą urządzeń:
/dev/vgsys/swap
,
/dev/vgsys/rootfs
i
/dev/vgsys/home
.
Woluminy są już gotowe do pracy, musimy jeszcze tylko
utworzyć na nich systemy plików, co robimy jak w przypadku
tradycyjnych partycji np.:
# mkswap /dev/vgsys/swap # mkfs.xfs /dev/vgsys/rootfs # mkfs.xfs /dev/vgsys/home
partycja dla gałęzi /boot:
# mkfs.ext2 /dev/sda1
Teraz montujemy woluminy w klasyczny sposób i
jeśli wszystko przebiegło bez błędów
dokonujemy odpowiednich modyfikacji w
/etc/fstab
.
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
„Initrd”.
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
aby wszystkie aktywować wywołujemy:
# 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
Teraz, kiedy wolumin jest powiększony, musimy rozszerzyć system plików, w naszych przykładach jest to XFS, zatem musimy podmontować wolumin, a następnie:
# xfs_growfs /home
Operacja trwa krótko i nie powoduje utraty danych, jednak jak przypadku każdych operacji dyskowych, powinniśmy wcześniej wykonać kopię zapasową. Każdy system plików posiada własne narzędzia do zmiany rozmiaru systemu plików, szczegóły w ich dokumentacji.
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
Program wypisze listę uszkodzonych bloków
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
do naprawy XFS-a użyjemy programu xfs_repair. Programy te różnią się nieco obsługą, dlatego przed użyciem każdego z nich należy zapoznać się z podręcznikiem systemowym (man/info), tak wygląda przykładowe wywołanie testu systemu plików XFS:
# 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 „Zaawansowane operacje”.
Spis treści
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
Szczegółowy opis bootloadera i przekazywanie parametrów kernela opisano w „Wstęp”. Poziomy pracy zostały szerzej omówione w „Zmiana poziomu pracy systemu”
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
Jeżeli naprawiany system jest oparty na macierzach programowych to musimy je najpierw złożyć np.:
# mdadm -A --auto=yes /dev/md0 /dev/hda /dev/hdb
Więcej szczegółów dotyczących programowych macierzy znajdziemy w „RAID programowy”.
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
Naprawy systemów plików została szczegółowo omówiona w „Naprawa”.
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
Jeżeli masz więcej partycji, na których znajdują się
pliki systemowe (np. /boot
), także
je podmontuj w odpowiednich katalogach np.:
# mount /dev/hda1 /mnt/rootfs/boot
mamy teraz nieograniczony dostęp do plików uszkodzonego systemu.
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
Udev dokładniej opisano w „Udev - dynamiczna obsługa sprzętu”.
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
„Cechy pakietów w PLD”.
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 13.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 „Cechy pakietów w PLD”
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 „Cechy pakietów w PLD”
Druga grupa to opcje występujące tylko w pliku konfiguracji konkretnego rc-skryptu - zwykle są związane z argumentami pliku wykonywalnego usługi, dlatego należy uważnie czytać komentarze plików konfiguracji i w razie potrzeby podręczniki systemowe usług.
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
Włączenie analogicznie:
# chkconfig sshd on
Poziomy dla których usługa ma być włączona/wyłączona jest wskazywane przez specjalny wpis w rc-skrypcie, możemy go odczytać następująco:
$ grep chkconfig /etc/init.d/sshd # chkconfig: 345 55 45
pierwszy ciąg cyfr w wierszu to lista poziomów, których dotyczy operacja włączenia/wyłączenia rc-skryptu. W razie potrzeby możemy wymusić operację dla konkretnego numeru poziomu pracy np:
# 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 „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 „Zarządzanie podsystemami i usługami”.
Tabela 13.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 „X-Server”. |
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 „Kluczowe pliki”.
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 „Wstęp”.
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
Powyższe polecenie doda konto o identyfikatorze 'jkowalski' i
utworzy katalog domowy (parametr "-m"). Dodatkowo do stworzonego
katalogu skopiowana zostaje zawartość katalogu
/etc/skel
.
Domyślna konfiguracja konta jest tworzona na podstawie opcji z
plików: /etc/default/useradd
i
/etc/login.defs
.
Najważniejsze opcje pierwszego z nich to:
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
Warto wspomnieć tu o opcjach "-r" i "-f", pierwsza usuwa katalog domowy, druga wymusza usunięcie również plików z katalogu domowego nawet jeśli do niego nie należą.
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:
Zwykły użytkownik zmienia swoje hasło również poleceniem passwd, tyle że bez podawania parametru. Administrator może zmusić użytkownika do zmiany hasła tuż po zalogowaniu:
# passwd -e jkowalski
Hasło blokujemy poleceniem: passwd -l {$nazwa_użytkownika} np.:
# passwd -l jkowalski
Aby odblokować użyjemy parametru parametru "-u" np.:
# passwd -u jkowalski
Musimy pamiętać, że powyższe polecenia nie blokują dostępu
opartego o inną metodę autoryzacji niż hasło, np. o klucz SSH.
W takim wypadku dodatkowo powinniśmy zmienić powłokę użytkownikowi
na nie figurującą w /etc/shells
np.:
# 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)
Program zwrócił wartości: UID, GID i listę grup do których
zapisany jest użytkownik jkowalski: users
, wheel
,
floppy
, 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 „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 13.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 „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 „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 „Bezpieczeństwo”.
Spis treści
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 „Narzędzia 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
„Zarządzanie podsystemami i usługami”. 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 „Proxy”.
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
„Parametry jądra”.
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
Dla porządku warto by była zgodna z
adresem FQDN (o ile jest nadany).
Niekiedy podaną tu nazwę należy dopisać do pliku
/etc/hosts
opisanego w dalszej
części rozdziału.
Plik /etc/host.conf
zawiera podstawowe
opcje resolvera nazw, w większości wypadków wystarczy domyślna
konfiguracja:
order hosts,bind multi on
Pierwsza pozycja wskazuje kolejność używania metod szukania
adresów hostów, w podanym przykładzie najpierw będzie przeszukiwany
plik /etc/hosts
, w drugiej kolejności będą odpytywane
serwery DNS.
Drugi wiersz zezwala na zwracanie więcej niż jednego adresu IP
z pliku /etc/hosts
(o ile przypisano
większą liczbę adresów do nazwy).
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
Oprócz nielicznych wyjątków, inne wpisy nie są tu konieczne, Dla potrzeb niektórych programów trzeba dopisać do powyższego wiersza nazwę hosta ustawionego za pomocą opisanej powyżej opcji HOSTNAME:
127.0.0.1 localhost styx
przykład wpisu dla programu wymagającego przypisania pełnej nazwy domenowej:
213.25.115.88 platinum.elsat.net.pl
Rozwiązanie to służy do szybszej identyfikacji komputerów w sieci
lub prac diagnostycznych. Aby w ogóle z tego skorzystać musimy ustawić
odpowiednią kolejność przeszukiwania w pliku
/etc/host.conf
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: „Moduły jądra”.
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.
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
musimy załadować moduł:
# modprobe ath_pci
Jeśli nie UDEV ładuje nam moduł kernela, to musimy dodać jego nazwę
do pliku /etc/modules
lub
/etc/modprobe.conf
, co zostało szczegółowo opisano w
„Moduły jądra”.
Teraz możemy przejść do konfiguracji interfejsu.
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
Kiedy poradziliśmy sobie ze sterownikiem, musimy utworzyć
odpowiedni plik konfiguracji, który umieścimy w
katalogu /etc/sysconfig/interfaces/
.
Nazwiemy go ifcfg-wlan0
, zaś w przypadku
kart z chipsetem Atheros użyjemy nazwy ifcfg-ath0
.
Przykładową treść takiego pliku zamieszczono poniżej:
DEVICE=wlan0 IPADDR=192.168.0.2/24 ONBOOT=yes BOOTPROTO=dhcp WLAN_ESSID=nasza_nazwa_sieci WLAN_KEY=A638FED41027EA086ECD6825B0
Opcje sieci bezprzewodowej rozpoczynają się się od
przedrostka WLAN_
, pozostałe parametry (w tym opcje
protokołu IP) są takie same jak dla zwykłej karty typu
Ethernet, której konfigurację szczegółowo
omówiono w „Ethernet”.
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
Powyższa opcja to identyfikator ESSID naszej sieci
WLAN_KEY=A638FED41027EA086ECD6825B0
Przy pomocy kolejnej zmiennej podajemy klucz WEP, na przykładzie użyto klucza szesnastkowego, aby podać klucz w postaci ASCII musimy ma jego początku dodać: "s:"
Dodatkowo możemy ustawić szybkość interfejsu:
WLAN_BITRATE=auto
Tą opcję możemy ustawić również na sztywno, przez podanie obsługiwanej wartości np.: 11MB, 24MB, 54MB.
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 }
Hasło do naszej sieci w linijce 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
Opcja -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
i nasza sieć WiFi powinna już działać.
Na wszelki wypadek powinniśmy się upewnić, że nasza maszyna jest w zasięgu sieci radiowej:
# iwlist wlan0 scan
Jeśli sieć jest na liście, to próbujemy podnieść interfejs (oczywiście, jeżeli tego nie zrobiliśmy już wcześniej):
# /etc/rc.d/init.d/network start Ustawianie parametrów sieci....................[ ZROBIONE ] Podnoszenie interfejsu wlan0...................[ ZROBIONE ]
Aby sprawdzić czy wszystko jest OK możemy użyć polecenia iwconfig, które powinno wyświetlić coś w stylu:
# 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 wyświetlonych danych interfejsu odszukujemy wartość jakości połączenia: Link Quality Niezerowa wartość oznacza, że konfiguracja zakończyła się sukcesem.
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
Wartość COMPLETED parametru wpa_state oznacza prawidłowe połączenie z WiFi.
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
i powinniśmy wykorzystywać już naszą kartę maksymalnie - co możemy sprawdzić poleceniem:
# 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: „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
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 „Narzędzia 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
.
Spis treści
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
Następnie restartujemy podsystem sieci
# service network restart
Więcej o parametrach jądra znajdziemy w „Parametry jądra”
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 „Podstawowe narzędzia kontroli sieci TCP/IP” oraz opis zarządzania routingiem statycznym zamieszczony w „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
Opcja permanent oznacza, że wpis nigdy nie wygasa.
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
a na drugiej w trybie klienta - iperf -c {$adres_serwera} np.:
$ 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
Powyższy wpis doda do łańcucha INPUT regułkę rejestrującą
połączenia TCP z hosta 10.0.0.3 na port 80 danej maszyny.
Aby te regułki działały z wpisami odrzucającymi pakiety
(DROP/REJECT) muszą być analizowane wcześniej, w przeciwnym
wypadku pakiet nigdy nie dotrze do regułki rejestrującej.
W przypadku dopasowania pakietu do regułki następuje
odnotowanie tego zdarzenia, wpisy te można odczytywać
za pomocą programu dmesg, lub z plików syslog-a -
zwykle z /var/log/kernel
i
/var/log/messages
.
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
Spis treści
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 „Zarządzanie podsystemami i usługami”.
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 „Budowanie pakietów”.
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
Potrzebujemy jeszcze kilku narzędzi, w tym programu do zarządzania mikserem:
$ poldek -i alsa-utils
W ogóle nie należy instalować pakietu kernel-sound-oss, ALSA potrafi emulować OSS.
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
i uruchamiamy go
# /etc/init.d/alsa-udev start
Nie należy sie martwić, że nic się nie wyświetla po jego uruchomieniu,
parametr start
nic nie robi.
Najprawdopodobniej mamy już załadowane właściwe moduły i jedyne co pozostaje nam to
w mikserze ustawić głośność i wyłączyć wyciszenie, co zostało opisane
w dalszej części rozdziału. Więcej o systemie UDEV w „Udev - dynamiczna obsługa sprzętu”.
Konfiguracja statyczna jest alternatywną metodą w stosunku do powyższej. Zaczynamy od zainstalowania pakietu alsa-utils-init:
$ poldek -i alsa-utils-init
Teraz musimy postarać się o dodanie koniecznych aliasów do pliku
/etc/modprobe.conf
, które posłużą do załadowania
koniecznych modułów, przez zainstalowany przed chwilą rc-skrypt.
Możemy wykonać to na dwa sposoby:
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
Pierwsza z metod jest tak oczywista, że zajmiemy się tylko drugą z wymienionych. Na początek musimy się upewnić, że mamy pakiet pciutils™ i uruchamiamy program:
# /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
Teraz pozostaje nam ustawić głośność w mikserze oraz wyłączyć wyciszenie.
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
Wyłączmy mute (klawisz m) i przesuwamy "suwaki" (strzałkami)
kanału Master
i PCM
.
Teraz możemy przetestować ustawienia z poziomu root-a,
możemy to zrobić odsłuchując dowolny plik wav (np. z pakietu
gnome-audio):
# /usr/bin/aplay test.wav
lub plik mp3 (wymagany pakiet "alsaplayer" oraz "alsaplayer-input-mad"):
# /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
Więcej o uprawnieniach w „Grupy”.
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.
Więcej o dźwięku pod Linuksem na stronie linux-muzyka.ixion.pl/.
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
Kiedy będziemy mieli zainstalowane wymagane pakiety, będziemy mogli wstępnie przetestować serwer, zatem uruchomimy usługę:
# service httpd start
W katalogu /home/services/httpd
umieszczamy jakąś testową stronę WWW
którą nazwiemy np. test.html i sprawdzamy za pomocą przeglądarki czy się prawidłowo wyświetla:
$ elinks localhost/test.html
Jeśli wszystko jest w porządku, to możemy przejść do właściwej konfiguracji serwera.
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
Przykład: Użytkownik Jan Kowalski posiada konto o nazwie: jan.
W /home/users/jan
jest jego katalog
domowy. Swoją stronę internetową umieszcza w katalogu
/home/users/jan/public_html
,
zaś dostęp do nie uzyskuje za pomocą adresu http://example.net/~jan
.
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 „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 „Podstawowa konfiguracja sieci”.
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>
Opcja NameVirtualHost
wskazuje, które adresy IP serwera mają
być używane do obsługi hostów witrualnych,
w tym wypadku wszystkie, co jest najczęściej spotykaną konfiguracją.
Sekcja Directory
zezwala na dostęp do
plików ze wskazanego katalogu. Pierwszy zdefiniowany virtualhost (_default_) ma
za zadanie wskazanie serwerowi domyślnej strony, wyświetlanej
w wypadku jeśli jakiś vhost nie jest skonfigurowany na naszym
serwerze, w przeciwnym razie wyświetli się strona pierwszego
w kolejności vhosta. Teraz możemy dodawać vhosty, wg. przykładu:
<VirtualHost *> ServerName moja-strona.com DocumentRoot /home/services/httpd/vhosts/moja_strona </VirtualHost>
Wewnątrz sekcji VirtualHost
znajduje
się opcja ServerName
, mówiąca
o nazwie domenowej vhosta, a poniżej wskazanie są ścieżki
do katalogu z plikami strony.
Po uruchomieniu mechanizmu hostów wirtualnych całkowicie
bezużyteczne staną się globalne opcje ServerName
czy DocumentRoot
, od tej pory konfiguracja
w całości opiera się o vhosty.
W konfiguracji hostów wirtualnych możemy
umieszczać wiele opcji używanych w głównym serwerze
(np.: ServerAdmin
, ErrorLog
),
tak zdefiniowane opcje przesłonią globalne wartości.
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>
Opcja 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
Plikowi ustawiamy odpowiednie uprawnienia i własność,
aby dostęp do niego miał wyłącznie użytkownik http
:
# 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(); ?>
następnie należy go umieść
w katalogu /home/services/httpd/html
,
pod nazwą np. info.php
.
Teraz wpisujemy w przeglądarce adres
http://example.net/info.php
, powinieneś uzyskać
informacje m. in. na temat wersji PHP, konfiguracji serwera
oraz obsługiwanych modułów.
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 16.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."
a następnie umieścimy go w odpowiednim katalogu z nazwą
np. cgi.sh
, nadamy mu prawo wykonywalności i
w przeglądarce podamy adres http://example.net/cgi-bin/cgi.sh.
Możemy do tego użyć również testowych skryptów przychodzących z
pakietem apache-cgi_test
.
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/"
Ze względów bezpieczeństwa autorzy Apache zalecają by taki katalog
leżał poza ścieżką wskazaną w opcji 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
Aby uruchomić indeksy musimy włączyć opcję 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>
Opcja nie zadziała wtedy, kiedy zainstalowaliśmy moduł
apache-mod_dir
i w katalogu znajduje się plik
określony przez 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
Jeśli będziemy modyfikować konfigurację działającego
serwera produkcyjnego, to dobrą praktyką jest wcześniejsze
użycie programu apachectl
z pakietu
apache-tools
do sprawdzenia poprawności
składni plików konfiguracji:
# apachectl configtest Syntax OK
Na szczególną uwagę zasługują parametry rc-skryptu:
reload|force-reload|graceful
np.:
# service httpd reload
Użycie któregoś z nich wywołuje "łagodny" restart serwera
(graceful restart), który pozwala dokończyć wykonywane
prace przez procesy. Dzięki temu restart
nie jest odczuwalny przez klientów. Parametry te mają
jeszcze jedną ważną zaletę, wywołanie ich powoduje sprawdzenie
konfiguracji serwera przed rozpoczęciem restartu, dzięki
czemu nie musimy do tego używać programu
apachectl
.
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
Podobnie jak w normalnym środowisku, jest obecny tutaj katalog
/dev
, w którym znajdują się
urządzenia konieczne do działania demona:
/dev/null
oraz
/dev/urandom
.
Katalog /etc
jak zapewne się
domyślasz, przechowuje pliki konfiguracyjne. U nas znajduje się w nim
jedynie named.conf
. Kolejne katalogi:
M
oraz
S
zostały przeznaczone do
przechowywania plików stref, odpowiednio master
i
slave
. Plik named.pid
przechowuje
numer procesu systemowego. Ostatni plik
na liście - root.hint
zawiera wpisy z adresami
tzw. root serwerów, czyli głównych serwerów DNS. Jest on konieczny do
przeszukiwania serwerów DNS w poszukiwaniu żądanych nazw, których
nie utrzymuje nasz serwer.
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 „Podstawowa konfiguracja sieci”.
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
Po zainstalowaniu program jest praktycznie gotowy do użycia. Można więc od razu uruchomić demona korzystając z polecenia:
# /etc/rc.d/init.d/crond start
Od tej pory demon może działać nieprzerwane - nie wymaga restartów po rekonfiguracji.
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
Przykładowa konfiguracja zwykłego użytkownika:
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
Pierwsza zmienna wskazuje powłokę (zamiast domyślnej
/bin/sh
),
która ma być używana do wywoływania zadań, druga to ścieżka do
plików wykonywalnych. Trzecie pole to konto użytkownika do którego
będą wysyłane powiadomienia pocztą elektroniczną lub pełny
adres e-mail, ostatnia zmienna to priorytet wykonywanych
zadań (liczba nice).
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 „Exim - Transport poczty elektronicznej (MTA)”) lub Postfix (opis w „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
następnie przechodzimy do opcji Managle Printers -> Add Printer.
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
„Moduły jądra”.
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 „Narzędzia 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 „Ethernet”. Jeśli zechcemy sprawdzić poprawność konfiguracji przydzielonej hostowi to wystarczy użyć programu ip, lub iconfig, szczegóły odnajdziemy w „Narzędzia 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 „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
Jak się łatwo domyślić druga z opcji wskazuje miejsce przechowywanie skrzynek. Po modyfikacji omawiana sekcja może wyglądać następująco:
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
Exim samodzielnie tworzy skrzynki pocztowe (oba rodzaje), wystarczy jedynie wysłać e-mail na konto użytkownika.
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.conf
zmienimy 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 „Grupy”.
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"
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 rid=512 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 rid=513 Updated mapping entry for Domain Users # net groupmap add ntgroup="Domain Guests" unixgroup=nobody type=d rid=514 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
przykłady:
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
przykłady:
filter f_emergency { level(emerg); }; filter f_daemon { facility(daemon); }; filter f_foo { host("foo"); }; filter f_su_sudo { program("^su|sudo$"); };
Pierwszy przykładowy filtr przepuszcza jedynie powiadomienia o najpoważniejszych błędach. Drugi zdarzenia pochodzące od demonów, trzeci wybiera zdarzenia pochodzące od komputera mającego w nazwie ciąg "foo". Ostatni odfiltrowuje zdarzenia wywoływane w skutek działania programów su i sudo - użycie wyrażeń regularnych.
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)
przykłady:
destination kernel { file("/var/log/kernel"); }; destination console_all { file("/dev/tty12"); }; destination root { usertty("root"); }; destination loghost { udp("10.0.0.1"); };
W pierwszym przykładnie komunikaty są kierowane
do pliku /var/log/kernel
, w
drugim będą wyświetlane na dwunastym
wirtualnym terminalu. Trzeci cel spowoduje
wyświetlanie komunikatu na ekranie terminala
użytkownika root. Czwarty obiekt pozwoli na
wysyłanie komunikatów do loghosta o adresie
IP 10.0.0.1 (uwaga na zgodność protokołów
TCP/UDP u nadawcy i odbiorcy).
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):
Tabela 16.2.
Nazwa | Opis |
---|---|
user | różnorodne programy zwykłych użytkowników |
komunikaty podsystemu poczty elektronicznej | |
daemon | różne demony systemowe |
auth, authpriv | bezpieczeństwo (autoryzacja użytkowników) |
syslog | syslog |
lpr | drukarka |
news | system grup dyskusyjnych (Usenet) |
uucp | podsystem UUCP |
cron | demony zegarowe: AT, CRON |
ftp | serwer FTP |
local0 - local7 | uniwersalne źródła lokalne, możliwe do dowolnego zastosowania przez administratora |
Priorytety (level):
Tabela 16.3.
Nazwa | Opis |
---|---|
emerg | system już nie nadaje się do użytku |
alert | poważna awaria - należy podjąć natychmiastową akcję |
crit | zdarzenie krytyczne |
err | błędy |
warning | ostrzeżenia |
notice | ważne zdarzenia |
info | informacje |
debug | dodatkowe informacje - przydatne przy odpluskwianiu |
Spis treści
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
Teraz powinniśmy zainstalować sterownik karty graficznej, możemy
zainstalować wszystkie dostępne (jeśli nie mamy pewności) lub ten właściwy.
W ustaleniu, który sterownik będzie najbardziej odpowiedni pomoże nam zestawienie
w dokumentacji X.Org.
Nazwy pakietów ze sterownikami zaczynają sie od X11-driver-
(w Ac™) i od xorg-driver-video-
(W Th™). W przypadku kart firmy
nVidia instalujemy otwarty sterownik:
$ poldek -i xorg-driver-video-nv
Jeśli mamy kartę ATI to wybieramy pakiet:
$ poldek -i xorg-driver-video-ati
Sterownikami z pełną obsługą 3D będziemy mogli się zająć później. Jeśli ciągle nie wiemy jaki wybrać, to możemy zainstalować uniwersalny sterownik dla kart zgodnych z VESA:
$ poldek -i xorg-driver-video-vesa
W Ac ten sterownik znajduje się w pakiecie X11-modules
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 „Statyczne zarządzanie modułami”.
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
Jeśli naszym oczom ukaże się drobna, szara kratka z kursorem myszy w kształcie krzyżyka (którym możemy poruszać), to oznacza, że aplikacja działa: wykryła sprzęt i załadowała prawidłowe sterowniki. Oznacza to też, że zainstalowaliśmy wszystkie potrzebne komponenty do działania serwera. Aby wyjść z tego dosyć surowego środowiska korzystamy ze skrótu Ctrl+Alt+Backspace
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
dokładnie jak to wcześniej opisaliśmy.
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 „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)
Powyższy komunikat informuje o brakującym sterowniku do karty graficznej, najprawdopodobniej nie jest zainstalowany konieczny pakiet.
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 „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
Po uruchomieniu zobaczymy listę
dostępnych kategorii, odpowiadają one dalszym opisom. Przykładowo, aby
skonfigurować myszkę, wybieramy z listy opcję: Configure mouse
a następnie Edit Mouse0
itd. Po ustawieniu wszystkich
interesujących nas opcji, wybieramy Write xorg.conf and quit
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
W przypadku starszych wersji X.Org (w Ac™)
X -configure ustawiany jest zły sterownik klawiatury,
należy go zmienić na kbd
, jak na powyższym fragmencie.
Możemy to wykonać za pomocą dowolnego edytora tekstu.
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™.
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
Na początku powinien nam wystarczyć podstawowy metapakiet:
poldek> install metapackage-gnome
Teraz wystarczy uzbroić się w cierpliwość, po instalacji wymagań metapakietu, możemy już samodzielnie doinstalować te kilka pakietów, albo od razu uruchomić środowisko. Filozofię metapakietów omówiliśmy w „Cechy pakietów w PLD”.
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 „Internacjonalizacja”, 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 „ALSA - Dźwięk w Linuksie”. 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
instalujemy pakiety z pluginami dekodującymi formaty wav,au oraz mp3:
$ poldek -i gstreamer-audio-formats gstreamer-mad
instalujemy gnome-media, aplet do sterowania głośnością, odtwarzacz Totem™ i opcjonalnie pakiet dźwięków zdarzeń:
$ 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
„Podstawowa konfiguracja sieci”, np.:
127.0.0.1 pldmachine
Szczegóły uruchamiania środowiska opisaliśmy w „Uruchamianie środowiska graficznego”.
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
Uruchamiamy demona system-tools-backends:
# /etc/init.d/system-tools-backends start
Dodajemy użytkownika do grupy adm:
# groupmod -A jkowalski adm
Aplikacje administracyjne będziemy mogli używać po ponownym zalogowaniu.
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
Oprócz tego mamy dostęp do wielu appletów, tematów graficznych i innych.
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
Możemy też spróbować uruchomić daną aplikację w wirtualnym terminalu (np.
w programie gnome-terminal
), w celu odczytania
komunikatów programu.
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
W Th™:
$ poldek -i xinitrc-ng xorg-app-xinit
Konfiguracja polega na umieszczeniu nazwy programu startowego
środowiska w pliku .xinitrc
. Plik ten jest
pełnoprawnym skryptem powłoki i obowiązuje w nim jej składnia,
wpis w nim można wykonać następująco:
$ echo "gnome-session" >~/.xinitrc
lub
$ echo "exec gnome-session" >~/.xinitrc
Aby uruchomić środowisko wykonujemy polecenie:
$ startx
Poniżej przedstawilimy listę programów startowych dla wybranych środowisk:
Gnome: gnome-session
KDE: startkde
XFCE: startxfce4
fluxbox: fluxbox
icewm: icewm
Jedynie w wyjątkowych sytuacjach powinniśmy używać tej metody do uruchamiania środowisk takich Gnome czy KDE, dla nich najlepiej korzytstać z opisanych poniżej GDM lub KDM.
Zaczynamy od instalacji demona GDM:
poldek> install gdm gdm-init
i już możemy go uruchomić:
# service gdm start
Powinniśmy móc się teraz zalogować i uruchomić środowisko, jeśli wszystko działa prawidłowo to możemy ustawić by system uruchamiał się ma piątem poziomie pracy, zgodnie ze wskazówkami pod koniec rozdziału.
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 „Zmiana poziomu pracy systemu”.
Wiersz z opcją initdefault
powinien wyglądać następująco:
id:5:initdefault:
Aby sprawdzić poprawność operacji, możemy zrestartować system.
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.
Spis treści
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''
Spis treści
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: 12145 $, $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: 12145 $, $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 :)
Spis treści
Spis treści
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>
Spis treści
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.