From: xf0r3m Date: Fri, 28 Jul 2023 19:13:22 +0000 (+0200) Subject: Przesłanie plików na prywatne repozytorium - snapshot przed wiekszymi zmianami X-Git-Url: https://gitweb.morketsmerke.org/?a=commitdiff_plain;h=5ee77697bb4bca02786fe2fe120da0fef6b26f2e;p=mmdev.git Przesłanie plików na prywatne repozytorium - snapshot przed wiekszymi zmianami --- 5ee77697bb4bca02786fe2fe120da0fef6b26f2e diff --git a/README.md b/README.md new file mode 100755 index 0000000..52d8599 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# morketsmerke-dev + +morketsmerke.github.io w wersji rozwojowej. diff --git a/articles/bsd/20_letni_Sun_Netra_T1_jako_serwer_mailowy_z_wykorzystaniem_NetBSD.html b/articles/bsd/20_letni_Sun_Netra_T1_jako_serwer_mailowy_z_wykorzystaniem_NetBSD.html new file mode 100755 index 0000000..fc33fa6 --- /dev/null +++ b/articles/bsd/20_letni_Sun_Netra_T1_jako_serwer_mailowy_z_wykorzystaniem_NetBSD.html @@ -0,0 +1,637 @@ + + + + + + + + +
+88                             88
+88                             88
+88                             88
+88,dPPYba,  ,adPPYba,  ,adPPYb,88
+88P'    "8a I8[    "" a8"    `Y88
+88       d8  `"Y8ba,  8b       88
+88b,   ,a8" aa    ]8I "8a,   ,d88
+8Y"Ybbd8"'  `"YbbdP"'  `"8bbdP"Y8
+
+ + + +
+

Sun Netra T1 AC200 z NetBSD jako serwer mailowy

+

+ Czy można zmienić 20 letni serwer w coś użytecznego? I owszem. Czy jest to skuteczne, wszystko zależy od konfiguracji domen, + do których będziemy wysyłać maile. Ja pomyślałem, że fajnie było by mieć serwer mailowy, chciaż patrząc na to jak często + korzystam z wiadomości e-mail, to raczej jest on zbędny. Nie mniej jednak ciekawe wyzwanie, a żeby tego było mało za docelową + maszynę wybrałem serwer Sun Netra T1 AC200, maszyna oparta na architekturze Sparc64, z procesorem ULTRASPARC + IIe V9 o taktowaniu 500MHz z 1 GB RAMU SDRAM ECC REG dwoma dyskami SCSI 17G. Dobór systemu operacyjnego to raczej był mus, anieżeli + racjonalny wybór. Jak go kupiłem za całe 150 zł to pierwsze co chciałem zbootować na nim OpenBSD, ponieważ już ten + system trochę znałem (nie tak jak teraz, był 2016), jednak to się nie powiodło. Może jednak od początku. Sun Netra T1 AC200 + jest serwerem, który nie posiada w ogóle żadnego układu graficznego, zatem do jego obsługi potrzebny jest PC lub Laptop ze + złączem COM/RS-232, to nie nie wszystko, bo złącze (SERIAL A/LOM - bo tak się nazywa to złącze, przez które + kontroluje się serwer) konsoli (można tak je chyba nazwać) to zwykłe gniazdo RJ-45. Sprawdziłem w oficjalnym podręczniku. + Do każdej Netry dołączany jest adapter DB-25 - RJ-45, oczywiście można skorzystać z DB-9 - RJ-45, ale ja + już nie pamiętam dlaczego jednak wybrałem DB-25 oraz adapter DB-25 - DB-9 (F-F). Adapter DB-25 - RJ-45 przychodzi + w dwóch częściach i trzeba włozyć odpowiednie kabelki w odpowiednie dziurki według dokumentacji. Jak to najlepiej zrobić, + otóż bierzemy kawałek UTP zarabiamy z jednej strony standard B z drugiej strony rozizolowywujemy wszystkie żyły, miernikiem + w teście diody sprawdzamy, który kabelek na adapterze łączy się, z którą żyłą UTP. Pamiętając o tym że będziemy w gniazdo + Serial A/LOM będziemy wtykać klasyczny patchcord ustawiamy piny na adapterze według dokumentacji. Pozłożeniu adaptera możemy + się podłączyć go do komputera, ja użyłem do tego komputera z Debianem z wiadomych dla siebie względów. W systemie należy + zainstalować program picocom. Samo połączenie wymaga jednego polecenia. +

+
+$ sudo picocom -b 9600 /dev/ttyS
+
+

+ Po zwróceniu parametrów konfiguracyjnych połączenie zostanie wyświetlony napis Terminal is ready, + naciskamy dwa razy klawisz Enter i w zależności od tego czy serwer jest włączony - dostaniemy odpowiedź + ok lub wyłączony - dostaniemy odpowiedź lom>, jeśli jest + wyłączony to możemy go włączyć za pomocą polecenia: +

+
+lom>poweron
+
+

+ Po włączeniu serwera uzyskamy odpowiedź ok. Kiedy serwer był już włączony możemy już bootwać jakiś + system, oczywiście z płyty bo innej opcji poza siecią nie ma. Odnośnie systemów operacyjnych na ten serwer to sprawa wygląda tak że: +

+
    +
  1. GNU/Linux Debian (port dla Sparc64) - Bootuje z płyty i jest się w stanie zainstalować, jednak nie mogłem + znaleźć żadnych mirrorów, aby móc cokolwiek zainstalować. Generalnie to jest mirror, ale wymaga wyższej konfiguracji, + niestety nie miałem chęci na zabawę tym.
  2. +
  3. FreeBSD 12.2 Sparc64 - Próbował się bootować jednak wyświetlił kilka ciągów dziwnych znaków i każde + naciśnięcie klawisza powodowalo wyświetlenie podobnych ciągów znaków.
  4. +
  5. OpenBSD 6.8 Sparc64 - Po wydaniu polecenia bootwania z CD, serwer wyświetlił informacje + Fast Data Access MMU Miss. Następnie zwrócł prompt ok + I to tyle w temacie OpenBSD na tym serwerze.
  6. +
  7. NetBSD 9.1 Sparc64 - Bootuje się z płyty, instaluje się poprawnie (jeśli wybierzemy opcję instalacji + Instalacja bez X11. Jedyne co nie działa (przestało działać dzień po zainstalowaniu + systemu) manager instalacji pakietów binarnych, nie może pobrać paczki z bazą, podczas jej rozpakowywania zwraca + komunikat, który można zinterpretować jako plik jest uszkodzony. Można to ominąć. Instalując paczki z repozytorium + za pomocą narzędzia pkg_add, niestety musimy jako argument podać pełną ścieżkę do paczki w repo. + Jeszcze jedna rzecz, kiedy ja instalowałem to strasznie wolno pobierał te paczki, okazało się na początku próbował + połączyć się z CDN-em, za pomocą IPv6, które coś nie działało. Remedium na to było dodanie lokalnego resolwu + cdn.netbsd.org, do pliku /etc/hosts na pierwszy napotkany adres IPv4.
  8. + +
+

+ Bootowanie z płyty załączamy poleceniem: +

+
+ok boot cdrom
+
+

+ Podczas instalacji z konsoli, jednym z pierwszych pytań zadanych przez instalator będzie wybranie rodzaju terminala z którego + korzystamy, nalepiej wybrać xterm. +

+

+ Pod tym odnośnikiem znajduje się instrukcja jak zainstalować NetBSD: + + https://morketsmerke.net/site/articles/bsd/instalacja_NetBSD.html + +

+

+ Jeśli system został już zainstalowany według instrukcji to po załadowaniu systemu ustawimy datę i czas, bateria mogłą się już w + dawno rozładować. Pewnego razu po wywołaniu polecenia date zobaczyłem rok + 2019 a raz 2003 (mamy 2021). Aby ustawić date i czas dokonamy synchronizacji czasu z serwera NTP za pomocą polecenia: +

+
+# ntpdate -b ntp1.inrim.it
+
+

+ Informacją zwrotną będzie to o ile sekund został przesunięty z zegar. Liczba może być naprawdę duża. Po synchronizacji + dopiszmy do pliku /etc/rc.conf w linii ntpdate=YES adres hosta dla ntpdate + ntpdate_hosts="ntp2.inrim.it" +

+

+ Do budowy serwera będziemy potrzebować kilku programów. Jednak jak je zainstalować z przy uszkodzonym źródle? Otóż sposób jest + prosty. Pierwsze co to wywołujemy polecenie: +

+
+$ host cdn.netbsd.org
+
+

+ Za pomocą pierwszego adresu IPv4 tworzymy wpis do pliku /etc/hosts/. +

+
+151.101.1.6	cdn.netbsd.org
+
+

+ Następnie na komputerze, z którego łączymy się z serwerem czy to po konsoli szeregowej czy przez SSH, za pomocą przeglądarki + przechodzimy pod ten adres: + http://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/sparc64/9.1/All + + Kilkając PPM na nazwę pakietu wybieramy opcję "Kopiuj adres odnośnika" i wklejamy do terminala jako argument polecenia + pkg_add podbnego programu jak na OpenBSD. W przypadku konsoli szeregowej może nie być to takie + łatwe, dlatego zalecam jednak połączenie przez SSH. Do pobrania mamy: mc, vim, dovecot, openssl, + ca-certificates. +

+

+ Po pobraniu tych programów możemy ustawić parametr mydestination na nazwę swojej domeny za pomocą + polecenia postconf. +

+

+# postconf -e "mydestination=morketsmerke.net"
+
+

+ Następnie za pomocą mc, przejdziemy do katalogu /etc/postfix następnie w pliku master.cf, usuwamy znak + komentarza sprzed pierwszego wiersza w pierwszej tabeli. +

+
+smtp	inet	n	-	n	-	-	smtpd
+
+

+ Teraz możemy połączyć się z serwerem SMTP za pomocą telnet i wyślemy mail do roota, żeby sprawdzić czy + wspomniany wcześniej parametr działa. +

+
+$ telnet localhost 25
+
+

+ Po podłączeniu się musimy wysłać maila za pomocą poleceń protokołu SMTP. Obecnie serwer nie posiada żadnych mechanizów bezpieczeństwa + więc możemy od razu przejść do wysyłania maili. Pierwsze polecenie: +

+
+mail from:<xf0r3m@morketsmerke.net>
+
+

+ W ten sposób przekazujemy serwerowi informacje że będziemy wysłać maila i w polu nadawcy będzie adres: xf0r3m@morketsmerke.net. + Po zatwierdzeniu tego polecenia powinniśmy odpowiedź: 250 2.1.0 Ok. + Uwaga! Ostre nawiasy są cześcią składni poleceń mail from oraz + rcpt to. +

+
+rcpt to:<root@morketsmerke.net>
+
+

+ Powyższe polecenie wskazuje adresata wiadomości. Po jego podaniu serwer zwróci + 250 2.1.5 Ok. Aby Rozpocząć redagowanie wiadomości wydajemy polecnie +

+
+data
+
+

+ Serwer zwróci wtedy taki ciąg znaków jak 354 End data with <CR><LF>.<CR><LF> + Oznacza to że aby zakończyć redagowanie wiadomości, należy przesłać do serwera linię z jedną kropką. Naciśnąć enter, + kropka (.) i ponownie enter. Pola From, To oraz Subject (Temat) możemy definiować wewnątrz danych wiadomości. +

+
+354 End data with <CR><LF>.<CR><LF<
+From: xf0r3m@morketsmerke.net
+To: root@morketsmerke.net
+Subject: Test serwera SMTP.
+
+Test serwera SMTP wewnątrz organizacji. Proszę o odpowiedź.
+.
+
+

+ Po wysłaniu maila sprawdźmy na koncie użytkownika root czy dostaliśmy wiadomość. Jeśli otrzymaliśmy wiadomość to teraz + przejdziemy do zabezpieczenie serwera SMTP przed nieautoryzowanym dostępem. +

+

+ Opis konfiguracji SASL znajduje się pod adresem: + + https://doc.dovecot.org/configuration_manual/howto/postfix_and_dovecot_sasl + +

+

+ Postfixa na tym systemie nie instalowaliśmy, już był. Więc musimy sie upewnić czy został skompilowany wraz ze wspraciem dla + Dovecot SASL. +

+
+# postconf -a
+
+

+ Jeśli polecenie zwróci dovecot, to możemy przejść do konfiguracji SASL. W tym + przypadku, w pliku /usr/pkg/etc/dovecot/conf.d/10-master.conf musimy odnaleźć w sekcji + auth, deklaracje socketu. +

+
+service auth {
+...
+	unix_listener /var/spool/postfix/private/auth {
+		mode = 0660
+		user = postfix
+		group = postfix
+	}
+...
+}
+
+auth_mechanisms = plain login
+
+

+ Następnie ustawić w niej użytkownika (user), grupę (group) oraz + prawa dostępu (mode), wartości do ustawienia zaprezentowano na powyższym przykładzie. + Po ustawieniu tych informacji możemy przejść konfiguracji Postfixa. W pliku + /etc/postfix/main.cf na samym dole dopisujemy poniższe opcje. +

+
+smtpd_sasl_type = dovecot
+smtpd_sasl_path = private/auth
+smtpd_sasl_auth_enable = yes
+smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
+
+

+ Gdzie: +

+

+

+ Teraz skonfigurujemy dostęp do SMTP dla klientów przez SSL. Najlepiej rozpocząć to od przepisania konfiguracji z wcześniej + wymienionej strony dla usługi submission. Konfigurację umieszczamy w pliku /etc/postfix/master.cf. Możemy + zmodyfikować istniejący już tam wpis. +

+

+submission 	inet	n	-	n	-	-	smtpd
+ -o smtpd_tls_security_level=encrypt
+ -o smtpd_sasl_auth_enable=yes
+ -o smtpd_sasl_type=dovecot
+ -o smtpd_sasl_path=private/auth
+ -o smtpd_sasl_security_options=noanonymous
+ -o smtpd_sasl_local_domain=morketsmerke.net
+ -o smtpd_client_restrictions=permit_sasl_authenticated,reject
+ -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
+ -o smtpd_sender_restrictions=reject_sender_login_mismatch
+ -o smtpd_recipient_restrictions=reject_non_fqdn_repcipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
+
+

+ Po zapisaniu konfiugracji, możemy teraz zmodyfikować konfigurację aby dostosować ją do smtps. +

+
+smtps 	inet	n	-	n	-	-	smtpd
+ -o smtpd_tls_security_level=encrypt
+ -o smtpd_tls_wrappermode=yes
+ -o smtpd_sasl_auth_enable=yes
+ -o smtpd_sasl_type=dovecot
+ -o smtpd_sasl_path=private/auth
+ -o smtpd_sasl_security_options=noanonymous
+ -o smtpd_sasl_local_domain=morketsmerke.net
+ -o smtpd_client_restrictions=permit_sasl_authenticated,reject
+ -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
+ -o smtpd_sender_restrictions=reject_sender_login_mismatch
+ -o smtpd_recipient_restrictions=reject_non_fqdn_repcipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
+
+

+ Gdzie: +

+ Generalnie takie opisy jak "ograniczenia wśród odbiorców" mogą nic nie mówić więc poniżej opisze ograniczenia w tych trzech grupach: + +

+

+ Teraz musimy umieść pliki certyfikatu w /etc/openssl i wskazać je w pliku konfiguracyjnym Postfixa + (/etc/postfix/main.cf). +

+
+smtpd_tls_cert_file=/etc/openssl/fullchain1.pem
+smtpd_tls_cert_key=/etc/openssl/privkey1.pem
+
+

+ Do zrobienie pozostało utworzenie bazy danych, w której będą znajdować się odniesienia użytkowników systemowych do adresów poczty. + Na początku musimy utworzyć plik /etc/postfix/virtual. Każda linia w pliku to jedno mapowanie. +

+
+root@morketsmerke.net	root
+xf0r3m@morketsmerke.net	xf0r3m
+
+

+ Plik zapisujemy, następnie tworzymy plik bazy: +

+
+# postmap /etc/postfix/virtual
+
+

+ Restartujemy Postfixa. +

+
+# postfix reload
+
+

+ Możemy przestować konfigurację. Jednak żeby to zrobić musimy włączyć Dovecot. Z tego co mi wiadomo nie uruchomi się, + ponieważ posiada jakieś predefiniowane ścieżki do certyfikatów SSL w pliku /usr/pkg/etc/dovecot/conf.d/10-ssl.conf należy + je wyłączyć stawiając na początku linii znak komentarza. Zapisujemy zmiany, teraz dovecot powinnien się uruchomić. + Podłączamy się za pomocą poniższe polecenie: +

+
+$ openssl s_client -connect mail.example.com:465
+
+

+ Po podłączeniu musimy określić jakiego zestawu poleceń będziemy używać, do tego służy polecenie EHLO. + Jako argument polecenie przyjmuje nazwę hosta, aby użyć jej nie tylko w logach ale również w nagłówku wiadomości, którą będziemy + wysyłać. +

+
+EHLO shiny.morketsmerke.net
+
+

+ Następną rzeczą jest uwierzytelnie się. Do wyboru mamy albo metodę PLAIN, albo metodę LOGIN. +

+ Po zalogowaniu niezależnie od wybranej metody dostaniemy poniższym komunikat: +

+
+235 2.7.0 Authentication successful
+
+

+ Teraz możemy wysłać maila do siebie lub do roota. Jeśli otrzymamy wiadomość, oznacza to że SMTPS działa poprawnie. Teraz + przejdziemy do Dovecot-a. Pierwszą rzeczą, którą się zajmiemy będzie uruchamianie Dovecot wraz ze + startem. Możemy to zrobić na dwa sposoby, jednym z nich jest skopiowanie z /usr/pkg/share/examples/rc.d/dovecot + pliku dovecot do /etc/rc.d następnie dodanie wpisu w plik /etc/rc.conf: +

+
+dovecot=YES
+
+

+ Drugim sposobem jest dodanie Dovecot do listy daemonów lokalnych, nie potrzeba do tego dużej filozofii a jedynie informacji + zwracanej przez polecenie which +

+
+$ which dovecot
+/usr/pkg/sbin/dovecot
+
+

+ Po uzyskaniu odpowiedzi, mogę stworzyć warunek w plik /etc/rc.local: +

+
+if [ -x /usr/pkg/sbin/dovecot ]; then
+	echo -n ' dovecot ';
+	/usr/pkg/sbin/dovecot
+fi
+
+

+ Kiedy serwer zostanie uruchomiony ponownie, Dovecot sam wystartuje. Plik + konfiguracjne nie znajdują się jakby się mogło wydawać w katalog /etc, tylko w /usr/pkg/etc/dovecot/conf.d. + Zaczniemy od znanego nam już pliku, 10-ssl.conf. Usuwamy znak komentarza przez linii uruchamiającej SSL +

+
+ssl = yes
+
+

+ Potem ustawiamy pliki certyfikatu, jak na przykładzie poniżej: +

+
+ssl_cert=</etc/openssl/fullchain1.pem
+ssl_key=</etc/openssl/privkey1.pem
+
+

+ Uwaga! Nawiasy ostre są częścią składni wartości opcji. +

+

+ Po zapisaniu zmian w pliku, możemy korzystać z zabezpieczonych wersji protokołów IMAP oraz POP3, które wykorzystują SSL. Włączenie + IMAPS oraz POP3S wymaga odkomentowania opcji port oraz ssl, + wewnątrz deklaracji inet_listener imaps oraz inet_listener pop3s. +

+
+...
+inet_listener imaps {
+	port = 993
+	ssl = yes
+}
+
+...
+inet_listener pop3s {
+	port = 995
+	ssl = yes
+}
+
+

+ Podobną rzecz zrobimy z submission dostarczanym wraz Dovecot, tylko zamiast włączać, wyłączymy nadając mu port 0. +

+
+service submission-login {
+	inet_listner submission {
+		port = 0
+	}
+}
+
+

+ Ostatnią rzeczą jaką należy zrobić jest ustawienie lokalizacji skrzynek mailowych. W pliku + /usr/pkg/etc/dovecot/conf.d/10-mail.conf usuwamy znak komentarza z przed opcji mail_location + oraz nadajemy jej następującą wartość. +

+
+mail_location = mbox:~/mail:INBOX=/var/mail/%u
+
+

+ Zapisujemy zmiany i możemy restartować Dovecot. +

+
+# dovecot reload
+
+

+ Jeśli program nie zwrócił błędów, sprawdżmy jeszcze plik /var/log/maillog czy wszystko działa. Ten plik to plik logów + usług pocztowych, tam będzie widać kto się podłączył oraz informacje o przechodzących mailach. Teraz przetestujemy + sobie IMAPS tak samo jak SMTPS, niestety polecenia dla tych protokołów są różne. Zaczynamy klasycznie od wykorzystania + openssl żeby się podłączyć przy użyciu TLS. +

+
+openssl s_client -connect mail.example.com:993
+
+

+ Pierwsze co musimy się zrobić to się uwierzytelnić. W IMAPS implementacji Dovecot uwierzytelniamy się za pomocą polecenia +

+
+a login nazwa_uzytkownika haslo
+
+

+ IMAPS nie wymga żadnych zakodowanych ciągów jak ma to miejsce SMTPS. W odpowiedzi dostaniemy: +

+
+a OK [ ... ] Logged in
+
+

+ Teraz możemy sprawdzić ustawienia skrzynki +

+
+b select inbox
+
+

+ W odpowiedzi powinniśmy dostać coś takiego: +

+
+b select inbox
+* FLAGS (\Answered \Flagged \Deleted \Seen \Draft Old)
+* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft Old \*)] Flags permitted.
+* 9 EXISTS
+* 0 RECENT
+* OK [UNSEEN 6] First unseen.
+* OK [UIDVALIDITY 1262394945] UIDs valid
+* OK [UIDNEXT 11] Predicted next UID
+b OK [READ-WRITE] Select completed (0.008 + 0.000 + 0.008 secs)
+
+

+ Pod adresem https://wiki2.dovecot.org/TestInstallation znajduje się + obszerny artykuł na temat jak sprawdzić czy konfiguracja Dovecot rzeczywiście działa. Kiedy jesteśmy zalogowani możemy + teraz pobrać wiadomości za pomocą poniższych poleceń. +

+
+b select inbox
+b fetch 1:* (flags internaldate body.peek[header.fields (subject)])
+b fetch 1 body[text]
+
+

+ Znaki "b", to tagi poleceń IMAP, każde polecenie musi zaczynać się od tagu, a tagiem może być dowolny ciąg znaków. +

+

+ Piersze polecenie można powiedzieć że sprawdza skrzynkę, wyświetla podsumowanie liczbowe ile jest wiadomości w skrzynce. Drugie + wyświeli nam listę wiadomości z flagami, datą oraz tematem, a ostatnie wyświetli zawartość pierwszej wiadomości. Jeśli wszystkie + trzy polecenia powiodły się oznacza to że usługi mailowe, które konfigurowaliśmy działają poprawnie. +

+

+ Cięzko jest korzystać z poczty + łącząc się bezpośredrednio z usługami, przy takich serwerach gdzie niema portalu WWW można zastosować klienty czy programy pocztowe + jak np. Mozilla Thunderbird. +

+

+ Poniżej przedstawie jak skonfigurować Thunderbirda oraz MUTTa, można było w swobodny sposób korzystać z + konfigurowanych przez nas usług pocztowych. +

+

+ Thunderbird: +

+

+ Jeśli do tej pory działaliśym w sieci lokalnej i z usługami łączyliśmy za pomocą adresu IP, to z racji użycia certyfikatów, a + Thunderbird kontroluje pole CN (Common Name), to jeśli adres serwera nie będzie zgadzał się z tym + co jest w tym polu, to program zrzuci ostrzeżenie, odnośnie niezgodności z certyfikatem. Warto zainwestować chwilę czasu na + budowę np. Pi-Hole. Prócz ogólnosieciowej blokady reklam zyskujemy jeszcze lokalnego DNS, a zasadzie dnsmasq + oraz pliku /etc/hosts. +

+

+ Konfigurację Thunderbirda rozpoczynamy od utworzenia nowego konta. W pole imię i nazwisko możemy wpisać swoje dane + lub nazwę użytkownika, w adresie e-mail podajemy adres e-mail naszego konta. Hasło również możemy zapisać, chyba że nie chcemy. + Po zatwierdzeniu tych informacji, przechodzimy do ustawień ręcznych. Dane konfiguracyjne dla serwera SMTP: +

+ +

+ Dane konfiguracjne dla serwera IMAP: +

+ +

+ MUTT +

+

+ Nie wiem czy MUTT zrzuci komunikat o niezgodności adresu serwera z polem CN. Jednak jeśli będziemy mieli w planach + wykorzystanie SSL, nie tylko w usługach pocztowych to warto się zaopatrzyć w lokalny DNS, aby uniknąć tych niepotrzebnych + komunikatów. Kolejną rzeczą jest obsługa SASL przez MUTT, obsługa musi być dodana podczas kompilacji, w przypadku OpenBSD + istnieje odrębna wersja programu wraz z wsparciem dla SASL. Poniżej przedstawię plik konfiguracyjny umożliwiający użycie tego + programu jako klienta poczty dla konfigurowanych przez nas usług. +

+
+set ssl_starttls=yes
+set ssl_force_tls=yes
+
+set imap_user='user'
+set imap_pass='passw0rd'
+set from='user@example.com'
+
+set realname='John Doe'
+set folder=imaps://mail.example.com/
+set spoolfile=imaps://mail.example.com/INBOX
+
+set header_cache="~/.mutt/cache/headers"
+set message_cachedir="~/.mutt/cache/bodies"
+set certificate_file="~/.mutt/certificates"
+
+set smtp_url="smtps://user@mail.example.com"
+set smtp_pass="passw0rd"
+set move = no
+set imap_keepalive = 300
+bind index G imap-fetch-mail
+
+

+ Opis co jest od czego, znajduje się w + https://morketsmerke.net/site/articles/faq/index.html + Jedyną opcją, która tam nie występuje jest ostatnia linia. Powoduje przypisanie G (duże G = shift + g) do polecenia + imap-fetch-mail, czyli odświeżania skrzynki pod klawiszem G (shift + g) +

+

+ Ostatnia rzecz, która pozostała to udostępnienie usług pocztowych w Internecie, potrzebny będzie usługodawca, który nie blokuje + portu SMTP TCP/25. Domena dzięki której będziemy mogi zdefiniować rekord MX. Rekord MX definiujemy w ten + sposób że na początku tworzymy klasyczny rekord A, który wskazuje na adres serwera, następnie tworzę rekord MX o + nazwie domeny wskazujący na nazwę rekordu A serwera. Ja swój serwer umieściłem w strefie DMZ z BINAT, oczywiście wymaga to + port forwardingu, jednak BINAT nie zmienia portów. Warto pamiętać o tym by port TCP/25 był otwarty. Nie służy on klientom a + przesyłaniu maili do innych domen oraz otrzymwaniu wiadomości od innych serwerów. Jeśli ten port będzie zablokowany nie otrzymamy + żadnej wiadomości. +

+

+ Na słowo zakończenia dodam jak wygląda reputacja takich usług mailowych? Otóż niezbyt dobrze. Wysłanie na maila GMAIL spowoduje + umieszczenie takiej wiadomości w spamie. Inaczej ma to się przy wysyłaniu informacji do organizacji, którą posiada swoje + maile na Googlu, tam mail trafił normalnie do skrzynki odbiorczej. Protomail identycznie, mail trafił do spamu. Jeśli komuś na tym + zależy to może się pobawić w podniesienie reputacji. Załącznik w mailach działają bez żadnej dodatkowej konfiguracji. Odnośnie tego + spamu, to jeśli my odpowiemy na maila, to wtenczas mail pojawi się klasycznie w wątku pod tym tematem. Jestem ciekaw jak ten + serwer długo pociągnie, online jest od 27.04.2021. +

+

+ ~xf0r3m +

+ +
+ + + + + + + diff --git a/articles/bsd/OpenBSD_jako_bramka_sieciowa.html b/articles/bsd/OpenBSD_jako_bramka_sieciowa.html new file mode 100755 index 0000000..d1fa3da --- /dev/null +++ b/articles/bsd/OpenBSD_jako_bramka_sieciowa.html @@ -0,0 +1,201 @@ + + + + + + + + +
+88                             88
+88                             88
+88                             88
+88,dPPYba,  ,adPPYba,  ,adPPYb,88
+88P'    "8a I8[    "" a8"    `Y88
+88       d8  `"Y8ba,  8b       88
+88b,   ,a8" aa    ]8I "8a,   ,d88
+8Y"Ybbd8"'  `"YbbdP"'  `"8bbdP"Y8
+
+ + +
+

OpenBSD jako bramka sieciowa

+

+OpenBSD jest wersją systemu BSD, w której nacisk położono na silniejsze zabezpiecznia przez co świetnie sprawdza się jako system dla programowalnych urządzeń sieciowych. Jednak zdarzają się tacy hakerzy, którzy stosują go do codziennej pracy jako system ogólnego zastosowania. W Internetach można znależć wiele skonfigurowanych przez ludzi pulpitów oraz stricte poradników aby ten system mógł chociaż spróbować stać się systemem codziennego użytku, poki co my przy odrobinie chęci możemy zrobić z niego porządną bramę sieciową, z której sam korzystam w kilku sieciach. Warto dodać że ten system ma niewielkie wymagania systemowe patrząc na współczesny sprzęt. Dla architektury 32-bitowej 32 MB pamięci RAM oraz 600 MB wolnej przestrzeni na dysku to naprawdę nie wiele. Dla prawdziwego hakera wystarczył by komputer ze śmietnika, lub terminal z popularnego serwisu aukcyjnego za 20 zł. +

+

+UWAGA! Wszystkie przedstawiowne tutaj polecenia są uruchamiane z poziomu użytkownika root. +

+
    +
  1. Instalacja systemu.
    +

    +Instalacja systemu OpenBSD została przedstawiona tutaj. Jedyne co w tym wypadku możemy zmienić to ustawić intefejs podłączony do Internetu (w zależności od konfiguracji naszego ISP, warto pamiętać w jaki sposób został przydzielony nam adres IP. Będzie nam to potem potrzebne w regułach zapory dotyczących NAT-u) oraz interfejs sieci LAN, ze stałym adresem IP, będącym pierwszym adresem z puli (tak się przyjęło, chociaż ludzi na kursach CISCO uczono inaczej, że adresem bramy w sieci LAN pownien być ostatni adres z puli). W przypadku interfejsu podłączonego do Internetu ze stałym adresem, o adresy bramy, domenę oraz adresy DNS zostaniemy zapytani dopiero po zdefiniowaniu interfejsów sieci LAN. Co pokazano poniżej. +

    +
    +#Interfejs WAN (podłączony do internetu)
    +IPv4 address for em0 ? (or 'dhcp' or 'none') [dhcp] 157.190.112.10
    +Netmask for em0 [255.255.255.0]
    +
    +
    +#Interfejs LAN
    +IPv4 address for em1 ? (or 'dhcp' or 'none') [none] 192.168.0.1
    +Netmask for em0 [255.255.255.0]
    +
    +
    +Default IPv4 route ? (IPv4 address or none) [none] 157.190.112.1
    +DNS domain name (e.g. 'example.com') [my.domain] morketsmerke.net
    +DNS nameservers? (IP address list or none) 157.190.112.1
    +
    +

    +Definiując interfejs WAN należy wpisać dane, które umożliwią nam połączenie z Internetem. Musimy mieć połączenie na naszej maszynie, aby zainstalować pakiet dnsmasq, który będzie niezbędny do obsługi DNS. Chyba że zrobimy z telefonu router i podłączymy go kablem USB, w OpenBSD działa to bez zarzutów. +

    +
  2. +
  3. Instalacja dnsmasq.
    +

    +Do osiągnięcia naszego celu, musimy zainstalować jeden program ponieważ reszta znajduje się już w systemie. Aby pobrać oprogramowanie z oficjalnego repozytorium wydajmy następujące polecenie: +

    +
    +# pkg_add -a dnsmasq
    +
    +

    +Po zainstalowaniu daemona warto ustawić jego uruchamianie podczas startu systemu. +

    +
    +# rcctl enable dnsmasq
    +
    +
  4. +
  5. Konfiguracja DHCP
    +

    +W OpenBSD daemon DHCP jest preinstalowany a jego plik jest umieszczony bezpośrednio w katalogu /etc. Dla małej sieci nie potrzebujemy zbyt wielu opcji. Wystarczą te najbardziej podstawowe. Poniżej przedstawiono najprostszą do prawidłowego funkcjonowania sieci konfigurację DHCP. Otwieramy plik /etc/dhcpd.conf. +

    +
    +subnet 192.168.0.0 netmask 255.255.255.0 {
    +	range 192.168.0.100 192.168.0.200;
    +	option routers 192.168.0.1;
    +	option domain-name "morketsmerke.net";
    +	option domain-name-servers 192.168.0.1;
    +}
    +
    +

    +Jeśli nasza brama obsługuje więcej niż jedną sieć LAN, to powtarzamy deklaracje dla kolejnych podsieci. +

    +
  6. +
  7. Ustawienia interfejsów dla dhcpd
    +

    +Do poprawnej pracy naszego serwera DHCP pozostaje jeszcze wskazać odpowiedenie interfejsy dla wpisanych w pliku konfiguracyjnym podsieci. Interfejsy wpisuje się w opcjach uruchomieniowych daemona w pliku /etc/rc.conf.local, te opcje odczytywane są podczas uruchamiania usług zaraz przed umożliwieniem użytkownikowi zalogowania do systemu. Wpis dla dhcpd ma następujący wzór: +

    +
    +dhcpd_flags="interfejs1 interfejs2 ... interfejsN"
    +
    +

    +Warto dodać że przekaznie opcji uruchomieniowych (flag) do daemona jest równoznaczne z jego uruchomienie podczas startu, więc nie trzeba wydawać polecenia rcctl enable dhcpd. +

    +
  8. +
  9. Ustawienie interfejsu dla dnsmasq
    +

    +Jeśli ktoś ustawiał już dnsmasq na GNU/Linux to robi się to tutaj w ten sam sposób. W pliku konfiguracyjnym /etc/dnsmasq.conf, odnajdujemy opcję #interface=, usuwamy znajdujący się na początku znak komentarza i po znaku równości (=) podajemy nasz interfejs sieciowy, tak samo jak w przypadku wielu sieci LAN, kopiujemy opcje wraz z ustawionym kolejnym interfejsem. +

    +

    +Teraz możemy użyć polecenia netstat -ln | grep -e '^tcp' -e '^udp' aby wyświetlić wszystkie otwarte porty TCP i UDP. Z wyników tego polecenia dowiemy się że dnsmasq nasłuchuje na wszystkich interfejsach a nie tylko na wskazanym, zostało to utworzone dla wygody w przypadku zmiany interfejsów lub ich adresów (w zależności od konfiguracji) nie trzeba zmieniać ustawień w pliku, a daemon nie odpowie na żądania, na które nie powinien. Jeśli jednak chcemy wymusić wyłączenie wyżej wspomnianej właściwości i respektowanie opcji interface to należy odblokować opecję bind-interfaces. +

    +
  10. +
  11. Ewnetualne wpisy w /etc/hosts*
    +

    +Za pomocą pliku /etc/hosts, możemy umieszczać nazwy domenowe na bramie dzięki temu uzyskamy odzworowanie nazw w naszej sieci lokalnej bez konfigurowania skomplikowanych systemów DNS takich jak BIND9. Oczywiście nie było by to możliwe bez dnsmasq. Wzór wpisu do plku /etc/hosts znajduje się poniżej. +

    +
    +<IP>	<FQDN>	<HOSTNAME>
    +
    +

    +Dla przykładu wstawię tutaj jeden ze wpisów. +

    +
    +192.168.0.2	serwer.morketsmerke.net	serwer
    +
    +
  12. +
  13. Firewall oraz NAT
    +

    +Do prawidłowego funkcjonowania naszej bramy potrzebny jest system NAT (Network Address Translation). Funkcje NAT-u w UNIX-ach przeważnie są realizowane przez oprogramowanie Firewall-a. Zapory sieciowe (firewall-e) są konfigurowane za pomocą reguł, a do działania NAT-u, czy to w przypadku systemów *BSD, gdzie zapora realizowana jest za pomocą pakietu PF (Packet Filter) czy za pomocą pakietu iptables używanego na systemach GNU/Linux wystarczy jedna reguła. +

    +
    +pass out on <interfejs podłączony do Internetu> from <interfejs LAN z sufiksem :network> to any nat-to
    +(<publiczny adres IP / intefejs podłaczony do Internetu>)
    +
    +

    +Taka konfiguracja jest wystarczająca, jednak warto pamiętać o tym że prawdopodobnie mamy włączone SSH, które nasłuchuje na wszystkich portach, więc aby nie dać możliwości ataków odgadywania hasła przez boty, warto albo ustawić adres, na którym ma nasłuchiwać w konfiguracji SSH lub użyć polityki zarządzania ruchem sieciowym polegającej na odcięciu całego ruchu sieciowego od firewalla a następnie dopuszczenia tylko tego najważniejszego dla zastosowań biurowo-domowych wystarczy odciąć cały ruch i jawnie go zadeklarować za pomocą odpowienich reguł. +Tutaj warto opisać jak działa PF. PF jak każdy inny daemon czyta swoją konfiguracje z pliku /etc/pf.conf, to właśnie w nim są przechowane reguły. Dostosowuje je do swojego wewnętrznego formatu, aby optymalnie przypasowywać pakiety do istniejących reguł na tej zasadzie właśnie działają zapory sieciowe, a cechą charkterystyczną PF jest zasada "ostatni wygrywa", czyli jeśli pakiet pasuje do wielu reguł to akcja (pass lub block) ostatniej pasującej do pakietu reguły zostanie na nim zastosowana. Wracając do naszego pliku, otwieramy go do edycji, najlepiej usunąć to co tam jest poza jakimiś początkowymi komentarzami jeśli istnieją oczywiście. Na samym początku zdefiniujemy sobie kilka zmiennych, tak w regułach PF można definiować zmienne. +

    +
    +red="Interfejs podłączony do internetu";
    +green="Interfejs sieci LAN";
    +greennet="Interfejs sieci LAN:network";
    +
    +

    +Skąd te nazwy zmiennych, otóż kiedyś korzystała z nich dystrybucja IPCop - GNU/Linuxowa dystrybucja przeznaczona właśnie na bramki. Kolory oznaczały interfejsy przypisane do konkretnych rodzajów sieci: +

    +
      +
    • czerwony - sieć Internet/sieć rozległa WAN - brak zaufania dla danych pochodzących z tej sieci
    • +
    • zielony - sieć LAN - sieć niefiltrowana przez ten firewall (komputery z tej sieci miały dostęp do wyszystkich pozostałych sieci), sieć największego zaufania.
    • +
    • niebieski - sieć mniejszego zaufania niż w sieci LAN, sieć niebieska nie mogła się komunikować z siecią zieloną, stosowana dla wydzielenia odrębnej sieci LAN dla sieci bezprzewodowej
    • +
    • pomarańczowy - sieć ograniczonego zaufania - DMZ, komputery z tej sieci nie mogły łączyć się z żadną z powyższych sieci poza czerwoną, ale sieci niebieska oraz zielona bez przeszkód mogły łączyć się hostami sieci pomarańczowej.
    • +
    +

    +Jest to dla mnie dość zrozumiała wizja konfiguracji sieci, dlatego też korzystam z niej po dziś dzień. W skrócie red oznacza Internet, green sieć LAN, greennet służy głównie wygodniejszemu zapisowi interfejsu LAN z przyrostkiem (sufiksem) :network (em1:network). Pod naszymi zmiennymi zapisujemy pierwszą regułę. +

    +
    +block all
    +
    +

    +To prosta a zarazem bardzo skuteczna reguła, powoduje blokadę wszystkich pakietów, odcina bramkę od jakiejkolwiek sieci nawet LAN. I teraz możemy zatrzymać się na chwilę i pomyśleć, czyli co? Teraz będę musiał dla każdego połączenia definiować oddzielną regułę oraz regułę zezwalającą na otrzymanie odpowiedzi od odległego serwera? Otóż nie, tu jest właśnie duża różnica pomiędzy PF a iptables. Przy użyciu tych samych polityk w PF nie trzeba dopuszczać oddzielną regułą odpowiedzi z serwera, wystarczy reguła, która pozwoli hostom z sieci LAN na rozpoczęcie polączenia. W PF jest realizowane automatycznie po przypasowaniu pakietu rozpoczynającego połączenie. Tworzony jest tak jakby tunel, który pozwoli na swobodny przepływ odpowiedzi na przypasowane pakiety wychodzące. Poniżej znajdują się reguły, które spowodują już dopuszczenie ruchu do i z bramki. +

    +
    +pass in on $green from $greennet to any
    +
    +

    +Ta reguła powoduje dopuszczenie ruchu wejściowego na intefejsie sieci LAN do dowolnego hosta, między innymi również do bramki. +

    +
    +pass out on $red from $red to any
    +
    +

    +Z racji tego że wszystko było odcięte przez block all daliśmy możliwość komunikacja bramki z siecią LAN, chcąc niechcąc adres interfejsu sieci LAN również znajduje się wewnątrz tej sieci. Aby bramka mogła połączyć się z Internetem musimy wypuścić ruch wychodzący z interfejsu WAN do dowolnego hosta. Teraz pozostało nam dopisać ostatnią odpowiedzialną za NAT regułę. +

    +
    +pass out on $red from $greennet to any nat-to ($red)
    +
    +

    +Ta reguła mówi nam aby wypuścić ruch na interfejsie red z sieci lokalnej (greennet) gdziekolwiek z ustawieniem NAT-u do adresu interfejsu podłączonego do Internetu. Ujęcie w nawias zmiennej red, mówi PF, aby stale monitorował interfejs pod kątem zmian adresu, aby nie trzeba było wczytywać ponownie reguł PF, przy każdej jego zmianie . +

    +

    +Do wczytania reguł PF służy polecenie pfctl, które wydajemy z opcją -f, po którym wskazujemy plik z regułami. Jednak przed wczytaniem reguł warto wydać polecenie pfctl wraz z przełącznikami -nf spowoduje to sprawdzenie pliku reguł pod kątem błędów bez wczytywania go. Warto o tym pamiętać kiedy dokonujemy zmian w pliku reguł, a jeden błąd uziemia PF i firewall w ogóle się nie uruchamia i nagle w firmie zaczyna brakować dostepu do Internetu... +

    +
  14. +
  15. Przekazywanie pakietów
    +

    +Na UNIX-ach aby była możliwość przesłania pakietów z jednego łącza (interfejsu) na drugie należy umożliwić to z poziomu jądra systemu po przez zmianę jednej z jego opcji. Przekazywanie pakietów jest uruchamiane za pomocą polecenia sysctl, wraz z opcją net.inet.ip.forwarding ustawioną na 1. +

    +
    +# sysctl net.inet.ip.forwarding=1
    +
    +

    +Opcje zmieniane za pomocą polecenia sysctl w trakcie działania systemu działają tak długo jak system jest uruchomiony, oznacza to że po ponownym uruchomieniu opcja powróci do swojej pierwotnej wartości. Więc teraz musimy coś zrobić aby nie trzeba było logować sie do bramki i uruchamiać z "ręki" przekazywania pakietów. Rozwiązanie tego problemu jest bardzo proste, wystarczy dopisać opcje net.inet.ip_forwarding z wartością 1 do pliku /etc/sysctl.conf. +

    +
    +# echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf
    +
    +
  16. +
+

+Jak pokazano wyżej za pomocą kilku prostych poleceń, wyedytowaniu kilku plików można przerobić ten jakże obcy dla wielu system, na naprawdę coś użytecznego. Warto dodać że ja najpierw nauczyłem się tworzyć bramki na OpenBSD, a dopiero później na GNU/Linux. Jeśli posiadamy naprawdę dużą wiedzę na temat systemu GNU/Linux to niestety przyda się ona w kilku/kilkunastu przypadkach. Systemom rodziny BSD, bliżej do macOS X i dziedzictwa UNIX-a niż do GNU/Linux. Nie są one skomplikowane, wręcz przeciwnie, ale brak elementarnej wiedzy powoduje że ten system może być dla nas abstrakcją. Tutaj jedną z niezrozumiałych rzeczy może być PF, zapraszam do dokumentacji PF na stronie projektu OpenBSD, która jest dostępna w postaci podręcznika https://www.openbsd.org/faq/pf/index.html. Może również pojawi się i tutaj w mojej streszczonej sprawdzonej wersji polskiej. Zabawy z PF. +

+

+~xf0r3m +

+
+ + + diff --git a/articles/bsd/dziennik_OpenBSD.html b/articles/bsd/dziennik_OpenBSD.html new file mode 100755 index 0000000..52177bf --- /dev/null +++ b/articles/bsd/dziennik_OpenBSD.html @@ -0,0 +1,805 @@ + + + + + + + + +
+88                             88
+88                             88
+88                             88
+88,dPPYba,  ,adPPYba,  ,adPPYb,88
+88P'    "8a I8[    "" a8"    `Y88
+88       d8  `"Y8ba,  8b       88
+88b,   ,a8" aa    ]8I "8a,   ,d88
+8Y"Ybbd8"'  `"YbbdP"'  `"8bbdP"Y8
+
+ + + +
+

Dziennik OpenBSD

+

+ Dzień 1 - Instalacja, fluxbox, dwa monitory, dźwięk, youtube-dl i usmb - 2021-04-08
+
+

+ Do wykorzystania z OpenBSD wybrałem maszynę na której zainstalowełem oraz uruchomiłem system bez zarzutu. Czytając ostatni + akapit materiału o instalacji OpenBSD można dojść do wniosku, iż nie zawsze jest to takie banalne jakby się mogło wydawać. Ta + maszyna to składak z płytą ITX Sapphire PURE White IPC-E350M1W z procesorem AMD E-350, zintegrowaną grafiką Radeon HD 6310 i + małym dyskiem SSD Intela jeszcze na SATA II, Do PC-eta podłączyłem dwa monitory, tak jakoś mi się wygodniej pracuje na dwóch. + Po uruchomieniu systemu (podczas instalacji pozostawiłem włączone xenodm, więc system od razu uruchomił + środowisko graficzne) byłem przekonany, że obraz będzie na obu i to w rozszerzeniu. Już kiedyś uruchamiałem OpenBSD na + laptopie z podłączonym dodatkowym monitorem, co ciekawe serwer x.org skonfigurował ten monitor jako + podstawowy. Nie zwracając uwagi na domyślne ustawienia skonfigurowałem polecenie doas, które jest + odpowiednikiem + linuxowego polecenia sudo. Poźniej zainstalowałem Firefox-a, następnie wrzuciłem w + wyszukiwarkę "How to install fluxbox on OpenBSD" przeszedłem na główną stronę projektu, oczywiście już nauczony + wcześniejszymi instalacjami OpenBSD na laptopach, że fluxbox jest dostępny w repozytorium, nie pamiętałem + jednak co należy zrobić aby fluxbox uruchamiał się po zalogowaniu, wykonałem więc czynności opisane na strone projektu + (jaki błąd!). Po zrestartowaniu nie zadziałało po zalogowaniu uruchomił się FWVM, fluxbox uruchomiał się + tylko na wyłączonym xenodm i uruchomianiu X z ręki przy użyciu polecnia startx. + Wróciłem do przeglądarki. Na stronie wyników + wyszukiwania znalazłem podobnie brzmiący problem do mojego... Na StackOverflow, radzili użyć pliku + ~/.xsession a nie ~/.xinitrc, tak też zrobiłem i zadziałało. Następną rzeczą jak postanowiłem zrobić to + zająć się ekranami, aby były identycznie ustawione jak monitory na biurku, wykorzystałem do tego te dwa poniższe polecenia, + które są wykonywane przed uruchomieniem fluxboxa w pliku .xsession. +

+
+xrandr --output DVI-0 --primary
+xrandr --output HDMI-0 --right-of DVI-0
+
+

+ Polecenie xrandr służy właśnie do sterowania ekranami środowiskach graficznych opartych + o X. Ustawienie monitora podłączonego przez DVI jako podstawowy (stoi po mojej lewej) jest zrozumiałe, ale do czego + służy drugie polecenie? Kiedy przestawiłem monitor, okazało się (już wcześniej kiedy instalowałem fluxbox), że jeśli + chcemy przenieść kursor na drugi monitor musimy zrobić to przez jego lewą krawedź co jest nienaturalne, bo monitor stoi po + prawej stronie ekranu podstawowego. Polecenie przestawia ekran HDMI-0 na prawo od ekranu + DVI-0 Kiedy monitory ogarnięte, to pora na doinstalowanie dodatkowego oprogramownia. + Ja głównie + wykorzystuje terminal (xterm jako emulator), z pomocą tmux dziele go na trzy części jedna podstawowa z + vim oraz dwie mniejsze z odtwarzaczem moc oraz z wierszem polecenia, za pomocą którego np. obsługuje + repozytorium git. Jako managera plików wykorzystuje mc, może czasami być potrzeba aby otworzyć jakiś plik wideo, więc + vlc, generalnie chyba nie ma lepszego odtwarzacza od VLC ostatnim programem jest chyba gkrellm uruchamiany + w dolnym prawym rogu dodatkowego ekranu. +

+
+$ doas pkg_add -iv mc vim moc vlc gkrellm
+
+

+ Kolejnym ciekawym epizodem, było sprawdzenie dźwięku (spoiler! Działa out-of-box, wystarczy zrobić głośniej). Żeby zrobić to + w miarę szybko stwierdziłem że wejdę na YT, i oh, boy! Ten komputer raczej do YT się nie nadaje, jako alternatywę wymyśliłem + że mogę użyć smtube i okazało się że w repozytorium jest zarówno smtube jak i youtube-dl. + Smtube oczywiście nie działa, ale ja mam dla niego inne zastosowanie, skoro jest w stanie wyszukiwać rzeczy to można + użyć go jako wyszukiwarki bez używania firefox-a, potem możemy sobie to ściągnąć przy użyciu youtube-dl. + Oczywiście nie namawiam do piractwa. +

+ +
+$ doas pkg_add -iv smtube youtube-dl
+
+

+ Podgłaszanie z poziomu terminala (1 = 100%) +

+
+$ sndioctl output.level=1
+
+

+ Przypomniałem sobie że mam dużo muzyki (aż 19 dni) na moim lokalnym NAS-ie. Z NAS-em możemy połączyć się zapomocą SMB, tylko + jako to zrealizować w OpenBSD, na GNU/Linux wystarczy jedno polecenie, tutaj sprawa się komplikuje ponieważ nie ma + oficjalnego wsparcia dla CIFS/SMB, możemy zrobić dwa sposoby taki że wylewu można dostać hakerski lub wygodny. Ja + użyłem, wiadomo tego pierwszego i w pewnym momencie myślałem że zjem klawiaturę. Hakerski sposób wymaga pakietu + usmb, oraz utworzenia specjalnej konfiguracji w pliku ~/.usmb.conf: +

+ +
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<usmbconfig>
+
+	<credentials id="nas">
+		<domain>WORKGROUP</domain>
+		<username>admin</username>
+		<password>P4ssW0rD</password>
+	</credentials>
+
+	<mount id="nas" credentials="nas">
+		<server>nas.morketsmerke.net</server>
+		<share>nas</share>
+		<mountpoint>/home/xf0r3m/NAS</mountpoint>
+		<options>allow_other,uid=1000,gid=1000</options>
+	</mount>
+
+</usmbconfig>
+
+

+ Po zapisniu konfiguracji w pliku musimy nadać mu odpowiednie uprawnienia, bo inaczej skrypt się spruje że, zwróci uwagę + nie są poprawne uprawnienia dla pliku konfiguracyjnego i zakończy działanie. Z racji tego że musimy uruchomić + usmb jako root, to prawa własności musimy ustawić na poniższe: +

+
+$ doas chown root:wheel ~/.usmb.conf
+
+

+ To nie wszystko jeśli uprawnienia są za wysokie to skrypt znów się spruje nam zwróci uwagę na to że uprawnienia są + za wysokie i odmówi wykonania zadania. Prawidłowe uprawnienia ustawimy za pomocą poniższego polecenia: +

+
+$ doas chmod 600 ~/.usmb.conf
+
+

+ Kiedy już się uporamy z plikiem konfiguracyjnym, możemy wydać poniższe polecenie aby w końcu zamontować nasz udział w + systemie: +

+
+$ doas usmb -c ~/.usmb.conf nas
+
+

+ Powiem tak... Montowanie udziału spełnia swoje podstawowe założenia pozwala na główne operacje na plikach. Jednak jak + chcielibyśmy odtworzyć muzykę w moc bezpośrednio z serwera to się nie da, ponieważ wczytywanie plików odbywa + się bardzo wolno, na debug logu widać jak program się zapętla. Spróbuje jeszcze na innych odtwarzaczach, może to winna + moc, ale póki co to duży minus. +

+

+

 

+

+ Dzień 2 - Obsługa dysków, "Wykorzystanie systemu OpenBSD do codziennej pracy". - 2021-04-09
+
+

+ Generalnie to chciałem zrobić dzisiaj porządek na dysku, podłączę sobie dysk i zagram wszystko co potrzebne na NAS-a. + Potem go przeformatuje. Jednak nie mogę ponieważ OpenBSD nie obsługuje systemu EXT4, generalnie kolejny minus. Jak się ich + zbierze dużo to można grać nimi w bierki. Dysk musiałem podłączyć do GNU/Linuxa. Jak wygląda montowanie partycji w systemie + OpenBSD. Za pomocą polecenia dmesg musimy namierzyć nasz dysk. +

+
+sd1 at scsibus4 targ 1 lun 0: <SSDPR-CL, 100-240-G2, 0> serial.174c1153201701000004
+sd1: 228936MB, 512 bytes/sector, 468862128 sectors
+
+

+ Jeden z moich dysków wygląda tak. Jak znalazłem dysk to jeszcze muszę wskazać partycję do montowania. Do listowania + tablicy partycji (i nie tylko) służy polecenie disklabel +

+
+# /dev/rsd1c:
+type: SCSI
+disk: SCSI disk
+label: 100-240-G2      
+duid: 04289ed5badd948f
+flags:
+bytes/sector: 512
+sectors/track: 63
+tracks/cylinder: 255
+sectors/cylinder: 16065
+cylinders: 29185
+total sectors: 468862128
+boundstart: 0
+boundend: 468862128
+drivedata: 0 
+
+16 partitions:
+#                size           offset  fstype [fsize bsize   cpg]
+  c:        468862128                0  unused                    
+  i:        466860032             2048  ext2fs                    
+  j:          1996800        466864128 unknown                    
+
+

+ Kiedy chcę podmontować tą partycję to za pomocą poniższego polecenia otrzymuje tylko komunikat: +

+
+$ doas mount -t ext2fs /dev/sd1i /mnt
+mount_ext2fs: /dev/sd1i on /mnt: specified device does not match mounted device
+
+

+ Rozwinięcie tego komunikatu znajduje się w komunikatach systemowych dostępnych za pomocą polecenia dmesg. +

+
+ext2fs: unsupported incompat features: 64bit
+
+

+ Niestety nie podmontuje tego dysku. Lista kompatybilnych systemów plików z OpenBSD znajduje się poniżej: +

+ +

+ Czyli najlepszym systemem plików do przenoszenia danych między systemami zostanie FAT32. Na + Reddicie poświęconym powyższemu problemowi z obsługą systemów plików, jeden z użytkowników napisał, że on to + korzysta głównie z FAT32 do przenoszenia danych między OpenBSD a GNU/Linuxem, ale jest jeden haczyk system plików + należy utworzyć pod OpenBSD a nie GNU/Linux-em, w przeciwnym razie partycja utworznona na GNU/Linux nie będzie chciała się + montować w OpenBSD. +

+

+ Po przygodach z dyskiem wpadłem na pomysł, aby spisywać dzień po dniu, to co robie w systemie, o ilę będę robić coś wartego + opisania, nie wiem jak to nazwać poki co robocza wersja "Wykorzystanie systemu OpenBSD do codziennej pracy", plik się nazywa + dziennik_OpenBSD.html, nazwę się jeszcze dopracuje. Pisanie zajmuje znacznie więcej czasu niż wykonywanie rzeczy, + więc mogę się nie wyrobić na "daily" upload. Pierwsze wersje zawsze piszę na brudno, potem trzeba to jeszcze redagować, ale + spróbuje. Ponieważ już jest dzień 3, a ja cały czas pisze dzień drugi wczoraj nie dałem rady fizycznie, nie zawsze też będzie + o czym pisać, więc mogą być przeskoki w dniach. Dziś jeszcze muszę przygotować materiał a mam godzinę czasu, jutro + ewentualnie dokończe dzień 3, przeredaguje te 3 dni i zrobię upload. Mam całą listę rzeczy do zrobienia, a ja sobie robie + "daily" z obsługi OpenBSD. Dobra, koniec dnia 2-go. +

+

+

 

+

+ Dzień 3 - dysk do wymiany danych pomiędzy Linux-em a OpenBSD, ustawienie tapety na fluxbox + - 2021-04-10
+
+

+ Po skończeniu redagowania dnia 2, i ekscesach z niekompatybilnością systemów plików przyszedł czas na kompromis w sprawie. + Stworzę partycję FAT32 na całej długości dysku pod OpenBSD (idąc za wskazówką z Reddita). Tworzenie partycji + zaczynam od ustawienia odpowiedniej partycji za pomocą polecenia disklabel z przełącznikiem + -E aby uruchomić polecenie w trybie interaktywnym poniżej podałem wybierane polecenia. +

+
+$ doas disklabel -E sd1
+sd1> z
+sd1*> a a
+offset: [0]
+size: [468862128]
+FS type: [4.2BSD] msdos
+sd1*> q
+
+

+ Po utworzeniu partycji, przychodzi czas na jej sformatowanie. Partycje w OpenBSD przygotowujemy za pomocą róznych wersji + polecenia newfs wybrany system plików określamy poprzez przyrostek np. + _msdos - newfs_msdos, polecenia newfs do + określenia partycji + używają surowych urządzeń (raw devices) - /dev/rsd1a. Formatowanie może nie co potrwać, w + zależności od wiekości dysku. +

+
+$ doas newfs_msdos /dev/rsd1a
+
+

+ Po sformatowaniu partycji, warto sprawdzić jeszcze raz jej tablice partycji. Ja miałem tak, że tworzyłem partycje o literze + a, kiedy już została sformatowana chciałem ją zamontować klasycznie: +

+
+$ doas mount -t msdos /dev/sd1a /mnt
+
+

+ Dostałem komunikat o tym, że urządznie jest nie skonfigurowane. +

+
+mount_msdos: /dev/sd1a on /mnt: Device not configured
+
+

+ Coś poszło nie tak podczas formatowania? Pierwsze co zrobiłem to zajrzałem do tablicy partycji i okazało się, że po + formatowaniu zmieniła się litera dysku. +

+
+# /dev/rsd1c:
+type: SCSI
+disk: SCSI disk
+label: 100-240-G2      
+duid: 0000000000000000
+flags:
+bytes/sector: 512
+sectors/track: 63
+tracks/cylinder: 255
+sectors/cylinder: 16065
+cylinders: 29185
+total sectors: 468862128
+boundstart: 0
+boundend: 468862128
+drivedata: 0 
+
+16 partitions:
+#                size           offset  fstype [fsize bsize   cpg]
+  c:        468862128                0  unused                    
+  i:        468862128                0   MSDOS                    
+
+

+ Więc kiedy poprawiłem literę w poleceniu, dysk został zamontowany. +

+
+$ doas mount -t msdos /dev/sd1i /mnt/disk
+
+

+ Przed zamontowaniem dysku utworzyłem podkatalog, ponieważ w OpenBSD nie można zmienić właściciela podkatalogów + katalogu głównego, np. takiego jak /mnt, a bez zmiany praw własności zwykły użytkownik nie będzie w + stanie nic na dysku zapisać. +

+

+ Kolejną rzeczą jaką zrobiłem to zmiana tapety, nie jest ona jakoś wybitnie skomplikowana. Po pierwsze trzeba + zainstalować pakiet feh, który jest bardzo lekką przeglądarką plików graficznych. +

+
+$ doas pkg_add -iv feh
+
+

+ Polecenie fbsetbg jest już wbudowane. Problem w tym, że raczej ono nie zadziała, ponieważ nie + ma w systemie zainstalowanych pewnych pakietów. Nie trzeba ich instalować. Wystarczy że odnajdziemy ww. polecenie: +

+
+$ which fbsetbg
+/usr/local/bin/fbsetbg
+
+

+ Rzeczony program do ustawiania tapety na fluxbox jest skryptem powłoki, więc aby program zaczął działać bez + instalacji dodatkowych rzeczy zmieńmy w nim linię: +

+
+[ -n "$1" ] && hash $1 2> /dev/null
+
+

+ na: +

+
+which $1 2>&1 > /dev/null
+
+

+ Po zapisaniu pliku możemy zmienić nareszcie tapetę. +

+
+$ fbsetbg -f ~/Obrazy/1920x1080_32bit.png
+
+ +

+

 

+

+ Dzień 5 - Laptop z OpenBSD - 2021-04-12
+
+

+ Wieczorem dnia 4-tego stwierdziłem że zostawię laptop z GNU/Linux-em w domu a do pracy wezmę mojego rzęcha, którego kupłem za + pierwsze zarobione + pieniądze. Już kiedyś był zainstalowany na nim OpenBSD więc wiem że to działa. Ten laptop to Acer AspireOne D260, lekko go + zmodyfikowałem stary dysk HDD, wymieniłem na 240GB SSD GoodRam-a, zamiast 1GB RAM dałem 2GB i chyba najważniejsza zmiana to + karta sieci bezprzewodowej Broadcom-a, z którym na Debianie miałem problem ze sterownikiem zmieniłem na kartę Atheros, która + działa bez zarzutu z OpenBSD. Tak poza tym to klasyczna instalacja, póki co jestem w pracy i łącze się po kablu, ale może + jutro pojawi się wpis z podłączaniem się do sieci bezprzewodowej. +

+

+ Odnośnie dźwieku na tym laptopie, to domyślne wyjście jest ustawione na gniazdo słuchawkowe. To nawet lepiej, bo ja zazwyczaj + podłączam słuchawy albo Hi-Fi do laptopa. +

+

+

 

+

+ Dzień 6 - Get Wi-Fi connection and get back to work - 2021-04-13
+
+

+ Instalując na laptopie OpenBSD musiałem wziąć pod uwagę to, że bedę musiał kiedyś skorzystać z sieci bezprzewodowej i warto było by + się dowiedzieć jak to zrobić. Dużo wiedzy na temat samej obsługi OpenBSD znajduje się na stronie FAQ projektu + openbsd.org, tam też znalazłem tą na temat połączenia z siecią bezprzewodową. Oczywiście za + pomocą terminala. Pierwsze co należy zrobić to włączyć samą kartę. +

+
+$ doas ifconfig athn0 up
+
+

+ Po włączeniu karty musze znaleźć SSID mojej sieć, przeskanuje otoczenie. +

+
+athn0: flags=808843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF4> mtu 1500
+	lladdr 74:f0:6d:39:2d:6a
+	index 2 priority 4 llprio 3
+	groups: wlan egress
+	media: IEEE802.11 autoselect (HT-MCS3 mode 11n)
+	status: active
+	ieee80211: nwid EnGenius578D00_1-2.4GHz chan 13 bssid 88:dc:96:57:8d:00 -50dBm wpakey wpaprotos wpa2 wpaakms psk wpaciphers ccmp wpagroupcipher ccmp
+		nwid EnGenius578D00_1-2.4GHz chan 13 bssid 88:dc:96:57:8d:00 -50dBm HT-MCS15 privacy,short_slottime,wpa2 
+		nwid 0x00000000 chan 2 bssid 14:dd:a9:73:15:a4 -86dBm HT-MCS15 privacy,short_slottime,wpa2 
+		nwid COMTREND-VI-3223u-5A8C chan 11 bssid d8:b6:b7:8e:5a:8d -87dBm HT-MCS15 privacy,short_slottime,wpa1 !wpaproto
+		nwid "DIRECT-95-HP M227f LaserJet" chan 6 bssid da:0f:99:3b:83:95 -93dBm HT-MCS15 privacy,spectrum_mgmt,short_slottime,wpa2 
+	inet 192.168.2.125 netmask 0xffffff00 broadcast 192.168.2.255
+
+

+ Po namierzeniu sieci mogę się już nią parować. Moja sieć jest zabezpieczona za pomocą WPA2, więc musze podać hasło po + SSID-zie. Do sieci podłączam się za pomocą poniższego polecenia. +

+
+$ doas ifconfig athn0 nwid "EnGenius578D00_1-2.4GHz" wpakey 0xDEADBEEFx0
+
+

+ Po sparowaniu pobieram adres IP: +

+
+$ doas dhclient
+
+

+ Kiedy polecenie zwróci mi prompt sprawdzam za pomocą polecenia ping czy połączenie się + powiodło. +

+
+$ ping wp.pl
+
+

+ Jeśli chciałbym zapisać sieć, po to aby system łączył się z nią automatycznie podczas ustawiania interfejsów sieciowych, to + muszę stworzyć plik /etc/hostname.athn0 (athn0 - nazwa interfejsu). W zależności od tego czy będzie to tylko jedna + sieć: +

+
+nwid "SSID" wpakey WPA-PSK
+dhcp
+
+

+ lub wiele: +

+
+join morketsmerke.net wpakey 1234Test1234
+join EnGenius578D00_1-2.4GHz wpakey 0xDEADBEEFx0
+dhcp
+
+

+ Po podłączeniu się do sieci można wrócić do pracy. Moja praca polega w jakieś częsci na tworzeniu materiałów na tą stronę. + Muszę od czasu do czasu obejrzeć wyniki klepanego HTML-a w przeglądarce, jednak pod OpenBSD Firefox, jest strasznie + ogranicznony, bez pozwolenia wydanego w pliku konfiguracyjnym nie mogę sobie od tak przejść w dowolne miejsce w systemie + plików nawet na swoim katalogu domowy, gdzie zapisane są moje materiały. Muszę najpierw w plikach + /etc/firefox/unveil.main, /etc/firefox/unveil.content wpisać ścieżkę do konkretnego katalogu, następnie + przypisać dla niego odpowiednie uprawnienia. +

+
+~/Cloud r
+
+

+ W obydwu plikach wpisałem identyczne ścieżki oraz uprawnienia. Po ponownym uruchomieniu Firefox-a, mam dostęp do + plików poprzez wpisanie adresu file:///home/xf0r3m/Cloud, ale kiedy spróbuje przejść powyżej tego katalogu dostaje + błąd File not found. Dla przeciętnego użytkownika jest to spore utrudnienie, ponieważ bez utworzenia katalogu + ~/Downloads nic nie można ścignąć a dla wrzucenia plików trzeba również określić jakiś katalog gdzie będą pliki + przeznaczone do uploadu, a operowanie na wybiórczych katalogach nie jest wcale takie łatwe. Za pomocą magicznego znaku + tyldy możemy w oknie dialogowym Firefox-a uruchomonić pasek adresu. Jednak patrząc na to jak wielkie są przeglądarki + w obecnych czasach - stają się subsystemami - myślę że lepsze to niż nic. +

+

+

 

+

+ Dzień 7 - Spotify na openbsd. - 2021-04-14 +

+ Zainstalowanie Spotify na OpenBSD jest łatwiejsze niż na różnych GNU/Linux-ach konfigurowanych od zera. Realizowane jest to + za pomocą pakietu ncspot z drzewa portów. Porty lub drzewo portów jest czymś w rodzaju repozytorium + community, tylko zamiast pre-kompilowanych binariów jak to jest w przypadku paczek z oficjalnego repo mamy kod + źródłowy, przygotowany (na tyle ile się dało [aby dalej pozostawał kodem]) do kompilacji pod OpenBSD. +

+

+ Cały proces kompilacji programu ncspot z portów jest opisany tutaj: + https://ogrul.org/articles/spotify-on-openbsd.html. + Opisuje go tu tylko w celach kopii zapasowej, gdyby źródło stało się niedostępne. +

+

+ Kompilację rozpocznę od pobrania paczki z portami z oficjalnego źródła, najlepiej do /tmp + plik zniknie po restarcie nie pozostawiając po sobie bałaganu, a i tak będę musiał go rozpakować do /usr. +

+
+$ cd /tmp
+$ ftp https://cdn.openbsd.org/pub/OpenBSD/$(uname -r)/{ports.tar.gz,SHA256.sig}
+
+

+ Sprawdzam czy plik nie został podmieniony (jakimś cudem [jeśli ktoś podszył się pod źródło, z którego pobrałem porty]) na + podstawie ściągniętej wraz z paczką sygnatury. +

+
+$ signify -Cp /etc/signify/openbsd-$(uanem -r | cut -c 1,3)-base.pub -x SHA256.sig ports.tar,gz
+
+

+ W odpowiedzi dostałem coś takiego: +

+
+Signature Verified
+ports.tar.gz: OK
+
+

+ Po sprawdzeniu pliku, rozpakowuje paczkę z portami bezpośrednio w katalogu /usr. +

+
+$ cd /usr
+$ doas tar -xzvf /tmp/ports.tar.gz
+
+

+ Następnie w pliku /etc/mk.conf wskazuje katalogi robocze używane podczas kompilacji. +

+

+WRKOBJDIR=/usr/obj/ports
+DISTDIR=/usr/distfiles
+PACKAGE_REPOSITORY=/usr/packages
+
+

+ Przechodzę z powrotem do katalogu gdzie wypakowałem porty i wydaje polecenie: +

+
+$ doas make search key=ncspot
+
+

+ Polecenie za pierwszym razem zwróci błąd. Zawsze zwraca, do działania potrzebuje pakietu + portslist. +

+
+$ doas pkg_add -iv portslist
+
+

+ Po zainstalowaniu pakietu ponownie wydaje polecenie $ doas make search key=ncspot, wynik + polecenia powinien być następujący: +

+
+Port:	ncspot-0.2.2p0
+Path:	audio/ncspot
+Info:	ncurses Spotify client
+Maint:	Henrik Friedrichsen <henrik@diff.cc>
+Index:	audio lang/rust
+L-deps:	audio/portaudio-svn x11/dbus,-main
+B-deps:	STEM->=1.30:lang/rust devel/cargo-generate-vendor lang/rust
+R-deps:	
+Archs:	any
+
+

+ Żeby w ogóle rozpocząć proces kompilacji muszę zainstalować wszystko co znajduje się w polu + B-deps: - zależności kompilacji. W tym konkretnym przypadku akurat mam szczęście, że te + programy znajdują się w repo i nie trzeba ich kompilować. Instalacja oprogramowania przez kompilację kodu to trochę + błędne koło, ponieważ musisz spełnić zależności kompilowanego programu, kiedy chcesz to zrobić i znów musisz + kompilować wtedy wracamy do punktu wyjścia bo musimy znów spełnić zależności, zależności kompilacji programu macierzystego + i być może znów będziemy musieli je kompilować. Kompilacja daje możliwość dostosowania oprogramowania do własnych potrzeb. +

+
+$ doas pkg_add -iv rust cargo-generate-vendor
+
+

+ Po zainstalowaniu zależności uruchamiam kompilacje. Ścieżka do kodu aplikacji jest wskazana przez pole + Path: informacji zwracanych przez polecenie make search. +

+

+$ cd audio/ncspot
+$ doas make install
+
+

+ Po zbudowaniu projektu, co trochę trwa w zależności od mocy przerobowej komputera, mogę wreszcie uruchomić ncspot: +

+
+$ ncspot
+
+

+ zalogować się i korzystać z usługi. Oczywiście jak wszystkie te aplikacje wykorzystujące API, potrzebne jest konto premium. + Nie tyle o same Spotify chodziło, co o możliwie najprostrze przedstawienie systemu portów. +

+ +

+

 

+

+ Dzień 9 - Płyty pod OpenBSD - 2021-04-17 +

+ 8-go dnia stwierdziłem że muszę zrobić porządek z płytami, na których miałem pozgrywaną muzykę żeby ją odtwarzać na wieży. Z racji + tego że wieża wspierała zarówno format Audio CD jak zwykłe płyty nagrane jako "płyta z danymi" z plikami MP3, + posiadałem płyty nagrane w różnych formatach. Podłączyłem napęd do komputera, włożyłem płytę i zacząłem szukać w necie jak to zrobić. + Pierwszą rzeczą jakiej się dowiedziałem (nie z Internetu, a z autopsji) było rozpoznawanie płyt, które są nagrane w formacie + Audio CD, a które z plikami MP3. +

+
+$ doas disklabel cd0
+
+

+ Jeśli jest to płyta z danymi to w tabeli partycji, pojawią się dwie partycje: a oraz + c. Jeśli zaś jest to i Audio CD to tabela będzie pusta. +

+

+ MP3: +

+ +
+# /dev/rcd0c:
+type: ATAPI
+disk: 110124_1858     
+label:                 
+duid: 0000000000000000
+flags:
+bytes/sector: 2048
+sectors/track: 100
+tracks/cylinder: 1
+sectors/cylinder: 100
+cylinders: 3390
+total sectors: 338911
+boundstart: 0
+boundend: 338911
+drivedata: 0 
+
+16 partitions:
+#                size           offset  fstype [fsize bsize   cpg]
+  a:           338911                0 ISO9660                    
+  c:           338911                0 ISO9660                   
+
+

+ Audio CD: +

+
+# /dev/rcd0c:
+type: ATAPI
+disk: ATAPI CD-ROM
+label: fictitious
+duid: 0000000000000000
+flags:
+bytes/sector: 2048
+sectors/track: 100
+tracks/cylinder: 1
+sectors/cylinder: 100
+cylinders: 1738
+total sectors: 173758
+boundstart: 0
+boundend: 0
+drivedata: 0 
+
+0 partitions:
+#                size           offset  fstype [fsize bsize   cpg]
+
+

+ Na podstawie tego, płytę z danymi montuje najzwyczajniej w świecie jak zwykły dysk. Trzeba jeszcze spojrzeć na system plików użyty na + płycie. OpenBSD natywnie wspiera ISO9660 oraz UDF. Na moich płytach z MP3 używałem formatu + ISO9660. +

+
+$ doas mount_iso9660 /dev/cd0a /mnt
+
+

+ Po skopiowaniu danych odmontowuje ją (doas umount /mnt). +

+ +

+ W przypadku formatu Audio CD trzeba użyć innego narzędzia. Do obsługi tego typu płyt wykorzystuje się program + cdio. Za pomocą tego programu można taką płytę odtworzyć lub zripować. Ten program potrafi np. połączyć się z + bazą GNU i ściągnąć tagi dla ścieżek zapisanych na płycie. Poniżej znajdują się polecenia odtwarzania i ripowania. +

+

+ Odtworzenie Audio CD: +

+
+$ doas cdio -f /dev/cd0c cdplay
+
+

+ Ripowanie Audio CD: +

+
+$ doas cdio -f /dev/cd0c cdrip
+
+

+ Warto dodać żeby uniknąć bałaganu, uruchamiałem polecenie do ripowania w przeznaczonym dla tej płyty katalogu. Jako bonus + polecenie do sprawdzenia płyty w gnudb.org +

+
+$ doas cdio -f /dev/cd0c cddbinfo
+
+

+ Wynik polecenia może być różny w zależności od tego co uda mu się znaleźć na płycie. +

+

+

 

+

+ Dzień 11 - Raspberry Pi Zero podłączone przez USB do laptopa z OpenBSD i torrenty z terminala - + 2021.04.19 +

+ Potrzebowałem serwera www najlepiej z Git-em, do pisania pewnych aplikacji. Mój Acer Aspire One, strasznie by się spocił przy + hostowaniu maszyn wirtualnych, ale nie należało go skreślać bo kiedyś korzystałem z terminala HP z podobnym procesorem, który + hostował dwie maszyny wirtualne. Zużycie procesora 100% bez przerwy za nim coś zrobiłem to trochę minęło, ale jakoś jakoś + dawał radę. Miałbym go do dzisiaj gdyby nie zalało pomieszczenia, którym się znajdował, a że leżał na podłodze, + woda go uszkodziła i niestety trafił na złom. Wracając do głównego tematu. Pomyślałem, a co gdyby użyć RPI, trzeba by podłączać + to do sieci, nosić zasilacz lub używac powerbank-a. No dobra, a Raspberry Pi Zero? Podłączone do Acera... Tak tylko że na + tym laptopie jest przecież zainstalowane OpenBSD. No to mam problem. +

+

+ Nie taki diabeł straszny jak go malują. Po zainstalowaniu obrazu na karcie przy użyciu tego laptopa, musiałem niestety użyć + zewnętrznego czytnika kart, bo ten wbudowany nie miał generalnie wsparcia na systemach *BSD. Kolejny przeszkodą mogła być + konfiguracji RNDIS, bo trzeba to ustawić na karcie na partycji Boot, jednak RasPiOS + wykorzystuje partycję Boot sformatowaną na MSDOS (FAT32). Na chwilę przeskoczę do tego jak w ogóle + zdobyłem obraz. +

+

+ Obraz zdobyłem za pomocą sieci BitTorrent, nie miałem jednak wiedzy nt. klientów BT na OpenBSD. Sprawdziłem z ciekawości program, + który ożywam od lat Transmission. Ten program jest stworzony w architekturze klient-serwer i można go + używać na wiele róznych sposobów za pomocą przeglądarki, klasycznego okna czy to na czym mi zależało z poziomu terminala. + Więc wchodzę na stronę projektu Transmission, a tam pod OpenBSD widnieje napis "Official packages". I teraz wiem + że jestem w domu. Sciągam paczkę z Transmission. +

+
+$ doas pkg_add -iv transmission
+
+

+ Informacje o tym jak używać Transmission znalazłem za pomoc DuckDuckGo na tej stronie: + https://cli-ck.io/transmission-cli-user-guide + Po zainstalowaniu się pakietu, wskazuję daemonowi Transmission katalog dla pobranych. +

+
+$ transmissions-daemon --download-dir ~/Downloads
+
+

+ Daemona uruchamiamy tym samym poleceniem tylko bez żadnych przełączników czy opcji. +

+
+$ transmissions-daemon
+
+

+ Pliki torrent czy magnet linki, dodajemy za pomocą poniższego polecnia z wraz z opcją + -a. +

+
+$ transmission-remote -a <plik_torrent/magnet_link>
+
+

+ Do monitorowania daemona (sprawdzenia postępów ściągania) służy polecenie: +

+
+$ transmissions-remote -l
+
+

+ Po pobraniu, nagraniu obrazu na kartę oraz skonfigurowaniu systemu, przyszedł czas na podłączenie RPI do laptopa. + Po podłączeniu w systemie pojawił się nowy interfejs sieciowy urndis0 i nic poza tym. Każdy + interfejs żeby mógł się komunikować z kimkolwiek musi mieć jakiś adres. Stworzyłem więc plik + /etc/hostname.urndis0 o takiej zawartości: +

+
+inet 192.168.56.1 255.255.255.0
+
+

+ Zrestartowałem sieć. +

+

+$ doas sh /etc/netstart
+
+

+ No tak, ja mam adres a Raspberry? Nope. Jak można nadać adres hostowi bez możliwości jakiej kolwiek konfiguracji? + Za pomocą DHCP. Utworzyłem konfigurację w /etc/dhcpd.conf z bardzo małym zakresem: +

+
+subnet 192.168.56.0 netmask 255.255.255.0 {
+
+	range 192.168.56.5 192.168.56.10;
+	option routers 192.168.56.1;
+	option domain-name "local";
+	option domain-name-servers 192.168.56.1;
+}
+
+

+ Uruchomiłem z reki daemona DHCP. +

+
+$ doas dhcpd urndis0
+
+

+ I czekałem na przydzielenie adresu sprawdzając co jakiś czas plik /var/db/dhcpd.leases, aż moim oczom ukazał + się taki o to wpis: +

+
+lease 192.168.56.7 {
+	starts 1 2021/04/19 07:32:45 UTC;
+	ends 1 2021/04/19 19:32:45 UTC;
+	hardware ethernet aa:9a:fc:ef:b5:83;
+	uid 01:aa:9a:fc:ef:b5:83;
+	client-hostname "raspberrypi";
+}
+
+

+ Teraz mogłem się połączyć z Raspberry. Żeby nie musieć za każdym razem uruchamiać DHCP, ustawiłem na nim statyczny + adres i tak byłby wymagany do Gogs-a. Oczywiście żeby zainstalować tym sprzęcie cokolwiek potrzebne jest + połączenie z Internetem. Musiałem przerobić tego laptopa na bramkę na żądanie, doinstalować dnsmasq (nie potrzeba + go konfigurować), na podstawie obecnego pliku PF, utworzyłem plik z regułą NAT-u oraz włączyć + przekazywanie pakietów. +

+
+$ doas pkg_add -iv dnsmasq
+
+pass out on alc0 from urndis0:network to any nat-to (alc0)
+
+sysctl net.inet.ip.forwarding=1
+
+

+ Alc0 to interfejs przez, który mój laptop łączy się z siecią lokalną w budynku. Całość + skonfigurowałem wraz z instalacją Gogs-a i mimo LAMP Stacka to Raspberry Pi Zero radzi sobie + nadzwyczaj dobrze. +

+ +

+

+ ~xf0r3m +

+
+ + + + + diff --git a/articles/bsd/index.html b/articles/bsd/index.html new file mode 100755 index 0000000..4203133 --- /dev/null +++ b/articles/bsd/index.html @@ -0,0 +1,39 @@ + + + + + + + + +
+88                             88
+88                             88
+88                             88
+88,dPPYba,  ,adPPYba,  ,adPPYb,88
+88P'    "8a I8[    "" a8"    `Y88
+88       d8  `"Y8ba,  8b       88
+88b,   ,a8" aa    ]8I "8a,   ,d88
+8Y"Ybbd8"'  `"YbbdP"'  `"8bbdP"Y8
+
+ + + +
+ +
+ + + + + diff --git a/articles/bsd/instalacja_NetBSD.html b/articles/bsd/instalacja_NetBSD.html new file mode 100755 index 0000000..d3c2f40 --- /dev/null +++ b/articles/bsd/instalacja_NetBSD.html @@ -0,0 +1,133 @@ + + + + + + + + +
+88                             88
+88                             88
+88                             88
+88,dPPYba,  ,adPPYba,  ,adPPYb,88
+88P'    "8a I8[    "" a8"    `Y88
+88       d8  `"Y8ba,  8b       88
+88b,   ,a8" aa    ]8I "8a,   ,d88
+8Y"Ybbd8"'  `"YbbdP"'  `"8bbdP"Y8
+
+ + + +
+

Instalacja NetBSD

+

+ System NetBSD ma jedną bardzo ważną cechę, został przygotowany i jest nadal utrzymywany dla bardzo wielu platform. + To sprawiło, że + zainteresowałem się nim przy chęci wykorzystania go na starym serwerze Sun Microsystems. Jako jedyny z wiodącej trójki systemów + BSD poprawnie zainstalował się i uruchomił na wspomnianym serwerze. Obecnie zapewnia dostęp do usług poczty elektronicznej. + Jedną z jego wad jest dość długa i mająca tendencje do niepowdzenia instalacja, przynajmniej w + przypadku platformy Sparc64. Poniżej za pomocą zrzutów ekranu oraz krótkich opisów postaram się przybliżyć instalację. Instalowałem + większość dystrybucji BSD i nie wliczając GhostBSD oraz nomadBSD, ten system ma chyba najbardzie user-friendly instalator, + pasujący bardziej do GNU/Linux-ów. +

+

+ Płytka w napędzie? No to jadziem! +

+

+ Instalację rozpoczynamy od wyboru języka instalatora. Chyba jedyna dystrybucja BSD z polskim językiem instalatora (potrzebne źródło). + Wybieramy opcje e: Komunikaty instalacyjne w języku polskim. +

+

+ Z poziomu instalatora możemy np. zaktualizować zainstalowany już system. Póki co to nie mamy nawet tego, więc wybieramy + a: Zainstaluj NetBSD na twardym dysku. Fun fact o tym instalatorze: możemy poruszać po nim znacznie + szybciej naciskając na klawiaturze te literki po lewej stronie opcji. +

+

+ Standardowe pytanie o to czy rzeczywiście chcemy instalować ten system. Wybieramy b: Tak, chyba że + zmieniliśmy zdanie. +

+

+ Wybieramy docelowy dysk dla systemu. W moim przypadku jest to a: wd0 (8.0G). +

+

+ Następnie ustalamy sposób partycjonowania, możemy wyczyścić dysk i ustawić partycje ręcznie lub automatycznie. Póki co + wybierzemy b: Użyj domyślnych rozmiarów partycji. +

+

+ Zatwierdzamy ustawione przez instalator partycje, x: Rozmiary partycji w porządku. +

+

+ Póki co nie zostały wprowadzane żadne zmiany na dysku, dopiero wybranie opcji b: Tak, spowoduje + ustawienie partycji i sformatowanie pod określony system plików. +

+

+ Instalacja NetBSD jest podzielona na trzy główne kolekcje. Dla serwera wystarczy + b: Instalacja bez X11. +

+

+ NetBSD można zainstalować z wielu źródeł. Na serwerze, na którym próbowałem zainstalować NetBSD z płyty to był wielki problem, + bo system nie mógł dobrać poziomu DMA dla napędu więc użyłem b: HTTP. +

+

+ Teraz mamy możliwość ustawienia mirror-u. Wykorzystanie źródła HTTP wymaga skonfigurowania sieci, dlatego też wybieramy + opcje j: Skonfiguruj siec. +

+

+ Wybieramy kartę sieciową, w moim przypadku jest to a: hme0 +

+

+ Typ interfejsu sieciowego pozostawiamy domyślnie czyli autoselect, następnie decydujemy czy wybrać + autokonfigurację - pobrać z dhcp. +

+

+ Po pobraniu konfiguracji zostaniem zapytani o nazwę domeny, jeśli serwer nie będzie dostępny pod żadną możemy wpisać cokolwiek. + Po zatwierdzeniu pokaże nam się podsumowanie konfiguracji i zapytanie czy te dane są poprawne. +

+

+ Po potwierdzeniu konfiguracji, wracamy do ustawień źródła pakietów dystrybucji. Teraz wybieramy opcje + x: Ściągnij dystrybucje. A samo pobranie dystrybucji w raz z instalacją pobranych paczek może + chwilę potrwać. +

+

+ Konfiguracja sieci z pobierania dystrybucji może zostać zapisana jako stała konfiguracja sieciowa systemu, teraz możemy o tym + zdecydować. Jeśli maszyna znajduje się już w docelowej sieci i nadaliśmy mu już przeznaczony dla niego adresu, badź zrobił to serwer + DHCP możemy zapisać konfiguracje b: Tak. +

+

+ Teoretycznie to system jest już zainstalowany jednak nie uruchomi się bez konfiguracji w plikach rc. Ustawiamy: +

+ +

+ Teraz możemy zakończyć konfigurację poinstalacyjną wybierając opcje x: zakończ konfigurację. + Zostanie nam wyświetlony komunikat o tym że zainstalowaliśmy NetBSD, za pomocą klawisza enter wracamy do menu gdzie + wybieraliśmy tryb instalacji. +

+

+ Teraz możemy uruchomić ponownie nasz komputer wybierając opcję d: Zrestartuj komputer. +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/bsd/instalacja_OpenBSD.html b/articles/bsd/instalacja_OpenBSD.html new file mode 100755 index 0000000..7ed69d1 --- /dev/null +++ b/articles/bsd/instalacja_OpenBSD.html @@ -0,0 +1,246 @@ + + + + + + + + +
+88                             88
+88                             88
+88                             88
+88,dPPYba,  ,adPPYba,  ,adPPYb,88
+88P'    "8a I8[    "" a8"    `Y88
+88       d8  `"Y8ba,  8b       88
+88b,   ,a8" aa    ]8I "8a,   ,d88
+8Y"Ybbd8"'  `"YbbdP"'  `"8bbdP"Y8
+
+ + +
+

Instalacja OpenBSD

+

+Eksperymentując długo przed poznaniem OpenBSD z GNU/Linux-owymi dystrybucjami przeznaczonymi na routery, głównie z IPCop, poźniej IPFire, następnie przesiadłem się na PFsense, który był oparty o firewall PF. Utworzywszy w PFsense kilka reguł okazało się że żadna z nich nie działa. Porzuciłem routery. Przyszedł czas mojej pierwszej pracy. Po ogarnięciu bałaganu sieciowego, firmowy router zaczał się wieszać... Wziąłem go na warsztat, był dosć ciekawie skonfigurowany, serwerowa płyta Intela z socketem 478. Był tak zakurzony, że po rozkręceniu było tyle syfu że można było pomyśleć że ktoś tam piachu nasypał, ale płyta cała. Wszystkie kondestatory sprawne, ram testowany memtestem - sprawny. Dobra, czyli zmieniamy system. Tylko jakoś niechciałem GNU/Linuxa i iptables. Przypomniałem sobie o PF. Wpisując "PF packet filter" w wyszukiwarkę, znalazłem na oficjalnej stronie OpenBSD świetną dokumentację PF, to pomyślałem o OpenBSD jako docelowym systemie. Można spróbować. Mam system operacyjny wraz z pakietem firewalla. Dokumentacja na stronie projektu była pierwszym moim przeczytanym ze zrozumieniem anglojęzycznym, technicznym tekstem. Po zapoznaniu się z PF trzeby by zainstalować sobie OpenBSD i trochę po go testować. +

+
+(I)nstall, (U)pgrade, (A)utoinstall, or (S)hell? I
+
+

+Instalacje OpenBSD rozpoczynamy od wyboru trybu pracy w środowisku instalacyjnym. Wybieramy instalacje, czyli I. +

+

+Następnym krokiem jest wybór layoutu klawiatury, możemy wybrać literę l lub znak ? co wyświetli nam dostępne układy, oczywiście wybieramy pl. +

+

+Kolejną rzeczą do ustawienia podczas instalacji jest nazwa hosta. Na przykład foo. +

+
+System hostname (short form e.g. 'foo') foo
+
+

+Następnie instalator wyświetli nam listę dostępnych w systemie interfejsów sieciowych. Zapyta czy chcemy je teraz konfigurować, jeśli nie, wystarczy wpisać done. Tą wartością możemy również przerwać konfiguracje. Powiedzmy że mamy trzy interfejsy w systemie, ustawiliśmy jeden i to wystarczy. Kiedy instalator zapyta o następny, wpisujemy done. Dla pierwszego interfejsu, konfiguracja wygląda w taki sposób że po podaniu (zaakceptowaniu) nazwy (podanej przez instalator), podajemy adres IP pod jakim będzie on dostępny w sieci lub jeśli ma pobrać adres z DHCP wpisujemy dhcp. Jeśli wpisaliśmy adres, to następne pytanie będzie o maskę podsieci. System zasugeruje nam maskę, jeśli pasuje ona do naszej konfiguracji sieci to możemy ją zatwierdzić, jeśli nie to podajemy swoją. +

+
+IPv4 address for em0 ? (or 'dhcp' or 'none') [dhcp] 10.0.0.1
+Netmask for em0 [255.255.255.0] 255.0.0.0
+
+

+Możemy ją zaakceptować lub wpisać swoją. Następną konfiguracją będzie IPv6, konfigurujemy ją wedle własnego uznania, ja przeważnie wybieram opcje domyślną czyli none. +

+
+IPv6 address for em0 ? (or 'autoconf' or 'none) [none]
+
+

+Po tej konfiguracji przechodzimy do kolejnego interfejsu, tu możemy przerwać konfiguracje sieci, jeśli to zrobimy, to od razu przejdziemy do pytań o: +

+
    +
  1. +

    +Bramę domyślną (o ile wybraliśmy statyczną konfigurację interfejsu) +

    +
    +Default IPv4 route ? (IPv4 address or none) [none]
    +
    +
  2. +
  3. +

    +Domenę (dla statycznej, jak i DHCP) +

    +
    +DNS domain name (e.g. 'example.com') [my.domain] morketsmerke.net
    +
    +
  4. +
  5. +

    +Adresy serwerów DNS (o ile wybraliśmy statyczną konfigurację) +

    +
    +DNS nameservers? (IP address list or none) 192.168.1.1
    +
    +
  6. +
+

+Po konfiguracji sieci, czas na ustawienia hasła użytkownika root. +

+
+Password for root account ? (will not echo)
+
+

+Po tym zostaniemy zapytani o to czy domyślnie uruchamiać sshd oraz xenodm wraz ze startem systemu i czy zmienić domyślną konsole na port COM. Na pytania opowiadamy w zależności od potrzeb. +

+

+Na serwerach na pierwsze pytanie odpowiadamy yes. +

+
+Start sshd(8) by default? [yes]
+
+

+Na powyższym przykładzie nie ma odpowiedzi, ponieważ akceptujemy odpowiedź zasugerowaną przez instalator. Na drugie odpowiadamy no (Jeśli instalujemy OpenBSD z zamiarem uruchamiania środowiska graficznego to możemy opowiedzieć yes.) +

+
+Do you expect to run the X Window System? [yes] no
+
+

+trzecie... Tu sprawa się komplikuje. Przepuszczanie konsoli, przez port COM to generalnie fajna sprawa jeśli mamy ograniczone miejsce, podpinamy kabelek USB do laptopa na następnie podpinamy kabel do ser... okazuje się że kable usb - rs232 (czy COM) mają złącze rs232 męskie i w serwerze prawdopodobnie złacze też jest męskie, potrzebujemy kabla rs232 żeńsko-żeńskiego. Jeśli ktoś posiada wymagane okablowanie oraz odpowiednie umiejętności może wybrać tutaj yes, jednak do powszechnego użytku przekierowanie konsoli, nie będzie nam potrzebne (no). +

+

+Po odpowiedzi na te trzy pytania, zostaniemy poproszeni o nazwę pierwszego użytkownika systemu. Jego będziemy wykorzystywać jako użytkownika do logowania się przez SSH do systemu. +

+
+Setup a user? (enter a lower-case loginname, or 'no') [no] admin
+
+

+Po podaniu nazwy użytkownika, zostaniemy zapytani o jego pełną nazwę czyli imię i nazwisko. Pozostawiamy tę wartość domyślną, która jest równa nazwie uzytkownika. +

+
+Full name for user admin? [admin]
+
+

+Następnie instalator zapyta nas o hasło dla nowopowstałego użytkownika. +

+
+Password for user admin? (will not echo)
+
+

+Teraz zostaniemy powiadomieni o tym że użytkownik root, jest celem ataków odgadywania hasła, oraz że używanie w jego przypadku kluczy publicznych do logowania przez SSH jest bezpieczniejsze, po tej informacji zostajemy zapytani o to czy zezwolić na logowanie przez SSH użytkownika root? Do wyboru mamy yes, no lub prohibit-password. Wybieramy wedle własnego uznania, chociaż warto wspomnieć że stworzony przed chwilą użytkownik będzie znajdować się w specjalnej grupie, która ma możliwość wykonania polecenia su root. +

+
+Warning: root is targeted by password guessing attacks, pubkeys are safer.
+Allow root ssh login? (yes, no, prohibit-password) [no]
+
+

+Pora na ustawienia właściwej strefy czasowej, znakiem zapytania ? możemy wylistować sobie dostępne strefy. Może być wielce prawdopodobne że zostanie ona sama prawidłowo zasugerowana bazując na wybranym układzie klawiatury. +

+
+What timezone are you in? ('?' for list) [Europe/Warsaw]
+
+

+Teraz możemy przejść do partycjonowania. Zostanie nam przedstawiona lista dostępnych w systemie dysków. +

+
+Available disks are: wd0
+
+

+Zostaniemy poproszeni o wskazanie głównego systemu plików, system zasugeruje na dysk pierwszy na liście. +

+
+Which disk is the root disk? ('?' for details) [wd0]
+
+

+Oczywiście możemy to zmienić. W tym momencie musimy wybrać pomiędzy całym wykorzystaniem dysku z tablicą MBR a tablicą GPT lub ręcznym wydzieleniem miejsca dla BSD, w zależności od tego czy nasz dysk +przekracza 2TB wybieramy GPT a jeśli nie to whole co oznacza MBR. +

+
+Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole]
+
+

+Po wybraniu trybu zostanie nam wyświetlona automatyczna alokacja miejsca na dysku (partycji) (dla powszechnego użytku jest wystarczająca). Możemy ją edytować lub utworzyć swoją własną. Utworzoną alokację potwierdzamy literką a. Teraz następuję rzeczywiste ustawianie partycji. +

+
+Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a]
+
+

+Po tej czynności nadchodzi czas na instalacje systemu, na początku wybieramy źródło plików do instalacji, systemy BSD są systemami które mogą wystartować z instalacją z dyskietki 3,5" a następnie pobrać pakiety systemowe z Internetu. My wybieramy cd0 lub disk Instalator zasugeruje nam nośnik z plikami, z którego został uruchomiony lub http. +

+
+Location of sets? (cd0 disk http or 'done') [cd0]
+
+

+W przypadku uruchomienia z dysku USB wybramy opcję disk będziemy musieli odpowiedzieć na pytanie czy dysk został zamontowany. Zasugerowana odpowiedź będzie yes, ale my wpisujemy no. +

+
+Is the disk partition already mounted? [yes] no
+
+

+Następnie zostanie nam wyświetlona lista dysków (jak do wyboru dysku systemowego) wraz z zapytaniem, który z dysków zawiera pliki instalacjyne. +

+
+Available disk are: wd0 wd1.
+Which disk contains the install media? (or 'done') [wd0]
+
+

+W moim przypadku z racji tego iż uruchamiam to na QEMU obraz dysku instalacjnego jest pierwszym dyskiem na mojej maszynie. Po wybraniu dysku zostanie wyświetlona nam list partycji +

+
+ a:	1358848		1024	4.2BSD	2048 16384 16142
+ i:	    960		  64	 MSDOS
+Available wd0 partitions are: a i.
+Which wd0 partition has the install sets? (or 'done') [a]
+
+

+Partycja z plikami instalcyjnymi jest sformatowana jako 4.2BSD, i zgodnie z sugestią instalatora wybierzemy partycję oznaczoną literą 'a'. Teraz partycja zostanie przeszukana pod kątem plików instalacyjnych, o znalezieniu plików instalcyjnych zostaniemy poinformowani w sugestii instalatora na odpowiedź poniższego pytania. +

+
+Pathname to the sets? (or 'done') [6.5/amd64]
+
+

+Akceptujemy znalezioną ścieżke. Jeśli instalujemy system z płyty instalator od razu zacznie szukać ścieżki, co spowoduje przeskok do powyższego pytania. +

+

+Teraz możemy wybrać jakie pakiety chcemy zainstalować. Warto wszystkie. Dlaczego? Otóż, nie które z programów uruchamianych w konsoli mogą używać czcionek, które dostępne są w pakietach ze środowiskiem graficznym. Nikt nam nie każe uruchamiać środowiska ze startem systemu jak i ręcznie, ale te pakiety warto posiadać. Czasami uruchomienie środowiska może usprawnić pracę. +

+ +

+Po zatwierdzeniu zbioru pakietów, zostaniemy poinformowani o tym że na ścieżce nie znaleziono pliku z podpisem oryginalności plików instalacyjnych (dla paranoików). Na tym etapie możemy to zignorować i odpowiedzieć +czy chcemy kontynuować bez weryfikacji yes. +

+
+Directory does not contain SHA256.sig. Continue without verification? [no] yes
+
+

+Po zakończonej instalacji, instalator znów zapyta nas o położenie plików instalacyjnych, teraz będzie sugerować done, warto posłuchać tej sugestii. +

+
+Location of sets? (cd0 disk http or 'done') [done]
+
+

+Ostatnimi komunikatami są miedzy innymi pytanie o ustawienie poprawnej daty oraz czasu. +

+
+Time appears wrong. Set to 'Fri Apr 24 22:04:05 CEST 2020'? [yes]
+
+

+Na sam koniec otrzymamy gratulacje odnośnie poprawnie zainstalowanego systemu oraz pytanie czy chcemy system zatrzymać (tak jak kiedyś na startych Windowsach, po zatrzymaniu systemu należy nacisnąć lub przytrzymać wyłącznik komputera tak samo jest z OpenBSD, kiedy wybierzemy polecenie halt), przejść do powłoki albo z resetować komputer wybieramy sugerowany restart. +reboot. +

+ +Exit to (S)hell, (H)alt or (R)eboot? [reboot] + +

+Usuwamy nośnik i możemy cieszyć się nowym system OpenBSD. +

+

+Odnośnie instalacji OpenBSD, to nie zawsze wszystko wygląda tak różowo. Instalacja na starych firmowych systemach takich jak Dell Optiplex GX620 przynosi rezultaty. Ale np. instalacja na komputerze PC, ktory był budowany przeze mnie od podstaw już nie. Na płycie Gigabyte z podstawką 1156, to włożnie pendrive-a do gniazda USB potrafi zawiesić cały komputer już na procedurze POST. Przy np. płycie MSI z podstawką 1150 system może się zainstalować ale po zainstalowaniu komputer zawiesza się na procedurze POST, odpięcie dysku SSD powodowało że komputer uruchamiał się poprawnie, jednak jeśli chciałem coś zrobić z tym komputerem musiałem wymontować dysk oraz podłączyć go na USB do innego systemu wyzerować początek i podłączyć z powrotem, bardzo irytujące. Nie wiem czy to jest wina tylko tej wersji bo próbowałem z wersją 6.8 na dzień dziejszy (23.02.2021) najnowszą. Jednak na laptopach nie ma takich problemów, dlatego laptop wydaje się najlepszym rozwiązaniem. Jednak te słowa pisze na Laptopie z OpenBSD wykorzystującym środowisko graficzne Fluxbox, chciałem mieć tu XFCE jednak podczas działania XFCE grafika (ATI Radeon) strasznie "glitch'owała", to nie wina sprzetu (bo xenodm, czy wymieniony wcześniej Fluxbox działają wyśmienicie) ale wydaje mi się że jest to wina wadliwego sterownika a te środowiska wykorzystują grafikę w znikomy sposób. Wnioskując dla OpenBSD nalepszy jest poleasingowy laptop z procesorem drugiej lub trzeciej genereacji oraz grafiką Intel HD Graphics. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/hardware/apple_macbook_a1181.html b/articles/hardware/apple_macbook_a1181.html new file mode 100755 index 0000000..710c042 --- /dev/null +++ b/articles/hardware/apple_macbook_a1181.html @@ -0,0 +1,236 @@ + + + + + + + + +
+    __  __               __                       
+   / / / /___ __________/ /      ______ _________ 
+  / /_/ / __ `/ ___/ __  / | /| / / __ `/ ___/ _ \
+ / __  / /_/ / /  / /_/ /| |/ |/ / /_/ / /  /  __/
+/_/ /_/\__,_/_/   \__,_/ |__/|__/\__,_/_/   \___/
+
+ + + +
+

Apple Macbook A1181

+

+ Poliwęglanowy Macbook A1181 zadebiutował w 2006 roku i był to + pierwszy komputer przenośny firmy Apple z procesorem Intela. Swój + egzemplarz nabyłem podkoniec 2018 roku od kolegi za małe pieniądze. + Czy jednak używanie komputera z 2007 (moj MacBook, to Mid 2007) ma + sens? Wszystko zależy od oprogramowania. Na początku jednak kilka + informacji o sprzęcie. +

+

Sprzęt

+

+ Komputer gdy go dostałem wyposarzony był w Core2Duo T7400 o taktowaniu + 2.16GHz, 2GB DDR2 oraz 120GB dysk twardy. Łączność bezprzewodową + zapewnia Apple Airport Extreme 802.11a/b/g/n z odblokowanym domyślnie + standardem n, we wcześniejszych wersjach ten standard był + wyłączony. Ekran to błyszcząca matryca LCD o przekątnej 13,3" i + rozdzielczości 1280x800. Potrzymaniu tego laptopa, postanowiłem że + rozszerze mu ilości RAM zamieniając te 1GB kości na 2GB. Niestety mimo + iż komputer sprzętowo przyjął te kości, to w systemie widoczne było + tylko 3GB. Inną wadą tego sprzętu było mocowanie dysku twardego. Dysk + miał swoją ramkę, do niej mocowany był za pomocą dwóch zestawów śrubek + na torx. Nigdy nie wiedziałem, które śrubki idą gdzie czy + z przodu czy z tyłu. Dysk wjeżdzał w ramce do obudowy w takie gumki. Te + gumki były przyklejone do obudowy i przy pewnej zmianie dysku jedna z tych + gumek się odkleiła i trzeba było go całego rozebrać, żeby ją wyciągnąć. + Plusem, tego komputera jego rozbieranie. Aby dostać się do płyty + głównej, trzeba okręcić 25 śrubek (11 na zewnątrz, 10 wewnątrz + [pod baterią] + maskownica pamięci RAM i dysku) na koniec lekko + wypchnąć od spodu palmrest i już. Komputer otwarty. Nie wspomniałem + tutaj o napędzie. Jest to napęd szczelinowy, nie posiada tacki. Płyty + wysuwa się w szczelinę i wysuwa przyciskiem na klawiaturze, w moim + egzemplarzu napęd chyba niechce coś współpracować. Nie czyta płyt + ale to chyba normalne dla tych sprzętów kupionych jako używane. Dlatego + o nim wspomniałem wscześniej. Klawiatura wygodna, w moim przypadku + prawdopodobnie szwedzka. Nie dawno ją przekleiłem. Jakiś czas temu + kupiłem drugi egzemplarz, na części i jedyne co wymieniłem to + taśma palmrestu. Oryginalna źle się złożyła podczas zamykania obudowy + i zmieniając RAM uszkodziłem jedną ścieżkę, a jej wymiana nie była + trudna, ponieważ pod szarą maskownicą elektroniki gładzika znajdowało + się złącze taśm znane z innych laptopów, wystarczyło wyciągnąć + uszkodzoną taśmę, wsunąć nową i zamknąć złącze. +

+

Wygląd

+

+ Kształt komputera jest bardzo elegancji jak firmę z jabłkiem w logo + przystało. Komputery te wychodziły w dwóch wariantach kolorystycznych + czarnym oraz białym. Komputery na klapie matrycy były opatrzone + podświetlanym logo. Logo akurat w tym modelu nie świeciło, aż tak + mocno aby prześwietlać się przez matrycę podczas wyświetlania + ciemniejszego obrazu. + Do okołą matrycy znajduje się prawie centymetrowa ramka na której + znajdują się stopki dystansujące matrycę od klawiatury. Niestety + praktyka pozkazała, że są one z niskie klawiatura może się po poprostu + odbić na matrycy. Na środku górnej części ramki znajduje się kamera + iSight. Na palmreście znajduje się przycisk włącznika, + klawiatura oraz wyposażony w jeden przycisk gładzik znajdujący się + mniej więcej na środku + palmrestu. Na froncie kadłubka znajduje się dioda sygnalizująca + uruchomienie systemu lub jego przejście w stan wstrzymania, po lewej + stronie znajdują się dostępne w MacBook-u złącza takie jak: +

+ +

+ Po prawej stronie znajduje się szczelina do odtwarzacza płyt, a z tyłu + głośniki oraz wylot powietrza z CPU. Pod spodem znajdziemy baterię oraz jej + blokadę. Baterie w tych wersjach sprzętu Apple posiadają wskaźnik + naładowania. Teraz trochę o bublach projektowych. Te MacBooki mają w + palmrestach za krótki + punkt styku z kadłubkiem co powoduje charakterystyczne dla tego modelu + dziury, szczeliny w miejscah gdzie spoczywają nasze nadgarstki. Wygląda + to co najmniej jest nie estetyczne. W białej + wersji mocno widać zużycie błyszczącego poliwęglanu: zdrapania, otarcia + zabrudzenia, złacza znajdują się w zagłebieniach, których przez lata + korzystania gromadzić się będzie brud. Pozostawienie tego laptopa na + słoneczku może spowodować jego zżółknięcie. Mój egzemplarz posiada + kilka naklejek na klapie (a ja z chęcią przykleił bym jeszcze jedną + przy wylocie powietrza "Uwaga! Gorące. Nie dotykać.") oraz błekitny + nieco już zużyty + hardcase. Nie dokupowałem go i dostałem go wraz z laptopem. + Obcenie coś takiego dla tego modelu, można dostać jedynie w Chinach + przez internet. +

+

Firmware

+

+ Sprzęt Apple jak wiemy lub nie, nie posiada tradycjnego BIOS-u, a + firmware, do którego się raczej nie dostaniemy. Cechą charakterystyczną + tego rozwiązania jest użycie 32-bitowego UEFI. Jest to cenna wskazówka + jeśli chcemy zainstalować inny system operacyjny niż MacOS 10.6 Snow + Leopard. +

+

System operacyjny

+

+ Chcąc skorzystać z tego komputera należy zastanowić się nad tym z + jakiego systemu operacyjnego możemy tutaj użyć. W grę może wchodzić + kilka rozwiązań, większość jednak to rozwiązania oparte na Linuksie. + Niestety + ze względu na wymienione powyżej UEFI 32-bitowe przed przegraniem + obrazu na pendrive, dysk należy na początku przygotować. Na początku + chcę zobaczyć jak ten komputer poradzi sobie z immudex + (moją wersją Debiana 11 - + https://github.com/xf0r3m/immudex). + Jeśli coś będzie nie tak, wtedy będę szukać alternatyw (oczywiście + rozsądnych coś na opartego na Debianie lub Arch-u) + Na oficjalnej stronie Debiana znajduje się poradnik w jaki sposób + należy przygotować dysk: + https://wiki.debian.org/InstallingDebianOn/Apple/MacBook/2-1. + Jak możemy się domyślić przedstawione na stronie metody, dotyczą + obrazu mini.iso Debiana. Ja chcąc uruchomić immudex + muszę dostosować te konfigurację. Dużym plusem jest fakt iż moja + dystrybucja korzysta rownież korzysta z GRUB dla zapewnienia + kompatybilności z systemami opartymi wyłącznie na UEFI. Więc co muszę + zmienić w konfiguracji dla Debiana aby uruchomić immudex. + Pierwszą rzeczą jest utworzenie dodatkowego katalogu na pendrivie, + który musi nazywać się live, wówczas moduł załadowany do + initrd będzie wstanie odnaleźć archiwum squashfs i + użyć go + jako katalogu głównego. Po utworzeniu tego katalogu kopiuje do niego + archiwum squashfs. Następnie dopisuje kilka opcji jądra, te + same, które występują w pliku konfiguracyjnym GRUB dla 64-bitowego + UEFI (https://github.com/xf0r3m/immudex/blob/main/grub/amd64/grub.cfg) + linia nr. 19 opcja o nazwie linux w + celach testowych pominąłem opcję quiet, + aby widzieć czy i jak ładuje się system. Po załadowaniu systemu działa + ethernet, działa dźwiek czy Wi-Fi. Pasek nie mieści się na + na ekranie, ale tym zajął bym się dopiero jeśli chciałbym (albo raczej + musiał) korzystać z tego komputera. Po załadowaniu systemu przyszedł + czas na jego instalację. Instalując swoją dystrybucję na tym komputerze + zasugerowałem się skryptem instalacji immudex_install + dołączonym do obrazu. Istotne są tutaj dwie czynności. Pierwsza z nich + to ręczna instalacja binariów GRUB dla 32-bitowego UEFI + (pakietu: grub-efi-ia32-bin) ze względu na to, wymagana będzie + również zmiana targetu w poleceniu instalującym GRUB z + x86_64-efi na + i386-efi. Drugą istotną rzeczą jest + pobranie pliku konfiguracjnego GRUB, dokładnie tego, który został + użyty do konfiguracji zmiany konfiguracji GRUB podczas tworzenia dysku + USB, z którego ładowany był system. Możemy przpisywać ten długi adres, + jednak lepszym sposobem jest zaciągnięcie całego repozytorium z + GitHub i skopiowanie pliku odpowiedniego pliku (w zależności od + architektury, jednak różnią się one wyłącznie opisem opcji) do + katalogu /media/boot/grub. Po tej czynności możemy odmontować + wszystkie dyski i uruchomić komputer ponownie. W ten sposób uzyskamy + zainstalowany immudex jak na każdym innym sprzęcie. A + instalacja na 32-bitowym EFI pojawi się w immudex_install + w kolejnej wersji mojej dystrybucji. +

+

Podsumowanie

+

+ Kiedy otrzymałem swój egzemplarz MacBook-a na początku korzystałem + z tego nieszczęsnego MacOS 10.6. Zainstalowałem tam Firefox 46, bo to + był jedyny kompatybilny z tym systemem. Później stwierdziłem, że chcę + wgrać na niego jakąś dystrybucje Linuksa. Wybór mój padł na używaną + przeze mnie wówczas dystrybucję jaką był MX Linux. Odziwo MX Linux + załadował się z obrazu utworzonego na Windowsie więc musiał natywnie + wspierać 32-bitowe EFI, poźniej z racji tego, że uwielbiam Debiana + próbowałem klasycznie za pomocą dd wgrać obraz na pendrive i + go z niego + uruchomić po stracie całego popołudnia trafiłem na artykuł na + wiki.debian.org. Potem kolejno instalacja greenOS teraz + immudex już szła z górki. W między czasię pojawił się + Arch Linux oraz Parabola GNU/Linux-libre one również + udało się na nim zainstalować. Wracając jednak do pytania zadanego na + wstępie tego materiału, czy warto korzystać z komputera z 2007 roku + obecnie. Komputer ten może być dobrym wyborem dla hakera dbającego o + swoją prywatność, ten komputem nie posiada bowiem Intel ME, posiada z + za to gigabitowy ethernet oraz bardzo wydajną kartę sieci + bezprzewodowej, gdzie przy pełnym zasięgu można było wyciągnąć 25MB/s + pobierając jeden plik z serwera w sieci lokalnej. Mój egzemplarz + posiada oryginalną baterię, nie znam jej przeszłości czy była + wymienia czy nie ale nadal potrafi trzymać 3-4h. Dodam iż komputer ma + 15 lat. Mi osobiście podoba się wyświetlany przez matrycę obraz, jest + naprawdę bardzo ładny. Dużym minusem jest jego nagrzewanie się. + Tem komputer + nie jest tylko ciepły (wręcz gorący) przy wylocie powietrza z + chłodzenia CPU, ale także z lewej strony palmrestu nad portami również + jest bardzo ciepły, a jeśli korzystam z sieci bezprzewodowej to będzie + on gorący również pod WSAD-em. Jednak na to ciepło może zaradzić + najtańsza podstawka chłodząca (sam byłem w szoku gdy podstawce z sieci + marketów z uśmiechniętym owadem w logo za całe 20zł udało się go + schodzić. Udało się schodzić plastik i to zrobiło robotę ponieważ nie + ma tam żadnej wentylacji). Dla kogoś równie istotny może być jego + ciężar, bo komputer jest dość cięzki. A tak poza tym to można na nim + śmiało oglądać filmiki z + YT poza YT w maksymalnie 360p. Przejrzeć proste stronki, choć tu warto + mieć adbloka. Powiem tak jeśli mamy zamiar korzystać z niego na biurku + na podstawce wykorzystać do programowania lub podstaw nauki Linuksa i + posiadamy dużą ilość cierpliwości to odpowiedź, brzmi: Tak, jak + najbardziej tylko trzeba mieć wszystkie rzeczy na uwadze. Przeglądarka + to wyłącznie Firefox z adblokiem i noscriptem z włączoną ścisłą + ochroną lub GNU IceCat. Maile to tylko jakiś lekki klient, jak + np. ClawsMail lub terminalowy mutt. Jeśli DE (środowisko graficzne) to + najlepiej fluxbox lub openbox. Jeśli chcecie mieć coś "hakerskiego" i + akurat wpadło wam to w ręce za naprawdę śmieszne pieniądze to moim + zdaniem wystarczy. Jeśli macie zamiar to kupić to lepiej, już + zainwestować w Della Latitude z serii E z C2D lub IBM/Lenovo Thinkpad. +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/hardware/index.html b/articles/hardware/index.html new file mode 100755 index 0000000..6167b0a --- /dev/null +++ b/articles/hardware/index.html @@ -0,0 +1,32 @@ + + + + + + + + +
+    __  __               __                       
+   / / / /___ __________/ /      ______ _________ 
+  / /_/ / __ `/ ___/ __  / | /| / / __ `/ ___/ _ \
+ / __  / /_/ / /  / /_/ /| |/ |/ / /_/ / /  /  __/
+/_/ /_/\__,_/_/   \__,_/ |__/|__/\__,_/_/   \___/
+
+ + + +
+ +
+ + + + + diff --git a/articles/immudex/aktualizacja_immudex.html b/articles/immudex/aktualizacja_immudex.html new file mode 100755 index 0000000..69bcf07 --- /dev/null +++ b/articles/immudex/aktualizacja_immudex.html @@ -0,0 +1,127 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Aktualizacja immudex

+

+ Immudex ze względu na to, że jest system wydawanym na zasadzie + LiveCD, jego najważniejsze elementy jak: jądro, initrd oraz + archiwum squashfs pozostają stałe. Aktualizacji dokonuje + się poprzez ich wymianę na miejscu docelowym. W zależności + od rodzaju instalacji można wgrać nowy obraz na dysk lub zmienić te + pliki na partycji utworzonej podczas instalacji. +

+

+ Immudex w wersji stablinej nie jest wydawany regularnie. + Posiada on trzy powody do wydania nowej wersji: Aktualizacja jądra, + poważna zmiana (potrzeba dołączenia jakiegoś narzędzia/programu, + wykrycie/naprawa błędu w jednym z narzędzi) lub + duża ilość pakietów do aktualizacji. Inaczej jest w przypadku wersji + testowej, gdzie wydania publikowane są regularnie co tydzień w sobotę. +

+

+ Aktualizacji możemy dokonać dwa sposób albo ręcznie, albo automatycznie + wykorzystując do tego narzędzie immudex_upgrade. + Warto jednak zaznaczyć, że wybierając opcją automatyczą to może ona + się nie powieźć, jeśli używaliśmy autorskiego archiwum + squashfs i jego wielkość przekracza 2GB. Wówczas należy + dokonać ręcznie poprzez uruchomienie komputera z pamięci USB. +

+

+ Po zalogowaniu się użytkownika do systemu zostanie wyświetlone mu + powiadomienie o tym czy jest dostępna nowa wersja immudex. + Dostępność nowej sprawdzana jest na zasadzie wersji zapisanej w + aktualizacji na serwerze dystrybującym system. Porównywane są + wartości z pliku lokalnego (na dysku) i pliku zadalnego (na serwerze). +

+

Aktualizacja ręczna

+

+ W przypadku ręcznej aktualizacji należy pobrać obraz z jednego z + serwerów: +

+ +

+ Załadować go na pamięć USB lub wypalić na płycie. +

+
+$ sudo dd if=immudex64.iso bs=1M of=/dev/sdX status=progress
+
+

+ Po załadowaniu obrazu na nośnik, uruchamiamy z niego komputer. Po + uruchomieniu systemu musimy podmontować partycję z systemem. Przeważnie + jest pierwsza partycja lub druga partycja na dysku (w trybie UEFI) +

+
+$ sudo mount /dev/sdX1 /mnt
+
+

+ Następnie usuwamy zawartość katalogu live. +

+
+sudo rm -rf /mnt/live/*
+
+

+ Teraz należy skopiować zawartość katalogu live na obrazie. + Katalog ten jest montowany w dwóch miejscach: /run/live/medium/live + lub /usr/lib/live/mount/medium/live. +

+
+sudo cp /run/live/medium/live/* /mnt/live;
+
+

+ Po wykonaniu tych czynności możemy odmontować partycję z system a + następnie zrestartować komputer. System uruchomi się ponownie, ale już + za pomocą immudex w najnowszej wersji. +

+

Aktualizacja automatyczna

+

+ Aktualizacja automatyczna sprowadza się w zasadzie do jednego + polecenia. Bowiem narzędzie immudex_upgrade posiada + opcję --upgrade, która sprawdzi dostępność nowej wersji, a + następnie po potwierdzeniu przez użytkownika rozpocznie proces + aktualizacji. +

+
+xf0r3m@immudex:~$ immudex_upgrade --upgrade
+New version (0.1.9) of immudex is available.
+Warning, reboot maybe necessary to continue work on this machine
+Do you want upgrade this system? (y/n): y
+Upgrading immudex to the newest version...[ OK ]
+
+

+ Po wykonaniu tej czynności najlepiej jest wykonać ponowny rozruch + komputera. +

+

+ + Uwaga! Próba automatycznej aktualizacji może się zakończyć + niepowodzeniem jeśli korzystamy z niestandardowego obrazu, którego + rozmiar przekaracza 2GB. +

+

+ ~xf0r3m +

+ +
+ + diff --git a/articles/immudex/immudex.html b/articles/immudex/immudex.html new file mode 100755 index 0000000..fcbf37c --- /dev/null +++ b/articles/immudex/immudex.html @@ -0,0 +1,240 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

IMMutable DEbian with Xfce

+

+ Aktualności: +

+ +

+ O dystrybucji: +

+

+ Immudex to wersja debian zawierająca niezmienne środowisko pracy. + Wykorzystuje ona bowiem archiwum .squashfs znane z LiveCD. Przyczym + pozwala ona na pełen dostęp do partycji zawierające archiwum, w razie + aktualizacji. Tak przygotowana wersja popularnego systemu operacyjnego + pozwoli bezpieczniejsze korzystanie z komputera oraz zasobów internetu. + Jeśli coś się stanie, wystarczy uruchomić komputer ponownie. +

+

+ Immudex nastawiowny jest na wykorzystanie do przechowywania danych + szyfrowanych partycji za pomocą mechanizmu LUKS. Domyślnie + przeglądarka WWW (firefox-esr) uruchamiany jest przez + sandboxer FireJail z własną emulacją stosu TCP/IP. Tak uruchomiana + przeglądarka nia posiada dostępu do otwartych szyfrowanych partycji. + Immudex tworzony jest również z myślą o nie narzucaniu rozwiązań + dlatego też wiele z nich można w łatwy sposób pominąć, oczywiście na + własną odpowiedzialność. W więcej informacji na temat rozwiązań w + Immudex znajduje się w artykule "Koncepcje immudex" na stronie z + dokumentacją systemu. Wszelkie połączenia przychodzące do są + zablokowane poprzez firewall ufw. +

+

+ Oprogramowanie: +

+

+ Immudex domyślnie korzysta z wolnego oprogramowania, nie zainstalowano + na nim niewolnych pakietów w konfiguracji nie ma również niewolnych + repozytoriów. +

+

+ Oficjalnie immudex wspiera instalację + niewolnego oprogamowania wyłącznie w postacji addonsów + dostępnych w postacji samodzielnych skryptów na repozytorium projektu + lub poprzez narzędzie immudex_addons. Do dyspozycji mamy: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OprogramowanieWersja immudex
StableTestingLHE*
Środowisko XFCE
Menadżer okien Ratpoison
Odtwarzacz multimedialny VLC
Odtwarzacz multimedialny mpv
Skrypt yt-dlp
Przeglądarka Mozilla Firefox ESR
Przeglądarka GNU IceCat
Wirtualizacja KVM (libvirtd + virt-manager):
Narzędzia autorskie immudex:
+

+ * - Low Hardware Edition, Debian 10 Buster, 32-bit +

+

+ Pełna lista oprogramowania wraz z listą pakietów z znajduje się w + pod tym linkiem: + Lista oprogramowania immudex +

+

+ Obrazy płyt: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
• immudex (stable, Debian 12 Bookworm) •
64-bit:https://ftp.morketsmerke.org/immudex/stable/iso/1.0.1/immudex64.iso
CRC: 820814467SHA1: 458a7faf88608cdce99f44c39af94233d8c6e478
32-bit:https://ftp.morketsmerke.org/immudex/stable/iso/1.0.1/immudex32.iso
CRC: 3072989609SHA1: e59a08ff192f0ca092a30f6ecf69c7f8af5a9612
• Lista zmian dla wydania
• immudex-testing (Debian testing, 13 Trixie) •
64-bit:https://ftp.morketsmerke.org/immudex/testing/iso/1.0.5/immudex-testing64.iso
CRC: 820814467SHA1: 458a7faf88608cdce99f44c39af94233d8c6e478
32-bit:https://ftp.morketsmerke.org/immudex/testing/iso/1.0.5/immudex-testing32.iso
CRC: 3072989609SHA1: e59a08ff192f0ca092a30f6ecf69c7f8af5a9612
• Lista zmian dla wydania
• immudex-lhe (oldoldstable, Debian 10 Buster) •
32-bit:https://ftp.morketsmerke.org/immudex/lhe/iso/0.0.0/immudex-lhe32.iso
CRC: 3072989609SHA1: e59a08ff192f0ca092a30f6ecf69c7f8af5a9612
• Lista zmian dla wydania
+

+ Domyślnym użytkownikiem jest user, dostęp to niego + uzyskujemy za pomocą hasła user1. Możemy również skorzystać z + konta superużytkownika root z hasłem toor. +

+

+ Dokumentacja projektu: +

+

+ Dokumentacja systemu znajduje się pod tym linkiem: Dokumentacja immudex. +

+

+ Zastrzeżenia i uznanie autorstwa: +

+

+ immudex is not affiliated with Debian. Debian is a registered trademark + owned by Software in the Public Interest, Inc. +

+

+ Rss icons created by Freepik - Flaticon +

+ +
+ + diff --git a/articles/immudex/index.html b/articles/immudex/index.html new file mode 100755 index 0000000..ce9c601 --- /dev/null +++ b/articles/immudex/index.html @@ -0,0 +1,42 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+
+ +
+ +
+ + + + + diff --git a/articles/immudex/ingerencja_w_obraz_immudex_-_przewiniecie.html b/articles/immudex/ingerencja_w_obraz_immudex_-_przewiniecie.html new file mode 100755 index 0000000..3b58c06 --- /dev/null +++ b/articles/immudex/ingerencja_w_obraz_immudex_-_przewiniecie.html @@ -0,0 +1,135 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Ingerencja w obraz immudex - przewinięcie

+

+ Ze względu na specyfikę systemu immudex, może zajść potrzeba ingerencji + w jego obraz. Możemy dodać swoje ulubione oprogramowanie lub sterowniki + niezbędne do wygodnego korzystania z tej dystrybucji na naszym + komputerze. Przewinięcie głownie skupia się na ingerencji w archiwum + squashfs, które zawiera rootfs dystrybucji. +

+

+ + Pro tip! Przewinięcia najlepiej dokonywać na systemie uruchomionym z + pamięci USB lub płyty. Ponieważ zamontowane archiwum squashfs + nadal będzie zajmować miejsce na partycji mimo jego usunięcia, i nowe + archiwum może się nie skopiować ze względu na mała ilość miejsca na + dysku. Głównie będzie to mieć miejsce jeśli dotychczasowe archiwum + waży ponad 2GB. +

+

+ Obsługa tego formatu plików, wymaga zainstalowanego w systemie + oprogramowania. Wersje immudex są w nie domyślnie wyposażone. + Więc czynności sprowadzają się głównie do wybrania dogodnego miejsca + (może być potrzebna większa ilość wolnego miejsca na dysku) i operacja + kilkoma poleceniami. Aby rozpocząć wprowadzanie zmian do obrazu musimy + go najpoczątku wypakować. Do wypakowania posłużymy się poleceniem + unsquashfs. +

+
+$ sudo unsquashfs -d chroot /run/live/medium/live/filesystem.squashfs
+
+

+ Opcja -d służy wskazaniu katalogu, do + którego należy wypakować rootfs, jeśli folder nie istnieje to + zostanie utworzony. Następnie wskazujemy ścieżkę do archiwum + squashfs. Jeśli z jakiegoś powodu musimy nadpisać zawartość + istniejącego już katalogu, należy dodać opcję -f. +

+

+ Aby rozpocząć wprowadzanie zmian do rootfs, należy zmienić + katalog główny obecnie uruchomionej powłoki. Tutaj warto się zatrzymać + i zastanować na tym jakie zmiany chcemy wprowadzić. Jesli jest to + dodanie jakiś pliku, instalacja dodatkowych pakietów. To zwykłe + przełączenie katalogu głównego powinno wystarczyć. Jednak jeśli w grę + wchodzi instalacja sterownika lub kompilacja nie których pakietów to + może być wymagana obecność interfejsów systemowych takich jak + /dev, /proc i tak dalej. Dlatego trzeba je + podmotować przed przełączeniem katalogu głównego. +

+
+/* w niektórych specyficznych przypadkach
+$ for i in /dev /dev/pts /proc /sys /run; do sudo mount -B chroot${i}; done
+*/
+$ sudo chroot chroot/ bash
+
+

+ Po zmianie katalogu głównego możemy dokonywać dowolnych zmian. Gdy + zakończymy już ich wprowadzanie, warto pamiętać o kilku czynnościach: +

+
    +
  1. Utrzymaniu porządku w pakietach, za pomocą podpoleceń narzędzia + apt-get: clean, autoremove oraz + autoclean (głownie chodzi o pozbycie się pobranych pakietów + oraz tych już nie potrzebnych).
  2. +
  3. Usunięciu wszystkich plików roboczych (tych, które nie są już + potrzebne).
  4. +
  5. Usunięcie historii wprowadzanych poleceń. Jeśli przewaliśmy + działanie powłoki, to historia trafiła już do pliku, więc pomoć nam + może polecenie echo > ~/.bash_history. + Gdy sesja powłoki jeszcze działa możemy wydać polecenie + history -c.
  6. +
+

+ Oczywiście to tylko rady. Jeśli nie chcemy się do nich stosować nie + musimy. Ja stosuje je podczas wydawania nowych wersji immudex + (a przynajmnie staram się stosować). +

+

+ Jeśli skończyliśmy wprowadzanie zmian, możemy spakować rootfs + do nowego pliku archiwum. Do tej czynności wykorzystamy polecenie + mksquashfs. +

+
+$ sudo mksquashfs chroot filesystem.squashfs -e boot
+
+

+ + Tutaj istotne jest aby archwium squashfs nazwywało się tak + jak podano na przykładzie filesystem.squashfs. + Program odpowiedzialny za obsługę sesji LiveCD live-boot + domyślnie szuka archiwym squashfs o takiej nazwie. Inne nazwy + nie będą działać. +

+

+ Pierwszym argumentem jest wskazanie katalogu zawierającego + rootfs, następnie podajemy nazwę archiwum. Podczas budowania + immudex wykorzystuje opcję -e, + aby program nie pakował plików jądra (one są potrzebne na zewnątrz). +

+

+ Tak przygotowane archiwum może skopiować na dysk. Pamiętajmy jednak + o tym, że jeśli instalowane były dodatkowe modułu jądra + (np. sterowniki), aktualizowane było jądro lub instalacje pakietów + mogły wpłynąć na obraz ram dysku (initrd.img) to należy + również skopiować pliki jądra. Jeśli nie mamy pewności czy nasze + czynności miały wpływ na te składniki systemu to najbezpieczniej jest + je wydobyć z rootfs i skopiować pod odpowiednimi nazwami + (vmlinuz - dla jądra oraz initrd - dla ram dysku). +

+

+ ~xf0r3m +

+ +
+ + diff --git a/articles/immudex/instalacja_sterownika_dla_Nvidia_GF_920M.html b/articles/immudex/instalacja_sterownika_dla_Nvidia_GF_920M.html new file mode 100644 index 0000000..d991a03 --- /dev/null +++ b/articles/immudex/instalacja_sterownika_dla_Nvidia_GF_920M.html @@ -0,0 +1,214 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Instalacja sterownika dla Nvidia GeForce 920M

+

+ Jakiś czas temu musiałem zoptymalizować mój "zestaw", wymieniłem + komputer gamingowy, na dwa latopy. Jeden z nich posiada grafikę Nvidia + GeForce 920M, chciałem aby na tym sprzęcie rezydował immudex + w wersji testing. I tutaj zaczęły się schody, bowiem + obecny (dostępny w repozytorium Debian Bookworm) sterownik Nvidii w + wersji 528, nie posiada wsparcia dla tej karty. Więc wpadłem na + pomysł zainstalowania wersji 470 z Debian Bullseye. Poniżej znajduje + się opis oraz to co udało mi się uzyskać. +

+

+ + Uwaga! Wykonywane tutaj czynności wykorzystują + oprogramowanie własnościowe, jeśli jest to sprzeczne z + Twoim zasadami etycznymi zrezyguj z dalszego wykonywania poniższych + czynności. +

+

+ + Pro Tip! Najlepiej te czynności wykonywać na komputerze uruchomionym + z pamięci USB. +

+

+ Sterowniki do obrazu immudex, możemy dodać na zasadzie + "przewinięcia". + Więc czynności rozpoczniemy od sprawdzenia dostępności takich poleceń + jak unsquashfs oraz mksquashfs. W + najnowszych wersjach immudex + lub immudex-testing powinny byś one zainstalowane. W celach + porządkowych, utworzymy sobie katalog. +

+
+$ mkdir 0.1.7
+
+

+ Następnie na wypadek niepowodzenia naszych zmian, pobierzemy z partycji + obecnie używane archiwum .squashfs. +

+
+$ cp /run/live/medium/live/filesystem.squashfs filesystem.squashfs_original
+
+

+ Teraz możemy przejść do katalogu i rozpakować nasze archiwum. +

+
+$ cd 0.1.7
+$ sudo unsquashfs -f -d tmp /run/live/medium/live/filesystem.squashfs
+
+

+ Po rozpakowaniu archiwum, katalog tmp będzie zawierać + rootfs najnowszego obrazu immudex. Aby był on + pełnoprawnym obrazem systemu brakuje mu plików jądra, które + nie wchodzi w skład archiwum (bo i po co, pliki jądra muszą znajdować + się na zewnatrz archiwum, aby system mógł się uruchomić, archiwum + zawierające initrd oraz jądro, marnuje po prostu miejsce). + Z tego względu, że brakuje w ogóle kilku plików, nie możemy sobie od + tak ich skopiować. Musimy posłużyć się narzędziem + apt oraz trochę je oszukać, aby przywrócić te pliki. + Wszystkie czynności przedstawione na poniższym przykładzie wykonywane + są w środowisku zmienionego katalogu głównego (chroot). + Aby moduły jądra zostały poprawnie zbudowane do środowiska zmienionego + katalogu głównego potrzebne jest przekazanie kilku systemowych + interfejsów: /dev /dev/pts /proc /run /sys. +

+

+ + Polecenie apt install może zawieści się. Wówczas należy + przerwać operację i odświerzyć połączenie sieciowe poprzez komunikację + z serwerem DHCP (polecenie dhclient). +

+
+0.1.7$ for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i tmp${i}; done
+0.1.7$ sudo chroot tmp/ bash
+(chroot)/$ mkdir boot
+(chroot)/$ apt purge linux-image* -y
+(chroot)/$ apt install linux-image-amd64
+
+

+ Jeśli nie ma katalogu /boot w katalogu głównym, polecenie + apt, zwróci błąd i zakończy działanie. + Aby jednak wykonał on zażądane przez nas czynności wystarczy mu sama + obecność tego katalogu (katalog może być pusty). Polecenie usuwania + pakietu, może zwrócić monit o tym, że usuwamy działające obecnie jądro + i czy chcemy przerwać tę czynność. Z pewnością 99% możemy kliknąć + Nie, + osobiście kiedyś udało mi się zawieści działanie jednego z serwerów + przeprowadzając tę czynność, mimo wykonania jej środowisku zmienionego + katalogu głównego. Jeśli naszym system jest immudex, to mamy + 100%. +

+

+ Po odzyskaniu plików jądra, wypadałoby zainstalować pakiety + wspomagające budowanie jego modułów (chociaż, pakiet + build-essential, jest zainstalowany w immudex). +

+
+(chroot)/$ apt install build-essential dkms linux-headers-$(uname -r)
+
+

+ Po zainstalowaniu tych pakietów, możemy przejść do instalacji + właściwego sterownika. W tym celu utworzymy sobie plik zawierający + lokalizację źródeł repozytorium dla wersji Debian Bullseye, ale tylko + do repozytoriów contrib oraz non-free (oczywiście, + można użyć bardziej odpowiedniej nazyw niż nvidia.list, jednak + dla mnie te repozytoria będą służyć jedynie do tego). +

+
+(chroot)/$ cp /etc/apt/sources.list /etc/apt/sources.list.d/nvidia.list
+(chroot)/$ sed -e 's/bookworm/bullseye/g' -e 's/main/contrib non-free/g' -i /etc/apt/sources.list.d/nvidia.list
+(chroot)/$ apt update
+(chroot)/$ apt install nvidia-detect
+(chroot)/$ nvidia-detect
+(chroot)/$ apt install nvidia-driver
+
+

+ Polecenie nvidia-detect zwróci + informacje o tym że pasującym sterownikiem jest sterownik w wersji 470. + A nie jak w przypadku Debian 12, pakiet sterowników dla układów Nvidia + Tesla, który nie działa z tym układem. + Powykonaniu tych rootfs jest gotowy do pakowania. Jest jeden + mały szczegół. Otóż w tej instalacji zabrakło instalacji pakietu + nvidia-settings. Nie został on zainstalowany przez niespełnione + zależności. Ważna dla tego pakietu jest biblioteka + libxnvctrl0, powinna być ona zgodna z wersją + instalowanego sterownika Nvidii, jednak ze względu na to, że + zostawiliśmy repozytorium main dla Debian Bookworm, nie będzie + między nimi zgodności. Zatem, co trzeba zrobić? Otóż należy usunąć + obecnie zainstalowany wersję tej biblioteki wraz z pakietami, które jej + wymagają, są to dwa pakiety XFCE. Nie należy usuwać pakietów, już + niepotrzebnych, ponieważ za chwilę będą one znów potrzebne. Zapisujemy + sobie te pakiety (prawdopodbnie będą to: + xfce4-goodies oraz xfce4-sensors-plugin), ponieważ + będziemy je instalować ponownie, kiedy uzyskamy odpowiednią wersję + wspomnianej biblioteki. Po usunięciu pakietów, tymczasowo zmieniamy + wersję dystrybucji, z Bookworm na Bullseye (dla repozytorium + main). Instalujemy naszą + bibiotekę, następnie wracamy z powrotem do wersji Bookworm dla + repozytrium głównego. Teraz możemy zainstalować ponownie te dwa pakiety + oraz pakiet nvidia-settings. Poniżej przedstawiłem wyżej + wymieniony opis w postaci poleceń. +

+
+(chroot)/$ sed -i 's/Bookworm/Bullseye/g' /etc/apt/sources.list;
+(chroot)/$ apt remove libxnvctrl0 -y
+(chroot)/$ apt update
+(chroot)/$ apt install libxnvctrl0 -y
+(chroot)/$ sed -i 's/Bullseye/Bookworm/g' /etc/apt/sources.list;
+(chroot)/$ apt install xfce4-goodies xfce4-sensors-plugin nvidia-settings
+
+

+ Teraz rootfs jest gotowy do pakowania. Zanim jednak do tego + przystąpimy, warto posprzątać po sobie, aby nie zaśmiecać niepotrzebnie + obrazu. Następnie musimy odmontować zamontowane interfejsy systemowe. + Do pakowania wykorzystamy polecenie mksquashfs. +

+
+(chroot)/$ apt-get clean
+(chroot)/$ apt-get autoclean
+(chroot)/$ apt-get autoremove
+(chroot)/$ history -c
+(chroot)/$ Ctrl+d
+0.1.7$ for i in /dev/pts /dev /proc /run /sys; do sudo umount tmp${i}; done
+0.1.7$ sudo mksquashfs tmp/ filesystem.squashfs -e boot
+
+

+ Ze względu na to iż sterowniki do moduły jądra, które mogą ładowane + w niekoniecznie znanym nam momencie, warto było by przenieść na dysk + docelowy także obraz jądra oraz obraz initrd. +

+
+0.1.7$ sudo cp tmp/boot/vmlinuz-6.1.0-7-amd64 vmlinuz
+0.1.7$ sduo cp tmp/boot/initrd.img-6.1.0-7-amd64 initrd
+
+

+ Te trzy pliki kopiujemy na dysk. Po skopiowaniu możemy uruchomić + system i sprawdzić czy wszytko jest działa. Zainstalowany sterownik + z Debian 11, działa prawidłowo na Debian 12. Po wykonaniu dodatkowych + czynności w systemie obecny jest również program nvidia-settings, + jednak dla tej karty nie posiada on zbyt wielu opcji lub + najzwyczajniej nie działa. Mimo to jeśli posiadamy komputer z tym + układem, to warto wykonać te czynności, aby nie doświadczać wielu + irytujących błędów substytutu sterownika, takich jak screen tearing + czy jeszcze bardziej denerwującego restartu serwera X11 podczas + odblokowywania sesji po wyłączeniu ekranu ze względu na brak aktywności. +

+

+ ~xf0r3m +

+ +
+ + diff --git a/articles/immudex/instalacja_systemu.html b/articles/immudex/instalacja_systemu.html new file mode 100755 index 0000000..2bc5c1c --- /dev/null +++ b/articles/immudex/instalacja_systemu.html @@ -0,0 +1,94 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Instalacja immudex

+

+ Mimo tego, iż immudex jest wydawany jako Live CD, to + można go z powodzeniem zainstalować na dysku. Nawet jest to zalecane + dla tych, którzy chcą korzystać z niego w codziennym użytku. Obecnie + dostępne są dwa rodzaje instalacji: +

+

Instalacja obrazu LiveCD

+

+ Ten rodzaj instalacji świetnie sprawdzi się w przypadku cienkich + klientów oraz uruchamiania komputerów z sieci. Polega on na załadowaniu + na dysk obrazu płyty tak jak byśmy wgrywali go na pamięć USB. +

+
+$ curl https://ftp.morketsmerke.org/immudex/testing/iso/0.1.9/immudex-testing64.iso | sudo dd bs=1M of=/dev/sdX
+
+

+ Warto pamiętać o tym, że przy tego typu instalacjach reszta dysku + staje się bezużytczna. +

+

Instalacja immudex na dysku

+

+ Jeśli chcemy na przykład wykorzystać immudex na laptopie, + gdzie potrzebujemy miejsca na dane. To dobry rozwiązaniem jest + instalacja systemu na dysku. Immudex póki co alokuje na pliki + systemowe 4 GB miejsca na dysku. Reszta pozostaje do naszej + dyspozycji. +

+

+ Instalacji na dysku należy dokonać poprzez skrypt + immudex_install, skrypt zapyta nas o docelowy + dysk, jeśli będą więcej niż dwa. Przy uruchomieniu komputera z pamięci + USB jest to niemal pewne. Wybieramy konkretny dysk z listy i już, + system instaluje się. +

+
+xf0r3m@immudex:~$ immudex_install 
+This script will install immudex on first disk on your machine.
+It could be destructive for data placed on this disk
+Are you sure that you want contiune? (y/n): y
+Installation immudex in BIOS mode ... 1) vda
+2) vdb
+#? 1
+
+

+ Instalator sam na podstawie dostępności zmiennych oprogramowania + układowego UEFI ustali czy komputer działa w trybie BIOS czy UEFI + (w przypadku uruchomienia komputera w trybie BIOS, zmienne UEFI, + mimo że ten tryb jest dostępny, są niedostępne), następnie dobierze + odpowiedni zestaw poleceń. Nie będę przytaczać całego procesu + instalacji, ponieważ jest on rozpisany w narzędziu + immudex_install, które można sobie przeanalizować pod tym + adresem: https://github.com/xf0r3m/immudex/blob/main/tools/010/immudex_install. +

+

+ Inną kwestią pozostaje odmienność wersji UEFI. Obecnie mamy doczynienia + z 32-bitowym oraz 64-bitowym oprogramowanie układowym tego typu. + Skrypt immudex-install wspiera instalację na maszynach z + 32-bitowym UEFI, jednak wymaga to specjalnego dysku USB. Na szczeście + istnieje narzędzie create_media, który posiada + specjalnego wgrania obrazu z immudex na pamięć USB, aby była + możliwość uruchomienia go na tych specyficznych komputerach. +

+
+$ create_media --i386-efi /dev/sdb ~/Pobrane/immudex-testing64.iso
+
+

+ ~xf0r3m +

+ +
+ + diff --git a/articles/immudex/koncepcje_immudex.html b/articles/immudex/koncepcje_immudex.html new file mode 100755 index 0000000..f7048e5 --- /dev/null +++ b/articles/immudex/koncepcje_immudex.html @@ -0,0 +1,131 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Koncepcje immudex

+

+ Wiekszość dystrybucji Linuksa powstało, aby służyć ludziom. Dać im + możliwość panowania na posiadanym sprzętem. Wiele specyficznych + dystrybucji posiada kilka zasad jakimi kieruje się podczas jej + tworzenia i rozwoju, immudex nie jest wyjątkiem. W tym + materiale zostało zebranych 7 zasad, które definiują tę dystrybucję. +

+

1. Niezmienność

+

+ Podstawową cechą tej dystrybucji jest niezmienność + w najprostrzej, najczystszej postacji. Wiem, że uruchamianie systemu + jako Live CD może nie być postrzegne jako niezmienne. Dla + mnie niezmienne oznacza tyle, że jeśli uruchomisz system + ponownie to powróci on do swojej pierwotnej postaci. Nabrudzisz, + nagrzebiesz, nie ważne. Reboot i masz już czysty system z + powrotem. +

+

2. Separacja

+

+ Jeśli chcielibyśmy zainfektować jakąś dystrybucję szkodliwym + oprogramowniem (nie, oprogramowanie własnościowe się nie liczy), to + trzeba było by tego naprawdę chcieć. Nie mmiej jednak tworząc + immudex mam świadomość, że największym zagrożeniem dlatego + systemu pozostaje przeglądarka internetowa. Obecnie przeglądarki + stały się podsystemami dla systemów operacyjnych, więc warto było + by im ukrócić trochę uprawnienia. Dlatego też domyślnie przeglądarka + w immudex uruchamiana jest przez sandboxer + firejail wraz z własną emulacją stosu TCP/IP. +

+

+ Innym rodzajem speracji jest załączony firewall + ufw z domyślną polityką dla połączeń przychodzących + ustawioną na deny. +

+

3. Szyfrowanie danych

+

+ Immudex zachęca poprzez wsparcie autorskimi rozwiązaniami + korzystanie z szyfrowanych partycji. Jeśli taka partycja pozostanie + zamknięta, to mimo uzyskania dostępu do komputera dane na nim + przechowywane pozostaną bezpieczne. Punkty montowania nie są osiągalne + również z przeglądarki uruchomionej przez firejail. +

+

4. Użyteczność

+

+ Mimo specyfiki systemu dalej pozostaje on użyteczny jak każda inna + dystrybuja skierowana na komputery biurkowe. Posiada ona intuicyjne + środowisko graficzne XFCE, oprgramowanie do odtwarzania multimediów, + pakiet biurowy, normalną przeglądarkę internetową z + zainstalowanym blokerem reklam oraz innych nachalnych elementów + stron internetowych. Dystrybucja się również zapewnić rozwiązania + związane z ochroną prywatności takie jak dedykowana dla niej instancja + meta-silnika wyszukiwarek internetowych searxng z dodanym + silnikiem również do przeglądarki (dodatek idx-search) oraz + oprogramowanie openvpn. +

+

5. Elastyczność

+

+ Dystrybucja stara się być jak najbardziej elastyczna i nie narzucać + nikomu niczego. Nie musimy stoswać się do żadnej z wienionych tutaj + zasad, możemy wprowadzać własne rozwiązania. Również wiele wyżej + wymienionych koncepcji zostało zaimplementowanych w taki sposób, że + są łatwe do ominięcia. Możemy immudex dowolnie + przebudowywać i zmieniać. W pewnym momencie dojdziemy do wniosku, że + ona tak naprawdę nie istnieje. Jest tylko Debian, odpowiednio + skonfigurowany. +

+

6. Bezkosztowość

+

+ Immudex utrzymywany jest na publicznie dostępnych serwisach, + takich jak sourceforge.net czy github.com. Istnienie + oficjalnego mirroru ftp.morketsmerke.org jest tylko i + wyłącznie fanberią twórcy. Sam Debian jest o tyle ciekawą dystrybucją, + że jego obrazy mogą być tworzone na naprawdę niskobudżetowym sprzęcie, + pokroju chrombooka (tylko trzeba się w dysk zaopatrzyć). + Nie potrzeba wydajnych serwerów, wystarczy zwykły laptop, połączenie + z internetem, zainstalowany Debian oraz trochę cierpliwości. + Immudex również jest dystrybucją, która powinna zadziałać + na każdym sprzęcie. +

+

7. Wolność

+

+ Wolne oprogramowanie (free software) nie daje pełni wolności. + Aby moć się nią cieszyć, należy dać użytkownikom prawo do wyboru. + Immudex nie neguje istoty wolności oprgramowania. Nie chce + skazywać użytkowników na dyskonfort związany z niemożnością + wykorzystania sprzętu, na który wydali ciężko zarobione pieniądze lub + na wykluczenie korzystania ze współczesnych technologi zachowując + przy tym równowagę i posiadając z tyłu głowy wszystkie zagrożenia jakie + może ze sobą nieść. Domyślnie i oficjalnie immudex zawsze + będzie posiadał + tylko i wyłącznie wolne oprogramowania, jednak nigdy nie będzie czynnem + niemile widzianym uzupełnienie obrazu o brakujący firmware czy inne + oprogramowanie własnościowe. Na tym własnie polega prawdziwa wolność, + na daniu możliwości wyboru. +

+

+ Immudex został i jest tworzony głównie z myślą o mnie, nie + każdemu moje rozwiązania mogą pasować. Nie musi z niej korzystać, + dostępnych jest tyle wspaniałych dystrybucji, że napewno wybierze coś + dla siebie. Zajmowanie się tą dystrybucją, traktuję jako dobrą zabawę + więc wiele rzeczy oficjalnie może nie działać jak powino. Nie ma + tutaj gwarancji przydatności ani poprawności działania. +

+ ~xf0r3m +

+ +
+ + diff --git a/articles/immudex/lista_oprogramowania_immudex.html b/articles/immudex/lista_oprogramowania_immudex.html new file mode 100644 index 0000000..1e6ea0b --- /dev/null +++ b/articles/immudex/lista_oprogramowania_immudex.html @@ -0,0 +1,520 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+
+ +
+ +

List pakietów oprogramowania

+

Stan pakietów i aktualizacji na: pią, 28 lip 2023, 11:03:51 CEST

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa pakietustabletestingLHE*
alsa-utils1.2.8-11.2.9-11.1.8-2
base-files12.4+deb12u11310.3+deb10u13
bash-completion1:2.11-61:2.11-71:2.8-6
bridge-utils1.7.1-11.7.1-1N/I
chrony4.3-2+deb12u14.3-43.4-4+deb10u2
cifs-utils2:7.0-22:7.0-22:6.8-2+deb10u1
cmusN/IN/I2.7.1+git20160225-2+b2
conky1.18.3-11.19.2-2N/I
cryptsetup2:2.6.1-4~deb12u12:2.6.1-42:2.1.0-5+deb10u2
curl7.88.1-10+deb12u17.88.1-107.64.0-4+deb10u6
debootstrap1.0.128+nmu21.0.128+nmu5N/I
desktop-base12.0.6+nmu1~deb12u112.0.6+nmu1N/I
dnsutilsN/I1:9.18.16-11:9.11.5.P4+dfsg-5.1+deb10u9
dosfstools4.2-14.2-1N/I
efibootmgr17-217-2N/I
etherwake1.09-4+b11.09-4+b11.09-4+b1
extlinux3:6.04~git20190206.bf6db5b4+dfsg1-3+b13:6.04~git20190206.bf6db5b4+dfsg1-3+b13:6.04~git20190206.bf6db5b4+dfsg1-1
fehN/IN/I3.1.3-1
ffmpeg7:5.1.3-17:5.1.3-27:4.1.11-0+deb10u1
figlet2.2.5-3+b12.2.5-3+b12.2.5-3
firejail0.9.72-20.9.72-2N/I
gimp2.10.34-12.10.34-1N/I
git1:2.39.2-1.11:2.40.1-11:2.20.1-2+deb10u8
grub-efi-amd642.06-132.06-13N/I
grub-efi-amd64-bin2.06-132.06-13N/I
grub-pc-bin2.06-132.06-13N/I
gvfs-backends1.50.3-11.50.4-3N/I
irssi1.4.3-21.4.4-11.2.0-2+deb10u1
isolinux3:6.04~git20190206.bf6db5b4+dfsg1-33:6.04~git20190206.bf6db5b4+dfsg1-3N/I
iwdN/IN/I0.14-2
libvirt-clients9.0.0-49.5.0-1N/I
libvirt-daemon9.0.0-49.5.0-1N/I
libvirt-daemon-system9.0.0-49.5.0-1N/I
linux-image-686-paeN/IN/I4.19+105+deb10u19
linux-image-amd646.1.38-16.3.7-1N/I
live-boot1:202301311:202301311:20190614
lsof4.95.0-14.95.0-14.91+dfsg-1
lynx2.9.0dev.12-12.9.0dev.12-1N/I
mpv0.35.1-40.35.1-4+b10.29.1-1+deb10u1
mtools4.0.33-1+really4.0.32-14.0.33-1+really4.0.32-1N/I
mutt2.2.9-1+b12.2.9-1+b11.10.1-2.1+deb10u6
netselect-apt0.3.ds1-30.10.3.ds1-30.10.3.ds1-28
nfs-common1:2.6.2-41:2.6.3-11:1.3.4-2.5+deb10u1
nmap7.93+dfsg1-17.93+dfsg1-17.70+dfsg1-6+deb10u2
openvpn2.6.3-1+deb12u12.6.3-22.4.7-1+deb10u1
parted3.5-33.6-33.2-25
pass1.7.4-61.7.4-6N/I
picom9.1-110.2-1N/I
pulseaudio16.1+dfsg1-2+b116.1+dfsg1-2+b112.2-4+deb10u1
python3-pip23.0.1+dfsg-123.2+dfsg-118.1-5
python3-venv3.11.2-1+b13.11.4-53.7.3-1
qemu-system-x861:7.2+dfsg-7+deb12u11:8.0.2+dfsg-3N/I
qmmp1.6.2-1+b11.6.2-1+b1N/I
ranger1.9.3-51.9.3-51.9.2-4
ratpoisonN/IN/I1.4.9-1
redshift1.12-4.21.12-4.21.12-2
remmina1.4.29+dfsg-11.4.31+dfsg-2N/I
rsync3.2.7-13.2.7-13.1.3-6
squashfs-tools1:4.5.1-11:4.6.1-1N/I
sudo1.9.13p3-1+deb12u11.9.14p2-11.8.27-1+deb10u5
syslinux-efi3:6.04~git20190206.bf6db5b4+dfsg1-33:6.04~git20190206.bf6db5b4+dfsg1-3N/I
systemd-sysv252.12-1~deb12u1253.5-1241-7~deb10u10
tmux3.3a-33.3a-42.8-3+deb10u1
ufw0.36.2-10.36.2-10.36-1
vimN/IN/I2:8.1.0875-5+deb10u5
vim-gtk32:9.0.1378-22:9.0.1672-1N/I
virtinst1:4.1.0-21:4.1.0-2N/I
virt-manager1:4.1.0-21:4.1.0-2N/I
vlc3.0.18-23.0.18-3N/I
wakeonlan0.41-12.10.41-12.10.41-12
wget1.21.3-1+b21.21.3-1+b21.20.1-1.1
wireless-toolsN/IN/I30~pre9-13
xdmN/IN/I1:1.1.11-3
xfce44.184.18N/I
xinit1.4.0-11.4.0-11.4.0-1
xorriso1.5.4-41.5.4-4N/I
xserver-xorg1:7.7+231:7.7+231:7.7+19
xserver-xorg-core2:21.1.7-32:21.1.7-32:1.20.4-1+deb10u9
xterm379-1384-1344-1+deb10u2
youtube-dl2021.12.17-2N/I2019.01.17-1.1
+

+* - Low Hardware Edition, Debian 10 Buster, 32-bit
+N/I - (ang. Not installed) - nie zainstalowano
+ - zainstalowana wersja
+ - wersja gotowa do instalacji (aktualizacja)
+

+ +
+ + + + diff --git a/articles/immudex/odtworzenie_srodowiska_budowania_immudex_z_LiveCD.html b/articles/immudex/odtworzenie_srodowiska_budowania_immudex_z_LiveCD.html new file mode 100755 index 0000000..970cc36 --- /dev/null +++ b/articles/immudex/odtworzenie_srodowiska_budowania_immudex_z_LiveCD.html @@ -0,0 +1,202 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Odtworzenie środowiska budowania immudex z LiveCD

+

+ Przygotowując przez ten czas kolejne wersje immudex natrafiłem + na dość spory problem logistyczny. Otóż środowiska budowania (katalog + z rootfs, plikami LiveCD itp.) potrafił ważyć ok. 10 + GB. Co powodowało problemy z archiwizacją oraz z ewentualnym + przenoszeniem tych danych. Zastanawiając się nad tym chwilę doszedłem do + wniosku, iż obrazy .iso muszą zawierać większość plików + zawartych w środowisku. Zatem wydaje mi się, że można je skopiować i + ustrukturyzować, aby obecność środowiska budowania przestała mieć + znaczenie. +

+

+ + Ten materiał jest opisem czynności wykonywanych w skrypcie + opublikowanym na repozytorium projektu: immudex-testing, + pod tym adresem: https://github.com/xf0r3m/immudex-testing/blob/main/immudex_rebuildenv, + więc przykłady nie będą poleceniami, ale przeredagowanym fragmentami + ze skryptu. +

+

+ Immudex posiada dwie wersje oficjalne, jedną nieoficjalną, + która nie jest publicznie dostępna. Dodatkowo obsługuje on dwie + architektury: amd64 oraz i386. Dlatego też + najważnie jeszcze jest aby wydobyć jak najwięcej informacji z jej jak + najmniejszej ilości. W tym przypadku do dyspozycji posiadamy plik + z obrazem lub link do lokalizacji sieciowej, gdzie możemy go pobrać. + Na podstawie samej nazwy obrazu płyty, możemy dowiedzieć się kilku + rzeczy. Czy mamy doczynienia z wersją stabliną, testową czy nieoficjalną + oraz dla jakiej architektury przygotowany został system. Na podstawie + tych informacji oraz informacji z instrukcji budowania immudex + możemy utworzyć strukturę katalogową, która pomoże nam utrzymać porządek + oraz umożliwi automatyzację procesu tworzenia nowego obrazu. +

+
+isoPath=$1;
+if echo $isoPath | grep -q 'http'; then wget $isoPath; fi
+
+filename=$(basename $isoPath);
+if echo $filename | grep -q 'immudex-testing'; then
+  branch="immudex-testing";
+  branchAltName="testing";
+elif echo $filename | grep -q 'immudex-niko'; then
+  branch="immudex";
+  branchAltName="niko"
+else
+  branch="immudex";
+  branchAltName="stable";
+fi
+
+if echo $filename | grep -q '64'; then
+  arch="64";
+else
+  arch="32";
+fi
+
+mkdir -pv build/${branchAltName}/${branch}/${arch}/{chroot,staging,tmp};
+
+

+ Posiadając już strukturę katalogów możemy określić "katalog główny" dla + naszych czynności. Wykonywane przez nas czynności nie będą + opuszczać obszaru tego katalogu. +

+
+rootPath="build/${branchAltName}";
+
+

+ Następną czynnością, jaką możemy wykonąć jest pobranie dla odpowiedniej + wersji immudex, skryptu odpowiedzialnego za budowanie obrazu + płyty oraz nadanie mu odpowiednich uprawnień. +

+
+wget https://github.com/xf0r3m/${branch}/raw/main/immudex_build -O ${rootPath}/immudex_build
+chmod +x ${rootPath}/immudex_build;
+
+

+ Teraz możemy przjść już to skopiowania danych z płyty. +

+
+mkdir -v /tmp/iso;
+sudo mount -v $isoPath /tmp/iso;
+sudo cp -rvv /tmp/iso/* ${rootPath}/${branch}/${arch}/staging;
+sudo chown -Rv ${USER}:${USER} ${rootPath}/${branch}/${arch}/staging;
+sudo umount -v /tmp/iso;
+sudo rmdir -v /tmp/iso;
+
+

+ Dla utrzymania porządku w systemie, wypadało by utworzyć punkt + montowania dla obrazu płyty, z którego będziemy kopiować dane. Następnie + płytę należy zamontować. Jeśli nie przyglądaliśmy się za bardzo + poleceniu tworzenia struktury katalogowej dla środowiska, to każde + środowisko budowania, dla konkretnej architektury + składa się z trzech katalogów. W katalogu + staging znajduje się cała zawartość + obrazu płyty i do tego katalogu będzie ona kopiowana. Następnie + nadawane są odpowiednie prawa własnosci dla skopiowanych danych. + Na koniec obraz płyty jest odłączany od systemu a punkt montowania + usuwany. +

+

+ W tym momencie na trafiamy na pierwszy problem, otóż nie wszystkie + pliki znajdują się na obrazie. Taki plikiem jest plik konfiguracji + GRUB-a, dla samodzielnego pliku wykonywalnego programu rozruchowego. + Może to brzmi skomplikowanie, ale ta czynność jest opcjonalna, ponieważ + ten plik pozostaje bez zmian (plik wykonywalny), dlatego nie potrzeba + tworzyć go na nowo, ale jeśli chcemy mieć pełne środowisko to można + wykonać te czynności. +

+
+cat > ${rootPath}/${branch}/${arch}/tmp/grub-standalone.cfg <<EOF
+search --set=root --file /DEBIAN
+set prefix=($root)/boot/grub
+configfile /boot/grub/grub.cfg
+EOF
+cat ${rootPath}/${branch}/${arch}/tmp/grub-standalone.cfg;
+
+

+ Po wykonaniu czynności przygotowawczych, nadszedł czas aby zabrać się + za rozpakowywanie archiwum squashfs. +

+
+sudo unsquashfs -f -d ${rootPath}/${branch}/${arch}/chroot ${rootPath}/${branch}/${arch}/staging/live/filesystem.squashfs;
+
+

+ Zawartość skopiowanego archiwum wypakowujemy do przygotowanego + wcześniej katalogu chroot. Po wypakowaniu ustalamy jakie + jądro według architektury należy zainstalować. Tu pojawia się drugi + problem, otóż archiwa squashfs pozbawione są plików jądra. + Więc aby nie rozpoczynąć każdego pliku wersji (skryptu aktualizacji) + od uzupełnienia jądra. Robi się to teraz, a jest realizowane za pomocą + małego skryptu uruchamianego w zmienionym na zawartość archiwum + squashfs katalogu domowym. Z tego też powodu musimy ustalić + wersję jądra, którą na podstawie architektury uzupełnimy środowisko + budowania. +

+
+if [ "$arch" = "64" ]; then
+  linuxKernel="linux-image-amd64";
+else
+  linuxKernel="linux-image-686-pae";
+fi
+
+cat > chrtcmd.sh <<EOF
+#!/bin/bash
+
+mkdir /boot;
+apt purge -y linux-image*;
+dhclient;
+apt update;
+apt install -y $linuxKernel;
+echo > /root/.bash_history;
+history -c;
+EOF
+  
+cat chrtcmd.sh;
+sudo mv -v chrtcmd.sh ${rootPath}/${branch}/${arch}/chroot;
+sudo chroot ${rootPath}/${branch}/${arch}/chroot bash chrtcmd.sh;
+sudo rm -v ${rootPath}/${branch}/${arch}/chroot/chrtcmd.sh;
+
+

+ Po określeniu jądra oraz napisaniu skryptu możemy przenieść go do + katalogu chroot a następnie + uruchomić. Skrypt usunie pozostałości po jądrze i zainstaluje je na + nowo. Tutaj podczas usuwania pakietów jądra może pojawić się monit + o tym, że usuwamy aktualnie używane jądro. Wydaje mi się, że możemy + śmiało kontynuować i nie powinno się nic stać, ponieważ zmieniliśmy + katalog główny. Jeśli używamy immudex to na pewno się nic + się nie stanie, ponieważ katalog /boot nawet nie istnieje. + Po zakończeniu działania skryptu, możemy go usunąć. +

+

+ W ten sposób udało sie nam odzyskać środowisko budowania + immudex z obrazu płyty. +

+

+ ~xf0r3m +

+ +
+ + diff --git a/articles/immudex/plik_wersji.html b/articles/immudex/plik_wersji.html new file mode 100755 index 0000000..ab89fed --- /dev/null +++ b/articles/immudex/plik_wersji.html @@ -0,0 +1,206 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Skrypt aktualizacji - plik wersji

+

+ Zmiany wprowadzane do immudex są rozpisywane w postaci skryptu. + Program ten nazwany jest plikiem wersji, ze względu na + to, że jego nazwą jest numer kolejnej wersji dystrybucji. Pliki wersji + są tworzone od momentu pierwszych poprawek, aż do daty wydania tej + wersji systemu. Plik wersji składa się z definicji funkcji, które + poźniej są wkorzystywane do utworzenia listy instrukcji, która + wprowadzi wszystkie zmiany przeznaczone dla tej wersji immudex. + Poniżej znajduje się przykładowy plik wersji + (testing, wersja 0.1.9). +

+
+#!/bin/bash
+
+function update_packages() {
+  dhclient; 
+  apt update;
+  apt upgrade -y;
+}
+
+function install_packages() {
+  apt install $@ -y;
+}
+
+function get_immudex_testing_project() {
+  if [ ! -d ~/immudex-testing ]; then
+    cd;
+    git clone https://github.com/xf0r3m/immudex-testing.git;
+  fi
+}
+
+function recreate_users() {
+  userdel -r user;
+  userdel -r xf0r3m;
+
+  useradd -m -s /bin/bash user;
+  if [ ! -f /home/user/.vimrc ]; then
+    cp -rvv /etc/skel/.??* /home/user;
+    cp -rvv /etc/skel/?* /home/user;
+    mkdir /home/user/.local;
+    tar -xvf ~/immudex-testing/files/017/local_user.tar -C /home/user/.local;
+    rm /home/user/.face;
+    cp /usr/share/images/desktop-base/immudex_xfce_greeter_logo.png /home/user/.face;
+    chown -R user:user /home/user;
+  fi
+  echo "user:user1" | chpasswd;
+
+  useradd -m -s /bin/bash xf0r3m;
+  if [ ! -f /home/xf0r3m/.vimrc ]; then
+    cp -rvv /etc/skel/.??* /home/xf0r3m;
+    cp -rvv /etc/skel/?* /home/xf0r3m;
+    mkdir /home/xf0r3m/.local;
+    tar -xvf ~/immudex-testing/files/017/local_xf0r3m.tar -C /home/xf0r3m/.local;
+    rm /home/xf0r3m/.face;
+    cp /usr/share/images/desktop-base/immudex_xfce_greeter_logo.png /home/xf0r3m/.face;
+    chown -R xf0r3m:xf0r3m /home/xf0r3m;
+  fi
+  echo "xf0r3m:xf0r3m1" | chpasswd;
+
+  usermod -aG libvirt,libvirt-qemu xf0r3m;
+  usermod -aG libvirt,libvirt-qemu user;
+}
+
+function tidy() {
+  apt-get clean;
+  apt-get clean;
+  apt-get autoremove -y;
+  apt-get autoclean;
+  rm -rf ~/immudex-testing;
+  echo > ~/.bash_history;
+  history -c   
+}
+
+function set_default_wallpaper() {
+  rm /usr/share/images/desktop-base/default;
+  ln -s /usr/share/images/desktop-base/$1 /usr/share/images/desktop-base/default;
+}
+
+function set_notifier_packages() {
+  cp -vv ~/immudex-testing/files/011/Notifier\ -\ packages.desktop /home/xf0r3m/.config/autostart;
+  chown xf0r3m:xf0r3m /home/xf0r3m/.config/autostart/Notifier\ -\ packages.desktop;
+}
+
+VERSION=$(echo $0 | cut -d "." -f 1);
+if [ ! "$VERSION" ]; then echo -e "\e[31mUpdate failed!\e[0m"; exit 1; fi;
+
+update_packages;
+install_packages gimp isolinux;
+
+get_immudex_testing_project;
+
+cp -vv ~/immudex-testing/images/${VERSION}/abandoned_hospital_bower.png /usr/share/images/desktop-base;
+
+sed -i 's/no_trespass_abandon.jpeg/abandoned_hospital_bower.png/' /etc/lightdm/lightdm-gtk-greeter.conf;
+
+rm /etc/apt/source.list;
+
+tidy;
+
+
+

+ Niektóre pliki wersji mogą być bardzo ubogie. Zawierać dwie trzy + instrukcje i to dzięki użyciu funkcji, w których zawarto typowe i + powtarzalne czynności wykowane podczas każdej aktualizacji, takie jak + aktualizacja zainstalowanego oprogramowania czy posprzątanie po sobie. + Po warunku określającym, czy aktualizacj w ogóle powiedzie się + if [ ! "$VERSION ];... rozpoczyna się + seria czynności definiujących tę wersję systemu. +

+

+ Uruchomienia tego pliku dokonuje się w środowisku zmienionego katalogu + głónego, po przez wywołanie powłoki BASH, podając ten plik jako + argument. Na przykład: +

+
+$ sudo chroot immudex-testing/64/chroot bash 019.sh
+
+

+ Przyglądając się temu strukturze tego skryptu, od razu rzuca się w oczy + potencjał optymalizacyjny. Na początku musimy sobie jednak odpowiedzieć + na jedno pytanie. Skąd biorą się te definicje funkcji? Definicje + funkcji są składowane wraz plikami wersji w tym samym katalogu pod + postacią pliku szablonu (template.sh). To jeśli definicje + znajdują się w odrębnym pliku to zamiast je kopiować można je + przecież załadować do pliku za pomocą polecenia source + lub instrukcji kropki (.). Tu pojawia się problem, + którego wolelibyśmy uniknąć a mianowicie kopiowana kolejnych plików do + rootfs. I go unikniemy wykorzystując to co już mamy dostępne. +

+

+ Zamiast zaczynać plik serii definicji funkcji, pobierzemy je z + repozytorium: +

+
+dhclient;
+cd;
+if [ -x /usr/bin/git ]; then git clone https://github.com/xf0r3m/immudex-testing.git;
+else apt install git && git clone https://github.com/xf0r3m/immudex-testing.git;
+fi
+
+

+ Teraz plik szablonu (plik z definicjami) możemy załadować do pliku + wersji. +

+
+source ~/immudex-testing/versions/template.sh;
+
+

+ Teraz od tej linii rozpoczyna się plik wersji. Warto też dodać, że + funkcja odpowiedzialna za sklonowanie repozytorium przestaje być + potrzebna, ponieważ zrobi to teraz każdy plik wersji na początku + wykonania. Warto dopisać do początku polecenie dhclient + aby odświerzyć połączenie sieciowe. Przedstawiony na początku + materiału przykład po optymalizacji prezentuje się w taki o to sposób. +

+
+dhclient;
+cd;
+if [ -x /usr/bin/git ]; then git clone https://github.com/xf0r3m/immudex-testing.git;
+else apt install git && git clone https://github.com/xf0r3m/immudex-testing.git;
+fi
+source ~/immudex-testing/versions/template.sh;
+update_packages;
+install_packages gimp isolinux;
+
+cp -vv ~/immudex-testing/images/${VERSION}/abandoned_hospital_bower.png /usr/share/images/desktop-base;
+
+sed -i 's/no_trespass_abandon.jpeg/abandoned_hospital_bower.png/' /etc/lightdm/lightdm-gtk-greeter.conf;
+
+rm /etc/apt/source.list;
+
+tidy;
+
+

+ Podsumowując pliki wersji to nic innego jak skrypty, które wdrażają + zmiany przeznaczone dla tej wersji systemu. +

+

+ ~xf0r3m +

+ +
+ + diff --git a/articles/immudex/transformacja_gnu_linux_debian_w_immudex.html b/articles/immudex/transformacja_gnu_linux_debian_w_immudex.html new file mode 100755 index 0000000..684de53 --- /dev/null +++ b/articles/immudex/transformacja_gnu_linux_debian_w_immudex.html @@ -0,0 +1,288 @@ + + + + + + + + +
+ _                               _           
+(_)_ __ ___  _ __ ___  _   _  __| | _____  __
+| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
+| | | | | | | | | | | | |_| | (_| |  __/>  < 
+|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\
+
+ +
+

Transformacja GNU/Linux Debian w immudex - Budowanie

+

+ Chcąc podnieść swój poziom bezpieczeństwa na nieco wyżej, + uznałem, że dobry pomysłem będzie użycie systemu, który jest niezmienny. + Za najprostszą formę niezmienności uznałem systemy uruchamiane z + poziomu LiveCD. Gdy taki system się uruchamia, zostaje + uruchomione jądro oraz initrd, montowane jest + archiwum squashfs, a dysk na którym są zapisane te elementy + pozostaje w trybie tylko do odczytu. Uruchamiając komputer ponownie + wszystko powróci do swojej pierwotnej formy. Tę dystrybucję oparłem + o GNU/Linux Debian z dwóch powodów. Pierwszym z nich jest + doświadczenie. Otóż + już wcześniej zajmowałem się dystrybucją pochodną od Debiana oraz + stabliność, GNU/Linux Debian to bardzo stablina dystrybucja. Ten + materiał ma za zadnie przedstawić w jaki sposób można utworzyć obraz + płyty z niezmiennym systemem operacyjnym. +

+

+ Do budowy immudex potrzebujemy kilku pakietów do utworzenia + końcowego obrazu płyty oraz plików, które on będzie zawierać. +

+
+$ sudo apt install -y debootstrap squashfs-tools xorriso isolinux syslinux-efi\
+grub-pc-bin grub-efi-amd64-bin mtools dosfstools git vim
+
+

+ Teraz możemy utworzyć katalog przeznaczony na nasz system, jeśli + będziemy obsługiwać obie architektury komputerów klasy PC tj. + amd64 lub i386, to wypadało by utworzyć podkatalogi + dla obu. +

+
+$ mkdir -p immudex/{64,32};
+
+

+ Po utworzeniu początkowych katalogów, możemy pobrać czysty obraz + katalogu głównego z jednego z dostępnych serwerów lustrzanych. +

+
+$ sudo /sbin/debootstrap --arch=amd64 bullseye ~/immudex/64/chroot http://ftp.icm.edu.pl/debian
+
+

+ Polecenie debootstrap służy do pobrania + oraz instalacji obrazu we wskazane miejsce + (~/immudex/64/chroot). Wersja stablina + immudex jest analogiczna do Debiana więc jako nazwę kodową + wersji podajemy bullseye (wersja + stablilna na czas pisania tego materiału). Tak samo jest z wersją + testową. Ostatni argument to adres najszybszego dla nas serwera + lustrzanego z repozytorium Debiana. Dla mnie jest SunSITE ICM UW. +

+

+ Na chwilę opuszczamy utworzony wcześniej katalog ~/immudex, + aby pobrać pliku projektu z serwisu GitHub: https://github.com/xf0r3m/immudex. + Do tego celu najlepiej wybrać takie miejsce, w którym możemy pozostawić + po sobie bałagan. Katalog ~/Pobrane świetnie się do tego + nadaje. +

+
+$ if [ ! -d ~/Pobrane ]; then mkdir ~/Pobrane; fi
+$ cd ~/Pobrane
+$ git clone https://github.com/xf0r3m/immudex.git;
+
+

+ Pośród pobranych plików projektu znajduje się + bazowy plik wersji (versions/base.sh), który + wykorzystywany jest do budowania immudex od zera. Od czystej + wersji Debiana. Ten plik musimy skopiować do katalogu, w którym + debootstrap wypakował obraz Debiana. +

+
+$ sudo cp -v ~/Pobrane/immudex/version/bash.sh ~/immudex/64/chroot;
+
+

+ Plik ten musi zostać uruchomiony przez powłokę w zmienionym katalogu + głównym. Skrypt aby mógł prawidłowo określić pakiety jakie trzeba + pobrać (na przykład jądro) oczekuje również na podanie architektury + (w tym przypadku jest to 64 dla amd64 lub 32 dla + i386), +

+
+$ sudo chroot ~/immudex/64/chroot bash base.sh 64
+
+

+ Program zainstaluje wszystkie pakiety oferowane przez pierwszą wersję + immudex, uzupełni system o kilka autorskich narzędzi + ułatwiających pracę z dystrybucją zgodnie z jej koncepcją + (oczywiście wszystko zostało stworzone, w taki sposób aby niczego + nie narzucać. Wszystko można w łatwy sposób obejść) oraz skonfiguruje + środowisko graficzne. Wszystkie czynności można sprawdzić analizując + plik, który znajduje się w repozytorium: https://github.com/xf0r3m/immudex/blob/main/versions/base.sh +

+

+ Po zakończeniu wykonywania czynności przez skrypt, możemy go usunąć, + aby nie zaśmiecać obrazu. +

+
+$ sudo rm -f ~/immudex/64/chroot/base.sh;
+
+

+ Teraz kiedy rootfs jest gotowy. Możemy zająć się pozostałymi + plikami do okoła niego. Wrócimy jeszcze do niego, tworząc z katalogu + archiwum squashfs. Nasze czynności rozpoczniemy od utworzenia + struktury katalogowej, której część znajdzie się na obrazie płyty. +

+
+$ mkdir -p ~/immudex/64/{staging/{EFI/boot,boot/grub/x86_64-efi,isolinux,live},tmp}
+
+

+ Po tym jak utworzyliśmy odpowiednie miejsce w strukturze, możemy teraz + wygenerować z katalogu chroot archiwum squashfs. Ten + proces może trochę potrwać w zależności od mocy naszego komputera. + Istotnym faktem tutaj jest nazwa pliku archiwum squashfs. + Nie jest ona przypadkowa, pod tą nazwą program live-boot + odpowiedzialny za obsługę środowiska LiveCD będzie domyślnie szukać + pliku o nazwa filesystem.squashfs i będzie próbować + użyć go jako katalogu głównego. Wcześniej montując archiwum. +

+
+$ sudo mksquashfs ~/immudex/64/chroot ~/immudex/64/staging/live/filesystem.squashfs -e boot
+
+

+ Przygotowując squashfs nie możemy zapomnieć o jądrze oraz + initrd. Nazwy plików jądra oraz initrd, zostały + dobrane pod istniejące już pliki konfiguracyjne programów rozruchowych. +

+
+$ cp -v $(ls -v ~/immudex/64/chroot/boot/vmlinuz-* | tail -1) ~/immudex/64/staging/live/vmlinuz
+$ cp -v $(ls -v ~/immudex/64/chroot/boot/initrd.img-* | tail -1) ~/immudex/64/staging/live/initrd
+
+

+ Już tłumaczę skąd wzięło się te podstawienia. Otóż, czasami może się + zdarzyć, że katalog /boot będzie zawierał dwa jądra. Ponieważ + przeważnie w dystrybucjach Linuksa tak jest. Jest "nowe" domyślne jądro + oraz "stare" zapasowe wrazie gdy to nowe okaże się wadliwe. Wyżej + wymienione podstawienia, uzupełnią polecenie nazwami plików nowszych + wersji. +

+

+ Po skopiowaniu plików jądra. Możemy zająć teraz kwestią uruchomienia + systemu, a co za tym idzie - instalacja oraz konfiguracja programów + rozruchowych. Immudex wspiera dwa tryby rozruchu: rozruch w + trybie BIOS oraz w trybie UEFI (ale tylko UEFI 64-bitowe, domyślnie. + Gdyż można przystosować pamięc USB do uruchomienia na komputerach z + 32-bitowym UEFI - narzędzie create_media). Konfiguracja + tych programów nie jest trudna, wystarczy kilka poleceń. Na początek + zaczniem od załadowania do struktury katalogowej plików + konfiguracyjnych. Za rozruch w trybie BIOS odpowiada program + isolinux, część projektu syslinux, który + będzie odpowiadać za rozruch już zainstalowanego immudex na + dysku (o tym w innym materiale). Natomiast za rozruch w trybie UEFI + odpowiada GRUB w wersji 2. Pliki konfiguracyjne znajdują się wśród + plików projektu immudex. +

+
+$ cp -v immudex/isolinux/amd64/* ~/immudex/64/staging/isolinux;
+$ cp -v immudex/grub/amd64/* ~/immudex/64/staging/boot/grub
+
+

+ Następną czynnością jest utworzenie pliku konfiguracyjnego dla + samodzielnego pliku GRUB-a. W tym pliku wskazane jest + katalog główny, ustalenie prefiksu dla ścieżek, oraz wskazanie + pliku konfigracyjnego dla GRUB-a. +

+
+$ cat >> ~/immudex/64/tmp/grub-standalone.cfg <<EOF
+search --set=root --file /DEBIAN
+set prefix=(\$root)/boot/grub
+configfile /boot/grub/grub.cfg
+EOF
+
+

+ Pierwsza linia na powyższym przykładzie powoduje ustawienie zmiennej + root scieżki dysku zawierającego plik + DEBIAN. Więc, aby GRUB ustawił katalog + główny obrazu jako swój główny katalog, musi się na nim znajdować + "luzem" plik o nazwie DEBIAN. +

+
+$ touch ~/immudex/${arch}/staging/DEBIAN;
+
+

+ Aby programy rozruchowe mogły prawidło działać potrzebują plików + pomocniczych. Te pliki są instalowane wraz z pakietami, które + dostarczają do naszych systemów te programy. Poniżej znajdują się + polecenia, których zadaniem jest skopiowanie plików pomocniczych + programów rozruchowych do struktury katalogowej obrazu płyty. +

+
+$ cp -v /usr/lib/ISOLINUX/isolinux.bin ~/immudex/64/staging/isolinux;
+$ cp -v /usr/lib/syslinux/modules/bios/* ~/immudex/64/staging/isolinux;
+$ cp -rv /usr/lib/grub/x86_64-efi/* ~/immudex/64/staging/boot/grub/x86_64-efi
+
+

+ Teraz możemy utworzyć plik wykonywalny GRUB, który następnie zostanie + załadowany do partycji UEFI: +

+
+$ grub-mkstandalone --format=x86_64-efi\
+--output=${HOME}/immudex/64/staging/EFI/boot/bootx64.efi --locales=""\
+--fonts="" "boot/grub/grub.cfg=${HOME}/immudex/64/tmp/grub-standalone.cfg";
+
+

+ Ciekawym argumentem jest tutaj ostatni argument, gdyż zawiera on + mapowania plików. W przypadku tego pliku konfiguracyjnego GRUB-a jego + plikiem jest plik ~/immudex/64/tmp/grub-standalone.cfg, + o którym już wspomniałem. Tamten zaś + wskazuje na właściwy już plik, w którym widnieją wpisy rozruchowe. +

+

+ Tak utworzony plik możemy skopiować do partycji EFI, która w przypadku + obrazów płyt jest plkiem. Poniżej znajdują polecenia, które tworzą + plik partycji. +

+
+$ cd ~/immudex/64/staging/boot/grub
+$ dd if=/dev/zero bs=1M of=efiboot.img count=20
+$ sudo mkfs.vfat efiboot.img
+$ sudo mmd -i efiboot.img efi efi/boot
+
+

+ Po utworzeniu pliku partycji oraz utworzeniu na nim odpowiednich + folderów (ostatnie polecenie). Możemy skopiować nasz plik GRUB-a. +

+
+$ sudo mcopy -vi efiboot.img ~/immudex/64/staging/EFI/boot/bootx64.efi ::efi/boot 
+
+

+ Po wykonaniu tej czynności obraz w postacji struktury katalogów i + plików jest gotowy. Pozostała do wykonania jedna czynność. Zmiana tej + struktury w jeden plik, który będzie mógł być zapisany na płycie lub + nośniku USB, a następnie komputer będzie mógł być z niego uruchomiony. +

+
+cd ~/immudex/64;
+xorriso as mkisofs -iso-level 3 -o "immudex64.iso" -full-iso9660-filenames\
+-volid "immudex64" -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin\
+-eltorito-boot isolinux/isolinux.bin -no-emul-boot -boot-load-size 4\
+-boot-info-table --eltorito-catalog isolinux/isolinux.cat -eltorito-alt-boot\
+-e /boot/grub/efiboot.img -no-emul-boot -isohybrid-gpt-basdat\
+-append_partition 2 0xef ~/immudex/${arch}/staging/boot/grub/efiboot.img\
+~/immudex/64/staging
+
+

+ Poszczególne opcje polecenie xorriso + ustawiają odpowiednio programy rozruchowe, aby były one uruchamiane + podczas uruchamiana komputera z róznym rodzajem oprogramowania + układowego. Obraz jest również ustawiony tak, aby hybrydą obrazu płyty + oraz obrazu dysku, przez co może być załadowany bezpośrednio do pamięci + USB. Dzięki tej czynności jesteśmy w stanie uruchomić komputer z + pendrive-a. +

+

+ Podsumowując dużą role w transformacji Debiana w immudex + odgrywa bazowy plik wersji. Po za kilkoma szczegółami, prowadzona + przeze mnie dystrybucja Linuksa dalej pozostaje Debianem. Nie chciałem + tworzyć nowego bytu, a raczej dostoswać obecny byt do swoich potrzeb. + Wiele z technik rekomendowanych to tworzenia obrazów z Debianem nie + zostało tutaj użytych. +

+

+ ~xf0r3m +

+ +
+ + diff --git a/articles/linux/Alpine_Linux_jako_bramka_sieciowa.html b/articles/linux/Alpine_Linux_jako_bramka_sieciowa.html new file mode 100644 index 0000000..302d75a --- /dev/null +++ b/articles/linux/Alpine_Linux_jako_bramka_sieciowa.html @@ -0,0 +1,177 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+ +

Alpine Linux jako bramka sieciowa

+

+ Ostatnio budowaliśmy bramkę w oparciu o system OpenBSD, nie było to jakoś trudne zdanie. Teraz zajemiemy się tym samym zagadniem co poprzednio, + tylko że z systemem GNU/Linux. Do tego celu wybrałem kolejną dystrybucje, która jest nieco bardzie podrasowana jeśli chodzi o bezpieczeństwo, + prosto z Norwegii, Alpine Linux. Ciekawą rzeczą w tej dystrybucji jest to że możemy zainstalać usługę, która umożliwi nam kontrolowanie + naszego systemu z poziomu przeglądarki. Nie ma się co napalać, jak szczerbaty na suchary, ale to zawsze coś. Może pojawi się tutaj jakiś + materiał odnośnie ACF, bo tak to się dokładnie nazywa. Pozwole sobie tutaj na nawiązania do materiału o robieniu bramki z OpenBSD, pozowoli + to ograniczyć wypełniacz merytoryczny, przez co ten artykuł będzie znacznie krótszy. +

+

+ Uwaga! Wszystkie znajdujące się tu polecenia wykonujemy z poziomu użytkownika root. +

+
    +
  1. Instalacja systemu +

    + Instalacja Alpine Linux została już tutaj przedstawiona jednym z umieszczonych tutaj materiałów. Podobnie jak na OpenBSD jeśli czytamy + to jeszcze przed rozpoczęciem jakich kolwiek prac, to ustawienia interfejsów sieciowych możemy skonfigurować już na poziomie instalatora. +

    +
  2. +
  3. Instalacja niezbędnego oprogramowania +

    + Menedżerem pakietów w Alpine jest program APK, jak rozszerzenie paczek oprogramowania na Androidzie. Dystrybucja po instalacji pozostaje natywnie pusta, aby dać użytkownikowi jak największe pole do manewru. Do zainstalowania mamy aż trzy pakiety: ISC DHCPD - dhcp, dnsmasq, iptables. Aby użyć polecenia apk do instalacji pakietów należy użyć opcji add następnie po niej podać nazwę interesującego nas pakietu. +

    +
    +# apk add dhcp dnsmasq iptables
    +
    +

    + Po zainstalowaniu potrzebnych usług oraz programów, możemy przejść do ich konfiguracji. Na początek, tak samo jak przy OpenBSD skupimy się na DHCP. +

    +
  4. +
  5. Konfiguracja DHCP +

    + Aby daemon DHCP mógł odczytać nasz plik konfiguracji musimy nazwać dhcpd.conf i umieścić w katalogu /etc/dhcpd. Konfiguracja tutaj jest identyczna do tej jaką tworzliśmy na dla OpenBSD, ponieważ jest to ten sam program. Dla leniwych, którym nie chce się przejrzeć tamtego artykułu i dla samej zapachajdziury, opisze linia po linii konfiguracje DHCP. +

    +
    +subnet 192.168.0.0 netmask 255.255.255.0 {
    +	range 192.168.0.100 192.168.0.199;
    +	option routers 192.168.0.1;
    +	option domain-name "morketsmerke.net";
    +	option domain-name-servers 192.168.0.1;
    +}
    +
    +

    + Pierwsza linia otwiera nam deklaracje pod sieci, po słowie subnet występuje adres sieci, z kolei po słowie netmask maska sieciowa. W następnej linii deklarowany jest zakres adresów przeznaczonych dla hostów w naszej sieci. option routers będzie przekazywać taki parametr adres bramy domyślnej, option domain-name zawiera sufiks DNS dla naszych hostów a ostatnia linia option domain-name-servers zawiera adresy serwerów DNS, może być ich wiele, jednak nie wszystkie systemu obsługują więcej niż dwa adresy. W przykłdzie znajduje się tylko jedna sieć jeśli nasza bramka ma obsługiwać więcej sieci to deklaracje można powtórzyć oczywiście dostosowując ją do adresacji zastosowanej w owej sieci. +

    +

    + Jako ciekawostkę albo nieco bardzie zaawansowaną konfiguracje podam że rezerwacje adresów, które wyglądają o tak: +

    +
    +host admin-komputer {
    +	hardware ethernet 00:de:ad:be:ef:00;
    +	fixed-address 192.168.0.10;
    +	option host-name "admtop";
    +}
    +
    +

    + Rezerwacje mogą zupełnie wybiegać poza zakres, a daemon i tak nada zarezerwowane adresy tym komputerom. +

    +
  6. +
  7. Konfiguracja daemona DHCP
    +

    + Do uruchomienia daemona w Alpine Linux wykorzystywany jest jeszcze jeden plik /etc/conf.d/dhcpd. W tym pliku musimy ustawić dwie zmienne DHCPD_CONF oraz DHCPD_IFACE, aby je ustawić nadajemy im wartość i usuwamy poprzedzający je znak komentarza. Jakie wartości należy im nadać? Otóż zmienna DHCPD_CONF przechowuje ścieżkę to pliku konfiguracyjnego. Wartość tej zmiennej może już wskazywać na nasz pliki, jeśli nie to należy to skorygować. Zmienna DHCPD_IFACE, przechowuje interfejsy na jakich nasłuchiwać ma nasze DHCPD. +

    +
    +DHCPD_CONF="/etc/dhcpd/dhcpd.conf";
    +DHCPD_IFACE="eth0 eth1";
    +
    +

    +
  8. +
  9. Ustawienie interfejsu dla dnsmasq
    +

    + Podobnie do konfiguracji zastosowanej w OpenBSD i w tym przypadku jeśli dnsmasq ma nam służyć tylko i wyłącznie jako maskarada DNS lub przekaźnik (bo taką rolę pełni) to nie potrzeba w zasadzie nic konfigurować, jedne co należy zrobić to wskazać odpowiednie interfejsy. W pliku konfiguracyjnym odnajdujemy opcje #interface jest ujęta w komentarz aby ją włączyć musimy usunąć znak komentarza, a po znaku równości (=) wpisać nazwę interfejsu. +

    +
    +interface=eth1
    +
    +

    + Następnie zapisujemy oraz restartujemy usługę, tutaj warto wspomnieć, że Alpine Linux jest dystrybucją opartą na OpenRC, a więc restart usługi odbywa się jak w starych systemach GNU/Linux. +

    +
    +# /etc/init.d/dnsmasq restart
    +
    +

    + Identycznie jak przy OpenBSD, jeśli chcemy wymusić nasłuchiwanie na konkretnym interfejsie, musimy odblokować opcję bind-interfaces. +

    +
    +bind-interfaces
    +
    +
  10. +
  11. Ewentualne wpisy do /etc/hosts*
    +

    + Wykorzystując plik /etc/hosts na naszej bramce możemy zdefiniować nazwy domenowe dla naszych serwerów w sieci lokalnej. Przeważnie w konfiguracji odpytywania UNIX-y skonstrułowane są w taki sposób że na początku sprawdzają zawartość tego pliku, i jeśli nie znajdą odpowiedniego dla zapytania rekordu, kierują zapytanie do swoich adresów DNS. Format wpisu jest taki sam dla wszystkich UNIX-ów, składa się on z trzech części: adresu IP, FQDN (pełnej nazwy domenowej), hostname (nazwy hosta). Nazw hosta możemy używać tylko jeśli na naszym komputerze został został zdefiniowany sufiks DNS. Przykładowy wpis znajduje się poniżej: +

    +
    +192.168.0.10 serwer.morketsmerke.net serwer
    +
    +
  12. +
  13. NAT
    +

    + Podbnie jak w przypadku PF (pakiet firewalla na OpenBSD) NAT to jedna reguła. Reguła, która do poprawnego działania wymaga przestawienia opcji jądra, opcji przekazywania pakietów z jednego interfejsu na drugi wewnątrz systemu. Poniżej znajdują się polecenia jakie należy wykonać aby uruchomić NAT. +

    +
    +# iptables -t NAT -A POSTROUTING -o eth0 -j MASQUERADE
    +# echo 1 > /proc/sys/net/ipv4/ip_forward
    +
    +

    + Pierwsze polecenie jest ustawieniem reguły pakietu zapory sieciowej na GNU/Linux, którą jest iptables. Przy iptables reguły dodawane są na bieżąco, a co za tym idzie będą tak długo załadowane jak długo uruchomiony jest system. To jest jedna z różnic pomiędzy PF a iptables. Do trwałego zapisania reguł będzie potrzebny nam zewnętrzny pakiet. Tym zajmiemy się na koniec. Teraz przejdźmy samej reguły. Przełącznik -t wskazuje nam tablice - zbióry reguł stosowane na podstawie przeznaczenia pakietów. Na przykład reguły podejmujące działania pakietach wygenerowanych przez bramkę lub do niej zaadresowane zostaną zdefiniowane w innej tablicy niż te które mają działać na pakietach, które przez tą bramkę przechodzą. Nas będą interesować tylko tablice filter (tablica domyślna), która zajmuje się pakietami z i do bramki oraz tablica nat, zajmująca się pakietami przecodzącymi przez bramkę. + W iptables są jeszcze dwie tablice, jednak na nie są nam one potrzebne także ich opis pominę. Opcja -A spowoduje dopisanie naszej reguły na końcu łańcucha. Łańcuchy są to podzbiory reguł, których cechą charkterystyczną jest konkretny moment podróży pakietu za nim dotrze do aplikacji, której dane przenosi lub zostanie przesłany dalej w głąb innych sieci. Najproście zobrazować to sobie w ten sposób, że do kiedy pakiet dociera do systemu zawsze na początku trafia do łańcucha PREROUTING tablicy nat w tym łańcuchu dokonywane są wszelkie zmiany (akcje) dla pakietu, kiedy tylko się pojawi, może zostać przekierowany albo do łańcucha INPUT albo do łańcucha FORWARD tablicy filter łańcuch INPUT przeznaczony jest dla pakietów kierowanych dla tego komputera, + z kolei łańcuch FORWARD dla tych pakietów, które przechodzą przez ten komputer. Jeśli pakiet trafił do INPUT, wtedy trafia lokalnego procesu. + Proces może odpowiedzieć, wygerowany przez proces pakiet trafia najpierw do odpowiedniego łańcucha tj. OUTPUT tablicy filter następnie do łańcucha OUTPUT tablicy nat, gdzie mogą być dokonywane zmiany dla wygenerowaych pakietów. + Tutaj obydwie ścieżki łączą się ponieważ pakiety opuszaczające łańcuch FORWARD oraz łańcuch OUTPUT tablicy nat są przetwarzane ostatecznie w łańcuchu POSTROUTING tablicy nat, czyli momencie gdy mają opuścić ten komputer. Tutaj właśnie wykorzystywana jest akcja MASQUERADE, która zapisaliśmy w pierwszym poleceniu, po łańcuchu umieszczony jest przełącznik -o określający interfejs wyjściowy (nasz interfejs podłączony do internetu). + Ostatnią składową jest reguły jest cel/akcja (po przełączniku -j) podejmowana na pakiecie, kiedy zostaje dopasowany do reguły. + Podsumowując pakiety przechodzą z tablicy do tablicy z łańcucha do łańcucha w poszukiwaniu pasujących reguł, kiedy reguła zostanie dopasowana wtedy podejmowany jest dla pakietu cel/akcja, może być ona ACCEPT lub DROP lub specjalna jak MASQUERADE. +

    +

    + Odnośnie zamiany adresów czyli właśnie NAT-u to istnieją dwa sposoby. Jeśli nasz adres na interfejsie podłączonym do sieci rozległej/Internetu jest przydzielany dynamicznie powinniśmy użyć własnie MASQUERADE jeśli nasz adres jest stały, to wtenczas należało by użyć SNAT a następnie podać za pomocą dodatkowej opcji --to-source adres jakie należy użyć podczas NAT-u. +

    +
    +# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.20.40.34
    +
    +

    + Drugie polecnie nie jest już tak skomplikowane, uruchamia ono przekazywanie pakietów wewnątrz systemu. +

    +
  14. +
  15. Zapisanie reguł do pliku
    +

    + Niestety reguły iptables są przechowywane w łańcuchach do momentu kolejnego uruchomienia komputera. W Alpine Linux wraz z iptables otrzymujemy polecenie iptables-save, którego uruchomienie spowoduje wyświetlenie nam tablic z łańcuchami w formacie, który poźniej pozwoli na ich automatyczne przywrócenie, aby całość zadziałała po ustawieniu NAT-u należy przekierować wyjście tego właśnie polecenia do pliku /etc/iptables/rules-save. Przy zapisie reguł warto pamiętać o tym że włączenie przekazywania pakietów w systemie też powinno się odbywać automatycznie. Możemy zrobić to na dwa sposoby. Pierwszy z nich to dopisanie opcji net.ipv4.ip_forward = 1 do pliku /etc/sysctl.d/00-alpine.conf lub skorzystać z konfiguracji iptables w /etc/conf.d/iptables, gdzie powinniśmy znaleźć opcje IPFORWARD, która należy przestawić na yes. +

    +
  16. +
  17. Ustawienie autostartu usług +

    + Alpine Linux jest dystrybucją, która została nieco inaczej zbudowana niż te powszechnie nam znane, w których programem typu init jest moloch systemd, który automatycznie załącza znane usługi do startu wraz z systemem, najwyżej usługa nie wystartuje z powodu braku konfiguracji. Tutaj programem typu init jest OpenRC, gdzie sytuacja nie jest już tak kolorowa. Nie ma jednak tragedii - "Not great, not terrible". Aby włączyć uruchamie konkretnych usług przy użyciu OpenRC jako programu init, wystarczy wydać konkretne polecenie jak te przedstawione poniżej: +

    +
    +# rc-update add dnsmasq default
    +# rc-update add dhcpd default
    +# rc-update add iptables default
    +
    +
    +

    +
  18. +
+

+ Jak widać na powyższej liście stworzenie prostej bramki opartej dobry system GNU/Linux, nie jest jakoś bardzo skomplikowane, wymaga wydania kilku poleceń oraz wyedytowania kilku plików. Dla mnie, gdzie mam trochę wprawy dużo rzeczy wydaje się banalnych, ale jeśli spojrzał bym kilka lat wstecz to już samo zagadnienie budowania bramki na GNU/Linux było by sporą abstrakcją, co dopiero na systemie, który trochę odbiega nurtu głównych dystrybucji takich jak GNU/Linux Debian czy CentOS. Serio, dla mnie łatwiejsze było nauczenie się zupełnie innego systemu operacyjnego oraz zupełnie innego pakietu zapory niż zabranie się za iptables, i mimochodem znając nieco bardziej iptables niż wtedy to pozostał bym wierny OpenBSD oraz PF. +

+

+ ~xf0r3m +

+ +
+ + + + diff --git "a/articles/linux/NFS_-_udostepnianie_i_montowanie_udzia\305\202\303\263w.html" "b/articles/linux/NFS_-_udostepnianie_i_montowanie_udzia\305\202\303\263w.html" new file mode 100644 index 0000000..548e6db --- /dev/null +++ "b/articles/linux/NFS_-_udostepnianie_i_montowanie_udzia\305\202\303\263w.html" @@ -0,0 +1,138 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

NFS - Udostępnianie i montowanie udziałów

+

+ Wykorzystanie NFS (ang. Network File System), czyli sieciowego systemu plików, jest chyba najbardziej zbliżonym plikowym zasobem sieciowym do katalogów wstępujących klasycznie w systemie, mowa oczywiście o systemach UNIX. Nie chce wdawać się w szczegóły samego protokołu, ponieważ tutaj chciałybm skupić się na samej praktyce, niezbędną teorie przytoczę podczas omawania konkretnych przykładów. +

+

+ Na początek zajmiemy się serwerem, kiedy będzie gotów przejdziemy wówczas do konfiugracji klienta. Przed przystąpieniem do instalacji oprogramowania NFS, upewnijmy się czy nasz system posiada aktualne źródła repozytorium oraz oprogramowanie. Przytoczę tutaj polecenia dystrybucji opartych na Debianie. +

+
+$ sudo apt update
+$ sudo apt upgrade
+
+

+ Po zainstalowaniu aktualizacji możemy przejść do instalacji właściwego oprogramowania. +

+
+$ sudo apt install nfs-kernel-server
+
+

+ Teraz przejdziemy do utworzenia katalogu udziału oraz nadamy mu odpowiednie uprawnienia. +

+
+$ sudo mkdir /example
+$ sudo chmod nobody:nogroup /example
+
+

+ /example jest tutaj katalogiem udziału. Kiedy wykonaliśmy powyższe czynności mozemy przejść do udostępnienia katalogu z pomocą protokołu NFS. Otwieramy plik /etc/exports, plik może nie istnieć. Wewnątrz pliku deklarujemy nasz udział. +

+
+$ sudo vi /etc/exports
+# w /etc/export:
+/example        192.168.1.2(rw,sync,no_subtree_check,no_root_squash)
+
+

+ Tutaj: +

+ Pozostała część linii są to opcje udziału, które określają następujące rzeczy: + + Po zapisaniu zmian w pliku możemy zrestartować naszą usługe NFS. +

+
+$ sudo systemctl restart nfs-kernel-server
+
+

+ Konfiguracja na serwerze została juz zakończona, w przypadku NFS widać że nie ma z dużo pracy. Teraz przejdziemy do konfiguracji klienta. Rozpoczynamy ją klasycznie od zainstalowania aktualizacji w systemie. +

+
+$ sudo apt update
+$ sudo apt upgrade
+
+

+ Kiedy aktualizacje są zainstalowane, możemy przejść do zainstalowania niezbędnego oprogramowania. +

+
+$ sudo apt install nfs-common
+
+

+ Po instalacji pakietu możemy sobie przetestować nasz udział NFS, za pomocą poniższego polecenia. +

+
+$ sudo mount 192.168.1.3:example /nfs_example
+
+

+ Gdzie: +

+ Montowanie nie jest jakieś trudne, co widać na załączonym wyżej przykładzie. Teraz tak naprawdę możemy korzystać z naszego udziału. Jeśli chcemy sprawdzić czy udział został rzeczywiście zamontowany możemy wydać polecenie mount lub df -h, w wynikach działania tych poleceń powinniśmy odnaleźć adres IP serwera, nazwę udziału oraz punkt montowania. Teraz kiedy już możemy korzysać z naszego udziału to warto wprowadzić do systemu klienta jedną zmianę, ustawić system tak aby sam montował udział podczas startu. +

+

+ W plik /etc/fstab dopisujemy poniższą linie. +

+
+192.168.1.3:example     /nfs_example    nfs     auto,nofail,noatime,nolock,intr,tcp,actimeo=1800    0   0
+
+

+ W przypadku tej linii to: +

+ po montowanym systemie plików występują opcje montowania. Opcje montowania można ze sobą mieszać, dlatego występują tu zarówno opcje ogólne, sterujące pracą samego systemu montowania oraz opcje specyficzne dla konkretnego systemu plików. Poniżej znajduje się objaśnienie opcji wykorzystanych podczas + tworzenia powyższego wpisu. + + Po zapisaniu zmian w pliku możemy zrestartować komputer klienta, aby sprawdzić czy rzeczywiście wpis w pliku /etc/fstab działa. Poprawność monotowania możemy sprawdzić za pomocą tych samych poleceń jakie wykorzystywaliśmy podczas testowania udziału. +

+

+ NFS jak widać jest natywnym systemem udostępniania plików w UNIX-ach a jego instalacja i konfiguracja nie należy do najtrudniejszych. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/linux/OTP/index.html b/articles/linux/OTP/index.html new file mode 100644 index 0000000..a04d3be --- /dev/null +++ b/articles/linux/OTP/index.html @@ -0,0 +1,199 @@ + + + + + + + + +
+   ____  __    __   ______                    _             __
+  / __ \/ /___/ /  /_  __/__  _________ ___  (_)___  ____ _/ /
+ / / / / / __  /    / / / _ \/ ___/ __ `__ \/ / __ \/ __ `/ / 
+/ /_/ / / /_/ /    / / /  __/ /  / / / / / / / / / / /_/ / /  
+\____/_/\__,_/    /_/  \___/_/  /_/ /_/ /_/_/_/ /_/\__,_/_/   
+                                                              
+    ____               _           __ 
+   / __ \_________    (_)__  _____/ /_
+  / /_/ / ___/ __ \  / / _ \/ ___/ __/
+ / ____/ /  / /_/ / / /  __/ /__/ /_  
+/_/   /_/   \____/_/ /\___/\___/\__/  
+                /___/                
+
+ +
+

Old Terminal Project GNU/Linux (Wise choice)

+

+ OTP a właśc. Old Terminal Project GNU/Linux jest to lekka + dystrybucja oparta na dCore (port TinyCore-a) w wersji bazującej na + Ubuntu 18.04. Jej zadaniem jest przywrócenie świetności starym + terminalom, czy cienkim klientom produkowanym do 2010. System jest + 32-bitowy i nie wspiera UEFI, dlatego nie jest ondedykowany dla + wszystkich terminali. Dołączone do dystrybucji oprogramowanie + pozwala wykorzystać te urządzenia do celu w jakim zostały stworzone + zarazem odnajdując się wśród współczesnych maszyn. +

+

+ Zrzut ekranu przestawiający pulpit dystrybucji: + +

+ +
Kilknij obrazek, aby otworzyć w pełnym rozmiarze.
+
+ +

+

+ Oprogramowanie dołączone do OTP: +

+ +

+ Aktualna wersja: 1.0.5 +

+

+ Dystrybucja została oparta o jeden z portów TinyCore, przy czym port dCore + wykorzystuje pakiety .deb do konwersji ich na własne paczki zachowując + przy tym rozwiązania z TinyCore. W przypadku dCore pakiety mają rozszerzenie + .sce i działaja na dokładnie takiej samej zasadzie co pakiety TCZ. Są + to małe odwzorowania rootfs zamknięte w formacie squashfs. Pakiety mogą + być ładowane na żądanie (on demand) lub pod czas uruchamiania systemu + (on boot), ze względu na małą wydajność tych starszych cienkich klientów + podczas rozruchu systemu ładowane są najczęściej używane rozszerzenia. + Rozszerzenia ładowane są za pomocą polecenia: +

+
+$ sce-load
+
+

+ Polecenie to musi zostać wydane przez zwykłego użytkownika bez uprawnień + administratora. Wyświetli ono menu z którego należy wybrać pakiet do + załadowania. +

+

+ Użytkownik może sam pobierać i ładować pakiety z Ubuntu 18.04. Do tej + czynności wymagana jest nazwa pakietu z Ubuntu. Pakiet pobierany i + konwertowany jest za pomocą polecenia: +

+
+$ sce-import nazwa_pakietu
+
+

+ Ładowanie może następować tak jak we wcześniej wyjaśniony sposób lub + "mniej interaktywny" podajac poleceniu nazwę pakietu: +

+
+$ sce-load nazwa_pakietu
+
+

+ Po instalacji pakietów, warto oczyścić katalog na dysku z pobranych + paczek .deb. Dokonuje się tego za pomocą rozszerzeia + sce-debpurge. Jest + ono dostarczane wraz z dystrybucją, trzeba je tylko załadować. +

+
+$ sce-load sce-debpurge
+
+

+ Usunięcie wszystkich pakietów .deb: +

+
+$ sce-debpurge -a
+
+

+ Jeśli nie będziemy już potrzebować jakiegoś rozszerzenia możemy je usunąć + za pomocą polecenia sce-remove, które również jest dołączane do pakietów + dystrybucji, wymaga jedynie załadowania. +

+
+$ sce-load sce-remove
+$ sce-remove nazwa_pakietu
+
+

+ Pakiet zostanie usunięty przy zamykaniu systemu. +

+

+ Jeśli chodzi o działanie samej dystrybucji to jest ono takie trochę + thin-klienckie. Ponieważ położono nacisk na to aby użytkownik logował + się do zdalnego systemu i to na nim pracował i nie pozostawiał po sobie + śladu na terminalu. System automatycznie loguje się na użytkownika po czym + uruchamiane jest środowisko graficzne. Wszelkie zamiany w systemie oraz + dane zapisane przez użytkownika nie zostaną zachowane po restarcie systemu. +

+

+ System zainstalować można na dwa sposoby: +

+ +

+ Pierwszy z nich polega na wgraniu obrazu płyty do pamięci flash terminala. + Drugi przypomina normalną instalację jednak różni się od typowego procesu + instalacji znanego z innych dystrybucji. Polega on na skopiowaniu na dysk + zawartości płyty. Obie metody są opisane w + poradniku instalacji + A link do obrazu LiveCD znajduje się poniżej: +

+ +

+ Poprzednie wersje OTP znajdują się pod tym adresem: https://sourceforge.net/projects/oldterminalproject/files/iso/. +

+

+ Dostęp do przygotowanych pakietów z poziomu LiveCD wymaga + specjalnego montowania: +

+
+$ sudo mount -B /mnt/sr0/cde/sce /tmp/tce/sce
+
+

+ Od wersji 1.0.3 nie ma możliwości instalowania dodatkowych pakietów + w wersji LiveCD. +

+

+ Wszelkie szczegóły odnośnie zmian w kolejnych wydaniach dystrybucji + znajdują się na stronie git projektu, pod poniższy adresem: + https://github.com/xf0r3m/OTP +

+

+ Należy pamiętać, że Old Terminal Project GNU/Linux jest dystrybuowany + bez gwarancji przydatność. Oznacza to że system może w ogóle się nie + uruchomić Twoim sprzęcie. Autor nie ponosi odpowiedzialności za szkody + wyrządzone instalacją OTP. Miłej zabawy. +

+

+ -- Changelog -- +

+

+ -- 06.12.2021 - Rozpoczęcie prac nad OTP.
+ -- 12.12.2021 - Wydanie pierwszej wersji OTP o nazwie kodowej "Wise choice".
+ -- 22.12.2021 - Wydanie wersji 1.0.1.
+ -- 13.02.2022 - Wydanie wersji 1.0.2.
+ -- 16.04.2022 - Wydanie wersji 1.0.3.
+ -- 17.04.2022 - Wydanie wersji 1.0.4.
+ -- 27.04.2022 - Wydanie wersji 1.0.5.
+

+
+ + + + diff --git a/articles/linux/OTP/instalacja.html b/articles/linux/OTP/instalacja.html new file mode 100644 index 0000000..c5ea87c --- /dev/null +++ b/articles/linux/OTP/instalacja.html @@ -0,0 +1,299 @@ + + + + + + + + +
+   ____  __    __   ______                    _             __
+  / __ \/ /___/ /  /_  __/__  _________ ___  (_)___  ____ _/ /
+ / / / / / __  /    / / / _ \/ ___/ __ `__ \/ / __ \/ __ `/ / 
+/ /_/ / / /_/ /    / / /  __/ /  / / / / / / / / / / /_/ / /  
+\____/_/\__,_/    /_/  \___/_/  /_/ /_/ /_/_/_/ /_/\__,_/_/   
+                                                              
+    ____               _           __ 
+   / __ \_________    (_)__  _____/ /_
+  / /_/ / ___/ __ \  / / _ \/ ___/ __/
+ / ____/ /  / /_/ / / /  __/ /__/ /_  
+/_/   /_/   \____/_/ /\___/\___/\__/  
+                /___/                
+
+ +
+

Instalacja OTP

+
    +
  1. Tylko do odczytu: +

    + Z racji tego iż OTP ma służyć terminalom, które mają łaczyć się + z odległmi systemami, system ten nie powinien być postrzegany jako + każdy inny Linux do codziennej pracy, system ten ma za zadanie + tylko i wyłącznie umożliwić Ci podłączenie sie do innego komputera. + Dlatego też można postrzegać go jako firmware, który cały + czas znajduje się w tym stanie, jakby by był świerzo zainstalowany. + Użytkownik nie pozostawia nic po sobie, cały system działa do momentu + działania terminala, uruchomienie urządzenia ponownie ładuje ten sam + nie zmieniony system. Oczywiście to są tylko założenia. +

    +

    + Instalacje systemu w tym trybie rozpoczynamy od przygotowania + pendrive-a z obrazem systemu. Każdy obecnie operuje co najmniej 4GB + kością pamięci USB. System zajmuje niecałe 740MB. Aby nie sciągać pliku + obrazu na uruchomionym z LiveCD terminalu, po załadowaniu ISO na + pendrive utworzymy dodatkową partycję + sformatowaną na FAT, która będzie przechowywać pliku obrazu płyty. +

    +
      +
    • Wgrywanie ISO na pendrive: +
      +$ sudo dd if=OTP-hybrid.iso bs=1M of=/dev/sdb status=progress	
      +
      +
    • +
    • Za pomocą fdisk, tworzymy dodatkową partycję: +
      +$ sudo fdisk /dev/sdb
      +> n
      +> p
      +> 2
      +> [domyślnie]
      +> [domyślnie]
      +> t
      +> 2
      +> b
      +> w
      +
      +
    • +
    • Formatujemy nowo utworzoną partycję na FAT32: +
      +$ sudo mkfs.fat -F32 /dev/sdb2
      +
      +
    • +
    • Montujemy partycję i kopiujemy na nią obraz płyty: +
      +$ sudo mount /dev/sdb2 /mnt
      +$ cp ~/Downloads/OTP-hybrid.iso /mnt
      +
      +
    • +
    +

    + Po skopiowaniu obrazu na partycję, możemy odmontować + pendrive-a, podłaczyć + do terminala i rozpocząć właściwą instalacja, która sprowadza się do + trzech czynności: +

    +
      +
    • Uruchomienia terminala z pamięci USB,
    • +
    • Zamontowania dodatkowej partycji, +
      +$ sudo mount /dev/sdb2 /mnt
      +
      +
    • +
    • Wgraniu obrazu płyty do pamięci flash terminala tak jak na pendrive. +
      +$ sudo dd if=/mnt/OTP-hybrid bs=1M of=/dev/sda status=progress
      +
      +
    • +
    +

    + Minusem instalacji tego typu, jest ograniczona ilość pamięci RAM + w cienkich klientach. To w nim będzie rezydować rootfs, w nim również + będą przechowywane rozszerzenia więc jej zasób może się szybko + wyczerpać. +

    +
  2. +
  3. Instalacja frugal +

    + Instalacja w tym trybie spowoduje, że system będzie przypominać nieco + dotyczasowe Linux-y, ale względu na rozwiązania bazowe dalej system + będzie na nowo ładował ten sam stan przy każdym restarcie. Dane + będziemy mogli zachować na dwa sposoby: +

    +
      +
    • używając polecenia backup przed każdym zamknięciem systemu, + spowoduje to utworzenie archiwum w jednym z katalogów na dysku + i wypakowaywanie jego zawartości przy każdym kolejnym ładowaniu systemu. +
    • +
    • Tworząc swój katalog bezpośrednio dysku, i zapisując w nim wszelkie informacje, + warto dodać, że jako jedyny aktywny użytkownik w tym systemie mamy uprawnienia + administratora. Wariacją tego pomysłu może być oddzielna partycja czy oddzielna + szyfrowana partycja, sam system nie zajmnie więcej niż 1GB. +
    • +
    +

    + Poniżej znajduje się lista kroków, którą należy wykonać aby + zainstalować system w ten sposób. Odnośnie tego sposóbu na moim + osobistym koncie na github znajduje się skrypt, pozwalający + zaoszczędzić trochę czasu na przepisywaniu tych czynności do + terminala. +

    + +

    + Poniższy opis instalacji nie jest zgodny z wersją + 1.0.2. + Prawdobodobnie zostanie zaktualizowany. Jednak zalecaną metodą przy + sposobie frugal jest wykorzystanie skryptu. Skrypt jest + bardzo prosty, i jeśli ktoś naprawdę sobie tego życzy może wykonać + je ręcznie przy okazji dostosowując instalacje do własnych potrzeb. +

    +

    + W zależności od tego czy używamy pendrive'a czy płyty punkt montowania + obrazu instalacyjnego może być inny. +

    +
      +
    • /mnt/sr0 - dla płyt
    • +
    • /mnt/sdX - dla dysków USB
    • +
    +
      +
    1. + Wybranie odpowiedniego dysku przeznaczonego do instalacji systemu. +
      +$ sudo fdisk -l
      +
      +
    2. +
    3. + Partycjonowanie dysku,w przypadku OTP możemy zrobić jedną partycję + obejmującą cały obszar dysku. +
      +$ sudo fdisk /dev/sdX
      +> n
      +> p
      +> [domyślnie]
      +> [domyślnie]
      +> [domyślnie]
      +> a 	#Ustawienie flagi rozruchowej
      +> w
      +
      +

      + gdzie X - to litera oznaczająca dysk. +

      +
    4. +
    5. Formatowanie dysku, domyślnie OTP instaluje się na partycji z system + plików EXT4, wybór innego systemu plików może wymagać użycia innego + programu rozruchowego (w tym materiale jest extlinux). +
      +$ sudo mkfs.ext4 /dev/sdX1
      +
      +
    6. +
    7. Utworzenie nowej zawartości pliku /etc/fstab + systemu tymczasowego w celu łatwiejszego montowania dysku. +
      +$ sudo rebuildfstab
      +
      +
    8. +
    9. Montowanie dysku przeznaczonego na system. +
      +$ mount /mnt/sdX1 
      +
      +

      + Podany tutaj punkt montowania można znaleźć w pliku /etc/fstab. +

      +
    10. +
    11. Tworzenie katalogów dla plików systemowych oraz programu rozruchowego. +
      +$ sudo mkdir -p /mnt/sdX1/boot/extlinux
      +
      +
    12. +
    13. Skopiowanie plików jądra oraz początkowego systemu plików w pamięci RAM na dysk. +
      +$ sudo cp -p /mnt/sdb/boot/* /mnt/sdX1/boot
      +
      +

      + Ignorujemy komunikat o tym, że katalog isolinux został pominięty, tak + właśnie miało być. +

      +
    14. +
    15. Importujemy pakiet e2fsprogs. +
      +$ sce-import e2fsprogs
      +
      +

      + Pakiet ten zawiera program e2label, pozwalający na ustawienie etykiet + system plików rodziny EXT, dzięki ustawieniu etykiety nie będziemy + musieli posługiwać się UUID w pliku konfiguracyjnym programu rozruchowego. +

      +
    16. +
    17. Załadowanie pakietu e2fsprogs. +
      +$ sce-load e2fsprogs
      +
      +

      + Pakiety na dCore (dystrybucja bazowa OTP) wymagają importowania (pobrania + z serwerów, [w tym przypadku Ubuntu] paczki .deb i konwersji jej do pliku + zgodnego z tym portem TinyCore - .sce, A następnie załadowania w systemie + (instalacji). Więcej o tym na stronie głównej projektu. +

      +
    18. +
    19. Ustawienie etykiety dla systemu plików. +
      +$ sudo e2label /dev/sdX1 "OTP"
      +
      +
    20. +
    21. Importowanie pakietu programu rozruchowego. +
      +$ sce-import extlinux
      +
      +
    22. +
    23. Załadowanie pakietu z programem rozruchowym. +
      +$ sce-load extlinux
      +
      +
    24. +
    25. Instalacja plików niezbędnych do startu systemu przy użyciu + programu rozruchowego tego typu. +
      +$ sudo extlinux --install /mnt/sdX1/boot/extlinux
      +
      +
    26. +
    27. Instalacja rekordu rozruchowego (MBR) na dysku. +
      +$ sudo dd if=/usr/lib/EXTLINUX/mbr.bin of=/dev/sdX
      +
      +
    28. +
    29. Utworzenie pliku konfiguracyjnego programu rozruchowego. +
      +$ sudo vi /mnt/sdX1/boot/extlinux/extlinux.conf
      +
      +default OTP
      +label OTP
      +kernel /boot/vmlinuzbionic
      +append initrd=/boot/OTP.gz tce=sdX1 quiet desktop=icewm host=otp
      +
      +
    30. +
    31. Wybranie dysku docelowego dla rozszerzeń dCore, wykonanie tej + czynności spowoduje utworzenie struktury katalogowej w systemie plików. + Tę czynność należy wykonać przed skopiowaniem rozszerzeń z obrazu + instalacyjnego. +
      +$ tce-setdrive
      +
      +

      + Z wyświetlonej listy należy wybrać docelowy punkt montowania. +

      +
    32. +
    33. Skopiowanie rozszerzeń z obrazu instalacyjnego +
      +$ sudo cp -rvv /mnt/sdb/cde/* /mnt/sdX1/tce
      +
      +
    34. +
    +
  4. +
+

+ Po skopiowaniu rozszerzeń, instalacja jest zakończona można uruchomić + komputer ponownie. Za pomocą powyższych sposobów, możemy zainstalować + OTP w pamięci flash naszego terminala. +

+
+ + + + diff --git a/articles/linux/Parabola_GNU_Linux-libre.html b/articles/linux/Parabola_GNU_Linux-libre.html new file mode 100644 index 0000000..e538c10 --- /dev/null +++ b/articles/linux/Parabola_GNU_Linux-libre.html @@ -0,0 +1,895 @@ + + + + + + + + +
+  ____ _   _ _   _   ___     _                       _ _ _              
+ / ___| \ | | | | | / / |   (_)_ __  _   ___  __    | (_) |__  _ __ ___ 
+| |  _|  \| | | | |/ /| |   | | '_ \| | | \ \/ /____| | | '_ \| '__/ _ \
+| |_| | |\  | |_| / / | |___| | | | | |_| |>  <_____| | | |_) | | |  __/
+ \____|_| \_|\___/_/  |_____|_|_| |_|\__,_/_/\_\    |_|_|_.__/|_|  \___|
+
+ +
+

Parabola GNU/Linux-libre

+

+ Parabola GNU/Linux-libre lub poprostu + Parabola Linux, jest to dystrybucja oparta na Arch Linux + stworzona przy użyciu kernela Linux-libre pozbawionego + wszelkiego zamkniętego oprogramowania (blobów binarnych) oraz + zaciemnionego kodu. Uznana za całkowicie wolną przez Free Software + Fundation. +

+

+ Skoro dystrybucja jest oparta na Arch-u to możemy spodziewać się + ręcznej instalacji. Na swoją instalację wybrałem starszy sprzęt bez + Intel ME, dość ciekawe urządzenie bo jest to stary poliwęglanowy + Apple Macbook A1181. +

+

+ macbook_parabola_screenshot +

+
    +
  1. Utworzenie obrazu instalacyjnego +

    + Instalacje systemu zaczniemy od utworzenia obrazu na jakimś pendrive + czy dysku USB. I tu już zaczynają się schody ponieważ ten komputer + nie posiada BIOS-u, lecz wbudowany firmware mianowicie 32-bitowe + EFI. + Niestety metoda opisana na stronie Arch Linux nie działa z tym + sprzętem. Chcąc utworzyć obraz instalacjny dla tego sprzętu musimy + przygotwać nasz dysk wg. instrukcji: + + https://wiki.debian.org/InstallingDebianOn/Apple/MacBook/2-1 + + Po rozpakowaniu pliku iso za pomocą 7-zip-a, kopiujemy cały folder + parabola na dysk USB, następnie należy użyć poniższej + konfiguracji dla GRUB-a. +

    +
    +if loadfont /boot/grub/fonts/unicode.pf2 ; then
    +    set gfxmode=800x600
    +    insmod efi_gop
    +    insmod efi_uga
    +    insmod video_bochs
    +    insmod video_cirrus
    +    insmod gfxterm
    +    insmod png
    +    terminal_output gfxterm
    +fi
    +linux (hd0,msdos1)/parabola/boot/x86_64/vmlinuz-linux-libre parabolabasedir=parabola parabolaisolabel=PARA_202108
    +initrd (hd0,msdos1)/parabola/boot/x86_64/initramfs-linux-libre.img
    +
    +

    + Ostatnią rzeczą jaką należy zrobić przed uruchomieniem komputera + z tego dysku, to trzeba ustawić etykietę dysku na etykietę obrazu + płyty za pomocą polecenia fatlabel +

    +
    +# fatlabel /dev/sda1 PARA_202108
    +
    +

    + Obraz płyty jest gotowy, do boot menu na Macu przechodzimy + przytrzymując klawisz alt/option podczas włączania + komputera pokaże się dysk usb z etykietą "EFI Boot". +

    +
  2. +
  3. Instalacja systemu +

    + Parabola dystrybuowana jest w dwóch wersjach, + OpenRC + lub systemd. Osobiście wybrałem OpenRC, + (i dla tego typu programu init, przedstawię instalację + jeśli wybierzemy systemd, to opis instalacji znajduje + się pod tym linkiem + + http://wiki.parabola.nu/Installation_Guide + , lub podczas instalacji za pomocą polecenia + Installation_guide) + nie wiem czy to nie strzał w stopę, bo jest przyzwyczajony do + systemd, jednak dla takiego sprzetu wydajemi się że + OpenRC będzie lepszym wyborem. +

    +

    + Odziwo Parabola posiada sterowniki do karty bezprzewodowej na + Macu. Połączyć się możemy za pomocą apletu NetworkManager + nmtui-connect. Strzałką wybieramy sieć, zatwierdzamy + enterem, podajemy hasło i następuje łączenie. Połączenie sieciowe + jest wymagane do zainstalowania systemu. +

    +

    + Instalacje systemu rozpocznamy od partycjonowania dysku. Swój + system skonfigurowałem w taki sposób, że mam 3 partycje podstawowe. + EFI, partycja z katalogiem głównym oraz partycję szyfrowaną z + katalogiem domowym. Dlaczego nie użyłem szyfrowania partycji z + z katalogiem głównym? Natknąłem się na błąd, który to uniemożliwiał + podczas ładowania się jądra po wpisaniu hasła do odblokowania + partycji + nie działo się nic. System się zawieszał. Dlatego wybrałem taki + kompromis, ponieważ tak naprawdę zależy mi wyłącznie na ochronie + moich danych. +

    + + + + + + + + + + + + + + + + + + + + + +
    UrządzenieRozmiarPunkt montowania
    /dev/sda1600M/boot (EFI)
    /dev/sda2-1G/
    /dev/sda51Gswap
    +

    + Powyżej znajduje się tabela przedstawiająca partycjonowanie. + Pominąłem partycję dla szyfrowania pod /home, nią zajmiemy + po zainstalowaniu systemu. Po spartycjonowaniu dysku tworzymy + odpowiednie dla przeznaczenia partycji systemy plików. +

    +
    +#Partycja /boot:
    +# mkfs.vfat -F32 /dev/sda1
    +#Partycja /:
    +# mkfs.ext4 /dev/sda2
    +#Swap:
    +# mkswap /dev/sda5
    +
    +

    + Montujemy główny system plików pod katalogiem /mnt, + po zamontowaniu tworzymy w nim nowy katalog boot pod ten + katalog montujemy partycje EFI, na sam koniec możemy włączyć + przestrzeń wymiany. +

    +
    +# mount /dev/sda2 /mnt
    +# mkdir /mnt/boot
    +# mount /dev/sda1 /mnt/boot
    +# swapon /dev/sda5
    +
    +

    + Teraz przechodzimy do instalacji systemu. Instalacja systemu + polega na instalacji pakietów za pomocą odpowiedniego narzędzia. + Poradnik instalacji, rozmienia się z tą czynnością na kilka + podpunktów, ja złoże je w jedno duże polecenie. +

    +
    +$ pacstrap /mnt base libelogind udev-init-scripts linux-libre-lts networkmanager grub vim cryptsetup dhclient man-db man-pages texinfo 
    +
    +

    + Jest wielce prawdopodobne, że podczas instalacji wystąpi błąd + związany z podpisami lub integralnością pakietów instalacja + zostanie przerwana i należy go naprawić aby pójść dalej. +

    +

    + W poradniku instalacji w podpunkcie poświęconym temu problemowi + są dwa polecenia. Należy je przepisać i uruchomić. +

    +
    +# pacman -Sy archlinux-keyring archlinuxarm-keyring parabola-keyring
    +# pacman -U https://www.parabola.nu/packages/core/i686/archlinux32-keyring-transition/download/
    +
    +

    + Następnie musimy odswierzyć klucze dewelopera, które się + niezgadzają. +

    +
    +# pacman-key --refresh-keys mail_dewelopera@example.com
    +
    +

    + Po wykonaniu tej czynności należy powtórzyć te dwa polecenia + wykonywane przed odświerzeniem kluczy. Teraz klucze powinny się + zgadzać i instalacja powinna ruszyć dalej. +

    +

    + Zakończenie działania polecenia + pacstrap oznacza teoretycznie, że + system jest zainstalowany. Niestety tylko w teorii. Wymaga on + jeszcze konfiguracji. Zaczniemy od wygenerowania pliku + /etc/fstab na podstawie zamontowanych dysków. +

    +
    +# genfstab -U /mnt >> /mnt/etc/fstab
    +
    +

    + Zmieniamy nasz katalog główny na /mnt, wykorzystując do + tego specjalne narzędzie dostarczane wraz ze wszystkimi + dystrybucjami opartymi na Arch Linux. +

    +
    +# arch-chroot /mnt
    +
    +

    + Ustawienia właściwe adresy w pliku /etc/hosts. +

    +
    +127.0.0.1   localhost
    +::1         localhost
    +127.0.1.1   macbook.localdomain macbook
    +
    +

    + W pliku /etc/conf.d/hostname ustawiamy nazwę hosta. Nie + działa to + jednak ponieważ nie w systemie brakuje polecenia, które miały by + tę nazwę ustawić. Nazwę ustalimy za pomocą polecenia + nmtui-hostname, kiedy już go uruchomimy. +

    +

    + Następną rzeczą do ustawienia są locale. W pliku + /etc/locale.conf, zapisujemy poniższe dane. +

    +
    +LANG="pl_PL.UTF-8"
    +LC_COLLATE="C"
    +LC_TIME="pl_PL.UTF-8"
    +
    +

    + Powyższy plik nie jest jedym plikiem, w którym należy zapisać + locale. Otwieramy plik /etc/locale.gen, w pliku + poszukujemy pl_PL.UTF-8 UTF-8. Usuwamy znak komentarza + sprzed wyszukanej frazy i zapisujemy plik. +

    +
    +...
    +#pap_AW UTF8
    +pl_PL.UTF-8 UTF-8
    +#pl_PL ISO-8859-2
    +...
    +
    +

    + Nastepnie wydajemy polecenie: +

    +
    +(chroot)# locale-gen
    +
    +

    + W pliku /etc/conf.d/keymaps ustawimy układ klawiatury dla + konsoli, natomiast w pliku /etc/conf.d/consolefont ustawimy + czcionkę oraz mapę znaków aby zapewnić poprawne wyświetlanie + polskich znaków w konsoli. +

    +

    + W /etc/conf.d/keymaps ustawiamy opcję + keymap, resztę pozostawiamy bez zmian. +

    +
    +keymap="pl"
    +
    +

    + W /etc/conf.d/consolefont ustawiamy dwie opcje + consolefont oraz consoletranslation + zgodnie z poniższymi ustawieniami. +

    +
    +consolefont="lat2-16"
    +consoletranslation="8859-2"
    +
    +

    + Po zapisaniu zmian w pliku możemy przejść do instalacji + programu rozruchowego GRUB. Instalacja wymaga + jedynie dwóch poleceń. +

    +
    +(chroot)# grub-install --target=i386-efi --efi-directory=/boot --bootloader-id=GRUB
    +(chroot)# grub-config -o /boot/grub/grub.cfg
    +
    +

    + Teraz instalacja jest teorytcznie zakończona, jednak przed + odmontowaniem partycji musimy: +

    +
      +
    • Ustawić hasło dla superużytkownika.
    • +
    • Skopiowiać plik /etc/init.d/NetworkManager z + uruchomionego z płyty, najlepiej do katalogu + użytkownika root.
    • +
    +

    + Ustawienie hasła dla root-a jest banalnie proste. +

    +
    +(chroot)# passwd
    +
    +

    + Podajemy nowe hasło dwa razy. Druga czynność wymaga już opuszczenia + środowiska zmienionego katalogu głównego. Katalog z dysku opuszczamy + wydając po prostu polecenie exit. + Następnie kopiujemy plik usługi NetworkManager do katalogu + /mnt/root. +

    +
    +(chroot)# exit
    +# cp /etc/init.d/NetworkManager /mnt/root
    +
    +

    + Po wykonaniu tej czynności możemy odmontować systemy plików dysku + za pomocą jednego polecenia następnie uruchomić komputer ponownie. + Instalacja została zakończona. +

    +
    +# umount -R /mnt
    +# reboot
    +
    +
  4. +
  5. Pierwsze uruchomienie i konfiguracja katalogu /home +

    + Po uruchomieniu komputeraz uslyszysmy charakterystyczny gong. Na + ekranie pojawi się białe tlo. Zostaniemy przeniesieni odrazu do + menu GRUB-a. Wybieramy domyślną opcję. Komputer może się zawiesić + w trakcie ładowania jądra do pamięci, więc jeśli utkniemy z dwoma + napisami w lewym górnym rogu ekranu, to możemy wyłączyć twardo + komputer i uruchomić go ponownie. Teraz z GRUBa wybieramy tę drugą + opcję i z następnego podmenu wybieramy opcje nr. 1. Teraz system + powinien się uruchomić. Jeśli znów się zawiesił, to znów twardo go + wyłączamy i wybieramy domyślną opcję z menu GRUB-a. Czasami + potrzeba kilku takich uruchomień aby komputer się uruchomił. + Po załadowaniu dostaniemy wyłącznie dostęp do konsoli. + Na początku musimy zalogować się jako root. +

    +

    + Na partycji, dla której przeznaczyliśmy większość miejsca na dysku. + Nie tworzymy zwykłego systemu plików, tylko system + plików przeznaczony do szyfrowania LUKS. +

    +
    +# cryptsetup -y -v luksFormat /dev/sda3
    +
    +

    + Program podczas tworzenia plików zapyta o potwierdzenie, trzeba + wiekimi literami wpisać YES. Następnie polecenie + zapyta o hasło szyfrowania woluminu, dwukrotnie. Po utworzeniu + trzeba wolumin otworzyć. +

    +
    +# cryptsetup open /dev/sda3 crytphome
    +
    +

    + Polecenie zapyta o klucz do odszyfrowania (hasło), następnie + utworzy nowe urządzenie blokowe w katalogu /dev/mapper o + nazwie, podanej jako ostatni argument polecenia. To nazwą może być + cokolwiek. To utworzone urządzenie montujemy pod katalogiem + /home. +

    +
    +# mount /dev/mapper/crypthome /home
    +
    +

    + Przy tej konfiguracji będziemy wracać do tego punktu podczas + zamykania systemu. Dla bezpieczeństwa szyfrowanego woluminu lepiej + kulturalnie go odmontować i zamknąć. +

    +
    +# umount /home
    +
    +

    + Czasami na pewno zadarzy się sytuacja, że nie będziemy mogli + odmontować tego katalogu, ponieważ cel jest zajęty. + Oznacza to mniej więcej tyle, że w systemie istnieje + jeszcze jakiś działający proces użytkownika, w celu zbadania + sytuacji, wydajemy polecenie: +

    +
    +# ps -aux
    +
    +

    + Jeśli proces jest nie istotny, dla wyników naszej pracy na + komputerze, możemy go na początku spróbować kulturalnie zamknąć + wydajac polecenie kill wraz z PID-em procesu, oczywiście + bez podawania żadnego symbolu sygnału. +

    +
    +# kill PID
    +
    +

    + Jeśli to nie pomoże, proces należy zabić dodając do powyższego + polecenia opcje -9, prosząc jądro o wysłanie do procesu + sygnału KILL. +

    +
    +# kill -9 PID
    +
    +

    + Innym powodem problemów z odmontowaniem katalogu /home + są podmontowane w jego podkatalogach inne systemy plików jak + udziały SMB. Należy je ręczenie odmontować lub użyć polecenia: +

    +
    +# umount -R /home
    +
    +
  6. +
  7. + + Nowy użytkownik oraz nadanie mu uprawnień superużytkownika + +

    + Kiedy mamy już miejsce na nasze dane, możemy utworzyć nowego konto + na którym będziemy je przechowywać. Prawdopodobnie jesteśmy + jedymi realnymi użytkownikami tego systemu więc nadamy mu + uprawnienia superużytkownika aby nie trzeba było się przelogowywać. + Wyższych uprawnień będziemy potrzebować do instalacji środowiska + graficznego. +

    +

    + Użytkownika tworzymy za pomocą poleceania useradd, + wraz z opcją -m, która spowoduje utworzenie katalogu + domowego oraz skopiowanie zawartości katalogu /etc/skel + zawierającego pliki konfiguracyjne powłoki oraz pliki domyślne + użytkowników systemu. Po utworzeniu użytkownika należy pamiętać o + zdefiniowaniu hasła dla użytkownika. Hasło należy podać dwukrotnie. +

    +
    +# useradd -m xf0r3m
    +# passwd xf0r3m
    +
    +

    + W systemie prawdopodbnie nie będzie zainstalowanego programu + sudo. Więc możemy go doinstalować, jeśli czytasz + to przed rozpczęciem jakich kolwiek prac, możesz dopisać + sudo do polecenia pacstrap + instalującego system. +

    +
    +# pacman -Syu sudo
    +
    +

    + Po zainstalowaniu pakietu, przechodzimy do pliku + /etc/sudoers. Plik jest tylko do odczytu, nawet dla + root. Przejście w tryb edycji (jeśli używamy programu Vim) + czy zapisanie zmian będzie wymagać potwierdzenia. W pliku odszukujemy + lini root ALL=(ALL) ALL, pod nią możemy zapisać identyczną + frazę zmieniając tylko użytkownika lub poniższą dzięki, której nie + będzie potrzeby wpisywania hasła. +

    +
    +xf0r3m ALL=(ALL) NOPASSWD:ALL
    +
    +

    + Po zapisaniu zmian możemy opuścić konto superużytkownika, wylogowując + się poleceniem exit. Następnie zalogować się na swoje konto. +

    +
  8. +
  9. + Instalacja i konfiguracja środowiska graficznego. +

    + Na tym Macbook-u, którego użyłem do instalacji, procesor + Core2Duo poci się niemiłośernie. Osiągając 65 - 70 stopnii C + temperatury roboczej, co przekłada się na hałas generowany przez + wentylator, na tym sprzęcie mam ograniczenia również co do wiekości + zainstalowanej pamięci RAM, mimo włożenia dwóch kości po 2GB system + system obsługuje maksymalnie 3GB. Aby móc na nim bez przeszkód + pracować + potrzebowałem lekkiego środowiska aby przeznaczyć więcej pamięci na + programy, do tej instalacji użyłem środowiska + fluxbox. Teraz + pisząc ten tekst, z włączonym Vim-em oraz odtwarzaczem muzyki + moc oraz menedżerem zadań htop wykorzystane ma + 122MB. Pozostawiając ponad 2,5 GB na pozostałe programy. Ta + konfiguracja + jest rozwiązaniem dla osób, które nie boją się terminala. Jednak + wybierając dystrybucję z rodziny Arch Linux, trzeba mieć to + na uwadze. Instalacje rozpoczynamy od zainstalowania odpowiednich + pakietów. +

    +
    +$ pacman -Syu xorg xorg-xinit xorg-xauth fluxbox xf86-video-intel terminator
    +
    +

    + W dystrybucjach opartych na Arch-u zauważyłem, że duże pakiety + oprogramowania są podzielone na mniejsze częsci, jeśli nie + zainstalujemy pakietu xorg-xinit to będzie brakować polecenia + startx. Pakiet + xf86-video-intel można by tak + rzec, że jest to podstawowy sterownik grafiki, bez niego środowisko + nie ruszy + czego osobiście doświadczyłem. Jako emulator terminala wybrałem, + terminator + ponieważ jest samodzielnym programem zapewniającym poprawne + wyświetlanie polskich znaków (O tym będzie w następnym punkcie). +

    +

    + Po zainstalowaniu pakietów uruchamiamy środowisko graficzne i + zaraz je zamykamy. Przez to fluxbox utworzy w katalogu + domowym użytkownika, katalog konfiguracyjny .fluxbox w + nim znajduje się plik pod nazwą menu. Aby uruchomić poraz + pierwszy środowisko graficzne, potrzebujemy pliku, który wskaże + serwerowi X11, który menedżer okien ma uruchomić, taki plik nazywa + .xinitrc i znajduje się w katalogu domowym użytkownika. + W pliku wystarczy zapisać jedno polecenie: +

    +
    +exec fluxbox
    +
    +

    + Ten plik może wydawać się nie pozorny, jednak będzie zawierać + istotne ustawienia, takie jak ustawienie tapety czy chyba + najważniejsze, ustawienia układu klawiatury w środowisku graficznym. +

    +

    + Przy pierwszym uruchomieniu fluxbox utworzy w katalogu + domowym użytkownika, katalog konfiguracyjny .fluxbox w + nim znajduje się plik menu. W pliku odnajdujemy + znacznik [begin] w nawiasie okrągłym obok możemy podać + tytuł menu np. "Parabola GNU/Linux-libre on MacBook 2,1". + Od znacznika [begin] po znacznik [end] + znajduje się definicja menu głównego, pierwszy + wpis oznaczony znacznikiem [exec] zawiera wpis w menu dla + programu xterm, takie programu w systemie nie ma (możemy + go doinstalować jednak na próżno szukać w nim poprawnego wyświetlania + polskich znaków). Ten wpis przystowujemy, aby uruchamiał program + terminator. Budowa wpisu elementu menu, wygląda następująco. + Na początku mamy typ elementu, może być to program + co jest równoznaczne z typem [exec] lub np. submenu jeśli + chcemy podzielić wpisy. Wiele typów jest wypisanych w + domyślnej konfiguracji wewnątrz pliku. Na tym etapie interesować nas + będzie wyłącznie [exec]. Następnym elementem wpisu jest + etykieta elementu umieszczona wewnątrz nawiasów okrągłych + (). Możemy wpisać cokolwiek, oczywiście warto + pamiętać o tym, że ta etykieta pozwoli nam odnaleźć ten konkretny + program, gdy w menu nagromadzi się wiele wpisów w miarę + korzystania z komputera. Ostatnim elementem jest polecenie zawarte + w tym przypadku w nawiasach klamrowych {}. Aby + dostosować wpis xterm dla terminatora, zamieniamy + xterm na terminator. Skoro wiemy jak dodawać + programy do menu, to nic nie stoi na przeszkodzie, aby doinstalować + swoje ulubione programy, o ile tylko znajdują się one w repozytorium. +

    +

    + Warto wspomnieć że wykorzystywaną przeglądarką w tej dystrybujcji + jest Iceweasel. Jest to z przerobiony Firefox, z + którego usunięto obsługę DRM oraz wszystkie rzeczy, które przez FSDG + (Free Software Distribution Guidelines) - wytyczne dla + wolnych dystrybucji uznawane są za nie wolne (non-free). + Ta przeglądarka była zamiennikiem Firefoxa dla Debiana od 4 wersji + oraz dla innych dystrybucji bazujących na nim do 2016 roku. + Pamiętam, że jej zaletą była + świetna wydajność na każdym możliwym sprzęcie, i to się chyba nie + zmieniło. Deweloperzy Parabola GNU/Linux-libre są chyba jedynym + zespołem, który aktywnie rozwija ten porzucony projekt. Brak DRM + oznacza, że korzystając z tej przeglądarki możemy zapomnieć o + korzystaniu z większości serwisów streamingowych. +

    +

    + Jeśli chodzi o moją konfigurację, to używam terminatora jako + emulatora terminala, Vim-a jako domyślnego edytora tekstów + w nim pisze ten tekst, moc (ang. Music on Console) - jako + odtwarzacza muzyki, mpv jako odtwarzacza plików wideo. + leafpada jako podręcznego notatnika, htop jako + mendżera zadań (istotną jego rolą jest wskaźnik poziomu naładowania + baterii, dlatego działa non stop), graficzny menedżer plików zastępuje + mi konsolowy ranger. To wszystko. +

    +

    + Wrócimy do menu. W podmenu Fluxbox możemy zmienić + domyślny motyw mendżera okien. Na swoim komputerze wybrałem + temat BlueNight, który komponuje się z tapetą Parabola + GNU/Linux-libre, ukradzoną z obrazu instalacyjnego wersji + skierowanej na desktopy. Żeby nie musieć uruchamiać jeszcze raz + komputera z płyty umieściłem ją na w serwisie ImgBB, link znajduje + się poniżej. +

    +

    + https://ibb.co/RPjpy4g +

    +

    + Aby ustawić tapetę potrzebujemy zewnętrznego programu. Takim program + może być feh, w którym ustawienie tapety jest jedną + z dodatkowych funkcji, tak naprawdę to program do otwierania plików + graficznych czy też obrazów. Pobrany plik tapety należało by gdzieś + zabezpieczyć aby nie usunąć go przypadkiem podczas oczyszczania, + katalogu Pobrane czy Downloads. W pliku + ~/.xinitrc nad poleceniem + exec zapisujemy poniższe polecenie. +

    +
    +feh --bg-fill ~/sciezka/do/pliku/tapety
    +
    +

    + Zapisujemy zmiany. Jeśli uruchomimy teraz środowisko graficzne, + tapeta mignie nam na chwile i najprawdopodbniej zostanie zastąpiona + tłem wybranego przez nas tematu. Musimy wyłączyć tło z tego tematu. + Motywy dostarczane wraz z system dostępne są w katalogu + /usr/share/fluxbox/styles, jeśli styl w tym katalogu jest + podkatalogiem, to w środku podkatalogu znajduje się plik + theme.cfg, w nim trzeba wyłączyć wszystkie linie dotyczące + tła (ang. background). Wyłączyć je możemy umieszczając + na ich początku symbol komentarza. +

    +
    +#background: flat
    +#background.color: rgb:6A/9A/AF
    +
    +
  10. +
  11. + Ustawienie polskich znaków w konsoli, polskiego układu + klawiatury w środowisku graficznym oraz problemy z NetworkManager po + aktualizacji oraz nazwa komputera. +

    + Podczas instalacji ustawialiśmy w pliku opcje dotyczące czcionki oraz + mapę znaków konsoli. Jednak jak mogliśmy zauważyć zamiast + polskich znaków wyświetlają się białe kwadraciki. Jeśli otworzymy + ten plik jeszcze raz, w pierwszej linii znajduje sie informacja, że + te ustawienia nie są włączone domyślnie i trzeba je właczyć za pomocą + podanego polecenia. +

    +
    +$ sudo rc-update add consolefont boot
    +
    +

    + Po restarcie, polskie znaki powinny poprawnie się wyświetlać. +

    +

    + Kiedy uruchomimy środowisko graficzne oraz terminator, to tutaj też + może być problem z polskimi znakami. Problem wynika z tego, że + serwer xorg, nie ma załadowanego polskiego układu klawiatury + Układ klawiatury dla X Window może być ładowany przed jego + startem, więc dodamy kolejne trzecie polecenie do pliku + ~/.xinitrc. Polecenie to umieszczamy nad poleceniem + exec. +

    +
    +setxkbmap -layout pl
    +
    +

    + Po zamknięciu Fluxbox-a (opcja Exit w submenu + Fluxbox) i uruchomieniu jeszcze raz środowiska graficznego, + polskie znaki w terminatorze powinny się wyświetlać + poprawnie. +

    +

    + Podczas aktualizacji systemu zostanie zainstalowana nowa wersja + programu NetworkManager. Instalacja tej aktualizacji + usuwa ten program jako usługę, co może nieco utrudnić nam życie, + ponieważ będzie trzeba za każdym razem łączyć się samodzielnie + z internetem, jest to jeszcze do zniesienia jeśli mamy + zainstalowany pakiet dhclient. NetworkManager + zawiera kilka wygodnych narzędzi jak nmtui-connect + (menedżer połaczeń sieciowych) czy nmtui-hostname. Ze + względu na ten problem kazałem podczas instalacji skopiować plik + usługi + NetworkManager. Teraz wystarczy go przekopiować do katalog + /etc/init.d nadać odpowiednie uprawnienia i dodać do + uruchomienia wraz ze startem systemu. +

    +
    +$ sudo su
    +# cp /root/NetworkManager /etc/init.d
    +# chmod +x /etc/init.d/NetworkManager
    +# rc-update add NetworkManager boot
    +
    +

    + Ostatnim zagadnieniem na tej liście będzie nazwa komputera. Podczas + instalacji wsponiałem, że zdefiniowanie nazwy hosta w pliku tak jak + każe przewodnik instalacji nic nie da ponieważ to nie działa. + Podczas uruchamiania systemu, uruchamiana jest również usługa + hostname jednak jej start kończy się fiaskiem. Dlaczego? + Otóż dlatego, że mino odczytu nazwy z pliku podanego w poradniku to + w systemie brakuje programu, który tę nazwę ustawi - polecenia + hostname. + Podejrzewam, że usługa ta jest jedną z domyślnych systemu + OpenRC, a sama dystrybujcja wykorzystująca tego typu wersję + programu init nie przewiduje potrzeby posiadania polecenia + hostname. Jedynym w miarę zadawalającym wynikiem jest + użycie wspomnianego już narzędzia nmtui-hostname. + Problem z tym rozwiązaniem jest tego typu, że nazwa zostanie + ustawiona dopiero po zalogowaniu się użytkownika. Po wydaniu + polecenia: +

    +
    +$ sudo mntui-hostname
    +
    +

    + Wyświetli się okienko z polem do wpisania nazwy komputera, następnie + wybieramy "Ok", jeśli nazwa nie zostanie ustawiona od razu wymagany + będzie restart systemu. +

    +

    + Opisane powyżej problemy prawdopodbnie występują wyłącznie w wersji + OpenRC Parabola GNU/Linux-libre. +

    +
  12. +
+

+ Podsumowując, dużo satysfakcji daje posiadanie w pełni wolnego systemu + operacyjnego na mogło by się wydawać tak zamkniętym sprzęcie jakim + może być ten MacBook. Sam jestem zdumiony, że wszystko w nim działa od + możliwości uruchomienia środowiska graficznego po sieć bezprzewodową to + pierwsze potrafi nie być tak oczywiste a o tym drugim na wielu sprzętach + przenośnych możemy poprostu zapomnieć lub dokupić sobie adapter z chipem, + dla którego istnieje wolny sterownik. Jaką kartę kupić możemy sprawdzić + na tym portalu: https://deviwiki.com. + Problem z korzystaniem z komputera tego typu jest klawiatura, MacBooki + mają inny okład klaiwszy od zwykłych pecetowych klawiatur. Sam system + posiada kilka niedociągnęć. Podejrzewam jednak, że niema dystrybucji + doskonałej, a bazując na swoich doświadczeniach zauważyłem, że im więcej + warstw (duża ilość róźnych demonów, podsystemów itp.) tym więcej jest + z taką dystrybucją problemów. Warto by naprawić w tej dystrybucji tę + nazwę komputera bo to trochę żałosne. Każą Ci to zrobić w poradniku + instalacji, a to i tak niedziała (XD). Czy będe korzystał z tego + komputera i systemu? Podoba mi się wydajność opisanego tu rozwiązania + na tym sprzęcie. Jedyną wadą może być brak dostępu do maszyn wirtualych, + ale mam w zanadzrzu jescze kilka serwerów. Więc myślę, że tak. + Wracając do klawiatury. MacBooki zarówno + te stare jak i te nowe posiadają inny układ klawiatury, różni się on + o tyle, że przesiadając się na z PC na Maca i odwrotnie trzeba + się chwilę do niej przyzwyczaić. Komputery Apple + w swoich klawiaturach mają zamieniony miejscem (względem klawiatur PC) + prawy alt. Klawisz ten to modyfikator do + wpisywania liter diakrytycznych specyficznych dla konkretnego języka. + W moim przypadku gdy korzystam na PC z klawiatur gamingowych nie + posiadają one prawego klawisza Windows. Posiadają przycisk Fn, który nie + jest przekazywany do komputera przez klawiaturę, więc nie miałem z czym + zamienić klawisza alt, ale jeśli nie w tę strone to może w drugą. Na + MacBooku zamienię prawy alt z prawym CMD. + Znalazłem na serwisie superuser.com + jak zamienić ze sobą klawisze na środowiskach graficznych opartych na + X Window. Potrzebny jest dodatkowy dot-file + .Xmodmaprc w katalogu + domowym użytkownika oraz dodatkowe polecenie w pliku .xinitrc. + Poniżej znajduje się listing pliku .Xmodmaprc z poleceniami dla + programu xmodmap. +

+
+remove mod5 = ISO_Level3_Shift
+remove mod4 = Super_R
+keycode 108 = Super_R
+keycode 134 = ISO_Level3_Shift
+add mod5 = Super_R
+add mod4 = ISO_Level3_Shift
+
+

+ Po utworzeniu pliku zapisujemy polecenie, które uruchomi zamianę klawiszy + przed uruchomieniem środowiska graficznego (polecenie umieszczamy przed + poleceniem exec). To rozwiązanie działa + tylko dla środowiska graficznego. +

+
+xmodmap ~/.Xmodmaprc
+
+

+ Z czystej ciekawości postanowiłem sprawdzić na większości swoich sprzętów + jak na nich będzie funkcjonować Parabola. Poniżej zamieściłem tabelkę z + nazwą sprzętu oraz z tym co działa a co nie. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Lp.Nazwa sprzętuGUIAudioWi-FiUwagi
1.Apple MacBook A1181 + 32-bitowe EFI, trzeba specjalnie przygotować dysk USB, żeby zbootwać + Linux-a na tym sprzęcie. +
2.Saphire Pure White Fusion
AMD E-350 mini-ITX
N/A + Domyślnym wyjściem audio jest port HDMI, możemy zmienić to + wyświetlając listę wyjść audio oraz wskazując odpowiednie wyjście + sterownikowi. Listę wyjść możemy wyświetlić za pomocą polecenia: +
+$ lspci -knn | grep -iA2 audio
+
+ Lista domyślnie numerowana jest od 0. Jest to istotne, ponieważ + trzeba podać index - pozycję na liście. + Domyślne wyjście ustawiamy tworząc plik default.conf w + katalogu /etc/modprobe.d. W pliku zapisujemy poniższą + linię. +
+options snd_hda_intel index=1
+
+
3.HP Z600 WorkstationN/A + Bardzo szybkie działanie systemu! +
4.Gigabyte H55M-UD2H/i5-650/
16GB DDR3 1333MHz/GeForce 210
N/A
5.HP 550 + Karta sieciowa Broadcom, brak wolnego sterownika. +
6.Dell Wyse Z90D7N/A + Problemy z UEFI, przy próbie zainstalowania systemu wyświetla się + "Could not prepare boot variable: No space left on device". + Nie możliwe jest zbootowania z BIOS. Zainstalowałem + rEFInd na + dysku USB w środowisku zmienionego katalogu (dysk z zainstalowanym + system oraz programem rozruchowym w trybie BIOS), przez co program + utworzy wpis w menu umożliwiający uruchomienie z niego jądra. + Program należy zainstalować z repozytorium a następnie wydać + poniższe polecenie. +
+refind-install --usedefault /dev/sdXY
+
+ Gdzie /dev/sdXY jest partycją + stworzoną na dysku USB, partycja powinna być ustawiona na + EFI (kod typu partycji w programie fdisk: + ef) oraz sformatowana na FAT-32.
+

+ Jeden wpis nie oznacza całej tabeli, w miarę moich możliwości będę + sprawdzał inne sprzęty, o aktualizacjach będę informował w changelogu + na stronie głównej. +

+

+ Źródła: +

+
    +
  1. Przydatne informacje podczas tworzenia USB z obrazem płyty dla MacBook 2,1
  2. +
  3. + Poradnik instalacji Parabola GNU/Linux-libre
  4. +
  5. + Zamiana klawiszy za pomocą xmodmap na https://superuser.com +
  6. +
  7. + Ustawienie domyślnego wyjścia audio dla sterownika HDA Intel +
  8. +
  9. + Artykuł o rEFInd na Wiki Arch Linux
  10. +
+

+ ~xf0r3m +

+
+ + + + + diff --git a/articles/linux/generowanie_certyfikatu_Let's_Encrypt_typu_wildcard.html b/articles/linux/generowanie_certyfikatu_Let's_Encrypt_typu_wildcard.html new file mode 100644 index 0000000..27834b2 --- /dev/null +++ b/articles/linux/generowanie_certyfikatu_Let's_Encrypt_typu_wildcard.html @@ -0,0 +1,147 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Generowanie certyfikatu SSL Let's Encrypt typu Wildcard

+

+ Pośród materiałów odnośnie GNU/Linux znajduje się też taki nt. generowania certyfikatu SSL podpisanego przez samego siebie. W tym materiale wykorzystamy ogólnodostępny urząd certyfikacji - usługę Let's Encrypt. Nie wiem jaka jest geneza tej usługi, ale śmiem przypuszczać że ideą, która za tym stoi jest umożliwienie każdemu posiadaczowi domeny wygenerowanie certyfikatu SSL, w celu zabezpiecznia transmisji pomiędzy jego serwerami a klientami korzystającymi z usług świadczonych przez ten serwer. Cel sczytny, ale każdy kij ma dwa końce. Do momentu upowszechnienia się Let's Encrypt, "zielona kłódka" oznaczała serwer godny zaufania, ponieważ tylko komercyjne certyfikaty były akceptowane przez przeglądarkę bez zastrzeżeń. + Teraz tylko tyle że "kłódka" jest zielona, nie może oznaczać że serwer jest wiarygodny, teraz liczy się głównie wystawca, jednak aby zobaczyć kto jest wystawcą danego certyfikatu należy kliknąć w tą "kłódkę" i będziemy mieli taki napis jak "Connection secure" lub "Połączenie zabezpieczone" kilkamy w tą strzałeczkę po prawej stronie i powinno się wyświetlić "Verified by: " lub "Zweryfikowano przez: " i nazwa wystawcy. Oczywiście nie możemy demonizować Let's Encrypt bo naprawdę jest to coś dobrego, chciałbym tutaj tylko uczulić na to że jeśli logujemy się do banku to jeśli już weryfikujemy czy połączenie jest bezpieczne, to sprawdźmy wystawcę, na 99,9% na pewno nie powinno być nim Let's Encrypt. + Chyba że to jakiś bank dla Januszy, to warto zmienić bank wtedy. Tak samo jest kontami na socjalacha czy skrzynkach mailowych. Duże korporacje mają swoje wewnętrzne urzędy, które dbają o ich certyfikaty. Obecnie intruzi, którzy stosują phishing, często wykorzystują Let's Encrypt aby jeszcze bardzie uwiarygodnić strony do wyłudzania danych. Nie mniej jednak każdy może mieć taki certyfikat wystarczy posiadanie domeny. Certyfikat, który będzie akceptowany w 100% przez przeglądarkę. I tutaj dowiemy się jak go uzyskać. +

+

+ Pierwszą czynnością jest zdobycie oprogramowania, które umożliwi nam uruchomienie procesu generowania certyfikatu przez Let's Encrypt. W zależności od systemu, czy jest Raspbian/RasPiOS pownieważ chcemy uzyskać nasz certyfikat na Raspberry Pi, co może być ciekawym pomysłem o ile powstrzymamy się z wykorzystaniem karty z Raspberry do czegoś innego, kiedy będzie nam ona potrzebna. Nie jest to niezbędne, ale lepiej jest zachować system na którym uzyskało się certyfikat poźniej będzie go łatwiej odnowić, certyfikaty Let's Encrypt ważne są tylko przez 3 miesiące, oczywiście odnawiać będziemy tylko certyfikaty wystawione manualnie. Zatem dla Raspbiana powiniśmy wydać poniższe polecenia. +

+
+$ sudo apt update
+$ sudo apt install certbot
+
+

+ Jeśli korzystamy z Ubuntu to należy na początku sprawdzić powyższe polecenia, a jeśli ono niezadziała, to należy spróbować tych poleceń poniżej. +

+
+$ sudo add-apt-repository ppa:certbot/certbot
+$ sudo apt update
+$ sudo apt install certbot
+
+

+ Jeśli wykorzystujemy inną dystrybucje niż powyższe to spóbujmy zainstalować pakiet certbot za pomocą menedżera pakietów używanej przez nasz dystrybucji. Gdy na nawet to się nie powiedzie, to wtenczas możemy odpytać naszą wyszukiwarkę "How to install certbot on", po słowie "on" podajemy nazwę naszej dystrybucji. +

+

+ Po zainstalowaniu certbot-a w naszym systemie, zalogujmy się do konfiguracji domeny u swojego operatora, żeby uwierzytelnić się (pokazać że domena należy do nas) będziemy musieli dodać dwa rekordy DNS. Kiedy już się zalogujemy to wydajemy poniższe polecenie, uruchomi ono cały proces uzyskiwania certyfikatu. +

+
+$ sudo certbot certonly --manual -d *.<nazwa_domeny> -d <nazwa_domeny> --agree-tos --no-bootstrap --manual-public-ip-logging-ok \
+--preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
+
+

+ Jeśli kopiujemy to polecenie pamiętajmy o tym że należy podać w polach <nazwa_domeny> nazwę swojej domeny. Po wydaniu tego polecenie zostaniemy zapytani o adres email. Polecam podać prawdziwą skrzynkę ponieważ na nią przyjdzie wiadomość o wygasającym certyfikacie. +

+
+Saving debug log to /var/log/letsencrypt/letsencrypt.log
+Plugins selected: Authenticator manual, Installer None
+Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): <adres_email>
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+

+ Po podaniu adresu email zostaniemy zapytani o to czy chcemy się zapisać tak jak by do newsletter-a EFF. +

+
+Would you be willing to share your email address with the Electronic Frontier Foundation, a founding
+partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to
+send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital
+freedom.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+(Y)es/(N)o:
+
+

+ Po udzieleniu odpowiedzi na powyższe pytanie, rozpocznie się uzyskiwanie certyfikatów. Aby uzyskać certyfikaty musimy wprowadzić jedno lub dwukrotnie nowy rekord typu TXT w konfiguracji naszej domeny. Rekord powinień mieć nazwę _acme-challenge.<nazwa_domeny>, gdzie za nazwa_domeny podstawiamy nazwę naszej domeny wartością tego rekordu będzie ciąg znaków wyświetlony tak jak na poniższym komunikacie. +

+
+Please deploy a DNS TXT record under the name
+_acme-challenge.<nazwa_domeny> with the following value:
+
+[Tutaj pojawi się tekst challengu]
+
+Before continuing, verify the record is deployed.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Press Enter to Continue
+
+

+ W powyższym polu [Tutaj pojawi się tekst challengu] pojawi się ciąg znaków jaki należy umieścić w polu wartości rekordu. Zwróćmy uwagę na przedostatnią linijkę komunikatu Before continuing, verify the record is deployed. (ang. Przed kontynuowaniem, należy upewnić się że rekord jest wdrożony). Aby to zrobić wydajmy w wierszu polecenia (terminalu) następujące polecenie. +

+
+$ dig -t TXT _acme-challenge.<nazwa_domeny>
+
+

+ Poniżej znajduje się odpowiedź, dla przykładu wylisowałem rekordy tego typu dla mojej domeny. +

+
+; <<>> DiG 9.16.12 <<>> -t TXT _acme-challenge.morketsmerke.net
+;; global options: +cmd
+;; Got answer:
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37679
+;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
+
+;; OPT PSEUDOSECTION:
+; EDNS: version: 0, flags:; udp: 512
+;; QUESTION SECTION:
+;_acme-challenge.morketsmerke.net. IN   TXT
+
+;; ANSWER SECTION:
+_acme-challenge.morketsmerke.net. 3600 IN TXT   "G6XrpiukUNExZy_5iOJgaqqA4oxQiDJlhW0MIkXs82s"
+_acme-challenge.morketsmerke.net. 3600 IN TXT   "Z2ibO22FCPjxOQBTYuMz4H_S3UyRU8c2SJO4zsQ9ifY"
+
+;; Query time: 600 msec
+;; SERVER: 192.168.8.1#53(192.168.8.1)
+;; WHEN: wto mar 02 19:08:33 CET 2021
+;; MSG SIZE  rcvd: 173
+
+

+ Na podstawie danych zwróconych przez polecenie, możemy ustalić czy nasz rekord jest już osiągalny w Internecie, może się zdarzyć że długo nie będziemy mogli uzyskać odpowiedzi, niestety będziemy musieli się uzbroić w cierpliwość. Kiedy uzyskamy oczekiwany rezultat, wtedy dopiero będziemy mogli nacisnąć enter. +

+

+ Jest wielce prawdopobne że po zatwierdzeniu jednego challenge-u, niezbędny będzie drugi. Procedura wygląda identycznie. Tutaj jednak z sprawdzeniem wdrożenia rekordu może być problem ponieważ serwery DNS, utrzymują ostatnie wyniki zapytań w pamięci podręczej. Najlepiej jest użyć do tego drugie komputera wraz z drugim łączem internetowym np. z komórki. +

+

+ Po udanym procesie zostaniem wyświetlone dłuższe podsumowanie zawierające napis "Congratulations!" świadczący o pomyślnym wykonaniu zadania w nim również będą zawarte ścieżki na których znajdują się certyfikaty, warto przeszukać katalog /etc/letsencrypt, ponieważ te ścieżki wskazują na dowiazania symboliczne, to prawdziwe pliki certyfikatu (plik certyfikatu oraz klucz prywatny) mogą nam się przydać o ile bedziemy przenościć certyfikat na inne serwery. +

+ +

+ Istnieje możliwość wygenerowania certyfikatu dla jednego hosta. Cały proces wygląda analogicznie, różni się tylko polecenie, które z resztą znajduje się + poniżej. +

+
+$ sudo certbot certonly --manual -d <nazwa_hosta>.<nazwa_domeny> -d <nazwa_domeny> --agree-tos --no-bootstrap --manual-public-ip-logging-ok \
+--preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
+
+

+ Jedyną róznicą jest podanie nazwy hosta jak wartości przełącznika -d, zamiast nazwy wieloznacznej (*.<nazwa_domeny>). +

+
+ + + + diff --git "a/articles/linux/generowanie_certyfikat\303\263w_self-signed_OpenSSL.html" "b/articles/linux/generowanie_certyfikat\303\263w_self-signed_OpenSSL.html" new file mode 100644 index 0000000..0e4779e --- /dev/null +++ "b/articles/linux/generowanie_certyfikat\303\263w_self-signed_OpenSSL.html" @@ -0,0 +1,54 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Generowanie certyfikatu SSL Self-Signed za pomocą pakietu OpenSSL

+

+ Jednym z założeń używania certyfikatów SSL jest uwierzytelnienie serwera przed klientem, innymi słowy - przedstawienie podmiotu zarządzającego maszyną, po to aby klient miał pewność że połączył się z właściwym serwerem. Takie certyfikaty są wydawane przez firmy trzecie, które są w stanie poświadczyć że witryna www.example.com należy do firmy Example Inc. Wydanie takiego certyfikatu może kosztować grube pieniądze w zależności od tego co dany certyfikat oferuje. Komercyjny certyfikat często wyświetla się w przeglądarce jako zielona kłódka przy adresie strony. W dziesiejszych czasach wystarczy dysponować domeną, aby móc posiadać "zieloną kłódkę" na swojej stronie. Takie certyfikaty wystawiane są przez Let's Encrypt i każdy, dosłonie każdy może sobie taki certyfikat wyrobić. A co jeśli nie posiadamy żadnej domeny i chcemy np. zabezpieczyć nasz serwer www, za pomocą certyfikatu SSL (protokołu HTTPS, certyfikat jest tylko narzędziem), którego zawsze pierwszorzędnym celem jest zabezpieczenie transmisji pomiędzy klientem a serwerem. Możemy: +

+ +

+ Aby utworzyć swój własny certyfikat SSL wydajemy poniższe polecenie. +

+
+$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
+
+

+ Z względu na to gdzie chcemy ten certyfikat zapisać musimy wydać to polecenie z odpowiednimi uprawnieniami. req oznacza że OpenSSL bedzie używać modułu do podpisu żądań certyfikatu schematu X.509 zapisanego w formacie PKCS#10, jest klasyczny moduł do obsługi certyfikatów wykorzystywanych przez HTTPS, -x509 spowoduje że wygenerowany certyfikat będzie miał strukturę schematu x509, a nie klasycznego certyfikatu, -nodes wyłącza szyfrowanie klucza prywatnego, dzieki czemu nie będzie potrzebne hasło klucza podczas każdego restartu certyfikatu (niestety, klucz nie jest przez to zbyt bezpieczny). -days 365 ustala przez ile dni certyfikat będzie ważny. Wartością tej opcji może być wyłącznie dodatnia liczba całkowita. Wraz z certyfikatem generujemy potrzebną parę kluczy. + Za pomocą opcji -newkey, tworzymy nową parę kluczy, jako wartośc dla tej opcji podajemy algorytm wykorzystywany do wygenerowania kluczy w tym przypadku jest rsa po dwukropku (:) podana jest długość klucza tutaj 2048 bitów co jest standardem na dziesiejsze czasy, krótszych kluczy sam OpenSSL nie będzie chciał stworzyć. Opcja -keyout wskazuje miejsce gdzie klucz ma zostać zapisany, a opcja -out, wskazuje miejsce zapisu wygenerowanego certyfikatu. Te dwie scieżki należy zapisać będą potrzebne do wskazania plików certyfikatu w pliku konfiguracyjnym serwera WWW. +

+

+ Kiedy wygenerowaliśmy i wdrożyliśmy nasz certyfikat przejdź do strony, którą nim zabezpieczyliśmy. Do wiemy się z infomacji zwróconych przez przeglądarkę że nasz nie jest godny zaufania, a kłódka będzie posiadać znak ostrzegawczy. Dlaczego tak się dzieje ? Każda przeglądarka posiada własną bazę zaufanych wystawców certyfikatów. Jeśli certyfikat jakim serwer operuje nie posiada znaczników, którego kolwiek z nich wtenczas wyświetli nam się taka informacja. Wystawcy certyfikatów zwani również urzędami certyfikacji, posiadają własne certyfikaty służące do podpisu wniosków certyfikacyjnych, na ich podstawie generowane są certyfikaty. Jest wielce prawdopobne że urzędy wykorzystują to samo oprogramowanie co my. Nic nie stoi na przeszkodzie aby utworzyć sobie swój własny urząd certyfikacyjny i podpisywać za jego pomocą swoje certyfikaty. Niestety nie jest tak kolorowo jakby się mogło wydawać. + Aby przeglądarka traktowała nasze certyfikaty jako zaufane musi posiadać w swojej bazie certyfikat naszego urzędu certyfikacji. Możemy zaimportować taki certyfikat do naszego systemu, wtedy po wejściu na strona kłódka będzie zielona. Niestety kłódka będzie zielona tylko tam gdzie zaimpotowalśmy certyfikat naszego urzędu. +

+

+ Obecnie rzadko zdarza się potrzeba wygenerowania tego typu certyfikatów. Ale jeśli zajdzie taka potrzeba to teraz wiadmo, możemy to zrobić za pomocą pojedyńczego polecenia. +

+

~xf0r3m

+
+ + + + diff --git a/articles/linux/greenOS/btw_i_use_arch.html b/articles/linux/greenOS/btw_i_use_arch.html new file mode 100644 index 0000000..9d3f153 --- /dev/null +++ b/articles/linux/greenOS/btw_i_use_arch.html @@ -0,0 +1,130 @@ + + + + + + + + +
+                               ____  _____
+   ____ _________  ___  ____  / __ \/ ___/
+  / __ `/ ___/ _ \/ _ \/ __ \/ / / /\__ \ 
+ / /_/ / /  /  __/  __/ / / / /_/ /___/ / 
+ \__, /_/   \___/\___/_/ /_/\____//____/  
+/____/                                    
+
+
+ +
+

greenOS GNU/Linux 1.4 (btw i use Arch)

+

+ greenOS to póki co zdebrandowany Debian oldstable + zbudowany na minimalnej wersji bazowej (debootstap --variant=minbase). + Rozpowadzany w postaci obrazów LiveCD oraz archiwów z gotową hierarchią + katalogu głównego do rozpakowania na dysku. Instrukcja instalacji + znajduje się tutaj. +

+

+ Dane logowania do LiveCD to: root/toor. +

+

+ Minimalna wersja bazowa została opatrzona następującymi pakietami: +

+ +

+ Locales ustawione są en_US.UTF-8, układ klawiatury na Angielski (USA), + kodowanie konsoli na UTF-8 z domyślnymi wariantami. Serwer lustrzany + ustawiony jest na deb.debian.org. W dystrybucji nie znajduje się żadne + nie wolne oprogramowanie, i tak już zostanie. W oficjalnych wydaniach + gdy będzie to już dystrybucja i będzie ona posiadać własne + repozytorium, nie wolne oprogramowanie i jemu pochodne nie będą możliwe + do zainstalowania. +

+

+ Obecnie wspierane są dwie ogólnodostępne architektury. Nie ma sensu + przenoszenie greenOS na inne bardziej egzotyczne, bo i tak prawdopodobnie + nie zostanie on na nich uruchomiony. Wspierane architektury to amd64 oraz + i386. Adresy do obrazów oraz archiwów znajdują się poniżej. +

+ +

+ Listy zmiany publikowane są na stronie projektu greenOS w serwisie git po + tym adresem: https://github.com/xf0r3m/greenOS. +

+

+-- Changelog -- +

+

+ -- 18.06.2021 - Wydanie nieoficjalnej wersji greenOS oznaczonej nazwą kodową "first".
+ -- 21.08.2021 - Wydanie pierwszej oficjalnej wersji greenOS oznaczonej nazwą kodową "one".
+ -- 24.09.2021 - Zawieszenie wsparcia dla greenOS
+ -- 05.12.2021 - Reaktywacja projektu greenOS
+ -- 30.01.2022 - Wydanie greenOS wersji 1.1, zmiany w obrazie LiveCD + znajduje się + tutaj, natomiast zmiany w archiwum + tutaj
+ -- 30.01.2022 - Wydanie wersji greenOS Ratpoison
+ -- 27.03.2022 - Wydanie wersji greenOS 1.2, zmiany we wszystkich wersjach + dystrybucji znajdują się tutaj: tutaj
+ -- 27.03.2022 - Wydanie wersji greenOS greenServer
+ -- 05.05.2022 - Zmiany w greenOS, wydanie greenOS w wersji 1.3
+ -- 06.05.2022 - Wydanie greenOS w wersji 1.4
+

+
+ + + + diff --git a/articles/linux/greenOS/index.html b/articles/linux/greenOS/index.html new file mode 100644 index 0000000..73ee583 --- /dev/null +++ b/articles/linux/greenOS/index.html @@ -0,0 +1,32 @@ + + + + + + + +
+                               ____  _____
+   ____ _________  ___  ____  / __ \/ ___/
+  / __ `/ ___/ _ \/ _ \/ __ \/ / / /\__ \ 
+ / /_/ / /  /  __/  __/ / / / /_/ /___/ / 
+ \__, /_/   \___/\___/_/ /_/\____//____/  
+/____/                                    
+
+
+ +
+

greenOS

+ + + + + diff --git a/articles/linux/greenOS/instalacja_greenos.html b/articles/linux/greenOS/instalacja_greenos.html new file mode 100644 index 0000000..df66070 --- /dev/null +++ b/articles/linux/greenOS/instalacja_greenos.html @@ -0,0 +1,464 @@ + + + + + + + + +
+                               ____  _____
+   ____ _________  ___  ____  / __ \/ ___/
+  / __ `/ ___/ _ \/ _ \/ __ \/ / / /\__ \ 
+ / /_/ / /  /  __/  __/ / / / /_/ /___/ / 
+ \__, /_/   \___/\___/_/ /_/\____//____/  
+/____/                                    
+
+
+ +
+

Instalacja greenOS

+

+ GreenOS dostarczany jest bez instalatora. Przez co daje ogromne możliwość + konfiguracji systemu przed jego pierwszym uruchomieniem. Instalacja + składa się z kilku poleceń. +

+
    +
  1. + Uruchamiamy na naszej maszynie docelowej jakiegoś Linux-a w wersji Live, + może być to dowolna dystrybucja, którą akurat mamy pod ręką. Do + instalacji wykorzystywać będzięmy podstawowe narzędzia. GreenOS + również jest dostępny wersji LiveCD, można go uruchomić zarówno w + trybie BIOS jak i UEFI. +
  2. +
  3. +

    + Instalacja greenOS wymaga połączenia z Internetem, skądś należy + pobrać paczkę z plikami katalogu głównego (rootfs).

    + + +
    +# dhclient $interface
    +
    +

    + gdzie $interface to nazwa interfejsu + Ethernet w systemie, możemy sprawdzić ją za pomocą polecenia + ip a. Jeśli połączenie + przewodowe nie jest dostępne, a mamy możliwość skorzystania z sieci + bezprzewowdowej (tj. mamy widoczną kartę sieciową w systemie, oraz + dostęp do jakiejś sieci bezprzewodowej), to podłaczanie się do sieci + bezprzewodowej należy zacząć od włączenia karty, za pomocą polecenia: +

    +
    +ip link set $interface up
    +
    +

    + $interface = interfejs sieci + bezprzewodowej, następnie przeskanować otoczenie w poszukiwaniu + sieci bezprzewodowej, do której mamy dostęp. Do tego celu należy + użyć polecenia: +

    +
    +iwlist $interface scan
    +
    +

    + Potrzebujemy tylko SSID, a to polecenie zwraca dużą ilość danych, + należy przepuścić jej wyjście przez polecenie + grep z wyrażeniem "SSID", dzięki temu poleceniu reszta + danych wyjściowych zostanie odfiltrowana, a wyświetlone zostaną + tylko nazwy sieci (SSID). W większości przypadków, połączenie się z + siecią będzie wymagało klucza, w zależności od użytch zabepieczeń + różnić się będzie metoda przyłączenia się do sieci. Jeśli nasza sieć + używa standardu WPA, wtenczas należy użyć programu + wpa_supplicant. Wymaga on pliku konfiguracyjnego, w którym + znajdują się deklaracje sieci. Plik ten generuje się przekierowując + standardowe wyjście polecenia wpa_passphrase do pliku. Plik + może być zapisany gdzie kolwiek, poleceniu wpa_supplicant i + tak podajemy ściężkę do niego. `wpa_passphrase` do wygenerowania + plik musi mieć SSID sieci oraz klucz PSK, podajemy te informacje + jako argumenty pozycjne: +

    +
    +wpa_passphrease RogueAP 123Test123 > wpa_supplicant.conf
    +
    +

    + Po wygenerowaniu pliku konfiguracyjnego możemy przyłączyć się do + sieci za pomocą polecenia wpa_supplicant. +

    +
    +wpa_supplicant -B -D wext -i $interface -c $configFile
    +
    +

    + Gdzie: +

      +
    • $interface - nazwa + bezprzewodowego interfeju sieciowego w systemie +
    • +
    • $configFile - plik + konfiguracyjny wpa_supplicant, zawierający + profile sieci. +
    • +
    + Program powyświetleniu kilku komunikatów, przejdzie w tło, przez co + nie będzie zakłócać pracy w terminalu czy konsoli, na której go + uruchmiliśmy. Aby upewnić się czy zostaliśmy przyłączeni możemy + wydać polecenie: +

    +
    +iwconfig $interface
    +
    +

    + Polecenie zwróci informacje na temat połączenia z siecią bezprzwodową + w polu Access point:, powiniśmy + zobaczyć BSSID punktu dostępowego, jeśli w tym polu widnieje napis + Not-Associated oznacza to, że + nie zostaliśmy przyłączeni do sieci. Jeśli przyłaczenie się + powiodło to jedyne co nam pozostało w tym przypadku to pobrać adres + IP z DHCP. +

    +
  4. +
  5. +

    + Następną czynnością do wykonania jest partycjonowanie dysku. Tutaj + w zależności od trybu jakiego wymaga nasz komputer do działania, czy + jest to BIOS czy UEFI, musimy odpowiednio spartycjonować nasz dysk. + W trybie UEFI, należy pamiętać partycji EFI. Nie chcę tutaj narzuć + jak należy spartycjonować dysk. Jednak poniżej wstawie schemat, + który powinien działać w każdym możliwym przypadku: +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    UrządzenieBootRozmiarTyp partycji
    /dev/sda1*(Rozmiar dysku - 1GB)Linux
    /dev/sda21GB (Reszta)Rozszerzona
    /dev/sda51GB (cały rozmiar partycji rozszerzonej)Linux swap / Solaris
    +

    + Narzędziem do partycjonowania dostępnym na LiveCD greenOS + jest fdisk. +

    +

    + Partycjonowanie dla UEFI różni się nieco do partycjonowania dla BIOS + poza tymi powyższymi partycjami potrzebna będzie jeszcze jedna + partycja. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    UrządzenieBootRozmiarTyp partycji
    /dev/sda1nie mniej niż 100MBEFI (FAT-12/16/32)
    /dev/sda2(pozostała większość - 1GB)Linux
    /dev/sda3ResztaRozszerzona
    /dev/sda5cała partycja rozszerzonaLinux swap / Solaris
    +

    + Te schematy partycjonowania powinny się sprawdzić. Po zapisaniu + zmian na dyskach, należy partycje sformatować na odpowiednie + systemy plików. To jest: +

    +
      +
    • partycja EFI: +
      +# mkfs.vfat -F32 /dev/sda1
      +
      +
    • +
    • partycje Linux-a, np: +
      +# mkfs.ext4 /dev/sda2
      +
      +
    • +
    • partycja swap: +
      +# mkswap /dev/sda5
      +
      +
    • +
    +

    + Po sformatowaniu partycji, tę przeznaczoną na główny system plików + montujemy w katalogu np. /mnt lub /media. +

    +
    +# mount /dev/sda1 /mnt
    +
    +

    + Następnie aktywujemy swap. +

    +
    +# swapon /dev/sda5
    +
    +
  6. +
  7. +

    + Jeśli główny system plików został poprawnie zamontowany, a + inne katalogi głównego systemu plików, takiej jak np. /home + czy /usr będą na innych dyskach, to należy utworzyć teraz + te katalogi w miejscu montowania głównego systemu pliku i zamontować + te dyski, zeby poźniej nie bawić się w kopiowanie. Po ewewntualnym + zamontowaniu pozostałych katalogów, możemy pobrać archwium z + rootfs, w tym celu przechodzimy do katalogu montowania + głównego systemu plików następnie wydajemy polecenie: +

    +
    +/mnt# wget http://ftp.morketsmerke.net/greenOS/archiwum_z_systemem.tgz
    +
    +

    + Po ściągnięciu archiwm należy je rozpakować, do tego wystarczy + użyć polecnia tar z odpowiednimi przełącznikami. +

    +
    +# tar -xzvf rootfs.tgz
    +
    +

    + Po rozpakowaniu, archiwum należy usunać aby nie zalegało na dysku. +

    +
  8. +
  9. +

    + Teraz kiedy mamy już pliki dystrybucji, możemy wygenerować plik + /etc/fstab, w tym celu przekierujemy wyjście polecenia + blkid, do pliku /mnt/etc/fstab. +

    +
    +# cd
    +# blkid > /mnt/etc/fstab
    +
    +

    + Niestety samo przkierowania wyjścia blkid nie wygeneruje + poprawnego pliku fstab, jednak zaoszczędzi nam przepisywania + UUID-ów. Poniżej zamieszcze listing zawierający poprawne wpisy + dla poszczególnych partycji. +

    +
    +# Partycja EFI dla instalacji UEFI.
    +UUID="..."  /boot/efi vfat  umask=0077  0 1
    +
    +# Partycje Linuxa
    +UUID="..."  $mountPoint ext4  defaults  0 1
    +
    +# Partycja swap
    +UUID="..."  none  swap  sw  0 0
    +
    +

    + $mountPoint - punkt montowania, + może być: / jak i /home. +

    +
  10. +
  11. +

    + Po wygenerowaniu fstab, przyszedł czas na ustawienie nazwy + komputera dla instalowanego systemu. Należy zrobić w dwóch miejscach + w pliku /mnt/etc/hostname oraz /mnt/etc/hosts pod + wpisem adresu 127.0.1.1. Nazwa + komputera może składać się z małych i dużych liter, cyfr oraz + myślinika. +

    +
  12. +
  13. +

    + Pozostałe czynności należy wykonać już na zmienionym katalogu + głównym. Ta zmiana spowoduje, że będzemy mogli działać + na instalowanym systemie. Ale zanim to jednak nastąpi musimy + podmontować w instalowanym systemie kilka katalogów systemowych, aby + np. z poziomu zmienionego root-a (katalogu głównego), był + widoczny dysk twardy, aby była możliwość zainstalowania programu + rozruchowego (GRUB-a), w tym celu wykorzystamy jedną z + konstrukcji powłoki: +

    +

    + Dla instalacji w trybie BIOS: +

    +
    +# for i in /dev /dev/pts /proc /run /sys; do mount -B $i /mnt$i; done
    +
    +

    + Dla instalacji w trybie UEFI: +

    +
    +# for i in /dev /dev/pts /proc /run /sys /sys/firmware/efi/efivars; do mount -B $i /mnt$i; done
    +
    + +

    +

    + Po zamontowaniu powyższych katalogów, możemy zmienić katalog główny. +

    +
    +# chroot /mnt /bin/bash
    +
    +

    + W tym momencie powinniśmy przeskoczyć automatycznie do katalogu + głównego, nic innego się nie zmieni, co może nie dezorientujące + dlatego warto zmienić sobie znak zachęty (prompt), aby + rozróżnić zmieniony katalog główny od katalogu systemu z LiveCD. +

    +
    +# export PS1="(chroot) ${PS1}"
    +
    +

    + Teraz nie pownniśmy mieć wątpliwości, w którym z katalogów głównych + się znajdujemy. Teraz możemy zająć się ustawianiem haseł oraz + użytkowników. Na początek zmienimy hasło użytkownika root. + Wszystkie polecenia wykonywane na zmienionym katalogu głównym są + oznaczone przedrostkiem (chroot) +

    +
    +(chroot)# passwd
    +
    +

    + Następnie utworzymy nowego użytkownika, z którego konta będziemy + korzystać podczas pracy na komputerze. +

    +
    +(chroot)# adduser $username
    +
    +

    + $username - nazwa użytownika. +

    +
  14. +
  15. +

    + Ostatnią czynnością została instalacja programu rozruchowego, + istnieje pełna dowolność, jednak w pobranym rootfs, + zainstalowany został już GRUB dla i386-pc, więc + przy instalacji + w trybie UEFI lub wykorzystaniu przez nas innego bootloadera trzeba + będzie zainstalować odpowiedni pakiet. W tym przewodniku skupie się + wyłącznie na GRUB. Instalacja GRUB w trybie BIOS + wygląda następująco. +

    +
    +(chroot)# grub-install $disk
    +
    +

    + Gdzie $disk - wystąpienie dysku w + katalogu /dev, tj. /dev/sda, /dev/sdb itp. + Po zainstalowaniu GRUB na dysku, pozostało jedynie + wygenrowanie pliku konfiguracyjnego GRUB-a. +

    +
    +(chroot)# update-grub
    +
    +

    + Powyższe polecenie wygeneruje pliki konfiguracyjne GRUB-a. + Po wykonaniu tej czynności instalacja jest zakończona, pozostaje + tylko posprzątać. +

    +

    + Instalacje w trybie UEFI, przeprowadza się w nieco inny sposób. Żeby + zainstalować GRUB-a w trybie UEFI, będziemy potrzebować + odrębnego pakietu niż ten, który jest zainstalowany. +

    +
    +(chroot)# apt update
    +(chroot)# apt install grub-efi
    +
    +

    + Po instalacji pakietu musimy zamontować partycje EFI, aby to zrobić + należy utworzyć dla niej odpowiedni punkt montowania, będzie nim + katalog /boot/efi: +

    +
    +(chroot)# mkdir /boot/efi
    +
    +

    + Po utworzeniu katalogu montujemy partycję EFI. +

    +
    +(chroot)# mount $efiPartition /boot/efi
    +
    +

    + Gdzie $efiPartition jest partycją + EFI w systemie. Po zamontowaniu, możemy przejść do instalacji + GRUB-a. +

    +
    +(chroot)# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
    +
    +

    + Ostatnia czynność jest identyczna dla obu trybów, pozostało + wygenerować plik konfiguracyny. +

    +
    +(chroot)# update-grub
    +
    +

    + Po wygenerowaniu pliku konfiguracyjnego GRUB-a czy to w + trybie UEFI czy BIOS, opuszczamy zmieniony katalog główny. +

    +
    +(chroot)# exit
    +
    +

    + Sprzątnie w tym wpadku będzie polegać na kulturalnym odmontowaniu + systemów plików. Do tego celu wykorzystamy konstrukcję powłoki, która + została już raz użyta podczas instalacji. +

    +
    +# umount -R /mnt
    +
    +

    + Instalacja została zakończona, jedyne co pozostaje to uruchomić + ponownie komputer. +

    +
  16. +
+
+ + + + diff --git a/articles/linux/greenOS/torwards_the_sun.html b/articles/linux/greenOS/torwards_the_sun.html new file mode 100644 index 0000000..49e16d6 --- /dev/null +++ b/articles/linux/greenOS/torwards_the_sun.html @@ -0,0 +1,224 @@ + + + + + + + +
+                               ____  _____
+   ____ _________  ___  ____  / __ \/ ___/
+  / __ `/ ___/ _ \/ _ \/ __ \/ / / /\__ \ 
+ / /_/ / /  /  __/  __/ / / / /_/ /___/ / 
+ \__, /_/   \___/\___/_/ /_/\____//____/  
+/____/                                    
+
+
+ +
+

greenOS GNU/Linux (Torwards the sun)

+

+ greenOS to lekka, oparta na Debianie dystrybucja + przeznaczona do ogólnego użytku. + Dostarczana jest w postaci archiwum z preinstalowanym i + prekonfigurowanym jądrem oraz oprogramowaniem, dzięki czemu może zostać + zainstalowana z dowolnej innej dystrybucji, nie koniecznie uruchomionej + LiveCD. +

+

+ Zrzut ekranu przestawiający wersję Desktop: + +

+ +
Kilknij obrazek, aby otworzyć w pełnym rozmiarze.
+
+ +

+

+ Celem dystrybucji jest dostarczenie użytkownikowi + stabilnego systemu operacyjnego wraz z popularnym oprogramowaniem, + którego instalacja na dystrybucjach Linuxa może nie być oczywista. + Dystrybucja jest kompromisem pomiedzy stylem user friendly a + hakerską regułą KISS. + Wiele dotyczasowych czynności takich jak np. logowanie (dawniej za pomocą + konsoli obecnie za pomocą menedżera wyświetlania) zostało uproszczonych. + Tej dystrybucji jednak daleko do bycia typowym desktopem przyjaznym + użytkownikowi. Nadal można ją uznać z hakerską. +

+

+ Dystrybucja została ograniczona do jednej wersji Desktop. + Patrząc na obecny sprzęt oraz zasoby jakimi operują współczesne komputery + ta sama wersja świetnie sprawdzi się na serwerze. + Dołączone oprogramowanie: +

+
    +
  • XTerm - emulator terminala
  • +
  • X File Editor - okienkowy menedżer plików
  • +
  • Midnight Commander - konsolowy menedżer plików
  • +
  • Geany - nieco bardziej rozbudowany edytor tekstu
  • +
  • gVim - legendarny edytor Vim z nakładką graficzną
  • +
  • Spotify - populary serwis streamingowy muzyki
  • +
  • Discord - nowoczesny komunikator internetowy, + pozwalający na tworzenie własnych wirtualnych serwerów.
  • +
  • Mozilla Firefox - przeglądarka internetowa
  • +
  • qmmp - odtwarzacz muzyki
  • +
  • VLC - odwarzacz plików video
  • +
  • xpdf - czytnik plików PDF
  • +
  • HexChat - klient protokołu IRC
  • +
  • Mozilla Thunderbird - klient poczty
  • +
+

+ greenOS jest również rozporowadzany na zasadzie LiveCD. + Wersja LiveCD + jest porównywalna z wersją instalowaną na dysku jednak instalowany tam + menedżer okien + IceWM pochodzi z repozytorium Debiana a nie z ręcznej kompilacji. + Z racji że to LiveCD, nie ma tutaj Ustawień oraz Gier wykorzystywanych w + w zainstalowanej werjsji. Preinstalowane oprogramowanie dalej pozostaje + to samo. Poniżej znajduje się link do pobrania obrazu LiveCD: +

+ + +

+ Dane logowania na obrazach LiveCD (nazwa użytkownika/hasło) +

+
    +
  • root/toor
  • +
+

+ Aby nie narzucać niczego oraz zapewnić elastyczność instalacji, greenOS + dostarczany jest bez instalatora. Dystrybucje należy zainstalować ręcznie + posiłkując się poradnikiem instalacji. +

+

+ Archiwa z dystrybucją w głównym wydaniu (Main) znajdują + się poniżej oraz pod adresem: + + https://sourceforge.net/projects/greenos/files/rootfs/rootfs_1.2.tgz/download. +

+

+ Inne wydania dystrybucji: +

+ +

+ Poprzednie wersje dystrybucji znajdują się pod adresem: + + https://sourceforge.net/projects/greenos/files/. +

+

Specyficzne rzeczy wymagające obsługi:

+
    +
  • Wpisów w menu dokonujemy ręcznie posiłkując się zapisanym już w pliku + ~/.icewm/menu wpisami lub dokumentacją IceWM dostępną na stronie + https://ice-wm.org/man/.
  • +
  • Zmiany wyświetlania obrazu generowane przez Ustawienia ekranu + zapisywane są wewnątrz pliku w katalogu .screenlayout, aby + zastosować ustawienia w należy uruchomić plik przed uruchomieniem + mendżera okien. Lightdm korzysta z pliku ~/.xsession + więc w nim należy dodać tę linię przed uruchomienim icewm + exec icewm-session: +
    +sh -c ~/.screenlayout/plik_ustawien_arandr.sh &
    +
    + Z plik_ustawien_arandr podajemy swoją nazwą pod którą + zostały zapisane zamiany.
  • +
  • Jeśli w systemie jest wiele wyjść audio, i nie mamy dźwieku + uruchamiając coś na yt, to system może domyślnie przypisał + sobie inną kartę dziwiękową niż byśmy tego chcieli. Za pomocą + poniższego + polecenia wyświetlamy dostępnie karty w systemie. Należy zapamiętać + pozycję pożądanej karty na wypisanej przez polecenie liście. +
    +$ lspci -knn | grep -iA2 audio
    +
    + Po ustaleniu kolejności domyślnej karty dzwiękowej, należy ustawić + ją w pliku /etc/modprobe.d/default.conf, plik + najprawdopodobniej + nie istnieje, więc trzeba go będzie utworzyć. W pliku zapisujemy + poniższą linię: +
    +options snd_hda_intel index=N
    +
    + Za N wstawiamy pozycję karty na + liście z poprzedniego polecenia.
  • +
  • W greenServer interfejsy sieciowe nie są zarządzane + przez żaden + program, dlatego jeśli chcemy uzyskać połączenie sieciowe w tym + systemie to najprościej użyć polecenia: +
    +# /sbin/dhclient
    +
    + Możemy również od razu przejść do statycznej konfiguracji sieci lub + skonfigurować interfejsy sieciowe podczas instalacji systemu po + przełączeniu katalogu głównego.
  • +
+

+ greenOS rozprowadzany jest bez gwarancji przydatności. + Autor nie ponosi odpowiedzialności za szkody wyrządzone instalacją lub + korzystaniem z greenOS. Miłej zabawy! +

+

+-- Changelog -- +

+

+ -- 18.06.2021 - Wydanie nieoficjalnej wersji greenOS oznaczonej nazwą kodową "first".
+ -- 21.08.2021 - Wydanie pierwszej oficjalnej wersji greenOS oznaczonej nazwą kodową "one".
+ -- 24.09.2021 - Zawieszenie wsparcia dla greenOS
+ -- 05.12.2021 - Reaktywacja projektu greenOS
+ -- 30.01.2022 - Wydanie greenOS wersji 1.1, zmiany w obrazie LiveCD + znajduje się + tutaj, natomiast zmiany w archiwum + tutaj
+ -- 30.01.2022 - Wydanie wersji greenOS Ratpoison
+ -- 27.03.2022 - Wydanie wersji greenOS 1.2, zmiany we wszystkich wersjach + dystrybucji znajdują się tutaj: tutaj
+ -- 27.03.2022 - Wydanie wersji greenOS greenServer
+

+
+ + + + diff --git a/articles/linux/greenOSAE.html b/articles/linux/greenOSAE.html new file mode 100644 index 0000000..b34beef --- /dev/null +++ b/articles/linux/greenOSAE.html @@ -0,0 +1,419 @@ + + + + + + + + +
+                               ____  _____ ___    ______
+   ____ _________  ___  ____  / __ \/ ___//   |  / ____/
+  / __ `/ ___/ _ \/ _ \/ __ \/ / / /\__ \/ /| | / __/   
+ / /_/ / /  /  __/  __/ / / / /_/ /___/ / ___ |/ /___   
+ \__, /_/   \___/\___/_/ /_/\____//____/_/  |_/_____/   
+/____/                                                  
+                                    
+
+ +
+

greenOS Arch Edition

+

+ greenOS Arch Edition jest to skonfigurowany w odpowieni sposób Arch Linux. + Swoim wyglądem ma przypominać greenOS, jednak nie jest to samodzielna + dystrybucja. Poniżej znajduje się zrzut ekranu, przestawiający pulpit. +

+

+ +

+ +
Kilknij obrazek, aby otworzyć w pełnym rozmiarze
+
+ +

+

+ W tej konfiguracji użyto manadżera wyświetlania LightDM oraz + środowiska graficznego XFCE4. Zainstalowano takie programy jak + Firefox, Thunderbird, VLC, QMMP, Redshift, Snap, ncspot oraz KVM. + Poniżej znajduje się lista kroków, którą należy wykonać, aby + skonfigurować w ten sposób Arch Linux. Podanej listy można użyć do + utworzenia skryptu, lub wprowadzać polecenia ręcznie dokonują niezbędnych + dla siebie modyfikacji. Tak przygotowany system, można spakować do + archiwum i instalować na róznych maszynach zaoszczędzając wten sposób + czas na konfigurowaniu identycznych środowisk jak i reinstalacji + stanowiska z tym systemem w tej konfiguracji. +

+

+

    +
  1. + Pobranie najnowszego obrazu Arch Linux-a i uruchomienie z niego maszyny + wirtualne bądź fizycznego komputera. Obraz płyty możemy pobrać z linku poniżej + + http://ftp.icm.edu.pl/pub/linux/distributions/archlinux/iso + . +
  2. +
  3. + Po uruchomieniu się systemu, uruchamiamy program tmux, + dzielimy konsole na dwa poziome okna (w języku polskim brakuje dobrego + tłumaczenia słowa angielskiego "pane"). Na jednym zostawiamy prompt + (znak zachęty) na drugim uruchamiamy polecenie + installation_guide. Instalujemy system zgodnie z wytycznymi + poradnika. Jest jednak kilka czynności jakie należy wykonać w trakcie + instalacji. +
      +
    • Pakiety do zainstalowania (przy pobieraniu obrazu): base, linux, + linux-firmware, + networkmanager, grub, vim, man-db, man-pages, texinfo.
    • +
    • Po zamianie głównego katalogu, na ten obrazu należy uruchomić + Network Manager: +
      +[archiso /]# systemctl enable NetworkManager.service
      +
      +
    • +
    • + W pliku /etc/vconsole.conf poza zmienną LANG + zapisujemy zmienną FONT ustawioną na lat2-16 oraz + zmienną FONTMAP ustawioną na 8859-2 +
    • +
    • + Tworzymy użytkownika, instalujemy sudo, które ustawiamy w + taki sposób aby nie trzeba było wpisywać hasła (ten podpunkt można + potraktować wedle własnych preferencji). +
    • +
    +
  4. +
  5. + Instalujemy środowisko graficzne: +
    +[user@greenOSAE ~]$ sudo pacman -Syu xfce4 xfce4-goodies xorg lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings
    +
    +
  6. +
  7. + Zmieniamy kilka ustawień lightdm, po to aby wczytało + zainstalowany wcześniej temat, oraz reagowało odpowienio na różnych + kartach graficznych. +
    +[user@greenOSAE ~]$ sudo vim /etc/lightdm/lightdm.conf
    +#w sekcji [LightDM] usuwamy znak komentarz sprzed poniższej opcji i nadajemy
    +#jej poniższą wartość.
    +logind-check-graphical=true
    +#w sekcji [Seat:*] tak jak powyżej
    +greeter-session=lightdm-gtk-greeter
    +
    +
  8. +
  9. + Tapety. Pobranie tapet greenOS. Ten punkt można sobie odpuścić jeśli, + ktoś szuka tylko konfiguracji XFCE dla Arch. +
    +[user@greenOSAE ~]$ sudo pacman -Syu wget
    +[user@greenOSAE ~]$ wget https://i.ibb.co/5Y8F1mr/greenos-wallpaper.png
    +[user@greenOSAE ~]$ wget https://i.ibb.co/2MJvLyH/greenos-lightdm-wallpaper.png
    +[user@greenOSAE ~]$ sudo mv greenos-lightdm-wallpaper.png /usr/share/pixmaps
    +[user@greenOSAE ~]$ sudo mv greenos-wallpaper /usr/share/backgrounds/xfce
    +
    +
  10. +
  11. + Włączenie LightDM. Cały trick tej konfiguracji polega na tym, że + użyjemy mendżera wyświetlania, przez co użytkownik koncowy + takiego systemu nie zorientuje się nawet, że środowisko graficzne na + tym sprzęcie było instalowane z ręki. Ponieważ po załadowaniu systemu + wystartuje LightDM, po zalogowaniu użytkownika wystaruje on pierwsze + dostępne środowisko graficzne, o ile użytkownik nie zdefiniował + inaczej, za pomocą pliku .xinitrc. +
    +[user@greenOSAE ~]$ sudo systemctl enable lightdm
    +
    +
  12. +
  13. + Restart komputera. Po załączeniu LightDM, możemy zrestartować + komputer, aby sprawdzić czy nasze środowisko graficzne zostanie + poprawnie uruchomione. Jeśli nasze środowisko nie wystatowało, ekranie + pojawiąją się różne dziwne rzeczy związane z grafiką. Może to + oznaczać, że brakuje odpowiedniego sterownika, niestety źle działający + LightDM, psuje również działanie pozostałych konsol. Tak więc + aby go wyłączyć musimy uruchomić system z LiveCD Arch Linux + podmontować główny system plików, następnie zmienić główny katalog + za pomocą polecenia arch-chroot, + następnie wyłączyć LightDM poniższym poleceniem: +
    +[user@greenOSAE ~]$ sudo systemctl disable lightdm
    +
    + Następnie uruchomić ręcznie XFCE, jednak będzie to wymagać stworzenia + pliku .xinitrc. Po zalogowaniu się na swoje konto. +
    +[user@greenOSAE ~]$ vim .xinitrc
    +exec startxfce4
    +#zapisujemy zamiany.
    +[user@greenOSAE ~]$ startx
    +
    + Po wydaniu ostatniego polecenia środowisko powinno wystartować. + W późniejszych podpunktach będzie podane jak zainstalować sterownik + Nvidii (jest nieco powszechniejsza w użyciu niż Radeon choć mniej + rekomendowana). +
  14. +
  15. + Konfiguracja XFCE. Po zalogowaniu się usuwamy dolny panel, a górny + przenosimy na dół. Następnie zmieniamy ilość przestrzeniu roboczych + ilość pozostawiamy wedle uznania. Usuwamy to podstawowe menu i + zastępujemy je Menu Whisker. Konfigurując menu, w zakładce + Przycisk panelu pole Wyświetlanie ustawiamy na + Ikona i etykieta Ustawiamy następnie swoją ikonę i etykietę, jeśli jednak ma być to greenOS, to należy pobrać + z + https://i.ibb.co/fS0sHyD/leaf.png ikonę oraz + ustawić etykietę na greenOS. Z panelu usuwamy wskaźnik baterii + jeśli będziemy używać systemu na laptopie, to możemy go zostawić. + Modyfikujemy przyciski sesji, z polu Wygląd ustawiamy + Przyciski sesji, z przycisków odznaczamy wszystkie, poza + Zablokowaniem ekranu znajdującym się pod nim + sepraratorem oraz Wyłączeniem. Za pomocą apletu + Wygląd wybranym z menu (kategoria Ustawienia), + zmieniamy motyw systemu na Adwaita (ciemny). Na koniec + zmieniamy tapetę, klikając PPM na pulpit i wybierając + Ustawienia pulpitu następnie jedną z tapet.
    + Problem z tapetą użytkownika:
    + Jeśli zamierzamy użyć tego systemu jako archiwum, to warto mieć na + uwadze, że XFCE mimo ustawionej tapety, która za każdym wyłączeniem/ + włączeniem komputera jest taka sam to po ponowym zainstalowaniu systemu + z archiwum tapeta jest inna mimo tego samego konta. Przyczyn problemu + nieznam, chociaż mam jego rozwiązanie XFCE (jeden z jego programów) + cały czas ustawia tę samą tapetę, z racji tego należy ją przenieść, ale + tak żeby nie zginęła. Na przykład do /usr/share/pixmaps. +
    +[user@greenOSAE ~]$ mv /usr/share/backgrounds/xfce/xfce-verticals.png /usr/share/pixmaps
    +
    + Następnie tworzymy dowiązanie symboliczne do naszej tapety o nazwie + wskazującej na tą niedawno przeniesioną. +
    +[user@greenOSAE ~]$ ln -s /usr/share/backgrounds/xfce/greenos_wallpaper.png /usr/share/backgrounds/xfce/xfce-verticals.png
    +
    + Teraz tapeta powinna być cały czas taka sama. +
  16. +
  17. + Polskie znaki w terminalu. Jeśli uruchomimy terminal to możemy + zauważyć, że nie można wpisać żadnego z polskich znaków. Należy to + naprawić, wymaga to jednego polecenia i zrestartowania komputera. +
    +[user@greenOSAE ~]$ sudo localectl set-x11-keymap pl
    +
    + Restartujemy komputer, lub zamykamy i uruchamiamy ponownie serwer + X window. +
  18. +
  19. + Ustawienia terminala. W preferencjach emulatora terminala w zakładce + Kolory wybieramy profil Zielone na czarnym oraz + kolor aktywnych kart na jaskrawożółty, w zakładce Wygląd + zmieniamy czcionkę na Source Code Pro Regular oraz ustawiamy + przezroczyste tło na poziomie 0.85. +
  20. +
  21. + Zmiana kolorystki okna logowania, tapety okna logowania oraz domyślnego + obrazu użytkowników. W tym celu uruchamiamy program + lightdm-gtk-greeter-settings i ustawiamy motyw na + Adwaita-dark i ikony na Adwaita. Następnie ustawiamy + tapetę. Z folderu /usr/share/pixmaps wybieramy + greenos_lightdm_wallpaper.png. Kolejną rzeczą do ustawienia + jest domyślny obraz użytkowników, z pod menu wybieramy plik następnie + wybieramy logo Arch Linux /usr/share/pixmaps/archlinix-logo.png +
  22. +
  23. + Instalacja oprogramowania użytkowego. +
    +[user@greenOSAE ~]$ sudo pacman -Syu firefox thunderbird vlc qmmp pulseaudio pulseaudio-alsa pavucontrol
    +
    +
  24. +
  25. + Instalacja sterowników własnościowych od Nvidii. +
    +[user@greenOSAE ~]$ sudo pacman -Syu nvidia
    +[user@greenOSAE ~]$ sudo mkinitcpio -P
    +
    +
  26. +
  27. + Instalacja oprogramowania Redshift. Program ten pomagachronić wzrok + podczas wieczornej pracy przy komputerze usuwając barwę niebieską - + ocieplając wyświetlane kolory. Ze względów geograficznych nie wszędzie + na świecie jest noc, dlatego też ten program do swojego działania + połączenia z GPS lub ręcznego podania lokalizacji. Tak też zrobimy w + naszym przypadku. Podamy ręcznie współrzędne geograficzne. Najpierw + jednak pobierzemy domyślną konfigurację Redshift i zapiszemy ją na + ścieżce: ~/.config/redshift/redshift.conf, konfigurację można + pobrać z linku poniżej: + https://raw.githubusercontent.com/jonls/redshift/redshift/master/redshift.conf.sample + W pliku w sekcji [manual] podajemy współrzędne geograficzne, + które możemy pobrać z tego odnośnika: https://location.services.mozilla.com/v1/geolocate?key=geoclue. + Kolejną rzeczą jak została do ustawienia jeśli chodzi + o Redshift to jest to autostart. W ustawieniach przechozimy do + Sesja i uruchamianie, w zakładce Uruchamiane programy + kilkamy + w oknie Dodawanie programu,w polu + Nazwa wpisujemy Redshift, opis można pominąć, w polu + Polecenie wpisujemy /usr/bin/redshift. Po ponownym + zalogowaniu Redshift powinien zostać uruchomiony. +
  28. +
  29. + Instalacja snap oraz ncspot. Snap jest rodzajem mendżera + pakietów + dającym m.in. możliwość instalowania tego samego + oprogramowania na różnych dystrybucjach, z kolei + ncspot jest lekką wersją klienta serwisu + Spotify. Na Arch Linux Snap nie jest + od tak dostępny, i trzeba go zainstalować z pakietów + AUR. Pakiety AUR są paczkami zawierającymi kod źródłowy przygotowany do + kompilacji pod Arch Linux, skompilowany kod może zostać zamieniony na + pakiet mendżera Pacman i zostać przez niego zinstalowany jak + każdy inny pakiet pobrany z repozytorium. Na początek ppotrzebujemy + oprogramowania do pobrania pakietu AUR oraz jego kompilacji: +
    +[user@greenOSAE ~]$ sudo pacman -Syu git base-devel
    +
    + Następną czynnością jest skolonowanie repozytorium ze snapd i +przjeście do katalogu zawierającego pobrane pliki. +
    +[user@greenOSAE ~]$ git clone https://aur.archlinux.org/snapd.git
    +[user@greenOSAE ~]$ cd snapd
    +
    + Teraz przechodzimy do kompilacji z pomocą polecenia + makepkg. Opcja -s nakazuje + zainstalować wszystkie zależności potrzebne do zbudowania pakietu a + opcja -i zapyta o instalacje pakietu zaraz po jego zbudowaniu. + Po zostając w katalogu snapd wywołujemy poniższe polecenie: +
    +[user@greenOSAE ~]$ makepkg -si
    +
    + Po zbudowaniu musimy włączyć i uruchomić socket dla snapd oraz utowrzyć + dowiązanie symboliczne. +
    +[user@greenOSAE ~]$ sudo systemctl enable --now snapd.socket
    +[user@greenOSAE ~]$ sudo ln -s /var/lib/snapd/snap /snap
    +
    + Teraz należy zrestartować maszynę, po uruchomieniu wydajemy następujące + polecenie. +
    +[user@greenOSAE ~]$ sudo snap install ncspot
    +
    + Może się zdarzyć, że zostanie wyświetlony błąd + Too early for operations..., wtedy należy wydać poniższe + polecenie i spróbować ponownie wydać polecenie instalacji. +
    +[user@greenOSAE ~]$ sudo snap refresh
    +
    +
  30. +
  31. + Ostatnią czynnościa do wykonania, pozostaje + zainstalować jakąś metodę wirtualizacji. Oracle VirtualBox nie jest + dobry rozwiązaniem jeśli chodzi o systemy Linux ze + względu na to iż bywa niestabilny, szczególnie te wersje od 6.0. + Do wyboru pozostaje KVM oraz XEN. Ja przesiadłem się z VirtualBox-a na + właśnie KVM i to też zainstalujemy. Instalacje rozpoczynamy od + zainstalowania paczek z repozytorium. +
    +[user@greenOSAE: ~]$ sudo pacman -Syu virt-manager qemu vde2 ebtables dnsmasq bridge-utils openbsd-netcat
    +
    + Następnie włączamy usługę do autostartu i uruchamiamy ją. +
    +[user@greenOSAE: ~]$ sudo systemctl enable libvirtd.service
    +[user@greenOSAE: ~]$ sudo systemctl start libvirtd.service
    +
    + Kolejną rzeczą jaką należy wykonać jest odblokowanie opcji w pliku + /etc/libvirt/libvirtd.conf musimy od szukać +i odblokować unix_sock_group = "libvirt" oraz + unix_sock_rw_perms = "0770". + Zapisujemy zmiany w pliku. Abyśmy mogli korzystać z +maszyn wirtualnych jako zwykły użytkownik musimy dodać użytkownika do grupy + oraz ją utworzyć. +
    +[user@greenOSAE: ~]$ sudo usermod -a -G libvirt user
    +[user@greenOSAE: ~]$ newgrp libvirt
    +
    + Na koniec należy zrestartować usługę. +
    +[user@greenOSAE: ~]$ sudo systemctl restart libvirtd.service
    +
    +
  32. +
+

+

+ Podsumowując Arch Linux jest dystrybucją na pewno skierowaną do bardziej + zaawansowanych użytkowników. W zamian za trudy konfiguracji mamy dostęp + najnowszego jądra oraz najnowszych wersji programów. + Dzięki staraniom deweloperów Arch-a możemy zainstalować + Linuxa np. na Chrombookach i wykorzytać w pełni potencjał + takiej maszyny. Gdzie np. na dystrybucjach pochodnych + Debiana jak i na samym Debianie na części (jak nie na większości) + Chromebooków nie będzie działać dźwięk. Proszę nie brać tej oceny jako + atak wymierzony w kierunku Debiana, ponieważ nadal nie + znam bardziej stablinej dystrybucji niż Debian. Wciąż + ze wsparciem dla starego sprzętu, czego brakuje w Arch-u czy CentOS-ie. +

+

+ Źródła:
+

    +
  1. + Problemy z grafiką LightDM + https://wiki.archlinux.org/title/LightDM#Autologin_does_not_work +
  2. +
  3. + Ustawienie tematu dla LightDM + https://wiki.archlinux.org/title/LightDM#Greeter +
  4. +
  5. + Instalacja sterowników własnościowych Nvidii + https://wiki.archlinux.org/title/Nvidia#Installation +
  6. +
  7. + O Redshift: + https://wiki.archlinux.org/title/Redshift#Configuration +
  8. +
  9. + Dodanie programu do autostartu: + https://wiki.archlinux.org/title/XFCE#Autostart +
  10. +
  11. + Instalacja Snap na Arch Linux: + https://snapcraft.io/docs/installing-snap-on-arch-linux +
  12. +
  13. + Instalacja KVM na Arch Linux: + https://linuxhint.com/install_configure_kvm_archlinux +
  14. +
+

+

+ Jeśli komuś nie chce się wykonywać powyższych czynności, to może pobrać + gotowe archiwum znajdujące się pod poniższym odnośnikiem. +

+

+ https://sourceforge.net/projects/greenosae/files/rootfs/greenOSAE-2.0.2.tgz/download +

+

+ Procedura instalacji jest zgodna z greenOS, jedyną różnicą jest tworzenie + pliku konfiguracyjnego GRUB-a, do tego wykorzystujemy to polecenie: +

+
+# grub-mkconfig -o /boot/grub/grub.cfg
+
+

+ Zmiany, których dokonano na oryginalnym archiwum, aby można było je + upublicznić znajdują się tutaj. Z kolei lista zainstalowanych pakietów tutaj. +

+

+ Changelog najnowszej wersji znajduje się tutaj. +

+

+ -- Changelog -- +

+

+ -- 11.02.2022 - Aktualizacja oryginalnego archiwum i upublicznienie go
+ -- 11.02.2022 - Nowa wersja archiwum, zamiany w changelog-u powyżej
+

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/linux/greenOSTe.html b/articles/linux/greenOSTe.html new file mode 100644 index 0000000..0df638a --- /dev/null +++ b/articles/linux/greenOSTe.html @@ -0,0 +1,109 @@ + + + + + + + + +
+                               ____  ___________   
+   ____ _________  ___  ____  / __ \/ ___/_  __/__ 
+  / __ `/ ___/ _ \/ _ \/ __ \/ / / /\__ \ / / / _ \
+ / /_/ / /  /  __/  __/ / / / /_/ /___/ // / /  __/
+ \__, /_/   \___/\___/_/ /_/\____//____//_/  \___/ 
+/____/
+
+ +
+

greenOS Trisquel edition GNU/Linux (Torwards the sun)

+

+ greenOSTe jest to wersja Trisquel GNU/Linux + a nie samodzielna dystrybucja. Można powiedzieć że jest flavour + tej dystrybucji. Trisquel podobnie jak opisywana już na tej + stronie Parabola jest w pełni wolną dystrybucją. Oznaczna to + mniej więcej tyle, że dystrybucja nie posiada oficjalnie żadnego + zamkniętego oprogramowania w swoich repozytoriach, a jądro pozbawione + jest blobów binarnych. Dystrybucje tego typu mogą skorzystać z projektu + Linux-libre dostarczającego takie jądro (patrz: + Parabola GNU/Linux-libre) lub samodzielnie kompilować jądro + pozbawione modułów dostarczanych w postaci binarnych blobów + (Trisquel GNU/Linux, PureOS GNU/Linux). +

+ +
+ green-OSTe-ss-thumbnail +
Kliknij obrazek, aby otworzyć w pełnym rozmiarze.
+
+
+

+ Celem tej wersji jest wykorzystanie rozwiązań znanych z greenOS + w zastosowaniach gdzie niechcemy wykorzystać klasycznego jądra oraz + zamkniętego oprogramowania. Zestaw dostarczanego oprogramowania został + uszczuplony o + całe zamknięte oprogramowanie wykorzystywane w greenOS oraz o + menadżer wyświetlania lightdm. Środowisko graficzne + uruchamiane jest na życzenie użytkownika za pomocą polecenia +

+
+$ startx
+
+

+ Lista programów dostarczanych wraz z greenOSTe: +

+
    +
  • icewm - Menadżer okien,
  • +
  • Mozilla Firefox 91.4.1esr - + Przeglądarka internetowa
  • +
  • X-File Editor - Menadżer plików,
  • +
  • Midnight Commander - Menadżer plików (tekstowy),
  • +
  • Geany - Proste IDE, bardziej zaawansowany notatnik,
  • +
  • gVim - Legendarny edytor Vim, wraz z nakładką + graficzną gtk3,
  • +
  • qmmp - Odtwarzacz plików audio,
  • +
  • mpv - Odtwarzacz plików multimedialnych, uruchamiany + z terminala.
  • +
  • HexChat - klient sieci IRC,
  • +
  • mutt - Klient pocztowy (tekstowy).
  • +
+

+ Podobnie jak w przypadku greenOS, greenOSTe jest + dostępny w postaci LiveCD, link do obrazu znajduje się poniżej: +

+ +

+ Instalacja wygląda identycznie jak w przypadku greenOS, jedyną + różnicą jest pobierana paczka z głównym system plików, poniżej znajduje + się do niej link: +

+ +

+ Z racji wydania aktualizacji poprzednie wydania greenOSTe dostępne są + pod adresem: https://sourceforge.net/projects/greenoste/files. +

+

+ greenOSTe rozprowadzany jest bez gwarancji przydatności. + Autor nie ponosi odpowiedzialności za szkody wyrządzone instalacją lub + korzystaniem z greenOSTe. Miłej zabawy! +

+

+-- Changelog -- +

+

+ -- 30.12.2021 - Wydanie pierwszej wersji greenOS Trisquel edition +

+
+ + + + diff --git a/articles/linux/index.html b/articles/linux/index.html new file mode 100755 index 0000000..997a04e --- /dev/null +++ b/articles/linux/index.html @@ -0,0 +1,57 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ + + + + + + diff --git a/articles/linux/instalacja_Alpine_Linux.html b/articles/linux/instalacja_Alpine_Linux.html new file mode 100644 index 0000000..44486ed --- /dev/null +++ b/articles/linux/instalacja_Alpine_Linux.html @@ -0,0 +1,175 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+ +

Instalacja Alpine Linux

+

+ Alpine Linux jest jedną z moich ulubionych dystrybucji. Lekki i bezpieczny system, który po niewielkiej konfiguracji może stać się systemem codziennego użytku. Dystrybcja dostaczona przez norweskich deweloperów znajduje zastosowanie na wielu platformach w tym Raspberry Pi. Cechami charakterystycznmi tej dystrybucji jest OpenRC jako program init, BusyBox oraz możliwość działania z pamięci RAM. Warto również wspomnieć że twórcy systemu wspierają również aplikację, która pozwala administrować systemem z poziomu przeglądarki WWW. +

+
    +
  1. Start
    +

    + Po załadowaniu płyty, system wystartuje na zasadzie LiveCD. Poprosi nas o zalogowanie się. Logujemy się na konto użytkownika root bez hasła. Jeśli chcemu coś sprawdzić przed instalacją to jest najlepszy moment. Kiedy będziemy gotowi na instalację systemu wydajemy poniższe polecenie: +

    +
    +# setup-alpine
    +
    +
  2. +
  3. Układ klawiatury
    +

    + Pierwszą rzeczą jaką musimy ustawić jest układ klawiatury. Na początku wybieramy układ na podstawie kraju, a następnie układy stostowane na obszarze danego kraju. Przeważnie naszym wyborem jest pl, pl. +

    +

    + Instalcja Alpine Layout klawiatury 1 +

    +

    + Instalacja Alpine Layout klawiatury 2 +

    +
  4. +
  5. Nazwa komputera
    +

    + Po wybraniu układu klawiatury instalator zapyta nas o nazwę dla naszego systemu, tutaj możemy wpisać co nam się podoba. Zazwyczaj możemy używać małych liter, cyfr oraz myślnika. Ja podałem nazwę dystrybucji w raz z wersją systemu tak zazwyczaj robię na maszynach wirtualnych, ale jeśli chodzi o fizyczne maszyny to wpisuje zazwyczaj model komputera. +

    +

    + Instalacja Alpine nazwa komputera +

    +
  6. +
  7. Inicjalizcja interfejsów
    +

    + Teraz przyszedł czas na określnie konfiguracji sieciowej naszego Alpine-a. Z poziomu instalatora mamy duże możliwośći konfiguracji interfejsów, aby przygotować nasz system do pracy na urządzeniach sieciowych. Póki co przygotujemy system ogólnego użytku. Więc, na pocztku wybieramy interfejs do do incjalizacji. +

    +

    + Instalacja Alpine incjalizacja interfejsów1 +

    +

    + Następnie zostaniemy zapytani o adres IP dla tego interfejsu. Tutaj warto na chwile zatrzymać się i pomyśleć na przeznaczeniem naszego systemu. Jeśli jest to maszyna wirtualna np. tylko do tego żeby sobie uruchomić ten system to może być dhcp, jeśli do czegoś innego np. do rzeczy dewelperskich to warto zastosować jakiś stały adres, poza pulą naszego sieciowego serwera DHCP. Dla bramki, adres zależy od interfejsu jaki inicjujemy. Sposób konfiguracji interfejsu zewnetrznego jest podyktowany przez ISP, a adresy wenętrzne zawsze maja stały adres pierwszego komputera w tej sieci. W moim przypadku jest środowisko emulacjyne QEMU (bez kvm), więc intefejs ustawiam na dhcp. +

    +

    + Instalacja Alpine inicjalizacja interfejsów2 +

    +

    + Po konfiguracji interfejsu, jeśli w systemie znajdują się jeszcze jakieś nie skonfigurowane interfejsy sieciowe to instalator zapyta czy chcemy je skonfigurować. Tutaj możemy ustawić stałe adresy dla intefejsów wewnętrznych bramki. +

    +

    + Instalacja Alpine inicjalizacja interfejsów3 +

    +
  8. +
  9. Hasło dla użytkownika root
    +

    + Następnym krokiem jest ustawienie hasła użytkownika root w systemie. W zależności od zastosowania systemu należy wybrać odpowiednie hasło. Dla systemów, które są podłączone do sieci lub są częścia systemów produkcyjnych to dla nich trzeba ustawić jakieś bezpieczne hasło, z kolei dla maszyny testowej możemy ustawić jakieś słabe hasło byle by go nie zgubić. Jeśli je zapomnimy to stracimy czas na usunięcie go lub reinstalacje systemu. Ja sobie ustawie hasło: toor. Hasło dość łatwe do zapamiętania, stosowanie tego hasła zapoczątkowa dystrybucja BackTrack, a poźniej Kali Linux. +

    +

    + Instalacja Alpine hasło dla root-a +

    +
  10. +
  11. Strefa czasowa
    +

    + System aby mógł poprawnie wyświetlać informacje nt. daty oraz czasu potrzebuje strefy czasowej jaka nas obejmuje. Jeśli nie znamy naszej rodzimej strefy czasowej (Europe/Warsaw) możemy wybrać '?', przez co zostanie nam wyświetlona lista. +

    +

    + Instalacja Alpine lista stref czasowych +

    +

    + Pod nazwami kontynetów kryją się stolice lub wieksze miasta państw tych kontynentów. Dla Polski możemy wybrać albo Poland albo Europe/Warsaw. +

    +
  12. +
  13. Proxy dla HTTP/FTP
    +

    + Po ustaleniu strefy czasowej instalator zapyta o adres proxy dla ruchu protoków HTTP oraz FTP, jeśli nasz ruch nie przechodzi przez proxy to pozostawiamy wartość domyślną ustawioną na none, w przeciwnym wypadku podajemy adres naszego pośrednika. +

    +

    + Instalacja Alpine, adres proxy http_ftp +

    +
  14. +
  15. Instalacja klienta NTP
    +

    + Patrz przedostatni pragraf. +

    +
  16. +
  17. Wybór serwera lustrzanego
    +

    + Po podaniu informacji nt. proxy, zostanie wyświetlona nam lista serwerów lustrzanych do wyboru źródła repozytorium. Możemy wybrać 1 z 55 podając numer z listy, wpisać własny adres URL, co prawdopodobnie daje możliwość użycia lokalnego mirrora, wpisać literę 'r' co spowoduje ustawienie losowego serwera, wpisać literę 'f', przez co zostanie wybrany najszybszy serwer lub wpisać literę 'e', przez co będziemy mogi edytować listę repozytoriów. Zawsze tutaj wybieram serwer nr 37, jest chyba najszybszym mirrorem w Polsce. +

    +

    + Instalacja Alpine, wybór serwera lustrzanego +

    +
  18. +
  19. Ustalenie daemona SSH
    +

    + Alpine Linux podczas instalacji domyślnie daje możliwość zainstalowania serwera SSH, na naszej maszynie. Do wyboru mamy ogólnodostępne serwery SSH: dropbear oraz openssh. Dla systemów wbudowanych gdzie liczy się każdy KB RAM-u, warto wybrać dropbear. Nie ma on co prawda dobrego wsparcia SFTP, ale pełne dla SCP, więc można jakoś sobie poradzić z transferem plików, jest on jednak mniej zasobożerny niż OpenSSH. Poza systemami wbudowanymi to raczej lepiej zainstalować klasyczne OpenSSH. +

    +

    + Instalacja Alpine, wybór daemon ssh +

    +
  20. +
  21. Instalacja właściwa systemu
    +

    + Przebieg instalacji został w Alpine Linux, bardzo uproszczony na samym początku zostaje nam wyświetlona lista dysków. +

    +

    + Instalacja Alpine, lista dysków +

    +

    + Następnie instalator prosi nas o wskazanie dysku do instalacji. Po zatwierdzeniu dysku, wybieramy sposób instalacji systemu. Do wyboru mamy dwie opcje, sys lub data. Pierwszy z nich to sposób klasyczny system jest instalowany na dysku i korzysta z niego jak każdy inny GNU/Linux. Opcją numer dwa jest załadowanie systemu do pamięci RAM, i wykorzystanie prawie całej przestrzeni dyskowej do celów aplikacji, które mają być hostowane na naszym Alpine Linux-ie. Do partycjjonowania dysków możemy również wykorzystać LVM. Jednak powyższe tryby pozostaje takie same tylko że z użyciem woluminów logicznych. +

    +

    + Instalacja Alpine, tryb instalacji +

    +

    + Po wybraniu trybu instalacji zostaniemy zapytani o to czy kontynuować ponieważ wybrany dysk zostaniewyczyszczony aby móc zainstalować na nim nasz system, to jest ostatnia szansa na przerwanie instalacji, jeśli mamy taką potrzebę. +

    +

    + Instalacja Alpine, zatwierdzenie dysku +

    +

    + Po zatwierdzeniu, dysk zostaje sformatowany i rozpoczyna się proces instalacji. +

    +

    + Instalacja Alpine, proces instalacji +

    +

    + Kiedy wskaźnik postępu osiągnie 100 % wtedy rozpoczną się czynności poinstalacjyne. +

    +

    + Instalacja Alpine, czynności poinstalacjyne, koniec instalacji +

    +

    + Ostatni komunikat mówi nam że system został poprawnie zainstalowany i teraz należy opuść środowisko LiveCD. Restartujemy naszą maszynę i bootujemy ją z dysku. System powinien się uruchomić. +

    +
  22. +
+

+

+ Alpine Linux korzysta z serwerów NTP, do ustalenia daty i czasu, jednak nie przy każdej instalacji. Jeśli ktoś korzysta z QEMU to instalator nie będzie proponował instalacji NTP, klient NTP co jakiś czas musi komunikować się serwerami czasu, co może podwodować dodatkowe obciązenie systemu, a samo QEMU nie jest hipernadzorcą jest jedynie programem emulacyjnym więc i tak wydajność gosczonych przez niego systemów jest nie zbyt zadowalająca. Instalator Alpine to zwykły skrypt powłoki, pozostawiony przypuszczalnie dla zmiany trybu instalacji systemu i wewnątrz niego możemy sprawdzić dlaczego instalator nie instaluje klient NTP, na naszym systemie. Klient NTP nie zostanie zainstalowany w przypadku szybkiej instalacji (setup-alpine -q), instalacji na QEMU oraz w przypadku uruchomienia instalatora na kontenerze LXC. +

+

+ Instalacja Alpine, instalacja klienta NTP
+

+

+ ~xf0r3m +

+ +
+ + + + diff --git "a/articles/linux/instalacja_Spotify_oraz_atom.io_za_pomoc\304\205_Snap.html" "b/articles/linux/instalacja_Spotify_oraz_atom.io_za_pomoc\304\205_Snap.html" new file mode 100644 index 0000000..f3ee93c --- /dev/null +++ "b/articles/linux/instalacja_Spotify_oraz_atom.io_za_pomoc\304\205_Snap.html" @@ -0,0 +1,46 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Instalacja klienta Spotify oraz edytora Atom.io za pomocą snap

+

+ Wielu pewnie będzie zastanwiać się dlaczego tworzę materiał dla dwóch poleceń. Odpowiedź jest dość prosta, po to żeby nie przeszukiwać Internetu w celu ich znalezienia. Ja jestem człowiekiem, który dość szybko sie nudzi i korzystam z wielu różnych komputerów oraz wielu różnych systemów. Ciągle nie mogę znaleźć tej jedynej konfiguracji, której już bym nie zmieniał. A to na jednym komputerze klawiatura nie taka, a to coś się dzwięk psuje, bo nie ma odpowiedniego sterownika. Tworząc pewien projekt korzystałem z Della Optiplex GX620, żaden potwór, dlatego też padała decyzja aby zainstalować na nim Lubuntu i stąd się wziął ten materiał. Teraz korzystam z innego systemu operacyjnego, ale jeśli najkorzystniejszą opcją będzie wykorzystanie Lubuntu, to zamiast przeszukiwać Internet w poszukiwaniu poleceń związanych z instalacją tych dwóch programów, skorzystam z zasobów, które już posiadam. Tworzenie materiału dla dwóch poleceń, jest dla mnie jak zapisanie ich w notesie, tylko że ten mój notes, ta + cała moja strona o jakże enigmatycznej nazwie "morketsmerke.net", jest podłączony do Internetu. Mogę z niego skorzystać o każdej porze i gdzie kolwiek będę, ponieważ w dziejszych czasach nawet śpimy z komputerami. Oczywiście będę mogł z tego korzystać, dopóki będę zapewniać moim usługom warunki techniczne, takie jak ogólnodostępny serwer podłączony do Internetu, jak i domenę aby łatwiej nawigować pomiędzy zgromadzonymi przez siebie materiałami. Tak zgromadzonymi, ponieważ rzadko tworze własne. Zazwyczaj robie tak że szukam czegoś Internecie, sprawdzam czy to działa lub jeśli coś nie działa staram się tak dobrać czynności aby to działało. Tłumaczę często na jezyk polski znaleziska, tworzę listę czynności (poniekąd algorytm) aby uruchomić jakąś usługę, na sam koniec rozwijam to aby miało formę artykułu na bloga. +

+

+ Wracając do głównego tematu, żeby zainstalować Spotify oraz Atom.io za pomocą snap, wystarczy że wykonamy poniższe polecenia. +

+
+$ sudo snap install spotify
+$ sudo snap install --classic atom
+
+

+ Na tej stronie na pewno będą pojawiać się materiały odnośnie pojedyńczych poleceń nie będą one tak długie jak ten, jednak chciałem tutaj wiele rzeczy wyjaśnić. +

+

+ P.S. Mamy 01.04.2021, wczoraj zainstalowałem na Debianie ze snap Atom.io i niestety nie chciało się uruchomić. Usunąłem i zainstalowałem ręcznie, sciągając pakiet z oficjanej strony - wszystko działa. Minus tego rozwiązania jest taki, że aktualizacji będzie trzeba dokonywać ręcznie. +

+ ~xf0r3m +

+
+ + + diff --git "a/articles/linux/instalacja_aktualizacja_pakiet\303\263w_na_Arch_Linux.html" "b/articles/linux/instalacja_aktualizacja_pakiet\303\263w_na_Arch_Linux.html" new file mode 100644 index 0000000..ffd14c4 --- /dev/null +++ "b/articles/linux/instalacja_aktualizacja_pakiet\303\263w_na_Arch_Linux.html" @@ -0,0 +1,55 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Instalacja oraz aktualizacja pakietów na dystrybucjach bazujących na Arch Linux

+

+ Przez długi okres czasu trzymałem się kurczowo, jednej rodziny systemów GNU/Linux były to dystrybucje oparte o Debian: Ubuntu, Kali Linux itd. Znałem manager pakietów w tych dystrybucjach. Jednak kiedyś następuje czas na zmiany, wraz z czasopismem Linux Magazine była dołączona płyta DVD zawierająca dystrybucję Manjaro. Ta dystrybucja jest to taki "user-friendly" Arch Linux, jest czymś w rodzaju Ubuntu lub Linux Minta tylko zamiast Debiana jest właśnie Arch. Pomysłodawca wykonał kawał świetnej roboty przybliżając ludziom niezwiązanym za bardzo z Linuxem tą dystrybucje skierowaną głównie do entuzjastów. Podobnie jest z Debianem, tylko że on już zdąrzył dorosnąć i jest chyba najbardziej stabilną dystrybucją, której rozwój w 100% spoczywa w rękach społęczności. Ten materiał myślę że jest dla wszystkich tych, którym nie chce się przedzierać przez strony podręcznika a zaczynają swoją przygodę z Manjaro lub innym Arch-em. + Pierwszą rzeczą jaką zawsze robie po zainstalowaniu jakie kolwiek nowego systemu jest zainstalowanie aktualizacji, no chyba że jest to Debian, wtedy instaluje go z Internetu - podczas instalacji pobierze najnowsze pakiety. Więc jak możemy dokonać aktualizacji w systemach opartych na Arch Linux? Wydajmy poniższe polecenie. +

+
+$ sudo pacman -Syu
+
+

+ To polecenie spowoduje odświeżenie bazy pakietów, w raz z kluczami, które uwierzytelniają repozytoria. W Arch-ach jest wykonywane jawnie tak samo w RPM-amch takich jak Fedora czy Red Hat, w DEB-ach klucz trzeba wczytać ręcznie aby w ogóle zacząć wymieniać informacje z danym repozytorium. Po aktualizacji bazy następuje wyszukanie najnowszych wersji zainstalowanych pakietów i wyświetlenie ich listy. Zatwierdzamy aktualizacje i najnowsze pakiety zostaną ściągnięte i zainstalowane w naszym systemie. +

+

+ Kolejną rzeczą jaką na pewno chcielibyśmy zrobić to sobie coś zainstalować. Instalacja jest równie prosta. +

+
+$ sudo pacman -S <nazwa_pakietu>
+
+

+ Do instalacji wykorzystujemy to samo polecenie tylko, że z jednym przełącznikiem nie z trzema. Po przełączniku -S podajemy nazwę pakietu. Jeśli nie znamy nazwy, możemy poszukać pakietów na stronie Arch Linux po tym linkiem: https://archlinux.org/packages/. +

+

+ Jak możemy się domyślić nie wszystkie dystrybucje bazują na protoplastycznych trzech trzonach takich jak Red Hat, Debian czy Slackware. Jest wiele niezależnych dystrybucji, takich jak sam Arch, Gentoo czy przytaczany na tej stronie Alpine Linux. Do rozeznania się w dystrybucjach może posłużyć nam ta infografika: https://upload.wikimedia.org/wikipedia/commons/8/8c/Linux_Distribution_Timeline_Dec._2020.svg. Niezależne distra (skrót od dystrybucje) posiadają one raczej swoje programy służace do zarządania pakietami oprogramowania. Dlatego warto wyrobić sobie nawyk aby poszukać informacji na temat instalacji pakietów na stronie danej dystrybucji, a nie tracić czas na wyszukiwanie + takich artykułów jak ten. +

+

+ ~xf0r3m +

+
+ + + + + diff --git "a/articles/linux/instalacja_kontener\303\263w_LXD.html" "b/articles/linux/instalacja_kontener\303\263w_LXD.html" new file mode 100644 index 0000000..516cf25 --- /dev/null +++ "b/articles/linux/instalacja_kontener\303\263w_LXD.html" @@ -0,0 +1,232 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Instalacja kontenerów LXD/LXC

+

+ Kontenery LXD/LXC są kompromisem pomiędzy konternerami aplikacji takimi jak Docker oraz maszyna wirtualnymi kvm czy xen. Po ściągnięciu obrazu dostajemy czysty system operacyjny tak jakby to była świeżo zainstalowana maszyna wirtualna, ale to nadal przestrzeń użytkowa (userspace) ze współdzielonym wraz z hostem jądrem - kontener. Kontener będzie posiadać oddzielne wszystko to co kojarzy nam się z system operacyjnym, z tym elementami, których możemy hipotetycznie dotknąć. Do instalacji wybrałem serwer z system Ubuntu Server 18.04, ponieważ akurat taki miałem od ręką. +

+

+ Pierwszą czynnością jaką wykonamy jest dodanie naszego użytkownika do grupy lxd, uwaga ta grupa może nie być dostępna przed instalacją pakietu LXD, więc jeśli to polecenie się nie powiedzie należy je wykonać zaraz po zainstalowaniu pakietu. +

+
+$ sudo usermod --append --groups lxd 
+
+

+ Podczas instalacji tym przypadku wykorzystałem system plików ZFS, jako magazyn danych dla kontenerów. ZFS wybieram głównie, gdy dane kontenerów będą przechowywane w oddzielnym dysku. Kiedy storage kontenerów jest wspódzielony z system operacyjnym to wtenczas wybieram dir - klasyczny katalog. Póki co Ubuntu w tej wersji nie wspiera natywnie ZFS dlatego też trzeba doinstalować jego obsługę z repozytorium. Jeśli będziemy korzystać z istniejącego dysku to + należy utworzyć na nim partycję na całej jego wielkości. +

+
+$ sudo apt update
+$ sudo apt install zfsutils-linux
+
+

+ W wielu systemach dostępny jest manager pakietów snap. Na tej stronie możemy sprawdzić czy dla naszej dystrybucji jest on wspierany: https://snapcraft.io/docs/installing-snapd, kiedy uporamy się z instalacją snapa, możemy przejść do instalacji + właściwego pakietu. +

+
+$ sudo snap install lxd
+
+

+ Po zainstalowaniu pakietu, środowisko trzeba jescze zaincjować. Wydając poniższe polecenie uruchomimy kreator, który zbierze niezbędne do konfiguracji informacje. Postaram się przetłumaczyć te pytania. +

+
+$ sudo lxd init
+
+ +

+ Zatem: +

+
+Would you like to use LXD clustering ? (yes/no) [default=no]:
+
+

+ Czy chcesz użyć klastrowania LXD? - spowoduje uruchomienie LXC w trybie klastrowania, czy umożliwie podłączenia do sieci węzłów, wszystkie węzły posiadają jedną bazę danych i są zarządzane za pomocą pojedyńczych poleceń. Klaster ma za zadanie łatwiejsze zarządzanie dużą ilością serwerów z LXC. +

+

+ Odpowiedź: domyślna. +

+
+Do you want to configure a new storage pool ? (yes/no) [default=yes]:
+
+

+ Czy chcesz skonfigurować nową przestrzeń danych - odpowiedź na to pytanie uruchomi, inicjalizacje przestrzeni danych (storage) dla kontenerów. +

+

+ Odpowiedź: domyślna. +

+
+Name of the new storage pool [default=default]:
+
+

+ Nazwa nowej przestrzeni danych? - tutaj możemy nadać nazwę przestrzeni danych dla naszych kontenerów. +

+

+ Odpowiedź: domyślna / nazwa własna +

+
+Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]
+
+

+ Rodzaj przestrzeni danych - możemy teraz wybrać jaka technologia zostanie użyta do zarządzania przestrzenią danych naszych kontenerów, dla oddzielnych dysków wybieram zfs, ponieważ daje najkorzystniejsze efekty, kontener ma do dyspozycji tak jakby cały dysk (wykorzystuje obraz przestrzeni ZFS), dla dysku współdzielonego z systemem używam klasyczny dir. Do tego drugiego trzeba mieć odpowiednio duży dysk. Odpowiedź może być zasugerowana w zależności od dostępności danych technologii w systemie. +

+

+ Odpowiedź: zfs / dir. Patrz wyżej. +

+
+Would you like to use an existing block device ? (yes/no) [default=no]:
+
+

+ Czy chcesz użyć istniejącego dysku? - wskazujemy dysk, ale tylko jeśli wybraliśmy zfs lub inny rodzaj storage-u, której jest również system plików w UNIX-ach, wyjątkiem będzie lvm, który jest sposobem zarządzania przestrzenią dyskową nie stricte system plików. +

+

+ Odpowiedź: yes. +

+
+Path to existing block device:
+
+

+ Ścieżka do istniejącego dysku - musi to być partycja, najlepiej zrobić ją jeszcze przed rozpoczęciem inicjacji. +

+

+ Odpowiedź: np. /dev/sda1 +

+
+Would you like to connect to a MASS server? (yes/no) [default=no]:
+
+

+ Czy chcesz podłączyć się do serwera MAAS? - MAAS - technologia chmury od Canonical Ltd. https://maas.io +

+

+ Odpowiedź: domyślna +

+
+Would you like to create a new local network bridge? (yes/no) [default=yes]
+
+

+ Czy chcesz utworzyć nowy most sieci lokalnej? - tworzymy sieć lokalną dla kontenerów, to coś jak intnet w VirtualBox. Od poźniejszych ustawień będzie zależeć jak będzie wyglądać ich komunikacja, jednak między sobą oraz systemem je hostującym będzie ona dość swobodna. +

+

+ Odpowiedź: domyślna +

+
+What should the new bridge be called ? [default=lxdbr0]
+
+

+ Jaką nazwę nadać dla nowego mostu? - interfejsu między którym będzie wymieniana komunikacja pomiędzy wirtualnymi interfejsami kontenerów a interfejsem systemu hostującego. +

+

+ Odpowiedź: domyślna / dowolna +

+
+What IPv4 address should be used ? (CIDR subnet notation, "auto", "none") [default=auto]
+
+

+ Jakiego adresu IPv4 należy użyć? [adres z notacją CIDR, "auto", "none"] - podajemy adres dla mostu, jedenocześnie ustalając klasę adresów dla naszych kontererów poprzez podanie maski CIDR. +

+

+ Odpowiedź: 192.168.56.1/24 / dowolna inna. +

+
+Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]:
+
+

+ Czy chcesz przepuścić przez NAT ruch na twoim moście? - Ustawając tutaj yes lub no, możemy wybrać czy kontenery będą miały dostęp do sieci poza system je hostującym czy też nie. +

+

+ Odpowiedź: domyślna. +

+
+What IPv6 address should be used? (CIDR subnet notation, "auto" or "none") [default=auto]: none
+
+

+ Jakiego adresu IPv6 należy użyć? [adres z notacją CIDR, "auto", "none"] - możemy zefiniować adres IPv6, jeśli z nich korzystamy, ja z nich nie korzystam więc ustawiam none +

+

+ Odpowiedź: w zależności od potrzeb / none +

+
+Would you like LXD to be available over network (yes/no) [default=no]:
+
+

+ (Czy chcesz aby LXD by dostępny przez sieć?) - jeśli mamy wiele serwerów pod kontrolą to możemy to ustawić, następnie zarządzać + nimi wszystkimi z jednego, umożliwienie dostępu do LXD przez sieć da nam również możliwość przenoszenia kontenerów między serwerami. +

+

+ Odpowiedź: w zależności od potrzeb, dla pojedyńczego serwera zostawiamy domyślnie. +

+
+Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
+
+

+ Czy chcesz automatyczne aktualizować pobrane obrazy kontenerów? +

+

+ Odpowiedź: domyślna +

+
+Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
+
+

+ (Czy chcemy wydrukowac wygenerowaną na podstawie naszych odpowiedzi konfiguracje LXD?) +

+

+ Odpowiedź: domyślna +

+

+ Po tym ostatnim pytaniu, środowisko LXC zostanie skonfigurowane do użycia. Kiedy zostanie nam zwrócony znak zachęty możemy przejść do utworzenia naszego + pierwszego kontenera. Aby utworzyć kontener należy wydać poniższe polecenie. +

+
+$ lxc launch ubuntu:18.04 c1
+
+

+ Gdzie launch jest poleceniem odpowiedzialnym za tworzenie nowych kontenerów, ubuntu:18.04 jest nazwą źródła obrazu systemu operacyjnego, w tym przypadku określnego wyłącznie wersją, który służy do utworzenia kontenera, c1 jest nazwą naszego kontenera. System LXC wspiera wiele systemów operacyjnych, ich lista znajduje się tutaj: https://us.images.linuxcontainers.org/, aby skorzystać z innych systemów niż ubuntu, należy skorzystać z oficjalnego + źródła, a nazwę zródła możemy sprawdzić wydając polecenie: +

+
+$ lxc remote list
+
+

+ Teraz dla przykładu możemy stworzyć kontener np. z GNU/Linux Debian, wydając poniższe polecenie. Dla Debiana możemy odwoływać zarówno numerem wersji jak i jej nazwą, identycznie dla Ubuntu. +

+
+$ lxc launch images:debian/10/amd64 c1
+
+

+ Po utworzeniu kontenera możemy się na niego zalogować aby móc na nim działać jak byśmy siedzieli przed konsolą prawdziwego serwera. Logowania możemy dokonać na dwa sposoby, jako użytkownik root, lub użytkownik nieuprzywilejowany z możliwością użycia polecenia podnoszącego uprawnienia. Niestety ten drugi sposób nie jest standardem i to czy możliwe będzie wykorzystanie go czy też nie, zależy głównie od konstrukcji obrazu kontenera. Druga opcja stosowana jest np. w Ubuntu, z kolei w Debianie już nie. Dlatego zachęcam do skorzystania z pierwszego sposobu. +

+
    +
  • Zalogowanie się na kontener jako root - lxc exec <nazwa_kontenera> -- /bin/bash
  • +
  • Zalogowanie się jako zwykły użytkownik z prawami do sudo - lxc exec <nazwa_kontenera> -- sudo --login --user ubuntu(użytkownik wykorzystywany przez obrazy Ubuntu oraz Linux Mint)
  • +
+

+ Zalogowanie się do kontenera uruchomi powłokę interaktywną w środowisku kontenera, a co jeśli chcemy wykonać pojedyńcze polecenie, a nie uruchamiać powłokę? W tym przypadku zamiast /bin/bash wstawiamy polecenie jak ma zostać wykonane. Kiedy jednak wydajemy takie + polecenie, to musimy mieć świadomość tego że jest ono wykonywane z uprawnieniami użytkownika root, chociaż jeżeli coś popsujemy na kontenerze + zawsze możemy usunąć i uruchomić jeszcze raz, w prosty i szybki sposób, a nie ślęcząc przez instalacją po raz kolejny systemu bo zapomnieliśmy wyeksportować czystej maszyny zaraz po instalacji systemu, o fizycznych serwerach już nie wspominając. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/linux/instalacja_sandstorm.io.html b/articles/linux/instalacja_sandstorm.io.html new file mode 100644 index 0000000..654a673 --- /dev/null +++ b/articles/linux/instalacja_sandstorm.io.html @@ -0,0 +1,52 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Instalacja Sandstorm.io

+

+ Sandstorm.io jest platformą do samodzielnego hostowania popularnych aplikacji internetowych i współdzielenia ich z innymi, usprawniając tym pracę zespołów. Do zainstalowania mamy 78 różnych aplikacji, dostępnych po tym adresem https://apps.sandstorm.io/. Warto dodać że te aplikacje są specjalnie przygotowanymi na potrzeby platformy obrazami. Nie są to pełne aplikacje, jakie otrzymalibyśmy przy samodzielnej instalacji na jednym z naszych serwerów, dlatego też używanie sandstorm jako platformy testowej dla aplikacji mija się z celem. Sama instalacja nie jest trudna, składa się ona w pierszym etapie z wyboru trybu instalacji, czy jest to instalacja normalna, po której nasz serwer będzie widoczny w Internecie pod podaną przez nas subdomeną czy instalacja developerska, instalowana lokalnie na komputerze, dostępna pod adresem "local.sandstorm.io:6080", dzięki czemu uzyskamy możliwośc przetestowania aplikacji, niestety lokalnie. Drugi etap instalacji będzie polegać na wyborze sposobu logowania zespołu do platformy czy ustawień skrzynki mailowej dla powiadomień. Tutaj opiszę instalajcję normalną, ma ona jednak spore wymagania jak stały publiczny adres IP czy też użycie maszyny wirtualnej lub fizycznego serwera. +

+
    +
  1. Pobranie skryptu oraz instalacja usługi na serwerze. +

    + Instalacja sandstorm najlepiej rozpocząć od zalogowania sie jako administrator (root) na serwerze przeznaczonym pod jego instalację. Na stronie https://sandstorm.io/install, w okienku "HTTPS-verified install" znajduje się polecenie, które kopiujemy do naszego terminala. Pobrany zostanie skrypt instalacyjny, który zaraz po automatycznym uruchomieniu zapyta się o tryb instalacji w tym wypadku wybieramy opcje nr. 1. Wpisując po prostu '1'. W trakcie czynności przeprowadzanych przez instalator zostaniemy zapytani o subdomenę, jaka ma działać pod domeną '.sandcats.io' oraz o adres email, który zostanie wykorzystany do generowania certyfikatu Let's Encrypt oraz + uwierzytelnienia w razie potrzeby odzyskania domeny w trakcie ewentualnej migracji na inny serwer. Reszta czynności wykonuje się automatycznie, po zakończeniu pracy zostanie nam zwrócony link, pod który nalezy się udać aby skonfigurować naszą platformę. +

    +
  2. +
  3. Konfiguracja serwera. +

    + Pierwszą rzeczą jaką będziemy musieli skonfigurować jest metoda logownia. Do wyboru mamy kilka, jednak jedna wydaje się posiadać gwarancję działania oraz jest w miarę łatwa do skonfigurowania - Google. Kiedy wybierzemy logowanie za pomocą konta Google to cała procedura konfiguracji zostanie wypisana powyżej niezbędnych do konfiguracji pól. Jedyną czekającą na nas tutaj zagadką może być nazwa aplikacji w ekranie akceptacji OAUTH, możemy wpisać cokolwiek, np. sandstorm. Po uzyskaniu potrzebnych informacji, przechodzimy dalej. Jeśli komuś potrzebne są następne konfiguracje może je ustawić wedle uznania. Po zakończeniu konfiguracji nie pozostało nam nic innego jak tylko przejść do instalacji aplikacji i zaproszenia naszych znajomych do korzystania z usług. +

    +
  4. +
+

+ Korzystając z Sandstorm przez krótki okres czasu miałem mieszane odczucia. Jedna z aplikacji, która była odpowiedzialna za przechowywanie plików nie chciała ich uploadować do podfolderów, jedynie do głównego katalogu. Może zrezyngnowałem z tej platformy ponieważ nie wykorzystywałem jej zgodnie z przeznaczniem a żądałem platformy do hostowania aplikacji w Internecie, a nie kilku usług dostępnych dla wąskiego grona odbiorców. Jednak mylący może być fakt, że Ghost system CMS do hostowania blogów, wspiera (obraz na tej platformie) udostepnienie tej aplikacji w sieci (pozwolenie na dostęp do treści tam umieszczonych poza logowanie do platformy). Teraz patrząc na to z boku, używanie sandstorm może prostym sposobem na wdrożenie intranetu. Sandstorm jest złym rozwiązaniem dla ludzi szukających łatwego hostingu usług w siecie, ale świetnym rozwiązaniem dla zespołów, które chcą mieć wszystko w jedym miejscu. +

+

+ ~xf0r3m +

+

+ P.S. Jeśli kogoś interesuje instalacja platformy Sandstorm, to pod tym linkiem, znajduje się dość ciekawy wpis na serwisie Reddit: https://www.reddit.com/r/selfhosted/comments/bsoduu/about_sandstormio/, który może zaważyć na tym czy dalej będziemy chcieli ją instalować. +

+
+ + + diff --git "a/articles/linux/instalacja_sterownik\303\263w_Nvidii_na_Debian_11.html" "b/articles/linux/instalacja_sterownik\303\263w_Nvidii_na_Debian_11.html" new file mode 100755 index 0000000..cb31199 --- /dev/null +++ "b/articles/linux/instalacja_sterownik\303\263w_Nvidii_na_Debian_11.html" @@ -0,0 +1,142 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ + +
+

Instalacja własnościowego sterownika graficznego Nvidii na Debian 11

+

+ Jeśli w naszym komputerze z Debian 11 zainstalowana jest karta + graficzna Nvidii, to na pierwszy rzut oka może okazać się, że wszystko + jest w porządku. Dzieje się to za sprawą wolnego sterownika Nouveau. + Niestety nie wszystko jest takie wspaniałe na jakie wygląda. Uruchommy + w tym systemie jakieś dynamiczne wideo to od razu zauważymy poziome + linie "rozdzierające" obraz (ang. screen tearing). Otwarty + sterownik niestety nie sprawdza się zbyt dobrze w tym przypadku, w + szczególności gdy w naszym komputerze znajdują się układy graficzne z + serii GTX. +

+

+ Poniżej przedstawie instalację odpowiedniego + sterownika dla kart graficznych Nvidii w dystrybucji Debian 11. + Do tego celu użyłem komputera z GTX 1050 Ti. Natomiast wykorzystanym + przeze mnie środowiskiem graficznym jest XFCE z LightDM. +

+

+ Nie wiem czy system, który jest zainstalowany na waszych komputerach + był już wykorzystywane, ale w moim przypadku jest świerza instalacja + więc muszę skonfigurować sudo dla mojego użytkownika. +

+
+$ su root
+Hasło:
+# echo "xf0r3m ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers
+# (ctrl + d)
+$ sudo su
+#
+
+

+ Dla osób, które rozpoczynają dopiero swoją przygodę z dystrybucjami + GNU/Linux, zalecam aby nie zapisywały + NOPASSWD przed czwartym + ALL dla własnego bezpieczeństwa. +

+

+ Na początku najlepiej jest wyłączyć środowisko graficzne, aby można + było wygenerować nowe pliki konfiguracji serwera X.org. Nalepiej + zrobić to za pomocą systemd zmieniając domyślny poziomu + uruchomienia systemu. +

+
+$ sudo systemctl set-default multi-user.target
+
+

+ Po ponownym uruchomieniu komputera, możemy przejść do edycji adresów + źródłowych repozytorium. Na końcu każdej linii dopisujemy contrib + oraz non-free. +

+
+$ sudo vim /etc/apt/source.list
+
+

+ Po edycji adresów musimy pobrać listy pakietów. +

+
+$ sudo apt update
+
+

+ Po odświerzeniu list pakietów, instalujemy bardzo ważny pakiet. Z jego + pomocą określimy odpowiedni dla naszej karty sterownik + (pakiet Debian ze sterownikami). +

+
+$ sudo apt install nvidia-detect
+
+

+ Po jego instalacji wydajemy poniższe polecenie: +

+
+$ sudo nvidia-detect
+
+

+ W przed ostatniej linii zapisana będzie konkretna nazwa pakietu + sterownika jaki należy zainstalować. Cały proces możemu zautomatyzaować + za pomocą jedenej linii i podać odpowiedni pakiet już poleceniu + apt install. +

+
+$ sudo apt install \
+> $(sudo nvidia-detect | sed -n "$(($(sudo nvidia-detect | wc -l) - 1))p" | awk '{printf $1}') \
+> firmware-misc-nonfree nvidia-xconfig
+
+

+ Po instalacji tych pakietów należy uruchomić ponownie system, jednakże + przed tą czynnością ustawimy "tryb graficzny" jako domyślny poziom + uruchomienia systemu. Następnie uruchamiamy ponownie komputer. +

+
+$ sudo systemctl set-default graphical.target
+$ sudo reboot
+
+

+ Po uruchomieniu systemu i zalogowaniu się do środowiska graficznego w + terminalu wydajemy polecenie: +

+
+$ nvidia-settings
+
+

+ Powinnien nam pojawić się panel sterowania Nvidii, domyślnie wyświetlić + podsumowanie odnośnie karty graficznej. +

+

+ Podsumowując. Podczas instalacji sterowników graficznych na Debian + warto użyć polecenia nvidia-detect, aby dobrać odpowiedni + sterownik i proszę aby nie sugerować się tym co jest napisane na + stronie Nvidii. Pakiety Debian aby pakiety stworzone przez Nvidię nie + są tożsame. +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/linux/instalacja_systemu_z_w\305\202asnego_obrazu_LiveCD_z_Debianem.html" "b/articles/linux/instalacja_systemu_z_w\305\202asnego_obrazu_LiveCD_z_Debianem.html" new file mode 100644 index 0000000..567a888 --- /dev/null +++ "b/articles/linux/instalacja_systemu_z_w\305\202asnego_obrazu_LiveCD_z_Debianem.html" @@ -0,0 +1,100 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Instalacja system z własnego obrazu LiveCD z Debianem

+

+ Jakiś czas temu przedstawiono tutaj materiał o stworzeniu własnego + LiveCD z Debianem. Tutaj chciałbym iść o krok dalej. Rozważmy przypadek + taki, że korzystaliśmy z LiveCD przez dłuższy czas, obecnie już nie + musimy z niego korzystać, ale chcemy zainstalować na stałe ten obraz + na swoim komputerze. Do realizacji tego będziemy potrzebować kolejnego + obrazu dystrybucji, tym razem w pełnej wersji (pomijamy opcję + variant podczas pobierania obrazu), oraz obrazu wykorzystanego + do stworzenia LiveCD +

+

+ Dla celów porządkowych utworzymy katalog o nazwie + custom-debian. +

+
+# mkdir custom-debian
+
+

+ Do utworzonego katalogu pobieramy pełny obraz dystrybcji. +

+
+# debootstrap --arch=amd64 bullseye /root/custom-debian http://ftp.icm.edu.pl/debian
+
+

+ Kiedy obraz będzie gotowy do użycia, kopiujemy do niego zawartość + katalogu obrazem LiveCD. +

+
+# cp -prvv /root/customDebianLiveCD/chroot/* /root/custom-debian
+
+

+ Zmieniamy katalog główny na katalog obrazu +

+
+# chroot /root/custom-debian /bin/bash
+
+

+ Usuwamy pakiet live-boot. +

+
+# export $PS1="(chroot) ${PS1}"
+(chroot) # apt remove live-boot
+(chroot) # apt autoremove
+
+

+ Następnie przechodzimy do katalogu z pełnym obrazem i tworzymy w nim + archiwum zawierające wszystkie jego pliki i katalogi. +

+
+# cd custom-debian
+# tar -czvf custom-debian.tgz *
+
+

+ Tak przygotowane archiwum musimy gdzieś udostępnić, aby maszyna + uruchomiona z LiveCD mogła je swobodnie pobrać. +

+

+ Kolejnym krokiem jest uruchomienie maszyny docelowej z LiveCD i + instalacja systemu z tej wcześniej przygotowanej paczki. Opis + instalacji znajduje się pod tym linkiem: + + https://morketsmerke.net/site/greenOS/instalacja_greenos.html + Tak przygotowany obraz dystrybucji instaluje się identycznie jak + greenOS. +

+

+ W przedstawiony powyżej sposób możemy przygotować obraz dystrybucji + na podstawie wcześniej przygotowanego obrazu LiveCD, a następnie + zainstalować go swobodnie na dysku. +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/linux/przekierowanie_port\303\263w_do_kontener\303\263w_LXD.html" "b/articles/linux/przekierowanie_port\303\263w_do_kontener\303\263w_LXD.html" new file mode 100644 index 0000000..721a6ed --- /dev/null +++ "b/articles/linux/przekierowanie_port\303\263w_do_kontener\303\263w_LXD.html" @@ -0,0 +1,43 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Przekierowanie portów do kontenerów LXD

+

+ Gdzieś w tej kategorii znajduje się materiał odnośnie instalacji i inicjalizacji środowiska kontenerów LXD/LXC. Kiedy już nacieszyliśmy się tymi kontenerami, to czas zagonić je do pracy. Jak pamiętamy z wyżej wymienionego materiału podczas konfiguracji umożliwiliśmy komunikacje z Internetem oraz siecią lokalną serwera hostującego przez NAT. Stan komunikacji wygląda na taki jak że kontenery mogą komunikować z kim kolwiek, a z nimi nikt poza serwerem hostującym. A jeśli mają one dla nas hostować jakieś usługi to musimy mieć możliwość połączenia się z nimi. NAT w przypadku opartych na Debianie dystrybucji jest realizowany przez iptables. Warto zauważyć, że wewnątrz serwera hostującego zrobiła się taka mikrosieć, gdzie nasz interfejs mostu jest tym interfejsem wewnętrzny a główny interfejs sieciowy serwera, interfejsem zewnętrznym. + Czyli aby nasze kontenery mogły świadczyć usługi w Internecie trzeba dopuścić do nich ruch na wybranych portach, tak jakby było serwerami w klasycznej sieci lokalnej. Dowiadując się z tego materiału jak przekierować porty z interfejsu serwera do poszczególnych kontenerów, będziemy wiedzieć jak przekierować porty z interfejsu zewnętrzego naszej sieci do konkretnych serwerów, oczywiście o ile w naszej sieci wykorzystujemy bramkę opartą o iptables. +

+
+# iptables -t nat -I PREROUTING -i enp1s0 -p tcp -d 192.168.1.6 --dport 80 -j DNAT --to-destination 192.168.56.2:80
+
+

+ W tablicy nat, w łańcuchu PREROUTING wstawiliśmy regułę, która przekieruje wszystkie pakiety, zaadresowane do naszego serwera kontenerów na porcie 80 do kontenera o adresie 192.168.56.2 na port 80, za pomocą DNAT - zamiany adresu docelowego, w tym przypadku z adresu serwera na adres kontenera. +

+

+ Za pomocą pojedyńczego polecenia umożliwiliśmy połączenie dowolnego komputera w sieci z serwerem WWW uruchomionym na naszym kontenerze. Aby dostosować tę regułę do "port forwardingu" w naszej sieci opartej o bramkę z GNU/Linux-em, wystartczy zmienić interfejs i adresy, ewentualnie porty i protokół jeśli chcemy wypuścić coś innego niż HTTP. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/linux/samba_AD_DC_-_Instalacja.html b/articles/linux/samba_AD_DC_-_Instalacja.html new file mode 100644 index 0000000..103678e --- /dev/null +++ b/articles/linux/samba_AD_DC_-_Instalacja.html @@ -0,0 +1,199 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Samba AD DC - Instalacja

+

+ Samba Active Directory może być nieco lżejszą implementacją od usługi Active Directory oferowanej przez system Windows, jednak jego instalacja nie jest już taka prosta jak ma to miejsce w przypadku rozwiązań firmy Microsoft. Przedstawiona tutaj operacja będzie składać się z dwóch części, pierwsza z nich to właściwa instalacja usługi Samba AD DC, a drugą to instalacja usługi NTP, która jest niezbędną do prawidłowego funkcjonowania. Właśnie jest róźnica pomiędzy dwoma wyżej wymienionymi implementacjami, przy SAMBA AD jeśli zegar na komputerze klienta spóźnia się choćby o 5 minut to zalogowanie się na komputerze za pomocą użytkownika owej usługi może być już niemożliwe. Zatem przed przyłączeniem komputera do domeny, warto na początek ustawić serwer czasu na nasz kontroler domeny, a teraz zabierzemy się do właściwej instalacji. Na swój serwer wybrałem dystrybucje GNU/Linux Debian. +

+

+

    +
  1. Ustawienie statycznego adresu IP +

    + Z racji tego że nasz system ma świadczyć jakieś usługi w sieci, więc powinien mieć stały adres IP. Dzięki temu można go łatwo odnaleźć w sieci oraz przypisać mu jakąś przyjazną nazwę. Otwieramy plik /etc/network/interfaces. +

    +
    +allow-hotplug enp2s0
    +iface enp2s0 inet static
    +address 192.168.1.10
    +netmask 255.255.255.0
    +gateway 192.168.1.1
    +dns-nameservers 192.168.1.1
    +
    +
  2. +
  3. Wyłączenie usługi systemd-resolved +

    + Usługa systemd-resolved będzie kolidować z wbudowanymi usługami DNS Samby, więc musimy ją wyłączyć i statycznie w pliku /etc/resolv.conf ustawić adres IP serwera DNS, do którego będą przekazywane zapytania niezwiązane z domeną. +

    +
    +$ sudo systemctl disable systemd-resolved.service
    +$ sudo rm /etc/resolv.conf
    +$ sudo su
    +# echo "nameserver 192.168.8.1" > /etc/resolv.conf
    +# echo "127.0.1.1   adc1" >> /etc/hosts
    +# reboot
    +

    + Za pomocą polecenia systemctl, wyłączamy usługę systemd-resolved, nastepnie usuwamy przez nią stworzony plik /etc/resolv.conf, aby móc przekierować wyjście do plików w katalogu /etc musimy przełączyć się na użytkownika root, użycie polecenia sudo nie zadziała w tym przypadku. Do naszego nowego pliku /etc/resolv.conf dodajemy stały wpis adresu serwera DNS, w moim przypadku jest to adres bramy sieci, która jest nad moją siecią. Przedostatnia linia przedstawia dopisanie adresu przypisanego do naszej nazwy hosta do pliku /etc/hosts. Nie które aplikacje mogą ustalać tak nazwę hosta odpytując lokalny dns adresem 127.0.1.1, tak robi np. polecenie sudo, które jeśli nie otrzyma odpowiedzi będzie wyświetlać komunikat po każdorazowym wykonaniu. Teraz należy uruchomić nasz serwer ponownie, aby uaktywnić wszystkie zmiany. +

    +
  4. +
  5. Aktualizacja systemu +

    + Po wykonaniu powyższych konfiguracji, jak przed każdą instalacją jakiego kolwiek pakietu warto zaktualizować nasz system. +

    +
    +$ sudo apt update
    +$ sudo apt upgrade
    +$ sudo apt dist-upgrade
    +
    +
  6. +
  7. Instalacja niezbędnego oprogramowania +

    + Aby rozpocząć konfigurację Samba AD DC, musimy zainstalować poniższe oprogramowanie. +

    +
    +$ sudo apt install samba krb5-user krb5-config winbind libpam-winbind libnss-winbind
    +
    +

    + Podczas instalacji pakietu Kerberos (systemu uwierzytelniania wykorzystywanego przez Sambę) zostaniemy poproszeni o podanie sfery Kerberos gdzie podajemy nazwę naszej domeny wielki literami, np. TEST.LOCAL, adresu serwera Kerberos w sferze - podajemy nazwę naszej domeny małymi literami oraz adres serwera administracyjnego - identycznie jak przy serwerze Kerberos w sferze. Jak możemy się domyślić, to za nazwą naszej domeny będzie kryć się nasz serwer, który obecnie konfigurujemy. +

    +
  8. +
  9. Zatrzymanie usług +

    + W procesach poinstalacyjnych pakietu samba plik usługi AD DC został wyłączony, uruchomione zostały usługi odpowiedzialne za NetBIOS oraz SMB, które w obecnej konfiguracji nie będą nam potrzebne. Zatrzymujemy również daemona winbind, ponieważ będzie on uruchamiany przez proces kontrolera domeny w razie potrzeby. +

    +
    +$ sudo systemctl stop samba-ad-dc.service smbd.service nmbd.service winbind.service
    +$ sudo systemctl disable smbd.service nmbd.service winbind.service
    +
    +
  10. +
  11. Zabezpieczenie pliku konfiguracyjnego Samby +

    + Warto skopiować plik, który został dostarczony wraz z pakietem na tzw. w razie czego. Jeśli coś nie wyjdzie podczas promowania, to będziemy mogli ten plik przywrócić. +

    +
    +$ sudo mv /etc/samba/smb.conf   /etc/samba/smb.conf.init
    +
    +
  12. +
  13. Promowanie serwera do roli kontrolera Samba AD DC +

    + Przyszedł czas na tę chwilę, aby wreszczenie promować nasz serwer do roli kontrolera domeny, jednak nie ma co się za bardzo ekscytować. Ponieważ jedyna co mamy zrobić to wpisać tylko dwie informacje, o które zapyta skrypt tj. sferę, która jest identyczna jak w przypadku Kerberos - nazwa domeny z wielkich liter oraz hasło administratora AD, które musi składać się z min 8 znaków, jedna duża litera, jedna cyfra i nie może zawierać fragmentów loginu (administrator@TEST.LOCAL). +

    +
    +$ sudo samba-tool domain provision --use-rfc2307 --interactive
    +
    +
  14. +
  15. Uruchamianie konfiguracji Kerberos +

    + Przy promowaniu serwera skrypt wykonał za nas konfigurację Kerberos, naszym zadaniem jest tylko ją uruchomić linkując plik wygenerowany przez program do miejsca gdzie będzie mógł być odczytany przez daemona Kerberos. +

    +
    +$ sudo mv /etc/krb5.conf /etc/krb5.conf.init
    +$ sudo ln -s /var/lib/samba/private/krb5.conf /etc
    +
    +
  16. +
  17. Uruchomienie daemona Samba +

    + Aby uruchomić uruchomić nasz kontroler domeny, musimy odblokować plik usługi. +

    +
    +$ sudo systemctl unmask samba-ad-dc.service
    +$ sudo systemctl start samba-ad-dc.service
    +$ sudo systemctl status samba-ad-dc.service
    +$ sudo systemctl enable samba-ad-dc.service
    +
    +

    + Po wykonaniu tych poleceń usługa powinna wystartować. +

    +
  18. +
  19. Sprawdzenie portów używanych przez Sambę oraz poziomu funkcjonalności domeny. +

    + Aby upewnić się że usług wystartowała, wydajmy poniższe polecenia. +

    +
    +$ sudo ss -tulpn | egrep 'smbd|samba'
    +$ sudo samba-tool domain level show
    +
    +

    + Pierwsze polecenie powinno zwrócić listę portów otwartych przez Sambę, natomiast drugie określić funkcjonalność domeny przyrównując ją do funkcjonalności usług domenowych systemu Windows, zobaczymy nawet wersje systemu Windows Server, z którym funkcjonalność usług katalogowych jest identyczna. +

    +
  20. +
  21. Przekierowanie lokalnego DNS na kontroler. +

    + Teraz kiedy mamy pewność że nasz kontroler domeny teoretycznie działa możemy przekierować lokalne zapytania do niego aby upewnić się że wszystkie informacje zostaną przekazane klientom kiedy ci będą chcieli się podłączyć. Dopisujemy adres pętli zwrotnej na początku listy serwerów DNS w konfiguracji interfejsu sieciegowego. +

    +
    +allow-hotplug enp2s0
    +iface enp2s0 inet static
    +address 192.168.1.10
    +netmask 255.255.255.0
    +gateway 192.168.1.1
    +dns-nameservers 127.0.0.1 192.168.1.1
    +
    +

    + Po zapisaniu zmian przejdziemy do przygotowania nowego pliku /etc/resolv.conf. Oczywiście możemy zmienić plik, który jest już obecny w systemie. Ja stworzyłem inny plik, następnie nadpisałem nim plik źródłowy. +

    +
    +$ sudo su
    +# echo "nameserver 127.0.0.1" > /etc/resolv.conf.bak
    +# cat /etc/resolv.conf >> /etc/resolv.conf.bak
    +# echo "search test.local" >> /etc/resolv.conf.bak
    +# mv /etc/resolv.conf.bak /etc/resolv.conf
    +
    +

    + Na początku pliku znajduje się deklaracja serwera DNS z adresem pętli, następnie dopisałem obecną zawartość pliku /etc/resolv.conf, dodałem linię z sufksem domeny do przeszukiwania kiedy podamy nazwę krótką hosta, na koniec nadpisałem plik. +

    +
  22. +
  23. Restart serwera. +

    + Warto ponownie zrestartować serwer, aby wszystkie zmiany zostały uwzględnione. +

    +
    +# reboot
    +
    +
  24. +
  25. Sprawdzenie poprawności konfiguracji kontrolera domeny +

    + Poniżej przedstawiłem kilka kontrolnych poleceń, które powinny wykonać się bezbłędnie gdy kontroler AD jest prawidłowo skonfigurowany. +

    +
    +$ ping -c3 <nazwa_domeny>
    +$ ping -c3 <nazwa_hosta>.<nazwa_domeny>
    +$ ping -c3 <nazwa_hosta>
    +$ host -t A <nazwa_domeny>
    +$ host -t A <nazwa_hosta>.<nazwa_domeny>
    +$ host -t SRV _kerberos._udp.<nazwa_domeny>
    +$ host -t SRV _ldap._tcp.<nazwa_domeny>
    +$ kinit administrator@<NAZWA_DOMENY_Z_WIELKICH>
    +$ klist
    +
    +
  26. +
+

+

+ Tymi poleceniami zakończymy część pierwszą, druga znajduje się pod tym linkiem: Samba AD DC - NTP +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/linux/samba_AD_DC_-_NTP.html b/articles/linux/samba_AD_DC_-_NTP.html new file mode 100644 index 0000000..3a8386a --- /dev/null +++ b/articles/linux/samba_AD_DC_-_NTP.html @@ -0,0 +1,102 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Samba AD DC - NTP

+

+ Ten materiał jest to drugą częścią instalacji Samba AD DC, pierwsza część znajduje się pod tym linkiem: Samba AD DC - Instalacja. Tutaj zajmiemy się instalacją usługi NTP, która niestety jest wymagana w przypadku implementacji Samby. Nie przedłużając naszą pracę rozpoczniemy instalacji niezbędnego oprogramowania. +

+
+$ sudo apt install ntp ntpdate
+
+

+ Po zainstalowaniu wyżej wymienionych pakietów, przejdziemy do konfiguracji NTP. Otwieramy plik /etc/ntp.conf. Pierwszą czynnością będzie wyłączenie istniejących źródeł serwerów czasu po przez komentarz i dodanie poniższych. +

+
+pool 0.pool.ntp.org iburst
+pool 1.pool.ntp.org iburst
+pool 2.pool.ntp.org iburst
+
+

+ Pod zródłami znajdują się jeszcze jedno źródło, serwery zapasowe. Obecene serwery zapasowe wyłączamy, wstawiając na początku znak komentarza, następnie dopisujemy poniższe źródło. +

+
+pool 3.pool.ntp.org iburst
+
+

+ W pliku konfiguracjnym odszukujemy deklaracje driftfile. Pod tą deklaracją wpisujemy poniższe opcję wskazującą na socket łączący NTP wraz z Sambą. +

+
+ntpsigndsocket /var/lib/samba/ntp_signd/
+
+

+ Dopisujemy do opcji restrict wartości zabezpieczające nasz serwer NTP. +

+
+restrict default kod nomodify nopeer notrap mssntp
+
+

+ Zapisujemy zmiany w pliku konfiguracyjnym. Następnie ustawiamy odpowiednie uprawnienia dla folderu z gniazdem, który zdeklarowaliśmy w powyższym pliku. +

+
+$ sudo chown root:ntp /var/lib/samba/ntp_signd/
+$ sudo chmod 750 /var/lib/samba/ntp_signd/
+
+

+ Po ustawieniu uprawnień, restartujemy serwer. +

+
+$ sudo reboot
+
+

+ Gdy serwer się uruchomi możemy sprawdzić czy NTP działa. Na początku sprawdzimy jakie porty są otwarte w systemie. +

+
+$ sudo ss -tulpn | grep ntp
+
+

+ Odfiltrowałem wynik polecenia aby łatwiej by znaleźć interesujące nas informacje. Powinnismy znaleźć jakąś usługę która nasłuchuje na porcie UDP 123. Następnie możemy uruchomić poniższe polecenie aby wyświetlić podsumowanie połączenia ze z serwerami źródłowymi. +

+
+$ sudo ntpq -p
+
+

+ Odnośnie serwera NTP. Może być tak że serwer może się zawiesić i przestać odpowiadać na zapytania o aktualizacje czasu. Jedyne co możemy zrobić w tej sytuacji to zatrzymać usługę, z synchronizować datę i czas serwera z jakiś z oficjalnych zasobów i uruchomić usługę ponownie. +

+
+$ sudo systemctl stop ntp.service
+$ sudo ntpdate -b 2.pool.ntp.org
+$ sudo systemctl start ntp.service
+$ sudo systemctl status ntp.service.
+
+

+ Ostatnie polecenie nie jest wymagane, jednak warto upewnić się czy wszystko działa. +

+

+ Po uruchomieniu NTP, możemy podłacząć komputery klienckie do naszej domeny. Pamiętajmy jednak żeby na początku w systemie ustawić serwer czasu na kontroler. Teraz możemy ustawić serwery DNS na nasz kontroler i podłączyć chociażby Windowsa. Windowsą sie łatwo podłacza, a warto ponieważ będziemy mogili zainstalować przystawkę dzięki której będziemy kontrolować naszą domenę z poziomu okienka. To koniec części drugiej, nie jest ona tak długa jak część pierwsza i mogła by zostać po prostu włączona do samej instalacji, jednak zostało to podzieleno ponieważ NTP stanowi odrębną usługę i może być wykorzystanie przy innych konfiguracjach serwerów, pomijając oczywiście część związną z socketem. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/linux/szyfrowany_rootfs_na_greenOS.html b/articles/linux/szyfrowany_rootfs_na_greenOS.html new file mode 100755 index 0000000..9882cc2 --- /dev/null +++ b/articles/linux/szyfrowany_rootfs_na_greenOS.html @@ -0,0 +1,336 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Szyfrowany rootfs na greenOS

+

+ Jeśli naszym głównym komputerem, z którego korzystamy na codzień jest + laptop, to zapewne dla własnej wygody mamy na nim wiele cennych danych, + których być może zniszczenie niebyło by aż tak bolesne jak dostanie się + tych informacji w niepowłone ręce. Temu właśnie ma służyć szyfrowanie + dysków. W tym przypadku będziemy szyfrować partycję zawierającą + główny system plików z wyłączeniem katalogu /boot. Z racji tego + iż greenOS nie korzysta z klasycznego debianowskiego programu + debian-installer i instaluje się go ręcznie tak samo jak + Arch Linux. To instalacje z szyfrowaniem partycji z głównego + katalogu również musimy wykonać z ręki. Instalacje rozpoczynamy od + uruchomienia komputera z LiveCD. Możebyć to dowolny Debian lub greenOS. +

+
    +
  1. Aktualizacja list pakietów dystrybucji. +
    +# apt update
    +
    +
  2. +
  3. Instalacja pakietu cryptsetup w środowisku LiveCD +
    +# apt install cryptsetup
    +
    +
  4. +
  5. +

    + Partycjonowanie dysku. Tutaj jest to raczej sprawa indywidualna, ale + najbardziej klasyczny schemat partycjonowania została przestawiowy + w tabelce poniżej. Do partycjonowania dysku może służyć wbudowane + polecenie fdisk: +

    +
    +# fdisk /dev/sda
    +
    + + + + + + + + + + + + + + + + + + + + + +
    UrządzenieRozmiarPunkt montowania
    /dev/sda1300M/boot
    /dev/sda2-1G/
    /dev/sda51Gswap
    +
  6. +
  7. +

    + Tworzymy system plików dla partycji przeznaczonej na katalog + /boot. +

    +
    +# mkfs.ext4 /dev/sda1
    +
    +
  8. +
  9. +

    + Tworzymy szyfrowany wolumin na partycji przeznaczonej na główny + system plików. Program poprosi o potwierdzenie + działania poprzez wpisane DUŻYMI literami słowa: YES. + Następnie poprosi o podanie klucza (hasła) do odszyfrowania woluminu. +

    +
    +# cryptsetup -y -v luksFormat /dev/sda2
    +
    +
  10. +
  11. +

    + Otwieramy szyfrowany wolumin. Program zapyta o klucz. +

    +
    +# cryptsetup open /dev/sda2 cryptroot
    +
    +

    + Ostatni argument jest nazwą, pod którą będzie odwoływać się do + odszyfrowanego woluminu. Mapowanie (nazwa) znajduje się w katalogu + /dev/mapper. +

    +
  12. +
  13. +

    + Tworzymy system plików na odszyfrowanym woluminie. +

    +
    +# mkfs.ext4 /dev/mapper/cryptroot
    +
    +
  14. +
  15. +

    + Montujemy system plików woluminu w katalogu /mnt. +

    +
    +# mount /dev/mapper/cryptroot /mnt
    +
    +
  16. +
  17. +

    + Tworzymy katalog /mnt/boot, dla oddzielnej partycji + /boot. +

    +
    +# mkdir /mnt/boot
    +
    +
  18. +
  19. +

    + Montujemy partycje przeznaczoną na katalog /boot we + wcześniej utworzonym katalogu. +

    +
    +# mount /dev/sda1 /mnt/boot
    +
    +
  20. +
  21. +

    + Przechodzimy do katalogu /mnt i pobieramy paczkę z plikami + bazowymi dystrybucji. +

    +
    +# cd /mnt
    +# wget http://ftp.morketsmerke.net/greenOS/rootfs.tgz
    +
    +
  22. +
  23. +

    + Rozpakowujemy pliki bazowe. +

    +
    +# tar -xzvf rootfs.tgz 
    +
    +
  24. +
  25. +

    + Tworzymy system plików dla partycji ze swap-em. +

    +
    +# cd
    +# mkswap /dev/sda5
    +
    +
  26. +
  27. +

    + Przekierowujemy wyjście polecenia blkid do pliku + /mnt/etc/fstab. Musimy wyedytować zawartość tego pliku, aby + wyglądał mniej więcej tak: +

    +
    +# blkid > /mnt/etc/fstab
    +# vim /mnt/etc/fstab
    +
    +UUID="..."  /boot ext4  defaults  0 2
    +UUID="..."  none  swap  sw  0 0
    +/dev/mapper/cryptroot / ext4  defaults  0 1
    +
    +
  28. +
  29. +

    + Montujemy katalogi systemowe do podkatalogów w /mnt aby + widoczne były urządzenia komputera w środowisku chroot. +

    +
    +for i in /dev /dev/pts /proc /run /sys; do mount -B $i /mnt$i; done
    +
    +
  30. +
  31. +

    + Zmieniamy katalog główny na /mnt. +

    +
    +# chroot /mnt
    +
    +
  32. +
  33. +

    + Wykonujemy kilka czynności instalacyjnych, takich jak ustawienie + hasła dla użytkownika root, utworzenie nowego użytkownika + oraz nadanie mu uprawnień administratora. +

    +
    +# passwd
    +# adduser user
    +# vim /etc/sudoers
    +
    +user  ALL=(ALL) NOPASSWD:ALL
    +
    +
  34. +
  35. +

    + W środowisku zmienionego katalogu podstawowego, odświerzamy listy + pakietów dystrybucji oraz instalujemy pakiet cryptsetup. + Podczas instalacji pakietu możemy zignorować błędy związane z + mkinitramfs oraz cryptroot. Polecenie oświerzenia list może się + zawieść, w tym przypadku należy przerwać to polecenie i pobrać + konfigurację sieci z serwera dhcp. +

    +
    +# dhclient
    +# apt update
    +# apt install cryptsetup
    +
    +
  36. +
  37. +

    + Utworzenie wpisu w pliku /etc/crypttab. Plik zawiera + wystąpienia szyfrowanych woluminów w systemie. Definiuje odzorowania + nazw w katalogu /dev/mapper, plik klucza oraz opcje + cryptsetup. Wpis użyty tym przykładzie + będzie opierać, się na totalnym minimum konfiguracji. Jest on + niezbędny do + wygenerowania odpowiednich procedur w initramfs. W skrócie + jest potrzebny aby w ogóle dało się odszyfrować wolumin. Pierwsze + polecenie służy zapisaniu UUID urządzania blokowego z szyfrowanym + woluminem w pliku (oczywiście w tylko i wyłacznie w tym przykładzie). +

    +
    +# blkid | grep "LUKS" | awk '{printf $2}' >> /etc/crypttab
    +# vim /etc/crypttab
    +
    +cryptroot UUID="..."  none  luks
    +
    +

    + Gdzie: cryptroot jest to nazwa + odwzrowania, UUID wskazuje na + urządzenie blokowe przechowywujące zaszyfrowany wolumin, + none jest to wskazanie pliku klucz + w przypadku tej opcji, zostaniemy poproszeni o wprowadzenie klucza + podczas uruchamiania systemu, ostatnia opcja + luks spowoduje wymuszenie użycia + trybu LUKS, który jest standardem wśród + szyfrowanych woluminów na dystrybucjach Linux-a. Ten standard został + użyty także przez nas. +

    +
  38. +
  39. +

    + Wygenerowanie nowego dysku początkowego. Zwróćmy uwagę na to, iż + po zapisaniu wpisu w pliku /etc/crypttab nie pojawiają + pojawiają się żadne błędy podczas jego generowania. Tak jak miało + to miejsce podczas instalacji cryptsetup przy zmienionym + katalogu głównym. +

    +
    +# mkinitramfs -o /boot/initrd.img-4.19.0-18-amd64
    +
    +
  40. +
  41. +

    + Instalacja rekordu rozruchowego na dysku +

    +
    +# grub-install /dev/sda
    +
    +
  42. +
  43. +

    + Wygenerowanie pliku konfiguracyjnego dla programu rozruchowego. +

    +
    +# update-grub
    +
    +
  44. +
  45. +

    + Opuszczenie środowiska zmienionego katalogu głównego. +

    +
    +# exit
    +
    +
  46. +
  47. +

    + Odmontowanie wszystkich wcześniej montowanych systemów plików. +

    +
    +# umount -R /mnt
    +
    +
  48. +
  49. +

    + Zamknięcie szyfrowanego woluminu. +

    +
    +# cryptsetup close cryptroot
    +
    +
  50. +
  51. +

    + Zakończenie instalacji, restart systemu. +

    +
    +# reboot
    +
    +
  52. +
+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/linux/szyfrowany_rootfs_na_greenOSTe.html b/articles/linux/szyfrowany_rootfs_na_greenOSTe.html new file mode 100755 index 0000000..bfb0f01 --- /dev/null +++ b/articles/linux/szyfrowany_rootfs_na_greenOSTe.html @@ -0,0 +1,106 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Szyfrowany rootfs na greenOSTe

+

+ Chcąc przetestować greenOSTe na starym laptopie z Core2Duo + stwierdziłem, że jeśli ma być to hackerska instalacja to dysk powinien + być + szyfrowany. Z racji tego, że Trisquel jest oparty na Ubuntu, a Ubuntu na + Debianie, to może zadziała sposób wykorzystywany przy greenOS. + Niestety, nie. Podczas bootowania + właściwego systemu nie zostaliśmy zapytani o hasło, a system zatrzymywał + się przy próbie montowania głownego systemu plików, którego nie było bo + dysk + nie został odszyfrowany. Program typu init przerwał ładowanie systemu + zrzucając tym samym powłokę BusyBox obrazu initramfs. +

+

+ Problem leżał w tym, że do archiwum initramfs, nie został + skopiowany program cryptsetup mimo iż instalator pakietu + aktualizował to archiwum. Niezbędne jest również dopisanie + dwóch dodatkowych opcji w pliku /etc/crypttab. Najpierw musimy + wymusić załadowanie programu cryptsetup do archiwum. W pliku + /usr/share/initramfs-tools/conf-hooks.d/forcecryptsetup + zapisujemy poniższą linię: +

+
+export CRYPTSETUP=y
+
+

+ Teraz należy zaktualizować archiwum z initramfs, przy czym + zapiszemy zwracane przez polecenie informacje do pliku, dzięki czemu + będzie mogli się upewnić że program cryptsetup został + rzeczywiście dodany do archiwum. +

+
+# update-initramfs -c -k all -v > ~/upd-initramfs.log
+# cat ~/upd-initramfs.log | grep "crypt"
+
+

+ Na wyściu drugiego polecenia należy szukać ścieżki + /sbin/cryptsetup, powinna być oznaczona komunikatem + Adding binary. Teraz możemy przejść do utworzenia + odpowiedniego wpisu w pliku /etc/crypttab. Podobnie jak w + materiale dotyczącym greenOS, jednak obecny wpis różni się od + poprzedniego materiału o podobnej tematyce. Ma dwie dodatkowe opcje + oraz UUID nie może znajdować się między cudzysłowami. UUID najlepiej + pobrać za pomocą powyższego polecenia: +

+
+# blkid | grep "LUKS" | awk '{printf $2}' >> /etc/crypttab
+
+

+ Z kolei wpis w pliku /etc/crypttab wygląda w następujący sposób +

+
+cryptroot UUID=...  none  nofail,luks,initramfs
+
+

+ Po zapisaniu zmian, należy ponownie zaktualizować initramfs oraz + upewnić się cryptsetup nadal tam jest. +

+
+# update-initramfs -c -k all -v > ~/upd-initramfs.log
+
+

+ Po wykonaniu tych czynności możemy powrócić do pozostałych standardowych + czynności instalacyjnych. Uwaga! po każdym + aktualizowaniu initramfs, należy jeszcze raz go zaktualizować + tak jak robiliśmy to w tym materiale, ponieważ może okazać się, że + cryptsetup zostało usunięte z archiwum, co spowoduje + unieruchomienie systemu po restarcie. +

+

+ Źródło: +

+
    +
  1. Github Gist: gvtulder/encrypting-without-reinstalling-ubuntu.txt
  2. +
+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/linux/tworzenie_RAID_programowych_w_systemach_GNU_Linux.html b/articles/linux/tworzenie_RAID_programowych_w_systemach_GNU_Linux.html new file mode 100644 index 0000000..21014a4 --- /dev/null +++ b/articles/linux/tworzenie_RAID_programowych_w_systemach_GNU_Linux.html @@ -0,0 +1,85 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Tworzenie RAID programowych w systemach GNU/Linux

+

+ RAID programowe są innym sposóbem na zarządzanie dyskami na systemach GNU/Linux. Dzięki temu rozwiązaniu nie musimy już kupować drogich dedykowanych kontrolerów do naszego budżetowego serwera. Oprogramowanie odpowiedzialne za konfigurowanie RAID wspiera wszystkie powszechnie używane poziomy 0,1,5,6,0+1,1+0. +

+

+ Każdy dysk musi mieć partycję typu Linux raid autodetect, więc za pomocą polecenia fdisk, utworzymy je, poniżej znajduje się kolejność wciskanych klawiszy podczas pracy z programem. +

+
+$ sudo fdisk /dev/sdb
+> o
+> n
+> p
+> [ENTER]
+> [ENTER]
+> [ENTER]
+> t
+> fd
+> w
+> quit
+
+

+ Powtarzamy to na wszystkich dyskach budujących tablicę. Kiedy skończymy przechodzimy do tworzenia tablicy RAID wykorzystujemy polecenie mdadm. Dla swoich dysków wybrałem RAID 1. +

+
+$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
+
+

+

    +
  • --create - nazwa urządzenia RAID identyfikująca je w systemie,
  • +
  • --level=1 - poziom RAID wykorzystany w tablicy,
  • +
  • --raid-devices - liczba dysków użyta do stworzenia RAID
  • +
  • /dev/sdb1 /deb/sdc1 - partycje uzyte w RAID.
  • +
+ Po wykonaniu tego polecenia w systemie zostanie utworzone pusty dysk pod nazwa, którą podaliśmy w wartości opcji --create. Aby korzystać z RAID musimy utworzyć na nim partycję i ją sformatować. +

+
+$ sudo fdisk /dev/md0
+> o
+> n
+> p
+> [ENTER]
+> [ENTER]
+> [ENTER]
+> w
+> quit
+$ sudo mkfs.ext4 /dev/md0p1
+
+

+ Do utworzenia partycji, użyłem programu fdisk z tą samą sekwencją poleceń jakiej używam do tworzenia partycji na klasycznych dyskach. Za pomocą tego samego polecenia z przełącznikem -l, możemy sprawdzić numer naszej partycji, którą przygotowujemy do działania ostatnim poleceniem z powyższego przykładu. Teraz możemy nasze urządzenie RAID pod montować w systemie. +

+
+$ sudo mount /dev/md0p1 /mnt
+
+

+ Użycie programowych tablic RAID to dobre rozwiązanie kiedy potrzebujemy na zwykłej stacji roboczej RAID 1, a nie posiada ona żadnych fizycznych mechanizmów tworzenia takich tablic, a kontroler może być poza naszym zasięgiem z różnych przyczyn. +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/linux/tworzenie_logicznych_wolumin\303\263w_LVM.html" "b/articles/linux/tworzenie_logicznych_wolumin\303\263w_LVM.html" new file mode 100644 index 0000000..217c7c3 --- /dev/null +++ "b/articles/linux/tworzenie_logicznych_wolumin\303\263w_LVM.html" @@ -0,0 +1,86 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Tworzenie woluminów logicznych - LVM

+

+ Czasami może zajść taka przeba że trzeba wykorzystać dwa fizyczne dyski, jednak nie w taki prosty sposób jakby się mogło wydawać. Na dyskach będzie przechowywane bardzo dużo danych i te dane muszą być w jednym katalogu ale nie zmieszczą się na jednym dysku. Opcje są dwie, oddać te zakupione dyski do sklepu i kupić większe o ile dyski są nowe lub podłączyć je do serwera i konfigurować na nich wolumin logiczny. +

+

+ Tworzenie woluminu rozpoczniemy i klasycznego zainicjowania dysków utworzymy partycję na całej długości dysku. Do zaalokowania miejsca wykorzystamy narzędzie fdisk. Przedstawię poniżej kolejno wciskane klawisze podczas obsługi programu. +

+
+$ sudo fdisk /dev/sdb
+> o
+> n
+> p
+> [ENTER]
+> [ENTER]
+> [ENTER]
+> w
+> quit
+
+

+ Dla drugiego dysku wykonujemy identyczne czynności. Po zainicjowaniu dysków możemy przejść do programu lvm i rozpocząć inicjowanie woluminu logicznego. +

+
+$ sudo lvm
+lvm> pvcreate /dev/sdb1
+lvm> pvcreate /dev/sdc1
+
+

+ Po wydaniu tych poleceń, partycje na dyskach są gotowe do stworzenia grupy woluminów. Grupę tworzymy następującym poleceniem programu. +

+
+lvm> vgcreate vg0 /dev/sdb1 /dev/sdc1
+
+

+ Teraz dyski są połączone logicznie. Utworzymy na nich nasz wolumin logiczny. +

+
+lvm> lvcreate -L 931G vg0
+lvm> exit
+
+

+ Utworzyłem dysk logiczny składający się z dwóch dysków fizycznych, użyłem dwóch dysków o wielkości 500GB nominalnie co dało w rzeczywistości 465,5G miejsca na partycji. Dysk logiczny ma 931G rozmiaru rzeczywistego co nominalnie daje 1TB. Podczas działania lvm wszystkie polecenia są wykonywane na bierząco, więc po utworzeniu dysku możemy wpisać poprostu exit. +

+

+ Po zamknięciu programu, kiedy wyświetlimy listę wszystkich dysków w systemie za pomoca polecenia fdisk -l nasz dysk logiczny będzie widoczny jako pusty dysk bez partycji o ścieżce wystąpienia takiej jak /dev/mapper/vg0-lvol0. Na tym dysku nie tworzymy partycji, od razu przechodzimy do formatowania. +

+
+$ sudo mkfs.ext4 /dev/mapper/vg0-lvol0
+
+

+ Teraz możemy montować nasz wolumin i rozpocząć z nim pracę. +

+
+$ sudo mount /dev/mapper/vg0-lvol0 /mnt
+
+

+ Woluminy logiczne są świetnym rozwiązaniem dla tych którzy mają mniejsze dyski fizyczne a potrzebują więcej miejsca niż te urządzenia mogą zaoferować. +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/linux/uruchomienie_skryptu_podczas_\305\202adowania_systemu_-_jednostka_systemd.html" "b/articles/linux/uruchomienie_skryptu_podczas_\305\202adowania_systemu_-_jednostka_systemd.html" new file mode 100644 index 0000000..2aa2e9a --- /dev/null +++ "b/articles/linux/uruchomienie_skryptu_podczas_\305\202adowania_systemu_-_jednostka_systemd.html" @@ -0,0 +1,140 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Uruchominie skryptu podczas ładowania systemu - jednostka systemd

+

+ Wykonanie skryptu w trakcie uruchamiania systemu, do bardzo stary + problem wielu administratorów oraz entuzjastów systemu Linuks. Wraz ze + zmianianą mainstreamowego programu typu init problem + ten stał się wręcz trywialny, bo można użyć jednostki systemd, + jednak nie którzy nie więdzą jak się do tego zabrać. +

+

+ Każda jednostka systemd to plik tekstowy składający się z + minimum dwóch sekcji. Pierwszą z nich jest sekcja Unit opisująca + jednostkę. W wewnątrz niej mogą znajdować się takie informacje jak opis, + kiedy ma zostać uruchomiona oraz jej ewentualne zależności. Druga + sekcja jest już zależna od jednostki. Wśród jedenastu typów jednostek + najbardziej odpowiednim jest jednostka usługi, ponieważ + odpowiada ona poniękąd za uruchomienie programu, a tym w mniejszym lub + większym stopniu jest nasz skrypt. W sekcji jednostki znajdują się + dyrektywy są specyficzne dla tego typu jednostki. Opcjonalnie w pliku + jednostki może znaleźć się sekcja Install, w której deklaruje + się zależności wsteczne (inna jednostka może wymagać lub chcieć aktywacji + tej jednostki podczas swojej aktywacji). Zależności wsteczne pozwalają + na włączenie lub wyłączenie aktywacji jednostki w systemie. +

+

+ Po scharakteryzowaniu pliku jednostki możemy przejść ustalania + potrzebnych + dyrektyw budując pliki jednostki. W sekcji Unit na pewno + powinna znaleźć się dyrektywa Description, w której zawierany + jest krótki opis jednostki. Jest on wyświetlany podczas uruchamiania + jednostki w trakcie uruchamiania systemu. Za pewne chcielibyśmy aby + skrypt był uruchamiany w takim samym środowisku jak byś uruchamiali go + z poziomu wiersza polecenia, zatem należy opóźnić aktywacje jak tylko się + da. Do tego posłuży nam dyrektywa After, która wskazuje + systemd aby aktywował jednostkę po aktywacji + jednostki zapisanej w tej dyrektywie. Najpóźniej aktywowaną jednostką + w dystrybucjach Linuksa opartych o systemd jest + default.target, po aktywacji której zazwyczaj uznaje się, że + system jest już gotowy do pracy. Ta jednostka jest dowiązaniem + symbolicznym do innej właściwej dla konfiguracji systemu jednostki. + Następnie już w sekcji Service, za pomocą + dyrektywy ExecStart wskazujemy ścieżkę do pliku skryptu, w tym + przypadku jest to jedyna dyrektywa w tej sekcji. Abyśmy mogli włączać i + wyłączać jednostkę powinniśmy dodać także sekcje Install a + wewntąrz niej zależność zwrotną typu WantedBy wskazującą również + na default.target. Spowoduje to automatyczne uruchomienie + tej jednostki w momencie uruchomienia celu default.target, z + opóźnieniem wynikającym z dyrektywy After. Zależność typu + WantedBy, nie spowoduje problemów z jednostką + default.target gdy uruchomienie jednostki ze skryptem + nie powiedzie się. Zawartość pliku jednostki powinna wyglądać mniej + więcej jak na poniższym przykładzie. +

+
+xf0r3m@wyse3040:~$ cat /etc/systemd/system/ssh_tunnel.service 
+[Unit]
+Description=SSH Tunnel for remote access
+After=default.target
+[Service]
+ExecStart=/home/xf0r3m/tunnel.sh
+[Install]
+WantedBy=default.target
+
+

+ W moim przypadku jest to skrypt który uruchamia tunel SSH z + przekazywaniem + portów oraz zajmuję się jego utrzymaniem. Zwróćmy uwagę na lokalizacje + pliku jednostki. Jest ona jak najbardziej odpowiednia. Po utworzeniu + pliku możemy, przystąpić do włączenia jednostki w celu + default.target. +

+
+xf0r3m@wyse3040:~$ sudo systemctl enable ssh_tunnel.service
+
+

+ Po jej włączeniu możemy ją aktywować. +

+
+xf0r3m@wyse3040:~$ sudo systemctl start ssh_tunnel.service
+
+

+ Za pomocą podpolecenia status polecenia systemctl + możemy sprawdzić stan uruchomionej jednostki. +

+
+      xf0r3m@wyse3040:~$ sudo systemctl status ssh_tunnel.service 
+● ssh_tunnel.service - SSH Tunnel for remote access
+     Loaded: loaded (/etc/systemd/system/ssh_tunnel.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sun 2022-07-24 10:12:42 CEST; 2s ago
+   Main PID: 1246 (tunnel.sh)
+      Tasks: 2 (limit: 2235)
+     Memory: 1.2M
+        CPU: 164ms
+     CGroup: /system.slice/ssh_tunnel.service
+             ├─1246 /bin/bash /home/xf0r3m/tunnel.sh
+             └─1247 ssh -p 2022 -i /home/xf0r3m/.ssh/id_rsa -o StrictHostKeyChecking=no xf0r3m@... -R ...:127.0.0.1:22 while [ true ...
+
+lip 24 10:12:42 wyse3040 systemd[1]: Started SSH Tunnel for remote access.
+
+

+ Oczywiście statusy nie wszystkich jednostek, które uruchamiają skrypty + będą wyglądać tak samo, nie które z nich mogą się dezaktywować się po + zakończeniu działania skryptu. Moj skrypt działa ponieważ jego trzonem + jest nieskończona pętla, która sprawia, że jeśli dojdzie do zerwania + tunelu, zostanie on za 30 sekund zestawiony ponownie. +

+

+ Źródła: +

+
    +
  1. How to Run Script on Boot Up in Debian 11
  2. +
+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/linux/w\305\202asne_LiveCD_z_Debianem.html" "b/articles/linux/w\305\202asne_LiveCD_z_Debianem.html" new file mode 100644 index 0000000..55c3dd0 --- /dev/null +++ "b/articles/linux/w\305\202asne_LiveCD_z_Debianem.html" @@ -0,0 +1,349 @@ + + + + + + + + +
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+
+ +
+

Własne LiveCD z GNU/Linux Debian

+

+ Czasami może zadarzyć się taka sytuacja, że będziemy korzystać z wielu + różnych maszyn co jakiś czas. Jak pewnie zdajemy sobie sprawę z tego + ile czasu trzeba poświęcić na zainstalowanie systemu i przygotowanie go + do pracy, to w tym przypadku najlepiej jest przygotować LiveCD z + niezbędnymi programami oraz lekkim środowiskiem graficznym, aby + można było korzystać z niego nawet na starym sprzęcie. Jeśli chodzi o + dane, to najlepiej użyć SSHFS. +

+

+ Wszystkie polecenia tutaj są wykonywane z poziomu użytkownika + root oraz w jego katalogu domowym, bezpośrednio z + terminala docelowego komputera. Jeśli mamy zamiar tworzyć obraz z + na serwerze to należy pamiętać aby robić to bezpośredio przez SSH + i nie używać programów typu tmux oraz GNU Screen, + ponieważ mogą wystąpić problemy podczas pobierania obrazu dystrybucji + z repozytorium. +

+

+ Tworzenie LiveCD rozpoczniemy od zainstalowania odpowiedniego + oprogramowania. +

+
+# apt install debootstrap squashfs-tools xorriso isolinux syslinux-efi grub-pc-bin grub-efi-amd64-bin grub-efi-ia32-bin mtools
+
+

+ Po zainstalowaniu oprogramowania tworzymy katalog dla zachowania + porządku. +

+
+# mkdir debianCustomLiveCD
+
+

+ Teraz możemy pobrać obraz dystrybucji, dla zredukowania wielkości + należy wybrać wariant minbase. +

+
+# /sbin/debootstrap --arch=amd64 --variant=minbase bullseye /root/debianCustomLiveCD/chroot http://ftp.icm.edu.pl/debian
+
+

+ Następnie dokonujemy zmian na obrazie, nie które zmiany są niezbędny do + prawidłowego funkcjonowania systemu, inne są opcjonalne. Aby dokonać + zmian należy zmienić katalog główny na katalog obrazu. +

+
+# chroot /root/debianCustomLiveCD/chroot /bin/bash
+
+

+ W tym momencie wszystkie czynności będą wykonywane wewnątrz obrazu nie + na prawdziwym systemie, dlatego też warto zaznaczyć sobie, że pracujemy + na zmienionym katalogu głównym. +

+
+# export PS1="(chroot) ${PS1}"
+
+

+ Odświerzamy listy pakietów na obrazie. +

+
+(chroot) # apt update
+
+

+ Instalujemy jądro, proces systemd oraz pakiet live-boot +

+
+(chroot) # apt install -y --no-install-recommends linux-image-amd64 live-boot systemd-sysv
+
+

+ Instalujemy wszystkie potrzebne nam programy. W tym podpunkcie zapisze + tylko te, które raczej powinny znaleźć się na obrazie aby można było + normalnie z niego korzystać. +

+
+(chroot) # apt install -y network-manager net-tools wireless-tools wpagui wget openssh-client blackbox xserver-xorg-core xserver-xorg xinit xterm vim
+
+

+ Po instalacji oprogramowania usuwamy pobrane pakiety, przez co obraz + będzie lżejszy. +

+
+# apt-get clean
+
+

+ Jak widać na powyższym przykładzie instalowany będzie menedżer okien + BlackBox, jednak nic nie stoi na przeszkodzie by zainstalować + dowolny inny. Po instalacji pakietów pozostanie jeszcze zmiana + hasła dla użytkownika root, aby można było się na jakiegoś + użytkownika zalogować. +

+
+(chroot) # passwd
+
+

+ Pozostałe konfiguracje są opcjonalne. Mają za zadanie + jedynie + ustawienie polskiej lokalizacji. Nie będę opisywać każdej konfiguracji + krok po kroku, potrzebne opcję są dobrze opisane i łatwo jest się w + nich połapać. +

+
+(chroot) # dpkg-reconfigure tzdata
+(chroot) # apt install locales
+(chroot) # dpkg-reconfigure locales
+(chroot) # apt install keyboard-configration console-setup 
+
+

+ Opuszczamy obraz. +

+
+(chroot) # exit
+
+

+ Tworzymy strukturę katalogową, która będzie potrzebna do utworzenia + obrazu. W zależności od tego dla jakiego systemu EFI (64 czy 32-bitowe) + będziemy tworzyć obraz wydajemy odpowiednie polecenie: +

+

+ 64-bit EFI +

+
+# mkdir -p /root/customDebianLiveCD/{staging/{EFI/boot,boot/grub/x86_64-efi,isolinux,live},tmp}
+
+

+ 32-bit EFI +

+
+# mkdir -p /root/customDebianLiveCD/{staging/{EFI/boot,boot/grub/i386-efi,isolinux,live},tmp}
+
+

+ Na obrazach LiveCD, główny system plików znajduje się w pliku + squashfs + i taki teraz utworzymy. Tworzenie pliku trochę trwa w zależności od + mocy obliczniowej maszyny. +

+
+# mksquashfs /root/customDebianLiveCD/chroot /root/customDebianLiveCD/staging/live/filesystem.squashfs -e boot
+
+

+ Do uruchomienia systemu potrzebne będzie jądro oraz plik ramdysku. + Możemy je przekopiować z pobranego wcześniej obrazu dystrybucji. +

+
+# cp /root/customDebianLiveCD/chroot/boot/vmlinuz-* /root/customDebianLiveCD/staging/live/vmlinuz
+# cp /root/customDebianLiveCD/chroot/boot/initrd.img-* /root/customDebianLiveCD/staging/live/initrd
+
+

+ System do bootowania w trybie BIOS, bedzie wykorzystywać program + isolinux, teraz stworzymy dla niego plik konfiguracyjny + isolinux.cfg. + Plik zapisujemy w katalogu + /root/customDebianLiveCD/staging/isolinux. +

+
+UI vesamenu.c32
+
+MENU TITLE Boot Menu
+DEFAULT linux
+TIMEOUT 600
+MENU RESOLUTION 640 480
+MENU COLOR border       30;44   #40ffffff #a0000000 std
+MENU COLOR title        1;36;44 #9033ccff #a0000000 std
+MENU COLOR sel          7;37;40 #e0ffffff #20ffffff all
+MENU COLOR unsel        37;44   #50ffffff #a0000000 std
+MENU COLOR help         37;40   #c0ffffff #a0000000 std
+MENU COLOR timeout_msg  37;40   #80ffffff #00000000 std
+MENU COLOR timeout      1;37;40 #c0ffffff #00000000 std
+MENU COLOR msg07        37;40   #90ffffff #a0000000 std
+MENU COLOR tabmsg       31;40   #30ffffff #00000000 std
+
+LABEL linux
+  MENU LABEL Custom Debian Live [BIOS/ISOLINUX]
+  MENU DEFAULT
+  KERNEL /live/vmlinuz
+  APPEND initrd=/live/initrd boot=live
+
+LABEL linux
+  MENU LABEL Custom Debian Live [BIOS/ISOLINUX] (nomodeset)
+  MENU DEFAULT
+  KERNEL /live/vmlinuz
+  APPEND initrd=/live/initrd boot=live nomodeset
+
+

+ Program ładującym dla EFI jest GRUB, poniżej znajduje się jego plik + konfiguracyjny grub.cfg. Plik zapisujemy w katalogu + /root/customDebianLiveCD/staging/boot/grub. Aby GRUB + prawidłowo wyświetlał komunikaty jądra podczas ładowania systemu + potrzebny jest jeszcze jeden plik (font.pf2), który + umieszczamy w tym samym katalogu. Plik możemy wyodrębnić z płyty + LiveCD Debiana lub z archiwum dostępnego pod tym linkiem: + https://github.com/xf0r3m/greenOS/icewm-era/blob/main/greenOS_boot-cfg.tgz +

+
+if loadfont $prefix/font.pf2 ; then
+	set gfxmode=800x600
+	set gfxpayload=keep
+	insmod efi_gop
+	insmod efi_uga
+	insmod video_bochs
+	insmod video_cirrcus
+	insmod gfxterm
+	terminal_output gfxterm
+fi
+
+search --set=root --file /DEBIAN_CUSTOM
+
+set default="0"
+set timeout=30
+
+
+menuentry "Debian Live [EFI/GRUB]" {
+    linux ($root)/live/vmlinuz boot=live
+    initrd ($root)/live/initrd
+}
+
+menuentry "Debian Live [EFI/GRUB] (nomodeset)" {
+    linux ($root)/live/vmlinuz boot=live nomodeset
+    initrd ($root)/live/initrd
+}
+
+

+ Podczas instalacji GRUB-a, program instalujący będzie + potrzebował pliku, w którym zawarte są informacje o prefiksie + wykorzystywanym przez plik konfiguracji oraz o położeniu pliku + konfiguracyjnego. Plik grub-standalone.cfg zapisujemy w + katalogu /root/customDebianLiveCD/tmp. +

+
+search --set=root --file /DEBIAN_CUSTOM
+set prefix=($root)/boot/grub/
+configfile /boot/grub/grub.cfg
+
+

+ Następnym krokiem jest utworzenie pliku, po którym GRUB uzna ten dysk + jako główny (root) dla ładowania tego systemu. +

+
+# touch /root/customDebianLiveCD/staging/DEBIAN_CUSTOM
+
+

+ Po utworzeniu pliku, należy przekopiować resztę plików isolinux. +

+
+# cp /usr/lib/ISOLINUX/isolinux.bin /root/customDebianLiveCD/staging/isolinux
+# cp /usr/lib/syslinux/modules/bios/* /root/greenOS/staging/isolinux
+
+

+ Pozostałe pliku GRUB, również należy przekopiować do katalogów obrazu. +

+

64-bit EFI

+
+# cp -r /usr/lib/grub/x86_64-efi/* /root/customDebianLiveCD/staging/boot/grub/x86_64-efi
+
+

32-bit EFI

+
+# cp -r /usr/lib/grub/i386-efi/* /root/customDebianLiveCD/staging/boot/grub/i386-efi
+
+

+ Aby komputer wykorzystujący tryb UEFI mogł zbootować nasz obraz + potrzebny jest plik binarny programu ładującego, który teraz utworzymy +

+

64-bit EFI

+
+# grub-mkstandalone --format=x86_64-efi --output=/root/customDebianLiveCD/staging/EFI/boot/bootx64.efi --locales="" --fonts="" \ 
+"/boot/grub/boot.cfg=/root/customDebianLiveCD/tmp/grub-standalone.cfg"
+
+

32-bit EFI

+
+# grub-mkstandalone --format=i386-efi --output=/root/customDebianLiveCD/staging/EFI/boot/bootia32.efi --locales="" --fonts="" \
+"/boot/grub/boot.cfg=/root/customDebianLiveCD/tmp/grub-standalone.cfg"
+
+

+ Wszystkie bootowalne obrazy LiveCD obsługujące UEFI posiadają + dodatkową partycję, to właśnie wniej będzie znajdować się utworzony + wcześniej plik bootloadera, i to jej będzie poszukiwać oprogramowanie + układowe podczas uruchamiania komputera z obrazu. Utworzenie i + skopiowanie danych będzie wymagać kilku czynności. +

+

64-bit EFI

+
+# cd /root/customDebianLiveCD/staging/boot/grub/
+# dd if=/dev/zero of=efiboot.img bs=1M count=20
+# mkfs.vfat efiboot.img
+# mmd -i efiboot.img efi efi/boot
+# mcopy -vi efiboot.img /root/customDebianLiveCD/staging/EFI/boot/bootx64.efi ::efi/boot
+
+

32-bit EFI

+
+# cd /root/customDebianLiveCD/staging/boot/grub/
+# dd if=/dev/zero of=efiboot.img bs=1M count=20
+# mkfs.vfat efiboot.img
+# mmd -i efiboot.img efi efi/boot
+# mcopy -vi efiboot.img /root/customDebianLiveCD/staging/EFI/boot/bootia32.efi ::efi/boot
+
+

+ Kiedy mamy już utworzoną partycję. Przyszedł czas na wygenerowanie + właściwego obrazu płyty. W tym poleceniu będzie zawarte użycie + isolinux, użycie alternatywnego bootloadera dla trybu EFI, + dołączona zostanie również partycja EFI. +

+
+# xorriso -as mkisofs -iso-level 3 -o "custom_debian.iso" -full-iso9660-filenames -volid "CUSTOM_DEBIAN" \ 
+-isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -eltorito-boot isolinux/isolinux.bin -no-emul-boot \
+-boot-load-size 4 -boot-info-table --eltorito-catalog isolinux/isolinux.cat-eltorito-alt-boot -e /boot/grub/efiboot.img -no-emul-boot \ 
+-isohybrid-gpt-basdat -append_partition 2 0xef /root/customDebianLiveCD/staging/boot/grub/efiboot.img "/root/customDebianLiveCD/staging"
+
+

+ Tak wygenerowany obraz możemy śmiało załadować na pendrive-a lub + wypalić na płycie i uruchomić na dowolnym (64-bitowym) komputerze. + Mimo iż + przedstawiono tutaj wsparcie dla 32-bitowego EFI, to obraz jest będzie + 64-bitowy. 32-bitowy obraz należało by wykonać na 32-bitowym systemie + operacyjnym, podczas pobierania obrazu trzeba by wybrać architekturę + 32-bitową (i386), oraz podczas konfiguracji obrazu wybrać + odpowiedni pakiet jądra (linux-image-686). +

+

+ Źródło: + https://willhaley.com/blog/custom-debian-live-environment/
+

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/raspberrypi/Raspberry_Pi_Zero_jako_router_3G.html b/articles/raspberrypi/Raspberry_Pi_Zero_jako_router_3G.html new file mode 100644 index 0000000..15c63ad --- /dev/null +++ b/articles/raspberrypi/Raspberry_Pi_Zero_jako_router_3G.html @@ -0,0 +1,317 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + +
+

Raspberry Pi Zero jako router 3G

+

+ Pomysł na to zrodził się w mojej głowie, kiedy szykowałem się do swojej pierwszej zagranicznej wycieczki, pandemia wszystko pokrzyżowała a projekt został. Jednak bez obudowy oraz schematu połączeń jest on jedynie systemem naczyń połączonych. +

+
    +
  1. Przygotowanie sprzętu. +

    +

      +
    • Raspberry Pi Zero W,
    • +
    • Modem 3G (w moim przypadku użyłem Huawei E173s-2 [pełny model znajduje się pod klapką]),
    • +
    • Oficjalna klawiatura Raspberry Pi lub hub USB i zwykła klawiatura,
    • +
    • Karta sieciowa USB (JP1082 - niebieska, tania karta z allegro za 10 czy 20 zł),
    • +
    • Zasilacz,
    • +
    • Karta microSD z systemem (RasPiOS Lite),
    • +
    • Karta SIM z pakietem danych komórkowych, dedykowanego operatora dla modemu lub dowolnego jeśli modem nie posiada blokady simlock,
    • +
    • Adapter mini-HDMI,
    • +
    • Kabel OTG do podłączenia klawiatury lub huba,
    • +
    • Kabel do podłączenia RPI do Internetu.
    • +
    +

    +
  2. +
  3. Początkowa konfiguracja RPI oraz aktualizacja. +

    + Uruchamiamy Raspberry Pi, następnie zmieniamy layout klawiatury na polski za pomocą narzędzia raspi-config. Wydajemy następujące polecenie: +

    +
    +$ sudo raspi-config
    +
    +

    + Z menu głównego programu wybieramy, kolejno 4. Localisation Options -> Change Keyboard Layout, jeśli nie wyświetli nam się nic, skrypt poprostu wróci do menu, oznacza to że musimy przełączyć jeszcze locale, po ustawieniu ich na język polski, będziemy mogli zmienić layout klawiatury. Locale ustawia się z tej samej sekcji 4. Localisation Options -> Change Locale, poźniej z długiej listy odznaczamy en_GB zaznaczamy pl_PL w wersji UTF-8. + Po ustawieniu locale oraz layoutu klawiatury należy zrestartować malinę, co sam będzie sugerować sam program. Po ponownym uruchomieniu urządzenia, możemy teraz przejść do aktualizacji wydajemy dwa następujące polecenia: +

    +
    +$ sudo apt update
    +$ sudo apt upgrade
    +
    +

    + Po zaktualizowaniu systemu możemy przejść do obsługi modemu 3G. +

    +
  4. +
  5. Modem. +

    + Podpinamy modem do gniazda usb. Po wydaniu polecenia: +

    +
    +$ lsusb
    +
    +

    + (w moim przypadku) powinniśmy zobaczyć linię zawierającą napis Huawei ..., może on się nieco różnić. Przed przystąpieniem do konfiguracji należy upewnić się czy to urządzenie jest rzeczywiście rozpoznawany jako modem. Najprościej wydać polecenie: +

    +
    +$ ls /dev/ttyUSB*
    +
    +

    + Powinny pokazać nam się dwa urządzenia /dev/ttyUSB0 oraz /dev/ttyUSB1, to teraz możemy być pewni (tak na 99%) że modem jest prawidłowo rozpoznawany w systemie. Jeśli chcemy być pewni na 100%, możemy doinstalować program, który pozwoli nam się połączyć z modemem za pomocą linii szeregowej. Wydajemy poniższe polecenia: +

    +
    +$ sudo apt update
    +$ sudo apt install picocom
    +
    +

    + Po zainstalowaniu programu możemy się z nim połączyć wydając polecenie: +

    +
    +$ picocom /dev/ttyUSB0 -b 115200
    +
    +

    + W nie których przypadkach mogą być wymagane uprawnienia administratora. Jeśli nie pojawiły się żadne błędy, powinniśmy mieć możliwość porozmawiania z modemem, wystarczy że się przywitamy. Wpisujemy poniższy ciąg znaków: +

    +
    +AT
    +
    +

    + W odpowiedzi powinniśmy dostać OK. Teraz już możemy być w 100% pewni że modem jest dobrze wykrywany przez RPI. Połączenie możemy zakończyć klikając po sobie kombinację klawiszy ctrl+a oraz ctrl+x. + Jeśli karta SIM jest zablokowana kodem PIN, przy przepięciu modemu lub przy wyłączeniu Raspberry będzie musieli ją aktywować. Połączenia jak i odblokowywania karty będziemy dokonywać za pomocą programu vwdial, należy go zainstalować wraz z pakietem ppp. +

    +
    +$ sudo apt install wvdial ppp
    +
    +

    + Po zainstalowaniu pakietów przechodzimy do pliku /etc/vwdial.conf. Plik w domyślnie wygląda następująco: +

    +
    +  [Dialer Defaults]
    +  Init1 = ATZ
    +  Init2 = ATQ0 V1 E1 S0=0 &C1 &D2
    +  Modem Type = Analog Modem
    +  Baud = 9600
    +  New PPPD = yes
    +  Modem = /dev/ttyUSB0
    +  ISDN = 0
    +  ; Phone = <Target Phone Number>
    +  ; Password = <Your Password>
    +  ; Username = <Your Login Name>
    +
    +

    + Dla nas interesującą linią jest pierwsza linia. Ona tworzy sekcje konfiguracyjno-uruchomieniowe dla vwdial. Równie ciekawymi liniami są Init1 i Init2, zawierają bowiem one polecenia AT dla modemu. Aby odblokować modem (jeśli jest zablokowany kodem PIN) należy dodać nową sekcję pod nazwą np. pin. +

    +
    +[Dialer pin]
    +Init3 = AT+CPIN=0123
    +
    +

    + W miejsce 0123 podajemy swój kod PIN. Odblokowanie modemu następuje po wydaniu polecenia. +

    +
    +$ sudo vwdial pin
    +
    +

    + Następna sekcja w pliku konfiguracyjnym powinna być już sekcją połączenia. +

    +
    +  [Dialer play]
    +  Init3 = AT+CGDCONT=1,"IP","internet"
    +  Username = "internet"
    +  Password = "internet"
    +  Phone = "*99#"
    +  Dial Command = ATDTW
    +  New PPPD = yes
    +  Stupid Mode = yes
    +  Dial Attemps = 0
    +
    +

    + W linii Init3 ostatnią wartością jest APN. Do wypełnienia użytkownikowi pozostaje właśnie wspomniany APN, Username, Password, Phone oraz nazwa dialera, choć nie jest to obowiązkowe. Reszta pozostaje bez zmian. Teraz wystarczy tylko się podłączyć wydając polecenie: +

    +
    +wvdial play&
    +
    +

    + Warto pamiętać o tym aby uruchomić połączenie w tle. Możemy spotkać się z taką sytuacją że modem nie będzie chciał się połączyć z Internetem. W takiej sytuacji należy spróbować ze 2-3 razy, następnie zmienić urządzenie, w sekcji [Dialer Defaults] z Modem = /dev/ttyUSB0 na Modem = /dev/ttyUSB1. i wtedy spróbować się połączyć jeśli się to również nie powiedzie, to należy wrócić do poprzedniego urządzenia. W tym momemcie modem powinien się połączyć. +

    +
  6. +
  7. Usługa wvdial w systemd +

    + Aby wvdial uruchamiał się i łączył w raz ze startem systemu, należy utworzyć jednostkę systemd. Oczywiście można skorzystać z poniższego pliku. +

    +
    +[Unit]
    +BindsTo=dev-ttyUSB0.device
    +After=dev-ttyUSB0.device
    +Description=Wvdial Connection
    +Before=network.target
    +Wants=network.target
    +
    +[Service]
    +type=oneshot
    +ExecStart=/usr/bin/wvdial play
    +
    +[Install]
    +WantedBy=multi-user.target
    +
    +

    + Jeśli kartę sim trzeba odblokować kodem PIN. Należy stworzyć drugą jednostkę podobną do tej. Powiedzmy że mamy jednostkę służącą do połączenia nazwiemy ją vwdial-connect.service, oraz jedostkę służącą do odblokowania karty vwdial-unlock.service musimy zmienić dwie opcje w sekcji [Unit] mianowicie Before oraz Wants. Zmienimy również opcje Description aby była bardziej adekwatna do czynności wykonywanych przez daną jednostkę. +

    +
    +[Unit]
    +BindsTo=dev-ttyUSB0.device
    +After=dev-ttyUSB0.device
    +Description=Wvdial SIM Card Unlock
    +Before=wvdial-connect.service
    +Wants=wvdial-connect.service
    +
    +[Service]
    +type=oneshot
    +ExecStart=/usr/bin/wvdial pin
    +[Install]
    +WantedBy=multi-user.target
    +
    +

    + Jednostka wvdial-connect.service zostanie opóźniona do momentu uruchomienia jednostki wvdial-unlock.service. +

    +
  8. +
  9. Adres dla interfejsu bezprzewodowego. +

    + Konfiguracji interfejsu bezprzewodowego dokonujemy w pliku /etc/dhcpcd.conf. Dopisując poniższe linie na samym końcu pliku. +

    +
    +interface wlan0
    +static ip_address=192.168.4.1/24
    +nohook wpa_supplicant
    +
    +

    + Oczywiście klasę adresów należy ustawić według własnych preferencji. +

    +
  10. +
  11. Konfiguracja serwera dhcp. +

    + Do konfiguracji DHCP na RPI wykorzystamy pakiet dnsmasq. Instalujemy go poleceniem. +

    +
    +$ sudo apt install dnsmasq
    +
    +

    + Po zainstalowaniu pakietu, zmieniamy nazwę pliku konfiguracyjnego na dnsmasq.conf.bak, następnie tworzymy nowy plik /etc/dnsmasq.conf i umieszczamy w nim poniższą konfigurację. +

    +
    +interface=wlan0
    +dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
    +
    +

    + Zakresy i czas dzierżawy należy ustawić według własnych preferencji. +

    +
  12. +
  13. Konfiguracja sieci bezprzewodowej. +

    + Aby Raspberry Pi mogło rozgłaszać sygnał sieci bezprzewodowej należy zainstalować odpowiedni pakiet. Hostapd pobieramy z repozytorium: +

    +
    +$ sudo apt install hostapd
    +
    +

    + Konfiguracja znajduje się w pliku /etc/hostapd/hostapd.conf. Jednak to nie jedyny plik w którym należy coś zmienić, aby uruchomić 'hostapd', drugim plikiem jest /etc/default/hostapd tam usuwamy znak komentarza sprzed opcji DAEMON_CONF. Natomiast w /etc/hostapd/hostapd.conf możemy wpisać konfigurację bazującą na poniższej. +

    +
    +interface=wlan0
    +driver=nl80211
    +ssid=test123
    +hw_mode=g
    +channel=6
    +ieee80211n=1
    +wmm_enabled=0
    +macaddr_acl=0
    +auth_algs=1
    +ignore_broadcast_ssid=0
    +wpa=2
    +wpa_passphrase=12344321
    +wpa_key_mgmt=WPA-PSK
    +wpa_pairwise=TKIP
    +rsn_pairwise=CCMP
    +
    +
  14. +
  15. Przekazywanie pakietów +

    + Aby sprzęt podłączony do naszej sieci bezprzewodowej miał dostęp do Internetu potrzebne są dwe rzeczy. NAT oraz przekazywanie pakietów. NAT-em zajmiemy się w następnym punkcie. Aby skonfigurować przekazywanie pakietów na RasPiOS wystarczy odkomentować opcje net.ipv4.ip_forward=1 w pliku /etc/sysctl.conf. +

    +
  16. +
  17. NAT +

    + W każdym RasPiOS pre-instalowane jest iptables czyli jeden z pakietów firewall-a dostępnych na GNU/Linux. Jednak pre-instalowane nie jest oprogramowanie, które pozwala zachować wpisane do tablic reguły, aby ustawienia NAT-u, w iptables zostało zapisane na stałe w plikach systemu potrzebujemy pakietu iptables-persistent instalowanego za pomocą polecenia. +

    +
    +$ sudo apt install iptables-persistent
    +
    +

    + NAT w przypadku tego systemu uruchamiamy następującym poleceniem: +

    +
    +$ sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    +
    +

    + Teraz kiedy jest on włączony, pozostaje tylko zapisać naszą tablicę, aby to zrobić musimy wykonać polecenia z uprawnieniami użytkownika root więc albo: +

    +
    +$ sudo su
    +# iptables-save > /etc/iptables.ipv4.nat
    +
    +

    + lub: +

    +
    +$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
    +
    +

    + Reguła NAT-u jest już trwała. Teraz kolejnym problem jest przywrócenie tej reguły podczas ładowania systemu. Najłatwiejszym sposobem jest dopisanie polecenia do pliku, który wyświetla nam adres IP zaraz przez logowaniem. Jest to plik /etc/rc.local, przed linią exit 0; dopisujemy następujące polecenie: +

    +
    +$ iptables-restore < /etc/iptables.ipv4.nat
    +
    +
  18. +
  19. Restart +

    + Restarujemy malinke: +

    +
    +$ sudo reboot
    +
    +
  20. +
+

+ Jak możemy się przekonać to wszystko działa. Patrząc na to z perspektywy czasu to zmienił bym modem 3G na LTE i przylutował go pod gniazdo USB, wszystko zasilił bym modułem z powerbank-a z wymiennymi akumlatorami 3,7V. Na koniec zaprojektowałbym obudowę i wydrukował za pomocą drukarki 3D. +

+

+ ~xf0r3m +

+
+ + + + diff --git "a/articles/raspberrypi/Raspberry_Pi_jako_przeka\305\272nik_bluetooth.html" "b/articles/raspberrypi/Raspberry_Pi_jako_przeka\305\272nik_bluetooth.html" new file mode 100644 index 0000000..58e25e3 --- /dev/null +++ "b/articles/raspberrypi/Raspberry_Pi_jako_przeka\305\272nik_bluetooth.html" @@ -0,0 +1,297 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + +
+

Raspberry Pi jako przekaźnik bluetooth

+

+ Kiedyś potrzebowałem przekaźnika bluetooth, takiego który mogłem + podłączyć do wieży czy głośników od komputera i puszczać muzykę + bezprzewodowo z telefonu. Nie chciałem używać czegoś takiego jak + "Balena Sound", towrzyć jakieś konta, logować się. To nie w moim + stylu, przeglądając co wyniki wyszukiwania wujka Google trafiłem na + jeden lub dwa poradniki, które okazały sie klapą. Jednym z wyników + wyszukiwania były wątek na forum i on okazał się strzałem w 10 + (powiedzmy, bo jakość dzwięku może srogo rozczarować). Nie owiajając w + bawełnę konfiguracje Raspberry Pi zaczniemy od zainstalowania systemu + na karcie i umożliwienia zalogowania się przez SSH. +

+

+ Po zalogowaniu się do systemu, każdą konfigurację rozpoczynamy od + aktualizacji. +

+
+$ sudo apt update
+$ sduo apt upgrade
+
+

+ Następnie instalujemy niezbędne oprogramowanie. +

+
+$ sudo apt install pulseaudio pulseaudio-module-bluetooth
+
+

+ Teraz musimy dodać naszego użytkownika do grupy bluetooth. +

+
+$ sudo usermod -aG bluetooth pi
+
+

+ Aby zmiany dotyczące grupy lub użytkownika zaczęły działać należy się + wylogować i zalogować ponownie. +

+

+ Kolejną czynnością jest przestawienie RPI aby było widziane jako + "Odpływ wysokiej jakość (A2DP)". W pliku + /etc/bluetooth/main.conf usuwamy znak komentarza z opcji + Class i nadajemy jej wartość + 0x41C oraz usuwamy znak komentarza z opcji + DiscoverableTimeout +

+
+...
+Class = 0x41C
+...
+DiscoverableTimeout = 0
+...
+
+

+ Po zapisaniu zmian w pliku, restartujemy usługę. +

+
+$ sudo systemctl restart bluetooth
+
+

+ Następnie musimy uruchomić bluetooth na RPI, po wydaniu polecenia + bluetoothctl, wydajemy kolejno + przedstawione poniżej polecenia. +

+

+ Za nim to jednak zrobimy może być tak, że nasz kontroler bluetooth + będzie wyłączony za pomocą rfkill. W tym przypadku musimy + wydać polecenie raspi-config następnie + wybrać: +

+
+Localisation Options -> WLAN Country -> [kraj, którym znajduje się urządzenie] -> Finish
+#Wyrażamy zgodę na restart RPI.
+
+
+$ bluetoothctl
+Agent registered
+[bluetooth]# power on
+Changing power on succeeded
+[bluetooth]# discoverable on
+Changing discoverable on succeeded
+[CHG] Controler XX:XX:XX:XX:XX:XX Discoverable: yes
+[bluetooth]# pairable on
+Changing pairable on succeeded
+[bluetooth]# agent on
+Agent is already registered
+[bluetooth]# default-agent
+Default agent request successful
+[bluetooth]# quit
+
+

+ Uruchamiamy pulseaudio +

+
+$ pulseaudio --start
+
+

+ Następnie sprawdzamy czy usługa bluetooth zarejestrowała odpływ A2DP. +

+
+$ sudo systemctl status bluetooth
+
+

+ Jeśli zauważyliśmy jakieś linie Endpoint registered + zawierające napis "A2DP" oznacza to, że odpływ został zarejestrowany. + Teraz dokonamy testowego połączenia. Warto zaznaczyć, że abyśmy + mogli się połączyć z RPI to będziemy musieli "zaufać" naszemu + urządzeniu. Na malinie uruchamiamy polecenie + bluetoothctl, a na telefonie + wyszukujemy urządzeń bluetooth, nazwa urządzenia będzie identyczna jak + nazwa hosta RPI. Próbuje my się z nim połączyć. +

+
+$ bluetoothctl
+
+

+ Przy próbie podłączenia zostanie na wyświetlona masa komunikatów + związanych z naszym telefonem, w tych komunikatch po słowie + Device, znajdować się będzie adres MAC modułu bluetooth w + telefonie. Nie należy zrazić się komunikatem "Błąd połączenia". Teraz + na RPI wpisujemy polecenie bluetooth + trust oraz + MAC naszego bluetooth. +

+
+[bluetooth]# trust AA:BB:CC:DD:EE:FF
+
+

+ Powinniśmy się prawidłowo połączyć. + Dzwięk również już pownien działać. Dla testu warto włączyć jakąś + muzykę lub film na YT. +

+

+ Mogło by się okazać, że już gotowe. Jednak to nie wszystko, teraz + póki co uruchamialiśmy pulseaudio z ręki, jednak nie bedziemy + się + za każdym razem po włączeniu RPI logować i włączać usługę. Tu jest + również pewien haczyk, otóż żeby pulseaudio mogło działać + niezbędny + jest zalogowany użytkownik, z poziomu którego systemd będzie + ten program uruchamiać więc poza autostartem pulseaudio do ustawienia + zostało jeszcze autologowanie na użytkownika pi. +

+

+ Uruchomie pulseaudio wraz z systemem. +

+
+$ systemctl --user enable pulseaudio.service
+
+

+ Włączenie autologowania się na użytkownika pi. +

+
+$ sudo raspi-config
+System Options -> Boot / Auto Login -> Console Autologin -> Ok
+
+

+ Po ustawieniu autologowania, być może będzie trzeba zrestartować + urządzenie. +

+

+ Teraz formalnie to wszystko. Jednak pozostała jeszcze jedna kwestia, + podłączanie się urządzeń do RPI. Można to zrobić na 3 sposoby. +

+

+ Pierwszy najprostszy, pozostawienie tego tak jak jest. Każdeme nowemu + urządzeniu będzie trzeba "zaufać", tak jak podczas testu. +

+

+ Drugi pozwalający na połączenie z każdemu urządzeniu bez żadnych + mechanizmów kontroli. +

+

+ Trzeci wprowadzający klasyczny "PIN". Drugi i trzeci sposób opisze + poniżej, każdy zdecyduje co jemu najbardziej odpowiada. +

+

+ W tym jak i w trzecim sposobie musimy zainstalować dodatkowy pakiet. + Sposoby różni tylko konfiguracja usługi bt-agent oraz + jeden dodatkowy plik w trzecim. Usługa ta + wchodzi w skład pakietu bluez-tools. +

+
+$ sudo apt install bluez-tools
+
+

Sposób 2: Pozwala na podłaczenie się każdego urządzenia

+

+ Po zainstalowaniu pakietu, musimy utworzyc plik usługi + bt-agent.service w katalogu /etc/systemd/system. +

+
+[Unit]
+Description=Bluetooth Auth Agent
+After=bluetooth.service
+PartOf=bluetooth.service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/bt-agent -c NoInputNoOutput
+
+[Install]
+WantedBy=bluetooth.target
+
+

+ Zapisujemy plik, włączamy go aby uruchamiał się zgodnie zapisaną w nim + sekwencją. I możemy startować usługę. Teraz każde nowe urządzenie + podłączy się do RPI bez żadnych przeszkód. +

+
+$ sudo systemctl enable bt-agent.service
+$ sudo systemctl start bt-agent.service
+$ sudo systemctl status bt-agent.service
+
+

Sposób 3: Pozwala na podłączenie się tylko dla znających PIN

+

+ Ten sposób rózni się konfiguracją usługi oraz + dodatkowym plikiem, w którym zdefiniowany jest PIN. Utworzy my teraz plik + z PIN-em, w pliku pin.conf w katalogu /etc/bluetooth/ + zapisujemy poniższą linię. +

+
+*   12345
+
+

+ Oczywiście PIN, możemy podać własny. Nadajemy odpowienie uprawnienia + dla pliku. +

+
+$ sudo chmod 600 /etc/bluetooth/pin.conf
+
+

+ Teraz dokonujemy zmian w pliku usługi, tak aby bt-agent, + wykorzystywał PIN do uwierzytelnienia połączeń z RPI. +

+
+[Unit]
+Description=Bluetooth Auth Agent
+After=bluetooth.service
+PartOf=bluetooth.service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/bt-agent -c NoInputNoOutput -p /etc/bluetooth/pin.conf
+ExecStartPost=/bin/sleep 1
+ExecStartPost=/bin/hciconfig hci0 sspmode 0
+
+[Install]
+WantedBy=bluetooth.target
+
+

+ Po zatwierdzeniu zmian, włączamy i uruchamiamy usługę. +

+
+$ sudo systemctl enable bt-agent.service
+$ sudo systemctl start bt-agent.service
+$ sudo systemctl status bt-agent.service
+
+

+ Nasz przekaźnik jest już gotowy. Możemy podłaczyć do niego zarówno + głośnik jak i zestaw kina domowego, wszystko czego połączenie opiera + się na złączu Jack 3,5mm. +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/raspberrypi/Raspberry_Pi_jako_serwer_poczty.html b/articles/raspberrypi/Raspberry_Pi_jako_serwer_poczty.html new file mode 100644 index 0000000..e161de0 --- /dev/null +++ b/articles/raspberrypi/Raspberry_Pi_jako_serwer_poczty.html @@ -0,0 +1,480 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + +
+

Raspberry Pi jako serwer poczty

+

+ Był już serwer wydruku, a teraz przyszedł czas na serwer poczty. + Materiał ten jest podobny, do tego z wykorzystaniem BSD i bardzo + starego serwera. Wykorzystałem go jako bazę, jednak nie wszystko zostało + przeniesione 1:1 na Raspberry Pi. +

+

+ Jak każdą pracę z wykorzystaniem RPI jako serwera czegoś, należy + zacząć od przygotowania sobie czystego środowiska. Na kartę microSD + nagrywamy obraz z systemem. Jeśli korzystamy z Linux-a to możemy + użyć do tego polecenia dd. +

+
+$ sudo dd if=~/Downloads/2021-05-07-raspios-buster-armhf-lite.img bs=1M of=/dev/mmcblk0 status=progress
+
+

+ Instalowany system operacyjny to klasycznie RasPiOS. Po przegraniu + systemu na kartę warto ustawić sobie możliwość zdalnego połączenia się + przez SSH. Jeśli mamy już urządzenie gotowe do pracy to zaczynamy od: +

+
    +
  1. + + Usunięcie domyślnego użytkownika i dodanie nowego, swojego + +

    + W systemach RasPiOS domyślnym użytkownikiem jest pi, a jego + hasło raspberry do najtrudniejszych nie należy i najlepiej + ze względów bezpieczeństwa pozbyć się tego użytkownika. Użytkownicy + w przypadku przedstawionej tutaj konfiguracji serwera będą mapowani + na użytkowników usług pocztowych, a pozostawienie niewykorzystanego + konta z możliwością logowania, może stanowić potencjalną furtkę do + systemu. Użytkownika pozbywamy się za pomocą + polecenia deluser. Jednak przed jego usunięciem musimy + stworzyć nowego użytkownika i nadać mu uprawnienia administracyjne, + w przeciwnym wypadku zostalibyśmy bez zwykłego użytkownika, a co + za tym idzie bez możliwości zdalnego logowania się na serwerze, chyba + że pozwolimy na logowanie przez SSH użytkownika root, co + jest jeszcze bardziej niebezpieczne niż pozostawienie użytkownika + pi +

    +
    +pi@raspberrypi:~ $ sudo adduser xf0r3m
    +...
    +pi@raspberrypi: $ sudo usermod -aG sudo xf0r3m
    +# Przelogowanie się na nowego użytkownika.
    +xf0r3m@raspberrypi: $ sudo deluser pi
    +
    +
  2. +
  3. + Aktualizacja systemu +

    + Po pozbyciu się użytkownika pi, możemy przejeść do + aktualizacji systemu. +

    +
    +$ sudo apt update
    +$ sudo apt upgrade
    +
    +
  4. +
  5. + Opcjonalnie: zmiana nazwy hosta +

    + Wypadałoby, aby host będący w domenie serwerem mailowym miał + odpowienią nazwę, chociaż nie jest to wymagane. +

    +
    +$ sudo raspi-config
    +1 System Options -> S4 Hostname -> OK
    +
    +
  6. +
  7. + Instalacja Postfix-a +

    + Naszym serwerem protokołu SMTP będzie + Postfix. Jest to chyba jedyny rzetelny, open sourcowy + serwer SMTP, dostępny na UNIX-y, którego konfiguracja nie jest + jakąś czarną magią. +

    +
    +$ sudo apt install postfix
    +
    +
  8. +
  9. + Monit o konfiguracji Postfix-a w trakcie instalacji +

    + Podczas instalacji Postfix-a, zostanie nam wyświetlone + okno dialog-u na temat konfiguracji, wybieramy + Strona internetowa/Internet site w polu do uzupełnienia + wpisujemy nazwę swojej domeny. +

    +
  10. +
  11. + Ustawienie opcji + mydestination na nazwwę domeny + +

    + Niestety wybór opcji w oknie dialogowym i podanie odpowiedniej + wartość nie załatwią poprawnej konfiguracji (takiej, która + działa). Żeby serwer SMTP obsługiwał pocztę wewnątrz naszej + organizacji, musimy ustawić w odpowiedniej opcji, że ten + serwer jest jednym z serwerów obsługujących tą domenę. +

    +
    +$ sudo postconf -e "mydestination=example.com"
    +
    +
  12. +
  13. + Sprawdzenie możliwości użycia Dovecot SASL +

    + Przed wdrożeniem konkretnej implementacji mechanizmów + uwierzytelniania musimy sprawdzić czy zainstalowana wersja + Postfix-a jest z nią kompatybilna. + Przedstawione tutaj czynności (całość materiału, konfiguracji) są + tylko jednym ze sposobów. Możemy + je dostosować do własnych potrzeb. Poniższe polecenie zwróci nam + listę obsługiwanych implementacji uwierzytelniania. +

    +
    +$ sudo postconf -a
    +
    +

    + Polecenie na 99,9% zwróci dovecot, + i to jest implementacja, która zostanie tutaj przedstawiona. +

    +
  14. +
  15. + Instalacja dovecot +

    + Instalacja dovecot, akurat w przypadku dystrybucji opartych + na GNU/Linux Debian, nie jest wcale taka oczywista. Dovecot + to kombajn, który zawiera masę usług, więc postanowiono go podzielić + na pomniejsze pakiety zawierające tylko tą usługę, której nazwa jest + zawarta w nazwie pakietu. Tak więc aby na RPI zainstalować + dovecot mogący świadczyć usługi w organizacji potrzebujemy + dwóch pakietów. +

    +
    +$ sudo apt dovecot-imapd dovecot-pop3d 
    +
    +

    + System uwierzytelniania SASL, zostanie zainstalowany wraz z pakietem + dovecot-core, który jest zależnością dla powyższych + pakietów, a te pakiety i tak będą nam potrzebne. +

    +
  16. +
  17. + Uruchomienie uwierzytelniania dla Postfix-a +

    + Tę czynność rozpoczniemy od konfiguracji dovecot-a, w pliku + /etc/dovecot/conf.d/10-master.conf, w sekcji + service auth włączamy - + usuwając znaki komentarza, sekcję + + unix_listener /var/spool/postfix/private/auth + + wewnątrz tej sekcji zmieniamy wartość opcji + mode na 0660 oraz dodajemy + dwie opcje: user oraz group ustawione na wartość + postfix. Już poza sekcją + auth określamy rodzaje mechanizmów + uwierzytelniania. Poniżej znajduje się listing przedstawiający poprawnie + skonfigurowaną sekcję. +

    +
    +service auth {
    +...
    +  unix_listener /var/spool/postfix/private/auth {
    +    mode = 0660
    +    user = postfix
    +    group = postfix
    +  }
    +...
    +}
    +
    +auth_mechanisms = plain login
    +
    +

    + Po zapisaniu zmian, w kolejnym pliku + /etc/postfix/main.cf dopisujemy poniższe opcje: +

    +
    +smtpd_sasl_type = dovecot
    +smtpd_sasl_path = private/auth
    +smtpd_sasl_auth_enable = yes
    +smtpd_relay_restrictions = permit mynetworks, permit_sasl_authenticated, reject_unauth_destination
    +
    +

    + Te opcje wprowadzają restrykcje dla serwera SMTP nasłuchującego na + porcie TCP/25. Tak, ten port musi być otwarty, w przeciwynym wypadku + żaden mail z zewnątrz do nas nie dotrze. Użytkownicy poczty będą + używać portu submission czyli TCP/587, ale maile przesyłane + są między domenami (serwerami SMTP) przy użyciu portu TCP/25. Warto + też dodać, że maile pomiędzy domenami przesyłane są zwykłym tekstem, + dlatego też wiele osób stosuje szyfrowanie od końca do końca + (ang. End-to-end encryption). Po + zapisaniu tych ustawień możemy przejść do uruchomienia + submission. +

    +
  18. +
  19. + + Uruchomienie submission dla połączeń klient-serwer SMTP + +

    + W pliku /etc/postfix/master.cf odnajdujemy wiersz tabeli + zawierający napis submission, usuwamy poprzedzający go znak + komentarza, następnie pod tym wierszem zapisujemy opcje z jakimi ma + zostać uruchomiony. +

    +

    +submission  inet  n - y - - smtpd
    + -o smtpd_tls_security_level=encrypt
    + -o smtpd_sasl_auth_enable=yes
    + -o smtpd_sasl_type=dovecot
    + -o smtpd_sasl_path=private/auth
    + -o smtpd_sasl_security_options=noanonymous
    + -o smtpd_sasl_local_domain=example.com
    + -o smtpd_client_restrictions=permit_sasl_authenticated,reject
    + -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
    + -o smtpd_sender_restrictions=reject_sender_login_mismatch
    + -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
    +
    +
  20. +
  21. + + Restart Postfix-a + +

    + Teraz przyszedł czas na sprawdzenie poprawności wprowadzonych + ustawień. Na początek uruchomimy ponownie Postfix-a. +

    +
    +$ sudo postfix reload
    +
    +

    + Jeśli teraz daemon nie zwróci żadnych komunikatów, to + wszystko jest na dobrej drodze. Warto jeszcze zajrzeć do pliku + /var/log/syslog. +

    +
  22. +
  23. + + Instalacja certyfikatów SSL organizacji dla SMTP + +

    + W pliku /etc/postfix/main.cf, odnajdujemy dwie opcje + smtpd_tls_cert_file oraz + smtpd_tls_cert_key. Tej pierwszej, + jako wartość ustawiamy ścieżkę do pliku certyfikatu, a drugiej + ścieżkę do pliku klucza certyfikatu. +

    +
    +smtpd_tls_cert_file=/etc/openssl/certs/fullchain1.pem
    +smtpd_tls_cert_key=/etc/openssl/private/privkey1.pem
    +
    +
  24. +
  25. + + Utworzenie bazy użytkowników usług pocztowych + +

    + Baza użytkowników jest zwykłym plikem tekstowym, w którym występują + mapowania adresów e-mail organizacji na nazwy użytkowników systemu. + W pliku każda linia to jedno mapowanie, a bazą użytkowników dla + Postfix-a jest /etc/postfix/virtual. Po zapisaniu + zmian plik ten należy dostosować za pomocą polecnia dostarczanego + wraz z Postfix-em, aby był dla niego czytelny. Za każdym + dodanie mapowania baza będzie wymagała konwersji. +

    +
    +/etc/postfix/virtual:
    +root@example.com  root
    +xf0r3m@example.com  xf0r3m
    +
    +$ sudo postmap /etc/postfix/virtual
    +
    +

    + Po skonwertowaniu bazy, należy zrestartować Postfix-a. +

    +
    +$ sudo postfix reload
    +
    +
  26. +
  27. + + Włączenie SSL w Dovecot + +

    + Za pomocą protokołów IMAP oraz POP3 użytkownicy będą pobierać maile + z serwera, aby zabezpieczyć komunikację pomiędzy klientem a serwerem + tak jak zrobiliśmy to z protkołem SMTP tu również użyjemy + certyfikatów + SSL. W /etc/dovecot/ssl/10-ssl.conf ustawiamy ścieżki + do plików certyfikatu. +

    +

    + Jeśli przed opcją ssl znajduje się + znak komentarza, to należy go usunąć. +

    +

    + A pliki certyfikatu ustawiane są w opcjach + ssl_cert - dla pliku certyfikatu i + ssl_key - dla pliku klucza + prywatnego certyfikatu. +

    +
    +ssl_cert=</etc/openssl/certs/fullchain1.pem
    +ssl_key=</etc/openssl/private/privkey1.pem
    +
    +

    + Uwaga! Ostre nawiasy są cześcią składni wartości + opcji. +

    +
  28. +
  29. + + Uruchomienie IMAPS i POP3S + +

    + Po ustawieniu SSL dla usług dovecot, przyszedł czas aby + je włączyć. W pliku /etc/dovecot/conf.d/10-master.conf + musimy odnaleźć dwie sekcje: + inet_listener imaps oraz + inet_listener pop3s, w tych + sekcjach dopisujemy dwie opcje: port wskazującą na numer + portu usługi oraz opcje ssl uruchamiającą szyfrowaną + transmisję dla połączeń z tym serwerem. Te opcje oczywiście o + innych portach ustawiamy w obu wymienionych sekcjach. +

    +
    +...
    +inet_listener imaps {
    +  port = 993
    +  ssl = yes
    +}
    +
    +...
    +inet_listener pop3s {
    +  port = 995
    +  ssl = yes
    +}
    +
    +
  30. +
  31. + + Restart dovecot + +

    + Po wdrożeniu ostatnich zmian, trzeba zrestartować usługę aby zmiany + zostały uzwględnione przez działającego daemona. +

    +
    +$ sudo dovecot reload
    +
    +
  32. +
  33. + + Sprawdzenie poprawności działania serwera za pomocą Thunderbirda + +

    + W internecie jest bardzo dużo dostępnych klientów pocztowych różnej + maści. Jednak tutaj będzie zależało nam na prostocie konfiguracji, + dlatego do celów testowych wybierzemy Thunderbirda. +

    +

    + Tworząc nowe konto pocztowe, w początkowych polach podajemy nazwę, + adres e-mail oraz hasło. Na dole okna klikamy przycisk ręcznej + konfiguracji. Następnie uzupełniamy pola, tak jak opisano to poniżej +

    +

    + Konfiguracja serwera poczty wychodzącej: +

      +
    • + Protokół: SMTP +
    • +
    • + Serwer: mail.example.com +
    • +
    • + Port: 587 +
    • +
    • + SSL: STARTTLS +
    • +
    • + Uwierzytelnianie: Normalne hasło +
    • +
    • + Nazwa użytkownika: + Nazwa użytkownika (systemowa z serwera mailowego) +
    • +
    +

    +

    + Konfiguracja serwera poczty przychodzącej: +

      +
    • + Protokół: IMAP/POP3 +
    • +
    • + Serwer: mail.example.com +
    • +
    • + Port: 993/995 +
    • +
    • + SSL: SSL/TLS +
    • +
    • + Uwierzytelnianie: Normalne hasło +
    • +
    • + Nazwa użytkownika: + Nazwa użytkownika (systemowa z serwera mailowego) +
    • +
    +

    +

    + Po zatwierdzeniu będziemy mieć już gotową skrzynkę. W celach + testowych wyślijmy maila z załącznikiem (serwer nie przepuści + wiadomości większej niż 10MB) do siebie. Powinna wysłać się + bez problemu i od razu pojawić się w skrzynce. +

    +
  34. +
+

+ Jeśli chodzi o pracę tego typu rozwiązania w jakieś konkretnej + organizacji, to zostało jeszcze wiele pracy. Większość skrzynek + pocztowych będzie traktować maile wysłane z tego serwera jako SPAM. + Jeśli odpowiemy na maila, to trafi on automatycznie do skrzynki + odbiorczej jako kontynuacja wątku. To rozwiązanie w takiej postaci + może sprawdzić się w korespondencji wewnętrznej. +

+

+ Jeśli ktoś jest spragniony testowania tego rozwiązania, to w materiale + na podbny temat w sekcji "bsd" znajduje się więcej informacji. W tym + materiale znajduje się konfiguracja programu MUTT dla + usług pocztowych tego typu. Link poniżej: +

+

+ https://morketsmerke.net/site/articles/bsd/20_letni_Sun_Netra_T1_jako_serwer_mailowy_z_wykorzystaniem_NetBSD.html +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/raspberrypi/Raspberry_Pi_jako_serwer_wydruku.html b/articles/raspberrypi/Raspberry_Pi_jako_serwer_wydruku.html new file mode 100644 index 0000000..68e6c5c --- /dev/null +++ b/articles/raspberrypi/Raspberry_Pi_jako_serwer_wydruku.html @@ -0,0 +1,136 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + +
+

Raspberry Pi jako serwer wydruku

+

+ Jak to się mówi... Potrzeba jest matką wynalazków. W moim przypadku był to problem takiego rodzaju że na dwa komputery w biurze miałem jedną drukarkę. Dość starą drukarkę bo to HP LaserJet 1010 wydana w wrześniu 2003. Drukarka nie ma żadnych innych portów niż USB type B, i stała daleko od komputera a ja nie miałem tak długiego kabla żeby ją podłączyć. Więc wpadłem na pomysł aby podłączyć ją do Raspberry i zrobić z RPI serwer wydruku. Poniżej znajdują się czynność, które wykonywałem aby to skonfigurować. +

+
    +
  1. Instalacja aktualizacji oraz niezbednych pakietów. +
    +$ sudo apt update
    +$ sudo apt upgrade
    +$ sudo apt install cups
    +
    +
  2. +
  3. Umożliwienie dostępu z sieci do CUPS Raspberry Pi, w normalnych warunkach CUPS nasłuchuje tylko i wyłącznie na pętli zwrotnej. +
    +$ sudo cupsctl --remote-admin --remote-any --share-printers
    +
    +
  4. +
  5. Dodawnie uprawnień użytkownikom do zarządzania drukarkami. +

    + W pliku /etc/cups/cupsd.conf odszukujemy sekcję Limit CUPS-Add-Modify-Printer pierwszą napotkaną, może ich być wiele, następnie w opcji Require user po @SYSTEM dopisujemy użytkownika, w tym przypadku będzie to pi. Zapisujemy plik i restartujemy usługę. +

    +
    +$ sudo systemctl restart cups
    +
    +
  6. +
  7. Dodawnie drukarki w systemie CUPS +

    + W przeglądarce w pasku adresu, wpisujemy http://<adres_ip raspberry_pi>:631, klikamy na zakładkę Administration, następnie wybieramy opcje Add printer. Zostanie poproszeni o dane logowania, używamy danych logowania z użytkownika pi. W sekcji Local printers powinniśmy dostrzec naszą drukarkę. Jeśli tak to wybieramy ją i klikamy continue. + Następnie zaznaczamy opcję Share this printer i klikamy continue. W opcji Model, wyszukujemy model podłączonej drukarki, jeśli nie możemy go znaleźć oznacza to że nie ma sterowników zainstalowanych do naszego urządzenia. Jeśli znaleźlismy naszą drukarkę możemy teraz przejść do punktu nr. 6. +

    +
  8. +
  9. Instalacja sterowników drukarki w systemie Linux. +

    + Jeśli CUPS nie obsługuje naszej drukarki domyślnie, to pierwszą rzeczą jaką powinniśmy zrobić to odwiedzić stronę http://openprinting.org/printers. Znajdują się na niej otwarte sterowniki drukarek. Jeśli nie znaleźliśmy na niej nic odpowiedniego dla naszego urządzenia pozostaje, nam tylko strona producenta. Po zainstalowaniu sterownika, wracamy z powrotem do punktu 4. Uwaga! Drukarki HP przy wyborze sterownika HPLIP (sterownik własnościowy), należy instalować z poziomu oprogramowania sterownika. Po zainstalowaniu sterownika za pomocą polecenia: +

    +
    +$ sudo apt install hplip
    +
    +

    + Uruchamiamy kreator dodawania drukarek poleceniem: +

    +
    +$ sudo hp-setup -i
    +
    +

    + Kreator zapyta o typ połączania (usb, lan, lpt), a następnie automtycznie wykryje podłączoną drukarkę, lub poprosi o wybór urządzenia jeśli podłączyliśmy więcej niż jedno. Po tym kreator zapyta o instalację pluginu, jest on niezbędny do obsługi naszego urządzenia. Plugin zostanie pobrany ze strony HP, w trakcie możemy otrzymać błąd Unable to receive key from keyserver, nie jest to błąd krytyczny, musimy po prostu potwierdzić że chcemy pobrać wtyczkę bez weryfikacji źródła. Po zainstalowaniu wtyczki zostanie zapytanie o dodanie kolejki wydruku, opis oraz lokalizację drukarki. Na koniec zostaniemy zapytani o stronę testową. Warto to zrobić ponieważ od razu będzie wiadomo czy drukarka współpracuje z zainstalownym właśnie sterownikiem. +

    +

    + Po wydrukowaniu strony testowej, drukarka powinna automatycznie pojawić się w panelu CUPS. +

    +
  10. +
  11. Dodawanie drukarki w systemie Windows +

    + Możliwe są dwa dojścia. Zauważyłem że np. drukarka HP LaserJet 1020, nie chcę drukować po zainstalowaniu za pomocą protokołu Bonjour firmy Apple. Mimo pojawiących się rzeczy w kolejce wydruku w panelu CUPS. +

      +
    • Dojście nr. 1 - protokoł Bonjour: +

      + Na naszym Windowsie instalujemy program Kreator drukarek Bonjour Po uruchomieniu powinien automatycznie odszukać drukarę, widniejącą pod: <nazwa_drukarki>@<nazwa_hosta_raspberry>. Następnie wybieramy sterownik, jeśli nie znaleźliśmy naszego możemy go załadować z dysku. Na razie wybierzmy jakiś generyczny sterownik, ponieważ program lub się tu wykrzaczyć i po prostu nieoczekiwanie zamknąć. Po dodaniu drukarki, przechodzimy do jej właściwości w Panelu sterowania czy w Ustawieniach, wybieramy drukarkę klikamy na nią PPM z menu kontekstowego wybieramy opcję Właściwości drukarki następnie + zakładkę Zaawansowane w sekcji Sterownik, kilkamy Nowy sterownik i dopiero tutaj ładujemy nasz sterownik. Dla pewności drukujemy stronę testową. To dojście działa między innymi dla HP LaserJet 1010 na Windows 10. +

      +
    • +
    • Dojście nr. 2 - ręczna konfiguracja IPP: +

      + Sposób może brzmieć skomplikowanie, jedak jest prostszy niż poprzedni... W aplecie Urządzenia i drukarki' panelu sterowania wybieramy Dodaj drukarkę następnie odnośnik Drukarki, której szukam nie ma na liście' zaznaczamy opcje Wybierz drukarkę udostępnioną według nazwy w poniższym okienku wpisujemy: +

      +
      +http://<adres_ip_raspberry>:631/printers/<nazwa_drukarki_w_CUPS>
      +
      +

      + Potem klikamy przycisk Dalej, system powinien się skomunikować z drukarką i wyświetlić nam okienko wyboru sterowników. Wybieramy odpowiedni dla naszego urządzenia sterownik lub ładujemy go z dysku. Po zainstalowniu, drukujemy stronę testową. +

      +
    • +
    + Tutaj możemy zakończyć naszą instalację, jednak przedstawię poniżej jeszcze jeden punkt, lekko poprawiający korzystanie z CUPS. +

    +
  12. +
  13. Dostrajanie CUPS. (Opcjonalnie) +

    + Nie będzie tu tego wiele. Ale dwie rzeczy rzucają się w oczy przy wykorzystywaniu serwera wydruku z RPI np. w firmie. Pierwsza z nich to korzystanie z nazwy FQDN zamiast z adresu IP, oraz logowanie do samego panelu administracyjnego, a nie tylko do funkcji zarządzania drukarkami. +

    +
      +
    • Przyjazna nazwa serwera wydruku. +

      + W pliku konfiguracyjnym /etc/cups/cupsd.conf, edytujemy opcję Listen, ustawiając ją na *:631 następnie pod nią dopisujemy opcję ServerAlias ustawiając ją na FQDN naszego serwera wydruku. Plik zapisujemy i restartujemy usługę. +

      +
      +$ sudo systemctl restart cups
      +
      +
    • +
    • Blokada nieautoryzowanego dostępu do panelu administracyjnego CUPS. +

      + W pliku konfiguracyjnym, odnajdujemy sekcję <Location /admin> dopisujemy wewnątrz niej opcję Require user @SYSTEM pi. Plik zapisujemy i restartujemy usługę. +

      +
    • +
    +
  14. +
+

+ To rozwiązanie działa... Do czasu. Po kilku miesiącach drukarka na każdą stronę wydruku, drukowała Stronę z napisem "Unsupported Personality: PCL". Pomogła zmiana sterownika z HPLIP na CUPS+Gutenprint, ale co ciekawe tylko na Debianie. Na innych systemach drukarka nie chciała w ogóle drukować na tym sterowniku. Po tych doświadczeniach stwierdzam że nie ma się co bawić w takie rozwiązania, lepiej kupić jakąś porządną drukarkę sieciową ze wsparciem zarówno dla systemów GNU/Linux jak MS Windows. +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/raspberrypi/index.html b/articles/raspberrypi/index.html new file mode 100755 index 0000000..78cc2f6 --- /dev/null +++ b/articles/raspberrypi/index.html @@ -0,0 +1,43 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + + + + + + diff --git "a/articles/raspberrypi/mini_serwer_LXD_z_\305\202\304\205czno\305\233ci\304\205_bezprzewodow\304\205_na_Raspberry_Pi.html" "b/articles/raspberrypi/mini_serwer_LXD_z_\305\202\304\205czno\305\233ci\304\205_bezprzewodow\304\205_na_Raspberry_Pi.html" new file mode 100644 index 0000000..fcb31cd --- /dev/null +++ "b/articles/raspberrypi/mini_serwer_LXD_z_\305\202\304\205czno\305\233ci\304\205_bezprzewodow\304\205_na_Raspberry_Pi.html" @@ -0,0 +1,320 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + +
+

Mini serwer LXD z łącznością bezprzewodową na Raspberry Pi

+

+ Kiedy nie mamy miejsca w domu na prawdziwy serwer, a chcemy pobawić się kontenerami, to jako alternatywy możemy użyć Raspberry Pi. Po poza samą usługą LXD/LXC do dałem jeszcze funkcję AP, aby można było podłączyć się do niego bez kabli. +

+
    +
  1. Dysk twardy +

    + Do realizacji tego zadania, przyda nam się dysk twardy czy to HDD 2,5 czy 3,5" czy SSD. Obecnie Raspberry od wersji 2 drugie wspiera bootowanie z USB, przy wersji 4 należy na początku uruchomić komputer z karty następnie z aktualizować bootloader i również będzie taka możliwość. +

    +
  2. +
  3. Pierwsze czynności po załadowaniu nowego systemu +

    + Zaraz po zalogowaniu do świeżego systemu, należało by zmienić domyślne hasło. +

    +
    +$ passwd
    +
    +

    + Podajemy obecne hasło: raspberry, oraz ustalamy nowe. Następną czynnością jest ustawienie lokalizacji działania sieci bezprzewodowej. Każdy kraj na własne regulacje prawne odnośnie wykorzystania pasma ISM (2,4GHz), dlatego też interfejs sieci bezprzewodowej w RPI jest zablokowany przez rfkill, dopóki nie ustawimy kraju, w którym będziemy z niej korzystać. Uruchamiamy $ sudo raspi-config, następnie wybieramy 4 Localisation Options -> I4 Change Wi-Fi Country -> PL Poland potwierdzamy OK. Zostaniemy poinformowani o ustawieniu lokalizacji. +

    +
  4. +
  5. Aktualizacja systemu +

    + Teraz zainstalujemy aktualizacje systemu i przejdziemy do konfiguracji połączenia z Internetem. +

    +
    +$ sudo apt update
    +$ sudo apt upgrade
    +
    +
  6. +
  7. Konfigurowanie dostępu do internetu. +

    + Możemy pozostawić to takie jakie jest, czyli dostęp realizowany po kablu. Jednak traci to trochę na mobilności. Dlatego proponuje dołożyć drugą kartę bezprzewodową, aby również połączenie z internetem odbywało się za pomocą sieci bezprzewodowej. W moim przypadku użyłem TP-Link Archer T2U. Karta jest dwuzakresowa jednak nie działa out of box z RasPiOS, jeśli chcemy jej użyć musimy wykonać poniższe czynności. +

    +
      +
    1. Pobieramy paczke oficjalnego firmware-u i przechodzimy do pobranego katalogu (jeśli nie ma git, to instalujemy go z repozytorium $ sudo apt instal git). +
      +  $ git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
      +
      +  $ cd linux-firmware
      +
    2. +
    3. Tworzymy katalog 'mediatek' na /lib/firmware. +
      +$ sudo mkdir /lib/firmware/mediatek
      +
      +
    4. +
    5. Kopiujemy sterownik do naszego nowo utworzonego katalogu. +
      +$ sudo cp mediatek/mt7610u.bin /lib/firmware/mediatek/
      +
      +
    6. +
    7. Usuwamy niekompatybilny moduł z jądra systemu. +
      +$ sudo rmmod mt76x0
      +
      +

      + Gdyby pojawił się taki komunikat o błedzie: +

      +

      +rmmod: ERROR: ../libkmod/libkmod.c:514 lookup_builtin_file() could not open builtin file '/lib/modules/4.19.97-v7+/modules.builtin.bin'
      +
      +

      + To należy zresetować malinkę: $ sudo reboot +

      +
    8. +
    9. Dodajemy nowy moduł do jądra. +
      +$ sudo modprobe mt76x0
      +
      +
    10. +
    +

    + Po wprowadzeniu powyższych czynności karta powinna już działać, można to przetestować skanując sieci bezprzewodowe. +

    +
    +$ sudo iwlist wlan1 scan
    +
    +
  8. +
  9. Konfiguracja interfejsu AP +

    + Aby wybudowany interfejs sieci bezprzewodowej mógł być punktem dostępu musi mieć adress ip, które jednocześnie będzie bramą dla jego sieci. Aby nadać mu adres IP w pliku /etc/dhcpcd.conf na samym dole dopisujemy poniższe opcje: +

    +
    +interface wlan0
    +static ip_address=192.168.4.1/24
    +nohook wpa_supplicant
    +
    +
  10. +
  11. Instalacja i konfiguracja serwera dhcp oraz demona punktu dostępu +

    + Do stworzenia sieci bezprzewodowej potrzebny jest serwer odpowiedzialny za przydział adresów IP oraz program który tak skonfiguruje wbudowaną kartę by rozgłaszała sygnał sieci. Instalujemy dwa pakiety: +

    +
    +$ sudo apt install hostapd dnsmasq
    +
    +

    + Zmieniamy nazwę pliku konfiguracyjnego dnsmasq dostarczonego wraz z pakietem, ponieważ nie będzie on nam potrzebny jednak warto go zachować gdyż może być bazą wiedzy na temat konfiguracji usługi. +

    +
    +$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.init
    +
    +

    + Tworzymy nowy plik i zapisujemy w nim poniższe linie, oczywiście adresy zakresu należy dobrać do adresu ustawionego na wlan0. +

    +
    +interface=wlan0
    +dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
    +
    +

    + Teraz należy zrestartować usługę. +

    +
    +$ sudo systemctl restart dnsmasq
    +
    +

    + Następnie przechodzimy do pliku konfiguracyjnego daemon hostapd. Plik ten najprawdopodobniej nie istnieje, więc do nowego pliku /etc/hostapd/hostapd.conf wpisujemy poniższą konfiguracje. +

    +
    +interface=wlan0
    +driver=nl80211
    +ssid=rpilxdsrv
    +hw_mode=g
    +channel=6
    +wmm_enabled=1
    +ieee80211n=1
    +macaddr_acl=0
    +auth_algs=1
    +ignore_broadcast_ssid=1
    +wpa=2
    +wpa_passphrase=123_LxD_123
    +wpa_key_mgmt=WPA-PSK
    +wpa_pairwise=TKIP
    +rsn_pairwise=CCMP
    +
    +

    + To nie koniec konfiguracji, otóż daemonowi należy jeszcze wskazać ścieżkę do pliku konfiguracjnego w pliku /etc/default/hostapd. Otwieramy plik, odszukujemy linie zawierajacą DAEMON_CONF="", usuwamy znajdujący się na początku znak komentarza, pomiędzy podwójnymi apostrofami umieszczamy ścieżkę do pliku. +

    +
    +DAEMON_CONF="/etc/hostapd/hostapd.conf"
    +
    +

    + Aby uruchmić usługę należy wydać poniższe polecenia. +

    +
    +$ sudo systemctl unmask hostapd
    +$ sudo systemctl enable hostapd
    +$ sudo systemctl start hostapd
    +
    +
  12. +
  13. NAT i przekazywanie pakietów +

    + Włączenie przekazywania pakietów na Raspberry Pi jest dziecinnie proste sprowadza się do usunięcia znaku komentarza z linii #net.ipv4.ip_forwarding=1 w pliku /etc/sysctl.conf. Uruchomienie NAT-u, to w sumie też jedno polecenie. +

    +
    +$ sudo iptables -t nat -A POSTROUTING -o <interfejs połączenia z internetem> -j MASQUERADE
    +
    +

    + Jednak kiedy uruchomimy ponownie nasze RPI, reguła NAT-u zniknie. Aby reguły iptables były stałe są zapisywane do pliku, a przy uruchomieniu systemu odtwarzane, aby to zrealizować musimy zainstalować pakiet iptables-persistent. +

    +
    +$ sudo apt install iptables-persistent
    +
    +

    + Podczas instalacji, zostaniemy zapytani o to czy zapisać istniejące już reguły. Możemy to zrobić. Przy każdym zapisie plik jest nadpisywany obecnie załdowanymi do iptables regułami. Reguły najlepiej zapisywać po każdej zmianie, poniżej znajduje się polecenie odpowiedzialne za ich przywrócenie, należy umieścić je w pliku /etc/rc.local przed linią exit 0. +

    +
    +iptables-restore < /etc/iptables/rules.v4
    +
    +
  14. +
  15. Połączenie z internetem +

    + Kiedy mamy już gotową bramkę pozostaje nam tylko połączyć się z Internetem, połączenie to będzie udostępniane przez nasz mikroserwer za pomocą sieci bezprzewodowej. Jeśli łączymy się po kablu, to tak naprawdę wystarczy go wpiąć i możemy przejść do kolejnego punktu. Jeśli połączenie będziemy realizować za pomocą sieci bezprzewodowej, to teraz się z taką siecią połączymy. Zestawianie połaczenia rozpoczynamy od znalezienia naszej sieci docelowej, skanowania dokonujemy za pomocą polecenia: +

    +
    +$ sudo iwlist wlan1 scan
    +
    +

    + Odszukujemy sieć do której chcemy się podłączyć następnie na podstawie zabezpieczeń sieci wybieramy z jedną z metod sparowania się. +

    +
      +
    • sieć otwarta - +
      +$ sudo iwconfig wlan1 essid "ssid"
      +
      +
    • +
    • WEP - +
      +$ sudo iwconfig wlan1 essid "ssid" key "kluczWEP"
      +
      +
    • +
    • WPA/WPA2 - +
      +$ sudo wpa_passphrase "ssid" "psk" | sudo tee /etc/wpa_supplicant/wpa_supplicant.conf
      +
      +$ sudo wpa_supplicant -B -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan1
      +
      +
    • +
    +

    + Bez względu na wybrany typ sieci, musimy pobrać z niej adres IP, co jest realizowane przez poniższe polecenie. +

    +
    +$ sudo dhclient wlan1
    +
    +

    + Z racji tego iż ta czynność będzie wykonywana za każdym razem gdy użytkownik będzie podłączał się do Internetu. Dnsmasq nie posiada adresu, na który mógłby przekazywać pakiety. Dnsmasq nie jest serwerem DNS sam w sobie. Jest tylko przekaźnikiem co nawet tłumaczy jego nazwa. Po pobraniu adresu IP z docelowej sieci, należy zrestartować dnsmasq, aby mógł wczytać ten adres i zapewnić swobodny dostęp do Internetu. +

    +
    +$ sudo systemctl restart dnsmasq
    +
    +

    + Powyższy sposób można zautomatyzować, o ile będziemy się łączyć przez cały czas z tą samą siecią. Dodajemy polecenie sparowania z siecią oraz polecenie pobrania adresu ip do pliku /etc/rc.local nad przywróceniem reguł iptables. +

    +
  16. +
  17. Instalacja LXD +

    + Aby zainstalować LXD, potrzebujemy znanego z Ubuntu managera pakietów snap oraz oprogramowania to tworzenia mostów. Instalujemy wymagane oprogramowanie. +

    +
    +$ sudo apt install snapd bridge-utils
    +
    +

    + Następnie instalujemy lxd oraz inny wymagany do uruchomienia czego kolwiek z snap pakiet. +

    +
    +$ sudo snap install core
    +$ sudo snap install lxd --channel=3.0/stable
    +
    +

    + Po zainstalowaniu dodajemy użytkownika pi do grupy lxd, za pomocą poniższego polecenia. +

    +
    +$ sudo usermod -aG lxd pi
    +
    +

    + Przelogowywujemy się na użytkownika root. +

    +
    +$ sudo su
    +
    +

    + Dodajemy tymczasowo /snap/bin do zmiennej PATH. +

    +
    +# export PATH=${PATH}:/snap/bin
    +
    +

    + Zatrzymujemy usługę 'dnsmasq'. +

    +
    +# systemctl stop dnsmasq
    +
    +

    + Inicjujemy LXD. +

    +
    +# lxd init
    +
    +

    + Opis poszczególnych pytań znajdziemy https://morketsmerke.net/articles/linux/instalacja_konterów_lxd.html. +

    +

    + Po zainicjowaniu LXD musimy dokonać małych zmian w konfiguracji naszego dnsmasq, otwieramy plik /etc/dnsmasq.conf, po opcji interface=wlan0 dopisujemy poniższe opcje. +

    +
    +except-interface=lxdbr0
    +bind-interfaces
    +
    +

    + Teraz możemy ponownie uruchomić dnsmasq. +

    +
    +# systemctl restart dnsmasq
    +
    +

    + Wylogowujemy się zupełnie z Raspberry, po to aby zmienna PATH się przeładowała. Po ponownym zalogowaniu możemy uruchomić nasz pierwszy kontener. +

    +
    +$ lxc launch ubuntu:18.04 <nazwa kontenera>
    +
    +
  18. +
+

+ Jak widać powyżej nie trzeba władać potężnymi serwera, aby móc korzystać z usług konteneryzacji. W tym przypadku jest LXD, ale równie dobrze może być np. Docker. +

+

+ ~xf0r3m +

+
+ + + + diff --git "a/articles/raspberrypi/pod\305\202\304\205czanie_7-calowego_ekranu_dotykowego_do_Raspberry_Pi.html" "b/articles/raspberrypi/pod\305\202\304\205czanie_7-calowego_ekranu_dotykowego_do_Raspberry_Pi.html" new file mode 100644 index 0000000..9008f76 --- /dev/null +++ "b/articles/raspberrypi/pod\305\202\304\205czanie_7-calowego_ekranu_dotykowego_do_Raspberry_Pi.html" @@ -0,0 +1,210 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + +
+

Podłączanie 7-calowego ekranu dotykowego (1024x600) do Raspberry Pi

+

+ W długi weekend majowy, kolega poprosił mnie podłączenie 7-calowego + wyświetlacza do Raspberry Pi. Oczywiście przez podłączenie należy + rozumieć fizczne podłączenie oraz skonfigurowanie systemu w taki sposób, + aby wyświetlał obraz, dopasowany do właściwości ekranu. + Mój zleceniodawca utknął przy ładowaniu środowiska + graficznego. Po powrocie do pracy, wziąłem od niego wyświetlacz i + przystąpiłem do działania, nie brałem jego maliny ponieważ chciałem + na początku sam dowiedzieć się jak to się podłącza. Na naprawę jego + konfiguracji przyjdzie jeszcze czas... +

+

+ Jak każdą świeżą zabawę z malinką, rozpoczynam od pobrania najnowszego + obrazu i załadowania go na kartę microSD. Dla celów testowych, najlepiej + użyć obrazu z preinstalowanym środowiskiem graficznym, najlepiej bez + zbędnego (rekomendowanego) oprogramowania. +

+
+  $ wget https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2022-04-07/2022-04-04-raspios-bullseye-armhf.img.xz
+  $ unxz 2022-04-04-raspios-bullseye-armhf.img.xz
+  $ sudo dd if=2022-04-04-raspios-bullseye-armhf.img bs=1M of=/dev/sdX status=progress
+
+

+ Na powyższym listingu /dev/sdX jest + plikiem urządzenia + reprezentującym podłączoną kartę microSD. Obraz po rozpakowaniu ma lekko + powyżej 4 gigabajtów. Po nagraniu obrazu, zanim włóżymy kartę do + urządzenia + możemy dokonać niezbędnych modyfikacji, tak aby nie trzeba było się + przełączać między ekranami. +

+

+ Zmian dokonujemy + w pliku config.txt na partycji boot. Na samym końcu + pliku zapisujemy poniższe linie. +

+
+max_usb_current=1
+hdmi_group=2
+hdmi_mode=87
+hdmi_cvt=1024 600 60 6 0 0 0
+hdmi_ignore_edid=0xa5000080
+config_hdmi_boost=2
+
+
    +
  • max_usb_current - załączenie + maksymalnego możliwego natężenia prądu na USB. Normalnie jest 600 mA, + jednak przy użyciu tej opcji, prąd wzrasata do 1,2 A.
  • +
  • hdmi_group - określa grupę + wyświetlaczy korzystających z HDMI. Na przykład telewizory oraz + monitory korzystają zupełnie innych standardów. Monitory podłączane + do komputerów jak i omawiany tutaj wyświetlacz należą do grupy + oznaczonej przez cyfrę 2.
  • +
  • hdmi_mode - definiuje domyślną + rodzielczość, odświeżanie oraz aspekt ekranu. Na stronie podanej + w źródłach znajduje się tabela z trybami HDMI dla grupy 2, nie ma tam + trybu 87. + Nadanie tej opcji takiej wartości, pozwoli użyć stworzonego przez opcję + hdmi_cvt tryby w drugiej grupie.
  • +
  • hdmi_cvt - umożliwia wpisanie + własnych ustawień standardu VESA CVT, dając możliwość + zdefiniowania rozdzielczości, + częstotliwości obrazu oraz jego formatu. Pozostałe trzy zera odnoszą + się głównie do cech ekranów kineskopowych i mogą zostać pominięte, + ponieważ w naszym przypadku są to domyślne wartości. Użycie tej opcji + wiąże się ze wskazaniem nowego trybu z pomocą opcji + hdmi_group oraz + hdmi_mode.
  • +
  • hdmi_ignore_edid - opcją załącza + ignorowanie danych identyfikacyjnych wyświetlacza, jeśli wyświetlacz + ich nie posiada. Użycie wartości 0xa5000080 + chroni tę opcję przed omyłkowym przełączeniem.
  • +
  • config_hdmi_boost - złacza + wzmocnienie sygnału HDMI. Ta wartość jest ignorowana przez Raspberry + Pi 4. W źródle podano konkretne przypadki, który należy użyć + odpowiednich wartości tej opcji.
  • +
+

+ Zapisujemy zmiany w pliku. Teraz możemy włożyć kartę do maliny a + następnie podłączyć nasz wyświetlacz. +

+

+ 7-calowych wyświetlaczy do RPi jest + dostępnych na rynku bardzo wiele, różnią się one rodzielczością oraz + ilością dostępnych złączy. Część z nich to po prostu chińskie klony + oryginalnego produktu marki WaveShare, i ja również otrzymałem + taki klon. Głowną różnicą są chyba złącza znajdujące się z tyłu + wyświetlacza. Wyświetlacz, który ja otrzymałem wyglądał mniej więcej + tak: +

+

+ 7-inch-display +

+

+ Mniej więcej, ponieważ zdjęcia nie zrobiłem, a obrazek powyżej jest tylko + zdjęciem poglądowym. Oryginalny wyświetlacz 7-calowy firmy + WaveShare został przedstawiony poniżej (przynajmniej jego tył). +

+

+ 7-inch-waveshare +

+

+ Istotną w naszym przypadku różnicą są złącza. W oryginalny wyświetlacz + mamy tylko jedno złącze USB, natomiast w klonie dwa i oba podpisane jako + "touch". Więc jeśli dysonujemy klonem Kabel USB + podłączamy po drugiego portu USB, nad przełącznikiem + "Backlight". Z HDMI to chyba wiadomo. Po podłączeniu + możemy uruchomić Raspberry. Po nieco dłuższym procesie uruchamiania, + na wyświetlaczu pojawi się fragment obrazu. Obraz wyświetlany przez + system operacyjny jest w znaczanie większej rozdzielczości niż + obsługiwana przez wyświetlacz. Serwer X Window, nie był wstanie dobrać + odpowiedniej rozdzielczości dlatego też musimy ją wymusić. Aby to zrobić + tworzymy mały skrypt powłoki z poniższych poleceń. Jednak przed + przystąpieniem do pisania skryptu należy jeszcze poznać nazwę wyjścia + wideo jaka figuruje na serwerze X Window, za pomocą polecenia + xrandr jesteśmy w stanie wypisać dostępne w systemie + wyjścia wideo, nazwy znajdują się na początku linii nad listą dostępnych + rozdzielczości dla danego wyświetlacza. W moim przypadku było to + HDMI-2. +

+
+#!/bin/bash
+
+xrandr --newmode "1024x600_60.00" 49.00 1024 1072 1168 1312 600 603 613 624 -hsync +vsync
+xrandr --addmode HDMI-2 1024x600_60.00
+xrandr --output HDMI-2 --mode 1024x60_60.00
+
+

+ Wartości użyte w poleceniu xrandr --newmode + zostały uzyskane za pomocą poniższego polecenia: +

+
+$ cvt 1024 600 60
+
+

+ Polecenie to generuje ustawienia obrazu w standardzie VESA CVT, + które są niezbędne przy tworzeniu niestandardowych trybów wyświetlania. + Niestety aby wyjaśnić kolejne wartości zwracane przez to polecenie, + trzeby by zagłegić się w lekturę standardu, co wykracza poza ramy tego + materiału. Najlepiej jest poprostu skopiować fragment wyjścia polecenia + cvt, do argumentu polecenia + xrandr --newmode. +

+

+ Skrypt zapisujemy pod wygodną dla nas nazwą, w miejscu gdzie nie zostanie + przypadkowo usunięty. Następnie, musimy zmusić system do tego aby + uruchomił on ten skrypt przed wyświetleniem użytkownikowi pulpitu. Do + tego posłużymy się plikiem /etc/xdg/lxsession/LXDE-pi/autostart. + Nad linią @xscreensaver -no-splash zapisujemy poniższą linię: +

+
+@lxterminal -e "<ścieżka_do_skryptu>"
+
+

+ Następnie zapisujemy zmiany, dla pewności możemy przekopiować również + ten plik do katalogu /etc/xdg/lxsession/LXDE, aby mieć pewność, + że na pewno się uruchomi. +

+

+ Teraz moży uruchomić ponownie Raspberry. Po uruchomieniu pulpit powinien + być idealnie dopasowany do używanego przez nas wyświetlacza. +

+

+ Źródła: +

    +
  1. Konfiguracja wyświetlania obrazu w pliku config.txt
  2. +
  3. Dokumentacja opcji w pliku /boot/config.txt
  4. +
  5. Zdjęcie chińskiego klona wyświetlacza WaveShare
  6. +
  7. Zdjęcie przedstawiające tył oryginalnego wyświetlacza
  8. +
  9. Scieżka do pliku autostartu
  10. +
  11. Co należy wpisać w pliku autostartu
  12. +
+

+

+ ~xf0r3m +

+
+ + + + diff --git "a/articles/raspberrypi/pod\305\202\304\205czanie_modu\305\202u_RDM_6300_do_Raspberry_Pi_oraz_odczyt_tagu_RFID.html" "b/articles/raspberrypi/pod\305\202\304\205czanie_modu\305\202u_RDM_6300_do_Raspberry_Pi_oraz_odczyt_tagu_RFID.html" new file mode 100644 index 0000000..d96c99f --- /dev/null +++ "b/articles/raspberrypi/pod\305\202\304\205czanie_modu\305\202u_RDM_6300_do_Raspberry_Pi_oraz_odczyt_tagu_RFID.html" @@ -0,0 +1,98 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + +
+

Podłączanie modułu RDM 6300 do Raspberry Pi oraz odczyt tagu RFID

+

+ Jedną z ciekawszych rzeczy jakie możemy podłączyć do Raspberry Pi jest moduł RDM6300 - RFID. Za jego pomocą możemy odczytać tag RFID ukryty na kartach lub brelokach, poźniej możemy go wykorzystać w innych programach. Przygotowałem materiał jak podłączyć czytnik i odczytać RFID tag. +

+
    +
  1. Nagrywamy obraz z RasPiOS na kartę microSD.
  2. +
  3. Wkładamy kartę do urządzenia, podłaczamy i logujemy się czy to lokalnie czy przez SSH.
  4. +
  5. Uruchamiamy program konfiguracji Raspberry Pi za pomocą poniższego polecenia: +
    +$ sudo rasp-config
    +
    +

    + Z opcji wybieramy kolejno Interfacing Options -> P6 Serial -> TAK/Yes. Na koniec potwierdzamy że chcemy zrestartować system. +

    +
  6. +
  7. Podłączamy nasz moduł wg. poniższego schematu:
    + Schemat podłączenia RDM6300 do Raspberry Pi +
  8. +
  9. Jeśli mamy zainstalowany pakiet picocom, możemy sprawdzić czy nasz moduł działa poprawnie. Wydajmy polecenie: +
    +$ sudo picocom /dev/serial0 -b 9600
    +
    +

    + Kiedy przyłożymy kartę czy brelok do anteny, powinniśmy na ekranie zobaczyć ciągi cyfr. Jeśli się wyświetlają oznacza to, że nasz moduł jest poprawnie podłączony i gotowy do pracy. +

    +
  10. +
  11. Zanim przejdziemy do odczytu tagu z karty/breloka musimy zainstalować bibliotekę python-serial, która umożliwi użycie kodu Pythona do komunikacji z linią szeregową. +
    +$ sudo apt install python-serial
    +
    +
  12. +
  13. Aby odczytać jednokrotnie tag z naszej karty, potrzeby będzie nam kod napisany w Pythonie, ja znalazłem bardzo podbny skrypt na jedej ze stron poświęconych właśnie podłączeniu RDM6300 do RPI. Lekko go przerobiłem, po to aby program oczekiwał na przyłożenie karty/breloka, odczytał RFID tag i zakończył działanie. Później taki możemy go wysłać np. potokiem do innego programu, w celu dalszego przetwarzania. +
    +import time
    +import serial
    +import RPi.GPIO as GPIO
    +GPIO.setmode(GPIO.BCM)
    +
    +PortRF = serial.Serial('/dev/serial0',9600)
    +ID = ""
    +read_byte = PortRF.read()
    +if read_byte=="\x02":
    +  for Counter in range(12):
    +    read_byte=PortRF.read()
    +    ID = ID + str(read_byte)
    +
    +print ID
    +
    +

    + Dla przykładu zapiszemy plik pod nazwą: RFID.py. Wywołanie programu jest banalnie proste wystarczy wydać polecenie. +

    +
    +$ sudo python RFID.py
    +
    +

    + Po przyłożeniu karty/breloka do anteny, powinniśmy zobaczyć tag RFID i program powinien zakończyć swoje działanie. +

    +
  14. +
+

+ Pomysł na RFID miał swój początek w pomyśle na manager haseł zbudowany na Raspberry Pi, hasła trzymałbym za pomocą programu pass, zaszyfrowane kluczem GPG. Hasłem do klucza byłby RFID TAG z breloka na przykład. Porzuciłem projekt, ale może kiedyś do niego wrócę. +

+

+ ~xf0r3m +

+
+ + + + diff --git "a/articles/raspberrypi/po\305\202\304\205czenie_z_Raspberry_Pi_Zero_przez_USB.html" "b/articles/raspberrypi/po\305\202\304\205czenie_z_Raspberry_Pi_Zero_przez_USB.html" new file mode 100644 index 0000000..57e4e39 --- /dev/null +++ "b/articles/raspberrypi/po\305\202\304\205czenie_z_Raspberry_Pi_Zero_przez_USB.html" @@ -0,0 +1,81 @@ + + + + + + + + +
+		     .~~.   .~~.
+		    '. \ ' ' / .'
+		     .~ .~~~..~.                       _                          _
+		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
+		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
+		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
+		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
+		    (  : '~' :  )
+		     '~ .~~~. ~'
+			 '~'
+		
+ + + +
+

Połączenie z Raspberry Pi Zero przez USB

+

+ Raspberry Pi Zero, to dziwny komputerek... Pozbawiony łączności, ze złączem mini-HDMI, oraz jednym portem micro-USB, jest nieco większy niż od listka gumy do żucia i kosztuje ok. 20 zł oczywiście w przeliczeniu $5 na złotówki, bo chyba w żadnym sklepie nie znajdziemy w tej cenie. Jeśli ktoś zaczyna swoją przygodę z tego rodzaju zabawkami, to może sobie sprawić coś takiego. I własnie tym materiałem udowodnie że poza kablem micro-USB (takim do przesyłania danych, nie tylko ładowania), kartą microSD i komputerem z GNU/Linux-em nie potrzebujemy innych akcesoriów, aby móc z niego korzystać. +

+
    +
  1. Wgrywamy system operacyjny na kartę możemy uzyć do tego programu Balena Etcher, lub klasycznego polecenia dd.
  2. +
  3. Po nagraniu systemu na kartę, pojawią nam się w systemie dwie dodatkowe partycje. Przechodzimy do partycji oznaczonej + jako boot.
  4. +
  5. Otwieramy plik config.txt i na samym dole dopisujemy dtoverlay=dwc2. Plik zapisujemy i zamykamy.
  6. +
  7. Otwieramy plik cmdline.txt i po słowie rootwait dopisujemy modules-load=dwc2,g_ether.
  8. +
  9. Bezpośrednio na partycji boot tworzymy nowy pusty plik o nazwie ssh.
  10. +
  11. Wyciągamy kartę, wkładamy ją do naszego RPI. Następnie kabel podłączamy do komputera i do portu USB Raspberry (to bardzo ważne)!
  12. +
  13. W systemie (Ubuntu 20.04 amd64), powinna pojawić się kolejna karta sieciowa. Jeśli pojawia się łaczenie oraz dostajemy + powiadomienie że Włączenie sieci nie powiodło się", musimy ustawić nasz interfejs na local-link. Jeśli używamy środowiska Gnome, to przechodzimy do Ustawienia -> Sieć -> przycisk opcji przy Ethernet (USB) -> zakładkę IPv4 -> Metoda IPv4: Tylko Local-Link -> + Zastosuj, następnie wyłączamy włączamy interfejs, klikając na przełącznik obok przycisku opcji. Teraz powinniśmy dostać jeden z adresów z tej klasy 169.254.X.Y/16 i moć się połączyć z RPI.
  14. +
  15. Łączymy sie z Raspberry przez SSH: +
    +$ ssh pi@raspberrypi.local
    +
  16. +
  17. Po zalogowaniu, powinniśmy od razu zmienić hasło. Zatem passwd. Po zmienia hasła przydałoby się połączenie z Internetem. Żeby chociaż zaktualizować system. Na nowej karcie terminala, na naszym komputerze uruchamiamy przekazywanie pakietów oraz za pomocą iptables załączamy NAT. Jeśli martwimy się o bałagan, to po zabawie z RPI, robimy reboot i wszystko wraca do normy. Załączenie przekazywania pakietów:
    +
    +
    +$ sudo sysctl net.ipv4.ip_forward=1
    +
    +

    + Włączenie NAT-u: +

    +
    +$ sudo iptables -t nat -I POSTROUTING -o <interfejs sieciowy naszego komputera> -j MASQUERADE
    +
    +

    + To jeszcze nie wszystkie czynności, aby RPI 0 miało dostęp do Internetu. Wydając polecenie ip a odszukujemy intefejsu 'usb0', zapamiętujemy, lub zapisujemy gdzieś przypisany mu adres. Następnie na Raspberry dodaje trasę bramy domyślnej wskazując właśnie ten adres. +

    +
    +$ sudo ip route add default via <adres interfejsu USB0 na naszym komputerze>
    +
    +

    + Po dodaniu bramy, możemy smiało wydawać polecenia: apt update oraz apt upgrade +

    +
  18. +
+

+ Jak widać na powyższych czynnościach nie potrzeba masy akcesoriów jakby się mogło wydawać patrząc na to jak niepozorne jest to urządzenie. Gdyby nie to że trzeba wlutować pinów do GPIO, to korzytał bym RPI Zero przy swoich projektach. +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/terminallog/BASH_bushido.html b/articles/terminallog/BASH_bushido.html new file mode 100755 index 0000000..f31ace4 --- /dev/null +++ b/articles/terminallog/BASH_bushido.html @@ -0,0 +1,1295 @@ + + + + + + + + + +
+
+

BASH Bushido

+
    +
  1. Skróty klawiszowe
  2. +
  3. Edytor Vi(m)
  4. +
  5. Konfiguracja BASH
  6. +
  7. Historia
  8. +
  9. Desygnatory oraz modyfikatory
  10. +
  11. Aliasy
  12. +
  13. Menadżer zadań w UNIX-ach
  14. +
  15. Fancy napisy w terminalu
  16. +
  17. Obsługa sieci
  18. +
  19. Porady i sztuczki
  20. +
  21. Emulatory terminala
  22. +
  23. Koniec
  24. +
+ +

+ Źródła: +

+
    +
  1. Bash Bushido - Aleksander Baranowski - https://alexbaranowski.github.io/bash-bushido-book/
  2. +
+ +
+
+
+
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ +
+

+ Artykuł ten przedstawia bardziej z optymalizowane wykorzystnie powłoki, a konkretnie BASH. Dzięki czemu możemy wykonać wiele czynności, które do tej pory wykonywaliśmy mozolnie klepiąc polecenia znacznie szybciej co pozwoli zaoszczędzić czas, który możemy przeznaczyć na cokolwiek innego niż zarządzanie maszynami z UNIX-em. +

+

1. Skróty klawiszowe

+

+ Kiedy zastanawiamy się nad skrótami klawiszowymi powłoki, to na myśl przychodzi nam jedno pytanie. Czy skróty nie są realizowane przez konkretny emulator terminala, z którego obecnie korzystamy? Otóż część skrótów, które zostaną tutaj przedstawione mogą zostać przechwycone przez środowisko graficzne a następnie/lub przez emulator terminala. W tym wypadku należy upewnić się, że te skróty w ww. programach są nam potrzebne i w przeciwnym razie je wyłączyć. Natomiast za obsługę skrótów, które działają nawet w konsoli serwera bez środowiska graficznego odpowiedzialna jest biblioteka GNU Readline. +

+

+ Kiedy mamy jakieś dziwne klawiatury lub często korzystamy z różnych komputerów lub konsol a mimo to chcemy zachować podobną prędkość obsługi powłoki poniżej znajdują się skróty klawiszowe, dzięki którym nie będziemy już potrzebować strzałek, entera, backspace-u oraz klawiszy home end i innych. Jedyne potrzebne nam klawisze to ctrl, poźniej ewentualnie alt. +

+
    +
  • ctrl + p - zamiennik strzałki w górę,
  • +
  • ctrl + n - zamiennik strzałki w dół,
  • +
  • ctrl + f - zamiennik strzałki w prawo,
  • +
  • ctrl + b - zamiennik strzałki w lewo,
  • +
  • ctrl + a - zamiennik klawisza home,
  • +
  • ctrl + e - zamiennik klawisza end,
  • +
  • ctrl + d - zamiennik klawisza delete,
  • +
  • ctrl + h - zamiennik klawisza backspace,
  • +
  • ctrl + j, + ctrl + m - zamiennik klawisza enter.
  • +
+

+ Za pomocą innych skrótów klawiszowych możemy przesuwać kursor wyraz po wyrazie, usuwać całe słowa a nawet część linii polecenia. +

+
    +
  • alt + f - przesunięcie kursora o jedno słowo w przód,
  • +
  • alt + b - przesunięcie kursora o jedno słowo w tył,
  • +
  • alt + d - usunięcie znaków od pozycji kursora do końca wyrazu,
  • +
  • ctrl + k - usunięcie tekstu od pozycji kursora do końca wiersza
  • +
  • ctrl + u - usunięcie tekstu od pozycji kursora do początku wiersza
  • +
+

+ GNU Readline obsługuje również inne skróty, które nie tylko polegają na poruszaniu się po linii polecenia. +

+
    +
  • ctrl + l - czyści ekran, działanie podobne do polecenia clear,
  • +
  • ctrl + r - wsteczne przeszukiwanie historii (klasyczne),
  • +
  • ctrl + x, ctrl + v - wyświetlenie wersji powłoki, musimy nacisnąć dwa skróty po kolei,
  • +
  • ctrl + 7 / ctrl + _ - wycofanie wpisywanego polecenia
  • +
  • ctrl + x, ctrl + e - wywołanie programu wskazanego w zmiennej środowiskowej EDITOR,
  • +
  • ctrl + alt + e - rozwiązanie podstawienia powłoki wykonanie oraz wstawienie wartość zwracanej przez podstawienia powłoki czyli polecnia umieszczone pomięzy ukośnymi apostrofami (``) lub nawiasami ze znakie dolara na początku ($()),
  • +
  • ctrl + x, * - rozwiązanie masek plików wewnątrz linii polecenia.
  • +
+

+ Wszystkie te skróty jest dostępne po wydaniu polecenia bind -P, jak czytać opisane tam skróty, otóż: +

+
    +
  • \C- = klawisz CTRL
  • +
  • \e = klawisz ESC
  • +
+

 

+

2. Edytor Vi(m)

+

+ Każdy edytor jest najlepszy, ale co odróżnia je od vi(m)? Nie są preinstalowane w każdym możliwym UNIX-ie o jakim pomyślimy. Wyjątkiem stanowi tu dystrybucja Gentoo, która na swoim ISO nie posiada vi(m). Implementacje vi mogą się różnić od siebie, np. na GNU/Linux-ach vi nie obsługuje poruszania kursorem w podczas edycji, z kolei w OpenBSD już tak, i to jest vi a nie vim. Poniżej umieszcze kilka poleceń vi(m). W tryb poleceń wchodzimy po przez naciśnięcie klawisza ESC, teraz możemy wydawać polecenia. +

+
    +
  • :q - wyście bez zapisu. Jeśli dokonaliśmy jakiś zmian w pliku, będziemy musieli potwierdzić wyjście wykrzyknikiem (:q!)
  • +
  • :wq / :x - wyjście i zapis
  • +
  • :w - zapis
  • +
  • :o ~/ścieżka_do_pliku - otworzenie pliku
  • +
+

+ Te polecenia działają niezależnie czy jest vi czy vim. Poniżej rzeczy, które działają tylko w vim. +

+
    +
  • :e ~/ścieżka_do_katalogu - uruchamia netrw (wtyczka) jest czymś w rodzaju bardzo skromnego manedżera plików.
  • +
  • :o [protokół]://użytkownik@host[:port]/ścieżka_do_pliku - otwiera plik zdalny, podczas stosowania tego rozwiązania, należy wspomnieć, że jeśli podajemy ścieżkę bezwzględną to trzeba poprzedzić ją jeszcze jednym ukośnikiem (proto://user@host//etc/ssh/sshd_config).
  • +
+

+ Uruchomienie netrw, można wywołać podając w linii polecenia vim katalog. Znacznie więcej informacji nt. vim oraz samouczek możemy uzyskać za pomocą polecenia vimtutor, jak i również wydając polecenie vi :help. +

+

 

+

3. Konfiguracja BASH-a

+

Znak zachęty (prompt)

+

+ Znak zachęty naszej powłoki jest ustalany za pomocą wzorca zapisanego w zmiennej PS1 zdefiniowanej w pliku .bashrc w naszym katalogu domowym, inny znak możemy zdefiniować dla nowych użytkowników edytując plik /etc/skel/.bashrc lub domyślny znak zachęty dla całego systemu w pliku /etc/bash.bashrc. Jak już wcześniej wspomniałem znak zachęty ustalamy przy pomocy wzorca. Poniżej znajduje się lista elementów z jakich możemy taki wzorzec stworzyć. +

+
    +
  • \u - nazwa użytkownika
  • +
  • \h - hostname
  • +
  • \H - FQDN
  • +
  • \s - nazwa powłoki
  • +
  • \v - wersja powłoki
  • +
  • \V - bardziej szczegółowa wersja powłoki
  • +
  • \w - scieżka do obecnego katalogu
  • +
  • \W - nazwa obecnego katalogu
  • +
+

+ Podczas tworzenia wzorca możemy wybrane przez nas elementy możemy wyróżnić, za pomocą 8 kolorów. Te kolory możemy mieszać ze sobą wykorzystując jeden na pierwszym planie a drugi natomiast umieścić w tle. Poniżej znajdują się kody kolorów. +

+
    +
  • czerwony - pierwszy plan: 31, + tło: 41
  • +
  • zielony - pierwszy plan: 32, + tło: 42
  • +
  • niebieski - pierwszy plan: 34, + tło: 44
  • +
  • żółty - pierwszy plan:33, + tło: 43
  • +
  • cyjan - pierwszy plan: 36, + tło: 46
  • +
  • magenta - pierwszy plan: 35, + tło: 45
  • +
  • czarny - pierwszy plan: 30, + tło: 40
  • +
  • biały - pierwszy plan: 37, + tło: 47
  • +
+

+ Natomiast sam wzorzec znaku zachęty wygląda następująco, +

+
+\[\e[<kolor_pierwszego_planu>;<kolor_tła>m\]<element>\[\e[m\]
+
+

+ Warto zaznaczyć że kolor tła jest opcjonalny. +

+
+

Polecenie zachęty

+

+ BASH daje nam do konfiguracji ciekawą rzecz. Możemy za pomocą jednej zmiennej zdefiniować polecenie, które będzie wykonywane zawsze przed pojawieniem się znaku zachęty. Zmienną PROMPT_COMMAND możemy zadeklarować w pliku .bashrc lub co w tym przypadku może okazać się lepszym rozwiązaniem, wyeksportować zmienną aby można było z niej korzystać w tej samej powłoce. +

+
+$ export PROMPT_COMMAND='date +%F-%T | tr -d "\n"'
+
+

+ Użycie tego polecenia spowoduje wyświetlenie pełnej daty wraz z czasem przed każdym znakiem zachęty. +

+
+

Własne skróty klawiszowe GNU Readline

+

+ Pamietając ze wcześniejszych akapitów o poleceniu bind, które wraz z przełącznikiem -P wyświetli nam wszystkie dostępne już skróty, to za jego pomocą możemy utworzyć również własne mapowania kombinacji klawiszy nakonkretne polecenia. Znając wartości cytowane dla klawiszy CTRL oraz ESC/ALT, zadanie jest banalne. Wystarczy wydać konkretne polecenie. Jednak przed tym warto jednak upewnić się czy dany skrót nie jest już wykorzystywany. Jeśli rzeczywiście tak jest to dopisanie do skrótu kolejniej czynności spowoduje wywołanie tych dwóch akcji jednocześnie, co może mieć niekorzystne skutki. Aby upewnić się czy rzeczywiście dany skrót jest nie używany wydamy polecnie bind -P wraz z przekierowaniem wyjścia za pomocą potoku do polecenia grep wraz ze wzorcem przestawiającym dany skrót np. ctrl + v: '\C-v'. Dzieki temu zostaną nam wyświeltlone wszystkie akcje, które wykorzytują ten skrót. +

+

+ Same skróty tworzymy rownież za pomocą polecenia bind. +

+
+$ bind '"\006":"mc\n"'
+
+

+ To polecnie spowoduje dodanie do skrótów w naszym systemie, skrótu klawiszowego ctrl + f wywołującego polecenie uruchamiające program Midnight Commander. +

+

+ Polecenie bind przyjmuje jeden argument. Jest to ciąg znaków, który jest podzielony na dwie częsci, jedną częścią jest symbol cytowania danej kombinacji klawiszy, może on być trochę dziwny, jak ten wymieniony w przykładzie \006 jest niczym innym jak ctrl + f. Drugą częścia jest czynność jaka ma zostać wykonana po wciśnieciu danej kombinacji klawiszy. Warto zwrócić uwagę na to, że za poleceniem stoi znak przejścia do nowej linii (\n), powoduje on zatwierdzenie tego polecenia zaraz po jego podstawieniu w linii polecenia po naciśnięciu odpowiedniej sekwencji klawiszy. Wróćmy jednak do tego niezrozumiałego symbolu z pierwszej części argumentu polecenia. Taki symbol możemy uzyskać naciskąjac wybraną sekwencje klawiszy w trybie cytowania. Tryb cytowania możemy wywołać skrótem ctrl + v. + Po wciśnięciu kombinacji ctrl + v, naciskamy odpowiednią sekwencje klawiszy, zatwierdzamy linię polecenia. Powłoka powinna zwrócić: bash: $'\006': nie znaleziono polecenia pomiędzy pojedyńczymi apostrofami znajduje się nasz symbol cytowania. W trybie cytowania możemy odnajdować symbole dla sekwencji z klawiszem alt/esc (użycie tych klawiszy w sekwencjach daje takie same symbole cytowania) lub ctrl. Użycie polecenia bind w danej powłoce utrzymuje skróty do momentu jej zamknięcia, aby nasze skróty zostały utrwalone musimy dodać ich definicje do pliku .bashrc. Definicje są identyczne jak wydawane polecenia bind w powłoce, po prostu wpisuje do pliku polecenie bind następnie definicje skrótu. Odnośnie skrótów, to jest pewna uwaga. Otóż nie wszystkie sekwencje z klawiszem ctrl chcą działać. Wiele znich jest na stałe przypisanych do funkcji systemowych, dlatego też bezpieczeniej korzystać z klawisza alt. +

+
+

Powrót do poprzedniego katalogu

+

+ Powrót od poprzedniego katalog jest łatwy. O ile te katalogi występują po sobie. Wówczas wykorzystujemy polecenie cd ścieżka_do_katlogu oraz cd -, gdzie minus (-) oznacza poprzedni katalog, w którym się znajdowaliśmy. W wiekszości przypadków to wystarcza. Co jeśli chcemy się przenieść do katalogu, który był przed poprzednim? Z pomocą przychodzą nam polecenia pushd oraz popd. Te polecenia powodują odłożenie lub usunięcie ścieżki z konstrukcji stosu. Dzieki czemu możemy skakać z jednego miejsca w systemie na drugie i z powrotem, jednym poleceniem. To samo można zrealizować za pomocą polecenia cd z minusem. + Jednak to polecenie nie pozwala na odłożenie innych ścieżek na później, jeśli przestajemy pracować z jedną ścieżką możemy ją wyrzucić poleceniem popd (po wykonaniu tego polecenia zostaniemy przeniesieni na poprzednią ścieżkę na stosie), i następnie swobodnie przenościć się pomiędzy dwoma pozostałymi ścieżkami za pomocą polecenia pushd. +

+

+ Poleceń pushd, popd, można używać zamiennie do cd oraz cd -, z tą różnią że możemy cofnąć się znacznie dalej niż tylko na poprzednią ściężkę, ale również na poprzednią poprzedniej itd. Inny poleceniem związanym z stosem katalogów jest dirs, które zwraca nam katalogi, które znajdują się na stosie. +

+
+

Dodatkowe ustawienia powłoki

+

+ Bash posiada dość niepozorne wbudowane polecenie, którym możemy zmienić zachowanie naszej powłoki. Tym poleceniem jest shopt. Wydając to polecenie bez żadnych argumentów możemy dowiedzieć się co możemy zmienić za jego pomocą w powłoce. Jedną z ciekawszych opcji jest autocd, dzięki któremu możemy podawać same ścieżki w linii polecenia, w ten czas zostaniemy przeniesieni na tą ścieżke. Ustawienia opcji obywa się poprzez wydanie polecenia shopt wraz z przełącznikiem -s oraz nazwą opcji. Wyłącznie opcji jest analogiczne tylko zamiast -s jest -u. Aby dowiedzieć się więcej o shopt warto odwiedzić poświęconą mu sekcję na stronie podręcznika powłoki BASH wrozdziale "Wbudowane polecenia powłoki". +

+

+

 

+

4. Historia

+

+ Historią w powłoce BASH (ale nie i tylko), nazywamy listę poleceń, która zawiera wszyskie do tej pory wprowadzone w powłoce polecenia. Ta lista jest przechowywamna w specjalnym pliku, w katalogu głównym użytkownika. Historia może przyspieszyć nasze codzienne rutynowe zadania wykonywane w powłoce. Ponieważ zamiast klepać na nowo te same polecenia, możemy cofnąć się za pomocą strzałki w górę kombinacji klawiszy ctrl + p i tak długo naciskać ten skrót aż dostaniemy nasze polecenie oraz skrótu ctrl + n przeszukać historię choć jest znacznie bardzie efektywny sposób na wyszukiwanie poleceń mianowicie przeszukanie historii w tył, niestety wadą tego rozwiązania jest to że musimy znać fragment polecenia lub kojarzyć czego mogło dotyczyć, potrzebna jest jakaś fraza aby je wyszukać. Za wyświetlenie całej historii odpowiedzialne jest polecenie history. +

+

+ Wykonajmy teraz mały eksperyment, uruchom powłokę i wydajmy jakieś nieszkodliwe polecenie np. pwd, teraz uruchomimy drugie okno z połoką, kiedy naciśniemy ctrl + p, okazuje się że nie ma polecenie, którego użyliśmy w poprzeniej powłoce. Historia danej sesji terminala (bo tak możemy nazwać czas spędzony przed pojedyńczym procesem powłoki), trafa do czegoś w rodzaju pamięci powłoki, dopóki nie zakończymy sesji nie zostanie ona utrwalona. Co może być nieco irytujące kiedy korzystamy z wielu połączeń z tym samym serwerem. Jednak tym zajmiemy się za chwilę. + Kiedy na danej powłoce historia jest włączona, a my chcemy zatrzeć ślady obecności w systemie, możemy wyczyścić pamięć tej sesji wydając polecenie history z przełącznikiem -c i jeśli będziemy dalej pracować możemy przywrócić pamięć z pliku historii a jeśli nie to możemy się po prostu wylogować, jedyne co pozostanie w historii z tej sesji to polecenie exit. +

+

+ Historia musi być gdzieś przechowywana skoro można ją bez problemu przywrócić, i owszem historia przechowywana jest w pliku, plik ten jest wskazywany przez zmienną środowiskową HISTFILE. Najczęściej wskazuje na /home/<username>/.bash_history. Przekierowanie do niego pustego polecenia echo usunie dotychczasową historię całkowicie. Plik ten jest również ograniczony liczbą wierszy jakie może przechowywać, po osiągnięciu tej wartości najstarsze wpisy są usuwane, aby zrobić miejsce najnowszym. Ilość wierszy jest przechowywana w zmiennej środowiskowej HISTSIZE. Jak permanentnie wyłączyć historię? Otóż w bardzo prosty sposób. Ustawiając HISTFILE na /dev/null natomiast ilość wpisów historii w pamięci sesji (zmienna HISTSIZE) na 0. +

+

+ Wróćmy do przypadku wielu połączeń z serwerem z jednego komputera. Polecenie history posiada jeszcze jeden ważny przełącznik, mianowicie -a. Wydanie polecenia history z tym przełącznikiem powoduje dopisanie poleceń zebranych w pamięci do pliku historii. Jednak użycie tego przełącznika aby zadziałało wymaga zmiany zachowania powłoki, musimy przełączyć za pomocą polecenia shopt opcję histappend, na oby dwu oknach. +

+
+$ shopt -s histappend
+
+

+ Wykonując sekwencje poleceń w obu oknach, w postaci: dopisania zawartości pamięci do pliku; wyczyszczenia pamięci z historii oraz jej przywrócenia możemy w ten sposób zsynchronizować w historię w pamięci między różnymi sesjami terminala. Proces ten można zautomatyzować, umieszczając jego wykonanie przed pojawieniem się znaku zachęty, czyli umieszczeniu trzech poleceń oddzielonych średnikami w zmiennej PROMPT_COMMAND, tak jak poniżej: +

+
+$ export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
+
+

+ Odwołanie się do PROMPT_COMMAND spowoduje że jeśli coś do tej pory znajdowało się w PROMPT_COMMAND pozostanie ono na swoim miejscu. Użycie w tym wypadku polecenia export oznacza że zmiany w PROMPT_COMMAND są tylko tymczasowe. Aby zapisać to że historia się synchronizuje między sesjami, należy na stałe zmienić wartość zmiennej PROMPT_COMMAND w pliku ~/.bashrc (tylda, oznacza katalog domowy). +

+

+ Wróćmy teraz do wylistowania historii za pomocą polecenia history. Listing składa się z dwóch kolumn. Tak jakby z identyfikatora z wystąpienia zdarzenia (polecenia) oraz z samego polecenia. Do pełnej historii brakuje jednak informacji na temat tego kiedy dane polecenie zostało wydane, nie wiem jak to jest w innych dystrybucjach to w GNU/Linux Debian zmienna środowiskowa HISTTIMEFORMAT jest pusta. Nadając jej wartość podobną formatem do tego jak podajemy argument poleceniu date. +

+$ export HISTTIMEFORMAT="%Y-%m-%d %T"
+
+

+ Ustawienie tej opcji może wprowadzić nas w małe zakłopotanie, kiedy po jej ustawieniu wprowadzimy kilka poleceń, wylistujemy sobie historię i wszystko wydaje się na pierwszy rzut oka w porządku, zapiszemy sobie więc to polecenie do pliku ~/.bashrc, kiedy wylogujemy się i zalogujemy się ponownie, następnie znów wylistujemy historię czasy/daty przestaną się zgadzać, okaże się że czas poleceń wydanych przed uruchomieniem opcji formatu czasu jest zbliżony do czasu wydanie polecenia history w tej powłoce, a zatem jest on późniejszy od czasu poleceń wydanych w poprzedniej sesji po uruchomieniu formatu czasu. Skąd to się wzięło? Otóż jeśli w pliku historii nie znacznika czasu to powłoka ładując go pamięci jako znacznika dla tych poleceń użycje czasu własnego startu. +

+

+ Przyjrzymy się teraz przechowywaniu historii. W BASH możemy łatwo określić ilość przechowywanych przez powłokę (czy to w pamięci, czy w pliku historii) wpisów historii. Za ilość w wpisów przechowywanych w pamięci sesji odpowiada poznana już przez nas zmienna środowiskowa HISTSIZE. Z kolei za wielkość pliku historii odpowiada zmienna HISTFILESIZE. Za ich pomocą możemy kontrolować ilość zapisywanej przez sesje historii. +

+

+ To co ma trafić do historii może być kontrolowane, służy do tego zmienna środowiskowa HISTCONTROL, przeważnie posiada ona wartość ignoreboth. Oznacza ona że do historii nie trafią polecenie powielone (występujące po sobie), które znajdują się już historii oraz te polecenia rozpoczynające się od spacji. Poniżej znajduje się lista możliwych wartości: +

+
    +
  • Brak wartości lub wartość niepoprawna - brak ograniczeń w historii.
  • +
  • ignorespace - polecenie rozpoczynające się od spacji nie zostaną zapisane + w historii
  • +
  • ignoredups - polecenie powielone (występujące po sobie) nie będą zapisywane + w historii
  • +
  • erasedups - usuwa wszystkie wpisy pasujące do poprzedniego polecenia
  • +
  • ignoreboth - ignorespace + ignoreboth
  • +
+

+ Warto wspomnieć że wartość tej zmiennej jest listą, której elementy są rozdzielane dwukropekiem (:), więc wartości możemy łączyć ze sobą. Zatem zamiast używać "ignoreboth" możemy użyć "ignorespace:ignoreboth". +

+

+ Ostatnią rzeczą z historii pozostało poniekąd również zgadnienie odnośnie kontroli - co ma zostać zapisane w historii. Tą rzeczą jest zmienna HISTIGNORE. W jej wartości możem podać najczęściej używane polecenia, aby nie zaśmiecać sobie historii poleceniam typu cd lub ls. Rzeczą o której należy pamiętać jest to aby podać symbol wieloznaczności (*) zaraz po poleceniu, spowoduje to przypasowanie poleceń, które zawierają jakiekolwiek argumenty a nie tylko samych poleceń, u niektórych użytkowników HISTIGNORE może wyglądać tak: +

+
+$ export HISTIGNORE="cd*:history:htop:ls*:ll*:la:l:popd:pushd*:top"
+
+

 

+

5. Desygnatory słów i zdarzeń oraz modyfikatory

+

+ Pierwszym opisanym tutaj zagadnieniem będzie desygnator zdarzenia, który składa się wykrzyknika (!) oraz numeru linii z historii. Można stwierdzić że jest to jeden ze sposobów na wywołanie polecenia z historii, należy jednak znać numery linii interesujących nas poleceń, można sobie wylistować historię a następnie odfiltrować część informacji zwrotnych za pomocą polecenia grep. Z desygnatorem zdarzeń wiąże się również pewna sztuczka, otóż desygnator ostatniego zdarzenia wygląda następująco: !! - dwa wykrzykniki. Czasmi musimy wykonać w powłoce pewne zadania administracyjne. Wymagają one zazwyczaj podniesienia uprawnień. Jak wiemy uprawnienia jednorazowo podnosimy za pomoca polecenia sudo. Często jest jednak tak że wydajemy polecenia administracyjne bez sudo wtedy otrzymujemy komunikaty od systemu o braku dostępu. + Możemy oczywiście wybrać ponownie to polecenie z historii następnie za pomocą skrótu przenieść się na początek linii, następnie dopisać sudo i zatwierdzić je jeszcze raz. Jest jednak prostszy sposób:
+

+
+$ sudo !!
+
+

+ Powyższy zapis jest równoznaczny z wyżej wymienioną czynnościa, prawda że łatwiejszy? Chociaż bez wprawy w powyższej sztucze nasz mózg będzie i tak podpowiadał nam aby dopisać to sudo na początku linii. Wracając jeszcze do desygnatora zdarzenia to jego wartością nie jest tylko numer linii w historii może on przyjąć w sumie 4 wartości: +

+
    +
  • !1(liczba dodatnia) - numer linii w historii liczony od jej początku.
  • +
  • !-1(liczba ujemna) - numer linii w historii liczony od jej końca.
  • +
  • !ciąg_znaków - ciąg znaków rozpoczynający polecenie.
  • +
  • !?ciąg_znaków? - ciąg znaków zawarty w poleceniu.
  • +
+

+ Patrząc na polecenie zapisane w linii poleceń, widzimy nazwę programu oraz przekazywane mu argumenty jednak z poziomu przetwarzania tekstów jest to lista słów rozpoczynająca się od 0, które możemy dowolnie wybierać z konkretnych wpisów z historii i co lepsze umieszczać tak zwane desygnatory słów jako elementy składowe nowej linii polecenia. Na desygnator słowa składa się desygnator zdarzenia oraz odzielony dwukropkiem (:) selektor konkretnego słowa, selektorów BASH oferuje wiele. +

+
    +
  • 0 - zerowe słowo przeważnie wywoływany program (polecenie)
  • +
  • n - n-te słowo
  • +
  • ^ - pierwszy argument polecenia
  • +
  • $ - ostatni argument polecenia
  • +
  • x-y - zakres słów, x można pominąć (-y) w ten czas + jest interpretowane jako \0-y.
  • +
  • * - wszystkie słowa poza zerowym, jest zamiennikiem 1-$, + jeśli zdarzenie zawiera tylko nazwę polecenia (programu) zostanie + zwrócony pusty ciąg znaków
  • +
  • x* - od konkretnego słowa do końca linii.
  • +
  • x- - od konkretnego słowa do przedostatniego włącznie
  • +
+

+ Wśród desygnatorów słów panuje taka zasada że jeśli przy desygnatorze zdarzenia nie zostanie podany numer linii w historii, to zostanie użyty ostatnio dodany wpis do historii. +

+

+ Oprócz desygnatorów słów lub wraz z, do jeszcze lepszego dostosowania linii pobranej z historii dzięki desygnatorowi zdarzenia, możemy użyć modyfikatorów. Są to dodatkowe czynności wykonywane przez powłokę aby jeszcze bardzie móc wykorzystać już raz wpisane polecenia. Modyfikatorów używa się tak samo jak desygnatorów słów, po dwukropku, po albo samym desygnatora zdarzenia albo desygnatora słowa albo po innym modyfikatorze. Poniżej znajduje się model składni podczas używania desygnatorów zdarzenia: +

+
+![numer,ciąg_znaków,!]:[desygnator_słów]:[modyfikator1]:[modyfikator2]...
+
+

+ Lista dostępnych modyfikatorów: +

+
    +
  • h - ze ścieżki do pliku usuwa nazwę pliku pozostawiając tylko samą ścieżkę dostępu,
  • +
  • t - ze ścieżki do pliku usuwa ścieżkę dostępu pozostawiając samą nazwę pliku,
  • +
  • r - z nazwy pliku usuwa rozszerzenie pozostawiając tylko nazwę właściwą,
  • +
  • e - usuwa z nazwy pliku nazwę właściwą pozostawiając tylko rozszerzenie,
  • +
  • p - wyświetla gotowe polecenie, ale go nie wykonuje,
  • +
  • q - umieszcza gotowe słowa w pojedyńczych cudzysłowach,
  • +
  • x - umieszcza gotowe słowa w pojedyńczych cudzysłowach, rozdzielając je na kolejne słowa przy spacjach oraz znakach nowego wiersza,
  • +
  • s/old/new - zamiana old na new,
  • +
  • & - powtarza zmianę dokonaną przez s/old/new, ile &tyle razy zostanie powtórzona zmiana,
  • +
  • g - (stosowane wraz z s/old/new) stosuje zamianę s/old/new + każdego wystąpienie wartości old na wartość new. Zastosowanie: :gs/old/new,
  • +
  • G - (stosowanie wraz z s/old/new/) stosuje zamianę s/old/new każdego wystąpienia wartości old na new przynajmniej raz w każdym słowie.
  • +
+

+ + Odnośnie opcji G, to jeśli zostanie ona skierowana wraz z s/old/new, do pracy na jednym słowie, to wyniki może być nie co dziwny. Ponieważ jeśli zostanie odnalezionych więcej niż jeden elementów old, w słowie to tylko dwa zostaną zmienione. Wynika z tego że jeden z samego modyfikatora s a drugi z G. + +

+

+ Jeśli musimy na szybko zmienić coś w poprzednim poleceniu, to BASH wprowadza skrót: ^old^new^, działa jak modyfikator s wraz z desygnatorem zdarzenia, ale bez zbędnego desygnatora zdarzenia oraz konstrukcji modyfikatora. Wystarczy wpisać w linii polecenia np. ^sduo^sudo^. Warto zaznaczyć, że wraz tą konstrukcją możemy używać innych modyfikatorów takich jak np. :&, aby powtórzyć zamianę wartości. +

+

+ Wróćmy do historii, to zagadnienie nie było by dokońca zrozumiałe bez wcześniejszego opisu desygnatorów oraz modyfikatorów. W BASH istnieje zmienna histchars (nie jest ona zmienną środowiskową, jest po prostu zmienną powłoki, zapisaną małymi literami bez potrzeby poprzedzania jej definicji poleceniem export), w której to możemy zdefiniować znaki używane w historii. Histchars składa się z trzech znaków i każdy z nich coś oznacza. +

+
    +
  • znak desygnatora zdarzenia - !(wykrzyknik)
  • +
  • znak szybkiej zmiany - ^(kareta/daszek)
  • +
  • znak komentarza - #(kratka/krzyżyk)
  • +
+

+ Te symbole możemy zmieniać właśnie dzięki histchars. Podając je razem jako wartość zmiennej histchars, np. +

+
+$ histchars="+=@"
+$ echo test
+test
+$ ++
+echo test
+test
+$ =t=1
+echo 1est
+1est
+
+

+ Przy stosowaniu tej zmiennej warto pamiętać o innych znaczeniach użwanych przez nas znaków w powłoce. +

+

+ Podstawienie historii (inaczej desygnator zdarzeń) możemy wyłączyć na dwa sposoby. Pierwszy sposób to nadanie pustej wartości zmiennej histchars: +

+
+$ histchars=
+
+

+ lub zmienić zachowanie powłoki za pomocą polecenia set: +

+
+/* Wyłączając */
+$ set +o histexpand
+/* Włączając z powrotem */
+$ set -o histexpand
+
+

+ Jednak w wiekszości przypadków, nie potrzeba tego robić ponieważ ! (wykrzyknik) nie jest rozpoznawany w ciągach jako desygnator zdarzeń (przynajmniej w GNU/Linux Debian). +

+

+ Biorąc pod uwagę to ile jest tu materiału, wypisze poniżej to co jest najczęściej stosowane i czego + warto sie nauczyć: +

+
    +
  • sztuczka z sudo: sudo !!,
  • +
  • szybkie podstawienia: ^old^new^
  • +
  • desygnatory zdarzeń: ![liczba], !-[liczba], !ciąg_znaków, !?ciag_znakow?
  • +
+

 

+

6. Aliasy

+

+ Aliasy inaczej nazwy zamienne stosowane najczęściej gdy chcemy zawrzeć długie polecenie w krótkiej przyjaznej nazwie. Aliasy są umieszczane w plikach konfiguracyjnych powłoki aby miały jakiś sens. Tworzenie aliasów w sesji powłoki raczej nie ma sensu. Czemu miało by go mieć. Skoro i tak musimy zapisać nasze bardzo długie polecenie, to już można je wykonać potem ewentualnie użyć historii. +

+

+ Nie mniej jednak, definicja aliasu w BASH rozpoczyna się wbudowanego polecenia alias gdzie następnie podaje się nazwę aliasu, znak równości (=) oraz w pojedynczych apostrofach polecenie, dla którego tworzony jest alias. Najprostszy alias jak przychodzi mi do głowy to ten poniżej: +

+
+$ alias diceroll='echo $(((RANDOM % 6) + 1))'
+$ diceroll
+6
+
+

+ Obecnie używane w systemie aliasy możemy wylistować za pomocą tego samego polecenia tylko że z przełącznikiem -p. +

+

+ Aliasy to takie krótkie zagadnienie że zostały jeszcze tylko dwie rzecz do omówienia. Jak sprawdzić czy dane polecenie jest aliasem? Do sprawdzenia tego typu rzeczy służy polecenie type. +

+
+$ type diceroll
+diceroll jest aliasem do echo $(((RANDOM % 6) + 1))'
+$ type pushd
+pushd jest wewnętrznym poleceniem powłoki
+
+

+ Warto używać tego polecenia aby sprawdzić czy dana nazwa jest wolna, bo co jeśli stworzymy alias pod nazwą programu, który już istnieje? W sumie nic takiego. Binaria albo skrypt pozostaną nietknięte. Jedynie nie będzie dostępu z poziomu powłoki w tej konfiguracja, a że konfiguracja często jest określana przez użytkowników w ich katalogach domowych, to użytkownik, który posiada taki alias nie będzie miał dostępu do tego programu. Twórcy powłoki przewidzieli taką sytuacje implementując aliasy, więc dali możliwość dostępu do programu przesłoniętego przez alias. Przed nazwą takiego programu daje się backslash czy tam wsteczy ukośnik (\), gdy powłoka natrafi na takie polecenie zacznie przeszukiwać PATH w poszukiwaniu programu lub skryptu o takiej nazwie a nie podstawiać polecenie z aliasu. +

+

 

+

7. Menedżer zadań w UNIX-ach

+

+ W tych systemach, w których możemy używać powłoki takiej jaką jest BASH na pewno mamy do dyspozycji programy dzięki, którym możemy śledź procesy jakie są wykonywane w naszym systemie. Możemy robić w trybie nieinteraktywnym używając polecenia ps z odpowiednimi przełącznikami oraz odfiltrowując jego dane wyjściowe za pomocą potoków i takich poleceń jak sort oraz uniq. Jednak co przyjęło się wśród użytkowników używanie znacznie lepszych programów, które są nieco bardzie rozmowne z nimi niż polecenie ps mowa tu poleceniach top oraz htop. Top jest to program, który chyba został wpisany w kanon podstawowych narzędzi dostarczanych wraz systemami UNIX-opodbnymi i to na nim skupimy się na początku, póżniej poznamy bardzie kolorowy htop. +

+

+ Po uruchomieniu programu każdy widzi co dostaje. Najprościej rzecz ujmując statystki zużycia zasobów komputera z listą procesów, które te zasoby używają aby realizować swoje zadania. Wartą wyjaśnienia informacją, która jest nie tylko wyświetlana przez top czy htop ale również przez polecenie uptime jest load average. Interpretuje się w bardzo prosty sposób, na początku ustalamy ile nasz komputer (CPU) ma wątków. To load average nie powinien przekroczyć tej wartości w pierwszym z tych pomiarów. Pomiary są ustalane w odstępach czasu 1 minuty, 5 minut oraz 15. Na podstawie wartości jaką jest load average możemy oszacować w jakim stopniu nasz komputer jest zajęty przez procesy. Ta wartość to najmnieszy monitor zasobów jaki możemy spotkać w UNIX-ach. Co może oznaczać wysokie load average? W zależności od tego do czego używamy danego UNIX-a, to jeśli na naszym PC uruchomiliśmy np konwersję plików multimedialnych to wartości mogą skoczyć. + Jak również podczas kompilacji. Ta wartość ma nam przekazać informacje, czy możemy swobodnie pracować po mimo uruchomienia jakiś programów, czy też wstrzymać się do zakończenia zasobożernego zadania. Mimo iż load average wskazuje nam wartości równoważne z ilością naszych wątków, to system i tak wydaje się całkiem responsywny. Wtedy system jest w pełni załadowany (obciążony), ale nie przeciążony dlatego też pełne załadowanie systemu jest mniej odczuwalne niż jego przeładowanie gdzie te wartości mają naprawdę ogromne wartości. Nie ma górnego limitu dla load average, więc liczby mogą być na prawdę duże. +

+

+ Po uruchomieniu programu na pierwszej linii, znajduje się wynik polecenia uptime, wraz z opisaną wcześniej wartością load average. Poniżej znajdują się sumaryczna ilość uruchomionych procesów, z podziałem na poszczególne grupy w zależności od stanu w jakim się one znajdują, jednak nie wszystkie grupy są wyświetlane. Nie ma procesów, które znajdują się w stanie bezczynności. Następną linią jest wskaźnik z użycia procesora przez procesy. Zużycie procesora jest podzielone na kilka grup, w zależności od tego czego dotyczą procesy. Opisy grup znajdują się na liście poniżej: +

+
    +
  • us(er) - bez priorytetowe procesy użytkownika
  • +
  • sy(stem) - procesy jądra systemu
  • +
  • ni(ce) - procesy priorytetowe
  • +
  • id(le) - stan bezczynności
  • +
  • wa(it for IO) - oczekiwanie na operacje wejscia/wyjście
  • +
  • hi[przerwanie sprzętowe] - obsługa przerwań sprzętowych
  • +
  • si[przerwanie programowe] - obsługa przerwań programowych
  • +
  • st(olen) - pobranie zasobu przez nadzorce (w przypadku maszyn + wirtualnych)
  • +
+

+ Następne dwie linie to pamięć operacyjna, z podziałem na pamięć RAM oraz przestrzeń wymiany. Nas w sumie będzie ciekawić głównie ile wolnej pamięci nam jeszcze zostało, zatem powinna nas interesować ostatnia wartość w drugiej linii (uwaga, w tej wartośći nie jest zawarta pamięć SWAP) opisana jako avail Mem. Pozostałe pola raczej nie wymagają opisów. +

+

+ Do omówienia pozostała część główna programu, czyli tabelka z procesami, jej omówienie składa się + głównie z opisu kolumn. +

+
    +
  • PID - Identyfikator procesu.
  • +
  • User - Właściciel procesu.
  • +
  • PR - Priorytet. Są dwa typy priorytetów: normalny (wyrażony liczbą) lub rt (real-time), jeśli natrafimy na proces z rt, oznacza to że pracuje on w czasie rzeczywistym.
  • +
  • NI - Wartość NICE, stopień priorytetu. Priorytet wynika z równania 20 + NICE. Wartości jak może przyjąć NICE są pomiędzy -20 (najwyższy priorytet) a 19 (najniższy).
  • +
  • VIRT - Wielkość obrazu wirtualnego. Ilość pamięci zaalokowanej przez proces wraz z bibliotekami współdzielonymi oraz pamięcią wspódzieloną przez inne procesy. Ta wartość nie jest zbyt miarodajna.
  • +
  • RES - Fizyczna pamięć (bez pliku wymiany) zaalokowana przez proces.
  • +
  • SHR - Pamięć współdzielona wraz z innymi procesami.
  • +
  • S - Status (Running, Sleeping, Zombie, itd.).
  • +
  • %CPU - Zużycie procentowe procesora, jeśli mamy wielowątkowy lub wielordzeniowy procesor, to proces, który będzie zużywać cały procesor to wartość przedstawiona w tej kolumnie bedzie wynikiem iloczynu liczby watków/rdzeni * 100%. Proces zajmuje pełne 4 rdzenie = 400% itp.
  • +
  • %MEM - Zużycie procentowe pamięci przez proces.
  • +
  • %TIME+ - Czas zużywania procesora od uruchomienia procesu. Plus oznacza że wyrażony czas jest przedstawiony w setkach sekund.
  • +
  • COMMAND - Polecenie.
  • +
+

+ Top jest dość elastycznym programem, niektóre rzeczy możemy dostosować pod własne "widzi mi się". Jednak zanim przystąpimy do konfiguracji utworzymy, dowiązanie symboliczne do głównego programu tak jakoby byśmy działali na kopii. +

+
+$ sudo ln -s /usr/bin/top /usr/bin/my_top
+
+

+ A więc sprawa z konfiguracją top. Jest na tyle nie skomplikowana, że żeby ją dokładnie wyjaśnić trzeba by przepisać stronę z podręcznika. Czego robił nie będę, jeśli wybraliśmy język polski podczas instalacji powinniśmy mieć strony podręcznika w naszym rodzimym języku. Jeśli nie to niestety musimy sobie jakoś radzić. Może zamiast przepisywania podręcznika, kilka uwaga. Na początku uruchomimy program top z naszego dowiązania symbolicznego w moim przypadku będzie to my_top. +

+
    +
  • Do zmiany kolejności pol, w tabelce lepiej użyć opcji f niż o. W ten czas za pomocą spacji lub litery 'd' wyłączamy/włączamy pole. Strzałką w prawo zaznaczamy kolumnę, strzałka w góre/dół zmieniamy jej położenie, strzałka w lewo odznaczamy kolumnę.
  • +
  • Zmiana wyświetlania CPU w nagłówku (za pomocą klawisza t) na krótszą da lepszy obraz, ta liczba przy pasku do całkowity procent zużycia.
  • +
  • Warto zmienić jednostkę miary pamięci (za pomocą E [shift + e]), dla lepszego obrazu do GiB.
  • +
  • Konfiguracje zapisujemy za pomocą W (shift + w).
  • +
+

+ + Kiedy konfiguracja zostanie zapisana, wyłączymy my_top, następnie uruchomimy oryginalne polecenie top, okaże się że nie ma żadnych ustawień. Dzieje się tak, ponieważ konfiguracja utworzona jest przypisana tylko do tej kopii utworzonej przez dowiązanie symboliczne, którą wrazie czego zawsze można usunąć. + +

+

+ Żeby używać top-a, w praktyce musimy pamiętać o dwóch klawiszach. Pierwszy z nich to h powodujący wyświetlenie pomocy, drugim z nich jest q, które naciśnięcie spowoduje zamknięcie programu. Jeśli coś w wyświetlanej pomocy nie jest jasne, zawsze pozostaje strona podręcznika man 1 top, ale jeśli ktoś jakimś cudem trafia właśnie na ten artykuł, w celu uzyskania pomocy odnośnie programu top, to poniżej kilka klawiszy, których trzeba się nauczyć, chcąc korzystać biegle z top-a. +

+

+ Sortowanie i filtry: +

+
    +
  • P - posortowanie procesów wg. użycia procesora.
  • +
  • M - posortowanie procesów wg. użycia pamięci.
  • +
  • n - sortowanie wg. PID.
  • +
  • <,> - zmiana pola sortowania.
  • +
  • u - filtruj w nazwy użytkownika.
  • +
  • R - odwrócenie sortowania.
  • +
+

+ Użyteczne polecenia top:
+

+
    +
  • k - wysłanie sygnały do procesu, przeważnie 15 SIGTERM lub 9 SIGKILL, choć można + użyć dowolnego sygnału dostępnego na GNU/Linux.
  • +
  • r - zmiana priorytety dla procesu.
  • +
  • c - włączenie/wyłączenie ścieżek bezwzględnych przy procesach.
  • +
  • g - zmiana wyświetlania tabelki (przedstawiając tak jakby różne tryby pracy) z procesam do wyboru trzy predefiniowane układy kolumn, kolejno pod numerami 2,3,4. Numer 1 to tryb wyjściowy.
  • +
  • V - uruchomienie trybu drzewa, pokazującego hierarchie procesów.
  • +
+

+ Wyświetlanie agregowane*:
+ * Wyświetla w jednej tabeli wszystkie tryby pracy od 1 do 4 (znane z polecenia g)top. +

+
    +
  • A - włączenie/wyłączenie trybu agregacji.
  • +
  • a lub w - przełączanie pomiędzy trybami.
  • +
+

+ Wyświetlanie podsumowania (dane nad tabelką): +

+
    +
  • 1,2,3 - zmiana trybu podsumowania zużycia procesora.
  • +
  • t - zmiana sposobu wyświetlania podsumowania zużycia procesora.
  • +
  • m - zmiana sposobu wyświetlania podsumowania zużycia pamięci.
  • +
  • l - włączenie/wyłączenie górnej linii, przedstawiającej tak + naprawdę wynik działania polecenia uptime
  • +
  • H - zmiana trybu wyświetlania z procesów na wątki oraz odwrotnie
  • +
+

+ Obecnie w systemach GNU/Linux, istnieje wersja ulepszonego top-a. Pod nazwą htop. Różnica miedzy htop a top jest taka że przeważnie nie jest preinstalowany. Jest dostępny w repozytoriach lub trzeba go kompilować oraz jest prostszy w obsłudze. Z Htop-em możemy pracować od razu nie potrzeba go dostosowywać, ponieważ wszystko jest czytelne "out of box". Czynności mamy zmapowane pod klawiszami funkcyjnymi, gdzie na pasku na dole jest opisane, który klawisz jest do czego. Jest on na pewno bardzie interaktywny niż top. Jednak kiedy już ograniemy, konfiguracje top-a, htop staje się zbędny. Sam fakt że trzeba go doinstalowywać. Nie będę opisywał tu konfigurajcji programu htop, ponieważ wystarczy czytać ze zrozumieniem aby dostosować pod siebie ten menadżer zadań. + Na koniec chciałbym dodać iż htop posiada wskaźnik baterii do włączenia w ustawieniach, może być to przydatne dla osób, które są zmuszone działać na bardzo uproszczonych (domyślnie) środowiskach graficznych. +

+

 

+
+

8. Fancy napisy w terminalu

+

+ Ten rodział można traktować z przymrużeniem oka. Tutaj nie zostaną przestawione żadne zaawansowane techniki wykorzystania powłoki, ale jednak jeśli ktoś szuka jakiegoś napisu na MOTD na serwer FTP czy IRC, lub nawet jako ładny nagłówek dla wyświetlenia pomocy w skrypcie/programie to tutaj znajdzie kilka rozwiązań. +

+

+ Pierwszym, najstarszym programem tego jest banner, który domyślnie wypisze do co podamy w argumentach za pomocą kratek (#), po jedenej linii dla każdego argumentu. Dla GNU/Linux Debian pakiet nazywa się sysvbanner, podaje tą informacje dlatego że prawdobnie trzeba będzie go do instalować. +

+
+$ banner GNU/Linux
+
+
+ #####  #     # #     #       # #
+#     # ##    # #     #      #  #           #    #    #  #    #  #    #
+#       # #   # #     #     #   #           #    ##   #  #    #   #  #
+#  #### #  #  # #     #    #    #           #    # #  #  #    #    ##
+#     # #   # # #     #   #     #           #    #  # #  #    #    ##
+#     # #    ## #     #  #      #           #    #   ##  #    #   #  #
+ #####  #     #  #####  #       #######     #    #    #   ####   #    #
+
+

+ Banner nie posiada żadnych przełączników, ani opcji do wyboru. To co widać powyżej jest jego główną i jedyną funkcjonalnością. +

+

+ Inny programem, którego możemy użyć do tworzenia tekstowych banerów jest figlet. Ten jest już nieco bardziej dziej rozbudowany. Posiadający wiele tak zwanych czcionek, z których mozemy tworzyć napisy. +

+
+$ figlet GNU/Linux
+
+

+ Tak wygląda klasyczny font polecenia figlet. +

+
+  ____ _   _ _   _   ___     _
+ / ___| \ | | | | | / / |   (_)_ __  _   ___  __
+| |  _|  \| | | | |/ /| |   | | '_ \| | | \ \/ /
+| |_| | |\  | |_| / / | |___| | | | | |_| |>  <
+ \____|_| \_|\___/_/  |_____|_|_| |_|\__,_/_/\_\
+
+

+ Poniżej drugi dośc popularny font slant.
+

+
+$ figlet -f slant GNU/Linux
+
+
+   _______   ____  __   ____    _
+  / ____/ | / / / / / _/_/ /   (_)___  __  ___  __
+ / / __/  |/ / / / /_/_// /   / / __ \/ / / / |/_/
+/ /_/ / /|  / /_/ //_/ / /___/ / / / / /_/ />  <
+\____/_/ |_/\____/_/  /_____/_/_/ /_/\__,_/_/|_|
+
+

+ Dla figlet istnieje masa różnych fontów. Jednego z nich użyłem do utworzenia baneru na górze tego dokumentu, przedstawiającego jego kategorię. Więcej czcionek znajduje się tutaj: +

+

+ http://www.figlet.org/examples.html. Polecam również zapoznać się ze stroną podręcznika tego polecenie w poszukiwaniu bardzie zaawansowanych opcji tego polecenia. Za pomocą poniższego polecenia możemy sprawdzić jakie czcionki zostały z zainstalowane wraz z pakietem: +

+
+$ ls -al /usr/share/figlet/*.flf
+
+

+ W powszechnym użytku znajduje się znajdują się jeszcze dwa programy, które możemy wykorzystać do dowcipów w postaci "easter eggów" w skryptach, lub MOTD. Pierwszy z nich raczej może posłużyć do tego pierwszego lub otaczania istotnych informacji np. na LiveCD. Cowsay. Ten pakiet posiada dwa odrębne polecenia cowsay oraz cowthink. Przestawiające tekst z pierwszego argumentu jako wypowiedź lub myśli krowy. +

+
+$ cowsay "Login: user | Hasło: user1"
+
+
+____________________________
+< Login: user | Hasło: user1 >
+----------------------------
+\   ^__^
+ \  (oo)\_______
+    (__)\       )\/\
+	||----w |
+	||     ||
+
+

+ To polecenie możemy połączyć z jeszce jednym poleceniem fortune instalowanym z pakietu fortune-mod, wynik przełączenia wyjścia z polecenia fortune na cowsay lub cowthink może przynieść całkiem zabawne rezulataty. Np. krowa może rzucić jakimś cytatem Marka Twaina, albo dowcipem o tym ilu psyhiatrów potrzeba do zmiany żarówki. Teraz wiemy również co robi polecenie fortune. Wypisuje jakiś losowo wybrany tekst z swojej bazy. +

+
+ $ fortune | cowsay
+
+
+_______________________________________
+/ Don't hate yourself in the morning -- \
+\ sleep till noon.                      /
+---------------------------------------
+\   ^__^
+ \  (oo)\_______
+    (__)\       )\/\
+	||----w |
+	||     ||
+
+

+ Ostatnim programem tego typu, jeśli chodzi jakieś ładne napisy, jest myślę najlepszy pomysł na MOTD. Mianowicie chodzi o program neofetch, który oprócz wypisywania dużego loga dystrybucji w ASCII Wyświetla takie podsumowanie odnośnie maszyny jakiej używamy, przypomina ono troche informacje o systemie z macOS, którą otwiera każdy aby zobaczyć co to za mac i co ma w środku. Poniżej wynik polecenia z mojej maszyny, na której redagowałem fragment tekstu tego dokumentu.
+

+ + $ neofetch + +
+       _,met$$$$$gg.          xf0r3m@vostro-3580
+    ,g$$$$$$$$$$$$$$$P.       ------------------
+  ,g$$P"     """Y$$.".        OS: Debian GNU/Linux 10 (buster) x86_64
+ ,$$P'              `$$$.     Host: Vostro 3580
+',$$P       ,ggs.     `$$b:   Kernel: 4.19.0-13-amd64
+`d$$'     ,$P"'   .    $$$    Uptime: 9 hours, 2 mins
+ $$P      d$'     ,    $$P    Packages: 1818 (dpkg), 3 (snap)
+ $$:      $$.   -    ,d$$'    Shell: bash 5.0.3
+ $$;      Y$b._   _,d$P'      Resolution: 1920x1080
+ Y$$.    `.`"Y$$$$P"'         DE: GNOME 3.30.2
+ `$$b      "-.__              Theme: Adwaita [GTK2/3]
+  `Y$$                        Icons: Adwaita [GTK2/3]
+   `Y$$.                      Terminal: terminator
+     `$$b.                    CPU: Intel i5-8265U (8) @ 3.900GHz
+       `Y$$b.                 GPU: Intel UHD Graphics 620
+          `"Y$b._             Memory: 2426MiB / 7835MiB
+              `"""
+
+
+

+ Jak widać, jest tu wiele informacji, których musieli byśmy szukać róznymi poleceniami. +

+

 

+

9. Obsługa sieci

+

+ Na pierwszy ogień weźmiemy problem, z którym chyba spotkał się każdy kto chciał za pomocą swojego ulubionego edytora, dokonywać zmian w plikach znajdujących się na serwerze. Rozwiązania tego problemu są dwa. Pierwszy z nich klasyczny: sciągamy plik z serwera, zmieniamy co trzeba, wrzucamy ponownie. Drugi to z kolei edycja zdalna, tylko aby jej użyć musimy mieć do dyspozycji ssh, plik możemy wyedytować za pomocą vim-a, ale co jeśli nie pamiętamy jego dokładnej nazwy? No właśnie, i tu przychodzi montowanie odległego systemu plików za pomocą ssh - sshfs. Program możemy za instalować z repozytorium. Poźniej tworzymy na punkt montowania gdzieś w swoim katalogu domowym. Sama procedura montowania jest + banalna. +

+
+$ sshfs xf0r3m@192.168.8.4:/home/xf0r3m xf0r3m@sapphire
+
+

+ Gdzie: +

+
    +
  • xf0r3m - nazwa użytkownika na serwerze.
  • +
  • 192.168.8.4 - adres serwera.
  • +
  • /home/xf0r3m - ścieżka do katalogu zdalnego.
  • +
  • xf0r3m@sapphire - punkt montowania.
  • +
+

+ Teraz możemy wykonywać wszystkie możliwe operacje na plikach (z pewnymi ograniczeniami), tak jak byśmy wykonywali je na plikach lokalnych. Po zakończeniu prac, warto katalog odmontować, za pomoca poniższego polecenia: +

+
+$ fusermount -u /home/xf0r3m/xf0r3m@sapphire
+
+

+ Żeby zbytnio nie owijać w bawełne, przedstawie chyba naciekawszy problem który możemy rozwiązać kilkunastu stuknięć w klawiaturę. Powiedzmy że żyjemy w małej miejscowości (nie mowię, że na wsi), gdzie internet jest albo z osiedlówki albo z sieci komórkowej. Aby nie cieszyć się 200 Mb/s przez 20 dni, ponieważ w taki okres czasu jesteśmy w stanie wypompować 300GB pakietu danych, wybraliśmy osiedlówkę bujającą się na 10Mb/s. Po podłączeniu routera do modemu DOCSIS, okazałow się że adres na WAN-ie mamy prywatny 10.x.y.z/8. Chcemy jednak mieć dostęp do naszego serwera plików poprzez ssh. W pracy możemy skonfigurować sobie jedną z maszyn jako serwer stricte ssh (wystarczy zainstalować openssh-server) co pozwoli uruchomić nasz tunel, dzięki któremu będziemy mogli połączyć się z pracy z serwerem w domu bez otwierania portów na domowym routerze. Nie będe opisywał tutaj procedury, ponieważ już to zrobiłem przy okazji sieci + VPN. Zainteresowanych zapraszam do linku poniżej: https://morketsmerke.net/articles/terminallog/laboratorium_vpn.html +

+

+ Do realizacji tego realizacji tego zadania użyjemy prawdopodobnie najpopularnieszego języka na świecie. A będzie on nam potrzebny do udostępnienia swojego katalogu domowego bez brudzenia w systemie i instalowania różnych usług w systemie, wystarczy jedno polecenie. Obecnie chyba w każdym GNU/Linux-ie preinstalowany jest Python w wersji 3. +

+
+$ python3 -m http.server 8080
+
+

+ Wydanie tego polecenia spowoduje uruchomienie bardzo prostego serwera, który udostępni zawartość katalog domowego o ile nie znajduje się w nim plik o nazwie index.html, wtedy zamiast plików zobaczymy jego zawartość. Domyślnie serwer HTTP Python-a nasłuchuje na wszystkich dostępnych interfejsach w systemie, za pomocą przełącznika -b możemy wymusić wykorzystanie tylko konkretnego interfejsu podając jako wartość przełącznika adres interfejsu. Np. +

+
+$ python3 -m http.server 8080 -b 127.0.0.1
+
+

+ Oczywiście nasłuchiwanie na pętli zwrotnej w tym przypadku akurat nie ma sensu. Podczas uruchamiania serwera najlepiej wybierać porty powyżej 1024, ponieważ do niższych portów będzie potrzebne uruchomienie polecenia z uprawnieniami administratora. +

+

+ Kolejną ciekawą rzeczą jest skanowanie sieci, nie tylko pod kątem dostępności, ale również pod kątem zainstalowanych na danych hostach usług. Tutaj należy pamiętać aby wykonywać te czynności tylko na systemtach którymi administrujemy. Tak niewielka czynność jak skanowanie portów, może podnieść alarm i dzięki czemu możemy mieć poźniej problemy z prawem. Dlatego wpisując adres musimy upewnić się dwa razy, że wpisaliśmy poprawny.. Skanowania dokonujem za pomocą programu nmap, który dziś już ma renomę kultowego. Do wyszukiwania komputerów w sieci możemy użyć poniższego polecenia: +

+
+$ sudo nmap -sP 192.168.8.1/2
+
+

+ Jeśli upatrzymy sobie już jakiś serwer możemy go wyskanować pod kątem obecności usług, jakie posiada uruchomione, w zależności od używanego przez usługę rodzaju transmisji. +

+

+ Skanowanie TCP: +

+
+$ sudo nmap -sS 192.168.8.4
+
+

+ Tutaj małe wyjaśnienie, do skanowania TCP używam skanowania SYN, żeby odkryć czy port jest otwarty nie potrzeba kończyć połączenia, wystarczy że otrzyma się wiadomość zwrotną o tym że można nawiązać połączenie. Skanowanie SYN jest znacznie szybsze od skanowania TCP, jednak może dać czasami nie miarodajne efekty, chociaż aby to nastąpiło serwer musi być nieco bardziej zabezpieczony. Wiec jeśli zależy nam jednak na wynikach skanowania, możemy użyć stricte skanowania TCP za pomocą poniższego polecenia. +

+
+$ sudo nmap -sT -T 4 192.168.8.4
+
+

+ Opcja -T - wskazuje na szablon zależności czasowych, mamy 6 stopni od 0 do 5, im niższy tym dokładniejsze skanowanie, jednak trwa ono dłużej. Więcej na ten temat w na stronie podręcznika man nmap, po uruchmieniu naciskamy ukośnik (/) po nim wpisujemy "szablonu\ zależności", następnie naciskamy enter, i powiniśmy zostać przeniesieni pod sekcje opisującą opcje -T. +

+

+ Skanowanie UDP: +

+
+$ sudo nmap -sU 192.168.8.4
+
+

+ Często wykorzystywanym trybem jest tryb pełnego skanowania, który poza samym skanowaniem portów, stara się ustalić wersje wykorzystywanych usług, dodatkowe informacje już z samych usług oraz ustalić system operacyjny jaki jest używany na serwerze. Poniżej uruchomienie pełnego skanowania: +

+
+$ sudo nmap -A -T 4 192.168.8.4
+
+

+ Nmap sam w sobie jest dość niebezpiecznym programem w rękach osoby, która ma opananowane do perfekcji testy penetracyjne (oczywiście mającej złe intencje, nie można winić broni za morderstwa). Za pomocą skryptów rozszerzających ten sam program dla administratorów, który służy do lokalizowania drukarek można za pomocą kilku stuknięć w klawisze włamać się do systemu. Strasznie negatywanie nacechowany wyszedł ten paragraf, jednak myślę że zachęciłem do nauki nmap-a nim więcej osób niż mówił bym jaki to nie jest użyteczny, mimo tego właśnie w nim to zrobiłem. Ludzką naturę kręci wszystko co niebezpieczne. +

+

+ Pośród ciekawych programów sieciowych mamy dyspozycji monitory ruchu sieciowego, oprócz Wiresharka, który jest niestety programem wymagającym środowiska graficznego oraz tshark, który jest nieco nieinteaktywny mamy ciekawą alternatywę: iptraf-ng, który jest troche jak wireshark tylko że interfejsem przeznaczonym na terminale. Innym programem jest minimalistyczny nload, który przy domyślnej konfiguracji zwraca tylko podsumowanie z prędkością oraz ilością przesyłanych przez nas danych. Jednak konfigracja nload wymaga przeczytania strony podręcznika. +

+

+ Kiedyś aby zobczyć jakie porty są otwarte w systemie wydawało się polecenie netstat, obecnie czasy się zmieniły i do tego rodzaju czynności używa się polecenia ss. Jeśli wydamy poniższe polecenie zobaczymy wszystkie nawiązane połączenia w systemie. +

+
+$ ss
+
+

+ Większość wygląda nieco nie zrozumiale, te połączenia są to wewnętrzne połączenia procesów z użyciem gniazd, procesy mogą się tak komunikować z innymi procesami. Póki co nas to nie za bardzo interesuje. Poniżej znajduje się lista przełączników, dzięki której będziemy stanie wybrać interesujące nas połączenia. +

+
    +
  • -t - połączenia TCP
  • +
  • -u - połączenia UDP
  • +
  • -l - w połączeniu w przełącznikiami TCP/UDP (-lt, -lu, -ltu) + wyświetla listę otwartych portów w systemie.
  • +
  • -n - wyświetla numery portów zamiast nazw usług z /etc/services
  • +
  • -r - rozwiązuje adresy IP na nazwy domenowe.
  • +
  • -o - wyświetla czas trwania połączenia
  • +
+

+ Za pomocą prawdopodobnie dowolnego UNIX-a mamy możliwość komunikacji z dowolnym innym UNIX-em podwarunkiem że posiada on w swoim systemie program netcat (nc), za pomocą tego programu możemy np. połączyć się z dowolnym portem, lub tez otworzyć port i oczekiwać na nim na połączenie, od zwyczajnych tekstów przesyłanych z jednego systemu na drugi, które mogą wyglądać jak najzwyklejszy czat, po przez przesyłanie całych katalogów z użyciem metod kompresji, ale najpierw podstawy. +

+

+ Nawiązywanie połączenie TCP:
+

+
+$ nc <HOST> <PORT>
+
+

+ Nawiązywanie połączenie UDP: +

+
+$ nc -u <HOST> <PORT>
+
+

+ Zrzut danych z sesji do pliku: +

+
+$ nc -o <nazwa_pliku> <HOST> <PORT>
+
+

+ Jak możemy przetestować naszego nc? Otoż sposób w samej funkcjonalności jest dość prosty. Połączmy się z jakimś lokalnym serwerem WWW, ale najpierw przygotujemy sobie żądanie. W pustym pliku wpiszymy te 3 linie: +

+
+GET / HTTP/1.0
+Host: <HOST>
+
+
+

+ Pusta linia jako trzeci wiersz w pliku, nie jest błędem, jest wręcz wymagana. Jeśli posiadamy polecenie unix2dos, to możemy skonwertować UNIX-owe znaki nowej linii, na te DOS-owskie, które są wymagane przez protokół HTTP. Jeśli nie mamy to musimy doinstalować (apt install dos2unix). Po instalacji konwertujemy znaki nowej linii. +

+
+$ unix2dos payload.txt
+
+

+ Gdzie payload.txt, jest moim plikiem z żądaniem, po konwersji możemy już wysłać nasze żądanie do serwera: +

+
+$ cat payload.txt | nc 192.168.8.4 80
+
+

+ W odpowiedzi powinniśmy dostać kod strony. Z testowaniem usług przy użyciu netcat po nawiązaniu połączenia musimy wydawać polecenia zgodne ze specyfikacją danych usług, które są dostępne w plikach RFC, pod poniższym adresem: https://www.rfc-editor.org/rfc-index.html Teraz przetestujemy sobie połączenia. Do tego ćwiczenia potrzebujemy dwóch UNIX-ów w sieci LAN, aby nic nie zaburzało połączenia. Na powiedzmy hoście A, który będzie naszym serwerem wydajemy proste polecenie: +

+
+$ nc -l -p 9090
+
+

+ Z kolei na hoście B, który będzie pełnił funkcje klienta, podłączymy się pod otwarty na serwerze port. +

+
+$ nc 192.168.8.4 9090
+
+

+ Teraz dosłownie możemy porozmawiać z komputerem. Możemy również przesłać plik, na komputerze B nadajemy plik na komputer A, jednak przed nadaniem pliku, musimy wiedzieć że komputer A na niego oczekuje: +

+
+/* KOMPUTER A */
+$ nc -l -p 9090 > file.txt
+/* KOMPUTER B */
+$ cat file.txt | nc 192.168.8.4 9090
+
+

+ Polecenie po przesłaniu pliku nadal będzie oczekiwać dalsze dane, możemy zakończyć połączenie za pomocą skrótu ctrl + c. Ostatnią rzeczą do przedstawienia tutaj odnośnie netcat jest przesłanie całego katalogu za pomocą polecenia tar z algorytmem kompresji gzip, jak to wygląda po względem technicznym? Otóż tworzymy skompresowane archiwum za pomocą tar wraz z gzip na standardowym wyjściu, które następnie przekazywane jest za pomocą potoku do ustawionego połączenia sieciowego przez nasz netcat do odbiorcy, gdzie znów potokiem przekierowane jest do dekompresji. Jednak kolejność wydawania poleceń jest odwrotna do sposobu działania, to odbiorca w tym przypadku komputer A musi czekać na katalog. +

+
+/* KOMPUTER A */
+$ nc -l -p 9090 | tar -xzvf -
+/* KOMPUTER B */
+$ tar -czvf - sciezka/do/katalogu/ | nc 192.168.8.4 9090
+
+

+ Gdzie myślniki (-) oznaczają stardardowe wyjście. +

+

+ Odnośnie sprawdzania odległych portów, to istnieje jeszcze jeden sposób, nieco przestarzały, ale nadal spełniający swoje zadanie. Mianowicie chodzi o telnet. Jest to protokół, który umożliwiał połączenie ze zdalną powłoką gdzieś na odległym serwerze. Jak każdy protokół, musi mieć programy go obsługujące, tak protokół telnet posiada program, o jakżeby innej nazwie jak telnet. Jestem ciekaw okoliczności w jakich ktoś pomylił się przy wpisywaniu portu i doszedł do wniosku że telnet można wykorzystać do skanowania portów na hostach w sieci, i takie zadanie przychodzi realizować temu programowi, w 95% przypadków jego użycia w obecnych czasach, innym zastosowanie jest bardziej zaawansowana konfiguracja nieco starszych urządzeń sieciowych lub też obsługa protokół TFTP. Zatem jak sprawdzić za pomocą telenetu czy port jest otwarty, najprościej wydając poniższe polecenie +

+
+$ telnet 192.168.8.4 22
+
+

+ Odpowiedź: +

+
+Trying 192.168.8.4...
+Connected to 192.168.8.4.
+Escape character is '^]'.
+SSH-2.0-OpenSSH_7.9p1 Debian-10+deb10u2
+
+Protocol mismatch.
+Connection closed by foreign host.
+
+

+ Po tej odpowiedzi możemy bardzo, ale to bardzo wiele wywnioskować. +

+
    +
  1. Port 22 jest otwarty
  2. +
  3. Host używa SSH w wersji 2.0
  4. +
  5. Do obsługi SSH używa daemon OpenSSH w wersji 7.9p1
  6. +
  7. System operacyjny jest GNU/Linux-em Debian w wersji 10 + lub opartym na GNU/Linux Debian 10 (buster)
  8. +
+

+ Oczywiście nie ma się co łudzić niewiele jest tak gadatliwych protokołów, ale jeśli tylko zobaczymy linijkę Connected to <HOST>. To nasz cel został osiągnięty, połącznie zostało nazwiązane i możemy sobie wpisać ten port jako otwarty. Zatem aby sprawdzić telenetem port wystarczy podać adres hosta następnie port i czekać na informacje o nawiązaniu połączenia. +

+

 

+

10. Porady i sztuczki

+

+

Powtarzaj do skutku

+

+ Czasami może zdarzyć się że nie możemy wykonać pewnej czynności ponieważ serwer z którego potrzebujemy danych sam ich jeszcze nie posiada. Zatem jedyną rzeczą jaką możemy zrobić to stworzyć skrtypt, który zapętli nasz skrypt do momentu, gdy ten zróci poprawne wykonanie. Możemy wykorzystać do tego poniższy skrypt. +

+
+#!/bin/bash
+while [ true ]; do . $1 && break; done
+
+

+ W dobie dzisiejszych komputerów pozostawienie skryptu na nieskończonej pętli, nie spowoduje jakiegoś nadmiernego obciążenia, jeden wątek może zostać obciążony na 100%. Co tu się tak naprawdę dzieje? Otóż skrypt uruchamia jakieś polecenie, nie wiadomo jakie, podawana przez użytkownika w parametrze pozycjnym, na podstawie wartości zwracanej przez skrypt określane jest przy użyciu && czy pętla wykona się ponownie czy też nie. Jednak generalnie w sztuce programowania przyjeło się kontrolowanie w jakiś sposób konstrukcji tego typu. Opcje są dwie. Albo ustawimy jakiś limit jej wykonań albo też możemy użyć czasu. Rozpatrzymy pierwszy przypadek użycia limitu. +

+ +i=1;
+while [ $i -le 1000 ]; do + echo "$i: "; + . $1 && break; + i=$((i + 1)); +done +
+

+ Tutaj dodałem licznik, który ma pewny limit. Warto zwrócić uwagę na to iż nie jest już to pętla nieskończona. Oczywiście można ten kod przerobić w taki sposób że warunek true pozostanie i wewnątrz pętli zimplementować mechanizmy jej kontroli. Jednak nie widze sensu w tym konkretnym przypadku. Identycznie jest ustawieniem pętli na czas. Zatem na początku pętli zdefiniowałem zmienną, której nadałem wartość 1, mniej więcej wyzerowałem licznik. Warunek ustawiłem, wartość licznika mniejszą lub równą 1000. Pod linią definiująca dalsze wykonianie pętli została umieszczona inkrementacja licznika i to jest wszystko. Teraz zajmiemy się limitem czasowym +

+
+if [ ! "$2" ]; then limit=10;
+else limit=$2; fi
+i=1;
+starttime=$(date +%s);
+while [ $(($(date +%s) - starttime)) -lt $limit ]; do
+	echo "Sekund: $(($(date +%s) - starttime))";
+	echo "Numer obrotu: $i";
+	. $1 && break;
+	i=$((i + 1));
+done
+
+

+ Tutaj to znów pętla nie jest nieskończona, został ustawiony warunek, w którym sprawdzane jest czy różnica sekund pomiedzy czasem zmierzonym w momencie sprawdzenia warunku a czasem rozpoczęcia pętli jest mniejsza od limitu, w ten czas wykonywane jest ciało pętli, licznik tutaj został umieszczony dla celów badawczych aby sprawdzić ile obrotów pętli zostanie wykonanych na danym odcinku czasu. Lepiej nie tworzyć nieskończonych pętli. Dlaczego tutaj też zmieniłem warunek, mogła pozostać pętla nieskończona i ustawić limit czasowy z timeout-em w środku. Otóż jeśli w konstrukcji kontrolnej zdarzył by się błąd, pętla leciała by ku nieskończoności. +

+
+

Wydrukowanie konkretnych linii z pliku

+

+ Omawiając to zagadnienie, warto wspomnieć jak możemy wyświetlić sobie plik wraz z numerami linii przy każdej z nich kiedy używamy polecenia cat wystarczy dodać przełącznik -n. Dla przykładu wylistujemy sobie fragment pliku /etc/passwd. +

+
+$ cat -n /etc/passwd | head -n 10
+1 root:x:0:0:root:/root:/bin/bash
+2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
+3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
+4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
+5 sync:x:4:65534:sync:/bin:/bin/sync
+6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
+7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
+8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
+9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
+10 news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
+
+

+ Polecenie head -n 10 odfiltrowuje z wyjścia na potoku ze wszystkich linii pozostawiają tylko 10 początkowych. Kiedy wiemy jak wypisać sobie plik wraz z numerami możemy teraz spokojnie, przejść do głównego tematu, który jest realizowany za pomocą polecenia sed z przełącznikiem -n. Po przełączniku podajemy polecenie dla sed. Sam sed jest edytorem strumienia, coś ala nieinteraktywny edytor tekstu, gdzie wiele rzeczy robi się za pomocą specjalnych poleceń i teraz tak też zrobimy. +

+
+$ cat -n /etc/passwd | head -n 10 | sed -n '3,8p'
+3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
+4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
+5 sync:x:4:65534:sync:/bin:/bin/sync
+6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
+7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
+8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
+
+

+ Polecenie sed podajemy w pojedyńczych apostrofach, na początku zawsze podajemy numery linii, na których mamy wykonać polecenie, którym jest mała literka po zakresie linii. Zakres linii może być pojedyńczą liczbą wtedy polecenie wykonywane jest na tej jednej konkretnej linii. Wszystkie polecenia sed są dostępne na stronie podręcznika polecenia, dostępnej chyba w każdym UNIX-ie. +

+
+

Podgląd pliku na żywo.

+

+ Podgląd pliku w momencie wypełniania go informacjami jest niezwykle przydatny. Szczególnie gdy administrujemy usługami. Sam pamiętam gdzie dla zleceniodawcy monitorowałem serwer WWW ponieważ ciągle był problem z dostępnością udostępnionych na nim zasobów, po zresetowaniu połączeń wyszystko wracało do normy. Podejrzewałem jedno, atak DoS. Własnie za pomocą podglądu na żywo accesslog-u daemon'a Apache2 upewniłem się że to rzeczywiście atak DoS. Zatem aby uruchomić plik w taki sposób aby przyjrzeć się jak wypełnia się on danymi wystarczy wydać poniższe polecenie +

+
+$ tail -f sciezka/do/pliku
+
+

+ Plik będzie wyświetlał się i wypełniał ekran w miarę wypełniania go treścią. +

+
+

Nieinteraktywne find and replace w strumieniu

+

+ Za pomocą już wcześniej poznanego programu sed możemy odnajdować i zamieniać ciągi znaków w strumieniu. Składnia tego polecenia jest nieco dziwna. Jednak jej opanowanie nie powinno przysporzyć problemów. W tym poleceniu zakres linii również może zostać użyty, poźniej następuje polecnie: s/old/new/[mods]. Polecenie poszuka piewszego wystąpienia ciągu old i zamieni je na new. Modyfikatory jakie możmy użyć z tym poleceniem to: +

+

    +
  • g - zamienia wszystkie wystąpienia w strumieniu lub w jego fragmencie o ile został podany zakres linii
  • +
  • i - wyłącza natywną dla UNIX-ów wrażliwość na wielkość liter.
  • +
+

+ Warto wspomnieć że sed jest tutaj bardzo elastyczny, gdy będziemy musieli operować np na ukośnikach (/), to ukośniki z polecenia możemy zmienić na dowolny inny znak. Na przykład na małpę (@). Sed przyjmuje plik/ściezkę do pliku jak kolejny argument za poleceniem, użycie pliku jednak spowoduje, że wszelkie zmiany jakie na nim dokonamy, dokonamy tak naprawdę na utworzonym z pliku strumieniu, jeśli chcemy zapisać nasze zmiany musimy użyć przełącznika -i przed poleceniem. +

+

Skrypt kończy swoje działanie po napotkaniu pierwszwgo błędu

+

+ Często problemem przy obszernych skryptach jest jeden błąd, może narobić niezłego bałaganu w plikach samego skryptu, jak nie gorzej w samym systemie. Jest na sposób oczywiście. Na początku skryptu należy ustawić opcje powłoki, aby kończyła działanie po pierwszym napotkanym błędzie, ustawienie to wymaga jedynie drobnego polecenia zapisanego przez pierwszymi poleceniami. Poniżej znajduje się to polecnie: +

+
+$ set -e
+
+

+ Możemy je sobie przestestować wykonując je w zwykłej powłoce, a następnie wpisać byle co w powłoce np. 'asdasdsdsdfa' przy zwykłych ustawieniach dostaniem informacje że nie odnaleziono takiego polecenia, ale w tym wypadku powłoka po prostu się zamknie. Tak samo będzie ze skryptem. BASH posiada jeszcze jedną dość przydatną rzecz jeśli chodzi o bardziej restrykcyjne działanie skryptów. Przy uruchamianiu skryptu bez tego ustawienia, możemy definiować puste zmienne. Po włączeniu tej opcji puste zmienne będą oznaczane jako błąd, a jeszcze opcja -e spowoduje zakończenie wykonywania skryptu. Ustawienie opcji bardziej restrykcyjnego traktowania zmiennych zawsze jest ustawiene wraz z kończeniem wykonywania skryptu na pierwszym błędzie. Ustawianie bardziej restyrkcyjnego traktowania zmiennych służy przełącznik -u polecenia set. +

+
+$ set -eu
+
+
+

Debugowanie skryptów powłoki BASH

+

+ Debugowanie skryptu powłoki, nie jest tak bardzo zawansowane ja w przypadku innych języków. Nie co liczyć na manualne uruchamianie linia po linii i tego typu rzeczy. Jedyne co dostaniemy to rozwinięte linie o ile korzystaliśmy z podstawień oraz wartości zmiennych, które muszą być wynikiem jakiś operacji. I to wystarczy. Jedyne co warto zmienić to jeśli skrypt korzysta z innego skryptu to ciężko się połapać, które linie są od czego, więc zmienimy znak zachęty odpowiedzialny oznaczenia BASH w trybie debugowania. +

+
+export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
+
+ Gdzie:
+
    +
  • BASH_SOURCE - zmienna zawierająca scieżkę do pliku żródłowego skryptu
  • +
  • LINENO - zmienna zawierająca numer linii własnego wywołania
  • +
  • ${FUNCNAME[0]:+${FUNCNAME[0]}(): } - instrukcja podstawienia, jeśli + FUNCNAME[0] istnieje i nie jest pusty zostaje podstawione słowo + po znaku + (plus) w tym przypadku ${FUNCNAME[0]}():, zmienna + FUNCNAME[0] przechowuje nazwę obecnie wywoływanej funkcji zdefiniowanej + w skrypcie.
  • +
+

+ Sekcja z FUNCNAME[0] nie zostanie użyta do momentu wywołania przez skrypt funkcji. +

+
+

Twórz lepsze skrypt powłoki

+

+ Dawniej istniały oddzielne programy, których zadaniem była analiza kodu po względem jakości, takie programy były w stanie wystawić nawet programiście ocenę zgodną z anglosaskim system szkolnictwa, takie programy zwały się linterami. W obenych czasach lintery są zintegrowane w nowoczesne IDE, przekazując programistom różnego rodzaju wskazówki. Z racji tego że dla skryptów powłoki nie ma jakoś IDE, ponieważ są one tworzone w razie potrzeby, to ktoś w trosce o jakość tych skryptów stworzył własnie linter, skryptów powłoki BASH. Taki program nazywa się shellcheck i nawet posiada paczkę w repozytorium dystrybucji GNU/Linux Debian. Użycie go jest dziecinnie protste, jako pierwszy argument podajemy ścieżkę do skryptu. +

+
+$ shellcheck sciezka/do/skryptu
+
+

+ Wynik działania shellcheck przedstawiam poniżniej: +

+
+In RUS.sh line 18:
+while [ $(($(date +%s) - starttime)) -lt $limit ]; do
+				 ^-- SC2086: Double quote to prevent globbing and word splitting.
+
+
+In RUS.sh line 21:
+. $1 && break;
+^-- SC1090: Can't follow non-constant source. Use a directive to specify location.
+  ^-- SC2086: Double quote to prevent globbing and word splitting.
+
+

+ Niestety nie będzie tego widać na powyższym przykładzie, ale shellcheck swoje uwagi zwraca w kolorze. Tak więc błedy są oznaczone na kolor wiadomo - czerwony, ostrzeżenia - na zółty, a uwagi na zielony. Każda uwaga zwrócona przez shellcheck rozpoczyna się od pewnego rodzaju kodu identyfikującego komunikat, każdy kod na stronie wiki projektu na GitHub, posiada swoją stronę rozszerzającą informacje na jego temat z przykładami. Dlatego można zajrzeć w link poniżej https://github.com/koalaman/shellcheck/wiki, rozwijając zakładkę "Pages", znajduje się wyszukiwarka, gdzie możemy wrzucić kod interesującego nas błędu lub podać po ukośniku na końcu adresu linku. +

+

Wykonanie polecenia o podanym czasie

+

+ Chcemy wykonać pewne polecnie, ale nie teraz powiedzmy że za dwie minuty, to możemy to zrealizować za pomocą polecenia at. Jeśli nasze polecenie za powiedzmy 2 minuty ma zostać uruchomione to na początku wskazujemy poleceniu at czas, który jest wynikiem dodawania pożądanego czasu do obecnego jak w przykładzie poniżej. +

+
+$ at now + 2 minutes
+
+

+ Następnie zostanie nam wyświetlony znak zachęty programu at>, po którym wpisujemy polecenia jakie mają się wykonać. Warto pamiętać o przekierowaniu wyjścia do pliku, ponieważ polecenie at, podczas wykonywania zadań nie zwrócić żadnych danych, chyba że mamy zainstalowany program mailx. Więc jeśli nam na tym zależy musimy te dane przekierować. Zatwierdzenie listy poleceń i wyjście z trybu polecenia at> dokonujemy za pomocą skrótu klawiszowego ctrl + d. Więcej informacji znajduje się na stronie podręcznika polecenia at. +

+

AWK wyświetla linie wg. zakresu

+

+ Awk, podbnie jak sed za pomocą specjalnych poleceń może wyświetlić linie z konkretnego zakresu, jednak tutaj konstrukcja polecenia jest nieco bardziej skomplikowana. Kiedy otwieramy plik lub przekazujemy strumień to w awk jest specjalna zmienna, która przechowuje numer linii NR, i to na niej oprzemy warunki naszego polecenia. +

+
+$ awk 'NR>=2 && NR<=8' /etc/passwd
+
+
+

dos2unix, unix2dos

+

+ Przypomnijmy sobie ten drobny programik, który zamieniał znak końca wiersza w pliku z żądaniem HTTP dla telnet. To czasami może być potrzeba aby zamienić te znaki w drugą stronę, kiedy edytowaliśmy coś na MS Windows i nagle przeniesiemy to na UNIX-a, to nagle mamy takie znaczki jak ^M, to jeśli to kod źródłowy, to interpreter/kompilator może sypać błędami. Zamiast usuwać te znaki ręcznie możemy użyć właśnie programu o przeciwynym działaniu od tego którego używaliśmy przy żądaniu HTTP dla telnet, dos2unix +

+
+$ dos2unix hello.c
+
+
+

Tablica ASCII

+

+ Tablica ASCII jest dostępna w prawie każdym GNU/Linux za pomocą poniższego polecenia: +

+
+$ man 7 ascii
+
+
+

Automatyczne wylogowanie z połoki

+

+ Kiedy pracujemy bez GUI, możemy ustawić sobie automatyczne wylogowanie podczas bezczynnosci na podstawie wartość zmiennej TMOUT, której wartość przechowuje ilość czasu bez żadnego wydanego polecenia w wyrażonego w sekundach, po upływie tego czasu zostaniemy wylogowanii z połoki. Jeśli jednak w naszej powłoce działa jakiś proces to wylogowanie nie będzie możliwe, z kolei mimo procesów w tle wylogowanie nastąpi. Aby ustawić sobie autowylogowanie wystarczy zdefiniować w powłoce zmienną TMOUT i jeśli nie wydamy przez ten czas żadnego polecenia zostaniemy wylogowani. Zmienną również możemy dopisać do naszego pliku .bashrc, pamiętając poprzedzeniu deklaracji słowem export. +

+
+$ TMOUT=30
+
+
+

Timeout dla procesów

+

+ Za pomocą spcjalnego polecenia zakończyć działanie procesów jeśli przekroczą limit czasowy. Najprostszym przykładem żeby to zaprezentować jest ustawienie limitu czasu za pomocą polecenia timeout dla polecenia sleep. +

+
+$ timeout 5 sleep 7 || echo "It fails!"
+
+

+ Zwróćmy uwagę na to iż polecenie dla któremu checemy nadać czas oczekiwania podajemy jak argument polecenia timeout za raz po limicie czasowym. +

+
+

Jaki jest mój publiczny adres IP?

+

+ Na to pytanie może odpowiedzieć nam jedna strona, jednak wymagane jest posiadanie w systemie polecenia curl. Kiedy mamy zainstalowany pakiet w systemie, wystarczy że wydamy poniższe polecenie aby dowiedzieć się jaki jest nasz publiczny adress IP. +

+
+$ curl ifconfig.co
+
+
+

Podgląd wielu plików na żywo

+

+ Może zdarzyć się tak że musimy podejrzeć kilka plików na żywo na jednym oknie. Możemy wspomóc się multiplekserami terminali takimi jak GNU Screen czy TMUX. Jednak nie jest to konieczne jeśli jesteśmy w stanie zainstalować w systemie taki program jak multitail, program jako argumenty przymuje kolejne pliki do podglądu, dzieli ekran na równe części a w każdej z tych części mamy jeden z naszych plików. Multitail zawiera wiele przełączników i konfigurowalnych opcji, które są opisane w wyczerpujący sposób na stronie podręcznika polecenia multitail. +

+
+$ sudo multitail /var/log/messages /var/log/auth.log
+
+ +

Wykonywanie poleceń co jakiś czas

+

+ Tytuł może być mylący. Może wskazywać na harmonogram zadań, jednak w tym akapicie nie o to chodzi. Na UNIX-ach istnieje takie polecenie jak watch, które uruchamia nam polecenie co jakiś interwał czasu, domyślnie są to 2 sekundy, ale oczywiście za pomocą przełącznika -n możemy ustawić dowolny interwał. +

+
+$ watch uptime
+
+

+ Warto wspomnieć o dwóch rzeczach. Watch najmniejszy interwał jaki może przyjąć to 0.1 sekundy. Drugą rzeczą jest największy możliwy interwał, który wynosi wielkość 32-bitowej zmiennej integer bez znaku czyli 2^32. Watch może być naprawdę użytecznym programem, o wiele więcej informacji znajduje się na stronie podręcznika polecenia watch. +

+
+

Konwersja z użyciem ImageMagick

+

+ ImageMagick jest programem graficznym, którego obsługa nie należy do najbardziej przyjaznych użytkownikowi. Ma on jednak jedną bardzo ważną rzecz. Można niektóre czynności wykonać z poziomu terminala, a wraz z pakietem ImageMagick dostajemy polecenie convert, za pomocą którego możemy w prosty sposób konwertować obrazki. Skonwertujemy sobie na początek PNG na JPEG.
+

+
+$ convert obrazek.png obrazek.jpg
+
+

+ Niezbyt skomplikowane? Innymi czynnościami jakie możemy wykonać za pomocą polecnie convert jest kompresja. +

+
+$ convert original.jpg -strip -sampling-factor 4:2:0 -quality 80 -interlace JPEG -colorspace RGB compressed.jpg
+
+

+ Za pomocą naszego polecenia możemy również zmienić wielkość naszego obrazka. +

+
+$ convert huge_image.png -resize 500x500 resized_image.png
+
+

+ Obrazek zostanie przeskalowany za pomocą w uzwględnieniem proprocji, aby wyłączyć tę funkcję wydamy poniższe polecnie. +

+
+$ convert huge_image.png -resize 500x500! resized_image.png
+
+

+ + Najciekawszą rzeczą jaką możemy zrobić za pomocą polecenia convert jest stworzenie gifa wskazując np. wszystkie obrazki w danym folderze za pomocą symbolu wieloznaczności. + +

+
+$ convert -delay 80 -loop 0 *.png my.gif
+
+
+

Połączenie wielu plików PDF w jeden

+

+ Pracujemy cięzko w systemie GNU/Linux, usprawniając nasze skrypty i nagle ktoś prosi nas o to aby połaczyć kilka PDF-ów w jeden żeby miał łatwiej do wydrukowania. Możemy spędzić znaczną częsć czasu na poszukiwanie odpowiedniego oprogramowania, chyba że użyjemy polecenia gs, skrótu od nazwy programu Ghostscript, służacego do manipulowania PostScript-em oraz PDF-ami. +

+
+$ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf file1.pdf file2.pdf file3.pdf ...
+
+
+

Łatwiejsze kopiowanie lub zmiana nazwy

+

+ Te zagadnienie mogą się przydać przy tworzeniu pierwotnej kopii pliku, przed wprowadzeń zmian oraz gdy utworzony plik powinien mieć jakieś przyrostek na końcu nazwy. +

+
+$ cp /etc/fstab{,.bak}
+
+

+ To polecenie spowoduje utworzenie kopii pliku /etc/fstab z rozszerzeniem .bak. Podobne polecenie możemy wykonać gdy jesteśmy w takiej typowej sytuacji, że do pliku tekstowego stworzonego na UNIX-ie musimy do dodać rozszerzenie .txt.
+

+
+$ mv wazne_dane{,.txt}
+
+
+

du oraz ncdu

+

+ Programy takie jak du, pomagają monitorować użycie miejsca na dysku, jednak samo wydanie polecnie wydaje się mało przydatne więc poniżej umieszcze kilka przydatnych przełączników, aby du zwracało bardzie przystępne wyniki. +

+
    +
  • -a - wyświetla rozmiar każdego pliku a nie rozmiar sumaryczny katalogów
  • +
  • -h - skalowanie jednostek rozmiaru
  • +
  • -s - sumaryczna wartość dla każde podanego argumentu (katalogu, pliku). Przydatne dla katalogów.
  • +
  • -x - przeliczenie jednostek dla jednego systemu plików, niektóre udziały sieciowe mogą być bardzo + wolne przez co przelicznie katalogów wraz z miejscami montowania może zająć wieki.
  • +
  • -d - maksymalny poziom zagłębienia w katalogi (rekruencji).
  • +
+
+/* Wyświetlenie przestrzeni zużytej przez nasz katalog domowy */
+$ du -sh ~/*
+
+

+ Innym ciekawym rozwiązaniem w monitorowaniu przestrzeni na dysku/dyskach może być program ncdu, do zainstalowania z repozytorium (przynajmniej w GNU/Linux Debian). Pozwala on w sposób bardziej interaktywny zaprezentowanie wykorzystania przestrzeni dyskowej. Program nie jest jakość bardzo skomplikowany, więc nie ma sensu go tu opisywać. Uruchomienie go bez żadnego argumentu pokaże zużycie dla katalogu, w którym się obecnie znajdujemy. +

+
+$ ncdu
+
+
+

Podgląd potoku

+

+ Istnieje narzędzie, dzięki któremu możemy podejrzeć kopiowanie danych, pv - Pipe Viewer. Dosłownie podglądacz potoku. Zasada korzystania z pv jest dosyć prosta, otóż chcąc skopiować zwyczajny plik, podajemy ścieżkę zródłową jako pierwszy argument następnie przekierowujemy standardowe wyście na ścieżkę docelową pamiętając po podaniu nazwy kopiowanego pliku. +

+
+$ pv Dokumenty/oldVM.ova > Pobrane/oldVM.ova
+
+

+ + Inny przykładem tutaj może być tworzenie pendrive-ów bootowalnych z GNU/Linux-em. + +

+
+$ dd if=Pobrane/manjaro-xfce-20.2.1-210103-linux59.iso | pv | dd  of=/dev/sdc bs=4M conv=fsync
+
+

+ Możliwe jest również użycie polecenia z przykładu ze zwykłym plikiem, jako ścieżkę źródłową podajemy ścieżkę do plik, natomiast jako ścieżkę dysk, tylko należy pamiętać aby podać cały, nie jedną partycje. +

+
+$ pv Pobrane/manjaro-xfce-20.2.1-210103-linux59.iso > /dev/sdX
+
+
+

Pewne działania w systemie działają bardzo długo...

+

+ Tak jak w tytule tego akapitu, niektóre operacje kopiowania działają bardzo długo a jeszcze jeśli nie damy żadnych dodatkowych opcji zwiększających gadatliwość tych programów to zobaczymy jedynie migający kursor. Jednak jest na jakieś rozwiązanie. Polecenie progress, jest wstanie wyciągnąć informacje na temat działania, niektórych poleceń systemowych takich jak cp, rsync itp. Poniżej lista: +

+
+cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum,
sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, 7za, zcat, bzcat, lzcat, split, gpg +
+

+ Wystarczy że polecenie działa w tle lub na innym terminalu. Wystarczy wydać polecnie progress, już on sam je odnajdzie. +

+
+

Wysyłanie komunikatów wewnątrz systemu w postaci maili

+

+ Aby móc wysyłać maile wewnątrz systemu, potrzebujemy programu mailx, wraz z nim zainstaluje się exim4. Pod czas jego konfiguracji wybierzemy konfiguracje lokalną. Po zainstalowaniu programu samo wysyłanie komunikatów jest proste za pomocą potoku przekazujemy komunikat, czy to log z pliku, wyjście ze skryptu czy zwykły napis za pomocą polecnie echo, temat podajemy po przełączniku -s po temacie podajemy nadawcę, przeważnie nazwa_uzytkownika@localhost. +

+
+$ echo "TEST" | mail -s "Komunikat testowy" xf0r3m@localhost
+
+
+

Lista otwartych plików

+

+ Po skopiowaniu danych pendrive, chcemy go odmontować jednak dostajemy komunikat o tym że cel jest zajęty. W tym przypadku możemy podejrzeć otwarte pliki za pomocą polecenia lsof i sprawdzić czy jakiś proces korzysta z plików z naszego pendrive'a, kiedy wydamy jest od tak po prostu w systemie ukaże nam się bardzo długa lista wyszystkich otwartych plików systemie, z racji konstrukcji UNIX-ów, gdzie prawie wszystko jest plikiem ta lista może być naprawdę długa. Możemy ją jednak ograniczyć za pomocą potoku oraz polecenia grep. +

+
+$ lsof | grep "bushi"
+vim 4504 xf0r3m 4u REG 254,3 122880 7735057 /home/xf0r3m/Nextcloud/Devel/morketsmerke/articles/terminallog/.bash_bushido.html.swp
+
+
+

Automatyczne potwierdzenie wykonania polecenia

+

+ Czasami działanie, niektórych programów może mieć bardzo destrukcyjny wpływ na systemem, wiec same programy pytają czy kontynuować. Takie zachowanie jest bezpieczne, ale jeśli chcemy użyć tego polecenia w skrypcie? Czasami sami twórcy implementują opcje wymuszenia potwierdzenia zazwyczaj za pomocą przełącznika -f lub --force, nie jest to jednak standardem. Dla wszystkich poleceń, których działanie wymaga potwierdzenia a chcemy ich użyć w skrypcie to możemy przekierować do takiego polecenia wyjście polecenia yes, które po prostu potwierdzi automatycznie działanie takich programów. +

+
+

Jednoczesne przekierowanie wyjścia do pliku i wyjście standardowe

+

+ Polecenie tee przekierowuje wszystko co dostanie na standardowe wejście na swoje standardowej wyjście oraz do pliku, który podamy jako pierwszy argument, polecenie to ma tyle zastosowań że aż ciężko wymienić. Na przykład: +

+ +$ bash -x script.sh 2>&1 | tee script.debug + +

+ W tym wypadku podczas debugowania sporych pętli możemy użyć polecnia tee. Jednak nie jest to najlepszy przykład ponieważ tracelog, BASH-a jest wyświetlany na strumieniu błędów więc musiałem podłączyć wyjście diagnostyczne do standardowego wyjścia. +

+
+

Zapisanie sesji terminala

+

+ Tytuł może wprowadzić w błąd, ponieważ jeśli ktoś czytał rodział o historii wie, że każda sesja jest zapisna w historii sztuką jest ją tylko odnaleźć, jednak tutaj "Zapisanie sesji termianala" możemy określić jako nagranie sesji terminala do pliku tekstowego. Program script do uruchomienia potrzebuje pliku jako pierwszego argumentu po uruchomieniu zapisuje do niego wszystkie wpisane polecenia kiedy chcemy zakończyć nagrywanie wydajemy po prostu polecenie exit. Polecenie script może być niezwykle przydatne podczas tworzenia skryptów czy tutoriali. +

+
+

Miekki restart powłoki

+

+ Czasami nasza powłoka może zachowywać się dziwnie, szczególnie gdy wyświetlimy jakiś przypadkiem jakiś plik binarny. To teraz możemy albo wyłączyć terminal i włączyć go ponownie lub wykonać miękki restart powłoki. Dlaczego miękki? Ponieważ jest on wykonywany z polecenia wydawanago właśnie w uszkodzonej powłoce, jeśli czujemy że coś jest nie tak, wywołajmy po prostu polecenie reset. +

+
+

Uruchomienie polecenia na podstawie odpowiedniego obciążenia systemu (load average)

+

+ Za pomocą polecnie batch, możey ustawić odpowiedni program, który zostanie uruchomiony kiedy wartość load average osiągnie konkretną wartość. Warto zwrócić uwagę że jest polecnie podobne do polecenia at, nawet znak zachęty jest identyczny, więc konfiguracja jest już znana z at, warto wspomnieć że domyślną wartością załadowania systemu dla programu batch jest 0.8. Możemy to zmienić wykorzystując zmienną OPTS, w której to zdefiniujemy wartość load average, po której osiągnięciu zostanie uruchomione polecenie zdefiniowane w przy użyciu polecnia batch. +

+

 

+

11. Emulatory terminala

+

+ Tworząc maszyny dla projektu VTMP, podczas instalacji dystrybucji BlackArch skierowanej pod testy penetracyjne po wybraniu środowiska zostaniemy nazwani noobami - nowicjuszem/słabiakiem. Daje to trochę do myślenia. Sam RMS nie korzysta ze srodowiska graficznego zatem tekstowa konsola systemu jest najlepszym emulatorem terminala, oparta na wyżej wspomnianej bibliotece GNU Readline. Jednak rzeczywistość weryfikuje nasze marzenia bycia pro, musimy skorzystać z przeglądarki albo jak odpalić muzykę na Spotify bez GUI. Na GitHub jest kilka projektów, z których możemy skorzystać, ale i tak poprawne skonfigurowanie programów odpowiedzialnych za dźwiek na UNIX-ach przypada konfiguracji środowiska graficznego, więc puki co radzę przy tym pozostać. Szanujmy nasz czas oraz pracę tych wszystkich osób zaangażowanych w tworzenie GUI. Ile środowisk tyle różnych emulatorów, ale jeden się wybija ponad wszystkie i trzeba go zainstalować. + Mianowicie terminator, najciekawszą z funkcji jest możliwość podzielenia jednego okna na kilka odrębnych powłok
+

+
    +
  • ctrl+shift+e - podzielenie panelu na dwie równe części w pionie.
  • +
  • ctrl+shift+o - podzielenie panelu na dwie równe części w poziomie.
  • +
+

+ Na liście specjalnie napisałem panelu, ponieważ każdą wydzieloną częsć również możemy znów podzielić na kolejne dwie części w dowolnym kierunku. Samo początkowe okno jest pojedyńczym panelem. Inną ciekawą rzeczą jest możliwość zmiany nazw kart jeśli już ich używamy. Terminator daje znacznie więcej możliwości, pomoc jest dostępna pod klawiszem F1, niestety potrzebny jest internet. Wiem że Twój ulubiony emulator jest najlepszy jednak serdecznie polecam wypróbować terminator. +

+
+

12. Koniec

+

+ To było by na tyle jeśli chodzi jakąś bardziej zaawansowaną naukę obsługi powłoki. Jeśli ktoś jest "powłokofilem", to polecam użyć poniższego polecenia. +

+
+$ man bash
+
+

+ Poziomu mistrzowskiego w obsłudze powłoki. +

+
+
+ + diff --git a/articles/terminallog/GNU_mailutils_jako_program_mailowy.html b/articles/terminallog/GNU_mailutils_jako_program_mailowy.html new file mode 100755 index 0000000..1d5dde1 --- /dev/null +++ b/articles/terminallog/GNU_mailutils_jako_program_mailowy.html @@ -0,0 +1,410 @@ + + + + + + + + +
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+

+ ☠ morketsmerke ☠ +

+
+

GNU mailutils jako program mailowy

+

+ W niektórych UNIX-ach można napotkać polecenie mail. + Jest ono obecnie wykorzystywane do przesyłania wiadomości + w obrębnie jednego systemu, jednego serwera. Za pomocą kilku + dodatkowych programów można go skonfigurować do użytku z serwerami + konfigurowanymi na podstawie materiałów z tej strony oraz popularnymi + skrzynkami dostępnymi w internecie. +

+

+ Przed każdą instalacją oprogramowania warto zaktualizować nie tylko + listy pakietów, ale i zainstalowany system. Ja używam greenOS + bazującego na GNU/Linux Debian, dlatego też przedstawiony tutaj + menedżer pakietów to APT. +

+
+$ sudo apt update
+$ sudo apt upgrade
+
+
    +
  1. + Instalacja oprogramowania +

    + GNU mailutils nie jest sam w sobie klientem pocztowym + jakie wszyscy znamy, dlatego musimy go wspomóc kilkoma + programami, aby spełnił naszym oczekiwaniom. Jeśli w naszym w + systemie polecenie mail + nie występuje to należy również zainstalować pakiet + GNU mailutils. +

    +
    +$ sudo apt install mailutils fetchmail procmail postfix libsasl2-2 ca-certificates libsasl2-modules
    +
    +

    + Podczas instalacji Postfix-a zostanie wyświetlone + okno dialogowe odnośnie jego konfiguracji, wybieramy + Strona internetowa/Internet site, w polu wpisujemy + FQDN swojego komputera. +

    +
  2. +
  3. + Utworzenie skrzynki mailowej +

    + Skrzynka mailowa na UNIX-ie jest zwykłym plikiem o nazwie + użytkownika, który powinien znajdować się w katalogu + /var/mail, jeśli jednak musieliśmy zainstalować + GNU mailutils, to prawdobodobnie plik nie będzie + istnieć i trzeba go utworzyć. +

    +
    +$ sudo touch /var/mail/xf0r3m
    +$ sudo chown xf0r3m:mail /var/mail/xf0r3m
    +
    +

    + Aby plik mógł być obsługiwany przez mail, musimy nadać + mu odpowiednie prawa własności - takie jak na powyższym + przykładzie. +

    +
  4. +
  5. + Konfiguracja fetchmail - plik ~/.fetchmail +

    + Kiedy plik skrzynki jest gotowy, możemy skonfigurować program, + który pobierze do niego maile z serwera. W pliku + .fetchmailrc w katalogu domowym użytkownika zapisujemy + poniższe opcje. +

    +
    +set daemon 300
    +set logfile fetchmail.log
    +
    +poll mail.example.com proto IMAP
    +  user "xf0r3m" pass "passw0rd" is "xf0r3m" preconnect "date >> fetchmail.log"
    +  ssl
    +  fetchall
    +  no rewrite
    +  mda "/usr/bin/procmail -f %F -d %T";
    +
    +

    + Gdzie: +

      +
    • + set daemon 300 - + uruchomienie fetchmail powoduje uruchomienie + daemona, który pobiera maile następnie przechodzi w stan + uśpienia, ta opcja ustawia co ile sekund daemon + fetchmail ma się wybudzać i pobierać pocztę. +
    • +
    • + set logfile fetchmail.log - + wskazanie pliku dla logów programu. +
    • +
    • + + poll mail.example.com proto IMAP + - wskazanie serwera oraz protokołu z jakiego ma + korzystać. +
    • +
    • + + user "xf0r3m" pass "passw0rd" is "xf0r3m" preconnect + "date >> fetchmail.log" + - wskazanie użytkownika zdalnego wraz danymi + uwierzytelniającymi, jawne przekazanie informacji do czyjej + skrzynki mają trafić pobrane wiadomości + (is "xf0r3m"), dyrektywa + preconnect wykonuje podane + jako argument polecenie przy każdym połączeniu z serwerem. + W tym przypadku będziemy wiedzieć kiedy wiadomości zostały + pobrane, lub coś poszło nie tak. +
    • +
    • + ssl - fetchmail + wykorzysta SSL/TLS + do połączenia się z serwerem, używając przy tym portów IMAPS + lub POP3S. +
    • +
    • + fetchall - program będzie + pobierać wszystkie maile jakie znajdzie w skrzynce tego + użytkownika na serwerze. +
    • +
    • + no rewrite - opcja powoduje + pozostawienie oryginalnych nagłówków, bez tej opcji mogły + by zostać nadpisane przez fetchmail. +
    • +
    • + + mda "/usr/bin/procmail -f %F -d %T"; + - MDA (ang. Mail Delivery Agent) - program + dostarczający pocztę, fetchmail po pobraniu przekaże maile + do procmail, który dostarczy je do naszej skrzynki. + Opcje procmaila: -f %F - + zarejestruje w logach od kogo przychodzi wiadomość, + -d %T - właśnie ta opcja + umożliwia dostarczenie poczty do lokalnej skrzynki + użytkownika. +
    • +
    +

    +
  6. +
  7. + Zmiana uprawnień ~/.fetchmailrc +

    + Daemon nie wystartuje jeśli plik ~/.fetchmailrc nie będzie + posiadał odpowiednich uprawnień. +

    +
    +$ chmod 700 ~/.fetchmailrc
    +
    +
  8. +
  9. + Testowanie fetchmaila +

    + Teraz możemy przestestować fetchmail, wysyłając + testowego maila + na skrzynkę, z której program pobiera wiadomości. Zaraz po + uruchomieniu + polecenia warto w drugim terminalu otworzyć sobie plik logów + fetchmail w podglądzie na żywo. Wydajemy polecenie: +

    +
    +$ fetchmail
    +
    +#w drugim terminalu:
    +$ tail -f fetchmail.log
    +
    +

    + Jeśli jesteśmy pewni, że nowa wiadomość znajduje się na skrzynce + a fetchmail niczego nie pobrał, w logach wyświetla się + tylko data. Oznacza to, że program się zawiesił. Tak się dzieje + za pierwszym razem. W tej sytuacji zostaje zabicie procesu i + uruchomienie go ponownie, jeśli to nie zadziała to należy + wyłączyć SSL, uruchomić ponownie fetchmail pobrać pocztę + i uruchomić SSL ponownie. +

    +
  10. +
  11. + Konfiguracja Postfix, aby wysyłać maile przez GNU + mailutils +

    + Załóżmy, że otrzymaliśmy maila i chcemy na niego odpowiedzieć, + aby wiadomość opuściła nasz komputer i została przesłana do + serwera SMTP musimy mieć skonfigurowany Postfix + jako przekaźnik (ang. relay). +

    +

    + W pliku /etc/postfix/main.cf odnajdujemy opcje + relayhost przypisujemy jej + adres serwera SMTP w nawiasach kwadratowych, za nawiasami po + dwukropku podajemy numer portu, pod którym SMTP jest dostępny + dla klientów. +

    +
    +relayhost = [mail.example.com]:587
    +
    +

    + Aby można było przekazać wiadomości, które będą wysyłane za + pośrednictwem tego systemu, potrzeba jeszcze kilku ustawień, pod + relayhost zapisujemy + poniższe opcje. +

    +
    +smtp_sasl_auth_enable = yes
    +smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    +smtp_sasl_security_options = noanonymous
    +smtp_tls_CAfile = /etc/postfix/cacert.pem
    +smtp_use_tls = yes
    +
    +

    + Zapisujemy zmiany w pliku. +

    +
  12. +
  13. + Utworzenie pliku z danymi uwierzytelniającymi i nadanie + mu odpowiednich uprawnień +

    + Jak mogliśmy zauważyć w poprzednim punkcie, występuje tutaj plik + mapowania, zawierający powiązania adresów + serwerów z danymi uwierzytelniającymi. Plik tworzymy zgodnie ze + ścieżką podaną w opcji + smtp_sasl_password_maps, + wewnątrz każda jedna linia to mapowanie. Na mapowanie składa się + adres serwera wraz z portem zapisane identycznie jak w opcji + relayhost oraz kombinacja nazwy + użytkownika z hasłem odseparowane dwukropkiem. +

    +
    +[mail.example.com]:587  xf0r3m:passw0rd
    +
    +

    + Uprawnienia jakie należy nadać są chyba najbardzie restrykcyjne w + całym systemie, bo tylko użytkownik z uprawnieniami + administracyjnymi będzie mógł w nim wprowadzać zmiany. Właściciel + bez podniesienia uprawień, będzie mógł jedynie przeczytać + zawartość. + Grupa oraz pozostali nie będą mieć żadny praw. +

    +
    +$ sudo chmod 400 /etc/postfix/sasl_passwd
    +
    +
  14. +
  15. + + Utworzenie bazy z pliku mapowania. + +

    + Plik, aby był użyteczny przez Postfix, musi zostać + skonwertowany na format dla niego czytelny. Do konwersji posłuży + polecenie dostarczane wraz z Postfix. +

    +
    +$ sudo postmap /etc/postfix/sasl_passwd
    +
    +
  16. +
  17. + Plik /etc/postfix/cacert.pem +

    + Jeśli wrócimy do konfiguracji Postfix to, że + zauważymy + wartości opcji smtp_tls_CAfile + przypisana jest ścieżka. Ścieżka do pliku, który nie istnieje. + Plik ten jest certyfikatem urzędu certyfikacji - wystawcy + certyfikatu, który jest używany przez serwer SMTP, aby dowiedzieć + kto jest wystawcą certyfikatu dla serwera SMTP musimy się z nim + w odpowiedni sposób połączyć. Poniższe polecenie wskaże plik, + który należy skopiować do /etc/postfix/cacert.pem. +

    +
    +$ echo "/etc/ssl/certs/$(ls /etc/ssl/certs | grep "$(openssl s_client -showcerts
    +-starttls smtp -connect mail.example.com:587 < /dev/null 2>1 | head -1 
    +| cut -d "=" -f 5 | sed 's/ /_/g' | sed 's/_//')" | tail-1)"
    +
    +

    + Polecenie zawinięto, aby zachować poprawne wyświetlanie layout strony +

    +

    + Wyświetlony plik należy skopiować na wyżej + wymienioną ścieżkę. +

    +
    +$ cat /etc/ssl/certs/IRSG_Root_X1.pem | sudo tee -a /etc/postfix/cacert.pem
    +
    +

    + Plik ten może przydać się przy potencjalnych problemach z + rozpoznaniem certyfikatu. +

    +
  18. +
  19. + Problem z adresem nadawcy +

    + Ten punkt tyczy się głównie połączeń z serwerami SMTP, które były + konfigurowane za pomocą materiałów dostępnych na tej stronie. + Dla innych to już jest koniec, teraz można smiało czytać i pisać + maile za pomocą podstawowych UNIX-owych narzędzi. +

    +

    + Restrykcje + wprowadzone na serwerze wyrażają jasno, że by wysłać wiadomość + adres nadawcy musi zgadzać się z mapowaniem. Niestety + GNU mailutils automatycznie przypisuje adres nadawcy + składający się z nazwy użytkownika oraz nazwy komputera. W moim + przypadku było to xf0r3m@e5270, jest to + niezgodne z mapowaniem i wiadomości zostaną odrzucone przez + serwer. Nie znalazłem sposobu, aby obejść to lokalnie + w obrębnie jednego użytkownika, jest możliwość ustawienia + domyślnego adresu nadawcy w obrębie całego systemu. Tworzymy + plik /etc/mailutils.conf, i zapisujemy w nim poniższą + konfigurację. +

    +
    +program mail {
    +
    +  address {
    +    email-addr xf0r3m@example.com;
    +  }
    +
    +};
    +
    +

    + Teraz maile powinny się bez problemu wysyłać. +

    +
  20. +
+

+ Przestawione tutaj rozwiązanie, nie jest pozbawione wad. Mogą pojawić + się problemy ze znalezieniem serwera przez Postfix, ponieważ + faworyzuje on IPv6, można temu zaradzić ustawiając opcję + inet_protocols na ipv4. + Po czym należy kompletnie zrestartować usługę za pomocą + polecenia systemctl. + Problemem też jest nierejestrowanie wiadomości wysłanych, co też + jest do rozwiązania poprzez ustawienie opcji Postfix + always_bcc na swój adres przez co + zaraz po wysłaniu maila dostaniemy zwrotkę z własną wiadomością. + Kolejnym + problemem może być sama obsługa programu mail, po otrzymaniu + wiadomości dostaniemy powiadomienie najczęściej w terminalu. Po + sprawdzeniu tych wiadomości zostaną one przekopiowane do pliku + mbox w naszym katalogu domowym. A co jeśli odczytaliśmy + wiadomość, nie mogliśmy na nią wcześniej odpowiedzieć i chcemy to + zrobić teraz, to kiedy wpisujemy polecenie mail to okazuje + się że domyślna skrzynka jest pusta i musimy uruchomić program z + odpowiednim przełącznikiem i wskazać mu plik skrzynki. +

+
+$ mail -f ~/mbox
+
+

+ Interaktywana praca z tym programem również, może przyprawić o ból + główy, jednak dawno temu nie jaki John Kerl odwalił kawał dobrej + roboty opisując jak używać tego programu. +

+

+ + http://www.johnkerl.org/doc/mail-how-to.html + +

+

+ Rozwiązanie to jest definitywnie hakerskie, dla ludzi nie bojących + pobrudzić sobie rączek. Taka gimnastyka dla mózgu z rana, kiedy + trzeba wysłać maila, będąc w powłowie jeszcze w łóżku. +

+

+ ~xf0r3m +

+
+

+ 2021; COPYLEFT; ALL RIGHTS REVERSED; +

+ + diff --git a/articles/terminallog/Git_-_podstawy_systemu_kontroli_wersji.html b/articles/terminallog/Git_-_podstawy_systemu_kontroli_wersji.html new file mode 100755 index 0000000..ee6bcce --- /dev/null +++ b/articles/terminallog/Git_-_podstawy_systemu_kontroli_wersji.html @@ -0,0 +1,663 @@ + + + + + + + + + +
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ +
+

Git - podstawy systemu kontroli wersji

+ +

+ + Ta strona wymaga aktualizacji, informacje na niej zawarte mogą być niezgodne z prawdą. + +

+

+ W tym jakże krótkim wpisie chciałbym przedstawić podstawową obsługę systemu kontroli wersji Git. Podstawowym zadaniem Git-a jest monitorowanie zmian oraz umożliwienie wycofania modyfikacji w danym pliku. +

+

Podstawy lokalnego systemy kontroli wersji Git

+

+ Folder z danymi, na których pracujemy po zainstalowaniu repozytorium staje się pierwszą warstwą pracy z Git. Tę warstwę nazywamy working directory (ang. katalog roboczy). Natomiast samo repozytorium, które umożliwni nam pracę z Git instalujemy poniższym poleceniem. +

+
+xf0r3m@K52F:~/Dokumenty/landisk $ git init
+
+

+ Czym jest repozytorium? Repozytorium to ukryty katalog wewnątrz katalogu roboczego. W nim znajdują się zapisane i przechowane w odpowiedni sposób zamiany wprowadzone w plikach katalogu roboczego. Po zainstalowaniu repozytorium w katalogu, w którym jakieś pliki już istnieją możemy je dodać wybiórczo, korzystając z poniższego polecenia: +

+
+xf0r3m@K52F:~/Dokumenty/landisk $ git add landisk.sh
+ +

+ lub dodać wszystkie pliki z katalogu, wykorzystując to polecenie: +

+
+xf0r3m@K52F:~/Dokumenty/landisk $ git add .
+
+

+ Nowe pliki są automatycznie zauważane przez Git, jako zmiany w katalogu roboczym. +

+

+ Podając . (kropkę) jako argument polecenia add, dodaliśmy wszystkie plik do naszego repozytorium. Rozważmy teraz taki scenariusz, że nasze repozytorium zawiera bardzo dużo plików. Moglibyśmy skorzystać z polecenia git add . jednak w naszym repozytorium znajdują się pliki, których nie chcemy monitorować, w tej sytuacji możemy regulować, które pliki mają być monitorowane, a które nie. Służy temu specjalny plik Git-a, umieszczany w repozytorium: .gitignore. W tym pliku umieszczamy nazwy katalogów, plików (w nazwach plików możemy używać symbolu wieloznaczności *) lub ścieżki, które mają zostać pominięte podczas monitorowania katalogu przez Git. Pamiętać należy o tym że ten plik jest ukryty. +

+

+ Wszystkie zauważone przez Git zmiany możemy sprawdzić za pomocą polecenia: +

+
+xf0r3m@K52F:~/Dokumenty/landisk $ git status
+
+

+ Z informacji zwróconych przez polecenie, możemy sprawdzić stan naszych plików, teraz po dodaniu plików do monitorowania mamy informacje o zamianach w naszym katalogu roboczym. Korzystanie z Git-a, nie jest wcale trudne, sam Git daje nam podpowiedzi, aby usunąć jakiś plik z obecnego stanu przejściowego wydajemy poniższe polecenie. Uwaga! Usunięcie plików ze stanu przejściowego nie spowoduje przywrócenia pliku przed zmianami. Plik zostanie pominięty podczas zapisywania go zapisywania go w repozytorium: +

+
+xf0r3m@K52F:~/Dokumenty/landisk $ git rm --cached <nazwa_pliku>
+
+

+ Czym jest ten stan przejściowy? Otóż podczas pracy z Git-em, operujemy tak naprawdę na trzech płaszczyznach. +

+
+ Diagram with local repository workflow +
+

+ Pierwszy z nich to katalog roboczy, na plikach w tym katalogu są dokonywane przez nas zmiany, te zmiany są rejestrowane w tak zwanym stanie przejściowym. Ten stan przechowuje wszystkie zmiany przed zapisaniem ich w repozytorium, tworzy tymczasowe migawki plików, w których dokonano zmian. Ze stanu przejściowego bardzo łatwo cofnąć zmiany wystarczy jedno polecenie. +

+
+xf0r3m@K52F:~/Dokumenty/landisk $ git checkout landisk.sh
+
+

+ Podając jako argument nazwę pliku przywracamy tylko konkretny plik, warto zauważyć że po wydaniu tego polecenia, zmiany zarejestrowane przez Git w pliku zostają wycofane oraz zostaje on usunięty ze stanu przejściowego. Zamiast nazwy pliku możemy użyć kropki (.), wtedy przywrócimy wszystkie pliki. Warto pamiętać, że polecenie checkout wycofuje zmiany tylko z stanu przejściowego. To polecenie nie działa na nowe pliki. Jak widzimy możemy sobie swobodnie balansować pomiędzy stanem przejściowym, a katalogiem roboczym. W edytorze naciskamy ctrl+s, Git od razu wyłapuje zmianę, testujemy, coś nie działa, wydajemy polecenie git checkout, zmiany zostały wycofane, kiedy jednak jesteśmy pewni że nasz kod działa możemy dokonać zatwierdzenia. Zatwierdzenie jest dokonywane z plików, których zmiany zostały uwzględnione w stanie przejściowym. + To co znajduje się w stanie przejściowym sprawdzamy poleceniem git status. Zatwierdzenie dokonuje takiej stałej migawki, którą będzie mogli przywrócić nie zależnie od tego ile zmian było już plikach projektu, kiedy przy poleceniu checkout możemy cofnąć tylko ostatnią zmianę. Aby dokonać zatwierdzenia, wydajemy następujące polecenie. +

+
+xf0r3m@K52F:~/git_lab/repo1$ git commit -am "Pierwsze pliki"
+[master (root-commit) 7f5135a] Pierwsze pliki
+ 2 files changed, 9 insertions(+)
+ create mode 100644 imiona
+ create mode 100644 kolory
+
+

+ Opcja -a w poleceniu powoduje uwzględnienie wszystkich zmodyfikowanych plików, z kolei -m powoduje dodanie komentarza do zatwierdzenia. Sprawdzenie stanu repozytorium dokonujemy za pomocą polecenia +

+
+xf0r3m@K52F:~/git_lab/repo1$ git log --pretty=oneline
+7f5135af8bca2dad1d9f1d7c7db34990a6115efa (HEAD -> master) Pierwsze pliki
+
+

+ Jak widzimy repozytorium jest takim miejscem przechowywania zatwierdzeń. Teraz dokonamy zmian w plikach aby mieć jeszcze jedno zatwierdzenie w repozytorium. Po wiedzmy że w tym zatwierdzeniu powinny być dwa pliki zmienione nie tylko jeden. Z repozytorium pliki możemy przywrócić na dwa sposoby: do stanu przejściowego (git reset --soft) oraz do katalogu roboczego (git reset --hard), jeśli chcemy dodać po prostu plik wycofując stare zatwierdzenie i utworzyć nowe tym razem obejmujące wszystkie pliki, wybierzemy opcje --soft. Jako argument opcji --soft podajemy to zatwierdzenie, z którego chcemy przywrócić pliki, nie te które ostatnio wprowadziliśmy, w którym znajduje się nasz błąd. +

+
+1f7ecc0bca359431bf11493358fd1f87e24fc341 (HEAD -> master) Zmiany w imionach
+7f5135af8bca2dad1d9f1d7c7db34990a6115efa Pierwsze pliki
+
+

+ Więc jako argument opcji --soft podamy ID zatwierdzenia 7f5135. Po przywróceniu zatwierdzenie opisane jako "Zmiany w imionach" przestaje istnieć. Słowo o commit ID. Każde zatwierdzenie jest identyfikowane przez Git za pomocą długiego ciągu znaków zapisanego w systemie heksadecymalnym, który występuje w pierwszej kolumnie danych zwracanych przez polecenie git log --pretty=oneline. Commit ID jest sześcioma pierwszymi znakami tego ciągu. +

+

+ To kiedy wydamy polecenie +

+
+xf0r3m@K52F:~/git_lab/repo1$ git status
+
+

+ Otrzymamy taką odpowiedź (o ile nie wprowadziliśmy żadnych w innych plikach) od Git. +

+
+On branch master
+Changes to be committed:
+  (use "git restore --staged <file>..." to unstage)
+	zmodyfikowany: imiona
+
+

+ Jeśli zmieniliśmy jakieś pliki to odpowiedź będzie taka jak poniżej: +

+
+On branch master
+Changes to be committed:
+  (use "git restore --staged <file>..." to unstage)
+	zmodyfikowany: imiona
+
+Changes not staged for commit:
+  (use "git add <file>..." to update what will be committed)
+  (use "git restore <file>..." to discard changes in working directory)
+	zmodyfikowany: kolory
+
+

+ Teraz aby dodać te pliki należy wydać polecenie git add <nazwa_pliku> w tym przypadku są to kolory. +

+

+ Na tym przykładzie lepiej widać jak działa stan przejściowy. Kiedy plik zostaje zmodyfikowany, trafia on do stanu przejściowego jednak nie jest oznaczony jako plik do zatwierdzenia, dlatego wydajemy polecenie commit wraz opcją -a, aby nie musieć dodawać plików jako "do zatwierdzenia". Tylko zatwierdzać wszystkie zmodyfikowane pliki. Gdybyśmy nie stosowali tej opcji, to należało by każdy nieoznaczony plik dodać za pomocą polecenia add. +

+

+ Pozostała w sumie ostatnia podstawowa czynność jaką możemy wykonać czyli przywrócić pliki z repozytorium bezpośrednio do katalogu roboczego. Aby wykonać tą czynność wydajemy polecenie. +

+
+xf0r3m@K52F:~/git_lab/repo1$ git reset --hard 7f5135
+
+

+ Przy tym poleceniu z ID commit-u jest identycznie. Ten commit, który wybraliśmy jest oznaczony jako HEAD, czyli główny commit repozytorium. +

+

 

+

Prywatne, zdalne repozytorium

+

+ Teraz utworzymy sobie w prosty sposób zdalne repozytorium, będzie to wymagać jedynie kilka poleceń w powłoce, ponieważ połączenia będziemy realizować za pomocą SSH. +

+

+ Na naszym serwerze sprawdzamy czy jest dostępny Git. Jeśli jest dostępny to możemy przejść od razu do tworzenie nowego użytkownika. Jeśli po wydaniu polecenia git dostajemy informacje o tym, że nie można odnaleźć polecenia, to wydajemy polecenie odpowiednie dla naszej dystrybucji, które zainstaluje Git w systemie. +

+
+ubuntu@gitssh:~$ sudo apt install git
+
+

+ Kiedy Git znajduje się już w systemie, lub został przed chwilą zainstalowany, tworzymy użytkownika, który w swoim folderze domowym będzie przechowywał nasze repozytoria. +

+
+ubuntu@gitssh:~$ sudo adduser git
+
+

+ W tym momencie (najlepiej zaraz po utworzeniu użytkownika), podać nasz klucz publiczny do logowania przez SSH nowemu użytkownikowi. +

+
+xf0r3m@K52F:~$ ssh-keygen
+xf0r3m@K53F:~$ ssh-copy-id git@gitssh
+
+

+ Teraz kiedy już możemy zalogować się bez hasła, zalogujemy się na serwer jako git. Następnie tworzymy nowy katalog o nazwie git-shell-commands oraz nadamy mu odpowiednie uprawnienia. +

+
+git@gitssh:~$ mkdir git-shell-commands
+git@gitssh:~$ chmod 775 git-shell-commands
+
+

+ Wylogowujemy się z tego użytkownika, a następnie logujemy się na użytkownika z uprawnieniami administracyjnymi, po zalogowaniu w pliku /etc/passwd zmieniamy domyślną powłokę dla użytkownika git z /bin/bash na /usr/bin/git-shell. Zapisujemy zmiany w pliku. +

+
+git:x:1001:1001:git,,,:/home/git:/usr/bin/git-shell
+
+

+ Teraz kiedy wydamy polecenie su git ukaże nam się taki obraz (aby wyjść wydajemy polecenie exit): +

+
+git>
+
+

+ Aby jednak uruchomić normalną powłokę UNIX-ową dla tego użytkownika musimy zalogować się jako root. Następnie wydać poniższe polecenie. +

+
+root@gitssh:/home/ubuntu$ su -s /bin/bash - git
+
+

+ Teraz zalogujemy się do powłoki bash na użytkowniku git i utworzymy katalog naszego repozytorium: +

+
+git@gitssh:~$ mkdir example.git
+
+

+ Wewnątrz utworzonego przez nas katalogu wydajemy poniższe polecenie: +

+
+git@gitssh:~/example.git$ git --bare init
+
+

+ Po wydaniu tego polecenia, nasze repozytorium jest gotowe, w celach testowych możemy przesłać na niego pusty plik README. +

+
+xf0r3m@K52F:/git_lab/repo3$ touch README.md
+xf0r3m@K52F:/git_lab/repo3$ git init
+Initialized empty Git repository in /home/xf0r3m/git_lab/repo3/.git/
+xf0r3m@K52F:/git_lab/repo3$ git add .
+xf0r3m@K52F:/git_lab/repo3$ git commit -am "first commit"
+[master (root-commit) 5bafc2b] first commit
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ create mode 100644 README.m
+xf0r3m@K52F:/git_lab/repo3$ git remote add origin ssh://git@192.168.56.211/~/example.git
+xf0r3m@K52F:/git_lab/repo3$ git push origin master
+Enumerating objects: 3, done.
+Counting objects: 100% (3/3), done.
+Writing objects: 100% (3/3), 209 bytes | 209.00 KiB/s, done.
+Total 3 (delta 0), reused 0 (delta 0)
+To ssh://192.168.56.211/~/example.git
+ * [new branch]      master -> master
+
+

+ Powyżej mamy listing z terminala, użyłem tutaj dwóch nowych poleceń, które często będą wykorzystywane przez nas podczas pracy ze zdalnym repozytorium. Pierwsze polecenie: +

+
+xf0r3m@K52F:/git_lab/repo3$ git remote add origin ssh://git@192.168.56.211/~/example.git
+
+

+ dodaje pod nazwą origin adres do zdalnego repozytorium do naszej lokalnej konfiguracji Git. Dzięki tej nazwie łatwiej będzie nam wpychać (przesyłać) nasze repozytorium na zdalny Git. Drugie polecenie: +

+
+git push origin master
+
+

+ powoduje wepchnięcie gałęzi o nazwie master (głównego repozytorium) na zdalne repozytorium, którego adres kryje się po nazwą origin. +

+

+ Zdalne repozytorium po SSH jest dobre kiedy w szybki, prosty i bezpieczny sposób musimy stworzyć prywatne repozytorium. Jednak do pracy w wieloma użytkownikami jest ono nadzwyczaj nie wygodne, ponieważ każdy użytkownik musi zalogować się jako root, aby utworzyć kolejne repozytorium. +

+

+ Obecnie dostępne są trzy sprawne pakiety oprogramowania zapewniające usługę zdalnego repozytorium obsługiwane z poziomu WWW. Taki GitHub tylko że hostowany na swoich serwerach. Poniżej przedstawię instalację wszystkich trzech pakietów. Obsługa nie jest trudna, wystarczy czytać ze zrozumieniem i nie bać się eksperymentować. Jak co się uszkodzi to zawsze możemy zainstalować to jeszcze raz z poniższych poradników lub mieć z tyłu głowy zapisane, aby zrobić kopie zapasową naszego środowiska testowego przed wprowadzeniem jakieś poważnej zmiany, prawda ? +

+

 

+

GitLab

+

+ Na początek weźmiemy pod lupę pierwszy najbardziej zaawansowany i w sumie najłatwiejszy do zainstalowania - GitLab. Moim środowiskiem testowym to przedstawienia instalacji była maszyna wirtualna VirtualBox z Ubuntu Server 20.04, nie radze używać kontenerów chyba że uprzywilejowanych, ponieważ GitLab podczas swojej instalacji zmienia kilka ustawień kernela. +

+

+ Dokonujemy aktualizacji repozytoriów z paczkami oprogramowania następnie instalujemy niezbędne w systemie pakiety. W Ubuntu Server 20.04, wymagane oprogramowanie jest już zainstalowane, jednak kiedy korzystamy z 18 lub 16.04 warto upewnić się czy te pakiety są już w naszym systemie. +

+
+xf0r3m@gitlab:~$ sudo apt update
+xf0r3m@gitlab:~$ sudo apt install curl openssh-server ca-certificates tzdata
+
+

+ Instalacje Postfix możemy pominąć. +

+

+ Teraz dodamy repozytoria GitLab do naszych repozytoriów systemowych. +

+
+xf0r3m@gitalab:~$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
+
+

+ Właściwa instalacja GitLab odbywa się za pomocą APT. Jednak przed wydaniem polecenia należy zdefiniować w zmiennej EXTERNAL_URL, adres pod którym nasz GitLab będzie dostępny. +

+
+xf0r3m@gitlab:~$ sudo EXTERNAL_URL="http://192.168.0.211" apt install gitlab-ce
+
+

+ Instalacja GitLab może potrwać nawet do dwóch godzin w zależności od łącza internetowego oraz mocy obliczeniowej naszego sprzętu. O zakończeniu instalacji zostaniemy poinformowani odpowiednim komunikatem. Po zainstalowaniu możemy przejść pod adres, który podaliśmy w zmiennej EXTERNAL_URL. Po załadowaniu strony, zostaniemy poproszeni o zdefiniowanie hasła dla użytkownika administracyjnego GitLab. Teraz możemy zalogować się, podając w nazwie użytkownika nazwę root. Jeśli zdecydujemy się na użycie GitLab jako naszego zdalnego repozytorium, to należało by użyć HTTPS. Aby to zrealizować należy: +

+
    +
  1. Zmienić w pliku /etc/gitlab/gitlab.rb wartość opcji EXTERNAL_URL. Zmieć protokół na HTTPS następnie podać nazwę domeny, pod którą GitLab będzie dostępny.
    +
    +xf0r3m@gitlab:~$ sudo vi /etc/gitlab/gitlab.rb
    +
    +

    + Wewnątrz pliku odszukujemy opcję EXTERNAL_URL i ustawiamy jej wartość na adres pod którym będzie widoczny GitLab. +

    +
    +EXTERNAL_URL="https://gitlab.morketsmerke.net"
    +
    +
  2. +
  3. Utworzyć katalog ssl wewnątrz katalogu /etc/gitlab, nadać mu uprawnienia 755 następnie przekopiować do tego katalogu nasze pliki certyfikatu.
    +
    +xf0r3m@gitlab:~$ sudo mkdir -p /etc/gitlab/ssl
    +xf0r3m@gitlab:~$ sudo chmod 755 /etc/gitlab/ssl
    +xf0r3m@gitlab:~$ sudo cp *.pem /etc/gitlab/ssl
    +
    +
  4. +
  5. Następnie wydajemy polecenie:
    +
    +xf0r3m@gitlab:~$ sudo gitlab-ctl reconfigure
    +
    +
  6. +
+

+ Po zakończeniu rekonfiguracji GitLab powinien być dostępny pod adresem jaki podaliśmy w zmiennej EXTERNAL_URL, po protokole HTTPS. +

+

+ Kolejnym oprogramowaniem umożliwiającym nam łatwe utworzenie ogólnodostępnego zdalnego repozytorium Git-a będzie Gogs. +

+

 

+

Gogs

+

+ Instalacje Gogs-a w naszym systemie rozpoczynamy od zainstalowania jakiegoś pakietu bazodanowego np. MySQL. +

+
+xf0r3@gogs:~$ sudo apt install mysql-server mysql-client
+
+

+ Następnie pobieramy najnowszą paczkę z Gogs-em z https://gogs.io/docs/installation/install_from_binary +

+
+xf0r3m@gogs:~$ wget https://dl.gogs.io/0.12.1/gogs_0.12.1_linux_amd64.tar.gz
+
+

+ Po pobraniu rozpakowujemy paczkę. +

+
+xf0r3m@gogs:~$ tar -xzvf gogs_0.12.1_linux_amd64.tar.gz
+
+

+ W katalogu gogs/scripts będzie plik o nazwie mysql.sql. Otwieramy go i dopisujemy dwie linie. +

+
+CREATE USER 'gogs'@'localhost' IDENTIFIED BY 'Trudn3Hasl0DOMysql';
+GRANT ALL ON gogs.* TO 'gogs'@'localhost';
+
+

+ Zapisujemy zmiany w pliku, następnie tworzymy bazę dla Gogs. +

+
+xf0r3m@gogs:~/gogs/scripts$ sudo mysql < mysql.sql
+
+

+ Teraz tworzymy nowego użytkownika np. o nazwie git. To na jego katalogu domowym będą tworzone repozytoria użytkowników oraz to z jego uprawnieniami będzie uruchamiany Gogs. +

+
+xf0r3m@gogs:~$ sudo adduser git
+
+

+ Kopiujemy na jego katalog domowy naszą paczkę z Gogs. +

+
+xf0r3@gogs:~$ sudo cp gogs_0.12.1_linux_amd64.tar.gz /home/git
+
+

+ Przechodzimy na jego katalog domowy, albo przez sudo su i następnie su git lub bezpośrednio su git. Tam wypakowujemy naszą paczkę. +

+
+xf0r3m@gogs:~$ su git
+Password:
+git@gogs:~$ tar -xzvf gogs_0.12.1_linux_amd64.tar.gz
+
+

+ Teraz możemy uruchomić nasz serwer. Uwaga! Jeśli uruchamiamy naszego Gogs-a w środowisku produkcyjnym, to przed pierwszym uruchomieniem serwera należy wykonać czynność opisane poniżej, w przeciwnym wypadku możemy przejść do uruchomienia serwera. +

+

+ Poniżej przedstawię jak należy skonfigurować Nginx jako reverse proxy, aby nasz serwer Gogs był widoczny pod konkretnym adresem oraz pod klasycznym portem HTTPS. +

+

+ Na początku w katalogu /etc/ssl tworzymy katalog o nazwie gogs. +

+
+xf0r3m@gogs:~$ sudo mkdir -p /etc/ssl/gogs
+
+

+ Następnie kopiujemy do niego pliki certyfikatu +

+
+xf0r3@gogs:~$ sudo cp *.pem /etc/ssl/gogs
+
+

+ Teraz instalujemy nginx. +

+
+xf0r3m@gogs:~$ sudo apt install nginx
+
+

+ Po zainstalowaniu pakietu, w katalogu /etc/nginx/sites-enabled tworzymy plik o nazwie gogs następnie w nim wklejmy poniższą konfiguracje. +

+
+server {
+    listen 443 ssl;
+    server_name git.example.com;
+		root /var/www/html/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)
+
+		location / {
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header Host $http_host;
+        proxy_pass http://127.0.0.1:3000;
+		}
+
+    ssl on;
+    ssl_certificate /etc/ssl/gogs/fullchainX.pem;
+    ssl_certificate_key /etc/ssl/gogs/privkeyX.pem;
+    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+
+    ssl_session_timeout 5m;
+    client_max_body_size 50m;
+}
+
+

+ W pliku zmieniamy: +

+
    +
  • server_name - podajemy nazwę, pod którą Gogs będzie widoczny.
  • +
  • proxy_pass - podajemy adres oraz port, na którym nasłuchuje główny proces serwera Gogs
  • +
  • ssl_certificate - podajemy ścieżkę do pliku certyfikatu
  • +
  • ssl_certificate_key - podajemy ścieżkę do pliku klucza prywatnego certyfikatu.
  • +
+

+ Restartujemy nginx: +

+
+xf0r3m@gogs:~$ sudo systemctl restart nginx
+
+

+ Sprawdzamy czy serwer wystartował prawidłowo: +

+
+xf0r3m@gogs:~$ sudo systemctl status nginx
+
+

+ Jeśli nginx wystartował poprawnie lub uruchamiamy gogs dla celów testowych to możemy, uruchomić serwer a następnie instalacje Gogs, na którą wchodzimy przez adres zdefiniowany w parametrze server_name. +

+
+git@gogs:~$ gogs/gogs web
+2020/09/13 08:54:43 [ WARN] Custom config "/home/git/gogs/custom/conf/app.ini" not found. Ignore this warning if you're running for the first time
+2020/09/13 08:54:43 [TRACE] Log mode: Console (Trace)
+2020/09/13 08:54:43 [ INFO] Gogs 0.12.1
+2020/09/13 08:54:43 [TRACE] Work directory: /home/git/gogs
+2020/09/13 08:54:43 [TRACE] Custom path: /home/git/gogs/custom
+2020/09/13 08:54:43 [TRACE] Custom config: /home/git/gogs/custom/conf/app.ini
+2020/09/13 08:54:43 [TRACE] Log path: /home/git/gogs/log
+2020/09/13 08:54:43 [TRACE] Build time: 2020-08-27 07:07:30 UTC
+2020/09/13 08:54:43 [TRACE] Build commit: 43fc8260850090b55d4ee2586a819b3b6c016279
+2020/09/13 08:54:43 [ INFO] Run mode: Development
+2020/09/13 08:54:43 [ INFO] Listen on http://0.0.0.0:3000
+
+

+ Do stworzenia w dużej mierze (90 kilku %) Gogs wykorzystano język programowania Go. Dlatego podobnie do aplikacji stworzonych w Node.js, Gogs startuje na wysokim porcie, aby mógł wystartować na porcie poniżej 1024 musi zostać uruchomiony jako root, co nie jest zalecane. Adres z portem 3000 na końcu przepiszemy do naszej przeglądarki zamiast zer, podstawimy adres naszej maszyny. +

+

+ Po wpisaniu naszego zmienionego adresu w przeglądarkę, wyświetli nam się strona instalacyjna. Co zmieniamy? +

+
    +
  • Hasło MySQL do użytkownika Gogs - musimy podać hasło jakie podaliśmy przy zakładaniu bazy.
  • +
  • Nazwa aplikacji - według uznania.
  • +
  • Domena - podajemy adres IP maszyny (w przypadku środowiska testowego) lub domenę (w przypadku środowiska produkcyjnego).
  • +
  • Adres URL aplikacji - podobnie do domeny (w przypadku środowiska testowego) lub https://git.naszadomena.org (w przypadku środowiska produkcyjnego)
  • +
+

+ Po zainstalowaniu zostaniemy przyniesieni nas stronę logowania. Jednak naszą pracę z Gogs-em zaczniemy od utworzenia konta. Pierwszy zarejestrowany użytkownik dostaje uprawnienia administracyjne. Pod formularzem logowania znajduje się odnośnik kierujący nas do formularza rejestracji. Wypełniamy wszystkie pola i rejestrujemy użytkownika, po zarejestrowaniu zostaniemy przeniesieni z powrotem na stronę logowania, logujemy się nowo utworzonym użytkownikiem i mamy Gogs-a do dyspozycji. +

+

+ Powiedzmy że mamy zainstalowany Gogs (w wersji produkcyjnej) i musimy wyłączyć nasz serwer. Po jego ponownym uruchomieniu i próbie połączenia z Gogs otrzymujemy błąd "502 Bad Gateway". Oznacza on mniej więcej tyle że proxy nie ma gdzie przekierować danych ponieważ usługa na podanym przez nas adresie i porcie nie odpowiada. Gogs nie został uruchomiony po starcie systemu. Musimy go uruchomić ręcznie. Jednak uruchamianie Gogs-a po każdym resecie serwera nie jest raczej mile widziane. Współczesne systemy, tak jak w moim przypadku Ubuntu posiadają bardzo zaawansowaną obsługę poziomów uruchomienia systemu jednym z nich jest systemd. Za uruchomienie konkretnych usług w danym momencie odpowiadają specjalne skrypty systemd, Gogs w swoich plikach instalacyjnych również posiada taki skrypt. +

+

+ + Aby dodać Gogs do autostartu, wystarczy że skopiujemy plik gogs.service z katalogu gogs/scripts/systemd do /etc/systemd/system następnie wydamy polecenie: + +

+
+xf0r3m@gogs:~$ sudo systemctl enable gogs.service
+
+

+ W pliku nie musimy nic zmieniać, ponieważ tak zainstalowaliśmy Gogs-a, że nasze ścieżki do danych Gogs pokrywają się tymi w pliku usługi. To polecenie spowoduje zarejestrowanie nowej usługi na danym poziomie uruchomienia. +

+

+ Ostatnim pakietem jaki będziemy instalować jest Gitea. Jej instalacja jest bardzo podobna do Gogs-a. +

+

 

+

Gitea

+

+ A więc instalacje Gitei rozpoczynamy od zainstalowania na serwerze systemu bazodanowego może być to MySQL może być to MariaDB lub PostgreSQL. +

+
+xf0r3m@gitea:~$ sudo apt install mysql-client mysql-server
+
+

+ Następnym krokiem jest stworzenie bazy danych. +

+
+xf0r3m@gitea:~$ sudo mysql
+mysql> CREATE DATABASE gitea;
+-- ciach --
+mysql> CREATE USER 'gitea'@'localhost' IDENTIFIED BY '2up3rT4jn3H4s|_0';
+-- ciach --
+mysql> GRANT ALL ON gitea.* TO 'gitea'@'localhost';
+
+

+ Kolejną czynnością jest utworzenie użytkownika, z którego uprawnieniami będziemy uruchamiać Giteę. W tym przypadku stworzymy użytkownika systemowego poniższym poleceniem. +

+
+xf0r3m@gitea:~$ sudo adduser --system --shell /bin/bash --group --disable-password --home /home/git git
+
+

+ Po stworzeniu użytkownika, możemy utworzyć niezbędne dla Gitei katalogi. +

+
+xf0r3m@gitea:~$ sudo mkdir -p /home/git/{custom,data,log}
+xf0r3m@gitea:~$ sudo chown -R git:git /home/git
+xf0r3m@gitea:~$ sudo chmod -R 750 /home/git
+xf0r3m@gitea:~$ sudo mkdir /etc/gitea
+xf0r3m@gitea:~$ sudo chown root:git /etc/gitea
+xf0r3m@gitea:~$ sudo chmod 770 /etc/gitea
+
+

+ Po instalacji będziemy, musieli pamiętać o odebraniu uprawnień do zapisu w katalogu /etc/gitea oraz w pliku /etc/gitea/app.ini. +

+

+ Teraz przelogujemy się na użytkownika git. +

+
+xf0r3m@gitea:~$ sudo su
+root@gitea:/home/xf0r3m# su git
+
+

+ Bezpośrednio do katalogu domowego ściągamy plik binarny Gitei. Kiedy plik znajdzie się już na serwerze możemy go uruchomić i zainstalować Giteę. +

+
+git@gitea:~$ GITEA_WORK_DIR=/home/git ./gitea web -c /etc/gitea/app.ini
+
+

+ Nie musimy przejmować się brakiem pliku /etc/gitea/app.ini. Zostanie on utworzony podczas instalacji. Kiedy nasz serwer wystartuje możemy przejść pod http://<ip_serwera>:3000. Naszym oczom ukaże się strona startowa, podobna do tej, którą znamy z Gogs. Wygląda to trochę jakby nie trzeba było tego instalować, mamy w prawym górnym rogu dwa odnośniki Zaloguj się oraz Zarejestruj się, z racji tego iż musimy zarejestrować pierwszego użytkownika (pierwszy zarejestrowany użytkownik zyskuje uprawnienia administracyjne) klikamy w odnośnik Zarejestruj sie i wyświetla nam się stroną instalacji, którą już znamy z Gogs. Uzupełniamy lub zmieniamy te pola, jakie zostały wymienione przy okazji Gogs-a. Po zainstalowaniu zostaniemy przekierowani na stronę logowania, klikamy odnośnik pod przyciskiem aby zarejestrować pierwszego użytkownika. Następnie możemy się już logować. +

+

+ Dla Gitei również dostępny jest plik usługi po tym adresem https://github.com/go-gitea/gitea/blob/master/contrib/systemd/gitea.service, w którym musimy zmienić parę opcji, m.in. wskazać jakiego systemy bazodanowego użyliśmy, aby wstrzymać uruchamianie Gitei do momentu uruchomienia bazy danych. Poniżej znajduje się zawartość pliku gitea.service przygotowana dla przedstawionej tutaj instalacji Gitei. +

+
+[Unit]
+Description=Gitea (Git with a cup of tea)
+After=syslog.target
+After=network.target
+###
+# Don't forget to add the database service requirements
+###
+#
+Requires=mysql.service
+#Requires=mariadb.service
+#Requires=postgresql.service
+#Requires=memcached.service
+#Requires=redis.service
+#
+###
+# If using socket activation for main http/s
+###
+#
+#After=gitea.main.socket
+#Requires=gitea.main.socket
+#
+###
+# (You can also provide gitea an http fallback and/or ssh socket too)
+#
+# An example of /etc/systemd/system/gitea.main.socket
+###
+##
+## [Unit]
+## Description=Gitea Web Socket
+## PartOf=gitea.service
+##
+## [Socket]
+## Service=gitea.service
+## ListenStream=<some_port>
+## NoDelay=true
+##
+## [Install]
+## WantedBy=sockets.target
+##
+###
+
+[Service]
+# Modify these two values and uncomment them if you have
+# repos with lots of files and get an HTTP error 500 because
+# of that
+###
+#LimitMEMLOCK=infinity
+#LimitNOFILE=65535
+RestartSec=2s
+Type=simple
+User=git
+Group=git
+WorkingDirectory=/home/git
+# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
+# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
+#RuntimeDirectory=gitea
+ExecStart=/home/git/gitea web --config /etc/gitea/app.ini
+Restart=always
+Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/home/git
+# If you want to bind Gitea to a port below 1024, uncomment
+# the two values below, or use socket activation to pass Gitea its ports as above
+###
+#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
+#AmbientCapabilities=CAP_NET_BIND_SERVICE
+###
+
+[Install]
+WantedBy=multi-user.target
+
+

+ Ten plik umieszczamy w katalogi /etc/systemd/system następnie wydajemy polecenie: +

+
+xf0r3m@gitea:~$ sudo systemctl enable gitea.service
+
+

+ Jeśli jeszcze tego zrobiśmy to teraz zatrzymamy naszą ręcznie uruchomioną Giteę, naciskając w oknie połaczonego z serwerem terminala Ctrl+c. Następnie wydajemy poniższe polecenia. Te polecenia zmieniają uprawnienia do pliku konfiguracyjnego Gitei. +

+
+xf0r3m@gitea:~$ sudo chmod 750 /etc/gitea
+xf0r3m@gitea:~$ sudo chmod 640 /etc/gitea/app.ini
+
+

+ Na końcu możemy uruchomić naszą usługę z Giteą. +

+
+xf0r3m@gitea:~$ sudo systemctl start gitea.service
+
+

+ Jeśli chcemy Giteę uruchomić w środowisku produkcyjnym, to przydałby się HTTPS. Reverse proxy dla Gitei uruchomiamy identycznie jak dla Gogs. Nawet możemy użyć tego samego pliku konfiguracyjnego. +

+

 

+

Podsumowanie

+

+ Pomiędzy tymi trzema, który wybrać. Osobiście jeśli potrzebujemy na wczoraj skonfigurować ogólnodostępnego prostego zdalnego Gita, to wybrał bym Gogsa. Instaluje się go szybko i bez wiekszych problemów, prawdopodbnie zawiera wszystko co potrzeba. +

+

+ Jeśli jesteśmy na prawdę dużymi leniami, lub nie dysponujemy żadną mocą obliczeniową, którą możemy swobodnie zarządzać z Internetu, to czwartą opcją najmniej bolesną pozostaje konto na GitHub. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/terminallog/Linux.Podstawy.html b/articles/terminallog/Linux.Podstawy.html new file mode 100644 index 0000000..9b0d34d --- /dev/null +++ b/articles/terminallog/Linux.Podstawy.html @@ -0,0 +1,8065 @@ + + + + + + + + +
+    __    _                       ____            __     __                      
+   / /   (_)___  __  ___  __     / __ \____  ____/ /____/ /_____ __      ____  __
+  / /   / / __ \/ / / / |/_/    / /_/ / __ \/ __  / ___/ __/ __ `/ | /| / / / / /
+ / /___/ / / / / /_/ />  <_    / ____/ /_/ / /_/ (__  ) /_/ /_/ /| |/ |/ / /_/ / 
+/_____/_/_/ /_/\__,_/_/|_(_)  /_/    \____/\__,_/____/\__/\__,_/ |__/|__/\__, (_)
+                                                                        /____/   
+
+
+

+ ☠ morketsmerke ☠ +

+
+

Linux. Podstawy.

+
+

Spis treści

+ +
+

+ Opisywany tutaj materiał będzie kompatybilny z dystrybucjami + pochodnymi od GNU/Linux Debian zarówno tymi opartymi na + systemd jak sysvinit oraz tymi z rodziny + RHEL/Fedora/CentOS. +

+

+ GNU/Linux czy raczej sam Linux? Sama nazwa, jest już tematem dość + kontrowersyjnym. Ludzie związani z projektem GNU twierdzą, że ta + pierwsza liczba jest właściwa ponieważ wskazuje ona na to, że isotne + elemnty projektu GNU zostały wykorzystane do stworzenia tego systemu. + W mowie potocznej jednak przyjęło się użycie tej drugiej nazwy. Jest + to jedno, łatwe do zapamiętania słowo. Jeśli mówimy następujące + zdanie wyrażające chęć zainstalowania na jakiejś maszynie omawianego + tutaj systemu, mówimy że "zainstalujemy jakiegoś Linuksa". Słowo + "jakiegoś" zostało tu użyte w kontekscie wyboru konkretnej + dystrybucji. Co to dystrybucja wyjaśnie za chwilę. Bez projektu GNU + niebyło by Linuksa. Wydaje mi się, że każdy kto jest nieco bardziej + związany z tym środowiskiem o tym wie. Ja również jestem tego świadom + dla tego też w tym dokumencie użyje nazwy Linux. Poprostu. +

+

1. Budowa systemu Linux

+

+ Nie zagłebiając się w szczegóły, to Linux składa się z + jądra oraz + przestrzeni użytkownika. Oba kompomenty rezydują w + pamięci więc + wiele, nie które teksty popularno-naukowe mogą włączać pamięć lub + ogólnie sprzęt do składowych systemu operacyjnego Linux, w mojej + opinii jest raczej cecha wykorzystywanych przez nas komputerów + konwencjonalnych. +

+

+ Mówiąc o jądrze możemy wskazać konktretny program, konkretny plik. + W przypadku przestrzeni użytkownika, w systemie nie istnieje żaden + namacalny byt cyfrowy jak w przypadku jądra. Przestrzeń użytkownika + jest bowiem warstwą abstrakcji - czyli terminem, + bądź założeniem wykorzystywanym w celu określenia czynności, funkcji, + zjawiska bez wdawania się w szczegóły. Przestrzeń użytkownika jest + miejscem uruchamiania procesów użytkownika. Procesy + to nic innego jak wystąpienia programów uruchomionych przez + użytkownika. Nie wszystkie procesy są programami użytkownika w + dosłownym tych słów znaczeniu. Część tych procesów to programy + wspomagające wykorzystanie komputera i jego zasobów. Bez nich systemy + operacyjne dalej mogły by spełniać swoją rolę, jednak nie miały by + powszechnie znanej nam dzisiaj formy. Przestrzeń użytkownika składa + się z wielu ogólno dostępnych kompnentów ich istnienie w danej wersji + systemu oraz ich konfiguracja sprawia, iż nie mamy doczynienia z + gotowym jednolitym produktem, ale z dystrybucją. Z jedną z wersji, + gdzie ktoś + wziął jądro, które jest ogolno dostępne i skomponował przestrzeń + użytkownika. Obecnie na rynku mamy dostępnych ok. 600 dystrybucji. + Wiekszość z nich to pochodne innych, oryginalnych rozwiązań + rozwijanych przez setki osób na całym świecie. Kilka takich głównych + dystrybucji, znajduje się w tabeli poniżej. Przejrzałem większość z + nich, a z częsci osobiście korzystałem. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LogoNazwaOpis
linux-mint-logo32Linux Mint + Dystrybucja bardzo przyjazna użytkownikowi. Wykorzystywana + przez nowych niedoświadczonych użytkowników system Linux. + Pod czas + instalacji mogą być instalowane nie wolne moduły oraz nie + wolne oprogramownie. Jej głównym zadaniem jest sprzyjanie + użytkownikowi i umożliwienie mu wykorzystanie Linuksa przy + codziennym wykorzystaniu komputera. Mint rozwijany jest przez + społeczność zebraną wokół niego. +
ubuntu-logo32Ubuntu + Podobnie jak Linux Mint, Ubuntu również jest skierowane dla + osób ceniących sobie wygodne i prostę rozwiązania. Jest + przyjazna użytkownikowi, ma nieco bardziej konserwatywne + podejście do ideii wolnego oprogramowania, jądro może + zawierać nie wolne moduły, jednak zamknięte oprogramowanie + nie jest domyślnie instalowane. Ubuntu rozwijane jest przez + firmę + Canonical. Jej technologię są wdrażane do Ubuntu, dzięki + czemu może ona uchdzić za system klasy enterprise + wśród + dystrybucji opartych o GNU/Linux Debian. Poza wersją na + komputery biurkowe istnieją również wersja skierowana + na serwery oraz inne wersje z preinstalowanymi różnymi + środowiskami graficznymi czy wersja skierowana do obróbki + multimediów zawierająca pozwalające do tego oprogramowanie. + Społeczność zebrana + wokół systemu Linux zarzuca jej siłowe próby wdrożenia + manedżera oprogramowania Snap, rozwijanego przez tę + firmę + przez co może ona pretendować do stopniowego zarzucenia + klasycznego schematu dystrybucji pakietów rozwijanego wraz + z GNU/Linux Debian. +
fedora-logo32Fedora Linux + Fedora jest dystrybucją skierowaną do różnej maści + użytkowników, ponieważ istnieje w kilku głównych wersjach. + oraz wiele wersji pobocznych tzw. spins. Fedora ma + najprzyjźniejszy instalator chyba ze wszystkich możliwych + dystrybucji. Wymaga on głównie wybrania miejsca instalacji + i kliknięcia przycisku dalej. Fedora została stworzona i jest + rozwiajana przez firme Red Hat Inc. (obecnie IBM) jako + upstream (poligon doświadczalny dla zmian), dla + glównego produktu tej firmy Red Hat Enterprise Linux - + płatnej dystrybucji skierowanej do środowisk produkcyjnych + (100$ rocznie). Jest to system o dużej stabilości ze + wsparciem dla najnowszego sprzetu. Fedora również + charakteryzuje się wprowadzeniej jako pierwsza środowiska + GNOME w najnowszej wersji 41 oraz innych nowych technologi + wśród otwartego oraz wolnego oprogramowania. +
debian-logo32GNU/Linux Debian + Debian jest jedną z pierwszy dostępnych dystrybucji, początek + jej istnienia jest datowany na 1993 rok. Dystrybucja + konserwatywna, posiadała w pierwszych latach swojego + istnienia aprobatę FSF (Free Software Fundation). Jednak + została ona wycofana, za zezwolenie na instalację zamkniętego + oprogramowania. Kernel przygotowywany przez twórców tej + dystrybucji pozbawiony jest tzw. blobów binarnych (nie + wolnych prekompilowanych modułów, używanych przy budowaniu + jądra.) Bloby najczęściej dotyczą sterowników sprzętu. + Dystrybucja charkteryzuje się wysoką stabilnościa + porównywalną z RHEL, wsparciem dla starszego sprzętu. Jedną + z cech, która może odstraszać potencjalnych użytkowników + od niej jest długi cykl wydawniczy (co dwa lata) oraz + używanie sprawdzone oprogramowania czy technologii (pozostaje + dość mocno w tyle jeśli chodzi o najnowsze wersje + oprogramowania). Wydaje mi się, że niema + stabilniejszego gotowego rozwiązania niż GNU/Linux Debian. + Debian wymaga nieco większego zaawansowania niż dystrybucje + podane do tej pory. Stosowany jest częściej w środowiskach + produkcyjnych niż np. Ubuntu. Rozwój Debiana opiera się + na zaangażowaniu społeczności z całego świata. +
arch-linux-logo32Arch Linux + Dystrybucja skierowana do zaawansowanych użytkowników. + Charakteryzuje się wysoką konfigurowalnością oraz + dostępnością najnowszych wersji oprogramowania. Nie posiada + oficjalnego instalatora, choć można pobrać skrypt z sieci. + Instalacji dokonuj się ręcznie, wpisującac kolejne polecenia + z podręcznika instalacji w środowisku LiveCD, gdzie + przygotowuje się dysk, pobiera się pakiety i je konfiguruje. + Instalacja i konfiguracji Arch Linux nie jest tak + pracochłonna jak innych dystrybucji, można by powiedzieć, + meta-dystrybucji. Dość ciekawą cechą jest społeczność zebrana + wokół niej, która przechwalająca się swoją wyższością na + innymi (ponieważ przebrneli przez proces instalacji) + używając frazy "I use Arch BTW.". Dystrybucja rozwijana + jest przez społeczność na całym świecie. +
void-linux-logo32Void Linux + Nie zależna dystrybucjna, trochę odmienna od inny dystrybucji + głównego nurtu. Systemd zastąpiono programem runit, + zamiast OpenSSL, użyto projektu OpenBSD LibreSSL jak jedyna + z dystrybucji Linuksa. Kernel Void-a pozbawiony jest blobów, + a domyślna instalacja zawiera tylko wolne oprogramowanie, + posiada on jednak oficjalne repozytorium z zamkniętym + oprogramowaniem. Instalacja pakietów opiera się stworzonym + dla Void menedżerze pakietów XBPS. Pakiety są wydawane stylu + rolling release, co daje szybkie i stabline + aktualizacje. Obok standardowej biblioteki języka C - + GNU libc, mamy również bibliotekę musl. Za pomoca + programu xbps-src możemy tworzyć z kodu źródłowego + własne pakiety XBPS. +
gentoo-linux-logo32Gentoo Linux + Gentoo jest dystybucją na tyle zaawansowaną, że można by się + pokusić o nazwanie jej meta-dystrybucją. Jest ona bowiem + jedną z najbardziej konfigurowalnych dystrybucji. Jedną z + ciekawszych czynności, jakie należy wykonać podczas + instalacji, to ręczna kompliacja jądra. Dystrybucja + skierowana do jeszcze bardziej zaawansowanych użytkowników + niż w przypadku Arch Linux. Instalacja Gentoo na maszynie + wirtualnej wraz z poradnikiem, zajeło mi to jakieś dwie + godziny. +
lfs-logo32Linux from scratch + LFS to w zasadzie projekt, a niżejli sama dystrybucja. + Umożliwia on stworzenie oraz skonfigurowanie własnej + dystrybucji. Na stronie projektu zawarte są wskazówki, co + należy zrobić, aby stworzyć rozwiązanie najbardziej + elastyczne dla siebie. LFS z pewnością może nosić miano + meta dystrybucji. +
+

+ W powyższej tabeli przedstawiłem dystrybucje, na które + warto zwrócić uwagę. Teraz prawdopodobnie czekać będzie Cię duży + dylemat, którą wybrać. W pierwszej kolejności ważny jest sprzęt, + na którym będziemy z tego systemu korzystać. Część sprzętu, + z którego chcemy korzystać może + nie działać out of box, wowczas potrzebne będą sterowniki, + które mogą być własnościowe (nie wolne, generalnie być zamkniętym + oprogramowaniem), jeśli zależy nam na prywatności, to lepiej upewnić + się z jakiego rodzaju sprzętem będzie mieć doczynienia, ponieważ + każde zamknięte oprogramowanie można teoretycznie uznać za + oprogramowanie szkodliwe. Dobrym wyborem może być zakup Thinkpada z + przed 2008 roku. Wówczas będziemy mogli bez obaw wybrać Debiana i + zainstalować np. XFCE (to dość lekkie środowisko graficzne, nadające + się do codziennej pracy, bez zniechęcania się). Kolejną rzeczą do + wyboru dystrybucji jest zapał do pracy. Mimo iż opisując dystrybucje + napisałem że ta jest dla początkujących, a ta dla zaawansowanych to + żadna z + nich nie jest ani dla jednych ani dla drugich. Obsługa czego kolwiek + związanego z komputerami wymaga przeczytania dokumentacji ze + zrozumieniem i umiejętności radzenie sobie z ewentualnymi problemami. + Dlatego dlaczego by nie wybrać Gentoo, zainstalować go + z poradnikiem, skonfigurować, a wrazie problemów użyć Googla, lub + poprość kogoś ze społeczności o pomoc. +

+

+ Dość częstym zjawiskiem, wśród społeczności użytkowników Linuksa jest + tzw. distro-hopping, czyli przesiadanie się z jednej + dystrybucji na drugą. Jest to normalne zjawisko, chciaż można + powszechną opinia jego jest raczej negatywna, głównym argumentem + oponetów jest stwierdzenie, że przez to nie uczymy się niczego. Moim + zdaniem, możemy dojść do wniosku, że tak naprawdę nie ma dystrybucji + tylko produkt w ciągłej ewolucji z dostępnym takim a takim + oprogramowaniem. Nie mam mendżera pakietów, mam program do instalacji + i konfiguracji oprogramowania, nieważne czy jest apt, dnf, yum czy + pacman. Mam stronę podręcznika i znajduj sobie potrzebne opcje. Mam + dostęp do internetu, i wystarczy wyszukać konkretną potrzebną + czynność np.: "Remove packages with all dependencies pacman". I mam + gotowy wynik. Wiele miesięcy błądziłem słuchając mendrców jak RMS + (Richard Matthew Stallman). Myślcie samodzielnie, + przeskakujcie z distro na distro i bawcię się dobrze. +

+

1.1. Sprzęt

+

+ Sprzęt sam w sobie nie mozę wchodzić z skład systemu operacyjnego, + to jego elementy jak pamieć operacyjna, procesor czy pamięć masowa + odgrywają w nim bardzo ważna rolę. +

+

1.1.1. Pamięć operacyjna

+

+ W działaniu systemów operacyjnych takich jak Linux, najważniejszym + komponentem sprzętowym może być pamięć operacyjna, ponieważ to w + niej rezyduje jądro oraz przestrzeń użytkownika. Dane zapisane w + pamięci nie są niczym innym jak zbiorem zer i jedynek określanych + mianem bitów (najmniejsze przetwarzanej ilości + informacji). Procesy oraz jądro są jednymi z takich zbiorów. Takie + zbiory określa się mianem obrazu. +

+

1.2. Jądro

+

+ Jądro Linux jest to nadrzędy proces w całym systemie, realizuje swoje + działania w czterech obszarch funkcjonalności systemu operacyjnego. +

+
    +
  • Zarządzanie procesami - jądro jest + odpowiedzialne za uruchamianie, wstrzymywanie, ponowne uruchomienie + oraz kończenie pracy procesów. Korzystając ze współczesnych + systemów operacyjnych możemy mieć wrażenie uruchomione przez nas + programy (a co za tym idzie ich procesy) mogą działać jednocześnie. + Dzieje się tak dlatego, iż jądro uruchamia kod procesu na ułamek + sekundy, po upłynięciu danego przez jądro wycinka czasu + stan procesora wykonującego kod danego procesu zapisywany jest + w pamięci, a jądro wybiera kolejny proces i ładuje stan procesora + po czym wznawia jego wykonanie. Tych czynności jest znacznie więcej + zostało tu wymionionych. Te + czynności nazywane są przełączaniem kontekstu. + Na współczesnych procesorach dzieje się to tak szybko, że możemy + mieć złudzenie wielozadaniowości. W przypadku + maszyn wielordzeniowych jak i wieloprocesorowych jądro nie musi + zwalniać wykorzystywanego procesora (rdzenia), ale robi to aby + jak najlepiej wykorzystać zasoby.
  • +
  • Zarządzanie pamięcią - każdy proces jest obrazem + w pamięci, każdy proces również potrzebuje pamięci na swoje + obliczenia. Zadaniem jądra jest przydzielanie, zwalnianie jak i + ochrona (przed tym aby proces nie uzyskał dostępu do obszaru + innego procesu) przekazanych procesom obszarów. Czynności z tym + związane są dość złożone, ale jądro może posiłkować się + rozszerzenim MMU we współczesnych procesorach. Pozwala ono podczas + dzielenia pamięci wykorzystać metodę pamięci wirtualnej, + polegającej na zamianie adresów pamięci, przez co proces jest + skonfigurowany, że "tak jakby" miał do dyspozycji całą pamięć + fizyczną maszyny. Zamiana adresów wiąże się z potrzebą posiadania + map (czy też tabel), pozwalających na odzorowanie adresów, co + dokłada czynność aktualizacji mapy podczas przełączania kontekstu. + Mapy adresów nazywane są tablicami stron. +
  • Sterowniki urządzeń - zadaniem sterowników + jest dostarczenie identycznego interfejsu do komunikacji z + poszczególnymi urządzeniami zainstalowanymi w komputerze. Za racji + to iż swobodny dostęp do sprzetu jest potencjalnie niebezpieczny, + to jaka kolwiek próba komunikacji z urządzeniem odbywać się + zawsze będzie za pośrednictwem jądra systemu. Sterowniki w systemie + Linux są częścią jądra, nie oznacza to jednak, że nie możemy + jakiegoś brakującego do instalować. Sterowniki są przechowywane w + postaci modułów, które są ładowane podczas uruchamiania jądra, a + nie które znich mogą być ładowane podczas pracy systemu.
  • +
  • Wywołania systemowe - są to funkcje udostępnione + przez jądro procesom użytkownika. Wywołania realizują zadania, + które są trudne do zrealizowania przez procesy użytkownika lub w + ogóle nie wykonalne. Przykładem wykonywania wywołań systemowych + jest obsługa plików (otwieranie, odczyt czy zapis), innymi + bardzo często wykorzystywanymi wywołaniami są fork() oraz + exec(), wykonywane są za każdym wydanym poleceniem w + powłoce.
  • +
+

+ Inną ciekawą cechą jądra są pseudourządzenia. + Procesy widzą takie urządenia jak każde inne, jednak występują on + wyłącznie w warstwie programowej, dzięki temu nie muszą być częścią + jądra, ale ze względów praktycznych się je tam umieszcza. Inna + implementacja urządzenia /dev/random - służacego + do generowania liczb pseudolosowych, które jest urządzeniem + programowym mogłoby nie być zbyt bezpieczne. +

+

1.3. Przestrzeń użytkownika

+

+ Przestrzeń użytkownika formalnie jest obszarem pamięci, w którym + spedzimy 99% czasu pracy na Linuksie. Wewnątrz przestrzeni + użytkownika znajdują się procesy definiujące dystrybucje wykonujące + różne zadania dla użytkownika, teoretycznie są one wobec siebie + równe, to jednak przestrzeń użytkownika można podzielić na trzy + warstwy, na której warstwie będzie znajdować się proces zależy jak + bardzo skomplikowane zadania wykonuje. Przeglądarka sieci WWW, może + się taka nie wydawać ale to potężny subsystem więc będzie znajdować + na najwyższej warstwie, z kolei proces służący za rejestrowanie + logów, tzw. protokół diagnostyczne będzie znajdować się na najniższej + warstwie blisko jądra, ponieważ nie jest on zbyt skomplikowany w + porównaniu do na przykład przeglądarki, warstwa środkowa + zarezerowana jest dla różnej maści serwerów. Najproście rzecz ujmując + podstawowe usługi znajdują się na najniższej warstwie, usługi + pomocnicze na warstwie środkowej, a aplikacje, które kontroluje już + sam użytkownik będą znajdować się na samej górze. Procesy mogą + komunikować się z innymi procesami o ile te znajdują się na tym + samym lub niższym poziomie. Używanie tego rozdzaju podziału, może + być kłopotliwe ponieważ obecne serwery nie są już tak prostym + oprogramowaniem więc powinny znajdować się tej samej warstwie co + przeglądarka czy klient pocztowy, jednak to te aplikacje mogą + wykorzystywać serwery do realizacji zadań użytkownika, więc ich + miejsce jest raczej na warstwie centralnej (środkowej). +

+

1.4. Użytkownicy

+

+ Użytkownicy w Linksie są odwzorowaniem rzeczywistych obiektów, czyli + encją. Użytkownicy mają prawo do uruchamiania procesów oraz + posiadnia (bycia właścielem) plików. Jądro nie rozpoznaje + użytkowników po ich nazwach, tak jak mają w zwyczaju to ludzie, + używa ono identyfikatorów userid w skrócie + UID. Identyfikatory są przedstawiane za pomocą + liczb. +

+

+ Użytkownicy istnieją wyłącznie po to aby wyznaczać granice. Każdy + proces ma swojego właściela, dlatego też mówi się że proces + uruchamia się z uprawnieniami takiego a takiego użytkownika. + Użytkownicy mogą uruchamiać i konczyć procesy w własnych granicach + (tylko te, których są właścicielami), przez co nie mogą wpływać na + procesy innych użytkowników. Poza procesami, użytkownicy mogą + tworzyć własne pliki, których automatycznie stają się właścicielami. + Mogą oni decydować czy chcą się nimi dzielić, ustalając im + odpowiednie uprawnienia. +

+

+ Poza użytkownikami przypisanymi do konkretnych osób (raczej + spotkamy jednego), istnieje kilku dodatkowych specjalnych + użytkowników, głównie mają oni na celu ograniczenie uprawnień + serwerów. Po za tymi specjalnymi istnieje jeszcze użytkownik + root, którego nie tyczą się zapisane powyżej + ograniczenia dlatego jest on nazywany superużytkownikiem. +

+

+ Osoba pracująca na koncie użytkownika root, nazywana jest + administratorem systemu. Root może kończyć + procesy innych użytkowników, przeglądać cudze pliki czy instalować + oprogramowanie z repozytorium. Praca na tym koncie jest dość + niebezpieczna z punktu widzenia systemu, ponieważ ten użytkownik + jest wstanie wykonać czynności prowadzące do zniszczenia całego + systemu. Na Linuksie root ma do tego pełne prawo, dlatego + projektancji dystrybucji starają się ograniczyć konieczność pracy + z wykorzystaniem tego użytkownika. +

+

+ Innym tworem podobnym to użytkowników są grupy. + Grupy są zbiorem użytkowników, a ich zadaniem jest współdzielenie + plików wewnątrz jednej grupy, między jej użytkownikami. +

+

2. Podstawy obsługi Linuksa

+

+ W tym rozdziale przedstawione zostaną podstawy obsługi systemu + Linux, oczywiście z poziomu powłoki, ponieważ inne sposóby + zależą w dużej mierze od programów, które do tego celu będziemy + wykorzystywać. Takich programów może być kilka, powłok + również dostępnych jest kilka rodzajów, jednak sam program powłoki + nie będzie wpływać na prezentowane w tym rozdziale czynności. Ten + rozdział zaczniem od tego czy jest powłoka. +

+

2.1. Powłoka

+

+ Powłoka jest chyba jednym z najistoniejszych + komponentów systemu + Linux, pozwala ona na uruchamianie róznych poleceń wydawanych przez + użytkownika. Powłoki są również małymi środowiskami programistycznymi. + Nie które narzędzia systemowe są skryptami powłoki - + plikami tekstowymi zawierającymi zbiór wykonywanych kolejno (jedno po + drugim) poleceń powłoki. +

+

+ Pierwotną powłoką była powłoka Bourna, opracowana + jeszcze dla systemu UNIX w laboratoriach Bell Labs. Mimo + niezbyt częstego wykorzystywania, powłoka ta jest stałym kompenetem + nie tylko systemu Linux, ale i innych systemów uniksopodbnych. + Obecnie wykorzystywaną powłoką jest BASH - + ulepszona wersja oryginalnej powłoki. Korzystając z róznych + dystrybucji, domyślna powłoka może być inna. Ten materiał zakłada + wykorzystanie powłoki BASH, szczególnie w rozdziale poświęconym + skryptom powłoki. +

+

2.2. Korzystanie z powłoki

+

+ Dostęp do powłoki może odbywać się w dwojaki sposób wykorzystać + możemy wbudowaną w każdą dystrybucję konsole, nie zależnie od + instalacji wybranej przez nas dystrybucji. Jeśli jest to dystrybucja + skierowana do komputery biurkowe, to możemy skorzystać z wbudowanego + programu terminal. Po uruchomieniu okna powłoki, w prawym + górnym rogu pojawi się symbol zachęty. Jest to ciąg + znaków wskazujący wiersz, w którym będziemy wprowadzać polecenia. + Znak zachęty może przyjmować różną formę: +

+
    +
  • użytkownik@host:ścieżka$ - + użytkownik - nazwa użytkownika, + host - nazwa komputera, + ścieżka - obecna ścieżka + (czym jest ścieżka, będzie za chwilę). Tego typu symbol zachęty + stosowany jest w dystrybucjach opartych na GNU/Linux Debian takich + Linux Mint (Mint oparty jest na Ubuntu, a Ubuntu na GNU/Linux + Debian) czy Ubuntu.
  • +
  • [użytkownik@host:katalog]$ - + użytkownik i + host podobnie jak wyżej, + katalog - katalog w którym się + obecnie znajdujemy, z tego typu znakiem zachęty spotkamy się + w dystrybucjach RHEL/Fedora/CentOS oraz Arch Linux.
  • +
  • bash-wersja$ - Originalny symbol + zachęty powłoki BASH, wersja + przedstawia wersję wykorzystywanej powłoki, spotkamy go + w ręcznych instalacjach powłoki (kompilacji kodu źródłowego)
  • +
  • $ - symbol zachęty + wykorzystywany w celu zaoszczędzenia miejsca w wierszu polecenia.
  • +
+

+ W tych symbolach jeden element jest stały jest to znak dolara + ($), oznacza on że polecenia wydawane będą jako + zwykły użytkownika, innym symbolem jest znak krzyżyka + (#), który mówi nam że polecenia będą uruchamiane + przez superużytkownika. Najprostsze polecenie jakie możemy wydać + jest użycie polecenia echo, które zwraca na + standardowe wyjście podajny mu jako argument ciągu znaków: +

+
+$ echo Witaj świecie.
+
+

+ W przykładach w tym materiale, jeśli polecenia ma zostać wydane z + uprawnieniami zywkłego użytkownika, przed poleceniem będzie + pojawiać się znak dolara ($), a jeśli polecenie ma + być uruchomione z wyższymi uprawnieniami, będą one poprzedzone + znakiem krzyżyka (#) oznaczający uprawnienia + użytkownika root. +

+

2.2.1. Polecnie cat

+

+ Polecenie cat wypisuje na standardowe wyjście + podane w argumentach pliki jeden po drugim dokonując tym samym + połączenia (konkatenacji - stąd nazwa polecenia) na jednym + strumieniu zawartości tych wszystkich plików. +

+
+$ cat plik1 plik2 plik3 ...
+
+

2.2.2. Standardowe wyjście i standardowe + wejście

+

+ Użyłem powyższego polecenia cat, aby nakreślić kontekst dla + omówienia dwóch podstawowcyh strumieni. Linux wykorzystuje strumień + wejściowy do odczytu danych, a strumień wyjściowy do ich zapisu. + Źródłem strumienia wejściowego może być plik, urządzenie, terminal czy + strumień wyjściowy innego procesu. +

+

+ Strumień wejściowy możemy zaobserować poprzez uruchomienie polecenia + cat bez żadnego pliku. Program nie zwróci od razu znaku + zachęty, ponieważ oczekuje na dane. Możemy wpisać co kolwiek, a po + naciśnięciu klawisza enter polecenie powtórzy ten wpisany + tekst. Z racji tego iż nie podaliśmy mu żadnego pliku polecenie + zaczęło korzystać ze strumienia standardowego wejścia, + przekazanego + mu przez jądro, w tym przypadku był to terminal, którym zostało + uruchomione to polecenie. Aby zakończyć to polecenie należy wciśnąć + kombinacje klawiszy Ctrl+d, która oznacza koniec + danych ze standardowego wejścia. +

+

+ Ze standardowym wyjściem jest podobnie, jądro + przezkazuje strumień standardowego wyjścia procesom, do którego + mogą one zapisywać swoje dane. Polecenie cat zawsze + wypisuje swoje + dane na standardowe wyjście, które przez uruchomienie polecenia w + terminalu jest do niego podłączone. Dzięki temu mogliśmy zobaczyć + wypisywane przez polecenie dane. +

+

+ Standardowe wyjście oraz standardowe wejście możemy zapisać + skrótowo stdout oraz stdin. + Takich nazw również należy się spodziewać w wszelakiej dokumentacji. +

+

+ Prócz wspomanianych strumieni istnieje jeszcze trzeci strumień + wejścia-wyjścia - standardowy strumień błędów. + Opiszę go nieco później. +

+

+ Strumienie są dość elastycznym mechanizem, można je zmusić do + odczytywania i zapisywania danych z innych miejsc niż terminal. + O przekierowaniach strumienii będzie nieco poźniej w tym rozdziale. +

+

2.3. Podstawowe polecenia

+

+ Poniżej znajduje się pogrupowane przedstawienie najbardziej + podstawowych poleceń niezbędnych do pracy w powłoce systemu Linux. +

+
    +
  • polecenie ls - wypisuje zawartość katalogu. + Najważniejsze opcje: +
      +
    • -a - powoduje wyświetlenie wszystkich + elementów, łącznie z tzw. dot-files (plikami ukrytymi, + plikami konfiguracyjnymi
    • +
    • -l - wyświetlenie zwartości katalogu w + postaci kilku kolumnowej tabeli zawierającej m.in uprawnienia, + czas ostatniej modyfikacji plików, wielkość czy przypisanie + pliku, katalogu do użytkownika oraz grupy. +
  • +
  • polecenie cp - kopiujej pliki + Najważniejsze opcje: +
      +
    • -p - zachowuje atrybuty kopiowanych plików, + na przykład takie jak uprawnienia czy przypisanego właściela i + grupę
    • +
    • -r - kopiowanie rekurencyjne, kopiuje całe + katalogi wraz z podkatalogami oraz ich zawartością.
    • +
    • -v - włącza komunikaty diagostyczne, + polecenie wypisuje co, gdzie kopiuje. Normalnie program nie + zwraca nic poza znakiem zachęty po zakończonym kopiowaniu.
    • +
  • +
  • polecenie mv - w najprostszym przypadku + polecenie służy do zmiany nazwy pliku, jednak gdy drugim + argumentem będzie katalog, plik zostanie przeniesiony do tego + katalogu. Najważniejsze opcje: +
      +
    • -v - włącza komunikaty diagnostyczne, + identycznie jak w przypadku cp.
    • +
  • +
  • polecenie touch - aktualizuje czas modyfikacji + pliku, jeśli plik nie istnieje to zostanie utworzony pusty plik o + podanej w argumencie nazwie.
  • +
  • polecenie rm - polecenie służy do kasowania + plików. Kombinacja opcji -rf wykorzystywana jest + kasowania całych katalogów z podkatalogami. Najważniejsze opcje: +
      +
    • -r - umożliwia, kasowanie rekurencyjne, + całych katalogów z podkatalogami.
    • +
    • -f - przed każdym kasowaniem pliku polecenie + pyta czy jesteśmy pewni, że chcemy skasować ten plik. Ta opcja + pomija to pytanie wymusząjąc tak jakby kasowanie.
    • +
  • +
  • polecenie echo - polecenie wypisuje ciąg znaków + podany jako argument na standardowe wyjście. Najważniejsze opcje: +
      +
    • -n - ta opcja wyłącza przechodzenie + do nowej linii, po wypisaniu ciągu znaków.
    • +
  • +
+

Polecenia działające na katalogach

+

+ Uniksy w tym i Linux, korzystają ze standardu hierarchi katalogów, + aby utrzymać w porządku dane przestrzeni użytkownika. Za początkowy + katalog uznaje się katalog główny oznaczany prawym + ukośnikiem lub + slashem (/), wewnątrz tego katalogu znajdują się + pod katalogi, przechowujące konkretny rodzaj czy typ plików zgodny + z ich przeznaczeniem. +

+

+ Droga do konkretnego katalogu nosi nazwę ścieżki. + Jeśli ścieżki zaczynają się od /, czyli od katalogu głównego + mamy doczynienia ze ścieżką bezwzględną. Elementy + katalogów na + ścieżkach katalogi mogą być również wyrażane z pomocą jednej lub + dwóch kropek. + Dwie kropki (..) oznaczają katalog nadrzędny + względem aktualnego katalogu, zaś jedna kropka oznacza + (.) aktualny katalog. Ścieżki nie zawierające + slasha na początku, czyli nie zaczynające się od katalogu głównego + są wówczas określane mianem ścieżki względnej. +

+
    +
  • polecenie cd - polecenie służy do zmiany + aktualnego katalogu, jako argument przyjmuje katalog, do którego + checemy przejść, równie dobrze możemy przenieść się w dowolne + miejsce w systemie plików (w katalogu głównym) podając jako + argument ścieżkę. Nie podanie argumentu spowowduje przejście do + katalogu domowego użytkownika.
  • +
  • polecenie mkdir - polecenie tworzy nowy katalog. + Jako argument przyjmuje nazwę katalogu lub ścieżkę. Najważniejsze + opcje: +
      +
    • -p - opcja tworzy katalogi nadrzędne podane + w ścieżce o ile te nie istnieją. Za pomocą odpowiednich + podstawień powłoki oraz tej opcji można tworzyć całe struktury + katalogowe.
    • +
  • +
  • polecenie rmdir - usuwa katalog po warunkiem, że + jest on pusty. W przeciwnym razie polecenie zwróci błąd. Chcąc + usuwać całe katalogi z danymi oraz podkatalogami należy użyć + polecenia rm -rf.
  • +
+

2.4.1. Nazwy wieloznaczne.

+

+ Dzięki możliwością powłoki możemy porównywać proste wzorce z nazwami + plików w obrębie aktualnego katalogu roboczego (katalogu w którym + się znajdujemy) czynność ta nazywana jest rozwijaniem nazw lub + globbingiem. Jednym z elementów biorących udział w + rozwiązywaniu nazw jest gwiazdka (*) oznaczająca + dowolną ilość dowolnych znaków. Dla przykładu poniższe polecenie: +

+
+$ echo *
+
+

+ Zwróci nazwy wszystkich plików i katalogów znajdujących się w + katalogu. Innym + znakiem wykorzystywanym przy nazwach wieloznacznych jest + znak zapytania (?) reprezentuje on jeden dowolny + znak, dla wzorca b?at pasującymi nazwami mogą być + blat oraz brat. Rozwinięcia nazw dokonuje powłoka + przed uruchomieniem, więc jeśli chcemy aby, któreś ze znaków + wieloznacznych trafiło do polecnie to należy umieść je w pojedyńczych + cudzysłowach. +

+

2.5. Polecenia pośredniczące

+
    +
  • polecenie grep - wyszukuje wzorzec + w podanym pliku. Polecenie to korzysta z systemu wzorców nazwanych + wyrażeniami regularnymi. Najważniejszymi opcjami: +
      +
    • -i - wyłącza rozróżnianie małych i + wielkich liter.
    • +
    • -v - podwoduje odwrócenie wyszukiwania, + zwracane są wyniki nie pasujące do wzorca.
    • +
    • -e - wykorzystuje rozszerzony zestaw + instrukcji pozwalajacych na tworzenie wyrażeń regularnych.
    • +
    • -o - opcja powoduje zwrócenie dokładnie + tylko tych znaków pasujących do wzorca. Normalnie polecenie zwraca + linię z elementami pasującymi do wzorca, w przypadku wielu plików + zwraca również nazwę pliku.
    • +
    + Tworzenie wyrażeń regularnych oraz więcej opcji tego polecenia + znajduje się na stronie podręcznika uruchamianej poleceniem: +
    +$ man grep
    +
    + Do najważniejszych wyrażeń, które każdy powinien znać należą: +
      +
    • .* - oznaczające dowolną ilość dowolnych + znaków.
    • +
    • . - oznacza jeden dowolny znak.
    • +
  • +
  • polecenie less - wypisuje dane z pliku, lub + ze strumienia wykorzysując podział na strony. Jedna strona to jeden + ekran. Następne strony są wyświetlane za naciśnięciem spacji + stronę możemy cofnąć klawiszem b, zakończyć przeglądanie + danych klawiszem q. Dane możemy przeglądać linia po linii + używając strzałek. Możliwe jest również wyszukiwanie fraz w danych + za pomocą / (wyszukiwanie w przód) lub za pomocą + ? (wyszukiwanie w tył).
  • +
  • polecenie pwd - wyświetla obecny katalog + roboczy powłoki (świeżkę na której się znajdujemy). Polecenie + niepozorne choć przydatne, ze względu na dowiązania symboliczne + (będzie o nich w dalszej części materiału), które mogą przesłaniać + ścieżkę wyświetlaną w znaku zachęty. Najważnejsza opcja jest + uruchamiana, gdy nie ma żadnej opcji, więc jej opis pominę. + Warto dodać, że obecne systemy posiadają polecenie pwd + wbudowane w powłokę. Dlatego też opcja -P + rozwijająca fizyczne ścieżki nie jest automatycznie uruchamiana + w przypadku poprostu wydania polecenia pwd, prawdziwe + polecenie pwd uruchamiamy: +
    +$ /usr/bin/pwd
    +
    +
  • +
  • polecenie diff - wszukuje różnice pomiędzy + dowoma plikami tekstowymi. Polecenie to posiada wiele różnych opcji + formatowania danych wyjściowych, najbardziej czytelnym pozostaje + chyba użycie opcji -u. Polecenie wykorzystywane + programistów oraz system kontroli wersji git.
  • +
  • polecenie file - polecenie zwraca format pliku + podanego jako argument. W uniksach nie potrzeby stosowania + rozszerzeń plików, więc to polecenie może pomóc nam dowiedzieć + się co zawiera plik.
  • +
  • polecenie find i locate - + polecenia te służą do wyszukiwania plików w systemie. Polecenie + find wymaga podania katalogu po nazwie polecenia, nazwy + wyszukiwanego pliki po opcji -name oraz opcji + -print, która powoduje wyświetlenie na strumieniu + standardowego wyjścia nazw plików pasujących do wzorca podanego w + opcji -name. Polecenie locate na podobne + zastosowanie jak find działa jednak od niego szybciej + ponieważ bazuje na indeksie przygotowywanym co jakiś czas przez + system operacyjny. Może być ono bezużyteczne, kiedy szukamy nowych + plików, gdyż mogą być one nie ujęte jeszcze w indeksie.
  • +
  • polecenie head i tail - + te polecenia służa do prezentowania wycinka danych czy to ze + strumienia lub z pliku. W przypadku polecenia head + prezentowane jest n pierwszych linii, domyslnie 10; + z kolei polecenie tail prezentuje n koncowych linii. + Liczbę linii podajemy bezpośrednio po znaku myślnika + (-). Z tych dwóch poleceń polecenie tail + ma nieco większe zastosowanie niż polecenie head. Mozemy + wywołać to polecenie aby wyświetlić dane od linii, numer linii + podajemy po znaku plusa (+), inna właściwością + chyba najważniejszą jest wyświetlanie danych na żywo, używając + opcji -f, a następnie nazwy pliku lub myślnika + gdy dane pochodzą ze strumienia wyjściowego innego polecenia.
  • +
  • polecenie sort - układa wiersze z pliku + tekstowego w porządku alfabetycznym, jeśli na początku wierszy + znajdują się liczby to aby je posortować należy użyć opcji + -n, aby odwrócić sortowanie możemy użyć opcji + -r.
  • +
+

2.6. Zmiana hasła i powłoki

+

+ W celu zmiany hasła należy użyć polecenia passwd. + Polecenie poprosi o podanie obecnego hasła, po zatwierdzeniu go + zostaniemy poproszeni o nowe hasło i jego potwierdzenie (wpisanie + ponowne nowego hasła). +

+

+ Zmiana aktywnej powłoki odbywa się za pomocą polecenia + chsh, albo użyć poleceń odpowiadających nazwom + innych powłok, kolejno ksh - Korn SHell, + tcsh - TENEX C SHell. Użycie tych poleceń w + aktywnej powłoce, spowoduje uruchomienie podpowłoki. Zamkniecie + jej spowoduje powrót do pierwotnej powłoki. +

+

2.7. Pliki z kropką

+

+ Przeglądając pliki nawet w własnym katalogu domowym możemy znaleźć + pliki, których nazwa zaczyna się od kropki. Nie które źródła mówią + tym o że te pliki są ukryte. Do takich wniosków może dojść, + ponieważ te pliki nie są domyślnie wyświetlane przez polecenie + ls bez opcji -a lub przez menedżery plików dostępne + w desktopowych wersja Linuksa. Jednak te pliki nie różnia się niczym + od inny plików, poza właśnie tym przypadkiem opisanym powyżej. + Oprócz plików, nazwy katalogów również mogą zaczynać się od kropki. + Za pomocą prostego wzorca możemy wyświetlić wszystkie dot-files, + jeśli wsród nich trafi się katalog, wówczas zostanie wyświetlona jego + nazwa a pod nią jego zawartość. +

+
+$ ls .??*
+
+

2.8. Zmienne środowiskowe i powłoki

+

+ Powłoka może przechowywać zmienne tymczasowe, które mogą przechowywać + różne wartości, mogą one kontrolować zachowanie samej powłoki jedną + z takich zmiennych jest zmienna PS1 zawierająca + znak zachęty. Takie zmienne najczęsćiej wykorzystywane są w + skryptach powłoki i nazywane są zmiennymi powłoki. + Definicja zmiennych tego składa się z nazwy zmiennej, operatora + przypisania (znaku równości =) oraz wartości samej + zmiennej. +

+
+$ zmienna=12
+
+

+ Odwołać się do wartości zmiennej możemy w dowolnym momencie, podając + jej nazwę poprzedzoną znakiem dolara ($). +

+
+$ echo $zmienna
+
+

+ Zmienna środowiskowa jest podobna do zmiennej + powłoki, ale nie jest ściśle związana z powłoką, bowiem do pamięci + zmiennych środowiskowych systemach uniksopodobnych mają wszystkie + aplikacje, system operacyjny przezkazuje je do każdego programu + uruchomionego w powłoce, programy te nie mają jednak dostępu do + zmiennych powłoki. Zmienne środowiskowe definiuje się w ten sam + sposób + jak zmienne powłoki, jedna aby taka zmienna stała się zmienną + środowiskową musi zostać przeniesiona do pamięci tych zmiennych + za pomocą polecenia export. +

+
+$ zmienna=21
+$ export zmienna
+
+

+ Nie które programy mogą wykorzystywać zmienne środowiskowe do + własnej konfiguracji. Dla przykładu niektóre programy uruchamiane + w powłoce korzystają ze zmiennej środowiskowej EDITOR + definiujące domyślny program do edycji plików tekstowych. + Wykorzystanie zmiennych środowiskowych zapewne jest opisane w + na stronie podręcznika programu. +

+

2.9. Ścieżka poleceń

+

+ Istnieje specjalna zmienna środowiskowa PATH, + przechowywująca katalogi, w których to powłoka będzie szukać + programów odpowiadających wpisanym poleceniom. Jeśli wśród + przeszukiwanych katalogów znajduje się kilka programów o tej samej + nazwie to powłoka uruchomi pierwszy przez nią znaleziony. Ścieżki + katalogów w tej zmiennej odzielone są dwukropkiem (:). + Posiadając swoje programy, możemy również umieść katalog z nim + wewnątrz zmiennej $PATH. Opcje dodanie katalogu są dwie + i mogą mieć wpływ na funkcjonowanie systemu. Możemy dodać nasz + katalog na początku zmiennej, wówczas powłoka zacznie od niego + poszukiwania, jednak należy pamiętąc przy tym, aby nazwy programów + nie pokrywały się istniejącymi dotychczas poleceniami. +

+
+$ PATH=kat:${PATH}
+
+

+ Na powyższym przykładzie kat, to + nasz katalog z oprogramowaniem. Możemy jednak skorzystać + bezpieczeniejszego rozwiązania - dopisać nasz katalog na końcu listy + katalogów zmiennej PATH, wówczas nawet jeśli nasz program + będzie + nazywać się jak jedno z instniejących już poleceń w systemie, nie + będzie miało to wpływu na działanie systemu. +

+
+$ PATH=${PATH}:kat
+
+

+ Na powyższych przykładach użyłem znaku dolara wraz z nawiasami + klamrowymi. Jest to sposób na separacje nazwy zmiennej od innych + znaków, po to aby powłoka nie potraktowała jak w przykładzie powyżej + ciągu znaków ":kat" jak części nazwy zmiennej. Przedstawione w + przykładach polecenia są nie groźne, jeśli uszkodzimy zawartość + zmiennej PATH, to należy zamknąć okno terminala i otworzyć + nowe. +

+

2.10. Znaki specjalne

+

+ W systemach uniksopodbnych wiele znaków ma szczególne znaczenie. + Poniżej znajduje się tabela przedstawiająca wykorzystwane podczas + używania systemu znaki specjalne. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ZnakNazwaOpis
*gwiazdkaWyrażenie regularne, znak nazwy wieloznacznej
.kropkaAktualny katalog, ogranicznik nazwy pliku lub hosta
!wykrzyknikNegacja, historia poleceń
|potokPotoki poleceń
/slashOgranicznik katalogów, polecenie szukania
\backslashLiterały, makra (nigdy katalogi)
$dolarOznaczenie zmiennych, koniec wiersza
'pojedynczy cudzysłówCiągi znaków literałów
`lewy cudzysłówPodmiana polecenia
"podwójny cudzysłówCiągi znaków pseudoliterałów
^daszekNegacja, początek wiersza
~tyldaNegacja, skrót katalogu
#krzyżykKomentarze, dyrektywy preprocesora, podmiany
[]nawiasy kwadratoweZakresy
{}nawiasy klamroweBloki poleceń, zakresy
_podkreślenieProsty zamiennik spacji
+

+ Często możemy napotkać symbol daszka (^) zastępujący + klawisz Control, przez co zapis ^C jest równe + kombinacji klawiszy Ctrl+C. +

+

2.11. Edycja wiersza poleceń

+

+ Znak zachęty wskazuje wiersz polecenia, który możemy edytować + przesuwając kursor za pomocą strzałek. Chcąc powtórzyć jakąś czynność + nie musimy pisać na nowo tego polecenia, możemy wybrać je z historii + poleceń za pomocą strzałek w góre i w dół. Warto jednak obsługę + wiersza poleceń za pomocą strzałek odstawić na bok. Wykorzystując + skróty z poniższej tabeli, możemy nimi śmiało zastąpić strzałki. + Istnieją ku temu dwa powody. +

+
    +
  • Nie wszystkie klawiatury posiadają strzałki, lub ich użycie jest + strasznie nie konfortowe.
  • +
  • Wiele programów uniksowych (w tym i linuksowych) obsługuje się + za pomocą tzw. biblioteki GNU Readline (skróty + klawiszowe w tabeli poniżej), a nie za pomocą strzałek.
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KlawiszeOperacja
Ctrl+bPrzesunięcie kursora w lewo
Ctrl+fPrzesunięcie kursora w prawo
Ctrl+pPowrót do poprzedniego polecenia (lub przesunięcie kursora + w górę)
Ctrl+nPrzejście do następnego polecenia (lub przesunięcie klawisza + w dół)
Ctrl+aPrzesunięcie kursora na początek wiersza
Ctrl+ePrzesunięcie kursora na koniec wiesza
Ctrl+wUsunięcie słowa poprzedzjącego kursor
Ctrl+uUsunięcie tekstu od kursora do początku wiersza
Ctrl+kUsunięcie tekstu od kursora do końca wiersza
Ctrl+YWyklejanie usuniętego tekstu (na przykłda usuniętego + poleceniem Ctrl+u)
Ctrl+hSubstytut klawisza Backspace
Ctrl+dSubstytut klawisza delete
Ctrl+j, Ctrl+mSubstytut klawisza enter
+

2.12. Edytory tekstu

+

+ Na Linuksie mamy podobną ilość edytorów tekstowych do wyboru jak w + przypadku systemów MS Windows czy Apple macOS. Jak nie więcej. + Co ciekawe macOS, również jest system uniksopodobnym. Więc to co + zostało omówione w tym rozdziale również będzie kompatybilne z tym + systemem. Wracając jednak do edytorów tekstu. Tak naprawdę to + istnieją dwa, na które warto zwrócić uwagę, oba są standardem jeśli + chodzi o edycje tekstu i oba wymagają nauki obsługi. Wybór + pozostawiam do roztrzygniecia Tobie. +

+
    +
  • GNU Emacs - edytor w którym można zrobić + wszystko, od pisania tekstów do wykorzystania go jako menedżer + okien. Jego obsługa nie jest zbyt szybka i często by się + wydawało proste czynności wymagają użycia kliku poleceń. Wydaje + mi się, że nie ma bardziej rozbudowanego uniksowego programu. + Pomoc w obsłudze tego edytora, możemy uruchomić naciskając + Ctrl+H następnie klawisz t.
  • +
  • VIm - szybki edytor uruchamiany w terminalu, + choć można zainstalować wersję graficzną. Obsługuje się go trochę + jak grę. VIm, jest nieco bardziej intuicyjny od Emacsa. Warto + dodać, że edytor ten bywa domyślnie doinstalowywany do wielu + dystrybucji jak i innych systemów uniksowych, choć tam może + występować w podstawowej wersji Vi. Chcąc + nauczyć się edytora Vim, możemy skorzystać z + z instalowanego wraz z edytorem tutoriala, uruchamianego poleceniem + vimtutor.
  • +
+

+ Jeśli potrzebujemy edytora, który jest wstanie zatąpić nam + środowisko graficzne, wybierzmy edytor Emacs. Jeśli jednak + chcemy + poprostu edytować pliki, w każdym możliwym środowisku wybierzmy + edytor Vim. Osobiście jestem przyzwyczajony już do edytora + Vim. +

+

2.13. Uzyskiwanie pomocy

+

+ Dystrybucje Linuksa są rozporowadzane z dużą ilością różnej + dokumentacji. Informacje temat poleceń możemy znaleźć na stronach + podręcznika, wydając polecenie man i podając jako + argument interesujące nas polecenie. Na przykład: +

+
+$ man ls
+
+

+ W ten sposób uruchomimy stronę podręcznika polecenia ls. + Większosć stron podręcznika podaje suche informacje na temat + polecenia, nie ma co tam szukać jakiś samouczków. Opcje podawana są + usystematyzowany sposób (najczęściej alfabetyczny), nie które + strony podręcznika mogą zawierać przykłady. +

+

+ Strony podręcznika możemy przeszukać pod kątem słowa kluczowego, za + pomocą opcji -k, polecenia man. Wynikiem + tego polecenie jest lista poleceń, oraz krótki opis zawierający + podane słowo kluczowe, ciekawa jest liczba podana w nawiasie obok + nazwy polecenia, jest to numer rozdziału. +

+

+ Strony podręcznika są podzielone rozdziały oznaczone numerami, każdy + z nich zawiera innego rodzaju strony podręcznika. Rozdziały + zostały opisane w tabeli poniżej. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RozdziałOpis
1Polecenia użytkownika
2Niskopoziomowe wywołania systemowe
3Dokunentacja wysokopoziomowych bibliotek Uniksa
4Informacje o interfejsach urządzeń i sterownikach
5Opisy plików (konfiguracji systemu)
6Gry
7Formaty plików, konwencje i kodowaniaa (ASCII, przyrostki itd)
8Polecenia systemowe i serwery
+

+ Jak uzupełnienie tego materiału świetnie sprawdzą się rodziały + 1,5,7 i 8. Wywołanie konkretnej strony a danego rozdziału wymaga + podania jego numeru jak pierwszego argumentu, wówczas polecenie + będzie wszukać informacji na temat podanego słowa w danym rodziale. + Świetnym przykładem może być, chęć sprawdzenia na stronach + podręcznika pliku /etc/passwd. Należy wydać polecenie: +

+
+$ man 5 passwd
+
+

+ Dość często wykorzystywanym sposóbem na uzyskanie informacji o + poleceniach mogą być same polecenia, sprawdźmy czy możemy je + uruchomić z opcją -h lub --help. +

+

+ Projekt GNU jakiś czas temu zadecydował, że będzie używać innego + formatu plików pomocy niż strony podręcznika, format nazywana jest + info lub texinfo. Format ten + zawiera więcej informacji choć jest od niego bardziej skomplikowany. + Przypomina prostą stronę internetowa, otworzoną w terminalowej + przeglądarce. Tego typu pliki pomocy uruchamiane są za pomocą + polecenia info, po czym podaje mu się jako argument + interesujące nas polecenie. +

+

+ Nie które z pakietów umieszczają swoją dokumentację w katalogu + /usr/share/doc nie zwracając uwagi na format. Warto + pamiętać o tych miejscach szukając pomocy, oczywiście pozostaje na + do dyspozycji jeszcze internet. +

+

2.14. Wejście i wyjście powłoki

+

+ Omawiając po krótce powłokę, wspomniałem o strumieniach standardowego + wejścia i wyjścia. Wiele poleceń używa wyjścia aby wypisywać + wyniki działa lub komunikaty diagonstyczne. Jeśli nie chcemy ich + widzieć lub nie nadąrzymy ich analizować możemy je przekierować + na przykład do pliku, za pomocą znaku przekierowania (>). +

+

+ Używając tego znaku musimy omówić sobie jedną ważną rzecz, znak ten + powoduje nadpisanie wszystkiego co znajduje się w pliku. Tego typu + czynność nazywana jest wymazywaniem + (ang. clobbering). Możemy jednak zablokwać to działanie + za pomocą odpowiednich ustawień powłoki, dla BASH wystarczy użyć + polecenia set -C. Poza blokowaniem + wymazywania, istnieje jeszcze jeden znak przekierowania, który + powoduje dopisanie przekierowanego wyjścia do pliku: + >>. +

+

+ Za pomocą przekierowań możemy w prosty sposób połączyć wyjście + jednego polecenia z wejściem innego. Służy temu znak potoku + (|). Postawienie ponowej kreski, pomiędzy + poleceniami w wierszu polecenia połączy wyjście pierwszego z wejściem + drugiego. +

+

2.14.1 Standardowy strumień błędów

+

+ Korzystając powyższych znaków przekierowania polecenia, dane + wyjściowe programów zostaną przekierowane np. do pliku. Ale + komunikaty diagnostyczne nadal są wyświetlane. Dzieje się to dlatego + iż komunikaty diagnostyczny wykorzystują trzeci dodatkowy strumień + standardowy strumień błędów zapisywany skrótowo + stderr, który podobnie do stdout jest + podłączony do terminala. +

+

+ Do przekierowania tego strumienia musimy użyć identyfikatorów + strumienii jest to liczba, którą posługuje się jądro do rozrózniania + strumieni. W fachowej + literaturze bądź dokumentacji możemy natknąć się na termin + deskryptor pliku. Taki identyfikator dla stderr + ma wartość 2, a dla stdout 1. + Chcąc przekierować stderr do innego pliku musimy podać jego + identyfikator przed znakiem przekierowania. Innym przypadkiem jest + przekierowanie stderr do tego samego pliku co stdout, + wówczas najprostszym sposób jest podłączenie strumienia błedów do + standardowego wyjścia za pomocą znaku >& + podając przekierowywany strumień po lewej stronie znaku (przed nim) + a strumień docelowy po prawej (za nim). +

+
+$ ls /ffffffff >p 2>&1
+
+

2.14.2. Przekierowanie standardowego wejścia

+

+ Przekierowanie standardowego wejścia występuję dość rzadko ponieważ + większość poleceń przyjmuje plik jako argument, jednak może zdarzyć + się potrzeba przekierowania wejścia do polecenia. Służy temu + znak przekierowania wejścia <. +

+

2.15. Odczytywanie komunikatów o błędach

+

+ Prędzej czy później gdzieś podczas naszej pracy z powłoką zdarzy + się błąd. Ważne jest aby umieć go odczytać i prawidłowo z + interpretować. +

+

+ Sam komunikat składa się przeważnie z nazwy polecenia oraz + komunikatu błędu, w nie których przypadkach w komunikacie + znajduje się nazwa pliku, jednak dotyczy specyficznych komunikatów + o błędach. Poniżej znajduje się + lista, błędów z którym będziemy się spotykać podczas pracy z systemem + Linux. +

+
    +
  • No such file or directory + (nie ma takiego pliku lub katalogu) - występuje gdy + plik lub katalog podany jak argument nie istnieje. Innym powodem + występowania takiego błędu może być błędnie zapisana nazwa + polecenia w skrypcie.
  • +
  • File exists (plik istnieje) - ten + problem występuje w momencie gdy próbujemy stworzyć katalog o + nazwie pliku, który już istnieje.
  • +
  • Not a directory (nie jest katalogiem), + Is a directory (jest katalogiem) - błąd + występuje w momencie gdy probujemy użycie pliku jak katalogu lub + katalogu jak pliku.
  • +
  • No space left on device (brak miejsca w + urządzeniu) - Na pamięci masowej, której próbujemy zapisać + dane brakuje wolnego miejsca.
  • +
  • Permission denied + (niewystarczające uprawnienia) - pojawienie się tego błędu + może mieć dwa powody, pierwszy to zapis lub odczyt informacji z + pliku, do którego nie mamy żadnych uprawnień; drugim jest próba + uruchomienia pliku/programu bez ustawionego bitu wykonania. O + uprawnieniach będzie w dalszej części tego rodziału.
  • +
  • Operation not permitted (brak zezwolenia + na wykonanie operacji) - błąd występuje w momencie gdy + spróbujemy zakończyć proces nie należący do nas.
  • +
  • Segmentation fault (błąd segmentacji) - + błąd programisty. Program, który uruchomiliśmy próbował + użyskać dostęp do wycinka pamięci, którego nie miał żadnych + uprawnień i jego działanie zostało przerwane przez jądro. + Najczęsciej polskie tłumaczenie tego błędu to + Naruszenie ochrony pamięci.
  • +
  • Bus Error
  • (błąd magistrali) błąd + podobny do Naruszenia ochrony pamięci, jednak w tym + przypadku chodzi o dostęp do pamięci w sposób niewłaściwy, a nie + dostęp do innego obszaru pamięci. +
+

+ Jeśli natrafimy na jeden z dwóch ostatnich błędów, to przyczyną mogą + być dane przekazane do programu, których on się nie spodziewał. +

+

2.16. Przeglądanie procesów i + manipulowanie nimi

+

+ Każdy proces jest programem. Jądro pododobnie jak użytkowników + procesy widzi za pomocą liczbowych identyfikator - + process ID - PID. Za pomocą + polecenia ps możemy wylistować wszystkie procesy + uruchomione w powłoce. Domyślnie wynik polecenia podzielony jest na + cztery kolumny. +

+
    +
  • PID - identyfikator procesu
  • +
  • TTY - urządzenie terminala, na którym działa + dany proces.
  • +
  • STAT - stan procesu, np. S + oznacza uśpieje procesu, zaś R - jego dzialanie. + Wszystkie oznaczenia znajdują się na stronie podręcznika + polecenia.
  • +
  • CMD - treść polecenia, warto jednak zaznaczyć, + że procesy mogą ją zmieniać.
  • + +
+

+ Polecenie ps, możemy obsługiwać za pomocą opcji zapisanych w + trzech stylach, jednak najbardziej powszechnym jest styl BSD, i to + zapis opcji w tym stylu przedstawie. +

+
    +
  • ps x - wyświetla wszystkie procesy uruchomione + przez aktualnego użytkownika.
  • +
  • ps ax - wyświetla wszystkie procesy działące + w systemie.
  • +
  • ps u - wyświetla bardziej szczegółowe informacje + o procesach.
  • +
  • ps w - podaje pełne nazwy poleceń, nie + ograniczając się do pojedyńczego wiersza.
  • +
+

+ Tak jak w przypadku innych poleceń, w poleceniu ps, również + możemy łączyć opcje, dla przykładu chcąc wyświetlić wszystkie + procesy w systemie wraz ze szczegółami należy wydać polecenie + ps aux. +

+

+ Wyświetlenie informacji na temat, konkertnych procesów polega na + podaniu po opcjach identyfikatora procesu. +

+

2.16.1. Przerywanie działania procesów

+

+ Możemy zakończyć działanie procesu poprzez wysłanie do niego + sygnału za pomocą polecenia kill. + Wykorzystują to polecenie, jądro systemu proszone jest wysłanie + sygnału do wybranego procesu. Domyślnie wysyłanym sygnałem jest + TERM, a polecenie do swojego działania potrzebuje + tylko identyfikatora PID. +

+

+ Proces możemy zatrzymać wysyłając do niego sygnał STOP. + po nazwie sygnału podajemy PID, tak zatrzymany proces da się + wznowić za pomocą sygnału CONT. Nazwy sygnałów + podajemy po myślniku (-). +

+

+ Naciśnięcie kombinacji Ctrl+c podczas działania programu w + powłoce, jest równoznaczne z wysłaniem sygnału INT + (ang. Interrupt - przerwanie). +

+

+ Jedną z metod zakończenia procesu jest natychmiastowe zakończenie + jego pracy oraz usunięcie go siłą z pamięci, jest to osiągalne + poprzez wysłanie do niego sygnału KILL. Jest to + ostateczność, gdy dany proces nie odpowiada na inne sygnały. Inne + sygnały dają procesom możliwość poprzątania po sobie. +

+

+ Oczywiście nie należy przerywać pracy dowolnym procesom, kiedy nie + wiemy co robią. +

+

2.16.2. Kontrola zadań

+

+ Powłoki posiadają mechanizm dzięki, któremu możemy zatrzymywać oraz + wznawiać prace procesów za pomocą kombinacji Ctrl+z oraz + poleceniami fg, bg. Ten mechanizm + nazywa się kontolą zadań. Podczas działania procesu + w powłoce, możemy wysłać sygnał TSTP (podobny do + sygnału STOP), a następnie kiedy zechcemy do niego wrócić to + wystarczy wydać polecenie fg, które wznowi działanie + polecenia w terminalu, lub polecenia bg wznawiającego + działanie procesu w tle. +

+

+ Podobne działanie ma program GNU Screen, który jest + multiplekserem terminala, a co najlepsze jesteśmy wstanie odłączyć + sesję programu od pierwszego planu i pozostanie ona w + niezmienionej postaci, tak długo jak włączony jest komputer. +

+

2.16.3. Procesy działające w tle

+

+ Uruchamiając polecenie w powłoce dostęp do znaku zachęty, a co za tym + idzie wolnego wiersza polecenia otrzymujemy dopiero po zakończeniu + działania programu. Jednak możemy odłożyć wykonanie polecenia do tła, + poczym od razu uzyskamy dostęp znaku zachęty. Jest to przydatna + funkcją, gdy uruchamiamy polecenie, którego wykonanie może + zająć trochę czasu. Wykonanie odkładamy do tła dopisując + ampersand (&) na końcu polecenia (jako ostatni + argument). Działanie takiego programu + może trwać nawet po naszym wylogowaniu. Jeśli proces zakończy + działanie zostaniemy o tym poinformowani. +

+

+ Problem związanym z procesami działającymi w tle jest, możliwe + pobieranie informacji z standardowego wejścia. Jeśli nie + przewidzieliśmy takiego zachowania programu, to wówczas może zostać + on zatrzymany lub zakończony. Można go wznowić za pomocą polecenia + fg o ile został zatrzymany. Innym problemem jest wypisywanie + danych przez proces w tle na standardowe wyjście oraz strumień błędów. + Przed uruchomieniem takiego polecenia należy przekierować te + strumienie, ponieważ podczas pracy w terminalu z innymi aplikacjami + dane ze strumieni mogą zaburzać ich wyświetlanie. Jeśli powłoka + będzie dziwnie się zachowywać, wystarczy wydać polecenie + reset i wszystko wróci do normy. +

+

2.17. Tryb pliku i uprawnienia

+

+ Każdy plik na Uniksie (więc na Linuksie też), posiada komplet + uprawnień określajacy czy można go odczytać, + zapisać do niego lub go + uruchomić. Pierwsza kolumna wyniku polecenia ls -l + zawiera tryb pliku. Dane trybu możemy podzielić na cztery części + Typ, Uprawnienia użytkownika (właściciela), + Uprawnienia grupy, Uprawnienia pozostałych + użytkowników.. +

+

+ Pierwszy znak to typ pliku, jesli występuję w nim myślnik (-), + to mamy doczynienia ze zwykłym plikiem, innym typem pliku może być + litera d oznaczająca katalog. +

+

+ Pozostałe znaki, definiują uprawnienia. Dzieli się je na trzy grupy + wypisane powyżej, po trzy znaki na każdą z nich. W grupie (zestawie + uprawnień, przeznaczonym dla konkretnej grupy lub osoby) mogą + wystąpić 4 rodzaje znaków. +

+
    +
  • r - oznacza, że plik można czytać.
  • +
  • w - oznacza, że do pliku można pisać.
  • +
  • x - oznacza, że plik można uruchomić.
  • +
  • - - oznacza, brak uprawnienia.
  • +
+

+ Mówiąc o użytkowniku w pierwszym rodziale, wspomniałem że może być + on właścicielem pliku i do niego należy pierwszy zestaw uprawnień. + Drugi zestaw określa uprawnienia dla grupy, jaka została przypisana + temu plikowi, z tych uprawnień będzie korzystać każdy użytkownik tej + grupy, próbujący uzyskać dostęp do pliku. Trzeci grupa, należy do + pozostałych użytkowników systemu. Użytkownika root nie + obejmują żadne z powyższych grup, choć to może zależć od konfiguracji + systemu, mimo to superużytkownik może sobie zmieniać dowolnie + uprawnienia. +

+

+ Nie wymieniony na powyższej liście dodatkowym bitem (o uprawnieniach + możemy mówić jak o bitach, np. "potrzebuje bitu odczytu aby odczytać + dane z pliku") jest bit s - wybierz identyfikator + użytkownika. Pojawia się on zamiast bitu wykonywania x i + tyczy się wyłącznie plików wykonywalnych. Programy z ustawionym tym + bitem zawsze uruchamiają się z uprawnieniami ich właściciela bez + znaczenia, kto uruchamia ten program. Wiele programów korzysta z tego + rozwiązania, aby uzyskać uprawnienia superużytkownika i móc zapisywać + dane w różnych plikach systemowych. +

+

2.17.1. Modyfikacja uprawnień

+

+ Do zamiany uprawnień wykorzystamy polecenie chmod, + jako pierwszy podaje się zbiór uprawnień, a następnie bit uprawnienia + ze znakiem "+" jeśli chcemy dodać ten bit lub "-" jeśli chcemy ten + bit + usunąć. Zbiór uprawnień podajemy za pomocą pierwszych liter + angielskich + nazw u (ang. user)- użytkownika/właściciel, + g (ang. group) - grupa, + o (ang. others)- pozostali użytkownicy + systemu. +

+
+$ chmod go+r test.sh
+
+

+ Zbiory uprawnień można łączyć ze sobą, tak jak na powyższym + przykładzie lub jeśli chcemy dodać bit do wszystkich zbiorów to + możemy je pominąć jak na poniższym przykładzie. +

+
+-rw-r--r-- 1 xf0r3m xf0r3m 26 03-08 13:13 test.sh
+$ chmod +x test.sh
+-rwxr-xr-x 1 xf0r3m xf0r3m 26 03-08 13:13 test.sh
+
+

+ Przy plikach osobistych, nie warto dawać za dużych oprawnień + pozostałym użytkownikom. Chociaż obecnie może mieć to jedynie + znaczenie, gdy z serwera korzysta wielu wyspecjalizowanych + użytkowników. +

+

+ Innym sposobem na zmianę uprawnień jest użycie liczb, gdzie każda + z trzech liczb określa uprawnienia dla jednego zbioru. Liczby te są + sumami bitów, które reprezentowane są przez poszczególne wartości. +

+
    +
  • r - 4
  • +
  • w - 2
  • +
  • x - 1
  • +
  • - - 0
  • +
+
+$ chmod 644 test.sh 
+
+

+ Uprawnienia właściciela mają wartość 6. + co jest równe 4+2 - u+rw, grupa oraz pozostali mają + 4 co jest identyczne z zapisem + go+r. Liczby wykorzysywane tutaj pochodzą z oktalnego + systemu liczbowego. +

+

+ Zmiana uprawnień nosi nazwę bezwzględnej, ponieważ + zmieniane są uprawnienia wszystkich grup. +

+

+ Odnośnie uprawnień to istnieje bardzo ważna zależność pomiędzy bitami + odczytu oraz wykonania. Nadając katalogowi domowemu uprawnienia + rwxr--r-- czy 744. Pozostali użytkownicy będą + mogli odczytać zawartości katalog, ale nie uzyskają dostępu do pliku + podając go w jakimś poleceniu na ścieżce, do tego potrzebny jest + jeszcze bit wykonania. +

+

+ Za pomocą polecenia umask, możemy zdefiniować + domyślne uprawnienia dla plików. Polecenie to przyjmuje jako + argument te uprawnienia w postaci bezwględnej, które mają zostać + usunięte z nowoutworzonych plików i katalogów. Wydanie polecenia + umask: +

+
+$ umask 022
+
+

+ Spowoduje, że nowoutworzone pliki i katalogi będą mięc uprawnienia + w postaci rwxr-xr-x lub 755. Może wydawać się zbyt + liberalne, więc możemy ustawić argument polecenia nas 077, + wówczas + wszystkie utworzone pliki i katalogi będą wyłącznie dla nas. + Polecenie + umask, czesto występuje w plikach konfiguracyjnych powłoki. +

+ +

+ Dowiązanie syboliczne to jest alias będący plikiem wskazującym na + inny pliki lub katalog. Można uciec się do jednego słowa, że + dowiązanie symboliczne jest poprostu skrótem. +

+

+ Jeśli dowiązanie wskazuje na katalog, to przejście do dowiązania + przeniesie nas w miejsce, na które wskazuje. Cel dowiązania nie + musi nawet istnieć, jeśli jednak spróbuje przejść pod takie + dowiązanie wówczas uzyskamy typowy błąd, o tym że katalog nie + istnieje. Dowiązania uniemożliwają również sprawdzenie + charakterystyki + wskazywanego elementu, nie będzie wiadomo czy jest to plik, katalog + czy inne dowiązanie. Wiele połączonych ze sobą dowiązań symbolicznych + nazywane jest łańcuchem dowiązań +

+

+ Dowiązania symboliczne tworzone są za pomocą polecenia ln + z opcją -s (Ważne, aby użyć tej opcji). + Argumentami jest na początku cel a poźniej nazwa + dowiązania. Zachowanie kolejności argumentów jest ważne, ponieważ + możemy utworzyć dowiązanie, które prowadzi do nikąd i wprowadza + bałagan (być może w plikach systemowych). +

+

+ Mimo swoich wad dowiązanią są wygodną metodą na współdzielenie plików + oraz dodatkowo rozwiązują kilka drobnych problemów. +

+

2.18. Archiwizowanie i + kompresowanie danych

+

+ Przesyłając duża ilość małych plików przez sieć czy tez na pamięć + masową, możemy odczuć że trwa to wieki, na pewno trwa to dłużej niż + przesłanie jednego dużego pliku. Tutaj przedstawię sposoby na + stworzenie + jednego większego pliku z całego katalogu, przy czym użyjemy jeszcze + kilku algorytmów kompresii, przez co zaoszczędzimy na czasie i trochę + na zajmowanym miejscu. +

+

2.18.1. Program tar

+

+ Pierwsze narzędzie będzie służyć do tworzenia archiwum. Archiwa + łączą pliki i katalogi w jeden plik. Tar jest + standardowym program do archiwizacji na uniksach. + Tworzenie archwium za pomocą tar wymaga kilku + opcji. Natomiast składania polecenia jest następująca: +

+
+$ tar -cvf archiwum.tar plik1 plik2...
+
+

+ Opcja -c mówi programowi, że + tworzone będzie nowe archiwum, opcja -v + włącza komunikaty diagnostyczne wyświetlać one będą po kolei pakowane + do archiwum pliki; opcja -f + przekazuje programowi informacje o tym, że archwium będzie plikiem. + Domyślnie tar tworzył archiwa na taśmach. Obecnie pominięcie + tej opcji kończy pracę programu z komunikatem o błędzie. Możemy + natomiast użyć stdout podajac zamiast nazwy archiwum + myślnik (-). Póki co to archiwum nie jest jeszcze + skompresowane. +

+

Rozpakowywanie pliku

+

+ Rozpakowawanie różni się tylko jedną opcją - zamiast -c jest + -x. Następnie podajemy pozostałe opcje, a na końcu + nazwę pliku archiwum. +

+

Wyświetlenie zawartości archiwum

+

+ Wypakowanie całego archiwum może nie być do końca porządane, załóżmy + że potrzebujemy tylko jednego pliki. Za pomocą polecenia tar + z odpowiednim przełącznikiem możemy wyświetlić listę plików w + archiwum. Zamiast -x, używamy + -t reszta pozostaje taka sama, jeśli archiwum jest + duże to możemy podłączyć wyjście tar potokiem do polecenia + less. Samego wypakowania dokonujemy podając wypakowywanego + pliku za nazwą archiwum. +

+

+ Ostanią dość istotną opcję jest -p, która powoduje + zachowanie oryginalnych atrybutów plików, jakie miały podczas + pakowania. Kiedy superużytkownika używa tar, ta opcja jest + domyślnie włączona. +

+

2.18.2. Program gzip

+

+ Program gzip (GNU zip) jest standardowym + narzędziem kompresującym w systemach uniksowych. Pliki skompresowane + za jego pomocą otrzymują rozszerzenie .gz. + Dekompresuje się je za pomocą polecenia gunzip, jako + argument podaje się nazwę pliku. Natomiast kompresji dokonuje za + pomocą polecenia gzip, podając plik do + skompresowania jako argument. +

+

2.18.3. Skompresowane archiwa + tar.gz

+

+ Obsługę skompresowanych archwów przy użyciu gzip, + rozpoczniemy od rozpakowania takiego archiwum. Nie ma sensu używania + do tego dwóch osobnych poleceń, jest to z resztą marnowanie zasobów. + Chcąc rozpakować skompresowane gzip archiwum, należy użyć + polecenia tar a po opcji + -x dodać, opcję -z następnie pozostałe czyli + -vf i na końcu podać nazwę archiwum. Tak jak na przykładzie: +

+
+$ tar -xzvf archiwum.tar.gz
+
+

+ Przy tego typu archiwach, możemy spodziewać się rozszerzenia + .tgz. Są to te same archiwa, jak te mające + rozszerzenie tar.gz. +

+

+ Przy wyświetlaniu zawartości takiego archiwum, zamieniamy opcję + -x na -t. A chcąc takie archwiwum + utworzyć to opcję -x na opcję -c + oraz podać katalog lub listę plików, która ma zostać umieszczona w + archiwum po jego nazwie. +

+

2.18.4. Inne metody kompresji

+

+ Poza archiwami spakowanymi za pomocą gzip, możemy też + spotkać archiwa spakowane za pomocą bzip2 oraz + xz. W przypadku bzip2, to programem + dekompresującym jest bunzip2, a opcją programu + tar jest -j (mała litera j). Jeśli + natrafimy na archiwum skompresowane xz, to programem + dekompresującym jest unxz, a opcją programu + tar jest -J (wielka litera j). +

+

+ Część dystrybucji wyposażona jest w program unzip + pozwalający na rozpakowanie plików .zip przygotowanych + pod systemem MS Windows, jak i samo rozpakowywujących się plików + .exe. +

+

2.19. Hierarchia katalogów

+

+ Struktura katalogów głównego, jest utworzona na + podstawie standardu hierarchii systemu plików, + określającego jakie podkatalogi ma zawierać katalog główny, oraz + co te podkatalogi mają przechowywać. Poniżej opisano na ten czas + najważniejsze z nich. +

+
    +
  • /bin - przechowuje pliki binarne przygotowane + przez kompilator języka C, w nowocześniejszych systemach mogą to + być + skrypty powłoki. W nim przechowywane są te najprostsze polecenia + jak cp.
  • +
  • /dev - przechowuje pliku urządzeń.
  • +
  • /etc - katalog zawierający najważniejsze pliki + konfiguracji systemu. Znajdują się tutaj pliki haseł, konfiguracji + uruchamiania systemu, urządzeń, sieci i innych elementów systemu.
  • +
  • /home - zbiorczy katalog, katalogów domowych + użytkowników. Standard wśród wszystkich nowoczesnych uniksów.
  • +
  • /lib - katalog przechowywujący biblioteki. + Te pliki przechowują kod, który może być wykorzystywany przez + pliki wykonywalne. Biblioteki możemy podzielić na statyczne lub + współdzielone. Tylko biblioteki współdzielone powinny znajdować + się w tym katalogu, pozostałe pliki tego typu znajdują się + w katalogu /usr/lib.
  • +
  • /proc - udostępnia statystyki o systemie w + postaci interfejsu plików i katalogów. +
  • +
  • /sys - ten katalog jest podobny do katalogu + /proc, z tym, że tworzy interfejs dla urządzeń oraz + systemu. Wiecej informacji na ten temat, znajduje się w następnym + rozdziale. +
  • +
  • /sbin - w tym katalogu zapisane są systemowe + pliki wykonywalne. Programy znajdujące się w katalogach + /sbin przeznaczone są do zarządzania systemem, dlatego + ten katalog nie występuje na ścieżce zwykłego użytkownika a wiele + narzędzi będzie działać tylko z kontem root. +
  • +
  • /tmp - w tym katalogu możemy umieszczać pliki + tymczasowe, którymi nikt się nie będzie przejmować. Każdy + użytkownik może zapisywać i odczytywać pliki z katalogu w tym + katalogu, ale nikt nie ma dostępu do plików zapisanych przez innych + użytkowników. Nie które programy wykorzystują, ten katalog jako + przestrzeń roboczą. Nie należy zapisywać ważnych danych do tego + katalogu, gdyż jego zawartość jest przez wiekszość dystrybucji + czyszczona podczas uruchamiania systemu, inne mogą usuwać + starsze pliki co jakiś czas.
  • +
  • /usr - W tym katalogu znajdziemy rozbudowaną, + strukturę katalogów, bardzo podobną to katalogu głównego. W tym + katalogu zapisana jest większa części systemu Linux.
  • +
  • /var - podkatalog zawierający "zmienne" dane + zapisywane przez programy w czasie swojego działania. Tutaj + znajdują się m.in. pliki dzienników systemowych.
  • +
+

2.19.1. Pozostałe katalogi główne

+
    +
  • /boot - przechowuje plik ładujące jądro systemu + w czasie uruchamiania komputera. W większości dystrybucji w tym + katalogu przechowywane są właściwe pliki jądra oraz początkowego + systemu plików w pamięci RAM. Początkowy system plików pamięci RAM + zostanie omówiony w dalszej materiału.
  • +
  • /media - w wielu dystrybucjach jest to główny + punkt przyłączania wszystkich mediów wymiennych, takich jak + karty pamięci Flash.
  • +
  • /opt - może przechowywać dodatkowe + oprogramowanie firm trzecich. W wielu systemach katalog /opt + nie jest wykorzystywany.
  • +
+

2.19.2. Katalog /usr

+

+ To właśnie w katalogu /usr znajduje się większość programów + i danych przestrzeni użytkownika, a są one rozlokowane po jego + podkatalogach. Poniżej znajduje się opis co znajduje się w + poszczególnych podkatalogach tego katalogu: +

+
    +
  • bin - większość, jak nie wszystkie + ogólnodostępne programy w systemie.
  • +
  • include - przechowuje pliki nagłówkowe + wykorzystywane przez kompilator języka C.
  • +
  • info - zawierają strony dokumentacji + GNU info.
  • +
  • local - miejsce gdzie administratorzy mogą + mogą instalować swoje oprogramowanie, katalog ten może zawierać + podobną identyczną strukturę, jak katalog /usr lub + katalog główny.
  • +
  • man - przechowuje strony podręcznika + systemowego.
  • +
  • share - kiedyś ten katalog był katalogiem + współdzielonym między komputerami, obecnie stracił na znaczeniu. + Mimo to dalej przechwouje informacje, przeważnie są to pliki ikon, + pliki zawierające znaki + towarowe dystrybucji oraz inne dane z których może korzystać wiele + programów. Ten katalog może zawierać podkatalogi takie jak + man oraz info.
  • +
+

2.19.3. Umiejscowanie jądra w systemie

+

+ Wspomniałem już że plik jądra znajduje się w katalogu /boot, + plik ten rozpoczyna się od nazwy vmlinuz, po tych + znakach + mogą wystąpić inne inforamcje oznaczające jego wersje. Po załadowaniu + jądra przez program rozruchowy, sam plik przestaje być + potrzebny. W trakcie pracy systemu operacyjnego jądro wykorzystuje + najróżniejsze ładowane i usuwane dodatkowo modułu. Ładowane + moduły jądra umieszczane są w katalogu /lib/modules. +

+

2.20. Uruchamianie poleceń przez superużytkownika

+

+ Korzystając z linuksa na naszym osobistym komputerze, przyjdzie taki + moment że będziemy musieli skorzystać z konta użytkownika + root. Aby to zrobić możemy przelogować się na jego konto + wykonać potrzebne czynności a następnie się wylogować. Ta czyność + przyniosła by zamierzony efekt ale nie jest bez wad. Dlatego też + możemy skorzystać z polecenia sudo, które + pozwoli, na uruchomienie polecenia podanego jako arugment + z uprawnieniami + superużytkownika. Jeśli polecenie nie występuje w systemie, to jest + dobry czas aby przelogować się na użytkownika root, i je + zainstalować. Polecenie po zainstalowaniu nie zadziała samo w sobie + potrzebne jest jeszcze określenie, którzy użytkownicy mogą używać + tego polecenia i co za jego pomocą mogą zrobić. Za to odpowiada + pliki /etc/sudoers. +

+

2.20.1. Plik /etc/sudoers

+

+ Samo polecenie sudo ma bardzo duża ilość opcji, jednak na tym + etapie nie skorzystamy z większości z nich. Najprostszym sposobem + na konfiguracje pliku /etc/sudoers jest odnalezienie w pliku + linii rozpoczynającej się pod słowa root a następnie + pod tą linią wpisać linię rozpoczynjącą się nazwy użytkownika oraz + dopisaniu kilku opcji, tak jak na poniższym przykładzie. +

+
+user ALL=(ALL) ALL
+
+

+ Pierwsze ALL, oznaczna dowolny + komputer. Drugie + (ALL) w nawiasach oznacza, że możemy + wydać polecenie jako dowolny użytkownik, być może spotkamy się + z takim zapisem w nawiasie (ALL:ALL), oznacza ono dowolnego + użytkownika i dowolną grupę. Trzecie ALL + oznacza dowolne polecenie. +

+

+ Jeśli drażnić nas będzie ciągłe wpisywanie haseł, to możemy przed + trzecim ALL w konfiguracji umieścić opcję + NOPASSWD, pamiętając aby pomiędzy te opcje wstawić + dwukropek (:) bo tak naprawdę określamy jakie + polecenia mają być uruchamiane bez podawania hasła. +

+

2.21. Podsumowanie

+

+ Po przeczytaniu tego rodziały wydaje mi się, że każdy ma solidne + podstawy obsługi systemu Linux z poziomu powłoki. Powłoka jest + jednym ze stałych komponentów dystrybucji, a wiele z nich dalej + obstaje przy BASH-u, jako domyślnej powłoce. +

+

3. Urządzenia

+

+ Odkąd powstał system Linux, w sposobach prezentowania urządzeń + użytkownikowi zachodziło wiele zmian. Na początku tego rozdziału + omówimy sobie tradycjny system sysfs. Aby potem + zająć się omówieniem systemu udev, pozwalającego + programom przestrzeni użytkownika automatycznie konfigurować oraz + używać nowych urządzeń. Podczas normalnego użytkowania systemu + rzadko będziemy mieć okazję do zarządzania urządzeniami. Nasza + interakcja z urządzeniami będzie ograniczać się do obsługi pamięci + masowych i korzystania najstarszego i naprostszego interfejsu jakim + jest katalog /dev. Mimo to, warto jednak wiedzieć w systemie + co jest od czego. +

+

3.1. Pliki urządzeń

+

+ Jądro udostępnia wiele urządzeń pod postacią plików, co daje nam + możliwość prostej manipulacji nimi. Te pliki są często nazywane + węzłami urządzeń. Korzystać z urządzeń możemy + za pomocą zwykłych operacji na plikach. Tego typu rozwiązanie nie + jest bez wad dlatego też nie wszystkie urządzenia lub ich funkcje + są udostępnianie w ten sposób. +

+

+ Pliki urządzeń są przechowywane w katalogu /dev. + A najprostszym sposobem interakcji z urządziem jest przekierowanie + wyniku jakiegoś polecenia do urządzenia /dev/null. + Urządzenie to jest miejscem na nie potrzebne nam dane ze strumieni, + ponieważ cokolwiek trafi do tego urządzenia, jest przez jądro + poprostu ignorowane. +

+

+ Wyświetlając sobie zawartość katalogu w bardziej szczegółowej liście + może zauważyć dziwne oznaczenia w trybie pliku. Litery te określają + rodzaje urządzeń a wśród nich możemy wyszczególnić: +

+
    +
  • Urządzenia blokowe - b - Procesy mogą odczytywać + dane z urządzeń blokowych przy użyciu bloków o stałej wielkości. + Pamięci masowe są przykładem urządzeń blokowych. Łatwo dzieli się + je na bloki, a ogólna wielkość + takiego urządzenia jest stała i można ją zindeskować, co daje + możliwość jądru na dostępu do dowolnego bloku danych.
  • +
  • Urządzenia znakowe - c - Urządzenia znakowe + działają w oparciu o strumienie danych. Do takich urządzeń można + zapisywać i odczytywać pojedyńcze znaki. Jądro zazwyczaj wykonuje + operacje odczytu i zapisu na fizycznym urządzeniu. Drukarki są + przykładami urządzeń znakowych. Warto wspomnieć, że jądro nie + jest w stanie ponownie odczytać danych ze strumienia po przekazaniu + ich dalej do procesu.
  • +
  • Urządzenia potokowe - p - tzw. + nazwane potoki są to urządzenia podobne do + urządzeń znakowych z tą jednak różnicą, że na drugim końcu + strumienia wejścia-wyjścia nie znajduje się fizyczne urządzenia ale + inny proces.
  • +
  • Urządzenia gniazdkowe - s - tzw. gniazda + są interfejsami specjalnego przeznaczenia i służa komunikacji + międzyprocesowej. Mogą występować poza katalogiem /dev.
  • +
+

+ Inną dość rzucającą się w oczy informacją na listingu katalogu, są + dwie liczy odzielone przecinkiem zamiast rozmiaru pliku, jest + numer główny i numer poboczny. + Te numer ułatwiają jądru identyfikacje urządzeń. Dla przykładu + partycje tego samego dysku mają ten sam numer główny ale + inny numer poboczny. +

+

+ Nie wszystkie urządzenia mają swoje pliki, takim przykładem są + interfejsy sieciowe. Jądro wykorzystuje dla nich inny interfejs + wejścia-wyjścia. +

+

3.2. Ścieżka urządzeń sysfs

+

+ Ze względu na uproszczoną interakcje z urządzeniami poprzez + odwołowywanie się do pliku w katalogu /dev oraz fakt, że + jądro systemu nadaje plikom z tego katalogu nazwy na podstawie + koleności wykrywania urządzeń podczas uruchamiania systemu, + wewnątrz jądra zaimplementowano interfejs sysfs. + Sysfs jest ujednoliconym sposobem prezentacji urządzeń + bazującym + na atrybutach sprzętowych, mający formę struktury katalogów i plików. + Główny katalogiem tego systemu jest katalog /sys/devices. + Przykładowa ścieżka dla pierwszego dysku SATA mającego swój plik + /dev/sda może wyglądać następująco: +

+
+/sys/devices/pci0000:00/0000:00:1f:2/host0/target0:0:0/0:0:0:0/block/sda
+
+

+ Warto tutaj zaznaczyć iż, scieżki systemu sysfs nie służą + uzyskaniu dostępu do urządzeń, umożliwają przeglądanie informacji + oraz zarządzanie urządzeniami. Dane zawarte na plikach na ścieżkach + sysfs powinny być odczytywane przez programy nie przez + ludzi. +

+

+ Chcąc sprawdzić scieżkę sysfs dla dowolnego urządzenia z + katalogu /dev należało by uzyć programu systemu udev + udevadm. +

+
+$ udevadm info --query=all --name=/dev/sda
+
+

+ Wykonując to polecenie dowiemy się przy okazji ile danych można + uzyskać informacji z systemu udev. +

+

3.3. Polecenie dd

+

+ Polecenie dd jest dość prostym, aczkolwiek + przydatnym narzędziem jeśli + choodzi o prace z urządzeniami znakowymi czy blokowymi. Jedyną + rzeczą, którą robi to polecenie jest odczyt danych z pliku + wejściowego lub ze strumienia i zapisanie go do wyjściowego pliku + lub strumienia, przy okazji dokonując pewnych konwersji. Najczęsciej + używane przeze mnie polecenie znajduje się poniżej. +

+
+$ sudo dd if=/dev/zero bs=1M of=/dev/sdX count=1
+
+

+ Polecenie wykorzystuje uprawnienia superużytkownika, aby uzyskać + dostęp do urządzenia blokowego. Samo polecenie zapisuje jeden + blok o wielkości 1M za pomocą zer z pliku /dev/zero + (nieskończony strumień zer), co powoduje usunięcie tablicy partycji + (o której będzie w następnym rodziale). +

+

+ Poniżej zostaną opisane najważniejsze opcje programu dd, + ich format różni się od innych programów uniksowych. Do przypisania + wartości opcją używa się tutaj znaku równości (=). +

+
    +
  • if=plik - plik wejściowy. Domyślnie stosowane + jest standardowe wejście.
  • +
  • of=plik - plik wyjściowy. Domyślnie stosowane + jest standardowe wyjście.
  • +
  • bs=rozmiar - rozmiar bloku danych. Polecenie + przesyła wiele bloków naraz, więc możemy użyć wielokrotności + takich jak: bajt - B, kilobajt - K, megabajt - + M, gigabajt - G i tak dalej.
  • +
  • ibs=rozmiar, obs=rozmiar - + rozmiar blok wejściowego oraz bloku wyjściowego, jeśli nie możliwe + jest stosowanie dla plików wejściowych oraz wyjściowych tego + samego rozmiaru bloku.
  • +
  • count=liczba - liczba kopiowanych bloków.
  • +
  • skip=liczba - powoduje pominięcie pierwszych + liczba bloków danych. Nie są one kopiowane do pliku + wyjściowego.
  • +
+

+ Przy korzystaniu z dd, należy uważać gdyż literówka w + poleceniu wystarczy, aby uszkodzić system lub spowodować utratę + ważnych dla nas danych. +

+

3.4. Podsumowanie nazewnictwa urządzeń

+

+ Do pracy z urządzeniami potrzebujemy jego nazwy. W systemie istnieje + kilka metod pozwalających na ustalenia nazwy urządzenia. +

+
    +
  • Odpytanie systemu udev, za pomocą polecenia udevadm.
  • +
  • Przeszukanie katalogu /sys.
  • +
  • Wyświetlenie plików dziennika jądra za pomcą polecenia dmesg, + w plikach dziennika znajdują się jego ostatnie komunikaty w tym + informacje o znalezionych urządzenia i nadanych im nazwach.
  • +
  • Jeśli to dysk i jest on widoczny w systemie to możemy skorzystać + z polecenia mount, chyba że nasz system nie montuje + samodzielnie partycji, to w tym przypadku możemy skorzystać z + polecenia fdisk z opcją -l.
  • +
  • Ostatni sposób działa tylko dla urządzeń blokowych oraz znakowych. + W katalogu /proc/devices znajduje się zestawienie + urządzeń reprezentowanych przez numer główny oraz przez + przypisany im sterownik. Wystarczy użyć numeru głównego + jako wyrażenia regulanego i zastosować go na listingu katalogu + /dev.
  • +
+

+ Dzisiaj praca z urządzeniami na Linuksie sprowadza się głównie do + partycjonowania dysku, więc aby znależć właściwe urządzenie wystarczy + użyć polecenia fdisk -l. +

+

+ Na poniższej liście znajdują się najczęściej wykorzystywane na + Linkusie konwencje nazwenicze. +

+
    +
  • Dyski twarde SATA - /dev/sd* - Nazewnictwo + dysków pochodzi od protokołu SCSI, mimo iż same urządzenia SCSI + wyszły z użycia. To protokół mający świetne zdolności adaptacyjne + cały czas działa we współczesnych systemach. Nazwa np. /dev/sda + odnosi się do całego dysku. Partycje oznaczne są dodatkowo liczbą + np. /dev/sda1. Pamięci masowe ze złączem USB również + wykorzysują podsystem SCSI do komunikacji z komputerem dla tego też + dyski tego typu również mogą występować jak /dev/sd*.
  • +
  • Napędy CD i DVD - /dev/sr* - Napędy optyczne + tak samo jak dyski korzystają z SCSI. Jednak te urządzenia są tylko + do odczytu. Jeśli chcielibyśmy skasować zawartość płyty, lub na + niej coś nagrać, to należało by się odwołać do ogólnego urządzenia + którego nazwa może byc na przykład taka: /dev/sg0. Raczej + jednak do nagrywania płyt będziemy wykorzystywać specjalne + oprogramowanie.
  • +
  • Dyski twarde PATA - /dev/hd* - w starszych + wersjach jądra, dyski były przedstawione za pomocą innych nazw. + Obecnie dyski PATA również wykorzystują SCSI, więc ich nazwy nie + będą się różnić od dysków SATA.
  • +
  • Terminale - /dev/tty1, /dev/pts/*, /dev/tty - + Terminale są urządzeniami przeznaczonymi do przesyłania znaków + pomiędzy system a urządzeniem wejscia-wyjścia, co najczęściej + ma celu wyświetlanie tekstu na ekranie terminala. Pseudoterminale + posiadają wyszystkie funkcję fizycznych terminali, jednak jądro + nie komunikuje się z fizycznym urządzniem, a z programowym + interfejsem wejscia-wyjścia takim jak okno powłoki. Urządzenie + /dev/tty1 to pierwsza wirtualna konsola, a + /dev/pts/0 to pierwsze okno powłoki. Linux do działania + nie potrzebuje klasycznego interfejsu użytkownika, jaki znamy + z innych systemów operacyjnych. Nie potrzebuje okien, paska zadań, + menu "Start" i innych elementów graficznych. Równie dobrze może + działać jak system 'DOS' w tzw. trybie tekstowym. + Praca w tym trybie pozwala na wykorzystanie komputera znacznym + stopniu. + Jedyne czego nie będziemy w stanie zrobić to skorzystać z czego + kolwiek co wymaga wyświetlania graficznego wymagającego pokazania + na ekranie czegoś więcej niż teskt i 8 podstawowych kolorów. + Tryb graficzny + zawiera wszystkie te rzeczy znane z innych systemów operacyjnych a + wymienione zostały one powyżej, choć to wszystko zależy od + uruchomionego menadżera okien. Pierwsza wirtualna + konsola jest pierwszym ekranem powłoki w trybie tesktowym, okna + powłoki mogą wystąpić w środowisku graficznym po uruchomieniu + odpowiedniego programu Terminal lub w przypadku trybu + tesktowego multipleksera terminala. Multipleksery są powielaczami, + pozwalającymi + podzielić konsolę na kilka mniejszych "okien", w których możemy + uruchomić kolejną powłokę. Zaś urządzenie /dev/tty, jest + odniesienie procesu do właściwego terminala, jeżeli program + odczytuje i zapisuje dane do terminala.
  • +
  • Porty szeregowe - /dev/ttyS* - są specjalnymi + urządzeniami terminalowymi pozwalającymi na komunikację z różnej + maści sprzętem wykorzystując do tego oprogramowanie, które pozwoli + skonfigurowanie komunikacji. Porty szeregowe otrzymują w systemie + nazwy kolejno: /dev/ttyS0 itd. w zależności od tego ile + mamy portów zainstalowanych w komputerze. Do połączenia za pomocą + portu szeregowego można wykorzystać adaptery USB, te urządzenia + mogą posiadać następujące nazwy: /dev/ttyUSB* lub /dev/ttyAMC*. + Modemy sieci komórkowych mogą występować w systemie pod postacią + adapterów USB portów szeregowych.
  • +
  • Porty równoległe - /dev/lp0, /dev/lp1 - służyły + do podłączenia drukarek wykorzystujących port LPT. Obecenie + zostały zastąpione przez porty USB. Drukarki mogą wymagać + dodatkowych znaków sterujących, dlatego też do drukowania lepiej + wykorzystać serwer druku CUPS, niż pisanie bezpośrednio do tego + portu.
  • +
  • Urządzenia audio - /dev/dsp, /dev/audio, /dev/snd/* - + Na Linuksie dostępne są dwa zestawy urządzeń odpowiadająych za + dźwiek. Starszy, rzadziej spotykany system OSS + korzystający z urządzeń /dev/dsp oraz /dev/audio + i nowszysz spotykany w większości dystrybucji ALSA + używający urządzeń w katalogu /dev/snd. System dzwięku + na Linuksie może być dwuwartstwowy, ponieważ do dyspozycji mamy + serwer pośredniczący PulseAudio, główną jego zaletą jest + łatwa możliwość przełącznia wyjść dzwięku oraz proste zarządzanie + całym podsystem dźwięku z poziomu jednego panelu. Wykorzystanie + samego systemu ALSA jest wystarczające, jednak + nie zbyt wygodne, ale oczywiście co kto lubi.
  • +
+

3.4.1. Tworzenie plików urządzeń

+

+ We współczesnych systemach nie ma potrzeby samodzielnego tworzenia + urządzeń, jednak czasami w specyficznych konfiguracjach może dość + do potrzeby utworzenia urządzenia. Osobiście spotkałem się z takim + przypadkiem konfigurując VPN na dystrybucji Alpine Linux, należało + osobiście utworzyć urządzęnie znakowe TUN. +

+

+ Urządzenie tworzymy za pomocą polecenia mknod, + podając nazwę urządzenia, jego rodzaj i w zależności od rodzaju + numer główny oraz numer poboczny (w przypadku + nazwanych potoków, nie trzeba podawać numery głównego i + numeru pobocznego. +

+

3.5 System udev

+

+ Zarządzanie plikami urządzeń jest jedną z cech jądra, która + mogła działać w przestrzeni użytkownika. Jądro tylko gdyby wykryło + nowe urządzenie wysłało by powiadomienie do procesu + udevd. Proces ten zbadał by charakterystykę urządzenia, + utworzył dla niego odpowiedni plik, a na koniec przewprowadził + jego inicjację. Niestety to tylko teoria. +

+

+ Rozwiązanie tego typu nie uwzględnia kilku problemów. Pliki urządzeń + są potrzebne już na wszczesnych etapach uruchamiania, zatem proces + udev musiał by zostać uruchomiony bardzo wcześnie, nie może + mieć żadnych zależności wobec plików urządzeń i uruchomić się + błyskawicznie, aby nie spowalniać procedury rozruchu systemu. +

+

3.5.1. System plików devtmpfs

+

+ System plików (będzie o tym w dalszej części materiału) + devtmpfs, został opracowany w celu rozwiąznia + problemów z dostęp do urządzeń w czasie uruchamiania systemu. W razie + gdy jądro będzie potrzebować pliku urządzenia to utworzy je oraz + powiadamia o tym fakcie system udev, który zamiast zajmować + się tworzeniem pliku przystępuje do inicjacji urządzenia i informuje + o tym pozostałe procesy. Po za tym proces udev tworzy kilka + dowiązań symbolicznych w katalogu /dev, które bardziej + szczegółowo identyfikują urządzenie, wyniki tego działania możemy + obejrzeć w katalogu /dev/disk/by-id. +

+

+ System udev, tworzy nazwy dowiązań bazdując na typie + interfejsu, nazwie producenta, informacji o modelu, numerze seryjnym + oraz partycji. Proces pobiera te informacji na podstawie reguł + systemu udev, jednak nie będziemy się tym tutaj zajmować. +

+

4. Dyski i systemy plików

+

+ Dyski w systemach Linux przedstawiane są jako urządzenia blokowe z + nazwami pochodzącymi od podsystemu SCSI - /dev/sdX. Z punktu + widzenia systemu na dysku znajduje się wiele warstw oraz + komponentów. Wybrane częsci dysku możemu zaalokować na partycje, + które system prezentuje w taki sam sposób jak dyski, dodają liczbę + na końcu nazwy dysku. Wystąpienia partycji na dysku przechowywane + są w tablicy partycji. +

+

+ Jądro systemu umożliwia dostęp do całego urządzenia (dysku) oraz do + partycji dzięki osobnym plikom urządzeń. +

+

+ Każdy dysk musi posiadać chociażby jedną partycję, aby był użyteczny + w systemie, z kolei taka partycja musi zostać sformatowana pod + wybrany system plików, aby mogła przez chowywać jakie kolwiek dane. + System plików możemy określić mianem bazy danych + przechowywującej informacje na temat plików i katalogów. +

+

4.1. Partycjonowanie dysków

+

+ Partycjonowanie dysku, odbywa się w oparciu o schematy. + Schematy partycjonowania okreslają ilość możliwych do + utworzenia na dysku partycji oraz ewentualne dodatkowe informacje + przechowywane w tablicy partycji. Wśród obecnie stosowanych możemy + wyróżnić takie schematy jak MBR oraz GPT. +

+

+ Na Linuksie dostępnych jest wiele narzędzi partycjonujących dysk, + jedne są obsługiwane jak z poziomu środowiska graficznego inne + zaś z poziomu terminala. Osobiście używam programu fdisk + i to na nim skupię się jeśli chodzi o partycjonowanie. Program ten + ma dwie istotne zalety. Po pierwsze nic nie zostanie zapisane do + momentu gdy nie wydamy polecenia (Tak, w fdisk wydaje się + polecenia, ale są one ograniczone do wpisania jednej litery i + naciśnięcia klawisza enter); po drugie w pakiecie fdisk + zawarty jest również program sfdisk (co prawda z + nieco dziwną składnią), ktory umożliwia manipulowanie dyski z poziomu + pojedynczych polecenie (w przypadku fdisk wykorzystywany + jest tryb interaktywny), przez co możemy użyć sfdisk w + skrypcie. +

+

4.1.1. Przeglądanie tablicy partycji

+

+ Przy użyciu polecenia: +

+
+$ sudo fdisk -l
+
+

+ możemy wyświetlić zawartość tablicy partycji wszystkich dysków w + systemie, Jeśli zaś interesuje nas wybrane urządzenie możemy wpisać + jego nazwę po opcji -l. Informacja + zwracana przez polecenie zawiera informacje o schemacie + partycjonowania w polu Disklabel type: oraz tabele + przedstawiającą nazwę urządzenia, informacje o ustwionej fladze + rozruchu, początku, końcu i rozmiarze podanym w sektorach (informacja + ile wynosi sektor znajduje się w linii Sector size) oraz + identyfikatorze i nazwie typu partycji. Identyfikatory można wypisać + podczas nadawania typu. +

+

+ Schemat partycjonowania MBR nazwany jest fdisk dos. + Identyfikator dysk jest krótszy. W przypadku tablicy partycji + GPT identyfikator dysku zawiera ciągu znaków odzielone + spacjami, nie występują w tabeli identyfikatory typów partycji + ponieważ są tak duże jak identyfikator dysku (podczas ustalania + wybierane są z wyświetlonej listy) oraz może wystąpić dodatkowa + kolumna przechowywująca etykietę partycji. Jednak główną różnicą + wśród tych schematów jest zarządzanie miejscem na dysku. Dyski z + tablicami MBR mogą mieć maksymalną pojemność do 2TB, jeśli użyjemy + wiekszego, to stosując tego typu partycję pozbędziemy się pozostałej + części dysku, kolejny minus dla tego rodzaju to możlwość tworzenie + maksymalnie czterech partycji podstawowych + (zwykłych partycji na dane), jeśli + chcielibyśmy + więcej owszem możemy jednak, musimy użyć jedno miejsce na + partycję rozszerzoną + bedącą kontenerem dla dysków logicznych. W przypadku + GPT raczej maksymalna wielkość dysku nie jest póki co osiąglna + (9,4 mld TB) a partycji podstawowych możemy utworzyć, aż 128. To są + tak naprawę za i przeciw, które decydują o użytym schemacie. +

+

4.1.2. Modyfikowanie tablicy partycji

+

+ Modyfikowanie tablicy partycji należy rozpocząć, od zastanowienia się + na temat przydatności danych, które znajduja się obecnie na dysku. + Ponieważ modyfikowanie tablicy partycji, często będzie wiązać się z + potrzebą reformatowania modyfikowanej partycji. W stopniu podstawowym + skupimy się tworzeniu oraz usuwaniu partycji. Modyfikowanie tablicy + za pomocą fdisk, jest dość łatwe, polega na interaktywnym + wydawaniu poleceń oraz odpowiadniu na pytania programu, dlatego też + dla urozmaicenia użyjemy sfdisk zamiast wymienionego + wcześniej programu. Dla przykładu stworzymy dysk do klasycznej + instalacji systemu Linux z tablicą partycji typu MBR. Za dysk testowy + może posłużyć nam pendrive, karta pamięci lub plik na dysku. Ja + skorzystam z pliku. +

+

+ Plik przygotowuje za pomocą polecenia dd poznanego w + poprzednim rozdziale. +

+
+$ sudo dd if=/dev/zero bs=1M of=vhd.img count=8192
+
+

+ Zapisanie 8GB zer może chwilę potrwać. Po utworzeniu pliku przechodzę + do jego inicjalizacji. +

+
+$ echo "label:dos" | sudo sfdisk vhd.img
+
+

+ Polecenia sfdisk muszą pochodzić ze strumienia lub z + wcześniej przygotowanego skryptu. Polecenie tworzy na dysku + tablice partycji typu MBR. Kolejne polcenie będą już poleceniami + właściwymi tworzącymi partycje na naszym dysku. +

+

+ Polecenia sfdisk składają się z czterech pól: +

+
    +
  • początkowy sektor - w pierwszym polu wskazujemy + od którego sektora na dysku ma zaczynia się partycja. Pierwsza + partycja zawsze zaczyna się od drugiego megabajtu dysku. Wartość + ta jest najczęściej pomijana i pozostawiana do decyzji programowi.
  • +
  • wielkość partycji - wielkość partycji podajemy + zapisując na początku znak plusa (+) następnie + podając jej wielkość w wygodnej dla nas wielkrotności bajtu, + pamiętając że zapisując jednostkę, używamy tylko pierwszej litery + (dla GB nie jest GB tylko G).
  • +
  • typ partycji - typ partycji określany jest za + pomocą pojedyńczej litery dla zywkłej partycji na dane Linuksa + jest to L, dla przestrzeni wymiany (będzie o niej + za chwilę) jest S, a dla partycji rozszerzonej + jest to E.
  • +
  • flaga rozruchowa - flaga rozruchowa była + stosowana dawniej, obecnie straciła na znaczeniu. I jej obecność + może służyć zaznaczeniu partycji przechowywującej podkatalog + /boot katalogu głównego.
  • +
+

+ Po utworzeniu pierwszej partycji, każda kolejna będzie wymagać + podania podania opcji -a, która spowoduje + wykorzystanie wcześniej utworzonej tablicy partycji oraz jej numeru + po opcji -N przed wskazaniem + poleceniu urządzenia. Zatem pierwszą partycję tworzymy za pomocą + poniższego polecenia: +

+
+$ echo ",+7G,L,*" | sudo sfdisk vhd.img
+
+

+ Pierwszej partycji przydzielono większość miejsca na dysku, będzie + ona przechowywać katalog główny. Resztę miejsca wykorzystamy na + partycję rozszerzoną, a wewnątrz niej utworzymy dysk logiczny będący + partycją wymiany. +

+
+$ echo ",,E," | sudo sfdisk -a -N 2 vhd.img
+$ echo ",,S," | sudo sfdisk -a -N 5 vhd.img
+
+

+ Teraz możemy wyświetlić sobie tablice dysku, który partycjonowaliśmy. + Zwróćmy uwagę na to, że wystarczy odpowiedni numer partycji aby + utworzyć dysk logiczny. Pominięcie rozmiaru spowoduje zaalokowanie + pozostałego wolnego miejsca. Tak przygotowane partycje są gotowe do + sformatowania pod wybrany system plików. +

+

Usuwanie partycji

+

+ Eksperymentując poraz pierwszy z sfdisk może nam coś nie + wyjść dlatego też zamiast rozpoczynać partycjonowanie od nowa możemy + źle przygotowaną partycję usunąć. Wydając polecenie sfdisk + opcję --delete następnie nazwę urządzenia oraz + numer partycji, którą chcemy usunąć. +

+

+ Korzystając z sfdisk pozbawiamy się bufora, ponieważ + program ten zmienia tablicę partycji z każdą modyfikacją. Jeśli + chcemy tylko sprawdzić jak będą wyglądać pewne zmiany to lepiej + użyć polecenia fdisk. Pomoc uruchamiana jest + za pomocą polecenia m po uruchomieniu programu. +

+

4.2. Systemy plików

+

+ Systemy plików umożliwiają zamianę prostego urządzenia blokowego + w sktrukturę plików i katalogów zarozumiałą dla końcowego użytkownika. + Dawniej służyły głównie przchowywaniu plików jednak obecne ich + funkcje umożliwiają wykorzystanie ich jako interfejsów systemowych + w takich katalogach jak /proc czy /sys. +

+

+ Normalnie systemy plików są implementowane w jądrze systemu, jednak + rozwiązana zastosowane w następcach Uniksa, takich jak Plan 9. + umożliwiły stworzenie systemów plików działających w przestrzeni + użytkownika, tzw. FUSE. Dzięki tej funkcji możemy + zapisywać dane na nośnikach z takim system plików jak NTFS. +

+

+ Istotną funkcję jeśli chodzi o sposób działania systemów plików, jest + wykorzystanie VFS, który standaryzuje dostęp do + plików i katalogów dla aplikacji użytkownika, dlatego też Linux + obsługuje tak wiele systemów plików. +

+

4.2.1. Typy systemów plików

+

+ Mimo iż Linux, może obsługiwać chyba wszystkie możliwe systemy plików, + to większość z nich wymaga dodatkowego oprogramowania. Natywnie + obsługiwane systemy plików Linuksa znajduje się na liście poniżej. +

+
    +
  • EXT4 (Czwarty rozszerzony system plików) + - domyślny i najpopularniejszy system plików dla linuksa, + wyposarzony w pliki dziennika, znane z ext3 oraz + zwiększone limity związane z wielkością plików oraz ilością + podkatalogów w katalogu względem wersji trzeciej. W przyszłości + może zostać zastąpiony przez btrfs lub xfs.
  • +
  • iso9660 - standardowy system plików stosowany na + płytach CD-ROM.
  • +
  • FAT - rodzina systemów plików znan z wczesnych + wersji systemu MS Windows, obecnie wykorzystywana przez pamięci + flash, jak pendrive oraz karty pamięci.
  • +
  • HFS+ - system plików stosowany w starszych + wersjach systemu Apple macOS. Zastąpiony prze APFS. Wykorzystanie + partycji system HFS+, jest jedyną możliwością przenaszalności + plików pomiędzy współczesnymi Macami a Linuksem.
  • +
+

4.2.2. Tworzenie systemu plików

+

+ Tworząc partycje w poprzednim punkcie pozostało jeszcze sformatować + pod konkretny system plików, aby można było przechowywać na nich + informacje. System plików tworzony jest za pomocą polecenia + mkfs. Polecenie ma inną nieco inna składnię, + ponieważ żądany system plików podaje się po kropce w nazwie polecenia + np. mkfs.ext4. Jako argument podajemy nazwę + urządzenia partycji. +

+
+$ sudo mkfs.ext4 /dev/sda1
+
+

+ Podczas formatowania partycji program wyświetla komunikaty + diagnostyczne. Wśród nich znajdują się liczby oddzielone do siebie + przecinkami. Te liczby to kopie zapasowe superbloku. + Superblok to najwyższy poziom bazy danych systemu + plików, jest on na tyle ważny że program tworzy kilka jego kopii. + Numery bloków zawierających kopie superbloku należy zachować + ponieważ może być ona potrzebna do ewentualnego odzyskiwania danych. +

+

+ Przyglądając się samemu programowi mkfs dojedziemy do + wniosku, że jest to swojego rodzaju interfejs do całego zbioru + programów tworzących systemy plików. Nie które wystąpienia tego + interfejsu są dowiązaniami sybolicznymi do innych programów. + np mkfs.ext4 wskazuje na + program mke2fs, będący głównym programem do służącym + do tworzenia systemów plików z rodziny EXT, warto o tym pamiętać + ponieważ możemy natknąć się na systemy bez polecenia mkfs. +

+

4.2.3. Montowanie systemów plików

+

+ Proces dołączania systemu plików w uniksach nazywany jest + montowaniem. Aby zamontować w systemie jakiś system + plików należy użyć polecenia mount, użyć tego + polecnia bez żadnej opcji spowoduje wyświetlenie podmonotowanych + systemów plików. Montowanie jak i późniejsze odmontowywanie wymagają + uprawnień superużytkownika. +

+

+ Każdy wpis to jedno montowanie systemu plików, wpisy zwierają kolejno + nazwę urządzenia, docelowe miejsce montowania, typ systemu + oraz opcje specyficzne dla systemu. +

+

+ Montowanie systemu plików odbywa się za pomocą tego samego polecenia, + jednak wymaga podania kilku argumentów, kolejno: +

+
    +
  • nazwy urządzenia
  • +
  • typ systemu plików
  • +
  • punktu montowania - katalogu docelowego dla + montowanego systemu plików.
  • +
  • opcje specyficzne dla systemu plików - opcje + są podawane jak wartość opcji -o polecenia. Nie + zawsze trzeba podawać opcje systemu plików.
  • +
+

+ Montując systemy takie jak EXT, czy któryś z FAT możemy pominąć + rodzaj podczas montowania, program sam to ustali. Jednak montowanie + udziałów sieciowych CIFS, wymaga podania typu aby + program mount mógł rozpoznać wartości zapisane w + argumentach. +

+

+ Po skończeniu prac z system plików, możemy go odmontować za pomocą + polecenia umount. Polecenie wymaga podania albo + urządzenia albo punktu montowania jako argumentu. +

+

4.2.4. Identyfikator UUID systemu plików

+

+ Montowanie systemu plików wymaga podania nazyw urządzenia. Pliki + konfiguracyjne odpowiedzialne za automatyczne montowanie systemów + plików w systemie podczas jego startu, nie mogą polegać na tych + samych nazwach urządzeń co użytkownicy, ponieważ są one ustalane + pod czas startu systemu, i ich nazwy zależą od kolejności + wykrycia ich przez jądro. W takich plikach używa się + identyfikatorów UUID swoistych numerów seryjnych + systemów plików nadawanych podczas formatowania. Listę urządzeń + wraz z UUID-ami, możemy wywołać za pomocą polecenia: +

+
+$ sudo blkid
+
+

+ Identyfikatorów możemy używać nie tylko z plikami konfiguracyjnymi + jak /etc/fstab, ale równie przy polecniu mount zamiast + klasycznej nazwy urządzenia. Jednak posługiwanie się tak długim i + skomplikowanym ciągiem znaków nie jest za wygodne. +

+

+ Polecenie blkid może zwracać w polu UUID numery + identyfikacyjne innych systemów plików takich jak na przykład FAT, + gdzie UUID-em jest numer seryjny woluminu FAT. Oczywiście takie + identyfikatory możemy używać podczas konfiguracji pliku + /etc/fstab. +

+

+ UUID musi być unikatowy, dlatego też jeśli zasła potrzeba skopiowania + całego systemu plików, to należy zmienić ten identyfikator aby + odróżnić kopię od oryginału. +

+

4.2.5. Buforowanie dysku i systemu plików

+

+ Uniksy w tym i Linux nie zapisują wszysktkich zmian w systemie + plików po otrzymaniu takiego żądania. Zmiany przechowywane są w + pamięci RAM od momentu kiedy jądro będzie mogło swobodnie zapisać + je na dysku. +

+

+ W momencie odmontowywania systemu plików jądro automatycznie + synchronizuje zawartość dysku. Jeśli z jakiego powodu nie będziemy + mogli odmontować systemu plików to wówczas możemy wydać polecenie + sync, które wymusza zapisanie na dysku wszyskich + zmian w systemie plików. Oczywiście w wiekszej liczbie przypadku + problemów z odmonotowaniem systemu plików jest proces używający + któregoś z plików na dysku. +

+

+ Jądro dysponują całą serią mechanizmów wykorzystujących pamięć RAM + do buforowania danych odczytywanych z dysków, przez co jeśli proces + wielokrotnie będzie odczytywać dane z tego samego pliku, jądro nie + będzie musiało odwoływać się do danych na dysku przez każde dane do + procesu z bufora, oszczędzając tym samym czas i zasoby. +

+

4.2.6. Opcje montowania

+

+ Polecenie mount posiada dużą ilość opcji. Jest ona tak duża + że wprowadzenie opcji długich wynikało z obowiązku aniżeli wygody, + ponieważ nazwyczajniej zaczynało tych liter w alfabecie brakować. + Z posród opcji krótkich - jedno literowych możemy wyróżnić + najważniejsze: +

+
    +
  • -r - powoduje zamontowanie systemu plików w + trybie tylko do odczytu.
  • +
  • -n - powoduje nie modyfikowanie pliku + /etc/mtab (plik zawiera zamontowane obecnie systemy plików, + wydanie polecenia mount bez żadnych opcji powoduje + wyświetlenie zawartości tego pliku). Opcja ta pozwala na + zamontowanie systemu plików w momencie gdy system plików zawierjący + katalog główny, a co za tym idzie plik /etc/mtab jest + zamknotowany w trybie tylko do odczytu, bowiem nie zapisanie zmian + w tym pliku spowoduje niepowodzenie montowania.
  • +
  • -t - umożliwia podanie systemu plików.
  • +
+

+ Opcje długie podawane wraz z opcjami specyficznymi dla systemu plików + po opcji -o. Z opcji długich możemy wyróżnić takie jak: +

+
    +
  • exec, noexec - włącza i wyłącza możliwość + uruchamiania programów w danym systemie plików.
  • +
  • suid, nosuid - włącza i wyłącza możliwość + korzystania z bitu suid przez programy.
  • +
  • ro - montuje system plików w trybie tylko do + odczytu.
  • +
  • rw - mountuje system plików w trybie pełnego + dostępu.
  • +
+

4.2.7. Pownowne montowanie systemu plików

+

+ W trakcie odzyskiwania danych może zajść potrzeba ponownego + zamontowania systemu plików w celu zmiany opcji montowania. + Najczęściej chodzi o przełączenie systemu plików zawierającego + katalog główny z trybu tylko do odczytu w tryb pełnego dostępu. + Ponownemu montowaniu służy opcja remount. +

+

4.2.8. Tablica systemów plików /etc/fstab

+

+ Plik /etc/fstab przechowuje informacje o systemach + plików oraz ich punktach montowania, dzięki czemu montuje te systemy + podczas uruchamiania systemu. Każdy wiersz tego pliku przechowuje + informacje o jednym systemie plików i jest podzielony na sześć pól. +

+
    +
  • Nazwa urządzenia lub UUID - dla dysków stosowane + są identyfikatory UUID, jednak napęd optyczny w + tym pliku, zapisywany jest nazwą urządzenia. Urządzeniem tylko do + odczytu napędu optycznego zazwyczja będzie /dev/sr0.
  • +
  • Punkt monotowania - katalog docelowy dla + montowanego systemu plików.
  • +
  • Typ systemu plików
  • +
  • Opcje - list długich opcji rodzielonych + przecinkami.
  • +
  • Informacje o kopiach bezpieczeństwa dla programu + dump - w tym polu zawsze należy podawać 0.
  • +
  • Kolejność sprawdzania spójność systemów plików - + systemowi plików zawierającemu katalogów zawsze podajemy wartość + 1. Oznacza to sprawdzenie tego systemu w pierwszej kolejności. + Pozostałym możemy podać wartość 2 lub 0, gdzie 2 oznacza + sprawdzenie tych systemów po systemie oznaczonym wartością 1. + Każdy kolejny system przychowywujący jakieś dane oznacza się + 2. Po sprawdzeniu systemu z jedynką, program będzie sprawdzać + po kolei systemy z dwójką. Natomiast 0 oznacza pominięcie + sprawdzania systemu przez program fsck.
  • +
+

+ Posiadając odpowiednie wpisy w plik /etc/fstab, możemy + montować system plików podając poleceniu mount tylko punkty + montowania co może być wygodne podczas montowania systemów plików + dużą ilością opcji. +

+

+ Istnieje kilka opcji które mają zastosowanie tylko w omawianym przez + nas pliku. +

+
    +
  • defaults - włącza domyślne ustawienie polecenia + mount dając tym samym największe uprawenienia.
  • +
  • errors - ta opcja ma zastosowanie tylko dla + systemów z rodziny EXT, pozwala na ustalenia zachowania systemu + w momencie problemów z montowaniem systemu plików. Do wyboru mamy + takie możliwości jak: continue - wygeneruj kod błędu i + kontynuuj pracę; remount-ro - zamontuj ponownie w trybie + tylko do odczytu; panic - zatrzymaj system.
  • +
  • noauto - opcja nakazuje pominąć wpis podczas + automatycznego montowania systemów plików.
  • +
  • user - pozwala na podmontowanie tego systemu + za pomocą polecenia mount bez potrzeby uprawnień + superużytkownika - podmontować ten system plików może każdy + użytkownik.
  • +
+

4.2.9 Pojemność systemu plików

+

+ Sprawdzenia zajętości systemu plików możemy dokonać za pomocą + polecenia df. Polecenie to domyślnie zwraca + wszelkie wartość w postaci kilobajtów, które nie są zbyt czytelne dla + człowieka. Aby przeskalować jednostki możemy posłużyć się opcją + -h. Polecenie wyświetla wynik swojego działania + w postaci pięciu kolumn przedstawiających kolejno system plików, + jego rozmiar, użyte miejsce, dostępne miejsce, stopień użycia w + procentach oraz punkt montowania. W przypadku użycia programu bez + podanej opcji rozmiar systemu nosi nazwę 1K-bl jest to + wielkość systemu plikach w jednokilobajtowych blokach. +

+
+$ df -h
+
+

+ Jeśli przjrzymy się na chwilę wynikom działania tego polecenia, + możemy dość do wniosku, że albo mamy doczynienia z błędem albo + tolerancja błędu przybliżenia jest bardzo. Otóż nie. Kilku gigabajtów + brakuje ze względu na to, że zostały zarezerwowane + i są do dyspozycji superużytkownika w momencie wyczerpania się + miejsca na danym systemie plików, aby zapewnić systemówi dalsze + funkcjonowanie oraz umożliwić administratorowi odzyskanie chociaż + części miejsca na dysku. +

+

4.2.10. Sprawdzanie i naprawnia systemu plików

+

+ Jądro do pracy systemu musi mieć pewność, że zamontowane systemy + plików są pozbawione błędów. Błędy systemów plików mogą powodować + utratę danych lub załamanie systemu. Najczęstszym powodem + występowania błędów w systemie plików, są zaniki zasialania + komputera spowodowane ludzką niewiedzą lub czynnikami środowiskowymi. + Najnowszej generacji systemy plików wykorzystują pliki dziennika, + dzięki, przerwanie działania systemu w wyniku różnych czynników + nie doprowadza do katastrofy to są przypadki gdzie i one zawodzą. +

+

+ Narzędzie przeznaczone do sprawdzania oraz naprawy systemu plików + nazywa się fsck. Fsck podobobnie do + mkfs uruchamia odpowiedni dla użytego na partycji systemu + plików. Program w trybie interaktywnym uruchamiamy wydając polecenie + fsck następnie podając nazwę urządzenia. +

+
+$ fsck /dev/sdb1
+
+

+ Nie wolno uruchamiać programu na zamontowanym systemie plików, gdyż + grozi to utratą danych oraz załamaniem systemu. Inaczej sprawa ma się + gdy system plików jest w trybie tylko do odczytu. +

+

+ W trybie interaktywnym program będzie zwracać raport z kolejnych + etapów, jeśli napotka jakiś problem program zapytanie o usunięcie + błędu. W wyniku błedów w systemie plików może zdarzyć się, że + pewne pliki zostaną pozbawione nazwy (nazwy plików są w uniksach + elementami systemu plików). Program kiedy napotka na taki to zostanie + on przeniesiony do katalogu lost+found z nazwą + odpowiadającą numerowi identyfikacyjnemu z systemu plików (węzła + i-node). Rzeczywistą nazwę musimy ustalić samodzielnie + na podstawie analizy jego zawartości. +

+

+ Program e2fsck - właściwy program fsck dla + rodziny systemów plików EXT, posiada opcję -p + zajmującą się naprawą drobnych błędów. Program zatrzyma się wówczas + tylko wtedy gdy napotka poważny błąd. Jeśli mamy podejrzenie, że coś + się dzieje z system plików, to możemy sprawdzić system plików bez + dokonywania w nim żadnych modyfikacji, korzystając z opcji + -n. Co w przypadku uszkodzenia superbloku? + Podstawową bazę danych możemy odbudować za pomocą opcji + -b po opcji należy podać lokalizację kopii + superbloku (numer sektora podawany przez mkfs podczas + tworzenia systemu plików). W przypadku gdy zapomnieliśmy spisać te + numery, możemy spróbować je odzyskać wydając polecenie mke2fs + wraz z opcją -n dla urządzenia. Należy upewnić się, + że na pewno użyliśmy tej opcji jej pominięcie sformatuje partycję. +

+

+ Istnieją przypadki uszkodzeń, które wykraczają po za sferę programową + program fsck, nie jednokrotnie pokazał mi, że by się + wydawało katastrofę, naprawiał pojedyńczym domyślnym uruchomieniem. + Jeśli nasze systemy dyskowe przechowują ważne informacje, to + najlepszą ochroną jest kopia zapasowa warto je + robić. Lepiej jest wymieć dysk, zainicjalizować dysk i przegrać dane + niż liczyć na to, że może coś się uda odzyskać. Może się uda, jakieś + szanse istnieją. Jeśli posiadamy kopię, to szanse przekraczają 90% + reszta to ich aktualność. +

+

4.2.11. Systemy plików o specjalnym znaczeniu

+

+ Nie wszyskie systemy plików służą zapisywaniu informacji na + fizycznych nośnikach, nie które z nich mogą służyć jako intefejsy + systemowe lub przezentować informacje systemowe. Takimi systemami + są: +

+
    +
  • proc - system montowany w katalogu /proc, + Zawiera katalogi odpowiadające każdemu z procesów w systemie ich + nazwy pochodzą od PID-u procesu. Pliki opisują różne + aspekty procesów. Na Linuksach katalog ten przechowuje wiele + dodatkowych informacji o jądrze systemu i sprzecie.
  • +
  • sysfs - system montowany w katalogu /sys. + Omawiany był w poprzednim rozdziale.
  • +
  • tmpfs - montowany w katalogu /run oraz + innych miejsach. Za pomocą tego systemu możemy przekształcić pamięć + systemową w coś w rodzaju przestrzeni dyskowej, za pomocą dwóch + paramerów (size oraz nr_block) możemy określić + jego wielkość podczas montowania. Nie należy przesadzać z zapisem + danych do tego systemu, możemy doprowadzić do braku pamięci i + załamania systemu.
  • +
+

4.3. Przestrzeń wymiany

+

+ Za pomocą przestrzeni na dysku jesteśmy wstanie powiększyć ilość + użytkowej pamięci operacyjnej. System będzie automatycznie przenosić + strony pamięci (obszary) na dysk i z dysku, wykorzystująca tzw. + pamięć wirtualną. Operacja przenoszenia stron pamięci na dysk i + z powrotem nosi nazwę wymiany + (ang. swapping), ponieważ polega na wymianie nieaktywnych + stron w pamięci z aktywowany zanajdującymi się aktualnie na dysku. + Przestrzeń, w której zapisywane są strony pamięci nazywa się + przestrzenią wymiany. +

+

4.3.1. Wykorzystanie partycji jako + przestrzeni wymiany.

+

+ Wykorzystanie partycji jako przestrzeni wymiany jest standardową + procedurą wykonywaną podczas instalacji systemu. Wiele dystrybucji + zwraca uwagę na to, gdy brakuje partycji wymiany. + Partycja wymiany może nie być nigdy wykorzystana, jednak chroni + system przed załamianiem gdy zaczyna brakować pamięci RAM. +

+

+ Podczas modyfikowania tablicy partycji, utworzyliśmy dysk logiczny, + który posłuży jako przestrzeń wymiany. Przestrzeń wymiany należy + sformatować, tak jak każdą partycje, jednak już nie za pomocą + polecenia mkfs, ale mkswap podając + nazwę urządzenia jako parametr. +

+
+$ sudo mkswap /dev/sda5
+
+

+ Partycję wymiany możemy montować automatycznie w systemie za pomocą + wpisu w pliku /etc/fstab. Poniżej znajduje się wpis, który + można wykorzystać w instalacji. Zgaduje jednak, ża zainstalowana + przez nas dystrybucja Linuksa do Mint, Ubuntu lub Kali więc raczej + taki wpis znajduje się już tym pliku. +

+
+UUID="..."  none  swap  sw  0 0
+
+

+ Przestrzeń wymiany możemy włączać oraz wyłączać na żądanie za pomocą + poleceń swapon oraz swapoff + podając urządzenie lub plik jako argument. +

+

4.3.2. Wykorzystanie pliku jako przestrzeni + wymiany

+

+ Jeśli nie mamy dostępnego wolnego miejsca na dysku, możemy wówczas + stworzyć plik, który będzie służyć nam za przestrzeń wymiany. + Aktywujemy go, wówczas gdy ilość wolnej pamięci RAM, będzie + niebezpieczenie niska. Aby utworzyć taki plik, musi on posiadać + żądaną przez nas wielkość. Najprościej zapisać do niego określoną + liczbę zer z strumienia. +

+
+$ sudo dd if=/dev/zero bs=1M of=swap.img count=2048
+
+

+ Polecenie to zapisze dwa gigabajty zer do pliku + swap.img. Taki plik będziemy mogli + potraktować jak dysk lub partycję. Chciałbym tutaj również zaznaczyć, + że w tym momencie spotykamy się w praktyce z jedną z fundamentalnych + zasad Uniksów otóż "Wszystko jest plikiem". + Taki plik pozostaje jeszcze sformatować jako partycję wymiany. +

+
+$ sudo mkswap swap.img
+
+

+ Przygotowaną w ten sposób przestrzeń możemy uruchomić za + pomocą polecenia swapon. +

+

4.3.3. Jak dużej przestrzeni wymiany potrzeuje?

+

+ Odpowiedź na to pytanie nie jest trudna do sformułowania. Otóż + powszechnie przyjeło się, że przestrzeń wymiany powinna mieć wielkość + dwukrotności zainstalowanej pamięci RAM. Biorąc pod uwagę to, że + obecnie jesteśmy w posiadaniu dysków o bardzo dużej pojemności to + jest to nawet śmieszna wartość, jednakże to przekonanie poważnie + podważyło upowszechnienie się dysków SSD, które już dużych wartości + nie muszą mieć. Weźmy sprzęt wbudowany (tzw. embedded) lub + sprzęt mobilny, nie mówię tu o telefonach, ale np. chrombookach czy + rozwiązaniach typu HP Stream. To tym przypadku przestrzeni dyskowej + może być za mało jak na 8GB swapu. Weźmy również pod uwagę fakt iż + prawdopodbnie nie skorzystamy z przestrzeni wymiany używając + Linuksa na współczesnym sprzęcie. Więc wydaje mi się, że najbardziej + optymalną wielkości swapu będzie 1GB. Na poparcie + dodam że wiele + instalatorów właśnie tyle alokuje podczas automatycznego + partycjonowania. +

+

4.4. Przyszłość systemów plików

+

+ Jedną z zauważalnych zmian w komputerach jest odejście powoli od + dysków talerzowych na rzecz dysków SSD, więc możemy spodziewać się + systemów domyślnie zoptymalizowanych pod kątem ich pełnego, + właściwego + wykorzystania. Zauważymy lub już jesteśmy świadkami odchodzenia od + rodziny systemu plików EXT, na rzecz takich systemów jak + brtfs, który obecnie jest domyślnym systemem dla takich + dystrybucji jak Fedora. Alternatywą dla tego systemu będzie + system plików xfs. Ich porównanie możemy znaleźć w + internecie. +

+

5. Uruchamianie jądra Linux

+

+ W tym rodziale rozpoczeniemy przyglądanie się procedurze uruchamiania + systemu operacyjnego, z czego ten fragment materiału poświęcimy na + procedurę uruchamiania jądra, programy rozruchowe oraz praktyczną + konfigurację najpopularniejszego programu rozruchowego jakim nie + wątpliwie jest GRUB. +

+

+ Procedura uruchamiania systemu wygląda w następujący sposób: +

+
    +
  1. System BIOS lub firmware (w przypadku UEFI) ładuje program + rozruchowy z dysku i uruchamia go.
  2. +
  3. Program rozruchowy szuka na dysku obrazu jądra, następnie ładuje + go do pamięci i uruchamia.
  4. +
  5. Jądro inicjuje wszystkie urządzenia wraz ze sterownikami
  6. +
  7. Jądro montuje partycję z katalogiem głównym.
  8. +
  9. Jądro uruchamia program o nazwie init, proces tego + programu zawsze ma PID o wartości 1. Od momentu startu + procesu typu init, rozpoczyna się uruchamianie przestrzeni + użytkownika.
  10. +
  11. Za pomocą programu init uruchamiane są pozostałe + elementy systemu (różnego rodzaju usługi).
  12. +
  13. Na koniec uruchamiany jest proces pozwalający się zalogować do + systemu.
  14. +
+

+ W tym rozdziale skupimy się na punktach tej listy od 2 do 4. + Pozostałe z nich, po za pierwszym (pierwszy wykracza po za ramy + merytoryczne, tego materiału) omówimy w następnym rozdziale. +

+

+ Niestety możliwość identyfikowania poszczególnych etapów uruchamiania + systemu jest osiągalna w zależności od dystrybucji. Te przeznaczone + na desktopy, ukrywają wiele informacji na temat pierwszych etapów + rozruchu systemu pod graficznymi ekranami, zawierającymi logo + dystrybucji oraz pasek postępu. Jeśli spotkamy się z takim ekranem, + to wówczas możemy naciśnać klawisz ESC, aby wyświetlić + komunikaty wypisywane podczas uruchamiania systemu. Umiejętość + identyfikacji poszczególnych etapów może pomoć w ewentualnych + problemach podczas rozruchu. +

+

5.1. Komunikaty rozruchowe

+

+ Większość systemów uniksopodobnych generuje wiele komunikatów + diagnostycznych. Część z nich pochodzi o samego jądra, pożniej + pojawiają się komunikaty z poźniejszych etapów uruchamiania. + Komunikaty te nie są zbyt przyjazne zwykłemu użytkownikowi, a + dystrybuje dążą do tego aby być jak najbardzie przyjazne dla + użytkownikowi nietechnicznemu, dlatego też ukrywają je za wyżej + wspomnianymi ekranami, drugą ważną rzeczą jest ciągły rozwój + jądra oraz sprzętu przez to systemy uruchamiają się tak szybko, że + nawet mając te komunikaty przed oczami zdołalibyśmy za nimi + nadąrzyć. +

+

+ Na szczęście są one zapisywane w plikach dziennika w katalogu + /var/log oraz nie tylko, poniżej znajduje się lista miejsc, + w których możemy szukać komunikatów rozruchowych. +

+
    +
  • Pliki dziennika systemu, takie jak: /var/log/kern.log, + oraz /var/log/messages rownież zawierają + komunikaty + diagnostyczne jądra oraz nie których usług systemowych.
  • +
  • Polecenie dmesg przyczym należy pamiętać, że + trzeba przepuścić jego wyście przez polecenie + less. Danych na pewno będzie więcej niż może pomieścić + jeden ekran. Polecenie ty wykorzystuje bufor cykliczny + jądra mający ograniczoną wielkość, jednak w nowoczesnych jądrach + jest on na tyle duży, że może przechowywać komunikaty rozruchowe + przez dłuższy czas.
  • +
+

+ Nie wszystkie etapy są uwzględnione w wyżej wymienionych miejscach, + część z nich może być wypisywana jedynie na konsole przez co przepada + bezpowrotnie. Programy typu init nowszej generacji mogą + przechwytywać te komunikaty a następnie zapisywać je za pomocą swoich + rozwiązań protokołowania (prowadzenia plików dziennika). +

+

5.2. Inicjowanie jądra i opcje rozruchu

+

+ Podczas rozruchu systemu jądro uruchamiane jest następującej + kolejności. +

+
    +
  • Sprawdzenie procesora
  • +
  • Sprawdzenie pamięci
  • +
  • Rozpoznawanie magistrali urządzeń
  • +
  • Rozpoznawanie urządzeń
  • +
  • Konfigurowanie uzupełniających podsystemów jądra (sieci itp.)
  • +
  • Montowanie partycji z katalogiem głównym
  • +
  • Uruchomienie przestrzeni użytkownika
  • +
+

+ Jednym z etapów inicjacji jądra jest montowanie katalogu głównego. + Generalnie to nic w tym nazwyczajnego oczywiście gdy potrzebne do + tego komponenty są wbudowane w jądro. Jeśli jednak te modułu + są w postaci odrębnych modułów, może wówczas zajść potrzeba + załadowania ich przed zamontowaniem głównego katalogu. Tym właśnie + zajmuje się początkowych system plików w pamięci RAM - initramfs. +

+

+ Zakończenie inicjacji i przekazanie uruchamiania procesu init + możemy zaobserować w komunikatach diagnstycznych szukając poniższej + linii. +

+
+Freeing unused kernel memory: ... freed
+
+

+ W tym momencie jądro zwalnia zaalokowaną nie używaną pamięć. +

+

5.3. Parametry jądra

+

+ Parametry jądra pozwajają na określenie jego zachowania, na przykład + ilość komunikatów diagnostycznych lub podają opcje właściwe dla + sterowników urządzeń. Parametry jądra użyte przy jego uruchamianiu + dostępne są pliku /proc/cmdline. +

+
+BOOT_IMAGE=/vmlinuz-4.19.0-19-amd64 root=UUID=59382884-accb-4106-9d25-44d1ba914530 ro quiet
+
+

+ Na parametry mogą składać się pojedyńcze słowa jak np. + ro czy quiet + lub opcje w formacje klucz=wartość. Opcja root + jest najważniejszą opcją, ponieważ bez niej jądro nie będzie mogło + odnaleźć plików programu typu init i uruchomić go. W + większości dystrybucji będzie UUID systemu plików zawierającego + katalog główny. +

+

+ Warto zwrócić uwagę również na opcję ro, + która nakazuje jądru zamontować system plików w trybie tylko do + odczytu. Ta czynność umożliwi bezpieczene sprawdzenie systemu plików + przez program fsck. +

+

+ Jeśli jądro nie rozumie jakiegoś parametru to zostanie on + przezkazany do programu init. Przykładem jest wartość + -s, który nakaże uruchomić przestrzeń użytkownika w trybie + pojedyńczego użytkownika. +

+

5.4. Programy rozruchowe

+

+ Zadaniem programu rozruchowego jest załadowanie + jądra do pamięci i uruchomienie go z odpowiednimi parametrami. Dla + linuksa dostępnych jest + wiele bootloaderów, poniżej znajduje się przedstawiająca je lista. +

+
    +
  • GRUB - standardowy program rozruchowy większości + dystrybucji Linuksa.
  • +
  • LILO - jeden z pierwszych programów, obecnie + został zastąpiony GRUB-em, jednak dalej są dystrybucje takie + jak Slackware (trzecia najstarsza, funkcjonująca + do tej pory dystrybucja), które go używają.
  • +
  • SYSLINUX - można go skonfigurować, tak aby + współpracował z wieloma różnymi systemami. Można go spotkać w + systemach wbudowanych, a jego pochodna ISOLINUX występuje na + obrazach płyt.
  • +
  • coreboot - zamiennik systemu BIOS komputera, + coreboot charkteryzuje się wysoką wydajnością. Stosowany jest + w odblokowanych chromebookach.
  • +
  • Linux Kernel EFISTUB - moduł jądra pozwalający + na załadowanie jądra bezpośrednio z partycji systemowej EFI/UEFI.
  • +
+

+ Z racji tego iż, duża liczba dystrybucji, korzysta z GRUB. To jego + omówimy sobie pod względem praktycznym. Coreboot stosuje + się jako zamiennik BIOS-u. A SYSLINUX raczej ma zastosowanie + specjalistyczne wykraczające po za ramy tego materiału. +

+

+ Aby program rozruchowy mógł załadować do pamięci jądro systemu, musi + uzyskać dostęp do dysku. Nie posiadając żadnych sterowników + program rozruchowy uzyskuje dostęp do dysku na poziomie BIOS-u, za + pomocą adresowania Linear Block Addressing mimo + bardzo niskiej wydajności zapewnia ono uniwersalny dostęp do dysku. +

+

5.4.1. Linux i Secure Boot

+

+ Na nowych komputerach korzystających z UEFI, mogliśmy spotkać się + przypadkiem, gdy komputer odmówił uruchomienia z płyty czy też z + pamięci flash. Wiele z nich wyświetlało monit o tym, że włączona + jest opcja bezpiecznego rozruchu. Opcja ta wymaga + podpisu przez zaufaną organizację programu rozruchowego, aby mógł + on być uruchomiony. Microsoft w ramach dystrybucji systemu Windows 8 + wymógł na producentach sprzętu domyślne włącznie tej opcji. + Przyczyny nie są mi znane, chciaż podejrzewam chęć utrudnienia + instalacji innego systemu nawet Windows 7. Oczywiście tę opcję możemy + wyłączyć odszukując opcję w panelu sterowania fimwarem (w BIOSie). + Jeśli obawiamy się o nasze bezpieczeństwo, to wyłączenie tej opcji + potrzebne jest wyłącznie na czas instalacji, ponieważ najnowsze + wersje programów rozruchowych są już podpisane, więc będą zostaną + zaaprobowane przez tę opcję. +

+

5.5. Praktyczne użycie programu rozruchowego GRUB

+

+ GRUB jest obecnie najszerzej wykorzystywanym bootloaderem, + dlatego też + warto poznać podstawy jego obsługi, bez owijania w bawełnę, bez + wertowania kolejnych kart książek z teorią na temat tego programu + rozruchowego. +

+

5.5.1. Pierwszy kontakt z GRUBm

+

+ Po przejściu procedur testowych firmware naszego komputera bez + znaczenia czy jest to BIOS czy UEFI, pokaże nam się tabela z której + będziemy mogli wybrać jedną z opcji. Podobna do tej na poniższym + rysunku. +

+

+ grub-boot-manager +

+

+ Przedstawiona na rysunku tabela może różnić się wyglądem ale + funkcjonalność pozostaje taka sama. Na samym dole jest napisane + Wyróżniony wpis zostanie wykonany + automatycznie za 5s.. Wyróżniony wpis to ten zaznaczony + na biało, a po pięciu sekundach zostanie on uruchomiony, ładując + system przy standardowych ustawieniach. Za pomocą strzałek możemy + poruszać się pod tabeli dokonując wyboru interesującego nas wpisu. + Wpis zawierający napis + Opcje zaawansowane dla systemu... + jest podmenu zwierającym (najczęściej) wpisy ładujące system z + poprzednimi wersjami jądra. Wpis w tabeli możemy edytować + wybierając go strzałką następnie naciskając klawisz e. GRUB + daje nam możliwość załadowani systemu z własnego wiersz poleceń. Ta + opcja przeznaczona jest bardziej zaawansowanych czynności, takich + jak na przykład diagnostyka konfiguracji GRUB-a. W tym materiale + nie będziemy się jednak zajmować wierszem polecenia. Jeśli ruszymy + się chociaż w menu + to odliczanie zostanie przerwane, więc aby załadować system trzeba + wybrać wpis. Naciśnięcie jakiego kolwiek klawisza w menu spowoduje + przerwanie odliczania. +

+

5.5.2. Instalacja GRUB w trybie BIOS

+

+ Instalacja GRUB w tryb BIOS, jest banalnie prosta. Wystarczy użyć + dwóch poleceń. Zazwyczaj korzystając z mainstreamowych dystrybucji + przeznaczonych dla użytkowników desktopowowych, nigdy nie będziemy + musieli tego robić, ponieważ zrobi to za nas instalator. Natomiast + są dwa scenariusze, kiedy niezbędna będzie ponowna instalacja + programu GRUB. +

+
    +
  • Instalacja bardziej zaawansowanych dystrybucji takich jak Gentoo + czy Arch Linux
  • +
  • Przenoszenie systemu z jednego komputera na drugi za pomocą + programów do obrazowania, jak Norton Ghost czy Paragon Backup.
  • +
+

+ Pierwsze polecenie jest takie same dla każdej dystrybucji. Jako + argument podajemy dysk (urządzenie główne - np. sda, sdb itp.). + Polecenie musi zapisać dane bezpośrednio na urządzeniu, więc + niezbędne będą uprawnienia administratora. +

+

+# grub-install /dev/sdX
+
+

+ Drugie polecenie zależy już od dystrybucji. Możemy wówczas + spotkać takie polecenie jak: +

+
+Debian / Ubuntu i pochodne:
+# update-grub
+Arch Linux i pochodne:
+# grub-mkconfig -o /boot/grub/grub.cfg
+
+

+ Drugie polecenie jest odpowiedzialne za wygenerowanie pliku + konfiguracyjnego. W przypadku GRUB jest to normalne, ponieważ + ze względu na jego skomplikowanie przygotowanie plików składowych + (będzie o tym później) spoczywa w rękach twórców samego GRUB-a lub + twórców dystrybucji. Użytkownik końcowy otrzymuje gotowe polecenie, + które stworzy taki plik konfiguracyjny za niego. + Polecenie z Arch Linux, jest dłuższe ale pochodzi bezpośrednio z + pakietu. Natomiast w przypadku Debiana i pochodnych mamy dostępne + narzędzie przygotowane przez dystrybucję, jest ono bez obsługowe + i uruchamia program do poszukiwania innych systemów operacyjnych na + innych dyskach podłączonych do komputera. Na Debianie i pochodnych + na pewno dostępne jest również to drugie polecenie, jednak lepiej + skorzystać z polecenia dedykowanego dla naszej dystrybucji. Ponieważ + to tak naprawdę jej twórcy zajmują się przygotowanie GRUB-a do użycia + co nie jest takie proste. +

+

5.5.3. Instalacja GRUB w trybie UEFI

+

+ Instalacja w trybie UEFI również składa się dwóch poleceń jednak + samo polecenie instalacyjne jest cieco dłuższe od tego z trybu BIOS. + Wymaga ona również więcej zachodu niż w trybie BIOS oraz może + zakończyć się niepowodzeniem. Tak się zdarza to, przy nie których + specyficznych sprzętach. +

+

+ Polecenie instalacyjne wygląda w następująco: +

+

+# grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=debian
+
+

+ Instalacja GRUB w trybie uefi wymaga, aby podać docelowy system, + w tym przypadku jest x86_64-efi, + w trybie BIOS, nie trzeba było podawać docelowego systemu gdyż + w przypadku BIOS cel i386-pc jest celem domyślnym, kolejny + argumentem jest podanie punktu montowania partycji efi. + Taka partycja jest zazwyczaj montowana albo bezpośrednio w głównym + katalogu - /efi lub wewnątrz katalogu /boot - + /boot/efi. Ostatnim argumentem jest + --bootload-id i tutaj panuje pewnego + rodzaju niewiadoma. Bo jeśli korzystamy instalujemy program + rozruchowy + pod Arch Linuxem, to bootloader-id to GRUB. + z kolei pod Debianem musi być to debian. Te nazwy + wynikają z faktu potrzeby podpisania programu rozruchowego aby + mógł on być uruchamiany z włączoną opcją bezpiecznego rozruchu. Warto + dodać, że to co podamy w tej opcji będzie wyświetlane w + boot menu komputera. Jeśli chcemy użyć jakiejś + niestandardowej nazwy i nie za bardzo przejmujemy się + secure bootem, + to wówczas możemy użyć opcji --no-uefi-secure-boot. +

+

+ Do w pełni zainstalowanego GRUB-a potrzebujemy tylko pliku + konfiguracyjnego. Do tego celu możemy wykorzystać polecenia podane + w punkcie odnośnie instalacji GRUB w trybie BIOS. +

+

5.5.4. Zmiana koleności w menu GRUB

+

+ Aby zamknąć już temat GRUB-a, przjedziemy do ostatniego zagadnienia. + Rozważmy taki przypadek. Mamy jeden komputer w domu, z którego nie + korzystamy tylko my. Mamy pozwolenie na wydzielenie pozostałej wolnej + części dysku (w duży uproszczemiu) i obok Windows 10 chcemy + zainstalować jakąś dystrybucje Linuksa. Załóżmy, że instalacja się + powiodła. Niestety mamy problem, gdyż współużytkownicy komputera + narzekają, że jak uruchamia się komputer to uruchamia się Linux a nie + Windows. Uruchamiając komputer widzisz, że początkowym i domyślnym + wyborem w menu GRUB-a jest Linux, a Windows z kolei znajduje się na + samym końcu listy. +

+

+ Pierwsza myśl jest przychodzi nam do głowy to ręczna edycja pliku + GRUB-a. Na pewno jest jakieś rozwiązanie. Zatem wyedytowaliśmy plik + zapisaliśmy zmiany i póki co jest spokój. Wszyscy zadowoleni, + korzystają z komputera. Któregoś dnia siedząc przy komputerze i + korzystając z naszej dystrybucji, zostajemy poinformowani o tym, że + są nowe aktualizacje. Instalujemy je zatem. Aktualizacje się + zainstalowały, zauważyliśmy że była również aktualizacja jądra. + Dobra, wyłączamy komputer. Następnego dnia gdy nasz współużytkownik + komputera chce skorzystać z niego, znów mu się uruchamia Linux a + nie Windows. Jaki z tego morał? Instalacja nowego jądra wymaga + z aktualizowania pliku konfiguracjnego GRUB-a, aby można było + korzystać ze świerzo zainstalowanego jądra automatycznie po ponownym + uruchomieniu komputera, więc nie należy ręcznie zmieniać ręcznie + pliku konfiguracjnego GRUB-a ponieważ aktualizacja czy to jądra + czy samego programu rozruchowego nadpisze te zmiany. +

+

+ Sposobów wykonania tej czynności jest kilka, ja znam jedną. Jak wiemy + plik konfiguracjny jest tworzony z plików składowych. Pliki te + znajdują się w katalogu /etc/grub.d, oto listing tych plików + z mojego komputera: +

+
+00_header
+05_debian_theme
+10_linux
+20_linux_xen
+30_os-prober
+30_uefi-firmware
+40_custom
+41_custom
+README
+
+

+ Jeśli obserwowaliśmy generowanie pliku konfiguracjnego GRUB-a, to już + powinniśmy znaleźć potrzebny nam plik. A jeśli nie to przyjrzyjmy się + nazwom tych plików. Mamy + header, debian_theme, linux, linux-xen + i os-prober. OS to akronim + od Operating System, z kolei prober oznacza to + samo co der Untersucher po niemiecku, czyli kontroler/badacz. + Czyli chodzi o kontrolera systemów operacyjnych. Jeśli wpiszemy + os-p w wierszu polecenia i naciśniemy tab, dowiemy się, że + istnieje nawet takie polecenie, wyszukaniu strony podręcznika dla + wiem że jest narzędzie odpowiedzialne za poszukiwanie innych systemów + operacyjnych na wszystkich dyskach komputera. Więc znamy już część + konfiguracji GRUB-a odpowiedzialną za Windows. Teraz jak zmienić + kolejność? Otóż przed każdą z tych nazw stoi liczba, wystarczy + zmienić nazwę, tak aby ten plik znajdował się przed plikiem + 10_linux. +

+
+$ sudo mv /etc/grub.d/30_os-prober /etc/grub.d/09_os-prober
+
+

+ Teraz trzeba już tylko wygenerować nowy plik GRUB-a. Rozwiązanie + powinno być odporne aktualizacje. Nie jest to może najpopularniejsze + rozwiązanie, ale działa. +

+

5.6. Wykorzystanie rEFInd jako menedżera rozruchu

+

+ Instalacja GRUB-a w trybie UEFI może się nie powieść, gdyż jednym z + jego etapów jest zapisanie w pamięci firmware-u informacji o nowym + programie rozruchowym o nazwie podanej podanej w parametrze + bootloader-id. Z błedem jak ja się spotkałem by: +

+
+Could not prepare boot variable: No space left on device
+
+

+ Nie które firmware mają ograniczoną ilość pamięci przechowywującej + wskazania programów rozruchowych. Mimo usunięcia jednej ze zmiennych + problem dalej występował. Usunięcie wszystkich spowodowało tak + jakby uziemienie komputera, ponieważ nie był on wstanie uruchomić + się z żadnego podpiętego dysku. Przełączenie trybu na BIOS, na tym + sprzęcie nie było możliwe. Na sprzęcie tej samej klasy oraz tego + samego producenta, ale nowszym spotkałem się z problemem z takim + problemem, iż system zainstalował się poprawnie nawet GRUB w trybi + UEFI, ale system nie był wstanie wystartować z wbudowanej pamięci, + ani z system zainstalowanym w trybie UEFI ani w trybie BIOS. +

+

+ Rozwiązanie może i jest proste, niestety może nie za bardzo + estetyczne oraz wymaga użycia dodatkowego pendrive-a. Pamięć USB nie + musi być duża, wystarczy 1GB. Polega ono na użyciu odrębnego + mendżera rozruchu jakim jest rEFInd. Program ten + przeszukuje dyski w poszukiwaniu systemów operacyjnych i + uruchamia je. +

+

+ Sama dystrybucja przy wykorzystaniu programu rEFInd może + być zainstalowana trybie BIOS. + W środowisku LiveCD instalujemy pakiet refind. + Podczas instalacji zostanie nam wyświetlony monit z pytaniem czy + zainstalować rEFInd na partycji ESP. Wybieramy opcję + No. +

+
+# apt update
+# apt install refind
+
+

+ Po zainstalowaniu, tworzymy na dysku USB 1 jedną partycję pod system + plików FAT32, następnie należy ją sformatować. +

+
+# dd if=/dev/zero bs=1M of=/dev/sdX count=1
+# echo ',,b,' | sfdisk /dev/sdX
+# mkfs.vfat -F32 /dev/sdXY
+
+

+ W powyższym przykładzie X to litera + porządkowa dysku, z kolei Y to + liczba partycji. Partycji nie musimy montować. Poniższe polecenie + zainstaluje na przygotowanym dysku program rEFInd. +

+
+# refind-install --usedefault /dev/sdXY --alldrivers
+
+

+ Po zainstalowaniu programu, możemy zrestartować komputer a następnie + w ustawienia UEFI, ustawić kolejkę rozruchu tak, aby komputer + startował z pendrive-a, na którym zainstalowaliśmy rEFInd. + W menu powinien pojawić się wpis z Linuksem zainstalowanym naszym + dysku. +

+

6. Uruchamianie przestrzeni użytkownika

+

+ Istotnym momentem podczas startu systemu operacjnego jest + uruchomienie przez jądro procesu init oznacza to, że pamięć + oraz procesor są gotowe normalnej pracy. Po za tym uruchomie tego + programu może przynieść również korzyść dydaktyczną, pozwalając + obserwować montowanie różnych komponentów w gotowy do pracy system. + Budowa programów typu init jest bardzie modułowa, więc jeśli + chcielibyśmy zmienić coś w tym procesie (uruchamiania przestrzeni + użytkownika) nie potrzebujemy umiejętności niskopoziomowego + programowania oraz trzymania się ściśle określonej ścieżki, jak ma to + miejsce w przypadku jądra. Uruchamianie przestrzeni użytkownika + zostało przedstawione na poniższej liście kroków: +

+
    +
  1. Jądro uruchamia program typu init.
  2. +
  3. Uruchamiane są usługi niskiego poziomu takie jak udevd + czy syslogd.
  4. +
  5. Sieć zostaje skonfigurowana.
  6. +
  7. Uruchamiane zostają pozostałe usługi jak (cron, + cups, itp.)
  8. +
  9. Startują aplikacje wyskokiego poziomu, ekrany logowania oraz + środowiska graficzne.
  10. +
+

6.1. Proces init

+

+ Głównym zadaniem procesu typu init jest uruchamianie, + zatrzymywanie i ponowne uruchamianie procesów istotnych dla pracy + całego systemu, chciaż jego najnowsze implementacje mają o wiele + więcej zadań, to jest to program jak każdy inny. Możemy go znaleźć + w katalogu /sbin. W dystrybucja Linuksa ma zastosowanie kilka różnych + implementacji procesu init. Na poniższej liście znajdują się + te wciąż używane. +

+
    +
  • System V init - tradycyjna wersja tego procesu + obecnie została wyparta z użycia w dystrybucjach głównego nurtu, co + przez nie których uznane za zły zabieg. Dalej rozwiajane są + dystrybucje, które są forkami tych głównych, ale opierają się, nie + tylko o sysvinit ale dają możliwość wyboru innego procesu + typu init niż systemd.
  • +
  • systemd - najnowsza implementacja tego procesu, + wykorzystywana w głównych dystrybucjach.
  • +
  • runit - alternatywa dla systemd, ma + zastoswanie nie tylko dla dystrybucji Linuksa ale innych systemów + zgodnych ze standardem POSIX. Jego działanie opiera się o 3 etapy. + Wykorzystywany jest w dystrybucjach, takich jak AntiX oraz Void + Linux.
  • +
  • OpenRC - alternatywa dla systemd, + stosowana przez takie dystrybucje jak Gentoo oraz Alpine Linux. + Ma on podobne możliwości do systemd.
  • +
+

6.2. Poziomy uruchomienia

+

+ Poziomem uruchomienia nazywamy stan maszyny, w + którym na dany moment uruchomione są wybrane komponenty. Są one + oznaczne liczbą od 0 do 6. Podczas pracy systemu, większość czasu + spędzamy na tylko na jednym poziomie uruchomienia, z momencie + zamykania systemu lub uruchamiania go ponownie przełączamy się na + inny poziom odpowiedzialny za zatrzymanie pracy jądra oraz poprawne + zakończenie pracy usług. Na poziomach uruchomienia bazuje tradycjny + sysvinit. +

+

+ Za pomocą poniższego polecenia możemy, sprawdzić na jakim poziomie + uruchomienia się znajdujemy: +

+
+$ who -r
+
+

+ Polecenie zwraca również moment załączenia wyświetlanego poziomu. +

+

+ Poziomy uruchomienia służą okreslaniu stanu systemu operacyjnego. + Może on być stanie uruchamiania, zamykania, trybie konsoli + (serwery, instalacje bez środowiska graficznego), trybie awaryjny + (tryb pojedyńczego użytkownika, będzie o tym pod koniec rozdziału). + 5 poziom uruchomienia oznacza najczęściej w pełnii uruchomiony system + wraz z trybem graficznym. +

+

+ Dzisiaj poziomy uruchomienia są domeną programu sysvinit. + Dystrybucje z systemd wykorzystują je, aby zapewnić + obsługę z usług, które nadal korzystają ze skryptów sysvinit. +

+

6.3. Rozpoznawanie programu typu init.

+

+ Identyfikacja programu typu init polega, na przeczytaniu + oprogramowania oferowanego przez dystrybucje. Jeśli program typu + init nie jest wyszczególniony, możemy przyjąć ze jest to + systemd. Wiele dystrybucji posiada w swoich cechach + wymienioną informacje o tym że używa innego programu typu + init niż systemd. +

+

6.4. Wprowadzenie do wybranych programów typu init

+

+ Ze względu na fakt, jak ograniczonych ram tego materiału. Nie będę + szczegółowo zagłebiał się w tematykę omawianych tutaj programów typu + init. Opisze ich zalety, na czym opiera się ich + działanie, jakich plików używają oraz co najważniejsze dla nas na + tym etapie w jaki sposób możemy zarządzać usługami przy użyciu tych + programów. Pierwszym jaki procesem typu init jaki poruszę + z racji popularności jest systemd. +

+

6.4.1. Systemd

+

+ Systemd wykonując swoje zadania osiąga + cel. Cel jest defiowany przez nas wraz z wszystkimi + zależnościami (wymaganiami) oraz z góry ustalonym momentem + realizacji tego celu. Następnie system rozwiązuje wszystkie + zależności oraz wykonuje postawione przed nim zadanie. Wynika z tego + jedna z jego cech, możemy opoźnić np. start usługi do momentu gdy + będzie ona niezbędna. +

+

+ Poza obsługą usług, której wszyscy oczekują od programu init, + systemd stara się z integrować ze sobą wiele klasycznych + usług takich jak cron czy inetd. +

+

+ Podczas uruchamiania usług systemd nie kieruje się żadną + kolejnością, co więcej większość jego konfiguracji stara unikać + jakiej kolwiek sekwencyjności, nawet pod czas spełniania zależności. + Takie działanie pozwala na zachowanie + dużej dozy elastyczności w procesie uruchamiania systemu. +

+

+ W zanadrzu swoich możliwości systemd może: montować systemy + plików, monitorować gniazda sieciowe czy uruchamiać zegary. Takie + rodzaju funkcje w tej impementacji programu typu init + nazywane są jednostkami (ang. units). A + operacja uruchomienia takiej jednostki nazywana jest + aktywowanie. Typ jednostek systemd dostępne + są na stronie podręcznika: systemd(1) (1 w nawiasie to numer + rozdziału). +

+

+ Każda jednostka może mieć zależności wobec innej jednostki. Może + wymagać lub chcieć jej działania na potrzeby zadania, które sama + realizuje. Zależności są definiowane w plikach jednostek dostępnych + w dwóch miejscach, w konfiguracji globalnej skierowanej do całego + systemu - /usr/lib/systemd/system oraz w definicjach + lokalnych - /etc/systemd/system. Jeśli będziemy + musieli wprowadzić jakieś zmiany w konfiguracji to zalecanym miejscem + jest katalog definicji lokalnych. Rozwiązywanie zależności + najczęściej polega na uruchomieniu samej jednostki, wobec której + ważna dla nas jednostka jest zależna. Liczy się czy natomiast czy + daną jednostkę udało się aktywować lub czy jednostka jest już + uruchomiona w trakcie uruchamiania naszej jednostki, tego typu + uwarunkowania definiowane przez typy zależności. Poza zależnościami + wobec innych jednostek, mogą występować również zależności bazujące + na stanie (istnieje, nie istnieje, jest niepusty) elementów takich + jak ścieżka, katalog czy plik. +

+

+ Uruchomienie jednostki nazywane jest aktywowaniem. Dlaczego nie + włączeniem? Otóż, aby uruchomić należy ją aktywować poniższym + poleceniem: +

+
+$ sudo systemctl start unit.service
+
+

+ To czy każdą jednostkę możemy tak sobie uruchomić zależy od jej + zależności. Zależności można definiować na odwrót, użwając sekcji + [Install], a wewnątrz niej typów zależności: + RequiredBy oraz WantedBy, + najczęściej wykorzystywana jest ta druga opcja. Za pomocą tej sekcji + oraz wymienionych zależności, jednostki instalowane są w celach. + Większość usług wykorzystywanych w linuksach, posiadają zależność + WantedBy ustawioną na cel multi-user.target. Jest + to spowodowane tym, że samo istnienie pliku jednostki może powodować + jej aktywacje, co w przypadku usług sieciowych nie jest porządane. + Zatem włączenie jednostki, jest w przypadku systemd + równoznaczne z włączeniem jej do zależności jednostki zapisanej w + zależności odwrotnej (cele w systemd, też są jednostkami ale + ich rola raczej ogranicza się do grupowanie różnego rodzaju innych + jednostek). Wydaje mi się, że wszystko rozjaśni się gdy zobaczymy + polecenie służące do włączania. +

+
+$ sudo systemctl enable unit.service
+
+

+ Dezaktywacja oraz wyłaczenie jednostki to kolejno: +

+
+#Dezaktywacja:
+$ sudo systemctl stop unit.service
+
+#Wyłączenie:
+$ sudo systemctl disable unit.service
+
+

+ Do obsługi systemd używamy pojedyńczego polecenia + systemctl, ma ono bardzo wiele opcji + jednak na poziomie podstawowym wystarczym to co napisałem powyżej + oraz sprawdzenie stanu jednostki poleceniem: +

+
+$ sudo systemctl status unit.service
+
+

+ Dawniej w czasch powszechnego panowania sysvinit oraz + obecnie w dystrybucja wykorzystujących ten rodzaj programu + typu init, gdy usługa definiowała zasób, z którego + korzystały inne usługi, to musiały one zostać opóźnione do momentu + uruchomienia usługi macierzytej oraz udostępnienia przez nią + zasobu. Za pomocą systemd możemy na podstawie dokumentacji + usługi utworzyć jednostkę zasobu. Taka jednostka zostanie uruchomiona + w momencie aktywowania jednostki macierzystej usługi. Dzięki temu + inne usługi korzystające z tego zasobu będą mogły zostać aktywowane + w tym samym czasie co ta usługa. Usługi nie zrócą żadnego błędu, + ponieważ zasób jest dostępny. W gdy coś spróbuje uzyskać dostęp do + tego zasobu, to zostanie zablokowane przez systemd do + momentu pełnego uruchomienia usługi i przekazania jej kontroli nad + zasobem. Jeśli podczas próby dostępu do zasobu napłyną jakieś dane + to zostaną one zbuforowane i przekazne do usługi, gdy przejmie ona + pieczę na zasobem. Cała ta procedura pozwala na znaczne + przyspieszenie uruchamiania systemu. +

+

+ Systemd zapewnia pewien stopień zgodności z tradycyjnym + sysvinit, dla usług nie wspierających plików jednostek. + Ta funkcjonalność jest na tyle rozwinięta, że pozwala na podobne + zarządzanie taką usługą, jakoby miała ona plik jednostki. +

+

+ Implementacja procesu typu init jaką jest systemd + jest na prawdę dość sporym tematem. Więc zostanie on poruszony + ponownie na tej stronie. +

+

6.4.2. Proces typu init w stylu System V

+

+ Klasyczny proces typu init jakim jest + sysvinit, opiera się o poziomy uruchomienia oraz + wykonywane w nich polecenia. Polecenia te opierają się na + sekwencyjny wykonywaniu skryptów umieszczanych w odpowiednich + katalogach. Najważniejszym plikem jest w tym przypadku plik + /etc/inittab, w jego zawrtości znajdują się wspomniane już + polecenia, rozpisane dla poszczególnych poziomów uruchomienia. + Polecenie dla 5 poziomu uruchomienia może wyglądać w następujący + sposób: +

+
+l5:5:wait:/etc/rc.d/rc 5
+
+

+ To polecenie przy wejściu na 5 poziom uruchomi wszystkie skrypty w + katologu /etc/rc5.d, o ile będą miały odpowiednią nazwę. + Słowo wait spowoduje, że proces + init nie przejdzie na kolejny poziom uruchomieniowy do + momentu zakończenia pracy tego polecenia. Inne akcje + niż wait mogą + uruchamiać ponownie polecenie po jego zakończeniu czy definiować + co należy zrobić po naciśnięciu kombinacji klawiszy + Ctrl+Alt+Delete, z kolei akcja initdefault + określa domyślny poziom uruchomieniowy dla przestrzeniu użytkownika. +

+

+ Skrypt zawarte w katalogu rc5.d, który jest akronimem od + polecenia run command. Posiadają dość specyficzne nazwy, + zaczynają się one od wielkiej litery S lub K. + Następny jest numer, na końcu zaś znajduje się nazwa własna. Jeśli + wylistujemy ten katalog bardziej szczegółowo, to zauważymy, że te + skrypty to tak naprawdę dowiązania symboliczne. Wiele dowiązań w + jednym katalogu nazywane jest farmą dowiązań. + Te dowiązania zawarte w katalogach rc wskazują + na właściwe + skrypty znajdujące się w katalogu /etc/init.d. +

+

+ Wielkie litery na początku nazw dowiązań oznaczają operację + podejmowaną na usłudze czy ma ona zostać uruchomiony - S + (ang. start), czy jej działanie ma zostać zakończone + - K (ang. kill). Te czynności wykonywane są + poprzez uruchomienie skryptu z argumentem start lub + stop. Numery w nazwach + określają miejsce tej czynności w sekwencji uruchomieniowej + sysvinit. Usługi niskiego poziomu jak np. syslogd + uruchamiane są bardzo wcześnie (mają niskie numery), demony + świadczące użytkownikom jakieś usługi zazwyczaj mają numery powyżej + 90. Nazwa wskazuje na uruchamianego daemona. +

+

+ Zatem jeśli nie chcemy, aby jakaś usługa startowała należy wówczas + zmienić nazwę dowiązania. Warto jednak pozostawić sobie późniejszą + możliwość jej włączenia. Powiedzmy że chcemy wyłączyć daemona + httpd jego nazwa to S99httpd, więc najlepiej + postawić na początku nazwy znak podkreślenia: +

+
+$ mv /etc/rc5.d/S99httpd /etc/rc5.d/_S99httpd
+
+

+ W ten sposób daemon zostanie wyłączony z sekwencji uruchomieniowej. + Jeśli chcemy uruchomić/zatrzymać usługę na żądanie, należy + uruchomić + skrypt z katalogu /etc/init.d z argumentem start + lub stop. +

+
+#Uruchomienie:
+$ sudo /etc/init.d/httpd start
+
+#Zatrzymanie:
+$ sudo /etc/init.d/httpd 
+
+

+ Wraz z sysvinit i nie tylko, rozprowadzane jest narzędzie, + które działa w systemach nie używających już sysvinit. + Run-parts, jest to bardzo proste na rzędzie, które + uruchamia wszystkie pliki wykonywalne w danym katalogu + według ściśle określonego porządku. + Implementacja tego narzędzia zależy od dystrybucji. Te bardziej + złożone pozwalają na użycie wyrażenia regularnego do określenia + porządku ich uruchamiania. Na potrzeby tego materiału wystarczy + wiedzieć, że takie narzędzie w ogóle istnieje. +

+

+ Wspomnieniem o run-parts kończymy wprowadzenie do programów + typu init. Omówiłem tylko te dwa, gdyż są w + najpowszechniejszym użyciu. Poznając podstawy Linuksa, nie ma co + zniechęcać się obszernymi szczegółami. Najważniejsze dla nas na ten + moment jest uruchamienia/zatrzymywanie usług oraz włączanie i + wyłączanie ich z sekwencji uruchomieniowej. W ramach ćwiczeń możemy + wydedukować jak należy włączyć usługę, do sekwencji uruchomieniowej + przy procesie init w stylu System V, chociaż nie + powinno to zająć więcej niż 30 sekund. +

+

6.5. Wyłączanie systemu

+

+ Jedynym prawidłowym sposobem na wyłącznie systemu, jest użycie + polecenia shutdown. Wyłączyć system możemy na + dwa różne sposoby. Pierwszym z nich jest jego + programowe zamknięcie systemu oraz wyłącznie zasilania + osiągane przez poniższe polecenie. +

+
+$ sudo shutdown -h now
+
+

+ Do wyżej wymienionego celu możemy, użyć polecenia, które może być + nieco bardziej powszechne: +

+
+$ sudo poweroff
+
+

+ Ma ono działanie identyczne działanie jak polecenie z przykładu + powyżej. +

+

+ Przy poleceniu shutdown należy + wybrać czy system ma zostać zamknięty, zatrzymany, lub uruchomiony + ponownie. Kolejnym wymaganym argumentem jest czas. Najczęściej + używany jest argument now co + przy przyjmowanym zapisze czasonym jest +0 minut. + Zapis czasowy możemy określić w minutach jak podałem powyżej lub + lub przy zapisie hh:mm , który pozwala określić konkretną + godzinę zamknięcia systemu. +

+

+ Innym sposobem na zamknięcie systemu jest ponowne uruchomienie + komputera. System będzie musiał zostać poprawnie zamknięty, aby + uruchomić komputer ponownie. W tym celu możemy użyć polecenia, +

+
+$ sudo shutdown -r now
+
+#lub
+
+$ sudo reboot
+
+

+ Wyłączenie systemu dla systemd oznacza aktywację jednostek + zatrzymywania (systemd, posiada wiele typów jednostek), dla + sysvinit przejście z poziomu 5 na 6 lub 0. +

+

6.6. Początkowy system plików w pamięci RAM

+

+ initramfs czy initrd, z tych nazw + korzysta się zamiennie mimo iż oznaczają coś innego, to odnoszą się + do tego samego komponentu, czyli początkowego systemu plików + w pamięci RAM. Jest to bardzo proste archiwum + przechowujące mini przestrzeń użytkownika z mini katalogiem głównym. + Zadaniem initramfs jest stworzenie optymalnego środowiska + dla narzędzi pozwalających na załadowanie do jądra zewnętrznych + modułów, wśród których może znajdować się sterownik dysku, co pozwoli + zamontować już właściwyw katalog główny z dysku i przejść na kolejne + etapy uruchamiania systemu. +

+

+ Wykorzystując nasz system w stopniu podstawowym raczej nie będziemy + mieć styczności z initramfs, chyba że używamy bardziej + zaawansowanej dystrybucji, która może wymagać załadowania do niego + dodatkowych modułów. Takie przypadki będą zazwyczaj opisane w na + stronach dokumentacji dystrybucji. Przykładem takiego działania może + być + szyfrowana partycja z katalogiem głównym, w takich dystrybucjach + jak Arch Linux. Do obsługi początkowego systemu w pamięci RAM + służa takie polecenia jak mkinitramfs lub + update-initramfs. +

+

+ System plików pamięci RAM może zostać pominięty w momencie gdy, w + jądrze znajdują się wszystkie potrzebne mu sterowniki, jednak + obecnie nie jest to praktykowane. +

+

+ Istnieją dystrybucje, których działanie opiera się na + initramfs, pliki dystrybucji znajdują się w tym archiwum, a + oprogramowanie jest znajduje się wówczas w archiwach squashfs + montowanych podczas w odpowiednich miejscach w systemie podczas + jego ładowania. Taką dystrybucją jest na przykład TinyCore, którego + obraz płyty waży 21 MB. +

+

6.7. Tryb jednego użytkownika

+

+ Tryb pojedyńczego użytkownika, jest swojego rodzaju trybem + awaryjnym na Linuksie, a jedynym dostępnym użytkownikiem będzie + superużytkownik. W tym trybie zostanie załadowane jądro, za + montowany katalog główny, a proces typu init zapewni dostęp tylko + do niezbędnych dla działania systemu usług, wyeliminowywując tym + samym potencjalnie wadliwe komponenty. To środowisko ma za zadanie + umożliwić nam naprawę systemu. +

+

+ Ze względu na to, iż to środowisko może nie zapewnić potrzebnych + do takiej naprawy narzędzi, najlepiej jest skorzystać jednak z + obrazu LiveCD, który pozwala na korzystanie z + systemu bez konieczności jego instalacji. Jednak na podstawie wiedzy + zawartej w tym materiale nie sądze, aby można byłoby naprawić system. + Dlatego też jeśli zdarzy się awaria systemu, to najlepszym + rozwiązaniem na teraz jest zabezpieczenie osobistych danych i + przeinstalowanie systemu, chodziaż nie chce nikogo zniechęcić do + grzebania w systemie, w ten sposób możemy się wiele nauczyć. Z + drugiej strony, ciężko jest aby system przestał działać tak sam z + siebie. Dlatego jesli tak się stało, więcej niż raz to warto zgłość + problem społeczności za pomocą jednego z kanałów + udostepnionych na stronie dystrybucji i zmienić dystrybucje na jakiś + czas. Linux to głównie narzędzie do pracy na naszym komputerze, na + tym etapie - podstawowym. +

+

7. Konfiguracje systemowe oraz użytkownicy

+

+ W tym rozdziale zajmiemy się drobnymi konfigracjami, nie których + komponentów systemowych takich jak syslog czy cron + zajmiemy się również tematem czasu systemowego na Linuksie. Rozdział + zakończymy dodatkową wiedzą, (choć nadal w stopniu podstawowym) na + temat użytkowników. +

+

+ Wszystkie te powyższe zagadnienia łączy jedna rzecz, ich pliki + konfiguracyjne znajdują się w katalog /etc i od + omówienia tego katalogu zaczniemy. +

+

7.1. Katalog /etc

+

+ Jak wiemy z opisu hierarchii systemu plików (katalogu głównego), w + katalogu /etc przechowywane są różnego rodzaju + konfiguracje, i to nie zależnie do wielkości czy istotności programu + w systemie. Kiedyś każdy z programów przechowywał luzem swoją + konfigurację tym katalogu. Obecnie jak możemy się przekonać większość + zawartości /etc stanowią podkatalogi. Oczywiście wiele + plików nadal się w nim znajduje, najczęsciej są to takie pliki + jak /etc/fstab czy + /etc/passwd lub /etc/shadow służące do + przechowywania informacji o użytkownikach. Katalogi w /etc + mają nazwy przeważnie odpowiadające nazwom programów, które + konfigurują. Wyjątkiem są katalogi z końcówką .d. Pliki + konfiguracyjne + zostały umieszczone w tych katalogach, aby nie zostały one nadpisane + przez aktualizacje pakietów. Obecnie nie ma to już miejsca, a mimo + to konfiguracje wielu pakietów są umieszczane w tych katalogach. +

+

+ Pliki konfiguracyjne, nie których pakietów mogą występować w + dwóch różnych wersjach. Pierwsza + to jest, ta którą wszyscy znamy czyli katalog /etc taka + konfiguracja nazywana jest konfiguracją z możliwością dostosowania. + Druga wersją jest konfiguracja bez możliwości dostosowania + znajdująca się w katalogu /usr/lib. Oczywiście to jest tylko + koncepcja, aby administratorzy zajęli się konfiguracją w /etc + a konfiguracje w /usr/lib zostawili opiekunom pakietów + (osobom przygotowywującym pakiet oprogramowania dla danej dystrybucji, + z wybranym programem) oraz twórcom samej dystrybucji. Możemy zmieniać + oczywiście konfiguracje w tym katalogu, jednak trzeba mieć na uwadze + dwie rzeczy: +

+
    +
  1. Trzeba wiedzieć co się robi
  2. +
  3. Zmiany w konfiguracji znajdującej w /usr/lib mogą + zostać nadpisane przez aktualizacje pakietu. +
+

+ System Linuks nie jest miejscem, gdzie się cokolwiek komu kolwiek + zabrania. Zasady i jakieś regułu wprowadza się po to aby zapewnić + względne bezpieczeństwo oraz stabilność dystrybucji czy też ogolnie + systemu. +

+

7.2. syslog

+

+ Znaczna część komunikatów dignostycznych z różnych komponentów + systemowych spływa do protokołowania czy rejestrowania lub + prowadzenia plików dziennika. W języku polskim istnieje kilka + określeń na to co konkretnie robi usługa syslog, + której zadaniem jest nasłuchiwanie na komunikaty diagnostyczne i + przekazywanie ich do pliku, na ekran poszczególnych użytkowników lub + całkowite zignorowanie. Wszystko zależy od konfiguracji. +

+

+ Obecnie wykorzystywana jest nowsza wersja syslog - + rsyslog. Funkcje tej wersji nie ograniczają się + tylko do zapisywania komunikatów diagnostycznych do pliku, program + może na przykład przesyłać je do bazy danych. Na tym etapie nie + będziemy się jednak tym zajmować, póki co będziemy musieli się + zadowolić zwykłymi plikami tekstowymi przechowywanymi w katalogu + /var/log. Warto mieć jednak na uwadze fakt, iż nie + wszystkie pliki przechowywane w tym katalogu są zarządzane, przez + tę usługę. Nie które daemony mogą posiadać swoje sposoby na + utrzymanie i prezentowanie użytkownikowi własnych komunikaty + diagnostycznych. Więcej informacji na temat jakie logi są + przechwytywane przez rsyslog znajduje się w pliku + konfiguracyjnym - /etc/rsyslog.conf. +

+

+ Na konfiguracje składają się tradycyjne reguły oraz dyrektywy + dostępne w rozszerzonej wersji rsyslog. Dyrektywy możemy + poznać po tym, że rozpoczynają się od symbolu dolara + ($). Natomiast reguły konfiguracyne klasycznej + wersji protokołu są nieco bardziej złożone. +

+

+ Reguły protokołu syslog określają sposób przychwytywania + komunikatów diagostnycznych oraz docelowe miejsce ich zapisu. Zasady + składają się z selektora i akcji, o to kilka z nich. +

+
+*.info;mail.none;authpriv.none;cron.none  /var/log/messages
+authpriv.*  /var/log/secure,root
+mail.*      -/var/log/maillog
+*.emerg     :omusrmsg:*
+
+

+ Reguły syslog możemy podzielić na dwie części prawą i lewą. + Po lewej stronie znajduje się selektor, określający przechwywane + dane. Natomiast po prawej znajduje się akcja zazwyczaj jest ścieżka + do pliku docelowego dla przychwconych komunikatów. Przy jednej ze + ścieżek znajduje się myślnik, który powoduje nie synchronizowanie + tego pliku jeśli włączono by synchronizacje (jest ona domyślnie + wyłączona). Synchronizacja powoduje znaczny spadek wydajność i może + doprowadzić do gubienia komunikatów. +

+

+ Selektor zaś składa się z kolejnych dwóch części: + funkcji oraz priorytetu. Funkcja + określa źródło komunikatów i są one na stałe zaimplementowane w + rsyslog a priorytety ich rodzaj wśród, których możemy + wymienić (ułożenie według od najniższego do najwyższego): +

+
+debug, info, notice, warning, error, crit, alert, emerg
+
+

+ Tworząc selektor oddziela się funkcję od priorytetu za pomocą kropki. + Priorytet służy do ograniczania wielkość przechwytywanych komunikatów, + albowiem rsyslog rozpoczyna przechwytywanie komunikatów od + tego priorytetu w górę. Jeśli przypatrzmy się pierwszej linii + konfiguracji, zauważymy, że do pliku + /var/log/messages będzie + spływać masa informacji, ponieważ selektor uwzględnia komunikaty + ze wszystkich funkcji z minimalnym priorytetem + debug. Istnieją jednak pewne + wykluczenia. Na selektor może składać się więcej niż jedna para + funkcja.priorytet, co również widać w pierwszej linii + przykładu. Kolejne pary rozdzielone są średnikami. W omawianym + przykładzie, pary mają ten sam priorytet, który nie został + uwzględniony na powyższej liście none powoduje + wyłączenie przechwytywania z użytych w raz z nim funkcji. Tak więc + w pierwszej linii przechwytywane będą komunikaty ze wszystkich + funkcji z minmalnym priorytetem info, + poza takimi funkcjami jak mail, + authpriv oraz + cron. Komunikaty będą zapisywane + zgodnie z akcją w pliku /var/log/messages. +

+

+ Innymi ciekawymi przypadkami w pokazanymi na przykładzie jest + podanie w akcji w drugiej linii dwóch miejsc docelowych. Pliku + /var/log/secure oraz nazwy + superużytkownika. Podanie jakiej kolwiek nazwy użytkownika w akcji + spowoduje przesłanie mu (za pomocą polecenia write) + komunikatu diagnostycznego, o ile użytkownik zezwala na wyświetlanie + tego typu komunikatów (polecenie mesg). Chociaż + komunikaty wysłane przez superużytkownika są wyświetlane mimo tych + ustawień. Kolejnym przypadkiem związanym z wysyłaniem jest użycie + specjalnego modułu wyjściowego reprezentującego + konkretną akcje, w tym przypadku jest wysyłanie wiadomości do + zobrazowane w ostatniej linii przykładu. Jak mogliśmy zauważyć w + liniach reguł możemy używać symbolu wieloznacznego gwiazdki + (*). +

+

+ Dyrektywy nowszej wersji daemona rejestrującego są dość proste + do zrozumienia i nie wymgają dodatkowego opisu. +

+
+$FileOwner syslog
+$FileGroup adm
+$FileCreateMode 0640
+$DirCreateMode 0775
+$Umask 0022
+
+

+ Jeśli chodzi o syslog, to w przypadku usługi rejestrowania + może stać się nie wiele złego, jedynym problemem jaki możemy + napotkać jest brak przechwytywania komunikatów z powodu + nieuwzględnienia jakiejś funkcji lub priorytetu w selektorze. + Niemniej jednak rejestrator systemowy możemy przetestować za pomocą + polecenia logger podając mu parę + funkcja.priorytet po opcji -p + (na stronie podręcznika opcja określona jest jako priorytet) oraz + komunikat do zapisania. Jeśli priorytet został pominięty, zostanie + użyty domyślny user.notice. W zależności od konfiguracji + rsyslog oraz użytej funkcji nasz komunikat powinien + pojawić jednym z plików wyszczególnionych w konfiguracji. + W przypadku użycia narzędzia logger z domyślnymi wartościami + komunikat zostanie zapisany do /var/log/messages. +

+

+ Większość rejestratorów istnieje nie tylko w postaci odrębnego + programu jakim + jest rsyslog, ale także w postaci funkcji, nie których + daemonów + jak np. serwer WWW Apache2 one również zapisuje swoje + komunikaty + diagnostyczne do /var/log. Bardzo duża ilość danych + spływająca do jednego katalogu może powodować szybkie + zapełnienie przestrzeni dyskowej. Jednak się to nie dzieje, dzięki + programowi logrotate, którego zadaniem jest + (w zależności od konfiguracji) usuwanie lub kompresja starych plików + dzienników i utworzenie miejsca na nowe komunikaty. +

+

+ Z racji tego, iż demony działają w trakcje czynności wykonywanych + przez logrotate, skrypty obsługujące konkretne pliki + dziennika, tworzą puste pliki o takiej samej nazwie jak te utworzone + przez demon. +

+

7.3. Konfiguracja użytkowników

+

+ Komputery jak i systemy operacyjne mają za zadanie służyć + użytkownikom. Jak wiemy użytkownicy w systemach istnieją aby + wyznaczać granicę. Mówiąc kolokwialnie każdy z nas ma swoją + piaskownice i swoje zabawki. W Linuksach użytkownicy są opisywani za + pomocą kilku plików w katalogu /etc. +

+

7.3.1. Plik /etc/passwd

+

+ Plik /etc/passwd jest podstawowym źródłem informacji o + użytkownikach w systemie. W tym pliku każdy wiersz to jeden wpis + definiujący użytkownika. Każdy wiersz podzielony jest na 7 pól. + Poniżej znajduje się kilka przykładowych wpisów: +

+
+pulse:x:109:114:PulseAudio daemon,,,:/run/pulse:/usr/sbin/nologin
+saned:x:110:117::/var/lib/saned:/usr/sbin/nologin
+colord:x:111:118:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
+lightdm:x:112:119:Light Display Manager:/var/lib/lightdm:/bin/false
+libvirt-qemu:x:64055:105:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin
+geoclue:x:113:124::/var/lib/geoclue:/usr/sbin/nologin
+user:x:1000:1000::/home/user:/bin/bash
+xf0r3m:x:1001:1001::/home/xf0r3m:/bin/bash
+
+

+ Pola te zawierają kolejno: +

+
    +
  • Nazwa użytkownika - jednoznaczny identyfikator + użytkownika, służący do rozpoznawania użytkowników miedzy innymi + użytkownikami.
  • +
  • Zaszyfrowane hasło - w dystrybucjach Linuksa + hasło nigdy nie było przechowywany w jawnej postaci, nawet w tak + zamieszchłych czasas kiedy znajdowało się ono w pliku + /etc/passwd. Obecnie po haśle został tylko + x, co oznacza, że hasło jest + przechowywany w pliku /etc/shadow, który również zostanie + tu omówiony.
  • +
  • UID (identyfikator użytkownika) - numer + identyfikujący użytkownika, służy głównie odwołaniu się jądra do + konkretnego użytkownika.
  • +
  • GID (identyfikator grupy) - numer + identyfikujący podstawową grupę użytkownika.
  • +
  • Pole GECOS - pole przechowujące rzeczywiste + informacje o użytkowniku takie jak imie, nazwisko, numer telefonu, + adres e-mail, numer pokoju. Pole może zostać pominięte, co widzimy + na kilku wpisach na przykładzie.
  • +
  • Katalog domowy - ścieżka wskazująca na katalog + domowy użytkownika.
  • +
  • Program uruchamiany po zalogowaniu (powłoka) - + ścieżka wskazująca na program jaki ma zostać uruchomiony po + zalogowaniu, najczęściej jest to interaktywna powłoka.
  • . +
+

+ Drugie pole wpisu w /etc/passwd może przyjmować dwie + dodatkowe wartości. Pole może zawierać gwiazdkę (*), + która uniemożliwia logowanie lub pole może być puste co pozwala na + zalogowanie się bez podawania hasła. +

+

+ Jeśli przefiltrujemy za pomocą polecenia grep plik + /etc/passwd pod kątem ustawionych programów (powłok), to + na powiedzmy ok. 50 (zależności od dystrybucji) tylko dwóch, trzech + użytkowników ma ustawioną powłokę. Pozostali użytkownicy zazwyczaj + mają ustawiony program, który uniemożliwia im korzystanie z systemu + nawet gdy się zalogują. Tacy użytkownicy nazwani są + pseudoużytkownikami. Tego rodzaju użytkownicy + istnieją w jednym celu, aby uruchamiać z ich uprawnieniami różne + programy, głównie demony sieciowe. Co w razie włamania spowoduje, że + atakujący zostanie uwięziony na koncie, na którym nic nie może + zrobić. +

+

+ Pseudoużytkownicy zaliczają się do użytkowników specjalnych obok nich + istnieje jeszcze jeden użytkownik - root, który ma + niczym nie ograniczone uprawnienia. Dlatego też nosi nazwę + superużytkownika. Posiada on UID i GID równy 0 oraz jego + katalog domowy znajduje się bezpośrednio w głównym katalogu. Innym + ciekawym użytkownikiem specjalnym jest użytkownik nobody, + który nie ma możliwości zapisu niczego w systemie. +

+

+ Kombinacja wpisu w pliku /etc/passwd oraz katalogu domowego + może być określana jako konto. +

+

7.3.2. Plik /etc/shadow

+

+ Plik /etc/shadow jest podobnym plikiem /etc/passwd, + jednak zamiast przechowywać informacje o użytkownika plik ten + przechowuje informacje o hasłach. Plik /etc/shadow posiada + jedno wspólne pole wraz z plikiem /etc/passwd a jest nim + nazwa użytkownika. Hasło podobnie do pliku /etc/passwd + znajduje się na drugim polu we wpisie. Pozostałe pola są + odpowiedzialne za ważność hasła. Wpisy w pliku /etc/shadow + biorą również czynny udział w blokowaniu dostępu użytkownikom. + Zawartośc pliku wygląda w następujący sposób: +

+
+root:$y$j9T$h19rJ2ObBXMdBdXOHB0wF.$.Lqb5iG3.HpsO0FcghqSkXbcA6D5rIp9woC/Ovj40Q7:19251:0:99999:7:::
+...
+user:$y$j9T$bAf/P4bLm00VJQyS3Lf8I1$dzie3XL5lORpP7jmo4CeanOqhuWMpPzdQArAlQ9AfG0:19327:0:99999:7:::
+
+

+ Na tym etapie nauki dalsza analiza tych wpisów nie ma sensu, jeśli + jednak ktoś jest ciekawy pozostałych pól to może zajrzeć do mojego + materiału przygotowywującego do RHCSA: https://morketsmerke.github.io/articles/terminallog/RedHat_-_RHCSA.html#6.1.passwordaging +

+

+ Plik /etc/shadow jest dość mocno zabezpieczonym plikiem, + zwykli użytkownicy nie posiadają do niego żadnych praw. Jedyną + uprawnioną osobą do manipulacji nim jest superużytkownik. +

+

7.3.3. Manipulowanie użytkownikami i hasłami

+

+ Omawiane dotychczas pliki są zwykłymi plikami tekstowymi, których + zawartością możemy manipulować za pomocą ulubionego edytora + tekstowego. Nie jest to jednak zalecane działanie. Ze względu na + ścisłą budowę (nie możliwe jest aby umieszczać w tych plikach + komentarze lub puste wiersze) oraz restrykcyjną składnie wierszy. + Możemy użyć specjalnego narzędzia jakim jest vipw. + Polecenie to tworzy kopię zmienianych plików i następnie otwiera + ten plik w terminalowym edytorze. Konfiguruje ono również ten edytor + aby zaznaczał składnię wpisów w plików, po zapisaniu zmian polecenie + sprawdzi składnie zmienionych lub dodanych wpisów. Jeśli wszystko + będzie dobrze, to polecenie zapisze zmiany jeśli coś będzie nie + tak to polecenie zaproponuje poprawienie błędu. Polecenie wymaga + oczywiście uprawnień administratora. Wydając polecenie bez żadnej + opcji otworzy ono plik /etc/passwd do edycji a jesli dodamy + opcje -s to wówczas zostanie otworzony plik + /etc/shadow. +

+

+ Inną metodą jest wykorzystanie np. opcji polecnia + passwd jego domyślną rolą jest zmiana hasła, bądź + ustawianie ważności hasła, jednak dodając opcję -s + mozemy zmienić domyślny program startowy (powłokę) lub za pomocą + opcji -f możemy zmienić nazwę użytkownika. Po + więcej informacji zapraszam do strony podręcznika polecenia + passwd. Jeśli na naszym przypadku polecenie passwd + może nie być zadowalające. Można wówczas skorzystać z polecenia typu + usermod. +

+

7.3.4. Grupy

+

+ Rolą grup w systemach uniksopodobnych jest współdzielenie plików. + Dzięki nim możemy zwiększyć uprawnienia do pliku, nie którym + użytkownikom, chroniąc je przed innymi. Wynika to z możliwosci + nadania uprawnień grupie, natomiast można je zabrać wszystkim + pozostałym. Obecnie stacje uniksowe stały się bardziej + spersonalizowanie to współdzielenie plików przy użyciu grup + straciło na znaczeniu. Jednak grupy tak jak użytkowników możemy + wykorzystać do uzyskiwania dodatkowych uprawnień lub ich + ograniczania. +

+

+ Wraz z każdym nowym użytkownikiem tworzona jest nowa grupa o tej + samej nazwie co użytkownik. Grupa ta jest również ustawiana jako + grupa podstawowa tworzonego użytkownika. Definicje grup znajdują + się w pliku /etc/group. Poniżej znajduje się fragment: +

+
+libvirt:x:123:user,xf0r3m
+libvirt-qemu:x:64055:libvirt-qemu,user,xf0r3m
+geoclue:x:124:
+user:x:1000:
+xf0r3m:x:1001:
+
+

+ Jak możemy zauważyć wpisy dzielą się na cztery pola, które kolejno + oznaczają: +

+
    +
  • Nazwa grupy - nazwa jednoznacznie identyfikująca + grupę.
  • +
  • Hasło grupy - hasło grupy. Obecnie aby podłączyć + użytkownika do grupy potrzebna jest interwencja administratora lub + kogoś z jego uprawnieniami. Jeśli jednak grupa posiada hasło to + użytkownik może podłączyć się do grupy za pomocą polecenia + newgrp (dalej jest taka możliwość). Obecnie + jednak nie stosuje się haseł dla grup. Hasła grup są przechowywane + w pliku /etc/gshadow.
  • +
  • GID (identyfikator grupy) - numeryczny + identyfikator grupy, służy do odniesienia jądra do konkretnej + grupy.
  • +
  • List członków grupy - lista uzytkowników + należących do grupy.
  • +
+

+ Grupy odpowiadające istniejącym użytkownikom nie posiadają żadnych + członków w tym pliku, jednak odpowiadający tym grupom użytkownicy są + ich domyślnymi członkami. +

+

+ Jądro Linux, nie posługuje się nazwami użytkowników czy grup + odwołując się do jednego lub drugiego bytu. W tym celu używa wartości + UID oraz GID, aby ich używanie miało sens muszą być one unikatowe + w skali całego systemu. Oczywiście może zdażyć się przypadek, że + dwóch użytkowników będzie miało ten sam UID, ale są to bardzo rzadkie + i specyficzne przypadki. +

+

7.4. Getty oraz login

+

+ Te dwa programy nie są zbyt skomplikowane w swoim działaniu. + Działanie programu getty polega na podłaczeniu się pod + terminal (nie ważne czy wirtualny czy fizyczny podłączony przez + port COM) i wyświetlenie znaku zachęty logowania (napisu "login: ") + i oczekiwania na podanie nazwy użytkownika. Kiedy nazwa zostanie + podana + polecenie to zastępuje same siebie wywołując program login. + Ten program odpowiedzialny jest za wyświetlenie znaku zachęty hasła + (napisu "hasło:") po podaniu przez użytkownika hasła program + spróbuje go uwierzytelnić. Jeśli to się powiedzie wówczas program + login zastąpi sam siebie po przez wywołanie systemowe + exec() programem startowym ustawionym w ostatnim polu + wpisu w pliku /etc/passwd. +

+

+ Prawdopodbnie nigdy nie będzie potrzeby konfiguracji tych programów, + nie mniej jednak jest taka możliwość. +

+

7.5. Ustawienia czasu.

+

+ Działanie wielu operacji w systemach uniksopodobnych opiera się o + czas. Za zegar w tych systemach odpowiedzialne jest jądro. Jednak + nie jest ono wstanie wziąć precyzyjnych ustawień czasowych samo z + siebie. Większość komputerów klasy PC posiada potrzmywany bateryjnie + zegar czasu rzeczywistego, jądro synchronizuje swój zegar z tym + zegarem jednak z racji tego, iż maszyny uniksowe nie są uruchamiane + ponownie przez miesiące a nawet lata. W czasie systemowym pojawia + się odchylenie. +

+

+ Zegar systemowy jądra również jest korygowany na podstawie ustawień + strefy czasowej w jakiej się znajdujemy, dlatego też + RTC (ang. Real Time Clock) w BIOS lub UEFI powinien być + ustawiony zgodnie ze strefą czasową UTC. Za pomocą poniższego + polecenia możemy ustawić czas UTC jądra względem RTC. +

+
+$ sudo hwclock --hctosys --utc
+
+

7.5.1. Strefy czasowe i reprezentacja czasu

+

+ Jądro przechowuje swój czas w formacie uniksowym, czyli ilości + sekund od północy 1 stycznia 1970 roku. Na podstawie tych informacji + takie polecenia jak date dokonuja wszelkich + konwersji i wyświetlają nam zrozumiałą dla nas datę i czas. Czas + uniksowy możemy wyświetlić sobie za pomocą polecenia date + z opcją +%s (niestety polecenie date ma + nieco inny format opcji). +

+
+xf0r3m@immudex:~$ date
+śro, 28 gru 2022, 13:11:53 CET
+xf0r3m@immudex:~$ date +%s
+1672229517
+
+

+ Domyślnie polecenie date wyświetla + datę i czas skorygowany o ustawioną w naszym systemie, na podstawie + przybliżonej lokalizacji strefę czasową. Ustawiona strefa czasowa + znajduje się katalogu /etc jako dowiązanie symboliczne do + jednego z plików stref dostępnych w systemie w katalogu + /usr/share/zoneinfo. +

+
+xf0r3m@immudex:~$ ls -al /etc/localtime 
+lrwxrwxrwx 1 root root 33 11-04 17:46 /etc/localtime -> /usr/share/zoneinfo/Europe/Warsaw
+
+

+ Strefę czasową możemy zmienić za pomocą polecenia interaktywnego + polecenia tzselect. Polecenie to spróbuje określić + twoją przybliżoną lokalizacje na podstawie stolicy kraju w jakim się + znajdujesz. Następnie utworzy nowe dowiązanie symboliczne + /etc/localtime do odpowiedniego pliku strefy. +

+

+ Jeśli z jakiś przyczyn potrzebujemy sprawdzić jaki bedzie czas w + wybranej przez nas strefie czasowej, możemy zmienić zmienną + środowiskową TZ, która przechowuje informacje o ustawionej strefie + czasowej na czas wykonania polecenia. Tę czynność możemy wykonać na + czas wykonania pojedyńczego + polecenia, ustawiając wartość zmiennej w tej samej linii co polecenie + date. +

+
+xf0r3m@immudex:~$ TZ=Asia/Tokyo date
+śro, 28 gru 2022, 21:29:01 JST
+
+

7.5.2. Czas sieciowy

+

+ Jeśli nasza maszyna sieciowa jest na przykład serwerem ze stałym + dostępem do sieci. To aby zniwelować to odchylenie czasowe, którym + wspomniałem na początku tego podrozdziału możemy uruchomić na nim + specjalną usługę sieciową, która pobierze czas z serwerów + podłączonych do bardzo precyzyjnych zegarów atomowych. +

+

+ Pierwszą rzeczą jak należy zrobić to pobrać pakiet odpowiedzialny + za demon NTP w naszym systemie. Następnie skonfigurować go zgodnie + jego dokumentacją. Najprostsza konfigurację możemy zapisać w + poniższych krokach. +

+
    +
  1. Znalezienie najbliższego dla siebie serwera NTP, najlepiej + na poziomie STRATUM nie większym niż 3.
  2. +
  3. Zapisanie adresów serwera (serwerów, może być pula) w pliku + konfiguracyjnym demona NTP, najczęściej jest to + /etc/ntp.conf.
  4. +
  5. Uruchomienie polecenia ntpdate.
  6. +
  7. Włącznienie demona NTP do uruchomienia w trakcie autostartu.
  8. +
+

+ Jeśli nasz komputery nie posiada stałego łącza internetowego możemy + wówczas uruchomić takiego demona jak chronyd. Ostatecznie + mozemy zsynchonizowany czas systemowy załadować do zegara RTC za + pomocą poniższego polecenia. +

+
+$ sudo hwclock --systohc --utc
+
+

+ W tym podrozdziale umieściłem polecenie, którego nie wyjaśniłem. + Jest nim poziom STRATUM. Wyjasnienie tego pojecia + wymaga zagłebienia się w protokół NTP, co zrobiłem w materiale + przygotowawczym do RHCSA znajdującym się tutaj: https://morketsmerke.github.io/articles/terminallog/RedHat_-_RHCSA.html#18.1.ntp. +

+

7.6. Tworzenie powtarzalnych zadań za pomocą cron

+

+ Wróćmy na chwile do drugiego podrozdziału. Tam pod koniec omówiliśmy + sobie gdzie znajdują się pliki dziennika i w jaki sposób system + radzi sobie z problem szybko przyrastających plików zawierających + komunikaty diagnostyczne z przeróżnych demonów. Wspomnialiśmy tam + o logrotate. Ten program aby zapobiec zużyciu całego miejsca + na dysku musi uruchamiać się co jakiś czas. +

+

+ W uniksach aby wykonywać jakieś czynności co określoną ilość czasu, + musimy skorzystać z programu o nazwie cron. Ten + program to swojego rodzaju harmonogram zadań, w którym to może + zdefiniować co uruchomić, kiedy lub co ile czasu i przez kogo. + Definicje zadań znajdując się w specjalnych plikach zwanych + crontab. Każdy użytkownik ma swój plik. Ponieważ pliki te + znajdując się w miejscu, do którego zwykli użytkownicy nie mają + dostępu muszą używać + dostarczonym wraz z cron narzędziem. +

+

+ Aby móc zdefiniować zadania należy wydać następujące polecenie: +

+
+$ crontab -e
+
+

+ Wówczas otworzy nam się wybrany przez nas wcześniej edytor + terminalowy. Wewnątrz pliku znajdziemy obszerny komentarz, w którym + to rozpisano dokładnie całą składnie definicji zadania cron. +

+

+ Otóż zadania cron to jednowierszowe wpisy definiujące na + początku czas (kiedy, co ile czasu) w którym należy uruchomić zadanie + Następnie polecenie, które należy uruchomić. +

+
+21 0 * * * /usr/local/bin/backup.sh > /var/log/backup_sh.log 2>&1
+
+

+ To zadanie zostanie uruchomione codziennie 21 minut po północy. Skąd + to wiem, otóż już śpieszę z wyjaśnieniami. Najpierw objaśnie + poszczególne pola. +

+
    +
  • 21 - pole minut, podanie tutaj + takie zwykłej wartości jak na przykładzie, spowoduje uruchomienie + zadania o podanej minucie godziny. Zakres wartości od 0 - 59.
  • +
  • 0 - pole godziny, podanie + wartości w tym polu spowoduje, że zadanie zostanie uruchomione + o tej samej pełnej godzinie każdego dnia, chyba że podano konkretną + minutę. Zakres wartości od 0 - 23.
  • +
  • * - pole + dnia miesiąca, wartość w tym polu spowoduje, że zadanie zostanie + uruchomione o północy podanego dnia miesiąca, chyba że zdefiniowano + wcześniejsze pola. Zakres wartości od 1 - 31.
  • +
  • * - pole + miesiąca, wartość w tym polu spowoduje uruchomienie zadania o + północy 1 dnia miesiąca, chyba że zdefiniowano wcześniejsze pola. + Zakres wartości od 1 - 12.
  • +
  • * - + pole dnia tygodnia, wartość w tym polu spowoduje uruchomienie + zadania co tydzeń o północy podanego dnia tygodnia. Chyba że + zdefiniowano wcześniejsze pola. Zakres wartości od 0 - 7, przy czym + 0 i 7 to niedziela.
  • +
+

+ Ustawienia czasu wykonania zadania jest w miarę proste o ile nie + wymagamy bardzo złożonego warunku czasowego lub nie próbujemy go + zrozumieć (zadając sobie pytanie: kiedy to dokładnie się wykona?). + Załóżmy że chcemy aby zadanie wykonało się w każdy weekend wakacji + w Polsce. Warunek czasowy może przyjmować: wartości krokowe + (/2) co dwie minuty, godziny, dni, miesiące; + zakresy (5-10) od 5-10 minuty, godziny, dnia itd lub + listy (11,12) zadanie wykoania się np. 11 i 12 + każdego miesiąca. Zakresy oraz listy można ze sobą łączyć, jak i + dodać pojedyńczą wartość do zakresu, np. 5-10,12. Przy tworzeniu + warunku czasowego możemy posłużyć się stronami takimi jak: +

+ +

7.6.1. Instalacja tablicy cron.

+

+ Po zapisaniu zmian tablica z zadaniami crona (crontab) + zostanie automatycznie zainstalowana w katalogu + /var/spool/cron/crontab. Polecenie + crontab daje możliwość instalacji + tablicy zadań z zwykłego pliku tekstowego, dokonujemy tego za pomocą + polecenia crontab wraz z opcją + -l. Jednak + korzystanie z opcji -e jest bardziej + zalecane. Wówczas podczas zapisywania zmian polecenie sprawdzi + zadania pod kątem poprawności składni i przypadku błedu, zapyta czy + nie chcemy go poprawić. +

+

+ Tablice z zdaniami cron możemy usunąć za pomocą opcji + -r polecania crontab. +

+

7.6.2. Systemowa tablica zadań crontab.

+

+ Prócz tablic użytkowników, istnieje jescze systemowa tablica + z zadaniami cron. Ją edytujemy już pomocą edytora tekstowego + ponieważ jej wpisy mają nieco inną składnie niż tablice użytkowników. + W jej wpisach znajduje się dodatkowe pole między dniem tygodnia a + poleceniem. W nim definiuje się użytkownika, z którego uprawnienami + realizowane jest zapisane zadanie. Dlatego też polecenie + crontab z opcją -e nie ma tutaj zastosowania. Jako + systemowej tablicy cron, nie wykorzystuje się również tablicy + superużytkownika. Za tablicę systemową odpowiedzialny jest plik + /etc/crontab. Plik ten edytujemy za pomocą zwykłego edytora, + kiedy zakończymy edycję, należy uruchomić demon cron + ponownie. +

+
+xf0r3m@immudex:~$ sudo vim /etc/crontab 
+xf0r3m@immudex:~$ sudo systemctl restart cron
+
+

+ Inną metodą na powtarzalne wykonywanie czynności jest skorzystania + z jednego katalogów: /etc/cron.daily, + /etc/cron.hourly, /etc/cron.monthly lub + /etc/cron.weekly. Wykorzystanie tych katalogów polega na + umieszczeniu skryptu (powłoki, nawet jednej linii z konkretnym + poleceniem) w jednym z nich. W systemowej tablicy cron jest + napisane o której wykonywane są zadania zapisane w tych katalogach. + Skrypty uruchamiane są przez znane nam z poprzedniego rozdziału + narzędzie jakim jest run-parts. W nowszych dystrybucjach + obsługą tych katalogów może zajmować się demon anacron. +

+

7.6.3. Przysłość narzędzia cron.

+

+ Narzędzie cron jest starsze od samego Linuksa. Jeśli coś + jest, aż tak stare to kwalifikuje się do wymiany. Obecnie są czynione + postępy w temacie zastąpienia cron-a jakimś innym + rozwiązaniem. Kandydatem mogą być elementy licznika czasu + systemd. Jednak utworzenie ulepszonej funkcjonalności to + jedno, a zapewnienie wstecznej zgodność z systemami oraz narzedziami + dalej wykorzystującymi cron to drugie, bez zapewnienia wstecznej + zgodności zmian nie będzie, więc póki co cron jeszcze z + nami pozostanie. +

+

7.7. Planowanie jednorazowych zadań.

+

+ Jedno narzędzie do planowania zadań w przyszłości już poznaliśmy. + Narzędzie at na pewno nie ma tak szerokiego użycia + jak cron, to pomaga wykonać pewne zadania po za czasem + czynnego użytkowania komputera. Jeśli musimy poczekać do powiedzmy + północy, aby móc wykonać jakąś czynność, możemy ją zaplanować + za pomocą polecenia at, pozostawić komputer włączony i + iść spać. +

+

+ Za pomocą polecenia at, możemy nie tylko zaplanować + wykonanie zadania na kilka godzin do przodu ale i nawet na kilka + miesięcy. Aby jednak to zrealizować należy poznać polecenie + at, które może nie być domyślnie dostępne w każdej + dystrybucji i trzeba je będzie zainstalować. +

+

+ Aby rozpocząć planowanie zadania należy wydać polecenie at + i jako argument podać czas ewentualnie datę jeśli zadanie ma zostać + wykonane w dalszej przyszłości. Po wydaniu tego polecenia zostanie + nam wyświetlony prompt at>. Po wyświetleniu prompta + podajemy polecenie do wykonania w zadaniu. Polecenia możemy podawać + do momentu kiedy naciśniemy kombinację klawiszy Ctrl+d, + przed zatwiedzeniem polecenia należy upewnić się, że zostało + poprawnie zapisane ponieważ nie będzie możliwości jego edycji. + Po naciśnięciu wspomnianiej kombinacji zadanie zostanie zatwierdzone + Na poniższym przykładzie utworzyłem jedno zadanie z jednym + poleceniem: +

+
+xf0r3m@immudex:~$ at 00:00 01.01.2023
+warning: commands will be executed using /bin/sh
+at> echo "Happy New Year" > /dev/pts/1
+at> <EOT>
+job 1 at Sun Jan  1 00:00:00 2023
+
+

+ Za pomocą opcji -l polecenia at lub + polecenia atq możemy wyświetlić znajdujące się w pamieci + demona atd zadania. +

+
+xf0r3m@immudex:~$ at -l
+1	Sun Jan  1 00:00:00 2023 a xf0r3m
+xf0r3m@immudex:~$ atq
+1	Sun Jan  1 00:00:00 2023 a xf0r3m
+
+

+ Natomiast za pomocą opcji -r polecenia at + lub za pomocą polecenia atrm, możemy usunąć zdanie, przyczym + należy podać numer zadnia widniejący w pierwszej kolumnie danych + wyjściowych zwracanych przez polecenie at w raz z opcją + -l lub polecenie atq. +

+
+xf0r3m@immudex:~$ atq
+1	Sun Jan  1 00:00:00 2023 a xf0r3m
+xf0r3m@immudex:~$ at -r 1
+xf0r3m@immudex:~$ atq
+
+

7.8. Identyfikatory użytkowników oraz ich przełączanie.

+

+ Jak pamiętamy, lub może nie bit setuid powodował fakt iż + program uruchomiony z tym bitem dział (jego proces) z uprawnieniami + właściciela pliku. Tutaj poznamy inne możliwości przełączania + użytkowników wraz regułami oraz jaki udział ma w tym wszystkim jądro. +

+

+ Na Linuksie istnieją dwie metody na przełączanie użytkowników. + Pierwszym z nich jest ustawienie wspomnianego wcześniej bitu dla + pliku wykonywalnego. A drugim sposobem jest wykorzystanie wywołania + systemowego setuid(), a żeby sprawę jeszcze bardziej + skomplikować to wersji tego wywołania systemowego jest kilka, w + zależności o tego na jaki identyfikator użytkownika chcemy się + przełączyć. Zanim poznamy możliwe identyfikator (a przynajmniej ich + część) warto poznać reguły dotyczące możliwości procesów w zakresie + przełączania identyfikatorów. Otóż: +

+
    +
  • Procesy działające z uprawnieniami superużytkownika mogą używać + wywołania systemowego setuid() do uzyskania uprawnień + dowolnego innego użytkownika.
  • +
  • Proces, który nie działa z uprawnieniami superużytkownika ma + poważne ograniczenia odnośnie korzystania z wywołania systemowego + setuid(). Przeważnie takie procesy nie mogą z niego + korzystać.
  • +
  • Dowolny proces może wykonać program z ustawionym bitem + setuid, o ile dysponuje odpowiednimi uprawnieniami do + tego pliku (każdy proces działa z uprawnieniami jakiegoś + jakiegoś użytkownika i dziedziczy po nim uprawnienia).
  • +
+

+ Dla ścisłości w tym przełączaniu użytkowników nie chodzi o + przełączanie między kontami. A raczej o to, że na podstawie + dostępnych mechanizmów w systemie proces może zmieniać uprawnienia + wrazie potrzeby oraz możliwości z jakim został uruchomiony. +

+

7.8.1. Właściciel procesu oraz identyfikatory użytkownikow

+

+ Dotych czas można było sądzić, że procesy, które uruchamiamy w + Linuksie posiadły jeden identyfikator użytkownika. Użytkownika, który + ten proces zainicjował. Rzeczywistość jest niestety zgoła inna. + Każdy proces posiada co najmniej dwa identyfikatory użytkowników. + Pierwszym z nich jest euid + (ang. Effective User IDentifier) - efektywy identyfikator + użytkownika. Ten identyfikator wskazuje na użytkownika, z ktorego + uprawnienia działa ten proces. Drugim jest ruid + (ang. Real User IDentifier) - rzeczywisty identyfikator + użytkownika. Ten wskazuje natomiast użytkownika, który zainicjował + ten proces. +

+

+ Ze względu na niejasność związane z rozgraniczeniem miedzy + euid a ruid. Rzeczywistemu identyfikatorowi + użytkownika przypisje się rolę właściciela procesu. Może on + prowadzić interakcje z procesem wysyłać do niego sygnały w tym + kończyć jego działanie. W przypadku większości procesów + działających w systemie ruid oraz euid będą równe. + Jednak w przypadku gdy uruchomimy proces z ustawionym bitem + setuid, efektywny identyfikator zostanie ustawiony na + właściciela pliku, zaś rzeczywisty identyfikator będzie + przechowywać nasz UID. Najprostszym przykładem uruchomienia programu + z bitem setuid a za razem doświadczenia przełączenia + identyfikatorów jest użycie polecenia sudo. +

+

+ Żeby całość jeszcze bardziej skomplikować, do tych dwóch + identyfikatorów należy dodać jescze większego poziomu skomplikowania + to istnieje trzeci identyfikator suid + (ang. Saved User IDentifier) - zapisany identyfikator + użytkownika. Podczas działania, proces może przełączać się między + zapisanym a rzeczywistym identyfikatorem. +

+

+ Jeśli uruchomimy jakiś proces przy użyciu polecenia sudo + i ten proces będzie trwać, i spróbujemy go zabić to wówczas + dostaniemy informacje o braku dostępu. Polecenie sudo + z ustawionym bitem setuid (jak i inne) zamienia + jawnie + identyfikatory użytkowników za pomocą wywołania systemowego + setuid(). Wynika to z kilku problemów jakie wynikają z + braku zgodności między identyfikatorami, przez co nie musimy + się zbytnio przejmować nimi oraz ich przełączaniem. +

+

+ Ze względu na duże uprawnienia (czynny udział jądra w przełączaniu + użytkowników oraz obsłudzie uprawnień dostępu do pliku) programów z + ustawionym bitem + setuid i działającym wraz z nim wywowałań systemowych. + Należy uważać jakim programom nadaje się ten bit. Pozostawienie + kopii powłoki z ustawionym takim bitem, daje możliwość zwykłym + użytkownikom przejęcia kontroli nad całym systemem. Wydając jedno + polecenie. +

+

7.9. Identyfikacja i uwierzytelnianie

+

+ Każdy wieloużytkowy system musi zapewnić mechanizmy czuwające nad + kontrolą użytkowników. Użytkownicy powinni przedstawić się systemowi + przekazać tajną informację (hasło), wówczas mechanizmy w systemie + będą wiedzieć, że + ten użytkownik jest tym za kogo się podaje. Jeśli użytkownik został + uwierzytelniony ma on dostęp do swojego konta, które jest + autoryzowane (posiada pewne prawa w systemie) i w ten sposób systemy + identyfikują użytkowników. To tak wygląda tylko w teorii. Z racji + tego, iż jądro zna tylko UID, ustalenie nazwy użytkownika wymaga + kilku czynności. Można przedstawić tutaj krokowy algorytm, który + byłby w stanie ustalić taką nazwę, jednak stosuje sie funkcję + biblioteki standardowej, które pomagają w ustaleniu takich + informacji. Problem stanowią natomiast hasła, ponieważ funkcje + biblioteki standardowej posiadają w sobie pewne założenia, które + niestety nie sprawdzają się przy obecnym sposobie przechowywania + haseł w systemie. Więc zatem w jaki sposób obecne dystrybucje + dokonuja uwierzytelniania? Wykorzystują on do tego + podsystem PAM. +

+

7.10. System PAM

+

+ System PAM (ang. Pluggable Authentication Modules) jest to + zbiór bibliotek współdzielonych, których zadaniem jest udostępnienie + uwierzytelniania użytkownika, w taki sposób aby aplikacja nie + musiała się tym zajmować. System PAM może również kontrolować + autoryzację użytkownika np. blokując mu dostęp do pewnych usług. Jak + sama nazwa wskazuje system ten wykorzystuje dynamicznie ładowane + moduły, które realizują poszczególne zadania w zależności od użytej + funkcji (o tym za chwilę). Jeśli system ma sprawdzić hasło + użytkownika użyje modułu pam_unix.so. Ze względu te + informacje dość łatwym zdaniem jest stworzenie dodatkowych modułów + obsługujących uwierzytelniania dwuskładnikowe lub klucze fizyczne, + mimo to system PAM dalej pozostaje spuścizną Uniksa przez co, + niektóre zagadnienia bywają skomplikowane a intefejs programowania + nie jest zbyt prosty. To z tego systemu korzysta większość aplikacji + wymagających uwierzytelniania na dystrybucjach Linuksa, ponieważ + połączenie aplikacji z PAM wymaga niewiele pracy lub wcale. +

+

7.10.1. Konfiguracja PAM

+

+ Ze względu na to, iż konfiguracja różni się w zależności od + dystrybucji, cieżko jest się odnaleźć i wyjaśnić to w ogólny sposób. + pliki konfiguracyjne systemu powinny znajdować się w katalogu + /etc/pam.d/. Ich nazwy często zawierają nazwy komponentów + systemu, które wykorzystują system PAM. Najprostszym z nich jest + plik /etc/pam.c/chsh. Polecenie chsh służy do + zmiany powłowki. Pierwszy wiersz pliku wygląda następująco: +

+
+auth  requisite pam_shell.so
+
+

+ Nakłada on wymóg, aby podana podczas zmiany powłoka była wymieniona + w pliku /etc/shells, w przeciwym wypadku uwierzytelnienie + użytkownika kończy się nie powodzeniem. +

+

+ Każda linia konfiguracji PAM składa się z co najmniej trzech części. + Między innymi z: +

+
    +
  • Typu funkcji, które aplikacja żąda od systemu PAM + w tym przypadku jest to auth + powodujący uwierzytelnienie użytkownika.
  • +
  • Argumentu kontrolnego, decydującego o tym jak + system zareaguje na powodzenie lub niepowodzenie działania + wykonywanego przez typ funkcji.
  • +
  • Modułu, określającego jaka czynność zostanie tak + naprawdę wykonana. W tym przypadku jest sprawdzenie czy funkcja + występuje w pliku /etc/shells.
  • +
+

Typy funkcji

+

+ System PAM oferuje aplikacji wykonanie czynności określonej jedną z + z poniższych funkcji: +

+
    +
  • auth - uwierzytelnienie użytkownika.
  • +
  • account - sprawdzenie status (czy użytkownik + jest autoryzowany do wykonania pewnej czynności).
  • +
  • session - wykonanie jakieś czynność na bierzącej + sesji użytkownika.
  • +
  • password - zmiana danych uwierzytelniania.
  • +
+

+ Warto wspomnieć, że moduły mogą zachować się inaczej (wykonywać inną + czynność, gdy zestawimy je z innymi funkcjami. Dla przykładu moduł + pan_unix.so dla modułu auth sprawdzi poprawność + podanego hasła, natomiast dla funkcji password ustawi je + użytkownikowi. Dlatego też funkcję i moduł podczas konfiguracji + PAM należy traktować jako parę. +

+

Argumenty kontrolne

+

+ Inną częścią, wartą omówienie są argumenty kontrolne. Są one + stosowane ze względu na to, iż wiersz zapisane w konfiguracji są + zestawiane, co oznacza, że nie zawsze status (powodzenie, + niepowodzenie) jednego + wiersza może oznaczać zwrócenie do aplikacji informacji o + powodzeniu lub niepowodzeniu funkcji przez nią żądanej. Inną kwestią + jest rozszerzona składnia + argumentów kontolnych dopuszająca inne wartości niż tylko prawda + czy fałsz. Więcej na ten temat znajduje się na stronie podręcznika + pliku pam.conf. Poniżej znajdują się arguementy kontrolne + o prostej składni. +

+
    +
  • sufficient. Jeśli reguła opatrzona tym + argumentem powiedzie się, zbędne staje się sprawdzanie pozostałych + reguł, system PAM nie musi tego robić. Jeśli się niepowiedzie to + system przechodzi do kolejnej reguły.
  • +
  • requisite. Jeśli reguła z tym argumentem + niepowiedzie się to wówczas całe uwierzytelnianie kończy się + niepowodzeniem. Jeśli reguła powiedzie się, to system przechodzi do + sprawdzenia pozostałych reguł, oczywiście jeśli zostały + zdefiniowane. +
  • +
  • required. Jeśli reguła powiedzie się to system + przechodzi do kolejnych reguł. Jeśli nie to system i tak sprawdzi + pozostałe dostępne reguły jednak jedyną zwracaną infomacją bedzie + niepowodzienie bez znaczenia czy następujące po required + reguły sie powiodły lub nie.
  • +
+

+ Znając składnię reguł systemu PAM, możemy spóbować samodzielnie + przeanalizować drugą linię znajdującą się w pliku chsh w + katalogu /etc/pam.d. +

+
+auth  sufficient  pam_rootok.so
+
+

+ Pamiętając o tym, że typ funkcji oraz moduł należy taktować jako + parę. Skupimy się na początku na argumencie kontrolonym. Otóż jeśli + ta reguła zakończy się powodzeniem system PAM nie będzie dalej + sprawdzać reguł. Natomiast funkcja (wraz z modułem) mają za zadanie + ustalenie czy to superużytkownik próbuje się uwierzytelnić. +

+

+ Zwrócićmy uwagę na to, iż mimo tego co poznaliśmy konfigrację PAM + oraz przeanalizowaliśmy skonstruowany plik konfiguracyjny dla + chsh, to + root nadal może ustawić dowolną powłokę. Wynika to z + konstrukcji samego narzędzia. W tym przypadku PAM ma działać nad + uwierzytelnianiem zwykłego użytkownika i jego działań. +

+

+ Moduły w regułach PAM mogą posiadać argumenty i są one umieszczane + po nazwie modułu, na przykład: +

+
+auth  sufficient  pam_unix.so nullok
+
+

+ Argument ten pozwala na stosowanie pustego hasła podczas + uwierzytelnienia. +

+

7.10.3. Uwagi dotyczące PAM

+

+ Ze względu na to, iż wiekszość mechanizmów opisanych w tym materiale + zostało przedstawionych pobierznie, przecież to podstawy. To poniżej + znajduje się kilka wskazówek odnośnie systemu PAM. +

+
    +
  • Lista dostępnych w systemie modułów możemy wyświetlić za pomocą + polecenia +
    +$ man -k pam_
    +
    + Jeśli potrzebujemy znać lokalizację modułów PAM, wówczas możemy + spróbowac użyć polecenia locate podając nazwę modułu + jako argument polecenia.
  • +
  • Strony podręcznika zawierają opis funkcji i argumentów dla + każdego modułu.
  • +
  • W wielu dystrybucjach pliki konfiguracji systemu PAM są + generowane automatycznie, wiec ich modyfikacja może nie być + najlepszym pomysłem. Przed wprowadzeniem zmian warto zapoznać + się z umieszczonymi w tych plikach komentarzami.
  • +
  • Plik /etc/pam.d/other definiuje konfigurację dla + aplikacji, które nie posiadają własnego pliku. Zazwyczaj + wszystko tam jest blokowane.
  • +
  • Istnieje możliwość dołączenia dodatkowych plików konfiguracjnych. + Za pomocą dyrektywy @include możemy załadować cały + dodatkowy plik, ale za pomocą specjalnego argumentu kontrolnego + możemy załadować plik konfiguracjny dla określonej funkcji. Te + sposoby są określne przez dystrybucje.
  • +
  • Definicja reguł systemu PAM nie kończy się na argumentach + modułów. Moduły mogą uzyskiwać dostęp do plików w katalogu + /etc/security, które głownie mają na celu ograniczanie + uprawnień użytkownikom.
  • +
+

7.10.3. System PAM i hasła

+

+ System PAM możemy wykorzystać do uzyskiwania informacji na temat + haseł w systemie. Wykorzystanie modułu pam_unix.so wraz + z funkcją auth powoduje sprawdzenie hasła. Natomiast + jeśli użyjemy tego modułu wraz z funkcją password moduł + ustawi podane przez uzytkownika hasło. Wyszukując odpowiednią + regułę możemy dowiedzieć się na przykład jakiego algorytmu użyto + do tworzenia skrótu hasła. Do odnalezienia tej linii posłużymy się + poniższym poleceniem. +

+
+xf0r3m@immudex:/ic0$ grep password.*unix /etc/pam.d/*
+/etc/pam.d/common-password:# used to change user passwords.  The default is pam_unix.
+/etc/pam.d/common-password:password	[success=1 default=ignore]	pam_unix.so obscure yescrypt
+
+

+ W drugiej linii znajduje się poszukiwana przez nas + reguła. Skupmy się tylko na argumentach modułu. Otóż argument + obscure, najprościej rzecz ujmując + powoduje on sprawdzenie czy podane hasło jest wystarczająco + "przesłonięte" (nie jest zbliżone do obecnie używanego). Kolejny + argument to algorytm szyfrowania w tym przypadku jest to + nowy algorytm yescrypt, do Debiana + został on wdrożony wraz z wypuszeniem wersji 11 "Bullseye". +

+

+ No dobrze, w przypadku ustawiania hasła mamy jawnie podany algorytm. + A co w przypadku gdy moduł PAM musi sprawdzić czy podane hasło jest + poprawne. Niestety w tym przypadku PAM próbuje odgadnąć algorytm + wykorzystując do tego bibliotekę libcrypt, ktora wypróbowuje + wszystkie dostępne możliwości do momentu aż coś zadziała lub + nie pozostanie nic sprawdzenia. +

+

8. Procesy oraz monitorowania zasobów

+

+ Jeśli pamiętamy definicję procesu, to wiemy, że proces to nic innego + jak wystąpienie uruchomionego programu. Każdy proces aby mógł + wykonać swoje zadanie potrzebuje zasobów sprzetowych naszych + komputerów oferowanych przez system operacyjny. Jądro odpowiada + za sprawiedliwy przydział zasobów systemowych. Samo jądro również + może być zasobem - programowym wykorzystywanym przez + procesy do uzyskiwania dostępu do plików czy do urządzeń + wejścia-wyjścia. +

+

+ W tym rozdziale objaśnimy sobie nieco bardziej procesy oraz zajmiemy + się monitorowaniem zasobów. Jednak nie po to aby optymalizować + system, ponieważ ten na domyślnych ustawieniach dystrybucji działa + całkiem dobrze i nie potrzeba nic zmieniać. Zajmiemy się + natomiast monitorowaniem zasobów by lepiej zrozumieć co jest + dokładnie mierzone, dzięki czemu przybliżymy sobie, niektóre + działania jądra. +

+

8.1. Śledzenie procesów

+

+ Procesy możemy śledzić za pomocą polecenia ps i + w zależności od użytych przełączników możemy uzyskać różne + rezultaty działania tego polecenia. Osobiście polecam + kombinację trzech przełączników -aux. Poza tym + to polecenie posiada trzy rózne możliwości wprowadzania do niego + opcji. Ja skupie się na jednym myślniku i łączeniu razem opcji. + Inną godną polecenia kombinacją opcji jest -elf + te opcje zwracają najważniesze dla nas informacje, na przykład + jak wartość priorytetu oraz wartość nice, które biorą + udział w szeregowaniu procesów do wykonania. Dlaczego polecam tę + pierwszą kombinacją, ponieważ najczęściej do zarządzania jakimś + procesami będzie nam potrzebny PID, właściciel procesu, z jakiego + polecenia proces pochodzi lub procentowe wartości zużycia pamięci + czy procesora. +

+

+ Innym przydatnym narzędziem dla śledzenia procesów jest polecenie + top. Ponieważ informacje wyświetlane przez to + polecenie są odświeżane co sekundę dając aktualny obraz tego co + się aktualnie dzieje w systemie. Po uruchomieniu tego programu na + samej górze listy procesów znajdują się najbardziej aktywne z nich. + Podczas działania programu, można przekazywać do niego opcje za + pomocą naciśniecia odpowiedniego klawisza. Poniżej znajduje się + kilka opisanych klawiszy. +

+
    +
  • Spacja - natychmiastowe odświerzanie ekranu.
  • +
  • Shift + m - sortuje procesy pod względem + zajętości pamięci.
  • +
  • Shift + t - sortuje procesy pod względem + całkowitego zużycia czasu procesora.
  • +
  • Shift + p - sortuje procesy pod względem + aktualnego zużycia czasu procesora. Użycie tego polecenia + przywraca domyślne ustawienia.
  • +
  • u - wyświetla tylko dane procesów + użytkownika.
  • +
  • f - umożliwia wybranie różnych statystyk do + wyświetlenia.
  • +
  • ? - wyświetla informacje o opcjach programu + top.
  • +
+

+ W dystrybucjach Linuksa dostępne są różne odmiany polecenia + top, takie jak htop lub atop. + Polecenie htop jest znacznie bardziej rozbudowane, a + jego interaktywna konfiguracja pozwala nie tylko na zmianę + wyświetlanych danych, ale również zmianę tematu wyświetlania + (kolorów). Za pomocą htop możemy monitorować stan baterii. + Po za tym polecenie to posiada, niektóre możliwości innego + przydatnego polecenia jakim jest lsof. +

+

8.2. Wyszukiwanie otwartych plików z pomocą polecenia lsof

+

+ Polecenie lsof może być bardzo przydatne ponieważ + pozwala wyświetlić + listę plików otwartych przez różnego rodzaju procesy. Co może okazać + się przydatne przypadku gdy chcemy odmontować jakiś system plików, + ale otrzymujemy informacje o tym, że target is busy. Ten + komunikat + może być spowowany tym, że w systemie istnieją jeszcze procesy + działające na plikach znajdujących się na odmontowywanym systemie + plików. Poza tym polecenie to generuje masę danych ze względu na + to, że w systemach uniksopodobnych wszystko jest plikiem, a więc + nie otrzymamy informacji tylko i wyłącznie o konwencjonalnych + plikach, ale również o gniazdkach czy nazwanych potokach. Poniżej + znajduje się linia z otwartym plikiem podczas pisania tego tekstu. +

+
+COMMAND    PID   USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
+vim.gtk3  3645 xf0r3m    7u      REG              254,0    20480    8391246 /media/xf0r3m/immudex_crypt0/Repos/morketsmerke-dev/articles/terminallog/.Linux.Podstawy.html.swp
+
+

+ Linia przedstawia otwarty plik z materiałem w trakcie redagowania. + Zwróćmy uwagę na nazwę pliku. Wygląda na to, że edytor Vim + ładuję zawartość pożądanego przez nas pliku do pliku bufora + (rozszenienie .swp). W momencie zapisu otwiera właściwy plik, + zapisuje dane poczym go zamyka. Edytor ten jest znany z tej metody + obsługi plików. Dzięki temu w przypadku nagłego wyłącznia komputera, + dane wciąż pozostają w pliku bufora. Nawet w przypadku, kiedy + będziemy otwierać ten plik to edytor zauważy pozostawiony plik + bufora, który o opuszczeniu programu powinien zostać usunięty. Jeśli + dla otwieranego przez ten edytor istnieje już plik wymiany, wówczas + edytor zapyta co zrobić z jego zawartością. +

+

+ Wracając, linie zwracane przez to polecenie podzielone są na 9 kolumn + Każda z nich zawiera: +

+
    +
  • COMMAND - polecenie / nazwa procesu.
  • +
  • PID - identyfikator procesu.
  • +
  • USER - użytkownik, który zainicjował proces.
  • +
  • FD - deskryptor pliku lub jego przeznaczenie. + Deskryptor otwartego pliku jest wykorzystywany przez proces przy + użyciu bibliotek wspódzielonych oraz jądra do identyfikowania + i manipulowania plikiem. Na przedstawionej linii mamy doczynienia + z deskryptorem.
  • +
  • TYPE - rodzaj otwartego pliku (zwykły plik, + katalog).
  • +
  • DEVICE - główny i poboczny numer urządzenia + przechowywującego plik.
  • +
  • SIZE/OFF - rozmiar pliku.
  • +
  • NODE - numer węzła inode.
  • +
  • NAME - nazwa pliku / ścieżka do pliku.
  • +
+

+ Ze względu na przytłaczającą ilość danych zwracanych przez to + polecenie, możemy uruchomić je na dwa sposóby. Pierwszym z nich + jest przepuszcznie danych zwracanych przez to polecenie przez jakiś + filtr, najprostszym jest chyba polecenie less jednak lepiej + wyszukać informacji z użyciem wyrażeń regularnych (polecenia + grep). Drugą metodą jest zawężenie informacji zwracanych + poprzez wykorzystanie dostępnych opcji narzędzia. Najłatwiejszym w + użyciu jest podanie jako argumentu po prostu ścieżki do katalogu, z + którego chcemy widzieć otwarte pliki. Na przykład: +

+
+xf0r3m@immudex:~$ lsof /home/xf0r3m
+COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
+pipewire   978 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+dbus-daem  983 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+pipewire-  988 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+xfce4-ses  989 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+at-spi-bu 1042 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+dbus-daem 1047 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+xfconfd   1051 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+...
+mpv       2923 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+atrild    3227 xf0r3m  cwd    DIR   0,27      400  638 /home/xf0r3m
+
+

+ A jeśli chcelibyśmy się dowiedzieć jakie otawrte pliki posiada + proces mpv, to możemy na przykład skorzystać z opcji + -p a jako jej argument podać PID procesu + mpv tak jak przedstawiłem to na przykładzie. +

+
+xf0r3m@immudex:~$ lsof -p 2923
+COMMAND  PID   USER   FD      TYPE             DEVICE SIZE/OFF   NODE NAME
+mpv     2923 xf0r3m  cwd       DIR               0,27      400    638 /home/xf0r3m
+mpv     2923 xf0r3m  rtd       DIR               0,27      200      2 /
+mpv     2923 xf0r3m  txt       REG               0,29  2158056   4302 /usr/bin/mpv
+mpv     2923 xf0r3m  mem       REG                7,0            4302 /usr/bin/mpv (path dev=0,29)
+...
+mpv     2923 xf0r3m    5u     IPv4              26738      0t0    TCP 192.168.168.29:34108->prg03s12-in-f14.1e100.net:https (CLOSE_WAIT)
+mpv     2923 xf0r3m    6u     IPv4              26743      0t0    TCP 192.168.168.29:34122->prg03s12-in-f14.1e100.net:https (CLOSE_WAIT)
+mpv     2923 xf0r3m    7u     IPv4              88390      0t0    TCP 192.168.168.29:38584->prg03s13-in-f14.1e100.net:https (ESTABLISHED)
+mpv     2923 xf0r3m    8u     IPv4              86801      0t0    TCP 192.168.168.29:48618->85.162.162.204:https (ESTABLISHED)
+mpv     2923 xf0r3m    9u     unix 0x000000006b6ad31e      0t0  26745 type=STREAM
+mpv     2923 xf0r3m   10r     FIFO               0,12      0t0  26746 pipe
+mpv     2923 xf0r3m   11w     FIFO               0,12      0t0  26746 pipe
+mpv     2923 xf0r3m   12u      CHR              226,0      0t0    237 /dev/dri/card0
+mpv     2923 xf0r3m   13u      CHR              226,0      0t0    237 /dev/dri/card0
+mpv     2923 xf0r3m   14u      CHR              226,0      0t0    237 /dev/dri/card0
+mpv     2923 xf0r3m   15u      CHR              226,0      0t0    237 /dev/dri/card0
+mpv     2923 xf0r3m   16r     FIFO               0,12      0t0  26079 pipe
+mpv     2923 xf0r3m   17w     FIFO               0,12      0t0  26079 pipe
+mpv     2923 xf0r3m   18u  a_inode               0,13        0   7971 [eventfd]
+mpv     2923 xf0r3m   19u     unix 0x0000000075d44df6      0t0  26081 type=STREAM
+mpv     2923 xf0r3m   20u  a_inode               0,13        0   7971 [eventfd]
+mpv     2923 xf0r3m   21r     FIFO               0,12      0t0  26082 pipe
+mpv     2923 xf0r3m   22w     FIFO               0,12      0t0  26082 pipe
+
+

+ Zastanawiające może być, dlaczego mpv korzysta z połączeń + sieciowych, otóż za pomocą mpv oraz pakietu youtube-dl, + można korzystać z serwisu YouTube bez nadmiernego obciążenia + komputera przez nieoptymalną aplikację internetową. +

+

+ Jeśli często aktualizujemy jądro, poza aktualizacją całej dystrybucji + to należy pamiętać o aktualizacji programu lsof. + Po aktualizacji jądra oraz programu lsof, może ono nie + nie działać prawidłowo, dopóki nie uruchomimy nowego jądra. +

+

8.3. Śledzenie wykonania programów oraz wywołań systemowych

+

+ Zazwyczaj program jeśli się uruchamia i napotka podczas wykonywania + swoich czynności błąd to zwróci jakąś informację o tym co się + stało (większość programów uruchomianych na uniksach). Możemy jednak + napotkać taki przypadek, że uruchomimy program i on odrazu się + zamknie. Wówczas pojawia się problem w jaki sposób mamy dowiedzieć + się co jest nie tak z programem czy naszym środowiskiem (czy wszyskie + wymagane pakiety zostały zainstalowane, na przykład). Rozwiązania, + które przedstawię w tym podrozdziale na pewno nie są idealne i nie + sprawdzą się w przypadku każdego "migającego" programu. + Nie mniej jednak warto uruchomić dla niego chodziaż jedno z + zaprezentowanych tutaj poleceń. +

+

8.3. Polecenie strace

+

+ Polecenie strace pozwala na uruchomienie programu wraz ze + śledzeniem wywołań systemowych (interfejsu jądra, pozwalającego na + wykonanie wielu czynności systemowych, na przykład otwarcia pliku + zapisanego gdzieś w systemie plików). Najprostszą poleceniem jakie + możemy wykonać dla przykładu jest wyświetlenie zawartości jakiegoś + pliku. Polecenie strace może nie występować we wszystkich + dystrybucjach, więc będzie trzeba je zainstalować. Z racji tego, iż + informacji zwracanych przez to polecenie jest na prawdę dużo to + poniżej przedstawiłem wywołanie prostego wyświetlenia zawartości + pliku przy użyciu polecenia cat: +

+
+xf0r3m@immudex:~$ strace cat yt-links
+execve("/usr/bin/cat", ["cat", "yt-links"], 0x7ffc8ee949b8 /* 39 vars */) = 0
+brk(NULL)                               = 0x564490232000
+access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (Nie ma takiego pliku ani katalogu)
+openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
+fstat(3, {st_mode=S_IFREG|0644, st_size=105669, ...}) = 0
+mmap(NULL, 105669, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2f770de000
+close(3)                                = 0
+openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
+read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@>\2\0\0\0\0\0"..., 832) = 832
+fstat(3, {st_mode=S_IFREG|0755, st_size=1905632, ...}) = 0
+mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2f770dc000
+mmap(NULL, 1918592, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2f76f07000
+mmap(0x7f2f76f29000, 1417216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f2f76f29000
+mmap(0x7f2f77083000, 323584, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17c000) = 0x7f2f77083000
+mmap(0x7f2f770d2000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ca000) = 0x7f2f770d2000
+mmap(0x7f2f770d8000, 13952, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2f770d8000
+close(3)                                = 0
+arch_prctl(ARCH_SET_FS, 0x7f2f770dd580) = 0
+mprotect(0x7f2f770d2000, 16384, PROT_READ) = 0
+mprotect(0x56448ed5a000, 4096, PROT_READ) = 0
+mprotect(0x7f2f77122000, 4096, PROT_READ) = 0
+munmap(0x7f2f770de000, 105669)          = 0
+brk(NULL)                               = 0x564490232000
+brk(0x564490253000)                     = 0x564490253000
+openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
+fstat(3, {st_mode=S_IFREG|0644, st_size=3041312, ...}) = 0
+mmap(NULL, 3041312, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2f76c20000
+close(3)                                = 0
+fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
+openat(AT_FDCWD, "yt-links", O_RDONLY)  = 3
+fstat(3, {st_mode=S_IFREG|0644, st_size=512, ...}) = 0
+fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
+mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2f76bfe000
+read(3, "lofi girl stream: www.youtube.co"..., 131072) = 512
+write(1, "lofi girl stream: www.youtube.co"..., 512lofi girl stream: www.youtube.com/watch?v=jfKfPfyJRdk
+Stalker czyste niebo: www.youtube.com/playlist?list=PLMnTK-S7An4KqvvXn6AMkE00s_aDNZ29o
+Stalker zew prypeci: www.youtube.com/playlist?list=PLMnTK-S7An4K8BMXzFCVA0Y8KLSSHRfwV
+MysteryTV CP S03: www.youtube.com/playlist?list=PLjkTsi__dtwWJm4gUqaFLBva0k1TljXcn
+MysteryTC CP S04: www.youtube.com/playlist?list=PLjkTsi__dtwWR247M06TZ_2FxccG91f1u
+Tu skończyłem: https://www.youtube.com/watch?v=wnY3cTAujMc
+
+Iceberg o stalkerze: www.youtube.com/watch?v=uMHvO7LXVz8
+) = 512
+read(3, "", 131072)                     = 0
+munmap(0x7f2f76bfe000, 139264)          = 0
+close(3)                                = 0
+close(1)                                = 0
+close(2)                                = 0
+exit_group(0)                           = ?
++++ exited with 0 +++
+
+

+ Polecenie strace wykorzystuje + wyołanie systemowe fork() aby utworzyć kopię swojego procesu + następnie ta kopia jest zastępowana przez wywołanie systemowe + execve(), które uruchamia + podany przez nas proces, w tym przypadku jest wyświetlenie + zawartości pliku yt-links, po + zinicjowaniu pamięci oraz odpytaniu się bibliotek + proces cat chcę otworzyć + plik za pomocą wywołania systemowego + openat, jeśli otwarcie pliku + się powiedzie, otwartemu plikowi zostanie nadany pierwszy wolny + deskryptor, najczęsiej będzie to 3, + co zostało przedstawione na przykładzie. Jeśli samodzielnie będziemy + uruchamiać podobne polecenie (nie każdy w swoim systemie posiada, + pliki yt-links), to zauważym że ten deskrytor jest + przypisywany i zwalniany kilkukrotnie podczas wykonywania czynności + Przed pobraniem zawartości pliku, pobierane są jego atrybuty za + pomocą wywołania fstat() oraz + alokowana jest pamięci operacyjna + (mmap) i wówczas następuje wywołanie + systemowe read(), które pobiera + zawartości pliku. Następne wywołanie systemowe odpowiedzialne jest + za wypisanie zawartości, do deskryptora o numerze + 1. Jak pamiętamy polecenie + cat wyświetla zawartość pliku podanego jako ścieżka + albo wyświetla podane dane z standardowego wejścia na standardowe + wyjście. A + więc numer standardowego wyjścia, którym jest 1 jest + deskryptorem otwartego pliku. Dlatego też wywołanie systemowe + write() odwołuje się do + deskryptora o numerze 1. Następnie + pamięć oraz wykorzystywane deskrytory zostają zwolnione i w ten + sposób kończy się wykonanie procesu polecenia cat. +

+

+ Czytając ten obszerny opis możemy przyjrzeć się jak działają programy + na uniksach. Nie mniej jednak polecenie strace może pomóc + nam przy, nie których problemach z programami. Często sytuacją, + w której program może nam "mignąć" jest brak jakiegoś pliku lub + problem z jego dostępnością. Kiedy analizujemy wykonanie programu + za pomocą polecenia strace to należy szczególną uwagę + zwrócić na wywołania systemowe openat(). Poniżej znajdują się + dwa przykładowe komunikaty: +

+
+openat(AT_FDCWD, "test.txt", O_RDONLY)  = -1 ENOENT (Nie ma takiego pliku ani katalogu)
+openat(AT_FDCWD, "/etc/shadow", O_RDONLY) = -1 EACCES (Brak dostępu)
+
+

+ W przypadku błędu, zazwyczaj otrzymujemy deskryptor o numerze + -1, jednak zwróćmy uwagę na komunikaty błedów różnia się od + siebie (ENOENT a + EACCES). +

+

8.3.2. Polecenie ltrace

+

+ Podobnym do strace narzędziem jest ltrace. + Jednak zamiast wywołań systemowych śledzi on wywołania bibliotek + wspóldzielonych, dane wyjściowe tego programu są zbliżone do + strace. Program ltrace nie śledzi niczego na + poziomie jądra, to jednak warto mieć na uwadzę fakt, iż programy + o wiele częściej korzystają z bibliotek wspódzielonych niż z + wywołań systemowych. Polecenie ltrace nie zadziała w + przypadku bibliotek dołączonych statycznie. A jego dane wyjściowe + możemy odfiltrować za pomocą opcji polecenia, których opis dostępny + jest na stronie podręcznika. +

+

8.4. Wątki

+

+ Procesy mogą dzielić się na podobne byty zwane + wątkami. Wątki w pewnym sensie są podobne do + procesów, również zawierają identyfikator zwany TID + (ang. Thread IDentifier). Podobnie jak program może mieć + kilka procesów, odpowiadających wykonywanym przez niego czynnością, + to wątki mogą być efektem podziału czynności procesu na jeszcze + mniejsze części. W przypadku komputerów metoda rozwiązywania + problemów "dziel i rządź", będzie miała zastosowanie jeszcze + nie jednokrotnie. +

+

8.4.1. Procesy jedno oraz wielowątkowe

+

+ Część procesów uruchamianych w systemie zawiera tylko jeden wątek. + Wówczas taki proces jest procesem jednowątkowym. Na początku, każdy + proces posiada jeden wątek, zwany wątkiem głównym. + Wątek główny może tworzyć kolejne wątki, zmieniając ten proces tym + samym w proces wielowątkowy. +

+

+ Podstawową zaletą procesów wielowątkowych jest fakt wykonania + zaplanowanych w procesie czynności o wiele szybciej, gdyż każdy + wątek może być wykonywany przez jeden procesor (wątek procesora, + tak rdzenie procesorów też mogą zawierać w sobie wątki, przeważnie + na jeden rdzeń przypadają dwa wątki). Innym cechą wątków jest to + iż wykorzystują one wspólne obszary pamięci, (nie tak jak w + przypadku procesów, gdzie procesy nie mają dostępu do obszaru + pamięci innych procesów) usprawniając tym samy komunikację miedzy + wątkami. Wątki najczęsciej wykorzystywane są do obsługi operacji + wejscia-wyjścia. Użycie w tym przypadku wątków zamiast procesów + pozwala nam zaoszczędzić trochę czasu procesora. +

+

8.4.2. Wyświetlanie wątków.

+

+ Pozanane do tej pory narzędzia służące do obserowania procesów + również sprawdzą się gdy będziemy chcieli wyświetlić informacje + na temat wątków. W przypadku polecenia ps wystarczy dodać + do polecenia opcję m, warto jednak zaznaczyć by + nie mieszać opcji m wraz z opcją u. Na poniższym + przykładzie wyświetliłem moje procesy uruchomione w terminalach. +

+
+xf0r3m@immudex:/media/xf0r3m/immudex_crypt0$ ps -am -opid,tid,time,cmd
+    PID     TID     TIME CMD
+   1799       - 00:00:02 /usr/bin/python3 -O /usr/bin/ranger
+      -    1799 00:00:02 -
+   7507       - 00:00:00 /bin/sh -c set -- '/ic0/Repos/morketsmerke-dev/articles/terminallog/Linux.P
+      -    7507 00:00:00 -
+   7508       - 00:00:00 /bin/sh /usr/bin/sensible-editor -- /ic0/Repos/morketsmerke-dev/articles/te
+      -    7508 00:00:00 -
+   7512       - 00:00:05 /usr/bin/vim.gtk3 -- /ic0/Repos/morketsmerke-dev/articles/terminallog/Linux
+      -    7512 00:00:05 -
+  12070       - 00:00:00 ps -am -opid,tid,time,cmd
+      -   12070 00:00:00 -
+
+

+ Zwróćmy uwagę na to numery PID oraz TID są takie same. W przypadku + poleceń jednowątkowych, wątek główny posiada taki sam TID jak + proces macierzysty. Jeśli pojawiłby się procesy, wkorzystujące + wątki, to wówczas TIDy wynośiły by kolejne numery rozpoczynając od + PID-u lub TID-u wątku głównego. +

+

+ Jeśli preferujemy narzędzie top to wówczas użycie kombinacji + klawiszy Śhift + h pozwoli nam na wyświetlenie wątków. + Możemy je rozpoznać po tym, że wyświetlone tam "procesy" są + uruchomione z tego samego polecenia i posiadają następujące po sobie + identyfikatory. +

+

+ Wątki w tym materiale zostały przedstawione, aby zaprezetować ich + istnienie i na tym temat się kończy. +

+

8.5. Monitorowanie zasobów

w +

+ Monitorowanie zasobów komputerów przeprowadza się głównie, aby + dowiedzieć się, które z komponentów systemów lub komputerów należy + z optymalizować, aby nasza praca była jescze bardziej wydajna, abyśmy + mogli zrobić coś lepiej, szybciej oraz niższym nakładem pracy. Jak + już wspomniałem jądro Linuksa jest bardzo wydajne przy domyślnych + ustawieniach i nie trzeba się tym przejmować. Dlatego też + wykorzystamy monitorowanie zasobów czasu procesora, pamięci + operacyjnej oraz operacji wejścia-wyjścia do sprawdzenia w jaki + sposób dzieli je między procesami. +

+

8.6. Pomiar czasu procesora

+

+ Do monitorowania w czasie rzeczywistym pojedynczych procesów możemy + wykorzystać polecenie top wraz z opcją -p. + Jako argumenty opcji podajemy listę identyfikatorów procesów. +

+
+$ top -p 3329,1230
+
+

+ Wówczas polecenie top pokaże na swojej liście tylko te dwa + procesy. +

+

+ Aby dowiedzieć się ile czasu procesora w trakcie swojego działania + wykorzystało konkretne polecenie, to należy je uruchomić za pomocą + polecenia time, jednak tu musimy się na chwilę + zatrzymać gdyż przeważnie w większości dystrybucji istnieją dwa + polecenia time. Jedno jest polecenie wbudowanym w powłokę + i nie ma z niego za bardzo pożytku. Dla przykładu poniżej umieszczam + pomiar czasu procesora wbudowanym w powłokę polecenie time: +

+
+xf0r3m@immudex:~$ time ls
+...
+real	0m0,007s
+user	0m0,001s
+sys	  0m0,007s
+
+

+ Z kolei dostęp do właściwego polecenie uzyskamy uruchamiając + konkretny plik: /usr/bin/time, jednak twórcy + wiodących dystrybucji uznają, że polecenie wbudowane w powłokę + wystarczy, dlatego też prawdopodbne jest, że omawiany przez nas + program nie będzie domyślnie zainstalowany w naszym systemie. + Poniżej znajduje się to samo polecenie wykonane za pomocą właściwego + programu. +

+
+xf0r3m@immudex:~$ /usr/bin/time ls
+...
+0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 2516maxresident)k
+0inputs+0outputs (0major+123minor)pagefaults 0swaps
+
+

+ To polecenie zwraca znacznie więcej informacji na temat wykonanego + polecenia. Na tym etapie będą interesować trzy pierwsze wartości: + 0.00user 0.00system 0:00.00elapsed. + Wskazują one kolejno: +

+
    +
  • Czas użytkownika + (0.00user) - liczba sekund + poświęcona przez procesor na wykonanie właściwego kodu programu. + Przy obecnej mocy obliczeniowej komputerów czas wykonania prostej + czynności jest natyle krótki, że program zaokrągla go do zera.
  • +
  • Czas systemowy + (0.00system) - czas poświęcony + przez jądro na obsługę procesu (na przykład, odczyt zawartości + plików lub katalogów).
  • +
  • Czas trwania + (0.00elapsed) - całkowity czas + działania procesu od początku do końca jego życia, wraz ze + wszystkimi dodatkowymi czynnościami. Czas ten nie jest szczególnie + brany pod uwagę podczas pomiarów wydajności, ale odjęcie sumy + czasu użytkownika oraz czasu systemowego od tej wartości przedstawi + czas oczekiwania na zasoby.
  • +
+

+ Pozostałe wartości zwracane przez to polecenie dotyczą pamięci, + operacji wejścia-wyjścia oraz stronicowania (do stronicowania jeszcze + wrócimy w tym rozdziale). +

+

8.7. Priorytetyzacja procesów

+

+ W pierwszym rodziale poruszyliśmy temat zarządzania procesami przez + jądro, dowiedzielśmy się, że każdy proces otrzymuje dostęp do + procesora na ułamek sekundy. Modułem odpowiedzialnym za to, który + z procesów uzyska w chwili obecnej dostęp do procesora jest + program szeregujący, który na podstawie + priorytetu procesu może przydzielć mu więcej lub + mniej czasu. W dystrybucja Linuksa priorytety funkcji przedstawiane + są dwojako. Polecenie top przestawia domyślny priorytet + wartością 20 (kolumna PR), jeśli jednak wywołamy + polecenie + ps z opcjami -elf (ta sama kolumna), to domyślnym + priorytetem będzie + 80. My na tym etapie będziemy trzymać się raczej + wartosci przedstawianych przez polecenie top, ponieważ + łatwiej będzie nam je zrozumieć. Więc domyślnym priorytem jest + 20, poniżej przedstawiam kilka procesów wyświetlonych przez + narzędzie top: +

+
+xf0r3m@immudex:~$ top
+
+top - 09:32:04 up  1:55,  1 user,  load average: 0,73, 0,65, 0,61
+...
+PID UŻYTK.    PR  NI    WIRT    REZ    WSP S  %CPU  %PAM     CZAS+ KOMENDA
+2364 xf0r3m    20   0 2504764 158992  90048 S   0,3   2,0   0:37.66 Isolated Web Co
+2418 xf0r3m    20   0  474048  94468  66272 S   0,3   1,2   1:39.81 xfce4-terminal
+4395 root      20   0       0      0      0 I   0,3   0,0   0:01.40 kworker/3:0-events
+33705 xf0r3m    20   0   10404   4212   3452 R   0,3   0,1   0:00.36 top 
+
+

+ Najwyższym priortem w tym przypadku jest działanie w czasie + rzeczywistym, ale na tym etapie nie będziemy się tym zajmować. Tak + więc na chwilę obecną najwyższym priortetem jest 1, + a najniższym 39. +

+

+ Do manipulacji priorytetami wartość nice + (kolumna NI), przechowuje ona wartość wpływającą na priorytet + zwiększając go lub zmieniajszając. Do ustawienia wartości + nice służy polecenie renice. To polecenie + możemy wykonać bez uprawnień administrator o ile zmniejszamy + priorytet (podając wysoką wartość nice, która dodawana jest + do domyślnej wartości priortetu), zmniejszenie priorytetu + (podanie ujemnej wartości nice) wymaga już uprawnień + superużytkownika. Polecenie to poza nową wartością nice + wymaga podania PID-u procesu. +

+
+xf0r3m@immudex:/media/xf0r3m/immudex_crypt0$ pidof top
+37426
+xf0r3m@immudex:/media/xf0r3m/immudex_crypt0$ renice 20 37426
+37426 (process ID) old priority 0, new priority 19
+
+#lub krócej:
+
+xf0r3m@immudex:/media/xf0r3m/immudex_crypt0$ renice 20 $(pidof top) 
+37426 (process ID) old priority 0, new priority 19
+
+

+ Polecenie pidof pozwala uzyskać + PID procesu na podstawie polecenia, jeśli uruchomionych jest więcej + niż jedna instancja danego programu polecenie zwróci listę PID-ów. + Podczas zmiany priorytetu mimo, iż podaliśmy wartość 20 to + największą wartością nice jest 19 tak samo jest w drugą + stronę. Najmniejszą wartością nice (a zatem proces będzie + mieć największy priortet) jest -19. +

+

+ Priortety i manipulacja nimi miała dużo większe znaczenie w czasch + gdy z jednego systemu korzystało wielużytkowników. Obecnie maja one + mniejsze znaczenie. Warto też dodać, aby nie wymuszać wysokich + priortetów, gdyż mogą one zablokować istotne dla funkcjonowania + systemu procesy i go zdestabilizować. +

+

8.8. Średnie obciążenia

+

+ Średnie obciążenia jest to o szaczowana liczba + procesów do uruchomienia. Ten parametr określa ilość procesów + gotowych w każdej chwili użyć procesora. Jak pamiętamy nie wszystkie + procesy są gotowe do działania, część z nich czeka na dane. Średnie + obciążenia są wyświetlane przez polecenie uptime. +

+
+xf0r3m@immudex:~$ uptime
+ 10:40:15 up  3:03,  1 user,  load average: 1,14, 0,99, 1,17
+
+

+ Wartości przedstawione obok etykiety + load average przedstawiaja średnie + obciążenia z minuty, 5 i 15 minut. Na powszszym przykładzie widzimy + że ciągu ostatniej minuty z użyto na wykonanie procesów użytkownika + 114% procent procesora. Jeśli obiążenia tak jak na przykładzie stale + utrzymują się powyżej 1, to oznacza to, że jeden proces cały czas + wykorzystuje jeden rdzeń procesora. Pełne obiążenie komputera w + przypadku tego wskaźnika będzie oscylować w granicach ilości + rdzeni/wątków procesora zamontowanego w naszym komputerze. +

+

+ Wysokie średnie obciążenia mogą wynikać nie tylko z działania w + systemie procesów ale również ze względu na pozostałą nie wielką + ilość pamięci dostępnej w systemie. Wówczas jądro może zarządzić + proces przeładowania (ang. trashing), + powoduje to szybkie + przenoszenie stron pamięci na dysk oraz z dysku. Gdy ma to miejsce + ilość procesów gotowych do uruchomienia zwiększa sią powodując + znacznie zwiększenie średniej obiążenia. Ze względu na małą ilość + wolnej pamięci system może działać znacznie wolniej i niż zwykle. +

+

8.9. Pamięc

+

+ Pamięć operacyjna jest bardzo ważnym komponentem komputera, jeśli + chodzi o maszyny uniksowe. W pamięci rezydują obszary, w których + procesy przechowują swoje dane, a jej ilość jest ograniczona. Do + monitorowania pamięci możemy posłużyć się takimi narzędziami jak + polecenie free (w przypadku tego polecenia, warto + przeskalować sobie wartości zwracane za pomocą opcji + -h) lub skorzystać z interfejsu systemowego + wyświetlając zawartość pliku /proc/meminfo (tutaj jednak + jestśmy skazani na wartość wyrażone w kilobajtach). Jeśli pamięć + podręczna/bufora nie zajmuje dużego obszaru pamięci fizycznej, a + mimo to nie mamy w zanadrzu wiekszej ilości wolnej pamięci to + niezbędne może być dołożenie pamięci do naszego komputera, aby + poprawić jego wydajność. +

+

8.9.1. Zarządzenie pamięcią

+

+ Jądro w tym zadaniu opera się na jednosce MMU + (ang. Memory Management Unit), której zadaniem jest zamiana adresów + pamięci wirtualnej na adresu pamięci fizycznej. Pamięć wirtualna + jest wykorzystywana przez procesy. Jądro współpracuje + z MMU dzieląc obszary procesów na mniejsze strony, trzymając tym + samym dane służące MMU do odzworowania adresów w strukturze danych + zwanej tabelą stron. W momencie uzyskania przez + proces dostępu do pamięci jednostka MMU dzięki tej strukturze może + dokonywać translacji adresów. +

+

+ Procesy zazwyczaj nie wymagają dostępu do pełnego obszaru w pamięci + od razu. Jądro ładuje wówczas tylko te strony, których proces + wymaga. Taki rodzaj przydzielania pamięci nazywany jest + stronicowaniem na żądanie. +

+

+ Przydzielenie pamięci nowemu procesowi, możemy zapisać w czterech + krokach. +

+
    +
  1. Jądro ładuje do stron pamięci początek kodu programu
  2. +
  3. Jeśli zajdzie taka potrzeba jądro może przypisać procesowi kilka + stron pamięci.
  4. +
  5. W trakcie działania procesu, może zajść potrzeba załadowania + większej ilości kodu, ponieważ następna instrukcja do wykonania + nie znajduje się na załadowanych początkowo stronach. W takiej + sytuacji jądro przejmuje kontrolę, ładuje wymagane strony i + pozwala programowi wznowic działanie.
  6. +
  7. Jeśli zajdzie potrzeba przydzielenia więcej pamięci niż + zakładano na początku, jądro znajduje nieużywane strony, zwalnia + je i przydziela procesowi.
  8. +
+

8.9.2. Błędy stron

+

+ Nie zawsze wyżej wymienione czynności da się spiąć w czasie. Jeśli + żądana przez proces strona w pamięci nie jest jeszcze gotowa to + generują on błąd strony. Gdy taki błąd zostanie + wygenerowany, to kontrolę nad procesorem przejmuje jądro aby + załadować żądaną stronę. Błędy dzielą się na podstawowe oraz + drugorzędne. +

+

Drugorzędne błedy stron

+

+ Błędy tego typu nię są poważnym błedami, i zdarzają się dość często. + Ich najczęstszym powodem występowania jest fakt iż MMU nie zna + położenia strony z instrukcjami programu. Samo MMU może nie mieć + odpowiednio dużo miejsca aby przechować adresy wszystkich obszarów. + W przypadku występowania takiego błędu jądro przekazuje do MMU + informacje o położeniu strony i pozwala na wznowienie działania + procesu. +

+

Podstawowe błędy stron

+

+ Podstawowe błędy występują wówczas gdy strony nie ma w ogóle w + pamięci. Jądro musi ją załadować z jakiegoś nośnika najczęsciej jest + to dysk. Duża ilość tego typu błędów może przeciążyć system ponieważ + procesor jest zajęty przez jądro ładujące kod z niekoniecznie + szybkich nośników, blokując go tym samym dla innych procesów. + Niestety pewna ilość tego typu błedów jest + nie unikniona, a mają one miejsce kiedy po raz pierwszy uruchamiamy + jakiś program, wówczas należy załadować kod z dysku. +

+

Obserowowanie błędów stron

+

+ Do obserwowania błędów stron przydatne staje się polecenie + time, o którym wspomniałem przy okazji pomiaru + czasu procesora. Jednak w tym przypadku będzie interesować nas + wartość w nawiasie obok napisu + pagefaults. +

+
+xf0r3m@immudex:~$ /usr/bin/time timedatectl
+               Local time: nie 2023-01-08 17:59:08 CET
+           Universal time: nie 2023-01-08 16:59:08 UTC
+                 RTC time: nie 2023-01-08 16:59:08
+                Time zone: Europe/Warsaw (CET, +0100)
+System clock synchronized: no
+              NTP service: n/a
+          RTC in local TZ: no
+0.00user 0.01system 0:00.10elapsed 24%CPU (0avgtext+0avgdata 7416maxresident)k
+522inputs+0outputs (8major+359minor)pagefaults 0swaps
+
+

+ W przypadku uruchomienia w moim systemie polecenia + timedatectl wystąpiły 8 błędów + podstawowych (8major) oraz 359 + błedów drugorzędnych. +

+

+ Inne narzędzia takie top oraz ps również mogą + wyświetlać informacje o błędach stron pamięć, w przypadku polecenia + top należy włączyć wyświetlanie nMaj oraz + nMin, aby przejść do konfiguracji należy nacisnąć literę + f, a następnie postępować zgodnie z instrukcją. Program + ps pozwala na wyświetlenie błędów strony poprzez podanie + niestandardowego wyświetlania kolumn (opcja -o) kolumny + noszą kolejno nazwy maj_ftl i min_ftl. +

+

8.10. Monitorowanie wydajności za pomocą polecenia vmstat

+

+ Polecenie vmstat pozwala na monitorowanie wielu aspektów + wydajności systemu, a jest jednym z najstarszych narzędzi tego typu. + Dane wyświetlane również pozostawiają wiele do życzenia i osoba + nie mająca styczności z tym narzędziem, może uznać je za mało + czytelne. +

+
+xf0r3m@immudex:~$ vmstat 2
+proc. -----------pamięć---------- ---swap-- ---we/wy--- -system-- ------cpu-----
+dz bl   swap  wolna  bufor  cache   si   so    bi    bo   in   cs uż sy be io sk
+ 0  0      0 861264  13196 5331448    0    0    56     3  189  210 13  4 83  0  0
+ 0  0      0 861112  13196 5330624    0    0     0     0 2071 4073  8  4 88  0  0
+ 0  0      0 861712  13196 5330664    0    0     0     0 1944 3661  7  4 88  0  0
+ 0  0      0 862012  13196 5330608    0    0     0     0 2007 3866  7  4 89  0  0
+
+

+ Polecenie to przyjmuje jako argument interwał czasowym co ile sekund + ma wyświetlać nowe statystki. Każda linia to w tym przypadku + statystyki pobrane co dwie sekundy. Wyjście polecenia zawiera + tematyczne kolumny. Pierwszą z nich są procesy, ta kolumna zawiera + jeszcze dwie inne kolumny wskazujące procesy gotowe do uruchomienia + (dz) oraz te + zablokowane (bl). W następnej + kolumnie znajdują się informacje na temat + pamięci, a w niej informacje o wykorzystaniu przestrzeni wymiany + (swap), ilości wolnej + pamięci, pamięci przeznaczonej na bufor oraz pamięci przeznaczonej + na pamięć podręczną. W trzeciej kolumnie znajdują się informacje o + przestrzeni wymiany, ile stron zostało przeniesionych na dysk + (si) oraz ile stron zostało + załadowanych z dysku do pamięci + (so). Czwarta kolumna zawiera + informacje o użyciu urządzeń wejścia-wyjścia, dane odczytane z dysku + (bi) oraz dane zapisane na dysku + (bo). Piąta kolumna zwiera + informacje systemowe, w niej znajdują się liczniki wywołań + systemowych (in) oraz przełączeń + kontekstu (cs). Ostatnia kolumna + zawiera procentowe zużycie czasu procesora dla kolejno: aplikacji + użytkownika (uż), jądra oraz obsługi + procesów (sy), stanu bezczynności + (be), czasu przeznaczonego na + obsługę operacji wejścia-wyjścia + (io), czasu skradziony wirtualnej + maszynie (sk). +

+

+ Polecenie to zawiera wiele przydanych opcji, które są zawarte na + stronie podręcznika programu. Jak na przykład opcję + -d, która pozwala na monitorowanie dysków. +

+

8.11. Monitorowanie operacji wejścia-wyjścia

+

+ Na dystrybucje Linuksa dostępnych jest kilka narzędzi służących do + monitorowania operacji wejścia-wyjścia, które w dużej mierze są + operacjami dyskowymi. +

+

8.11.1. Polecenie iostat

+

+ Jedno znich przypomina omawiany w wcześniejszym + podrozdziale program vmstat, a jest nim polecenie + iostat, to polecenie może nie być domyślnie + zainstalowane i jeśli chcemy z niego skorzystać to należy je + zainstalować. Pakiet zawierający ten program zajduje się w + repozytoriach Debiana po nazwą sysstat. Poniżej + znajduje się przykład: +

+ +xf0r3m@immudex:/media/xf0r3m/immudex_crypt0$ iostat +Linux 5.10.0-20-amd64 (immudex) 10.01.2023 _x86_64_ (4 CPU) + +avg-cpu: %user %nice %system %iowait %steal %idle + 17,27 0,00 4,22 0,01 0,00 78,50 + +Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd +dm-0 0,35 3,52 0,61 0,00 25273 4396 0 +loop0 6,27 73,04 0,00 0,00 524237 0 0 +sda 1,55 66,41 0,56 0,00 476690 4048 0 + +

+ Oryginalny wydruk jest kolorowy. Ciemno niebieskie pola, mogą być + trochę nieczytelne, ale oznaczają one wartość + 0,00. Pierwsza linia zawiera nazwę + jądra, nazwę hosta w nawiasie, aktualną datę, architekturę procesora + oraz liczbę logicznych procesorów (rdzenie/wątków). Druga oraz + trzecia linia zawierają średnie zużycie czasu procesora oraz + objaśnienia tych wartości. Poniżej znajduje się tabelka + przedstawiająca urządzenia (Device), + liczba transferów na sekundę (liczba operacji wejścia-wyjścia na + sekundę wystosowana wobec urządzenia, + tps); liczba danych odczytanych na + sekundę (kB_read/s); liczba danych + zapisanych na sekundę (kB_write/s); + liczba danych odrzuconych na sekundę dla urządznia + (kB_dscd), ostatnie trzy kolmny + wrażają podobne wartości tylko zamiast prędkości jest przedstawiona + tam łączna ilość. +

+

+ Domyślnie dane wyrażane są w kilobajtach, jak prawie wszystko w + systemie co dotyczy pamięci masowych, jednostki możemy przeskalować + do megabajtów za pomocą opcji -m, natomiast za + pomocą opcji -p wraz z argumentem ALL + możemy wyświetlić statystki dla wszystkich urządzeń blokowych + dostępnych w systemie. Podobnie do vmstat podanie gołej + liczby jako argumentu spowoduje włączenie interwału czasowego o + podanej wartości. Więcej opcji oraz bardziej szczegółowe wyjaśnienia + znajdują się na stronie podręcznika programu. +

+

8.11.2. Polecenie iotop

+

+ Innym poleceniem służącym do monitorowania operacji wejścia-wyjścia + jest program iotop, zasada działania tego programu + jest podobna do znanego nam już narzędzia top tylko tym + razem zamiast skupiać się na procesach, położono nacisk na operacje + wejścia wyjścia. +

+
+xf0r3m@immudex:~$ sudo iotop
+Total DISK READ:         0.00 B/s | Total DISK WRITE:         0.00 B/s
+Current DISK READ:       0.00 B/s | Current DISK WRITE:       0.00 B/s
+    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                            
+      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
+      2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
+      3 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_gp]
+      4 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_par_gp]
+      6 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H-events_highpri]
+      8 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [mm_percpu_wq]
+      9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_tasks_rude_]
+     10 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_tasks_trace]
+     11 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
+     12 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]
+     13 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
+     15 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [cpuhp/0]
+     16 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [cpuhp/1]
+     17 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/1]
+     18 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]
+
+

+ Jak możemy zauważyć to polecenie wyświetla nam identyfikatory wątków. + Jest to jedno z nielicznych narzędzi wyświetlających wyświetlających + wątki, ponieważ często procesy dzielą się na nie aby własnie + zająć się obsługą wejścia-wyjścia. Inna kolumną wartą opisania jest + PRIO, podobnie jak procesy jądro + stara się szergować operacje wejścia-wyjścia. Przyczym priorytet + tutaj dzieli się na dwie wartości, klasę oraz poziom samego + priorytetu. Wątki o priorytecie + be/0 otrzymają więcej czasu + procesora na realizacje operacji niż wątki z priorytetem + be/4. Samych klas priorytetów + mogą wystąpić trzy rodzaje takie jak: +

+
    +
  • be(best-effort) - w przypadku + tego priorytetu jądro stara się jak najbardziej sprawiedliwie + uszeregować operacje wejścia-wyjścia. Tę klasę posiada większość + operacji.
  • +
  • rt(real-time) - Jądro + bezwarunkowo szereguje operacje opatrzone tą klasą ponad każdą + inną.
  • +
  • idle, klasa bezczynności. Jądro będzie wykonywać + operacje z tą klasą, tylko wtedy gdy nie jest wykonywana żadna + inna operacja. Ta klasa nie posiada żadnych poziomów, będąc + zarazem najniższym priorytetem.
  • +
+

+ Do manipulacji priortetami operacji wejścia-wyjścia służy polecenie + ionice, więcej na jego temat znajdziemy na stronie + podręcznika. +

+

8.12. Monitorowanie procesów za pomocą narzędzia pidstat

+

+ Za pomocą polecenia top możemy śledzić wykorzystanie + zasobów przez wybrany proces. Problem w przypadku tego rozwiązania + jest brak poprzednich wartości, ponieważ dane odświerzane są co + interwał czasowy (w przypadku top jest to jedna sekunda). + Rozwiązaniem tej niedogodności może być zastosowanie narzędzia + pidstat, ponieważ zachowuje on się tak jak + vmstat, ale dla procesów. Jeśli nie podamy konkretnego + PID-u, polecenie wyświetli wszystkie procesy, które zostały + uruchomione w systemie. Polecenie to nie jest domyślnie dostępne w + dystrybucjach opartych na Debianie, jest ono częścią pakietu + sysstat, ten pakiet zawiera również polecenie iostat. +

+
+xf0r3m@immudex:/media/xf0r3m/immudex_crypt0$ pidstat 
+Linux 5.10.0-20-amd64 (immudex) 	11.01.2023 	_x86_64_	(4 CPU)
+
+17:02:56      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
+...
+17:02:56     1001      2820    4,84    0,99    0,00    0,08    5,83     1  mpv
+17:02:56     1001      2886    0,04    0,01    0,00    0,00    0,05     1  ranger
+17:02:56     1001      3366    0,18    0,04    0,00    0,00    0,21     1  atril
+17:02:56     1001      3398    0,00    0,00    0,00    0,00    0,00     0  WebKitNetworkPr
+17:02:56     1001      3805    0,03    0,01    0,00    0,00    0,04     1  vim.gtk3
+17:02:56     1001      3829    0,00    0,00    0,00    0,00    0,00     2  bash
+17:02:56        0      4176    0,00    0,01    0,00    0,00    0,01     0  kworker/u8:2-kcryptd/254:0
+17:02:56        0      5013    0,00    0,00    0,00    0,00    0,00     0  kworker/u8:3-i915
+17:02:56     1001      5610    0,00    0,00    0,00    0,00    0,00     0  Web Content
+17:02:56     1001     28551    0,00    0,00    0,00    0,00    0,00     2  pidstat
+
+

+ Polecenie to w pierwszej linii zwraca nam podsumowanie odnośnie + systemu (wersję jądra, nazwę hosta, architekturę procesora oraz + ilość rdzeni/wątków) i datę. Następnie wyświetlana jest tabela z + procesami, w kolumnach kolejno od lewej znajduje się czas wywołania + polecenia; UID użytkownika, który ten proces zainicjował; PID + procesu. Następne pięć kolumn pokazuje informacje o zużyciu czasu + procesora. Kolumna %wait jest + procentowym żużyciem czasu procesora poświęconym na operacje + wejścia-wyjścia. Ciekawą wartością, nie zwracaną przez inne polecenia + jest kolumna %guest, która + przedstawia zużycie procesora na potrzeby zadań wykonywanych przez + maszynę wirtualną. Kolejnymi kolumnami są sumaryczne procentowe + zużycie czasu procesora; wskazanie, z którego z rdzeni/wątków + procesora korzysta ten proces oraz nazwa polecenia. +

+

+ Uruchomienie tego polecenia dla pojedyńczego procesu wymaga podania + opcji -p wraz z wartością, którą jest PID procesu + oraz najlepiej podanie interwału czasowego w postaci suchej liczby + po PID-zie. +

+
+xf0r3m@immudex:/media/xf0r3m/immudex_crypt0$ pidstat -p 2820 2
+Linux 5.10.0-20-amd64 (immudex) 	11.01.2023 	_x86_64_	(4 CPU)
+
+17:32:37      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
+17:32:39     1001      2820   13,50    5,00    0,00    0,50   18,50     1  mpv
+17:32:41     1001      2820   13,00    3,00    0,00    0,00   16,00     0  mpv
+17:32:43     1001      2820   14,00    4,50    0,00    0,50   18,50     0  mpv
+17:32:45     1001      2820   12,50    4,00    0,00    0,00   16,50     1  mpv
+17:32:47     1001      2820   14,00    4,00    0,00    0,00   18,00     1  mpv
+17:32:49     1001      2820   15,00    2,50    0,00    0,00   17,50     3  mpv
+17:32:51     1001      2820   14,00    2,50    0,00    0,50   16,50     2  mpv
+17:32:53     1001      2820   15,00    3,50    0,00    0,00   18,50     1  mpv
+17:32:55     1001      2820   11,50    5,50    0,00    0,00   17,00     3  mpv
+^C
+Średnia:    1001      2820   13,61    3,83    0,00    0,17   17,44     -  mpv
+
+

+ Przerywając działanie polecenia przed jego zakończeniem wyświetli + nam o ono jedną dodatkową linię zawierającą średnią poszczególnych + wartości uzyskanych podczas działania polecenia. +

+

+ Więcej przydanych opcji dla tego polecenie znajduje się na stronie + podręcznika. +

+

8.13. Informacje dodatkowe

+

+ Powodem istnienia tak szerokiej gamy różnych narzedzi do + monitowania wydajności jest możliwość użycia, nie których komponentów + na różne sposoby. Najprostszym przykładem jaki przychodzi mi teraz + na myśl jest wykorzystanie pamięci operacyjnej jako dysku. Inną + rzeczą jest, iż te zasobo są ograniczone, a takie systemy jak serwery + sieciowe wymagają stałego i intesywnego monitoringu. Dlatego jeśli + chcemy lub musimy monitorować systemy, którymi zarządzamy lub + będziemy zarządzać warto zapoznać się z poniższymi zagadnieniami. +

+
    +
  • sar (raportowanie dotyczące aktywności systemu). + Pakiet sar oferuje możliwości monitorowania systemu + podobne do programu vmstat, ale również rejestruje on + wykorzystanie zasobów w czasie. Przez co możemy sprawdzić jak + wyglądało zużycie zasobów podczas wykonywania wcześniejszych zadań. +
  • +
  • acct (ewidencja procesów). Ten pakie z kolei + zajmuje się ewidencjonowanie procesów, a nie monitorowaniem + wydajności, nie mniej jednak funkcja sprawdzenia jakie procesy + działały powiedzmy kilka dni temu może być przydatna.
  • +
  • Przydziały przy użyciu przydziałów możemy + nałożyć limity wykorzystania podstawowych zasobów (czas procesora, + pamięć operacyjna, czy przestrzeń dyskowa). Niestety jest to funkcja + systemu PAM więc podlegją im procesy uruchomione w + obrębie czegoś co z niego korzysta, na przykład powłoka logowania. +
  • +
      +

      9. Sieć

      +

      + Komputery służą do przetwarzania informacji. Informacje + wykorzystywane do obliczeń mogą pochodzić z różnych źródeł a jednym + z nich może być inny system komputerowy. Jednak, aby to miało miejsce + komputery muszą się w jakiś sposób komunikować ze sobą. W celach + w miarę swobodnej komunikacji między systemami, komputery łączy się + w sieci. Połączenie ze sobą dwóch komputerów za pomocą jednego kabla + również możemy nazwać się siecią, ponieważ mechanizmy oraz + komponenty związane z komunikacją pozozstają takie same jak dla + większej ilości komputerów. Zagadnienia łączności sieciowej zostały + w taki sposób zdefiniowane, aby były niezależne od systemu + operacyjnego, ale to systemy definiują narzędzia do ich konfiguracji. + W tym rodziale zapoznamy się z konfiguracją sieci w Linuksie. +

      +

      9.1. Podstawy sieci

      +

      + Dla łatwiejszego zrozumienia sieci, zaczniemy od zapoznania się z + nazewnictwem, niektórych jej elementów. Nasz komputer podłączony do + sieci nazywany jest hostem. Hosty często są + podłączone do sieci lokalnej określanej jako LAN. + Sieci tego typu są wszechobecne. Tego typu sieci posiadamy w naszych + domach, nie przekraczają one swoim obszarem działania + jednego budynku lub grupy pomiesczeń. Składają się one z routera + łączącego sieć internet z siecią LAN oraz (zazwyczaj) z + podłączonych do niego hostów. Definicja LAN-u nie ogranicza + się tylko do hostów podłączonych za pomocą przewodów, łączność może + zostać zapewniona tutaj bezprzewodowo nie ma na tym polu żadnych + ograniczeń. +

      +

      + Poza możliwością podłączenia sieci LAN do internetu routery + klasy SOHO (Small Office/Home Office) + posiadają wiele usług przez co konfiguracja i obsługa hosta + w sieci staje się bezobsługowa. Kilka z tych usług omówimy sobie + w kontekscie Linuksa w tym rozdziale. +

      +

      9.1.1. Pakiety

      +

      + Jeśli żądana strona internetowa ma zostać przekazana do chcącego ją + obejrzeć użytkownika, musi zostać specjalnie przygotowana do + transmisji sieciowej. Takim przygotowaniem zajmują się poszczególne + warstwy stosu TCP/IP. Dane strony + (powiedzmy kod) przechodzi z jednej warstwy do drugiej będąc + zamienianym w pakiety zrozumiałe dla tych samych + warstw po drugiej + stronie transmisji. Dane są przetwarzane przez poszczególne warstwy + stosu aż staną się możliwe do przesłania przez + fizyczny nośnik w postaci kabla miedzianego, światłowodu lub + fal radiowych. Pakiety składają się najczęsciej z danych z poprzednej + warstwy (zwanych ładunkiem) oraz dedykowanego tej + warstwie nagłówka. Przetwarzanie danych przez stos TCP/IP + nazwywane jest enkapsulacją Dwie warstwy stosu + zostaną opisane w tym rodziale. + Warstwą najwyższą zajmiemy się następnym rodziale. Natomiast warstwę + najniższą omówimy sobie w dużym uogólnieniu. +

      +

      9.1.2. Stos TCP/IP

      +

      + W stosie TCP/IP możemy wyróżnić cztery różne warstwy: +

      +
        +
      1. Warstwa aplikacji - określa sposób komunikacji + między aplikacjami. Wewnątrz tej warstwy rezydują protokoły + aplikacji wykorzystywane przez użytkowników takiej np. HTTP.
      2. +
      3. Warstwa transportowa - określa sposób transmisji + danych z warstwy aplikacji. W tej warstwie znajdują się protokoły + takie jak TCP oraz UDP. Tutaj także rezyduje pojęcie + portu. Warstwa transportowa będzie jeszcze + omawiana w tym materiale.
      4. +
      5. Warstwa internetowa - określa sposób + dostarczania pakietów z hostów źródłowych do docelowych i + odwrotnie. W tej warstwie rezyduje protokół IP oraz protokoły + odpowiedzialne za trasowanie (znalezienie jak najlepszej drogi z + jednego do drugiego hosta). W tej warstwie znajduje się również + protokół ICMP odpowiedzialny z diagnozowanie problemów z protokołem + IP.
      6. +
      7. Warstwa łącza - ta warstwa definuje topologię + logiczną sieci. Okresla ona metody transmisji danych przez użyty + w sieci nośnik fizyczny. W tej warstwie znajdują się takie + protokoły jak Ethernet oraz standard 802.11, definiujący + transmisję bezprzewodową.
      8. +
      +

      + Warto wspomnieć o tym, że w dystrybucjach Linuksa trzy z czterch + warstw znajdują się w jądrze systemu. Mogą jednak pojawić się + wyjątki, wówczas pakiet może trafic do przetworzenia w przestrzeni + użytkownika. +

      +

      9.2. Warstwa sieciowa

      +

      + Jak wiemy warstwa sieciowa definiuje sposoby dostarczenia pakietów + z jednego do drugiego hosta. Ze względu na to, iż będziemy zajmować + się sieciami internetowymi, skupimy się na jednym protokole tej + warstwy na - protokole IP. Ten protokół posiada + kilka funkcji, jednak dla nas na tym etapie najważniejsza będzie + jedna z nich - adresacja. Każdy host aby mógł + komunikować się w sieci musi mieć przypisany taki adres. Adres ten + składa się (a przynajmniej w wersji 4 protokołu IP) z czterech grup + liczb z + zakresu od 0 do 255 rozdzielonych kropkami. Na przykład adres IP + mojego komputera to: +

      +
      +192.168.8.101
      +
      +

      + Uzyskałem te informacje za pomocą poniższych poleceń. Te polecenia + są tożsame: +

      +
      +xf0r3m@immudex:~$ ip address show
      +#lub
      +xf0r3m@immudex:~$ ip a
      +
      +

      + Drugi zapis jest skrótem pierwszego polecenia. Analizując wynik + działania tego polecenia musimy zwrócić uwagę na dwie rzeczy. + Pierwszą z nich są "dziwne" nazwy intefejsów sieciowych. Jeśli nikt + nie korzystał z dystrybucji Linuksa przed 2016 rokiem to wówczas + nie mógł spotkać się z klasycznymi nazwami interfejsów sieciowych. + To jest pierwszy interfejs przewodowy = eth0 i tak dalej + do ethX. Miało to jedną podstawową wadę znaną już z + dysków. Otóż po którymś uruchomieniu ponownym system mógł wykryć + karty sieciowe w innej kolejności niż poprzednio co powodowało + problemy ze statyczną (zapisana na stałe w systemie) + konfiguracją sieciową, ponieważ adresy niezgadzały się z adresacją + podpiętej sieci. Obecnie ich nazwy są zaczerpnięte z modułów jądra, + które są wykorzystywane do ich obsługi. Nie wszystkie dystrybucje + stosują + nową nomenklaturę dla interfejsów sieciowych. W dużej mierze są to + systemy korzystające z innych programów typu init niż + systemd, choć co prawda nie jest to regułą. +

      +

      9.2.1. Adresacja IP

      +

      + Inną rzeczą jest sposób prezentowania adresów IP. W linii + rozpoczynającej się od słowa inet + znajduje się adres IP przedstawioy w ten sposób + 192.168.8.101/24. Jest to zapis w + notacji CIDR. Na zapis ten składa się adres IP + oraz maska podsieci w postacji ilości bitów. +

      +

      + Maska podsieci jest rodzajem adresu IP, który określa gdzie i jakie + liczby z zakresu możemy wpisać do adresów IP hostów. Wyzanczając tym + samym pierwszy oraz ostatni adres w sieci (początek i koniec sieci), + na podstawie maski możemy określić ilość hostów w sieci. + W jaki sposób się to dzieje? Otóż adres IP jak i maskę możemy + przedstawić w postaci binarnej. W na poprzedni przykładzie maska + wynosiła 24 bity. Co to oznacza? Aby sobie to wyjaśnić przedstawimy + adres IP w postaci binarnej. +

      +
      +192.168.8.101 = 11000000.10101000.00001000.01100101
      +
      +

      + Z adresem poszło w miarę łatwo, ponieważ znaliśmy konkretne liczby. + Jeśli policzymy wszystkie cyferki w postaci binarnej otrzymam wynik + 32 cyfr, z racji tego że są to wartości binarne bardziej mówimy o + bitach - podstawowej jednostce informacji, klasycznemu 0 oraz 1. + Adresy IP w wersji 4 (można zapisać to skrótowo IPv4) mają długość + 32-bitów. Powyżej omawiając maskę podsieci zostało wspomniane, że + maska wyznacza początek oraz koniec sieci. Adres IP możemy przyrównać + do adresów pocztowych, kolejne jego części mogą wskazywać na miasto, + ulicę, budynek oraz na mieszkanie. Adresy pocztowe zawierają + zazwyczaj stałe elementy jak nazwy miast, ulic czy numerację budynków. + Tak samo jest w przypadku adresów IP. Te stałe elementy wydzielane są + maskę podsieci. Mając maskę w postaci ilości bitów z notacji CIDR, + możemy zapisać ją w ten sposób. +

      +
      +/24 = 11111111.11111111.11111111.00000000
      +/24 = 255.255.255.0
      +
      +

      + Więc zapis maski w notacji CIDR, to nic innego jak ilość bitów o + wartości jeden (1) zapisanych od lewej w + reprezentacji binarnej adresu + IP. No dobrze, ale 32 - 24 = 8. Co zrobić z tymi 8 bitami? Otóż te + bity pozostają do dyspozycji administratora i stanowią przestrzeń + adresową. Maskę podsieci można podzieli na dwie częsci. Jedną częścią + jest część sieciowa, która wyznacza stałą część adresu IP w adresacji + hostów w sieci i ta część adresu IP jest niezmienna podczas adresacji. + Drugą częścią jest część hosta, wskazująca, która część adresu IP + będzie zawierać konkretną wartość wskazującą na hosta w sieci. Teraz + złożymy ze sobą adres IP oraz maskę zapisaną w postaci dziesiętnej + (255.255.255.0). +

      +
      +Adres IP: 192.168.8.101
      +Maska:    255.255.255.0
      +
      +

      + Poszczególne części adresu IP odzielone kropkami noszą nazwe + oktetów, ponieważ w reprezentacji binarnej każda + z częsci posiada 8 bitów. Zatem przyglądając się powyższemu + przykładowi możemy dojść do wniosku, że czwarty ostatni oktet będzie + przeznaczony na częśc hostów, i tylko on będzie się zmieniać + podczas adresacji kolejnych hostów w tej sieci. +

      +

      + Warto zaznaczyć że przy prostych sieciach, maski mogą pozostać + typowe tj. 24, 12 oraz 8 bit. Gdzie niegdzie spotykałem się + również z maską 16 bitową. Dającą dwa oktety na część przeznaczną + dla hostów. W przypadku 12-bitowej maski, nie ma już takiego + eleganckiego podziału. Część bitów z drugiego oktetu pozostanie w + części sieciowej, a druga część przejdzie do części hosta. Rozpiszmy + sobie ten przykład. Załóżmy że nasz komputer jest podłączony do + sieci 172.16.X.Y/12 i chcielibyśmy dowiedzieć się jak duża jest + ta podsieć. Za stałą możemy przyjąć, że jeśli na konkretnym oktecie + maski występuje 0, to ten sam oktet adresu IP może przyjąć wartości + od 0 do 255. +

      +
      +172.16.0.0/12
      +10101100.00010000.00000000.00000000 = 172.16.0.0
      +11111111.11110000.00000000.00000000 = /12 = 255.240.0.0
      +#Część bazowa adresu IP po usunięciu wszystkich bitów z zermi na masce:
      +10101100.0001
      +
      +10101100.00010000.00000000.00000000 = 172.16.0.0
      +1.           0000                   = 172.16
      +2.           0001                   = 172.17
      +3.           0010                   = 172.18
      +4.           0011                   = 172.19
      +5.           0100                   = 172.20
      +6.           0101                   = 172.21
      +7.           0110                   = 172.22
      +8.           0111                   = 172.23
      +9.           1000                   = 172.24
      +10.          1001                   = 172.25
      +11.          1010                   = 172.26
      +12.          1011                   = 172.27
      +13.          1100                   = 172.28
      +14.          1101                   = 172.29
      +15.          1110                   = 172.30
      +16.          1111                   = 172.31
      +10101100.00011111.00000000.00000000 = 172.31.0.0
      +(16 x 256 ^ 2) - 2 = 1048574
      +
      +

      + Myślę że powyższy przykład jasno przedstawia jak wygląda podział + klasowych sieci. A co jeśli będziemy chcieli + rozszerzyć sieci 192.168.8.0/24? Jeśli założym, że potrzebowalibyśmy + kolejne 255 adresów to wówczas wystarczy zabrać z maski 1 bit. Da to + maskę 23-bitową a my swojej sieci będziemy mogli zaadresować hosty od + 192.168.8.1 - 192.168.9.254. +

      +

      + Każdy komputer posiadający skonfigurowaną w ten sposób warstwę + internetową/sieciową może komunikować się z hostami w sieci. + Konfigurowanie warsty sieciowej, jest chyba jedyną czynnością, w + w której użytkownik będzie mieć styczność z stosem TCP/IP. Jednak + aby móc skomunikować się za pośrednictwem routera z internetem + potrzebujemy jeszcze kilku informacji. +

      +

      9.2.2. Routowanie oraz tabela routingu

      +

      + Każdy funkcjonujący w sieci system musi posiadać źródło informacji na + temat gdzie należy przesłać pakiety lub jakiego interfejsu do tego + celu należy użyć. Czynność ustalenia optymalnej trasy dla pakietu + nazywa się routowaniem, natomiast informacje na + temat jakie sieci są osiągalne i przez jakie interfejsy znajduje się + w tabeli routingu. W systemie, który nie jest + jakmiś routerem, tabela routingu będzie zawierać prawdopodobnie + tylko dwa wpisy. Na poniższym przykładzie widnieje zrzut tabeli + routingu z mojego komputera. +

      +
      +default via 192.168.8.1 dev enp0s31f6 onlink
      +192.168.8.0/24 dev enp0s31f6 proto kernel scope link src 192.168.8.154
      +
      +

      + Pierwsza linia zawiera definicję bramy domyślnej, + którą zajmiemy się za chwilę. Natomiast druga linia wskazuje jaka + sieć jest osiągalna przez jaki interfejs w tym przypadku sieć + 192.168.8.0/24 jest dostępną przez + interfejs enp0s31f6. +

      +

      + W systemach, które łączą ze sobą sieci (routerach) wpisów + w tabeli routingu takich jak druga linia może być znacznie + więcej. Możemym sobie wówczas zadać pytanie na jakiej podstawie + jądro wybiera właściwy port. Otóż jądro przy wyborze będzie bazować + na dwóch czynnikach. Pierwszy z nich jest oczywisty i chodzi tu + adres częsci sieciowej adresu IP, musi on pasować do adresu sieci + inaczej ma się rzecz jeśli jedna z sieci jest na tyle duża, że + obejmuje swoim zakresem także adresacje innej sieci. Tutaj wówczas + pojawia się drugi czynnik, którym jest długość maski/części sieciowe. + Czasami nazywanej także prefiksem. Jeśli przy + którymś z wpisów adresy sieci zachodzą na siebie, to wówczas dłuższy + prefiks (a co za tym idzie, mniejsza sieć) jest wybierana jako + trasa dla pakietu. +

      +

      9.2.3. Brama domyślna

      +

      + Omawiając tablę routingu wspomnieliśmy o bramie domyślnej. + Brama domyślna jest rodzajem wpisu we wspomnianej tabeli a jej + zadaniem jest przechowywanie domyślniej trasy, która wybierana jest + jeśli żadna inna nie jest odpowiednia. Wynika to z faktu jak jądro + wybiera właściwe dla pakietów trasy oraz adresu jaki kryje się za + słowem default a jest nim + 0.0.0.0/0. Oznacza on wszystkie hosty w adresacji + IPv4. Co daje najmniejszy możliwy prefiks, dlatego też jeśli komputer + nie posiada właściwej dla pakietu trasy to jest ona przekzywana + do adresu przez który taka sieć jest osiągalna. +

      +

      + Tym adresem jest przeważnie adres routera, który łączy + sieć LAN z inną siecią np. siecią usługodawcy internetowego. + Zwyczajowo takie urządzenia zwykło się nazywać routerami, + mimo ich możliwość to najczęściej wykorzystywaną funkcjonalnością + jest automatyczna konfiguracja hostów (protokół DHCP, będzie o nim + w tym rozdziale), pamięć podręczna i przekazywanie zapytań systemu + DNS (o systemie DNS, też będzie tutaj) oraz translacja adresów + (o adresach prywatnych oraz translacji adresów też sobie wspomnimy) + oraz przekazywanie pakietów dalej do jednego z routerów usługodawcy, + więc równie dobrze urządzenia tego typu można nazwać bramkami. +

      +

      9.3. Adres IPv6

      +

      + Adres IPv4 posiada długość 32 bitów, co daje nam możliwość + zaadresowania 4,3 miliarda hostów w Internecie. Co jest o wiele + mniejszym wynikem niż ilość ludzi na świecie, biorąc pod uwagę + rozwój przedsiębiorstw oraz samego internetu wymaga od organizacji + czuwających nad jego standaryzacją rozwiązań, które są w stanie + sprostać wymaganiom czasów obecnych oraz przyszłości. Jedym z takich + rozwiązań są prace na rozwojem oraz wdrożeniem nowego standardu + jakim protokół IP w wersji 6. +

      +

      + Adres IP w wersji 6, ma długość 128-bitów, co czyni go 4 razy + dłuższym od adresu IPv4. Adres ten nie przypomina adresu z + poprzedniej wersji. Zamiast cyfr dziesiętnych użytko cyfr systemu + heksadecymalnego, a kropki zastąponio dwukropkami. Poniżej znajduje + się adres IPv6 komputera na którym pisze ten tekst. +

      +
      +fe80::921b:eff:fe6a:717d/64
      +
      +

      + Cyfry heksadecymalne są reprezentowane przez znaki: 0-9 oraz a-f. + Każda grupa cyfr jest odzielona dwukropkiem, a każda z nich posiada + po 4 znaki. Jeśli zero jest napoczątku grupy, to można je pominąć, + jeszcze inną zależność jak możemy zauważyć jest to, jeśli grupa + składa się z samych zero to można ją pominąć, wówczas w zapisie + adresu widnieją dwa dwukropki obok siebie. Nie tyczy się to tylko + jednej grupy, ale jeśli grupy zer następują po sobie to rownież + można je pomniąć. Zapis natomiast nie ulegnie zmianie, jesli będzie + więcej niż jedna grupa zer do pominięcia. +

      +

      + Jak możemy zauważyć adresy IPv6 również możemy zapisać w notacji + CIDR. Tutaj maska wynosi 64-bit, co oznacza ze połowa adresu zajmuje + prefiks. Natomiast druga połowa jest już częścią hosta. +

      +

      + Adresy IPv6 możemym podzielić na globalne, która mogą być osiągalne + z internetu lub lokalne, które są przypisywane automatycznie przez + systemy z obsługą IPv6. Każdy z tych typów posiada swój prefix i dla + adresów globalnych (znanych także jako globalny adres hosta) prefix + wynosi 2000::/3, przez co globalny adres hosta zaczyna się + od 2 lub od 3 (ze zwględu na prefix, 3 pierwsze bity pierwszej cyfry + są stałe (001), a zatem do dyspozycji mamym tylko jeden bit, którego + zmiana nie dam nam innych wartości jak 2 lub 3). Pozostałe zera służa + jako dopełnienie do zapisu. Z kolei prefiksem dla adresów lokalnych + jest fe80::/10. W przypadku adresu łącza lokalnego resztę + częsci sieciowej adresu wypełniają 54-bity zer. Na podstawie + przedstawionych tutaj prefiksów możemy ustalić z jakiego rodzaju + adresem mamy doczynienia. +

      +

      9.3.1. Wyświetletnie adresów IPv6

      +

      + Do wyświetlenia adresów IPv6 może posłużyć nam to samo polecenie, + z którego korzystaliśmy do wyświetlenia adres IP w wersji 4. + Mianowicie polecenie ip, po za + samymi podpoleceniami tego polecenia dla adresów IPv6 podaje się + także opcję -6. +

      +
      +$ ip -6 addr show
      +
      +

      + Podobnie rzecz ma się adresami IP tras, tutaj wykorzystuje się + tę samą opcją natomiast inne podpolecenia. +

      +
      +$ ip -6 route show
      +
      +

      9.4. Podstawowe narzędzia ICMP oraz DNS

      +

      + W tym podrozdziale omówimy sobie podstawowe narzędzia wykorzystywane + przy połączeniach sieciowych. Służą one do ustalania + adresów IP oraz sprawdzania dostępności hosta. +

      +

      9.4.1. Narzędzie ping

      +

      + Protokół ICMP jest protokołem diagostycznym dla protokołu IP. Do jego + podstawowych zadań należy sprawdzenie dostępności hosta w sieci. Do + tego celu wykorzystujemy narzędzie ping. To + niepozorne narzędzie wysyła specjalny pakiet z żądaniem odesłania + pakietu z odpowiedzią. W przypadku tego narzędzia istotna jest + sama odpowiedź ale poza nią zwracanych jest kilka statystyk, które + pozwolają na przykład na określenie jakość połączenia oraz czasem + stanu samej sieci (gdy odpowiedzi z bramy domyślnej przychodzą po + ok. 1 sekundzie). +

      +
      +xf0r3m@immudex:~$ ping wp.pl
      +PING wp.pl (212.77.98.9) 56(84) bytes of data.
      +64 bytes from www.wp.pl (212.77.98.9): icmp_seq=1 ttl=54 time=11.2 ms
      +64 bytes from www.wp.pl (212.77.98.9): icmp_seq=2 ttl=54 time=11.0 ms
      +64 bytes from www.wp.pl (212.77.98.9): icmp_seq=3 ttl=54 time=14.1 ms
      +^C
      +--- wp.pl ping statistics ---
      +3 packets transmitted, 3 received, 0% packet loss, time 2001ms
      +rtt min/avg/max/mdev = 11.049/12.096/14.062/1.391 ms
      +
      +

      + Na 56-bajtowe żądanie echa wysłane z naszego komputera + host docelowy odpowiada 64-bajtowym pakietem. Jego zawartość nie + jest istotna. Dla nas ważne są pola + icmp_seq oraz + time, gdyż swiadczą on one jakości + połączenia pomiędzy naszym komputerem, a hostem docelowym. + icmp_seq wskazuje kolejności + otrzymywanych odpowiedzi. Jeśli jakiegoś pakietu brakuje, oznacza to + że został on zgubiony podczas transmisji. Zagubione pakiety + zdarzają się gdy korzystamy z połączenia bezprzewodowego przy słabym + zasięgu. Drugim ważnym polem jest czas wyrażony w kolumnie + time. Czas poniżej 30 ms oznacza + że mamy bardzo dobre połącznie z hostem. Czas w sieci lokalnej + oscyluje poniżej 1 ms. Natomiast jeśli jest powyżej jednej sekundy + (1000 ms) lub w jej granicach oznacza, że gdzieś w sieci może + znajdować się problem. Polecenie ping w dystrybucjach + Linuksa ale i ogólnie w implementacji Uniksowej działa do momentu, + aż nie przerwiemy mu działania. Na sam koniec zostanie wyświetlona + statystyka zawierająca informacje o tym ile pakietów zostało + wysłanych ile zostało odebranych, jaki procent pakietów został + utracony. W drugiej linii podsumowania znajduje się podstawowe + statystki związane z odpowiedzia na żądania. +

      +

      + Ze względów bezpieczeństwa nie wszystkie hosty (z właszcza w + internecie są w stanie odpowiedzieć na żądania narzędzia + ping. Pakiety mogą zostać do nich wysłane, ale jest wielce + prawdopodobne, że zostaną zablokowane po drodze. Takie zachowanie + jest przecidziałaniem przeciwko atakowi odmowy usługi, który opiera + się na przesłaniu wielu żądań (echo request, typ pakietu + nazywa się właśnie w ten sposób), tak aby host nie był w stanie + obsłużyć żadnego innego połączenia sieciowego. +

      +

      + Istnieje możliwość wykorzystania pakietów echo request + zarówno z protokołu IPv4 oraz IPv6. Wówczas należy + wskazać to za pomocą opcji -4 lub -6 w poleceniu + ping. +

      +

      9.4.3. Narzędzie host

      +

      + Narzędzie host jest najprostszym sposobem na + skorzystanie z systemu DNS. +

      +

      + System DNS pozwala on zapamiętać ludziom typowy adres strony, bez + potrzeby znajomości jej adresu IP, aby zrealizować to połączenie. + Jeśli wpiszemy adres strony do przeglądarki, zapyta ona system DNS o + jej adres IP i ten udzieli jej takiej odpowiedzi. Oczywiście w + skrócie rzecz ujmując. Czasami możemy znaleźć się w odwrotnej + sytuacji, kiedy będziemy znać adres IP, a chcielibyśmy się + dowiedzieć do jakiej organizacji jest on przypisany. Jednak ta + funkcjonalność nie jest kluczowa i rzadko bywa dobrze skonfigurowana, + nie mniej jednak warto spróbować. +

      +

      + Aby skorzystać z narzędzia host, podajemy nazwę lub adres + IP jako argument polecenia. +

      +
      +xf0r3m@immudex:~$ host morketsmerke.org
      +morketsmerke.org has address 213.186.33.5
      +morketsmerke.org mail is handled by 10 mx3.mail.ovh.net.
      +morketsmerke.org mail is handled by 1 mx4.mail.ovh.net.
      +
      +xf0r3m@immudex:~$ host 93.184.216.34
      +Host 34.216.184.93.in-addr.arpa. not found: 3(NXDOMAIN)
      +
      +xf0r3m@immudex:~$ host 213.186.33.5
      +5.33.186.213.in-addr.arpa domain name pointer redirect.ovh.net.
      +
      +

      + Na powyższym przykładzie widzimy trzy wywołania polecenia + host jedno z nich klasyczne + pytające o adres IP i dwa pytające o nazwę domenową, zwróćmy uwagę + na to w jaki sposób zostały zapisane adresy IP. Nie będę tutaj + przytaczać więcej informacji o sposobie działania systemu DNS, gdyż + wykraczają one poza ramy tego materiału. Do systemu DNS wrócimy + podczas konfiguracji interfejsu hosta. +

      +

      9.5. Warstwa fizyczna

      +

      + Wiemy, że sieć internetowa oparta jest o oprogramowanie. Nie miej + jednak gdzieś zagadnienia sieciowe muszą stykać się ze swiatem + realnym, z tym że komputery koniec, końców są ze sobą połączone + za pomocą specjalnych przewodów oraz z lub bez pośrednictwa + dodatkowych urządzeń. Tymi elementami zajmuje się warstwa + fizyczna. Standardów implementacji warstwy fizycznej (tego w jaki + sposób informacje przesyłane są przez media (przewody lub fale + radiowe)) jest wiele, jednak wykorzystywaną po dzień dzisiejszy oraz + najpowszechniejszą z nich jest Ethernet. Sprzęt + sieciowy, mimo tej samej implementacji będzie różnić się od siebie + ze względu na użyte medium transmisji, ale mają one wiele cech + wspólnych. Oto kilka z nich: +

      +
        +
      • Element identyfikującym w sieciach Ethernet jest + adres sprzetowy znany także jako adres MAC. Adresy + MAC są niezależne od adresów progrmowych i aby transmisja w sieci + Ethernet doszła do skutku to musi on być unikatowy w + obrębie sieci lokalnej (i zazwyczaj tak jest, w sieci lokalnej, + jednak w sieciach rozległych, już może tak nie być. Obecnie + losowy MAC adres interfejsu sieciowego może być stosowany + aby podnieść poziom prywatności w sieciah publicznych + (ogólnodostępne sieci bezprzewodowe)). Adres sprzętowy składa się + z 6 grup po 2 cyfry systemu heksadecymalnego oddzielonego + dwukropkami. Całość ma łącznie 48-bitów.
      • +
      • W sieciach Ethernet dane wysłane są w ramkach. Ramki są + opatrzone adresami MAC hostów biorących udział w wymianie + danych
      • +
      +

      + Host mając nawet dwa interfejsy sieciowe podłączone do różnych + sieci Ethernet nie może przekazać pakietu z jednej do + drugiej sieci, chyba skonfigurowano na nim most. Więc jeśli dane + mają zostać wysłane do internetu, potrzebny jest udział warstw + wyższych, albowiem każda sieć fizyczna jest podsiecią sieci + warstwy wyższej, zatem router może odebrać ramkę, wyodrębnić jej + dane a następnie przepakować do nowej ramki i wysłać dalej + w świat. +

      +

      9.6. Sieciowe interfejsy jądra

      +

      + Jądro samodzielnie odróżnia warstwę fizyczną od sieciowej, przez co + musi zapewniać im standard w komunikacji. Czymś takim właśnie jest + interfejs sieciowy. W trakcie jego konfiguracji + przypisane parametry warstwy internetowej są łączone z parametrami + urządzenia. Nazwy interfejsów opierają się o rodzaj sprzętu na którym + bazują. Np. enp0s4, oznacza zazwyczaj kartę sieciową + podłączoną do magistrali PCI. Nazwy tego typu są określane + nazwami przewidywalnymi i nie zmieniają się one ponownym uruchomieniu + systemu. Jest to jednak prowadzone głównie program typu init + - systemd. Aby wyświetlić interfejsy wydajemy polecenie: +

      +
      +xf0r3m@immudex:~$ ip a
      +1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
      +    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      +    inet 127.0.0.1/8 scope host lo
      +       valid_lft forever preferred_lft forever
      +    inet6 ::1/128 scope host
      +       valid_lft forever preferred_lft forever
      +2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
      +    link/ether 90:1b:0e:6a:71:7d brd ff:ff:ff:ff:ff:ff
      +    inet 172.16.1.2/16 brd 172.16.255.255 scope global enp4s0
      +       valid_lft forever preferred_lft forever
      +    inet6 fe80::921b:eff:fe6a:717d/64 scope link
      +       valid_lft forever preferred_lft forever
      +3: enp0s25: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
      +    link/ether 90:1b:0e:87:3c:43 brd ff:ff:ff:ff:ff:ff
      +
      +

      + Polecenie ip a, jest poleceniem + skrótowym dla polecenia ip address show. + Interfejsy sieciowe są numerowane kolejno do numeru 2, numer 1 + zarezerowany jest dla specjalnego interfejsu systemowego - zwanego + pętlą zwrotną. Każdy działający interfejs w linii z numerem oraz + nazwą posiada flagę UP. Poza + informacjami warstwy sieciowej możmy również zauważyć informacje z + warstwy fizycznej takie jak adres MAC. Polecenie + ip a, głównie skupia się na warstwie + sieciowej. Jeśli chcielibyś poznać więcej szczegółów związanych z + warstwą fizyczną, wówczas należało by użyć polecenia takiego jak + ethtool. +

      +

      9.7. Konfiguracja interfejsu sieciowego

      +

      + Do tej pory omawialiśmy kwestie sieciowe wyłącznie teoretycznie, a to + przeanalizowaliśmy sobie wynik jednego czy drugiego polecenia, ale + teraz zajmiemy konfiguracją interfejsu sieciowego. Aby użytkownik + dowolnej dystrybucji mógł połączyć się z internetem musimy wykonać + cztery poniższe czynności: +

      +
        +
      1. Zapewnienie obecności sterownika karty sieciowej w jądrze. Jeśli + sterownika będzie brakować, to nawet nieskonfigurowany interfejs + nie zostanie wyświetlony po wydaniu polecenia ip a.
      2. +
      3. Dodatkowa konfiguracja warstwy fizycznej, na przykład poprzez + podanie nazwy sieci oraz hasła (głównie sieci bezprzewodowe).
      4. +
      5. Ustawienie dla interfejsu adresu IP oraz maski podsieci (dzięki + temu warstwy będą mogły się ze sobą komunikować).
      6. +
      7. Ustawienie wszystkich wymaganych tras w tym trasy domyślnej.
      8. +
      +

      + Wiedząc teraz co musimy zrobić. Przejdziemy do wykonania tych + czynności w systemie. +

      +

      9.7.1. Ręczna konfiguracja interfejsu

      +

      + Reczna konfiguracja interfejsów sieciowych rzadko jest wymagana, chyba + eksperymentujemy z systemem lub próbujemy skonfigurować urządzenie, + które samo nam interfejsu nie skonfiguruje. Nie mniej jednak, a + własnego doświadczenia wiem, że warto posiadać taką wiedzę. Więc tak + załóżmy, że posiadamy sterowniki do karty sieciowej (interfejsu), którą + chcemy skonfigurować oraz łączymy się z siecią Ethernet za + pomocą kabla miedzianego, dlatego też punkt nr. 2 też możemy pominąć. + Jeśli tak rzeczywiście jest to wówczas konfiguracja interfejsu + sprowadza się do dwóch poleceń. +

      +

      + Aby skonfigurować ręcznie interfejs musimy musimy użyć polecenia + ip wraz z podpoleceniem address lub + addr, następnie podać komendę add po niej adres IP + wraz z maską w notacji CIDR do tego opcję dev po której + należy wskazać nazwę interfejsu jaki chcemy skonfigurować. +

      +
      +xf0r3m@immudex:~$ sudo ip address add 172.16.1.1/16 dev enp4s0
      +
      +

      + Wykorzystując powyższe polecenie mamy pierwszą część za sobą. + Pamiętajmy jednak aby zmienić dane. +

      +

      + Drugą czynnością jest dodanie tras. Do połączenia z internetem + potrzebna będzie na pewno brama domyślna. Jeśli będziemy potrzebować + dodatkowych tras wystarczy zmodyfikować poniższe polecenie: +

      +
      +xf0r3m@immudex:~$ sudo ip route add default via 172.16.0.1 dev enp4s0
      +
      +

      + Za trasy odpowiada podpolecenie route, + komenda add odpowiada za dodawanie + tras. Następnie podawana jest sieć jaka ma być osiągalna. Po opcji + via podawny jest adres IP na jaki + mają być kierowane pakiety do docelowej sieci, tym adresem może być + adres routera sieci lokalnej lub nawet jeden z interfejsów + zainstalowanych na tym samym komputerze, na koniec po opcji + dev podajemy interfejs, przez który + adres IP podany po opcji via jest + osiągalny. +

      +

      + Jeśli trasa jest nam nie potrzebna lub pomyliliśmy się podczas jej + dodawnia, to taką trasę bez obaw można usunać, przy użyciu komendy + del podpolecenia route. Komenda przyjmuje adres + sieci jako argument. +

      +
      +xf0r3m@immudex:~$ sudo ip route del 192.168.60.0/24
      +
      +

      9.8. Konfiguracja interfejsów sieciowych podczas rozruchu

      +

      + Próba konfiguracji interfejsu podczas rozruchu mogła by wyglądać w + taki sposób, że gdzieś podczas sekwencji rozruchowej program typu + init (lub jeden z jego skryptów) mógłby wydać polecenia + ip (takie jak te, które wkorzystywaliśmy do ręcznej + konfiguracji) lub + innego narzędzia. Pytanie tylko jakiego? A odpowiedzi tyle co + wiodących dystrybucji. +

      +

      + Do tej pory próbowano ustandaryzować ten proces za pomocą poleceń + ifup oraz ifdown. Z niezbyt zadawalającym skutkiem + ze względu na różne implementacje tych narzędzi przez osoby + zajmujące się rozwojem dystrybucji, czego następstwem są różnice w + plikach konfiguracyjnych. Kolejną problematyczną rzeczą jest fakt + iż wiele elementów sieciowych wykorzystywanych do konfiguracji + znajduje się różnych miescach w systemie i odpowiadają za nie inne + komponenty. W Linuksie panuje również zasada aby nie rozpowszechniać + plików konfiguracyjnych w przypadku wielu osobnych narzędzi czy + bibliotek, ponieważ zmiany wprowadzone w jednym narzędziu mogą + spowodować, że inne przestaną działać. +

      +

      + Więc tak chcąc skonfigurować interfejsy sieciowe podczas rozruchu + musimy skorzystać z jednego z dostępnych managerów lub dostępnego w + systemie kompnentu. W Debianie, interfejsy sieciowe są zarządzane + przez dodatek ifupdown, którego składową jest plik + /etc/network/interfaces. Na Ubuntu system Netplan, + od najnowszysch wersji dystrybucji opartych o Red Hat, korzysta się + głównie z managerów. Natomiast managerem godnym uwagi jest + NetworkManager i to na nim się skupimy podczas ich + omawiania. Aby ten podrozdział wniósł coś pożytecznego poza kilkoma + teoretycznymi dywagacjami omówimy sobie konfigurację interfejsów na + przykładzie dystrybucji Debian. +

      +
      +source /etc/network/interfaces.d/*
      +
      +# The loopback network interface
      +auto lo
      +iface lo inet loopback
      +
      +# The primary network interface
      +auto enp4s0
      +iface enp4s0 inet static
      +        address 172.16.1.2
      +        netmask 255.255.0.0
      +        gateway 172.16.0.1
      +        dns-nameservers 172.16.0.1
      +
      +

      + Na powyższym przykładzie mamy dwie deklaracje interfejsów sieciowych. + Pierwszym z nich jest interfejs pętli zwrotnej. Jego rola w systemie + jeszcze zostanie omówiona. Nie miej jednak jego deklaracja zawiera + słowo auto, która powoduje załączenie + interfejsu podczas startu systemu. Po linii ze słowem auto następuje + definicja interfejsu (linia ze słowem + iface) w niej podawana jest nazwa + interfejsu (enp4s0), stos protokółów + (inet, co oznacza IPv4. Mogą być też + inne). Następnie podawana jest metoda konfiguracji interfejsu. + Najczęściej wykorzystywanymi są static + oraz dhcp, w przypadku pętli zwrotnej w tym miejscu + używane jest słowo loopback. W + przypadku drugiego (właściwego) interfejsu adres przypisywany będzie + statycznie. To tak samo jakbyśmy przypisywali go ręcznie, jest to + czynność automatyczna wykonywana podczas rozruchu. Po uruchomieniu + ponownym komputera interfejs powinien zostać automatycznie podniesiony + (załączony) i skonfigurowany przy użyciu podanych w pliku parametrów. +

      +

      + Obecnie systemy służą użytkownikom końcowym, którzy zapewne mają + uprawnienia administratora, ale nie posiadają odpowiedniej wiedzy aby + móc konfigurować odpowiednie warstwy. Proste rozwiązania, takie jak + to opisane powyżej daje oczywiście taką mozliwośc, jednak nie jest + ono zbyt przystępne dla użytkownika, dlatego też w dystrybucjach takich + Red Hat, stosowane są managery, których zadaniem jest ułatwienie + konfiguracji. +

      +

      9.9. Menedżery konfiguracji sieciowe

      +

      + Dla dystrybucji Linuksa dostępnych jest wiele programów będących + menedżerami konfiguracji sieciowe. Część z nich przeznaczona jest na + systemy wbudowane. Dlatego godnymi uwagi pozostają tylko dwa. Jeden + będący częścią programu typu init systemd-networkd + nadaje się on wykonania podstawowej konfiguracji sieciowej. Jest + wystarczający dla serwerów, ale nie dla użytkonika końcowego. Wówczas + pozostaje jeden - NetworkManager i to na nim się + skupimy. +

      +

      + NetworkManager jest demonem takim samym jak pozostałe + więc jego zadaniem jest nasłuchiwanie zdarzeń generowanych zarówno + przez system jak i przez samych użytkowników, dodatkowo + NetworkManager zajmuje się konfiguracją sieciową zgodnie z + założonymi regułami. Program ten operuje na informacjach + o dostępnych urządzenia uzyskanch od jądra oraz na + połączeniach, które są wskazaniem konkretnych urządzeń + wraz z parametrami warstw sieciowych. Konfigurując sieć w danej + dystrybucji, NetworkManager korzysta z określonego dodatku + aby dostosować konfigurację do standardu używanego przez dystrybucję, + nie narzucacjąc przy tym swoich rozwiązań. +

      +

      + W momencie uruchomienia NetworkManager, zbiera informacje o + dostępnych urządzeniach sieciowych, sprawdza listę połączeń i + podejmuje decyzję o próbie połączenia. Proces decyzyjny na podstawie, + którego menedżer decyduje, z którą z sieci chce się połączyć można + rozpisać w trzech krokach. +

      +
        +
      1. Jeśli dostępne jest połaczenie kablowe. To ono jest preferowane + jako pierwsze.
      2. +
      3. Jeśli połączenie kablowe nie jest dostępne, wówczas jeśli w + systemie dostępny jest interfejs bezprzewodowy to skanowane jest + otoczenie podzwględem występowania sieci bezprzewodowych. Jesli + dostępne są sieci, z którymi system już kiedyś nawiązał połączenia. + To jest ono nawiązywane ponownie. Jeśli nie to dostępna jest lista + sieci bezprzewodowych osiągalnych na danym terenie.
      4. +
      5. Jeśli dostępne są więcej niż dwie sieci, z którymi już wcześniej + nawiązywano połączenie to wówczas wybierana jest, + z którą łączono się jako z ostatnią.
      6. +
      +

      + Połączenie sieciowe zwłaszacza wśród sieci bezprzewodowych utrzymywane + jest do momentu uzyskanie połączenia o lepszych parametrach. Na + przykład, po przez wpięcie kabla. +

      +

      9.9.1. Interakcja z Network Manager

      +

      + Kontrolować NetworkManager możemy za pomocą apletu, + przygotowanego dla środowiska graficznego. Jednak w tym materiale + skupiamy się wyłącznie na rozwiązaniach opartych o wiersz polecenia. + Więc przejdziemy od razu do tego typu interakcji z tym narzędziem. + Do kontrolowania NetworkManager z poziomu powłoki, służy + narzędzie nmcli. Za pomocą podpoleceń tego narzędzia możemy + kontrolować połączenia sieciowe zarządzane przez omawiany menedżer. +

      +

      + Innym narzędziem związanym z NetworkManager-em, jest polecenie + nm-online, które zwraca jedynie infomacje w zależności + od tego czy posiadamy aktywne połączenie czy też nie. +

      +

      + Poniżej znajduje się przykładowe uruchomienie, nmcli bez + żadnych podpoleceń. +

      +
      +
      +

      + Polecenie to agreguje informacje zwracane przez wiele poznanych do + tej pory poleceń, takich jak ip addr lub ip route show. + Dodatkowo wyświetlane są informacje o konfiguracji systemu DNS. +

      +

      + Dla przykładu możemy utworzyć ręczną konfigurację dla interfejsu tym + razem wykorzystując do tego NetworkManager. +

      +

      +xf0r3m@immudex:~$ sudo nmcli con add con-name my-connection ifname enp4s0 \
      +type ethernet ipv4 192.168.8.150/24 gw4 192.168.8.1
      +
      +

      + Efekt działania tego polecenia możemy sprawdzić za pomocą polecenia + ip a lub za pomocą nmcli +

      +
      +xf0r3m@immudex:~$ ip a
      +
      +xf0r3m@immudex:~$ nmcli -p con show my-connection
      +
      +

      + Opcja -p formatuje wynik polecenia, + aby był on bardziej czytelny dla człowieka. Więcej przykładowych + poleceń wraz z opisami znajduje się na stronie podręcznika: + man 7 nmcli-examples. NetworkManager to naprawdę + rozbudowane narzędzie więc warto mieć z tyłu głowy to polecenie, + chociażby dlatego, że znajduje się tam opis sposobu łączność z siecią + bezprzewodową z poziomu wiersza poleceń. Sposób dużo bardziej + przystępny niż samodzielne skanowanie i obcowanie z pakietem + wpa_supplicant, gdzie często demon tego narzędzia może być + już użwany przez jeden z komponentów systemu. +

      +

      9.9.2. Konfiguracja NetworkManager

      +

      + Konfiguracja NetworkManagera wymaga edycji pliku + /etc/NetworkManager/NetworkManager.conf. Plik jest formatu + XDG lub wśród osób zaznajomionych z systemami od Microsoftu + formatu .ini. Rzadko będzie potrzeba zmiany czego kolwiek w + tym pliku. Nie mniej jednak jest jedna funkcją warta omówienia związana + z konfiguracją tego menedżera - wyłączenie zarządania interfejsu + przez NetworkManager. Interfejs pętli zwrotnej jest izolowany + od tego narzędzia i jeśli uznamy, że inny/inne interfejsy w systemie + też powinny to możemy zadeklarować w tym pliku. W sekcji + [keyfile] (jeśli nie ma takowej, to należy dopisać). Plik + ma format XDG, więc opcje zapisywane są w postaci + klucz=wartość. Tak więc do klucza unmanaged-devices + przypisujemy adres MAC interfejsów, które mają być wyłączone z spod + zarządzania przez NetworkManager w taki sposób jak przedstawio + to poniżej. +

      +...
      +[keyfile]
      +unmanaged-devices=mac:08:00:27:3d:1b:9c
      +
      +

      +

      + Inną kwestią związaną z konfiguracją omawianego w tym rodziale + menedżera jest propagacja informacji o zmianie status interfejsu + sieciowego. Niektóre demony do swojego poprawnego działania muszą + otrzymać takową informację o tego typu sytuacji, aby zakończyć lub + rozpocząć nasłuchiwanie na danym interfejsie. NetworkManager + realizuje to za pomoca sieciowych skrytów sterujących + znajdujących się w katalogu /etc/NetworkManager/dispatcher.d. + Jeśli status interfejsu sieciowego ulegnie zmianie menedżer uruchomi + wszystko co zostało umieszczone w powyższym katalogu z odpowiednim + dla stanu interfejsu (up lub down). Na przykład + w dystrybucjach opartych na Debianie (w tym i Ubuntu) istnieje plik + 01-ifupdown, który na podstawie otrzymanego komunikatu + zdrzenia (jeśli przyjrzeć się plikowi, to dowiemy się że to nie tylko + up oraz down) uruchomi wszystko znajduje się w + odpowiednich podkatalogach w katalogu /etc/network. +

      +

      + Dla nas zarówno konfiguracja NetworkManager może być mało + istotna, podobnie jest ze skryptami rozsyłającymi. Nie mniej jednak + może się kiedyś zdarzyć, że będzię potrzeba zmiany czegoś w skrypcie + tego typu lub wyłączenie interfejsu z menedżera. +

      +

      9.10. Rozwiazywanie nazw hostów.

      +

      + Jeśli chcemy nawiązać jakie kolwiek połączenie sieciowe musimy podać + adres komputera, z którym chcemy to połączenie nawiązać. Ludzie + rzadko posługują się adresami IP, chyba że są to specjaliści lub + entuzajści nauk komputerowych i pracują oni w lokalnych środowiskach. + Takie adresy trudno zapamiętąć, więc niezbędne jest zapewnienie + systemu/usługi, która zmieni adresu domenowe + (np. morketsmerke.org) na adres IP. Z systemem DNS mieliśmy + już + styczność, w momencie gdy omawialiśmy protokół ICMP. Konfiguracja + adresów systemu DNS jest tak naprawdę czwartą ostatnią wartością + konfigurowaną na interfejsie sieciowym, aby mógł on nawiązać + połączenie z internetem. Jest to o tyle ciekawe, że system DNS należy + do warstwy aplikacji. Większość aplikacji sieciowych w Linuksie ma + możliwość odpytania systemu DNS o adres IP, dlatego możemy zarówno + użyć adresów IP lub nazw domenowych (chyba, że wyszczególniono inaczej). + Uzyskiwania takiego adresu od DNS zwykle przebiega w następujący sposób: +

      +
        +
      1. Przy uzyciu systemowej biblioteki współużytkowanej aplikacja + wywołuje funkcję wyszukiwania adresu IP.
      2. +
      3. Określa się kolejność odpytywania źródeł na podstawie danych + zapisanych w pliku /etc/nsswitch.conf. Jedną z takowych + reguł może być wymuszenie kolejności odpytania na początku pliku + /etc/hosts jeszcze przed odpytaniem systemu DNS.
      4. +
      5. Jeśli funkcja jednak zdecyduje o skorzystaniu z systemu DNS, musi + użyć zawartości pliku konfiguracyjnego, w którym zawarte są adres + serwerów systemu DNS.
      6. +
      7. Funkcja wysyła zapytanie z adresem domenowym serwera, prosząc o + jego adres IP.
      8. +
      9. Serwer DNS odsyła do funkcji adres IP serwera, który zwracany + jest do aplikacji.
      10. +
      +

      + Często występującym scenariuszem jest to, że serwer systemu DNS nie + zna adresu IP serwera, o który prosimy, wówczas serwer, do którego + skierowaliśmy to zapytanie musi zapytać się innych serwerów. + DNS ma budowę hierarchiczną, a cała hierarchia jest zapisana w + adresie domenowym. Szerszy opis systemu DNS wykracza poza ramy + meryteoryczne tego materiału. +

      +

      9.10.1. Pliki biorące udział w działaniu systemu DNS

      +

      + Jak możemy wywnioskować z wyżej wymienionych czynności system DNS + nawet w roli klienta potrzebuje korzysta z dużej ilości plików. + Pierwszym z nich jest /etc/nssswitch.conf. Ten plik + nie jest związany stricte z systemem DNS, ale ze wszystkim + co jest związane z nazwami w systemie. Jest to klasyczny interfejs + określający pierwszeństwo w źródłach rozwiązywania nazw. Jeśli + przeanalizujemy sobie zawartość tego pliku, możemy zauważyć + skąd i na jakiej podstawie, niektóre z narzędzi czerpią wiedzę + taką jak + informacje o użytkownikach, usługach czy innych rodzajach sieci niż + IP. Jednak na tym etapie interesuje nas wyłącznie linia + rozpoczynająca się od hosts. Wskazuje ona pierwszeństwo + pliku /etc/hosts nad system DNS, przez co korzystając z dystrybucji + możemy dowolnie manipulować rozwiązywaniem nazw. Jest to szczególnie + przydane podczas administracji i testowania usług, które później + będziemy chcieli użyć. +

      +

      + Kolejnym plikiem jest wspomaniany już wcześniej /etc/hosts. + Plik ten zawiera zestawienie adresów IP wraz z nazwami domenowymi. + Kiedyś kiedy hosty w internecie można było policzyć na palcach obu + rąk służył za centralną bazę danych odnosnie odwzrowania nazw. Był + on swojego czasu protoplastą systemu DNS. Jednak ze względu na + bum rozwoju internetu, zaprzestano korzystania z tej + praktyki. Jednak obecnie wciąż można spotkać go w roli lokalnej bazy + rekordów DNS w sieciach, gdzie centralnym urządzeniem (router/bramka + core'owy) jest urządzenie oparte na jakimś uniksie. +

      +

      + Ostatnim plikiem jest /etc/resolv.conf. Zawartość tego + pliku, ma + wpływ na to z jakiego źródła systemu DNS korzysta nasz system. Otóż + w tym pliku przechowywane są zazwyczaj dwie wartości pierwszą z nich + są adresy serwerów systemu DNS, a drugim sufiks nazwy domenowej + wykorzystywany wtedy gdy podamy samą nazwę hosta bez nazwy domeny, + to znaczy jeśli na przykład podamy samo www zamiast + www.morketsmerke.org, wówczas funkcja na podstawie sufiksu + z tego pliku sama go doda i przekaże żądanie dalej na + jeden z adresów widniejących po opcji nameserver. +

      +

      9.10.2. Buforowanie oraz bezkonfiguracyjne systemy DNS

      +

      + Buforowanie to czyność, którą głównie się kocha a czasem nienawidzi. + Buforowanie odpowiedzi systemu DNS jest odpowiedzią na fakt, że + komputery odpytujące system DNS nie przechowywały nigdzie uzyskanych + od + serwera odpowiedzi, zbyt często powtarazna tego typu czynność mogła + przytkać sieć. Obecnie bardzo często adres serwera DNS jest również + adres bramy. Ma to głównie na celu właśnie buforowanie, na naszym + domowym routerze za pewne uruchomiony jest demon + buforująco-przekazujący. Niestety w + przypadku wielu urządzeń nie będzie my się wstanie tego dowiedzieć. + Ale jeśli nasz sprzęt jest zmodyfikowany, lub naszym routerem jest + jest oprogramowanie zainstalowane na komputerze z wieloma kartami + sieciowymi, to raczej na 100% tak będzie. Innym sposóbem na + wykrycie systemu buforującego, jest sprawdzenie zawartości + pliku /etc/resolv.conf. Jeśli widnieje tam tylko jeden + wpis nameserver to za pewne z adresem 127.0.0.53. + Jest to adres z klasy pętli zwrotnej (o której będzie za + chwilę), czyli wiemy, że to usługa uruchomiona lokalnie na tej + maszynie. Jest to jeden z demonów programu typu init + (systemd) - systemd-resolved. Często w tym + wypadku sam plik jest dowiązaniem symboliczym. Użycie tego rodzaju + systemu rozwiązuje inny problem związany z brakiem elastyczności + statycznych konfiguracji, wówczas nie ma potrzeby wprowdzania zmian + w komponentach systemu. +

      +

      + Wspomniany wcześniej demon posiada jedną ważną cechę. Potrafi łączyć + wiele sposobów wyszukiwania nazw w sieci, co przekłada się na + możliwość użycia bezkonfiguracyjnych systemów DNS. W przypadku takiej + konfiguracji jeśli podłączymy nowe urządzenie do sieci będziemy + mogli wywołać je za pomocą nazwy. Jeśli host istnieje udzieli + odpowiedzi ze swoim adresem IP. Rozwiązaniami tego typu są + mDNS (multicastDNS) oraz + LLMNP (Link-Local Multicast Name Protocol). + Rozwiązania te poza zwykłym odwzorowaniem nazw, mogą przedstawiać + dostępność usług. Ich dostępność w systemie możemy sprawdzić za + pomocą polecenia resolvectl status, warto jednak pamiętać, + że jego działanie jest uzależnione od działania wcześniej + wspomnianego demona. +

      +

      9.11. Host lokalny

      +

      + W wielu systemach operacyjnych, poznając ich możliwości sieciowe + możemy natknąć się na dośc specyficzny interfejs, który w uniksach + określany jako lo. Jest to jedyny interfejs, który + będzie posiadać w plikach konfiguracyjnych statyczną konfigurację. + Interfejs pętli zwrotnej bo tak jest określany + przez swój sposób działnia służy głównie interakcji z programami + sieciowymi bez potrzeby angażowania innych interfejsów. Na przykład + jeśli aplikacja jest w fazie testów i póki co nikt po za naszym + komputerem nie powinien się z nią łączyć. To wtedy taką aplikację + ustawia się tak aby oczekiwała na połączenia na interfejsie pętli + zwrotnej. Wówczas pakiety będą przesyłane przez ten interfejs w obu + kierunkach i opuszczając tym samym jednej fizycznej maszyny. Można + powiedzieć również że adres pętli zwrotnej to połączenie z + samym sobą. +

      +

      + Jeśli wyświetlimy sobie konfigurację interfejsu pętli zwrotnej to + zwrócimy uwagę na to, jaki adres został mu przypisany: +

      +
      +xf0r3m@immudex:~$ ip addr show lo
      +1: lo: <LOOPBACK,UP> mtu 1500 group default qlen 1
      +    link/loopback 00:00:00:00:00:00
      +    inet 127.0.0.1/8 brd 127.255.255.255 scope global dynamic
      +       valid_lft forever preferred_lft forever
      +    inet6 ::1/128 scope host dynamic
      +       valid_lft forever preferred_lft forever
      +
      +

      + Jest to bardzo duża klasa adresowa. Jeśli przypisany do usługi adres + będzie rozpoczynął się od 127 i posiadał 8 bitową maskę, będzie + wówczas przypisany do pętli zwrotnej. +

      +

      9.12. Warstwa transportowa oraz usługi

      +

      + Przedostatnią warstwą modelu TCP/IP jest warstwa transportowa. + Jak sobie wcześniej omówilismy definiuje ona sposób transmisji w + sieciach IP. Wewnątrz niej możemy znajdują się takie protokoły + jak TCP oraz UDP, ona także + definiuje pojęcie portu. +

      +

      9.12.1. TCP - Transmission Control Protocol

      +

      + TCP jest protokołem przepływu danych w sieciach IP. Jest to protokół, + który przed właściwą transmisją danych zestawia coś w rodzaju + połączenia. Za pomocą specjalnych pakietów kontrolnych + strona odległa + informowana jest o nadchodzącej transmisji, i jeśli faktycznie jest + ona w stanie odebrać dane (port na który, strona lokalna chce wysłać + informacje jest otwarty) odsyła informacje zwrotną o tym, że może + wysyłać. Wówczas po wymianie pakietów kontrolnych, dochodzi do + wysłania danych z komputera lokalnego do komputera zdalnego. Protokół + TCP czuwa nad przebiegiem transmisji, każdy pakiet ma swój numer i + strona + zdalna po jego otrzymaniu wysyła pakiet kontrolny z potwierdzeniem + jeśli odpowiedź nie przychodzi w określonym czasie wówczas dochodzi + do retransmisji zagubionych pakietów. TCP jest protokołem + wolniejszym od innego protokołu z tej samej warstwy, zapewnia jednak + niezawdność transmisji, przez co strona odległa może mieć pewność, że + uzyska poprawne dane. Ten protokół wykorzystywany jest w wiekszości + usług w internecie, w których przenoszone przez jego łącza dane mają + znaczenie użytkowników końcowych. Dane są po prostu istotne. +

      +

      9.12.2. UDP - User Datagram Protocol

      +

      + UDP jest trochę innym protokołem niż TCP, ale jego główna rola jest + bardzo podobna, z tą różnicą, że nie zawiera on żadnych mechanizmów + kontroli. Ma to swoje plusy i minusy. Protokół jest na tyle szybki, + że wykorzystywany jest przez różnego rodzaju aplikacji służące do + przesyłania strumieniowego. W tym wypadku możemy osobiście + doświadczyć błędów w transmisji objawiających się spadkiem jakość + streamowanych materiałów. Inną ważnym wykorzystaniem tego, + protokołu, właśnie ze względu na zalety protokołu TCP jest + użycie UDP do budowania sieci prywatnych VPN. Faktem, dla którego + nie korzysta się protokołu TCP jest piekło retransmisji. + Załóżmy, że dochodzi do błedów w zewnętrznej + transmisji, czyli między serwerami VPN i jeśli byłaby to transmisja + TCP doszło by do retransmisji, system VPN będzie musiał zatrzymać się + wówczas host docelowy transmisji wewnętrznej zauważy zagubienie + pakietu i rozpocznie swoją retransmisję + co doprowadzi do zapchania łącza i wstrzymania trasnsmisji + w ogóle. Dlatego też stosuje się protokół UDP dla transmisji + zewnętrznej, wówczas nad poprawnością danych przenoszonych przez + tunel VPN czuwać będą hosty transmisji wewnętrznej. Jak możemy + zauważyć wszystko co może być zaletą w konkretnym przypadku może + okazać się wadą w innym. +

      +

      9.12.3. Porty

      +

      + Z wyżej wymienionych metod + transmisji przy uzyciu portów korzystają różne aplikacje. + Port to + nic innego jak numer wystąpienia aplikacji w obszarze warstwy + transportowej. Na ten numer kierowane są pakiety i w ten sposób + aplikacja otrzymuje dane z sieci. Aplikacje sieciowe posidaja + przypisane te numery przez swoich twórców, ich lista wstępuje + w każdym uniksie, który ma możliwośc podłaczenia do sieci. Lista + znajduje się w pliku, /etc/services. Większość zebranych + tam aplikacja powstawa wraz z internetem, więc lista może być długa + i już nie zbyt aktualna, ale jednak jest pewnym zbiorem informacji. + Poniżej znajduje się kilka protokołów wraz z informacją z której + pochodzi źródło. +

      +
      +# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
      +http            80/tcp          www             # WorldWideWeb HTTP
      +https           443/tcp                         # http protocol over TLS/SSL
      +https           443/udp                         # HTTP/3
      +http-alt        8080/tcp        webcache        # WWW caching service
      +
      +

      + Obok portu wyświetlony jest również rodzaj transmisji. Ciekawostką + jest fakt, że trzecia generacja protokołu HTTPS będzie oparta na + protokole UDP, a nie TCP. +

      +

      9.12.4. Wyświetlanie połączeń sieciowych w systemie

      +

      + Omawiając warstwę transportową to nie sposób jest nie wspomnieć o + wyświetlaniu połączeń. Obecnie w dystrybucjach Linuksa używa się + nowego polecenia jakim jest ss, aby wyświetlić + połączenia TCP w systemie należy wydać poniższe polecenie. Polecenie + to dla przykładu zostało wydane na jednym z moich serwerów VPS +

      +
      +root@searx:~# ss -tr
      +State       Recv-Q  Send-Q          Local Address:Port                                     Peer Address:Port   Process
      +CLOSE-WAIT  32      0        ip109.ip-51-178-2.eu:57026                                   146.75.74.208:https
      +CLOSE-WAIT  64      0        ip109.ip-51-178-2.eu:32808                     text-lb.drmrs.wikimedia.org:https
      +CLOSE-WAIT  64      0        ip109.ip-51-178-2.eu:43164                     text-lb.drmrs.wikimedia.org:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:57466                                    52.84.150.51:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:35092     server-143-204-68-27.lhr61.r.cloudfront.net:https
      +CLOSE-WAIT  25      0        ip109.ip-51-178-2.eu:45492                   upload-lb.drmrs.wikimedia.org:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:41928     server-143-204-68-21.lhr61.r.cloudfront.net:https
      +CLOSE-WAIT  32      0        ip109.ip-51-178-2.eu:36336              qwantbot-115-168-187-194.qwant.com:https
      +ESTAB       0       52       ip109.ip-51-178-2.eu:2022                                     213.25.29.68:63950
      +CLOSE-WAIT  130     0        ip109.ip-51-178-2.eu:60580                        waw02s07-in-f4.1e100.net:https
      +CLOSE-WAIT  47      0        ip109.ip-51-178-2.eu:33310                                    104.16.55.16:https
      +CLOSE-WAIT  130     0        ip109.ip-51-178-2.eu:43572                        waw02s07-in-f4.1e100.net:https
      +CLOSE-WAIT  32      0        ip109.ip-51-178-2.eu:36666                                   140.177.50.13:https
      +CLOSE-WAIT  1       0        ip109.ip-51-178-2.eu:33408                       par21s17-in-f14.1e100.net:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:53446                                    172.67.22.17:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:57454                                    52.84.150.51:https
      +ESTAB       0       0        ip109.ip-51-178-2.eu:2022                                     213.25.29.68:61628
      +CLOSE-WAIT  32      0        ip109.ip-51-178-2.eu:53654                            www.wolframalpha.com:https
      +CLOSE-WAIT  32      0        ip109.ip-51-178-2.eu:58752              qwantbot-109-168-187-194.qwant.com:https
      +CLOSE-WAIT  130     0        ip109.ip-51-178-2.eu:58880                        waw02s07-in-f4.1e100.net:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:37804              qwantbot-106-168-187-194.qwant.com:https
      +CLOSE-WAIT  25      0        ip109.ip-51-178-2.eu:50924     server-18-244-117-84.lhr50.r.cloudfront.net:https
      +CLOSE-WAIT  64      0        ip109.ip-51-178-2.eu:43148                     text-lb.drmrs.wikimedia.org:https
      +CLOSE-WAIT  90      0        ip109.ip-51-178-2.eu:41176                                  151.101.65.181:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:58504    server-18-244-153-127.lhr50.r.cloudfront.net:https
      +CLOSE-WAIT  40      0        ip109.ip-51-178-2.eu:58216      server-13-224-132-41.lhr3.r.cloudfront.net:https
      +
      +

      + W pierwszej kolumnie znajduje się stan połaczenia, jak już wcześniej + wspominałem protokół TCP ustanawia połączenia i ta kolumna + przedstawia ich stan. Estab skrót od + ang. established oznacza że połączenie zostało nawiązane i + dalej trwa. Dalej przesyłane są jakieś pakiety. Reszta połączeń + pozostaje w stanie CLOSE-WAIT jest + to stan oczekiwania na zamknięcie połączenia przez użytkownika. + Przeważnie nie musimy się przejmować tego rodzaju połączeniami, one + zostaną zakończone z czasem. Druga i trzecia kolumna przechowują + informacje odnośnie pamięci podręcznej wysyłania i odbioru. Najlepiej + aby te wartości były jak najbliżej zera. Wysokie wartości w kolumnie + Recv-Q mogą świadczyć o tym, że + pakiety osiągneły komputer docelowy, ale nie ma kto ich odebrać, na + natomiast w wysokie wartości w kolumnie + Send-Q mogą najczęściej oznaczać, że + pakiety zostały wysłane ale do hosta, który na nie oczekuje i nie + potwierdza ich odebrania lub pakiety nie zostały wysłane w ogóle. + Czwarta oraz piąta kolumna zawierają gniazda lokalne + oraz zadalne. Za pomocą gniazd określamy połączenie + adresu IP lub nazwy domenowej (tak, jak w tym przypadku) z portem. + O gniazadach w kontekście Uniksów więcej informacji przedstawię w + następnym rozdziale. +

      +

      + Wydając powyższe polecenie użyłem opcji -t + określającej rodzaj transmisji + (-t - TCP) oraz opcji + -r, która zamienia adres IP oraz + numery portów na nazwy domenowe i nazwy usług. Warto zapoznać się + zawartością strony podręcznika narzędzia ss. Można odnależć + opcje pozwalającą na zamykanie dowolnych połączeń. Połączenia + (może, raczej rejestr transmisji) dla protokołu UDP możemy + wyświetlić za pomocą opcji -u. +

      +

      9.13. Protokół dynamicznej konfiguracji hosta - DHCP

      +

      + Ciężko sobie wyobrazić współczesną sieć bez tak ważnego składnika + jakim jest protokół DHCP. Jest on odpowiedzialny + za konfigurację interfejsów sieciowych oraz za utrzymywanie + informacji o przekazanych parameterach, aby nie dochodziło do + absurdalnych zdarzeń, np. żeby dwa komputery w sieci nie dostały tego + samego adresu. Poza adresami IP serwer DHCP, konfigurje interfejsy + w taki sposób, aby komputer był podłączony do internetu. W sieciach + korporacyjnych mogą być konfigurowane dodatkowe paramety lub + domyślna pula może nie istnieć, a nowe urządzenia trzeba dodawać do + listy + rezerwacji, w tym wypadku komputery uzyskują statyczny adres IP ale + nie jest on przypisywany przez administratora, tylko przez DHCP + właśnie. +

      +

      + Metoda uzyskiwania adresu jest dość niezwykła. Otóż jak komputer, + który nie posiada adresu IP ma skomunikować z innym komputerem i + jakimi. Otóż z każdym. Klient DHCP rozsyła na pakiet z poszukiwaniem + serwera DHCP, na adres rozgłoszeniowy sieci (255.255.255.255) + w tym pakiecie może być zawarty adres, jaki klient kiedyś posiadał. + W odpowiedzi od serwera, klient dostanie ofertę, z którą może się + zgodzić lub żądać innych, bądź dodatkowych parametrów, wówczas + zostaje wysłane żądanie. Po uznaniu żądania, serwer wysyła + potwierdzenie. Kiedy klient otrzyma potwierdzenie rozpoczyna + konfigurację interfejsu sieciowego i na tym etapie rola DHCP kończy + się. Jednak należy pamiętać, że adresy są dzierżawione od serwera, + czyli czas konfiguracji jest określony i od czasu do czasu + trzeba się z tym serwerem skomunikować, aby utrzymać obecną + kofigurację lub prosić o nową. Jednak to pozostaje już w gestii + klienta. +

      +

      + Obsługa protokołu DHCP na uniksach występuje w oryginalnej + implementacji. Do dyspozycji mamy pakiet klienta + dhclient, wśród serwerów możemy wyróżnić co najmniej + dwie godne polecenie implementacje. Jedną z nich wykorzystamy + tworząc z komputera z dystrybucją Linuksa domową bramkę. Aby + pobrać konfigurację z serwera DHCP (nie które dystrybucje, nie + posiadają domyślnie żadnej konfiguracji sieciowej) należy wydać + poniższe polecenie. +

      +
      +xf0r3m@immudex:~$ dhclient enp4s0
      +
      +

      + Podanie interfejsu jako argument spowoduje skonfigurowanie + tylko tego konkretnego interfejsu, jeśli go pominiemy skonfigurowane + zostaną wszystkie aktywe (w których warstwy poniżej internetowej już + działają). +

      +

      + Jeśli chcelibyśmy poznać np. czas dzierżawy to informacje uzyskane + od serwera znajdują sie w pliku dzierżawy + /var/lib/dhcp/dhclient.leases +

      +

      + Do tej pory omawiając DHCP, skupialiśmy się głównie na protokole + IPv4. W przypadku protokołu IPv6 również istnieje możliwość + zastosowania DHCP, nawet został przygotowany ku temu standard + protokołu DHCPv6 to proponowane jest innego rodzaju rozwiązanie. + Ze względu na długość adresów IPv6, organizacja zarządzająca + wykorzystała częśc adresów na potrzeby nowej metody konfiguracji. + Konfiguracja bezstanowa nie wymaga punktów + centralnych w postaci serwerów do konfiguracji interfejsów dla IPv6. +

      +

      + Metoda działania tej konfiguracji opiera się o adresy sieci lokalnej + łącza, ze względu długość adresu host może wygenerować sobie adres, + który może z mały prawdopodobnieństwem powtórzyć się w sieci. + Z resztą mając ustalony prefiks (fe80::/64) można wysłać + zapytania do innych hostów w sieci czy adres, który host wygenerował + jest wykorzystywany przez inne hosty w sieci. Jest to mało + prawdopodobne gdyż do wygenerowania tego adresu bierze udział + adres MAC. Po uzyskaniu łącza lokalnego, host może określić adres + globalny z pomocą komunikatów RA (Router Advertisement) + wysłanego co jakiś czas przez router w naszej sieci lokalnej. + Komunikat zawiera prefiks sieci globalnej, adres routera oraz adresy + serwerów DNS. Po otrzymaniu tych informacji może podjąć próbę + wygenerowania części adresów odpowiadającej za identyfikator + interfejsu. W ten sposób interfejs otrzymuje dostęp do internetu + za pośrednictwem protokołu IP w wersji 6. +

      +

      9.14. Konfiguracja systemu Linux jako router

      +

      + Ten podrozdział będzie dość obszerny, ponieważ postanowiłem zebrać + w nim część zagadnień sieciowych dotyczących konfiguracji dystrybucji + Linuksa w celu wykorzystania jako router. +

      +

      + Chcąc wykorzystać komputer z dystrybucją Linuksa jako bramę czy + router (w zależności ile sieci będzie łączyć) musimy zaopatrzyć nasz + komputer w odpowiednią ilość interfejsów. Jak możemy się domyślić + interfejsy to nic innego jak karty sieciowe. Jeśli jest to zwykły + PC to dołożenie kart nie powino być problemem (zakładając, że + nasza sieć jest oparta na miedzianej skrętce) a najzwyklejsze + karty (gigabitowe) mogą kosztować w okolicach 50 zł jeśli nie mamy + możliwości rozbudowania komputera o więcej niż jedną kartę to możemy + użyć kart serwerowych, one zazwyczaj posiadają od 2 do 4 portów a + zajmują jeden port PCI-E x16 (rzadko, kto będzie mieć w komputerze + przeznaczonym na router, złącza PCI-E x8 lub x4, bo takie złącze + będą mieć karty tego typu). +

      +

      9.14.1. Oprogramownie główne

      +

      + Wiele urządzeń dostępnych na rynku jako router posiada przyjazny, + z którym możemy połączyć się za pośrednictwem przeglądarki + internetowej, a obecnie cześć producentów posiada również aplikacje + mobline do ich kontrolowania. Tego typu rozwiązania zapewniają nam + łatwość konfiguracji, która często sprowadza sie to wpisania kilku + rzeczy i klikania Dalej, dalej, dalej... i na koniec + zrestartowania urządzenia. Na tym zadanie się, kończy za + pośrednictwem tego urządzenia komputery w naszej sieci lokalnej będą + posiadać połączenie z internetem. Mimo to na tych sprzętach w dużej + mierze przeważa Linux. Ten system w warunkach wbudowanych jest + wstanie uruchomić się z każdego urządzenia. Czytając te słowa, + zabrneliśmy tak daleko w głąb tego materiału, że możemy z pewnością + stwierdzić, że domyślnie na Linuksie próżno szukać takich udogodnień. +

      +

      + Każda dystrybucja posiada wiele cech specyficznych, z racji tego iż + nie narzucałem żadnej konkretej (chociaż, Debian tutaj przoduje). To + warto wybrać tę której używaliśmy do tej pory jeśli jest to wiodąca + dystrybucja to możemy zainstalować takie oprogramowanie jako + cockpit, jest to środowisko do zarządania serwerem + z poziomu WWW, przez przeglądarkę. Dostępne jest ono w wiekszości + dystrybucji. Niestety nie daje ono zbyt rozbudowanych możliwości. + Cechą dominującą przy wyborze powinna być stabliność + dystrybucji, dlatego takie dystrybucje jak Debian lub dystrybucje + klasy Enterprise (pomijając te płatne) jak Rocky czy Alma + Linux sprawdzą się tutaj znakomicie. Problemem z tymi dystrybucjami + jest trochę inna konfiguracją zapory sieciowej, ale ona opisana jest + w innym moim materiale odnośnie RHCSA. Zatem wybierając taką + dystrybucję mamy nieco więcej pracy, ale możemy mieć pewność, że + nie spotkamy się z różnymi, nie zawsze przemyślanymi rozwiązaniami + dostawców różnych nakładek czy dystrybucji skierowanych na routery. + Sam osobiście wole takie rozwiązanie. +

      +

      + Innym, dużo prostszym podejściem do tego typu zadania, może być użycie + dystrybucji przeznaczonej do zamieniania PC-tów z kilkoma kartami + sieciowymi w router, takimi jak np. dystrybucja IPFire. Takich + dystrybucji nie tylko opartych o Linux jest wiele więcej. Część z + nich jest już niewspierana lub wątpliwej jakość (zeroshell, + może dlatego upadła). Cała lista dostępna jest pod + tym + adresem. +

      +

      + Możemy również zmienić całkowicie podejście do tematu. Jeśli nie mamy + wolnego + komputera, którego możemy użyć w roli routera. To możemy użyć + domowego routera, jako mikroserwer z Linux. Za pomocą dystrybucji + takiej jak DD-WRT, a szczególnie OpenWRT możemy + uzyskać dostęp dystrybucji Linuksowej na tym nie pozornym urządzeniu. + Lista kompatybilnego sprzętu, na którym możemy zainstalować + OpenWRT jest dość obszerna. Więc może znajdziemy system pasujący do + naszego sprzętu. Dodam również, że obsługa tego typu dystrybucji + może może opierać na konkretnym narzędziu i żadne z przedstawionych + poniżej rozwiązań, skierowanych raczej do dystrybucji ogólnych, takich + jak Debian, może nie działać. Wówczas zachęcam do zapoznania się z + dokumentacją. +

      +

      + Poniższe rozwiązania bedą dotyczyć głównie wiodących dystrybucji. + Więc jeśli zdecydujemy się inne rozwiązania wykonanie zadania możemy + oprzeć o dostępną dokumnetację. +

      +

      9.14.2. Oprogramowanie dodatkowe

      +

      + Poza system operacyjnym i jego wewnętrznymi komponentami sieciowymi + do zbudowania pełno prawnego routera lub bramy potrzebujemy kilku + pakietów: +

      +
        +
      • Pakietu zapory sieciowej - iptables
      • +
      • Pakietu DHCP wraz z DNS - dnsmasq
      • +
      • Pakietu rozgłaszania sieci bezprzewodowej (opcjonalnie) - hostapd
      • +
      +

      + Jeśli jesteśmy w posiadaniu odpowiedniego sprzętu nasz router może + rozgłaszać sieć bezprzewodwą. Jeśli chcielibyśmy coś takiego + zrealizować to warto zapoznać się z tematem tworzenia mostów. + Jeśli taki most miedzy LAN-em a WLAN-em zostanie + zestawiony to oba interfejsy zostaną połączone jednym wirtualnym, + który będzie obsługiwał połączenia z zupełnie różnych dwóch + warstw fizycznych. +

      +

      + Dostępność oraz sposób instalacji tych pakietów dla wybranych przez + nas dystrybucji (ze względu na ich róznorodność) należy ustalić we + własnym zakresie. Poniżej znajduje się polecenie dla dystrybucji + Debian oraz pokrewnych. +

      +
      +xf0r3m@immudex:~$ sudo apt install dnsmasq
      +
      +

      + To polecenie zainstaluje tylko jeden pakiet. Debian 11 jest + już rozprowadzany zainstalowanym pakietem zapory. +

      +

      9.14.3. Konfiguracja dystrybucji jako router

      +

      + Po złożeniu sprzętu oraz zainstalowaniu oprogramowania. Przyszedł + czas na jego konfigrację. Najlepiej rozpocząć ją (a wręcz trzeba) od + konfiguracji interfejsów. Musimy ustalić wykorzystywany przez nas + sposób łączenia z Internetem, czy posiadamy statyczny adres IP lub + interfejs jest konfigurowany dynamicznie przez naszego usługodawcę. + Te informacje musimy zapisać w charkterystyczny dla naszej + dystrybucji sposób konfiguracji interfejsów. Jeśli chcemy możemy + wykorzystać do tego celu NetworkManager. Pamietając, że + w przypadku Debiana interfejs wykorzystywany podczas instalacji + będzie kontrolowany przez system ifupdown, trzeba go + stamtąd usunąć. Po skonfigurowaniu interfejsu łączącego z internetem + musimy skonfigurować interfejsy sieci LAN. Tutaj wystarczy sam adres + oraz maska podsieci. Adres ten musi być jednym z adresów + sieci prywatnych IPv4. +

      +

      Sieci prywatne IPv4

      +

      + Sieci prywatne to nic innego jak wycięte klasy adresowe + sieci IP w wersji 4. Te adresy mają zastosowanie jedynie w sieciach + lokalnych, ale i usługodawcy również mogą się nimi posługiwać, + ponieważ to co wpinamy w port WAN routera jest umowne i tak naprawdę + naszym WAN-em, może być sieć osiedlowa, która jest nieco wiekszym + LAN-em lub będąc bardziej szczegółowym siecią kampusową. Adresy sieci + prywatnych powstały ze względu na wyczerpywanie się adresów + publicznych. Można by się zastanowić nad tym w jaki sposób zabranie + prawie 18 milionów adresów, przyczniło się do tego, że sieci IPv4 + jest na wyczerpaniu to nadal są przydzielane konkretne adresy. Otóż + adresy klas prywatnych nie mogą funkcjonowac w internecie, są tylko + do użytku wewnetrznego. Największa klasa A (posidająca grubo ponad + 16 miliownów adresów) może być widoczna w internecie jako jeden adres. + Dzięki technologii translacji adresów (bardziej szczegółów informacje + na ten temat znajdują się poniżej). + Stąd taka optymalizacja. Dostępne mamy trzy klasy adresowe: +

      +
        +
      • Klasa A - o masce 255.0.0.0, dającą 256^3 - 2 + adresów w zakresie od 10.0.0.0 do 10.255.255.255.
      • +
      • Klasa B - o masce 255.240.0.0, dająca + 16*256^2 -2 adresów w zakresie od 172.16.0.0 do 172.31.255.255.
      • +
      • Klasa C - o masce 255.255.0.0, dająca 256^2 - 2 + adresów w zakresie od 192.168.0.0 do 192.168.255.255.
      • +
      +

      + Gdzieś wśród młodych adeptów informatyki, wzięło się przeswiadczenie, + że klasy B oraz C są dużo mniejsze. Klasie B przypisywało się wówczas + maskę 16-bitową, odcinając wszystkie adresy powyżej 172.16.255.255. + A klasie C przypisywano maskę 24-bitową, przez co zmniejszano ją + do 254 adresów. Ten sposób adresacji wziął się z nie wiedzy osób + konfigurjących sprzęt oraz z narzucenia przez producentów domyślnie + takich wartości. Nie jest to błędem, ponieważ możemy alokować te + adresy odpowiednio do swoich potrzeb. Dlatego jeśli nie potrzebujemy + tak dużej sieci, to możemy ją zmniejszyć dzieląc te sieci na + podsieci i wykorzystując tylko jedną z nich. +

      +

      + Po konfiguracji interfejsów możemy przjeść do konfiguracji serwera + DHCP, który jest również serwerem buforująco-przekazujący systemu + DNS. Przyczym konfiguracja DNS-u nie wymaga od nas żadnej uwagi + dnsmasq zaraz po uruchomieniu zaczyna nasłuchiwać + na porcie 53/UDP. Naszym zadaniem będzie jedynie ograniczenie tego + nasłuchiwania do portów LAN. Dla przykładu żałożymy, że naszym + interfejsem LAN-u jest klasyczny port eth0. +

      +
      +interface=eth0
      +dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,12h
      +dhcp-option=3,192.168.4.1
      +dhcp-option=6,192.168.4.1
      +
      +

      + Pierwsza opcja interface=eth0 + ogranicza działanie demona tylko i wyłącznie do interfejsu + eth0. Dzięki tej opcji nasłuchiwanie + na porcie 53/udp (DNS) zostanie ograniczone do wskazane interfejsu. + Pozostałe opcje konfigurją nam już serwer DHCP. Pierwsza opcja + dhcp-range definiuje nam zakres + przydzielanych adresów, maskę podsieci oraz czas dzierżawy. Następnie + zaczynają się typowe opcje protokołu DHCP, są one opisane w + standardzie, ale dla zachowania kontekstu przytocze je również tutaj + opcja 3 odpowiada za przypisanie + adresu domyślnej bramy, natomiast opcja + 6 odpowiada za przypisanie adresów + serwerów DNS. Adres bramy oraz adres serwera DNS wskazują na adres + portu LAN. Te cztery linie wystarczą aby skonfigurować serwer DNS i + DHCP dla naszej sieci. Teraz po podłączeniu komputera do routera + powinniśmy uzyskać adres IP wraz z pozostałymi paramerami + pozwalającymi na połączenie z internet za pośrednictwem naszego + systemu. +

      +

      + Aby zrealizować połączenie z internetem hostów podłączanych do sieci + LAN musimy wykonać jescze dwie czynności. Umożliwić w systemie + przsyłanie pakietów między interfejsami, domyślnie jest ono + wyłączone oraz włączyć funckję NAT-u. +

      +

      NAT - Translacja adresów sieciowych

      +

      + Translacja adresów potocznie zwana NAT-em, jest funkcja zapór + sieciowych, której zadaniem jest najczęściej zamiana adresów sieci + LAN, na adres sieci publicznej. Tak aby komputery mogły wysyłać oraz + odbierać dane z sieci rozległej nie będąc do niej bezpośrednio + podłączone. Istnieje kilka rodzajów translacji adresów nas będą + interesować tylko dwa. Przeznaczone dla ruchu wychodzącego (danych + generowanych przez komputery z sieci LAN). Do wybory wówczas mamy + SNAT - ang. Source Network Address Translation + lub MASQUERADE. Użycie SNAT-u będzie wymagać + podania adresu IP portu WAN, teoretycznie nic w tym złego, ale jeśli + nasz usługodawca automatycznie przypisuje swoim klientom adresy IP, + za każdą zmianą adresu na tym interfejsie połączenie z internetem + zostało by zerwane. Zatem SNAT jest szybszą metodą NAT-u, ale wymaga + stałego adresu IP. Jeśli takim nie władamy, pozostało nam tylko + użycie MASQUERADE, który pozwala na podanie interfejsu. Działanie + NAT-u opiera się na podstawieniu w miejscu adresu źródłowego pakietu + albo adresu podanego w regule (SNAT) albo adres interfejsu + (MASQUERADE). +

      +

      + Za przekazywanie pakietów między interfejsami odpowiada jądro. Aby + je włączyć musimy skorzystać z interfejsu ukrytego za poleceniem + sysctl. Do konkretnych wartości prowadzi ścieżka, + której elementy są odzielone od siebie kropkami. Poniżej znajduje + sie polecenie, które odpowiada za przekazywanie pakietów miedzy + interfejsami. +

      +
      +xf0r3m@immudex:~$ sudo sysctl net.ipv4.ip_forward=1
      +
      +

      + Teraz pakiety będą swobodnie przekazywane między interfejsami. Tak + jak wspomniałem NAT jest funkcją zapory sieciowej. Tak więc + konfiguracja dystrybucji Linuksa jako router będzie wymagać jej + konfiguracji. Co prawda będzie to jedno polecenie, ale żeby nie + pozostawiać użytkownika w niewiedzy trzeba trochę przybliżyć temat + działania zapory jaką jest iptables. +

      +

      Zapora sieciowa w systemie Linux

      +

      + Zapora sieciowa w dystrybucjach Linux realizowana jest przez pakiet + iptables, jego zasada + działania opiera się o łańcuchy zasad pod kątem + których sprawdzany może być pakiet przychodzący, wychodzący a nawet + dodatkowo przekazywany dalej. Łańcuchy łączą się w tablice, które + mogą modyfikować moment konfrontacji pakiety z łańcuchem, ale ogólna + zasada pozostaje bez zmian. Każdy łańcuch posiada domyślną politykę, + która jest stosowana dla pakietów niepasujących do żadnej z reguł. + Domyślnie jest to polityka przepuszczaj, oznacza to swobodną + transmisję. Wśród najważniejszych tablic oraz łańcuchów możemy + wyróżnić: +

      +
        +
      • filter - tablica zwierająca łańcuchy + sprawdzające pakiety, które są związane jakoś z docelowym + komputerem, Ta tablica jest również domyślna i nie ma + potrzeby definiowania jest nazwy wśród niej możemy wyróżnić takie + łańcuchy jak: +
          +
        • INPUT - zawiera reguły filtrujące pakiety + przeznaczone dla lokalne hosta (tego komputera).
        • +
        • OUTPUT - zawiera reguły filtrujące pakiety + wysyłane (jego połączenia) z tego komputera.
        • +
        • FORWARD - zawiera reguły filtrujące pakiety + przesyłane przez ten komputer.
        • +
        +
      • +
      • nat - tablica zawierająca łańcuchy, których + zadaniem jest modyfikacja przechodzących przez nią pakietów. + Np. łańcucha PREROUTING korzysta się do + port-forwardingu, czyli udostępniania połączeń + z internetu dla wybranych usług. Kluczowe łańcuchy tej tablicy + przetwarzają pakiety zaraz po pojawieniu się na interfejsie (tj. + bardzo wcześnie) lub zaraz przed jego opuszczeniem (tj. bardzo + późno). Będą przy tym pierwszymi oraz ostatnimi zestawiami reguł + przetwarzającymi pakiet. Wśród tej tablicy możemy wyróżnić takie + łańcuchy jak: +
          +
        • PREROUTING - zawiera reguły filtrujące, które + najwcześniej przetwarzają pakiety. Ten łańcuchy wykorzystywany jest + w port-forwarding.
        • +
        • OUTPUT - zawiera reguły filtrujące pakiety dla + wygenerowanych lokalnie pakietów, które poźniej będą wymagały + trasowania.
        • +
        • POSTROUTING - zawiera reguły filtrujące, które + najpóźniej przetwarzają pakiety. Tutaj stosowany jest SNAT oraz + maskarada.
        • +
        +
      • +
      +

      + Iptables konfrontując pakiet z łańcuchem zastosuję akcję + dla pierwszej reguły do której będzie pasować przetwarzany pakiet. + Natomiast możemy wyróżnić trzy rodzaje akcji podstawowych takich + jak: +

      +
        +
      • ACCEPT - przepuść pakiet do dalszego + przetwarzania
      • +
      • DROP - odrzuć pakiet
      • +
      • REJECT - odrzuć pakiet, ale poinformuj nadawcę + o takiej sytuacji
      • +
      +

      + Istnieją także dodatkowe akcje specyficzne dla tablicy. Przeważnie + po podaniu akcji w tablicy filter reguła się kończy. W + przypadku akcji SNAT oraz DNAT tablicy nat + wymagane jest podanie docelowego adresu IP. Akcją bez argumentów dla + tej tablicy jest MASQUERADE uruchamiające maskaradę. +

      +

      + Z powyższego wywodu możemy wywnioskować, że aby uruchomić NAT na + naszym routerze musimy zapisać regułę tablicy nat w łańcuchu + POSTROUTING. Więc tak, tablicę wskazujemy z pomoca opcji + -t, teraz w zależności od tego czy chcemy wstawić w + konkretną linią naszą regułę czy ją dopisać musimy użyć innych opcji. + Opcja -I odpowiedzialną za wstawianie (INSERT) + wymaga po podaniu nazwy łańcucha numeru linii, w którą ma wstawić + daną regułem, natomiast opcja -A odpowiedzialna za + dopisanie (APPEND). Ze względu na to, że jest to łańcuch + POSTROUTING, to raczej będzie on pusty, więc nie będzie + to miało znaczenia czy użyjemy dopisania czy wstawienia. Drugą rzeczą + jest wskazanie interfejsu, na którym interfejsy będą wymagały NAT-u, + aby transmisja miała sens. W przypadku wyjściowych łańcuchów takich + jak POSTROUTING czy OUTPUT interfejs podwany jest + po opcji -o (nazywane jest kierunkien od + in/out, jednak łańcuchy mają już zdefiniowane + możliwe kierunki transmisji) następnie po opcji -j podawana + akcja, zawsze wieliki literami. Więc nasza reguła uruchamiająca NAT + prezentuje się następująco. W przypadku tego oraz poniższych + przykładów dotyczących zapory sieciowej interfejsem przeznaczonym do + połączenia z siecią WAN będzie eth1. +

      +
      +xf0r3m@immudex:~$ sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
      +
      +

      + Teraz o ile komputery podłaczone do interfejsu LAN posiadają + prawidłowe adresy IP, powinny mieć już połączenie z Internetem. + Mimo, że wszystko funkcjonuje prawidłowo to pozostawienie tak + podłączonego routera do Internetu pozostawia wiele do życzenia. + Pierwszym rażącym zaniedbanie jest fakt iż router będzie przyjmował + połączenia z internetu, z każdym dowolnym portem, w ramach lepszego + poznania pakietu firewall-a na Linuksie możemy nieco + bardziej zabezpieczyć naszą transmisję. +

      +

      + Jak zapewne pamiętamy, każdy łańcuch posiada swoją politykę, która + jest stosowana dla każdego pakietu, które nie zostanie przypasowana + żadna reguła. Moglibyśmy ustawić ją na odrzucanie i dopuścić tylko + potrzebny ruch. To dobry pomysł szczególnie jeśli myślimy o + interfejsie WAN, ale zły jeśli pomyślimy interfejsie LAN. Ponieważ + możemy zdefiniować polityki per interfejs, ten pomysł + odpada, ponieważ dla interfejsu LAN musiała by powstać długa lista + reguł dopuszczająca ruch do wszystkie bardziej oraz mniej znanych + usług. Dlatego też pozostawimy politykę bez zmian i dopuścimy tylko + niezbędny ruch. Na pewno z internetu musimy przyjąć dane od serwera + DNS, aby rozwiązywać dotąd nieznane nazwy oraz w zależności + konfiguracji interfejsu WAN dane z serwera DHCP usługodawcy. Łańcuch + INPUT będziemy konfigurować dodają na początku reguły zezwalające na + ruch, żeby następnie zablokować pozostały nieokreślony regułami. +

      +
      +xf0r3m@immudex:~$ sudo iptables -A INPUT -i eth1 -p udp --sport 53 -j ACCEPT
      +#Opcjonalnie:
      +xf0r3m@immudex:~$ sudo iptables -A INPUT -i eth1 -p udp --sport 67 -j ACCEPT
      +#Zablokowanie pozostałego ruchu
      +xf0r3m@immudex:~$ sudo iptables -A INPUT -i eth1 -p udp -j DROP;
      +xf0r3m@immudex:~$ sudo iptables -A INPUT -i eth1 -p tcp --syn -j DROP;
      +
      +

      + Dwie pierwsze reguły dopusczają ruch z sieci WAN (interfejs eth1) na + porcie 53/udp (serwer systemu DNS) oraz 67/udp (serwer DHCP). + Pozostały ruch protokołu UDP został zablokowany. Podobnie jest z + całym ruchem na protokole TCP, tutaj dodano także modyfikator + --syn. Jak wspominałem omawiając + protokół TCP, musi on zestawić połączenie, aby rozpocząć transmisje + co wymaga wysłania kilku pakietów sterujących. Pakiet wysyłany aby + zainicjować zestawienie połączenia TCP posiada własnie ustawioną + flagę SYN (pakiety TCP posiadają specjalne miejsce na flagi). + I tego typu pakiety są właśnie blokowane. To rozwiązanie skutecznie + zablokuje próbę połączenia, ale prawdopodbnie nie uchroni przed + metodą rozpoznawczą jaką jest skanowanie portów. Należało by tutaj + zamiast flagi, stanów połączenia. +

      +

      + Ze względu na to, iż zapora na Linuksie to temat rzeka. + Małe ćwiczenie. Usprawnienie tej ostatniej reguły, takby aby + opierała się na stanach TCP. (Podpowiedź: Zablokowanie ma służyć + nawiązywaniu nowych połączeń z naszym routerem. Transmisja + przez hosty w sieci, ktore łączy nasz routera powina przebiegać bez + zarzutu). +

      +

      + Iptables nie jest bez wad jedną z nich jest utrzymanie + reguł w łańuchach do momentu wyłączenia systemu. Dlatego + systemy, w których instalowany jest ten pakiet dostępny jest też + pakiet odpowiadający za zapisanie reguł w pliku i przywrócenie ich + w momencie startu systemu. Pakiet nazywa się + iptables-persistent dostępny jest w repozytoriach Debiana. +

      +
      +xf0r3m@immudex:~$ sudo apt install iptables-persistent
      +
      +

      + Zapisanie reguł odbywać się będzie za wydaniem poniższego polecenia. +

      +
      +xf0r3m@immudex:~$ sudo iptables-persistent save
      +
      +

      + Teraz router jest skonfigurowany i gotowy do działania. Routery + programowe mają to do siebie, że ich funkcjonalność można + rozszerzyć np. o serwer plików. Konfiguracje takiego serwera plików + będziemy jeszcze omawiać w tym materiale. Także będziemy jeszcze + wracać do naszego routera. +

      +

      + Kolejną kwestią jest komunikacja między sieciami. Jeśli nasz router + łączy ze sobą więcej niż jedną sieć lokalną i ich komputery mają się + ze sobą komunikowac to należy utworzyć statyczne trasy, wskazujące + przez, który interfejs należy komunikować się z daną siecią. +

      +
      +xf0r3m@immudex:~$ sudo ip route add 192.168.1.0/24 via 192.168.1.1 dev eth2
      +xf0r3m@immudex:~$ sudo ip route add 192.168.4.0/24 via 192.168.4.1 dev eth0
      +
      +

      + Trasy te mogą zostać utworzone automatycznie jeśli np. interfejs + sieci WAN zostanie podniesiony podczas automatycznej konfiguracji. + Jeśli takie zachowanie nie jest przez nas porządane to w najlepszym + wypadku jest zablokować transmisję między sieciami na + firewall-u. Ninejszym temat konfigruacji routera uważam + za zakończony. Nie mniej jednak to nie koniec rodziału. Zostały + jeszcze dwa tematy do omówienia. +

      +

      9.15. Sieci IP oparte na Ethernet. Protokół ARP i NDP

      +

      + Mając na uwadzę to, że chcąc wysłać jakieś dane musimy podać adres + hosta docelowego. Zazwyczaj takim adresem jest albo adres IP albo + nazwa domenowa. Te piewsze wykorzystywane są głównie w sieciach + lokalnych przez specjalistów. Zatem podając nazwę domenową aplikacja + musi rozwiązać ją na adres IP i dokonuje tego za pomoca systemu DNS. + To dzieje się w warstwie aplikacji. Warstwa transportowa definiuje + port oraz rodzaj transmisji dla wysłanych danych. Najczęściej są + to znane protokoły jak HTTPS, protokoły przesyłania strumieniowego + oraz protokoły poczty. Warstwa sieciowa posiada już adres IP hosta + docelowego i bez względu na to czy host docelowy znajduje się w tej + samej sieci czy nie, pakiet przekazywany jest dalej i tutaj pozostaje + nam pewna nie wiadoma, skąd host źródłowy wie jakim adresem MAC + ma zaadresować ramkę ethernet? +

      +

      + Tutaj pojawia się protokoły ARP oraz RARP. Ten + drugi jest może mniej wykorzystywany. Ich zadaniem jest zamiana + adresów IP na MAC i odwrotnie. Głownie chodzi tu o protokół ARP i + to nanim się się skupimy. Informacje na temat adresów MAC hostów + w sieci przechowywane są w tablicy lub w buforze ARP. Jednak co jeśli + tablica jest pusta? Wówczas protokół ARP dla docelowego adresu IP + tworzy ramkę z żądaniem ARP. Taka ramka rozsyłana jest w całej sieci. + Jeśli jeden ze znajdujących się w niej hostów posiada adres MAC dla + adresu IP z żądania wówczas odsyłana jest odpowiedź. Nasz host na + podstawie odpowiedzi uzpełnia swoją tablicę o ten wpis wówczas może + on rozpocząć transmisję. Dostęp do tablicy w dystrybucjach Linuksa + odbywa się z pomocą: +

      +
      +xf0r3m@immudex:~$  sudo ip -4 neigh
      +172.16.2.20 dev enp4s0 lladdr 74:27:ea:e9:cc:14 STALE
      +172.16.7.6 dev enp4s0 lladdr 70:85:c2:a4:bf:b9 STALE
      +172.16.8.2 dev enp4s0 lladdr 6c:4b:90:be:91:74 STALE
      +172.16.6.1 dev enp4s0 lladdr 78:45:c4:12:6a:5d STALE
      +172.16.2.100 dev enp4s0 lladdr 3c:84:6a:44:d7:a4 STALE
      +172.16.2.46 dev enp4s0 lladdr 74:27:ea:ea:98:8a STALE
      +172.16.17.15 dev enp4s0 lladdr 78:45:c4:09:23:4c STALE
      +172.16.2.146 dev enp4s0 lladdr 1c:69:7a:cd:f4:cb STALE
      +172.16.2.119 dev enp4s0 lladdr 74:27:ea:ea:63:56 STALE
      +172.16.8.13 dev enp4s0 lladdr 6c:4b:90:be:88:16 STALE
      +172.16.0.1 dev enp4s0 lladdr 90:e2:ba:45:4f:8c REACHABLE
      +...
      +
      +

      + Wpisy w tablicy same ulegją usunięciu jeśli nie nastąpiła aktywność + przez pewien czas. Nie mniej jednak istnieje możliwość ręcznego + usunięcia wpisów za pomocą polecenia: +

      +
      +xf0r3m@immudex:~$ sudo ip neigh del 172.16.8.13 dev enp4s0
      +
      +

      + Efektem działania tego polecenia będzie usunięcie wpisu dotyczączego + host 172.16.8.13. +

      +

      + Protokołem o działaniu udwrotnym jest RARP, jego + zadaniem była zamiana adresów MAC na adresy IP, przez co + wykrzystywany był do automatycznej konfiguracji hosta, przed + upowszechnieniem się protokołu DHCP. Obecnie jest już rzadko + spotykany. +

      +

      + Za pomocą podpolecenia neigh polecenia ip mogliśmy + sprawdzić tablicę ARP w systemie. Kiedyś używano do tego polecenia + arp. Obecnie doszło do unifikacji przez narzędzie + ip obsługi protokołu ARP dla IPv4 oraz protokołu NDP dla + IPv6. NDP jest podobny rozwiązaniem dla IPv6. Jego działanie opiera + na dwóch rodzajach komunikatów: +

      +
        +
      • Poszukiwanie adresu - pakiet tego rodzaju służy + do uzyskania informacji o sieci lokalnej hosta wraz z adresem MAC.
      • +
      • Ogłaszenie adresu - pakiet z odpowiedzią wraz + z żądanymi informacjami.
      • +
      +

      9.16. Sieć bezprzewodowa

      +

      + Logiczna konstrukcja sieci bezprzewodowej, nieco rózni się + od połączeń kablowych kilkoma charakterystycznymi elementami w + warstwie fizycznej. Sieci bezprzewodowe definiowane są przy użyciu + standardu 802.11 i jego poszczególnych odmian + (np. 802.11a lub 802.11n) + Poniżej opiszemy sobie cechy charakterystyczne, z którymi będziemy + mieć styczność podczas konfiguracji sieci bezprzewodowej. +

      +
        +
      • Identyfikator/Nazwa sieci/ESSID jest ciąg + znaków jednoznacznie określający sieć. Każda sieć bezprzewodowa + go posiada. Jest on niezbedny do połączenia.
      • +
      • Dane autoryzacyjne sieci bezprzewodowe, mogą + zostać zabezpieczone za pomocą funkcji kryptograficznych + (zaszyfrowane), aby osoby nie będące jej częścią nie mogły + się podłączyć lub + przechwycić przesyłanych przez nie danych. Najczęsciej jest hasło, + chociaż, czasami też stoswane są PIN-y (w przypadku funkcji WPS) + lub dane logowania (w przypadku sieci korporacyjnych).
      • +
      • Częstotliwość - fragment pasma częstotliwości + radiowej, na której możliwa jest wymiana informacji w obrębie danej + sieci bezprzewodowej. Bezprzewodowe sieci komputerowe operują + najczęściej na częstotliwości 2,4GHz lub 5GHz. Każda sieć ma + do dyspozycji tylko fragment pasma powyższych częstotliwości.
      • +
      • Kanał - kanał jest powiązany z częstotliwością + Kanał określa konkretną częstotliwość dla pasma np. 2,4GHz. + Jeśli nasza sieć ma nadawać na pierwszym kanale (Kanał/CH 1, + oznaczenia są różne) to znaczy że będzie nadawać na częstotliwości + 2412MHz.
      • +
      +

      + Oczywiście cech charakterystycznych jest jescze więcej. Nie + opisywałem tutaj siły sygnału. To chyba każdy rozumie. My tutaj + skupimy się głownie na podłączaniu się do sieci i to najlepiej za + pomocą terminala. Opcji jest kilka. +

      +
        +
      • NetworkManager. Do przyłączenia się do sieci + bezprzewodowej możemy wykorzystać dobrze znany nam już menedżer. + Za pomocą komend polecenia nmcli możemy wyświetlić sobie + listę dostępnych sieci i następnie się do niej podłączyć. Poniżej + znajdują się polecenia, dzięki którym możemym wykorzystać ten + menedżer do podłączenia do sieci. +
        +xf0r3m@immudex:~$ nmcli device wifi list
        +*  SSID               MODE    CHAN  RATE       SIGNAL  BARS  SECURITY
        +   netdatacomm_local  Infra   6     54 Mbit/s  37      ▂▄__  WEP
        +*  F1                 Infra   11    54 Mbit/s  98      ▂▄▆█  WPA1
        +   LoremCorp          Infra   1     54 Mbit/s  62      ▂▄▆_  WPA2 802.1X
        +   Internet           Infra   6     54 Mbit/s  29      ▂___  WPA1
        +xf0r3m@immudex:~$ nmcli device wifi connect "F1" password "p4ssw0rd"
        +#lub
        +xf0r3m@immudex:~$ nmcli --ask device wifi connect "F1"
        +xf0r3m@immudex:~$ nmcli -p -f general,wifi-properties device show wlan0
        +
        + Można użyć modyfikatora --ask + zamiast wpisywać hasło w poleceniu. Ostatnie polecenie zwraca + podstawowe informacje na temat interejsu oraz samej sieci. +
      • +
      • iwd, jest menedżer sieci bezprzewodywych stworzony + przez firmę Intel. Jego obsługa jest interaktywna i opiera sie na + wydaniu kilku poleceń. W przeciwieństwie do NetworkManagera + (który może być już zainstalowany w wielu dystrybucjach) trzeba go + zainstalować. Pomoc dostępna jest wewnąrz narzędzia po jego + uruchomieniu. Uruchomienie odbywa się poprzez wydanie polecenia: +
        +xf0r3m@immudex:~$ iwctl
        +[iwd]# help
        +[iwd]# device list
        +[iwd]# station wlp1s0 scan
        +[iwd]# station wlp1s0 get-networks
        +[iwd]# station wlp1s0 connect SSID
        +
        + Ten program wymaga nieco więcej poleceń. Ostanie poleceń, jeśli + połączenie tego będzie wymagać zapyta o hasło. (Więcej informacji + na https://wiki.archlinux.org/title/iwd) +
      • +
      • wireless-tools - Pakiet. Konfiguracja ręczna. + Ten sposób jest najdłuższy, ale zadziała na każdej dystrybucji. + Składa się on z klasycznego interfejsu iwconfig oraz + programu wpa_supplicant służącego do łączenia się + sieciami wykorzystującymi mechanizm bezpieczeństwa WPA. Chcąc + znaleźć sieć, do której chcemy się podłaczyć musimy skorzystać z + polecenia iwlist, który wyświetli nam raport ze skanowania + z znalezionymi sieciami oraz ich parametrami. Te informacje są + trochę nieczytelne, ale nam potrzebny jest jedynie ESSID + (nazwa sieci) oraz sam fakt jej obecnosci. Po uzyskaniu tych + informacji musimy utworzyć plik zawierający profil sieci + posiłkując się poleceniem wpa_passphrase. Czasami może + być wymagane dodanie kilku opcji, ale przedstawie to na liście + poleceń. Następnie należy uruchomić polecenie + wpa_supplicant z odpowiednimi przełącznikami oraz opcjami + a na sam koniec należy pobrać adresy IP. Jeśli zestawienie + połączenie niedochodzi do skuktu to może oznaczać, że uruchomiony + jest już demon, którego to my mieliśmy uruchamiać. Można wówczas + wyłączyć jednostkę i zabić wszystkie pozostałe procesy związane + z wpa_supplicant, a następnie spróbować ponownie. Jednak + tutaj mała wskazówka. W raz z obecnością działającego demona + wpa_supplicant w systemie dostępne jest polecenie + wpa_cli, które umożliwia nam podłączenie za + pomocą interaktywnego interfejsu. Nie mniej jednak próba reczenego + podłączenia się do sieci bezprzewodowej wygląda następująco. +
        +xf0r3m@immudex:~$ sudo iwlist wlp1s0 scan
        +xf0r3m@immudex:~$ wpa_passphrase "F1" 'p4ssw0rd' >> f1_wlan.conf
        +#lub
        +xf0r3m@immudex:~$ echo "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev" | tee f1_wlan.conf
        +xf0r3m@immudex:~$ echo "update_config=1" | tee -a f1_wlan.conf
        +xf0r3m@immudex:~$ echo "country=PL" | tee -a f1_wlan.conf
        +xf0r3m@immudex:~$ wpa_passphrase "F1" 'p4ssw0rd' | tee -a f1_wlan.conf
        +xf0r3m@immudex:~$ sudo systemctl stop wpa_supplicant.service
        +xf0r3m@immudex:~$ sudo kill -9 $(ps -aux | grep '^root.*wpa_supplicant' | awk '{printf %2" "}')
        +xf0r3m@immudex:~$ sudo wpa_supplicant -B -Dwext -iwlp1s0 -cf1_wlan.conf
        +xf0r3m@immudex:~$ sudo dhclient
        +
        + Jak możemy zauważyć proces jest nieco bardziej złożony, ale jest + to ręczna metoda. Z racji tego iż opisałem główny proces powyżej + tutaj skupię się na kilku szczegółach. Program + wpa_passphrase tworzy tak zwany + blok sieci w nim zawarta jest nazwa sieci oraz klucz PSK + (hasło do sieci). Mimo tego my podajemy ten plik jako plik + konfiguracyjny wpa_supplicant i w niektórych przypadkach + nie jest wystarczająca konfiguracja. Dlatego też podaje się + takie informacje jak lokalizacja interfejsu sterowania + wpa_supplicant + (ctrl_interface=DIR=/var/run/wpa_supplicant), + grupa użytkowników, którzy mogą sterować wpa_supplicant + (GROUP=netdev), zezwolenie na + możliwość modyfikacji konfiguracji + (update_config=1) oraz kod ISO + kraju w którym działa odbiornik + (country=PL). Kod kraju jest o + o tyle istotny, że każdy kraj posiada swoje regulacje prawne + odnośnie wykorzystania częstotliwości radiowych, które są + wykorzystywane przez sieci bezprzewodowe. Na przykład w Polsce + dostępnych jest 13 kanałów a w USA tylko 11. A to są tylko kanały + większość krajów reguluje również moc nadawczą. Więc manipulacja + kodem kraju może wpłynąć na siłę sygnału i poprawić jakość + połączenia. Kolejną rzeczą jest działanie już wpa_supplicant + w systemie. Ten program może działać jako usługa. Dzięki czemu + możemy zapisać bloki sieci w ogólnym pliku konfiguracjnym. + Wówczas powoduje to, że jeśli komputer z włączony demon znajdzie + się w zasięgu sieci, zostanie z nią połączony. W przypadku kiedy + łaczność ma być wykonywana na żadanie użytkownika działanie demona + nie jest pożądane. Dlatego demona należy wyłączyć, ale mimo jego + wyłączenia nadal może pozostawać proces, który bedzie blokował + próbę podłączenia się. Dlatego też ważne jest aby pozbyć się + tego procesu i za to odpowiada polecenie + (kill) w podstawieniu polecenia + uzyskujemy PID tego procesu. Uruchomienie polecenia + wpa_supplicant wymaga kilku opcji. Opcja + -B uruchamia narzędzie w tle, + opcja -D wraz z wartością + wext jest to wskazanie sterownika + odpowiedzialnego za obsługę sieci bezprzewodowej, dostępnych jest + ich kilka, wext jest rozwiązaniem + przestarzałym niemniej jednak cechuje się obsługa przez bardzo + wiele układów kart bezprzewodowych na rynku. Następnie po opcji + -i podaje się interfejs sieciowy, + ostatnią opcją jest -c, która + wskazuje na plik konfiguracyjny. Zwróćmy uwagę na to, iż opcję + wraz z wartościami zapisujemy łącznie. + Inną opcją skorzystania z tego + pakietu jest wykorzytanie narzędzia wpa_cli. + Poniżej znajduje się lista polecenie, jakich należy użyć. Użycie + wpa_cli wymaga działania demona wpa_supplicant. +
        +xf0r3m@immudex:~$ sudo wpa_cli
        +> scan
        +> scan_results
        +#tu_wyswietli_sie_lista_znalezionych_sieci
        +> add_network
        +#tu_wyswietli_sie_id_sieci_wazne_bo_sluzy_do_odlowania_sie_do_sieci
        +> set_network 0 ssid "nazwa_sieci/ESSID"
        +> set_network 0 psk "haslo/PSK"
        +> enable_network 0
        +#tu_wyswietli_sie_informacja_o_podlaczaeniu_do_sieci
        +> save_config
        +> quit
        +
        + Jeśli nie chcemy aby połączenie zostało zapisane dołączenia + do łączenia automatycznego to należy pominąć przedostatnią opcję. +
      • +
      +

      + Na konfiguracji narzędzia wpa_suplicant zakończymy temat + konfiguracji sieci w Linuks. Jednak to nie koniec tematów + sieciowych ponieważ następne dwa rozdziały będą na niej bazować. +

      +
+

+ 2022; COPYLEFT; ALL RIGHTS REVERSED; +

+ + diff --git a/articles/terminallog/RedHat_-_RHCSA.html b/articles/terminallog/RedHat_-_RHCSA.html new file mode 100755 index 0000000..d77a9e0 --- /dev/null +++ b/articles/terminallog/RedHat_-_RHCSA.html @@ -0,0 +1,17663 @@ + + + + + + + + + +
+
+

Red Hat Enterprise Linux 9 - Red Hat Certified System Administrator

+ +

+ Źródła: +

+
    +
  1. RHCSA® Red Hat® Enterpise Linux® 8 (UPDATED). + Training and Exam Preparation Guide. Second Edition. + Asghar Ghori
  2. +
  3. How to configure a storage device to use VDO deduplication and compression in RHEL 9?
  4. +
  5. RHEL 9 networking: Say goodbye to ifcfg-files, and hello to keyfiles
  6. +
  7. Strony podręcznika Red Hat Enterprise Linux 9
  8. +
+ +
+
+
+
+ ____          _ _   _       _   
+|  _ \ ___  __| | | | | __ _| |_ 
+| |_) / _ \/ _` | |_| |/ _` | __|
+|  _ <  __/ (_| |  _  | (_| | |_ 
+|_| \_\___|\__,_|_| |_|\__,_|\__|
+                                 
+
+ +
+

1. Wstęp

+

+ Chcąc zmienić coś w swoim życiu postanowiłem, że zacznę od pracy. + Dalej chciałem pracować w IT, tylko na innym stanowisku (praca + szkolnego administratora + jest porównywalna z pracą technika IT, tu ma ktoś problem z systemem, + tu trzeba podłączyć rzutnik, szczerze to znudziła się praca tego + typu). Dobrze czułem się pracując z + Linuksem, to była moja pasja. Znałem dwa stanowiska na których + mógłbym pracować: Linux System Administrator lub + Linux System Engineer. + Teraz na rynku pracy jeśli chodzi o IT ważniejsze są + uzyskane certyfikaty i odbyte kursy niż wykształcenie akademickie. + Szukając certyfikatów, + które spowodują większe szanse na zatrudnienie, znalazłem dwa. + Linux Fundation oraz Red Hat. Po przeczytaniu postu a + na Reddit + doszedłem do wniosku, że lepszym wyborem będzie Red Hat. Jeśli + chodzi o produkcyjne wykorzystanie Linuksa to większość używa + Red Hat Enterprise Linux lub jego darmowego + odpowiednika. Kiedyś CentOS ale + obecnie może być to zarówno Rocky lub Alma Linux, + oba są oparte na tym + systemie. Szukając jakiś materiałów w internecie, które + pomogły by mi się przygotować natrafiłem na Amazonie na książke + Asghara Ghori pt. RHCSA Red Hat Enterprise Linux 8 (UPDATED): + Training and Exam Preparation Guide (EX200), Second Edition + zamówiłem ją na swojego Kindla i zacząłem przygotowywać się do + egzaminu. +

+

1.1. Egzamin

+

+ Egzamin EX200 dający uprawnienia Red Hat Certified System + Administrator jest egzaminem praktycznym sprawdzającym umiejętność + instalacji, konfiguracji oraz rozwiązywania podstawowych problemów + administracyjnych na dystrybucji Red Hat. Egzamin będzie odbywać + się w postaci elektronicznej i zdający będzie mięć do dyspozycji + dwie maszyny wirtualne do wykonania zadań egzaminacyjnych. Takie + też środowisko przygotujemy sobie do nauki. Na dzień 11 listopada + 2020 (tak jak podaje książka) egzamin obejmuje 69 zagadnień jednak + ta liczba, ze względu na rozwój technologii jak i samego + RHEL-a mogła ulec już zmianie. +

+

1.2. Zagadnienia

+

+ Zagadnienia używane na egzaminie mogą cały czas ewoluować. Odnośnik + obok przedstawia aktualne zagadnienia egzaminacyjne: + http://www.redhat.com/training/courses/ex200/examobjective. Obecnie egzamin zadawany jest na + RHEL 9, wydanym 17 maja 2022. Dość istotną zmianą w produkcji + tego + systemu jest zmiana upstreamu. Ta wersja Red Hat nie + jest + już oparta na dystrybucji Fedora tak jak wszystkie do tej + pory, ale na CentOS Stream (nowa wersja non-stream tej + dystrybucji nie jest już dostępna stąd + rozbicie społeczonościowych dystrybucji do zastosowań produkcyjnych na + Rocky oraz Alma Linux) i tej wersji będziemy używać + na maszynach wirtualnych. +

+

1.3. Przygotowania

+

+ Kiedy uznałem, że chce zdobyć RHCSA, uzyskałem + Red Hat na zasadzie + Non-cost RHEL Individual Developer Subscription, gdzie + istotne informacje znajdują się w odnośniku obok: + https://developers.redhat.com/articles/faqs-no-cost-red-hat-enterprise-linux. + Przy użyciu tej subskrypcji uzyskamy dostęp do Red Hat przez rok na + 16 instalacji (bez znaczenia czy to fizyczny komputer, czy maszyna + wirtualna). Po tym czasie należy zalogować się ponownie, zakceptować + warunki umowy i do około 30 minut powinnimy uzyskać ponowny rok + subskrypcji i tak co roku. Wszystko jest opisane na powyższej stronie. + System w wersji 9 zainstalowałem na komputerze przeznaczony do + codziennego użytku. Najlepszym sposobem na nauczenie się + administracji systemem jest jego używanie na co dzień, a że jest + entuzajstą a nie + profesjonalistą, mój kontakt z systemami tego typu jest raczej dość + mocno ograniczony. Dlatego też przesiadłem się na RHEL, póki + co to ten + system poprostu działa, wcześniej korzystałem z Fedory 35 oraz + Debiana 11. Do celów dydaktycznych potrzebujemy peceta lub laptopa + z min. dwurdzeniowym procesorem z możliwością wirtualizacji 64-bitowych + systemów, 8GB pamięci operacyjnej oraz min. 40GB + wolnej przestrzeni na dysku na potrzeby utworzenia maszyn wirtualnych + z wymagną przez ćwiczenia przestrzenią dyskową. Do tego celu możemy + użyć dowolnego środowiska wirtualizacji, które znamym. Jeśli nie + mieliśmy wcześniej żadnego kontatku z tego typu oprogramowaniem, to + najlepiej jest użyć oprogramowania Oracle VirtualBox, + dającego najprostszy + interfejs do interakcji z maszynami, gdyż przy późniejszych + zagadnieniach będziemy musieli zmienić jej ustawienia lub dodać kilka + urządzeń. Czy ktoś zainstaluje na swoim + komputerze RHEL czy nie to, + już indywidualna sprawa i nie wypłynie ona wykonanie ćwiczeń. Nie + mniej jednak, w podpunkcie odnośnie maszyn wirtualnych tego rodziału + przedstawie skrypt powłoki, który po uruchomieniu utworzy + automatycznie maszyny wymagane do wykonania ćwiczeń. Ale póki co + przedstawie teraz instalacje Oracle VirtualBox na + RHEL 9. +

+

1.3.1. Instalacja Oracle VirtualBox na RHEL 9.0

+

+ Pierwszą czynnością jest uruchomienie przeglądarki i przejście pod + adres: https://www.virtualbox.org/wiki/Linux_Downloads, na samym dole strony znajdują się pliki repozytorium + dla kilku dystrybucji Linuksa. Kopiujemy adres odnośnika do pliku + konfiguracyjnego repozytorium. Następnie możemy wydać polecenia: +

+
+[xf0r3m@primeb450 ~]$ sudo wget https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo
+[xf0r3m@primeb450 ~]$ sudo dnf update
+Updating Subscription Management repositories.
+Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs)        6.3 kB/s | 4.1 kB     00:00    
+Red Hat Enterprise Linux 9 for x86_64 - BaseOS (RPMs)            10 kB/s | 4.1 kB     00:00    
+Oracle Linux / RHEL / CentOS-9 / x86_64 - VirtualBox             99  B/s | 181  B     00:01    
+Oracle Linux / RHEL / CentOS-9 / x86_64 - VirtualBox            1.9 kB/s | 1.7 kB     00:00    
+Importowanie klucza GPG 0x98AB5139:
+ Identyfikator użytkownika: „Oracle Corporation (VirtualBox archive signing key) <info@virtualbox.org>”
+ Odcisk                   : 7B0F AB3A 13B9 0743 5925 D9C9 5442 2A4B 98AB 5139
+ Z                        : https://www.virtualbox.org/download/oracle_vbox.asc
+W porządku? [t/N]: t
+Oracle Linux / RHEL / CentOS-9 / x86_64 - VirtualBox                    8.6 kB/s | 7.8 kB     00:00    
+Rozwiązano zależności.
+Nie ma nic do zrobienia.
+Ukończono.
+[xf0r3m@primeb450 ~]$ sudo dnf install VirtualBox-6.1 kernel-devel
+Updating Subscription Management repositories.
+Ostatnio sprawdzono ważność metadanych: 0:04:10 temu w dniu sob, 13 sie 2022, 10:12:38.
+Rozwiązano zależności.
+...
+
+

+ Po instalacji restartujemy komputer. +

+
+[xf0r3m@primeb450 ~]$ sudo reboot
+
+

+ Teraz Oracle VirtualBox jest gotów do działania. +

+

+ Jeśli chcemy możemy użyć RPMFusion. Po + załadowaniu tych repozytoriów do swojego systemu możemy od razu wydać + polecenie: +

+
+[user@centos9 ~]$ sudo dnf install VirtualBox kernel-devel
+...
+[user@centos9 ~]$ sudo su
+[root@centos9 user]# akmods
+Checking kmods exist for 5.14.0-142.el9.x86_64 [  OK  ]
+[root@centos9 user]# sudo systemctl restart vboxdrv.service
+[root@centos9 user]# sudo systemctl status vboxdrv.service
+● vboxdrv.service - Linux kernel module init script
+     Loaded: loaded (/usr/lib/systemd/system/vboxdrv.service; enabled; vendor preset: enabled)
+     Active: active (exited) since Mon 2022-08-15 16:13:27 CEST; 6s ago
+    Process: 62653 ExecStart=/sbin/modprobe vboxdrv (code=exited, status=0/SUCCESS)
+    Process: 62657 ExecStart=/sbin/modprobe vboxnetflt (code=exited, status=0/SUCCESS)
+    Process: 62658 ExecStart=/sbin/modprobe vboxnetadp (code=exited, status=0/SUCCESS)
+   Main PID: 62658 (code=exited, status=0/SUCCESS)
+        CPU: 133ms
+...
+
+

1.3.2. Pozyskanie obrazu ISO z Red Hat Enterprise Linux 9

+

+ Aby pobrać potrzebny nam obraz musimy zarejestrować się w subskrypcji + dla + indywidualnych deweloperów. Przechodzimy na stronę https://developers.redhat.com/register i rejestrujemy się. Następnie + logujemy i po zalogowaniu przechodzimy na stronę: https://developers.redhat.com/products/rhel/download. + w sekcji All Downloads znajdują się wszystkie dostępne wersje + RHEL objęte jeszcze wsparciem. Nas będzie interesować + wyłącznie + wersja 9 i tą też pobieramy, oczywiście dla architektury x86_64 + w wersji DVD. +

+

1.3.3. Tworzenie maszyn wirtualnych z RHEL

+

+ Tworzenie maszyn wirtualnych, nie jest zaganieniem + egzaminacyjnym. Na egzaminie dostaniemy dostęp do dwóch zdalnych + maszyn. Teoretycznie można by użyć fizycznych maszyn o ile ktoś ma + do takowych dostęp, jednak do drugiej maszyny trzeba dodać aż 8 dysków, + więc użycie wirtualnej maszyny, to chyba jedyne efektywne rozwiązanie. + Poniżej znajdują się wymagania jakie powinna spełniać każda z nich: +

+
    +
  • RHEL9-VM1: +
      +
    • 64-Bitowy Red Hat Enterprise Linux 9.0,
    • +
    • 1 wirtualny procesor,
    • +
    • 1024 MB pamięci operacyjnej,
    • +
    • 10GB dysk twardy, wyłącznie na instalacje systemu,
    • +
    • Karta sieciowa ustawiona na bridged.
    • +
    • Nazwa hosta ustawiona na server1.example.com
    • +
    • Stały adres IP, pozwalający na swobodną komunikację w sieci
    • +
  • +
  • RHEL9-VM2: +
      +
    • 64-bitowy Red Hat Enterprise Linux 9.0,
    • +
    • 1 wirtualny procesor
    • +
    • 2048 MB pamięci operacyjnej
    • +
    • 10 GB dysk twardy, na instalacje systemu
    • +
    • 4 x 250 MB dysk twardy, dla ćwiczeń z LVM
    • +
    • 2 x 10 GB dysk twardy, dla ćwiczeń z VDO
    • +
    • 1 x 1 GB dysk twardy, dla ćwiczeń ze Stratis
    • +
    • Nazwa hosta ustawiona na server2.example.com
    • +
    • Stały adres IP, pozwalający na swobodną komunikację w sieci
    • +
  • +
+

+ Maszyny możemy utworzyć ręcznie, zgodnie z wtycznymi dla używanego + przez nas środowiska wirtualizacji. Jeśli jednak korzystamy z + VirtualBox możemy wykorzystać poniższe skrypty. + W przypadku drugiej maszyny dodatkowe dyski trzeba będzie dodać z + poziomu ustawień maszyny. +

+
    +
  • RHEL9-VM1: +
    +#!/bin/bash
    +
    +vboxmanage=$(which vboxmanage);
    +vmname="RHEL9-VM1";
    +bridged_if="";
    +
    +$vboxmanage createvm --name $vmname --ostype RedHat_64 --register;
    +
    +$vboxmanage createhd --filename "$HOME/VirtualBox VMs/${vmname}/OS.vdi" --size \
    +10240 --format VDI --variant Standard;
    +$vboxmanage storagectl $vmname --name SATA0 --add sata;
    +
    +$vboxmanage modifyvm $vmname --memory 1024;
    +$vboxmanage modifyvm $vmname --graphicscontroller vmsvga;
    +$vboxmanage modifyvm $vmname --nic1 bridged;
    +$vboxmanage modifyvm $vmname --bridgeadapter1 $bridged_if;
    +
    +$vboxmanage storageattach $vmname --storagectl SATA0 --port 0 --type hdd --medium \
    +"$HOME/VirtualBox VMs/${vmname}/OS.vdi";
    +$vboxmanage storageattach $vmname --storagectl SATA0 --port 1 --type dvddrive \
    +--medium "$HOME/Pobrane/rhel-baseos-9.0-x86_64-dvd.iso";
    +
    +
  • +
  • RHEL9-VM2: +
    +#!/bin/bash
    +
    +vboxmanage=$(which vboxmanage);
    +vmname="RHEL9-VM2";
    +bridged_if="";
    +
    +$vboxmanage createvm --name $vmname --ostype RedHat_64 --register;
    +$vboxmanage createhd --filename "$HOME/VirtualBox VMs/${vmname}/OS.vdi" --size \
    +10240 --format VDI --variant Standard;
    +
    +$vboxmanage createhd --filename "$HOME/VirtualBox VMs/${vmname}/VDO1.vdi" --size \
    +10240 --format VDI --variant Standard;
    +$vboxmanage createhd --filename "$HOME/VirtualBox VMs/${vmname}/VDO2.vdi" --size \
    +10240 --format VDI --variant Standard;
    +
    +$vboxmanage createhd --filename "$HOME/VirtualBox VMs/${vmname}/Stratis.vdi" \
    +--size 1024 --format VDI --variant Standard;
    +
    +$vboxmanage storagectl $vmname --name SATA0 --add sata;
    +$vboxmanage modifyvm $vmname --memory 2048;
    +$vboxmanage modifyvm $vmname --graphicscontroller vmsvga;
    +$vboxmanage modifyvm $vmname --nic1 bridged;
    +$vboxmanage modifyvm $vmname --bridgeadapter1 $bridged_if;
    +
    +$vboxmanage storageattach $vmname --storagectl SATA0 --port 0 --type dvddrive \
    +--medium "$HOME/Pobrane/rhel-baseos-9.0-x86_64-dvd.iso";
    +
    +$vboxmanage storageattach $vmname --storagectl SATA0 --port 1 --type hdd --medium \
    +"$HOME/VirtualBox VMs/${vmname}/OS.vdi";
    +
    +i=2;
    +while [ $i -le 5 ]; do
    +  $vboxmanage createhd --filename "$HOME/VirtualBox VMs/${vmname}/LVM${i}.vdi" --size \
    +  250 --format VDI --variant Standard;
    +  $vboxmanage storageattach $vmname --storagectl SATA0 --port $i --type hdd --medium \
    +  "$HOME/VirtualBox VMs/${vmname}/LVM${i}.vdi";
    +  i=$((i + 1));
    +done
    +
    +$vboxmanage storageattach $vmname --storagectl SATA0 --port 6 --type hdd --medium \
    +"$HOME/VirtualBox VMs/${vmname}/VDO1.vdi";
    +$vboxmanage storageattach $vmname --storagectl SATA0 --port 7 --type hdd --medium \
    +"$HOME/VirtualBox VMs/${vmname}/VDO2.vdi";
    +
    +$vboxmanage storageattach $vmname --storagectl SATA0 --port 8 --type hdd --medium \
    +"$HOME/VirtualBox VMs/${vmname}/Stratis.vdi";
    +
    +
  • +
+

+ Powyższe skrypt są również dostępne na moim profilu na github-ie. Pod + poniższymi linkami. +

+ +

+ Korzystając ze skryptów należy pamiętać o zmianie intefejsu + sieciowego wykorzystywanego do mostkowania. Zmienna + bridge_if. +

+

+ Po utworzeniu maszyn przyszedł czas na instalację. +

+

1.3.4. Instalacja Red Hat Enterprise Linux 9.0

+

+ Zaraz po uruchomieniu maszyny rozpocznie się proces ładowania + zawartości płyty. Menu bootowania płyty zawiera trzy opcje. +

+
    +
  1. Install Red Hat Enterprise Linux 9.0
  2. +
  3. Test this media & install Red Hat Enterprise Linux 9.0
  4. +
  5. Troubleshooting
  6. +
+

+ Domyślnie zaznaczoną jest opcja numer 2. Mamy minutę na zmianę + decyzji. Naciśnięcie dowolnego klawisza zatrzymuje odliczanie. Dając + nam czas do namysłu, jednak na ten moment nie ma co za bardzo rozmyślać + dlatego też wybieramy opcję numer 1. Po wybraniu tej opcji nastąpi + uruchomienie systemu oraz instalatora. Instalator używany przez RHEL + oraz dystrybucje z nim związane + nazywa się Anaconda. Swoje działanie + rozpoczyna jeszcze w trybie tekstowym, następnie domyślnie uruchamia + tryb graficzny, gdzie odbywa się konfiguracja instalcji a następnie + już właściwa instalacja. + Nie mniej jednak instalacja w trybie tekstowym jest również możliwa. + Podczas instalacji, poza głównym instalatorem będziemy mieć do + dyspozycji + multipekser terminala, który do momentu uruchomienia właściwego + instalatora (w wersji graficznej) był główną konsolą. W multiplekserze + będzie my mieć dostęp do komunikatów diagnostyczny, które w wersji 8 + RHEL był wyświetlane na oddzielnych konsolach; kilka powłok z + uprawnieniami superużytkownika (uruchomione na konsolach 2, 3 i 5) + oraz konsolę z komunikatami przechwytywanymi przez główny + rejestrator systemu rsyslog. Udostępnienie tych funkcjonalności + podczas instalacji systemu, może pomóc w ewentualnym diagnozowaniu i + naprawie problemów z instalacją. + Pliki z komunikatami na czas instalacji przechowywane są w katalogu + /tmp, po instalacji zostaną one przeniesione do katalogu + /var/log/anaconda. Według mnie jest dość przydatna + funkcjonalność, ponieważ na podstawie czasu modyfikacji tych plików + możemy dowiedzić się kiedy system został zainstalowany. Poniżej + znajduje się lista, opisująca za co odpowiada konkretna konsola + (kolejny ekran, dostępny po naciśnięciu klawiszy Ctrl + Alt + F1 - F6). +

+
    +
  • CTLR + ALT + F1 - multiplekser terminala,
  • +
  • CTRL + ALT + F2 - powłoka z dostępem do root,
  • +
  • CTRL + ALT + F3 - powłoka z dostępem do root,
  • +
  • CTRL + ALT + F4 - komunikaty diagnostyczne + rejestratora syslog.
  • +
  • CTRL + ALT + F5 - powłoka z dostępem do root,
  • +
  • CTRL + ALT + F6 - tryb graficzny.
  • +
+

+ Instalacja Red Hat Enterprise Linux rozpoczyna się od wyboru języka + procesu instalacji. Chcąc pracować już w takim prawowitym IT, należy + posługiwać się językiem angielskim i to technicznym. Systemy z którymi + zderzmy się w potencjalnej pracy raczej będą systemami o zasięgu + międzynarodowym, prawdopodobnie już o tym wspominałem ale egzamin + pozwalający uzyskać certyfikacje RHCSA również będzie po + angielsku. + Dlatego też instalować jak i korzystać z systemu będziemy w języku + angielskim, na pierwszym ekranie wybieramy English + pozostawiając wariant English (United States). Następnym + ekranem jest Installation Summary (lewy górny róg), jest tak + jakby pulpit programu instalacyjnego, na nim występują komponenty, + które możemy skonfigurować. W wersji 9.0, te komponenty są podzielone + na 4 sekcje: Localization, Software, System + oraz User Settings. W pierwszym procesie instalacji, + przejdziemy przez wszystkie z nich. +

+

+ Zwróć my uwagę na to, iż system sam dokonał wstępnej konfiguracji + instalatora, na pozostało jedynie sprawdzić oraz skonfigurować tylko + te opcje oznaczone znakiem ostrzegawczym oraz czerwoną podpowiedzią. Po + ich konfiguracji program umożliwi nam zainstalowanie systemu. +

+

+ W sekcji lokalizacyjnej do ustawienia są takie opcje, układ klawiatury, + język, oraz data i czas. Podczas ładowania pierwszego okna (moment + wybrania języka instalacji), instalator na podstawie informacji + GeoIP + postara się określić naszą przybliżoną lokalizację, o ile posiada on + na tym momencie połączenie z internetem. Dlatego też możemy + spotkać się z samoinstnie wybranym języku instalacji ustawionym na + Polski. Język został zmieniony, ale wybrana strefa czasowa może + pozostać, wręcz powinna. Dzięki tej funkcji możemy zaoszczędzić czas, + i przejść do kolejnej sekcji. +

+

+ Kolejną sekcja dotyczy oprogramowania, tutaj konfigurowane będzie + na przykład połączenie z firmą Red Hat. RHEL jest + system + licencjonowanym i jeśli chcemy skorzystać z oficjalnych repozytoriów + należy "podłączyć" system do naszego konta założonego w celu + pozyskania obrazu płyty. Jednak na razie nie trzeba tego, będzie to + do zrobienia na późniejszych etapach nauki administracji systemem. + Kolejną opcją jest Installation Source (Źródło instalacji), + konfigurąc tę opcję możemy + wybrać czy będziemy korzystać pod czas instalacji z obrazu płyty lub + sieciowego repozytorium lub Red Hat CDN. Z racji tego, iż ściągneliśmy + pełny obraz + ważący kilka gigabajtów, nie ma sensu używać instalacji sieciowej. + Tego typu źródło instalacji należy wybrać w momencie gdy pobraliśmy + minimalistyczną wersję obrazu, dlatego też zostaniemy przy standardowym + wyborze Local media. Ta opcja pozwala też na dodanie podczas + instalacji dodatkowego repozytorium, jednak na tym etapie nie będziemy + się tym zajmować. Ostanią opcją z tej sekcji jest Software + selection, ta opcja daje nam możliwość, wyboru rodzaju instalacji. + Na potrzeby nauki, wybierzemy opcję Server with GUI, jeśli + będziemy instalować RHEL na naszym komputerze do codziennego + użytku + możemy wybrać Workstation. Wybierając rodzaj instalacji po + lewej stronie, po prawej wyświetają się dodatkowe pakiety lub + warianty do zainstalowania. +

+

+ Sekcja System, służy głównie do wyboru docelowego miejsca dla + instalacji. W opcji Instalation Destination, + wskazujemy docelowy dysk do instalacji, możemy go spartycjonować + ręcznie lub automatycznie możemy również zaszyfrować partycje, + jeśli jest taka potrzeba. W przypadku szyfrowania danych + bardzo ważny jest układ klawiatury. Innymi opcjami + póki co dla nas ważnymi jest Network & Host name, w + założeniach zadania, może być wymagane ustawienie odpowiedniego adresu + oraz nazwy dla maszyny, to te opcje + ustawiamy właśnie tam. Pozostałe opcje tej sekcji, poki co nie są + dla nas istotne. +

+

+ Ostatnia sekcja ustawia hasło dla superużytkownika oraz tworzy konto + dla pierwszego użytkownika. Nie musi on posiadać uprawnień + administratora i nie będzie ich miał. Opcja utworzenia użytkownika + może się nie mieścić na ekranie, podczas instalacji systemu maszynie + witualnej, dlatego nie należy przejmować, że jej nie ma. Wystarczy + przewinąć wyświetlany oraz paskiem przewiajania po prawej stronie. +

+

+ Teraz kiedy wszyskie (te istotne dla instalacji) opcje zostały opisane + możemy + zainstalować system zgodnie założeniami pierwsze maszyny i powtorzyć + to na drugiej. I to jest pierwsze ćwiczenie. +

+

Ćwiczenie 1: Instalacja Red Hat Enterprise Linux 9

+

+ Stwórz zgodnie założeniami podanymi w podrozdziale + Tworzenie maszyn wirtualnych z RHEL maszynę RHEL-VM1. + Następnie korzystając z sugestii + podanych podczas opisu procesu instalacji zainstaluj na niej Red Hat + Enterprise Linux 9. + Powtórz tę czynność na drugiej maszynie przeznaczonej do laboratorium. + Pamiętaj, że założenia dla drugiej maszyny różnią się. +

+

Ćwiczenie 2: Logowanie zdalne do RHEL

+

+ Wykorzystując program do obsługi protokołu SSH dla twoje systemu + operacyjnego zaloguj się na superużytkownika. Pamiętaj o tym, że + bezpośrednie logowanie na superużytkownika wymagało zaznaczenia opcji + w trakcie ustawiania hasła dla niego podczas instalacji. +

+

Podsumowanie

+

+ W tym rozdziale przeszliśmy przez proces instalacji RHEL. + Dowiedzielśmy się, że możliwa jest instalacja w trybie tekstowym oraz + oraz, że nie należy ona do najtrudniejszych. Warto zwrócić uwagę na to + iż jeśli do tej pory korzystaliśmy z jakiś materiałów to dotyczą one + wersji 8 RHEL, my będziemy korzystać z wersji 9, bo to na niej + w 2022 + roku będziemy przeprowadzany egzamin, a między tymi wersjami jest kilka + zmian. + W następnym rozdziale zapoznamy się z środowiskiem graficznym, + strukturą katalogów oraz podstawowym narzędziami do pracy w powłoce. +

+

2. Poruszanie się po systemie RHEL 9

+

+ Wykonując ćwiczenia z pierwszego rozdziału, zainstalowaliśmy sobie + Red Hat w wersji 9 na maszynie wirtualnej. Jako wariant wyboru + oprogramowania wybraliśmy Server with GUI i od drobnego + omówienia środowiska graficznego rozpocznę ten rodział. +

+

2.1. Środowisko graficzne RHEL 9

+

+ Red Hat jest dystrybucją Linuksa przeznaczoną do zastosowań + produkcyjnych, więc system tego typu musi wykazywać się dużą + stabilnością. Znaczące zmiany są wprowadzane raczej w dużych wydania + jak RHEL 9, takim znaczącym przeskokiem jest zmiana linii + jądra z + 4.18 (w przypadku RHEL 8) na 5.14 (w przypadku RHEL + 9) oraz zastąpienie + klasycznego serwera X Window protokołem Wayland, to + jednak nastąpiło z + wydaniem RHEL 8. Zmiany w RHEL 9, odnośnie środowiska + graficznego + to przejście z Gnome 3.38 na Gnome 40, ta zmiana + przyniosła również + odświerzenie menedżera wyświetlania lub menedżera logowania czym w + przypadku środowiska Gnome jest GDM. Większość + elementów pozostała + taka sama na górnej belce mamy datę oraz czas w prawyn górnym rogu + do wyboru opcje ułatwień dostępu, wskaźnik połączenia sieciowego oraz + porozwinięciu możliwość regulacji głośności i jasności ekranu oraz + wyłączenia komputera. Wiecej opcji w tym miejscu będzie dostępne dopiero + po zalogowaniu. Będzie można zmienić kilka ustawień jak np. sieć + bezprzewodwą. Zmianie uległ również sposób prezentacji kont użytkownika. + Z racji tego iż root nie jest zwykłym użytkownikiem nie będzie + pojawiać się na liscie, ale zalogowanie na niego jest możliwe za pomocą + kliknięcia w Not Listed? pod listą użytkowników, wówczas + będzie mogli + ręcznie podać nazwę użytkownika oraz hasło. Ekranem startowym po + zalogowaniu jest ekran Activities, który pozwala na podgląd + wykonywanych czynności, rozpoczęcie nowych (wybierając aplikacje z + doka lub z pełnej listy aplikacji, która jest dostępna po kliknięciu + na ikonę 9 kropek w doku) oraz przełacznie się między obszarami + roboczymi. Domyślnie GNOME daje dostęp do dwóch przestrzeni + roboczych, + gdy tylko przeniesiemy aplikację do na nowy obszar, GNOME + udostępni + nam kolejny i tak dalej. Wyszukiwarka nad podgląd obszaru roboczego + daje możliwość wyszukiwania nie tylko aplikacji ale także ustawień co + jest normą w GNOME od wersji 3. Na doku znajdują się ulubione + aplikacje, które możemy usuwać i dodawać za pomocą PPM i następnie + wybierając dodaj lub usuń z ulubionych. +

+

2.2. Struktura katalogowa w Uniksach

+

+ Zanim jednak przejedziemy do obsługi wiersza poleceń omówimy sobie + hierachiczną strukturę katalogów, która występuje nie tylko w + RHEL ale + i w innych Uniksach, ponieważ HFS + (ang. Hierarchy File System) + jest ogólnym standardem. Na Uniksach możemy spotkać się z trzema typami + systemów plików. +

+
    +
  • Disk-based - dyskowe - są to klasyczne + pliki i katalogi przechowywane bezpośrednio na dysku.
  • +
  • Network-based - sieciowe - są to udziały + podmontowane w naszych systemach za pomocą róznych protokołów, nie + tylko SMB. Plik network-based są plikami disk-based, + ale na innych komputerach.
  • +
  • Memory-based - wirtualne - te systemy + plików są tworzone przez procesy na potrzeby działania systemu, takim + systemem może być katalog /dev lub /proc. Ich + trwałość często zależy od tego jak długo system pozostaje włączony + lub od wewnętrznych ustaleń samego systemu.
  • +
+

+ Struktura plików i katalogów na Uniksach ma postać odwróconego drzewa. + Korzeń (katalog główny) znajduje się na szczycie struktury i od niego + rozchodzą się poszczególne gałęzie (podkatalogi), gałęzię mogą zawierać + kolejne rozgałezienia, tworząc całe struktury. Na gałęziach + znajdują się również liscie czyli pliki i na liściach struktura się + kończy. +

+

+ Dostęp do konkretnych plików i katalogów w strukturze określany jest + za pomocą ścieżek. Scieżki określają położenie plików i katalogów + wewnątrz HFS. + Separatorem elementów ścieżki (posczególnych podkatalogów), jest + ukośnik, slash (/). +

+

+ Podczas pracy z elementami jak foldery oraz pliki możemy używać + scieżek bezwzględnych zaczynające się od + katalogu głównego, lub ścieżek względnych + zaczynających + się od elementu znajdującego w obecnym katalogu robocznym + (tym katalogu, w którym się obecnie znajdujemy). +

+

+ Katalog główny jest miejscem do przechowywania wszystkich plików, jakie + znajdują się w systemie, jest pierwszym element znajdujący się na + ścieżce (bezwzględnej) i oznaczny jest on poprostu ukośnikiem + (/), od tego katalogu zaczyna się cała struktura. + Poniżej znajduje się lista najważniejszych podkatalogów katalogu + głównego, każdy z nich ma swoje znaczenie w systemie. +

+
    +
  • /boot (disk-based) - katalog ten + przechowuje jądro, initramfs oraz konfiguracje programu + rozruchowego.
  • +
  • /dev (memory-based) - katalog ten + przechowuje pliki urządzeń służące do komunikacji z sprzętowymi + komponentami komputera. Pliki te są tworzone + przez usługę udevd podczas podłączania urządzenia oraz + rozruchu systemu.
  • +
  • /etc (disk-based) - skrót etc + możemy rozwinąć do ang. etcetera lub ang. extended + text configration. Jest to miejsce do przechowywania plików + konfiguracyjnych różnych programów.
  • +
  • /home (disk-based) - ten katalog + przechowuje, katalogi domowe użytkowników.
  • +
  • /opt (disk-based) - katalog przeznaczony + na dodatkowe oprogramowanie instalowane w systemie.
  • +
  • /proc (memory-based) - wirtualna + struktura podkatalogów, zawierająca informacje o procesach oraz + różne informacje o systemie, np. informacje o procesorze.
  • +
  • /run (memory-based) - katalog + przechowywujący pliki wykorzystywane przez procesy podczas + wykonywania ich czynności. W tym katalogu znajduje się również + podkatalog media zawierący punkty montowania podłączanych + do systemu dysków wymiennych.
  • +
  • /sys (memory-based) - katalog + przechowuje informacje o urządzeniach, sterownikach. Pewne + funkcjonalności jądra również są zawarte w tym katalogu. Dane + z tego katalogu są używane przez jądro do obsługi urządzeń.
  • +
  • /tmp (disk-based) - miejsce + przechowywania plików tymczasowych, pliki złożone w tym katalogu + przetrwają ponowne uruchomienie komputera. Okres przechowywania + tych plików to 10 dni.
  • +
  • /usr (disk-based) - skrót usr, + należy rozwinąć jako ang. UNIX System Resources. Ten + katalog jest kolejną dużą strukturą katalogów w systemie. W tym + katalogu przechowywane są wszystkie programy, więc wiekszość + systemu. Na poniższej liście znajdują się rozpisane podkatalogi + tego katalogu: +
      +
    • /usr/bin - katalog przechowuje większosć + plików binarnych, wykorzystywanych w systemie, programów oraz + poleceń.
    • +
    • /usr/sbin - narzędzia administracyjne + niedostępne dla zwykłych użytkowników, poza kilkoma + programami. Ten katalog często nie jest ujęty podczas + wyszukiwania poleceń.
    • +
    • /usr/lib, /usr/lib64 - + biblioteki współdzielone oraz pliki statyczne, niektórych + programów typu init.
    • +
    • /usr/include - pliki nagłówkowe języka C
    • +
    • /usr/local - miejsce przechowywania + zewnętrznych programów instalowanych i + wykorzystywanych przez administatorów, ten katalog zawiera w + sobie podobną strukturę katalogową jak sam /usr.
    • +
    • /usr/share - miejsce przechowywania stron + podręcznika, dokumentacji czy przykładowych plików + konfiguracyjnych.
    • +
    +
  • +
  • /var (disk-based) - katalog na zmienne + dane, katalog podobnie do /usr ma wewnątrz wiele znaczący + podkatalogów, takich jak: +
      +
    • /var/log - katalog na pliki dzienników, + zbierane nie tylko z głównego rejestratora, ale i funkcji + rejestrowania samych usług.
    • +
    • /var/opt - katalog na zmienne dane + oprogramowania instalowanego w katalogu /opt
    • +
    • /var/spool - katalog ten przechowuje dane + zanim zostaną przekazane lub pobrane przez właściwe komponenty, + na przykład poczta elektronicza w przypadku serwerów + pocztowych.
    • +
    • /var/tmp - katalog przechowuje duże pliki + tymczasowe. Pliki złożone w tym katalogu przetrwają + ponowne uruchomienie systemu. Czas ich istnienia w tym katalog + to 30 dni.
    • +
    +
  • +
+

+ Za pomocą polecenia tree, możemy wyświetlić strukturę + katalogą w postaci drzewa, jednak najpierw nauczymy się korzystać z + poleceń w RHEL. +

+

2.3. Obsługa wiersza poleceń i najprostsze polecenia

+

+ Obsługa wiersza poleceń zależy w znacznym stopniu od powłoki, ponieważ + to ona zajmuje się jego interpretacją i koniec końców wykonaniem + programu, którego nazwę podaliśmy chcąc wykonać polecenie. Aby móc + skorzystać w RHEL z wiersza poleceń musimy albo uruchomić w + środowisku + graficznym aplikację Terminal, lub zalogować się + zdalnie za pomocą protokołu SSH. Uruchomienie terminala lub + zalogowanie + się przez SSH uruchomi powłokę, która swoją gotowość na + otrzymywanie + poleceń obwieści wyświetleniem znaku zachęty. +

+

+ Znak zachęty jest wskaźnikiem za kursorem po którym możemy wprowadzać + do systemu + polecenia. Kiedyś znaki zachęty były pojedynczymi znakmi informującymi + o uprawnieniach z jakimi działa proces powłoki (o tym za chwilę). Teraz + znaki zwracają nazwę użytkownika, nazwę komputera oraz obecny katalog + roboczy wewnątrz nawiasu kwadratowego, następnie zanim znajduje się + znak krzyżyka (#) mówiący, że powłoka działa + uprawnieniami użytkownika root lub symbol dolara + ($) mówiący, że połoka działa z uprawnieniami zwykłego + użytkownika. Poniżej przedstawiłem oba znaki: +

+
+[root@server1 ~]#
+
+[user@server1 ~]$
+
+

+ W różnych dystrybucjach, znak zachęty może różnorako wyglądąć. Możemy + dostować go do własnych potrzeb, wiele osób korzysta z jak + najmniejszych + znaków zachęty, aby zaoszczedzić miejsce w wierszu polecenia. Teraz + możemy już wydawać polecenia. +

+

+ Kazde polecenie w jakimkolwiek Uniksie, składa się z nazwy polecenia, + ewentualnych opcji oraz ewentualnych argumentów. Nie wszystkie + polecenia do uzyskania żądanych przez nas efektów wymagają opcji czy + argumentów. +

+
+$ nazwa_polecenia [opcje] [argumenty]
+
+

+ Każde polecenie przed zatwierdzeniem możemy edytować, za pomocą + strzałek lub skrótów klawiszowych dostarczanych przez bibliotekę + GNU Readline. Więcej na ten temat znajdziemy w internecie. +

+

+ Przez cały kurs będziemy poznawać jakieś polecenia ale w tym momencie + nauczymy się najprostszych z nich. +

+

2.3.1. Listowanie zawartości katalogu

+

+ Aby wyświetlić zawartość katalogu w powłoce, możemy użyć polecenia + ls. Polecenie bez podania argumentu w postaci + katalogu wyświetli zawartość folderu, w którym się znajdujemy. + Najważniejszymi opcjami między innymi są: +

+
    +
  • -a - wyświetlanie wszystkich, elementów w katalogu + także tych, które normalnie nie są wyświetlane (plik i foldery, + których nazwa rozpoczyna się od kropki).
  • +
  • -l - wyświetlenie szczegółowych informacji na + temat elementów. Informacja zwracana przez polecenie jest wówczas + podzielona na 9 pól, które kolejno oznaczają: typ pliku oraz + uprawnienia; liczbę dowiązań; nazwę użytkownika (właściciela pliku); + nazwę grupy do której należy ten plik; rozmiar w bajtach; czas + modyfikacji oraz nazwę elementu.
  • +
  • -ld - wyświetla szczegółową informacje na temat + podanego jak argument katalogu, bez wyświetlania jego zawartości. + Jeśli nie podamy argumentu polecenie wyświetli informacje na temat + bierzącego katalogu.
  • +
  • -lh - wyświetli szczegółowo informacje + na temat elementów w katalogu, wyświetlając ich rozmiar w + przeskalowanych wartościach, co ułatwi odczytanie go przez + człowieka.
  • +
  • -lt - wyświetli szczegółową listę elementów + posortową względem czasu modyfikacji od najnowszego pliku.
  • +
  • -ltr - działanie podobne do -lt, ale + odwrócone, elementy zostaną wyświetlone od najstarszego.
  • +
  • -R - wyświetlenie elementów w sposób + rekurencyjny. Polecenie z tą opcją wyświetli zawartość katalogów + wraz z zawartością ich podkatalogów itd.
  • +
+

+ Poniżej znajduje się przykład najczęściej wykorzystywanego polecenia + ls wraz z opcjami: +

+
+[root@server1 ~]# ls -al
+total 10576
+dr-xr-x---. 17 root root    4096 Jun 16 18:49 .
+dr-xr-xr-x. 18 root root     235 Jun  9 19:46 ..
+-rw-------.  1 root root    1197 Jun  9 19:59 anaconda-ks.cfg
+-rw-------.  1 root root    3908 Jun 16 18:50 .bash_history
+-rw-r--r--.  1 root root      18 Aug 10  2021 .bash_logout
+-rw-r--r--.  1 root root     141 Aug 10  2021 .bash_profile
+-rw-r--r--.  1 root root     429 Aug 10  2021 .bashrc
+drwxr-xr-x.  3 root root      17 Jun 16 18:14 bzipped
+drwx------.  8 root root     120 Jun 13 10:55 .cache
+-rw-r--r--.  1 root root      11 Jun 16 13:10 catfile1
+drwx------.  9 root root    4096 Jun 13 13:42 .config
+-rw-r--r--.  1 root root     100 Aug 10  2021 .cshrc
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Desktop
+drwxr-xr-x.  4 root root      30 Jun 16 16:44 dir20
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Documents
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Downloads
+drwxr-xr-x.  3 root root      55 Jun 16 11:34 etc
+-rw-r--r--.  1 root root 4986788 Jun 16 18:13 etc-bzipped.tar.bz2
+-rw-r--r--.  1 root root 5772869 Jun 16 18:12 etc-gzipped.tar.gz
+-rw-r--r--.  2 root root       0 Jun 16 17:26 file10
+-rw-r--r--.  2 root root       0 Jun 16 17:26 file20
+-rw-r--r--.  1 root root     579 Jun 16 11:07 fstab
+drwxr-xr-x.  3 root root      17 Jun 16 18:14 gzipped
+-rw-------.  1 root root      42 Jun 16 18:22 .lesshst
+drwx------.  3 root root      19 Jun 13 10:55 .local
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Music
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Pictures
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Public
+lrwxrwxrwx.  1 root root       6 Jun 16 17:30 soft10 -> file10
+-rw-r--r--.  1 root root     129 Aug 10  2021 .tcshrc
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Templates
+drwxr-xr-x.  2 root root       6 Jun 13 10:55 Videos
+-rw-------.  1 root root    8264 Jun 16 18:38 .viminfo
+-rw-r--r--.  1 root root     464 Jun 16 18:38 vipractice
+
+

+ Podczas korzystania z wielu programów możemy natknąć się na wiele opcji. + Dzielą się one na długie i krótkie, opcje krótkie występują w + postaci pojedynczego znaku poprzedzonego jednym myślnikiem + (-). Opcje długie występuje w postaci pojedynczego + (najczęsciej, ponieważ to zależy od programu) słowa poprzedzonego dwoma + myślnikami (--). W przypadku tak prostych poleceń jak + ls również możemy użyć długich opcji np. zamiast + -a możemy użyć --all. +

+

2.3.2. Wyświetlenie bieżącego katalogu roboczego

+

+ Na pierwszy rzut oka mogłoby się wydawać po co nam to polecenie, + skoro w znaku zachęty na RHEL jest wyświetlona nazwa + bieżącego + katalogu. Polecenie pwd wyświetla ścieżkę bezwzględną + do bieżącego katalogu, a po drugie to polecenie ma bardzo ważną cechę + związaną z dowiązaniami, ale o tym będzie przy dowiązaniach. Do + normalnych zastosowań pwd nie potrzebuje żadnej opcji, ani + żadnego argumentu. +

+
+[root@server1 ~]# pwd
+/root
+
+

2.3.3. Poruszanie się wśrod katalogów

+

+ Generalnie, do zmiany bierzącego katalogu czy przejścia z/do + innego katalogu służy polecenie cd. Pozwala ono na + kilka sztuczek. +

+
    +
  • Powrót do katalogu domowowego nie wymaga przy tym poleceniu żadnego + argumentu ani opcji, wystarczy wydać polecenie cd.
  • +
  • Polecenie zapamiętuje poprzedni katalog roboczy i powrót do niego + wymaga podania po poleceniu cd myślnika (-) + jako argumentu
  • +
  • W ścieżkach chcąć skrócić sobie pisanie, możemy użyć tyldy + (~) jako zamiennika katalogu domowego.
  • +
  • Chcąc przenieść się do katalogu nadrzędnego względem bierzącego + nie musimy znać jego nazyw wystarczy że poleceniu cd podamy + dwie kropki (..)
  • +
+

+ Poniżej zamieściłem przykłady kilku z nich. +

+
+[root@server1 ~]# cd -
+/home/user
+[root@server1 user]# cd ..
+[root@server1 home]# cd 
+
+

2.3.4. Identyfikacja urządzenia terminala

+

+ Czasmi może zajść potrzeba zidentyfikowania własnego urządania + terminalowego służy do tego polecenie tty. Jeśli + wynikiem działania tego polecenie będzie /dev/pts* oznacza to, + że korzystamy z emulatora terminala np. programu Terminal w środowisku + GNOME lub połączenia zdalnego za pomocą protokołu SSH. + Jeśli naszę urządzenie to /dev/tty* oznacza to, że + korzystamy z jednej wirtualnych konsol dostępnych w systemie. +

+
+[root@server1 ~]# tty
+/dev/pts/0
+
+

2.3.5. Czas systemowy oraz załadowanie procesora

+

+ Większości dostępnych Uniksów zapewne zawierać będzie polecenie + uptime. To niepozorne polecenie zawraca dużą ilość + informacji. +

+
    +
  • Czas systemowy,
  • +
  • Ilość czasu jaka upłyneła od uruchomienia systemu (tzw. + uptime),
  • +
  • Ilość zalogowanych do systemu użytkowników,
  • +
  • Średnie załadowanie procesora w przeciągu minuty, 5 i 15 minut, ta + wartość pokazuje zużycie procesora, podając wartości ułamkowe jeśli + np. w ciągu jednej minuty jeden z wątków procesora był wykorzystany + w 50% otrzymamy wynik 0.50. Jeśli posiadamy procesor wielordzeniowy, + ten wskaźnik może + wskazywać wartości powyżej 1, oznacza to że procesy wykorzystują + już więcej niż jeden wątęk/rdzeń.
  • +
+
+[root@server1 ~]# uptime
+ 13:28:40 up 8 min,  1 user,  load average: 0.00, 0.12, 0.12
+
+

2.3.6. Czyszczenie ekranu powłoki

+

+ Do czyszczenia terminala ze zbędnego wyjścia poleceń służy polecenie + clear lub kombinacja klawiszy Ctrl+l. +

+
+[root@server1 ~]# clear
+
+

2.3.7. Określanie ścieżki polecenia

+

+ Czasami w pewnych konfiguracjach lub też w skryptach powłoki niezbędne + będzie podanie ścieżki do konkretnego programu kryjącego się za nazwą + polecenia, w RHEL możemy zrobić to na trzy sposoby + wykorzystując do + tego różne polecenia. Polecenia podałem w przykładzie w raz z + informacją zwracaną przez polecenie. +

+
+[user@rhel90 ~]$ which ls
+alias ls='ls --color=auto'
+	/usr/bin/ls
+[user@rhel90 ~]$ whereis ls
+ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
+[user@rhel90 ~]$ type ls
+ls jest aliasem do ls --color=auto'
+
+

+ Które z tych poleceń będzie właściwe to już zależy, do czego będą nam + potrzebne tego typu informacje. Polecenie whereis wydaje się + szczególnie pomocne. +

+

2.3.8. Wyświetlenie informacji o systemie

+

+ Polecenie uname należy do poleceń, które są dość + niepozorne, ale za pomocą jego opcji możemy otrzymać wersję użytego + jądra, architekturę systemu i tym podobne informacje. Polecenie bez + podania + żadnej z opcji zwraca wyłącznie nazwę systemu i jest to Linux. + Aby otrzymać wszelkie zwracane przez to polecenie informacje możemy + użyć opcji -a. Resztę opcji znajdziemy na stronach + podręcznika (o tym będzie w dalszej części materiału). +

+
+[user@rhel90 ~]$ uname -a
+Linux latitude-e5270 5.14.0-70.13.1.el9_0.x86_64 #1 SMP PREEMPT Thu Apr 14 12:42:38 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux
+
+

2.3.9. Wyświetlanie informacji o procesorze

+

+ W RHEL możemy łatwo sprawdzić informacje na temat zainstalowanego w + naszym komputerze procesora w przystępny sposób. Do dyspozycji mamy + bowiem polecenie lscpu. Wyświetla ono wszystkie + dostępne informacje jakie może znaleźć w systemie na temat tego + komponentu. +

+
+[root@server1 ~]# lscpu
+Architecture:            x86_64
+  CPU op-mode(s):        32-bit, 64-bit
+  Address sizes:         39 bits physical, 48 bits virtual
+  Byte Order:            Little Endian
+CPU(s):                  1
+  On-line CPU(s) list:   0
+Vendor ID:               GenuineIntel
+  Model name:            Intel(R) Core(TM) i5-6300U CPU @ 2.40GHz
+    CPU family:          6
+    Model:               78
+    Thread(s) per core:  1
+    Core(s) per socket:  1
+    Socket(s):           1
+    Stepping:            3
+    BogoMIPS:            5004.62
+    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
+                          mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology
+                          nonstop_tsc cpuid tsc_known_freq pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 
+                         sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowpre
+                         fetch invpcid_single pti fsgsbase avx2 invpcid rdseed clflushopt md_clear flush
+                         _l1d
+Virtualization features: 
+  Hypervisor vendor:     KVM
+  Virtualization type:   full
+Caches (sum of all):     
+  L1d:                   32 KiB (1 instance)
+  L1i:                   32 KiB (1 instance)
+  L2:                    256 KiB (1 instance)
+  L3:                    3 MiB (1 instance)
+NUMA:                    
+  NUMA node(s):          1
+  NUMA node0 CPU(s):     0
+Vulnerabilities:         
+  Itlb multihit:         KVM: Mitigation: VMX unsupported
+  L1tf:                  Mitigation; PTE Inversion
+  Mds:                   Mitigation; Clear CPU buffers; SMT Host state unknown
+  Meltdown:              Mitigation; PTI
+  Spec store bypass:     Vulnerable
+  Spectre v1:            Mitigation; usercopy/swapgs barriers and __user pointer sanitization
+  Spectre v2:            Mitigation; Retpolines, STIBP disabled, RSB filling
+  Srbds:                 Unknown: Dependent on hypervisor status
+  Tsx async abort:       Not affected
+
+

2.4. Uzyskiwanie pomocy

+

2.4.1. Strony podręcznika

+

+ W dystrybucjach Linuksa nie tylko w RHEL możemy znaleźć duża + bazę + zawierającą opisy poleceń, plików konfiguracyjnych oraz innych + komponentów takich jak biblioteki. Służą temu strony podręcznika. Aby + uzyskać do nich dostęp wystarczy wydać polecenie man + podając jako argument interesujący nas komponent. Nie zawsze musi być + to polecenie. Strony podręcznika są podzielone na rozdziały czy też + sekcje ich opisy oraz numery sa zawarte na (o ironio) stronie + podręcznika polecenia man. Wydajmy poniższe polecenie aby + zapoznać się z nim oraz z ich organizacją. +

+
+[xf0r3m@hp-z600 ~]$ man man
+
+

+ Różne komponenty na Linuksie mogą mieć takie same nazwy. Polecenie + man zwraca pierwsze znalezione wystąpienie, jeśli wpiszemy + polecenie man passwd to otrzymamy + informacje na temat polecenia, ale jeśli interesowałoby nas poznanie + szczegółów pliku /etc/passwd musimy podać przed jego nazwą, + numer rozdziału odpowiedzialny za pliki konfiguracyjne. +

+
+[xf0r3m@hp-z600 ~]$ man 5 passwd
+
+

+ Strony podręcznika, możemy przeszukiwać pod kątem występowania słów + kluczowych, w przypadku kiedy znamy zagadnienie ale nie znamy + odpowiedniego polecenia. Do tego celu możemy użyć opcji -k + polecenia man lub polecenia apropos. Wynik + działania tych programów jest taki sam. +

+
+[user@rhel90 ~]$ apropos dos
+dos2unix (1)         - DOS/Mac to Unix and vice versa text file format converter
+dosfsck (8)          - check and repair MS-DOS FAT filesystems
+dosfslabel (8)       - set or get MS-DOS filesystem label or volume ID
+fatlabel (8)         - set or get MS-DOS filesystem label or volume ID
+filesystems (5)      - Linux filesystem types: ext, ext2, ext3, ext4, hpfs, iso9660, JFS, minix, msdos, ncpfs nfs, ntfs, proc, Reiserfs, smb, sysv, umsdos, vfat, XFS, xiafs
+fs (5)               - Linux filesystem types: ext, ext2, ext3, ext4, hpfs, iso9660, JFS, minix, msdos, ncpfs nfs, ntfs, proc, Reiserfs, smb, sysv, umsdos, vfat, XFS, xiafs
+fsck.fat (8)         - check and repair MS-DOS FAT filesystems
+fsck.msdos (8)       - check and repair MS-DOS FAT filesystems
+fsck.vfat (8)        - check and repair MS-DOS FAT filesystems
+mac2unix (1)         - DOS/Mac to Unix and vice versa text file format converter
+mkdosfs (8)          - create an MS-DOS FAT filesystem
+mkfs.fat (8)         - create an MS-DOS FAT filesystem
+mkfs.msdos (8)       - create an MS-DOS FAT filesystem
+mkfs.vfat (8)        - create an MS-DOS FAT filesystem
+unix2dos (1)         - DOS/Mac to Unix and vice versa text file format converter
+unix2mac (1)         - DOS/Mac to Unix and vice versa text file format converter
+vdosetuuid (8)       - sets a new uuid for the vdo volume stored on a backing store
+vdostats (8)         - Display configuration and statistics of VDO volumes
+
+

+ W pierwszej kolumnie znajduje się nazwa komponentu, w drugiej + (w nawiasie) numer rozdziału a następnie krótki opis. +

+

+ Szukając opisu polecenia możemy posiłkować się poleceniem + whatis. Polecenie to poszukuje konkretnego komponentu + na stronach podręcznika, a nie słowa kluczowego. +

+
+[user@rhel90 ~]$ whatis xdg-open 
+xdg-open (1)         - opens a file or URL in the user's preferred application
+
+

+ Polecenie whatis, zachowuje się identycznie jak polecenie + man z opcją -f. +

+

2.4.2. Pomoc w samym poleceniu

+

+ Inny sposobem niż wertowanie stron podręcznika w celu znalezienia + odpowiedniej opcji jest po prostu wywołanie polecenia a opcją + --help. +

+
+[user@rhel90 ~]$ ranger --help
+Usage: ranger [options] [path]
+
+Options:
+  --version             show program's version number and exit
+  -h, --help            show this help message and exit
+  -d, --debug           activate debug mode
+  -c, --clean           don't touch/require any config files.
+  --logfile=file        log file to use, '-' for stderr
+  --cachedir=dir        change the cache directory.
+                        (/home/xf0r3m/.cache/ranger)
+  -r dir, --confdir=dir
+                        change the configuration directory.
+                        (/home/xf0r3m/.config/ranger)
+  --datadir=dir         change the data directory.
+                        (/home/xf0r3m/.local/share/ranger)
+  --copy-config=which   copy the default configs to the local config
+                        directory. Possible values: all, rc, rifle, commands,
+                        commands_full, scope
+  --choosefile=OUTFILE  Makes ranger act like a file chooser. When opening a
+                        file, it will quit and write the name of the selected
+                        file to OUTFILE.
+  --choosefiles=OUTFILE
+                        Makes ranger act like a file chooser for multiple
+                        files at once. When opening a file, it will quit and
+                        write the name of all selected files to OUTFILE.
+  --choosedir=OUTFILE   Makes ranger act like a directory chooser. When ranger
+                        quits, it will write the name of the last visited
+                        directory to OUTFILE
+  --selectfile=filepath
+                        Open ranger with supplied file selected.
+  --show-only-dirs      Show only directories, no files or links
+  --list-unused-keys    List common keys which are not bound to any action.
+  --list-tagged-files=tag
+                        List all files which are tagged with the given tag,
+                        default: *
+  --profile             Print statistics of CPU usage on exit.
+  --cmd=COMMAND         Execute COMMAND after the configuration has been read.
+                        Use this option multiple times to run multiple
+                        commands.
+
+

+ Posiadanie tej opcji nie jest standardem, wiec nie wszystkie polecenia + będą ją mieć. +

+

2.4.3. Dokumentacja texinfo

+

+ Projekt GNU, zaproponował zmianę formatu dokumentacji + programów, z + suchych stron podręcznika do dokumentów przypominających ksiązkę lub + inne dokumenty. Strony podręcznika nadal są podstawowym i wybudowanym + (w większość dystrybcji) źródłem wiedzy na temat systemu i jego + komponentów. + Nie mniej jednak jeśli uznamy, że zawartość strony podręcznika nie jest + dla zadowalająca może spojrzeć też tam, o ile ten format jest + zainstalowany w naszym systemie. Dostęp do niego uzyskujemy za pomocą + polecenia info lub pinfo, następnie + podając nazwę polecenia jako argument. Wydając samo polecenie + info, możemy zobaczyć ile dokumentacji w formacie + texinfo znajduje się w systemie. +

+

2.4.4. /usr/share/doc

+

+ Innym miejscem przechowującym jakieś informacje na temat poleceń czy + też programów może być katalog /usr/share/doc. Możemy w nim + znaleźć na przykład domyślne plik konfiguracyjne wielu usług + (oczywiście zależy to czy zostaną one dodane do paczek z + oprogramowaniem). Nie należy jednak + od razu skreślać tego katalogu, często mogą znajdować się tam + informacje, których nie znajdziemy na stronach podręcznika czy w + formacie info np. tutoriale lub gotowe konfiguracje. +

+

2.4.5. Dokumentacja Red Hat Enterprise Linux

+

+ Innym źródłem informacji na temat obsługi systemu jest dokumentacja + Red Hat dostępna w internecie (dla RHEL 9) pod tym + adresem: + https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9 +

+

+ Każdy zebranych tam tematów możemy pobrać w formacie HTML, PDF oraz + ePub (czytniki e-booków). +

+

+ Odnośnie egzaminu:
+ Na egzaminie możemy korzystać ze wszystkiego co jest dostępne w systemie + warto pamiętać o tym. Jeśli będziemy mieć problemy z poleceniem + man, warto wydać polecenie mandb odświeży + to bazę danych stron podręcznika. +

+

Ćwiczenie 1: Nawigacja pośród katalogów Linuksa

+

+ Jako zwykły użytkownik na maszynie wirtualnej server1, + wyświetl ścieżkę na której + się znajdujesz. W tym samym katalogu wyświetl wszystkie pliki. + Przjedź do katalogu /etc następnie wyświetl ścieżkę, na której + się znajdujesz, następnie powróć do poprzedniego katalogu i jeszcze + raz wyświetl ścieżkę. +

+

Ćwiczenie 2: Rożne zadania

+

+ Jako zwykły użytkownik na maszynie server1 w terminalu + polecenie tty. + Następnie uruchom kilka kart terminala wydaj w nich to samo polecenie + i porównaj zwracane wartości. Wyświetl czas pracy systemu oraz + średnie obciążenie procesora. Za pomocą trzech poznanych poleceń + wyświetl lokalizacje polecenia vgs. +

+

Ćwiczenie 3: Informacje o systemie

+

+ Jako zwykły użytkownik na maszynie server1 + za pomocą poznanego polecenia wyświetl wszystkie informacje o systemie + (oczywście w miarę możliwości polecenia). Następnie użyj innego + polecenia aby sprawdzić informacje na temat zainstalowanego w + komputerze procesora. +

+

Ćwiczenie 4: Używanie pomocy

+

+ Jako zwykły użytkownik na maszynie server1 + Wyświetl stronę podręcznika polecenia uname oraz stronę + podręcznika dla pliku /etc/shadow. Wykonaj trzy polecenia: + apropos ext4, + man -k ext4, + whatis group. Czym różnią się + informacje zwracane przez te polecenia? +

+

Podsumowanie

+

+ W tym rozdziale skupiliśmy się na podstawach obsługi systemu, + poznaliśmy środowisko graficzne. Odświerzyliśmy sobie informacje na + temat hierachicznego systemu plików wykorzystywanego w Uniksach. + Zapoznaliśmy się z terminalem i podstawowymi poleceniami. Na koniec + dowiedzieliśmy się gdzie możemy szukać pomocy na temat poleceń, plików + konfiguracyjnych i tego typu rzeczy. +

+

3. Operacje na plikach

+

+ W poprzedni rodziale poznaliśmy podstawy poruszania się po systemie, + przejrzeliśmy środowisko graficzne, zapoznaliśmy się z wierszem + polecenia oraz z najbardziej podstawowymi poleceniami. Było to swoiste + zapoznanie się z systemem operacyjny. Teraz pora w nim trochę + popracować. + Ludzie zazwyczaj kiedy wspomagają swoją prace komputerem, pracują na + danych. Te dane są zazwyczaj zebrane w pliki i od omówienia rodzajów + plików dostępnych na Linuksie rozpoczniemy ten rozdział. +

+

3.1. Rodzaje plików

+

+ W Uniksach możemy wymienić 7 rodzajów różnych plików. W tych systemach + nie jest istotne rozszerzenie oraz zawartość tych plików. Dla systemu + zawsze będzie to zwykły plik. Wszystkie pliki + niewymienione na poniższej liście, które przyjdą nam do głowy są + plikami zwykłymi. +

+

+ Zatem w Uniksach możemy wyróżnić takie rodzaje plików jak: +

+
    +
  • Plik zwykły - plik zwykłe przechowywują dane, są + to wszelkiej maści pliki tekstowe, pliki binarne z programami oraz + inne.
  • +
  • Katalog - jest struktura organizacyjna systemu + plików, stosowana w celach porządkowych zwykłych plików w systemie + plików.
  • +
  • Plik urządzenia znakowego - w przypadku określenia + znakowy stosuje się także określenie surowy + (ang. raw). Pliki te wykorzystywane są do komunikacji z + urządzaniami wykorzysującymi interfejs szeregowy.
  • +
  • Pliki urządzeń blokowych - Plików tych używa się + są do komunikacji z urządzeniami wykorzystującymi interfejs + równoległy. Głównie są to dyski.
  • +
  • Dowiązania symboliczne - przypominają skróty znane + z innych systemów operacyjnych. Jest to plik wskazujący na inny + plik lub katalog.
  • +
  • Nazwane potoki, gniazda - są to pliki, które + służą do komunikacji miedzyprocesowej. Omawianie ich tutaj wychodzi + poza ramy tego materiału.
  • +
+

+ Nie ma się też za bardzo co rozwodzić nad każdym z tych typów plików. + Rodzaju pliku możemy ustalić podczas wyświetlania zawartości katalogu. + Wskaźnikiem jest pierwszy znak w pierwszej kolumnie informacji + zwracanej przez polecenie ls -l. Informacje zwracane dla + poszczególnych typów wyglądają następująco: +

+
+#Zwykły plik:
+[root@server1 ~]# ls -l anaconda-ks.cfg 
+-rw-------. 1 root root 1197 Jun  9 19:59 anaconda-ks.cfg
+
+#Katalog:
+[root@server1 ~]# ls -ld bzipped/
+drwxr-xr-x. 3 root root 17 Jun 16 18:14 bzipped/
+
+#Urządzenie znakowe:
+[root@server1 ~]# ls -l /dev/console
+crw--w----. 1 root tty 5, 1 Jun 17 15:20 /dev/console
+
+#Urządzenie blokowe:
+[root@server1 ~]# ls -l /dev/sda1
+brw-rw----. 1 root disk 8, 1 Jun 17 15:20 /dev/sda1
+
+#Dowiązanie symboliczne:
+[root@server1 ~]# ls -l soft10 
+lrwxrwxrwx. 1 root root 6 Jun 16 17:30 soft10 -> file10
+
+

+ Pierwsze znaki, pierwszej kolumny róznią się od siebie w zależności + od typu plików. Jest jeszcze kilka róznic. Pliki urządzeń nie posiadają + rozmiaru, tylko dwie liczby oddzielone od siebie przecinkiem. Te liczby + to numer główny oraz numer poboczny. Numer główny określa rodzaj + urządzenia (użyty sterownik urządzenia), z kolei numer poboczny jest + jego unikalny identyfikatorem + w systemie. Innym rodzajem, jest dowiązanie symboliczne, które nazwa + wskazuje na ścieżke innego pliku, ale do tego typu plików + wrócimy poźniej. +

+

+ Te informacje które są zwracane oprócz nazwy pliku przez polecenie, + ls z odpowiednią opcją to tak zwane + metadane. Większą ich ilość możemy wyświetlić za + pomocą polecenia stat. Na poniższym przykładzie + zamieszczono więcej metadanych zwykłego pliku z poprzedniego przykładu: +

+
+[root@server1 ~]# stat anaconda-ks.cfg 
+  File: anaconda-ks.cfg
+  Size: 1197      	Blocks: 8          IO Block: 4096   regular file
+Device: fd00h/64768d	Inode: 6126703     Links: 1
+Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
+Context: system_u:object_r:admin_home_t:s0
+Access: 2022-06-16 10:37:11.765639347 +0200
+Modify: 2022-06-09 19:59:42.592326645 +0200
+Change: 2022-06-09 19:59:42.592326645 +0200
+ Birth: 2022-06-09 19:59:42.237318552 +0200
+
+

+ Zwykłe pliki na Uniksach nie muszą mieć rozszerzenia, więc aby przed + uruchomieniem pliku upewnić się co to jest, mamy do dyspozycji takie + narzędzie jak program file, który zbada zawartość + podanego mu w argumencie pliku. +

+
+[root@server1 ~]# file test 
+test: Bourne-Again shell script, ASCII text executable
+
+

+ Plik nie ma rozszerzenia .sh a mimo to pozostaje skryptem + powłoki. +

+

3.2. Kompresja i archiwizowanie

+

+ Kompresja pozwala na zmniejszenie objętości plików za pomocą + zaawansowanych algorytmów, dzięki czemu możemy zaoszczędzić miejsce + na dysku. Wadą takiego przechowywania danych jest dłuższy + czas oczekiwania na ich gotowość do pracy, ponieważ dane przed tym + należy zdekompresować. Archizowanie może służyć do zebrania wielu + małych plików w jeden duży. Na Uniksach możemy wymienić dwa natywne + narzędzia służące do kompresji i jedno do archiwizowania. +

+

3.2.1. gzip

+

+ Natywnym i dostępnym na każdym systemie sposobem na kompresje danych + jest gzip. Algorytmy zawarte w tym narzędziu + kompresują dane, powodując zmniejszenie ich objętość. Narzędzie do + każdego skompresowanego pliku dodaje rozszerzenie .gz. Aby + skompresować plik wystarczy podać jego nazwę lub ścieżkę do niego jako + argument poleceniu gzip. +

+
+#Plik przed kompresją
+[root@server1 ~]# ls -l fstab 
+-rw-r--r--. 1 root root 579 Jun 16 11:07 fstab
+
+#Kompresja
+[root@server1 ~]# gzip fstab
+
+#Plik po kompresji
+[root@server1 ~]# ls -l fstab.gz 
+-rw-r--r--. 1 root root 350 Jun 16 11:07 fstab.gz
+
+

+ Jak możemy zauważyć rozmiar pliku zmniejszył się. Zwróćmy uwagę na to + iż narzędzie nie działa na kopii pliki tylko kompresuje bezpośrednio + podany plik. Aby plik zdekompresować możemy użyć polecenia + gunzip +

+
+[root@server1 ~]# gunzip fstab.gz
+
+

+ Dla plików skompresowanych za pomocą polecenia gzip, możemy + podejrzeć listę skompresowanych plików (w przypadku jednego pliku + może być to użyteczne do wyświetlenia statystki kompresji) + wykorzystując + opcje -l i podając jako argument skompresowany plik. +

+
+[root@server1 ~]# gzip -l fstab.gz 
+         compressed        uncompressed  ratio uncompressed_name
+                350                 579  43.7% fstab
+
+

3.2.2. bzip2

+

+ Program bzip2 jest obecnie standardem kompresji wśród wielu + Uniksów. Jest wolniejszy od gzip, ale skompresowane przez + niego pliki są mniejsze. Więc pozostaje w naszej gestii, który z nich + będziemy stosować. Do skompresowanych przez bzip2 plików + dodawane jest rozszerzenie .bz2. A kompresja za pomocą tego + narzędzia wygląda następująco: +

+
+[root@server1 ~]# ls -lh test
+-rw-r--r--. 1 root root 250M Jun 17 17:21 test
+[root@server1 ~]# bzip2 test 
+[root@server1 ~]# ls -lh test.bz2 
+-rw-r--r--. 1 root root 210 Jun 17 17:23 test.bz2
+
+

+ Dekompresja takiego pliku takiego pliku wyglada analogicznie do + narzędzia gunzip. +

+
+[root@server1 ~]# bunzip2 test.bz2
+[root@server1 ~]# ls -lh test 
+-rw-r--r--. 1 root root 250M Jun 17 17:25 test
+
+

+ W przypadku polecenia bzip2 nie mamy możliwośći wyświetlenia + listy skompresowanych plików (statystyk kompresji). +

+

3.2.3. tar

+

+ Program tar nie służy do kompresji, a do archiwizcji. + Jego zadaniem jest stworzenie jednego pliku z wielu innych plików lub + z całego katalogu. Na początku program swojego istnienia program + tar domyślnie tworzył archiwa na napędach taśmowych, dlatego + też jeśli ma on tworzyć archiwum do pliku potrzebna będzie odpowiednia + opcja, i ta funkcjonalność pozostała po dziś dzień. +

+

+ Opcje tego programu możemy podawać na trzy różne sposoby, wpisując + z myślnikami każdą opcje po kolei, wypisując opcje pod jednym + myślnikiem, lub nie używać myślnika w ogóle. Do stworzenia archiwum + potrzebujemy dwóch opcji, pierwszej -c - tworzącej archiwum + oraz drugiej -f - nakazujące stworzenie archiwum w podanym + jako argument opcji pliku. Poniżej znajdują się opisane wyżej użycia + polecenia tar do stworzenia archiwum. +

+
+[root@server1 ~]# tar -c -f etc_tarred.tar /etc
+tar: Removing leading `/' from member names
+[root@server1 ~]# tar -cf etc_tarred1.tar /etc
+tar: Removing leading `/' from member names
+[root@server1 ~]# tar cf etc_tarred2.tar /etc
+tar: Removing leading `/' from member names
+
+

+ Zwróćmy uwagę na komunikat programu, który usuwa ze scieżek + wskazujących pliki (ponieważ użyłem ścieżki bezwzględnej) początkowy + ukośnik, aby przy wypakowywaniu nie nadpisać ważnych plików + systemowych. Warto dodać, iż ja tworzyłem te archiwa jako + superużytkownik, w momencie gdy root używa polecenia + tar, używana jest domyślnie opcja -p, która powoduje + zachowanie wszystkich atrybutów plików, w przypadku zwykłego + użytkownika ta opcja musi zostać jawnie podana. +

+

+ Rozpakowanie archiwum wymaga podania opcji -x oraz opcji + -f ze wskazaniem pliku archiwum. +

+
+[root@server1 ~]# tar -xf etc_tarred1.tar -C /tmp
+[root@server1 ~]# ls -ld /tmp/etc
+drwxr-xr-x. 132 root root 8192 Jun 17 15:20 /tmp/etc
+
+

+ W tym przykładzie użyłem jeszcze jednej ważnej opcji -C, która + nakazuje poleceniu tar zmianę katalogu przed wypakowaniem + archiwum. +

+

+ Za pomocą opcji -t, możemy podejrzeć zawartość archiwum. Opcja + -v powoduje wyświetlanie komunikatów przez program. +

+
+[root@server1 ~]# tar -tvf etc_tarred2.tar
+drwxr-xr-x root/root         0 2022-06-17 15:20 etc/
+lrwxrwxrwx root/root         0 2022-06-09 19:47 etc/mtab -> ../proc/self/mounts
+-rw-r--r-- root/root       579 2022-06-09 19:44 etc/fstab
+-rw------- root/root         0 2022-06-09 19:44 etc/crypttab
+drwxr-xr-x root/root         0 2022-06-09 19:47 etc/lvm/
+drwxr-xr-x root/root         0 2022-06-09 19:44 etc/lvm/devices/
+-rw-r--r-- root/root       286 2022-06-09 19:44 etc/lvm/devices/system.devices
+drwx------ root/root         0 2022-06-09 20:48 etc/lvm/archive/
+-rw------- root/root      1891 2022-06-09 20:48 etc/lvm/archive/rhel_00000-557804270.vg
+drwx------ root/root         0 2022-06-09 20:48 etc/lvm/backup/
+-rw------- root/root      1890 2022-06-09 20:48 etc/lvm/backup/rhel
+drwx------ root/root         0 2022-02-16 13:01 etc/lvm/cache/
+-rw-r--r-- root/root    111694 2022-02-16 13:01 etc/lvm/lvm.conf
+-rw-r--r-- root/root      2299 2022-02-16 13:01 etc/lvm/lvmlocal.conf
+...
+
+

+ Chcąc dodać plik do archiwum, wystarczy użyć opcji -r nie + trzeba go rozpakowywać i dodawać tych plikiów wystarczy wskazać + archiwum a następnie pliki, które chce się dodać. Plik zostanie dodany + na koniec archiwum. +

+
+[root@server1 ~]# tar -rvf etc_tarred2.tar vipractice.bz2 
+vipractice.bz2
+
+[root@server1 ~]# tar -tvf etc_tarred2.tar
+...
+-rw-r--r-- root/root       208 2022-06-09 19:46 etc/.updated
+-rw-r--r-- root/root       307 2022-06-16 18:38 vipractice.bz2
+
+

+ Dodawaniu plików do archiwum nie służy wyłącznia opcja -r, ale + również + -u, która dodaje nowsze pliki na końcu archwium. + Wyświetlając zawrtość takiego archiwum, możemy zobaczyć pliki o tych + samych nazwach. Te nazwy oczywiście odpowiadają różnym wersjom tych + plików. +

+
+[root@server1 ~]# tar -uvf etc_tarred.tar /etc/nanorc
+tar: Removing leading `/' from member names
+/etc/nanorc
+tar: Removing leading `/' from hard link targets
+
+[root@server1 ~]# tar -tvf etc_tarred2.tar
+...
+-rw-r--r-- root/root       208 2022-06-09 19:46 etc/.updated
+-rw-r--r-- root/root     10373 2022-06-19 09:47 etc/nanorc
+
+

+ Po zebraniu wszystkich plików do archiwum, może okazać się że jest to + sporych rozmiarów plik. Polecenie tar, pozwala na zastosowanie + poznanych wcześniej algorytmów kompresji podczas tworzenia archwium. +

+
    +
  • gzip: opcja -z +
    +[root@server1 ~]# tar -czf etc-gzipped.tar.gz /etc
    +
    +
  • +
  • bzip2: opcja -j +
    +[root@server1 ~]# tar -cjf etc-bzipped.tar.bz2 /etc
    +
    +
  • +
+

+ Rozpakowując skompresowane archiwa w RHEL możemy rozpakować podając + takie same opcje jak w przypadku nie skompresowanych archiwów. +

+
+[root@server1 ~]# tar -xf etc-gzipped.tar.gz -C /tmp
+
+

+ Program rozpozna po zawartości pliku algortym kompresji. Wiecej + informacji na temat polecenia tar znajduje na stronie + podręcznika. +

+

+ Odnośnie egzaminu:
+ Na egzaminie będziemy mieć określną ilość czasu na wykonanie zadań + egzaminacyjnych, dlatego też operacje kompresji czy archiwizacji + plików będą przeprowadzane na małych plikach, aby nie tracić czasu. +

+

3.3. Edycja plików za pomocą edytora Vim

+

+ Podczas wykonywania zadań związanych z administracją systemem, + niezbędna + może być edycja jakiegoś pliku. Edytor Vim jest + standardem jeśli + chodzi o edycję plików. Ten edytor w wersji podstawowej jaką jest + program Vi jest dostępny w większości Uniksów. W przypadku + w wielu dystrybucji Linuksa preinstalowany jest Vim, ze + względu na to ten edytor jest jednym z podstawowych narzędzi. Lepiej + jest nauczyć się rozwiązania, które możemy zastosować domyślnie bez + zbędnej + ingerencji w system (bez instalacji ulubionego edytora, który znamy). +

+

+ Edytor Vim może działać w trzech trybach: +

+
    +
  • tryb poleceń - domyślny tryb pracy programu, + Vim oczekuje na wprowadzenie polecenia. Ten tryb jest + uruchamiany w momencie uruchomienia programu. Polecenia są + przypisane do poszczególnych znaków na klawiaturze.
  • +
  • tryb wprowadzania - tryb ten służy do edycji + tekstu, uruchamiany za pomocą polecenia i lub a.
  • +
  • tryb ostatniej lini - ten tryb możemy również + nazwać wierszem polecenia lub poprawnie trybem ex. + Uruchamiany jest poprzez wciśnięcie + dwukropka (:) w trybie poleceń. Po tym znaku + podajemy polecenie.
  • +
+

3.3.1. Podstawy obsługi Vim

+

+ Edytor Vim uruchamiamy, jak każde inne polecenie. Podając jego + nazwę + w wierszu polecenia. Podczas uruchamiania możemy podać plik jako + argument lub też użyć polecenia trybu ostatniej linii :o + po czym podać ścieżkę do pliku. +

+
+[root@server1 ~]# vim test.txt
+
+

+ Poruszanie po tekscie odbywa się w trybie poleceń za pomocą klawiszy: +

+
    +
  • h - przesunięcie kursora w lewo
  • +
  • j - przesunięcie kursora w dół
  • +
  • k - przesunięcie kursora w górę
  • +
  • l - przesunięcie kursora w prawo
  • +
+

+ Przejście do edycji tekstu, wymaga użycia polecenia i + co spowoduje rozpoczęcie edycji w pozycji kursora lub polecenia + a, które spowoduje przesunięcie kursora o jedną + pozycję i rozpoczęcie edycji, polecenie a możemy tłumczyć + jako dopisywanie (ang. append), a i jako wprowadzanie + (ang. insert). +

+

+ Opuszczenie trybu wprowadzania i powrót do trybu polecenia wymaga + naciśnięcia klawisza Esc (ang. escape). Przjście do + trybu polecenia + jest wymagane, aby przenieść kursor w inne miejsce. W tym trybie + również poprzez polecenia ostatniej linii zapisujemy zmiany w pliku + oraz opuszczamy edytor. Zmiany w tekscie również możemy + porzućić, nie musimy ich zapisywać. Poniżej umieściłem kilka poleceń + trybu ostatniej linii, służacych od zapisywania i opuszczania edytora. +

+
    +
  • :w - zapisanie zmian w pliku oraz pozostanie w + w edytorze
  • +
  • :x - zapisanie zmian w pliku oraz opuszczenie + Vim
  • +
  • :q - opuszczenie Vim.
  • +
+

+ Każdej z tych opcji może towarzyszyć wykrzyknik (!), + więc jeśli chcielibyśmy porzucić zmiany w pliku i wyjść należy użyć + polecenia :q!. Możemy czasami spotkać się z uprawnieniami, + które nie pozwolą nam zapisać zmian w pliku. Rozwiązać tego typu + problem możemy na dwa sposoby, wymusić zapisanie zamian za pomocą + wykrzyknika (działa to tylko w przypadku, gdy superużytkownik chce + zapisać zmiany w pliku tylko odczytu), lub podać ścieżkę do nowego + pliku poleceniu :w, poźniej skopiować w plik w docelowe + miejsce. +

+

3.3.2. Pozostałe polecenia Vim

+

+ Vim posiada bogatą kolekcję komend trybu poleceń oraz trybu ostatniej + linii, na poniższej liście znajdują się część z nich, możemy + wykorzystać je do sprawniejszego używania edytora Vim. +

+

Komendy trybu poleceń:

+
    +
  • ^ - Shift + 6 - przeniesie kursora na początek + linii.
  • +
  • $ - Shift + 4 - przeniesie kursora na koniec + linii.
  • +
  • Ctrl + f - przewinięcie tekstu o jedną stronę w + przód.
  • +
  • Ctrl + b - przewinięcie tekstu o jedną stronę w + tył.
  • +
  • x - usunięcie znaku wskazywanego przez kursor, + znak tak naprawdę zostaje wycięty i poźniej może zostać wklejony.
  • +
  • dd - usunięcie/wycięcie całej linii, linia + podobnie jak znak może zostać wklejona.
  • +
  • v - przejście Vim w tryb wizualny + (tutaj nie omawiany), pozwala zaznaczać tekst co ułatwia kopiowanie + oraz wycinanie.
  • +
  • y - kopiowanie zaznaczenia w trybie wizualnym.
  • +
  • d - wycinanie/usuwanie w trybie wizualnym.
  • +
  • p - wklejanie.

    +
  • u - cofnięcie się o jedną zmianę, odpowiednik + Ctrl+z.
  • +
  • Ctrl+r - tzw. redo, powrót do stanu przed + cofnięciem zmiany. Czasami bardzo przydatna funkcja.
  • +
  • . - kropka - powtórzenie ostatniego polecenia. + Jeśli ostatnim poleceniem było wprowadzanie, to polecenie wklei + cały wprowadzony tekst do momentu zmiany polecenia.
  • +
  • / - slash - przeszukiwanie tekstu w przód.
  • +
  • ? - znak zapytania - przeszukiwanie tekstu w tył.
  • +
  • n - następne wystąpienie frazy w tekście
  • +
  • N - poprzednie wystąpienie frazy w tekscie. W + przypadku przeszukiwania w tył, działanie poleceń n oraz + N jest odwrócone.
  • +
+

+ W przypadku trybu poleceń, możemy zwielokrotnić działanie tych poleceń, + wprowadzając liczbę wykonywania tego polecenia przed poleceniem. Na + przykład jeśli chcemy + usunąć 3 linie to zamiast wydawać trzykrotnie polecenie dd, + możemy nacisnąć 3 następnie dd i trzy linie spod + kursora zostaną usunięte/wycięte. +

+

Polecenia trybu ostatniej linii:

+
    +
  • :set number - włącza numerowanie linii.
  • +
  • :o - otwiera plik, jako argument podajemy ścieżkę + do pliku.
  • +
  • :%s/old/new - zamiana pierwszego wstąpienia słowa + old słowem new.
  • +
  • :%s/old/new/g - zamiana wszystkich wystąpień słowa + old słowem new.
  • +
  • :6,11co4 - polecenie kopiuje zawartość linii od + 6 do 11 i wkleja ją po 4 linii.
  • +
  • :3,5m6 - polecenie przenosii linię od 3 do 5 na + miejsce po linii numer 6.
  • +
  • :6,8d - polecenie usuwa linie od 6 do 8.
  • +
  • :r - polecenie wprowadza w miejscu kursora + zawartość pliku podanego jako argument. +
+

+ Podczas korzystania Vim istotna jest praktyka. Dlatego trzeba + przesiąść się na niego i zacząć tworzyć w nim pliki. +

+

+ Odnośnie egzaminu:
+ Podczas egzaminu, możemy spotkać się z zadaniem w którym trzeba + zmienić jakiś plik. Dostępność Vim na maszynie + egzaminacyjnej jest niemal pewna, dlatego też nauczenie się jego + obsługi jest dość istotne. +

+

3.4. Pliki i katalogi

+

+ Jaka kolwiek praca z komputerem prędzej czy poźniej będzie wymagać + operacji na plikach i katalogach. Poniżej przedstawiam najprostsze + czynności jakie możemy wykonywać na tych elementach. +

+

3.4.1. Tworzenie plików i katalogów

+

+ Tworzenie plików może zrealizować na kilka sposób. Jednym z nich jest + wykorzystanie polecenia touch, które służy generalnie + do uaktualnienia czasów dostępu oraz modyfikacji, jednak kiedy podany + plik nie istnieje to zostanie on utworzony przez to polecenie. +

+
+[root@server1 ~]# touch plik1
+[root@server1 ~]# ls -l plik1
+-rw-r--r--. 1 root root 0 Jun 19 14:52 plik1
+
+

+ Jak widać na powyższym przykładzie został utworzony plik, którego + wielkość to całe 0 bajtów. Innym sposobem na utworzenie pliku jest + wykorzystanie polecenia Vim, w którym zapisując zmiany w + nowym pliku, tworzymy go mimochodem. Ostanim ze sposobów jest + utworzenie plików ze strumienia (stumienie będą opisywane w dalszej + części tego materiału), za pomocą polecenia cat, + które omówimy sobie w następnym podrozdziale. Wydając następujące + polecenie: +

+
+[root@server1 ~]# cat > plik2
+test1
+test2
+test3
+test4
+test5
+
+

+ Uruchamiając to polecenie przełączymy strumienie tak, aby wszystko + co zostanie wpisane do terminala trafi do pliku (w dużym skrócie). Taką + edycję pliku możemy zakończyć naciskając kombinacje klawiszy + Ctrl+d. +

+

+ Za tworzenie katalogów odpowiedzialne jest polecenie + mkdir. Polecenie to utworzy katalog o nazwie podanej + jako argument. Ważną opcją tego polecenia jest -p, za pomocą + którego jesteśmy wstanie tworzyć z poziomu pojedynczego polecenia całe + struktury katalogów. Opcja ta powoduje utworzenie katalogów podanych + na ścieżce, które nie istnieją. +

+
+[root@server1 ~]# mkdir dir1
+
+

3.4.2. Wyświetlanie zawartości pliku

+

+ Na Uniksach do wyświetlania zawartości plików mamy kilka rozwiązań + pierwszym z nich jest wspomnianie już polecenie cat. + Polecenie wyświetli zawartość pliku podanego jako argument w terminalu. +

+
+[root@server1 ~]# cat plik2 
+test1
+test2
+test3
+test4
+test5
+
+

+ Na Uniksach, obok polecenia cat występuje polecenie + tac, które ma takie samo zastosowanie jak to wyżej + wymienione, wyświetlając jednak zawartość pliku odwrotnie od końca. + Poniższy przykład zaraz to zobrazuje: +

+
+[root@server1 ~]# tac plik2 
+test5
+test4
+test3
+test2
+test1
+
+

+ Podczas wyświetlania dużych plików ich zawartość może nie mieścić się + na + ekranie, czy też w oknie terminala. Do wyświetlania tego typu plików + wykorzystuje się takie polecenia jak more czy + less. Oba dzielą wyświetloną treść plików na strony + wielkości ekranu bądź terminala. Program more nie jest za + bardzo zaawansowanym narzędziem. Wyświetlając pliki za jego pomocą nie + mamy zbyt dużego pola manewru. Możemy przesuwać stronę po stronie, do + końca pliku. Dlatego też znacznie lepszym rozwiązaniem jest + wykorzystanie polecenia less, który pozwala poruszać się + po tekscie w góre i w dół, ale również pozwala na wyszukiwanie fraz + w tekscie, możemy również nawigować po za pomocą klawiszy znanych z + programu Vim. Program less uruchomi się szybciej niż, + program more, ponieważ nie musi on załadować całego pliku od + razu. +

+
+[root@server1 ~]# less /var/log/messages
+
+

+ Ostatnim już sposobem na wyświetlenie zawartości plików jest, użycie + polecenia head oraz tail, ich + zadaniem jest wyświetlenie kilku początkowych (domyślnie 10) linii + z podanego jako argument pliku - polecenie head lub kilku + ostatnich (również 10) linii z podanego pliku - polecenie tail. +

+
+[root@server1 ~]# tail /var/log/messages
+Jun 19 13:59:33 server1 systemd[1]: Finished dnf makecache.
+Jun 19 14:18:23 server1 cupsd[964]: REQUEST localhost - - "POST / HTTP/1.1" 200 182 Renew-Subscription successful-ok
+Jun 19 15:16:43 server1 cupsd[964]: REQUEST localhost - - "POST / HTTP/1.1" 200 182 Renew-Subscription successful-ok
+Jun 19 15:28:22 server1 systemd[1]: Starting dnf makecache...
+Jun 19 15:28:23 server1 dnf[2173]: Updating Subscription Management repositories.
+Jun 19 15:28:23 server1 dnf[2173]: Unable to read consumer identity
+Jun 19 15:28:23 server1 dnf[2173]: This system is not registered with an entitlement server. You can use subscription-manager to register.
+Jun 19 15:28:23 server1 dnf[2173]: Metadata cache refreshed recently.
+Jun 19 15:28:23 server1 systemd[1]: dnf-makecache.service: Deactivated successfully.
+Jun 19 15:28:23 server1 systemd[1]: Finished dnf makecache.
+
+

+ Domyślną ilość wypisywanych linii możemy regulować poprzez podanie po + myślniku (-) żądanej liczby. +

+
+[root@server1 ~]# tail -5 /var/log/messages
+Jun 19 15:28:23 server1 dnf[2173]: Unable to read consumer identity
+Jun 19 15:28:23 server1 dnf[2173]: This system is not registered with an entitlement server. You can use subscription-manager to register.
+Jun 19 15:28:23 server1 dnf[2173]: Metadata cache refreshed recently.
+Jun 19 15:28:23 server1 systemd[1]: dnf-makecache.service: Deactivated successfully.
+Jun 19 15:28:23 server1 systemd[1]: Finished dnf makecache.
+
+

+ Polecenie tail ma jedną bardzo istoną opcję, która pozwala + śledzić na bierząco zmiany w pliku, ta opcja to -f. +

+

+ Poleceniem związanym z zawartością plików, ale nie z jej wyświetlaniem + może być polecenie wc, które domyślnie wyświetla + ilość linii, liczbę słów oraz bajtów. +

+
+[root@server1 ~]# wc /var/log/messages
+  639  7503 61333 /var/log/messages
+
+

3.4.3. Kopiowanie i przenoszenie plików i katalogów

+

+ Pracując z plikami, być może wystąpić potrzeba skopiowania bądź + przeniesienia danych w inne miejsce. Za operację kopiowania + odpowiedzialnie jest polecenie cp. Jako pierwszy + argument przyjmuje ono ścieżkę lub plik źródłowy, jako drugi ścieżkę + lub plik docelowy. +

+
+[root@server1 ~]# cp plik2 plik3
+
+

+ W przypadku gdy dany plik już istnieje w podanym katalogu polecenie + zapyta się czy nadpisać docelowy plik, ale tylko w przypadku + superużytkownika, bowiem on w konfiguracji swojej powłoki posiada + alias (nazwę zastępczą) cp dla polecenia + cp -i, opcja -i włącz tryb interaktywy, czyli właśnie + takie pytania. +

+
+[root@server1 ~]# cp plik1 plik3 
+cp: overwrite 'plik3'? n
+
+

+ Za pomocą polecenia cp możemy kopiować całe katalogi z + podkatalogami przy użyciu opcji -r, która włącza kopiowanie + rekurencyjne. Jeśli atrybuty plików są dla nas ważne, to żeby nie + nadpisać ich należy użyć opcji -p. +

+

+ Za przenoszenie plików odpowiedzialne jest polecenie + mv, które ma jeszcze jedną ważną cechę ukrytą w + mechanice swojego działa. Otóż jeśli będzie przenosić plik lub katalog + w ramach tego samego katalogu, to zmieni on tylko swoją nazwę. +

+

+ Polecenie mv w przypadku superużytkownika, posiada podobny + alias co w przypadku polecenia cp, polecenie jest uruchamiane + domyślnie z opcją pytającą o nadpisanie elementu docelowego. +

+
+[root@server1 ~]# mv plik1 plik3 
+mv: overwrite 'plik3'? n
+
+

+ Polecenie mv nie potrzebuje żadnej opcji, aby + przenieść cały katalog wraz z podkatalogami. +

+
+[root@server1 ~]# mv gzipped /tmp
+[root@server1 ~]# ls -ld /tmp/gzipped/
+drwxr-xr-x. 3 root root 17 Jun 16 18:14 /tmp/gzipped/
+
+

3.4.4. Usuwanie plików i katalogów

+

+ Zbędne plik i katalogi możemy usunąć, za pomocą polecenia rm. + Polecenie do usunięcia katalogu wymaga podania nazwy pliku jako + argumentu. +

+
+[root@server1 ~]# rm plik1 
+rm: remove regular empty file 'plik1'? y
+
+

+ Polecenie rm również jest aliasem, z tą samą opcją co + cp czy mv. Aby usunąć cały katalog wraz + podkatalogami, należy użyć kolejno opcji -r - + uruchamiającej usuwanie rekurencjne oraz opcji -f, + wymuszające odpowiedź y na wszystkie pytania. +

+
+[root@server1 ~]# rm -rf /tmp/etc
+
+

+ Usuwanie plików i katalogów posiadając uprawnienia superużytkownika, + może skończyć się katastrofą. Pomyłka w tym poleceniu może uszkodzić + system. Dlatego też należy zachować szczególną ostrożność przy + korzystaniu z tego polecenia, a w szcególności w połączeniu z + nazwami wieloznacznymi (będzie o tym przy okazji + omawiania powłoki BASH). +

+

+ Do usuwania pustych katalogów, możemy użyć polecenia + rmdir, jak i opcji -d polecenia rm. +

+
+[root@server1 ~]# rm -d dir1/
+rm: remove directory 'dir1/'? y
+[root@server1 ~]# rmdir dir2
+
+

+ Odnośnie egzaminu:
+ Polecenia manipulacji plikami są podstawowymi czynnościami związnymi + z administracją każdego Uniksa, więc warto przyswoić wiedzę zebraną + w tym podrozdziale. +

+ +

+ Wśród systemów uniksowych, możemy w kategoriach manipulacji plikami + wyróżnić takie elementy jak dowiązania. Dowiązania + są najprościej rzecz biorąc są elementami, które wskazują na inne pliki. + Dowiązania możemy podzielić na twarde oraz + symboliczne. +

+ +

+ Twarde dowiązania nie są same w sobie stricte plikami. + Pliki bowiem znajdują na urządzeniach służacych do przechowywania + danych. Systemy plików przechowują metadane plików, ich atrybuty oraz + informacje w jakich obszarch, której z pamięci masowych należy szukać + zawartości pliku, aby ludzie mogli się nimi posługiwać używa się nazw + plików. Taką własnie nazwą jest twarde dowiązanie. Dla eksperymentu + utworzymy pusty plik, o nazwie hard1, oto jego artybuty +

+
+[root@server1 ~]# ls -li hard1 
+6043841 -rw-r--r--. 1 root root 0 Jun 19 17:31 hard1
+
+

+ Pierwsza kolumna zawiera numer i-node jest to + identyfikator + wpisu w bazie danych systemu plików, ktory zawiera metadane na + temat pliku. W trzeciej kolumnie atrybutów znajduje się wartość + 1. Ta kolumna przedstawia ilość + dowiązań twardych. Każdy zwykły plik posiada co najmniej jedno + dowiązanie - identyfikującą bezpośrednio plik nazwę. Tworząc kolejne + twarde dowiązanie, podłączamy kolejną nazwę tego pliku. Teraz utwórzmy + dowiązanie o nazwie hard2 do pliku hard1. Dowiązania + tworzymy za pomocą polecenia ln. +

+
+[root@server1 ~]# ln hard1 hard2
+[root@server1 ~]# ls -li hard*
+6043841 -rw-r--r--. 2 root root 0 Jun 19 17:31 hard1
+6043841 -rw-r--r--. 2 root root 0 Jun 19 17:31 hard2
+
+

+ Zwróć my uwagę na to, iż hard2 + wskazuje na ten sam numer i-node, czyli wskazuje na ten sam + pliki. Liczba dowiązań uległa zmianie tak samo w przypadku + hard1 jak i + hard2, ponieważ na ten sam plik + wskazują dwa dowiązania. Zawartość pliku możemy zmieniać odwołując + czy to do hard1 czy hard2, tak samo jest + z atrybutami, ponieważ obie nazwy wskazują na ten sam węzeł + i-node (wpis w bazie danych systemu plików), jeśli usuń my + teraz plik hard1, to tak naprawdę usuniemy jedno z dowiązań. +

+
+[root@server1 ~]# rm hard1
+rm: remove regular empty file 'hard1'? y
+[root@server1 ~]# ls -li hard*
+6043841 -rw-r--r--. 1 root root 0 Jun 19 17:31 hard2
+
+

+ Dowiązania twarde mogą powodować bałagan w plikach, ponieważ mimo + usunięcia on dalej istnieje pod inną nazwą. Dopiero usunięcie + wszystkich dowiązań, ostatecznie kończy egzystencje pliku w pamięci + masowej, ponieważ systemy plików, pliki bez dowiązań uznają za + nie potrzebne i realokują miejsce przechowania zawartości tego pliku. +

+ +

+ Innym rodzajem dowiązań jest dowiązanie symboliczne. + Często są one porównywane do skrótów znanych z systemów Windows i tak + na prawdę taka jest ich rola. Dowiązania symboliczne mają wskazywać + na inne pliki. W przeciwieństwie do dowiązań twardych, te dowiązania + są jednak odrębnymi plikami (tak jakby), posiadają one bowiem wpis + w bazie danych systemu plików, ale w miejscu przeznaczonym na adres + przechowywania danych pliku na dysku lub innej pamięci znajduje się + scieżka do pliku źródłowego, na który wskazuje dowiązanie. Zatem tego + rodzaju elementy mają własne atrybuty. Wielkość dowiązania + symbolicznego zależy od ilość znaków na ścieżce do pliku źródłowego. + Dowiązania symboliczne tworzymy za pomocą tego samego narzędzia co + dowiązania twarde, dodając tylko opcję -s. +

+
+[user@server1 ~]$ ln -s symfile symlink1
+[user@server1 ~]$ ls -l symlink1
+lrwxrwxrwx. 1 user user 7 Jun 20 19:28 symlink1 -> symfile
+
+

+ Dowiązania symboliczne mogłoby wydawać się, że są w wstanie zastąpić + kopiowanie. Kopiując plik, odwzrowywuje się jego zawartość w innym + miejscu na pamięci masowej, tworząc odrębny nienaruszony plik. Tworząc + dowiązanie, podłączamy się pod istniejący już plik, który może być + zmieniony + nie tylko przez użytkowników, ale też programy. Dowiązania + symbolicznego + możemy użyć jak wymienionego wcześniej skrótu, chcąc zaoszczędzić + sobie pisania długich ścieżek do głęboko osadzonych katalogów w + systemie + ewentualnie ułatwić pisanie ścieżek w skryptach oraz programach. +

+

+ Przechodząc do folderu wskazywanego przez dowiązanie symboliczne jeśli + wyświetlimy scieżkę obecnego katalogu roboczego, zobaczymy ścieżkę + z uwzględeniem tego dowiązania. Aby odkryć prawdziwą ścieżkę należy + polecenia pwd z opcją -P. +

+

Ćwiczenie 1: Archiwa

+

+ Na maszynie server1 jako superużytkownik, utwórz + skompresowane za pomocą programu gzip archiwum z zawartością + katalogu /etc. Powtórz czynność tym razem z użyciem programu + bzip2. Porównaj wielkość tych archiwów. Na koniec rozpakuj + oba archiwa bez zaznaczania algorytmu kompresji (bez podawania + odpowiedniej opcji). +

+

Ćwiczenie 2: Praktyka z Vim-a

+

+ Na maszynie server1 jako zwykły użytkownik, utworz przepisując + treść ćwiczenia nr. 1, każde zdanie w odrębnej linii, zapisz zmiany w + pliku o nazwie vimpractice i zamknij edytor. Otwórz plik w + edytorze ponownie, wyświetl numery linii. Skopiuj linię 2 i 3 na koniec + pliku, tak aby było łącznie 6 linii. Przenieś linię nr. 3 w miejsce + pierwszej. Przejdź na koniec pliku i dodaj do niego zawartośc w pliku + .bash_profile (znajdziesz go w katalogu domowym użytkownika). + Zamień wszystkie wszystkie wystąpienia słowa profile na + pro file. Usuń linię od 5 do 8, zapisz zmiany w pliku i + opuść edytor. Na koniec wyświetl podsumowanie pliku za pomocą polecenia + wc. +

+

Ćwiczenia 3: Manipulacja plikami

+

+ Na maszynie server1 jako zwykły użytkownik, utwórz jeden + dowolny plik oraz jeden katalog, wyświetl ich atrybuty, sprawdź + uprawnienia, nazwę właściciela oraz grupę do której ten plik należy. + Co się stanie gdy spróbujesz przenieść utworzony wcześniej plik do + katalogu /var/log. Przenieś plik oraz katalog do katalogu + /tmp. Utwórz duplikat pliku i zmień jego nazwę na jakąkolwiek + inną. Usuń wszystkie pliki utworzone na potrzeby tego ćwiczenia. +

+

Podsumowanie

+

+ W tym rozdziale zapoznaliśmy się, z typowymi zadaniami związanymi z + administracją plikami w systemie. Poznaliśmy edytor Vim, którego + nauka wymaga zachodu, aczkolwiek nie pójdzie ona na marne. Ten edytor + w uboższej podstawowej wersji w postaci programu Vi + spotkamy w każdym Uniksie, zatem będzie potrafili sprawnie edytować + pliki w każdym systemie, niezależnie od tego czy nasz ulubiony edytor + jest dostępny. Ciekawszą rzeczą w tym rodziale z pewnością były + dowiązania symboliczne. W następnym rodziale skupimy się na + uprawnieniach plików i katalogów, oraz przekonamy się jak potężnym + narzędziem jest polecenie find. +

+

4. Zaawansowane zarządzanie plikami

+

+ W Uniksach możemy zabezpieczyć pliki i katalogi przed ingerencją + innych użytkowników. Służą temu specjalny rodzaj zabezpieczeń jakim są + uprawnienia. +

+

4.1. Uprawnienia podstawowe

+

+ Uprawnienia przypisywane są w trzech klasach, klasie użytkownika + (u) nazwywanego również właścicielem elementu; grupie + (g), do której należy ten plik oraz + oraz innym użytkownikom systemu (o), ta klasa + uprawnień jest również oznaczna jako uprawnienia publiczne. +

+

+ Każdej z tych klas możemy przypisać odpowiednie uprawnienia takie jak: + prawo do odczytu (r), prawo do zapisu + (w) oraz prawo do wykonania (x). +

+

+ Za nim zaczniemy zmieniać uprawnienia, nauczymy się je identyfikować. + Uprawnienia do pliku możemy wyświetlić za pomocą polecenia ls -l + lub polecenia stat. +

+
+[user@server1 ~]$ ls -l file1
+-rw-r--r--. 1 user user 0 Jun 21 14:21 file1
+
+

+ Uprawnienia znajdują się w pierwszej kolumnie: + -rw-r--r--., łącznie 11 znaków, ale + nas będzie interesować tylko 9 w środku. Pierwszy znak oznacza typ + pliku, natomiast kropka związana jest z kontekstem SELinux, + nie będziemy się teraz tym zajmować. Te dziewięć pól są to miejsca + przeznaczone na uprawnienia poszczególnych klas. Pierwsze trzy pola + z lewej to uprawnienia użytkownika (właściciela), kolejne trzy pola + to uprawnienia grupy do której należy ten plik natomiast pozostałe + trzy to uprawnienia publiczne, stosowane wobec użytkowników nie + związanych z tym elementem. Uprawnienia przypisane każdej z klas + układają się kolejno w rwx, myślnik na którymś z tych miejsce + oznacza brak takiego prawa w danej klasie. +

+

+ Każde z określonych praw pozwala nam, na wykonanie innych czynności + związanych z tym elementem. Prawo read pozwala na odczyt + zawartości pliku oraz jego skopiowanie, w przypadku + katalogów pozwala na wyświetlenie jego zawartości. Prawo write + pozwala na modyfikowanie elementu, wraz z jego usunięciem. Ostatnie + prawo execute pozwala na uruchomienie pliku o ile jest to + plik wykonywalny, w przypadku katalogów to prawo jest niezbędne aby + użytkownik mógł przejść do niego (za pomocą polecenia cd). +

+

+ Zatem w przypadku pliku z powyższego przykładu, właściciel może czytać + i pisać, a grupa + oraz wszyscy inni mogą tylko czytać, dla nich wówczas ten plik jest + plikiem tylko do odczytu. +

+

+ Prawdopodobnie kiedyś bedziemy chcieli ukryć jakieś pliki lub będziemy + musieli dać uprawnienia jednemu z użytkowników do innych plików + w systemie, wówczas wymagana będzie zmiana uprawnień. +

+

+ Poszczególnym klasom (u, g, + o) możemy nadać (+), obebrać + (-) + lub przypisać (=) odpowiednie uprawnienia. Do + manipulacji uprawnieniami służy polecenie chmod, jako + pierwszy argument przyjmuje on sekwencje zmiany uprawnień (uprawnienia) + a jako drugi plik lub katalog, którego mają się tyczyć uprawnienia. +

+

+ Załóżmy, że plik z powyższego przykładu jest skryptem i musimy nadać + użytkownikowi prawo do wykonania, grupie prawo do zapisu i wykonania + a pozostałym użytkownikom zabrać uprawnienia, ponieważ ten plik nie + powinien być stosowany poza grupą. Aby zrealizować tę zmianę + uprawnień należy wydać poniższe polecenie: +

+
+[user@server1 ~]$ chmod u+x,g+wx,o-r file1
+
+

+ Po zmianie, uprawnienia do tego pliku prezentują się w następujący + sposób: +

+
+[user@server1 ~]$ ls -l file1
+-rwxrwx---. 1 user user 0 Jun 21 14:21 file1
+
+

+ Zapis uprawnień w tej postaci, który swoją drogą nazwa się zapisem + symbolicznym, wymaga dużo pisania. Uprawnienia można zmieniać łatwiej + jednak wymagać to będzie więcej myślenia. +

+

+ Każde z omówionych wcześniej praw posiada swoją wagę, te wagi sumują + się dając uprawnienia dla konkretnej klasy. A więc: prawo do odczytu + (r) posiada wagę 4, prawo do zapisu + (w) posiada wagę 2 a prawo do + wykonania (x) posiada wagę + 1. Brak prawa (-) ma wagę + 0. Tak złożone razem sumy tych wag dają uprawnienia + do pliku czy katalogu. Chcąc określić uprawnienia pliku z pierwszego + przykładu jescze przed zmianą uprawnień, będą one wynosić: + 644. +

+
+[user@server1 ~]$ ls -l file1
+-rw-r--r--. 1 user user 0 Jun 21 14:21 file1
+----------------------------------------------
+u = rw- = 4 + 2 + 0 = 6
+g = r-- = 4 + 0 + 0 = 4
+o = r-- = 4 + 0 + 0 = 4
+ugo = 644
+
+

+ Natomiast uprawnienia po zmianie bedą wynosić: +

+
+[user@server1 ~]$ ls -l file1
+-rwxrwx---. 1 user user 0 Jun 21 14:21 file1
+----------------------------------------------
+u = rwx = 4 + 2 + 1 = 7
+g = rwx = 4 + 2 + 1 = 7
+o = --- = 0 + 0 + 0 = 0
+ugo = 770
+
+

+ W ten sposób przeliczonymi uprawnieniami (tzw. uprawnieniami + bezwględnymi, ponieważ przypisują one uprawnienia każdej z klas) możemy + posługiwać się podczas ich zmiany przy użyciu polecenia chmod +

+
+[user@server1 ~]$ chmod -v 644 file1
+mode of 'file1' changed from 0770 (rwxrwx---) to 0644 (rw-r--r--)
+[user@server1 ~]$ chmod -v 770 file1
+mode of 'file1' changed from 0644 (rw-r--r--) to 0770 (rwxrwx---)
+
+

+ Na powyższym przykładzie zastosowałem opcję -v, która + wyświetla jak zmieniają się uprawnienia oraz przedstawia je w obu + formach. W przypadku wyświetlonej wartości liczbowej, pierwsze + zero z lewej strony jest miejscem na uprawnienia specjalne o których + będzie za chwilę, w przypadku standardowych uprawnienień nie ma ono + znaczenia. +

+

+ Zapis uprawnień bezwzględnych w zapisie symbolicznym wyglądał by + następująco: +

+
+[user@server1 ~]$ chmod -v u=rw,g=r,o=r file1
+mode of 'file1' changed from 0770 (rwxrwx---) to 0644 (rw-r--r--)
+
+

+ Definiując uprawnienia bezwzględne, posługujemy się cyframi od 0 do 7. + Są to wszystkie cyfry systemu liczbowego o podstawie 8 (tzw. ósemkowy + lub oktalny) dlatego też często nazwa się takie ustalanie uprawnień + trybem oktalnym. +

+

+ Podczas ustalania uprawnień dla plików lub katalogów, nie ma znaczenia + jakiego trybu użyjemy, nie ma lepszego i gorszego. Jest tryb + czytelniejszy oraz szybszy do zapisania. +

+

+ Na koniec jako ciekawostke podam iż istnieje czwarta dodatkowa klasa + oznaczająca + wszystkie klasy (a), za jej pomocą można nadawać, + odbierać i przypisywać takie same uprawnienia dla wszystkich klas. +

+
+[user@server1 ~]$ chmod -v a=rwx file1
+mode of 'file1' changed from 0644 (rw-r--r--) to 0777 (rwxrwxrwx)
+
+

4.1.1. Uprawnienia domyślne

+

+ Każdy nowoutworzony plik czy katalog Uniksie ma już z góry przypisane + uprawnienia i są nimi 666 dla plików oraz 777 dla katalogów. + Uprawnienia te są korygowane za pomocą wartości umask. +

+

+ Wartość umask (ang. user mask) jest maską uprawnień + stosowaną na tworzonych przez użytkowników nowych plikach i katalogach. + Każdy użytkownik ma swoją indywidualną maskę i może ją dowolnie + zmieniać. + Maska ma za zadanie usunięcie tych praw, których nie życzymy sobie + widzieć w poszczególnych klasach. Aby wyświetlić maskę użytkownika + należy wydać poniższe polecenie: +

+
+[user@server1 ~]$ umask
+0022
+
+

+ Maska w przypadku RHEL 9 wygląda tak jak na powyszym + przykładzie. Ta + wartość usunie z klasy grupy oraz z klasy pozostałych użytkowników + prawo do zapisu. Rachunek uprawnień jest bardzo prosty. +

+
+#W przypadku plików:
+
+0666
+0022 -
+------
+0644
+
+#W przypadku katalogów:
+
+0777
+0022 -
+------
+0755
+
+

+ Chcąc zmienić maskę wystarczy wydać polecenie: +

+
+[user@server1 ~]$ umask 002
+[user@server1 ~]$ umask
+0002
+
+

+ Tak zdefiniowana maska usunie tylko prawo do zapisu w klasie + pozostałych użytkowników dla każdego nowego pliku i katalogu. Maska + o tej wartości była domyślną maską dla zwykłych użytkowników w + RHEL 8. + Wartość maski zdefiniowanej z poziomu wiersza poleceń, utrzyma się + tylko przez czas trwania otwartej sesji terminala. Po jego zamknięciu + lub + wylogowaniu się maska wróci do poprzedniej wartości. Jeśli chcemy aby + wartości tej maski została zapisana na stałe, należy umieść polecenie + umask w jednym z plików uruchomieniowych powłoki, będzie o tym + w dalszej części tego materiału. +

+

4.1.2. Zmiana właściciela oraz grupy pliku

+

+ Do zmiany właściciela pliku oraz grupy, do której on należy służy + polecenie chown, które przyjmuje jako pierwszy + argument trzy możliwe wersje: parę właściciel:grupa; + samego właściela lub nazwę grup poprzedzoną dwukropkiem + (:) a następnie pliki. Poniższy przykład obrazuje + wszystkie trzy możliwe zmiany właściciela oraz grup, do której należy + plik. +

+
+[root@server1 tmp]# chown user100:user100 acluser
+[root@server1 tmp]# ls -l acluser 
+-rw-rw-r--. 1 user100 user100 9 Jun 22 18:25 acluser
+[root@server1 tmp]# chown user acluser
+[root@server1 tmp]# ls -l acluser 
+-rw-rw-r--. 1 user user100 9 Jun 22 18:25 acluser
+[root@server1 tmp]# chown :user acluser
+[root@server1 tmp]# ls -l acluser
+-rw-rw-r--. 1 user user 9 Jun 22 18:25 acluser
+
+

4.2. Uprawnienia specjalne

+

+ Poza podstawowym rodzajem uprawnień w Uniksach istnieją dodatkowe + uprawnienia, których zadaniem może być podniesienie uprawnień w + systemie, zaoszczędzenie czasu lub ochrona przed skasowaniem pliku w + miejscach gdzie wszyscy mają uprawnienia zapisu. Teraz omówimy sobie + każdy z nich. +

+

4.2.1. Uprawnienia bitu setuid

+

+ Każde z podstawowych praw, możemy określić mianej bitu, z uprawnieniami + specjalnymi jest podobnie, każde z nich jest kolejnym bitem (prawem) o + szczególnym znaczeniu. Tak jest i tym przypadku. Bit + setuid służy do podniesienia uprawnień. Jest on + oznaczany małą lub wielką literą s w klasie + użytkownika/właściciela. Ma on + zastosowanie głównie na plikach wykonywalnych. Kiedy uruchomimy program + z ustawionym takim bitem, program ten będzie działać z uprawnieniami + właściciela tego pliku. Bit ten jest wykorzystywany najczęściej + do uruchomienia programu z uprawnieniami root przez + zwykłego użytkownika. Takim przykładem może być program su, + który służy przełączaniu się miedzy użytkownikami, bez tego bitu + przelogowanie nie było by możliwe. Dla eksperymentu możemy usunać ten + bit, następnie spróbować jako zwykły użytkownik przelogować na kogoś + innego. +

+
+[root@server1 ~]# chmod -v u-s /usr/bin/su
+mode of '/usr/bin/su' changed from 4755 (rwsr-xr-x) to 0755 (rwxr-xr-x)
+[user@server1 ~]$ su user100
+Password: 
+su: Authentication failure
+
+

+ Jak widać przełączanie na użytkownika + user100 nie powiodło się + mimo iż polecenie zapytało o hasło (polecenie su nie pyta o + hasło tylko superużytkownika). Zwróćmy również uwagę na to jak wygląda + bit setuid w oktalnym zapisie uprawnień. Do wskazywania + uprawnień specjalnych wykorzystywana jest nieużywana przy zwykłych + uprawnieniach czwarta liczba całkiem z lewej strony. Teraz przywrócimy + setuid temu programowi. +

+
+[root@server1 ~]# chmod -v +4000 /usr/bin/su
+mode of '/usr/bin/su' changed from 0755 (rwxr-xr-x) to 4755 (rwsr-xr-x)
+[user@server1 ~]$ su user100
+Password: 
+[user100@server1 user]$ 
+
+

+ Podczas przywracania uprawnień, nie naruszyłem tych podstawowych + używając wartości +4000, nie + potrzeba wskazywać klasy, ponieważ program sam wie, że ten bit należy + nadać w klasie właściciela. +

+

+ Czasami bit setuid może występować w postaci wielkiej litery + S, oznacza to tyle iż w klasie właściciela nie występuje + prawo do wykonywania (bit x). +

+

4.2.2. Uprawnienia bitu setgid

+

+ Zastosowania bitu setgid, mogą być dwa jedno podobne + do bitu setuid, ale tyczące się grupy, drugie zaś dotyczy się + katalogów współdzielonych. Bit setgit oznaczany jest + małą lub wielką literą s w klasie grupy. +

+

+ Kiedy katalog posiada ustawiony bit setgid, to grupa, która + jest właścicielem takiego katalogu będzie przypisywana jako grupa + każdemu nowemu elementowi utworzonemu w tym katalogu. +

+
+[user2000@server1 sdir]$ ls -ld /sdir
+drwxrws--T. 3 root sgrp2 65 Jun 21 17:31 /sdir
+[user2000@server1 sdir]$ mkdir user2000dir
+[user2000@server1 sdir]$ ls -l
+total 4
+-rw-rw-r--. 1 user1000 sgrp2 5 Jun 20 16:00 user1000file
+drwxrwsr-x. 2 user2000 sgrp2 6 Jun 21 17:30 user2000dir
+[user2000@server1 sdir]$ touch user2000file
+[user2000@server1 sdir]$ ls -l
+total 4
+-rw-rw-r--. 1 user1000 sgrp2 5 Jun 20 16:00 user1000file
+drwxrwsr-x. 2 user2000 sgrp2 6 Jun 21 17:30 user2000dir
+-rw-rw-r--. 1 user2000 sgrp2 0 Jun 21 17:31 user2000file
+
+

+ Katalog /sdir jest własnością grupy sgrp2 oraz + posiada ustawiowiony bit setgid (bit s w miejscu + x w klasie grupy). Utworzyłem katalog oraz plik, oba elementy + odziedziczyły grupę sgrp2 właśnie dzięki tym uprawnieniom. + Zwróćmy uwagę również na fakt iż nowoutworzony katalog odziedziczył + również bit setgid. Tego typu funkcjonalność możemy + wykorzystać tworząc katalogi do pracy grupowej, aby zaoszczędzić + użytkownikom grupy zmianę uprawnień przy każdym nowym pliku lub + podkatalogu w tego typu folderach. +

+

+ Innym przykładem jest wykorzystanie pliku wykonywalnego z ustawionym + bitem setgid. Weźmy pod lupe taki plik jak program + write, ten program służy do przesyłania wiadomości + między użytkownikami (między terminalami). +

+
+[user@server1 ~]$ ls -l /usr/bin/write 
+-rwxr-sr-x. 1 root tty 24472 Feb 24 11:25 /usr/bin/write
+
+

+ Posiada on bit setgid, którym pozwoli mu w tym przypadku + skorzystać z uprawnień grupy na plikach urządzeń. Pierwsza konsola + wirtualna w systemie: +

+
+[user@server1 ~]$ ls -l /dev/tty0 
+crw--w----. 1 root tty 4, 0 Jun 21 15:13 /dev/tty0
+
+

+ Grupa tty posiada prawo do zapisu na tym urządzeniu. Sprawdźmy + jeszcze pierwsze urządzenie pseudoterminala (okno programu + Terminal lub połączenie przez SSH). +

+
+[user@server1 ~]$ ls -l /dev/pts/0
+crw--w----. 1 user tty 136, 0 Jun 21 17:51 /dev/pts/0
+
+

+ Tutaj grupa również posiada prawo zapisu. Usuwanie i przypisywanie + tego bitu jest analogiczne do bitu setuid, wymaga + tylko zmiany kilku wartości +

+
+[root@server1 ~]# chmod -v g-s /usr/bin/write
+mode of '/usr/bin/write' changed from 2755 (rwxr-sr-x) to 0755 (rwxr-xr-x)
+[root@server1 ~]# chmod -v +2000 /usr/bin/write
+mode of '/usr/bin/write' changed from 0755 (rwxr-xr-x) to 2755 (rwxr-sr-x)
+
+

+ Przeglądając atrybuty plików i katalogów możemy natknąć sie na bit + setgid zapisany wielką literą, jest to ten sam bit, tylko że + w klasie grupy brakuje prawa do wykonania (bitu x). +

+

4.2.3. Uprawnienia bitu sticky

+

+ Bit sticky ma za zadanie zabezpieczyć pliki i katalogi + przed nieuprawnionym usunięciem w ogólodostępnych katalogach (tam + gdzie wszyscy mają prawo do zapisu). Jeśli katalog ma ustawiony taki + bit, to wówczas tylko właściciel pliku bądź podkatalogu będzie mógł go + usunąć. Bit sticky oznaczany jest za pomocą małej lub + wielkiej litery t w klasie publicznej + (pozostałych użytkowników). +

+

+ Usunięcie lub przypisanie tego bitu może odbywać się tak jak w + przypadku poprzednich bitów. +

+
+[root@server1 ~]# chmod -v -o-t /sdir
+mode of '/sdir' changed from 3770 (rwxrws--T) to 2770 (rwxrws---)
+[root@server1 ~]# chmod -v +1000 /sdir
+mode of '/sdir' changed from 2770 (rwxrws---) to 3770 (rwxrws--T)
+
+

+ Tutaj zwróćmy uwagę na to, iż bit sticky jest zapisany wielką + literą, otóż działanie tego bitu się nie zmienia, jest jedynie + informacja, że klasie publicznej brakuje prawa do wykonania + (x). Wszystkie bity specjalne umieszczane w poszczególnych + klasach, rezydują w miejscu prawa do wykonywania. +

+

4.3. Polecenie find

+

+ Polecenie find, jak sama nazwa wskazuje służy do + wyszukiwania plików i katalogów. Najczęściej jest ono wykorzystywane + przez + użytkowników w podstawowym zakresie, zwracając gigantyczną ilość danych. + Często korzystając z tego narzędzia nie wykorzystuje się w pełni jego + potencjału, który ukrywa się w dużej ilości opcji zawężających wyniki + poszukiwania oraz możliwości wykonania akcji w wyszukanych plikach. +

+

+ Najprostszy sposób na użycie polecenia find znajduje się + poniżej: +

+
+[root@server1 user]# find / -name network
+/run/systemd/network
+/tmp/gzipped/etc/sysconfig/network
+/tmp/gzipped/etc/vmware-tools/scripts/vmware/network
+/etc/sysconfig/network
+/etc/vmware-tools/scripts/vmware/network
+/root/bzipped/etc/sysconfig/network
+/root/bzipped/etc/vmware-tools/scripts/vmware/network
+/usr/lib/systemd/network
+
+

+ Polecenie przeszukało cały główny system plików pod kątem plików + o nazwie network. Sama opcja + -name jest zawężeniem wyników + wyszukiwania, bez tej opcji polecenie zwróciłoby wszystkie pliki + znalezione w podanym katalogu czyli w tym przypadku minimum kilka + tysięcy. +

+

+ Poniżej zamieszczam najważniejsze opcje służące do bardziej + szczegółowego wyszukiwania plików. +

+
    +
  • -iname - wyszukuje pliki o nazwie podanej jako + argument tej opcji, ignorując przy tym wielkość znaków. +
    +[root@server1 user]# find . -iname do*
    +./Downloads
    +./Documents
    +./.cache/mozilla/firefox/r7fvuapl.default-default/cache2/doomed
    +
    +
  • +
  • -size - wyszukiwanie plików na podstawie rozmiaru. + Jeśli chcemy aby program znalazł pliki mniejsze niż podana + wartość stawiamy przed nią myślnik (-), a jeśli + większe to plus (+). Poniższy przykład zaprezentuje + wyszukiwanie plików powyżej 1G w moim katalogu domowym: +
    +[xf0r3m@latitude-e5270 ~]$ find ~ -size +1G -exec ls -ldh {} \;
    +-rw-r--r--. 1 xf0r3m xf0r3m 2,1G 06-18 18:12 /home/xf0r3m/Pobrane/Fedora-MATE_Compiz-Live-x86_64-35/Fedora-MATE_Compiz-Live-x86_64-35-1.2.iso
    +-rw-r--r--. 1 xf0r3m xf0r3m 1,4G 06-18 19:44 /home/xf0r3m/Pobrane/Fedora-LXDE-Live-x86_64-35-1.2.iso
    +-rwxr-xr-x. 1 xf0r3m xf0r3m 11G 2017-01-25  /home/xf0r3m/Pobrane/rhel-8.6-x86_64-dvd.iso
    +-rwxr-xr-x. 1 xf0r3m xf0r3m 8,0G 2017-02-11  /home/xf0r3m/Pobrane/rhel-baseos-9.0-x86_64-dvd.iso
    +-rwxr-xr-x. 1 xf0r3m xf0r3m 2,9G 06-21 19:50 /home/xf0r3m/Dokumenty/RHEL9-VM1_21.06.ova
    +-rwxr-xr-x. 1 xf0r3m xf0r3m 2,3G 06-21 19:54 /home/xf0r3m/Dokumenty/RHEL9-VM2_21.06.ova
    +-rwxr-xr-x. 1 xf0r3m xf0r3m 2,6G 06-21 20:00 /home/xf0r3m/Dokumenty/RHEL8-VM1_21.06.ova
    +-rw-------. 1 xf0r3m xf0r3m 6,2G 06-22 16:06 '/home/xf0r3m/VirtualBox VMs/RHEL9-VM1/RHEL9-VM1_21.06-disk001.vmdk'
    +-rw-------. 1 xf0r3m xf0r3m 4,8G 06-21 22:26 '/home/xf0r3m/VirtualBox VMs/RHEL9-VM2/RHEL9-VM2_21.06-disk001.vmdk'
    +-rw-------. 1 xf0r3m xf0r3m 6,3G 06-21 22:28 '/home/xf0r3m/VirtualBox VMs/RHEL8-VM1/RHEL8-VM1_21.06-disk001.vmdk'
    +
    + Opcję -exec, omówimy pod koniec + tego podrozdziału. +
  • +
  • -user, -group - wyszukiwanie plików na podstawie + nazwy właściciela oraz grupy do której plik należy. W przykładzie + przedstawie polecenie, które wyszuka wszystkie pliki należące do + użytkownika user, ale i nie należące do grupy sgrp2: +
    +[root@server1 user]# find / -user user -not -group sgrp2 
    +/dev/pts/0
    +/proc/1688
    +/proc/1688/task
    +/proc/1688/task/1688
    +/proc/1688/task/1688/fd
    +/proc/1688/task/1688/fd/0
    +/proc/1688/task/1688/fd/1
    +/proc/1688/task/1688/fd/2
    +...
    +
    + Aby zanegować, któreś z kryteriów należy poprzedzić je opcją + -not lub wykrzyknikiem (!). +
  • +
  • -maxdepth, -mindepth - te opcje wskazują poleceniu + find, jak głęboko w strukturę katalogów ma sięgać polecenie + podczas wyszukiwania (-maxdepth) lub od którego poziomu + podkatalogów ma zacząć wyszukiwanie (-mindepth). +
    +[root@server1 user]# find / -maxdepth 3 -name network
    +/run/systemd/network
    +/etc/sysconfig/network
    +
    +[root@server1 user]# find / -mindepth 4 -name network
    +/tmp/gzipped/etc/sysconfig/network
    +/tmp/gzipped/etc/vmware-tools/scripts/vmware/network
    +/etc/vmware-tools/scripts/vmware/network
    +/root/bzipped/etc/sysconfig/network
    +/root/bzipped/etc/vmware-tools/scripts/vmware/network
    +/usr/lib/systemd/network
    +
    + Zwróćmy uwagę na to, iż te opcje są opcjami globalnymi, nie mają + bezpośredniego wpływu na wyszukiwanie, dlatego też należy je + umieszczać przed opcjami mającymi zawęzić kryteria. +
  • +
  • -type - wyszukiwanie na podstawie typu + plików. Poniższy przykład pokazuje również jak zapisać różne + wartości przy jednej opcji: +
    +[root@server1 user]# find / -type p,s -exec ls -ld {} \;
    +srwxr-xr-x. 1 chrony chrony 0 Jun 22  2022 /run/chrony/chronyd.sock
    +srwxr-xr-x. 1 root root 0 Jun 22  2022 /run/mcelog-client
    +srw-rw-rw-. 1 root root 0 Jun 22  2022 /run/.heim_org.h5l.kcm-socket
    +srw-rw-rw-. 1 root root 0 Jun 22  2022 /run/avahi-daemon/socket
    +srw-rw-rw-. 1 root root 0 Jun 22  2022 /run/lsm/ipc/simc
    +srw-rw-rw-. 1 root root 0 Jun 22  2022 /run/lsm/ipc/sim
    +srw-rw-rw-. 1 root root 0 Jun 22  2022 /run/cups/cups.sock
    +prw-------. 1 root root 0 Jun 22  2022 /run/initctl
    +prw-------. 1 root root 0 Jun 22  2022 /run/dmeventd-client
    +prw-------. 1 root root 0 Jun 22  2022 /run/dmeventd-server
    +
    + Polecenie wyszukuje w systemie wszystkie gniazda i nazwane potoki + (typy plików, nieomawiane w tym materiale). Jak widać inną wartość dla + tej opcji należy podać po przecinku. +
  • +
  • -mtime, -mmin - wyszukiwanie pliku na podstawie + ilości czasu upłyniętego od daty ostatniej modyfikacji, z czego + opcja -mtime przyjmuje wartości w liczbie dni, która upłynęła + od ostatniej modyfikacji, a -mmin w minutach. +
    +[xf0r3m@latitude-e5270 ~]$ find ~ -maxdepth 2 -mtime -7
    +/home/xf0r3m
    +/home/xf0r3m/.mozilla/firefox
    +/home/xf0r3m/.local/share
    +/home/xf0r3m/Pobrane
    +/home/xf0r3m/Pobrane/Fedora-MATE_Compiz-Live-x86_64-35.torrent
    +/home/xf0r3m/Pobrane/Fedora-MATE_Compiz-Live-x86_64-35
    +/home/xf0r3m/Pobrane/Fedora-LXDE-Live-x86_64-35.torrent
    +/home/xf0r3m/Pobrane/Fedora-LXDE-Live-x86_64-35-1.2.iso
    +/home/xf0r3m/Pobrane/Fedora-Workstation-Live-x86_64-35.torrent
    +
    +[xf0r3m@latitude-e5270 ~]$ find ~ -maxdepth 3 -mmin -360
    +/home/xf0r3m
    +/home/xf0r3m/.mozilla/firefox
    +/home/xf0r3m/.mozilla/firefox/qlw3f0ci.default-default
    +/home/xf0r3m/.local/share
    +/home/xf0r3m/.local/share/gnome-shell
    +/home/xf0r3m/.local/share/gvfs-metadata
    +/home/xf0r3m/.local/share/recently-used.xbel
    +/home/xf0r3m/.local/share/ranger
    +/home/xf0r3m/.local/state/wireplumber
    +/home/xf0r3m/Dokumenty/docs/.git
    +/home/xf0r3m/Dokumenty/docs/angielski
    +
    + Powyższe polecenia przedstawiają pliki, które były modyfikowane w + przeciągu ostatnich 7 dni, oraz ostatnich 6 godzin. Użyłem tutaj + również modyfikatorów głębokości. +
  • +
  • -perm - wyszukiwanie plików na podstawie uprawnień. + Chcąc wyszukać pliki po konkretnych uprawnieniach pliku, podajemy je w + wersji oktalnej po opcji. Możemy również skorzystać z innych opcji + wprowadzania + uprawnień: uprawnienień minimalnych podanych po myślniku + (-), wówczas każdy z podanych tam praw będzie musiało + wystąpić w danej klasie lub uprawnień dowolnych podanych po ukośniku + (/), wówczas przypasowany zostanie plik, który będzie + posiadać, minimum jedno z praw, z minimum jednej klasy. +
    +[root@server1 user]# find / -perm 111 -exec ls -ld {} \;
    +---x--x--x. 1 root root 87168 Aug 26  2021 /usr/bin/sudoreplay
    +
    +[root@server1 user]# find /dev -type c -perm -222 -exec ls -ld {} \;
    +crw-rw-rw-. 1 root kvm 10, 241 Jun 22  2022 /dev/vhost-vsock
    +crw-rw-rw-. 1 root kvm 10, 238 Jun 22  2022 /dev/vhost-net
    +crw-rw-rw-. 1 root root 10, 196 Jun 22  2022 /dev/vfio/vfio
    +crw-rw-rw-. 1 root root 10, 200 Jun 22  2022 /dev/net/tun
    +crw-rw-rw-. 1 root render 226, 128 Jun 22  2022 /dev/dri/renderD128
    +crw-rw-rw-. 1 root root 10, 229 Jun 22  2022 /dev/fuse
    +crw-rw-rw-. 1 root tty 5, 2 Jun 22 17:28 /dev/ptmx
    +crw-rw-rw-. 1 root tty 5, 0 Jun 22  2022 /dev/tty
    +crw-rw-rw-. 1 root root 1, 9 Jun 22  2022 /dev/urandom
    +crw-rw-rw-. 1 root root 1, 8 Jun 22  2022 /dev/random
    +crw-rw-rw-. 1 root root 1, 7 Jun 22  2022 /dev/full
    +crw-rw-rw-. 1 root root 1, 5 Jun 22  2022 /dev/zero
    +crw-rw-rw-. 1 root root 1, 3 Jun 22  2022 /dev/null
    +
    +[root@server1 user]# find /dev -type c -perm /222 -exec ls -ld {} \;
    +crw-rw----. 1 root dialout 4, 64 Jun 22 17:30 /dev/ttyS0
    +crw-rw-rw-. 1 root tty 5, 2 Jun 22 17:30 /dev/ptmx
    +crw-r--r--. 1 root root 10, 235 Jun 22 17:30 /dev/autofs
    +
    + Powyżej przedstawiłem wymienione sposoby na zapis uprawnień w przy + opcji -perm. Tej opcji możemy również przekazać uprawnienia + w postaci symbolicznej na przykład: +
    +[root@server1 user]# find /usr -perm -u=s -exec ls -ld {} \;
    +-rwsr-xr-x. 1 root root 36880 Feb 16 15:46 /usr/bin/fusermount3
    +-rwsr-xr-x. 1 root root 74880 Dec  3  2021 /usr/bin/chage
    +-rwsr-xr-x. 1 root root 78744 Dec  3  2021 /usr/bin/gpasswd
    +-rwsr-xr-x. 1 root root 42448 Dec  3  2021 /usr/bin/newgrp
    +-rwsr-xr-x. 1 root root 36872 Jan 12 18:21 /usr/bin/fusermount
    +-rwsr-xr-x. 1 root root 49152 Feb 24 11:25 /usr/bin/mount
    +-rwsr-xr-x. 1 root root 36784 Feb 24 11:25 /usr/bin/umount
    +-rwsr-xr-x. 1 root root 57616 Feb 24 11:25 /usr/bin/su
    +-rwsr-xr-x. 1 root root 32608 Mar 11 16:34 /usr/bin/pkexec
    +-rwsr-xr-x. 1 root root 53704 Aug  9  2021 /usr/bin/crontab
    +-rwsr-xr-x. 1 root root 32648 Aug 10  2021 /usr/bin/passwd
    +---s--x--x. 1 root root 185456 Aug 26  2021 /usr/bin/sudo
    +-rwsr-xr-x. 1 root root 16240 Oct 15  2021 /usr/bin/vmware-user-suid-wrapper
    +-rws--x--x. 1 root root 32712 Feb 24 11:25 /usr/bin/chfn
    +-rws--x--x. 1 root root 24464 Feb 24 11:25 /usr/bin/chsh
    +-rwsr-xr-x. 1 root root 57920 Aug  9  2021 /usr/bin/at
    +-rwsr-xr-x. 1 root root 16128 Dec  2  2021 /usr/sbin/pam_timestamp_check
    +-rwsr-xr-x. 1 root root 24544 Dec  2  2021 /usr/sbin/unix_chkpwd
    +-rwsr-xr-x. 1 root root 15608 Mar 10 18:18 /usr/sbin/grub2-set-bootflag
    +-rws--x--x. 1 root root 45232 Dec  9  2021 /usr/sbin/userhelper
    +-rwsr-xr-x. 1 root root 20416 Mar 11 16:34 /usr/lib/polkit-1/polkit-agent-helper-1
    +-rwsr-x---. 1 root sssd 119512 Jan 17 20:47 /usr/libexec/sssd/krb5_child
    +-rwsr-x---. 1 root sssd 53240 Jan 17 20:47 /usr/libexec/sssd/ldap_child
    +-rwsr-x---. 1 root sssd 28536 Jan 17 20:47 /usr/libexec/sssd/proxy_child
    +-rwsr-x---. 1 root sssd 32656 Jan 17 20:47 /usr/libexec/sssd/selinux_child
    +-rwsr-x---. 1 root dbus 36848 Aug  9  2021 /usr/libexec/dbus-1/dbus-daemon-launch-helper
    +-rwsr-xr-x. 1 root root 16104 Feb 10 11:13 /usr/libexec/Xorg.wrap
    +-rwsr-x---. 1 root cockpit-wsinstance 57600 Mar  3 13:28 /usr/libexec/cockpit-session
    +
    + Powyższe polecenie szuka wszystkich programów z ustawionym bitem + setuid. +
  • +
+

4.3.1. Opcje akcji polecenia find

+

+ Na powyższych przykładach stosowałem wielkrotnie dodatkową opcję + -exec. Jest to opcja akcji + podejmowana na pliku gdy tylko zostanie znaleziony. Składania opcji + -exec może wyglądać następująco: +

+
+$ find ... -exec ls -ld {} \;
+
+

+ Po opcji -exec podajemy zwykłe polecenie, tak jak gdybyśmy + wpisywali je do wiersza polecenia. Odniesieniu do znalezionego pliku + służy zapisana para nawiasów klamrowych + {} każde polecenie wydawane za pomocą + opcji -exec czy innej musi zostać za terminowane + zacytowanym średnikiem (\;), ponieważ jest koniec + polecenia wprowadzonego do tej opcji, a nie koniec polecenia + find. Wynik działania przykładowego użycia opcji + -exec znajduje się w przykładach na początku tego + podrozdziału. +

+

+ Poza poleceniem -exec, istnieją jeszcze dwa polecenia akcji + -delete, które usuwa pliki oraz -ok, + które różni się tym od -exec, że pyta sie użytkownika czy + wykonać podane polecenie na pliku. +

+

+ Odnośnie egzaminu:
+ Polecenie find, wydaje się bardzo pomocne, posiada masę opcji + część znich znajduje się tutaj, pozostałe są rozpisane na stronach + podręcznika. Powinniśmy umieć się posługiwać tym narzędziem, zarówno + zaweżać obszar poszukiwania jak i prawidłowo używać opcji + -exec. +

+

4.4. Lista kontroli dostępu

+

+ Oprócz klasycznego zestawu uprawnień w Uniksach oraz określenia + właściciela i grupy do której należy plik bądź katalog, w RHEL + możemy + dodatkowo wskazać innych użytkowników oraz grupy i przypisać im + uprawnienia + nieżależne od tych klasycznych (standardu ugo/rwx). + Temu właśnie służy lista kontroli dostępu. Ten + mechanizm obsługiwany jest za pomocą dwóch poleceń, pierwszym z nich + jest getfacl i służy ono do wypisania listy kontroli + dostępu. Stwórzmy w katalogu /tmp plik o nazwie + aclfile, następnie wykonajmy polecenie getfacl + podając ten plik jako argument. +

+
+[user@server1 ~]$ cd /tmp
+[user@server1 tmp]$ touch acluser
+[user@server1 tmp]$ getfacl acluser 
+# file: acluser
+# owner: user
+# group: user
+user::rw-
+group::rw-
+other::r--
+
+[user@server1 tmp]$ ls -l acluser
+-rw-rw-r--. 1 user user 9 Jun 22 18:25 acluser
+
+

+ Kiedy plik niema zdefiniowanych żadnych dodatkowych użytkowników oraz + grup, jego lista kontroli dostępu jest równoznaczna z klasycznymi + uprawnieniami Uniksa i te listy oznaczają kolejno właściciela, grupę + do której należy ten plik oraz pozostałych użytkowników. + Listy kontroli dostępu możemy modyfikować + za pomocą polecenia setfacl. Zanim jednak poznamy + jak należy modyfikować ACL, poniżej znajduje się lista + najważniejszych + opcji tego polecenia. Są one dość istotne, ponieważ pozwalają na + manipulowanie listami elementu. +

+
    +
  • -b - usuwa wszystkie listy dostępowe,
  • +
  • -d - ustawia listy jako domyślne,
  • +
  • -k - usuwa wszystkie listy domyślne,
  • +
  • -m - modyfikuje lub ustawia listy,
  • +
  • -n - chroni przed automatycznym przeliczaniem + maski,
  • +
  • -R - ustawia listy rekurencyjnie, listy katalogu + są stosowane na elementy w nim zawarte,
  • +
  • -x - usuwa pojedynczą listę.
  • +
+

+ Listy kontroli możemy zastoswać dla trzech podmiotów: +

+
    +
  • użytkownika: + u[ser]:nazwa/uid:uprawnienia
  • +
  • grupy: + g[roup]:nazwa/gid:uprawnienia
  • +
  • innych: + o[ther]:uprawnienia
  • +
+

+ To co zostało ujęte w nawiasach kwadratowych, jest zapisem opcjonalnym. + Identyfikator podmiotu możemy zapisać albo za pomocą numerów UID + oraz GID, lub za pomocą nazw. Jeśli nazwa lub + UID/GID zostaną pominiete to listy user + oraz group będą tyczyć się właściciela oraz grupy, do której + należy dany element. Uprawnienia mogą być podane + za pomocą symboli lub sumy wag dla pojedynczej klasy. Ustawię teraz + listę dla jednego z użytkowników w systemie. +

+
+[user@server1 tmp]$ setfacl -m u:user100:rw acluser
+[user@server1 tmp]$ ls -l acluser
+-rw-rw-r--+ 1 user user 9 Jun 22 18:25 acluser
+
+

+ Pierwsze polecenie ustawia prawo do czytania oraz pisania użytkownikowi + user100 za pomocą list dostępu. + Wyświetliłem szczegóły pliku. Zwróćmy uwagę na to, iż kropka na końcu + uprawnień została zastąpiona plusem (+), taki zapis + informuje użytkowników, że uprawnienia tego pliku są rozszerzone za + pomocą ACL. Teraz przyjrzymy sie jak wyglądają listy pliku: +

+
+[user@server1 tmp]$ getfacl -c acluser
+user::rw-
+user:user100:rw-
+group::rw-
+mask::rw-
+other::r--
+
+

+ W tym przykładzie użyłem opcji -c, która nie wyświetla + wcześniej pokazywanego nagłówka. Nie jest on nam potrzebny. Nowy wpis + pojawia się pod wpisem właśiciela. Mówi on wprost, że użytkownik + user100 posiada prawo do czytania oraz + modyfikowania pliku acluser, mimo iż + na podstawie klasycznych uprawnień oraz praw własności nie jest on + nijak związany z tym plikiem. +

+

+ Poza uprawnienia dla użytkownika pojawi się wpis oznaczony słowem + mask. Jest to maska list kontroli + i wyznacza ona maksymalne uprawnienia jakie można dać danemu + podmiotowi. Przy każdej zmianie list kontroli dostosowuje się ona do + najwyższych uprawnień na liście. Dodam teraz drugiego użytkownika z + wyższymi od user100 uprawnieniami, bedziemy mogli wówczas + zaobserowować jak zmienia się maska. +

+
+[user@server1 tmp]$ setfacl -m u:user200:7 acluser
+[user@server1 tmp]$ getfacl -c acluser
+user::rw-
+user:user100:rw-
+user:user200:rwx
+group::rw-
+mask::rwx
+other::r--
+
+

+ Maska została ponownie przeliczona i wskazuje teraz uprawnienia o + sumie wag równej 7 (rwx). Teraz wymuszę inną wartość dla + maski: +

+
+[user@server1 tmp]$ setfacl -m m:4 acluser 
+[user@server1 tmp]$ getfacl -c acluser
+user::rw-
+user:user100:rw-		#effective:r--
+user:user200:rwx		#effective:r--
+group::rw-			    #effective:r--
+mask::r--
+other::r--
+
+

+ Na powyższym przykładzie za pomocą selektora (u: - user, itd.) + m: wskazuje uprawnienia dla maski + ACL. + Teraz przy zdefiniowanych przez nas listach użytkowników, pojawił się + komentarz #effective:r--. Oznacza to, + iż uprawnienia zostały zmniejszone ponieważ, przekraczają nałożoną na + plik maskę list kontroli. Zrócmy uwagę, ze to ograniczenie + uprawnień maską dotknęło grupę, do której należy plik. Aby wyłączyć + automatyczne przeliczanie maski, należy użyć opcji -n. Usunę + teraz + jedną z list, aby zaprezentować jak można to zrobić kiedy listy dla + poszczególnych użytkowników nie będą nam potrzebne: +

+
+[user@server1 tmp]$ getfacl -c acluser 
+user::rw-
+user:user100:rw-
+user:user200:rwx
+group::r--
+mask::rwx
+other::r--
+
+[user@server1 tmp]$ setfacl -x u:user200 acluser 
+[user@server1 tmp]$ getfacl -c acluser 
+user::rw-
+user:user100:rw-
+group::r--
+mask::rw-
+other::r--
+
+

+ Teraz oczyszcze plik z list, ponieważ nie są nam już one potrzebne. +

+
+[user@server1 tmp]$ setfacl -b acluser
+[user@server1 tmp]$ getfacl -c acluser
+user::rw-
+group::r--
+other::r--
+
+

+ Po usunięciu list z tak rygorystczną maską możemy zaobserwować, że + zostały zmodyfikowane uprawnienia grupy. Przed usunięciem + list należy ustawić maskę aby odzworowywała wcześniejsze uprawnienia. +

+

4.4.1. Domyślne listy kontroli dostępu

+

+ Domyślne listy kontroli dostępu są stosowane w udostępnionych + katalogach, aby zapewnić spójny zestaw uprawnień dla elementów w nim + zawartych. Listy kontroli zdefiniowane dla takiego katalogu są + dzieczone przez elementy, które się w nim znajdują. Dzięki czemu + nie trzeba poprawiać uprawnień przy każdym nowym pliku lub katalogu. + Dziedziczenie nieco różni się w przypadku plików i podkatalogów: +

+
    +
  • Pliki otrzymują domyślne listy katalogu nadrzędnego jako zwykłe + listy kontoli dostępu (access ACL, poznaliśmy je na + początku tego podrozdziału).
  • +
  • Podkatalogi przyjmują od katalogu nadrzędnego zarówno, zwykłe jak + i domyślnie listy kontroli.
  • +
+

+ Domyślnie listy definiuje się tak samo jak zwykłe, jednak robi się to + tylko na katalogach za pomocą polecenia setfacl z dodatkową + opcją -d. + Utworzę teraz podkatalog o nazwie projekty w + katalogu + /tmp, następnie nadam mu dwie domyślnie listy dając dwóm + użytkownikom systemu pełne uprawnienia do niego. +

+
+[user@server1 tmp]$ mkdir projekt
+[user@server1 tmp]$ setfacl -dm u:user100:7,u:user200:7 projekt/
+[user@server1 tmp]$ getfacl -c projekt/
+user::rwx
+group::r-x
+other::r-x
+default:user::rwx
+default:user:user100:rwx
+default:user:user200:rwx
+default:group::r-x
+default:mask::rwx
+default:other::r-x
+
+

+ Następnie utworzę plik o nazwie zalozenia_projektu.txt, + poniżej znajdują sie jego szczegóły: +

+
+[user@server1 projekt]$ touch zalozenia_projektu.txt
+[user@server1 projekt]$ ls -l
+total 0
+-rw-rw-r--+ 1 user user 0 Jun 23 15:56 zalozenia_projektu.txt
+
+

+ Jak widzimy posiada on już jakieś zdefiniowane listy. Są to listy + odziedziczone po katalogu nadrzędnym. Oto listy tego pliku: +

+
+[user@server1 projekt]$ getfacl -c zalozenia_projektu.txt 
+user::rw-
+user:user100:rwx		#effective:rw-
+user:user200:rwx		#effective:rw-
+group::r-x			#effective:r--
+mask::rw-
+other::r--
+
+

+ Zauważmy, że wpływ na listy mają uprawnienia domyślne elementów + (plików i katalogów) oraz wartość umask. Maska ACL + przyjmuje wartość najwyższych zdefiniowanych uprawnień, w przypadku + plików jest 6 (odczyt oraz zapis). Następnie odziedziczone + listy są konfrontowane z maską i zdefiniowane w nich uprawnienia albo + pozostają bez zmian, albo ustawiane są tylko te bity występujące na + masce, dlatego też efektywne listy kontroli są takie a nie inne. + Teraz do zwykłych list katalogu projekty dodam listy dwóch + użytkowników dodanych jako listy domyślnie i utworze podkatalog. +

+
+[user@server1 tmp]$ setfacl -m u:user100:7,u:user200:7 projekt
+[user@server1 tmp]$ getfacl -c projekt/
+user::rwx
+user:user100:rwx
+user:user200:rwx
+group::r-x
+mask::rwx
+other::r-x
+default:user::rwx
+default:user:user100:rwx
+default:user:user200:rwx
+default:group::r-x
+default:mask::rwx
+default:other::r-x
+
+[user@server1 tmp]$ cd projekt/
+[user@server1 projekt]$ mkdir commonfiles
+[user@server1 projekt]$ getfacl -c commonfiles/
+user::rwx
+user:user100:rwx
+user:user200:rwx
+group::r-x
+mask::rwx
+other::r-x
+default:user::rwx
+default:user:user100:rwx
+default:user:user200:rwx
+default:group::r-x
+default:mask::rwx
+default:other::r-x
+
+

+ Jak możemy zauważyć, listy kontroli są identyczne. Teraz dwaj pozostali + użytkownicy posiadają możliwości zapisywania oraz odczytywania, w + przypadku katalogów i plików stworzonych przeze mnie. Jednak ja jako + user będę chciał zapisać coś w plikach innych + użytkowników to nie mam takich uprawnień, ponieważ listy dotyczą tylko + tych dwóch użytkowników zdefiniowanych na listach. +

+

4.4.2. Dziwny problem z listami kontroli dostępu

+

+ Odnośnie egzaminu:
+ Zapoznając się ze zwykłymi listami dostępu po zdefiniowaniu list o + uprawnieniach + dających pełne prawa jednemu z użytkowników nie mogłem + (jako on) zapisać nic do pliku znajdującego się w katalogu + /tmp za pomocą jakiego kolwiek edytora. Dane + mogłem zapisać natomiast przekierowując strumień na przykład z + polecenia echo. Ten problem zauważyłem w RHEL 9, w + wersji 8.6 + nie występował. Problem nie występuje na RHEL 9, gdy plik + odziedziczy listy + od katalogu, a uprawnienia zostaną zmniejszone przez maskę, wówczas + użytkownicy z mogą zapisywać zmiany za pomocą edytorów. +

+

Ćwiczenie 1: Manipulowanie uprawnieniami pliku

+

+ Jak zwykły użytkownik na maszynie server1, stwórz dwa pliki + file11 oraz dir11. Uruchom polecenie + umask aby określić obecną maskę użytkownika. Używając + zapisu symbolicznego ustaw maskę użytkownika na wartość 0035. Utwórz + plik o nazwie file22 oraz katalog o nazwie dir22 + w katalogu domowym. Sprawdź i porównaj uprawnienia plików i katalogów + utworzonych na potrzeby tego ćwiczenia. Używając polecenia + chmod zmień uprawnienia pliku file11 aby były takie + jak uprawnienia pliku file22 oraz zmień uprawnienia katalogu + dir22 tak aby identyczne jak uprawnienia folderu + dir11. Nie usuwaj jeszcze tych plików. +

+

Ćwiczenie 2: Konfiguracja katalogu do pracy grupowej

+

+ Jako superużytkownik na maszynie server1, utwórz katalog + /sdir następnie utwórz grupę (groupadd) sgrp + oraz dwóch użytkowników user1000 oraz user2000 + (useradd). Dodaj tych dwóch użytkowników do wcześniej + utworzonej grupy. Ustaw właściela katalogu na użytkownika + root oraz sgrp jako grupę do której należy, następnie + ustaw odpowiednie uprawnienia: grupa=rwx; inni=--- poza tym ustaw bity + setgid oraz sticky. Zaloguj się jako user1000 + i utwórz w wyżej wspomnianym katalogu plik, następnie zaloguj się jako + user2000 dokonaj zmian w utworzonym przez user1000 + pliku. Na koniec spróbuj go usunąć. Zapisanie zmian powinno się + zakończyć się sukcesem, ale próba usunięcia już nie. +

+

Ćwiczenie 3: Wyszukiwanie plików

+

+ Jako superużytkownik na maszynie server1, wyszukaj wszystkie + pliki w całej strukturze katalogu głównego, które zostały zmodyfikowane + w ciągu ostatnich 300 minut i wyświetl ich typ. Wyszukaj w całej + strukturze katalogu głównego pliki nazwanych potoków oraz gniazd. +

+

Ćwiczenie 4: Zaawansowane wyszukiwanie plików

+

+ Jak superużytkownik na maszynie server1, wyszukaj katalogu + /usr zwykłe pliki z czasem dostępu starszym niż 100 dni oraz + rozmiarem nie przekraczającym 5 MB, których właścicielem jest + root. +

+

Ćwiczenie 5: Ustawianie list dostępu

+

+ Jako superużytkownik na maszynie server1, utwórz plik + testfile w katalogu /tmp. Utwórz uzytkowników + user3000 oraz user4000. Stwórz na wszcześniej + utworzonym pliku listy kontroli, ustawiając użytkownikowi + user2000 uprawnienia równe 7, dla user3000 + uprawnienia równe 6, a dla użytkownika user4000 uprawnienia + równe 4. Usuń listę użytkownika user2000 i wyświetl pozostałe listy. + Następnie oczyść plik z list dostępu oraz sprawdź czy nie pozostały + żadne listy. +

+

Podsumowanie

+

+ W tej części materiału zapoznaliśmy się z podstawowymi uprawnieniami + plików i katalogów, nauczyliśmy się je ustawiać w dwóch różnych + formach zapisu. Poznaliśmy uprawnienia specjalne oraz jak je + przypisywać. Dowiedzielśmy się jak ważnym narzędziem jest polecenie + find. Na koniec poznaliśmy sposób na rozszerzenie uprawnień + poza standard ugo/rwx za pomocą list kontroli dostępu. W + następnym rozdziale zajmiemy się użytkownikami. +

+

5. Podstawy zarządzania użytkownikami

+

+ Użytkownik jest encją, czyli odwzrowaniem rzeczywistego elementu. + Obecność użytkowników w systemie ma jeden cel - wyznaczać granice, + bowiem każdy z użytkowników posiada swój katalog domowy, w którym + przechowuje swoje pliki osobiste oraz programy. W tym rozdziale + nauczymy się tworzyć użytkowników oraz modyfikować ich podstawowe + informacje, jak np. położenie katalogu domowego czy zmianę numeru + UID. Na początku jednak zapoznamy się z metodami sprawdzenia + aktywności użytkowników w systemie, prześledzimy ich próby uzyskania + dostępu do systemu. +

+

5.1. Kto jest zalogowany do systemu i co robi

+

+ Za pomocą polecenia who, możemy sprawdzić kto jest + zalogowany w systemie, na jakim terminalu pracuje, o której się + zalogował, jeśli jest połączenie zdalne wówczas po czasie zalogowania + zobaczymy adres IP w nawiasie. W moim systemie obecnie zalogowanych + jest dwóch użytkowników: +

+
+[user@server1 ~]$ who
+root     pts/0        2022-06-25 15:06 (192.168.8.192)
+user     pts/1        2022-06-25 15:06 (192.168.8.192)
+
+

+ Innym poleceniem zwracającym bieżącą aktywność użytkowników systemie + jest polecenie w. Poniżej znajduje się wynik + uruchomienia polecenia na jednym z moich systemów. +

+
+user@server1 ~]$ w
+ 15:09:43 up 4 min,  2 users,  load average: 0.11, 0.23, 0.12
+USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
+root     pts/0     15:06    7.00s  0.10s  0.09s /usr/bin/python3 -s /usr/bin/ranger
+user     pts/1     15:06    1.00s  0.00s  0.00s w
+
+

+ Pierwsza linia informacji zwracanych przez to polecenie jest identyczna + z informacjami, które zwraca polecenie uptime. Następnie + zwraca ono tabele z nazwą użytkownika + (USER), nazwą terminala + (TTY), czasem zalogowania się + (LOGIN@), czasem bezczynności + (IDLE), czasem procesora zużytym na + wykonanie wszystkich zadań po podłączeniu się do terminala wraz z + zadaniami wykonywanymi w tle (JCPU), + czasem procesora zużytym na wykonanie bieżącego procesu + (PCPU) oraz nazwę procesu, która jest + obecnie wykonywana (WHAT). +

+

5.1.1. Monitorowanie prób logowania się do systemu

+

+ Monitorując aktywność systemu nie należy zapominać o sprawdzaniu + prób zalogowania się do niego. W dystrybucjach Linuksa istnieją trzy + polecenia przeznaczone do tego celu. Pierwszym z nich jest polecenie + last, które zwraca listę ostatnio zalogowanych + użytkowników. +

+
+[root@server1 ~]# last
+user     pts/1        192.168.8.192    Sat Jun 25 15:06   still logged in
+root     pts/0        192.168.8.192    Sat Jun 25 15:06   still logged in
+reboot   system boot  5.14.0-70.13.1.e Sat Jun 25 17:05   still running
+user     pts/0        192.168.8.182    Fri Jun 24 14:20 - 17:14  (02:53)
+reboot   system boot  5.14.0-70.13.1.e Fri Jun 24 16:19 - 17:14  (00:54)
+root     pts/1        192.168.8.182    Thu Jun 23 15:54 - 17:27  (01:32)
+user     pts/0        192.168.8.182    Thu Jun 23 14:18 - 17:27  (03:08)
+user     pts/0        192.168.8.182    Thu Jun 23 11:04 - 14:17  (03:13)
+...
+
+

+ Polecenie poza tym kto się zalogował, do jakiego terminala, czy + zdalnie czy lokalnie, zwraca również informacje, o której system + został uruchomiony - wpisy rozpoczynające się od + reboot. Nieścisłości czasowe + wynikają z tego iż, zegar RTC na serwerze ustawiony jest z + uzględniem strefy czasowej oraz zmian czasu lokalnego (powinien + wskazywać na czas UTC), poźniej te dane są skorygowane po + skomunikowaniu się z serwerami czasu. Chcąc wyświetlić tylko listę, + kiedy dokonano startu systemu wydajemy to polecenie z + argumentem reboot, ten argument jest tak naprawdę nazwą + użytkownika. +

+
+[root@server1 ~]# last reboot
+reboot   system boot  5.14.0-70.13.1.e Sat Jun 25 15:42   still running
+reboot   system boot  5.14.0-70.13.1.e Sat Jun 25 17:05 - 15:42  (-1:23)
+reboot   system boot  5.14.0-70.13.1.e Fri Jun 24 16:19 - 17:14  (00:54)
+reboot   system boot  5.14.0-70.13.1.e Thu Jun 23 11:23 - 17:27  (06:03)
+reboot   system boot  5.14.0-70.13.1.e Wed Jun 22 17:30 - 00:17  (06:47)
+reboot   system boot  5.14.0-70.13.1.e Tue Jun 21 15:13 - 18:14  (03:00)
+reboot   system boot  5.14.0-70.13.1.e Mon Jun 20 21:11 - 19:47  (-1:23)
+reboot   system boot  5.14.0-70.13.1.e Mon Jun 20 11:54 - 16:18  (04:24)
+...
+
+

+ Dane wyświetlane przez to polecenie przechowywane są w pliku + /var/log/wtmp. +

+

+ Alternatywnie do listy ostatnio zalogowanych użytkowników, możemy + przejrzeć listę prób logowania się do systemu, które się nie powiodły. + Temu służy polecenie lastb. +

+
+[root@server1 ~]# lastb
+user     ssh:notty    192.168.8.182    Thu Jun 23 14:18 - 14:18  (00:00)
+user     ssh:notty    192.168.8.182    Thu Jun 23 14:18 - 14:18  (00:00)
+user1000 pts/0                         Tue Jun 21 17:28 - 17:28  (00:00)
+user     ssh:notty    192.168.8.182    Mon Jun 20 19:27 - 19:27  (00:00)
+user100  pts/1                         Mon Jun 20 13:00 - 13:00  (00:00)
+user     ssh:notty    192.168.8.182    Mon Jun 20 10:44 - 10:44  (00:00)
+root     pts/0                         Fri Jun 10 17:59 - 17:59  (00:00)
+
+

+ W przypadku połączeń SSH oznaczenie + notty, mówi nam że nie przydzielono + terminala z powodu niepowodzenia logowania. Kiedy w drugiej kolumnie + zobaczymy oznaczenie pts/X (X oznacza numer urządzenia), to + możemy stwierdzić, że nie powiodło się przełączenie na wskazanego w + pierwszej kolumnie użytkownika. Na serwerach, które mają otwarty port + 22 oraz pozwalają na zalogowanie się za pomocą hasła polecenie będzie + zwracać zazwyczaj bardzo długą listę. Wiele automatów na całym świecie + próbuje zalogować się na serwer poprzez zagdywanie użytkownika i hasła. +

+

+ Plikiem, który przechowuje informacje zwracane przez to polecenie + jest /var/log/btmp. +

+

+ Ostanim narzędziem pozwalającym na sprawdzenie kto logował się do + systemu jest polecenie lastlog, wyświetla ono + ostatnie logowanie na podstawie listy użytkowników. +

+
+[root@server1 ~]# lastlog
+...
+user             pts/1    192.168.8.192                             Sat Jun 25 15:06:16 +0200 2022
+vboxadd                                                             **Never logged in**
+user100          pts/1                                              Thu Jun 23 15:55:01 +0200 2022
+user200          pts/0                                              Fri Jun 24 16:55:08 +0200 2022
+user1000         pts/0                                              Tue Jun 21 17:28:44 +0200 2022
+user2000         pts/0                                              Tue Jun 21 17:28:50 +0200 2022
+user3000                                                            **Never logged in**
+user4000                                                            **Never logged in**
+user3            pts/0                                              Thu Jun 23 12:13:34 +0200 2022
+user4            pts/0                                              Thu Jun 23 12:33:09 +0200 2022
+user4100                                                            **Never logged in**
+user4200                                                            **Never logged in**
+user4300         pts/0                                              Thu Jun 23 13:01:04 +0200 2022
+
+

+ Napis **Never logged in** oznacza, że + użytkownik nie logował się do systemu. Informacje zwracane przez to + polecenie są przechowywane w pliku /var/log/lastlog. +

+

5.1.2. Informacje o użytkowniku

+

+ Podczas pracy z użytkownikami, możemy potrzebować informacji na jego + temat. Równie dobrze moglibyśmy sprawdzić go w pliku + /etc/passwd, ale jest lepszy sposób. Na Linuksach dostępne + jest polecenie id, które zwraca UID, GID + podstawowej grupy oraz grup, do których należy użytkownik podany jak + argument tego polecenia: +

+
+[root@server1 ~]# id user100
+uid=1001(user100) gid=1001(user100) groups=1001(user100),9999(sgrp)
+
+

+ Wówczas jeśli jako my sami potrzebuje wyświetlić, grupy do których + należymy możemy użyć polecenia groups. +

+
+[user100@server1 ~]$ groups
+user100 sgrp
+
+

5.2. Pliki autentykacji użytkowników

+

+ Każdy użytkownik, chcący skorzystać z systemu musi się uwierzytelnić + za pomocą tylko jemu znanych poświadczeń, wówczas zostaje on + autoryzowany do wykonywania różnych czynności w systemie. Sam system + do uwierzytelniania użytkowników stosuje kilka plików. +

+

5.2.1. Pliki /etc/passwd

+

+ Ten plik jest swoistą bazą danych o użytkownikach w systemie. Każdy + jeden wpis to jeden użytkownik. +

+
+[root@server1 ~]# tail -5 /etc/passwd
+user:x:1000:1000:user:/home/user:/bin/bash
+user100:x:1001:1001::/home/user100:/bin/bash
+user200:x:1002:1002::/home/user200:/bin/bash
+user1000:x:1003:1003::/home/user1000:/bin/bash
+user2000:x:1004:1004::/home/user2000:/bin/bash
+
+

+ Każdy z tych wpisów zawiera kilka pól oddzielonych od siebie + dwukropkiem (:). Natomiast same pola oznaczają + kolejno: +

+
    +
  • Nazwę użytkownika - + user. Nazwy użytkowników na + Linuksie nie powinny przekraczać 255 znaków oraz zawierać innych + znaków specjalnych niż podkreślnik (_) lub + myślnik (-) i niepowinny zawierać wielkich liter, +
  • +
  • Hasło - x, + w tym przypadku x oznacza, że hasło jest zaszyforwane w + pliku /etc/shadow, w tym polu może znajdować się również + gwiazdka (*), która oznacza że konto jest wyłączone. +
  • +
  • UID - 1000, jest + identyfikator użytkownika, jądro odwołując się do użytkowników + używa tych identyfikatorów. W systemie istnieją zakresy + UID, które są przypisywane poszczególnym użytkownikom. + Identyfikator 0, jest zarezerwowany dla root, identyfikatory + do 1 do 999 są przeznaczone dla użytkowników systemowych (przeważnie + tworzonych na potrzeby usług, w RHEL istnieje podział, na + UID-y od 1 do 200 są przeznaczone dla użytkowników + przypisanych do wewętrznych usług systemowych a UID-y od 201 + do 999 dla pozostałych).
  • +
  • GID - 1000, jest + to identyfikator grupy podstawowej użytkownika (podczas tworzenia + użytkownika, tworzona jest także grupa o takiej samej nazwie jak + użytkownik i jest ona nazywana podstwową grupą użytkownika. Istnienie + takiej grupy zapewnia spójność uprawnień plików).
  • +
  • Komentarz - user, + Komentarz, dawniej pole GECOS, jest miejscem na dodatkowe + informacje o użytkowniku, np. numer telefonu lub adres e-mail.
  • +
  • Katalog domowy - + /home/user, to pole zawiera ścieżkę + do katalogu domowego.
  • +
  • Powłoka - + /bin/bash, miejsce dla domyślnego + programu uruchamianego zaraz po zalogowaniu najczęsciej jest to + jedna z dostępnych w systemie powłok.
  • +
+

5.2.2. Plik /etc/shadow

+

+ Plik /etc/shadow, koreluje z plikem /etc/passwd ich + wspólnym kluczem jest nazwa użytkownika. Plik ten zamiast ogólnych + informacji o użytkowniku zawiera jego hasło oraz zasady związane z + hasłami. Tak jak w przypadku pliku passwd każdy wpis + odpowiada jedemu użytkownikowi. +

+
+[root@server1 ~]# tail -5 /etc/shadow
+user:$6$bNlZFNZV/wWKGQU8$DgIHeUdALGWs7bZ7Foet2UeHFSANSvYcEtLmn6aLm5QxLcx10jZNkUg.dphdmizej/k5Xe.oEqSCeHAf5/7Gv0::0:99999:7:::
+user100:$6$N3norXlohg0yE1pi$FyeKcBNl4mj/nLbNRlx7KaAQnddG0y/kXpQ9pbgjTV9ti3dQ5q3pIpXm1poa85oxFHFVT9HPTyBmaRNkrSJPX.:19163:0:99999:7:::
+user200:!!:19163:0:99999:7:::
+user1000:!!:19163:0:99999:7:::
+user2000:!!:19163:0:99999:7:::
+
+

+ Każdy z tych wpisów zawiera kilka pól oddzielonych od siebie + dwukropkiem (:). Natomiast same pola oznaczają + kolejno: +

+
    +
  • Nazwę użytkownika - + user, odpowiadającą nazwie + użytkownika z pliku /etc/passwd.
  • +
  • Zaszyfrowane hasło - + $6$bNlZFNZV/wWKGQU8$DgIHeUdALGWs7bZ7Foet2UeHFSANSvYcEtLmn6aLm5QxLcx10jZNkUg.dphdmizej/k5Xe.oEqSCeHAf5/7Gv0, utworzone na podstawie hasła wpisanego + przez użytkownika. RHEL w przypadku przesłonionych haseł używa + algorytmu SHA-512. Jeśli to pole zawiera wykrzyknik + (!), to wówczas użytkownik nie może zalogować się + do systemu za pomocą hasła. Puste pole oznacza, że uzytkownik może + zalogować się bez wprowadzania hasła.
  • +
  • Ostatnia zmiana hasła - + 19163, to pole zawiera liczbę + dni, która upłyneła od północy 1 stycznia 1970r. (początku czasu + Uniks) do momentu zmiany hasła. To pole można uznać za liczbową + datę.
  • +
  • Minimalny wiek hasła - + 0, wyznacza liczbę dni, która musi + upłynąć przed następną zmianą hasła. Puste pole lub zero oznacza + iż, nie ustalono minimalnego wieku dla hasła tego użytkownika.
  • +
  • Maksymalny wiek hasła - + 99999, wyznacza liczbę dni, po + której należy zmienić hasło. Hasła, których ważność osiągnie tę + wartość mogą być dalej ważne, jednak system przy następnym logowaniu + będzie wymagał jego zmiany.
  • +
  • Okres ostrzegania - + 7, określa ilość dni, w których + użytkownik będzie informowany o tym, że mija termin ważności jego + hasła i musi je zmienić, aby dalej móc się logować do systemu.
  • +
  • Okres nieaktywności hasła - określa ilość dni, + przez które przeterminowane hasło będzie jescze akceptowane. Po + zalogwaniu system będzie żądać zmiany hasła. W przypadku naszego + przykładu, to pole jest puste, a więc nie ma zdefiniowanego tego + okresu.
  • +
  • Data wygaśnięcia konta - określa ilość dni od + północy 1 stycznia 1970r., po których nie będzie można używać + konta do logowania się. Zero bądź puste pole (tak jak na + przykładzie) oznacza iż konto nigdy nie wygaśnie.
  • +
  • Pole zarezerowane - pole zarezerowowane do użycia + w przyszłości.
  • +
+

+ W przypadku pól od zaszyfrowanego hasła do pola zarezerowanego, puste + pole lub 0 wyłącza przeznaczone im właściwości. Część z tych opcji + ustawiana jest w pliku /etc/login.defs i nazwane są + zasadami ważności haseł lub ang. + pasword aging. Na koniec zwróćmy uwagę na szczegóły tego pliku: +

+
+[root@server1 ~]# ls -l /etc/shadow
+----------. 1 root root 2012 Jun 25 18:53 /etc/shadow
+
+

+ Nikt nie ma żadnych uprawnień do tego pliku. Możliwa jest jego + modyfikacja za pomocą specjalnego mechanizmu, który będzie omawiany + przy okazji SELinux. +

+

5.2.3. Plik /etc/group

+

+ Plik /etc/group jest odpowiednikiem dla pliku + /etc/passwd tylko, że dla group. Ten plik ma podobną budową + do plików /etc/passwd lub /etc/shadow posiada jednak + mniejszą ilość pól. +

+
+[root@server1 ~]# tail -5 /etc/group
+user:x:1000:
+user100:x:1001:
+user200:x:1002:
+sgrp:x:9999:user100,user200
+sgrp2:x:8888:user1000,user2000
+
+

+ A każde z pół przechowuje kolejno: +

+
    +
  • Nazwę grupy - + sgrp.
  • +
  • Hasło grupy - + x oznacza, że hasło jest + zaszyfrowane w pliku /etc/gshadow. Hasła grupy służą + zablokowaniu przełączania się między grupami za pomocą polecenia + newgrp, aby użytkownicy nie mogli uzyskać dostępu + plików innych grup.
  • +
  • GID - + 9999, identyfikator grupy.
  • +
  • Lista członków grupy - + user100,user200, lista użytkowników + oddzielonych przecinkami przypisanych do tej grupy. W przypadku + podstawowych grup użytkowników (nazwa grupy jest identyczna z nazwą + użytkownika), a członek jest domyślny i nie widnieje na liście.
  • +
+

5.2.4. Plik /etc/gshadow

+

+ Grupy jak i użytkownicy również mają swoje hasła. W opisie pola hasła + przy okazji pliku /etc/group wyjaśniłem dlaczego tak jest. Te + hasła muszą być gdzieś składowane i to w bezpieczny sposób. Hasła grup + również są przesłonione jak hasła użytkowników. Miejscem składowania + haseł grup jest jest plik /etc/gshadow, zawiera on podobne + wpisy jak plik /etc/group i jest z nim powiązany wspólnym + kluczem jakim jest nazwa grupy. +

+
+[root@server1 user]# tail /etc/gshadow
+user:!::
+user100:!::
+user200:!::
+dba:!::
+user1000:!::
+user2000:!::
+dbagrp:!::
+user90:!::
+g1:!::
+
+

+ Plik /etc/gshadow zawiera 4 pola tak jak plik + /etc/group, każde z tych pól oznacza kolejno: +

+
    +
  • Nazwa grupy - + user, identyczna z nazwą zawartą w + we wpisach w pliku /etc/group.
  • +
  • Zaszyforwane hasło, jeśli tym polu pojawia się + inny znak taki jak ! lub gwiazdka + (*) oznacza to, że użytkownicy nie mogą za pomocą + hasła uzyskać dostępu do grupy.
  • +
  • Administratorz grupy, lista użytkowników mogących + zarządzać grupą, mogą oni dodawać i usuwać członków przy użyciu + polecenia gpasswd.
  • +
  • Członkowie grupy, oddzielona przecinkami lista + użytkowników należąca do tej grupy.
  • +
+

5.3. Podstawy zarządzania użytkownikami

+

+ W tym podrozdziale poznamy podstawy zarządzania użytkownikami. Będziemy + tworzyć użytkowników, zmieniać informacje o nich oraz ich usuwać. + Tworząc nowego + użytkownika wydajemy proste polecenie i podajemy jego nazwę. Taki + użytkownik tworzony jest z domyślnymi wartościami. Zanim zaczniemy + tworzyć użytkowników poznamy dwa miejsca, skąd mogą brać się te + domyślne wartości. +

+

5.3.1. Domyślnie informacje użytkowników

+

+ Informacje o tym jaką przydzielić użytkownikowi powłokę, czy między + jakimi wartościami powinien znajdować się jego UID są w + systemie z góry określone. Takimi miejscami, w których możemy szukać + domyślnych wartości jest plik /etc/default/useradd, + którego zawartość dostępna jest po wydaniu poniższego polecenia: +

+
+[user@server1 ~]$ useradd -D
+GROUP=100
+HOME=/home
+INACTIVE=-1
+EXPIRE=
+SHELL=/bin/bash
+SKEL=/etc/skel
+CREATE_MAIL_SPOOL=yes
+
+

+ Z tych informacji możemy wynioskować początkowy GID + (GROUP), jednak + ta opcja używana jest gdy opcja USERGROUPS_ENAB, w pliku + /etc/login.defs (drugim z plików) jest ustawiona na NO. + Poza tym znamy domyślną lokalizację tworzenia katalogów domowych + (HOME), czas nieaktywność + (INACTIVE), który określa liczbę dni + pomiędzy wygaśnięciem hasła a trwałym zablokowaniem konta, domyślną + datę wygaśnięcia konta (EXPIRE), + domyślną powłokę (SHELL), lokalizację + katalogu szkieletowego (SKEL) - + katalog ten przechowuje pliki kopiowane do każdego katalogu domowego + nowego użytkownika w momencie jego utworzenia. Ostatnią wartością jest + zmienną określająca czy tworzyć pliki skrzynki mailowej każdemu + użytkownikowi + (CREATE_MAIL_SPOOL). Nie które z tych + wartości możemy modyfikować używając tego samego polecenia, więcej + informacji na ten temat znajduje się na stronie podręcznia polecenia + useradd. +

+

+ Innym źródłem wartości domyślnych wykorzystywanych podczas tworzenia + użytkowników jest plik /etc/login.defs. Zawartość tego pliku + najlepiej jest wyświetlić za pomocą poniższego polecenia, które + odfiltruje komentarz i puste linie: +

+
+[user@server1 ~]$ grep -v ^# /etc/login.defs | grep -v ^$
+MAIL_DIR	/var/spool/mail
+UMASK		022
+HOME_MODE	0700
+PASS_MAX_DAYS	99999
+PASS_MIN_DAYS	0
+PASS_WARN_AGE	7
+UID_MIN                  1000
+UID_MAX                 60000
+SYS_UID_MIN               201
+SYS_UID_MAX               999
+SUB_UID_MIN		   100000
+SUB_UID_MAX		600100000
+SUB_UID_COUNT		    65536
+GID_MIN                  1000
+GID_MAX                 60000
+SYS_GID_MIN               201
+SYS_GID_MAX               999
+SUB_GID_MIN		   100000
+SUB_GID_MAX		600100000
+SUB_GID_COUNT		    65536
+ENCRYPT_METHOD SHA512
+USERGROUPS_ENAB yes
+CREATE_HOME	yes
+HMAC_CRYPTO_ALGO SHA512
+
+

+ Wewnątrz tego pliku znajdują się definicje takich wartości jak + maska użytkownika (umask), elementy + polityki haseł (PASS_...) czy zakresy + wartości UID oraz GID. W tym pliku również znajduje + się nazwa algorytmu używanego do przesłaniania haseł. Opisy + poszczególnych wartości zawartych w tym pliku znajdują się na + stronie podręcznika. +

+

5.3.2. Tworzenie użytowników

+

+ Do tworzenia użytkowników systemie służy polecenie + useradd, + domyślnie wymaga on wyłącznie podania nazwy użytkownika. Podczas tej + czynności zostaną dodane wpisy do plików autentykacyjnych, które + omwialiśmy + wcześniej, zostanie utworzony katalog domowy i przekopiowane zostaną + do niego pliki z katalogu szkieletowego (/etc/skel). Utworzymy + sobie teraz testowego użytkownika. +

+
+[root@server1 user]# useradd user1
+
+

+ To polecenie utworzy użytkownika z domyślnymi wartościamy identyfkatora, + powłoki oraz innymi. Polecenie to daje możliwość zmiany tych wartości + podczas tworzenie nowego użytkownika. Poniżej znajduje się lista opcji, + na której zawarto najważniejsze z nich: +

+
    +
  • -d, pozwala na podanie ścieżki do katalogu + domowego użytkownika.
  • +
  • -g, pozwala na podanie GID-u lub nazwy + podstawowej grupy użytkownika.
  • +
  • -G, pozwala na wprowadzenie grup, do których ma + należeć użytkownik, nazwy podajemy po przecinku (o ile więcej niż + jedna).
  • +
  • -o, każdy identyfikator czy to użytkownika czy + grupy musi być unikatowy. Ta opcja pozwala na współdzielenie + (w tym przypadku) UID-u, choć konieczność użycia tej opcji + zachodzi tylko w specyficznych przypadkach.
  • +
  • -s, pozwala na ustalenia domyślnego programu, + który uruchamiany jest zaraz po zalogowaniu się użytkownika. Tym + programem najczęściej jest powłoka.
  • +
  • -u, pozwala na podanie identyfikatora użytkownika + UID, identyfikator powinien być unikatowy w cały systemie, + chyba że podano opcję -o.
  • +
+

+ Chcąc użyć tych opcji podaje się je po nazwie polecenia przed nazwą + użytkownika. W ramach ćwiczeń możemy utworzyć kilku użytkowników z + losowymi wartościami opcji podanych powyżej. W tym rozdziale poznamy + narzędzie, które służy do usuwania użytkowników, ale za nim to zrobimy + poznamy polecenie, dzięki któremu będziemy mogli zmienić opcje już + utworzonych użytkowników. +

+

+ Tak utworzonym użytkowników pozostało tylko nadać hasło, przy użyciu + polecenia passwd. +

+

+ Tutaj podano tylko część opcji tego polecenia, więcej znajduje się + na stronie podręcznika. Nie uczmy się także opcji na pamięć, raczej + zawsze będziemy mieć dostęp do stron podręcznika. +

+

5.3.3. Zmiana informacji użytkownika

+

+ Zmianie informacji użytkownika służy polecenie usermod, + ma ono prawie identyczne opcje jak polecenie useradd. Poza + kilkoma wyjątkami. +

+
    +
  • -l - opcja pozwala na podanie nowej nazwy + użytkownika.
  • +
  • -d - opcja pozwala na zmianę katalogu domowego. + Nie było by tej opcji na tej liście gdyby nie fakt, iż aby katalog + został utworzony na podanej ścieżce, ta opcją musi zostać użyta w + raz z opcją -m, której zadaniem jest przeniesienie danych + z poprzedniego katalogu.
  • +
+

+ Na poniższym przykładzie pokazano zmianę katalogu domowego użytkownika + user90: +

+
+[root@server1 ~]# tail /etc/passwd
+...
+user90:x:5003:5003::/home/user90:/bin/bash
+
+[root@server1 ~]# usermod -d /usr/home90 -m user90
+[root@server1 ~]# tail /etc/passwd
+...
+user90:x:5003:5003::/usr/home90:/bin/bash
+
+[root@server1 ~]# ls -al /usr/home90
+total 12
+drwx------.  3 user90 user90  78 Jun 26 16:06 .
+drwxr-xr-x. 13 root   root   158 Jun 27 14:31 ..
+-rw-r--r--.  1 user90 user90  18 Nov  5  2021 .bash_logout
+-rw-r--r--.  1 user90 user90 141 Nov  5  2021 .bash_profile
+-rw-r--r--.  1 user90 user90 492 Nov  5  2021 .bashrc
+drwxr-xr-x.  4 user90 user90  39 Jun 26 13:48 .mozilla
+
+

+ Pozostałe opcje, które znajdują się na stronie podręcznika tego + polecenia możemy używać w ten sam sposób jak w przypadku + useradd. +

+

5.3.4. Usuwanie użytkowników

+

+ Kiedy użytkownicy przestają być potrzebni, ze względów bezpieczeństwa + można, albo ich zablokować albo usunąć. W tym rodziale zajmiemy się + wyłącznie usuwaniem. Polecenie do usuwania użytkowników to + userdel. Jest ono prostolinijne i niewymaga + dodatkowych opcji, wystarczy podać nazwę użytkownika jako + argument polecenia i użytkownik zostanie usunięty, jednak jego dane + pozostaną w systemie. Użytkownika wraz z danymi możemy usunąć za + przy użyciu opcji -r. +

+
+[root@server1 ~]# userdel -r user90
+[root@server1 ~]# tail /etc/passwd
+chrony:x:986:981::/var/lib/chrony:/sbin/nologin
+dnsmasq:x:985:980:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
+tcpdump:x:72:72::/:/sbin/nologin
+systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
+user:x:1000:1000:user:/home/user:/bin/bash
+user100:x:1001:1001::/home/user100:/bin/bash
+user200:x:1002:1002::/home/user200:/bin/bash
+user5000:x:5000:7000::/home/user5000:/bin/bash
+user1000:x:5001:5001::/home/user1000:/bin/bash
+user2000:x:5002:5002::/home/user2000:/bin/bash
+[root@server1 ~]# ls -al /usr/home90
+ls: cannot access '/usr/home90': No such file or directory
+
+

5.3.5. Użytkownicy bez możliwości logowania

+

+ Tak jak na początku powiedzieliśmy sobie, że użytkownicy w systemie + istnieją, po to aby wyznaczać granice. Takim użytkownikami + są najczęściej są użytkownicy systemowi, którzy są związani z róznego + rodzaju usługami. Cechą która ich wyróżnia jest fakt, iż nie mają + oni możliwości logowania do systemu, inaczej mówiac są + użytkownikami nieinteraktywnymi. Użytkownicy tego + typu w miejscu powłoki mają + wskazany program /sbin/nologin. Ten mały program przy + próbie zalogowania zwróci informacje o tym, że to konto jest obecnie + niedostępne. Treść tego komunikatu możemy zmieniać, wpisująć nasz + komunikat do pliku /etc/nologin.txt. Użytkownikiem bez + możliwości logowania może być każdy, kto ma zamiast powłoki ustawiony + właśnie ten program. Poniżej znajduje się polecenie, które zmieni + użytkownika user2000 w użytkownika nieinteraktywnego. +

+
+[root@server1 ~]# usermod -s /sbin/nologin user2000
+[root@server1 ~]# tail /etc/passwd
+chrony:x:986:981::/var/lib/chrony:/sbin/nologin
+dnsmasq:x:985:980:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
+tcpdump:x:72:72::/:/sbin/nologin
+systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
+user:x:1000:1000:user:/home/user:/bin/bash
+user100:x:1001:1001::/home/user100:/bin/bash
+user200:x:1002:1002::/home/user200:/bin/bash
+user5000:x:5000:7000::/home/user5000:/bin/bash
+user1000:x:5001:5001::/home/user1000:/bin/bash
+user2000:x:5002:5002::/home/user2000:/sbin/nologin
+
+

+ Kiedy spróbuje się na niego zalogować otrzymam wspomniany komunikat. +

+
+[root@server1 ~]# su - user2000
+This account is currently not available.
+
+

+ Odnośnie egzaminu:
+ Jeśli w systemie użytkownik, który teoretycznie nie powinien mieć + możliwości logowania, zaloguje się do systemu to znaczy, że mamy + poważny problem z bezpieczeństwem. Wówczas należy sprawdzić + w pliku /etc/passwd czy wszyscy użytkownicy nieinteraktywni + mają ustawiony domyślny program na /sbin/nologin. +

+

Ćwiczenie 1: Sprawdzenie prób logowania użytkowników

+

+ Jako superużytkownik na maszynie server1. Zapisz przy użyciu + polecenia Vim ostaniego użytkownika, któremu udało się + zalogować oraz ostatniego którego logowanie nie powiodło się. Zapisz + ostatnie + uruchomienie systemu, poza obecnym włączniem oraz listę użytkowników, + którzy nigdy się nie logowali do systemu. +

+

Ćwiczenie 2: Weryfikacja użytkownika oraz grupy

+

+ Jako superużytkownik na maszynie server1, uruchom polecenie + who oraz w porównaj wyniki ich działania. Uruchom + polecnia id oraz groups następnie omów informacje + zwracane przez nie. +

+

Ćwiczenie 3: Tworzenie użytkowników

+

+ Jak superużytkownik na maszynie server1, utwórz użytkownika o + nazwie user4100, o identyfikatorze 4100, katalogu + domowym znajdującym się katalogu /usr. Następnie utworz + użytkownika user4200 z domyślnymi ustawieniami. Przypisz obu + hasło. Następnie wyświetl dotyczące ich wpisy w plikach autentykacji + (/etc/{passwd,shaddow,group,gshadow}). +

+

Ćwiczenie 4: Tworzenie użytkowników nieinteraktywnych

+

+ Jako superużytkownik na maszynie server1, utwórz użytkownika + user4300, następnie zmień informacje o nim tak, aby stał sie + użytkownikiem nieinterkatywnym. Ustaw mu hasło i spróbuj się zalogować + na niego. Jaki komunikat został wyświetlony? Wyświetl wpis użytkownika + w pliku /etc/passwd. Co spowodowało, że użytkownik nie może + się zalgować? +

+

Podsumowanie

+

+ W tym rozdziale dowiedzieliśmy się w jaki sposób możemy sprawdzić + próby logowania się do systemu, kto jest zalgowany i co robi. + Poznaliśmy zestaw plików odpowidzialnych za autentykacje, a także + nauczyliśmy w podstawowym stopniu zarządzać użytkownikami. W następnym + rozdziale skupimy się na zasadach haseł i przełączaniu użytkowników. +

+

6. Zaawansowane zarządzanie użytkownikami

+

+ W poprzednim rozdziale nauczyliśmy się tworzyć, usuwać użytkowników oraz + edytować informacje o nich. Poznaliśmy plik uwierzytelniania, którym + między innymi jest plik /etc/shadow, w nim przechowywane są + przesłonione hasła, zasady ważności haseł oraz kont i tym + zajmiemy sie na początku. +

+

6.1. Zasady ważności hasła

+

+ Każdy administrator w systemie, który wykorzystuje intensywnie + użytkowników, powinien + wdrożyć zasady bezpieczeństwa z nimi związane. Może wymusić na osobach + korzystających z kont ich zabezpieczenie po przez regularną zmianę hasła, + zablokować nieużywane konta czy utworzyć dla użytkowników tylko konta + tymczasowe, które po upływie określonego czasu zostaną automatycznie + zablokowane. Te zasady mieszczą w się + w dziedzinie ustawień ważności hasła i są realizowane w dystrybucjach + Linuksa za pomocą dwóch poleceń: chage oraz + passwd. Poniżej w tabeli skumulowałem opcje + tych dwóch poleceń odpowiadające za konkrentą czynność. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
chagepasswd
Data ostatniej modyfikacji hasła-dX
Data wygaśnięcia konta-EX +
Czas nieaktywności hasła-I-i
Informacje o zasadach użytkownika + -l-S
Minimalna ważność hasła-m-n
Maksymalna ważność hasła + -M-x
Okres ostrzegania + -W-w
+

+ Po za tymi wspólnymi cechami, polecenie passwd, jest wstanie: +

+
    +
  • usunąć hasło - -d, takie konto, wówczas + staje się kontem bez hasła.
  • +
  • wymusić utratę ważności hasła - -e, po + zalogowaniu na takie konto, wymagana będzie zmiana hasła. Ustawienie + opcji -d polecenia chage, daje ten sam efekt.
  • +
  • zablokować konto - -l, użytkownik nie + będzie mieć możliwości zalogowania się do systemu.
  • +
  • odblokować konto - -u, przywraca + możliwość logowania się zablokowanemu kontu.
  • +
+

+ Stosując chage lub passwd nazwę użytkownika podajemy + po opcjach i ich wartościach. Na poniższym przykładzie za prezentowałem + w jaki sposób możemy ustawić wszystkie pozostałe pola we wpisie w pliku + /etc/shadow za pomocą powyższych poleceń. +

+
+#chage:
+[root@server1 ~]# chage -m 7 -M 28 -W 5 -I 7 -E 2022-12-31 user3000
+[root@server1 ~]# chage -l user3000
+Last password change					: Jun 28, 2022
+Password expires					: Jul 26, 2022
+Password inactive					: Aug 02, 2022
+Account expires						: Dec 31, 2022
+Minimum number of days between password change		: 7
+Maximum number of days between password change		: 28
+Number of days of warning before password expires	: 5
+[root@server1 ~]# grep 'user3000' /etc/shadow
+user3000:$6$AjNe9ajpYrZ1Sjld$NN36zAMKPlnJElCvuUX1UM0fc6Ymc5pLY4medoHRMCWJhnsoiuKSpjbo7uwTZVkVlv.swqQJ5Dxoa2QZyjsXO.:19171:7:28:5:7:19357:
+
+#passwd:
+[root@server1 ~]# passwd -n 5 -x 28 -w 5 -i 7 user4000
+Adjusting aging data for user user4000.
+passwd: Success
+[root@server1 ~]# passwd -S user4000 
+user4000 PS 2022-06-28 5 28 5 7 (Password set, SHA512 crypt.)
+[root@server1 ~]# grep 'user4000' /etc/shadow
+user4000:$6$29yZ7yqj2lWdSoQE$AMp2ZXAqxa.wWMA88dINDdogjych/Yshnip1whwaqymLTS4ALW9UGx9406tZmsghOTXptBIFrq4UvDF/.sl2f0:19171:5:28:5:7::
+
+

+ Za pomocą polecenia passwd, nie możemy dodać daty wygaśnięcia + konta. Jednak to polecenie wraz z poleceniem, które znamy z + poprzednie rozdziału usermod, może blokować i odblokowywać + konta. Zablokujemy i odblokumjemy oba wcześniej wykorzystwane konta. +

+

+ Blokowanie kont za pomocą polecenia passwd: +

+
+[root@server1 ~]# passwd -l user3000
+Locking password for user user3000.
+passwd: Success
+[root@server1 ~]# grep 'user3000' /etc/shadow
+user3000:!!$6$AjNe9ajpYrZ1Sjld$NN36zAMKPlnJElCvuUX1UM0fc6Ymc5pLY4medoHRMCWJhnsoiuKSpjbo7uwTZVkVlv.swqQJ5Dxoa2QZyjsXO.:19171:7:28:5:7:19357:
+[root@server1 ~]# passwd -u user3000
+Unlocking password for user user3000.
+passwd: Success
+[root@server1 ~]# grep 'user3000' /etc/shadow
+user3000:$6$AjNe9ajpYrZ1Sjld$NN36zAMKPlnJElCvuUX1UM0fc6Ymc5pLY4medoHRMCWJhnsoiuKSpjbo7uwTZVkVlv.swqQJ5Dxoa2QZyjsXO.:19171:7:28:5:7:19357:
+
+

+ Jak możemy zauważyć po zablokowaniu konta przed przesłonionym hasłem + zostały umieszczone dwa wykrzykniki, które po odblokowaniu konta + zostały usunięte. Poniżej znajdują się te same czynności wykonane + przy użyciu polecenia usermod. +

+
+[root@server1 ~]# usermod -L user4000
+[root@server1 ~]# grep 'user4000' /etc/shadow
+user4000:!$6$29yZ7yqj2lWdSoQE$AMp2ZXAqxa.wWMA88dINDdogjych/Yshnip1whwaqymLTS4ALW9UGx9406tZmsghOTXptBIFrq4UvDF/.sl2f0:19171:5:28:5:7::
+[root@server1 ~]# usermod -U user4000
+[root@server1 ~]# grep 'user4000' /etc/shadow
+user4000:$6$29yZ7yqj2lWdSoQE$AMp2ZXAqxa.wWMA88dINDdogjych/Yshnip1whwaqymLTS4ALW9UGx9406tZmsghOTXptBIFrq4UvDF/.sl2f0:19171:5:28:5:7::
+
+

+ W przypadku polecenia usermod, umieszczony został tylko jeden + wykrzyknik przed hasłem, jednak nie ważne czy został umieszczony jeden + czy dwa, wykrzyknik przed przesłonionym hasłem oznacza, że konto jest + zablokowane. +

+

6.2. Zarządzanie grupami

+

+ Podobnie tak jak w przypadku użytkowników, w poprzednim rozdziale + tak i grupami możemy zarządać w podobny sposób. Możemy je dodawać z + dostosowanymi do potrzeb informacjami, zmieniać ich informacje oraz + usuwać. +

+

6.2.1. Tworzenie nowych grup

+

+ Do tworzenia nowych grup służy polecenie groupadd, + które do utworzenia grupy z domyślnymi wartościami wymaga jedynie jej + nazwy. Poniżej znajdują się najważniejsze opcje tego polecenia: +

+
    +
  • -g, pozwala na podanie własnego identyfikatora + grupy GID, identyfikator powinien być unikatowy, chyba że + podano opcję -o.
  • +
  • -o, pozwala na współdzielenie identyfikatora z + inną grupą.
  • +
  • -r, tworzy grupę systemową z identyfikatorem w + zakresie podanym w pliku /etc/login.defs, przeważnie + między 201 a 999.
  • +
  • -U, pozwala podać listę użytkowników, którzy będą + należeć do grupy, nazwy użytkowników są oddzielone od siebie + przecinkiem.
  • +
+
+[root@server1 ~]# groupadd -g 9999 sgrp
+[root@server1 ~]# grep 'sgrp' /etc/group
+sgrp:x:9999:
+
+

+ Na powyższym przykładzie utworzyłem grupę z niestandardowym + identyfikatorem, następnie wyświetliłem jej wpis w pliku + /etc/group. +

+

6.2.2. Zmiana informacji grupy

+

+ Polecenie groupmod, posiada takie samo zastosowanie + dla grup, jak polecenie usermod dla użytkowników. Część opcji + groupmod odpowiada opcjom z polecenia groupadd. + Na wyszczególnienie zasługuje opcja -n, która pozwala + na zmianę nazwy grupy. +

+
+[root@server1 ~]# groupmod -g 8888 -n sysadm sgrp
+[root@server1 ~]# grep 'sgrp' /etc/group
+[root@server1 ~]# grep 'sysadm' /etc/group
+sysadm:x:8888:
+
+

+ Jak możemy zobaczyć na przykładzie grupie + sgrp został zmieniony identyfikator + oraz nazwa. Teraz ta grupa widnieje pod GID-em + 8888 oraz pod nazwą + sysadm. +

+

6.2.3. Usuwanie grup

+

+ Jeśli grupa nie jest już potrzebna w systemie możemy ją usunąć. Do + usuwania grup służy polecenie groupdel. Polecenie jest + bardzo proste w użyciu. Jedyny wymagany argument to nazwa grupy. +

+
+[root@server1 ~]# groupdel sysadm
+[root@server1 ~]# grep 'sysadm' /etc/group
+
+

+ Grupa została usunięta. Polecenie grep + nie mogło odnaleźć wzorca sysadm w + pliku /etc/group. +

+

6.3. Przełączanie użytkowników oraz uruchamianie poleceń jako superużytkownik

+

+ Wykonywanie zadań administracyjnych najczęściej będzie wymagać + podniesienia uprawnień do poziomu superużytkownika - root. + Do tej pory wszystkie polecenia w tym materiale wykonywałem z poziomu + konta root (wyjątkowowo kilka poleceń zostało wykonanych jako + zwykły użytkownik), więc aby wykonywać zadania administracyjne + należy się zalogować jak superużytkownik. Logowanie bezpośrednie na to + konto nie jest dobrą praktyką. A do dyspozycji mamy dwa rozwiązania. + Pierwszym z nich jest przełączenie użytkownika. +

+

6.3.1. Przełącznie użytkownika

+

+ Pierwszą z metod jest zalogowanie się na nasze konto (konto dostępowe, + zwykły użytkownik), a następnie przełącznie się na konto root + za pomocą polecenia su. To polecenie pozwala na + przełączenie się na dowolne konto, jeśli jako pierwszy argument podamy + myślnik (-) przed nazwą użytkownika podczas + przełączania zostaną uruchomione skrypty startowe, które stworzą nam + środowisko jak najbardziej zbliżone do bezpośredniego logowania. +

+
+[user@server1 ~]$ su - root
+Password: 
+[root@server1 ~]# 
+
+

+ Za pomocą tego polecenia możemy przełączyć się na dowolne konto, jeśli + zwykli użytkownicy przełączają się między kontami wymagane będzie + podanie hasła dla docelowego konta, wyjątkiem tutaj jest + superużytkownik, który nie musi podawać żadnych haseł. +

+

+ Aby korzystać z tej metody nie trzeba nawet otwierać sesji powłoki jako + przełączony użytkownik, możemy po prostu wykonać polecenie jako on za + pomocą opcji -c. +

+
+[user@server1 ~]$ su root -c 'vgs'
+Password: 
+  VG   #PV #LV #SN Attr   VSize   VFree
+  rhel   1   2   0 wz--n- <19.00g    0 
+
+

+ Korzystanie z polecenia su, nie jest zbyt elastycznym + rozwiązaniem, daje pełen dostęp do superużytkownika gdzie nie jest to + konieczne. Ten rodzaj podniesienia uprawnień w systemie używany jest + przez kilka dystrybucji w jednym celu aby pobrać i skonfigurować + to drugie rozwiązanie. +

+

6.3.2. Polecenie sudo

+

+ Użycie polecenia sudo jest znacznie lepszym + rozwiązaniem. Głównym argumentem jest fakt, iż możemy skonfigurować + to polecenie w taki sposób, aby dać użytkownikom dostęp tylko do + tych poleceń których naprawdę potrzebują. Jednak na początku zajmiemy + się prostszą konfiguracją, czyli stworzeniem lokalnego administratora, + którego konto dalej będzie zwykłym użytkownikiem. +

+

+ Do konfiguracji tego narzędzia służy plik /etc/sudoers oraz + katalog /etc/sudoers.d, w którym wystarczy umieścić plik z + konfiguracją. Plik /etc/sudoers, możemy edytować dowolnym + edytorem, jednak pakiet sudo posiada specjalne polecenie + visudo, które stworzy kopie tymczasową pliku, na + której + będziemy dokonywać zmian (polecenie samoczynnie uruchomi edytor), + następnie polecenie nadpisze oryginalny plik i usunie plik tymczasowy. + Najprostszą konfiguracją jaką możemy + wykonać jest nadanie zwykłemu użytkownikowi uprawnień do wszystkich + funkcji administracyjnych. Zmian możemy dokonać w dowolnym miejscu w + pliku, jednak nalepiej + znaleźć odpowiednie do tego miejsce. Możemy je namierzyć wyszukując + linię root ALL=(ALL) ALL, skopiować + ją, wkleić pod nią i zmienić tylko nazwę użytkownika na początku linii: +

+
+user ALL=(ALL)  ALL
+
+

+ Ten wpis zapewni użytkownikowi user + dostęp do wszystkich funkcji administracyjnych w systemie. Oprócz + użytkownikom, dostęp do wszystkich lub określonych funkcji możemy nadać + grupie. Kiedy zajdzie taka potrzeba wystarczy dopisać użytkownika do + grupy i nie trzeba już edytować pliku. Konfiguracja grupy różni się od + konfiguracji użytkownika tym, że nazwę grupy poprzedza się znakiem + procentu (%): +

+
+%sysadms ALL=(ALL)  ALL
+
+

+ We wpisach konfiguracyjnych znajdują się aż trzy słowa + ALL, każde z nich ma oddzielne + znacznie. Pierwsze słowo ALL po nazwie użytkownika oznacza + nazwę komputera (lub adres IP), ponieważ plik /etc/sudoers + może być współdzielony między innymi komputerami, jednak ten plik + będzię dotyczyć tylko tego systemu dlatego też może pozostać + ALL. Drugie słowo ALL w nawiasie oznacza jako kto + będzie wykonywać te polecenie, ta lista pozwala wybrać + użytkownika (po zastosowaniu opcji -u) do wykonania polecenia. + W nie których systemach możemy spotkać się z zapisem + (ALL:ALL), zapis ALL po dwukropku oznacza listę grup. + Grupę możemy wybrać z pomocą opcji -g. Ostanie ALL + jest listą programów do których użytkownik poprzedzający polecenie + narzędziem sudo będzie mieć dostęp. Poniżej przykładowe użycie + polecenia sudo. +

+
+[user@server1 ~]$ sudo vgs
+[sudo] password for user: 
+  VG   #PV #LV #SN Attr   VSize   VFree
+  rhel   1   2   0 wz--n- <19.00g    0
+
+

+ Podczas uruchamia programu vgs, + sudo, po prosiło o hasło - hasło użytkownika, który wydaje + to polecenie. + Narzędzie sudo możemy skonfigurować w taki sposób aby nie + wymagało hasła podczas uruchamiania programu. We wcześniejszej + dyrektywie, konfigurującej użytkownika przed ostatnim słowem ALL + dopisujemy NOPASSWD:. +

+
+user ALL=(ALL)  NOPASSWD:ALL
+
+

+ Najczęściej naszym zadaniem związanym z poleceniem sudo będzie + przypisanie konkretnym użytkownikom dostępu do określonych poleceń. + Jeśli do skonfigrowania mamy wiele takich elementów za równo poleceń + jak i użytkowników, to aby zrobić to jak najefektywniej należy użyć + aliasów. Sudo swojej konfiguracji wyróżnia aliasy przeznaczone + dla użytkowników jak i dla poleceń. Alias z listą użytkowników tworzymy + tak jak na przykładzie: +

+
+User_Alias  PKGADM = user1, user100, user200
+
+

+ Po słowie User_Alias zapisujemy nazwę + aliasu, w tym przypadku jest PKG_ADM + po znaku równości (=) podajemy listę użytkowników + tak jak na przykładzie powyżej. Ze zbiorem poleceń jest podobnie ale + zmienia się dyrektywa inicjująca alias. +

+
+Cmnd_Alias PKGCMD = /usr/bin/yum, /usr/bin/rpm
+
+

+ Po zdefiniowaniu obu aliasów, możemy przejść do przypisnia aliasowi + PKGADM (określonym użytkownikom) + dostępu do poleceń zapisanych w + PKGCMD. +

+
+PKGADM ALL = PKGCMD
+
+

+ Teraz użytkownicy zdefiniowani w aliasie + PKGADM będą mogli użyć tylko i + wyłącznie poleceń zdefiniowanych w PKGCMD +

+

+ Podczas pracy będziemy zazwyczaj definiować aliasy użytkowników, + ponieważ jeśli rozejrzymy się po pliku /etc/sudoers, definicje + aliasów z pogrupowanymi poleceniami są już zapisane w komentarzach + wystarczy usunąć znak komentarza oraz przypisać ten alias określonej + grupie użytkowników. +

+

+ Użycie polecenia sudo jest rejestrowane. Wpisy zapisywane są + do pliku /var/log/secure ich odczyt wymaga uprawnień + superużytkownika. We wpisach znajduje się nazwa użytkownika, który + wywołał to polecenie jak i samo polecenie. +

+

+ Więcej informacji na temat tego narzędzia znajduje się na stronie + podręcznika samego polecenia jak i pliku /etc/sudoers. Jak + ćwiczenie, nadajmy uprawnienia do pełnych funkcji administracyjnych + zwykłemu użytkownikowi, którego tworzyliśmy podczas instalacji + systemu na maszynie. Od tego momentu na wszystkich przykładach będę + używać tego konta, a uprawnienia administracyjne będę wymuszać za + pomocą polecenia sudo. +

+

6.4. Zmiana praw własności plików i katalogów

+

+ Polecenie chown, omówiliśmy sobie podczas omawiania + uprawnień plików. Polecenie to służy do zmiany właściciela oraz + ewentualnie grupy, do której należy element. +

+
+[user@server1 ~]$ ls -l file1 
+-rw-r--r--. 1 user user 0 Jun 26 15:30 file1
+[user@server1 ~]$ sudo chown user100 file1
+[sudo] password for user: 
+[user@server1 ~]$ ls -l file1
+-rw-r--r--. 1 user100 user 0 Jun 26 15:30 file1
+
+

+ Jednak w systemie istnieje inne polecenie, dzięki któremu możemy + zmienić grupę. Jest nim chgrp. Składania + polecenia identyczna do składni chown. +

+
+[user@server1 ~]$ sudo chgrp user100 file1
+[sudo] password for user: 
+[user@server1 ~]$ ls -l file1 
+-rw-r--r--. 1 user100 user100 0 Jun 26 15:30 file1
+[user@server1 ~]$ 
+
+

+ Jak możemy zauważyć grupa, do której należy plik została zmieniona + w porównaniu do szczegółów z poprzedniego przykładu. +

+

+ Polecenia chown możemy również używać rekurencyjnie, aby + zmieniać prawa własności całych struktur katalogowych wraz z plikami. + Tej czynności służy opcja -R. +

+
+[user@server1 ~]$ sudo chown -R root:root /tmp/etc
+
+

+ Na powyższym przykładzie zmieniłem właściciela oraz grupę do wszystkim + elementom w katalogu /tmp/etc. +

+

Ćwiczenie 1: Utwórz użytkowników oraz skonfiguruj zasady haseł

+

+ Na maszynie server1 utwórz grupę lnxgrp o numerze + GID 6000. Utwórz użytkownika user5000 o numerze + UID 5000 oraz numerze GID 6000. Przypisz mu hasło, a + następnie ustaw minimum 4 dni do następnej zmiany hasła, ważność hasła + na 30 dni oraz okres ostrzegania na 10 dni. Konto tego użytkownika + powinno wygasnąć 20 grudnia 2022 roku. +

+

Ćwiczenie 2: Zablokuj i odblokuj użytkownika

+

+ Na maszynie server1 zablokuj użytkownika user5000 za + pomocą polecenia passwd. Sprawdź jak zmienił się jego wpis w + pliku /etc/shadow. Spróbuj się zalogować na użytkownika. + Odblokuj go za pomocą polecenia + usermod zweryfikuj jego odblokowanie na podstawie wpisu z + pliku powyżej. +

+

Ćwiczenie 3: Zmień dane grupy

+

+ Na maszynie server1 zmień GID grupy lnxgrp + z 6000 na 7000, dodaj do niej użytkowników user1000 oraz + user2000 + (jeśli nie istnieją utwórz ich), na koniec zmień nazwę grupy na + dbagrp i zweryfikuj zmiany. +

+

Ćwiczenie 4: Konfiguracja dostępu do sudo

+

+ Na maszynie server1, skonfiguruj polecenie sudo dla + użytkownika user5000, tak aby miał dostęp do wszystkich + funkcji administracyjnych bez podawania hasła. W celu sprawdzenia + wydaj polecenie sudo vgs. +

+

Ćwiczenie 5: Zmiana praw własności do plików i katalogów

+

+ Na maszynie server1, utwórz w katalogu /tmp plik + f6 oraz katalog d6. Utwórz użytkownika user90. + Za pomocą polecenia chown ustaw właściciela pliku f6 + na user90. Za pomocą polecenia chgrp ustaw grupę na + dbagrp. Utwórz grupę g1, + następnie ustaw rekrencyjnie prawa własności dla katalogu d6, + na user90:g1. +

+

Podsumowanie

+

+ Tym rodziałem zakończyliśmy zarządzanie użytkownikami. Zapoznaliśmy + się z narzędziami do ustalania zasad haseł w praktyce, poznaliśmy + narzędzia do zarządzania grupami oraz efektywne sposoby na bezpieczne + podnoszenie uprawnień za pomocą polecenia sudo. Na koniec + odświerzyliśmy informacje na temat praw własności plików i katalogów. + W następnym rozdziale poznamy podstawy powłoki BASH. +

+

7. Powłoka BASH

+

+ Powłoka jest to program odpowiedzialny za możliwość wprowadzania + poleceń + do systemu i ich interpretowanie. Powłoka jest domyślnym interfejsem + użytkownika w różnych wariantach systemów uniksopodobnych. To właśnie + proces połoki jest uruchamiany po uruchomieniu okna terminala. +

+

+ Na przestrzeni lat wraz z kolenymi odłamami oryginalnego Uniksa + powstawało wiele powłok, każda z nich miała swoje wady i zalety. + Obecnie najpowszechniejszą wersją z nich jest BASH, + jej główną zaletą jest zebranie większości funkcjonalność różnych + powłok, poprawienie ich działa oraz dostosowanie do obecnych czasów. + Ten rodzaj powłoki również domyślnie jest instalowany w wielu + dystrybucjach Linuksa i Red Hat nie jest w tym temacie wyjątkiem. + W tym rodziale chciałbym omówić najważnejsze funkcje tej powłoki oraz + jej skrypty startowe, dzięki którym będziemy mogli dostować ją do + swoich potrzeb. +

+

7.1. Funkcje powłoki BASH

+

+ BASH w swojej kolekcji posiada masę funkcjonalności, których + próżno szukać w innych powłokach. Dla przykładu w nowszych + dystrybucjach, skrypt powłoki zastępują podstawowe narzędzia systemowe, + będące kiedyś pełnoprawnymi programami. +

+

7.1.1. Zmienne

+

+ Korzystając z powłoki możemy używać zmiennych, czyli opisanych miejsc + alokowanych w pamięci do przechowywania dowolnych wartości. Do + dyspozycji mamy dwa rodzaje zmiennych - zmienne lokalne + oraz zmienne środowiskowe. +

+

+ Zmienne lokalne są dostępne tylko w obecnej sesji powłoki. + Tego typu zmienne nie będą widoczne dla + uruchomionych w tej sesji skryptów czy programów, gdyż są + przechowywane tylko i wyłącznie w obszarze pamięci należącym do tego + procesu powłoki. Taka zmienną możemy zdefiniować podając w wierszu + polecenia jej nazwę, następnie znak równości oraz wartość. Warto dodać + aby nie było między tymi elementami żadnej spacji. Poniższy przykład + na pewno to rozświetli. +

+
+[user@server1 ~]$ zmienna=2137
+
+

+ Po wykonaniu takiego polecenia, powłoka utworzy zmienną i nada jej + podaną wartość, po czym zwróci znak zachęty. +

+

+ Do takiej zmiennej możemy odwołać się podczas pisania polecenia + wystarczy poprzedzić nazwę znakiem dolara ($). +

+
+[user@server1 ~]$ echo $zmienna
+2137
+
+

+ Polecenie echo wypisuje wszystko co + do zostanie mu podane jako argument na standardowe wyjście (o tym + będzie w dalszej częsci materiału). Jak widzimy polecenie wypisało + zawartość zmiennej. +

+

+ Innymi zmiennymi są zmienne środowiskowe przechowują one + różnego rodzaju wartość, które mogą wpływać na działanie programów. + Każdy program uruchomiony na Linuksie dostaje od procesu nadrzędnego + obszar + pamięci zmiennych środowiskowych, które może wykorzystywać do sobie + tylko znanych celów. Definicja + takich zmiennych, różni się tym, że poprzedza się ją + poleceniem export, którego zadaniem jest przeniesienie + zmiennej lokalnej do pamięci zmiennych środowiskowych. +

+
+[user@server1 ~]$ export ZMIENNA=2137
+
+

+ Nazwy zmiennych środowiskowych zapisujemy za pomocą wielkich liter aby + odróżnić je od zmiennych lokalnych. Dostęp do takiej zmiennej możemy + uzyskać, kiedy uruchomimy jakiś program w tej powłoce, aby otrzymał + on od powłoki, w której został uruchomiony (procesu nadrzędnego) obszar + zmiennych środowiskowych. Najlepiej by było aby takim programem była + kolejna powłoka (podpowłoka). +

+
+[user@server1 ~]$ bash
+[user@server1 ~]$ echo $ZMIENNA
+2137
+
+

+ Po uruchomieniu podpowłoki wydałem polecenie, które wyświetliło mi + zawartość zmiennej, którą zdefiniowałem jako zmienną środowiskową w + poprzednim przykładzie. +

+

+ Wszystkie zmienne środowiskowe w systemie możemy wypisać za pomocą + polecenia env lub polecenia printenv. + Oto fragment listingu zmiennych środowiskowych z mojego systemu: +

+
+[user@server1 ~]$ env
+...
+TERM=xterm-256color
+LESSOPEN=||/usr/bin/lesspipe.sh %s
+USER=user
+SELINUX_USE_CURRENT_RANGE=
+ZMIENNA=2137
+SHLVL=2
+XDG_SESSION_ID=7
+XDG_RUNTIME_DIR=/run/user/1000
+SSH_CLIENT=192.168.122.1 34956 22
+which_declare=declare -f
+...
+
+

+ Natomiast za pomocą polecenia set możemy wypisać + wszystkie zmienne dostępne w systemie, łącznie z lokalnymi zmiennymi + powłoki. +

+
+[user@server1 ~]$ set
+...
+SHLVL=1
+SSH_TTY=/dev/pts/0
+TERM=xterm-256color
+UID=1000
+USER=user
+XDG_DATA_DIRS=/home/user/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
+XDG_RUNTIME_DIR=/run/user/1000
+XDG_SESSION_CLASS=user
+XDG_SESSION_ID=7
+XDG_SESSION_TYPE=tty
+ZMIENNA=2137
+_=set
+_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
+colors=/home/user/.dircolors
+new_dirs=/home/user/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share
+which_opt=-f
+which_shell=bash
+zmienna=2137
+zmienna1=2137
+...
+
+

+ Zmienne, które nie są już potrzebne możemy usunąć za pomocą polecenia + unset. +

+
+[user@server1 ~]$ set | grep 'zmienna1'
+zmienna1=2137
+[user@server1 ~]$ unset zmienna1
+[user@server1 ~]$ echo $zmienna1
+
+
+

+ Przy odwołaniu się do zmiennej, polecenie echo zwróciło + pusty wiersz. +

+

+ Manipulując zmiennymi w powłoce może zmienić znak zachęty, ponieważ + jego definicja jest przechowywana w zmiennej PS1: +

+
+[user@server1 ~]$ echo $PS1
+[\u@\h \W]\$
+
+

+ Te poprzedzone lewym ukośnikiem \ litery są kolejnymi + elementami znaku zachęty. Opis tych elementów znajduje się na + stronie podręcznika polecenia/powłoki BASH w rozdziale + PROMPTING. +

+

7.1.2. Podstawienie polecenia

+

+ Często wykorzystywaną funkcją wraz z zmiennymi jest + podstawienie polecenia. Polega ono na uruchomieniu, + przez podpowłokę polecenia ujętego albo w okrągły nawias poprzedzony + znakiem dolara ($()) albo w ukośny cudzysłów + (``). Informacja zwracana przez polecenie trafia albo + do zmiennej albo bezpośrednio jako argument polecenia. +

+
+[user@server1 ~]$ export KERNEL_VERSION=$(uname -r)
+[user@server1 ~]$ echo $KERNEL_VERSION 
+5.14.0-70.13.1.el9_0.x86_64
+
+

+ Poniżej znajduje się przykład użycia podstawienia polecenia w innym + poleceniu: +

+
+[user@server1 ~]$ sudo find / -name *`uname -r` -print 2> /dev/null
+/boot/vmlinuz-5.14.0-70.13.1.el9_0.x86_64
+/boot/System.map-5.14.0-70.13.1.el9_0.x86_64
+/boot/config-5.14.0-70.13.1.el9_0.x86_64
+/usr/lib/firmware/5.14.0-70.13.1.el9_0.x86_64
+/usr/lib/modules/5.14.0-70.13.1.el9_0.x86_64
+/usr/share/doc/kernel-keys/5.14.0-70.13.1.el9_0.x86_64
+
+

+ Gwiazdka (*) w tym przypadku oraz + 2>, również są elementami połoki, + które sobie omówimy. +

+

7.1.3. Przekierowanie strumieni

+

+ Na Uniksach mamy doczynienia z trzema rodzajami strumieni danych, + owe strumienie łączą ze sobą np. urządzenia z programami, dlatego + pisząc na klawiaturze możemy wprowadzać tekst do programu, albo + programy + mogą wypisać wynik swojego działnia do okna terminala. Pierszy strumień + to strumień standardowegp wejścia źródłem jego danych jest najczęściej + klawiatura. + Jego identyfikatorem jest 0 (programy używają + identyfikatorów do korzystania ze strumieni, my też będziemy podłaczając + jeden strumień do drugiego). Drugi strumień danych, to strumień + standarowego wyjścia źródłem jego danych jest najczęściej program + (jądro podczas + uruchamiania programu przekazuje mu kopie strumieni), jego + identyfikatorem jest 1, a podłączony jest on do + terminala. Ostatnim strumieniem jest strumień błędów jego źródłem + danych są komunikaty diagnostyczne programów, jest on najczęciej + podłączony razem ze strumieniem wyjścia do terminala. Identyfikatorem + strumienia błędów jest 2. +

+

+ Przekierowania strumienia standardowego wyjścia dokonujemy w wierszu + polecenia poprzez + podanie znaku większości (>) a następnie podajemy + miejse docelowe na dane. Na przykład wynik listowania katalogu + /etc możemy umieścić w pliku. +

+
+[user@server1 ~]$ ls -l /etc > ls.out
+[user@server1 ~]$ head -5 ls.out 
+total 1320
+drwxr-xr-x.  3 root root        28 Jun 26 13:50 accountsservice
+-rw-r--r--.  1 root root        16 Jun 26 14:01 adjtime
+-rw-r--r--.  1 root root      1529 Jun 23  2020 aliases
+drwxr-xr-x.  3 root root        65 Jun 26 13:54 alsa
+
+

+ Użycie pojedynczego znaku większości przekieruje strumień w tym + przypadku do pliku oraz nadpisze informacje zawarte w nim. Jeśli plik + nie istnieje to zostanie on utworzony. +

+

+ Nadpisywanie danych za pomocą przekierowania strumieni nazywane jest + clobberingiem. Możemy zablokować tę funkcję za pomocą + polecenia set -o noclobber, wówczas + gdy plik będzie istnieć pokaże nam się taki komunikat jak na poniższym + przykładzie. +

+
+[user@server1 ~]$ ls -l /etc > ls.out
+-bash: ls.out: cannot overwrite existing file
+
+

+ Funkcję można włączyć z powrotem za pomocą polecenia + set +o noclobber. +

+

+ Chcąc dopisać do zawartości pliku, zawartość strumienia możemy użyć + podwójnego znaku większości (>>). Na przykład: +

+
+[user@server1 ~]$ ls -l /var >> ls.out
+[user@server1 ~]$ cat ls.out
+total 4
+drwxr-xr-x. 2 user4000 g1         6 Jun 26 16:06 d6
+srwxrwxrwx. 1 gdm      gdm        0 Jun 30 13:59 dbus-aIxoyUxXnM
+srwxrwxrwx. 1 gdm      gdm        0 Jun 30 09:38 dbus-JRmt27fCi0
+drwxr-xr-x. 2 user200  dba        6 Jun 26 15:33 dir10
+-rw-r--r--. 1 user4000 dba        0 Jun 26 16:06 f6
+-rw-r--r--. 1 user200  user100    0 Jun 26 15:33 file10
+-rw-r--r--. 1 user     user    2400 Jun 30 14:57 ioerror
+...
+total 16
+drwxr-xr-x.  2 root root   19 Jun 26 13:54 account
+drwxr-xr-x.  2 root root    6 Aug 10  2021 adm
+drwxr-xr-x. 18 root root 4096 Jun 26 14:12 cache
+drwxr-xr-x.  2 root root    6 Mar  7 04:37 crash
+drwxr-xr-x.  3 root root   18 Jun 26 13:50 db
+drwxr-xr-x.  2 root root    6 Aug 10  2021 empty
+...
+
+

+ Z racji tego, iż znak większości służy do przekierowania jedynie + wyjścia + to aby przekierować strumień błedów, należy podać przez znakiem jego + identyfikator. +

+
+[user@server1 ~]$ ls -l /dvd 2> err.out
+[user@server1 ~]$ cat err.out 
+ls: cannot access '/dvd': No such file or directory
+
+

+ Czasami może się zdarzyć, iż będzie potrzeba przekierowania obu tych + strumieni, wówczas trzeba skorzystać z podłączenia jednego strumienia + do drugiego. +

+
+[user@server1 ~]$ ls -l /tmp /sdir > ls2.out 2>&1
+[user@server1 ~]$ cat ls2.out 
+ls: cannot access '/sdir': No such file or directory
+/tmp:
+total 4
+drwxr-xr-x. 2 user4000 g1         6 Jun 26 16:06 d6
+srwxrwxrwx. 1 gdm      gdm        0 Jun 30 13:59 dbus-aIxoyUxXnM
+srwxrwxrwx. 1 gdm      gdm        0 Jun 30 09:38 dbus-JRmt27fCi0
+drwxr-xr-x. 2 user200  dba        6 Jun 26 15:33 dir10
+-rw-r--r--. 1 user4000 dba        0 Jun 26 16:06 f6
+-rw-r--r--. 1 user200  user100    0 Jun 26 15:33 file10
+-rw-r--r--. 1 user     user    2400 Jun 30 14:57 ioerror
+...
+
+

+ To polecenie można zapisać również w inny sposób. Na przykład: + ls -l /tmp /sdir &> ls2.out. + Obie formy są poprawne i obie robią to samo, która będzie dla nas + lepsza musimy zdecydować sami. +

+

+ Odnośnie egzaminu:
+ Jednym z zadań egzaminacyjnych może być wykonanie polecenia z + przekierowaniem wyjścia lub/i strumienia błędów do pliku. +

+

+ Kolejnym rodzajem przekierowania jest przekierowanie wejścia, jednak + jest ono dość rzadko stosowane. Do tego rodzaju przekierowania + stosuje się znak mniejszości (<). Jednym z + przykładów jest polecenie użycie polecenia tar, jednak nie ma + ono sensu, ponieważ istnieje opcja -f, która pozwala na + podanie ścieżki do pliku. +

+
+[user@server1 ~]$ tar -x -C /tmp < etc.tar 
+[user@server1 ~]$ ls -l /tmp
+total 16
+drwxr-xr-x.   2 user4000 g1         6 Jun 26 16:06 d6
+srwxrwxrwx.   1 gdm      gdm        0 Jun 30 13:59 dbus-aIxoyUxXnM
+srwxrwxrwx.   1 gdm      gdm        0 Jun 30 09:38 dbus-JRmt27fCi0
+drwxr-xr-x.   2 user200  dba        6 Jun 26 15:33 dir10
+drwxr-xr-x. 132 user     user    8192 Jun 30 09:38 etc
+...
+
+

+ Ostatni rodzaj przekierowania, to potok, o potoku + jeszcze będzie w tym rozdziale. +

+

7.1.4. Historia poleceń

+

+ Dość istotną funkcją powłoki BASH jest historia poleceń. + Pozwala ona zaoszczędzić pisania w szczególności długich poleceń czy + poleceń potokowych (ang. pipelines). Posiada ona funkcję + wyszukiwania oraz swobodny dostęp do poleceń umieszczonych w historii. +

+

+ Aby wyświetlić polecenia z historii, należy użyć polecenia + history, wyświetli ono listę poleceń z numerami na + początku, każde polecenie to jedna linia. Numer porządkowy pomoże nam + się odwołać do polecenia podczas jego wywoływania, ponieważ nie + potrzeba szukać polecenia czy przebierać ich wszystkich za pomocą + niżej opisanych klawiszy. Wystarczy znać jego numer. Poniżej znajduje + się fragment listy historii poleceń z mojego systemu: +

+
+[user@server1 ~]$ history
+    1  id
+    2  groups 
+    3  su
+    4  su -
+    5  cat /etc/sudoers
+    6  su - root
+    7  sudo cat /etc/sudoers
+    8  su - root
+    9  sudo cat /etc/sudoers
+   10  su - root
+   11  sudo yum update
+   12  su - root
+   13  touch file1
+...
+
+

+ Wyświetlenie listy poleceń w historii możemy ograniczyć podajac w + jako argument ilość wyświetlanych linii. Polecenie wyświetli wówczas + polecenia od końca listy (ostatnio dodane). +

+
+[user@server1 ~]$ history 10
+  266  rm etc.tar 
+  267  sudo tar -cvf etc.tar /etc
+  268  tar -x -C /tmp < etc.tar 
+  269  ls -al /tmp
+  270  ls -l /tmp
+  271  history
+  272  touch file1
+  273  sudo poweroff
+  274  touch file1
+  275  history 10
+
+

+ Za pomocą opcji -d możemy usunać wybrane polecenie z historii. +

+
+[user@server1 ~]$ history 10
+  266  rm etc.tar 
+  267  sudo tar -cvf etc.tar /etc
+  268  tar -x -C /tmp < etc.tar 
+  269  ls -al /tmp
+  270  ls -l /tmp
+  271  history
+  272  touch file1
+  273  sudo poweroff
+  274  touch file1
+  275  history 10
+[user@server1 ~]$ history -d 271
+[user@server1 ~]$ history 10
+  267  sudo tar -cvf etc.tar /etc
+  268  tar -x -C /tmp < etc.tar 
+  269  ls -al /tmp
+  270  ls -l /tmp
+  271  touch file1
+  272  sudo poweroff
+  273  touch file1
+  274  history 10
+  275  history -d 271
+  276  history 10
+
+

+ Na informacji zwracanej przez wcześniejsze wywołanie polecenia + history 10 w linii + 271 widnieje polecenie + history, natomiast na drugim wywołaniu + po usunięciu tego polecenia pod tym numerem widnieje już inne. +

+

+ Wśród poleceń w historii możemy poruszać się za pomocą strzełek w górę + oraz w dół lub kombinacji klawiszy (co jest bardziej zalecene) + Ctrl+p (poprzednie polecenie) oraz Ctrl+n (następne + polecenie). Możemy je również wyszukiwać po + przez wciśnięcie kombinacji klawiszy Ctrl+r i podanie + fragmentu polecenia. Czasmi wyszukiwanie może nie przynieść skutku, + wówczas należy nacisnać Ctrl+c i spróbować ponownie. +

+

+ Do poleceń w historii odnosimy się wprowadzając w wierszu polecenia + wykrzyknik (!) następnie możemy podać numer z listy. + Dla przykładu użyje polecenia numer 13 + z fragmentu listy z pierwszego przykładu. +

+
+[user@server1 ~]$ !13
+touch file1
+touch: cannot touch 'file1': Permission denied
+
+

+ Możemy również podać litery rozpoczynające polecenie na przykład: +

+
+[user@server1 ~]$ !tou
+touch file1
+touch: cannot touch 'file1': Permission denied
+
+

+ Ta instrukcja podstawi najczęstsze wystąpienie polecenia + rozpoczynającego się o tych liter. Podobną metodą jest podanie fragmentu + polecenia zawierającego jakiś ciąg znaków, na przykład: +

+
+[user@server1 ~]$ !?file?
+touch file1
+touch: cannot touch 'file1': Permission denied
+
+

+ To polecenie podstawi najczęściej występujące polecenie z historii + zawierające ciąg znaków file. +

+

+ Za pomocą polecenia wykrzyknika możemy odwołać się do ostatniego + polecenia podając drugi wykrzyknik. Tą metodę możemy zastosować + w przypadku gdy zapomnimy o sudo przy wydawaniu poleceń + administracyjnych. +

+
+[user@server1 ~]$ cat /var/log/secure
+cat: /var/log/secure: Permission denied
+[user@server1 ~]$ sudo !!
+sudo cat /var/log/secure
+[sudo] password for user: 
+Jun 26 14:12:08 server1 polkitd[725]: Loading rules from directory /etc/polkit-1/rules.d
+Jun 26 14:12:08 server1 polkitd[725]: Loading rules from directory /usr/share/polkit-1/rules.d
+Jun 26 14:12:08 server1 polkitd[725]: Finished loading, compiling and executing 12 rules
+Jun 26 14:12:08 server1 polkitd[725]: Acquired the name org.freedesktop.PolicyKit1 on the system bus
+...
+
+

+ Historię możemy wyłączyć używając polecenia + set -o history. Włączenie historii + wymaga polecenia set +o history. + Historia kontrolowana jest za pomocą trzech zmiennych + HISTSIZE, której wartość jest równoznaczna z ze zmienną + HISTFILESIZE oraz HISTCONTROL. Ich opisy znajdują + się na stronie podręcznika polecenia bash. Natomiast ścieżka + do pliku zawierającego historie z poprzednich sesji znajduje się w + zmiennej HISTFILE. +

+

7.1.5. Edycja wiersza polecenia

+

+ Za pomocą strzałek w lewo oraz w prawo, możemy przesuwać kursor w + wierszu polecenia, jednak istnieją znacznie bardziej efektywne + sposoby na edycje wpisanego polecenia. +

+
    +
  • Ctrl+a - przenosi kursor na początek wiersza.
  • +
  • Ctrl+e - przenosi kursor na koniec wiersza.
  • +
  • Ctrl+f - przenosi kursor o jeden znak w prawo.
  • +
  • Ctrl+b - przenosi kursor o jeden znak w lewo.
  • +
  • Alt+f - przenosi kursor o jedno słowo w prawo.
  • +
  • Alt+b - przenosi kursor o jedno słowo w lewo.
  • +
  • Ctrl+u - usuwa wszystko z linii polecenia.
  • +
+

+ Te skróty pozwalają na sprawniejsze poruszenie się w wierszu + polecenia. +

+

7.1.6. Uzupełnianie poleceń

+

+ Chcąc przyspieszyć pisanie poleceń możemy wykorzystać uzupełnianie + poleceń. W wierszu polecenia zapisujemy fragment polecenia lub ścieżki + następnie naciskamy klawisz Tab. Powłoka uzupełni + nasz zapis do wspólnej części z na przykład nazwami plików, katalogów + czy poleceń. Po następnym naciśnięciu tego klawisza, powłoka zwróci + możliwe warianty pasujące do tego co zapisaliśmy. +

+
+[user@server1 ~]$ deb
+
+#Pierwsze naciśnięcie klawisza Tab
+[user@server1 ~]$ debug
+
+#Drugie naciśnięcie klawisza Tab
+[user@server1 ~]$ debug
+debugfs          debuginfod-find  
+[user@server1 ~]$ debug
+
+

+ Kiedy dopiszemy kilka liter z jednego z wariantów, polecenie dopełni + je pozostałymi lub zwróci zawężoną ilość możliwych do wyboru elementów. +

+

7.1.7. Podstawienie tyldy

+

+ Tylda w powłoce oznacza jedno - katalog domowy użytkownika. Za jej + pomocą możemy w prosty sposób odwoływać się do elementów w katalogu + domowym użytkownika ale i nie tylko. Poniżej przedstawiłem trzy + zastosowania podstawienia tyldy. +

+
    +
  • ~/Dokumenty - odwołanie się do elementu + znajdującego się w katalogu domowym użytkownika.
  • +
  • ~+ - odwołanie się do obecnego katalogu roboczego + (wyświetla ścieżkę bezwzględną obecnego katalogu roboczego), + równoznaczne z podstawiemiem polecenia pwd.
  • +
  • ~- - odwołanie się do poprzedniego katalogu + roboczego, podstawienie również zwraca ścieżkę bezwzględną do + katalogu, + w którym się znajdowaliśmy przed przejściem do obecnego.
  • +
+

+ Podstawienie tyldy może zaoszczędzić nam czas oraz zmieniejszyć ilość + pisania. Poniżej znajduje się kilka przykładów prezentujących powyższe + podstawienia. +

+
+[user@server1 logs]$ echo ~+
+/home/user/logs
+[user@server1 logs]$ echo ~
+/home/user
+[user@server1 logs]$ cd /etc
+[user@server1 etc]$ echo ~-
+/home/user/logs
+
+

7.1.8. Aliasy

+

+ Alias to nazwa zastępcza, dzięki której możemy zastąpić długie + polecenia za pomocą pojedynczego wyrazu. Aliasy definiowane są + pomocą polecenia alias, jako argument przyjmuje on + definicję aliasów, czyli nazwę zastępnczą, znak równości oraz + polecenie w podwójnych apostrofach. Między tym elementami nie + powinno być spacji. Poniżej znajduje się definicja aliasów, który + szuka w katalogu domowym plików powyżej 1 GB a następnie zwraca ich + atrybutu. +

+
+alias bigfiles="find ~ -size +1G -exec ls -lh {} \;"
+[user@server1 ~]$ bigfiles 
+-rw-r--r--. 1 user user 1.5G Jul  1 12:55 /home/user/test.img
+
+

+ Ważną rzeczą związna z aliasami jest fakt iż kiedy powłoka otrzymuje + polecenie do interpretacji to sprawdza na początku czy nie jest ono + aliasem i jeśli tak jest to wykonuje to co znajduje się pod nim. Aliasy + mogą mieć takie same nazwy jak programy czy inne polecenia w systemie, + dlatego też mogą je przesłaniać. Tak jest w przypadku superużytkownika + z poleceniami cp, mv czy rm. Poniższy + przykład dobrze to obrazuje. +

+
+[user@server1 ~]$ alias rm="rm -i"
+[user@server1 ~]$ rm test.img
+rm: remove regular file 'test.img'? n
+
+

+ Aby powłoka nie brała nazwy polecenia przy poszukiwaniu aliasów, należy + poprzedzić ją znakiem lewego ukośnika czy backslashu + (\). +

+
+[user@server1 ~]$ rm logs
+rm: remove symbolic link 'logs'? n
+[user@server1 ~]$ \rm logs
+
+

+ Usuwaniu aliasów służy polecenie unalias. +

+
+[user@server1 ~]$ unalias bigfiles
+[user@server1 ~]$ bigfiles
+bash: bigfiles: command not found...
+
+

7.1.9. Metaznaki oraz nazwy wieloznaczne

+

+ Chcąc odwołać się do wielu elementów posiadających wspólne fragmenty + nazw możemy użyć tzw. metaznaków lub + nazw wieloznacznych, służą one podstawianiu znaków pod używane + wraz z nim nazwy. Załóżmy że mamy dwa rodzaje archiwów w katalogu jedne + rozpoczynają się od nazwy backup a drugie od nazwy d + kazde archiwum zawiera w nazwie po podanej części myślnik oraz datę. + Chcemy wyświetlić atrybuty archiwów z nazwą zaczynającą się od d + w tym celu możemy użyć nazwy wieloznacznej. Podstawiając za nazwą + gwiazdkę. +

+
+[js@fujitsu windows]$ ls -l D*
+-rwxr--r-- 1 windows windows 11718211581 05-01 21:09 D-2022-05-01.7z
+-rwxr--r-- 1 windows windows 11718211581 05-02 21:08 D-2022-05-02.7z
+-rwxr--r-- 1 windows windows 11718211581 05-03 21:08 D-2022-05-03.7z
+-rwxr--r-- 1 windows windows 11718269229 05-04 21:15 D-2022-05-04.7z
+-rwxr--r-- 1 windows windows 11718658739 05-05 21:14 D-2022-05-05.7z
+-rwxr--r-- 1 windows windows 11718634289 05-06 21:14 D-2022-05-06.7z
+-rwxr--r-- 1 windows windows 11718634289 05-07 21:08 D-2022-05-07.7z
+-rwxr--r-- 1 windows windows 11718634289 05-08 21:08 D-2022-05-08.7z
+-rwxr--r-- 1 windows windows 11718633900 05-09 21:15 D-2022-05-09.7z
+...
+
+

+ Do stosowania nazw wieloznacznych, możemy stosować wiele znaków ich + opis znajduje się na liście poniżej. +

+
    +
  • * - gwiazdka, ten symbol podstawia dowolną ilość + dowolnych znaków. Mogą one w ogóle nie występować. +
    +[user@server1 ~]$ ls -l D*
    +-rw-r--r--. 1 user user 0 Jul  1 13:39 D
    +
    +
  • +
  • ? - znak zapytania, pojedynczy dowolny znak. +
    +[user@server1 ~]$ ls -l ??.*
    +-rw-r--r--. 1 user user 2732 Jun 30 19:14 ls.out
    +
    +
  • +
  • [] - nawias kwadratowy, zakresy lub lista znaków. + Lista znaków: +
    +[user@server1 ~]$ ls -l /dev/*[ty]
    +crw-------. 1 root root 10, 126 Jul  1 11:00 /dev/cpu_dma_latency
    +crw-------. 1 root root 10, 228 Jul  1 11:00 /dev/hpet
    +crw-r-----. 1 root kmem  1,   4 Jul  1 11:00 /dev/port
    +crw-------. 1 root root 10, 231 Jul  1 11:00 /dev/snapshot
    +lrwxrwxrwx. 1 root root      15 Jul  1 11:00 /dev/stdout -> /proc/self/fd/1
    +crw-rw-rw-. 1 root tty   5,   0 Jul  1 13:03 /dev/tty
    +
    + Zakres: +
    +[user@server1 ~]$ sudo ls -ld /etc/systemd/system/[m-o]*
    +drwxr-xr-x. 2 root root 4096 Jun 26 13:54 /etc/systemd/system/multi-user.target.wants
    +drwxr-xr-x. 2 root root   48 Jun 26 13:50 /etc/systemd/system/network-online.target.wants
    +
    + Zakresy oraz listy znaków mogą zostać zanegowane za pomocą + wykrzyknika. +
    +[user@server1 ~]$ sudo ls -ld /etc/systemd/system/[!m-o]*
    +[sudo] password for user: 
    +drwxr-xr-x. 2 root root   65 Jun 26 13:54  /etc/systemd/system/basic.target.wants
    +drwxr-xr-x. 2 root root   31 Jun 26 13:50  /etc/systemd/system/bluetooth.target.wants
    +...
    +
    + Powyższe przypasowane elementy nie zawierają liter od m-o na początku + swoich nazw. +
  • +
+

+ Stosując nazwy wieloznaczne możemy automatycznie wykonywać te same + polecenia na elementach posiadających wspólne nazwy. +

+

7.1.10. Potoki i polecenia potokowe

+

+ Omawiając przkierowania strumieni wspomniałem o potokach. Potok to + przekierowanie wyjścia jednego polecenia na wyjście drugiego za pomocą + znaku pionowej kreski (|). +

+
+[user@server1 ~]$ ls -l /etc | head
+total 1320
+drwxr-xr-x.  3 root root        28 Jun 26 13:50 accountsservice
+-rw-r--r--.  1 root root        16 Jun 26 14:01 adjtime
+-rw-r--r--.  1 root root      1529 Jun 23  2020 aliases
+drwxr-xr-x.  3 root root        65 Jun 26 13:54 alsa
+drwxr-xr-x.  2 root root      4096 Jun 26 13:58 alternatives
+-rw-r--r--.  1 root root       541 Aug  9  2021 anacrontab
+-rw-r--r--.  1 root root       769 Aug 28  2021 appstream.conf
+-rw-r--r--.  1 root root        55 Feb 11 10:53 asound.conf
+-rw-r--r--.  1 root root         1 Aug  9  2021 at.deny
+
+

+ Za pomocą potoków możemy łączyć polecenia w długie łańcuchy + przekazując strumień wyjściowy wychodzący z innych poleceń na wejście + kolejnych. Polecenia tego typu nazwyane są + poleceniami potokowymi. Poniżej znajduej się jedno + z nich. +

+
+[user@server1 ~]$ ls -l /etc | sed -n '15p' | awk '{printf $1}'
+
+

+ Powyższe polecenie wyświetli pierwszą kolumnę atrybutów pliku z + 15 lini zawartości katalogu /etc. Polecenia + sed oraz + awk znajdują się poza zakresem + merytorycznym tego materiału. +

+

7.1.11. Cytowanie

+

+ Za tą enigmatyczną nazwą stoją mechanizmy, których możemy użyć, aby + znaki specjalne w powłoce, by traktowane jako zwykłe znaki bez + żadnego specjalnego znaczenia. Pierwszym z nich jest użycie + lewego ukośnika (\). Jeśli na przykład stworzyślimy + plik on nazwie *. To jeśli spróbujemy go usunąć bez żadnego + cytowania usuniemy wszystko co znajduje się w katalogu. +

+
+[user@server1 ~]$ rm \*
+rm: remove regular empty file '*'? y
+[user@server1 ~]$ ls
+D  err.out  etc.tar  file1  ls2.out  ls.out  test.img
+
+

+ Jak widać na załączonym przykładzie moim plikom nic się nie stało. + Używanie lewego ukośnika może być uciążliwe jeśli do zacytowania mamy + więcej niż jeden znak. Wówczas możemy się posłużyć pojedynczym + apostrofem (''). Wszystko co zostanie umieszczone + miedzy nimi, będzie traktowane dosłownie. Najprostszym przykładem + użycia jest odwołanie się do zmiennej. +

+
+[user@server1 ~]$ zmienna='abc'
+[user@server1 ~]$ echo $zmienna
+abc
+[user@server1 ~]$ echo '$zmienna'
+$zmienna
+
+

+ Gdy odwołaliśmy się do zmiennej w pojedynczych cudzysłowach, znak + dolara został potraktowany dosłownie, więc polecenie + echo wypisało ciąg znaków + $zmienna. Ostatnim rodzajem cytowania + podobnym do pojedynczego apostrofu jest podwójny apostrof. Zauważalną + różnicą jest to, iż podwójny apostrof pozwala na użycie specjalnego + znaczenia takich znaków jak: lewy ukośnik (\), + znak dolara ($) oraz pojedynczy apostrof + (''), dzięki czemu wewnątrz literałów prezentowanych + za pomocą podwójnych apostrofów możemy uzyskać wartości zmiennych. +

+
+[user@server1 ~]$ echo "Pierwszym literami alfabetu są litery $zmienna"
+Pierwszym literami alfabetu są litery abc
+
+

7.1.12. Wyrażenia regularne

+

+ Wyrażenia regularne służą wyszukiwaniu wzorców w tekście. Wzorce + składają się z ze znaków specjalnych oraz innych zwykłych znaków + mających przybliżyć odnalezienie wzorca. Wyrażenia regularne w powłoce + możemy obsługiwać za pomocą polecenia grep. W tym + materiale również używaliśmy wyrażeń regularnych przy wyświetlaniu + zawartości pliku /etc/login.defs +

+
+[user@server1 ~]$ grep -v -e '^#' -e '^$' /etc/login.defs 
+MAIL_DIR	/var/spool/mail
+UMASK		022
+HOME_MODE	0700
+PASS_MAX_DAYS	99999
+PASS_MIN_DAYS	0
+PASS_WARN_AGE	7
+...
+
+

+ Na powyższym przykładzie widzimy składnie polecenia, źródłem danych + nie musi być wyłącznie plik, równie dobrze mogą one pochodzić z + przekierowania. Na przykład z potoku. + Najpierw jednak zajmiemy się czymś prostszym, a do tego poziomu + dojdziemy pod koniec. Najprostszym wyrażeniem może być zwykły + ciąg znaków. +

+
+[user@server1 ~]$ grep 'pass' /etc/login.defs
+# passwd command) should therefore be configured elsewhere. Refer to
+#	PASS_MAX_DAYS	Maximum number of days a password may be used.
+#	PASS_MIN_DAYS	Minimum number of days allowed between password changes.
+#	PASS_MIN_LEN	Minimum acceptable password length.
+#	PASS_WARN_AGE	Number of days warning given before a password expires.
+
+

+ Jak możemy zauważyć polecenie zwróciło wszystkie linie zawierające + wyrażenie jakie podaliśmy przed ścieżką do pliku. Podane wyrażenie + zapisaliśmy za pomocą małych liter i takie też zostało przypasowane + jeśli chcemy, aby nie była rozrózniana wielkość liter należy użyć + opcji -i. +

+
+[user@server1 ~]$ grep -i 'pass' /etc/login.defs
+# passwd command) should therefore be configured elsewhere. Refer to
+# Password aging controls:
+#	PASS_MAX_DAYS	Maximum number of days a password may be used.
+#	PASS_MIN_DAYS	Minimum number of days allowed between password changes.
+#	PASS_MIN_LEN	Minimum acceptable password length.
+#	PASS_WARN_AGE	Number of days warning given before a password expires.
+PASS_MAX_DAYS	99999
+PASS_MIN_DAYS	0
+PASS_WARN_AGE	7
+
+

+ Poniżej umieściłem listę znaków wykorzystywanych do tworzenie wyrażeń + regularnych wraz z opisem. +

+
    +
  • . - pojedynczy dowolny znak,
  • +
  • * - przypasowanie wzorca min. 0 razy lub więcej + razy.
  • +
  • + - przypasowanie wzorca min. 1 raz lub więcej + razy.
  • +
  • ^ - metaznak oznaczający początek wiersza. + Wzorzec rozpoczynający się od tego znaku znajduje się na początku + wiersza.
  • +
  • $ - metaznak oznaczający koniec wiersza. Wzorzec + zakończony tym znakiem znajduje się na końcu wiersza.
  • +
  • [] - metaznak ozanaczający zbiory oraz zakresu. + Zakresy mogą być różne: litery [a-z], wielkie litery + [A-Z] czy cyfry [0-9]. Zakresy nie muszą być pełne, + mogą być np. od a do o - [a-o]. +
  • [^...] - negacja zbioru, zamiast trzech kropek + wstawiamy znaki. Przypasowanie następuje wówczas, kiedy we wzorcu + nie znajdują się podane znaki.
  • +
+

+ Wiecęj znaków oraz informacji znajduje się na stronie podręcznika + polecenia grep man grep oraz + na stronie podręcznika poświęconej wyrażeniom regularnym: + man 7 regex. Teraz przedstawie kilka + dodatkowych opcji polecenia grep. +

+
    +
  • -E - opcja umożliwia użycie rozszerzonych + wyrażeń regularnych, jedną z ciekawych opcji tego trybu jest użycie + alternatyw, czyli dodatkowych wzorców. Kiedy + nie będzie przypasowań do pierwszego wzorca grep sprawdzi + pozostałe. Alternatywy zapisuje się po znaku potoku, po + kresce pionowej |. +
    +[user@server1 ~]$ cat colors 
    +blue
    +yellow
    +green
    +orange
    +white
    +black
    +[user@server1 ~]$ grep -E 'red|white' colors 
    +white
    +
    +
  • +
  • -v - odwraca przypasowanie wzorca, polecenie + wówczas wypisze wszystkie linie nie pasujące do wzorca.
  • +
  • -o - zamiast całych wierszy, polecenie zwróci + tylko pasujący do wzorca fragment danych.
  • +
+

+ Wiecej opcji znajduje się na stronie podręcznika polecenia + grep. Myślę, że teraz bez problemu jesteśmy w stanie + zrozumieć przykład z początku tego podrozdziału. +

+

+ Odnośnie egzaminu:
+ Polecenie grep jest poręcznym narzędziem stosowany do + wyłuskiwania informacji z pliku lub wyjścia polecenia. Wybrane + informacje mogą zostać przekierowane do pliku, pozostawiając dane + wejściowe nienaruszone. +

+

7.1.13. Zarządzanie zadaniami

+

+ Uruchamiając jakiś program w terminalu, możemy go odłączyć od niego i + przekazać jego wykonanie do tła. Wówczas taki program staje się + zadaniem. Program kontynuje swoje wykonanie w tle, + ale jest kontrolowany przez terminal, w którym został uruchomiony. + W podpowłoce uruchomiłem plik test, który jest mały skryptem, + który tak naprawdę nic nie robi. +

+
+[user@server1 ~]$ bash test
+
+
+

+ Użyłem kombinacji klawiszy Ctrl+z, aby zatrzymać + wykonanie. +

+
+[user@server1 ~]$ bash test
+^Z
+[1]+  Stopped                 bash test
+
+

+ W ostatniej linii, na początku w nawiasie kwadratowym znajduje się + numer zadania. Za pomocą tego numeru możemy odwoływać się do zadania. + Teraz uruchomimy je w tle. +

+
+[user@server1 ~]$ bg %1
+[1]+ bash test &
+
+

+ Do uruchomienia zadania w tle służy polecenie bg, + Do odwołania się do niego służą numery zadań poprzedzone + znakiem procentu (%). Możemy przywrócić działanie + zadania na pierwszy plan przywołując je za pomocą polecenia + fg, metoda odwołania się do zadania jest taka sama + jak w przypadku polecenia bg. Zanim przełaczym zadanie na + pierwszy plan, sprawdźmy jego status za pomocą polecenia + jobs. +

+
+[user@server1 ~]$ jobs
+[1]+  Running                 bash test &
+
+

+ Teraz możemy przełączyć polecenie, aby finalnie je zamknąć za pomocą + klawiszy Ctrl + c. +

+
+[user@server1 ~]$ fg %1
+bash test
+^C
+
+

+ W ten sposób zarządza się zadaniami za pomocą mechanizmów powłoki. + Zadań przekazanych do tła systemu, może być wiele. Zadania nie zostaną + zakończone w momencie wylogowania się z systemu. Dlatego jeśli + wykonanie jakiego zadania, będzie wymagać czasu mozemy przenieść je + do tła. Przy planach użycia tła systemu warto wziąć po uwagę to, aby + przekierować wyjście programów/poleceń do jakiegoś pliku lub + do urządzenia /dev/null, które ma jedno zadanie. Ignorować + wszelkie napływające do niego dane. +

+

+ Chcąc uruchomić jakieś zadanie w tle odrazu, możemy pominąć tą całą + zabawę w jego zatrzymywanie i przekazywanie do tła. Możemy uruchomić je + od razu kończąc polecenie znakiem ampersendu (&). +

+
+[user@server1 ~]$ bash test &
+[1] 14048
+[user@server1 ~]$ jobs
+[1]+  Running                 bash test &
+
+

7.2. Pliki startowe powłoki

+

+ Plik startowe powłoki mają za zadanie wykonać kilka czynności + konfiguracjynych, + aby użytkownik po jej uruchomieniu nie musiał tracić czasu + na ustawienie na przykład ścieżki wszukiwania poleceń, czyli zmiennej + PATH. Pliki te definiują również aliasy, które jak do tej + pory mogły się wydawać zwykłymi poleceniami. Pliki startowe powłoki + możemy podzielić na pliki globalne (mające zastosowanie dla całego + systemu) oraz pliki lokalne (mające zastosowanie tylko dla jednego + użytkownika). +

+

7.2.1. Globalne pliki startowe powłoki

+

+ Do globalnych plików startowych możemy zaliczyć takie pliki jak + /etc/bashrc, /etc/profile oraz katalog + /etc/profile.d. Zmiany w tych plikach wpływają na konfigurację + powłoki wszystkich użytkowników w systemie. Poniżej znajduje się lista + ze skróconym opisem co dane pliki zawierają. +

+
    +
  • /etc/bashrc - plik zawiera ustawienia właściwości + PROMPT_COMMAND, ustawienia historii, definicje znaku zachęty, + maski użytkownika oraz definicje zmiennej środowiskowej SHELL. +
  • +
  • /etc/profile - plik zawiera definicje części + zmiennych środowiskowych, dopisuje pewne katalogi do zmiennej + PATH.
  • +
  • /etc/profile.d - katalog zawiera skrypt + rozszerzające konfiguracje zawarte w powyższych plikach, te skrypt + są uruchamiane przez oba z nich.
  • +
+

+ Jeśli musimy umieścić dodatkowe konfiguracje w tych plikach najlepiej + umieścić je w skrypcie w katalogu /etc/profile.d. +

+

7.2.2. Pliki startowe powłoki użytkownika

+

+ Każdy użytkownik posiada swoje pliki startowe powłoki + ~/.bash_profile - odpowiadający globalnemu + /etc/profile oraz ~/.bashrc - odpowiadający + globalnemu /etc/bashrc. Te pliki kopiowane są z katalogu + szkieletowego - /etc/skel podczas tworzenia katalogu domowego + przy zakładaniu nowego użytkownika. Jeśli zajrzymy do zawartości tych + katalogów, to dowiemy się że: +

+
    +
  • W pliku ~/.bash_profile umieszczamy dodatkowe + zmienne środowiskowe oraz dodatkowe programy lub skrypty startowe. +
  • +
  • W pliku ~/.bashrc umieszczamy dodatkowe aliasy + oraz funkcje powłoki (funkcje powłoki wykraczają poza ten materiał). +
  • +
+

+ Pliki startowe powłoki są uruchamione określonej kolejności. W ramach + eksperymentu umieściłem, krótką informacje na końcu każdego z nich + a następnie wylogowałem się i zalogowałem ponownie. W poniższym bloku + kodu, znajduje się wynik tego eksperymentu: +

+
+xf0r3m@inspiron-3542:~$ ssh user@rhel9-vm1 
+user@rhel9-vm1's password: 
+Register this system with Red Hat Insights: insights-client --register
+Create an account or view all your systems at https://red.ht/insights-dashboard
+Last login: Sat Jul  2 15:29:33 2022 from 192.168.122.1
+Globalny /etc/bashrc
+Globalny /etc/profile
+Lokalny ~/.bashrc
+Lokalny ~/.bash_profile
+
+

+ Jak mogliśmy się domyślić na początku uruchiamiane są pliki globalne + a następnie lokalne. +

+

+ Dodatkowym plikiem użytkownika o nieco innym znaczeniu jest + ~/.bash_logout. Czynności zapisane w tym pliku są + wykonywane podczas wylogowywania użytkownika. +

+

+ Odnośnie egzaminu:
+ Jeśli jedno z zadań będzie dotyczyć dodania aliasu lub zmiennej + środowiskowej, to należy wiedzieć w jakich plikach je umieścić. +

+

Ćwiczenie 1: Zmiana symbolu zachęty

+

+ Jako zwykły użytkownik na maszynie server1 dostosuj znak + zachęty aby wyglądał jak ten ujęty w podwójne apostrofy + "<user@server1 in /etc >:". /etc w tym przypadku jest + ścieżką do obecnego katalogu roboczego. Zapisz nową definicję znaku + zachęty do odpowiedniego pliku, wyloguje się i zaloguj ponownie + następnie usuń tę definicję. +

+

Ćwiczenie 2: Przkierowanie strumieni

+

+ Jako zwykły użytkownik na maszynie server1 wyświetl zawartość + katalogów /etc, /dvd oraz /var przekieruj + standardowe wyjście oraz strumień błędów do pliku /tmp/ioerror + Sprawdź zawartość pliku. +

+

Podsumowanie

+

+ W tym rodziale zapoznaliśmy się z powłoką BASH. Nauczyliśmy się + korzystać z jej mechanizów, poznaliśmy również podstawy wyrażeń + regularnych. Na koniec dowiedzieliśmy się jak używać plików startowych + powłoki, aby dostosować ją do własnych potrzeb. W następnym rodziale + zajmiemy się procesami. +

+

8. Zarządzanie procesami oraz harmonogram zadań

+

+ Zarządzanie procesami oraz obsługa harmonogramu zadań jest kolejnym z + zadań, które będziemy wykonywać jako administrator systemu Linuks. +

+

8.1. Zarządzanie procesami

+

+ Procesy są to odniesienia w pamięci do uruchomionych + w systemie programów. Procesy są + sposobem organizacji przydzielania zasobów komputera. Struktura + procesów w systemie ma charakter hierarchiczny, każdy proces może mieć + swoje podprocesy, tzw. procesy potomne. Każdy z procesów posiada swój + unikalny identyfikator PID, identyfikator służy + jądru do komunikacji z procesami. W systemie istnieje masa procesów, + wśród nich możemy wyróżnić takie jak demony, które + świadczą usługi użytkownikom oraz innym procesom. Zwykle działają one + w tle, oraz pozostają w stanie bezczynności oczekując na żądania od + użytkownika lub od innego procesu. +

+

+ Procesy podczas wykonywania swoich czynności mogą znajdować się w 5 + różnych stanach. Stan procesu zależy od tego co robi w danym + momencie. Procesy mogą przyjmować następujące stany: +

+
    +
  • Running - (pol. uruchomiony), proces jest + obecnie wykonywany przez CPU.
  • +
  • Sleeping - (pol. spanie), proces oczekuje + na dane.
  • +
  • Waiting - (pol. czekanie), proces czeka + na swoją kolej do wykonania przez procesor.
  • +
  • Stopped - (pol. zatrzymany), proces + otrzymał sygnał zatrzymania wykonania i nie wznowii go do momentu + otrzymiania odpowiedniego sygnału.
  • +
  • Zombie - (pol. zombie), proces jest + martwy, nie posiada już żadnych zasobów. Widnieje wśród innych + procesów gdyż czeka na zakończenie przez inny proces.
  • +
+

+ Procesy podczas swoje cyklu życia w systemie, zmieniają te + stany w zależności od tego jaką czynność wykonują. Najczęściej będzie + to lawirowanie między trzema pierwszymi. Teraz kiedy znamy + charakterystykę procesów możemy przejść do praktyki, a na początku + zajmiemy się wyświetlaniem informacji o procesach. +

+

8.1.1. Polecenie ps

+

+ Polecenie ps, służy do wyświetlania procesesów w + tabeli. + Domyślnie to polecenie bez żadnych opcji wyświetli procesy uruchomione + w tym oknie terminala. +

+
+[user@server1 ~]$ ps
+    PID TTY          TIME CMD
+   1452 pts/1    00:00:00 bash
+   1891 pts/1    00:00:00 ps
+
+

+ Wynik polecenia podzielony jest na 4 kolumny. Kolumna + PID zwraca identyfikator procesu, + następnie kolumna TTY wyświetla + powiązaną z procesem nazwę terminala, na którym został uruchomiony, + później w kolumnie TIME znajduje się + łączny czas procesora w wyrażony w sekundach poświęcony na wykonanie + tego procesu. Na końcu w kolumnie CMD, znajduje się polecenie + odpowiedzialne za ten proces. To polecenie nie zwraca zbyt wielu + informacji, które mogły by nam pomóc w zarządzaniu procesami. Warto + dodać do tego polecenia kilka opcji. +

+

+ Jedną z nich może być opcja -e, która zwraca każdy występujący + w systemie proces, następną jak warto dodać jest opcja -f, + zwracająca wiecej szczegółów nt. procesu, jednak ta opcja nie jest dla + nas wystarczająca, ponieważ do zarządzania procesami potrzebujemy + jeszcze kilku informacji, które jest w stanie zwrócić nam opcja + -l. Te wymienione trzy opcje, tworzą najbardziej powszechne + użycie polecenia ps. +

+
+[user@server1 ~]$ ps -efl 
+F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
+...
+4 S root        1443     849  0  80   0 -  4884 -      10:34 ?        00:00:00 sshd: user [priv]
+5 S user        1448    1443  0  80   0 -  4884 -      10:34 ?        00:00:00 sshd: user@pts/1
+0 S user        1452    1448  0  80   0 - 56082 do_wai 10:34 pts/1    00:00:00 -bash
+1 I root        1828       2  0  80   0 -     0 -      13:15 ?        00:00:00 [kworker/u2:2-events_unbound]
+1 I root        1838       2  0  80   0 -     0 -      13:58 ?        00:00:00 [kworker/0:1-events]
+1 I root        1851       2  0  80   0 -     0 -      14:02 ?        00:00:00 [kworker/u2:1-events_unbound]
+1 I root        1910       2  0  80   0 -     0 -      15:28 ?        00:00:00 [kworker/0:0-kdmflush/253:0]
+1 I root        1931       2  0  80   0 -     0 -      15:37 ?        00:00:00 [kworker/0:2-kdmflush/253:0]
+0 R user        1932    1452  0  80   0 - 56375 -      15:38 pts/1    00:00:00 ps -efl
+
+

+ Polecenie to zwraca bardzo dużo informacji o procesach. Najważniejsze + dla nas są kolumny: S, + UID, PID, + PPID, PRI, + NI oraz CMD, + w których znajdują się takie informacje jak: +

+
    +
  • S - Stan procesu.
  • +
  • UID - Identyfikator użytkownika, + w tym przypadku jest to nazwa użytkownika.
  • +
  • PID - Identyfikator procesu.
  • +
  • PPID - Identyfikator procesu + nadrzędnego (procesu, który uruchomiło ten proces).
  • +
  • PRI - Priorytet procesu.
  • +
  • NI - Wartość nice.
  • +
  • CMD - Polecenie, które uruchomiło + proces.
  • +
+

+ Jako ciekawostkę podam, iż procesy, które w kolumnie + TTY posiadają znak zapytania + (?) pochodzą prawdopodbnie od któregoś z demonów. +

+

+ Polecenie ps daje możliwość wyświetlenia + tylko tych informacji, które potrzebujemy dzięki opcji -o. + Możemy użyć polecenia poniżej: +

+
+[user@server1 ~]$ ps -eo user,s,pid,command
+USER     S     PID COMMAND
+root     S       1 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize 31
+root     S       2 [kthreadd]
+root     I       3 [rcu_gp]
+root     I       4 [rcu_par_gp]
+root     I       6 [kworker/0:0H-events_highpri]
+root     I       9 [mm_percpu_wq]
+root     S      10 [rcu_tasks_kthre]
+root     S      11 [rcu_tasks_rude_]
+root     S      12 [rcu_tasks_trace]
+root     S      13 [ksoftirqd/0]
+root     I      14 [rcu_preempt]
+
+

+ Za pomocą ps, możemy wyszukać proces na podstawie polecenia. + Do tego wykorzystamy opcje -C. +

+
+[user@server1 ~]$ ps -o user,s,pid,command -C sshd
+USER     S     PID COMMAND
+root     S     849 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
+root     S    1974 sshd: user [priv]
+user     S    1979 sshd: user@pts/0
+root     S    2098 sshd: user [priv]
+user     S    2103 sshd: user@pts/1
+
+

+ Polecenie ps zawiera ogromną ilość opcji. Ich opisy znajdują + się na stronie podręcznika polecenia. +

+

8.1.2. Polecenie top

+

+ Polecenie z poprzednie podrozdziału służyło do wyświetlania procesów. + Za pomocą tego przedstawionego tutaj możemy je monitorować + w czasie rzeczywistym. Polecenie top, może posłużyć + do sprawdzenia czy system nie jest przeciążony. +

+
+[user@server1 ~]$ top
+top - 16:31:38 up  6:00,  1 user,  load average: 0.00, 0.00, 0.00
+Tasks: 174 total,   1 running, 173 sleeping,   0 stopped,   0 zombie
+%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
+MiB Mem :    960.5 total,    123.2 free,    464.1 used,    373.2 buff/cache
+MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.    335.9 avail Mem 
+
+    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND 
+      1 root      20   0  106212  15976  10328 S   0.0   1.6   0:01.96 systemd  
+      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd 
+      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp 
+      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp 
+      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri 
+      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq 
+     10 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_kthre 
+     11 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_rude_ 
+     12 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_trace 
+     13 root      20   0       0      0      0 S   0.0   0.0   0:00.36 ksoftirqd/0 
+     14 root      20   0       0      0      0 I   0.0   0.0   0:00.26 rcu_preempt 
+     15 root      rt   0       0      0      0 S   0.0   0.0   0:00.05 migration/0
+     16 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0 
+     18 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kdevtmpfs
+     19 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns 
+     20 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 inet_frag_wq 
+
+

+ Informacje zwracane przez to polecenie możemy podzielić na dwie części + jedną z nich jest część, w której znajduje się podsumowanie. W pierszej + linii znajduje się linia identyczna z informacją zwracaną przez + polecenie uptime, następne linie to: ilość liczbowa procesów w + systemie, informacje o zużyciu procentowym procesora, zużyciu + pamięci operacyjnej oraz przestrzeni wymiany. Ostatnia kolumna z + ostatniego rzędu zwraca rzeczywistą ilość dostępnej pamięci operacyjnej + bez wliczania przestrzeni wymiany. +

+

+ Drugą częścią jest tabelaryczne przedstawienie listy procesów + dostępnych + w systemie. W tym przypadku procesy, które zużywają najwięcej zasobów + komputera wyświetlane są w pierwszych wierszach tabeli. Przez co można + stwierdzić, że tabela jest posortowana względem wartości procentowej + zużycia procesora. Polecenie top jest bardzo elastyczne, + posiadamy możliwość dostosowania kolumn wyświetlanych w tabeli oraz + części z podsumowaniem, informacje na ten temat znajdują się na stronie + podręcznika. +

+

8.1.3. Priorytet procesu

+

+ Podczas wykonywania procesów, każdy z procesów dostaje dostęp do + procesora na ułamek sekundy, wówczas proces zmienia swój stan na + Running, po upływie tego czasu proces w zależności od czynności + przechodzi albo w Waiting albo w Sleeping. Kiedy + proces przebywa w tych stanach wykonywane są inne procesy, później + proces znów zostaje wznowiony i tak w kółko. Tego typu działanie + nazywane jest wielozadaniowością (a przynajmniej się takie wydaje). + Każdy z procesów otrzymuje określoną ilość czasu, jednak są procesy, + które mogą otrzymać go więcej lub mniej. Czasami zmiana tych wartość + jest to niezbędna do funkcjonowania + systemu. Czynnikiem który wpływa na tę decyzje jest + priorytet - kolumna PRI przy poleceniu + ps. Priorytety są już z góry określone podczas uruchamiania + procesu. Najwyszym priorytetem (proces otrzyma najwięcej czasu + procesora) jest 0, a najniższym (proces otrzyma najmniej czasu + procesora) jest 39. Administratorzy mają wpływ na priorytet procesu + za pomocą wartości nice. Kiedy administrator chce + zmienić wartość priorytetu, ustala wartość nice dla procesu + a ona jest do niego dodawana. Wartość nice, może być w zakresie + od -20 do 19. Jeśli chcemy aby proces posiadał w momencie uruchomienia + inny priorytet uruchamiamy go za pomocą polecenia + nice. +

+
+[user@server1 ~]$ ps -efl | grep $(pidof top)
+0 S user        2152    1980  0  80   0 - 56480 do_sel 17:24 pts/0    00:00:00 top
+[user@server1 ~]$ nice -n 19 top
+[user@server1 ~]$ ps -efl | grep $(pidof top)
+0 S user        2137    1980  0  99  19 - 56480 do_sel 17:20 pts/0    00:00:00 top
+
+

+ Kolumna numer 7 zawiera wartość priorytetu, a 8 kolumna zawiera wartość + nice. Zwróćmy uwagę na rozbierzności w wyświetlaniu + priorytetów procesów między poleceniami top oraz ps. + Nie mniej jednak wartość nice sprawiła zmianę priorytetu + procesu top. +

+

+ Jeśli proces jest już uruchomiony to również możemy zmienić jego + priorytet, za pomocą polecenie renice, jednak + najpierw poznamy dwa polecenia, które ułatwią nam pracę z poleceniem + renice oraz każdym innym, które potrzebuje identyfikatora + procesu. Tymi poleceniami są polecenia pidof oraz + pgrep. +

+
+[user@server1 ~]$ pidof top
+2170
+[user@server1 ~]$ pgrep top
+2170
+
+

+ Polecenia bez żadnych opcji zwracają to samo - identyfikator + procesu i tymi poleceniami będziemy się wspomagać. Oczywiście więcej + informacji na ich temat znajduje się na stronach podręcznika. Wracajac + do wartości nice, zmienie teraz priorytet działającego + procesu za pomocą polecenia renice. +

+
+[user@server1 ~]$ sudo renice -n -10 $(pidof top)
+[sudo] password for user: 
+2170 (process ID) old priority 0, new priority -10
+[user@server1 ~]$ ps -efl | grep $(pidof top)
+0 S user        2170    1980  0  70 -10 - 56480 do_sel 17:43 pts/0    00:00:00 top
+
+

+ Priorytet procesu zmienił się. Zwróćmy uwagę na to, iż polecenie + renice wymaga uprawnień superużytkownika do działania. +

+

8.1.4. Zarządzanie procesami za pomocą syganałów

+

+ Działanie procesów, może być kontrolowane za pomocą sygnałów, które + są do nich wysyłane przez jądro systemu. Te sygnały mogą zatrzymać + wykonanie procesu, przenieść proces na do tła, poprosić go o zakończenie + działania lub gdy jest dość oporny na poprzedni sygnał poprostu + unicestwić. Każdy z sygnałów posiada swoją nazwę oraz numer. My możemy + używać dowolnej formy. Poniżej znajduje się lista najczęściej + wykorzystywanych sygnałów wraz z numerami. +

+
    +
  • SIGHUP - 1 - sygnał zawieszenia, powoduje + odłącznieni się od terminala, którym proces wystartował. W przypadku + demonów, ten sygnał spowoduje ponowne odczytanie konfiguracji bez + restartu demona.
  • +
  • SIGINT - 2 - sygnał przerwania, wysyłany jest do + procesu w momencie naciśnięcia klawiszy Ctrl+c.
  • +
  • SIGKILL - 9 - sygnał zabicia, powoduje + unicestwienie procesu, a sprzątaniem po nim zajmuj się jądro.
  • +
  • SIGTERM - 15 - sygnał zakończnia, prośba o + zakończenie swojego działania. W przypadku tego sygnału proces ma + możliwość posprzątania po sobie oraz polubownego zakończenia + wszystkich czynności. Ten sygnał jest domyślnym sygnałem wysyłanym + do procesów.
  • +
  • SIGCONT - 18 - sygnał kontynuacji pracy w tle, + równoznaczny z poleceniem bg.
  • +
  • SIGSTOP - 19 - sygnał zatrzymania, równoznaczny + z naciśnięciem kombinacji klawiszy Ctrl+z.
  • +
  • SIGTSTP - 20 - sygnał kontynuacji pracy na + pierwszym planie, równoznaczny z poleceniem fg.
  • +
+

+ Do wysyłania sygnałów do procesów służy polecenie kill + lub pkill. Różnią się one tym, iż poleceniu + kill podaje się PID, natomiast pkill nazwę + procesu lub polecenie. Numery sygnałów podjemy po myślniku przed + PID-em lub nazwą. Jeśli chcemy użyć nazw sygnałów należy + podać je po opcji -s (w przypadku polecenia kill) lub + --signal (w przypadku polecenia pkill). Listę + dostępnych sygnałów możemy wyświetlić za pomocą poniższego polecenia: +

+
+[user@server1 ~]$ kill -l
+ 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
+ 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
+11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
+16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
+21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
+26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
+31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
+38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
+43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
+48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
+53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
+58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
+63) SIGRTMAX-1	64) SIGRTMAX	
+
+

+ W ramach przykładu zakończymy działania procesu top. +

+
+[user@server1 ~]$ pkill top
+[user@server1 ~]$ kill $(pidof top)
+
+

+ Do kończenia pracy procesów możemy użyć również polecenia + killall, które kończy pracę wszystkich procesów, + które pasują do określonych kryteriów. +

+

8.2. Harmonogram zadań

+

+ Harmonogram zadań służy do planowania wykonania poleceń czy + uruchomienia programów w przyszłości. Na Linuksie możemy to zrobić na + dwa sposóby, w zależności od potrzeby powtórzenia danego zadania. Na + Linuksie zadania z harmonogramu moga być uruchomione raz w określonym + czasie lub wykonywane cyklicznie co jakiś okres czasu. Narzędziami + odpowiedzialnymi za obsługę funkcji harmonogramu zadań na Linuksie + są at oraz cron. W RHEL + możemy + również spotkać się z mechanizmem kontroli dostępu do tych programów. +

+

8.2.1. Kontrola dostępu do harmongramu

+

+ W RHEL stosowany jest mechanizm kontroli dostępu do + harmonogramu + zdań zarówno dla obu narzędzi. Ten mechanizm składa się z dwóch + plików, jeden z rozszerzeniem *.allow oraz jeden z + rozszerzeniem *.deny. W tych plikach umieszczamy + wpis z nazwą użytkownika w zależności od tego czy użytkownik ma mieć + lub nie mieć dostępu do tych narzędzi. Sama obecność tych plików w + systemie ma wpływ na to czy użytkownicy będą mogli korzystać z + harmonogramu zadań. Każdy program posiada swoją parę plików. W + poniższej tabeli znajdują się rozpisane zależności, które obrazują + w jaki sposób obecność tych plików wpływa na dostęp do narzędzi + harmonogramu zadań. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Obecność pliku *.allowObecność pliku *.denyWpływ na dostęp do at oraz cron
Istnieje, posiada wpisy użytkowników.Nie musi istnieć.Wszyscy użytkownicy w pliku posiadają dostęp.
Istnieje, ale jest pusty.Nie musi istnieć.Nikt nie ma dostępu.
Nie istnieje.Istnieje, posiada wpisy użytkowników.Wszyscy użytkownicy, poza tymi zapisanym w pliku + *.deny mają dostęp.
Nie istnieje.Istnieje, ale jest pusty.Wszyscy użytkownicy posiadają dostęp.
Nie istnieje.Nie istnieje.Nikt nie ma dostępu.
+

+ Powyższe zasady nie obowiązują oczywiście superużytkownika, nawet mimo + umieszczenia jego nazwy w plik *.deny. Domyślnie w + RHEL + plik *.allow nie istnieje, natomiast plik *.deny + istnieje, ale jest pusty. +

+

+ Odnośnie egzaminu:
+ Definiując wpisy w tych plikach, należy pamiętać o tym aby jedna linia + zwierała jednego użytkownika. To jedyna poprawna metoda. +

+

+ Po wpisaniu nazwy użytkownika do pliku, jeśli będzie on chciał + skorzystać z at lub cron zobaczy poniższe komunikaty. +

+
+[user@server1 ~]$ at
+You do not have permission to use at. 
+[user@server1 ~]$ crontab -e
+You (user) are not allowed to use this program (crontab)
+See crontab(1) for more information
+
+

+ Oczywiście dla przykładu zablokowałem dostęp do obu narzędzi. +

+

8.2.2. Wykonanie zadań w przyszłości - polecenie at

+

+ Polecenie at służy do planowania pojedynczego + wykonania + zadania w przyszłości. Podczas wydawania polecenia podajemy czas oraz + ewentualnie datę kiedy zadanie ma zostać wykonane. Czas możemy podać + na kilka różnych sposobów: +

+
    +
  • at 1:15am - polecenie zostanie uruchomione o 01:15 + następnego dnia,
  • +
  • at noon - polecenie zostanie uruchomione w + południe tego lub nastęnego dnia,
  • +
  • at 23:45 - polecenie zostanie uruchomione o 23:45,
  • +
  • at midnight - polecenie zostanie uruchomione o + północy,
  • +
  • at 17:05 tommorow - polecenie zostanie uruchomione + w dniu jutrzejszym o 17:05,
  • +
  • at now + 5 hours - polecenie zostanie uruchonione + za 5 godzin,
  • +
  • at 3:00 10/12/2022 - polecenie zostanie + uruchomione o 3 w nocy 12 października 2022 roku (w amerykańskim + zapisie daty na początku podaje się miesiąc następnie dzień + miesiąca).
  • +
+

+ Po wydaniu polecenia z datą, polecenie uruchomi tryb interaktywyny, + gdzie w każdej linii będziemy mogli zapisać polecenie, które wykona + się o podanym czasie. Po zakończeniu zapisywania poleceń naciskamy + kombinację Ctrl+d, aby zakończyć działanie programu i zapisać + polecenia, wówczas po znaku zachęty pojawi się znak <EOT> + oznaczający zakończenie wprowadzania poleceń. +

+
+[user@server1 ~]$ at midnight
+warning: commands will be executed using /bin/sh
+at> date 
+at> pwd
+at> whoami
+at> who
+at> w
+at> <EOT>
+job 2 at Wed Jul  6 00:00:00 2022
+
+

+ Polecenia zapisywane są w odpowiednich pliku w katalogu + /var/spool/at. Dostęp do katalogu wymaga uprawnień + administratora. +

+
+[user@server1 ~]$ sudo ls -l /var/spool/at
+[sudo] password for user: 
+total 4
+-rwx------. 1 user user 3365 Jul  5 09:28 a0000201a56968
+
+

+ Programem odpowiedzialnym za wykonanie poleceń jest demon atd. + Za pomocą opcji polecenia at możemy na przykład wyświetlić + listę zdefiniowanych zadań (-l): +

+
+[user@server1 ~]$ at -l 
+2	Wed Jul  6 00:00:00 2022 a user
+
+

+ W pierwszej kolumnie znajduje się numer zadania. Jest on istotny jeśli + chcemy na przykład wyświetlić jego plik za pomocą opcji -c. +

+
+[user@server1 ~]$ at -c 2
+#!/bin/sh
+# atrun uid=1000 gid=1000
+# mail user 0
+umask 22
+SHELL=/bin/bash; export SHELL
+HISTCONTROL=ignoredups; export HISTCONTROL
+HISTSIZE=1000; export HISTSIZE
+HOSTNAME=server1.example.com; export HOSTNAME
+PWD=/home/user; export PWD
+LOGNAME=user; export LOGNAME
+XDG_SESSION_TYPE=tty; export XDG_SESSION_TYPE
+MOTD_SHOWN=pam; export MOTD_SHOWN
+HOME=/home/user; export HOME
+LANG=en_US.UTF-8; export LANG
+...
+${SHELL:-/bin/sh} << 'marcinDELIMITER29478f5e'
+date
+pwd
+whoami
+who
+w
+marcinDELIMITER29478f5e
+
+

+ Zadanie możemy też usunąć za pomocą opcji -r lub -d, + plik z katalogu /var/spool/at również zostanie usunięty. +

+
+[user@server1 ~]$ at -d 2
+[user@server1 ~]$ at -l
+
+

+ Do usunięcia potrzebny jest numer zadania, który znajduje się + pierwszej kolumnie listy zadań wyświetlonej za pomocą polecenia + at -l. Obie przestawione powyżej + opcje są aliasami do poleceń atq oraz atrm. +

+

+ Działanie narzędzi harmonogramu zadań jest rejestrowane, a ich + komunikaty diagnostyczne są zapisywane w /var/log/cron. Mimo + iż nazwa pliku wskazuje iż dotyczy on głównie crond to + komunikaty atd również są tam zapisywane. Aby + wyświetlić jego zawartość potrzebne są uprawnienia administratora: +

+
+[user@server1 ~]$ sudo tail /var/log/cron
+[sudo] password for user: 
+Jul  5 09:01:01 server1 anacron[1651]: Jobs will be executed sequentially
+Jul  5 09:01:01 server1 run-parts[1640]: (/etc/cron.hourly) finished 0anacron
+Jul  5 09:01:01 server1 CROND[1639]: (root) CMDEND (run-parts /etc/cron.hourly)
+Jul  5 09:21:01 server1 anacron[1651]: Job `cron.daily' started
+Jul  5 09:21:01 server1 anacron[1651]: Job `cron.daily' terminated
+Jul  5 09:21:01 server1 anacron[1651]: Normal exit (1 job run)
+Jul  5 10:01:01 server1 CROND[1941]: (root) CMD (run-parts /etc/cron.hourly)
+Jul  5 10:01:01 server1 run-parts[1941]: (/etc/cron.hourly) starting 0anacron
+Jul  5 10:01:01 server1 run-parts[1941]: (/etc/cron.hourly) finished 0anacron
+Jul  5 10:01:01 server1 CROND[1940]: (root) CMDEND (run-parts /etc/cron.hourly)
+
+

8.2.3. Definiowanie powtarzalnych zadań - program cron

+

+ Na Uniksach, bo nie tylko na Linuksie, istnieje program służący do + definiowania powtarzalnych zadań uruchamianych co jakiś czas. Takim + programem, a raczej demonem jest cron. Działanie + tego programu opiera się o pliki zwane tablicami cron lub + crontabami. Każdy użytkownik może korzystać z tego narzędzia, + chyba, że występuje on w pliku /etc/cron.deny. + Użytkownicy do kontroli harmonogramu zadań, używają polecenia + crontab. Każdy z nich zapisuje zadania w swojej + tablicy znajdującej się w katalogu /var/spool/cron. Zapis + zadań w tablicy wymaga ściśle określonej składni. Wpis składa się z + 5 pól czasu, ewentualnego pola zawierającego nazwę użytkownika + (pole to występuje tylko w systemowej tablicy cron + /etc/crontab), z którego uprawnieniami ma zostać wykonane to + zadanie, oraz reszty linii zawierającej polecenie do wykonania. + Poniżej znajduje się przykład wpis, który sobie przeanalizujemy. +

+
+15 13 4 7 * echo "Hello World" > /dev/pts/1
+
+

+ Każdy wpis zadania w tablicy cron rozpoczyna się od 5 pól + określających kiedy owe zadanie ma zostać wykonane. Pola od lewej + definiują kolejno: +

+
    +
  • 15 - pole 1, minuta w godzinie. + W tym polu określamy konkretną minutę godziny w której zadanie + ma zostać uruchomione, jeśli jest to jedyne skonfigurowane pole + wówczas zadanie bedzie uruchamiać się co godzinę. To + pole przyjmuje wartości od 0 do 59.
  • +
  • 13 - pole 2, godzina w dniu. To + pole wskazuje na godzinę, w której zadanie ma zostać uruchomione. + Jeśli to jedyne skonfigurowane pole, wówczas zadanie będzie + uruchamiać się o pełnej godzinie kazdego dnia. To pole może + przyjmować wartości od 0 do 23.
  • +
  • 4 - pole 3, dzień miesiąca. Pole + wskazuje dzień miesiąca w którym ma zostać uruchomione zadanie. Jeśli + jest to jedyne zdefiniowane pole, to zadanie będzie się uruchamiać + tego dnia każdego miesiąca. Pole to może przyjmować wartości od + 1 do 31.
  • +
  • 7 - pole 4, miesiąc, pole wskazuje + na miesiąc w roku. Pole może przyjmować zarówno wartości liczbowe + jak alfabetyczne, nazwy miesięcy składają się trzech pierwszych + małych liter angielskiej nazwy miesiąca.
  • +
  • * - pole 5, dzień tygodnia, pole + wskazuje na dzień tygodnia podobnie jak miesiąc może zawierać + wartości liczbowe oraz alfabetyczne zawierające trzy pierwsze + małe litery angielskiej nazwy dnia. Wartość 0 oraz 7 oznaczają + niedzielę.
  • +
+

+ Pola czasu przyjmują takie wartości jak listy (określajace konkretne + godziny, dni itd. Na przykład 15,16), zakresy (określające, + którego do którego polecenia ma zostać wykonane np. 10-20) + oraz wartości skokowe, które definiują co ile minut, godzin lub dni + wykonać to zadanie. Listy oraz zakresy można łączyć ze sobą zazwyczaj + 10-15,21 może to oznacząć uruchomienie zadania od 10-15 oraz + 21 dnia miesiąca. Więcej informacji na temat można znaleźć na stronie + podręcznika pliku /etc/crontab. +

+

+ Ostatnie pole, jest miejscem do umieszaczania poleceń. Jeśli polecenie + zwraca istotne dane wyjściowe to najlepiej jest je przekierować. +

+

+ Odnośnie egzamin:
+ Wykonując zadania administracyjne, powinniśmy mieć opanowaną składnie + wpisów zadań oraz rozumienie jej poszczególnych części. +

+

+ Do edycji tablicy cron służy polecenie crontab + z opcją -e. Polecenie to uruchomi edytor, w którym to + zapiszemy wpisy harmonogramu, po zakończeniu edycji i zapisaniu zmian + polecenie utworzy plik w /var/spool/cron o nazwie użytkownika. + Ten plik staje się teraz jego tablicą cron. Po zapisaniu pliku + tablica zostaje zainstalowana w pamięci demona. W ten sposób + definiuje się wpisy harmonogramu zadań cron. +

+

+ Za pomocą opcji -l możemy wyświetlić obecną tablicę + cron. +

+
+[user@server1 log]$ crontab -l
+15 13 4 7 * echo "Hello World" > /dev/pts/1
+
+

+ Za pomocą opcji -r możemy usunąć obecną tablicę cron: +

+
+[user@server1 log]$ crontab -r
+[user@server1 log]$ crontab -l
+no crontab for user
+
+

8.2.4. Wykonanie pominiętych zadań - program Anacron

+

+ Nie które komputery z zainstalownym Linuksem, nie są właczone 24/7. + Za tem cześć zadań zdefiniowana w systemowym harmonogramie w plikach + /etc/cron.* nie jest wykonywana. Pliki te dotyczą czynność + systemowych zdefiniowanych co godzinę, dzień, tydzień czy miesiąc. + Ta przypadłość najczęściej dotyczy komputerów osobistych. + Dlatego też, aby uruchomić te zdania używa się demona + anacron. Aby demon rozpoczął uruchmianie niewykonanych + zadań muszą zostać w systemie spełnione trzy czynniki. Pliki tablicy + anacron muszą istnieć w katalogu /var/spool/anacron, + musi upłynąć odpowiednia ilość czasu (zdefiowana w pliku + systemowej tablicy /etc/anacrontab) oraz komputer musi być + podłączony do stałego źródła zasilania. Poniżej znajduje sie plik + konfiguracyjny anacron. +

+
+SHELL=/bin/sh
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+MAILTO=root
+RANDOM_DELAY=45
+START_HOURS_RANGE=3-22
+1	        5	cron.daily		  nice run-parts /etc/cron.daily
+7	       25	cron.weekly		  nice run-parts /etc/cron.weekly
+@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly
+
+

+ W pierwszej kolumnie znajduje się okres (w dniach) jaki musi upłynąć + od ostatniego uruchomienia tych zdań. W drugiej znajduje się opóźnienie + które musi minąć od uruchomienia systemu, to opóźnienie jest zazwyczaj + powiększone o wartość zdefiniowaną w zmiennej + RANDOM_DELAY. + W następnej kolumnie znajduje się identyfikator zdania, a ostatnia + kolumna to już pole polecenia. Dość istotną rolę gra tutaj wartość + zmiennej START_HOURS_RANGE. Określa + ona w jakich godzinach anacron może działać. +

+

+ Działanie demona możemy wymusić poprzez wydanie polecenia + anacron. +

+
+[user@server1 ~]$ sudo anacron
+[sudo] password for user: 
+[user@server1 ~]$ 
+
+

Ćwiczenie 1: Wartość nice procesu

+

+ Na maszynie server1, uruchomy dwa termiale (mogą być to dwa + połączenia SSH z tą maszyną) następnie w jednym z terminali uruchom + program top, na drugim terminalu za pomocą polecenia ps + lub pgrep ustal PID oraz wartość nice dla + wcześniej uruchomionego polecenia top. Zakończ działanie + programu top, następnie uruchom je ponownie z priorytetem + zmniejszonym o 8 (+8). Potwierdź zmianę priorytet na drugim terminalu. + Następnie zwiększ priorytet o 10 (-10) nie zamykając programu top + i potwierdź to w drugim terminalu. +

+

Ćwiczenie 2: Konfiguracja tablicy cron użytkownika

+

+ Na maszynie server1 jako superużytkownik zapewnij dostęp + do cron dla zwykłego użytkownika, na którego się logujesz. + Jako zwykły użytkownik sprawdź nazwę aktualnego terminala + (polecenie tty) oraz obecną datę i godzinę (polecenie + date). Za pomocą harmonogramu zadań cron ustaw + wykonanie polecenia + echo "Hello World" > nazwa_terminala + (za nazwa_terminala podstawiamy nazwę uzyskaną z polecenia + tty) za 3 minuty od bierzącego czasu. Zaczekaj na wykonanie + zadania. +

+

Podsumowanie

+

+ W tym rodziale zapoznaliśmy się z procesami, wyświetaliśmy ich listę + korzystaliśmy z polecenia top, zmienialiśmy ich priorytet + oraz zarządzaliśmy nimi za pomocą sygnałów. W drugiej części zajęliśmy + się narzędziami harmonogramu zadań. Nauczyliśmy się korzystać z takich + programów jak at czy cron. Na koniec poznaliśmy + specyficzny dla dystrybucji klasy enterprise demon + Anacron. W następnym + rozdziale zapoznamy się podstawami zarządzania pakietami oprogramowania + na RHEL. +

+

9. Podstawy zarządzania pakietami oprogramowania

+

+ Pakiety inaczej zwane paczkami czy ogólnie oprogramowanie dystrybucji, + to archiwa przechowywujące zazwyczaj skompilowane oprogramowanie + przeznaczone dla systemu, który używamy. Wewnątrz pakietów znajduje się + cała strukturktura katalogowa z plikami pakietu, tak by podczas + instalacji wystarczyło je tylko rozpakować. Wewnątrz znajdują się + również metadane zawierające informacje o pakiecie. +

+

+ Większość pakietów posiada długie nazwy, które nie są dokońca + rozumiałe. Weźmy na przykład taką nazwę jak: +

+openssl-1.1.1-8.el8.x86_64.rpm
+
+ Zawiera ona takie elementy jak: +

+
    +
  • Jednoznaczną nazwę oprogramowania pozwalającą, zidentyfikować + co to za program (openssl).
  • +
  • Numer wersji oprogramowania + (1.1.1).
  • +
  • Numer wydania (8).
  • +
  • Nazwę dystrybucji, rodziny dystrybucji itp. Ten element nie jest + obligatoryjny. Nie które dystrybucje włączają go do numeru wydania + (el8). +
  • +
  • Nazwa architektury dla jakiej zostało skompilowane oprogramowanie + (x86-64).
  • +
  • Rozszerzenie (.rpm).
  • +
+

+ Kompilacja programów ze źródeł wymaga odpowiedniego środowiska (w ten + sposób tworzy się binarne wersje programów udostępnionych w pakietach). + Aby oprogramowanie z pakietu mogło działać tak samo, jak na w systemie, + w którym zostało skompilowane wymaga identycznego środowiska. To + środowisko jest przedstawiane za pomocą + zależności pakietu, czyli wszystkich innych pakietów, + wymaganych do działania tego programu, który chcemy + zainstalować. Informacje o zależnościach znajdują się w metadanych + pakietu. +

+

+ Systemy, w których dystrybucja oprogramowania jest oparta o pakiety + musi + posiadać bazę danych pakietów. W przypadku RHEL znajduje się + ona w katalogu /var/lib/rpm. Na podstawie danych umieszczonych + w tym katalogu oprogramowanie do zarządzania pakietami pobiera + informacje o zainstalowanych w systemie pakietach. +

+

+ Aby móc zarządzać pakietami potrzebne są do tego odpowiednie + programy. Red Hat posiada takie polecenie jak + rpm (ang. Red Hat Packet Manager) i jest to + podstawowe narzędzie do instalacji, aktualizacji, wyszukiwania + informacji czy usuwania oprogramowania z systemu. Rpm jest + bardzo prostym narzędziem jednak posiada jedną wadę, otóż + nie rozwiązuje samodzielnie zależności. Dlatego też pojawił + się taki program jak yum, który pełni takie same + role jak rpm jednak nie posiada wspomnianej wady. Od wersji + 8 RHEL, yum został zastąpiony przez + dnf, który rozszerza funkcjonalność yum. + W tym rodziale zajmiemy się wyłącznie rpm. W następnym + zaś skupimy się na dnf. +

+

9.1. Red Hat Packet Manager - RPM

+

9.1.1. Pobieranie danych z pakietu

+

+ Jedną z podstawowych czynności jakie możemy wykonać przy użyciu tego + narzędzia + jest pobieranie informacji o pakietach, za pomocą opcji -q + podając jako argument nazwę programu możemy dowiedzić się czy takowy + jest zainstalowany w systemie. +

+
+[user@server1 ~]$ rpm -q zsh
+package zsh is not installed
+[user@server1 ~]$ rpm -q bash
+bash-5.1.8-4.el9.x86_64
+
+

+ Pakiet zsh nie jest zainstalowany + w moim systemie. Natomiast drugie wywołanie potwierdza, że systemie + zainstalowano powłokę BASH. +

+

+ Z racji tego, iż rpm to nie tylko narzędzie ale i format + danych za pomocą tego polecenia, możemy wyświetlić pliki konfiguracyjne + programu (-qc), który zawiera pakiet czy pliki dokumentacji + (-qd). +

+
+#Plik dokumentacji:
+[user@server1 ~]$ rpm -qd bash
+/usr/share/doc/bash/FAQ
+/usr/share/doc/bash/INTRO
+/usr/share/doc/bash/RBASH
+/usr/share/doc/bash/README
+/usr/share/doc/bash/bash.html
+/usr/share/doc/bash/bashref.html
+...
+
+#Pliki konfiguracji:
+[user@server1 ~]$ rpm -qc bash
+/etc/skel/.bash_logout
+/etc/skel/.bash_profile
+/etc/skel/.bashrc
+
+

+ Wszystkie pliki pakietu możemy wyświetlić za pomocą opcji -ql. + Generalnie opcja -q, jest modyfikatorem odpowiedzialnym za + pobieranie danych z bazy lub z samego pliku pakietu. +

+
+[user@server1 ~]$ rpm -ql bash
+/etc/skel/.bash_logout
+/etc/skel/.bash_profile
+/etc/skel/.bashrc
+/usr/bin/alias
+/usr/bin/bash
+/usr/bin/bashbug
+/usr/bin/bashbug-64
+/usr/bin/bg
+/usr/bin/cd
+...
+
+

+ Za pomocą opcji -qf możemy wyszukać pakietu, z którego + pochodzi podany plik. +

+
+[user@server1 ~]$ rpm -qf /etc/bashrc
+setup-2.13.7-6.el9.noarch
+
+

+ Polecenie zwróci nazwę pakietu. Zwróćmy uwagę na to, że nazwy + zainstalowanych pakietów w RHEL różnią się od nazw plików + tym, że nie posidają rozszerzenia. Jeśli nie wiemy czym jest ten pakiet + przedstawiowny na poprzednim przykładzie za pomocą opcji -qi + możemy sprawdzić do czego służy. +

+
+[user@server1 ~]$ rpm -qi setup-2.13.7-6.el9.noarch
+Name        : setup
+Version     : 2.13.7
+Release     : 6.el9
+Architecture: noarch
+Install Date: Sun 26 Jun 2022 01:48:46 PM CEST
+Group       : System Environment/Base
+Size        : 726478
+License     : Public Domain
+Signature   : RSA/SHA256, Sat 20 Nov 2021 04:26:39 PM CET, Key ID 199e2f91fd431d51
+Source RPM  : setup-2.13.7-6.el9.src.rpm
+Build Date  : Tue 10 Aug 2021 06:16:15 PM CEST
+Build Host  : ppc64le-03.build.eng.rdu2.redhat.com
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Vendor      : Red Hat, Inc.
+URL         : https://pagure.io/setup/
+Summary     : A set of system configuration and setup files
+Description :
+The setup package contains a set of important system configuration and
+setup files, such as passwd, group, and profile.
+
+

+ Przed przejściem do kolejnego zaganienia musimy umieścić płytę + instalacjyną z RHEL w napędzie maszyny. Z niej będziemy + pobierać pakiety do dalszych ćwiczeń, gdyż nasze maszyny nie są + podłączone do sieci Red Hat. Po włożeniu płyty do napędu + dodajmy poniższy wpis do + pliku /etc/fstab, aby płyta posiadała prosty i stały punkt + montowania. Na płycie znajdują się dwa katalogi BaseOS/Packages + oraz AppStream/Packages, gdzie znajdują się pakiety. +

+
+/dev/sr0  /mnt  iso9660 ro  0 0
+
+

+ Po zapisaniu zmian w pliku wywołujemy polecenie + sudo mount -a, aby zamontować płytę + w podkatalogu /mnt. Kiedy płyta jest już zamontowana w + systemie, możemy wyświetlić informacje z metadanych pliku pakietu za + pomocą opcji -qip. +

+
+[user@server1 ~]$ rpm -qip /mnt/BaseOS/Packages/bash-completion-2.11-4.el9.noarch.rpm 
+Name        : bash-completion
+Epoch       : 1
+Version     : 2.11
+Release     : 4.el9
+Architecture: noarch
+Install Date: (not installed)
+Group       : Unspecified
+Size        : 1057184
+License     : GPLv2+
+Signature   : RSA/SHA256, Sat 20 Nov 2021 11:52:53 AM CET, Key ID 199e2f91fd431d51
+Source RPM  : bash-completion-2.11-4.el9.src.rpm
+Build Date  : Mon 09 Aug 2021 09:47:13 PM CEST
+Build Host  : s390-070.build.eng.bos.redhat.com
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Vendor      : Red Hat, Inc.
+URL         : https://github.com/scop/bash-completion
+Summary     : Programmable completion for Bash
+Description :
+bash-completion is a collection of shell functions that take advantage
+of the programmable completion feature of bash.
+
+

+ Polecenie zwraca taką samą ilość informacji jak polecenie rpm + wraz z opcją -qi. +

+

9.1.2. Sprawdzanie pakietów

+

+ Za pomocą jednego z programów związanych z rpm oraz za pomocą + samego polecenia rpm możemy sprawdzić poprawność oraz + wiarygodność pakietów, które zamierzamy zainstalować, jak i sprawdzić + co zostało zmienione przez nas w plikach programów, które są już + zainstalowane w systemie względem oryginalnego pakietu. +

+

+ Walidację pakietu, który mamy zainstalować możemy przeprowadzić + względem dwóch kryteriów, jednym z nich jest poprawność plików + znajdujących się w pakiecie. Ta metoda polega na sprawdzeniu sumy + kontrolnej MD5. +

+
+[user@server1 ~]$ rpmkeys -K /mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm --nosignature
+/mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm: digests OK
+
+

+ Drugim kryterium jest wiarygodność. Każdy pakiet zawiera podpis + twórcy/dostawcy, w naszym przypadku jest to dostawca którym jest firma + Red Hat, ten podpis dokonywany jest za pomoca klucza + kryptograficznego. + Część tego klucza odpowiedzialna za szyfrowanie danych jest instalowana + w naszym systemie i pozostaje do naszej dyspozycji. Poza omówią funkcją + ta część klucza może również pomoć nam sprawdzić czy pakiet który + pobraliśmy z internetu rzeczywiście został stworzony przez firmę + Red Hat, za nim zaczniemy używać klucza musimy go na początku + zaimportować, importu dokonujemy za pomocą polecenia poniżej, ścieżka + do klucza również znajduje się na przykładzie. +

+
+[user@server1 ~]$ sudo rpmkeys --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release 
+
+

+ Import klucza, jak i sprawdzenie + wiargodności pakietów wymaga uprawnień administratora. +

+
+[user@server1 ~]$ rpmkeys -K /mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm
+/mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm: digests signatures OK
+
+

+ Teraz polecenie sprawdziło nie tylko poprawność plików + (digests), ale także ich wiarygodność + (signatures). +

+

+ Za pomocą polecenia rpm możemy sprawdzić + zainstalowane już pakiety + pod kątem zmian względem plików znajdujących w oryginalnym pakiecie. + Służy temu opcja -V, jeśli nie ma żadnych zmian to polecenie + nic nie zwróci. Możemy oczywiście zwiększyć ilość komunikatów + generowanych podczas pracy programu z pomocą opcji -v, wówczas + polecenie zwróci informacje na temat każdego sprawdzonego pliku pakietu. +

+
+[user@server1 ~]$ sudo rpm -V at
+[sudo] password for user: 
+.......T.  c /etc/at.deny
+
+

+ Informacja zwracana przez to polecenie składa się z trzech kolumn, w + pierwszej kolumnie znajdują się flagi, które mowią nam co uległo + zmianie, każda z 9-ciu kropek to jedna flaga, w drugiej kolumnie + znajdują się rodzaj pliku w tym przypadku + c. Ostatnia kolumna zawiera ścieżkę + bezwzględną do pliku. Poniżej znajdują się listy z flagami oraz typami + plików. Kolejność na liście z flagami oznacza konkretną kropkę. +

+
    +
  1. S - różnica w wielkości pliku,
  2. +
  3. M - różnica w uprawnieniach,
  4. +
  5. 5 - różnica w sumie kontrolnej pliku,
  6. +
  7. D - różnica w numerze głównym i pobocznym + urządzenia, urządzenie zostało zmienione,
  8. +
  9. L - zmieniona ścieżka dowiązania symbolicznego,
  10. +
  11. U - zmieniony właściciel pliku,
  12. +
  13. G - zmieniona grupa pliku,
  14. +
  15. T - różnica w czasie modyfikacji,
  16. +
  17. P - różnica w POSIX Capabilities
  18. +
+

+ Kropka (.) oznacza brak zmian. Poniżej znajduje się + lista zawierająca typy plików. +

+
    +
  • c - %config - pliki konfiguracyjne,
  • +
  • d - %docs - pliki dokumentacji,
  • +
  • g - %ghost - pliki, których zawartość + nie znajduje się wewnątrz pakietu,
  • +
  • l - %license - pliki licencji,
  • +
  • r - %readme - plik README.
  • +
+

9.1.3. Instalacja i reinstalacja

+

+ Aby jak najlepiej wykorzystać polecenie rpm do instalacji + pakietów wykorzystuje się trzy opcje: -i - oznaczającą samą + instalacje pakietu, -v - zwiększającą ilość generowanych przez + polecenie komunikatów, -h - wyświetlająca pasek postępu w + postaci serii krzyżyków (#), po zapisaniu tych opcji + podajemy ścieżkę do pliku pakietu. Uwaga, tutaj pojawia się omawiana + wcześniej wada: brak rozwiązywania zależność, jeśli spróbujemy + zainstalować jakiś pakiet, które zależności nie są rozwiązane + (spełnione), rpm nie podejmie w ogóle instalacji, zwraca + błąd o niespełnionych zależnościach. Na przykładzie poniżej znajduje + się instalacja powłoki zsh. +

+
+[user@server1 ~]$ sudo rpm -ivh /mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm 
+[sudo] password for user: 
+Verifying...                          ################################# [100%]
+Preparing...                          ################################# [100%]
+Updating / installing...
+   1:zsh-5.8-9.el9                    ################################# [100%]
+
+

+ Teraz powłoka zsh jest zainstalowana w systemie. Pakiety + możemy również reinstalować podając po -i długą opcję + --reinstall. +

+
+[user@server1 ~]$ sudo rpm -i --reinstall -vh /mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm 
+Verifying...                          ################################# [100%]
+Preparing...                          ################################# [100%]
+Updating / installing...
+   1:zsh-5.8-9.el9                    ################################# [ 50%]
+Cleaning up / removing...
+   2:zsh-5.8-9.el9                    ################################# [100%]
+
+

9.1.4. Aktualizacje pakietów

+

+ Aktualizacji pakietu możemy dokonać na dwa sposoby, pierwszym z nich + jest aktualizacja przy użyciu opcji -U, + jeśli podany pakiet nie istnieje w systemie to zostanie on + automatycznie zainstalowany. Opcji -U używa się wraz innymi + opcjami instalacji -v oraz -h. Spróbujemy + zaktualizować naszą powłokę zsh. +

+
+[user@server1 ~]$ sudo rpm -Uvh /mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm 
+[sudo] password for user: 
+Verifying...                          ################################# [100%]
+Preparing...                          ################################# [100%]
+	package zsh-5.8-9.el9.x86_64 is already installed
+
+

+ W tym przykładzie użyłem tej samego pakietu do aktualizacji, co + wygerowało monit o tym, że taki pakiet jest już zainstalowany w + systemie. +

+

+ Inną opcją aktualizacji jest odświerzenie (ang. freshening), + ta metoda wymaga aby pakiet w starszej wersji był już zainstalowany + w systemie. Odświerzenie wymaga opcji -F i używa się jej + wraz z pozostałymi opcjami wymienionymi podczas instalacji oraz + aktualizacji. +

+
+[user@server1 ~]$ sudo rpm -Fvh /mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm 
+[sudo] password for user: 
+
+

+ Polecenie nie zrobiło nic poniważ podałem ten sam pakiet, które jest + już zainstalowany. +

+

9.1.5. Usuwanie pakietów

+

+ Do usuwania pakietów z systemu służy opcja -e, używa się jej + wraz z opcją -v, aby polecenie zróciło chociaż jakiś komunikat, + po usunięciu pakietu. Poniżej znajdują się polecenia pokazujące + usunięcie pakietu z systemu. +

+
+[user@server1 ~]$ rpm -q zsh
+zsh-5.8-9.el9.x86_64
+[user@server1 ~]$ sudo rpm -ev zsh
+Preparing packages...
+zsh-5.8-9.el9.x86_64
+[user@server1 ~]$ rpm -q zsh
+package zsh is not installed
+
+

+ Na podstawie informacji zwracanej przez ostatnie polecenie możemy + wywnioskować, iż pakiet został usunięty. +

+

9.1.6. Pozostałe czynności wykonywane na pakietach.

+

+ Do pozostałych czynności jakie możemy wykonać zaliczamy + nadpisanie pakietu. Jeśli podejrzewany, że mogły + wystąpić błędy podczas instalacji możemy nadpisać pakiety dodając do + opcji instalacji długą opcję --replacepkgs. +

+
+[user@server1 ~]$ sudo rpm -ivh --replacepkgs /mnt/BaseOS/Packages/zsh-5.8-9.el9.x86_64.rpm 
+[sudo] password for user: 
+Verifying...                          ################################# [100%]
+Preparing...                          ################################# [100%]
+Updating / installing...
+   1:zsh-5.8-9.el9                    ################################# [100%]
+
+

+ Wynik działania nadpisania jest identyczny jak w przypadku instalacji. +

+

+ Czasami może się zdarzyć taka potrzeba, aby wyodrębnić jeden z plików + znajdujących wewnątrz pakietu, możemy wówczas taki pakiet rozpakować + do katalogu, a następnie przekopiować interesujące nas pliki. + Załóżmy że potrzebujemy pliku /etc/bashrc. Za pomocą opcji + -qf możemy ustalić z jakiego pakietu pochodzi. +

+
+[user@server1 ~]$ rpm -qf /etc/bashrc
+setup-2.13.7-6.el9.noarch
+
+

+ Pobieramy plik z internetu lub możemy załadować go z płyty. Do + polecenia + rpm2cpio podajemy ścieżkę do pliku, następnie wyjście + polecenia przekierowujemy + za pomocą potoku do polecenia cpio z następującymi + opcjami -i (wypakuj), -m (zachowaj oryginalny + czas modyfikacji plików), -d (utwórz katalogi poprzedzające + pliki). Takie wypakowanie nalepiej jest zrobić w odrębnym katalogu + na przykład w /tmp. +

+
+[user@server1 ~]$ mkdir /tmp/setup.rpm
+[user@server1 ~]$ cd /tmp/setup.rpm/
+[user@server1 setup.rpm]$ rpm2cpio /mnt/BaseOS/Packages/setup-2.13.7-6.el9.noarch.rpm | cpio -imd
+1430 blocks
+[user@server1 setup.rpm]$ ls
+etc  run  usr
+[user@server1 setup.rpm]$ ls -l etc/bashrc 
+-rw-r--r--. 1 user user 3019 Jun 23  2020 etc/bashrc
+
+

+ Teraz możemy przekopować potrzebny nam pliki. +

+

Ćwiczenie 1: Instalacja pakietu zsh

+

+ Na maszynie server1, jak użytkownik z mozliwością podniesienia + uprawnień zamontuj płytę/obraz płyty w systemie. Za pomocą polecenia + rpm wyświetl informacje (podstawowe) o pakiecie zsh, + sprawdź jego poprawność oraz wiarygodność, a następnie zainstaluj go + w systemie. Na koniec sprawdź czy występują jakieś róznice między + plikami zainstalowanymi, a plikami oryginalnymi występującymi w + pakiecie. +

+

Ćwiczenie 2: Pobieranie informacji oraz usunięcie pakietu

+

+ Na maszynie server1, jak użytkownik z mozliwością podniesienia + uprawnień zamontuj płytę/obraz płyty w systemie. Za pomocą polecenia + rpm sprawdzić czy zainstalowany jest pakiet setup i + wyświetl jego pliki konfiguracyjne. Wyświetl informacje na temat + pakietu zlib-devel znajdującego się na obrazie płyty. + Zainstaluj ponownie pakiet zsh a następnie go usuń. +

+

Podsumowanie

+

+ W tym rozdziale zapoznaliśmy się z pojęciem pakietu oprogramowania oraz + z podstawowymi metodami na zarządzanie nim w RHEL w praktyce. + Dowiedzieliśmy się jak instalować, usuwać oraz wydobywać informacje o + i z pakietów. W następnym rodziale zajmiemy się bardziej zaawansowanym + zarządzeniem pakietami przy użyciu polecenia dnf. +

+

10. Zaawansowane zarządzanie pakietami.

+

+ W poprzednim rozdziale zapoznaliśmy się z podstawą zarządania pakietami + jaka nie wątpliwie jest program rpm. Jego główną wadą jest to, + iż nie rozwiązuje on zależności instalowanych pakietów. Z tego powodu + potrzebne było lepsze narzędzie do obsługi oprogramowania w systemie, + dlatego też twórcy RHEL wdrożyli program yum, który + przez + lata sprawdzał się postaci menedżera pakietów, a od wersji 8 + Red Hat Enterprise Linux został on zastąpiony programem + dnf, + który ma nieco większe możliwości. Zanim przejdziemy do zarządzania + pakietami, trochę teorii. +

+

+ Dnf wprowadza do zarządzania pakietami takie pojęcia jak + grupy pakietów - są tematyczne grupy aplikacji, + którymi możemy wzbogacić nasz system. Powiedzmy, że potrzebujemy w + systemie obsługi kart inteligentnych to zamiast szukać odpowiednich + pakietów, możemy zainstalować wszystkie niezbędne programy podając + poleceniu dnf nazwę grupy. +

+

+ Wraz z dnf pojawiają się takie pojęcia jak + moduł aplikacji oraz strumień aplikacji. + Moduł aplikacji, to podobnie do grupy jest zbiór pakietów, ale + odpowiedzialnych za jedną aplikację. W module zawarte są wszystkie + pakiety odpowiedzialne za działanie aplikacji, poza zależnościami mogą + znajdować się tam także biblioteki, generalnie całe środowisko. Moduły + posiadają swoje strumienie, czyli konkretne wersje pakietów aplikacji, + które dostarczają. W systemie może być zainstalowany tylko jeden + strumień danej aplikacji. Między strumieniami można się przełączać. + będziemy to omawiać pod koniec tego rozdziału. Moduły w + strumieniach posiadają jeszcze profile. Profile są + to zbiory pakietów, programów określanych przez moduł zbudowane z + myślą o przeznaczeniu aplikacji. Na przykład systemy bazodanowe mogą + posiadać pakiety przeznaczone dla serwera oraz dla klienta. Jeśli baza + danych znajduje się na innym serwerze niż aplikacja, która z niej + korzysta, to w systemie aplikacji nie ma sensu instalować wszystkich + pakietów związanych z cała bazą wystarczą pakiety, które będą + udostępniać tylko i wyłącznie możliwość połączenia się z bazą. +

+

+ RHEL w wersji 8 dzieli również repozytorium (bazę pakietów) na dwie + części. Piewsza część BaseOS, zawiera jak sama nazwa + wskazuje pakiety bazowe, które zawierają większość pakietów + niezbędnych do działania systemu operacyjnego. Druga część + AppStream zawiera wszystkie dodatkowe aplikacje. Tego + rodzaju podział został wprowadzony z względu na to, że w momencie + przezprowadzania aktualizacji systemu, aktualizowane było również + zainstalowane na nim oprogramowanie co mogło nie być porządane i + wprowadzać nie potrzebne zamieszanie lub destabilizować cały systemu. +

+

+ Kolejną rzeczą wartą wspomnienia są repozytoria. Nasze systemy, których + używamy do wypróbowywania przykładów oraz do rozwiązywania ćwiczeń, nie + są zarejestrowane na naszych kontach Red Hat. Rejestracja + systemu daje + możliwość aktualizacji pakietów zawartych na płytach oraz instalowania + ich bezpośrednio z sieci. Oprócz repozytoriów firmy Red Hat mamy + rownież inne repozytoria dostępne w sieci. Takie jak na przykład + RPM Fusion. Bez tych repozytoriów korzystanie z + RHEL 9 w + codziennym użyciu na desktopie nie miało by sensu. Przynajmniej w moim + wypadku ;). Konfigurację repozytoriów przeprowadza się zapisując je + w pliku w katalogu /etc/yum.repos.d, w jednym pliku może + znajdować się kilka repozytoriów, sposób organizacji zależy od nas. +

+

+ Na koniec, kilka spraw organizacyjnych. W RHEL 9 poki co + brakuje + modułów. W tym odnośniku znajduje się dowód, że na moduły przyjdzie na + poczekać do wersji 9.1. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/managing_software_with_the_dnf_tool/index#con_modules_assembly_distribution-of-content-in-rhel-9 + Tak więc wszystkie przykłady jakie będę wykonywać w tym rodziale będą + realizowane za pomocą Red Hat Enterprise Linux w wersji 8.6. Po + zarejestrowaniu się możemy pobrać RHEL aż do wersji 8.0. Także możemy + stworzyć środowisko maszyny server1 na podstawie + RHEL 8. +

+

10.1. Konfiguracja repozytorium dnf

+

+ Jak już wspomniałem repozytorium konfigurujemy za pomocą plików + złożonych w katalogu /etc/yum.repos.d. Na początku jednak + musimy dodać płytę do pliku /etc/fstab. Opisywałem ten proces + na początku 9 rozdziału o tutaj. + Dlatego też w przykładach przyjmę iż płyta jest montowana w podkatalogu + /mnt. Jak pamiętamy z poprzedniego rozdziału na płycie + znajdują się dwa katalogi z pakietami: BaseOS/Packages oraz + AppStream/Packages. W konfiguracji podajemy tylko te pierwsze + człony tych ścieżek, ponieważ w niej wskazujemy katalog bazowy. + Konfiguracja każdego z repozytorium wymaga minimum 4 wierszy. Poniższy + przykład przedstawia zawartość pliku konfiguracjynego repozytoriów z + płyty instalacjynej RHEL 8. +

+
+[BaseOS]
+name=BaseOS
+baseurl=file:///mnt/BaseOS
+gpgcheck=0
+
+[AppStream]
+name=AppStream
+baseurl=file:///mnt/AppStream
+gpgcheck=0
+
+

+ W nawiasach kwadratowych znajdują się unikatowe identyfikatory + repozytoriów ([BaseOS]), następnie + dyrektywa name zawiera ich opisy + w przypadku środowisk testowych nie musimy się wysilać z opisami czy + sprawdzać autentyczności pakietów przy użyciu GPG + (gpgcheck=0). Wyłączenie sprawdzania + pakietów usprawni proces ich instalacji, w przeciwym razie za + każdą czynnością opartą o repozytorium otrzymywalibyśmy monit. Istotną + funkcję pełni tym + przypadku dyrektywa baseurl, która + wskazuje na miejsce przechowywania pakietów, tym przypadku jest katalog + zatem protokołem poprzedzającym ścieżkę będzie + file, jak w każdym adresie URL + następuje ://, a następnie + (w tym przypadku) bezwzględna ścieżka do katalogu. +

+

+ Odnośnie egzaminu:
+ Umiejętnośc konfigurowania repozytoriów yum/dnf z + wykorzystaniem URL może być istotna do wykonania pewnych + zadań egzaminacyjnych. Konstruując URL możemy użyć takich + protokołów jak FTP, HTTP czy HTTPS (zapis w URL zawsze małymi + literami) po czym następuje dwukropek z dwoma slashami :// + a następnie adres repozytorium. +

+

+ Po zdefiniowaniu repozytoriów zapisujemy zmiany w pliku. Aby + zweryfikować poprawność konfiguracji wydajemy polecenie, które + odświerza pamięć podręczną pakietów. +

+
+[user@rhel8-vm1 ~]$ sudo dnf makecache
+[sudo] password for user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+This system is not registered with an entitlement server. You can use 
+subscription-manager to register.
+BaseOS                                              1.6 MB/s | 2.7 kB     00:00    
+AppStream                                           2.3 MB/s | 2.8 kB     00:00 
+Metadata cache created.
+
+

+ Metadane zostały załadowane do pamięci podręcznej. Za pomocą poniższego + polecenia możemy wyświetlić informacje na temat zdefiniowanych w naszym + systemie repozytoriów. +

+
+[user@rhel8-vm1 mnt]$ sudo dnf repoinfo -v
+...
+DNF version: 4.7.0
+cachedir: /var/cache/dnf
+Ostatnio sprawdzono ważność metadanych: 0:00:20 temu w dniu nie, 10 lip 2022, 22:51:36.
+Identyfikator repozytorium        : AppStream
+Nazwa repozytorium                : AppStream
+Wersja repozytorium               : 1650471026
+Aktualizacje repozytorium         : śro, 20 kwi 2022, 18:10:27
+Pakiety repozytorium              : 6 609
+Dostępne pakiety repozytorium     : 5 345
+Rozmiar repozytorium              : 8.6 G
+Podstawowy adres URL repozytorium : file:///mnt/AppStream
+Wygaszenie repozytorium           : 172 800 s (ostatnio: nie, 10 lip 2022, 22:51:36)
+Nazwa pliku repozytorium          : /etc/yum.repos.d/local.repo
+
+Identyfikator repozytorium        : BaseOS
+Nazwa repozytorium                : BaseOS
+Wersja repozytorium               : 1650471057
+Aktualizacje repozytorium         : śro, 20 kwi 2022, 18:10:59
+Pakiety repozytorium              : 1 714
+Dostępne pakiety repozytorium     : 1 712
+Rozmiar repozytorium              : 1.3 G
+Podstawowy adres URL repozytorium : file:///mnt/BaseOS
+Wygaszenie repozytorium           : 172 800 s (ostatnio: nie, 10 lip 2022, 22:51:34)
+Nazwa pliku repozytorium          : /etc/yum.repos.d/local.repo
+Razem pakietów: 8 323
+
+

+ Tak zdefiniowanych repozytoriów będziemy używać w przykładach oraz + do rozwiązywania zadań w ćwiczeniach. +

+

10.2. Zarządzanie pojedynczymi pakietami

+

+ Program dnf jest stanie wykonywać identyczne czynności jak + polecenie rpm. Z racji tego, iż skonfigurowaliśmy wcześniej + repozytorium nie musimy podawać żadnych ścieżek wystarczy nazwa + pakietu, a ją możemy poznać wyświetlając listy pakietów. +

+

10.2.1. Listy pakietów

+

+ Z pomocą + poniższego polecenia możemy wyświetlić listę wszystkich pakietów. + Domyślnie lista pakietów jest podzielona na dwie części: zainstalowane + oraz dostępne pakiety. +

+
+[user@rhel8-vm1 ~]$ sudo dnf list
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. 
+You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 9:22:00 temu w dniu nie, 10 lip 2022, 22:51:36.
+Zainstalowane pakiety
+GConf2.x86_64                  3.2.6-22.el8                           @AppStream
+ModemManager.x86_64            1.18.2-1.el8                           @anaconda 
+ModemManager-glib.x86_64       1.18.2-1.el8                           @anaconda 
+NetworkManager.x86_64          1:1.36.0-4.el8                         @anaconda 
+NetworkManager-adsl.x86_64     1:1.36.0-4.el8                         @anaconda 
+NetworkManager-bluetooth.x86_64
+                               1:1.36.0-4.el8                         @anaconda 
+NetworkManager-config-server.noarch
+                               1:1.36.0-4.el8                         @anaconda 
+NetworkManager-libnm.x86_64    1:1.36.0-4.el8                         @anaconda 
+NetworkManager-team.x86_64     1:1.36.0-4.el8                         @anaconda 
+NetworkManager-tui.x86_64      1:1.36.0-4.el8                         @anaconda 
+NetworkManager-wifi.x86_64     1:1.36.0-4.el8                         @anaconda 
+NetworkManager-wwan.x86_64     1:1.36.0-4.el8                         @anaconda
+...
+Dostępne pakiety
+CUnit.i686                     2.1.3-17.el8                           AppStream 
+CUnit.x86_64                   2.1.3-17.el8                           AppStream 
+GConf2.i686                    3.2.6-22.el8                           AppStream 
+HdrHistogram.noarch            2.1.11-3.module+el8.5.0+12798+cbad756b AppStream 
+HdrHistogram-javadoc.noarch    2.1.11-3.module+el8.5.0+12798+cbad756b AppStream 
+HdrHistogram_c.i686            0.9.13-2.el8                           AppStream 
+HdrHistogram_c.x86_64          0.9.13-2.el8                           AppStream 
+Judy.x86_64                    1.0.5-18.module+el8+2765+cfa4f87b      AppStream 
+LibRaw.i686                    0.19.5-3.el8                           AppStream 
+LibRaw.x86_64                  0.19.5-3.el8                           AppStream 
+ModemManager-glib.i686         1.18.2-1.el8                           BaseOS    
+NetworkManager-cloud-setup.x86_64
+                               1:1.36.0-4.el8                         AppStream 
+NetworkManager-config-connectivity-redhat.noarch
+                               1:1.36.0-4.el8                         BaseOS    
+NetworkManager-dispatcher-routing-rules.noarch
+
+

+ Ilość wyświetlonych pakietów możemy zmniejszyć za pomocą odpowiednich + opcji, wyświetlając tylko listę pakietów zainstalowanych + (--installed) lub listę pakietów dostępnych + (--available). +

+
+[user@rhel8-vm1 ~]$ sudo dnf list --installed
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. 
+You can use subscription-manager to register.
+
+Zainstalowane pakiety
+GConf2.x86_64                              3.2.6-22.el8               @AppStream
+ModemManager.x86_64                        1.18.2-1.el8               @anaconda 
+ModemManager-glib.x86_64                   1.18.2-1.el8               @anaconda 
+NetworkManager.x86_64                      1:1.36.0-4.el8             @anaconda 
+NetworkManager-adsl.x86_64                 1:1.36.0-4.el8             @anaconda 
+NetworkManager-bluetooth.x86_64            1:1.36.0-4.el8             @anaconda 
+NetworkManager-config-server.noarch        1:1.36.0-4.el8             @anaconda 
+NetworkManager-libnm.x86_64                1:1.36.0-4.el8             @anaconda 
+
+[user@rhel8-vm1 ~]$ sudo dnf list --available
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. 
+You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 9:33:18 temu w dniu nie, 10 lip 2022, 22:51:36.
+Dostępne pakiety
+CUnit.i686                     2.1.3-17.el8                            AppStream
+CUnit.x86_64                   2.1.3-17.el8                            AppStream
+GConf2.i686                    3.2.6-22.el8                            AppStream
+HdrHistogram.noarch            2.1.11-3.module+el8.5.0+12798+cbad756b  AppStream
+HdrHistogram-javadoc.noarch    2.1.11-3.module+el8.5.0+12798+cbad756b  AppStream
+HdrHistogram_c.i686            0.9.13-2.el8                            AppStream
+HdrHistogram_c.x86_64          0.9.13-2.el8                            AppStream
+Judy.x86_64                    1.0.5-18.module+el8+2765+cfa4f87b       AppStream
+LibRaw.i686                    0.19.5-3.el8                            AppStream
+LibRaw.x86_64                  0.19.5-3.el8                            AppStream
+ModemManager-glib.i686         1.18.2-1.el8                            BaseOS   
+
+

+ Listy są podzielone na trzy kolumny w pierwsze z nich znajduje się + nazwa pakietu, w drugie wersja, a w trzeciej nazwa repozytorium, które + zawiera ten pakiet lub z które został on zainstalowany. W przypadku + wartości @anaconda, są to pakiety + zainstalowane podczas instalacji systemu, w przypadku pakietów + instalowanych + za pomocą polecenia rpm w trzeciej kolumnie będzie widnieć + napis @System. +

+

+ Przydatną opcją jeśli korzystamy z repozytoriów sieciowych może być + updates wydawane po podpoleceniu list. W dnf + opcje często posiadają formę podpoleceń, natomiast to co my możemy + uważać za opcję jest modyfikatorem. Podpolecenie updates + wyświetla pakiety możliwe do zaktualizowania. +

+

10.2.2. Zapytania do repozytorium

+

+ Dnf w przeciwieństwie do rpm pozwala nam przeszukiwać + repozytorium pod względem występowania na przykład pakietu lub możemy + podać ścieżkę do pliku znajdującego się w systemie a program zwrócić + nam informacje z jakiego pakietu pochodzi. +

+
+[user@rhel8-vm1 ~]$ sudo dnf repoquery zsh
+[sudo] hasło użytkownika user: 
+
+Ostatnio sprawdzono ważność metadanych: 0:03:42 temu w dniu pon, 11 lip 2022, 08:36:18.
+zsh-0:5.5.1-9.el8.x86_64
+
+[user@rhel8-vm1 ~]$ sudo dnf repoquery /etc/bashrc
+Ostatnio sprawdzono ważność metadanych: 0:04:02 temu w dniu pon, 11 lip 2022, 08:36:18.
+setup-0:2.12.2-6.el8.noarch
+
+

+ Podpolecenie repoquery pozwala na sprecyzowanie repozytorium, + do którego będą kierowane zapytania, za pomocą opcji --repo. +

+
+[user@rhel8-vm1 ~]$ sudo dnf repoquery --repo BaseOS zsh
+Ostatnio sprawdzono ważność metadanych: 0:16:51 temu w dniu pon, 11 lip 2022, 08:36:18.
+zsh-0:5.5.1-9.el8.x86_64
+
+

+ Podpolecenie repoquery posiada całą masę modyfikatorów dzięki + nim możemy na przykład sprawdzić zależności pakietów. Aby ujawnić + listę modyfikatorów możemy użyć podpolecenia repoquery wraz z + --help. +

+
+[user@rhel8-vm1 ~]$ sudo dnf repoquery --help
+Repoquery command-specific options:
+  -a, --all             Odpytuje wszystkie pakiety (skrót do „repoquery '*'”
+                        lub repoquery bez parametru)
+  --show-duplicates     Odpytuje wszystkie wersje pakietów (domyślnie)
+  --arch [arch], --archlist [arch]
+                        wyświetla tylko wyniki dla tej ARCHITEKTURY
+  -f FILE [FILE ...], --file FILE [FILE ...]
+                        wyświetla tylko wyniki posiadające PLIK
+...
+
+

10.2.3. Pobieranie informacji o pakietach

+

+ Polecenie dnf pozwala uzyskać informacje na temat pakietu. + Za pomocą podpolecenia info możemy pobrać informacje o + na przykład wersji, numerze wydania, rozmiarze czy repozytorium w + jakim jest przechowywane. +

+
+[user@rhel8-vm1 ~]$ sudo dnf info php
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 0:40:02 temu w dniu pon, 11 lip 2022, 08:36:18.
+Dostępne pakiety
+Nazwa        : php
+Wersja       : 7.2.24
+Wydanie      : 1.module+el8.2.0+4601+7c76a223
+Architektura : x86_64
+Rozmiar      : 1.5 M
+Źródło       : php-7.2.24-1.module+el8.2.0+4601+7c76a223.src.rpm
+Repozytorium : AppStream
+Podsumowanie : PHP scripting language for creating dynamic web sites
+Adres URL    : http://www.php.net/
+Licencja     : PHP and Zend and BSD and MIT and ASL 1.0
+Opis         : PHP is an HTML-embedded scripting language. PHP attempts to make
+             : it easy for developers to write dynamically generated web pages.
+             : PHP also offers built-in database integration for several
+             : commercial and non-commercial database management systems, so
+             : writing a database-enabled webpage with PHP is fairly simple. The
+             : most common use of PHP coding is probably as a replacement for
+             : CGI scripts.
+             : 
+             : The php package contains the module (often referred to as
+             : mod_php) which adds support for the PHP language to Apache HTTP
+             : Server.
+
+

+ Teraz kiedy wiemy jak możemy uzyskać informacje na temat interesujących + nas pakietów możemy przejść do podstawowych czynności z nimi + związanych, czyli: instalacji, aktualizacji oraz usuwania. +

+

10.2.4. Instalacja pakietów

+

+ Instalacja pakietów jest banalnie prosta w przypadku narzędzia dnf + wymaga ona użycia podpolecenia install a następnie + podania nazwy pakietu. +

+
+[user@rhel8-vm1 ~]$ sudo dnf install mc
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:07:02 temu w dniu pon, 11 lip 2022, 08:36:18.
+Rozwiązano zależności.
+================================================================================
+ Pakiet      Architektura    Wersja                    Repozytorium       Rozm.
+================================================================================
+Instalowanie:
+ mc          x86_64          1:4.8.19-9.el8            AppStream          1.9 M
+
+Podsumowanie transakcji
+================================================================================
+Instalacja  1 pakiet
+
+Całkowity rozmiar: 1.9 M
+Rozmiar po zainstalowaniu: 6.8 M
+W porządku? [t/N]: 
+...
+
+

+ Program wyświetli w tabeli wszystkie instalowane pakiety, + następnie całkowity rozmiar pobieranych pakietów + oraz ilość miejsca na dysku zabranego na potrzeby instalacji. + Po zapoznaniu + się z tym możemy potwierdzić za pomocą t (w polskiej wersji + językowej) lub y lub przerwać na przykład naciskając Enter, + ponieważ opcja N (nie, no) jest domyślna. Po + zatwierdzeniu pakietów rozpocznie się ich pobieranie oraz instalacja. +

+
+...
+Pobieranie pakietów:
+Wykonywanie sprawdzania transakcji
+Pomyślnie ukończono sprawdzanie transakcji.
+Wykonywanie testu transakcji
+Pomyślnie ukończono test transakcji.
+Wykonywanie transakcji
+  Przygotowywanie                :                                          1/1 
+  Instalowanie                   : mc-1:4.8.19-9.el8.x86_64                 1/1 
+  Wykonywanie skryptu            : mc-1:4.8.19-9.el8.x86_64                 1/1 
+  Sprawdzanie                    : mc-1:4.8.19-9.el8.x86_64                 1/1 
+Installed products updated.
+
+Zainstalowano:
+  mc-1:4.8.19-9.el8.x86_64                                                      
+
+Ukończono.
+
+
+[user@rhel8-vm1 ~]$ sudo dnf list --installed mc
+[sudo] hasło użytkownika user: 
+
+Zainstalowane pakiety
+mc.x86_64                       1:4.8.19-9.el8                        @AppStream
+
+

+ Dnf daje nam możliwość przeprowadzanie lokalnej instalacji + podając ścieżkę do pliku .rpm. Ta czynność wymaga użycia + podpolecenia localinstall. +

+
+[user@rhel8-vm1 ~]$ sudo dnf localinstall /mnt/AppStream/Packages/dcraw-9.27.0-9.el8.x86_64.rpm 
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:23:58 temu w dniu pon, 11 lip 2022, 08:36:18.
+Rozwiązano zależności.
+================================================================================
+ Pakiet        Architektura   Wersja                 Repozytorium         Rozm.
+================================================================================
+Instalowanie:
+ dcraw         x86_64         9.27.0-9.el8           @commandline         267 k
+
+Podsumowanie transakcji
+================================================================================
+Instalacja  1 pakiet
+
+Całkowity rozmiar: 267 k
+Rozmiar po zainstalowaniu: 548 k
+W porządku? [t/N]: t 
+Pobieranie pakietów:
+Wykonywanie sprawdzania transakcji
+Pomyślnie ukończono sprawdzanie transakcji.
+Wykonywanie testu transakcji
+Pomyślnie ukończono test transakcji.
+Wykonywanie transakcji
+  Przygotowywanie                :                                          1/1 
+  Instalowanie                   : dcraw-9.27.0-9.el8.x86_64                1/1 
+  Wykonywanie skryptu            : dcraw-9.27.0-9.el8.x86_64                1/1 
+  Sprawdzanie                    : dcraw-9.27.0-9.el8.x86_64                1/1 
+Installed products updated.
+
+Zainstalowano:
+  dcraw-9.27.0-9.el8.x86_64                                                     
+
+Ukończono.
+
+

10.2.5. Aktualizacje pakietów

+

+ Aktualizacja pakietów za pomocą dnf wymaga użycia podpolecenia + update. Aktualizacje pojedynczych pakietów przeprowadzamy + podając + ich nazwę po podpoleceniu. Ta funkcjonalność wymaga jednak aby pakiet + był już zainstalowany w systemie. Jeśli wydamy to podpolecenie bez + żadnego argumentu polecenie sprawdzi wszystkie zainstalowane pakiety + w systemie, czy występują dla nich jakieś aktualizacje następnie + spyta czy je zainstalować. +

+
+[user@rhel8-vm1 ~]$ sudo dnf update autofs
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:34:19 temu w dniu pon, 11 lip 2022, 08:36:18.
+Pakiet autofs jest dostępny, ale nie jest zainstalowany.
+Brak wyników dla parametru: autofs
+Błąd: Brak pakietów oznaczonych do aktualizacji.
+
+[user@rhel8-vm1 ~]$ sudo dnf update
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:38:26 temu w dniu pon, 11 lip 2022, 08:36:18.
+Rozwiązano zależności.
+Nie ma nic do zrobienia.
+Ukończono.
+
+

10.2.6. Usuwanie pakietów

+

+ Usuwanie pakietów w przypadku dnf wymaga użycia podpolecenia + remove. Polecenie usunie zainstalowany pakiet z systemu wraz + ze wszystkimi jego plikami. +

+
+[user@rhel8-vm1 ~]$ sudo dnf remove mc
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Rozwiązano zależności.
+================================================================================
+ Pakiet      Architektura    Wersja                   Repozytorium        Rozm.
+================================================================================
+Usuwanie:
+ mc          x86_64          1:4.8.19-9.el8           @AppStream          6.8 M
+
+Podsumowanie transakcji
+================================================================================
+Usunięcie  1 pakiet
+
+Zwolnione miejsce: 6.8 M
+W porządku? [t/N]: t
+Wykonywanie sprawdzania transakcji
+Pomyślnie ukończono sprawdzanie transakcji.
+Wykonywanie testu transakcji
+Pomyślnie ukończono test transakcji.
+Wykonywanie transakcji
+  Przygotowywanie                :                                          1/1 
+  Usuwanie                       : mc-1:4.8.19-9.el8.x86_64                 1/1 
+  Wykonywanie skryptu            : mc-1:4.8.19-9.el8.x86_64                 1/1 
+  Sprawdzanie                    : mc-1:4.8.19-9.el8.x86_64                 1/1 
+Installed products updated.
+
+Usunięto:
+  mc-1:4.8.19-9.el8.x86_64                                                      
+
+Ukończono.
+
+

+ W przypadku instalowania pakietu polecenie przekazywało nam informacje + o użytym na potrzeby instalacji miejscu na dysku. Tak teraz informuje + o jego zwolnieniu. +

+

10.2.7. Więcej informacji na temat pakietów

+

+ Innym sposobem na uzyskanie informacji o tym jaki pakiet zawiera + określony plik jest użycie podpolecenia provides. Sprawdza + ono występowanie plików w pakietach zainstalowanych w systemie jak + i tych możliwych do instalacji. +

+
+[user@rhel8-vm1 ~]$ sudo dnf provides /etc/passwd
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 2:04:16 temu w dniu pon, 11 lip 2022, 08:36:18.
+setup-2.12.2-6.el8.noarch : A set of system configuration and setup files
+Repozytorium       : @System
+Dopasowano z:
+Nazwa pliku : /etc/passwd
+
+setup-2.12.2-6.el8.noarch : A set of system configuration and setup files
+Repozytorium       : BaseOS
+Dopasowano z:
+Nazwa pliku : /etc/passwd
+
+

+ Po za opisaną metodą na wyszukiwanie informacji o pakietach, do + dyspozycji posiadamy jeszcze podpolecenie search, które + wyszukuje słów kluczowych w podsumowaniu opisu pakietu oraz jego nazwie. +

+
+[user@rhel8-vm1 ~]$ sudo dnf search setup
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 2:20:48 temu w dniu pon, 11 lip 2022, 08:36:18.
+==================== Dopasowano Nazwa i Podsumowanie: setup ====================
+setup.noarch : A set of system configuration and setup files
+cryptsetup-libs.x86_64 : Cryptsetup shared library
+cryptsetup-libs.i686 : Cryptsetup shared library
+ibus-setup.noarch : IBus setup utility
+initial-setup-gui.x86_64 : Graphical user interface for the initial-setup
+                         : utility
+...
+=========================== Dopasowano Nazwa: setup ============================
+NetworkManager-cloud-setup.x86_64 : Automatically configure NetworkManager in
+                                  : cloud
+cryptsetup.x86_64 : A utility for setting up encrypted disks
+cryptsetup-devel.i686 : Headers and libraries for using encrypted file systems
+cryptsetup-devel.x86_64 : Headers and libraries for using encrypted file systems
+cryptsetup-reencrypt.x86_64 : A utility for offline reencryption of LUKS
+                            : encrypted disks.
+...
+======================== Dopasowano Podsumowanie: setup ========================
+rhsm-gtk.x86_64 : GTK+ widgets used by subscription-manager-gui and
+                : initial_setup
+
+

+ Jak możemy zauważyć polecenie wyświetla znalezione informacje w trzech + grupach. +

+

10.3. Grupy pakietów

+

+ Pośród innych sposobów na zarządzanie pakietami możemy wymienić grupy + pakietów. Są to zestawy pakietów odpowiedzialne za zapewnienie + systemowi operacyjnemu pewnej funkcjonalności np. obsługi wirtualizacji + i maszyn wirtualnych. Grupy pakietów obsługuje się identycznie jak + pakiety indywidualne, możemy je wyświetlić, zainstalować, + zaktualizować, wyświetlić informacje o nich oraz usunąć. Przjdziemy + sobie przez te wszystkie zagadnienia. +

+

10.3.1. Listy grup

+

+ Do obsługi grupy służy podpolecenie group, które posiada + kolejne znane nam już z obsługi pojedynczych pakietów podpolecenia + takie jak np list, którego zadaniem jest wyświetlenie grup + pakietów. +

+
+[user@rhel8-vm1 ~]$ sudo dnf group list
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 2:39:54 temu w dniu pon, 11 lip 2022, 08:36:18.
+Dostępne grupy środowisk:
+   Server
+   Minimalna instalacja
+   Workstation
+   Custom Operating System
+   Gospodarz wirtualizacji
+Zainstalowane grupy środowisk:
+   Serwer z graficznym interfejsem użytkownika
+Zainstalowane grupy:
+   Container Management
+   Headless Management
+Dostępne grupy:
+   Zgodność z przestarzałym systemem UNIX
+   Narzędzia programistyczne
+   .NET Core Development
+   Graficzne narzędzia administracyjne
+   Serwery sieciowe
+   RPM Development Tools
+   Obsługa aplikacji naukowych
+   Narzędzia bezpieczeństwa
+   Obsługa smart card
+   Narzędzia systemowe
+
+

+ Jak możemy zawuważyć grupy dzielą się dwa rodzaje pierwszym z nich są + grupy środowisk, drugim są + zwykłe grupy. Z grupami mogliśmy się już spotkać podczas instalacji + systemu, wybieraliśmy rodzaj instalacji Server with GUI. + Podczas wyboru oprogramowania mogliśmy wybrać dowolną z nich do + zainstalowania. Teraz za pomocą dnf możemy doinstalować + dodatkowe grupy lub usunąć nie potrzebne. Podpolecenie list + wyświetla również te obecnie zainstalowane oraz nie wyświetla + wszystkich dostępnych w systemie grup. Wszystkie grupy będą wyświetlone + jeśli uzupełnimy nasze polecenie o modyfikator --hidden. + W ten sposób możemy wybrać znacznie węższą grupę pakietów. Możemy + również używać modyfikatorów takich jak --installed lub + --available +

+

+ Po za taką długą listą możemy wyświetlić podsumowanie, które zwróci + informacje o ilości dostępnych oraz zainstalowanych grup. +

+
+[user@rhel8-vm1 ~]$ sudo dnf group summary
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 3:08:10 temu w dniu pon, 11 lip 2022, 08:36:18.
+Zainstalowane grupy: 2
+Dostępne grupy: 10
+
+

10.3.2. Informacje o grupie

+

+ Za wyświetlenie informacji o grupie odpowiedzialne jest podpolecenie + info, zwraca ono listę pakietów obowiązkowych, które muszą być + zainstalowane, aby system został rozszerzony o funkcjonalność + przypisaną grupie oraz listę pakietów opcjonalnych. +

+
+[user@rhel8-vm1 ~]$ sudo dnf group info "Platforma wirtualizacji"
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 2:58:21 temu w dniu pon, 11 lip 2022, 08:36:18.
+
+Grupa: Platforma wirtualizacji
+ Opis: Dostarcza interfejs do uzyskiwania dostępu i kontrolowania wirtualizowanych gości i kontenerów.
+ Pakiety obowiązkowe:
+   libvirt
+   libvirt-client
+   virt-who
+ Pakiety opcjonalne:
+   fence-virtd-libvirt
+   fence-virtd-multicast
+   fence-virtd-serial
+   perl-Sys-Virt
+
+

10.3.3. Instalacja grup

+

+ Instalacja grup odbywa się na tej samej zasadzie, z drobnym wyjątkiem. + Otóż jeśli w systemie będą występować jakieś składniki grupy, to + jeśli będzie taka możliwość zostaną one zaktualizowane. Instalacja + grupy odbywa się za pomocą podpolecenia install podpolecenia + group. Jako argument podajemy nazwę grupy. +

+
+[user@rhel8-vm1 ~]$ sudo dnf group install "Obsługa smart card"
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 3:37:36 temu w dniu pon, 11 lip 2022, 08:36:18.
+Rozwiązano zależności.
+================================================================================
+ Pakiet               Architektura Wersja                 Repozytorium    Rozm.
+================================================================================
+Instalowanie pakietów grupy/modułu:
+ esc                  x86_64       1.1.2-22.el8_4         AppStream       180 k
+ pcsc-lite-ccid       x86_64       1.4.29-5.1.el8_4       BaseOS          316 k
+Instalowanie zależności:
+ opensc               x86_64       0.20.0-4.el8           BaseOS          1.3 M
+ pcsc-lite            x86_64       1.9.5-1.el8            BaseOS          110 k
+ pcsc-lite-libs       x86_64       1.9.5-1.el8            BaseOS           43 k
+Instalowanie grup:
+ Smart Card Support                                                            
+
+Podsumowanie transakcji
+================================================================================
+Instalacja  5 pakietów
+
+Całkowity rozmiar: 1.9 M
+Rozmiar po zainstalowaniu: 6.0 M
+W porządku? [t/N]: t
+Pobieranie pakietów:
+Wykonywanie sprawdzania transakcji
+Pomyślnie ukończono sprawdzanie transakcji.
+Wykonywanie testu transakcji
+Pomyślnie ukończono test transakcji.
+Wykonywanie transakcji
+  Przygotowywanie                :                                          1/1 
+  Instalowanie                   : pcsc-lite-libs-1.9.5-1.el8.x86_64        1/5 
+  Wykonywanie skryptu            : pcsc-lite-libs-1.9.5-1.el8.x86_64        1/5 
+  Instalowanie                   : pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   2/5 
+  Wykonywanie skryptu            : pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   2/5 
+  Instalowanie                   : pcsc-lite-1.9.5-1.el8.x86_64             3/5 
+  Wykonywanie skryptu            : pcsc-lite-1.9.5-1.el8.x86_64             3/5 
+  Instalowanie                   : opensc-0.20.0-4.el8.x86_64               4/5 
+  Wykonywanie skryptu            : opensc-0.20.0-4.el8.x86_64               4/5 
+  Instalowanie                   : esc-1.1.2-22.el8_4.x86_64                5/5 
+  Wykonywanie skryptu            : esc-1.1.2-22.el8_4.x86_64                5/5 
+  Sprawdzanie                    : opensc-0.20.0-4.el8.x86_64               1/5 
+  Sprawdzanie                    : pcsc-lite-1.9.5-1.el8.x86_64             2/5 
+  Sprawdzanie                    : pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   3/5 
+  Sprawdzanie                    : pcsc-lite-libs-1.9.5-1.el8.x86_64        4/5 
+  Sprawdzanie                    : esc-1.1.2-22.el8_4.x86_64                5/5 
+Installed products updated.
+
+Zainstalowano:
+  esc-1.1.2-22.el8_4.x86_64            opensc-0.20.0-4.el8.x86_64               
+  pcsc-lite-1.9.5-1.el8.x86_64         pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   
+  pcsc-lite-libs-1.9.5-1.el8.x86_64   
+
+Ukończono.
+
+

+ Za pomocą dnf zainstalowałem w grupę pakietów + odpowiedzialną za obsługę kart inteligentych. +

+

10.3.4. Aktualizacja grupy

+

+ Aktualizacja grupy różni się podaniem innego podpolecenia. Zamiast + install podajemy update. +

+
+[user@rhel8-vm1 ~]$ sudo dnf group update "Obsługa smart card"
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 3:47:16 temu w dniu pon, 11 lip 2022, 08:36:18.
+Rozwiązano zależności.
+================================================================================
+ Pakiet            Architektura     Wersja              Repozytorium      Rozm.
+================================================================================
+Aktualizowanie grup:
+ Smart Card Support
+                                                                               
+
+Podsumowanie transakcji
+================================================================================
+
+W porządku? [t/N]: t
+Ukończono.
+
+

10.3.5. Usuwanie grupy

+

+ Tak samo jak w przypadku pojedynczych pakietów, możemy usunąć i grupy. + Do usunięcia grupy potrzebne będzie podpolecenie remove oraz + nazwa grupy. +

+
+[user@rhel8-vm1 ~]$ sudo dnf group remove "Obsługa smart card"
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Rozwiązano zależności.
+================================================================================
+ Pakiet              Arch.       Wersja                   Repozytorium    Rozm.
+================================================================================
+Usuwanie:
+ esc                 x86_64      1.1.2-22.el8_4           @AppStream      516 k
+ pcsc-lite-ccid      x86_64      1.4.29-5.1.el8_4         @BaseOS         1.4 M
+Usuwanie nieużywanych zależności:
+ opensc              x86_64      0.20.0-4.el8             @BaseOS         3.8 M
+ pcsc-lite           x86_64      1.9.5-1.el8              @BaseOS         218 k
+ pcsc-lite-libs      x86_64      1.9.5-1.el8              @BaseOS          50 k
+Usuwanie grup:
+ Smart Card Support                                                            
+
+Podsumowanie transakcji
+================================================================================
+Usunięcie  5 pakietów
+
+Zwolnione miejsce: 6.0 M
+W porządku? [t/N]: t
+Wykonywanie sprawdzania transakcji
+Pomyślnie ukończono sprawdzanie transakcji.
+Wykonywanie testu transakcji
+Pomyślnie ukończono test transakcji.
+Wykonywanie transakcji
+  Przygotowywanie                :                                          1/1 
+  Wykonywanie skryptu            : esc-1.1.2-22.el8_4.x86_64                1/1 
+  Usuwanie                       : esc-1.1.2-22.el8_4.x86_64                1/5 
+  Usuwanie                       : opensc-0.20.0-4.el8.x86_64               2/5 
+  Wykonywanie skryptu            : opensc-0.20.0-4.el8.x86_64               2/5 
+  Wykonywanie skryptu            : pcsc-lite-1.9.5-1.el8.x86_64             3/5 
+  Usuwanie                       : pcsc-lite-1.9.5-1.el8.x86_64             3/5 
+  Wykonywanie skryptu            : pcsc-lite-1.9.5-1.el8.x86_64             3/5 
+  Usuwanie                       : pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   4/5 
+  Wykonywanie skryptu            : pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   4/5 
+  Usuwanie                       : pcsc-lite-libs-1.9.5-1.el8.x86_64        5/5 
+  Wykonywanie skryptu            : pcsc-lite-libs-1.9.5-1.el8.x86_64        5/5 
+  Sprawdzanie                    : esc-1.1.2-22.el8_4.x86_64                1/5 
+  Sprawdzanie                    : opensc-0.20.0-4.el8.x86_64               2/5 
+  Sprawdzanie                    : pcsc-lite-1.9.5-1.el8.x86_64             3/5 
+  Sprawdzanie                    : pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   4/5 
+  Sprawdzanie                    : pcsc-lite-libs-1.9.5-1.el8.x86_64        5/5 
+Installed products updated.
+
+Usunięto:
+  esc-1.1.2-22.el8_4.x86_64            opensc-0.20.0-4.el8.x86_64               
+  pcsc-lite-1.9.5-1.el8.x86_64         pcsc-lite-ccid-1.4.29-5.1.el8_4.x86_64   
+  pcsc-lite-libs-1.9.5-1.el8.x86_64   
+
+Ukończono.
+
+

+ Po wykonaniu tej czynności grupa została usunięta z systemu. +

+

10.4. Zarządzanie modułami pakietów

+

+ Moduły to bardziej rozległe pakiety zawierające nie tylko samą + aplikacje ale także jej całe środowisko do działania. Moduły + posiadają strumienie, które są odrębnym zestawem pakietów przygotowanym + z myslą o konkretnej wersji dostarczanego przez moduł programu. Każdy + z modułów posiada jeszcze profil, który określa podzbiór pakietów + przygotowany z myślą o przeznaczeniu aplikacji. Aby skorzystać z pewnej + jej funkcji nie trzeba instalować gigabajtów pakietów. Do obsługi + modułów wykorzystuje się podpolecenie module, a pracę + z nimi rozpoczeniemy od wyświetlenia listy modułów. +

+

10.4.1. Wyświetlanie modułów

+

+ Do wyświetlania list modułów służy podpolecenie list. Na + poniższym przykładzie znajduje się fragment listy dostępnych w lokalnym + repozytorium modułów. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module list
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 0:12:51 temu w dniu pon, 11 lip 2022, 12:31:38.
+AppStream
+Name                 Stream          Profiles Summary                                      
+389-ds               1.4                      389 Directory Server (base)                  
+ant                  1.10 [d]        common [d] Java build tool                              
+container-tools      rhel8 [d][e]    common [d] Most recent (rolling) versions of podman, bui
+                                                ldah, skopeo, runc, conmon, runc, conmon, CRI
+                                                U, Udica, etc as well as dependencies such as
+                                                container-selinux built and tested together,
+                                                and updated as frequently as every 12 weeks.
+...
+
+

+ Modułów dostępnych w systemie jest kilkadziesiąt. Wyświetlenie listy + nie posiada zbyt poręcznego formatu, aby zmieszczać pełny listing tego + polecenia. Tak jak w przypadku pozostałych elementów, możemy podać + podpoleceniu list argument w postaci ogólnej nazwy np. + php. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module list php
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 0:17:20 temu w dniu pon, 11 lip 2022, 12:31:38.
+AppStream
+Name         Stream         Profiles                          Summary                      
+php          7.2 [d]        common [d], devel, minimal        PHP scripting language       
+php          7.3            common [d], devel, minimal        PHP scripting language       
+php          7.4            common [d], devel, minimal        PHP scripting language       
+php          8.0            common [d], devel, minimal        PHP scripting language       
+
+Wskazówka: [d]omyślne, [e]włączone, [x]wyłączone, [i]zainstalowane
+
+

+ Jak możemy zauważyć na powyższym przykładzie do dyspozycji mamy kilka + strumieni. Domyślnym strumieniem jest + 7.2, a domyślnym profilem dla tych + strumieni jest common. Domyślny + strumień oraz profil zostanie wybrany w momencie gdy nie sprecyzujemy + tego podczas instalacji. W ostatniej linii znajduje się legenda, litery + w nawiasach kwadartowych zdradzają stan modułu zainstalowanego w + systemie. Za pomocą modyfikatora --enabled możemy wyświetlić + wszystkie włączone strumienie modułów. +

+

10.4.2. Informacje na temat modułu

+

+ Za pomocą podpolecenia info możemy wyświetlić na przykład + jakie pakiety zawiera moduł. Podczas wyświetlania tego typu informacji + warto podać interesujący nas strumień, aby zmniejszyć ilość + generowanych danych. Strumień podajemy wraz z nazwą modułu oddzielając + go dwukropkiem. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module info php:7.2
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 0:47:02 temu w dniu pon, 11 lip 2022, 12:31:38.
+Name             : php
+Stream           : 7.2 [d][a]
+Version          : 8020020191108065827
+Context          : 2c7ca891
+Architecture     : x86_64
+Profiles         : common [d], devel, minimal
+Default profiles : common
+Repo             : AppStream
+Summary          : PHP scripting language
+Description      : php 7.2 module
+Requires         : httpd:[2.4]
+                 : nginx:[]
+                 : platform:[el8]
+Artifacts        : apcu-panel-0:5.1.12-2.module+el8.1.0+3202+af5476b9.noarch
+                 : libzip-0:1.5.1-2.module+el8.1.0+3202+af5476b9.src
+                 : libzip-0:1.5.1-2.module+el8.1.0+3202+af5476b9.x86_64
+                 : libzip-debuginfo-0:1.5.1-2.module+el8.1.0+3202+af5476b9.x86_64
+                 : libzip-debugsource-0:1.5.1-2.module+el8.1.0+3202+af5476b9.x86_64
+                 : libzip-devel-0:1.5.1-2.module+el8.1.0+3202+af5476b9.x86_64
+                 : libzip-tools-0:1.5.1-2.module+el8.1.0+3202+af5476b9.x86_64
+                 : libzip-tools-debuginfo-0:1.5.1-2.module+el8.1.0+3202+af5476b9.x86_64
+                 : php-0:7.2.24-1.module+el8.2.0+4601+7c76a223.src
+                 : php-0:7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64
+                 : php-bcmath-0:7.2.24-1.module+el8.2.0+4601+7c76a223.x86_64
+...
+
+

+ Lista pakietów występuje w wierszu + Artifacts. +

+

10.4.3. Instalacja modułów

+

+ Instalacja modułów wygląda podobnie do instalacji takich elementów jak + grupy czy pojedyncze pakiety, używamy podpolecenia install + podpolecenia przeznaczonego do obsługi tego elementu. Podając moduł + możemy równocześnie wybrać zarówno strumień jak i profil korzystając + ze składni: moduł:strumień/profil. + Dla przykładu zainstaluje moduł języka perl w domyślnym + strumieniu oraz domyślnym profilu. Nie będe zmieszczał tutaj + informacji zwracanej przez polecenie, ponieważ jest to moduł, który + zawiera ponad 100 pakietów. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module install perl
+
+

+ Za pomocą podpolecenia list sprawdzimy jak wygląda na liście + zainstalowany przed chwilą w systemie moduł. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module list perl
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:17:20 temu w dniu pon, 11 lip 2022, 12:31:38.
+AppStream
+Name    Stream         Profiles                  Summary                                   
+perl    5.24           common [d], minimal       Practical Extraction and Report Language  
+perl    5.26 [d][e]    common [d] [i], minimal   Practical Extraction and Report Language  
+perl    5.30           common [d], minimal       Practical Extraction and Report Language  
+perl    5.32           common [d], minimal       Practical Extraction and Report Language  
+
+Wskazówka: [d]omyślne, [e]włączone, [x]wyłączone, [i]zainstalowane
+
+

+ Na powyższym przykładzie możemy zobaczyć, że po zainstalowaniu + modułu perl z domyślnym strumieniem oraz domyślnym profilem. + Strumień 5.26 został włączony a + profil common został zainstalowany. + Warto też dodać, że jeśli jakiś z komponentów był już zainstalowany to + podczas instalacji modułu zostanie sprawdzony czy nie wymaga + aktualizacji. +

+

10.4.4. Aktualizacja modułu

+

+ Aktualizacji modułu, dokonuje tak samo jak aktualizacji grupy czy + pojedynczego pakietu za pomocą podpolecenia update, tylko, że + tym przypadku będzie to podpolecenie podpolecenia module. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module update perl -y
+
+

+ W tym przypadku użyłem flagi -y, która + automatycznie potwierdza wykonanie czynności. Dnf nie będzie + nas o nic pytać. +

+

10.4.5. Usuwanie modułu

+

+ Usuwanie modułów wymaga już dwóch czynności piersza klasyczna + wykonywana również na innych elementach. Drugą czynnością jest + przywrócenie modułu wykonywane za pomocą podpolecenia reset. + Usuniemy teraz moduł perl. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module remove perl -y
+
+

+ Wydałem powyższe polecenie a następnie sprawdziłem jak wygląda lista + stumieni modułu perl za pomocą poniższego polecenia. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module list perl
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:54:15 temu w dniu pon, 11 lip 2022, 12:31:38.
+AppStream
+Name     Stream          Profiles               Summary                                    
+perl     5.24            common [d], minimal    Practical Extraction and Report Language   
+perl     5.26 [d][e]     common [d], minimal    Practical Extraction and Report Language   
+perl     5.30            common [d], minimal    Practical Extraction and Report Language   
+perl     5.32            common [d], minimal    Practical Extraction and Report Language   
+
+Wskazówka: [d]omyślne, [e]włączone, [x]wyłączone, [i]zainstalowane
+
+

+ Jak widzimy ten strumień jest nadal włączony mimo, iż domyślny profil + został odinstalowany. Dlatego też musimy przywrócić moduł. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module reset perl -y
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:58:36 temu w dniu pon, 11 lip 2022, 12:31:38.
+Rozwiązano zależności.
+===========================================================================================
+ Pakiet               Architektura        Wersja                Repozytorium         Rozm.
+===========================================================================================
+Przywracanie modułów:
+ perl                                                                                     
+
+Podsumowanie transakcji
+===========================================================================================
+
+Ukończono.
+
+[user@rhel8-vm1 ~]$ sudo dnf module list perl:5.26
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:59:21 temu w dniu pon, 11 lip 2022, 12:31:38.
+AppStream
+Name      Stream       Profiles                Summary                                     
+perl      5.26 [d]     common [d], minimal     Practical Extraction and Report Language    
+
+Wskazówka: [d]omyślne, [e]włączone, [x]wyłączone, [i]zainstalowane
+
+

+ Na powyższym przykładzie przywróciłem moduł i sprawdziłem jak wygląda + jego status w systemie. Teraz strumień nie jest włączony. +

+

10.4.6. Przełączanie się miedzy strumieniami

+

+ Załóżmy taką sytuacje, że musimy zmień wersję php na serwerze + z najnowszej (8.0) na niższą. Aby to zrobić musimy przełączyć się + między strumieniami. Niestety nie ma lepszej metody niż ta opisana + tutaj. +

+

+ Na początku musimy przeprowadzić klasyczne usunięcie modułu, tak jak + we wcześniejszym podrozdziale, ale na początku wyświetlimy sobie listę + modułów php. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module list php
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 2:26:58 temu w dniu pon, 11 lip 2022, 12:31:38.
+AppStream
+Name        Stream        Profiles                             Summary                     
+php         7.2 [d]       common [d], devel, minimal           PHP scripting language      
+php         7.3           common [d], devel, minimal           PHP scripting language      
+php         7.4           common [d], devel, minimal           PHP scripting language      
+php         8.0 [e]       common [d] [i], devel, minimal       PHP scripting language      
+
+Wskazówka: [d]omyślne, [e]włączone, [x]wyłączone, [i]zainstalowane
+
+[user@rhel8-vm1 ~]$ sudo dnf module remove php:8.0 -y
+[user@rhel8-vm1 ~]$ sudo dnf module reset php:8.0
+
+

+ Następnie instalujemy nowy strumień modułu z dodatkową opcją + pozwalającą na usunięcie pakietów, aby rozwiązać zależności. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module install php:7.4 --allowerasing -y
+
+

+ Przełączenie gotowe. Teraz możemy to zweryfikować. Wyświetlając jeszcze + raz listę modułów. +

+
+[user@rhel8-vm1 ~]$ sudo dnf module list php
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 2:30:25 temu w dniu pon, 11 lip 2022, 12:31:38.
+AppStream
+Name        Stream        Profiles                             Summary                     
+php         7.2 [d]       common [d], devel, minimal           PHP scripting language      
+php         7.3           common [d], devel, minimal           PHP scripting language      
+php         7.4 [e]       common [d] [i], devel, minimal       PHP scripting language      
+php         8.0           common [d], devel, minimal           PHP scripting language      
+
+Wskazówka: [d]omyślne, [e]włączone, [x]wyłączone, [i]zainstalowane
+
+

Ćwiczenie 1: Konfiguracja dostępu do repozytorium

+

+ Na maszynie server1 z RHEL 9 skonfiguruj + dostęp do lokalnego repozytorium wykorzystując do tego płyte/obraz + płyty z RHEL 9. Plik nazwij local.repo. Uwaga, repozytorium + musi być dostępne odrazu po ponownym uruchomioniu maszyny. +

+

Ćwiczenie 2: Instalacja i zarządzanie pojedynczymi pakietami

+

+ Na maszynie z RHEL 8 wykorzystując użytkownika z + możliwością podniesienia uprawnień, użyj polecenia dnf do + wyświetlenia oddzielnie pakietów możliwych do instalacji oraz + pakietów zainstalowanych. Wyświetl informacje na temat pakietu + httpd, pokaż jego zależności, następnie zainstaluj go, + potwierdź tę czynność wyświetlając plik dziennika /var/log/dnf.log. + na koniec usuń pakiet. +

+

Ćwiczenie 3: Instalacja i zarządzanie grupami pakietów

+

+ Na maszynie z RHEL 8 wykorzystując użytkownika z + możliwością podniesienia uprawnień, użyj polecenia dnf do + wyświetlenia zainstalowanych i możliwych do zainstalowania grup. + Zainstaluj grupę "Security Tools" i "Scientific Support". Potwierdź to + wyświetlając plik dziennika narzędzia. Pokaż pakiety zawarte w grupie + "Scientific Support", a następnie usuń tę grupę. +

+

Ćwiczenie 4: Instalacja i zarządzanie modułami

+

+ Na maszynie z RHEL 8 wykorzystując użytkownika z + możliwością podniesienia uprawnień, użyj polecenia dnf do + wyświetlenia listy modułów w systemie. Zainstaluj php w domyślnym + strumieniu o profilu rozwojowym. Zweryfikuj instalacje, następnie + usuń moduł. +

+

Ćwiczenie 5: Przełączanie się miedzy strumieniami.

+

+ Na maszynie z RHEL 8 wykorzystując użytkownika z + możliwością podniesienia uprawnień, użyj polecenia dnf do + zainstalowania modułu postgresql, w domyslnym strumieniu i + domyślnym profilu. Następnie dokonaj przełączenia między strumieniami + na starszą wersję o profilu klienta. +

+

Podsumowanie

+

+ Tym rodziałem zakończyliśmy zarządzanie pakietami. Ten rodział + pokazał nam jak zarządzać pakietami za pomocą bardziej zaawansowanego + narzędzia jakim jest dnf. Nauczyliśmy się zarządać + pojednyczymi + pakietami, grupami oraz modułami. W następnym rodziale zajmiemy się + uruchamianiem systemu operacyjnego. +

+

11. Proces ładowania systemu, GRUB oraz jądro

+

+ Proces ładowania systemu następuje w momencie gdy naciskamy przycisk + zasilania komputera. Pierwsza faza - faza oprogramowania układowego + jest niezależna od stosowanego systemu operacyjnego. Jej zadaniem jest + przeprowadzenie tzw. POST-u, czyli sprawdzenia wszystkich komponentów + sprzętowych przed uruchomieniem komputera po to aby nadawał + się on do stablinej pracy. Faza pierwsza przeprowadzana jest przez + oprogramowanie układowe, które może występować dwóch postaciach: + BIOS oraz UEFI. UEFI jest + oprogramowaniem + występującym w wszystkich nowszych komputerach, posiada ono znacznie + większe możliwości niż tradycyjny BIOS. Po teście następuję + poszukiwanie urządzenia pamięci masowej przechowywującego system + operacyjny. Teraz przechodzimy do drugiej fazy rozruchu - fazy + programu ładującego. Program ładujący rezyduje w pierwszym sektorze + dysku jest on odpowiedzialny za odnalezienie jądra na dysku, + rozpakowanie go, załadowanie do pamięci i uruchomienie. Programy + rozruchowe (a przynajmniej te wykorzystywane z dystrybucjami Linuks) + pozwalają użytkownikowi komputera na wybór jądra oraz zmianę domyślnych + parametrów uruchomieniowych. Kiedy jądro jest uruchamiane wówczas + rozpoczyna się start systemu operacyjnego. Zadaniami jądra + w odniesieniu do procesu ładowania jest zainicjowanie wszystkich + urządzeń oraz uruchomienie programu typu init, tym samym + przechodząc do czwartej ostatniej fazy - fazy inicjalizacji w niej + program typu init uruchamia wszystkie usługi, uruchamiajac + tym samym przestrzeń użytkownika, pod koniec tej fazy + użytkownik ma przed sobą gotowy do działania system. Stan systemu + operacyjnego pozwalający na zalogowanie się użytkownika do niego kończy + cały proces uruchamiania. +

+

11.1. Program rozruchowy GRUB

+

+ Dla dystrybucji Linuksa istnieje kilka programów rozruchowych. Tutaj + jednak skupimy sie na jednym z nich, który jest stosowany w RHEL a jest + nim GRUB. Jest on najczęsciej stosowany wśród + wiodących dystrybucji. Styczność z nim mamy już na samym początku + uruchomienia naszego systemu, po jego uruchomieniu wyświetla on menu + zawierające wpisy uruchomieniowe naszego systemu. Poniżej znajduje się + obrazek przedstawiający to menu. +

+

+ tabela-grub-rhel8 +

+

+ Na obrazku możemy zobaczyć dwa wpisy i jeden jest zaznaczony na biało. + Jest on domyślną opcją rozruchową. Jeśli nie dokonamy żadnych zmian + po upływie czasu odmierzanego w ostatniej linii tekstu pod menu, + zaznaczona opcja zostanie automatycznie zatwierdzona i rozpocznie + się uruchamianie systemu. Po menu możemy poruszać się za pomocą + strzałek w górę oraz w dół. +

+

+ Opcje uruchomieniowe kryjące się za wpisami w menu możemy edytować + zaznaczając wybrany wpis, a następnie naciskając klawisz e. + GRUB daje nam możliwość debugowania rozruchu za pomocą + wbudowanej powłoki. Powłokę możemy uruchomić naciskając klawisz + c podczas wyświetlania menu. W powłoce kryje się około 100 + poleceń do wykorzystania. +

+

+ grub-shell-rhel8 +

+

11.1.1. Konfiguracja programu GRUB

+

+ Za wyświetlanie menu odpowiedzialny jest plik konfiguracjyny + grub.cfg znajdujący się w katalogu /boot/grub2. + Jednak plik ten nie nadaje się do modyfikacji, gdyż aktualizacja jądra + nadpisze wszystkie dokonane w nim zmiany, ponieważ jest generowany + automatycznie przez specjalnie przygotowane do tego narzędzie. +

+

+ Zmian w GRUB możemy dokonać edytując inny pliki, taki jak + /etc/default/grub. Na poniższym przykładzie znajduje się jego + zawartość: +

+
+[user@rhel8-vm1 ~]$ nl /etc/default/grub 
+     1	GRUB_TIMEOUT=5
+     2	GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
+     3	GRUB_DEFAULT=saved
+     4	GRUB_DISABLE_SUBMENU=true
+     5	GRUB_TERMINAL_OUTPUT="console"
+     6	GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet"
+     7	GRUB_DISABLE_RECOVERY="true"
+     8	GRUB_ENABLE_BLSCFG=true
+
+

+ Gdzie każda z tych linii oznacza m.in.: +

+
    +
  • GRUB_TIMEOUT=5, określa czas + odliczany do uruchomienia domyślnego wpisu.
  • +
  • GRUB_DISTRIBUTOR, określa nazwę + dystrybucji.
  • +
  • GRUB_DEFAULT, przechowuje + identyfikator domyślnego wpisu. Jeśli posiada wartość + saved, oznacza to, że identyfikator + wpisu zostanie pozyskany za pomocą opcji GRUB_SAVEDEFAULT + lub grub-set-default.
  • +
  • GRUB_DISABLE_SUBMENU=true, wyłącza + stosowanie podmenu w menu główym.
  • +
  • GRUB_TERMINAL_OUTPUT="console", + ustawia wyście terminala programu, w tym przypadku jest to domyślna + konsola.
  • +
  • GRUB_CMDLINE_LINUX="crashkernel=auto + resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root + rd.lvm.lv=rhel/swap rhgb quiet" - opcja przechowuje + argumenty przekazywane jądru Linuksa.
  • +
  • GRUB_DISABLE_RECOVERY="true", + jeśli ta opcja ustawiona jest na true, podczas generowania + menu nie będą generowane automatyczne wpisy GRUB z opcjami + pozwalającymi na uruchomienie systemu w trybie awaryjnym + (Mimo to w RHEL pojawia się taki wpis, więc musi być to + zrealizowane w inny sposób).
  • +
  • GRUB_ENABLE_BLSCFG=true, opcja + pozwala na użycie plików blscfg zamiast klasycznych wpisów + w /boot/grub/grub.cfg.
  • +
+

+ W tym pliku możemy dokonywać zmian, jednak najpierw warto zaponać się + bliżej z GRUB, rozszerzając wiedzę z tego rodziału o np. + dokumentację Red Hat, ostatni wpis jest dość specyficzyny i + używany + w nowszych dystrybucjach klasy enterprise. Jeśli już dokonamy + w nim zmian, zmiany te trzeba zatwierdzić po przez wygenerowanie nowego + pliku grub.cfg a służy do tego polecenie + grub2-mkconfig po opcji -o należy podać + ścieżkę docelową, gdzie polecenie ma zapisać nową konfigurację w + przeciwnym wypadku zwróci ją na standardowe wyjście. +

+
+[user@rhel8-vm1 ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
+[sudo] hasło użytkownika user: 
+Generating grub configuration file ...
+done
+
+

+ Poza plikiem /etc/default/grub, wyżej przedstawione polecenie + wykorzystuje również skrypty pomocnicze znajdujące się w katalogu + /etc/grub.d. Poniżej znajduje się listing jego zawartości: +

+
+[user@rhel8-vm1 ~]$ sudo ls -l /etc/grub.d/
+[sudo] hasło użytkownika user: 
+razem 96
+-rwxr-xr-x. 1 root root  8958 03-28 16:12 00_header
+-rwxr-xr-x. 1 root root  1043 02-09 12:13 00_tuned
+-rwxr-xr-x. 1 root root   232 03-28 16:12 01_users
+-rwxr-xr-x. 1 root root   832 03-28 16:12 08_fallback_counting
+-rwxr-xr-x. 1 root root 14088 03-28 16:12 10_linux
+-rwxr-xr-x. 1 root root   830 03-28 16:12 10_reset_boot_success
+-rwxr-xr-x. 1 root root   889 03-28 16:12 12_menu_auto_hide
+-rwxr-xr-x. 1 root root 11696 03-28 16:12 20_linux_xen
+-rwxr-xr-x. 1 root root  2559 03-28 16:12 20_ppc_terminfo
+-rwxr-xr-x. 1 root root 10670 03-28 16:12 30_os-prober
+-rwxr-xr-x. 1 root root  1412 03-28 16:12 30_uefi-firmware
+-rwxr-xr-x. 1 root root   700 04-01 11:49 35_fwupd
+-rwxr-xr-x. 1 root root   214 03-28 16:12 40_custom
+-rwxr-xr-x. 1 root root   216 03-28 16:12 41_custom
+-rw-r--r--. 1 root root   483 03-28 16:12 README
+
+

+ Plików w tym katalogu jest całkiem sporo. Istotną rzeczą w tych plikach + są liczby na początku nazw. Te liczby prócz znaczeń opisanych w pliku + README okreslają kolejność uruchamiania tych skryptów. + Każdy pliki wykonuje jakąś czynność podczas generowania pliku + konfiguracyjnego, np. 00_header ładuje plik + /etc/default/grub; 10_linux odpowiada za generowanie + wpisów uruchamiających dystrybucje, jednak jak wiemy w RHEL odpowiada + za to inny mechanizm; 30_os-prober odpowiada za poszukiwanie + zainstalowanych na dyskach komputera innych systemów operacyjnych, np. + MS Windows; 40_custom oraz 41_custom pozwalają na + zapisanie swojej konfiguracji. +

+

11.1.2. Ładowanie systemu do określonego trybu

+

+ Edytując wpis ładujący system z poziomu menu GRUB możemy + uruchomić system w trybie ratunkowym, odzyskiwania lub przerwać jego + ładowanie w momencie gdy głównym system plików jest jeszcze + intrd (mały obraz systemu plików ładowany do pamięci przez + jądro aby zapewnić mu dostęp do sterowników dysków, żeby mógł + zamontować właściwy system plików z katalogiem głównym). Za pomocą + takiego uruchomienia systemu możemy zmienić zapomniane hasło + superużytkownika. Aby zapoznać się z tym trybem przywrócimy utracone + hasło root. Do tego ćwiczenia potrzebny będzie RHEL 8, + gdyż w RHEL 9 nie ważne jaki tryb uruchominy, nadal wymagane będzie + hasło aby przejść do powłoki. Zatem jedyną opcją na odzyskanie + dostępu w RHEL 9 jest podmontowanie systemu plików w środowisku + powłoki instalatora. +

+

+ Po uruchomieniu maszyny, podczas wyświetlania menu GRUB + naciskamy e, następnie w linii rozpoczynającej się od + linux dopisujemy na końcu rd.break. + Następnie naciskamy Ctrl+x, aby uruchomić tak zmodyfikowany + wpis. Po uruchomieniu się systemu uzyskamy poniższy znak zachęty: +

+
+switch_root:/#
+
+

+ W tym momencie musimy zmienić katalog główny ramdysku na + katalog główny znajdujący się na dysku. Kernel po odnalezieniu + dysku z katalogiem głównym montuje go w katalogu /sysroot + środowiska ramdysku. Do przełączenia katalogu głównego + posłuży nam polecenie chroot: +

+
+switch_root:/# chroot /sysroot
+
+

+ Po przełączeniu się uzyskamy taki znak zachęty jak ten poniżej. +

+
+sh-4.4#
+
+

+ Z zamontowanym w tym momencie katalogiem głównym jest pewien problem, + otóż na tym etapie uruchomienia systemu jest on zamontowany w trybie + tylko do odczytu, a zmiana hasła wymaga zapisania informacji w + pliku /etc/shadow, dlatego też musimy zamontować katalog + główny tym razem w pełnym dostępie. +

+
+sh-4.4# mount -o remount,rw /
+
+

+ Teraz możemy wydawać polecenie passwd i ustalić nowe hasło dla + superużytkownika. Następnie musimy stworzyć pusty plik w katalogu + głównym o nazwie .autorelabel. Ponieważ SELinux musi + wytworzyć nowe etykiety, jeśli tego nie zrobimy zmiany nie przyniosą + skutku. +

+
+sh-4.4# passwd
+sh-4.4# touch .autorelabel
+
+

+ Po wykonaniu tych czynności możemy opuścić środowisko zmienionego + katalogu a następnie zrestartować maszynę uruchamiając ją już + normalnie. +

+
+sh-4.4# exit
+switch_root:/# reboot
+
+

+ Po uruchomieniu systemu nastąpi nadawanie nowych etykiet, po tym + system może zostać ponownie uruchomiony, kiedy będzie gotowy do pracy + możemy zalować się nowym hasłem na super użytkownika. +

+

+ Odnośnie egzaminu:
+ Musimy wiedzieć jak załadować system do określonego trybu z poziomu + menu GRUB2, aby na przykład móc zmodyfikować plik /etc/fstab, + lub zresetować hasło superużytkownika. +

+

11.2. Jądro systemu Linuks

+

+ Jądro to rdzeń każdej dystrybucji, odpowiada za wiele apektów działania + systemów oraz udostępnia masę funkcji, bez których dystrybucjom ciężko + było by być systemami operacyjnymi. Jedną z takich funkcji jest + zarządzanie urządzeniami. Do komunikacji z nimi jądro potrzebuje + sterowników. Sterownik w odniesieniu do jądra nazywane są modułami + część modułów wymaganych przez jądro może być już w nie wbudowana a + część jest ładowana w razie potrzeby (do tego też służy + initrd). + RHEL 8.6, którego używam również i w tym rozdziale jest + dostarczany + z jądrem 4.18.0-372.9.1.el8.x86_64, tę informację można uzyskać za + pomocą polecenia uname -r. I to jądro + wystarcza dla potrzeb systemu operacyjnego. +

+

+ Warto jednak pamiętać o tym, że rozwój technologiczny komputerów oraz + całej dziedziny informatyki nie stoi w miejscu i jądro Linuks próbuje + za nim nadąrzyć. W związku z tym funkcjonalność jądra również ulega + zmianie, więc jeśli odbiorcy chcą skorzystać z tych zmian muszą + przebudować jądra używane na ich komputerach. Najprostszą i za razem + bezpieczną metodą jest instalacja jednego jądra obok drugiego. + Oczywiście tylko jedno jądro może działać w tym samym czasie. Ta + metoda w względu na przechowywanie dotychczas używanego jądra pozwala + wrócić do niego, gdy nowe jądro okaże się nie odpowiednie dla naszego + środowiska. Rozwój jądra Linuks to nie tylko dokładanie nowych funkcji + ale również usuwanie już niewspieranych technologii, chociaż + dystrybucje mogą działajać na różnym sprzęcie, który może mieć lata + świetności dawno za sobą, stąd też modułowa budowa jądra. Rózwój jądra + nie jest jedym powodem do jego przebudowania, nie które + aplikacje lub systemy bazodanowe mogą wymagać nowszej jego wersji, aby + zapewnić maksimum wydajności. Tym zajmiemy się w tym podrozdziale: + przebudowa jądra. Omówimy sobie również gdzie znajduje się + jądro w systemie. +

+

11.2.1. Pliki jądra w systemie

+

+ Jądro to zwykły program, którego zadaniem jest wykonanie czynności + i zapewnienie funkcji, które przez większość z nas uznałaby za + "systemowe". Jednak to nadal program, więc musi gdzieś w systemie + plików istnieć jego plik. Pliki jądra najczęściej znajdują się w + katalogu /boot. Plik jądra zazwyczaj nazywa się + vmlinuz-*, część po myślniku już zależy od dystrybucji. Obok + pliku jądra w tym samym katalogu znajduje sie również plik + ramdysku. W przypadku RHEL w katalogu /boot znajdują + się podkatalogi: grub - zawierający konfigurację programu + ładującego, loaders - zawierający pliki blscfg + zawierajace wpisy menu programu ładującego oraz katalog efi + przechowujący program ładujący dla komputerów uruchamianych w trybie + UEFI. W tym katalogu znajdują się również pliki pomocnicze jądra takie + jak config-* oraz System.map-*. Gwiazdki + (*) w nazwach plików oznaczczają wersję jądra. Poniżej + znajduje się listing zawartości tego katalogu. +

+
+[user@rhel8-vm1 ~]$ ls -l /boot
+razem 213492
+-rw-r--r--. 1 root root    195982 04-16 04:33 config-4.18.0-372.9.1.el8.x86_64
+drwxr-xr-x. 3 root root        17 07-10 17:27 efi
+drwx------. 4 root root        83 07-14 07:33 grub2
+-rw-------. 1 root root 112548052 07-10 17:50 initramfs-0-rescue-1ad7389b6ff44aac9cfcab2485444bc8.img
+-rw-------. 1 root root  53300132 07-10 17:57 initramfs-4.18.0-372.9.1.el8.x86_64.img
+-rw-------. 1 root root  27283456 07-10 18:00 initramfs-4.18.0-372.9.1.el8.x86_64kdump.img
+drwxr-xr-x. 3 root root        21 07-10 17:42 loader
+lrwxrwxrwx. 1 root root        49 07-10 17:45 symvers-4.18.0-372.9.1.el8.x86_64.gz -> /lib/modules/4.18.0-372.9.1.el8.x86_64/symvers.gz
+-rw-------. 1 root root   4359450 04-16 04:33 System.map-4.18.0-372.9.1.el8.x86_64
+-rwxr-xr-x. 1 root root  10460528 07-10 17:47 vmlinuz-0-rescue-1ad7389b6ff44aac9cfcab2485444bc8
+-rwxr-xr-x. 1 root root  10460528 04-16 04:34 vmlinuz-4.18.0-372.9.1.el8.x86_64
+
+

+ Katalog /boot nie jest jedynym miejscem, w którym znajdują się + pliki jądra. Dynamicznie ładowane modułu znajdują sie w katalogu + /usr/lib/modules. Katalog zawiera cała strukturę katalogową, + w której znajdują sie najróżniejsze moduły z podziałem na wersję jądra + dostępne w systemie. +

+
+[user@rhel8-vm1 ~]$ ls -l /usr/lib/modules
+razem 4
+drwxr-xr-x. 3 root root   19 07-10 17:31 4.18.0-372.2.1.el8.x86_64
+drwxr-xr-x. 6 root root 4096 07-10 17:55 4.18.0-372.9.1.el8.x86_64
+
+

+ W wewnątrz tej struktury znajdują się moduły sterowników: +

+
+[user@rhel8-vm1 ~]$ ls -l /usr/lib/modules/4.18.0-372.9.1.el8.x86_64/kernel/drivers/ | head -25
+razem 48
+drwxr-xr-x.  5 root root  239 07-10 17:30 acpi
+drwxr-xr-x.  2 root root  169 07-10 17:30 ata
+drwxr-xr-x.  3 root root   20 07-10 17:30 base
+drwxr-xr-x.  2 root root   24 07-10 17:30 bcma
+drwxr-xr-x.  3 root root  180 07-10 17:30 block
+drwxr-xr-x.  2 root root  272 07-10 17:30 bluetooth
+drwxr-xr-x.  3 root root   17 07-10 17:30 bus
+drwxr-xr-x.  2 root root   25 07-10 17:30 cdrom
+drwxr-xr-x.  6 root root  192 07-10 17:30 char
+drwxr-xr-x.  2 root root   50 07-10 17:30 counter
+drwxr-xr-x.  2 root root  143 07-10 17:30 cpufreq
+drwxr-xr-x.  2 root root   36 07-10 17:30 cpuidle
+drwxr-xr-x.  6 root root  107 07-10 17:30 crypto
+drwxr-xr-x.  4 root root   54 07-10 17:30 dax
+drwxr-xr-x.  2 root root   23 07-10 17:30 dca
+drwxr-xr-x.  5 root root   60 07-10 17:30 dma
+drwxr-xr-x.  2 root root 4096 07-10 17:30 edac
+drwxr-xr-x.  2 root root  113 07-10 17:30 firewire
+drwxr-xr-x.  2 root root   69 07-10 17:30 firmware
+drwxr-xr-x.  2 root root  107 07-10 17:30 gpio
+drwxr-xr-x.  3 root root   17 07-10 17:30 gpu
+drwxr-xr-x.  5 root root 4096 07-10 17:30 hid
+drwxr-xr-x.  2 root root   74 07-10 17:30 hv
+drwxr-xr-x.  3 root root 4096 07-10 17:30 hwmon
+...
+
+

+ Poza zwykłymi plikami jądra, w systemie istnieje interfejs przez nie + udostępniany, a jest nim katalog /proc. Ten katalog + zawiera masę podkatalogów odpowiadających uruchomionym w systemie + procesom oraz kilkdziesiąt plików pomocniczych. Z tego katalogu + korzystają takie narzędzia jak: ps, top, mem + czy lscpu. Poniżej znajduje się listing podkatalogów procesów: +

+
+[user@rhel8-vm1 ~]$ ls -l /proc | head 
+razem 0
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 1
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 10
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 1000
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 1010
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 1011
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 1015
+dr-xr-xr-x.  9 root           root                         0 07-14 07:29 1017
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 1020
+dr-xr-xr-x.  9 root           root                         0 07-14 07:28 11
+
+

+ Informacje na temat procesora oraz pamięci możemy uzyskać bezpośrednio + od jądra korzystając takich plików jak /proc/cpuinfo oraz + /proc/meminfo. +

+

+ Plik zawierający informacje o procesorze: +

+
+[user@rhel8-vm1 ~]$ cat /proc/cpuinfo 
+processor	: 0
+vendor_id	: GenuineIntel
+cpu family	: 6
+model		: 60
+model name	: Intel Core Processor (Haswell, no TSX)
+stepping	: 1
+microcode	: 0x1
+cpu MHz		: 1696.073
+cache size	: 16384 KB
+physical id	: 0
+siblings	: 1
+core id		: 0
+cpu cores	: 1
+apicid		: 0
+initial apicid	: 0
+fpu		: yes
+fpu_exception	: yes
+cpuid level	: 13
+...
+
+

+ Plik zawierający informacje o pamięci: +

+
+[user@rhel8-vm1 ~]$ cat /proc/meminfo 
+MemTotal:         824024 kB
+MemFree:           92668 kB
+MemAvailable:     285968 kB
+Buffers:              20 kB
+Cached:           284704 kB
+SwapCached:         1628 kB
+Active:           167040 kB
+Inactive:         396240 kB
+...
+
+

11.2.2. Pakiety jądra

+

+ Jądro do dystrybucji dostarczane jest za pomocą zwykłych pakietów + z oprogramowaniem, które mozemy zainstalować z repozytorium. Jądro + rozbite jest na kilka pakietów, których lista oraz opis zawartości + znajdują się poniżej. +

+
    +
  • kernel - Nie zawiera plików, zapewnia jedynie + poprawną instalację innych pakietów jądra.
  • +
  • kernel-core - Zawiera pliki jądra wraz z niewielką + ilością modułów zepewniającą podstawową funkcjonalność.
  • +
  • kernel-devel - Zawiera pliki wspomagające + kompilację modułów.
  • +
  • kernel-modules - Zawiera moduły powszechnie + znanych urządzeń.
  • +
  • kernel-modules-extra - Zawiera moduły dodatkowych, + różnych urządzeń (mniej spotykanych).
  • +
  • kernel-headers - Zawiera pliki wspierające wymianę + informacji pomiędzy jądrem, bibliotekami przestrzeni użytkownika oraz + programami.
  • +
  • kernel-tools - Zawiera narzędzia pozwalające na + kontrolę jądra.
  • +
  • kernel-tools-libs - Zawiera biblioteki + wspomagające działanie narzędzi jądra.
  • +
+

+ Nie wszystkie z tych pakietów muszą występować w systemie, aby jądro + normalnie funkcjonowało, oraz nie wszystkie one są potrzebne do jego + przebudowania. Za pomoca polecenia poniżej możemy sprawdzić jakie + pakiety jądra są zainstalowane w naszym systemie. +

+
+[user@rhel8-vm1 ~]$ rpm -qa | grep 'kernel'
+kernel-tools-libs-4.18.0-372.9.1.el8.x86_64
+kernel-tools-4.18.0-372.9.1.el8.x86_64
+kernel-4.18.0-372.9.1.el8.x86_64
+kernel-core-4.18.0-372.9.1.el8.x86_64
+kernel-modules-4.18.0-372.9.1.el8.x86_64
+
+

+ Te pakiety trzeba będzie pobrać, kiedy bedziemy chcieli przebudować + jądro. Zanim jednak to nastąpi przeanalizujemy wersje jądra aby móc + wybrać to najbardziej odpowiednie. +

+

11.2.3. Wersja jądra

+

+ Wersje jądra możemy sprawdzić za pomocą polecenia + uname -r. Dzieli się ona na kilka + części, które mogą pomóc nam w zidentyfikowaniu nowego jądra + odpowiedniego dla naszego systemu: +

+
+[user@rhel8-vm1 ~]$ uname -r
+4.18.0-372.9.1.el8.x86_64
+
+
    +
  • 4 - Numer główny wersji. Numer + rodziny wersji jądra. Ulega on zmianie gdy następuje wewnątrz jądra + duża zmiana.
  • +
  • 18 - Numer rewizji. Zmiany + zachodące w jądrze są za małe aby utworzyć na nową linię (zmienić + główny numer), jednak są dość znaczące.
  • +
  • 0 - Numer łatki. Łatki poprawiają + błędy oraz zabezpieczenia, mogą również wprowadzać drobne ulepszenia. +
  • +
  • -372.9.1.el8 - sygnatura budowania + jądra przez dystrybucję. Każda główna dystrybucja zajmuje się + samodzielnym budowaniem jądra. Więc w tej części znajduje się + numer buildu przprowadzanego prze dystrybucje. Kiedy + będziemy wybierać jądro dla naszej dystrybucji możemy kierować się + tymi oznaczeniami.
  • +
  • x86_64
  • - nazwa architektury. + W tym przypadku jest AMD64 lub kto woli EM64T. +
+

+ Po za zapoznaniu się z wersją, możemy przejść do przebudowy jądra na + naszych maszynych. +

+

11.2.4. Przebudowa jądra

+

+ Przebudowę jądra rozpoczniemy od ustalenia jego obecnej wersji oraz + wybrania odpowiedniej dla naszych rozwiązań. Z racji tego, iż jest to + tylko przykład wybierzemy kolejny build dystrybucji. +

+
+[user@rhel8-vm1 ~]$ uname -r
+4.18.0-372.9.1.el8.x86_64
+
+

+ W wiec w naszym przypadku najlepiej będzie zainstalować wersje np. + 373 lub inną podobną. Teraz musimy ustalić źródło, skąd + pobierzemy pakiety potrzebne do zainstalowania nowego jądra. Opcje + mamy dwie: strona Red Hat (ponieważ nasze system nie są + zarejestrowane + w sieci Red Hat, musimy pobrać pakiety logując się na stronie + a następnie wybrać z sekcji pobierania odpowiednie pakiety) lub strona + rpmfind.net, która jest wyszukiwarką pakietów wśród wielu + serwerów lustrzanych różnych dystrybucji klasy + enterprise. Skutkiem użycia pakietów ze strony rpmfind + jest to, iż poźniej nasze jądro może widnieć jako np. CentOS w + menu GRUB, więc najlepszym rozwiazaniem jest skorzystanie z + strony Red Hat. Pakiety możemy pobrać na maszynie za pomocą + zainstalowanej przeglądarki lub na komputerze który ją hostuje i + następnie przesłać zbiorcze archiwum za pomocą sftp (patrz: + rozdział 19). + Listę pakietów niezbędnych do zainstalowania nowego jądra możemy + wyświetlić za pomocą polecenia: +

+
+[user@rhel8-vm1 ~]$ rpm -qa | grep 'kernel'
+kernel-tools-libs-4.18.0-372.9.1.el8.x86_64
+kernel-tools-4.18.0-372.9.1.el8.x86_64
+kernel-4.18.0-372.9.1.el8.x86_64
+kernel-core-4.18.0-372.9.1.el8.x86_64
+kernel-modules-4.18.0-372.9.1.el8.x86_64
+
+

+ Na komputerze na którym hostuje maszynę wirtualną pobrałem z strony + Red Hat najnowsze pakiety jądra przeznaczone dla RHEL + 8. Stworzyłem + z nich archiwum nastepnie przesłałem do wcześniej utworzonego + podkatalogu w katalogu /tmp na maszynie z RHEL 8. + Poniżej znajduje się lista pobranych pakietów: +

+
+[user@rhel8-vm1 kernel]$ ls -l 
+razem 97736
+-rw-r--r--. 1 user user  8436304 07-14 10:22 kernel-4.18.0-372.16.1.el8_6.x86_64.rpm
+-rw-r--r--. 1 user user 41240076 07-14 10:22 kernel-core-4.18.0-372.16.1.el8_6.x86_64.rpm
+-rw-r--r--. 1 user user 33296868 07-14 10:22 kernel-modules-4.18.0-372.16.1.el8_6.x86_64.rpm
+-rw-r--r--. 1 user user  8654240 07-14 10:23 kernel-tools-4.18.0-372.16.1.el8_6.x86_64.rpm
+-rw-r--r--. 1 user user  8445172 07-14 10:23 kernel-tools-libs-4.18.0-372.16.1.el8_6.x86_64.rpm
+
+

+ Teraz instalacja jest już banalna, wystarczy użyć polecenia + dnf, a ono wykona wszystkie czynności za nas. +

+
+[user@rhel8-vm1 kernel]$ sudo dnf install kernel-*
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Rozwiązano zależności.
+================================================================================
+ Pakiet               Arch.     Wersja                    Repozytorium    Rozm.
+================================================================================
+Instalowanie:
+ kernel               x86_64    4.18.0-372.16.1.el8_6     @commandline    8.0 M
+Aktualizowanie:
+ kernel-tools         x86_64    4.18.0-372.16.1.el8_6     @commandline    8.3 M
+ kernel-tools-libs    x86_64    4.18.0-372.16.1.el8_6     @commandline    8.1 M
+Instalowanie zależności:
+ kernel-core          x86_64    4.18.0-372.16.1.el8_6     @commandline     39 M
+ kernel-modules       x86_64    4.18.0-372.16.1.el8_6     @commandline     32 M
+
+Podsumowanie transakcji
+================================================================================
+Instalacja    3 pakiety
+Aktualizacja  2 pakiety
+
+Całkowity rozmiar: 95 M
+W porządku? [t/N]: 
+
+

+ Po zatwierdzeniu rozpocznie się instalacja. Po skończonej instalacji + musimy uruchomić ponownie maszynę. W menu GRUB nowe jądro + będzie na pierwszej domyślnej pozycji. Po załadowaniu systemu wersją + jądra używana przez ten system to: +

+
+[user@rhel8-vm1 ~]$ uname -r
+4.18.0-372.16.1.el8_6.x86_64
+
+

+ Jak możemy zauważyć to jądro różni się od porzedniego drobnymi + zmianami wprowadzonymi przez dystrybucję, gdyż zmianie uległ numer + rewizji w numerze buildu. +

+

+ Odnośnie egzaminu:
+ Zawsze należy instalować nowe jądro, a nie aktualizować stare. + Aktualizacja usuwa każde istniejące jądro i zastępuje je nowym w + przypadku problemów po instalacji z nowym jądrem nie będzie możliwości + powrotu do poprzedniego działającego poprawnie jądra. +

+

Ćwiczenie 1: Właczenie komunikatów podczas ładowania systemu

+

+ Jako użytkownik z możlwością podniesienia uprawnień na maszynie + z RHEL 8, usuń wartość + quiet, z opcji GRUB_CMDLINE_LINUX w pliku + /etc/default/grub. Następnie uruchom polecenie + grub2-mkconfig aby wygenerować nowy plik konfiguracyjny + GRUB. Na koniec uruchom ponownie system, aby zobaczyć + komunikaty generowane przez jądro. +

+

Ćwiczenie 2: Przywrócenie hasła superużytkownika

+

+ Na maszynie z RHEL 8, przerwij ładowanie systemu i + zmień hasło superużytkownika. Po ponownym uruchomieniu maszyny zaloguj + się na jego konto i ustaw hasło takie jakie było do tej pory + (chyba, że go nie pamiętasz). +

+

Ćwiczenie 3: Instalacja nowego jądra

+

+ Na maszynie z RHEL 8, jako użytkownik z możliwością + podniesienia uprawnień, sprawdź wersję jądra domyślnie używaną w + w systemie, następnie ustal jakie pakiety jądra są zainstalowane. + Pobierz nowszą wersję jądra z + Red Hat Customer Portal lub rpmfind.net i + przeprowadź instalacje nowego jądra. Po czym zrestartuj system i + sprawdź obecną jego wersję. +

+

Podsumowanie

+

+ W tym rodziale zapoznaliśmy się z procesem ładowania systemu. Poznaliśmy + po krótce każdą z jego faz. Przyjrzeliśmy się bliżej z programowi + ładującemu + GRUB jego plikom konfiguracyjnymi oraz narzędziom z nim + związanym. Nauczyliśmy się uruchamiać system w trybie awaryjnym aby + przywrócić hasło superużytkownika lub poprawić wpisy w pliku + /etc/fstab. Na koniec poruszyliśmy temat jądra, dowiedzieliśmy + sie gdzie znajdują się pliki jądra, jakie pakiety odpowiadają za nie + w systemie oraz nauczyliśmy się poprawnie interpretować jego wersje + jądra aby móc zainstalować nową jego wersję. Następnym rodziale + przyjrzymy się ostatniej fazie rozruchu. +

+

12. Inicjalizacja systemu, pliki dziennika oraz dostarajanie systemu

+

+ W tym rozdziale zajmiemy się czwartą ostatnią fazą uruchamiania systemu + czyli jego inicjalizacją. Dla dystrybucji Linuksa istnieje wiele + programów typu init. Większość z wiodących dystrybucji + używa Systemd (ang. System daemon), jednak wielu + programistów uważa, że systemd jest sprzeczne z filozofią + Uniksa, dlatego też wśród społeczności powstało wiele + rozwidleń, będących odpowiednikami dystrybucji wiodących ale dających + końcowemu użytkownikowi wybór z jakiego (poza systemd) + z programów typu init chce korzystać. W niektórych przypadkach + decyzje podejmujemy sciągając odpowiedni obraz płyty, a w niektórych + wyboru dokonujemy go podczas instalacji. Nie mniej jednak RHEL korzysta + z systemd i to nim się zajmiemy, dlatego też odniesienia jako + programu lub procesu typu init będą odnośić się do systemd. +

+

+ Jak zapewne zdajemy sobie sprawę wiele programów generuje komunikaty + diagnostyczne. Nie które z nich są wyświetlane na naszych terminalach, + inne te których nie widzimy, albo nie są generowane albo są zbierane + przez jednego z demonów systemowych i zapisywane w jednym z systemowych + katalogów. W jednym z nich znajdują się właśnie pliki dziennika. +

+

+ Poza instalacją i konfiguracją oprogramowania, zarządzaniem plikami, + katalogami czy użytkownikami być może będziemy musieli dostoswać nasz + system, aby był bardziej wydajny co może spowodować większy pobór + energii elektrycznej lub będziemy zmuszeni, aby nasz system był + bardziej energooszczędny, to bedziemy mogli zrealizować za pomocą + jednego z demonów, którego będzie trzeba zainstalować. +

+

12.1. Inicjalizacja systemu - systemd

+

+ W większości wiodących dystrybucji, wybiera systemd jak + program typu init dla swoich systemów. Mimo sprzeciwu części + społeczności, to systemd nie jest programem, który jest + pozbawiony zalet. Ma ich bardzo wiele i są one dość istotne. + Systemd jest to program typu init, którego głównymi + zadaniami jest przygotowanie systemu do pracy oraz zarządanie usługami. + W fazie inicjalizacji uruchamiana jest większość usług, które do czasu + wdrożenia systemd uruchamiane są jedna po drugiej co wydłużało + proces uruchamiania systemu. Natomiast nowy program postawił na + współbieżność uruchamiania - wszystkie usługi startują w tym samym + czasie. Systemd może również opóźnić uruchomienie konkretej + usługi kiedy będzie ona rzeczywiście wymaga zaoszczędzając przy tym + zasoby systemu. Kolejną rzeczą, którą wprowadza systemd jest + zarządzanie zasobami, którymi operuja usługi. Program za pomocą + oczywiście odpowiedniej konfiguracji jest wstanie stworzyć zasób, który + potrzebują inne usługi, następnie uruchomić demona, który taki zasób + powinien udostępniać w momencie gdy demon z zasobem jeszcze się + uruchamia, inne te które go wymagają widzą że jest on dostępny i + wysyłają zapytania do tego demona o dostęp do zasobu. Te zapytania są + buforowane do momentu + jego pełnego uruchomienia, na koniec te zapytania wraz kontrolą nad + zasobem są przekazywane do niego. Jest to kolejna cecha, która + przyspiesza ładowanie systemu. Kolejną cechą systemd jest + zmiana administracji usług. Teraz nie są wymgane już skrypty wystarczy + krótki plik, kilka, kilkanaście linijek i usługa jest już zdefiniowana. +

+

12.1.1. Jednostki

+

+ Jednostki są to pliki za pomocą których opisuje się + różne komponenty + systemu dla systemd. Pliki jednostek są to zwykłe pliki + tekstowe, podzielone na dwie, trzy sekcje. Pierwsza sekcją służy do + opisu jednostki, druga jest zależna od typu jednostki i zawiera + specyficzne dla niego dyrektywy. Trzecia sekcja służy w zazwyczaj + od określania włączania i wyłączania jednostki (Uwaga, tutaj włączanie + i wyłączanie tyczy się angielskich słów enable oraz + disable. Jednostki systemd się aktywuje lub + uruchamia [ang. start]). Poniżej znajduje się plik jednostki + demona ssh. +

+
+[user@server1 ~]$ cat /usr/lib/systemd/system/sshd.service
+[Unit]
+Description=OpenSSH server daemon
+Documentation=man:sshd(8) man:sshd_config(5)
+After=network.target sshd-keygen.target
+Wants=sshd-keygen.target
+
+[Service]
+Type=notify
+EnvironmentFile=-/etc/sysconfig/sshd
+ExecStart=/usr/sbin/sshd -D $OPTIONS
+ExecReload=/bin/kill -HUP $MAINPID
+KillMode=process
+Restart=on-failure
+RestartSec=42s
+
+[Install]
+WantedBy=multi-user.target
+
+

+ Ten plik przestawia jednostkę usługi. Omawianie dyrektyw wykracza + poza ramy tego materiału, dlatego nie będzie tutaj to realizowane. + Więcej wiedzy znajduje się na stronie podręcznika + man systemd.unit. Poniżej znajduje + się lista typów jednostek oraz krótki opis za co odpowiadają w + systemie. +

+
    +
  • .socket - Jednostki gniazd zazwyczaj są powiązane + z jednostkami usług, służą do przedstawiania gniazd, które są + wykorzystywane w komunikacji miedzyprocesowej lub sieciowej.
  • +
  • .device - Jednostka urządzenia, wystąpienie + urządzenia w ujęciu systemd. Takie jednostki są + wykorzystywane do aktywacji innych jednostek w momencie pojawienia + się urządzenia w systemie.
  • +
  • .mount - Jednostka montowania, określa gdzie i jak + zamontować lub odmontować określony system plików.
  • +
  • .automount - Jednostka automontowania wspomaga + montowanie systemów plików na żądanie.
  • +
  • .swap - Jednostka przestrzeni wymiany, określa + przestrzeń wymiany w odniesieniu do systemd.
  • +
  • .target - Cel. Jednostka logiczna, zestaw plików + jednostek.
  • +
  • .path - Jednostka ścieżki. Wykorzystywana do + aktywacji innej jednostki w momencie próby uzyskania dostępu do + określonego pliku lub katalogu.
  • +
  • .timer - Jednostka służy do aktywacji innej + jednostki na podstawie czasu w niej zdefiniowanego.
  • +
  • .slice - Jednostka wycinka, służy do przydzielania + i zarządania zasobami grupie procesów.
  • +
  • .service - Jednostka usługi. Wystąpienie + demona w systemd.
  • +
+

12.1.2. Jednostki celu

+

+ Cel w ujęciu systemd jest logiczna grupą + jednostek + różnego rozdzaju, które mogą na przykład składać się na jeden z + komponentów systemu operacyjnego, na przykład środowisko graficzne. + Często cele mogą odpowiadać klasycznym poziomom uruchomienia systemu. + W systemie jest zdefiniowanych kilka celów, o to one: +

+
    +
  • halt - Zamyka i zatrzymuje system. Wyłączenie + komputera wymaga naciśnięcia przycisku zasilania.
  • +
  • poweroff - Zamyka i wyłącza system.
  • +
  • shutdown - Zamyka system.
  • +
  • rescue - Tryb jednego użytkownika dla funkcji + administracyjnych oraz przywracania systemu. Lokalne systemy plików + zostają zamontowane, nie które podstawowe usługi są uruchamiane ale + sieć pozostaje odłączona od systemu.
  • +
  • emergency - Uruchomiana zostaje powłoka ratunkowa, + a główny system plików zostaje zamontowany w trybie tylko do odczytu. + Sieć oraz pozostałe usługi są wyłączone.
  • +
  • multi-user - Normalne działanie systemu, ale bez + trybu graficznego.
  • +
  • graphical - Normalne działanie systemu z trybem + graficznym.
  • +
  • reboot - Zamyka system, a następnie uruchamia + komputer ponownie.
  • +
  • default - Dowiązanie symboliczne najczęściej do + celu graphical lub multi-user.
  • +
  • hibernate - Przenosi system w stan hibernacji.
  • +
+

+ Cele wykorzystywane są do uruchamiania wielu jednostek zapisanych w ich + zależnościach. +

+

12.1.3. Polecenie systemctl

+

+ Polecenie służącym do zarządzania systemd jest + systemctl, za jego pomocą możemy wykonywać + proste czyności administracyjne związane z jednostkami oraz celami. + Polecenie to zawiera duża ilość różnego rodzaju podpoleceń oraz + modyfikatorów, są one opisane na stronie podręcznika tego polecenia. + My za poznamy się z nim w praktyce. +

+

+ Wydając polecenie systemctl bez żadnej opcji polecenie + wyświetli table przedstawiącą wszystkie aktywne jednostki wraz z ich + stanem oraz krótkim opisem. Poniżej znajduje się jej fragment +

+
+UNIT                                LOAD   ACTIVE SUB       DESCRIPTION
+...
+rhsmcertd.service                   loaded active running   Enable periodic update of ...
+rsyslog.service                     loaded active running   System Logging Service
+rtkit-daemon.service                loaded active running   RealtimeKit Scheduling Policy ...
+spice-vdagentd.service              loaded active running   Agent daemon for Spice guests
+sshd.service                        loaded active running   OpenSSH server daemon
+switcheroo-control.service          loaded active running   Switcheroo Control Proxy service
+systemd-journal-flush.service       loaded active exited    Flush Journal to Persistent ...
+...
+
+

+ Tego nie widać na przykładzie ale jeśli wywołamy w terminalu polecenie, + możemy zobaczyć, że poszczególne typy jednostek są oddzielone od siebie + za pomocą poziomej linii. W drugiej kolumnie znajduje się stan + jednostki. Ta kolumna podzielona jest na trzy mniejsze kolumny. + Pierwsza określa czy jednostka jest załadowana, druga określa tzw. + stan wyższego poziomu aktywacji. Jest to ogólny stan aktywacji i może + przybierać on różne wartości takim najważniejszymi są active, + failed, inactive. Trzecia zaś określa niższy poziom + aktywacji, może on zawierać informacje specyficzne dla typu jednostki + lub demona. +

+

+ Powyższy przykład zawiera tylko załadowane jednostki, ale jeśli + chcielibyśmy zobaczyć wszystkie jednostki dostępne w systemie musimy + dodać do polecenia modyfikator --all. Innym przydatnym + modyfikatorem jest -t pozwalający podać typ jednostki. +

+
+  UNIT                          LOAD      ACTIVE   SUB     DESCRIPTION                                                                  
+  accounts-daemon.service       loaded    active   running Accounts Service
+  alsa-restore.service          loaded    inactive dead    Save/Restore Sound Card State
+  alsa-state.service            loaded    active   running Manage Sound Card State (restore and store)
+  atd.service                   loaded    active   running Deferred execution scheduler
+  auditd.service                loaded    active   running Security Auditing Service
+● auto-cpufreq.service          not-found inactive dead    auto-cpufreq.service
+● autofs.service                not-found inactive dead    autofs.service
+  avahi-daemon.service          loaded    active   running Avahi mDNS/DNS-SD Stack
+  blk-availability.service      loaded    inactive dead    Availability of block devices
+  chronyd.service               loaded    active   running NTP client/server
+  colord.service                loaded    active   running Manage, Install and Generate Color Profiles
+  cpupower.service              loaded    inactive dead    Configure CPU power related settings
+  crond.service                 loaded    active   running Command Scheduler
+  cups.service                  loaded    active   running CUPS Scheduler
+  dbus-broker.service           loaded    active   running D-Bus System Message Bus
+  dm-event.service              loaded    inactive dead    Device-mapper event daemon
+
+

+ Kolejnym dość istonym modyfikatorem, który pozwoli man namierzyć + jednostki, których aktywacja zakończyła się niepowodzeniem. Jest + --failed. +

+
+[user@server1 ~]$ systemctl --failed
+  UNIT          LOAD   ACTIVE SUB    DESCRIPTION                 
+● kdump.service loaded failed failed Crash recovery kernel arming
+
+LOAD   = Reflects whether the unit definition was properly loaded.
+ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
+SUB    = The low-level unit activation state, values depend on unit type.
+1 loaded units listed.
+
+

+ Pod tabelą znajduje się również krótki opis kolumn ze stanem. +

+

+ Za pomocą podpolecenia list-dependencies możemy wyświetlić + zależności jednostki. +

+
+[user@server1 ~]$ systemctl list-dependencies tuned.service
+tuned.service
+● ├─dbus-broker.service
+● ├─dbus.socket
+● ├─polkit.service
+● ├─system.slice
+● └─sysinit.target
+●   ├─dev-hugepages.mount
+●   ├─dev-mqueue.mount
+●   ├─dracut-shutdown.service
+○   ├─iscsi-onboot.service
+●   ├─kmod-static-nodes.service
+○   ├─ldconfig.service
+●   ├─lvm2-lvmpolld.socket
+●   ├─lvm2-monitor.service
+○   ├─multipathd.service
+...
+
+

+ Koła oznaczają aktywną jednostkę, a okręgi nieaktywną jednostkę. +

+

12.1.4. Zarządzanie jednostkami

+

+ Poza podpolecaniami służacymi wyświetlaniu informacji o jednostkach, + systemctl posiada dużą ilość podpoleceń związanych z + zarządzaniem jednostkami. Jednostki możemy aktywować, dezaktywować, + włączać, wyłączać, wyświetlić podsumowanie na ich temat czy zablokwać + zmianę stanu. Pierwszą rzeczą jak zrobimy z będzie wyświetlenie + informacji o jednostce, a służy do tego podpolecenie + status. +

+
+[user@server1 ~]$ sudo systemctl status atd.service
+[sudo] password for user: 
+● atd.service - Deferred execution scheduler
+     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sun 2022-07-17 07:40:58 CEST; 1h 34min ago
+       Docs: man:atd(8)
+   Main PID: 934 (atd)
+      Tasks: 1 (limit: 5760)
+     Memory: 300.0K
+        CPU: 5ms
+     CGroup: /system.slice/atd.service
+             └─934 /usr/sbin/atd -f
+
+Jul 17 07:40:58 server1.example.com systemd[1]: Started Deferred execution scheduler.
+
+

+ Na podstawie tych informacji możemy wywnioskować, że jednostka jest + załadowana, jest aktywna a jej demon nadal działa. Znamy także stronę + podręcznika opisującą tego demona oraz jego PID. Ważną rzeczą + podczas wyświetlania status jednostki jest wykonanie tego z + uprawnieniami administratora, wówczas na samym dole zostaną nam + wyświetlone komunikaty diagnostyczne, pobrane z plików dziennika + systemd, te komunikaty pomagają zlokalizować usterki, które + mogą być odpowiedzialne za problem z aktywacją jednostki. +

+

+ Jednostkę możemy zatrzymać oraz uruchomić za pomocą podpoleceń + stop oraz start. +

+
+[user@server1 ~]$ sudo systemctl stop atd.service
+[sudo] password for user: 
+[user@server1 ~]$ sudo systemctl status atd.service
+○ atd.service - Deferred execution scheduler
+     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
+     Active: inactive (dead) since Sun 2022-07-17 09:23:11 CEST; 2s ago
+       Docs: man:atd(8)
+    Process: 934 ExecStart=/usr/sbin/atd -f $OPTS (code=exited, status=0/SUCCESS)
+   Main PID: 934 (code=exited, status=0/SUCCESS)
+        CPU: 5ms
+
+Jul 17 07:40:58 server1.example.com systemd[1]: Started Deferred execution scheduler.
+Jul 17 09:23:11 server1.example.com systemd[1]: Stopping Deferred execution scheduler...
+Jul 17 09:23:11 server1.example.com systemd[1]: atd.service: Deactivated successfully.
+Jul 17 09:23:11 server1.example.com systemd[1]: Stopped Deferred execution scheduler.
+
+[user@server1 ~]$ sudo systemctl start atd.service
+[user@server1 ~]$ sudo systemctl status atd.service
+● atd.service - Deferred execution scheduler
+     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sun 2022-07-17 09:23:44 CEST; 2s ago
+       Docs: man:atd(8)
+   Main PID: 1576 (atd)
+      Tasks: 1 (limit: 5760)
+     Memory: 260.0K
+        CPU: 4ms
+     CGroup: /system.slice/atd.service
+             └─1576 /usr/sbin/atd -f
+
+Jul 17 09:23:44 server1.example.com systemd[1]: Started Deferred execution scheduler.
+
+

+ Do ponownego uruchomienia jednostki służy inne podpolecenie niż + stop, start, a jest nim restart. +

+
+[user@server1 ~]$ sudo systemctl restart atd.service
+[sudo] password for user: 
+[user@server1 ~]$ sudo systemctl status atd.service
+● atd.service - Deferred execution scheduler
+     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sun 2022-07-17 09:41:38 CEST; 3s ago
+       Docs: man:atd(8)
+   Main PID: 1595 (atd)
+      Tasks: 1 (limit: 5760)
+     Memory: 264.0K
+        CPU: 3ms
+     CGroup: /system.slice/atd.service
+             └─1595 /usr/sbin/atd -f
+
+Jul 17 09:41:38 server1.example.com systemd[1]: Started Deferred execution scheduler.
+
+

+ Do włączanie i wyłączania jednostek służą podpolecenia takie jak + enable oraz disable. +

+
+[user@server1 ~]$ sudo systemctl disable atd.service
+[sudo] password for user: 
+Removed /etc/systemd/system/multi-user.target.wants/atd.service.
+[user@server1 ~]$ sudo systemctl status atd.service
+● atd.service - Deferred execution scheduler
+     Loaded: loaded (/usr/lib/systemd/system/atd.service; disabled; vendor preset: enabled)
+     Active: active (running) since Sun 2022-07-17 09:41:38 CEST; 6min ago
+       Docs: man:atd(8)
+   Main PID: 1595 (atd)
+      Tasks: 1 (limit: 5760)
+     Memory: 264.0K
+        CPU: 3ms
+     CGroup: /system.slice/atd.service
+             └─1595 /usr/sbin/atd -f
+
+Jul 17 09:41:38 server1.example.com systemd[1]: Started Deferred execution scheduler.
+
+

+ W linii Loaded: za ścieżką do pliku + jednostki, status zmienił się z enabled na + disabled. Jeśli użyjemy podpolecenia + enable, status wróci do poprzedniej wartości. +

+
+[user@server1 ~]$ sudo systemctl enable atd.service
+Created symlink /etc/systemd/system/multi-user.target.wants/atd.service → /usr/lib/systemd/system/atd.service.
+[user@server1 ~]$ sudo systemctl status atd.service
+● atd.service - Deferred execution scheduler
+     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sun 2022-07-17 09:41:38 CEST; 9min ago
+       Docs: man:atd(8)
+   Main PID: 1595 (atd)
+      Tasks: 1 (limit: 5760)
+     Memory: 264.0K
+        CPU: 3ms
+     CGroup: /system.slice/atd.service
+             └─1595 /usr/sbin/atd -f
+
+Jul 17 09:41:38 server1.example.com systemd[1]: Started Deferred execution scheduler.
+
+

+ Włączenie jednostki powoduje utworzenie dowiązania symbolicznego w + katalogu zależności celu, natomiast wyłączenie usuwa to dowiązanie. +

+

+ Za pomocą podpoleceń mask oraz + unmask możemy zablokować włączenie oraz aktywację + jednostki. Użycie podpolecenia mask tworzy dowiązanie do pliku + /dev/null i zaznacza w systemd, że jednostka jest + zablokowana. Podpolecenie umask odwraca działania podpolecenia + mask. Usuwa stworzone dowiązanie oraz zmienia status jednostki + w systemd. +

+
+[user@server1 ~]$ sudo systemctl mask atd.service
+[sudo] password for user: 
+Created symlink /etc/systemd/system/atd.service → /dev/null.
+[user@server1 ~]$ sudo systemctl status atd.service 
+● atd.service
+     Loaded: masked (Reason: Unit atd.service is masked.)
+     Active: active (running) since Sun 2022-07-17 09:41:38 CEST; 28min ago
+   Main PID: 1595 (atd)
+        CPU: 3ms
+     CGroup: /system.slice/atd.service
+             └─1595 /usr/sbin/atd -f
+
+Jul 17 09:41:38 server1.example.com systemd[1]: Started Deferred execution scheduler.
+Jul 17 10:09:58 server1.example.com systemd[1]: atd.service: Current command vanished from the unit file, execution of the command list ...
+
+[user@server1 ~]$ sudo systemctl unmask atd.service
+Removed /etc/systemd/system/atd.service.
+[user@server1 ~]$ sudo systemctl status atd.service 
+● atd.service - Deferred execution scheduler
+     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
+     Active: active (running) since Sun 2022-07-17 09:41:38 CEST; 30min ago
+       Docs: man:atd(8)
+   Main PID: 1595 (atd)
+      Tasks: 1 (limit: 5760)
+     Memory: 264.0K
+        CPU: 3ms
+     CGroup: /system.slice/atd.service
+             └─1595 /usr/sbin/atd -f
+
+Jul 17 09:41:38 server1.example.com systemd[1]: Started Deferred execution scheduler.
+Jul 17 10:09:58 server1.example.com systemd[1]: atd.service: Current command vanished from the unit file, execution of the command list ...
+
+

12.1.5. Zarządzanie jednostkami celów

+

+ Zarządzaniem jednostkami celów, różni się od zarządzania jednostkami + usług czy innych typów. Jednostki celów przedstawiają różne stany + uruchomienia systemu operacyjnego, więc aby miało to jakiś sens + zarządzanie nim sprowadza się głównie do dwóch czynności, jedną z nich + jest określenie oraz ustawienie domyślnego stanu, w którym to system + operacyjny jest zdatny do użycia. W tym przypadku określa to jednostka + celu - default. Za pomocą podpoleceń możemy sprawdzić + która z dostarczonych z systemem jednostek jest wskazywana przez to + dowiązanie. Możemy to określić za pomocą podpolecenia + get-default. +

+
+[user@server1 ~]$ sudo systemctl get-default
+[sudo] password for user: 
+graphical.target
+
+

+ Tę wartość możemy zmienić, wpływając również na sposób ładowania + systemu. Jeśli zmienię domyślny cel z + graphical.target na + multi-user.target, wówczas system zatrzyma ładowanie systemu + przed uruchomieniem środowiska graficznego. Zmianie domyślnego celu + służy podpolecenie set-default. +

+
+[user@server1 ~]$ sudo systemctl set-default multi-user.target
+[sudo] password for user: 
+Removed /etc/systemd/system/default.target.
+Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.
+[user@server1 ~]$ sudo systemctl get-default
+multi-user.target
+
+

+ Jeśli zrestartujemy teraz maszynę, uruchomi się ona bez środowiska + graficznego. +

+

+ Odnośnie egzaminu:
+ Może być tak, że na egzaminie będzie trzeba zmienić domyślny cel + ładowanie systemu. +

+

+ Pomiędzy celami możemy się przełączać w trakcie działania systemu. + Służy do tego podpolecenie isolate. +

+
+[user@server1 ~]$ sudo systemctl isolate multi-user.target
+
+

+ Po wydaniu tego polecenia, jeśli otworzymy okno maszyny zobaczymy, że + środowisko graficzne zostało wyłączone. Aby włączyć je z powrotem + użyjemy tego samego polecenia, jednak wskazując inny cel. +

+
+[user@server1 ~]$ sudo systemctl isolate graphical.target
+[sudo] password for user: 
+
+

+ Tym że akcentem zakończyliśmy omawianie systemd. Oczywiście + to zagadnienia jest tak obszerne, że można by napisać około 200, 300 + stronicową książke na ten temat bazując na samej dokumentacji programu. +

+

12.2. Prowadzenie plików dzienników systemowych

+

+ Zbieranie informacji o tym co się dzieje w systemie to bardzo ważna + czynność wykonywana przez systemy operacyjne. Nie które z komponentów + instalowanych w nich zwracają bardzo ubogie w informacje komunikaty + o błędach lub ostrzeżenia z których nic nie wynika. Najczęściej ma to + na celu poprawienie wyglądu oraz doświadczeń użytkownika + (UI/UX Design), przez co wielu użytkowników zostaje na lodzie + chcąc samodzielnie rozwiązać problemy. Ta cecha nie tyczy się tylko + systemów MS Windows. Wiodące środowiska graficzne w dystrybucjach + również mają z tym problem. Ale w Uniksach mamy dobrze zorganizowane + pliki dzienników, dzieki którym w możemy znaleźć przyczynę, nie których + problemów. +

+

12.2.1. Rejestrator systemowy - rsyslog

+

+ Rsyslog jest odpowiedzialny za zbieranie komunikatów + diagnostycznych i umieszczenie ich w przeznaczonych dla nich miejscach. + Nie które komunikaty mogą trafiać do plików inne mogą być wyświetlane + w terminalach pracujących na serwerze użytkowników. Te reguły są + zapisane w pliku konfiguracyjnym demona /etc/rsyslog.conf. + Program wspiera dostoswane pliki konfiguracyjne użytkowników + przechowywane w /etc/rsyslog.d. Plik konfiguracyjny + rsyslog wygląda następująco: +

+
+[user@server1 ~]$ grep -v -e '^#' -e '^$' /etc/rsyslog.conf 
+global(workDirectory="/var/lib/rsyslog")
+module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
+include(file="/etc/rsyslog.d/*.conf" mode="optional")
+module(load="imuxsock" 	  # provides support for local system logging (e.g. via logger command)
+       SysSock.Use="off") # Turn off message reception via local log socket; 
+			  # local messages are retrieved through imjournal now.
+module(load="imjournal" 	    # provides access to the systemd journal
+       StateFile="imjournal.state") # File to store the position in the journal
+*.info;mail.none;authpriv.none;cron.none                /var/log/messages
+authpriv.*                                              /var/log/secure
+mail.*                                                  -/var/log/maillog
+cron.*                                                  /var/log/cron
+*.emerg                                                 :omusrmsg:*
+uucp,news.crit                                          /var/log/spooler
+local7.*                                                /var/log/boot.log
+
+

+ Ostatnie linie na końcu zawierają zasady, + które określaja jakie komunikaty należy zbierać i co z nimi + zrobić. Zasady dzielą się na dwie części na selektor, + określający komunikaty diagostyczne oraz akcje + definiującą dla nich miejsce docelowe. Poza tym selektor również możemy + rozłożyć na funkcje - wskazującą na demona lub + komponent od którego + należy przechwycić komunikaty oraz priorytet + określający ważność komunikatu. Funkcję od priorytetu oddziela się + kropką. Spis funkcji oraz priorytetów znajduje się na stronie + podręcznika pliku /etc/rsyslog.conf. Gwiazdka to symbol + wieloznaczny wskazujący zarówno wszystkie priorytety jak i wszystkie + funkcje w zależności gdzie został użyty. Priorytet + none wskazuje aby nie przechwytywać + komunikatów z tej funkcji. Jak możemy zobaczyć w pierwszej zasadzie + na jedną akcje może przypadać wiele selektorów. Selektory oddziela się + średnikiem (;). W polu akcji zazwyczaj znajdują się + ścieżki do plików wskazujących gdzie należy zapisać komunikaty + diagnostyczne, jedyny wyjątkiem są komunikaty o najwyższym priorytecie + za pomocą wewnętrzengo modułu są one wyświetlane w terminalach jako + wiadomości do użytkowników. +

+

+ Jak możemy zauważyć większość plików dzienników znajduje się w katalogu + /var/log. A prawie wszystkie komunikaty diagostyczne trafiają + do jednego pliku /var/log/messages. Ten plik jest głównym + plikiem dziennika w systemie. Każda linia reprezentuje jeden z + komunikatów. Taki plik najlepiej wyświetlać za pomocą polecenia + less + lub more. +

+

+ Odnośnie egzaminu:
+ Używanie polecenie tail wraz z opcją -f może okazać + się przydatne podczas śledzenia komunikatów diagnostycznych w trakcie + uruchamiania usług lub testowania, aby wychwycić wszysktie problemy. +

+

+ Jeśli będziemy chcieli coś zmienić w konfiguracji rsyslog, + warto przed + uruchomieniem ponowym usługi sprawdzić poprawność konfiguracji za + pomocą polecenia rsyslog -N 1. Gdzie + 1 oznacza ilość wyświetlanych + przez polecenie komunikatów. +

+

12.2.2. Obrót plików dziennika

+

+ Pliki dziennika to zwykłe pliki tekstowe, które potrafią bardzo szybko + przyrastać w zależności od tego co się dzieje w systemie. Taki nie + kontrolowany przyrost plików może szybko wypełnić dostępne miejsce + dysku. Zastosowano więc mechanizm rotacji plików dziennika. Stare pliki + są usuwane robiąc miejsce nowym. Tym zadaniem zajmuje się wywoływany + w codziennym katalogu cron (/etc/cron.daily) skrypt + logrotate. Skrypt ten posiada swój plik konfiguracyjny + /etc/logrotate.conf. +

+
+[user@server1 ~]$ grep -v -e '^$' /etc/logrotate.conf 
+# see "man logrotate" for details
+# global options do not affect preceding include directives
+# rotate log files weekly
+weekly
+# keep 4 weeks worth of backlogs
+rotate 4
+# create new (empty) log files after rotating old ones
+create
+# use date as a suffix of the rotated file
+dateext
+# uncomment this if you want your log files compressed
+#compress
+# packages drop log rotation information into this directory
+include /etc/logrotate.d
+# system-specific logs may be also be configured here.
+
+

+ Na podstawie tego pliku możemy dowiedzieć się, że rotacja jest + dokonywana co tydzień, pozostawione mają zostać pliki dziennika na + cztery tygodnie wstecz oraz po usunięciu starych, następnie zmianie + nazw obecnym skrypt utworzy nowe puste pliki dla nowych komunikatów + zapisywanych w plikach dzienika. Definicje zachowania dla + rotacji plików dziennika dostarczane wraz z programami znajdują się w + katalogu /etc/logrotate.d. Oto zawartość tego katalogu. +

+
+[user@server1 ~]$ ls -l /etc/logrotate.d/
+total 56
+-rw-r--r--. 1 root root  91 Mar 31  2021 bootlog
+-rw-r--r--. 1 root root 130 Oct 14  2019 btmp
+-rw-r--r--. 1 root root 160 May 12  2021 chrony
+-rw-r--r--. 1 root root  88 Oct 21  2021 dnf
+-rw-r--r--. 1 root root  93 Nov 23  2021 firewalld
+-rw-r--r--. 1 root root 172 Jul 29  2021 iscsiuiolog
+-rw-r--r--. 1 root root 162 Apr 14 19:04 kvm_stat
+-rw-r--r--. 1 root root 312 Nov  1  2021 psacct
+-rw-r--r--. 1 root root 226 Jan 19 16:31 rsyslog
+-rw-r--r--. 1 root root 155 Mar 18 10:32 samba
+-rw-r--r--. 1 root root 237 Jan 17 20:46 sssd
+-rw-r--r--. 1 root root  88 Apr 13 17:00 subscription-manager
+-rw-r--r--. 1 root root 100 Feb  4 15:58 wpa_supplicant
+-rw-r--r--. 1 root root 145 Oct 14  2019 wtmp
+
+

+ Zawartość takiego pliku może zdradzać, w jaki sposób logrotate + zachowa się wobec takiego pliku, nadpisując tym samym konfigurację + z pliku, z wcześniejszego przykładu (globalnego pliku konfiguracji). +

+

12.2.3. Plik dziennika rozruchu

+

+ W katalogu /var/log znajduje się plik boot.log + przedstawiający uruchamianie ostatniej fazy rozruchu. W tym pliku + możemy podejrzeć czy wszystkie usługi wystartowały czy też nie. Uwaga, + plik nie nadaje się do przeglądania za pomocą polecenie less. +

+
+[user@server1 ~]$ sudo head /var/log/boot.log
+[  OK  ] Started User Login Management.
+[  OK  ] Started Daemon for power management.
+[  OK  ] Started Authorization Manager.
+         Starting Modem Manager...
+         Starting firewalld - dynamic firewall daemon...
+[  OK  ] Finished Rotate log files.
+[  OK  ] Started Accounts Service.
+[  OK  ] Started Power Profiles daemon.
+[  OK  ] Started Modem Manager.
+[  OK  ] Started Disk Manager.
+...
+[FAILED] Failed to start Crash recovery kernel arming.
+See 'systemctl status kdump.service' for details.
+
+

+ W nawiasach kwadratowych wyświetla on OK + lub FAILED. +

+

12.2.4. Własne komunikaty diagnostyczne

+

+ Czasami możemy chcieć uzupełnić systemowy plik dziennika + /var/log/messages o kilka komunikatów, które będą wyznaczać + początek i koniec testowanego oprogramowania lub dodwać kilka notatek + wyjaśniających takie a nie inne komunikaty. Dzięki rsyslog za + pomocą jednego z jego wewnętrznych modułów możemy dokonać wpisów do + tego pliku dziennika. Realizować to będziemy za pomocą polecenia + logger. Na przykład: +

+
+[user@server1 ~]$ logger "Hello, World! It's $LOGNAME"
+[user@server1 ~]$ sudo tail -1 /var/log/messages
+[sudo] password for user: 
+Jul 17 13:03:42 server1 user[2706]: Hello, World! It's user
+
+

+ Te komunikaty są rozpoznawane przez rsyslog jako + user.notice, jednak za pomocą opcji -p możemy podać + swój + selektor. Polecenie logger możemy być przydatne do testowania + zmian w konfiguracji rsyslog. +

+

12.3. Dzienniki systemd

+

+ Systemd poza funkcjami omówionymi na początku tego rozdziału + dostarcza wielu narzędzi, które czasami bywają irytujące, ale nie które + z nich jak np. demon systemd-journald są całkiem przydatne, + ponieważ to za jego zasługą dowiadujemy się dlaczego nasza usługa + nie chce się uruchomić. Ten demon przechwytuje komunikaty z bardzo + wielu źródeł od jądra przez ramdysk do różnorakich usług. + Swoje komunikaty przechowuje w pliku /run/log/journal, zatem + w pliku, który nie jest trwały i zostanie zniszczony w momencie + zamknięcia systemu. Konfiguracja tego demona przechowywana jest w pliku + /etc/systemd/journald.conf, w którym w razie potrzeby możemy + zmienić. +

+

12.3.1. Wyświetlanie dziennika systemd

+

+ Do wyświetlenia informacji zebranych przez demona + systemd-journald mamy do dyspozycji takie polecenie jak + journalctl. Jesli wydamy to polecenie bez żadnych + opcji to polecenie zwróci ono treść podobną do zawartości + /var/log/messages. +

+
+[user@server1 ~]$ sudo journalctl 
+[sudo] password for user: 
+Jul 16 12:48:20 server1.example.com kernel: Linux version 5.14.0-70.13.1.el9_0.x86_64 (mockbuild@x86-vm-08.build.eng.bos.redhat.com) (gcc (GCC) 11.2.>
+Jul 16 12:48:20 server1.example.com kernel: Linux version 5.14.0-70.13.1.el9_0.x86_64 (mockbuild@x86-vm-08.build.eng.bos.redhat.com) (gcc (GCC) 11.2.>
+Jul 16 12:48:20 server1.example.com kernel: The list of certified hardware and cloud instances for Red Hat Enterprise Linux 9 can be viewed at the Re>
+Jul 16 12:48:20 server1.example.com kernel: Linux version 5.14.0-70.13.1.el9_0.x86_64 (mockbuild@x86-vm-08.build.eng.bos.redhat.com) (gcc (GCC) 11.2.>
+Jul 16 12:48:20 server1.example.com kernel: Linux version 5.14.0-70.13.1.el9_0.x86_64 (mockbuild@x86-vm-08.build.eng.bos.redhat.com) (gcc (GCC) 11.2.>
+Jul 16 12:48:20 server1.example.com kernel: The list of certified hardware and cloud instances for Red Hat Enterprise Linux 9 can be viewed at the Re>
+Jul 16 12:48:20 server1.example.com kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-70.13.1.el9_0.x86_64 root=/dev/mapper/rhel-root ro c>
+Jul 16 12:48:20 server1.example.com kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
+Jul 16 12:48:20 server1.example.com kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
+Jul 16 12:48:20 server1.example.com kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
+...
+
+

+ Przy użyciu opcji -o wraz z wartością verbose, + narzędzie zwróci bardzo szczegółowy opis każdego z komunikatów. +

+
+Sat 2022-07-16 12:48:20.235840 CEST [s=5135ad3430d34e718c820bc5b157f883;i=1;b=9ca0ad75315f4891b4807b449a2ce046;m=233ae8;t=5e3e9df815e40;x=7786ef23901>
+    _SOURCE_MONOTONIC_TIMESTAMP=0
+    _TRANSPORT=kernel
+    PRIORITY=5
+    SYSLOG_FACILITY=0
+    SYSLOG_IDENTIFIER=kernel
+    MESSAGE=Linux version 5.14.0-70.13.1.el9_0.x86_64 (mockbuild@x86-vm-08.build.eng.bos.redhat.com) (gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9), G>
+    _BOOT_ID=9ca0ad75315f4891b4807b449a2ce046
+    _MACHINE_ID=4015aef220c344e1875a3fbbd1453b45
+    _HOSTNAME=server1.example.com
+
+

+ Polecenie ma masę opcji nie ma sensu ich tutaj wszystkich przytaczać. + Znajdziemy je na stronie podręcznika + man journalctl. +

+

+ Komunikaty dla poszczególnych usług znajdziemy na końcu informacji + zwracanych przez systemctl status. Dlatego ważne jest, aby + używać tego polecenia z uprawnieniami administratora. +

+

12.3.2. Konfiguracja miejsca do przechwywania dzienników systemd

+

+ Jak wiemy dziennik systemd nie jest przechowywany na stałe w + systemie. To możemy zmienić. W bardzo prosty sposób. Otóz, dyrektywa + Storage w konfiguracji demona może mieć cztery wartości: +

+
    +
  • volatile - Przechowuje informacje tylko w pamięci
  • +
  • persistent - Przechowuje informacje w katalogu + /var/log/journal, jeśli katalog nie istnieje zostanie + utworzony, chyba że jest z tym jakiś problem to demon wraca do + przechowywania komunikatów wyłącznie w pamięci.
  • +
  • auto - Podobnie do presistent, jednak nie + tworzy ona katalogu.
  • +
  • none - wyłącza przechowywanie komunikatów + diagnostycznych gdzie kolwiek.
  • +
+

+ Domyślną jej wartością jest auto, więc aby włączyć + przechowywanie + dzienników na stałe, wystarczy utworzyć katalog journal w + katalogu /var/log. Tutaj pragnę zaznaczyć, że w RHEL + 8 wystarczyło zrestartować usługę, ale w przypadku RHEL 9 + należy zrestartować cały system. Kiedy system będzie gotowy wewnątrz + katalogu zostanie utworzony podkatalogu o nazwany wartością + /etc/machine-id. +

+
+[user@server1 ~]$ ls -l /var/log/journal/
+total 4
+drwxr-sr-x+ 2 root systemd-journal 4096 Jul 16 20:17 4015aef220c344e1875a3fbbd1453b45
+[user@server1 ~]$ cat /etc/machine-id 
+4015aef220c344e1875a3fbbd1453b45
+
+

+ Teraz komunikaty dziennika systemd bedą przechowywane w tym + katalogu. +

+

12.4. Dostosowywanie systemu

+

+ W RHEL jak i inych systemach klasy enterprise możemy + spotkać się z narzędziem, które na podstawie monitorowania zasobów + komputera może zmienić ich ustawienia aby podnieść ich wydajność lub + gdy przestanie być to konieczne ją obniżyć aby zaoszczędzić + wykorzystywaną energię elektryczną. Tym zajmuje się demon tuned. + Nie występuję on domyślnie w systemie i trzeba go zainstalować. +

+

+ Tuned może dynamicznie na podstawie danych uzyskanych z + różnych monitorów zasobów dostosowywać wydajność sprzętu do potrzeb. + Może on również zostać przez nas statycznie skonfigurowany za pomocą + predefiniowanych profili. Wydajność systemu wówczas nie zmieni się + dopóki my nie załadujemy innego profilu. Konfiguracja statyczna jest + jego domyślną konfiguracją. +

+

12.4.1. Polecenie tuned-adm

+

+ Demon tuned dostarczany jest w postaci pakietów i znajduje się + na płycie instalacyjnej z RHEL. Instalacji dokonuje za pomocą + poniższego polecenia: +

+
+[user@server1 ~]$ sudo dnf install tuned -y
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Last metadata expiration check: 2:38:24 ago on Sun 17 Jul 2022 11:44:30 AM CEST.
+Package tuned-2.18.0-1.el9.noarch is already installed.
+Dependencies resolved.
+Nothing to do.
+Complete!
+
+

+ Uwaga, w RHEL 9 demon może wymagać ręcznej aktywacji + jednostki za pomocą polecenia systemctl. + Wraz z demonem zostanie nam dostarczone polecenie + tuned-adm za pomocą, którego będziemy mogli + administrować wydajnością systemu dostosowywaną przez te profile. + Za pomocą podpolecenia list możemy wyświetlić listę dostępnych + profili. +

+
+[user@server1 ~]$ sudo tuned-adm list
+Available profiles:
+- accelerator-performance     - Throughput performance based tuning with disabled higher latency STOP states
+- balanced                    - General non-specialized tuned profile
+- desktop                     - Optimize for the desktop use-case
+- hpc-compute                 - Optimize for HPC compute workloads
+- intel-sst                   - Configure for Intel Speed Select Base Frequency
+- latency-performance         - Optimize for deterministic performance at the cost of increased power consumption
+- network-latency             - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
+- network-throughput          - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
+- optimize-serial-console     - Optimize for serial console use.
+- powersave                   - Optimize for low power consumption
+- throughput-performance      - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
+- virtual-guest               - Optimize for running inside a virtual guest
+- virtual-host                - Optimize for running KVM guests
+Current active profile: virtual-guest
+
+

+ Poza listą podpolecenie zwraca również aktywny profil. Identyczne + działanie możemy otrzymać poprzez wydanie polecenia tuned-adm + wraz z podpoleceniem active. +

+
+[user@server1 ~]$ sudo tuned-adm active
+[sudo] password for user: 
+Current active profile: virtual-guest
+
+

+ Zmiany profilu dokonujemy za pomocą podpolecenia profile a + następnie podajemy nazwę profilu. +

+
+[user@server1 ~]$ sudo tuned-adm profile balanced
+[user@server1 ~]$ sudo tuned-adm active
+Current active profile: balanced
+
+

+ Demon sam jest wstanie na podstawie naszej konfiguracji sprzętowej + dobrać odpowiedni profil. Aby uzyskać od niego taką informację wydajemy + polecenie z podpoleceniem recommend. +

+
+[user@server1 ~]$ sudo tuned-adm recommend
+virtual-guest
+
+

+ Profil rekomendowany możemy ustawić przez podanie jego nazwy jako + argumentu podpolecenia profile lub tak jak przedstawiłem to + na poniższym przykładzie. +

+
+[user@server1 ~]$ sudo tuned-adm profile $(sudo tuned-adm recommend)
+
+

+ Jeśli dostosowanie wydajności nie jest już nam potrzebne możemy je + wyłączyć za pomocą podpolecenia off. +

+
+[user@server1 ~]$ sudo tuned-adm off
+[user@server1 ~]$ sudo tuned-adm active
+No current active profile.
+
+

Ćwiczenie 1: Zmiana domyślnego celu ładowania systemu

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1 zmień domyślny cel ładowania systemu + na multi-user.target. Uruchom ponownie maszynę i za pomocą + polecenia systemctl oraz who sprawdź zmiany. + Następnie wróć do standardowego celu i ponownie zweryfikuj zmiany. +

+

Ćwiczenie 2: Zapis własnego komunikatu diagnostycznego

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1 zapis swój komunikat diagnostyczny. + Następnie wyświetl go w terminalu lub konsoli. +

+

Ćwiczenie 3: Zastosowanie profili wydajności

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1 za pomocą polecenia tuned-adm + Wyświetl listę profil, następnie ustaw profil balanced i + potwierdź to za pomocą odpowiednie podpolecenia. Ustaw profil + rekomendowany, następnie wyłacz profil. Pamiętaj! Może być konieczna + ręczna aktywacja jednostki tuned.service. +

+

Podsumowanie

+

+ W tym rodziale dowiedzieliśmy się w jaki sposób realizowany jest + ostatni etap rozruchu systemu. Poznaliśmy odpowiedzialne za nie + narzędzie oraz część jego możliwości. Dowiedzieliśmy się za co + odpowiada rsyslogd oraz gdzie możemy szukać zapisanych w + systemie komunikatów diagnostycznych. Na koniec poznaliśmy narzędzie + które możemy dostoswać wydajność naszego komputera do określonych + potrzeb. W następnym rodziale zajmiemy się podstawami obsługi dysków. +

+

13. Podstawy zarządzania pamięcią masową

+

+ Dane na których operują użytkownicy, wyniki ich pracy czy programy + przez nich używane muszą być gdzieś składowane, aby co ponowne + uruchomienie komputera nie trzeba było konfigurować naszego środowiska + na nowo. Odziwo istnieją użytkownicy, który korzystają z dystrybucji + Linuksa w trybie LiveCD (systemu załadowanego z płyty do + pamięci komputera). Aby + móc wykorzystać komputer do składowania danych potrzebujemy specjalnych + urządzeń - dysków, i to zarządzaniem dyskami zajmiemy + się w tym rozdziale. +

+

+ W tym rozdziale powinna znaleźć się także obsługą dysków za pomocą + technologii VDO, jednak z RHEL 9 została ona + wciągnieta do LVM, które będą omawaiane w następnym rozdziale. + Także omówimy sobie VDO zaraz po nauczeniu się podstaw + LVM. +

+

+ Do wykonania ćwiczeń oraz przykładów będzie nam potrzebna maszyna + oznaczona jak server2 (patrz: rodział 1). +

+

13.1. Podstawowe pojęcia związane z zarządzaniem dyskami

+

+ Dyski w systemach uniksowych są urządzeniami blokowymi służącymi do + przechowywania danych. Dyski mogą być podzielone na logiczne części + nazwane partycjami. Partycje w ujęciu systemów + operacyjnych są podstawową jednoską związaną z zarządzaniem dyskami, + więc aby uzyskać dostęp do przestrzenii znajdującej się na dysku, + musimy utworzyć na nim partycję. Na tym polega zarządzanie dyskami, + na tworzeniu, zmienianiu i usuwaniu partycji. Informacja o partycjach + zwana tablicą partycji + znajdujących się na dysku znajduje się w pierwszym jego sektorze obok + programu rozruchowego. Partycjami możemy zarządzać za pomocą dwóch + schematów MBR oraz GPT. +

+

13.1.1 Schemat partycjonowania MBR (Master Boot Record)

+

+ MBR jest jednym z pierwszych schematów partycjonowania, + został on ustanowiony dawno temu, więc posiada pewne ograniczenia + względem dysków stosowanych w obecnych komputerach. + Schemat ten jest domyślnym schematem wykorzystywanym przez komputery + obsługiwane z pomocą BIOS-u. Pozwala on podzielenie dysku na + maksymalnie 4 partycje podstawowe (służące do przechowywania danych). + Jeśli wymagana jest większa ilość, to wówczas należy poświęcić jedną + z partycji podstawowych na partycję rozszerzoną (kontener na + partycje logiczne), a następnie realizować dalsze partycjonowanie za + pomocą partycji logicznych (te partycje również służą do przechowywania + danych jednak różnią się one nieco do partycji podstawowych). Partycji + logicznych na dysku może być maksymalnie 11, co daje nam maksymalną + ilość partycji na dysku wynoszącą 14. W praktycje może + oznaczać, że to więcej niż kto kolwiek, kiedy kolwiek potrzebował. + Schemat ten ma jeszcze jedno ograniczenie otóż, nie może zaadresować + przestrzenii większej niż 2TB ze względu na to iż jest to + 32-bitowy schemat partycjonowania, jak wiemy obecne dostępne + dyski dysponują przestrzenią powyżej 10TB. +

+

13.1.2. Schemat patycjonowania GPT (GUID Partition Table)

+

+ Wraz rozwojem komputerów, wprowadzeniem nowego oprogramowania układowego + jakim jest UEFI, zaczął być wdrażany kompatybilny z nim + schemat GPT. Schemat ten nie posiada podziałów na partycje + podstawowe, rozszerzone, logiczne itd. Wszystkie są podstawowe i może + być ich aż do 128. Maksymalna pojemność dysków, które GPT może + zaadresować jest nadal daleko po za zasięgiem ludzkości. Umożliwia on + także nadawanie etykiet partycjom co nie było możliwe w przypadku + MBR. Poza tym GPT, tworzy kopie obszaru na którym + zajduje się informacja o partycjach zaraz przed końcem dysku, co + również nie było realizowane w schemacie MBR. +

+

13.1.3. Partycje dyskowe w systemie

+

+ Podczas partycjowania należy uważać aby nie nadpisać obecnie + istniejących partycji, albo nie zostawiać między nimi przerw marnując + tym samym przestrzeń dysku. Partycje w systemie są uprządkowane + za pomocą numeracji. W przypadku partycjonowania ze schematem MBR, + partycje podstawowe otrzymują numery od 1 do 4, natomiast numeracja + dysków logicznych rozpocznyna sie od 5. W przypadku schematu GPT + numeracja rozpoczynia się od 1. Za pomocą polecenia + lsblk + możemy wświetlić dostępne w systemie urządzenia blokowe: +

+
+[user@server2 ~]$ lsblk
+NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
+sr0            11:0    1    8G  0 rom  /mnt
+vda           252:0    0   10G  0 disk 
+├─vda1        252:1    0    1G  0 part /boot
+└─vda2        252:2    0    9G  0 part 
+  ├─rhel-root 253:0    0    8G  0 lvm  /
+  └─rhel-swap 253:1    0    1G  0 lvm  [SWAP]
+vdb           252:16   0  256M  0 disk 
+vdc           252:32   0  256M  0 disk 
+vdd           252:48   0  256M  0 disk 
+vde           252:64   0  256M  0 disk 
+vdf           252:80   0    4G  0 disk 
+vdg           252:96   0    1G  0 disk 
+vdh           252:112  0    1G  0 disk 
+
+

+ W moim przypadku dyski noszą nazwy vdX, + gdzie X to litera porządkowa dysku zatem pierwszy dysk to + vda, drugi vdb i tak dalej. Przy niektóych nazwach + widnieją cyfry, te nazwy to nazwy partycji. W Twoim przypadku + oznaczenia dysku mogą być nieco inne, ponieważ ja zamiast + VirtualBox + używam wirtualizacji KVM wraz ze innym sterownikiem + odpowiedzialnym za obsługę pamięci masowych. Nie miej jednak polecenie + z przykładu zwraca nazwę urządzenia, przedstawiając dysk w postaci + drzewa, zwraca rozmiar zarówno dysków jak i partycji, typ urządzenia + oraz punkt montowania partycji w systemie. + Typ lvm oznacza logiczne woluminy + LVM (będzie o tym w następny rozdziale). +

+

13.1.4. Narzędzia do zarządzania pamięcią masową

+

+ W RHEL dostępnych jest wiele narzędzi odpowiedzialnych za + zarządzanie dyskami. Każda technologia wdrożona do systemu posiada + swoje oprogramowanie. W tym rozdziale skupimy się wyłączenia na dwóch + z nich. Na programie parted pozwalającym na obsługę + schematu MBR oraz + gdisk obsługującym schemat GPT. Ze względu + na to iż będzie pracować z urządzeniami komputera, do wykonywania + czynności przy użyciu tych narzędzi będą potrzebne uprawnienia + administratora. +

+

13.1.5. Technologia thin provisioning

+

+ Omawiając podstawy zarządzania dyskami należałoby wspomnieć o + technologii thin provisioning jest technika polegająca + na przedstawianiu logiczynych zasobów dyskowy znacznie większych niż + są one w rzeczywistości. Przez utworzone w ten sposób woluminy + posiadają one znaczenie wiekszą pojemność niż utrzymujące je fizyczne + urządzenia, kiedy + dochodzi się do poziomu wyczerpywania fizycznego miejsca, rozszerza się + wolumin o + kolejne fizyczne dyski. Dzięki tej technologii można logicznie założyć + duży zasób dyskowy do wykorzystania i jeśli rzeczywiście będzie + potrzeba + użycia takie ilości przestrzeni będzie się dodwać stopniowo kolejne + dyski nie wydając pieniędzy na przestrzeń, której nigdy nie + wykorzystamy. +

+

13.2. Zarządzenie partycjami ze schematem MBR

+

+ W tym podrozdziale nauczymy się zarządzać partycjami ze schematem + MBR przy użyciu narzędzia parted. Tego polecenia + możemy używać albo w trybie interaktywnym albo bezpośrednio z wiersza + polecenia. Poniższe czynności będą opierać się wyłącznie na obsłudze + z poziomu wiersza polecenia. Na początek wyświetlimy sobie zawartość + dysku. +

+
+[user@server2 ~]$ sudo parted /dev/vdb print
+Error: /dev/vdb: unrecognised disk label
+Model: Virtio Block Device (virtblk)                                      
+Disk /dev/vdb: 268MB
+Sector size (logical/physical): 512B/512B
+Partition Table: unknown
+Disk Flags: 
+
+

+ Za pomocą podpolecenia print możemy + wyświetlić informacje na temat dysku oraz znajdujące się na nim + partycje. Zwróćmy uwagę na pierwszą linię, mówi ona o tym, że nie + znaleziony etykiety dysku, w tym przypadku chodzi o schemat + partycjonowania (tablicę partycji). Zapamiętajmy też składnie tego + polecenia, gdyż pierwszym + argumentem zawsze jest nazwa urządzenia następnie podpolecenie + wykonujące określoną czynność. Poniższe polecenie nada etykietę + msdos ustawiając tym samym schemat na MBR. +

+
+[user@server2 ~]$ sudo parted /dev/vdb mklabel msdos
+[sudo] password for user: 
+Information: You may need to update /etc/fstab.
+
+[user@server2 ~]$ sudo parted /dev/vdb print                      
+Model: Virtio Block Device (virtblk)
+Disk /dev/vdb: 268MB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags: 
+
+Number  Start  End  Size  Type  File system  Flags
+
+

+ Teraz kiedy zdecydowaliśmy o schemacie partycjonowania, możemy utworzyć + partycję. Przy tworzeniu partycji jest pewien haczyk. Otóż podczas + tworzenia partycji + w parted należy podać początek oraz koniec. + Zatem chcąc stworzyć partycję o wielkości + 100 MB podajemy początek 1 (co jest równe 1M, jest również pierwsza + partycja więc rozpoczyna się od pierwszego megabajta dysku) + 101M stosując również skróty jednostek + odnoszące się wyłacznie do wielkorotności jak M - megabajt, + G - gigabajt itd. Następną partycję moglibyśmy zacząć od 101M + i ustawiając jej koniec, na koniec pozostałej wolnej części dysku za + pomocą takiego wyrażenia jak: 100%Free. +

+
+[user@server2 ~]$ sudo parted /dev/vdb mkpart primary 1 101M
+[sudo] password for user: 
+Information: You may need to update /etc/fstab.
+
+[user@server2 ~]$ sudo parted /dev/vdb print
+Model: Virtio Block Device (virtblk)
+Disk /dev/vdb: 268MB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags: 
+
+Number  Start   End    Size    Type     File system  Flags
+ 1      1049kB  101MB  99.6MB  primary
+
+
+

+ Po podpoleceniu podajemy rodzaj partycji w tym przypadku jest to + primary, następnie podajemy jej + początek 1 oraz koniec + 101M. Tak utworzą partycję możemy + teraz usunąć za pomocą podpolecenia rm, które przyjmuje + numer jako argument. +

+
+[user@server2 ~]$ sudo parted /dev/vdb rm 1
+[sudo] password for user: 
+Information: You may need to update /etc/fstab.
+
+[user@server2 ~]$ sudo parted /dev/vdb print                              
+Model: Virtio Block Device (virtblk)
+Disk /dev/vdb: 268MB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags: 
+
+Number  Start  End  Size  Type  File system  Flags
+
+

13.3. Zarządzanie partycjami ze schematem GPT

+

+ Zarządzanie partycjami ze schematem GPT różni się od tego + ze schematem MBR. Nie tylko tym, że wykorzystuje się do tego + inne narzędzia. Te narzędzia mają również inną zasadę działania. Do + zarządzania partycjami GPT wykorzystuje się narzędzie + gdisk, które jest narzędziem interaktywnym, jego + różnica polega na tym, że nie zapisze ono zmian na dysku do póki nie + użyjemy odpowiednie polecenia. Polecenia w tym narzędziu przyjmują + postać pojedynczych liter, a ich listę możemy uzyskać w momencie + wydania polecenia znaku zapytania (?). Polecenie + uruchamia się podając nazwę urządzenia jako argument. +

+
+[user@server2 ~]$ sudo gdisk /dev/vdd
+GPT fdisk (gdisk) version 1.0.7
+
+Partition table scan:
+  MBR: not present
+  BSD: not present
+  APM: not present
+  GPT: not present
+
+Creating new GPT entries in memory.
+
+Command (? for help): ?
+b	back up GPT data to a file
+c	change a partition's name
+d	delete a partition
+i	show detailed information on a partition
+l	list known partition types
+n	add a new partition
+o	create a new empty GUID partition table (GPT)
+p	print the partition table
+q	quit without saving changes
+r	recovery and transformation options (experts only)
+s	sort partitions
+t	change a partition's type code
+v	verify disk
+w	write table to disk and exit
+x	extra functionality (experts only)
+?	print this menu
+
+Command (? for help): 
+
+

+ Polecenie na początku zwróci listę używanych na dysku schematów tablicy + partycji. Następnie wydałem odpowiednie polecenie aby wyświetić listę + dostępnych polecenień. Jak widać na dysku nie ma żadnej tablicy za + pomocą polecenia o zostanie stworzona nowa tablica + partycji (miejsce z informacjami o partycjach dysku) w schemacie + GPT. +

+
+Command (? for help): o       
+This option deletes all partitions and creates a new protective MBR.
+Proceed? (Y/N): Y
+Command (? for help): w
+
+Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
+PARTITIONS!!
+
+Do you want to proceed? (Y/N): y
+OK; writing new GUID partition table (GPT) to /dev/vdd.
+The operation has completed successfully.
+
+

+ Poza utworzeniem nowej tablicy partycji ze schematem GPT, + program zabezpieczy MBR dla wstecznej zgodności z komputerami + obsługiwanymi przez BIOS. Na koniec wyszedłem, aby zapisać + zmiany i uruchomiłem program ponownie. +

+
+[user@server2 ~]$ sudo gdisk /dev/vdd
+GPT fdisk (gdisk) version 1.0.7
+
+Partition table scan:
+  MBR: protective
+  BSD: not present
+  APM: not present
+  GPT: present
+
+Found valid GPT with protective MBR; using GPT.
+
+Command (? for help): 
+
+

+ Teraz program przedstawia, że odnalazł prawidłową tablicę ze schematem + GPT oraz zabezpieczony MBR. Teraz aby utworzyć + partycję użyje opcji n następnie pozostawie część domyślnych + informacji. Podam tylko jej wielkość w linii oznaczonej jako ostatnii + sektor. Wiecej szczegółów znajduje się na przykładzie poniżej: +

+
+Command (? for help): n
+Partition number (1-128, default 1): 
+First sector (34-524254, default = 2048) or {+-}size{KMGTP}: 
+Last sector (2048-524254, default = 524254) or {+-}size{KMGTP}: +100M
+Current type is 8300 (Linux filesystem)
+Hex code or GUID (L to show codes, Enter = 8300): 
+Changed type of partition to 'Linux filesystem'
+
+Command (? for help): p   
+Disk /dev/vdd: 524288 sectors, 256.0 MiB
+Sector size (logical/physical): 512/512 bytes
+Disk identifier (GUID): F5BE61A0-220E-409E-AB2F-18AFDD56D410
+Partition table holds up to 128 entries
+Main partition table begins at sector 2 and ends at sector 33
+First usable sector is 34, last usable sector is 524254
+Partitions will be aligned on 2048-sector boundaries
+Total free space is 319421 sectors (156.0 MiB)
+
+Number  Start (sector)    End (sector)  Size       Code  Name
+   1            2048          206847   100.0 MiB   8300  Linux filesystem
+
+
+

+ Warto zwrócić uwagę na to w jaki sposób została podana wielkość + partycji (+100M). Za pomocą opcji + p możemy wyświetlić zmiany jakie zaszły póki co w pamięci. + Więc żeby zmiany, które zostały utworzone zapisać podajemy polecnie + w, nastepnie potwierdzamy zapisanie zmian. +

+
+Command (? for help): w
+
+Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
+PARTITIONS!!
+
+Do you want to proceed? (Y/N): y
+OK; writing new GUID partition table (GPT) to /dev/vdd.
+The operation has completed successfully.
+
+

+ Aby usunąc partycję podajemy opcję d, która następnie + poprosi o podanie numery partycji o ile jest więcej niż jedna. Jeśli + jest tylko jedna automatycznie ją usunie. +

+
+[user@server2 ~]$ sudo gdisk /dev/vdd
+[sudo] password for user: 
+GPT fdisk (gdisk) version 1.0.7
+
+Partition table scan:
+  MBR: protective
+  BSD: not present
+  APM: not present
+  GPT: present
+
+Found valid GPT with protective MBR; using GPT.
+
+Command (? for help): d
+Using 1
+
+Command (? for help): p
+Disk /dev/vdd: 524288 sectors, 256.0 MiB
+Sector size (logical/physical): 512/512 bytes
+Disk identifier (GUID): F5BE61A0-220E-409E-AB2F-18AFDD56D410
+Partition table holds up to 128 entries
+Main partition table begins at sector 2 and ends at sector 33
+First usable sector is 34, last usable sector is 524254
+Partitions will be aligned on 2048-sector boundaries
+Total free space is 524221 sectors (256.0 MiB)
+
+Number  Start (sector)    End (sector)  Size       Code  Name
+
+

+ Oczywiście jeśli przypadkowo coś usuneliśmy lub zmieniliśmy możemy + użyć opcji q, aby zakończyć działanie programu bez zapisywania + zmian na dysku. +

+

+ Odnośnie egzaminu:
+ Znajomość zarówno parted oraz gdisk jest + wystarczająca, aby zrealizować proste zadania związane z zarządzaniem + dyskami na egzaminie. +

+

Ćwiczenie 1: Zarządzanie partycjami za pomocą parted

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server2 utwórz jedną 100 MB partycję na + jednym z dysków o pojemności 250 MB. Użyj do tego tablicy o schemacie + MBR. Do utworzenia partycji użyj narzędzia parted z + poziomu wiersza polecenia. Nastepnie utworz taką samą partycję ale w + trybie interaktywnym tego polecenia. Wyświetl informacje na temat + dysku. Na koniec usuń obie partycje używając wiersza polecenia. +

+

Ćwiczenie 2: Zarządzanie partycjami za pomocą gdisk

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server2 utwórz przy tablicy w schemacie + GPT dwie partycje po 80MB każda. Wyświetl informacje na temat + dysku. Jeśli chcesz usuń te partycje. +

+

Podsumowanie

+

+ W tym rozdziale poznaliśmy podstawy teoretyczne oraz praktyczne + zarządzania dyskami. Nauczyliśmy się tworzenia oraz usuwania partycji + przy różnych schematach tablic. W następnym rozdziale przejdziemy do + bardziej zaawansowanych czynności związanych z zarządzaniem pamięcią + masową w RHEL. +

+

14. Zaawansowane zarządzanie pamięcią masową

+

+ W tym rodziale zajmiemy się bardziej zawansowanymi zagadnieniami + związanymi zarządzaniem pamiecią masową. W tym rozdziale poruszymy + również pominięty z względu na zmiany w RHEL podrozdział + związany z bardziej efektywnym wykorzystaniem przestrzeni na dysku + dzięki VDO. Kolejnym zagadnienieniem będzie LVM, + który pozwala spojrzeć nieco inaczej na urządzenia służące do + przechowywania danych. Ostatnim tematem będzie Stratis, + który łączy ze sobą kilka komponentów systemu pozwalających na + stworzenie stablinego i wydajnego systemu plików (o systemach plików + będzie w następnym rozdziale). +

+

14.1. Zarządzanie pamięcią masową przy użyciu LVM

+

+ LVM, czyli Logical Volume Manager pozwala + inaczej spojrzeć na dostępne w naszych komputerach dyski. Za pomocą + tego narzędzia możemy zebrać wszystkie dostępne w systemie dyski + zainicjować je, aby były gotowe do pracy z LVM, wówczas + dyski stają się woluminami fizycznymi. Woluminy + fizyczne łączy się w grupę woluminów, która staje + się pulą to tworzenie nowych urządzeń dyskowych bazujących na miejscu + dostępnym w grupie. Takie urządzenia noszą nazwę + woluminów logicznych. W ujęciu LVM + najmiejszą logiczną jednostką alokacji przestrzeni dyskowej są + ekstenty. Ekstenty dzielą się na logiczne będące + cząstkami woluminów logicznych oraz na fizyczne będące elementami + woluminów fizycznych. Ekstenty podczas tworzenia grupy woluminów + mają domyślną wielkość wynoszącą około 4 MB. + Oczywiście można to zmienić. A wielkości ekstentów (logicznych i + fizycznych) nie muszą być sobie równe. Pojęcie ekstenów będzie + potrzebne nam przy VDO. +

+

+ Elementy logiczne LVM są bardzo eleastyczne, może je dodawać + usuwać, rozszerzać, zmniejszać i zmieniać wcześniej nadane nazwy. + Tym się właśnie zajmiemy w tym rodziale. Oczywiście będziemy pracować + z urządzeniami więc niezbędne będą uprawnienia administratora. +

+

14.1.1. Tworzenie woluminów fizycznych

+

+ Aby rozpocząć pracę z LVM musimy przekształcić dysk lub + partycję aby nadawała się do pracy z tym rozwiązaniem. Na tych + urządzeniach blokowych zostaną utworzone specjalne struktury, dzięki + czemu będzie można później włączyć je do grupy. +

+

+ Chcąc użyć partycji jako woluminu fizycznego tworzmy partycje, bez + znaczenia czy jest schemat tablicy partycji GPT czy MBR, następnie + partycji ustawiamy flagę lvm. Tak przygotowana partycja + jest gotowa by użyć jej jako woluminu fizycznego. Poniżej znajduje się + przykład przedstawiający jak to zrealizować. +

+
+[user@rhel90 ~]$ sudo gdisk /dev/vdb
+GPT fdisk (gdisk) version 1.0.7
+
+Partition table scan:
+  MBR: not present
+  BSD: not present
+  APM: not present
+  GPT: not present
+
+Creating new GPT entries in memory.
+
+Command (? for help): o
+This option deletes all partitions and creates a new protective MBR.
+Proceed? (Y/N): Y
+
+Command (? for help): p
+Disk /dev/vdb: 524288 sectors, 256.0 MiB
+Sector size (logical/physical): 512/512 bytes
+Disk identifier (GUID): 66CCB514-9659-461D-834B-1661E9D112F4
+Partition table holds up to 128 entries
+Main partition table begins at sector 2 and ends at sector 33
+First usable sector is 34, last usable sector is 524254
+Partitions will be aligned on 2048-sector boundaries
+Total free space is 524221 sectors (256.0 MiB)
+
+Number  Start (sector)    End (sector)  Size       Code  Name
+
+Command (? for help): n
+Partition number (1-128, default 1): 
+First sector (34-524254, default = 2048) or {+-}size{KMGTP}: 
+Last sector (2048-524254, default = 524254) or {+-}size{KMGTP}: +128M
+Current type is 8300 (Linux filesystem)
+Hex code or GUID (L to show codes, Enter = 8300): 8e00
+Changed type of partition to 'Linux LVM'
+
+Command (? for help): w
+
+Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
+PARTITIONS!!
+
+Do you want to proceed? (Y/N): y
+OK; writing new GUID partition table (GPT) to /dev/vdb.
+The operation has completed successfully.
+
+

+ Tak utworzoną partycje możemy zainicjować jako wolumin fizyczny za + pomocą polecenia pvcreate. +

+
+[user@rhel90 ~]$ sudo pvcreate /dev/vdb1
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Physical volume "/dev/vdb1" successfully created.
+
+

+ Teraz wolumin nadaje się do podłączenia do grupy. +

+

+ Inicjowanie całych dysków jest o wiele prostsze. Wystarczy użyć + polecenie pvcreate i podać nazwę urządzenia jako argument. +

+
+[user@rhel90 ~]$ sudo pvcreate /dev/vdc
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Physical volume "/dev/vdc" successfully created.
+
+

+ Listę dostępnych w systemie woluminów fizycznych możemy wyświetlić + za pomocą polecenia pvs. +

+
+[user@rhel90 ~]$ sudo pvs
+[sudo] hasło użytkownika user: 
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  PV         VG   Fmt  Attr PSize   PFree  
+  /dev/vda2  rhel lvm2 a--  <11,00g      0 
+  /dev/vdb1       lvm2 ---  128,00m 128,00m
+  /dev/vdc        lvm2 ---  256,00m 256,00m
+
+

+ Kolumny oznaczają kolejno: fizyczny wolumin + (PV), grupę do której należy fizyczny + wolumin (VG), format + (Fmt), atrybuty + (Attr, wartości poszczególnych bitów + są rozpisane w na stronie podręcznika), rozmiar fizyczny + (PSize) oraz fizyczną ilość wolnego + miejsca (PFree). +

+

14.1.2. Tworzenie grup woluminów

+

+ Posiadając już odpowiednie zasoby w postaci woluminów fizycznych, + możemy utworzyć grupę woluminów, aby móc zarządzać zaawansowanymi + właściwościami LVM. Grupy tworzone są za pomocą polecenia + vgcreate. Utworzę teraz grupę z wcześniej stworzonych + woluminów. +

+
+[user@rhel90 ~]$ sudo vgcreate vg_course /dev/vdb1 /dev/vdc
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Volume group "vg_course" successfully created
+
+

+ Polecenie przyjmuje jako pierwszy argument nazwę grupy a następnie + wchodzące w jej skład fizyczne woluminy. Listę utworzonych w systemie + grup możemy wyświetlić za pomocą polecenia vgs. + Natomiast bardziej szczegółowe informacje na temat grupy możemy + uzyskać więcej informacji za pomocą polecenia vgdisplay. +

+
+[user@rhel90 ~]$ sudo vgs
+[sudo] hasło użytkownika user: 
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  VG        #PV #LV #SN Attr   VSize   VFree  
+  rhel        1   2   0 wz--n- <11,00g      0 
+  vg_course   2   0   0 wz--n- 376,00m 376,00m
+
+

+ Polecenie to zwraca informacje podobne do poprzedniego polecenia + pvs. Dodatkowe kolumny zwracają informacje na temat + ilość woluminów fizycznych w grupie + (#PV), ilość woluminów logicznych + (#LV) oraz ilość snapshotów w + grupie woluminów. Reszta kolumn jest podobna do tych informacji + zwracanych przez pvs. Innym narzędziem zwracającym więcej + informacji na temat grupy woluminów jest vgdisplay, + jako argument przyjmuje ona nazwę grupy, jeśli zostanie pominięta + polecenie zwróci informacje na temat wszystkich grup w systemie. +

+
+[user@rhel90 ~]$ sudo vgdisplay vg_course 
+[sudo] hasło użytkownika user: 
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  --- Volume group ---
+  VG Name               vg_course
+  System ID             
+  Format                lvm2
+  Metadata Areas        2
+  Metadata Sequence No  1
+  VG Access             read/write
+  VG Status             resizable
+  MAX LV                0
+  Cur LV                0
+  Open LV               0
+  Max PV                0
+  Cur PV                2
+  Act PV                2
+  VG Size               376,00 MiB
+  PE Size               4,00 MiB
+  Total PE              94
+  Alloc PE / Size       0 / 0   
+  Free  PE / Size       94 / 376,00 MiB
+  VG UUID               g4X6FW-P1fu-jS0t-UaGg-8mIK-Kv0J-2bLWSD
+
+

+ Polecenie to zwraca rozmiar fizycznych ekstentów, który w tym + przypadku posiada wartość domyślną. Rozmiar ten możemy zmienić + podając opcje -s oraz wielkość fizycznych ekstentów jako + argument opcji podczas tworzenia grupy. Chcąc wydobyć konkretne + informacje z tego polecenia możemy posłużyć się poleceniem + grep. +

+
+[user@rhel90 ~]$ sudo vgdisplay vg_course | grep 'PE Size'
+[sudo] hasło użytkownika user: 
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  PE Size               4,00 MiB
+
+

14.1.3. Tworzenie woluminów logicznych LVM

+

+ Do tworzenia woluminów logicznych służy polecenie + lvcreate. Wydając to polecenie wraz z opcją + --help, zostaną nam zwrócone wszystkie możliwe rodzaje + segmentów + woluminów logicznych. W tym materiale będą nas interesować tylko dwa + linear (liniowy, zwykły) oraz VDO. O + VDO będzie w + następnym podrozdziale. Zatem do stworzenia liniowego woluminu + logicznego potrzebujemy wielkości (opcja -L) oraz nazwy grupy + w której ma zostać stworzony. + Inną dość przydatną opcją, niezależną od rodzaju woluminu + jest opcja -n, która pozwala na nadanie nazwy woluminowi. + Teraz utworzę wolumin logiczny w grupie, którą wcześniej utworzyłem. +

+
+[user@rhel90 ~]$ sudo lvcreate -L 100MB -n lvol0 vg_course
+  Logical volume "lvol0" created.
+
+

+ Czasami podana wielkość woluminu może zostać zaokrąglona, ze względu + na potrzebę użycia okrągłej liczby ekstentów. W przypadku tego woluminu + zostały użyte 25 ekstenty (25 x 4MB = 100MB), co możemy podejrzeć + wydając polecenie + vgdisplay z opcją -v Przez co zwróci ona bardziej + szczegółowe informacje na temat grupy, w tym informacje na temat + woluminów logicznych w niej zawartych. +

+
+[user@rhel90 ~]$ sudo vgdisplay -v vg_course
+...
+  --- Logical volume ---
+  LV Path                /dev/vg_course/lvol0
+  LV Name                lvol0
+  VG Name                vg_course
+  LV UUID                Z2cH37-sWGu-NEIR-JoKN-AT5M-o5EI-d8QmKU
+  LV Write Access        read/write
+  LV Creation host, time rhel90, 2022-07-22 11:35:47 +0200
+  LV Status              available
+  # open                 0
+  LV Size                100,00 MiB
+  Current LE             25
+  Segments               1
+  Allocation             inherit
+  Read ahead sectors     auto
+  - currently set to     256
+  Block device           253:2
+...
+
+

+ Innm narzędziem, które zwraca informacje na temat woluminów logicznych + jest lvs. Zwraca ono podobne informacje do vgs + na przykład: +

+
+[user@rhel90 ~]$ sudo lvs
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  LV   VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
+  root rhel -wi-ao---- 9,79g                                                    
+  swap rhel -wi-ao---- 1,20g       
+
+

+ Informacje zawierają nazwę woluminu + (LV), + grupę woluminów (VG), atrybuty + (Attr) oraz wielkości + (LSize). +

+

+ Poza klasyczną wielkością podawną w wielkrotnościach bajtów, wielkość + woluminu możemy podawać ilości ekstentów, służy do tego opcją + -l. +

+

+ Tak utworzone woluminy są pełno prawnymi urządzeniami blokowymi + przypominającymi partycję. Możemy zainstalować na nich odpowiedni + system + plików (będzie o tym w następnym rozdziale), zamontować je w systemie + i wykorzystać do przechowywania danych. +

+

14.1.4. Zmiana nazwy elementów LVM

+

+ Nazwę możemy zmienić takim elementom jak wolumin logiczny - polecenie + lvrename oraz grupa woluminów - polecenie + vgrename. Polecenie lvrename wymaga podania + scieżki do woluminu (znajdziemy go za pomocą polecenia + vgdisplay -v) oraz nowej nazwy. Możemy ominąć potrzebę + podawania ścieżki do woluminu, poprzedzając jego nazwę, nazwą grupy. + Ze zmianą nazwy grupy jest o wiele prościej wystarczy podać poleceniu + vgrename starą nazwę grupy oraz nową. +

+

+ Zmiana nazwy woluminu za pomoca ścieżki woluminu: +

+
+[user@rhel90 ~]$ sudo lvrename /dev/vg_course/lvol0 rhelvol0
+  Renamed "lvol0" to "rhelvol0" in volume group "vg_course"
+
+

+ Zmiana nazwy woluminu za pomocą nazwy grupy: +

+
+[user@rhel90 ~]$ sudo lvrename vg_course rhelvol0 rhel9vol0
+  Renamed "rhelvol0" to "rhel9vol0" in volume group "vg_course"
+
+

+ Zmiana nazwy grupy: +

+
+[user@rhel90 ~]$ sudo vgrename vg_course rhcsa9
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Volume group "vg_course" successfully renamed to "rhcsa9"
+
+

14.1.5. Rozszerzanie elementów LVM

+

+ Za pomocą poleceń vgextend możemy rozszerzyć grupę + woluminów o dodatkowe woluminy fizyczne. Natomiast za pomocą polecenia + lvextend możemy rozszerzyć wolumin logiczny o + dodatkowe miejsce, przy czym wolumin należy podać w postaci ścieżki. +

+

+ Rozszerzenie grupy woluminów o kolejny wolumin fizyczny: +

+
+[user@rhel90 ~]$ sudo vgextend rhcsa9 /dev/vdd
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Volume group "rhcsa9" successfully extended
+
+

+ Rozszerzenie woluminów logicznych o dodatkową przestrzeń: +

+
+[user@rhel90 ~]$ sudo lvextend -L +100M /dev/rhcsa9/rhel9vol0
+  Size of logical volume rhcsa9/rhel9vol0 changed from 100,00 MiB (25 extents) to 200,00 MiB (50 extents).
+  Logical volume rhcsa9/rhel9vol0 successfully resized.
+
+

+ Zwróćmy uwagę w jaki sposób podajemy wielkość o którą chcemy rozszerzyć + podany wolumin. +

+

14.1.6. Zmniejszanie elementów LVM

+

+ Za pomocą kolejnej pary poleceń lvreduce, oraz + vgreduce możemy zmniejszyć ilość miejsca w + przypadku woluminów logicznych oraz usunąć z grupy okreslone woluminy + fizyczne. Przyczym warto dodać, o ile rozszerzenie miejsca nie było + działaniem destrukcyjnym (gdy np. na woluminach logicznych znajdują + sie systemy plików oraz dane) to zmieniejszanie z całą pewnością jest + takim działaniem. +

+

+ Zmniejszenie woluminu logicznego o 50 MB, przy czym wielkość możemy + podać odejmując podaną wartość lub podając nową wielkość dla + woluminu. Obie formy są poprawne. +

+
+[user@rhel90 ~]$ sudo lvreduce -L -50M /dev/rhcsa9/rhel9vol0
+[sudo] hasło użytkownika user: 
+  Rounding size to boundary between physical extents: 48,00 MiB.
+  WARNING: Reducing active logical volume to 152,00 MiB.
+  THIS MAY DESTROY YOUR DATA (filesystem etc.)
+Do you really want to reduce rhcsa9/rhel9vol0? [y/n]: y
+  Size of logical volume rhcsa9/rhel9vol0 changed from 200,00 MiB (50 extents) to 152,00 MiB (38 extents).
+  Logical volume rhcsa9/rhel9vol0 successfully resized.
+
+[user@rhel90 ~]$ sudo lvreduce -L 100M /dev/rhcsa9/rhel9vol0
+  WARNING: Reducing active logical volume to 100,00 MiB.
+  THIS MAY DESTROY YOUR DATA (filesystem etc.)
+Do you really want to reduce rhcsa9/rhel9vol0? [y/n]: y
+  Size of logical volume rhcsa9/rhel9vol0 changed from 152,00 MiB (38 extents) to 100,00 MiB (25 extents).
+  Logical volume rhcsa9/rhel9vol0 successfully resized.
+
+

+ Usunięcie z grupy jednego z woluminów fizycznych. +

+
+[user@rhel90 ~]$ sudo vgreduce rhcsa9 /dev/vdd
+[sudo] hasło użytkownika user: 
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Removed "/dev/vdd" from volume group "rhcsa9"
+
+

14.1.7. Wycofywanie zmian LVM na dyskach

+

+ Wycofywanie zmian rozpoczniemy od usunięcia woluminów logicznych a + służy temu polecenie lvremove, aby usunąć wolumin + podaje się nazwę grupy oraz nazwę woluminu: +

+
+[user@rhel90 ~]$ sudo lvremove rhcsa9 rhel9vol0
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+Do you really want to remove active logical volume rhcsa9/rhel9vol0? [y/n]: y
+  Logical volume "rhel9vol0" successfully removed.
+  Volume group "rhel9vol0" not found
+  Cannot process volume group rhel9vol0
+
+

+ Kombinację tych dwóch wartości możemy zastąpić ścieżką do woluminu, a + potwierdzenie możemy wymusić za pomocą opcji -f. +

+

+ Po usunięciu woluminów przyszedł czas na usunięcie grupy woluminów, do + tego należy wykorzystać polecenie vgremove. Polecenie + to przyjmuje nazwę grupy jako argument. +

+
+[user@rhel90 ~]$ sudo vgremove rhcsa9
+[sudo] hasło użytkownika user: 
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Volume group "rhcsa9" successfully removed
+
+

+ Po usunięciu grupy pozostaje tylko wyczyszcznie dysków ze wszelkich + struktur stworzonych na potrzeby LVM. Polecenie, które wykona + tę czynność to pvremove. +

+
+[user@rhel90 ~]$ sudo pvremove /dev/vdb1 /dev/vdc
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Labels on physical volume "/dev/vdb1" successfully wiped.
+  Labels on physical volume "/dev/vdc" successfully wiped.
+
+

14.2. Wykorzystanie VDO do zarządzania pamięciami masowymi

+

+ VDO, czyli Virtual Disk Optimizer jest + technologia zarządzania pamięciami masowymi pozwalająca na + zaoszczędzenie wykorzystywanej przestrzeni, zwiększenie wydajności + przesyłanych danych oraz zaoszczędzenie pieniędzy przeznaczonych na + zakup dysków. VDO wykorzystuje takie techniki jak kompresja, + technologia thin provisioning oraz unikanie tworzenia + duplikatów plików. Kiedyś VDO było odrębną techniką tak jak + LVM czy Stratis. Obecnie od RHEL 8.5 + zostało zunifikowane wraz z LVM jako jeden z rodzajów + logicznych woluminów. Tym zajmiemy się tym podrodziale otóż utworzymy + logiczny volumin VDO. +

+

+ Aby użyć wolumin typu VDO musimy dysponować co najmniej 5GB + przestrzenii w grupie woluminów. Ja poniżej stworzyłem grupę składającą + się z jednego 10GB fizycznego voluminu. +

+
+[user@rhel90 ~]$ sudo pvcreate /dev/vdf
+[sudo] hasło użytkownika user: 
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Physical volume "/dev/vdf" successfully created.
+[user@rhel90 ~]$ sudo vgcreate vg-vdo /dev/vdf
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Volume group "vg-vdo" successfully created
+[user@rhel90 ~]$ sudo vgs
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  VG     #PV #LV #SN Attr   VSize   VFree  
+  rhel     1   2   0 wz--n- <11,00g      0 
+  vg-vdo   1   0   0 wz--n- <10,00g <10,00g
+
+

+ Przed utworzeniem woluminu, musimy poznać ilość ekstentów dostępnych + w grupie. Za pomocą poniższego polecenia możemy ustalić te liczbę. + Jest ona istotna, ponieważ jeśli jej nie podamy nie będziemy mogi + skorzystać z thin provisioning. +

+
+[user@rhel90 ~]$ sudo vgdisplay -v vg-vdo | grep 'Free PE'
+[sudo] hasło użytkownika user: 
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  Total PE / Free PE    2559 / 2559
+
+

+ Teraz możemy za pomocą polecenia lvcreate utworzyć wolumin + logiczny w stylu VDO: +

+
+[user@rhel90 ~]$ sudo lvcreate --type vdo -n vdo-vol0 -l 2559 -V 1TB vg-vdo
+    The VDO volume can address 6 GB in 3 data slabs, each 2 GB.
+    It can grow to address at most 16 TB of physical storage in 8192 slabs.
+    If a larger maximum size might be needed, use bigger slabs.
+  Logical volume "vdo-vol0" created.
+
+

+ W ten sposób stworzyłem wolumin w stylu VDO, za pomocą opcji + -V podaje wirtualną wielkość tego urządzenia. Polecenie poza + utworzeniem podanego woluminu utworzy dodatkowy wolumin puli. Tak + utworzony wolumin + VDO może nam posłużyć do przechowywania danych na serwerze. + Poniżej znajduje się wynik działania poleceń lvs oraz + vgdisplay. +

+
+[user@rhel90 ~]$ sudo lvs -a vg-vdo
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  LV             VG     Attr       LSize   Pool   Origin Data%  Meta%  Move Log Cpy%Sync Convert
+  vdo-vol0       vg-vdo vwi-a-v---   1,00t vpool0        0,00                                   
+  vpool0         vg-vdo dwi------- <10,00g            40,02                                  
+  [vpool0_vdata] vg-vdo Dwi-ao---- <10,00g                                                      
+
+

+ Zwróćmy uwagę, że samo utrzymanie takiego woluminu, kosztuje nas 4GB + miejsca na dysku i nie jest to zależne od jego rozmiaru. Poniżej + znajdują się informacje uzyskane z polecenia vgdisplay: +

+
+[user@rhel90 ~]$ sudo vgdisplay -v vg-vdo
+  Devices file PVID none last seen on /dev/vdd1 not found.
+  Devices file PVID none last seen on /dev/vdd2 not found.
+  Devices file PVID none last seen on /dev/vdc1 not found.
+  --- Volume group ---
+  VG Name               vg-vdo
+  System ID             
+  Format                lvm2
+  Metadata Areas        1
+  Metadata Sequence No  16
+  VG Access             read/write
+  VG Status             resizable
+  MAX LV                0
+  Cur LV                2
+  Open LV               0
+  Max PV                0
+  Cur PV                1
+  Act PV                1
+  VG Size               <10,00 GiB
+  PE Size               4,00 MiB
+  Total PE              2559
+  Alloc PE / Size       2559 / <10,00 GiB
+  Free  PE / Size       0 / 0   
+  VG UUID               qPdY4n-YQUG-x5tu-szTe-B3bT-idC8-vseZXH
+   
+  --- Logical volume ---
+  LV Path                /dev/vg-vdo/vpool0
+  LV Name                vpool0
+  VG Name                vg-vdo
+  LV UUID                H9mloX-8x8N-4OHz-HHvz-qWhZ-dnJE-Sq1sCX
+  LV Write Access        read/write
+  LV Creation host, time rhel90, 2022-07-22 15:17:50 +0200
+  LV VDO Pool data       vpool0_vdata
+  LV VDO Pool usage      40,02%
+  LV VDO Pool saving     100,00%
+  LV VDO Operating mode  normal
+  LV VDO Index state     online
+  LV VDO Compression st  online
+  LV VDO Used size       4,00 GiB
+  LV Status              NOT available
+  LV Size                <10,00 GiB
+  Current LE             2559
+  Segments               1
+  Allocation             inherit
+  Read ahead sectors     auto
+   
+  --- Logical volume ---
+  LV Path                /dev/vg-vdo/vdo-vol0
+  LV Name                vdo-vol0
+  VG Name                vg-vdo
+  LV UUID                sc5RL6-LfF6-jzCT-6TNK-c4Q3-J2sf-m1ZufS
+  LV Write Access        read/write
+  LV Creation host, time rhel90, 2022-07-22 15:17:53 +0200
+  LV VDO Pool name       vpool0
+  LV Status              available
+  # open                 0
+  LV Size                1,00 TiB
+  Current LE             262144
+  Segments               1
+  Allocation             inherit
+  Read ahead sectors     auto
+  - currently set to     256
+  Block device           253:4
+   
+  --- Physical volumes ---
+  PV Name               /dev/vdf     
+  PV UUID               kAxqd2-v4Xo-nmB8-311H-nM2d-DtHn-WutyCf
+  PV Status             allocatable
+  Total PE / Free PE    2559 / 0
+
+

+ W RHEL pozostało jeszcze jedno polecenie, które pozwala + zwrócić + statystykę na temat obecnego w systemie woluminu puli VDO, + takim poleceniem jest vdostats. Poniżej znajduje się + przykład jego użycia. +

+
+[user@rhel90 ~]$ sudo vdostats --si
+Device                    Size      Used Available Use% Space saving%
+vg--vdo-vpool0-vpool     10.7G      4.3G      6.4G  40%            0%
+
+

+ Na powyższym przykładzie użyłem opcji + --si, aby przeskalować jednostki do + poziomu czytelnego dla człowieka. +

+

+ Usuwanie takiego woluminu wygląda jak usuwanie każdego innego woluminu, + jednak w tym przypadku program zapyta czy usunąć także zależny wolumin + puli. +

+

14.4. Zarządzanie pamięcią masową za pomocą Stratis

+

+ Stratis jest to technologia łącząca ze sobą trzy + kompnenty systemowe, pozwalając na łączenie dysków w pule oraz + tworzenie + już gotowych do montowania systemów plików typu XFS. + Stratis jest praktycznie rzecz biorąc bardzo podobny do + LVM jednak nie tworzymy logicznych woluminów, a gotowe + systemy plików, grupa do której należą dyski nazwane + w tym przypadku blockdev nazywana jest + pulą. +

+

+ Stratis nie jest natywnie dostępny w systemie i trzeba go zainstalować. + Pakiety znajdują się w repozytorium na płycie instalacyjnej z + RHEL 9. + Aby zainstalować w Stratis za systemie wydajemy poniższe + polecenie: +

+
+[user@rhel90 ~]$ sudo dnf install stratisd stratis-cli -y
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 0:36:10 temu w dniu pią, 22 lip 2022, 15:23:29.
+Pakiet stratisd-2.4.2-3.el9.x86_64 jest już zainstalowany.
+Pakiet stratis-cli-2.4.3-2.el9.noarch jest już zainstalowany.
+Rozwiązano zależności.
+Nie ma nic do zrobienia.
+Ukończono.
+
+

+ Stratis występuje w systemie w postaci demona, dlatego też należy + włączyć i uruchomić jego jednostkę. +

+
+[user@rhel90 ~]$ sudo systemctl enable stratisd.service
+[user@rhel90 ~]$ sudo systemctl start stratisd.serivce
+[user@rhel90 ~]$ sudo systemctl status stratisd
+● stratisd.service - Stratis daemon
+     Loaded: loaded (/usr/lib/systemd/system/stratisd.service; enabled; vendor preset: enabled)
+     Active: active (running) since Fri 2022-07-22 08:16:57 CEST; 7h ago
+       Docs: man:stratisd(8)
+   Main PID: 758 (stratisd)
+      Tasks: 6 (limit: 7746)
+     Memory: 4.1M
+        CPU: 8.731s
+     CGroup: /system.slice/stratisd.service
+             └─758 /usr/libexec/stratisd --log-level debug
+
+lip 22 08:16:56 rhel90 stratisd[758]: [2022-07-22T06:16:56Z INFO  libstratis::stratis::run] stratis daemon version 2.4.2 started
+lip 22 08:16:56 rhel90 stratisd[758]: [2022-07-22T06:16:56Z INFO  libstratis::stratis::run] Using StratEngine
+lip 22 08:16:56 rhel90 stratisd[758]: [2022-07-22T06:16:56Z INFO  libstratis::engine::strat_engine::liminal::identify] Beginning initial ...
+lip 22 08:16:56 rhel90 stratisd[758]: [2022-07-22T06:16:56Z DEBUG libstratis::stratis::run] 2: thread started
+lip 22 08:16:56 rhel90 stratisd[758]: [2022-07-22T06:16:56Z DEBUG libstratis::stratis::run] 3: thread started
+lip 22 08:16:57 rhel90 stratisd[758]: [2022-07-22T06:16:57Z INFO  libstratis::stratis::ipc_support::dbus_support] D-Bus API is available
+...
+
+

14.3.1. Tworzenie puli Stratis

+

+ Teraz kiedy Stratis jest uruchomiony. Możemy przejść do + utworzenia puli. Do utworzenia puli użyjemy podpolecenia pool + polecenia stratis oraz podpolecenia create + podpolecenia pool. Jako argumenty podajemy nazwę puli oraz + listę dysków. +

+
+[user@rhel90 ~]$ sudo stratis pool create rhcsa /dev/vdg
+[sudo] hasło użytkownika user: 
+
+

+ Informacje na temat puli możemy uzyskać za pomocą podpolecenia + list podpolecenia pool. +

+
+[user@rhel90 ~]$ sudo stratis pool list
+Name                    Total Physical   Properties                                   UUID
+rhcsa   1 GiB / 37.63 MiB / 986.37 MiB      ~Ca,~Cr   5091bc53-7693-4a92-a434-fe8e682d0f58
+
+

+ Z informacji zwracanych z tego polecenie nas na tym etapie powinno + interesować kolumna zawierająca informacje o wielkości puli. Teraz + możemy utworzyć system plików. +

+

14.3.2. Tworzenie systemu plików Stratis

+

+ Tworzenie systemu plików odbywa się za pomocą podpolecenia + create, podpolecenia filesystem. To podpolecenie + wymaga jako argumenty nazwę puli oraz nazwę systemu plików. +

+
+[user@rhel90 ~]$ sudo stratis filesystem create rhcsa rhcsafs0
+[user@rhel90 ~]$ sudo stratis filesystem
+Pool Name   Name       Used      Created             Device                        UUID                                
+rhcsa       rhcsafs0   546 MiB   Jul 22 2022 16:34   /dev/stratis/rhcsa/rhcsafs0   5ca8e5b1-f32a-42e0-ac90-29777b3fc8ed
+
+

+ Zwróćmy uwagę na to, iż Stratis sam dobiera na podstawie + wielkości puli wielkość systemu plików. Tak utworzony system jest + dostępny pod ścieżką w kolumnie + Device i gotowy do montowania. +

+

14.3.3. Rozszerzenie puli oraz zmiana nazwy puli i systemu plików Stratis

+

+ Do rozszerzenia puli Stratis służy podpolecenie + add-data podpolecenia pool. To podpolecenie oczekuje + podania nazwy urządzenia dyskowego. +

+
+[user@rhel90 ~]$ sudo stratis pool add-data rhcsa /dev/vdh
+[user@rhel90 ~]$ sudo stratis blockdev
+Pool Name   Device Node   Physical Size   Tier
+rhcsa       /dev/vdg              1 GiB   Data
+rhcsa       /dev/vdh              1 GiB   Data
+
+

+ Za pomoca podpolecenia blockdev, mamy + możliwość podejrzenia przypisanych do puli dysków. Jak widzimy teraz + w puli znajdują się dwa dyski, zatem będziemy mogli utworzyć kolejny + system plików, ponieważ samych systemów plików nie możemy zmienić. + Teraz zmienimy nazwę puli oraz nazwę systemu plików. +

+

+ Do zmiany nazw służy podpolecenie rename kolejno podpolecenia + pool + oraz filesystem. Na poniższym przykładzie znajduje się + zastosowanie tego podpolecenia: +

+
+[user@rhel90 ~]$ sudo stratis pool rename rhcsa rhcsa9
+[user@rhel90 ~]$ sudo stratis filesystem rename rhcsa9 rhcsafs0 rhcsa9fs0
+
+

14.3.4. Usuwanie elementów Stratis

+

+ Za pomocą podpolecenia destroy możemy usunąć zarówno system + plików jak i pulę Stratis. Poniżej znajduje się przykład + użycia, tego podpolecenia w innych ujęciach. +

+

+ Usunięcie systemu plików: +

+
+[user@rhel90 ~]$ sudo stratis filesystem destroy rhcsa9 rhcsa9fs0
+
+

+ Usunięcie puli Stratis: +

+
+[user@rhel90 ~]$ sudo stratis pool destroy rhcsa9
+
+

+ Żadna pula już w systemie nie istnieje. +

+
+[user@rhel90 ~]$ sudo stratis pool
+Name   Total Physical   Properties   UUID
+
+

+ Odnośnie egzaminu:
+ Nie musimy uczyć się na pamięć podpoleceń czy składni. Wiekszość + informacji możemy uzyskać wydając polecenie z opcją --help lub + wydać samo podpolecenie bez argumentów. Jedyne o czym należy pamiętać + to które polecenie lub podpolecenie jest od czego. +

+

Ćwiczenie 1: Tworzenie grup woluminów oraz logicznych woluminów

+

+ Jako użytkownik z możliwością podniesienia uprawnień na serwerze + oznaczonym jako server2. Stwórz z jedego z 250MB dysków + wolumin fizyczny następnie utwórz grupę vg100 ustawiając + wielkość fizycznych ekstentów na 16MB, wykorzystując utworzony fizyczny + wolumin. Utwórz dwa woluminy logiczne o nazwach kolejno lvol0 + oraz swapvol o wielkości 100 oraz 120MB. Zweryfikuj wykonane + wcześniej czynności za pomocą poleceń: pvs, lvs, + vgs oraz vgdisplay. +

+

Ćwiczenie 2: Rozszerzenie grupy woluminów oraz logicznego woluminu

+

+ Jako użytkownik z możliwością podniesienia uprawnień na serwerze + oznaczonym jako server2. Użyj kolejnego dysku o wielkości + 250MB jako woluminu fizycznego LVM. Dodaj nowy wolumin do + grupy z poprzedniego ćwiczenia. Rozszerz pojemność woluminu logicznego + lvol0 do 300MB. Sprawdź wykonane czynności za pomocą poleceń: + pvs, lvs, vgs oraz vgdisplay. +

+

Ćwiczenie 3: Redukcja oraz usunięcie woluminów logicznych

+

+ Jako użytkownik z możliwością podniesienia uprawnień na serwerze + oznaczonym jako server2. Zmniejsz rozmiar woluminu + logicznego lvol0 do 80MB. Usuń oba woluminy logiczne. + Sprawdź wykonane czynności za pomocą poleceń: + pvs, lvs, vgs oraz vgdisplay. +

+

Ćwiczenie 4: Wycofywanie zmian LVM na dyskach

+

+ Jako użytkownik z możliwością podniesienia uprawnień na serwerze + oznaczonym jako server2. Usuń grupę woluminów logicznych + vg100. Wyczyść konfiguracje LVM z dysków. + Sprawdź wykonane czynności za pomocą polecenia lsblk. +

+

Ćwiczenie 5: Logiczne woluminy VDO

+

+ Jako użytkownik z możliwością podniesienia uprawnień na serwerze + oznaczonym jako server2. Utwórz konfigurację LVM na + podstawie jedno z 10GB dysków (jeśli nie masz takiego dysku, dodaj go). + W utworzonej grupie utwórz wolumin VDO o wielkości wirtualnej + 50GB. Zweryfikuj wykonanie czynności za pomocą poleceń + vgdisplay oraz vdostats. Wycofaj wszystkie dokonane + zmiany. +

+

Ćwiczenie 6: Tworzenie puli Stratis

+

+ Jako użytkownik z możliwością podniesienia uprawnień na serwerze + oznaczonym jako server2. Sprawdź za pomocą lsblk + dostępność jednego dysków o pojemności 1GB. Nastepnie utwórz z jego + użyciem nową pulę Stratis o nazwie strpool. + Potwierdź wykonanie czynności wyświetlając informacje o puli oraz + o urządzeniach blokowych za pomocą podpoleceń polecenia Stratis + oraz polecenia lsblk. +

+

Ćwiczenie 7: Rozszerzenie i usunięcie puli Stratis

+

+ Jako użytkownik z możliwością podniesienia uprawnień na serwerze + oznaczonym jako server2. Za pomocą drugiego dysku o pojemności + 1GB rozszerz rozmiar puli Stratis strpool. + Zweryfikuj wykonaną czynność. Na koniec usuń pulę Stratis, + zweryfikuj to za pomocą polecenia lsblk. +

+

Podsumowanie

+

+ W tym rozdziale poznaliśmy zaawansowane sposoby na zarządzanie + dyskami naszych komputerów. Poznaliśmy wiele poleceń, + których składni nie trzeb się uczyć na pamięć. Trzeba się jednak + orientować jakie polecenie jest do czego. Poznaliśmy zaległą + technologię VDO oraz trochę uprzedzającą fakty zebrane w + następnym rodziale technologię Stratis. W następnym rozdziale + poznamy systemy plików oraz sposoby na formatowanie tworzonych w tym + oraz w poprzednim rozdziale urządzeń blokowych, aby w końcu można + było ich użyć do przechowywania danych. +

+

15. Systemy plików oraz przestrzeń wymiany

+

+ W ostatnich dwóch rozdziałach poruszaliśmy temat zarządzania + przestrzenią dyskową. Oczywiście opisywane tam metody znajdą również + zastosowanie w przypadku innych pamięci masowych niż dyski. Czynności + wykonywane tam kończyły się wraz z utworzeniem docelowego urządzenia + przeznaczonego do przechowywania danych. To jednak nie koniec, aby + takie urządzenie mogło przechowywać dane muszą zostać na nim + zainstalowane specjalne struktury, które będą zajmować się organizacją + oraz sposobem dostepu do danych zebranych na urządzeniu. Tym właśnie + jest system plików. +

+

+ Komputery, ktorych używamy do pracy zawsze mają określną liczbę + zasobów. Jednym z nich jest pamięć operacyjna, która przechowuję + zarówno kod uruchomionych programów jak i dane, na których one pracują. + W zależności od konfiguracji sprzętowej może się ona szybko wyczerpać, + więc wymyślono coś takiego jak przestrzeń wymiany. + Jest specjalny rodzaj alokacji przestrzeni na dysku, przechowywujący + w niej nieużywane w danym momencie obszary pamięci operacyjnej. Jeśli + te dane będą potrzebne znów wrócą one do pamięci, a inne zostaną + przeniesione właśnie do przestrzeni wymiany. Przestrzeń wymiany inaczej + nosi nazwę swapu (czyt. słapu). +

+

15.1 Systemy plików na RHEL 9

+

+ Red Hat Enterprise Linux w wersji 9 natywnie obsługuje cztery + systemy plików są nim między innymi: +

+
    +
  • Systemy plików EXT - jest domyślny system plików + dla każdej dystrybucji. Jest on dostępny w 4 wersjach przy czym + EXT w wersji 1 jest przestarzy i nie jest już wspierany. + Korzystając z EXT nalepiej jest korzystać z wersji 4, + zawiera ona najwięcej udogodnień oraz funkcji.
  • +
  • Systemy plików XFS - jest to system plików + stosowany w systemach klasy enterprise, choć obecnie powoli staje + się standarem jako podstawowy system plików dla wielu dystrybucji + Linuksa. + Może on obsłużyć większe pliki niż EXT4 oraz zaalokować + przestrzenie dyskowe. Póki co nie ma narzędzia które pozwalało by na + zmniejszenie systemu plików tego typu.
  • +
  • System plików VFAT - system plików utrzymywany w + dystrybucjach, aby można było zapewnić zgodność w przesyłaniu plików + między Linuksem a systemami MS Windows. Najczęściej jest on stosowany + na pamięciach USB.
  • +
  • System plików ISO 9660 - system plików stosowany + na płytach CD/DVD, na których przechowywane są dane. Obrazy płyty + z systemami operacyjnymi (dystrybucje) również zawierą struktury tego + systemu plików.
  • +
+

+ Zarządzanie systemami plików obejmuje ich tworzenie, rozszerzanie, + zmniejszanie, montowanie oraz odmontowywanie. Tworzenie systemu plików + nazwywane jest jego instalacją lub formatowaniem. + Obsługa danego systemu plików dostarcza kilku narzędzi, które będziemy + poznawać w trakcie wykonywania przykładów, poza nimi system posiada + jeszcze kilka poleceń dotyczących ogólnie systemów plików. +

+

15.2. Montowanie oraz odłączanie systemów plików

+

+ Chcąc skorzystać z przestrzeni dyskowej zawartej na partycji, musi + ona zostać sformatowana pod określny system plików. Załóżmy, że zostało + już to zrobione. Musi ona również zostać podłączona do katalogu + głównego, tym właśnie zajmuje się montowanie. Do montowania służy + polecenie mount. Wydanie go bez podania żadnego + argumentu spowoduje wyświetlenie wszystkich zamontowanych w systemie + systemów plików. +

+
+/dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+selinuxfs on /sys/fs/selinux type selinuxfs (rw,nosuid,noexec,relatime)
+systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=31,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12986)
+mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime,seclabel)
+hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel,pagesize=2M)
+debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime,seclabel)
+tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime,seclabel)
+fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
+configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
+/dev/vda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+/dev/sr0 on /mnt type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048)
+
+

+ System do działania potrzebuje wielu systemów plików i to nie tylko + tych dyskowych ale także tych wirtualnych dla tego wynik działania tego + polecenia nie jest zbyt czytelny. Możemy go jednak bardzej uściślić + podając w za pomocą opcji -t interesującyu nas system plików. +

+
+[user@rhel90 ~]$ mount -t xfs
+/dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+/dev/vda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+
+

+ Aby zamontować system plików należy podać po poleceniu mount, + nazwę urządzenia, punkt montowania oraz ewentualnie opcje. + Punkten montowania może być dowolny katalog znajdujący + się w systemie. Najlepiej jakby był pusty, ponieważ pliki z + zamontowanego katalogu przesłonią jego rzeczywistą zawartość. +

+

+ Innym argumentem są opcje montowania. Polecenie posiada kilka opcji + ogólnych, natomiast montowanie określnego systemu plików pozwala także + na użycie specyficznych dla niego opcji. Poniżej znajduje się kilka + ogólnych opcji, opcje specyficzne znajdują się na stronie podręcznika + poświęconej systemowi plików. +

+
    +
  • acl (noacl) - włącza lub wyłacza możliwość + stosowania list kontroli dostępu.
  • +
  • auto (noauto) - włącza lub wyłącza możliwość + automatycznego montowania systemu plików podczas uruchamiania + systemu (będzie o tym w tym rozdziale).
  • +
  • defaults - zestaw domyślnych opcji pozwalających + na pełne wykorzystanie zamontowanego systemu plików.
  • +
  • _netdev - opcja używana dla systemów plików + wymagających sieci, co powoduje zestawienie połączenia sieciowego + za nim nastąpi monotowanie systemu plików. Przydatne w gdy montujemy + udział NFS.
  • +
  • x-systemd.requiers= - opcja pozwala na wskazanie + jednostki, której aktywacja jest wymagana do zamontowania systemu + plików.
  • +
  • remount - opcja pozwala na montowanie + zamontowanego już systemu plików w innym katalogu.
  • +
  • ro (rw) - montuje system plików tylko do odczytu + lub w pełnym dostępie.
  • +
+

+ Poleceniem służącym do odłączania systemu plików jest + umount. Najczęściej podaje się mu punkt montowania. + Po odmontowaniu system plików staje się niedostępny dla użytkowników + oraz programów. +

+

15.3. Pozyskiwanie identyfikatora UUID systemu plików

+

+ Podczas montowania jednym z podawanych argumentów jest nazwa + urządzenia. Sprawdza się to podczas szybkiego montowania w trakcie + działania systemu. Nazwa urządzenia nie jest jedyną wartością jaką + możemy podać poleceniu mount podczas montowania jako wartość + wskazującą na urządzenie. Do montowania możemy użyć etykiety, którą + ustawiamy podczas formatowania partycji lub specjalnego identyfikatora + UUID nadawanego po zainstalowaniu systemu plików na + partycji. +

+

+ Identyfikator w przypadku systemów plików takich jak EXT oraz + XFS ma długość 128 bitów + natomiast w przypadku VFAT są to tylko 32 + bity, 8 heksadecymalnych znaków. UUID możemy uzyskać za przy + użyciu specyficznego narzędzia dostarczanego wraz system plików lub + dwóch programów ogólnych blkid lub znanego już + wcześniej lsblk wraz z opcją -f. +

+
+[user@rhel90 ~]$ blkid
+/dev/mapper/rhel-root: UUID="c09cb7eb-2f8e-459e-bb64-21dde92cd7c0" BLOCK_SIZE="512" TYPE="xfs"
+/dev/vda2: UUID="AHWsb0-0mbi-MxDK-0bpS-Q6ib-cz4l-rHQWAr" TYPE="LVM2_member" PARTUUID="45658df6-02"
+
+[user@rhel90 ~]$ lsblk -f /dev/vda
+NAME          FSTYPE    FSVER    LABEL  UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
+vda                                                                                           
+├─vda1        xfs                bootfs fb4c6cf9-8041-42ce-9e75-82026a4a0164    753,1M    26% /boot
+└─vda2        LVM2_memb LVM2 001        AHWsb0-0mbi-MxDK-0bpS-Q6ib-cz4l-rHQWAr                
+  ├─rhel-root xfs                       c09cb7eb-2f8e-459e-bb64-21dde92cd7c0      5,9G    39% /
+  └─rhel-swap swap      1               be58cfe2-c3a6-4731-9b0b-f58604074bd8                 [SWAP]
+
+

+ Odnośnie egzaminu:
+ Alternatywne nazwenictwo jest istotne gdy chcemy utworzyć wpisy + automatycznego montowania podczas uruchamiania systemu. Klasyczne + nazwy, którymi posługujemy się w systemie przy następnym uruchomieniu + mogą już być zupełnie inne dla tych samych urządzeń, a UUID + czy etykieta jest przypisana na stałe do systemu plików, zostanie + zmieniona dopiero przez ponowne sformatowanie partycji. +

+

15.4. Nadawanie etykiet systemom plików

+

+ Etykiety są jedną z metod alternatywnego nazewnictwa urządzeń + przechowywujących systemy plików. Możemy je nadwać za pomocą narzędzi + dostarczanych wraz z systemem plików. Dla systemów EXT jest + narzędzie e2label, natomiast dla XFS jest + polecenie xfs_admin wraz z opcją -L. + Przy czym etykiety mają swoje ograniczenia w ilość znaków. Dla + XFS ten limit wynosi 12 znaków, a w przypadku + EXT4 jest to 16 znaków. Teraz + odmontuje system plików zamontowany w /boot a następnie nadam + mu etykietę i zamontuje ponownie. Na początku jednak sprawdzam nazwę + urzędzenia partycji oraz zainstalowany na niej system plików. +

+
+[user@rhel90 ~]$ lsblk -f
+NAME FSTYPE FSVER LABEL                 UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
+sr0  iso966 Jolie RHEL-9-0-0-BaseOS-x86_64
+                                        2022-04-19-20-42-48-00                       0   100% /mnt
+vda                                                                                           
+├─vda1
+│    xfs                                fb4c6cf9-8041-42ce-9e75-82026a4a0164    753,1M    26% /boot
+└─vda2
+     LVM2_m LVM2                        AHWsb0-0mbi-MxDK-0bpS-Q6ib-cz4l-rHQWAr                
+  ├─rhel-root
+  │  xfs                                c09cb7eb-2f8e-459e-bb64-21dde92cd7c0      5,9G    39% /
+  └─rhel-swap
+     swap   1                           be58cfe2-c3a6-4731-9b0b-f58604074bd8                 [SWAP]
+[user@rhel90 ~]$ sudo umount /boot
+[sudo] hasło użytkownika user: 
+[user@rhel90 ~]$ sudo xfs_admin -L "bootfs" /dev/vda1
+zapisywanie wszystkich superbloków
+nowa etykieta = "bootfs"
+[user@rhel90 ~]$ sudo mount /boot
+[user@rhel90 ~]$ lsblk -f
+NAME FSTYPE FSVER LABEL                 UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
+sr0  iso966 Jolie RHEL-9-0-0-BaseOS-x86_64
+                                        2022-04-19-20-42-48-00                       0   100% /mnt
+vda                                                                                           
+├─vda1
+│    xfs          bootfs                fb4c6cf9-8041-42ce-9e75-82026a4a0164    753,1M    26% /boot
+└─vda2
+     LVM2_m LVM2                        AHWsb0-0mbi-MxDK-0bpS-Q6ib-cz4l-rHQWAr                
+  ├─rhel-root
+  │  xfs                                c09cb7eb-2f8e-459e-bb64-21dde92cd7c0      5,9G    39% /
+  └─rhel-swap
+     swap   1                           be58cfe2-c3a6-4731-9b0b-f58604074bd8                 [SWAP]
+
+

+ Jak możemy zauważyć różnice pomiędzy pierwszym wywołaniem lsblk + a drugim. Przy drugim wywowałaniu przy partycji zamontowanej + w katalogu /boot w kolumnie + LABEL widnieje teraz napis + bootfs. Tak utworzoną etykietę + możemy wykorzystać podczas ustawiania automatycznego montowania. +

+

15.5. Automatyczne monotowanie systemów plików - /etc/fstab

+

+ Katalog główny możemy być rozbity na kilka różnych systemów plików. + Plik zawarte w poszczególnych katalogach są potrzebne do rozruchu + systemu, dlatego też w katalogu /etc znajduje się + plik tekstowy fstab, w którym to przechowywane są + wpisy systemów plików montowanych podczas uruchamiania systemu. Wpisy + poza automatycznym montowaniem, skracają też potrzebę podawania + wszystkich argumentów poleceniu mount. Jeśli taki system + plików nie jest montowany automatycznie to, żeby go zamontować + wystarczy podać albo punkt montowania albo nazwę urządzenia. Raczej + będzie to punkt montowania. Poniżej znajduję się kilka wpisów, które + posłużą nam do analizy. +

+
+[user@rhel90 ~]$ sudo grep -v -e '^#' -e '^$' /etc/fstab 
+/dev/mapper/rhel-root   /                       xfs     defaults        0 0
+UUID=fb4c6cf9-8041-42ce-9e75-82026a4a0164 /boot                   xfs     defaults        0 0
+/dev/mapper/rhel-swap   none                    swap    defaults        0 0
+/dev/sr0	/mnt	iso9660	ro	0	0
+
+

+ Aby nieco ułatwić czytelność pozbyłem się komentarzy oraz pustych + wierszy. Każdy z wpisów składa się z 6 kolumn, kolumny te kolejno + przedstawiają: +

+
    +
  • Kolumna 1: nazwa urządzenia. Zazwyczaj znajdują + się tutaj identyfikatory UUID lub etykiety, jednak możliwe + jest kilka + wyjątków, otóż: nazwy woluminów logicznych LVM są + unikatowymi + identyfikatorami i będą wskazywać to samo urządzenie za każdym razem. + Tak samo jest z systemami plików tworzonymi przez usługę + Stratis. Na końcu przykładu znajduje się montowanie płyty. + Urządzenie /dev/sr0, zazwyczaj oznacza pierwszy napęd + optyczny w systemie. Zatem jeśli w komputerze mamy tylko jeden napęd + również możemy tak zapisać automatyczne montowanie
  • +
  • Kolumna 2: punkt montowania. Ta kolumna wskazuje + nazwy katalogów do których należy podłączyć montowane systemy plików. + Wyjątkiem jest tutaj przestrzeń wymiany, ponieważ w miejscu + montowania wstawia się wartość none lub swap.
  • +
  • Kolumna 3: typ systemu plików
  • +
  • Kolumna 4: opcje montowania
  • +
  • Kolunma 5: Ustawienia programu dump, ta kolumna ma + zastosowanie tylko w przypadku systemów plików EXT. Dla + innych jej wartość zawsze wynosi 0. Program dump + tworzy kopie bezpieczeństwa systemu plików.
  • +
  • Kolumna 6: kolejność partycji do sprawdzenia, ta + opcja również tyczy się systemów plików EXT, jej zadaniem + jest wskazanie kolejności sprawdzania systemów plików przez + program e2fsck, który skanuje system plików pod kątem błędów + i je naprawia. Zazwyczaj definiowane kolejności to 0 - wyłączające + sprawdzanie, 1 - przeznaczone dla głównego systemu plików + (zawierającego katalog główny) oraz 2 - każdy pozostały system plików + jeśli zbierze się więcej niż jeden system plików z tą kolejnością + to są one sprawdzane jeden po drugim.
  • +
+

+ Kolumny 5 oraz 6 nie mają zastosowania dla innych systemów plików niż + EXT, dlatego też przy wpisach innych systemów plików wpisuje + się 0 (zero). +

+

+ Za pomocą polecenia mount wraz z opcją -a możemy + zamontować wszystkie systemy plików, których wpisy znajdują się w tym + pliku. Często będziemy korzystać z tego polecenia zatwierdzając zamiany + w tym pliku. +

+

+ Odnośnie egzaminu:
+ Zgubiony lub niepoprawny wpis w pliku /etc/fstab może + unieruchomić system. Aby to naprawić należy poprawić wpisy w trybie + ratunkowy. Ze względu na to należy zwrócić szczególną uwagę na + poprawność umieszczanych w tym pliku wpisów. +

+

15.6. Monitorowanie zużycia miejsca w systemie plików

+

+ Jednym z zadań administracyjnych na serwerach jest monitorowanie + zużycia + miejsca w systemie plików. Jednym z dostępnych narzędzi jest + polecenie df, które domyślnie wyświetla urządzenie + jego rozmiar, ilość zużytego miejsca, ilość dostępnego miejsca, + procentowe zużycie miejsca na dysku oraz punkt montowania. Poniżej + znajduje się przykład. +

+
+[user@rhel90 ~]$ df -h
+System plików         rozm. użyte dost. %uż. zamont. na
+devtmpfs               606M     0  606M   0% /dev
+tmpfs                  636M     0  636M   0% /dev/shm
+tmpfs                  255M  7,4M  247M   3% /run
+/dev/mapper/rhel-root  9,8G  3,9G  6,0G  40% /
+/dev/sr0               8,0G  8,0G     0 100% /mnt
+tmpfs                  1,0M     0  1,0M   0% /run/stratisd/keyfiles
+tmpfs                  128M   52K  128M   1% /run/user/42
+tmpfs                  128M   36K  128M   1% /run/user/1000
+/dev/vda1             1014M  261M  754M  26% /boot
+
+

+ Użyłem w przykładzie polecenia wraz z opcją -h, która + powoduje skalowanie jednostek. Domyślnie polecenia przedstawia wartości + w postaci KB (kilobajtów). Wraz z tą opcją używa się jeszcze kilku + innych takich jak: +

+
    +
  • -T - dodaje kolumnę z rodzajem systemu plików.
  • +
  • -x - wyłącza wyświetlanie określonego systemu plików.
  • +
  • -t - wyświetla wyłącznie urządzenia sformatowane na + określony typ plików.
  • +
  • -i - wyświeta zużycie systemu plików w wezłąch + i-node. +
+

15.7. Określenie użycia systemu plików

+

+ Za pomocą polecenia df mogliśmy ustalić ogólne wartości na + temat zużycia + systemu plików. Za pomocą polecenia du możemy ustalić + i ile miejsca zajmują określone pliki oraz foldery. To polecenie + również domyślnie zwraca informacje w KB. Najczęściej wykorzystywanymi + opcjami są -s wyświetające podsumowanie oraz -h + skalujące jednostki to poziomu czytelnego przez człowieka. +

+
+[user@rhel90 ~]$ sudo du -sh /usr
+[sudo] hasło użytkownika user: 
+3,6G	/usr
+
+

15.8. Zarządzanie systemami plików

+

+ Zarządzanie systemami plików wygląda podobnie w wszystkich poznanych + tutaj przypadkach (metodach zarządzania pamięcią masową). W tym + podrozdziale skupimy się na najbardziej zaawansowanych przypadkach. +

+

15.8.1. Tworzenie systemów plików

+

+ Tworzenie systemów plików, czy też formatowanie partycji wygląda + identycznie czy jest to wolumin logiczny czy partycja na dysku. Na + poniższym przykładzie zaprezentowałem tworzenie partycji na trzech + partycjach podstawowych na każdej z nich zainstalowałem inny system + plików: +

+
+[user@rhel90 ~]$ sudo mkfs -t vfat /dev/vdb1
+mkfs.fat 4.2 (2021-01-31)
+[user@rhel90 ~]$ sudo mkfs -t ext4 /dev/vdb2
+mke2fs 1.46.5 (30-Dec-2021)
+Tworzenie systemu plików o 78848 blokach 1k oraz 19680 i-węzłach
+UUID systemu plików: d97751fb-dce0-4406-b03b-925dfa64a183
+Kopie zapasowe superbloku zapisane w blokach: 
+	8193, 24577, 40961, 57345, 73729
+
+Przydzielanie tablicy grup: zakończono                      
+Zapis tablicy i-węzłów: zakończono                      
+Tworzenie kroniki (4096 bloków): wykonano
+Zapis superbloków i podsumowania systemu plików: wykonano
+
+[user@rhel90 ~]$ sudo mkfs -t xfs /dev/vdb3
+meta-data=/dev/vdb3              isize=512    agcount=4, agsize=4883 blks
+         =                       sectsz=512   attr=2, projid32bit=1
+         =                       crc=1        finobt=1, sparse=1, rmapbt=0
+         =                       reflink=1    bigtime=1 inobtcount=1
+data     =                       bsize=4096   blocks=19531, imaxpct=25
+         =                       sunit=0      swidth=0 blks
+naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
+log      =log wewnętrzny        bsize=4096   blocks=1368, version=2
+         =                       sectsz=512   sunit=0 blks, lazy-count=1
+realtime =brak                   extsz=4096   blocks=0, rtextents=0
+
+

+ W przykładzie użyłem polecenia mkfs i za pomocą opcji + -t podałem typ żądanego systemu plików. Równie dobrze możemy + podać nazwę polecenia a następnie po kropce typ systemu plików + (np. mkfs.ext4). Następnie podaje się urządzenie blokowe, + które ma zostać sformatowane. +

+

+ Tworzenie systemu plików dla woluminu VDO najlepiej jest + przeprowadzić z użyciem opcji -E nodiscard dla + EXT4 lub opcją -K dla XFS obie wykonują + tę samą czynność i pozwalają zainstalować je szybciej na tego typu + pamięciach masowych. +

+

15.8.2. Montowanie oraz odłączanie systemu plików

+

+ Za pomocą polecenia mount możemy podłączyć systemy plików z + poprzedniego podrozdziału do naszego systemu. Polecenie mount + nie wymaga + podania rodzaju systemu plików, potrafi ono samo to określić. +

+
+[user@rhel90 ~]$ sudo mount /dev/vdb3 /media/
+[sudo] hasło użytkownika user: 
+[user@rhel90 ~]$ sudo mount -t xfs
+/dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+/dev/vda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+/dev/vdb3 on /media type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+
+

+ Ostatni wiersz dotyczy montowania ze wcześniejszego polecenia. +

+

+ Aby odmontować ten system plików należy wydać poniższe polecenie: +

+
+[user@rhel90 ~]$ sudo umount /media
+[user@rhel90 ~]$ sudo mount -t xfs
+/dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+/dev/vda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
+
+

+ Wiersz dotyczący katalogu /media nie wystąpił po + odmontowaniu, tak wiec system plików został odłączony od systemu. +

+

15.8.3. Montowanie automatyczne z użyciem pliku /etc/fstab

+

+ Tak jak już wcześniej wspomiałem, za pomocą pliku /etc/fstab + możemy zdefiniować wpisy z systemami plików, które będą automatycznie + montowane podczas uruchamiania systemu lub będzie możliwość ich + szybszego montowania, za pomocą polecenia mount. Definiując + nowy wpis musimy wypełnić, każdą z kolumn. Należy również dodać, że + tworząc wpisy /etc/fstab, należy pisać bardzo uważnie, + ponieważ jeden błąd może unieruchomić cały system. +

+

+ Dodanie wpisów do /etc/fstab można dokonać na wiele sposobów. + Ja na przykład przełączyłem się na superużytkownika i za pomocą + echo dodawałem kolejne wpisy, co zobrazowałem na poniższym + przykładzie. +

+
+[user@rhel90 ~]$ mkdir /{vfat,ext4,xfs}fs1
+
+[user@rhel90 ~]$ lsblk -f /dev/vdb
+NAME   FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
+vdb                                                                           
+├─vdb1 vfat   FAT16       BA6B-6E4E                                           
+├─vdb2 ext4   1.0         d97751fb-dce0-4406-b03b-925dfa64a183                
+└─vdb3 xfs                37f34709-79da-4adb-aff4-8de1cfafe9c6                
+
+[root@rhel90 user]# echo "UUID=BA6B-6E4E /vfatfs1 vfat defaults 0 0" >> /etc/fstab
+[root@rhel90 user]# echo "UUID=d97751fb-dce0-4406-b03b-925dfa64a183 /ext4fs1 ext4 defaults 0 0" >> /etc/fstab
+[root@rhel90 user]# echo "UUID=37f34709-79da-4adb-aff4-8de1cfafe9c6 /xfsfs1 xfs defaults 0 0" >> /etc/fstab 
+
+[user@rhel90 ~]$ grep -v -e '^#' -e '^$' /etc/fstab
+/dev/mapper/rhel-root   /                       xfs     defaults        0 0
+UUID=fb4c6cf9-8041-42ce-9e75-82026a4a0164 /boot                   xfs     defaults        0 0
+/dev/mapper/rhel-swap   none                    swap    defaults        0 0
+/dev/sr0	/mnt	iso9660	ro	0	0
+UUID=BA6B-6E4E /vfatfs1 vfat defaults 0 0
+UUID=d97751fb-dce0-4406-b03b-925dfa64a183 /ext4fs1 ext4 defaults 0 0
+UUID=37f34709-79da-4adb-aff4-8de1cfafe9c6 /xfsfs1 xfs defaults 0 0
+
+[user@rhel90 ~]$ sudo mount -a
+
+[user@rhel90 ~]$ df -h
+System plików         rozm. użyte dost. %uż. zamont. na
+...
+/dev/vdb1               75M     0   75M   0% /vfatfs1
+/dev/vdb2               67M   14K   62M   1% /ext4fs1
+/dev/vdb3               71M  4,6M   67M   7% /xfsfs1
+
+

+ Na początku stworzyłem punkty montowania, trzy podkatalogi w katalogu + głównym. Następnie odszukałem w systemie identyfikatory UUID, + ponieważ są to zwykłe partycje musiałem ich użyć. Za pomocą + przekierowania wyjścia polecenia echo zapisałem wpisy + odpowiednie + dla tych partycji, aby to potwierdzić użyłem polecenia + mount wraz z opcją -a, żeby zamontować wszystkie + wpisy + w pliku. Polecenie oczywiście te zamontowane pomija, więc spokojnie + każdą zmianę w tym pliku możemy potwierdzać za pomocą tego polecenia. + Na koniec wyświetliłem sprawdzenie stanu zużycia systemów plików, aby + lepiej zaprezentować fakt, iż systemy wcześniej zapisane do pliku + /etc/fstab zostały poprawnie podłączone. +

+

+ Wpis do pliku dotyczący LVM, różniłby się tylko tym, że + zamiast + UUID mogłaby być ścieżka do woluminu logicznego LVM. + Jeśli chodzi o systemy plików tworzone przez Stratis można + użyć UUID lub ścieżki urządzenia wyświetlanej na liście + systemów plików, jednak Stratis wymaga uruchomienia usługi + aby systemy plików były w ogóle widoczne, zatem przed opcją + defaults należało by użyć opcji + x-systemd.requires=stratisd.service. +

+

15.8.4. Rozszerzanie systemu plików na woluminie logicznym LVM

+

+ W systemie posiadam już zamontowane dwa woluminy logiczne z LVM. + Chcę rozszerzyć ich wielkość o 100MB. Wszystkie czynności takiej jak + związane z LVM zostały już wykonane poza samym rozszerzeniem + woluminów. Polecenie lvextend jak i lvresize + posiadają opcję -r, która pozwala na uruchomienie + programu odpowiedzialnego za zmianę rozmiaru systemu plików. W + przypadku EXT4 uruchamiany jest program + resize2fs a w przypadku XFS + xfs_growfs. Opcję -r możemy pominąć lub o + niej zapomnieć, wówczas należy uruchomić te programy z poziomu + wiersza polecenia. Poniżej znajdują się przykłady jak można rozszerzyć + zamontowane już woluminy logiczne. +

+
+[user@rhel90 ~]$ sudo lvextend -L +100M -r /dev/vg-lvm/ext4vol
+  Devices file /dev/vdb is excluded by filter: device is partitioned.
+  Size of logical volume vg-lvm/ext4vol changed from 252,00 MiB (63 extents) to 352,00 MiB (88 extents).
+  Logical volume vg-lvm/ext4vol successfully resized.
+resize2fs 1.46.5 (30-Dec-2021)
+System plików /dev/mapper/vg--lvm-ext4vol jest zamontowany pod /ext4fs2; wymagana zmiana rozmiaru w locie
+old_desc_blocks = 2, new_desc_blocks = 3
+System plików na /dev/mapper/vg--lvm-ext4vol ma teraz 360448 (1k) bloków.
+
+[user@rhel90 ~]$ sudo lvextend -L +100M /dev/vg-lvm/xfsvol
+  Size of logical volume vg-lvm/xfsvol changed from 252,00 MiB (63 extents) to 352,00 MiB (88 extents).
+  Logical volume vg-lvm/xfsvol successfully resized.
+[user@rhel90 ~]$ sudo xfs_growfs /dev/vg-lvm/xfsvol
+meta-data=/dev/mapper/vg--lvm-xfsvol isize=512    agcount=4, agsize=16128 blks
+         =                       sectsz=512   attr=2, projid32bit=1
+         =                       crc=1        finobt=1, sparse=1, rmapbt=0
+         =                       reflink=1    bigtime=1 inobtcount=1
+data     =                       bsize=4096   blocks=64512, imaxpct=25
+         =                       sunit=0      swidth=0 blks
+naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
+log      =log wewnętrzny        bsize=4096   blocks=1368, version=2
+         =                       sectsz=512   sunit=0 blks, lazy-count=1
+realtime =brak                   extsz=4096   blocks=0, rtextents=0
+bloki danych zmienione z 64512 na 90112
+
+

15.9. Zarządzanie przestrzenią wymiany

+

+ Na wstępie tego rozdziału omówiliśmy sobie czym jest przestrzeń + wymiany. Teraz przejdziemy do jej zarządzania. Poza użyciem + specyficznego programu do formatowania partycji jako przestrzeni + wymiany ten podrozdział nie będzie różnić się niczym od pozostałych. + Nie ma różnicy czy stworzymy naszą przestrzeń wymiany na partycji czy + woluminie logicznym. W systemie może być również wiecej niż jedna + przestrzeń wymiany, są one wówczas priorytetyzowane. +

+

15.9.1. Tworzenie przestrzeni wymiany

+

+ Do stworzenia przestrzeni wymiany wykorzystamy polecenie + mkswap. Polecenie to może nadać etykietę partycji, + poprzez użycie opcji -L. Do użycia mamy maksymalnie 16 + znaków. Poniżej znajduje się przykład, w którym utworzyłem przestrzeń + wymiany, zdefiniowałem także dla niej etykietę. +

+
+[user@rhel90 ~]$ sudo mkswap -L swapvol /dev/vg-lvm/swapvol
+Tworzenie obszaru wymiany w wersji 1, rozmiar = 52 MiB (bajtów: 54521856)
+LABEL=swapvol, UUID=3c99f75a-4559-4f6b-970b-f78cc4333e9b
+
+

15.9.2. Włączanie i wyłączanie swapu

+

+ Utworzony wcześniej swap jeszcze nie działa. Wymagane jest + jego włączenie za pomocą polecenia swapon. + To polecenie potrafi również wyświetlić wszystkie dostępne w systemie + przestrzeni wymiany. Ręczne włączenie wymaga podania nazwy urządzenia. + Poniżej znajduje się przykład: +

+
+[user@rhel90 ~]$ sudo swapon /dev/vg-lvm/swapvol
+[sudo] hasło użytkownika user: 
+[user@rhel90 ~]$ sudo swapon
+NAME      TYPE      SIZE USED PRIO
+/dev/dm-1 partition 1,2G   7M   -2
+/dev/dm-7 partition  52M   0B   -3
+
+

+ Po włączeniu przestrzeni wymiany uruchomiłem jeszcze raz polecenie + swapon bez żadnych argumentów aby wyświetlić wszystkie + swapy dostępne w systemie. W dystrybucjach Linuksa może być + ich 32. Dezaktywacji swapu dokonujemy za pomocą polecenia + swapoff podając jako argument nazwę urządzenia. +

+
+[user@rhel90 ~]$ sudo swapoff /dev/vg-lvm/swapvol
+[sudo] hasło użytkownika user: 
+[user@rhel90 ~]$ sudo swapon
+NAME      TYPE      SIZE USED PRIO
+/dev/dm-1 partition 1,2G 6,8M   -2
+
+

+ Po wyłączeniu swapu widzimy, że nie jest on już dostępny w systemie. +

+

15.9.3. Automatyczne włączanie przetrzeni wymiany - /etc/fstab

+

+ Przestrzeń wymiany tak jak inne systemy plików może być włączana + automatycznie podczas uruchamiania systemu operacyjnego. Poniżej + znajduje się przykład, który obrazuje dodawanie przestrzeni wymiany do + pliku /etc/fstab oraz jej automatyczne włączanie nie tylko + poprzez ponowne uruchomienie systemu. +

+
+[root@rhel90 user]# echo "LABEL=swapvol none swap defaults 0 0" >> /etc/fstab
+
+[user@rhel90 ~]$ sudo swapon -a
+[user@rhel90 ~]$ swapon
+NAME      TYPE      SIZE USED PRIO
+/dev/dm-1 partition 1,2G 6,8M   -2
+/dev/dm-7 partition  52M   0B   -3
+
+

+ Tym razem zamiast nazwy urządzenia użyłem etykiety. Polecenie + swapon wraz z opcją -a, ma takie samo działanie dla + przestrzeni wymiany jak mount -a dla zwykłych systemów plików. +

+

15.9.4. Monitorowanie zużycia przestrzeni wymiany

+

+ Do kontrolowania z użycia przestrzeni wymiany możemy wykorzystać + proste polecenie, które zwraca nam informacje o ilości wykorzystywanej + w systemie pamięci operacyjnej. Do tego służy polecenie + free. Pod czas korzystania z tego narzędzia najlepiej + od razu przeskalować jednostki za pomocą polecenia -h. +

+
+[user@rhel90 ~]$ free -h
+               total        used        free      shared  buff/cache   available
+Mem:           1,2Gi       930Mi       104Mi       8,0Mi       236Mi       179Mi
+Swap:          1,3Gi       6,0Mi       1,2Gi
+
+

+ Druga linia zawiera informacje na temat przestrzeni wymiany. Prócz + tego polecenia możemy wykorzystać dowolne polecenie monitorujące + zasoby komputera, np. top. +

+

Ćwiczenie 1: Tworzenie systemów plików oraz dodawanie wpisów do /etc/fstab

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server2. Na jednym z 250MB dysków utwórz + tablicę partycji w schemacie MBR. Utwórz 3 partycje po 70MB + na każdej z nich utwórz inny system plików. Utworz adekwatne dla nich + punkty montowania. Zamontuj je ręcznie. Określ ich UUID a + następnie + dodaj wpisy montowania do pliku /etc/fstab. Ręcznie odłącz + zamontowane wcześniej partycje, następnie zamontuj je automatycznie i + potwierdź to za pomocą polecenia df -h. +

+

Ćwiczenie 2: Wolumin VDO z XFS

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server2. Utwórz wolumin logiczny VDO o + rozmiarze wirtualnym 50GB, sformatuj go pod XFS, dodaj do + /etc/fstab, następnie zamontuj automatycznie potwierdź to + przy użyciu polecenia df -h. +

+

Ćwiczenie 3: Zarządzanie systemami plików z LVM

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server2. Utwórz dwa woluminy logiczne jeden + o wielkości 100MB a drugi 120MB, utworz na nich systemy plików + EXT4 na pierwszym, a drugim XFS. Zamontuj je w + systemie. Dodaj drugi dysk + do grupy, następnie rozszerz woluminy logiczne o 100MB przyczym użyj + opcji -r podczas rozszerzenia woluminiu z XFS, a + przy rozszerzaniu woluminu z EXT4 pomiń tę opcję i ręczenie + rozszerz system plików. Zweryfikuj wykonane czynności. +

+

Ćwiczenie 4: Montowanie automatyczne woluminu Stratis

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server2. Użyj jednego z 1GB dysków do + stworzenia systemu plików Stratis. Dodaj wpis z systemem do + pliku /etc/fstab. Uruchom system ponownie. Sprawdź czy system + plików został zamontowany za pomocą polecenia df -h. Co + mozemy zaobserować z wyników działania tego polecenia? Jaką pojemność + ma zamontowany system plików Stratis? +

+

Ćwiczenie 5: Przestrzeń wymiany

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server2. Na pozostałych z trzeciego ćwiczenia + ekstentach, utwórz kolejny wolumin o nazwie swap. Stwórz z + niego przestrzeń wymiany. Dodaj wpis tej przestrzeni do pliku + /etc/fstab. Aktywują ją automatycznie, następnie wyświetl + wszystkie dostępne przestrzenie wymiany w systemie oraz wyświetl + łaczną pojemność swapu w systemie. +

+

Podsumowanie

+

+ Tym rozdziałem zakończyliśmy naukę zarządzania pamięciami masowymi w + RHEL. + Poznaliśmy systemy plików oraz mechanizmy z nimi związane. Nauczyliśmy + się instalować systemy plików na partycjach oraz woluminach logicznych. + Dowiedzieliśmy się w jaki sposób montowane są automatycznie dostępne + w systemie operacyjnym systemy plików oraz w jaki sposób poprawnie + utworzyć wpis do pliku /etc/fstab. Na koniec poznaliśmy w jaki + sposób zarządzać przestrzenią wymiany w RHEL. W następnym + rozdziale zajmiemy się już podstawowymi pojęciami związanymi z siecią. +

+

16. Podstawy sieci w RHEL 9

+

+ Potrzeba współdzielenia danych oraz zasobów między komputerami + spowodowała, że zaczęto je łączyć w sieci. Na sieć komputerową + składają się minimum dwa komputery, połączone ze sobą albo bezpośrednio + albo za pomocą urządzenie pośredniczącego np. przełącznika. Aby + komunikacja między nimi mogła być możliwa wbudowane w nie urządzenia + sieciowe (karty/adaptery sieciowe) muszą zostać odpowiednio + skonfigurowane z użyciem + podstawowej wiedzy na temat sieci IP. Poznaną tutaj wiedzę na temat + sieci IP, wykorzystamy do tworzenia oraz konfigurowania nowych + połączeń sieciowych w systemach klasy enterprise. +

+

16.1. Podstawowe pojęcia o sieciach komputerowych

+

+ Aby poprawnie skonfigurować interfejs sieciowy komputera musimy poznać + podstawowe pojęcia związane z sieciami. +

+

16.1.1. Adres IPv4

+

+ Adres protokołu internetowego w wersji 4, bo tak możemy rozszyfować + nazwę tego podrozdziału jest podstawowym identyfikatorem służący to + komunikacji w sieci. Każdy z komputerów podłączonych do sieci posiada + ten adres przydzielony automatycznie z serwera DHCP lub + przypisany ręcznie. Adres IPv4 występuje w postaci 4 + oddzielonych + kropką oktetów, każdy z oktetów może przyjąć wartości od 0 do 255. + Adres IPv4 możemy sprawdzić za pomocą polecenia + ip z podpoleceniem addr +

+
+[user@server10 ~]$ ip addr
+1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
+    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+    inet 127.0.0.1/8 scope host lo
+       valid_lft forever preferred_lft forever
+    inet6 ::1/128 scope host 
+       valid_lft forever preferred_lft forever
+2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
+    link/ether 52:54:00:55:b7:60 brd ff:ff:ff:ff:ff:ff
+    inet 192.168.122.6/24 brd 192.168.122.255 scope global noprefixroute enp1s0
+       valid_lft forever preferred_lft forever
+    inet6 fe80::5054:ff:fe55:b760/64 scope link noprefixroute 
+       valid_lft forever preferred_lft forever
+
+

+ Polecenie to wyświetla informacje na temat dostępnych w systemie + połączeń sieciowych (interfejsów). Jednym + z nich jest połączenie o nazwie enp1s0 + posiadające adres 192.168.122.6. Drugie połączenie + sieciowe, to specjalny interfejs systemowy tzw. + pętla zwrotna, pozwala ona na komunikację z usługami + sieciowym w tym systemie. Adresem pętli zwrotnej jest zawsze + 127.0.0.1. +

+

+ Komputery podłączone do tej samej sieci posiadają identyczne, niektóre + z częsci adresu IPv4. Część wspólna nazywana jest częścią + sieciową, pozostała część (część hosta) jest ustatalna indywidualnie + dla każdego hosta i tylko jemu przypisywana. Które części adresu + są częścią hosta, a które są częscią sieci jest ustatalne w trakcie jej + konfiguracji na podstawie klas adresowych. Klasy + adresowe możemy podzielić na trzy klasy: +

+
    +
  • Klasę A - W klasie A, część sieciowa obejmuje + tylko jeden oktet przez co możemy utworzyć do 126 sieci po + 16 777 214 hostów w każdej z nich. W klasie A pierwszy oktet + przyjmuje wartości od 0 do 126, z wyłączeniem 10.
  • +
  • Klasę B - W klasie B za część sieciową odpowiadają + dwa oktety co daje większą ilość mniejszych sieci to i taki liczby + potrafią zaskakiwać, ponieważ w tej klasie można utworzyć 16384 sieci + po 65534 hosty. Klasa B w pierwszym oktecie stosuje wartości + od 128 do 191.
  • +
  • Klasę C - W klasie C za część sieciową odpowiadają + aż trzy oktety, dzięki czemu możemy stworzyć dużą ilość małych sieci, + a konkretnie 2 097 152 sieci po 254 hosty każda. Klasa C w pierwszym + oktecie stosuje wartości od 192 do 223.
  • +
+

+ Poza tymi klasami w specyfikacji wyróżnia się takie klasy jak + D oraz E, jednak mają one specjalne przeznaczenie. +

+

+ Tak duże klasy adresów są dzielone na mniejsze części, aby łatwiej + zarządzać + takimi sieciami, zwiększyć ich wydajność oraz zapewnić oporność na + na awarie czy odsepraować je od siebie. Po podziale każda z takich + sieci posiada logicznie wytyczone granice. Te granice są wskazywane + przez maskę podsieci, której zadaniem jest zaznaczenie + części sieciowej adresu IPv4 oraz części przeznaczonej dla + komputerów w sieci. Oktety maski podsieci mogą posiadać wartości takie + jak 255, 0 oraz inne przy czym + wartości większe od 0 nie mogą znajdować się przed oktetami + zawierającymi 255 lub wartości inne niż 0. Z czego to wynika? Otóż + z podstaw adresacji IPv4. Każdy adres składa się z 4 oktetów. + Co to tak naprawdę oznacza? Każdy adres IPv4 możemy rozpisać + za pomocą systemu binarnego (0 i 1), oktet o poprostu 8 bitów (bit - + najmniejsza ilość informacji, przestawia pojedyńczy stan 0 lub 1), 8 + zer lub jedynek. Na masce podsieci jedynki określają bity, które są + częścią sieciową adresów, a zera tą część która pozostaje do + adresowania hostów, dlatego też zera nie mogą występować między + jedynkami. Poniżej znajduje się przykład. Mój serwer ma adres + 192.168.122.7 oraz maskę podsieci: 255.255.255.0. + Poniżej znajduje się zapis tych parametrów w postaci binarnej: +

+
+11000000.10101000.01111010.00000111 = 192.168.122.7
+11111111.11111111.11111111.00000000 = 255.255.255.0
+====================================================
+11000000.10101000.01111010. | 00000111 
+        192.168.122.              7
+    Część sieciowa adresu     Część hosta 
+
+

+ Maskę możemy zapisać w innej postaci niż dziesiętna (255.255.255.0). + Jest to zapis w którym do określenia maski używa się ilości jedynek. + Zatem maska z poprzedniego przykładu 255.255.255.0 wynosiła + by 24. Kombinację adresu IPv4 hosta wraz + z maską w takim zapisie oddzieloną ukośnikiem (/) + nazywa się notacją CIDR i jest to obecnie + najpopularnieszy sposób nadawania adresów IPv4 interfejsom + sieciowym. +

+

+ Maska podsieci może mieć maksymalną wartość 32 bitów, pozwalając + na istnienie jednego adresu w sieci (najczęciej jest wskazanie na + konkretny adres) lub minimalną wartość jaką jest 0, alokując tym samym + wszystkie możliwe adresy, ok. 4,3 miliarda. +

+

16.1.2. Adresy prywatne

+

+ Upowszechnienie się łącz szerokopasmowych dało możliwość budowania w + sieci lokalnych, w których systemy są konfigurowane przez centralny + serwer (router lub bramę). Tego typu sieci posługują + się wenętrzną adresacją zawaną także + prywatnymi klasami adresów. Tak jak w klasach + publicznych, ogólno dostępne są trzy klasy: +

+
    +
  • Klasa A: 10.0.0.0 - 10.255.255.255; maska 8 bitów + (255.0.0.0) = 16 777 214 hostów.
  • +
  • Klasa B: 172.16.0.0 - 172.31.255.255; maska 12 + bitów (255.240.0.0) = 983010 hostów.
  • +
  • Klasa C: 192.168.0.0 - 192.168.255.255; maska 16 + bitów (255.255.0.0) = 65534 hostów.
  • +
+

+ Te klasy są ustalane w standardzie dotyczącym klas prywatnych, jednak + administratorzy wolą używać mniejszych klas. Dlatego też klasa + A + pozostaje bez zmian, ale w klasie B używa się maski 16 + bitowej, a w klasie C maski 24 bitowej. +

+

16.1.3. Protokoły

+

+ Protokoły definiują standardy komunikacyjne, które umożliwiają + wymianę informacji przez sieć. Protokoły działają na niższych + warstwach niż usługi. Do protokołów możemy zaliczyć np. protokół + IP, którego adresacji poświęciliśmy cały poprzedni + podrozdział. W RHEL oraz w innych dystrybucjach w katalogu + /etc w pliku protocols znajduje się zestawienie + protokółów. Poniżej znajduje się fragment tego pliku. +

+
+[user@server10 ~]$ cat /etc/protocols 
+...
+ip	0	IP		# internet protocol, pseudo protocol number
+hopopt	0	HOPOPT		# hop-by-hop options for ipv6
+icmp	1	ICMP		# internet control message protocol
+igmp	2	IGMP		# internet group management protocol
+ggp	3	GGP		# gateway-gateway protocol
+ipv4	4	IPv4		# IPv4 encapsulation
+st	5	ST		# ST datagram mode
+tcp	6	TCP		# transmission control protocol
+...
+
+

16.1.4. Protokoły TCP i UDP

+

+ Z pośród wcześniejszego zestawienia protokołów, za transmisję danych + w sieciach opartych na protokole IP + odpowiedzialne są dwa protokoły TCP oraz + UDP. +

+

+ Protokół TCP stosowany w przypadku usług, w których liczy + się jakość danych. Ten protokół zestawia połączenie w swojej wartstwie + między klient oraz serwerem. Wówczas następuje sekwencjonowana + transmisja danych, strony potwierdzają otrzymanie pakietu danych przez + to w przypadku zaginięcia pakietu jest on przesyłany ponownie. + Większość usług w internecie opiera się o ten protokół, gdyż pozwala + on na rzetelną wymianę informacji. +

+

+ Innym również często wykorzysywanym protokołem jest UDP. + Protokół ten nie zestawia połączenia i poprostu pusza swoje pakiety + prawdopodbnie licząc na niezawodność protokołów warstwy niższej jak + IP. Nie dokonują on retransmisji gdy pakiety zostaną zgubione. + Jednak jest on znacznie szybszy niż TCP dlatego też jest + on wykorzystywany do przesyłania danych w czasie rzeczywistym. +

+

+ Protokoły TCP oraz UDP w wprowadzają pojecie + portu czyli numeru połączenia, + wykorzystywanego do komunikacji. Dane są przesyłane z + portu prywatnego + (portu klienta, port wysoki > 10000) do + portu publicznego usługi. Do portów publicznych możemy + zaliczyć: HTTP - 80/TCP, + HTTPS - 443/TCP czy + SSH - 22/TCP. Rodzaj transmisji został podany + po ukośniku. Więcej portów publicznych znajduje się w pliku + /etc/services, fragment zawartości tego pliku znajduje się + poniżej: +

+
+[user@server10 ~]$ head -100 /etc/services
+...
+ftp             21/tcp
+ftp             21/udp          fsp fspd
+ssh             22/tcp                          # The Secure Shell (SSH) Protocol
+ssh             22/udp                          # The Secure Shell (SSH) Protocol
+telnet          23/tcp
+telnet          23/udp
+# 24 - private mail system
+lmtp            24/tcp                          # LMTP Mail Delivery
+lmtp            24/udp                          # LMTP Mail Delivery
+smtp            25/tcp          mail
+smtp            25/udp          mail
+time            37/tcp          timserver
+...
+
+

16.1.5. Protokół ICMP

+

+ Protokół ICMP jest protokołem diagnostycznym, a jego + zadaniem jest sprawdzenie możliwości połaczenia z podanym komputerem. + Narzędziem korzystającym z tego protokołu jest ping. + Zadaniem tego narzędzia jest wysłanie do komputera pakietu i otrzymanie + odpowiedzi. Na podstawie otrzymanych (lub nie) danych polecenie + rejestruje każdą odpowiedź lub jej brak oraz pod koniec działania + wyświetla statystkę. +

+
+[user@server10 ~]$ ping -c4 192.168.122.7
+PING 192.168.122.7 (192.168.122.7) 56(84) bytes of data.
+64 bytes from 192.168.122.7: icmp_seq=1 ttl=64 time=0.354 ms
+64 bytes from 192.168.122.7: icmp_seq=2 ttl=64 time=0.344 ms
+64 bytes from 192.168.122.7: icmp_seq=3 ttl=64 time=0.517 ms
+64 bytes from 192.168.122.7: icmp_seq=4 ttl=64 time=0.573 ms
+
+--- 192.168.122.7 ping statistics ---
+4 packets transmitted, 4 received, 0% packet loss, time 3086ms
+rtt min/avg/max/mdev = 0.344/0.447/0.573/0.100 ms
+
+

+ Przy dużej i w pełni działającej sieci odpowiedzi powinny nie + przekraczać 2, 3 ms (milisekund). Czasy tutaj są poniżej 1 ms, ponieważ + to sieć wirtualna w wewnątrz tego samego komputera. +

+

16.1.6. Adres fizyczny

+

+ Każdy z interfejsów posiada swój adres fizyczny. Jest on wykorzystywany + do transmisji danych w najniżej warstwie logicznej. Każdy z pakietów, + które opuściły komputer źródłówy są opatrzone właśnie tym adresami. + Aby poznać adres naszej karty sieciowej należy wydać poniższe polecenie: +

+
+[user@server10 ~]$ ip addr | grep 'ether'
+    link/ether 52:54:00:55:b7:60 brd ff:ff:ff:ff:ff:ff
+
+

+ Adres mojej karty to: 52:54:00:55:b7:60. + Protokół IP ściśle współpracuje z adresem fizycznym. Istnieje + nawet protokół ARP, który umożliwia zamianę adresów + IP na adresy fizyczne. +

+

16.1.7. Adres IPv6

+

+ Ze względu na dość szybką ekspansję internetu, okazało sie że pula + adresów IPv4 jest na wyczerpaniu. Czego się dziwić, jeśli + mamy 8 miliardów ludzi na świecie, a tylko 4,3 miliarda adresów. Nie + pomogła również adresacja prywatna. Zatem była potrzeba nowego + rozwiązania. I w ten sposób narodził się + Protokół internetowy w wersji 6. Jest on dostępny w + RHEL od wersji 8. Zamiast 32-bitowego adresu wprowadza on + 128-bitowy adres, który pozwoli zaadresować praktycznie nieosiągalną + liczbę hostów (bo aż 340 i 36 zer). Adres ten składa się z 8 + oddzielonych dwu kropkiem grupy, w której znajdują po cztery liczby + heksadecymalne (0 - F). +

+

+ Protokół IPv6, korzysta z protokołu NDP + (ang. Neighbor Discover Protocol), do przeszukiwania sieci + i odnajwydwania innych urządzeń sieciowych skonfigurowanych za pomocą + tego protokołu. Rozszerza on również funkcjonalność + IPv4 o diagnostykę problemów związanych z połączniem, + powtarzalność adresów oraz routing. Za pomocą poniższego polecenia + wyświetliłem adres IPv6 interfejsu na swoim komputerze. +

+
+[user@server10 ~]$ ip addr | grep 'inet6'
+    inet6 fe80::5054:ff:fe55:b760/64 scope link noprefixroute 
+
+

16.1.8. Nazwa hosta

+

+ Każdy system operacyjny ma swoją nazwę, aby ułatwić jego identyfikację + w sieci. Nazwa hosta występuje w przypadku dystrybucji Linuksa w + symbolu zachęty chociaż możemy ją poznać na kilka róznych sposób. + Na przykład: +

+
+[user@server10 ~]$ hostname
+server10.example.com
+[user@server10 ~]$ hostnamectl --static
+server10.example.com
+[user@server10 ~]$ uname -n
+server10.example.com
+[user@server10 ~]$ nmcli general hostname 
+server10.example.com
+[user@server10 ~]$ cat /etc/hostname
+server10.example.com
+
+

+ Natomiast najlepszym i najszybszym sposóbem aby zmienić taką nazwę + jest zmiana jej w pliku użytym w ostatnim poleceniu przykładu: + /etc/hostname. Po zmianie pliku musimy jeszcze zrestartować + usługę systemd-hostnamed.service. +

+

16.2. Urządzenia sieciowe i połączenia

+

+ Teraz kiedy mamy solidną porcę wiedzy teoretycznej możemy przejść do + konfiguracji połączeń sieciowych w RHEL 9. +

+

16.2.1. Nazewnictwo urządzeń sieciowych w systemie

+

+ Do pewnego czasu nazwy urządzeń sieciowych, tj. interfejsów sieciowych + były łatwe do zapamiętania, przez co upraszczały zadania + administracyjne z nimi związane. Wywodziły się one od takich słów jak + Ethernet czy wireless lan i były numerowane od 0 + kolejno w takiej samej kolejności w jakiej zostały odnalezione w + momencie uruchomienia systemu. Jednak jak to bywa z takimi + rozwiązaniami, w przypadku dużej ilość interfejsów po ponownym + uruchomieniu systemu ich nazwy mogły być już zupełnie inne. Co + prowadziło do problemów konfiguracji. Podobnie jest z dyskami. +

+

+ Obecnie nazwy interfejsów są ustalane za pomocą zasad demona + udevd, przez co wprowadza się do systemu spójne oraz + przewidywalne nazwenictwo bez wcześniej wspomnianego problemu. +

+

+ Teraz zamiast eth0 interfejs może widnieć po nazwą np. + enp7s0 lub ens160. +

+

16.2.2. Profile połączeń sieciowych

+

+ Do RHEL 9 każe połączenie sieciowe miało swój profil + (plik konfiguracyjny) w katalogu /etc/sysconfig/network-scripts + Obecnie zrezygnowano z tej metody na rzecz tworzenia plików + key-file dla podsystemu sieciowego + NetworkManager. Sens profili został w nowych plikach + zachowany ponieważ koniec, końców chodzi o konfigurację sieciową + interfejsu. Jako jedno z zalet plików key-file jest to iż są + prostsze i łatwiejsze do utworzenia. Poniżej znajduje się pliki + key-file głównego połączenia sieciowego na mojej maszynie. +

+
+[connection]
+id=enp1s0
+uuid=eb849d6a-d642-32e9-9219-9496570c1d45
+type=ethernet
+autoconnect-priority=-999
+interface-name=enp1s0
+timestamp=1658937868
+
+[ethernet]
+
+[ipv4]
+address1=192.168.122.6/24,192.168.122.1
+dns=192.168.122.1;
+method=manual
+
+[ipv6]
+addr-gen-mode=eui64
+method=auto
+
+[proxy]
+
+
+

+ Posługiwanie się plikami key-file + jest najlepszym rozwiązaniem jeśli definiujemy dodatkowy interfejs w systemie. + Wówczas do dyspozycji mamy już gotowy plik i na jego podstawie możemy + zbudować nasz plik. Poniżej zamieściłem plik, który utworzyłem na + potrzeby drugiego połączenia na mojej maszynie. + Ten plik zawiera minimalną ilość informacji potrzebną do prawidłowego + połączenia sieciowego. To połączenie nie posiada definicji adresu + bramy domyślniej (tam kierowane są pakiety jeśli ich adres, jest poza + naszą siecią lokalną - adres routera lub bramy) oraz adresów + serwerów DNS (serwery DNS zmieniają nazwy domenowe + na adresy IP). +

+
+[connection]
+id=enp7s0
+uuid=13e3cf57-9a36-4cb3-a4e0-c1b2411bf984
+type=ethernet
+interface-name=enp7s0
+
+[ethernet]
+
+[ipv4]
+address1=192.168.100.6/24
+method=manual
+
+[ipv6]
+addr-gen-mode=eui64
+method=auto
+
+[proxy]
+
+
+

+ Usunąłem z sekcji [connection] takie + dyrektywy jak + autoconnect-priority=-999, oraz + timestamp. Z tego względu iż moje + połączenie jest w sieci wewnętrznej, usunąłem drugi adres po + przecinku w dyrektywie address1 oraz + dyrektywę dns, z sekcji + [ipv4]. Ten plik od pliku bazowego + różni się również wartością w dyrektywie + uuid, wartość UUID możemy uzyskać za + pomocą polecenia uuidgen, podając + jako argument nazwę interfejsu. Tak stworzony plik należy + przenieść do katalogu /etc/NetworkManager/system-connections + a następnie załadować za pomocą polecenia + nmcli connection load podając + ścieżkę do pliku jako argument. Po załadowaniu go, możemy aktywować + połączenie za pomocą polecenia + nmcli connection up filename i w tym + poleceniu również należy podać ścieżkę pliku profilu. +

+

+ Po aktywowaniu tego pliku w systemie pojawi się nowe połączenie: +

+
+[user@server10 ~]$ ip addr
+1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
+    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+    inet 127.0.0.1/8 scope host lo
+       valid_lft forever preferred_lft forever
+    inet6 ::1/128 scope host 
+       valid_lft forever preferred_lft forever
+2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
+    link/ether 52:54:00:55:b7:60 brd ff:ff:ff:ff:ff:ff
+    inet 192.168.122.6/24 brd 192.168.122.255 scope global noprefixroute enp1s0
+       valid_lft forever preferred_lft forever
+    inet6 fe80::5054:ff:fe55:b760/64 scope link noprefixroute 
+       valid_lft forever preferred_lft forever
+3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
+    link/ether 52:54:00:ef:9f:e0 brd ff:ff:ff:ff:ff:ff
+    inet 192.168.100.6/24 brd 192.168.100.255 scope global noprefixroute enp7s0
+       valid_lft forever preferred_lft forever
+    inet6 fe80::5054:ff:feef:9fe0/64 scope link noprefixroute 
+       valid_lft forever preferred_lft forever
+
+

+ Odnośnie egzaminu:
+ Jak będziemy mogli zauważyć większość konfiguracji sieciowej obecnie + w RHEL kręci się wokół podsystemu NetworkManager. + Wystarczy, że będziemy znać jeden ze sposób na konfigurację połączenia + sieciowego w systemie. +

+

16.2.3. Zarządzanie połączeniami sieciowym za pomocą podsystemu NetworkManager

+

+ Podsystem NetworkManager, to potężne narzędzie, które + potrafi ułatwić zarządzanie połączeniami sieciowymi. Za pomocą + polecenia nmtui, może zarządzać połączeniami za pomocą + prostego interfejsu okien w trybie tekstowym (pakiety dialog, whiptail). + Innym narzędziem jest polecenie nmcli, którego + działanie opiera się na kategoriach objektów. W tym materiale skupimy + się wyłącznie na połączeniach - connection oraz urządzeniach + - device. Dostęp do czynności możliwych do wykonania otrzymamy + gdy podamy po poleceniu nazwę kategorii obiektu i naciśniemy klawisz + Tab. Na przykład: +

+
+[user@server10 ~]$ nmcli connection 
+add      delete   edit     help     load     monitor  show     
+clone    down     export   import   modify   reload   up       
+
+

+ Jeśli wydamy polecenie nmcli connection + bez żadnej akcji wówczas polecenie zwróci nam listę dostępnych + w systemie połączeń. +

+
+[user@server10 ~]$ nmcli connection
+NAME    UUID                                  TYPE      DEVICE 
+enp1s0  eb849d6a-d642-32e9-9219-9496570c1d45  ethernet  enp1s0 
+enp7s0  13e3cf57-9a36-4cb3-a4e0-c1b2411bf984  ethernet  enp7s0 
+
+

+ Poniżej znajduje się lista czynności związana z połączeniami: +

+
    +
  • show - Wyświetla listę dostępnych połaczeń.
  • +
  • up / down - Aktywuje/dezaktywuje połączenie.
  • +
  • add - Dodaje połączenie.
  • +
  • edit - Zmienia obecnie istniejące połączenie lub + dodaje nowe.
  • +
  • modify - Modyfikuje jedno z parametrów połączenia.
  • +
  • delete - Usuwa połączenie.
  • +
  • reload - Nakazuje NetworkManager aby + ponownie załadował wszystkie profile połączeń.
  • +
  • load - Nakazuje NetworkManager aby + załadował profil połączenia.
  • +
+

+ Lista czynności związana z urządzeniami. +

+
    +
  • status - Pokazuje status urządzenia.
  • +
  • show - Wyświetla informacje na temat wszystkich + lub określonych interfejsów sieciowych. +
+

+ Nazwy kategorii obiektów oraz niektórych czynności możemy zapisać za + pomocą jedno literowych skrótów. Na przykład chcąc wyświetlić + dostępne w systemie połączenia możemy wydać następujące polecenie: +

+
+[user@server10 ~]$ sudo nmcli c s
+[sudo] hasło użytkownika user: 
+NAME    UUID                                  TYPE      DEVICE 
+enp1s0  eb849d6a-d642-32e9-9219-9496570c1d45  ethernet  enp1s0 
+enp7s0  13e3cf57-9a36-4cb3-a4e0-c1b2411bf984  ethernet  enp7s0 
+
+

+ W powyższym przykładzie użyłem skrótu + c od kategorii connection + oraz skrótu s od czynności + show. Więcej skrótów znajdziemy na stronie podręcznika. +

+

16.2.4. Tworzenie nowych połączeń sieciowych za pomocą nmcli

+

+ Jak moglismy wynioskować na podstawie czynność z poprzedniego + podrozdziału, możemy wykorzystać polecenie nmcli do + tworzenia nowych połączeń. Dodawanie połączenia rozpoczniemy od + sprawdzenia dostępnych w systemie interfejsów sieciowych. +

+
+[user@server10 ~]$ sudo nmcli d s
+[sudo] hasło użytkownika user: 
+DEVICE  TYPE      STATE          CONNECTION 
+enp1s0  ethernet  połączono      enp1s0     
+enp7s0  ethernet  połączono      enp7s0     
+enp8s0  ethernet  rozłączono     --         
+lo      loopback  niezarządzane  --         
+
+

+ Jeden z interfejsów znajduje się w stanie + rozłączono. Ten interfejs posłuży nam + do stworzenia nowego połączenia. Za pomocą czynności add + tworzmy nowe połączenie sieciowe. +

+
+[user@server10 ~]$ sudo nmcli c add type Ethernet ifname enp8s0 con-name enp8s0 ip4 192.168.100.8/24 gw4 192.168.100.1
+[sudo] hasło użytkownika user: 
+Pomyślnie dodano połączenie „enp8s0” (ff0d4164-b179-4d03-804d-ff08f8f4da31).
+
+

+ Na powyższym przykładzie dodałem nowe połączenie + (c add) typu Ethernet + (type Ethernet), użyłem do tego + interfejsu enp8s0 + (ifname enp8s0). Nadałem nazwę + połączeniu od nazwy interfejsu - enp8s0 + (con-name enp8s0), na końcu ustawiłem + adres IPv4 z 24 bitową maską + (ip4 192.168.100.8/24) oraz adres + bramy domyślnej (gw4 192.168.100.1). +

+

+ Tak utworzone połączenie nie wymaga już żadnej czynności, od razu jest + ono gotowe do pracy, o czym może świadczyć lista połączeń na poniższym + przykładzie. +

+

+ Połączenia zarządzane za pomocą NetworkManager możemy wyłączać + oraz włączać. +

+
+[user@server10 ~]$ sudo nmcli c s
+[sudo] hasło użytkownika user: 
+NAME    UUID                                  TYPE      DEVICE 
+enp1s0  eb849d6a-d642-32e9-9219-9496570c1d45  ethernet  enp1s0 
+enp7s0  13e3cf57-9a36-4cb3-a4e0-c1b2411bf984  ethernet  enp7s0 
+enp8s0  ff0d4164-b179-4d03-804d-ff08f8f4da31  ethernet  enp8s0 
+
+

+ Połączenia zarządzane za pomocą NetworkManager możemy wyłączać + oraz włączać. +

+
+[user@server10 ~]$ sudo nmcli c down enp8s0
+Pomyślnie dezaktywowano połączenie „enp8s0” (ścieżka aktywacji D-Bus: /org/freedesktop/NetworkManager/ActiveConnection/3)
+[user@server10 ~]$ sudo nmcli c s
+NAME    UUID                                  TYPE      DEVICE 
+enp1s0  eb849d6a-d642-32e9-9219-9496570c1d45  ethernet  enp1s0 
+enp7s0  13e3cf57-9a36-4cb3-a4e0-c1b2411bf984  ethernet  enp7s0 
+enp8s0  ff0d4164-b179-4d03-804d-ff08f8f4da31  ethernet  --     
+
+[user@server10 ~]$ sudo nmcli c up enp8s0
+Pomyślnie aktywowano połączenie (ścieżka aktywacji D-Bus: /org/freedesktop/NetworkManager/ActiveConnection/4)
+[user@server10 ~]$ sudo nmcli c s
+NAME    UUID                                  TYPE      DEVICE 
+enp1s0  eb849d6a-d642-32e9-9219-9496570c1d45  ethernet  enp1s0 
+enp7s0  13e3cf57-9a36-4cb3-a4e0-c1b2411bf984  ethernet  enp7s0 
+enp8s0  ff0d4164-b179-4d03-804d-ff08f8f4da31  ethernet  enp8s0 
+
+

16.2.5. Plik /etc/hosts

+

+ Za pomocą pliku /etc/hosts możemy zbudować wewnątrz systemu + mapowanie nazw domenowych na adresy IP, dzięki czemu będziemy + mogli posługiwać się prostymi nazwami zamiast adresami IP. + Każdy z wpisów w pliku składa się z trzech kolumn: adresu IP, + nazwy domenowej oraz aliasu (krótkiej dodatkowej nazwy, której możemy + używać zamiast nazwy domenowej, jeśli ta okaże się dość długa). + Najczęściej w aliasie zapisywana jest nazwa hosta bez sufiksu + domenowego. Na poniższym przykładzie znajduje się zawartość pliku + /etc/hosts z mojego serwera. +

+
+[user@server10 ~]$ cat /etc/hosts
+127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
+::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
+192.168.122.6 server10.example.com server10
+192.168.122.7 server20.example.com server20
+192.168.100.6 server10s7.example.com server10s7
+192.168.100.7 server20s7.example.com server20s7
+
+

+ Pierwsze dwa wpisy dotyczą tego aby odwołanie się do + localhost zwracało adres pętli + zwrotnej. Wpisy poniżej to mapowania adresów na nazwy maszyn + wykorzystywanych do ćwiczeń w tym materiale. Zwróćmy uwagę na to, iż + w pierwszych wierszach zdefiniowano więcej niż jeden alias. +

+

16.2.6. Testowanie łączności

+

+ A przetestować możliwość połączenia między klietem a serwera lub + między serwerami możemy skorzystać z jednego z narzędzi potokołu + ICMP, a mianowicie narzędzia ping. +

+
+[user@server10 ~]$ ping -c4 server20s7.example.com 
+PING server20s7.example.com (192.168.100.7) 56(84) bytes of data.
+64 bytes from server20s7.example.com (192.168.100.7): icmp_seq=1 ttl=64 time=0.497 ms
+64 bytes from server20s7.example.com (192.168.100.7): icmp_seq=2 ttl=64 time=0.335 ms
+64 bytes from server20s7.example.com (192.168.100.7): icmp_seq=3 ttl=64 time=0.483 ms
+64 bytes from server20s7.example.com (192.168.100.7): icmp_seq=4 ttl=64 time=0.302 ms
+
+--- server20s7.example.com ping statistics ---
+4 packets transmitted, 4 received, 0% packet loss, time 3096ms
+rtt min/avg/max/mdev = 0.302/0.404/0.497/0.086 ms
+
+

+ Za pomocą poniższego polecenia wysłałem cztery pakiety diagnostyczne + (-c4) przy użyciu sieci wewnętrznej + do drugiej maszyny w laboratorium. +

+

Ćwiczenie 1: Zmiana nazwy hosta

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej server1 oraz server2 zmień nazwę hosta + z server1 na server10 oraz z server2 na + Przy użyciu wykorzystywanego przez ciebie sposóbu wirtualizacji, + stwórz sieć wewnętrzną. Następnie dodaj do każdej z maszyn dodatkowy + interfejs sieciowy. Jak użytkownik z możliwością podniesienia uprawnień + za pomocą dowolnej metody dodaj i skonfiguruj połączenia sieciowe na + obu maszynach. Następnie dodaj wpisy wskazujące na maszyny do + pliku /etc/hosts na każdej znich. Wykonanie tych czynności + potwierdź sprawdzeniem połączenia. +

+

Podsumowanie

+

+ W tym rozdziale zapoznaliśmy się z fundamentalnymi pojęciami + związanymi z siecią. Poznalimśmy adresy IPv4, klasy adresów, + adresy IPv6 oraz kilka protokołów. Dowiedzieliśmy się jak + zarządzać połączeniami sieciowym w RHEL 9. Poznaliśmy + prosty system, który umożliwi nam pisanie nazw hostów zamiast adresów + IP oraz sposób na testowanie łączności. W następnym rozdziale + zajmiemy się sieciowym systemem plików. +

+

17. Network File System

+

+ Niektóre z mechanizmów współdzielenia dostępnych na Red Hat + Enterprise Linux pozwalają na korzystanie z udostępnionych plików, + tak + jakby były by one lokalnie dostępne. Jednym z takich mechanizmów jest + NFS, jego obsługa na docelowym systemie sprowadza się + do wydania pojedynczego polecenia mount, a z dodatkowym + demonem AutoFS tak na prawdę wystarczy próba dostępu + do katalogu w którym powinny znajdować się dane aby były one dostępne + na naszym komputerze. +

+

+ NFS czyli (ang. Network File System) sieciowy + system plików jest usługą sieciową pozwalającą na współdzielenie + zasobów plikowych. NFS działa w architekturze klient-serwer. + Co oznacza, + że jeden z komputerów udostępnia pliki, na których drugi komputer + po podłączeniu jest w stanie pracować. NFS udostępnia + foldery, a każdy taki folder nazwany jest udziałem. + Natomiast sam proces udostępniania folderu (udziału) nazywany + jest eksportem. Przyczym eksport może być dokonany w + kierunku okreslonego/określonych klienta/klientów. + Klient chcąc skorzystać z udziału NFS dokonuje jego montowania + tak jakby podłączał dodatkowy system plików do swojego systemu, + podając oczywiście odpowiednie parametry. +

+

+ Za stosowaniem NFS płynie wiele korzyści o takich jak + wieloplatformowość, wieloużytkowość, redukcja kosztów administracyjnych + oraz związanych z zakupem kolejnych dysków. Po zastosowaniu mechanizmów + AutoFS będziemy w stanie zapewnić użytkownikom zdalne + katalogi domowe. +

+

+ Dostępnych jest wiele wersji NFS. W RHEL od wersji 8 + domyślną wersją NFS jest wersja 4.2, która daje możliwość + wykorzystania wyłącznie protokołu TCP zapisu + asynchronicznego oraz obsługuje pliki powyżej 2GB. Po za tym pozwala + ona + na połączenia przez firewall oraz internet. Wersja ta + usprawnia kilka zabezpieczeń, wspiera szyfrowanie transmisji oraz + możliwość użycia ACL. +

+

17.1. Konfiguracja serwera oraz klienta NFS

+

+ Na początku zadań praktycznych skonfigurujemy sobie prosty udział, aby + mniej więcej wiedzieć jak skonfigurować serwer NFS. +

+

17.1.1. Konfiguracja serwera NFS

+

+ Konfigurację zaczynamy od serwera i tam na początku instalujemy + niezbędne oprogramowanie. +

+
+[user@server20 ~]$ sudo dnf install nfs-utils
+[sudo] hasło użytkownika user: 
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 1:05:53 temu w dniu pią, 29 lip 2022, 15:59:59.
+Pakiet nfs-utils-1:2.5.4-10.el9.x86_64 jest już zainstalowany.
+Rozwiązano zależności.
+Nie ma nic do zrobienia.
+Ukończono.
+
+

+ Następnie tworzymy katalog który będzie udziałem. Nadajemy mu + odpowiednie uprawnienia, aby każdy klient mógł zapisywać w nim swoje + pliki. +

+
+[user@server20 ~]$ sudo mkdir /nfstest
+[sudo] hasło użytkownika user: 
+[user@server20 ~]$ sudo chmod 777 /nfstest
+
+

+ Następnie w pliku /etc/exports, definiuje eksport udziału do + klienta. Eksport pozwala również na zdefiniowanie dodatkowych opcji + dotyczących udziału, w naszym przypadku będzie przypisanie klientowi + możliwości zapisu oraz odczytu. +

+
+/nfstest server10(rw)
+
+

+ Po zdefiniowaniu eksportu możemy przejść do uruchomienia demona NFS. + Następnie otworzymy port na zaporze sieciowej pozwalający na + swobodną komunikację klienta z serwerem. +

+
+[user@server20 ~]$ sudo systemctl enable --now nfs-server.service
+Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
+[user@server20 ~]$ sudo firewall-cmd --permanent --add-service nfs
+success
+[user@server20 ~]$ sudo firewall-cmd --reload 
+success
+
+

+ Teraz wystarczy tylko zmusić demona NFS, aby dokonał eksportu. + A możemy to zrobić za pomocą poniższego polecenia. +

+
+[user@server20 ~]$ sudo exportfs -av
+exporting server10.example.com:/nfstest
+
+

+ Opcja -a nakazuje eksport wszystkich + udziałów zapisanych w pliku /etc/exports, natomiast opcją + -v włącza bardziej szczegółowe + wyświetlanie komunikatów diagnostycznych. Bez tej opcji polecenie nie + zwróci nic. Konfigurację serwera możemy uznać za zakończoną. Teraz + przejdziemy do konfiguracji klienta. +

+

17.1.2. Konfiguracja klienta NFS

+

+ Konfigurację klienta tak jak serwera musimy rozpocząć od zainstalowania + niezbędnego oprogramowania, ponieważ obsługa NFS nie jest + natywnie wbudowana. +

+
+[user@server10 ~]$ sudo dnf install nfs-utils
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 0:24:05 temu w dniu pią, 29 lip 2022, 17:16:50.
+Pakiet nfs-utils-1:2.5.4-10.el9.x86_64 jest już zainstalowany.
+Rozwiązano zależności.
+Nie ma nic do zrobienia.
+Ukończono.
+
+

+ Podłączanie się do serwera NFS wygląda jak zwykłe montowanie + systemu plików w systemie. +

+
+[user@server10 ~]$ sudo mount server20:/nfstest /media
+
+

+ Nie musimy podawać nawet typu systemu plików. Aby nie musieć podłączać + się za każdym razem możemy dopisać poniższy wiersz do pliku + /etc/fstab. +

+
+server20:/nfstest /local nfs _netdev 0 0
+
+

+ Na powyższym przykładzie użyłem opcji + _netdev, ponieważ do realizacji tego + montowania potrzebna jest działająca na systemie sieć. +

+

17.2. Konfiguracja udziału NFS za pomocą AutoFS

+

+ Dla konfiguracji klienta jest o wiele lepsze rozwiązanie niż ręczne + montowanie NFS lub wpis w /etc/fstab. W RHEL + jest dostępny demon, który pozwala na zamontowanie udziału NFS + w momecie gdy jest on potrzebny. Na przykład gdy chcemy wyświetlić + zawartość katalogu, w którym powinny znajdować się udostępnione przez + niego pliki. Tym zajmuje się właśnie AutoFS. Ten + demon, nie tylko montuje na żądanie ale także odłącza go gdy nie ma + prób uzyskania dostępu do niego przez okres 5 minut. Główny plik + konfiguracyjny znajduje się w katalogu /etc pod nazwą + autofs.conf. Poniżej znajduje się jego zawartość: +

+
+[ autofs ]
+timeout = 300
+browse_mode = no
+mount_nfs_default_protocol = 4
+[ amd ]
+dismount_interval = 300
+
+

+ W tym pliku są ustawiane globalne opcje takie jak czas oczekiwania + na udział (timeout=300) czy czas po + którym udział zostanie odłączony + (dismount_interval=300). Jednak ten + plik nie służy do definicji automatycznego montowania. +

+

+ Wszelkiego rozdzaju montowanie bo nie tylko udziałów definiowane jest w + pliku /etc/auto.master. Poniżej znajduje się jego zawartość + bez komentarzy oraz pustych linii. +

+
+[user@server10 ~]$ grep -v -e '^#' -e '^$' /etc/auto.master
+/misc	/etc/auto.misc
+/net	-hosts
++dir:/etc/auto.master.d
++auto.master
+
+

+ Montowania za pomocą AutoFS nazwane jest + mapowaniem. Mapowania możemy dokonać na trzy sposoby: + główny, bezpośredni oraz + pośredni. Przyczym główny sposób mapowania służy + jedynie do określenia czy mapowanie będzie bezpośrednie lub pośrednie. + Samych mapowań dokonuje się w plikach użytkowników składowanych w + katalogu /etc/auto.master.d. W jednym z takich plików może + znajdować się wiele punktów montowania. W pliku /etc/auto.master + najczęściej definiuje się zbiorczy punkt montowania oraz rodzaj + mapowania. Natomiast konkretne udziały z wyszczególnionymi punktami + montowania + zapisuje się właśnie w plikach użytkowników. Jedno z mapowań jest już + zapisane w pierwszej linii powyższego przykładu. +

+

17.2.1. Mapowanie bezpośrednie

+

+ W przypadku mapowania bezpośredniego montowana jest dowolna ilość + niepowiązanych ze sobą punktów montowania. Przyczym o to kilka punktów + o których trzeba wiedzieć używając tego rodzaju mapowania. +

+
    +
  • Każdy udział montowany bezpośrednio jest widoczny dla użytkowników.
  • +
  • Montowanie lokalne oraz bezpośrednio montowane udziały mogą + istnieć w tym samym katalogu nadrzędnym.
  • +
  • Uzyskanie dostępu do katalogu zawierającego wiele montowanych + bezpośrednio udziałów podłączy do systemu je wszystkie.
  • +
+

+ Każdy udział montowany bezpośrenio będzie mieć osobny wpis w wyniku + działania polecenia mount wydanego bez argumentów. Na + poniższych przykładach pokazałem jak możemym wykorzystać + AutoFS do bezpośredniego montowania udziału NFS z + poprzedniego podrozdziału. +

+

+ W pliku /etc/auto.master zapisuje poniższą linię: +

+
+/-  /etc/auto.master.d/auto.direct
+
+

+ Oznacza ona mapowanie bezpośrednie. /- + onznacza, że punkty montowania w pliku mapowania użytkownika + /etc/auto.master.d/auto.direct będą + przestawiowe w postaci ścieżek bezwzględnych. W pliku mapowania + zapisujemy poniższą linię. +

+
+/nfstest  server20:/nfstest
+
+

+ Po włączeniu usługi za pomocą polecenia + sudo systemctl enable --now autofs.service + wystarczy, że wyświetlimy zawartość głównego katalogu i zauważym nowy + folder /nfstest z zamontowanym udziałem. +

+
+[user@server10 ~]$ ls -l /
+razem 26
+dr-xr-xr-x.   2 root root    6 2021-08-10  afs
+drwxr-xr-x.   2 root root    6 07-29 13:11 autodir
+lrwxrwxrwx.   1 root root    7 2021-08-10  bin -> usr/bin
+dr-xr-xr-x.   5 root root 4096 07-16 21:23 boot
+drwxr-xr-x.  21 root root 3280 07-29 12:36 dev
+drwxr-xr-x. 108 root root 8192 07-29 21:46 etc
+drwxr-xr-x.   3 root root   18 07-16 21:25 home
+lrwxrwxrwx.   1 root root    7 2021-08-10  lib -> usr/lib
+lrwxrwxrwx.   1 root root    9 2021-08-10  lib64 -> usr/lib64
+drwxr-xr-x.   2 root root    6 07-29 12:39 local
+drwxr-xr-x.   2 root root    6 2021-08-10  media
+drwxr-xr-x.   2 root root    0 07-29 21:46 misc
+dr-xr-xr-x.   1 root root 2048 04-19 22:42 mnt
+drwxr-xr-x.   2 root root    0 07-29 21:46 net
+drwxr-xr-x.   2 root root    6 07-29 15:14 nfshome
+drwxrwxrwx.   2 root root    6 07-29 17:17 nfstest
+drwxr-xr-x.   2 root root    6 2021-08-10  opt
+dr-xr-xr-x. 199 root root    0 07-29 12:36 proc
+dr-xr-x---.   2 root root  167 07-29 21:46 root
+drwxr-xr-x.  37 root root 1220 07-29 21:46 run
+lrwxrwxrwx.   1 root root    8 2021-08-10  sbin -> usr/sbin
+drwxrwxrwx.   2 root root    6 07-29 15:34 sharenfs
+drwxr-xr-x.   2 root root    6 2021-08-10  srv
+dr-xr-xr-x.  13 root root    0 07-29 12:36 sys
+drwxrwxrwt.   9 root root 4096 07-29 21:46 tmp
+drwxr-xr-x.  12 root root  144 07-16 21:11 usr
+drwxr-xr-x.  20 root root 4096 07-16 21:29 var
+
+

+ Poniżej zamieszczam wynik działania polecenia mount bez + argumentów: +

+
+[user@server10 ~]$ mount
+...
+/etc/auto.master.d/auto.direct on /nfstest type autofs (rw,relatime,fd=17,pgrp=1313,timeout=300,
+minproto=5,maxproto=5,direct,pipe_ino=26905)
+server20:/nfstest on /nfstest type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,
+namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.122.6,local_lock=none,
+addr=192.168.122.7)
+
+

17.2.2. Mapowanie pośrednie

+

+ Mapowanie pośrednie jest wykorzystywane gdy chcemy zamontować + wszystkie udziały w jednym wspólnym katalogu nadrzędnym. Oto kilka + punktów jakie trzeba znać podczas mapowania pośredniego. +

+
    +
  • Udziały zamontowane pośrednio są widoczne w momencie uzyskania do + nich dostępu.
  • +
  • Montowania lokalne oraz montowania pośrednie nie mogą istnieć w tym + samym katalogu nadrzędnym.
  • +
  • Każde montowanie pośrednie generuje jeden wpis w pliku + /etc/mtab - systemowa tablica montowania (stąd informacje + pobiera polecenie mount wydane bez żadnego argumentu).
  • +
  • Próba uzyskania dostępu katalogu zawierającego punkty montowania + pośredniego pokaże tylko udziały które zostały już zamontowane.
  • +
+

+ Poniżej przedstawiam w jaki sposób można zamontować udział NFS + z poprzedniego podrozdziału za pomocą mapowania pośredniego + AutoFS. +

+

+ Na początęk wyświetlimy zawartość głównego pliku mapowania czyli + /etc/auto.master +

+
+[user@server10 ~]$ grep -v -e '^#' -e '^$' /etc/auto.master
+/misc	/etc/auto.misc
+/net	-hosts
++dir:/etc/auto.master.d
++auto.master
+
+

+ W pierszej linii znajduje się definicja katalogu nadrzędnego + przygotowana przez AutoFS. W tej linii znajduje się także + ścieżka do pliku, w którym należy zapisać definicje udziałów do + mapowania pośredniego. Zapisujemy więc poniższą linię do pliku + /etc/auto.misc. +

+
+nfstest server20:/nfstest
+
+

+ Po zapisaniu zmian w pliku restartujemy usługę. Teraz możemy spróbować + uzyskać dostęp do udziału. Udział będzie dostępny jak podkatalog + katalogu /misc +

+
+[user@server10 ~]$ sudo systemctl restart autofs.service 
+[user@server10 ~]$ ls -l /misc/nfstest
+razem 0
+
+

+ Poniżej znajdują się wpisy z systemowego rejestru montowania: +

+
+/etc/auto.misc on /misc type autofs (rw,relatime,fd=5,pgrp=1042,timeout=300,minproto=5,maxproto=5,
+indirect,pipe_ino=24514)
+server20:/nfstest on /misc/nfstest type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,
+namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.122.6,local_lock=none,
+addr=192.168.122.7)
+
+

+ Zwróćmy uwagę na to, iż występuje tylko jeden wpisy dotyczący katalogu + /misc typu autofs. Gdzie w przypadku montowania + bezpośredniego, każdy punkt montowania posiadał własny wpis typu + autofs. +

+

+ Jeśli należałoby wybrać między mapowaniem bezpośrednim oraz pośrednim. + To tak naprawdę, nie ma lepszych czy gorszych. Każde z rodzajów + mapowań ma swoje cechy kluczowe, które sobie omówiliśmy w listach + przed każdym z przykładów. Na podstawie tych cech oraz potrzeb jakie + ma spełniać udział należy wybrać odpowiednią dla siebie metodę. +

+

17.2.3. Automatyczne montowanie zdalnych katalogów domowych

+

+ Przy użyciu AutoFS oraz montowania pośredniego możemy + zamontować katalog domowy użytkownika z innego serwera o ile są one + udostępnione za pomocą NFS. Aby to zrealizować potrzebne są + dwa czynniki: +

+
    +
  1. Katalog /home na serwerze powinien zostać wyeksportowany.
  2. +
  3. Udwzorowanie użytkowników na obu systemach powinno być takie same, + tj. najlepiej aby użytkownicy mieli te same UID-y aby + uniknąć problemów z prawem własności plików złożonych katalogch + domowych.
  4. +
+

+ Aby przetestować AutoFS w praktyce wykonamy kilka czynności, + aby odzworowany użytkownik z jednego serwera na drugim serwerze miał + dostęp do swoich danych. +

+

+ Na początku na serwerze, który udostępnia katalogi domowe + tworzymy użytkownika. Ja utworzyłem użytkownika + user40 z UID wynoszącym 4040 oraz nadałem mu hasło. +

+
+[user@server20 ~]$ sudo useradd -u 4040 user40
+[sudo] hasło użytkownika user: 
+[user@server20 ~]$ sudo passwd user40
+Zmienianie hasła użytkownika user40.
+Nowe hasło: 
+BŁĘDNE HASŁO: Hasło jest krótsze niż 8 znaków
+Proszę ponownie wpisać nowe hasło: 
+
+

+ Następnie dokonujemy eksportu katalogu /home oraz wymuszamy + zmianę udziałów NFS. +

+
+[user@server20 ~]$ cat /etc/exports
+/home	server10(rw)
+[user@server20 ~]$ sudo exportfs -avr
+exporting server10.example.com:/home
+
+

+ Tak naprawdę na tym konfiguracja serwera kończy się. Przejdziemy teraz + do konfiguracji klienta. W pliku /etc/auto.master utworzymy + nową deklaracje katalogu nadrzędnego dla punktów montowania + pośredniego. +

+
+[user@server10 ~]$ grep -v -e '^#' -e '^$' /etc/auto.master
+/misc	/etc/auto.misc
+/nfshome	/etc/auto.master.d/auto.home
+/net	-hosts
++dir:/etc/auto.master.d
++auto.master
+
+

+ W drugiej linii znajduje się katalog nadrzędny, w którym będą + przechowywane katalogi domowe. Musimy go utworzyć. +

+
+[user@server10 ~]$ sudo mkdir /nfshome
+
+

+ Następnie w pliku w którym powinny znajować się definicję punktów + montowania zapisujemy poniższą linię: +

+
+* -rw server20:/home/&
+
+

+ W tym zapisie gwiazdka odnosi się dowolnej nazwy punktu montowania, + ponieważ użytkowników może być bardzo dużo i nie sensu ich tu + wszystkich wypisywać. Ampersand (&) może być + odwołaniem do wielu serwerów lub wielu udziałów NFS. W tym + przypadku został użyty do wskazania wielu katalogów w udziale. + Po zapisaniu zmian w pliku należy zrestartować usługę. +

+
+[user@server10 ~]$ sudo systemctl restart autofs
+
+

+ Teraz wystarczy odwzrować użytkownika i się na niego przełączyć. +

+
+[user@server10 ~]$ sudo useradd -u 4040 -b /nfshome -M user40
+[user@server10 ~]$ su - user40
+Hasło: 
+[user40@server10 ~]$
+
+

+ Podczas odwzorowywania użytkownika nadałem mu UID 4040, taki + sam jak na serwerze (-u 4040), + wskazałem mu inny niż /home katalog bazowy dla katalogów + domowych (-b /nfshome) w tym przypadku + jest katalog nadrzędny dla punktów montowania pośredniego + AutoFS. Użyłem również opcji + -M, aby podczas tworzenia nowego + użytkownika nie został utworzony katalog domowy. Po utworzeniu + użytkownika przełączyłem się na niego. Poniżej znajdują się wpisy + z systemowego rejestru montowania, świadczące o tym iż katalog + domowy użytkownika user40 jest + katalogiem zdalnym podłączonym z pomocą NFS. +

+
+[user40@server10 ~]$ pwd
+/nfshome/user40
+[user40@server10 ~]$ mount
+...
+/etc/auto.master.d/auto.home on /nfshome type autofs (rw,relatime,fd=11,pgrp=1756,timeout=300,
+minproto=5,maxproto=5,indirect,pipe_ino=28415)
+server20:/home/user40 on /nfshome/user40 type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144
+,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.122.6,local_lock=none,
+addr=192.168.122.7)
+
+

+ W ten sposób mogę utrzymać jeden katalog domowy na zdalnym serwerze + i korzystać z niego na wielu komputerach. +

+

+ Odnośnie egzaminu:
+ Jednym z zdań egzaminacyjnych może być automatyczne montowanie zdalnych + katalogów domowych z wykorzystaniem NFS oraz AutoFS. +

+

Ćwiczenie 1: Tworzenie udziału NFS oraz mapowanie bezpośrednie

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server10 utwórz udział NFS z katalogu + /sharenfs i udostępnij go. Na maszynie server20 + zainstaluj usługę AutoFS, następnie skonfiguruj automatyczne + montowanie wcześniej utworzonego udziału w sposób bezpośredni. + Spróbuj uzyskać dostęp do udziału, aby go zamontować. Potwierdź to + za pomocą polecenia df -h. +

+

Ćwiczenie 2: Pośrednie mapowanie udziału NFS

+

+ Wykorzystując udział z poprzedniego ćwiczenia zmień konfigurację + AutoFS aby udział montowany był w sposób pośredni w katalogu + nadrzędnym /autoindir. Spróbuj uzyskać dostęp do + udostępnionego w ten sposób udziału. Potwierdź to za pomocą polecenia + df -h +

+

Podsumowanie

+

+ W tym rodziale poznaliśmy pierwszą usługę sieciową, która służy do + udostępniania plików a jest nią NFS. Nauczyliśmy się + konfigurować udziały na serwerze oraz montować je na systemach + klienckich. Poznaliśmy usługę AutoFS, która pozwala na + za montowanie udziału NFS, kiedy będzie on potrzebny. + Poznaliśmy też jej konfiguracje w kilku ciekawych przypadkach. + Następny rozdział będzie poświęcony synchronizacji czasu systemowego + oraz rozwiązywaniu nazw domenowych. +

+

18. Synchronizacja czasu oraz rozwiązywanie nazw w RHEL 9

+

+ Wiele komponentów systemowych opiera swoje czynności o poprawność + daty i czasu. Jednym z nich, który każdemu przychodzi do głowy jest + cron - systemowy harmonogram zadań. Bez ustawień czasu + harmonogram był by najzwyczajniej w świecie bezużyteczny. Nad + poprawnością czasu w systemach Uniksowych czuwa protokół + NTP wraz z jego najnowszą implementacją w postaci + programu chrony. +

+

+ Aby osoba korzystająca z komputera nie musiała zapamiętać liczb adresu + IP chcąc zapmiętać adres strony, wprowadzono + prostsze do zapamiętania nazwy domenowe. Mimo + tego adres IP dalej jest potrzebny do realizacji połączenia, + zatem wraz z nazwami domenowymi pojawiła się usługa + DNS, której zadaniem jest zamiana nazw domenowych + na adresy IP i vice versa o ile jest to możliwe. +

+

18.1. Network Time Protocol - synchronizacja czasu

+

+ Synchronizacja czasu za pomocą NTP polega na jak + najdokładnieszym ustawieniu czasu rzeczywistego na zegarze systemowym + za pomocą sieci. Czas na serwerach NTP nie bierze się z nikąd + najpopularniejszym sposób na uzyskanie dokładnego czasu są + zegary atomowe rozlokowane w wielu instytucjach + naukowych na całym świecie. Zegary te są podłączone do serwerów, + których adresy są dostępne na oficjalnej stronie protokołu: + ntp.org, gdzie znajdziemy zbiory serwerów + nazywane pulami. Pule mogą mieć wiele różnych + podziałów, na przykład na poszczególne kraje, a nawet konkretne + dystrybucje Linuksa. W przypadku RHEL adres puli NTP + to: rhel.pool.ntp.org. W tych pulach, może znajdować się + wiele serwerów, które mają określone role. Wśród nich możemy wyróżnić + takie jak: +

+
    +
  • Serwer podstawowy - ten rodzaj serwera otrzymuje + czas bezpośrednio z jego źródła czyli zegara atomowego. Serwery tego + typu mogą przekazywać czas do serwerów podrzędnych jaki + synchronizować czas klientów.
  • +
  • Serwer podrzędny - serwery tego typu otrzymują + czas od serwera podstawowego, głównie zajmują się synchonizacją + czasu klientów, aby zmniejszyć obciążenie serwerów podstawowych.
  • +
  • Peer - jest rodzaj serwera który przekazuje czas + innym serwerom na tym samym poziomie. Peer-y mogą występować + wśród serwerów podstawowych jak podrzędnych.
  • +
  • Klient - klient nie jest rolą serwera, a raczej + hostów, które korzystają z NTP. Klient pobiera czas z + jednego z serwerów z puli a następnie ustawia swój zegar na podstawie + uzyskanych z serwera różnic.
  • +
+

+ Sieć NTP ma hierachiczną budowę i opiera się ona o poziomy + nazywane Stratum. Poziomy zaczynają się od poziomu + 0 + na tym poziomie znajdują się głownie zegary atomowe lub inne wzorce + czasu. Klient NTP nie może uzyskać informacji z tego poziomu. + Nie jest on podłączony do sieci. Drugim poziom - + poziom 1 - jest miejscem w hierarchii, który znajdują + się głównie serwery podstawowe oraz peer-y. Na kolejnych + poziomach znajdują się serwery podrzędne oraz peer-y tych + poziomów. Czas uzyskany z najwyższych poziomów można uznać za + najbardziej dokładny i rzetelny. Wszystkich poziomów w hierarchi jest + 15. +

+

+ Klient wybiera serwer na podstawie czasu oczekiwania na odpowiedź, + im krótszym tym czas będzie bardziej dokładny. +

+

18.1.1. Konfiguracja demona Chrony

+

+ Chrony jest najnowszą implementacją demona + synchronizacji czasu. Działa on na porcie 123 protokołu UDP. Jego plik + konfiguracjny znajduje się bezpośrednio w katalogu /etc pod + nazwą chrony.conf. Poniżej znajduje się jego zawartość. +

+
+pool 2.rhel.pool.ntp.org iburst
+sourcedir /run/chrony-dhcp
+driftfile /var/lib/chrony/drift
+makestep 1.0 3
+rtcsync
+keyfile /etc/chrony.keys
+ntsdumpdir /var/lib/chrony
+leapsectz right/UTC
+logdir /var/log/chrony
+
+

+ Z tych przedstawionych na przykładzie na bardziej szczegółowe omówienie + zasługuje dyrektywa pool wskazująca na + adres puli, dodatkowo atrybut iburst + powoduje przyspieszenie uzyskania czasu z serwera NTP. Ma to + swój cel głównie podczas uruchamiania systemu. W pliku wskazywanym + przez dyrektywę driftfile + przechowywany jest wskaźnik rozbierzności czasu zegara systemowego, + informacje przechowywane w tym pliku pomagają w utrzymaniu precyzji + zegara. Jeśli mielibyśmy wskazać konkretny serwer czasu, to wówczas + należało by użyć dyrektywy server. Dyrektywa + logdir przechowuje plik dziennika + /var/log/chrony. +

+

+ Demon chrony dostarczany jest wraz z poleceniem + chronyc za pomocą którego możemy sprawdzić wydajność + demona oraz kontrolować jego działanie. Informacje o NTP z + demona możemy uzyskać za + pomocą podpoleceń takich jak sources oraz tracking. +

+

+ Aby skonfigurować chrony nic nie trzeba robić. Wystarczy + instalacja oraz włączenie jednostki. Domyślna konfiguracja świetnie + sprawdza się w podstawowych zastosowaniach. Konfigurację zaczniemy + zatem od sprawdzenia czy demon jest zainstalowany czy nie. +

+
+[user@server10 ~]$ sudo dnf install chrony
+Updating Subscription Management repositories.
+Unable to read consumer identity
+
+This system is not registered with an entitlement server. You can use subscription-manager to register.
+
+Ostatnio sprawdzono ważność metadanych: 0:31:37 temu w dniu pon, 1 sie 2022, 14:03:11.
+Pakiet chrony-4.1-3.el9.x86_64 jest już zainstalowany.
+Rozwiązano zależności.
+Nie ma nic do zrobienia.
+Ukończono.
+
+

+ W przypadku Red Hat Enterprise Linux 9 jest on domyślnie zainstalowany. + To pozostaje tylko go włączyć. +

+
+[user@server10 ~]$ sudo systemctl enable --now chronyd.service 
+Created symlink /etc/systemd/system/multi-user.target.wants/chronyd.service → /usr/lib/systemd/system/chronyd.service.
+[user@server10 ~]$ sudo systemctl status chronyd.service --no-pager
+● chronyd.service - NTP client/server
+     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
+     Active: active (running) since Mon 2022-08-01 14:37:11 CEST; 23s ago
+       Docs: man:chronyd(8)
+             man:chrony.conf(5)
+    Process: 1968 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
+   Main PID: 1970 (chronyd)
+      Tasks: 1 (limit: 5891)
+     Memory: 824.0K
+        CPU: 18ms
+     CGroup: /system.slice/chronyd.service
+             └─1970 /usr/sbin/chronyd -F 2
+
+sie 01 14:37:11 server10.example.com systemd[1]: Starting NTP client/server...
+sie 01 14:37:11 server10.example.com chronyd[1970]: chronyd version 4.1 starting (+CMDMON +NTP +RE…EBUG)
+sie 01 14:37:11 server10.example.com chronyd[1970]: Frequency -6.706 +/- 0.264 ppm read from /var/…drift
+sie 01 14:37:11 server10.example.com chronyd[1970]: Using right/UTC timezone to obtain leap second data
+sie 01 14:37:11 server10.example.com chronyd[1970]: Loaded seccomp filter (level 2)
+sie 01 14:37:11 server10.example.com systemd[1]: Started NTP client/server.
+sie 01 14:37:16 server10.example.com chronyd[1970]: Selected source 178.215.228.24 (2.rhel.pool.ntp.org)
+sie 01 14:37:16 server10.example.com chronyd[1970]: System clock TAI offset set to 37 seconds
+Hint: Some lines were ellipsized, use -l to show in full.
+
+

+ Za pomocą polecenia chronyc wraz z podpoleceniem + sources możemy podejrzeć z jakim serwerem czasu + połączył się nasz klient oraz na jakim poziomie hierarchi + się one znajdują. +

+
+[user@server10 ~]$ chronyc sources
+MS Name/IP address         Stratum Poll Reach LastRx Last sample               
+===============================================================================
+^+ pingless.com                  2   6   377     2  -3517us[-2773us] +/-   27ms
+^+ s.complex.net.pl              2   6   377     1  -2877us[-2877us] +/-   44ms
+^* ntp.ifj.edu.pl                2   6   377     1    +10ms[  +11ms] +/-   33ms
+^+ any.time.nl                   2   6   377    66  -2061us[-1153us] +/-   62ms
+
+

+ Gwiazdka w pierwszej kolumnie wiersza oznacza, że to właśnie z tego + serwera został pobrany czas. Możemy się upewnić za pomocą drugiego + podpolecenia tracking. Aby poznać więcej informacji + na temat kolumn wyszukajmy sekcji sources na stronie + podręcznika polecenia chronyc. Wynik działania podpolecenia + tracking znajduje się poniżej: +

+
+[user@server10 ~]$ chronyc tracking
+Reference ID    : C0560E43 (ntp.ifj.edu.pl)
+Stratum         : 3
+Ref time (UTC)  : Mon Aug 01 12:48:05 2022
+System time     : 0.001653226 seconds slow of NTP time
+Last offset     : -0.001851230 seconds
+RMS offset      : 0.001920320 seconds
+Frequency       : 7.629 ppm slow
+Residual freq   : -0.463 ppm
+Skew            : 4.887 ppm
+Root delay      : 0.042983003 seconds
+Root dispersion : 0.008079479 seconds
+Update interval : 64.8 seconds
+Leap status     : Normal
+
+

+ Zwróćmy uwagę na rozbierzność na temat poziomów serwera. W przypadku + mojego serwera czas systemowy spóźnia się o wartość zapisaną w wierszu + System time. +

+

+ Odnośnie egzaminu:
+ Podczas egzaminu maszyny egzaminacyjne nie będą mieć dostępu do + internetu, więc podczas konfiguracji klienta NTP będzie trzeba + wskazać na serwer w sieci egzaminacyjnej. Ujmujemy w komentarz + dyrektywę pool oraz server jeśli występuje, + następnie dopisujemy kolejną dyrektywę server z adresem + serwera NTP w sieci egzaminacyjnej. +

+

18.1.2. Ustawienia daty i czasu

+

+ Podczas omawiania synchronizacji czasu nie może zabraknąć ręcznych + ustawień. W przypadku RHEL można to + zrealizować na dwa sposóby. Pierwszym z nich jest jest polecenie + timedatectl oraz date. Tak prezentują + się informacje zwracane przez oba narzędzia uruchomione bez żadnych + argumentów: +

+
+[user@server10 ~]$ timedatectl
+               Local time: pon 2022-08-01 15:34:51 CEST
+           Universal time: pon 2022-08-01 13:34:51 UTC
+                 RTC time: pon 2022-08-01 13:34:51
+                Time zone: Europe/Warsaw (CEST, +0200)
+System clock synchronized: yes
+              NTP service: active
+          RTC in local TZ: no
+
+[user@server10 ~]$ date
+pon, 1 sie 2022, 15:34:55 CEST
+
+

+ Aby móc ustawić ręcznie datę oraz czas trzeba wyłączyć możliwość + ustawienia daty oraz czasu z protokołu NTP. Możemy to zrobić + za pomocą poniższego polecenia: +

+
+[user@server10 ~]$ sudo timedatectl set-ntp false
+[user@server10 ~]$ timedatectl
+               Local time: pon 2022-08-01 15:35:58 CEST
+           Universal time: pon 2022-08-01 13:35:58 UTC
+                 RTC time: pon 2022-08-01 13:35:58
+                Time zone: Europe/Warsaw (CEST, +0200)
+System clock synchronized: yes
+              NTP service: inactive
+          RTC in local TZ: no
+
+

+ Ustawienie daty oraz czasu następuje w przypadku timedatectl, + dokonujemy za pomocą podpolecenia set-time następnie + podajemy datę oraz godzinę. +

+
+[user@server10 ~]$ sudo timedatectl set-time "1970-01-01 12:01"
+[user@server10 ~]$ timedatectl 
+               Local time: czw 1970-01-01 12:01:12 CET
+           Universal time: czw 1970-01-01 11:01:12 UTC
+                 RTC time: czw 1970-01-01 11:01:13
+                Time zone: Europe/Warsaw (CET, +0100)
+System clock synchronized: no
+              NTP service: inactive
+          RTC in local TZ: no
+
+

+ Natomiast w przypadku polecenia date używa się opcji + --set. +

+
+[user@server10 ~]$ sudo date --set "1970-01-05 23:59"
+pon, 5 sty 1970, 23:59:00 CET
+[user@server10 ~]$ date
+pon, 5 sty 1970, 23:59:02 CET
+
+

+ Aby wszystko wróciło do normy, wystarczy że włączymy obsługę NTP. +

+
+[user@server10 ~]$ sudo timedatectl set-ntp true
+[sudo] hasło użytkownika user: 
+[user@server10 ~]$ chronyc tracking
+Reference ID    : D4539E53 (dedibox.demongeot.biz)
+Stratum         : 3
+Ref time (UTC)  : Mon Aug 01 13:56:32 2022
+System time     : 0.000497948 seconds slow of NTP time
+Last offset     : -0.000775014 seconds
+RMS offset      : 0.000775014 seconds
+Frequency       : 6.770 ppm slow
+Residual freq   : -57.944 ppm
+Skew            : 0.724 ppm
+Root delay      : 0.065063119 seconds
+Root dispersion : 0.003521844 seconds
+Update interval : 1.5 seconds
+Leap status     : Normal
+[user@server10 ~]$ timedatectl 
+               Local time: pon 2022-08-01 15:57:19 CEST
+           Universal time: pon 2022-08-01 13:57:19 UTC
+                 RTC time: pon 2022-08-01 13:57:19
+                Time zone: Europe/Warsaw (CEST, +0200)
+System clock synchronized: yes
+              NTP service: active
+          RTC in local TZ: no
+
+

18.2. Rozwiązywanie nazw domenowych

+

+ Za rozwiązywanie nazw domenowych odpowiedzialna jest usługa + DNS. W tym podrozdziale przyjrzymy się tylko + konfiguracji klienta oraz poznamy narzędzia dzięki którym będziemy + mogli odpytać serwer w poszukiwaniu adresu IP lub nazwy + hosta. Na początek jednak trochę teorii. +

+

+ Przestrzeń nazw domenowych posiada hierahiczną strukturę odwróconego + drzewa. Podobnie do katalogu głównego. Podbnie tutaj występuję wezeł + główny oznaczonony kropką (.). Kropka funkcjonuje + również jako separator w nazwach. Po głównym weźle, ktory jest + domyślny i nie trzeba do podawać występuje TLD czyli + domena najwyższego rzędu. Domenami najwyszego rzędu są między innymi + .com, .net, .org itd. Domeny geograficzne + na przykład .pl również są domenami najwyższego rzędu. Po nich + wystepują poddomeny niższego rzędu. Mogą być to domeny takie jak + .com itd. o ile w hierarchi poprzedza je na przykład domena + geograficzna. W poddomenach niższego rzędu występują już nazwy własne, + które się wydzierżawia od dostawcy usług domenowych. Taką nazwą własną + mozę być redhat lub github. Po nazwie własnej, + występuje nazwa hosta. Ma to miejsce w 80% przypadków, reszta to sieci + korporacyjne gdzie między nazwą hosta, a nazwą własną domeny możemy + występować jeszcze duża ilość poddomen. Weźmy dla przykładu nazwe + domenową tej strony. Jeśli zapiszemy ją zgodnie z hierarchią to będzie + wyglądać jak na przykładzie ponizej. +

+
+.-↓
+  io.↓
+     github.↓
+            morketsmerke
+.io.github.morketsmerke
+
+

+ W taki sposób są rozwiązywane nazwy domenowe na adresy IP + przyczym najczęsiej w początkowej fazie, kroka oznaczająca główny + węzeł zostaje pominięta, następnie szuka się serwera nazwy + obsługującego github.io. Następnie + otrzymuje się adres, który z hostów w sieci github to + morketsmerke (oczywiście w dużym skrócie). Ludzie za to + wpisują adresy do aplikacji w + sposób odwrotny do hierarchi: morketsmerke.github.io. I w + momencie gdy takie zapytanie trafi do serwera system DNS + zacznie + wysłać zapytania do innych serwerów odpowiedzialnych za utrzymanie + poszczególnych części nazwy. +

+

+ Serwery DNS zajmują się utrzymaniem bazy mapowań adresów + domenowych na adresy IP, odpowiadaniem na zapytania klientów + oraz synchronizacją tych baz z innymi serwerami. Wpis bazie danych + DNS nazywany jest rekordem. Serwery + DNS dzieli się na serwery główne oraz + podrzędne. Serwery podrzędne wykorzystuje się głównie + do równoważenia obciążenia oraz nadmiarowości, ponieważ bazy są + przesyłane na serwery podrzędne za każdą aktulizacją wprowadzą w + konfiguracji domeny. +

+

18.2.1. Plik /etc/resolv.conf

+

+ Za pomocą pliku /etc/resolv.conf, narzędzia odpowiedzialne + za rozwiązywanie nazw wiedzą w jaki sposób mają tworzyć zapytania oraz + gdzie przesyłać je dalej (na przykład, gdy korzystamy z aliasu + zapisanego w pliku /etc/hosts). Plik można edytować jak każdy + inny plik tekstowy. Zazwyczaj zawiera on do trzech dyrektyw. Zawartość + pliku z jednej z moich maszyny prezentuje się na poniższym przykładzie. +

+
+[user@server10 ~]$ cat /etc/resolv.conf 
+# Generated by NetworkManager
+search example.com
+nameserver 192.168.122.1
+
+

+ Dyrektywa search zawiera sufiks z + nazwą domeny, jest on dodawany do każdej zapisanej nazwy hosta + pod czas tworzenia zapytania DNS. W tej dyrektywie może być + ich maksymalnie 6, przyczym warto pamiętać o tym aby na początku + zawsze znajdowała się domena lokalna. Kolejną dyrektywą jest + nameserver zawierająca adresy + IP odpytywanych po kolei serwerów DNS. W tej + dyrektywie mogą znaleźć się maksymalnie 3 adresy, będą one odpytywane + w takiej samej kolejności jak zostały zapisane. Ostatnia dyrektywą + jest dyrektywa domain, jednak nie jest ona stosowana jeśli + w pliku jest zapisana dyrektywa search. +

+

18.2.2. Plik /etc/nsswitch.conf

+

+ Inny plikiem wpływającym na działanie rozwiązywania nazw systemach + Uniksowych jest /etc/nsswitch.conf. Jego zadaniem jest + wybranie odpowiedniego źródła dla żądanych informacji i w tym przypadku + nie chodzi tylko o nazwy domenowe. Każdy wpis składa się ze wskazania + bazy danych. W przypadku nazw domenowych jest hosts. + Następnie wskazywane są źródła. Poniżej znajduje się przykładowy + wpis: +

+
+hosts:      files dns myhostname
+
+

+ Gdzie files jest w tym przypadku + plikiem /etc/hosts; dns jest + odpytaniem serwerów zapisanych w /etc/resolv.conf. +

+

+ Jeśli program podczas rozwiązywania nazwy nie znajdzie jej w pliku, + przechodzi do kolejego + źródła. Plik /etc/nsswitch.conf za pomocą słów kluczowych + pozwala na określenie akcji jeśli uzyskano dane lub nie z zapisanych + źródeł. Poniżej znajduje się lista słów kluczowych. +

+
    +
  • success - Informacje znalezione w źródle. + Dostarczone do aplikacji, która ich żądała. Domyślna akcja: + return (nie szukaj w innych źródłach).
  • +
  • notfound - Nie znalaleziono informacji w źródle. + Domyślna akcja: continue (szukaj w innym źródle)
  • +
  • unavail - Źródło jest wyłączone, bądź nie + odpowiada. Usługą może być wyłączona lub nie skonfigurowana. + Domyślna akcja: continue (szukaj w innym źródle)
  • +
  • tryagain - Źródło jest zajęte, spróbuj poźniej. + Domyślna akcja: continue (szukaj w innym źródle)
  • +
+

+ Dzięki tym słowom kluczowym, jeśli np. nazwa hosta nie zostanie + odnaleziona w pliku /etc/resolv.conf można przerwać dalsze + poszukiwania. +

+
+hosts:      files [notfound=return] dns myhostname
+
+

18.2.3. Narzędzia do rozwiązywania nazw domenowych

+

+ Czasem może zdarzyć się potrzeba przetestowania rozwiązywania nazw + w systemie i do tego mogą posłużyć nam dostępne w systemie narzędzia. + Jest ich kilka. +

+

+ Pierwszym z nich jest dig. Bardzo elastyczne i + użyteczne narzędzie. Możemy wykorzystać je do wielu czynności. Plusem + tego narzędzia jest domyślna ilość zwracanych informacji. Poniżej + znajduje się rozwiązanie nazwy redhat.com za pomocą tego + narzędzia. +

+
+[user@server10 ~]$ dig redhat.com
+
+; <<>> DiG 9.16.23-RH <<>> redhat.com
+;; global options: +cmd
+;; Got answer:
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20452
+;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
+
+;; OPT PSEUDOSECTION:
+; EDNS: version: 0, flags:; udp: 512
+;; QUESTION SECTION:
+;redhat.com.			IN	A
+
+;; ANSWER SECTION:
+redhat.com.		312	IN	A	52.200.142.250
+redhat.com.		312	IN	A	34.235.198.240
+
+;; Query time: 56 msec
+;; SERVER: 192.168.122.1#53(192.168.122.1)
+;; WHEN: Mon Aug 01 17:50:49 CEST 2022
+;; MSG SIZE  rcvd: 71
+
+

+ Na samym dole mamy podsumowanie, w którym znajdują się informacje o + tym jak długo trwało zapytanie, czy adres odpytywanego serwera. + Polecenie to również możemy odpytać podając adres IP. +

+
+[user@server10 ~]$ dig -x 52.200.142.250
+
+; <<>> DiG 9.16.23-RH <<>> -x 52.200.142.250
+;; global options: +cmd
+;; Got answer:
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14382
+;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
+
+;; OPT PSEUDOSECTION:
+; EDNS: version: 0, flags:; udp: 512
+;; QUESTION SECTION:
+;250.142.200.52.in-addr.arpa.	IN	PTR
+
+;; ANSWER SECTION:
+250.142.200.52.in-addr.arpa. 300 IN	PTR	ec2-52-200-142-250.compute-1.amazonaws.com.
+
+;; Query time: 88 msec
+;; SERVER: 192.168.122.1#53(192.168.122.1)
+;; WHEN: Mon Aug 01 17:55:58 CEST 2022
+;; MSG SIZE  rcvd: 112
+
+

+ Użycie opcji -x pozwala na podanie + adresu IP. +

+

+ Kolejny narzędziem jest polecenie host. Jak argument + przyjmuje nazwę domenową i zwraca adres IP serwera oraz + pozostałe wpisy w bazie DNS powiązane z tą nazwą. Poniżej + znajduje się przykład. +

+
+[user@server10 ~]$ host redhat.com
+redhat.com has address 34.235.198.240
+redhat.com has address 52.200.142.250
+redhat.com mail is handled by 10 us-smtp-inbound-2.mimecast.com.
+redhat.com mail is handled by 10 us-smtp-inbound-1.mimecast.com.
+
+

+ Za pomocą polecenia host możemy uzyskać podobne wyjście jak + w przypadku polecenia dig. Służy do tego opcja + -v. +

+
+[user@server10 ~]$ host -v redhat.com
+Trying "redhat.com"
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5646
+;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
+
+;; QUESTION SECTION:
+;redhat.com.			IN	A
+
+;; ANSWER SECTION:
+redhat.com.		247	IN	A	52.200.142.250
+redhat.com.		247	IN	A	34.235.198.240
+
+Received 60 bytes from 192.168.122.1#53 in 4 ms
+Trying "redhat.com"
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13010
+;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
+
+;; QUESTION SECTION:
+;redhat.com.			IN	AAAA
+
+;; AUTHORITY SECTION:
+redhat.com.		1037	IN	SOA	a1-68.akam.net. noc.redhat.com. 2022080000 300 180 604800 14400
+
+Received 82 bytes from 192.168.122.1#53 in 51 ms
+Trying "redhat.com"
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56767
+;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
+
+;; QUESTION SECTION:
+;redhat.com.			IN	MX
+
+;; ANSWER SECTION:
+redhat.com.		314	IN	MX	10 us-smtp-inbound-1.mimecast.com.
+redhat.com.		314	IN	MX	10 us-smtp-inbound-2.mimecast.com.
+
+Received 105 bytes from 192.168.122.1#53 in 50 ms
+
+

+ Kolejnym poleceniem jest nslookup. Polecenie to jest + interaktywne. Pozwala ono na zmianę serwera w bardzo prosty sposób, + ponieważ jego adres możemy podać jako argument polecenia lub już + po jego uruchomieniu po poleceniu server. +

+
+[user@server10 ~]$ nslookup
+> server 8.8.8.8 
+Default server: 8.8.8.8
+Address: 8.8.8.8#53
+> redhat.com
+Server:		8.8.8.8
+Address:	8.8.8.8#53
+
+Non-authoritative answer:
+Name:	redhat.com
+Address: 52.200.142.250
+Name:	redhat.com
+Address: 34.235.198.240
+> exit
+
+

+ W wyniku polecenia pojawił się taki zapis jak + Non-authoritative answer. Oznacza to, + że rozwiązanie nazwy otrzymano od serwera, który nie zarządza tą + domeną. Polecenie opuszczamy tylko za pomocą polecenia + exit. +

+

+ Ostatnim poleceniem jest getent. Polecenie to jest + związane z plikiem /etc/nsswitch.conf, dlatego aby uzyskać + za jego pomocą adres IP jednej z nazw należy podać jako + pierwszy argument bazę danych z jakiej będziemy korzystać. + Przypominam, że jest to hosts. Poniżej znajduje się przykład + użycia tego polecenia. +

+
+[user@server10 ~]$ getent hosts redhat.com
+34.235.198.240  redhat.com
+52.200.142.250  redhat.com
+
+

Ćwiczenie 1: Zmiana daty i czasu

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jak server10, wyświetl obecną datę i godzine za + pomocą obu poznanych narzędzi. Za pomocą polecenia timedatectl + zmień datę i godzine na dowolną w przyszłość. Za pomocą polecenia + date zwiększ godzinę o jedną naprzód. Ponownie wyświetl + datę i godzinę za pomocą obu narzędzi. Przyróć datę i godzinę do + rzeczywistych wartości. +

+

Ćwiczenie 2: Konfiguracja Chrony

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jak server10. Jeśli jest taka potrzeba + zainstaluj Chrony. W pliku konfiguracyjny wyłącz wszystkie + dyrektywy (ujmij w komentarz) pool oraz server. + Dodaj nową dyrektywę na server z adresem 127.127.1.0. + Włącz/zrestartuj usługę. Potwierdź wykonanie zadania za pomocą + wyświetlania źródeł Chrony - polecenie + chronyc sources. +

+

Podsumowanie

+

+ W tym rozdziale poznaliśmy sposóby na efektywną i automatyczną + synchronizację czasu zegara systemowego. Za poznaliśmy się z + najnowszą implementacją protokołu NTP jaką definitywnie jest + Chrony poznaliśmy jego konfigurację oraz polecenia służące + zarządzania nim. Poza tym poznaliśmy w jaki sposób uzyskiwane są adresy + IP w systemie, czym jest DNS, pliki + /etc/resolv.conf czy /etc/nsswitch.conf. Poznaliśmy + również kilka narzędzi, dzięki którym możemy przeprowadzić diagnostykę + rozwiązywania nazw na naszych systemach. W następnym rozdziale + zajmiemy się obsługą bezpiecznego zdalnego logowania do powłoki - + usługą SSH. +

+

19. Usługa bezpiecznej powłoki

+

+ Usługa bezpiecznej powłoki, jest w obecnych czasach jedną z + podstawowych + rzeczy bez których nie wyobrażamy sobie pracy z jakimi kolwiek + odległymi maszynami. SSH + pozwala na bezpieczne zarządzania maszynami oraz przesyłanie informacji + między nimi przez niezabezpieczone sieci takie jak internet. + SSH pozwala na uwierzytelnienie użytkownika na zdalnym + serwerze. Dba ona również o intergralność danych przesyłanych jej + kanałami. Ta usługa dostarcza do systemów Uniksowych wielu narzędzi, + które wyparły odpowiedniki korzystające ze zwykłych nieszyfrowanych + kanałów. +

+

19.1. Podstawy teoretyczne na temat SSH

+

+ W wielu Uniksach (w tym i dystrybucjach Linuksa) stosowana jest + darmowa oraz wolna implementacja protokołu SSH - + OpenSSH, jest ona odpowiednikiem własnościowej wersji. + Obecnie najczęściej stoswany jest protokół SSH w wersji 2. +

+

19.1.1. Kryptografia SSH

+

+ OpenSSH do zabezpiecznia transmisji danych wykorzystuje metody + kryptograficzne zwane algorytmami. + Są to serie + rownań matematycznych mających za zadanie jak najbardziej zamaskować + jawne dane aby nie mogły być one odczytane przez osoby nie znające + klucza, czyli hasła bądź pliku, który za pomocą + tych samych algorytmów pozwoli na odczytanie danych przeznaczonych dla + ich odbiorców. Wśród metod szyfrowania możemy wymienić: +

+
    +
  • Algorytmy symetryczne - w których do szyfrowania + i odszyfrowyania danych używa się tego samego klucza ustalanego + podczas pierwszego połączenia między stronami transmisji.
  • +
  • Algorytmów asymetrycznych - metody te są nazwane + również algorytmami klucza publicznego. Każdy z + hostów generuje klucz prywatny. Następnie na + podstawie tego klucza generowany jest klucz publiczny, który może być + jawnie przesyłany przez internet, ponieważ służy on do identyfikacji + użytkownika oraz szyfrowania danych. Hosty przesyłają sobie klucze + publiczne i rozpoczyna się wymiana danych znanych tylko im. Dane w + przypadku tego typu + algorytmów mogą być odczytane tylko za pomocą klucza prywatnego. + Algorytmy asymetryczne są wykorzystywane do zabezpieczania + transmisji oraz uwierzytelniania użytkowników.
  • +
+

+ OpenSSH wykorzystuje głównie algorytm RSA, + ponieważ może za jego pomocą szyfrować dane oraz uwierzytelniać + użytkownika. Do uwierzytleniania możemy wykorzystać takie algorytmy + jak DSA oraz ECDSA jednak służą one tylko temu + celowi. +

+

19.1.2. Metody uwierzytelniania OpenSSH

+

+ Aby użytkownik mógł pracować na zdalnym serwerze za pomocą + SSH musi się uwierzytelnić. Uwierzytelnienia możemy dokonać + na kilka różnych sposobów, a wsród nich możemy wyróżnić oparte na: +

+
    +
  • GSSAPI
  • +
  • Hoście
  • +
  • Kluczu publicznym
  • +
  • Haśle
  • +
  • metodzie Challenge-response
  • +
+

+ W tym materiale jednak skupimy się wyłącznie na domyślnej metodzie jaką + jest hasło oraz klucz publiczny. +

+

19.1.3. Oprogramowanie OpenSSH

+

+ W RHEL usługa SSH w implementacji OpenSSH + jest podzielona na trzy pakiety: openssh - + dostarczający niezbędne biblioteki oraz polecenie + ssh-keygen; openssh-client - + dostarczający takie polecenia jak: ssh, + scp czy sftp. Ostatnim pakietem jest + openssh-server dostarczający demona + sshd. +

+

+ Polecenie ssh zastępuje stare polecenia telnet czy + rlogin. Z poleceniem telnet możemy się jeszcze + kiedyś spotkać. Polecenia scp i sftp zastępują + kolejno rcp + oraz ftp. Mimo to ftp jest dalej stosowany, aby + umożliwić publiczny dostęp na przykład do repozytoriów oprogramowania. +

+

19.2. Serwer OpenSSH - sshd

+

+ Serwerem OpenSSH jest program sshd. Jego konfiguracja + znajduje się w pliku /etc/ssh/sshd_config. Poniżej znajduje + się jej fragment: +

+
+#Port 22
+#AddressFamily any
+#ListenAddress 0.0.0.0
+#ListenAddress ::
+#HostKey /etc/ssh/ssh_host_rsa_key
+#HostKey /etc/ssh/ssh_host_ecdsa_key
+#HostKey /etc/ssh/ssh_host_ed25519_key
+# Ciphers and keying
+#RekeyLimit default none
+# Logging
+#SyslogFacility AUTH
+#LogLevel INFO
+# Authentication:
+#LoginGraceTime 2m
+#PermitRootLogin prohibit-password
+#StrictModes yes
+#MaxAuthTries 6
+#MaxSessions 10
+#PubkeyAuthentication yes
+# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
+# but this is overridden so installations will only check .ssh/authorized_keys
+AuthorizedKeysFile	.ssh/authorized_keys
+...
+
+

+ Zwróćmy uwagę na to, że prawie wszystkie dyrektywy są ujęte w komentarz + po za jedną, która wskazuje gdzie należy złożyć wszystkie otrzymane + klucz publiczne w celach uwierzytelniania. Demon OpenSSH jest + domyślnie dostoswany do największej ilości przypadków jego użycia, + więc zmian w plikach konfiguracyjnych najczęściej dokonuje się w + specyficznych przypadkach. +

+

+ Nazwa jednostki w RHEL nosi nazwę sshd.service. + Każdą zmianę w tym pliku należy potwierdzić restartując demona. Opisy + tych dyrektyw znajdują się na stronie podręcznika. +

+

19.3. Konfiguracja klienta - ssh

+

+ Na każdej maszynie, na której znajduje się polecenie ssh + znajduje się także + plik konfiguracyjny /etc/ssh/ssh_config, który reguluje jego + zachowanie. Posiada on też kilka dyrektyw sugerujących pewne domyślne + ustawienia. Poniżej znajduje się jego fragment pobrany z jednej z + moich maszyn. +

+
+# Host *
+#   ForwardAgent no
+#   ForwardX11 no
+#   PasswordAuthentication yes
+#   HostbasedAuthentication no
+#   GSSAPIAuthentication no
+#   GSSAPIDelegateCredentials no
+#   GSSAPIKeyExchange no
+#   GSSAPITrustDNS no
+#   BatchMode no
+#   CheckHostIP yes
+#   AddressFamily any
+#   ConnectTimeout 0
+#   StrictHostKeyChecking ask
+#   IdentityFile ~/.ssh/id_rsa
+#   IdentityFile ~/.ssh/id_dsa
+#   IdentityFile ~/.ssh/id_ecdsa
+#   IdentityFile ~/.ssh/id_ed25519
+#   Port 22
+...
+
+

+ Konfiguracja klienta została ujęta w ten sam sposób jak w przypadku + serwera. Konfiguracja klienta również jest przygotowana do użycia we + większości przypadków, dlatego też zmiany w konfiguracją będą wymagane + tylko w specyficznych przypadkach. +

+

19.4. Obsługa połączeń zdalnych - programy OpenSSH

+

+ Na początku tego rozdziału wspomnieliśmy o ilości programów + dostarczanych wraz z pakietem OpenSSH. Teraz sobie je + przetestujemy. Ten podrozdział został również rozszerzony o jeden + program, który korzysta z SSH do przesyłania danych. +

+

19.4. Połączenie ze zdalnym serwerem z pomocą ssh

+

+ Połączenie ze zdalnym serwerem wymaga wydania pojedynczego polecenia, + w którym podajemy adres serwera, wówczas polecenie spróbuje zalogować + na użytkownika z tą samą nazwą z jakiej korzystamy w lokalnym systemie. +

+
+[user@server10 ~]$ ssh server20
+The authenticity of host 'server20 (192.168.122.7)' can't be established.
+ED25519 key fingerprint is SHA256:ZWgY+ro8oMwFh7vq56bS/Zk9CGpUe2sCrmxaukixr8M.
+This key is not known by any other names
+Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
+Warning: Permanently added 'server20' (ED25519) to the list of known hosts.
+user@server20's password: 
+Activate the web console with: systemctl enable --now cockpit.socket
+
+Register this system with Red Hat Insights: insights-client --register
+Create an account or view all your systems at https://red.ht/insights-dashboard
+Last login: Wed Aug  3 10:59:57 2022 from 192.168.122.6
+[user@server20 ~]$ 
+
+

+ Po wydaniu polecenia nastepuje połączenie. Klient nie może zweryfikować + autentyczności serwera przedstawiającego się podanym + odciskiem klucza. Tak dzieje się gdy łączymy się + z serwerem po raz pierwszy. Polecenie zapyta nas czy chcemy kontynuować + połączenie, wybierając Yes odcisk + klucza wraz z adresem serwera zostanie złożony w pliku + ~/.ssh/known_hosts. Następnie zostaniemy zapytani o hasło. + Po jego podaniu jesteśmy podłączeni do serwera. +

+

+ Chcąc podać innego użytkownika podczas połączenia SSH możemy + to zrobić na dwa sposób. Na przykład: +

+
+[user@server10 ~]$ ssh -l user server20
+#lub:
+[user@server10 ~]$ ssh user@server20
+
+

19.4.2. Generowanie, dystrybucja oraz logowanie się za pomocą klucza publicznego

+

+ Inną metodą uwierzytelniania stosowaną obok haseł jest uwierzytelnianie + za pomocą klucza publicznego. Ma ono klika zalet, otóż możemy logować + się bez podawania hasła, wówczas musimy pamiętać aby zabezpieczyć w + inny sposób plik klucza. Możemy również nadać jedno hasło - + hasło klucza i używać jednego hasła do wielu serwerów. + W tym materiale zajmiemy się wyłącznie kluczami bez haseł. +

+

+ Na początek zajmiemy się wygenerowaniem klucza. Dokonujemy tego za + pomocą polecenia ssh-keygen podając kolejno opcję + -N, przyczym należy pamiętać, że aby nadać puste + hasło należy podać puste podwójne apostrofy ("") jako + wartość tej opcji. Do generowania kluczy użyjemy także opcji + -q, która powoduje nie wyświetlanie komunikatów podczas + generowania klucza. +

+
+[user@server10 ~]$ ssh-keygen -N "" -q
+Enter file in which to save the key (/home/user/.ssh/id_rsa): 
+
+

+ Polecenie zapyta o ścieżkę oraz nazwę pliku klucza. Tę wartość + pozostawiam domyślnie. +

+

+ Następnym etapem będzie przesłanie oraz instalacja klucza na zdalnym + serwerze. Wykonamy tę czynność przy użyciu polecenia + ssh-copy-id, przyjmuje ono takie same argumenty jak + polecenie ssh, zatem aby zainstalować klucz na serwerze + należy wydać poniższe polecenie. Polecenie to w ramach potwierdzenia + naszej tożsamości zażąda hasła do połączenia się ze zdalnym + użytkownikiem na serwerze. +

+
+[user@server10 ~]$ ssh-copy-id user@server20
+/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_rsa.pub"
+/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
+/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
+user@server20's password: 
+
+Number of key(s) added: 1
+
+Now try logging into the machine, with:   "ssh 'user@server20'"
+and check to make sure that only the key(s) you wanted were added.
+
+

+ Teraz kiedy klucz jest zainstalowany możemy bez przeszkód logować się + na serwer. +

+
+[user@server10 ~]$ ssh user@server20
+Activate the web console with: systemctl enable --now cockpit.socket
+
+Register this system with Red Hat Insights: insights-client --register
+Create an account or view all your systems at https://red.ht/insights-dashboard
+Last login: Wed Aug  3 11:39:18 2022 from 192.168.122.6
+[user@server20 ~]$ 
+
+

19.4.3. Wykonywanie pojedyńczych poleceń na zdalnym serwerze

+

+ Za pomocą SSH możemy również wykonywać zdalnie pojedyncze + polecenia, jeśli nie potrzebujemy dla jednej informacji zestawiać + interaktywnej powłoki. Polecenie do wykonania na zdalnym serwerze + podajemy po adresie serwera. +

+
+[user@server10 ~]$ ssh user@server20 "whoami; hostname; pwd"
+user
+server20.example.com
+/home/user
+
+

+ Najlepiej, jeśli ujmiemy polecenie w podwójne apostrofy. Wówczas mamy + pewność, że zostanie ono w pełni przekazane do zdalnego systemu. +

+

19.4.4. Bezpieczne kopiowanie plików

+

+ Za pomocą polecenia scp, możemy kopiować pliki z + wykorzystaniem protokołu SSH w obu kierunkach. Tutaj dodatkową + rolę odgrywa zainstalowanie klucza bez hasła. Jeśli to zrobimy + wówczas będziemy mogli rozwiajać scieżki ze zdalnego systemu za pomocą + klawisza Tab. Na poniższym przykładzie skopiuje plik + /etc/chrony.conf do katalogu /tmp. +

+
+[user@server10 ~]$ scp server20:/etc/chrony.conf /tmp
+chrony.conf                                   100% 1369     1.5MB/s   00:00    
+[user@server10 ~]$ ls -l /tmp/chrony.conf 
+-rw-r--r--. 1 user user 1369 08-03 11:58 /tmp/chrony.conf
+
+

+ Za pomocą opcji -r jesteśmy w stanie skopiować do całe + katalogi. +

+
+[user@server10 ~]$ scp -r /home/user server20:/tmp/test/
+.bash_logout                                  100%   18    40.4KB/s   00:00    
+.bash_profile                                 100%  141   386.3KB/s   00:00    
+.bashrc                                       100%  492     1.2MB/s   00:00    
+.bash_history                                 100% 9742    17.0MB/s   00:00    
+.lesshst                                      100%   93   182.5KB/s   00:00    
+known_hosts                                   100%  822     1.6MB/s   00:00    
+known_hosts.old                               100%   90   154.6KB/s   00:00    
+id_rsa                                        100% 2610     6.2MB/s   00:00    
+id_rsa.pub                                    100%  579     1.4MB/s   00:00    
+gzip                                          100%   94KB  37.9MB/s   00:00    
+.viminfo                                      100%   10KB  13.7MB/s   00:00    
+
+[user@server10 ~]$ ssh user@server20 "ls -al /tmp/test/user"
+razem 136
+drwx------. 3 user user   139 08-03 12:00 .
+drwxrwxr-x. 3 user user    18 08-03 12:00 ..
+-rw-------. 1 user user  9742 08-03 12:00 .bash_history
+-rw-r--r--. 1 user user    18 08-03 12:00 .bash_logout
+-rw-r--r--. 1 user user   141 08-03 12:00 .bash_profile
+-rw-r--r--. 1 user user   492 08-03 12:00 .bashrc
+-rwxr-xr-x. 1 user user 95872 08-03 12:00 gzip
+-rw-------. 1 user user    93 08-03 12:00 .lesshst
+drwx------. 2 user user    80 08-03 12:00 .ssh
+-rw-------. 1 user user 10036 08-03 12:00 .viminfo
+
+

19.4.5. Przesyłanie plików za pomocą polecenia sftp

+

+ Polecenie sftp działa na takiej samej zasadzie co + polecenie ftp, jednak wykorzystuje do tego protokół + SSH przy tym rozszerzając oraz usprawniając działanie + przesyłania plików. +

+

+ Polecenie to przyjmuje takie same argumenty jak ssh. Przy + czym jest ono interaktywne, jak klasyczne ftp za + pomocą znaku zapytania (?) możemy wyświetlić listę + dostępnych poleceń. +

+
+[user@server10 ~]$ sftp user@server20
+Connected to server20.
+sftp> ?
+Available commands:
+bye                                Quit sftp
+cd path                            Change remote directory to 'path'
+chgrp [-h] grp path                Change group of file 'path' to 'grp'
+chmod [-h] mode path               Change permissions of file 'path' to 'mode'
+chown [-h] own path                Change owner of file 'path' to 'own'
+df [-hi] [path]                    Display statistics for current directory or
+                                   filesystem containing 'path'
+exit                               Quit sftp
+get [-afpR] remote [local]         Download file
+help                               Display this help text
+lcd path                           Change local directory to 'path'
+lls [ls-options [path]]            Display local directory listing
+lmkdir path                        Create local directory
+ln [-s] oldpath newpath            Link remote file (-s for symlink)
+lpwd                               Print local working directory
+ls [-1afhlnrSt] [path]             Display remote directory listing
+lumask umask                       Set local umask to 'umask'
+mkdir path                         Create remote directory
+progress                           Toggle display of progress meter
+put [-afpR] local [remote]         Upload file
+pwd                                Display remote working directory
+quit                               Quit sftp
+reget [-fpR] remote [local]        Resume download file
+rename oldpath newpath             Rename remote file
+reput [-fpR] local [remote]        Resume upload file
+rm path                            Delete remote file
+rmdir path                         Remove remote directory
+symlink oldpath newpath            Symlink remote file
+version                            Show SFTP version
+!command                           Execute 'command' in local shell
+!                                  Escape to local shell
+?                                  Synonym for help
+
+

+ Zwróćmy uwagę to, iż wiele poleceń występuję podwójnie, i są one + poprzedzonych + literą l. Aby lepiej zarządzać transferem plików posiadmy + polecenia, które odwołują się czynności wykonywanych na lokalnym + hoście, dzięki czemu nie musimy się rozłączać aby na przykład stworzyć + katalog + specjalnie na dane pobrane z serwera. Pobierzemy teraz plik + /etc/fstab do katalogu /tmp. +

+
+sftp> lcd /tmp
+sftp>  get /etc/fstab 
+Fetching /etc/fstab to fstab
+fstab                                        100%  608   709.3KB/s   00:00    
+
+

+ Za pomocą opcji -r takich poleceń get lub put + możemy pobierać oraz przesyłać całe sturktury katalogów: +

+
+sftp> cd /tmp/dir_user/
+sftp> put -r /tmp/user/.??*
+Uploading /tmp/user/.bash_history to /tmp/dir_user/.bash_history
+.bash_history                                100% 9742    13.7MB/s   00:00    
+Uploading /tmp/user/.bash_logout to /tmp/dir_user/.bash_logout
+.bash_logout                                 100%   18    54.6KB/s   00:00    
+Uploading /tmp/user/.bash_profile to /tmp/dir_user/.bash_profile
+.bash_profile                                100%  141   443.4KB/s   00:00    
+Uploading /tmp/user/.bashrc to /tmp/dir_user/.bashrc
+.bashrc                                      100%  492     1.7MB/s   00:00    
+Uploading /tmp/user/.lesshst to /tmp/dir_user/.lesshst
+.lesshst                                     100%   93   325.6KB/s   00:00    
+Uploading /tmp/user/.ssh/ to /tmp/dir_user/.ssh
+Entering /tmp/user/.ssh/
+known_hosts                                  100%  822     3.3MB/s   00:00    
+known_hosts.old                              100%   90   351.5KB/s   00:00    
+id_rsa                                       100% 2610     8.2MB/s   00:00    
+id_rsa.pub                                   100%  579     1.9MB/s   00:00    
+Uploading /tmp/user/.viminfo to /tmp/dir_user/.viminfo
+.viminfo                                     100%   10KB  23.3MB/s   00:00    
+
+

+ Jak możemy zauważyć na powyższym przykładzie w sftp możemy + używać nazw wieloznacznych. +

+

19.4.6. Synchronizacja danych ze zdalnym serwerem

+

+ Jednym z programów wykorzystujących protokół SSH jest + rsync, służy on do synchronizacji plików. Taka + synchronizacja polega na skopiowaniu wszelkich danych znajdujących + się na zdalnym serwerze do lokalnego katalogu lub odwrotnie i przy + następnych synchronizacjach będą kopiowane tylko te pliki, które + uległy zmianie. Na przykład skopiuje katalog domowy jednego z + użytkowników na zdalnym serwerze. +

+
+[user@server10 ~]$ rsync -avrPz server20:/home/user/.??* /tmp/user_server20/
+receiving incremental file list
+.bash_history
+          3,763 100%    3.59MB/s    0:00:00 (xfr#1, to-chk=7/8)
+.bash_logout
+             18 100%   17.58kB/s    0:00:00 (xfr#2, to-chk=6/8)
+.bash_profile
+            141 100%  137.70kB/s    0:00:00 (xfr#3, to-chk=5/8)
+.bashrc
+            492 100%  480.47kB/s    0:00:00 (xfr#4, to-chk=4/8)
+.lesshst
+             20 100%    9.77kB/s    0:00:00 (xfr#5, to-chk=3/8)
+.viminfo
+          2,263 100%    1.08MB/s    0:00:00 (xfr#6, to-chk=2/8)
+.ssh/
+.ssh/authorized_keys
+            579 100%  188.48kB/s    0:00:00 (xfr#7, to-chk=0/8)
+
+sent 165 bytes  received 3,064 bytes  2,152.67 bytes/sec
+total size is 7,276  speedup is 2.25
+
+

+ Aby taka synchronizacja miała sens potrzebne jest kilka opcji + takich jak -a, powodująca włączenie + trybu archiwalnego, przez co pliki zostaną skopiowane wraz ze + wszystkimi atrybutami; -v włączająca + wyświetlanie komunikatów diagnostycznych; + -r włączająca rekurencje, zostaną + skopiowane katalogi wraz z podkatalogami; + -P włączająca zwrócenie statystyk + postępu dla każdego przesyłanego pliku; + -z włączająca kompresje. +

+

+ Jeśli + jeszcze raz spróbujemy pobrać te plik. Nic tak nie zostanie przesłane, + ponieważ pliki nie uległy zmianie. +

+
+[user@server10 ~]$ rsync -avrPz server20:/home/user/.??* /tmp/user_server20/
+receiving incremental file list
+
+sent 21 bytes  received 228 bytes  498.00 bytes/sec
+total size is 7,276  speedup is 29.22
+
+

Ćwiczenie 1: Logowanie przez SSH z użyciem klucza

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynach + oznaczonych jako server10 oraz server20 utworz + nowego użytkownika user20 oraz przypisz mu hasło. Następnie + na server10, przełącz się na tego użytkownika oraz wygeneruj + klucze SSH bez hasła. Zainstaluj klucz na server20 + na koncie użytkowika user20 i spróbuj się na niego zalogować. +

+

Ćwiczenie 2: Działanie dyrektywy PermitRootLogin

+

+ Jako użytkownika z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server20. Ustaw wartość dyrektywy + PermitRootLogin serwera OpenSSH na no. + Następnie z poziomu server10 spróbuj się zalogować przez + SSH jako root. Następnie zmień wartość tej dyrektywy + na yes i spróbuj ponownie. +

+

Podsumowanie

+

+ W tym rodziale poruszyliśmy temat bezpieczengo zdalnego dostępu do + odległych maszyn. Jest on realizowany za pomocą protokołu + SSH, z którego teoretycznymi podstawami zapoznaliśmy się na + początku tego rozdziału. Poruszyliśmy także temat plików + konfiguracyjnych serwera jak i klienta SSH. Na koniec + dowiedzieliśmy się jak korzystać z poleceń dostarczanych wraz z + pakietem OpenSSH. W następnym rozdziale poznamy zaporę + sieciową w systemie RHEL 9. +

+

20. Zapora sieciowa w RHEL 9

+

+ Sieci komputerowe pozwalają na swobodną komunikację między komputerami, + co w pewnych przypadkach jest niewskazane, ponieważ nie zawsze pożądane + jest aby dowolny użytkownik internetu mógł połączyć się z naszym + komputerem i wysyłać lub pobierać z niego dane. Swobodę ruchu + kontrolują zapory sieciowe, które mogą być albo + fizycznymi urządzeniam wpiętymi w wyższe segmenty sieci lub + oprogramowaniem zainstalowanym na naszym komputerze czuwającym nad + ruchem sieciowym skierowanym do niego. +

+

+ Zapora sieciowa ma za zadanie monitorować oraz kontrolować ruch + sieciowy. Jest to realizowane przez przeglądanie nagłówków pakietów + przesyłanych przez sieć oraz analiza źródłowych adresów IP, + używanych protokołów czy portów. W tym materiale skupimy się tylko + i wyłącznie na oprogramowaniu firewall-a dostarczonym do + Red Hat Enterprise Linux 9. +

+

20.1. Teoria firewalld

+

+ Pakiet zapory sieciowej dostarczony do RHEL to + firewalld. Zapory dostępne w dystrybucjach + Linuks opierają swoją zasadę działania o dwa składniki: moduł jądra + netfilter oraz framework służący do klasyfikacji + oraz filtrowania pakietów - nftables. Dzięki czemu poza + zwykłymi zasadami (za pomocą zasad organizuje się + ruch wychodzący oraz przychodzący w systemie) możemy realizować + bardziej zaawansowane funkcje takie jak translacja adresów + (NAT) umożliwiająca połączenie sieci lokalnej z internetem czy + przekierowanie portów pozwalające na kontrolowaną komunikację między + użytkownikami internetu a serwerem wewnątrz sieci lokalnej. +

+

+ Firewalld pozwala na kontrolowanie ruchu sieciowego bez + wpływu na nawiązane już połączenia oraz bez potrzeby restartu żadnych + usług. Możemy dodawać, usuwać i modyfikować zasady za pomocą albo + specjalnego polecenia, albo za pomocą panelu sterowania RHEL, + dostępnym przez przeglądarkę, który jest możliwy włączenia za poprzez + aktywacje jednostki cockpit.service. +

+

+ Zasada działania firewalld opiera się na strefach co pozwala + na łatwiejsze oraz transparentne utrzymanie ruchu. + Strefa określa poziom zaufania połączeń + sieciowych oraz adresów źródłowych. W konfiguracji strefy znajdują się + przypisane do nich połączenia sieciowe, przy czym jedno połączenie + może być przypisane tylko do jednej strefy w tym samym czasie, ale + jedna strefa może mieć wiele + połączeń oraz zasady pozwalające na połączenia z + wybraną usługą czy portem. Strefy definiują także domyślne zachowanie + zapory. Kiedy pakiet trafia do zapory, sprawdza ona jego + adres źródłowy czy nie występuje w którejś ze stref, jeśli nie ma + przypasowania, ten sam pakiet konfrontowany jest podstawie innych + kryteriów z regułami zapisanymi w strefie przypisanej do interfejsu + sieciowego z którego ten pakiet przybył, jeśli dalej nie ma + przypasowania, wówczas jest ono szukane w domyślnej strefie. Brak + przypasowania na ostatnim etapie najczęściej oznacza, że pakiet + zostanie zablokowany przez zaporę. + W systemie możemy spotkać się z kilkoma predefiniowanym + strefami, wypisanymi na poniższej liście: +

+
    +
  • trusted - zezwól na wszystkie połączenia
  • +
  • internal - Ruch przychodzący jest odrzucany, poza + jawnie wskazanym. Ta strefa stosowana jest w sieciach wewnętrznych.
  • +
  • home - Ruch przychodzący jest odrzucany, poza + jawnie wskazanym. Ta strefa stosowana jest w sieciach domowych.
  • +
  • work - Ruch przychodzący jest odrzucany, poza + jawnie wskazanym. Ta strefa jest stoswana w miejscu pracy.
  • +
  • dmz - Ruch przychodzący jest odrzucany, poza + jawnie wskazanym. Ta strefa jest stosowana w strefie + zdemilitaryzowanej (nie ma ograniczeń w połączeniach miedzy + hostami w DMZ. Hosty są osiągalne z poziomu internetu, ale + nie mogą nawiązywać połączeń z innymi komputerami w sieci lokalnej + poza strefą).
  • +
  • external - Ruch przychodzą jest odrzucany, poza + jawnie wskazanym. W ruchu wychodzącym tej strefy dokonywana jest + translacja adresów IP (NAT).
  • +
  • public - Ruch przychodzący jest odrzucany, poza + jawnie wskazanym. Ta strefa jest stosowana w miejscah publicznych. + Każdy nowy interfejs jest przypisywany do tej strefy.
  • +
  • block - Ruch przychodzący jest odrzucany + ze specjalną wiadmością zwrotną protokołu ICMP.
  • +
  • drop - Ruch przychodzacy jest odrzucany bez żadnej + wiadomości zwrotnej.
  • +
+

+ Strefy na powyższej liście zostały uszeregowane od najbardzej zaufanej + do najmniej. Domyślną strefą stosowaną w RHEL jest + public. Ostatnie strefy są skierowane do środowisk o + podwyższonym poziomie zabezpieczeń. Nie ma ograniczeń w ruchu + wychodzącym w każdej ze stref. +

+

+ Strefy z poziomu systemu operacyjnego, to zwykłe pliki tekstowe + przechowywane w dwóch lokalizacjach. Pierwszą z nich jest katalog + /usr/lib/firewalld/zones, w którym to są przechowywane + systemowe pliki stref. Drugim katalogiem jest + /etc/firewalld/zones gdzie przchowywane są pliki stref + użytkowników. Jeśli zechcemy zmienić jeden z plików strefy np. + za pomocą polecenia, to automatycznie zostanie otworzona jego kopia + w katalogu /etc/firewalld/zones i to na niej zostaną + zatwierdzone nasze zmiany. Każda ze stref może zostać przez nas + zmieniona. Poniżej znajduje się lista dostępnych + stref systemowych: +

+
+[user@server10 ~]$ ls -l /usr/lib/firewalld/zones
+razem 40
+-rw-r--r--. 1 root root 312 2021-11-23  block.xml
+-rw-r--r--. 1 root root 306 2021-11-23  dmz.xml
+-rw-r--r--. 1 root root 304 2021-11-23  drop.xml
+-rw-r--r--. 1 root root 317 2021-11-23  external.xml
+-rw-r--r--. 1 root root 410 2021-11-23  home.xml
+-rw-r--r--. 1 root root 425 2021-11-23  internal.xml
+-rw-r--r--. 1 root root 729 2022-01-14  nm-shared.xml
+-rw-r--r--. 1 root root 356 2021-11-23  public.xml
+-rw-r--r--. 1 root root 175 2021-11-23  trusted.xml
+-rw-r--r--. 1 root root 352 2021-11-23  work.xml
+
+

+ Zawartość takiego pliku strefy prezentuje się w następujący sposób: +

+
+[user@server10 ~]$ cat /usr/lib/firewalld/zones/public.xml
+<?xml version="1.0" encoding="utf-8"?>
+<zone>
+  <short>Public</short>
+  <description>For use in public areas. You do not trust the other 
+computers on networks to not harm your computer. Only selected incoming 
+connections are accepted.</description>
+  <service name="ssh"/>
+  <service name="dhcpv6-client"/>
+  <service name="cockpit"/>
+  <forward/>
+</zone>
+
+

+ Każde z plików zawiera krótką nazwę, opis oraz deklaracje wskazujące + otwarcie ruchu dla wskazanych w dyrektywach + services usług. Usługi też w + firewalld mają swoje pliki, w których deklarowane są używane + przez nie porty oraz protokoły. Lista plików usług znajduje się w + katalogu /usr/lib/firewalld/services. Poniżej znajduje się + jej fragment. W przypadku usług panuje taka sama zasada jak w przypadku + stref. +

+
+[user@server10 ~]$ ls -l /usr/lib/firewalld/services/
+razem 728
+-rw-r--r--. 1 root root  399 2021-11-23  amanda-client.xml
+-rw-r--r--. 1 root root  427 2021-11-23  amanda-k5-client.xml
+-rw-r--r--. 1 root root  283 2021-11-23  amqps.xml
+-rw-r--r--. 1 root root  273 2021-11-23  amqp.xml
+-rw-r--r--. 1 root root  285 2021-11-23  apcupsd.xml
+-rw-r--r--. 1 root root  301 2021-11-23  audit.xml
+-rw-r--r--. 1 root root  320 2021-11-23  bacula-client.xml
+-rw-r--r--. 1 root root  346 2021-11-23  bacula.xml
+-rw-r--r--. 1 root root  429 2021-11-23  bb.xml
+-rw-r--r--. 1 root root  339 2021-11-23  bgp.xml
+-rw-r--r--. 1 root root  275 2021-11-23  bitcoin-rpc.xml
+-rw-r--r--. 1 root root  307 2021-11-23  bitcoin-testnet-rpc.xml
+-rw-r--r--. 1 root root  281 2021-11-23  bitcoin-testnet.xml
+-rw-r--r--. 1 root root  244 2021-11-23  bitcoin.xml
+-rw-r--r--. 1 root root  410 2021-11-23  bittorrent-lsd.xml
+-rw-r--r--. 1 root root  294 2021-11-23  ceph-mon.xml
+-rw-r--r--. 1 root root  329 2021-11-23  ceph.xml
+-rw-r--r--. 1 root root  168 2021-11-23  cfengine.xml
+
+

+ Poniżej znajduje się zawartość przykładowego pliku usługi: +

+
+[user@server10 ~]$ cat /usr/lib/firewalld/services/nfs.xml
+<?xml version="1.0" encoding="utf-8"?>
+<service>
+  <short>NFS4</short>
+  <description>The NFS4 protocol is used to share files via TCP 
+networking. You will need to have the NFS tools installed and properly 
+configure your NFS server for this option to be useful.</description>
+  <port protocol="tcp" port="2049"/>
+</service>
+
+

20.2. Zarządzanie ruchem sieciowym w firewalld

+

+ Do zarządzania ruchem sieciowym posłużymy się poleceniem + firewall-cmd. Wymagana ono uprawnień superużytkownika + aby móc coś zmienić w zaporze. To polecenie posiada dużą ilość różnych + opcji, jednak nie ma sensu ich tu przytaczać. Poznamy je w trakcie + wykonywania przykładów z tego podrozdziału. +

+

20.2.1. Sprawdzenie status zapory sieciowej

+

+ Sprawdzenia statusu zapory sieciowej możemy dokonać na dwa sposóby: + mozemy wydać polecenie firewall-cmd z odpowiednią opcją lub + sprawdzić status jednostki systemd firewalld.service. Poniżej + znajdują się wyniki działania obu tych poleceń: +

+
+[user@server10 ~]$ sudo systemctl status firewalld.service 
+[sudo] hasło użytkownika user: 
+● firewalld.service - firewalld - dynamic firewall daemon
+     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
+     Active: active (running) since Thu 2022-08-04 08:47:25 CEST; 2h 55min ago
+       Docs: man:firewalld(1)
+   Main PID: 720 (firewalld)
+      Tasks: 4 (limit: 5891)
+     Memory: 46.3M
+        CPU: 7.278s
+     CGroup: /system.slice/firewalld.service
+             └─720 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid
+
+sie 04 08:47:24 server10.example.com systemd[1]: Starting firewalld - dynamic firewall daemon...
+sie 04 08:47:25 server10.example.com systemd[1]: Started firewalld - dynamic firewall daemon.
+
+[user@server10 ~]$ sudo firewall-cmd --state
+running
+
+

20.2.2. Dodowanie usług, portów oraz zarządzanie strefami

+

+ Zanim jednak zaczniemy dodwać usługi i porty wyświetlimy sobie domyślną + strefę, a do tego posłuży opcja --get-default-zone polecenia + firewall-cmd: +

+
+[user@server10 ~]$ sudo firewall-cmd --get-default-zone 
+[sudo] hasło użytkownika user: 
+public
+
+

+ Aby zmiany dokonane w zaporze zostały na stałe, należy każdą zmianę + poprzedzić opcją --permanent. Usługi możemy dodwać + za pomocą opcji --add-service. Podczas zapisywania opcji + polecenia firewall-cmd możemy posłużyć się klawiszem Tab + w celu autouzupełnienia. W ramach przykładu dodałem usługę http + do domyślniej strefy. +

+
+[user@server10 ~]$ sudo firewall-cmd --permanent --add-service=http
+success
+
+

+ Aby ta reguła zadziałała firewalld musi ponownie wczytać plik + strefy, aby to wymusić wydajemy polecenie firewall-cmd wraz + opcją --reload. +

+
+[user@server10 ~]$ sudo firewall-cmd --reload
+[sudo] hasło użytkownika user: 
+success
+
+

+ Za pomocą opcji --list-services, możemy wyświetlić reguły + skonfigurowane do wskazanych usług: +

+
+[user@server10 ~]$ sudo firewall-cmd --list-services
+cockpit dhcpv6-client http ssh
+
+

+ Jak możemy zauważyć dodana usługa znajduje się na liście reguł. +

+

+ Dodawanie portów wygląda podobnie do dodawania usług jednak używa się + opcji --add-port=. Po podaniu portu należy również wskazać + po ukośniku (/) protokół TCP czy + UDP. Opcja ta pozwala również na podanie zakresu portów. + Za pomocą poniższego polecenia dodałem porty TCP od + 5901 do 5910, do strefy (--zone=) internal. +

+
+[user@server10 ~]$ sudo firewall-cmd --permanent --add-port=5901-5910/tcp --zone=internal
+[sudo] hasło użytkownika user: 
+success
+
+

+ Za pomocą opcji --list-ports, możemy wyswietlić zasady + skonfigurowane pod konkretne porty. Natomiast za pomocą opcji + --zone możemy zarządzać innymi strefami. +

+
+[user@server10 ~]$ sudo firewall-cmd --list-ports --zone=internal
+5901-5910/tcp
+
+

+ Za pomocą opcji --set-default-zone= możemy ustawić dowolną + strefę jako tę domyślną dla naszego systemu: +

+
+[user@server10 ~]$ sudo firewall-cmd --set-default-zone=internal
+[sudo] hasło użytkownika user: 
+success
+
+

20.2.3. Usuwanie portów oraz usług

+

+ Aby wycofać wcześniej wykonywane zmiany należy użyć opcji + --remove-service= lub --remove-port=. Usunę + na początku regułę odpowiedzialną za otworzenie zakresu portów z + poprzedniego przykładu. +

+
+[user@server10 ~]$ sudo firewall-cmd --permanent --remove-port=5901-5910/tcp 
+success
+[user@server10 ~]$ sudo firewall-cmd --reload 
+success
+[user@server10 ~]$ sudo firewall-cmd --list-ports
+
+

+ Opcja --remove-port również pozwala na podanie zakresu. + Również w tym przypadku wymagane jest podanie protokołu. +

+

+ Teraz usunę również usługę HTTP, którą dodałem na początku, + pamiętając o tym, że public to nie jest już moją domyślną + strefą. +

+
+[user@server10 ~]$ sudo firewall-cmd --permanent --remove-service=http --zone=public
+success
+[user@server10 ~]$ sudo firewall-cmd --reload 
+success
+[user@server10 ~]$ sudo firewall-cmd --list-services --zone=public
+cockpit dhcpv6-client ssh
+
+

+ Na koniec przywrócę moją domyślną strefę. +

+
+[user@server10 ~]$ sudo firewall-cmd --set-default-zone=public
+success
+[user@server10 ~]$ sudo firewall-cmd --get-default-zone 
+public
+
+

20.2.4. Efektywność zapory firewalld

+

+ W tym przykładzie sprawdzimy sobie w jaki sposób zapora działa w + praktyce. A przetestujemy to sobie usuwając regułę pozwalającą na + połączenie się przez SSH na jednej z maszyn. +

+

+ Czynności rozpoczynamy od ustalenia domyślnej strefy oraz czy występuje + w niej usługa SSH. +

+
+[user@server10 ~]$ sudo firewall-cmd --get-default-zone 
+public
+[user@server10 ~]$ sudo firewall-cmd --list-services 
+cockpit dhcpv6-client ssh
+
+

+ Jak widzimy reguła SSH znajduje się na liście usług. Za pomocą + opcji --remove-service= możemy usunąć tą regułę. +

+
+[user@server10 ~]$ sudo firewall-cmd --permanent --remove-service=ssh
+[sudo] hasło użytkownika user: 
+success
+[user@server10 ~]$ sudo firewall-cmd --reload
+success
+[user@server10 ~]$ sudo firewall-cmd --list-services 
+cockpit dhcpv6-client
+
+

+ Próba połączenia z tą maszyną z innej nie dochodzi do skutku. +

+
+[user@server20 ~]$ ssh server10
+ssh: connect to host server10 port 22: No route to host
+
+

+ Aby zakończyć to ćwiczenie, ten przykład, dodajmy z powrotem regułę + SSH do domyślnej strefy i spróbujmy się połączyć ponownie. +

+
+[user@server10 ~]$ sudo firewall-cmd --permanent --add-service=ssh
+success
+[user@server10 ~]$ sudo firewall-cmd --reload
+success
+[user@server10 ~]$ sudo firewall-cmd --list-services 
+cockpit dhcpv6-client ssh
+
+

+ Tym razem próba kończy się powodzeniem. +

+
+[user@server20 ~]$ ssh server10
+user@server10's password: 
+Activate the web console with: systemctl enable --now cockpit.socket
+
+Register this system with Red Hat Insights: insights-client --register
+Create an account or view all your systems at https://red.ht/insights-dashboard
+Last login: Thu Aug  4 09:03:57 2022 from 192.168.122.7
+[user@server10 ~]$ 
+
+

Ćwiczenie 1: Dodawanie usługi do zapory

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server10, dodaj na stałe regułę dla + usługi HTTPS i aktywuj ją (--reload). Potwierdź + wykonanie zadania wyświetlając plik strefy oraz za pomocą odpowiedniej + opcji polecenia firewall-cmd. +

+

Ćwiczenie 2: Dodawanie zakresu portów do zapory

+

+ Jako użytkownik z możliwością podniesienia uprawnień, na maszynie + oznaczonej jako server10, dodaj zakres portów 8000-8005 + UDP do strefy trusted i aktywuj go + (--reload). Potwierdź + wykonanie zadania wyświetlając plik strefy oraz za pomocą odpowiedniej + opcji polecenia firewall-cmd. +

+

Podsumowanie

+

+ W tym rodziale poruszyliśmy temat zapory sieciowej. Dowiedzieliśmy się + jak ona działa oraz co realizuje jej funkcję w RHEL 9. + Poznaliśmy podstawy teoretyczne oprogramowania firewalld oraz + poznaliśmy najczęściej stosowane polecenia za pomocą pokazanych w tym + rozdziale przykładów. W następnym rozdziale zapoznamy się mechanizmem + SELinux. +

+

21. Security Enchanced Linux

+

+ Security Enchanced Linux (SELinux) decyduje o tym co + kto może zrobić w systemie. Ten mechanizm tworzy kolejną warstwę + bezpieczeństwa ponad klasycznymi zabezpieczeniami jakie + poznaliśmy do tej pory. Podstawowym celem SELinux jest + możliwe jak największe zmniejszenie wpływu na system w momencie + wystąpienia w nim nieuprawnionego dostępu. +

+

21. Podstawy teoretyczne SELinux

+

+ SELinux jest implementacją mechanizmu MAC + (Mandatory Access Control), który jest zintegrowany z jądrem + Linuksa. MAC ogranicza możliwości dostępu + podmiotu (użytkownik lub proces) do + obiektu (pliki, katalogi, systemu plików, urządzenia, + połączenia/interfejsy sieciowe, porty, potoki oraz gniazda). Dlatego + też w przypadku wykorzystania podatności na przykład na serwerze WWW, + atakujący będzie mieć wpływ tylko na pliki, do których miał dostęp ten + proces. +

+

+ Do zapewnienia kontroli, mechanizm MAC wykorzystuje zbiory + zasad autoryzacyjnych zwanych polityką do sprawdzenia + atrybutów podmiotu kiedy stara się on o dostęp do obiektu i decyduje + czy udzielić tego dostępu. Atrybutu są zapisane w postaci + kontekstu (lub etykiet) i dotyczą + zarówno podmiotów jak i obiektów. Decyzje dokonane przez + SELinux są zapisywane w specjalnym rodzaju pamięci podręcznej + nazwanej AVC (Access Vector Control). W + momencie gdy dochodzić do decyzji SELinux sprawdza tę pamięć + podręczną czy nie udzielał już temu podmiotowi dostępu do tego obiektu. + Jeśli tak obecną decyzje bazuje na tej podjętej wcześniej przez co nie + musi on rozważać wszystkich możliwych zasad polityki wobec tej próby + dostępu. +

+

21.1.1. Pojęcia związane z SELinux

+

+ Aby obeznać się chociaż w podstawowym stopniu z SELinux + należy poznać kilka pojęć, które będą używane podczas przedstawiania + teorii tego mechanizmu ale również przykładów oraz ćwiczeń. +

+
    +
  • Podmiot - każdy proces oraz użytkownik, który jest + w stanie uzyskać dostęp do obiektu. Na przykład + system_u - użytkownik systemu SELinux czy + unconfined_u stosowany dla podmiotów, które nie są + związane z polityką SELinux. Podmiot SELinux + znajduje się w pierwszym polu kontekstu.
  • +
  • Objekt - zasób systemowy, od plików po gniazda. + Obiekty mogą zostać przestawione jako object_r - + obiekt ogólny, system_r - obiekt systemowy albo + unconfined_r - obiekt niezwiązny z SELinux. +
  • +
  • Dostęp - akcja dokonywana przez podmiot na + obiekcie. W ramach dostępu możemy wyróżnić tworzenie, odczyt, + modyfikację pliku, wyświetlenie zawartości katalogu czy próba + dostępu do portu albo gniazda.
  • +
  • Polityka - Zbiór zasad mający wpływ na cały + system. Polityka jest wykorzystywana do analizy atrybutów podmiotów + oraz + obiektów. Na podstawie polityki SELinux dokonuje decyzji + czy pozwolić podmiotowi na dostęp lub interakcje z obiektem. Jeśli + brakuje pasującej zasady, wówczas domyślną decyzją jest odmowa. + SELinux dostarczany jest wraz z dwoma standardowymi + preconfigurowanymi politykami targeted oraz + MLS, gdzie targeted wskazuje, że każdy + ukierunkowany proces uruchamiany jest w ograniczonej + domenie oraz każdy nieukierunkowany proces + uruchomiony jest w nieograniczonej domenie. Na przykład + SELinux umieszcza zalogowanego użytkownika w + nieograniczonej domenie, a proces serwera WWW domyślnie w domenie + ograniczonej. Każdy podmiot działający w domenie nieograniczonej + jest większym żagrożniem niż ten, który działa w domenie ograniczonej. +
  • +
  • Kontekst - lub etykieta, jest to znacznik + przechowywujący atrybuty. Każdy element w ujęciu SELinux + posiada przypisany kontekst, który składa się z użytkownika + SELinux, roli, domeny (czy też typu) oraz poziomu. + SELinux, korzysta z konktekstu podczas podejmowania decyzji + o przydzieleniu dostępu. +
  • +
  • Etykietowanie - mapowanie plików wraz z + kontekstem.
  • +
  • Użytkownik SELinux - predefiniowany w polityce + użytkownik SELinux autoryzowany do określonego zbioru reguł. + W polityce znajdują się mapowania użytkowników systemu na + użytkowników SELinux, aby ograniczać ich możliwości. + Użytkownik określa jakie role oraz domeny lub typy mogą zostać + przypisane + do procesu lub pliku . Jeśli użytkownik systemu będzie mieć + przypisanego + użytkownika user_u, nie będzie mógł wówczas + uruchomić żadnego programu znajdującego się w swoim katalogu domowym + oraz korzystać z takich poleceń jak su czy sudo. +
  • +
  • Rola - określa czy podmiot ma możliwość dostępu + do domeny. Użytkownicy SELinux są autoryzowani do ról, + natomiast role do domen oraz typów. Każdy podmiot ma określoną role + aby + odseparować procesy systemowe od procesów użytkowników. Podmioty + mogą zmienić swoje role, aby zwiększyć dostęp do innych domen. + Przykładowymi rola są: user_r - dla zwykłych + użytkowników, sysadm_r - dla administratorów oraz + system_r, dla procesów zaincjowanych pod tą rola. + Rola zajmuje drugie pole kontekstu. +
  • +
  • Typ egzekwowania - identyfikuje oraz ogranicza + możliwość dostępu procesów do domen oraz plików do typów. Odwołuje + się do kontekstu podmiotów oraz obiektów. +
  • +
  • Typ - grupa obiektów bazująca na jednolitości + wymagań bezpieczeństwa. Pliki oraz katalogi na podstawie wspólnych + wymagań zabezpieczeń mogą zostać zgrupowane w jeden typ. Na przykład + user_home_t dla obiektów znajdujących się w + katalogach domowych użytkowników, czy usr_t dla + większości obiektów znajdujących się w katalogach + /usr. +
  • +
  • Domena - określa dostęp jaki posiada proces. + Procesy ze wspólnymi wymogami bezpieczeństwa mogą zostać zgrupowane + do jednej określonej domeny, przez co ich działania mogą zostać w + niej ograniczone. Dla przykładu proces systemd działa w + domenie unit_t a firewalld w + firewalld_t. Typ lub domena znajdują się na trzecim + polu kontekstu. +
  • +
  • Poziom bezpieczeństwa - poziom bezpieczńswa może + być ujęty w dwóch rodzajach MLS + (Multi-Level Security) lub MCS + (Multi-Category Security). Poziom ten składa się z dwóch + czynników: wrażliwości oraz kategorii + Kategorie mogą być definiowane za pomocą pojedynczych wartości lub + zakresów np. c0.c4 co oznacza kategorie od c0 + do c4. Od RHEL 8 w polityce ukierunkowanej wymusza + użycie rodzaju MCS, który określa tylko jeden poziom + wrażliwości jakim jest s0 oraz 1024 kategorie od + 0 do 1023. +
  • +
+

21.1.2. Kontekst SELinux użytkowników

+

+ Za pomocą opcji -Z polecenie id możemy + poznać kontekst SELinux użytkowników. +

+
+[user@server10 ~]$ id -Z
+unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
+
+

+ W polu użytkownika SELinux jego nazwa to + unconfined_u co oznacza, że ma + nieograniczone możliwości. Superużytkownik również przypisanego ma + tego samego użytkownika. Pomimo tego SELinux dostarcza + siedemiu swoich użytkowników ograniczających wpływ + zwykłych użytkowników na system. Aby wyświetlić ich nazwy musimy + zainstalować pakiet setools-console. +

+
+[user@server10 ~]$ sudo seinfo -u
+[sudo] hasło użytkownika user: 
+
+Users: 8
+   guest_u
+   root
+   staff_u
+   sysadm_u
+   system_u
+   unconfined_u
+   user_u
+   xguest_u
+
+

+ Jak możemy zauwazyć unconfined_u + również jest jednym z użytkowników SELinux dla tego też mówimy + o siedmiu. Przypisanie go użytkownikom systemu wynika + z mapowania w polityce, a te możemy podejrzeć za pomocą polecenia + semanage wraz z pod poleceniem login oraz + opcją -l. +

+
+[user@server10 ~]$ sudo semanage login -l
+
+Login                Użytkownik SELinuksa Zakres MLS/MCS       Usługa
+
+__default__          unconfined_u         s0-s0:c0.c1023       *
+root                 unconfined_u         s0-s0:c0.c1023       *
+
+

+ W pierwszej kolumnie Login znajdują + się nazwy użytkowników systemowych. Wartość + _default_ tyczy się wszystkich + zwykłych użytkowników. +

+

21.1.3. Kontekst procesów

+

+ Za pomocą opcji -Z znanego już polecenia ps, + możemy wyświetlić kontekst SELinux procesów. Ponizej + znajduje się przykład: +

+
+[user@server10 ~]$ ps -eZ
+LABEL                               PID TTY          TIME CMD
+system_u:system_r:init_t:s0           1 ?        00:00:01 systemd
+...
+
+

+ W polu LABEL znajduje się kontekst + SELinux. Podmiotem w tym przypadku jest użytkownik + SELinux system_u + (mapowany do superużytkownika), rolą, rola systemowa - + system_r z typem ochrony nałożonym + przez domenę init_t i poziomem + bepzieczeństwa wskazywanym przez s0. +

+

+ Każdy niechroniony proces działa w domenie + unconfined_t. +

+

21.1.4. Kontekst SELinux plików

+

+ Pliki oraz katalogi to obiekty SELinux one również posiadają + kontekst, który może zostać wyświetlony za pomocą opcji + -Z polecenia ls. Poniżej znajdują się + atrybuty oraz kontekst dla pliku /etc/passwd. +

+
+[user@server10 ~]$ ls -lZ /etc/passwd
+-rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1764 08-03 08:46 /etc/passwd
+
+

+ Ten plik posiada rolę przeznaczoną dla zwykłych obiektów + (object_r) oraz typ o nazwie + passwd_file_t. Kontekst wszystkich + plików w systemie składowany jest dwóch plikach file_context + oraz file_context.local w katalogu + /etc/selinux/targeted/context/files. Kontekst może zostać + zmieniony za pomocą polecenia semanage. +

+

21.1.5. Zachowanie kontekstu SELinux podczas zarządzania plikami

+

+ Domyślnie kopiując pliki z jednego katalogu do drugiego kontekst + SELinux, zostanie odziedziczony z katalogu nadrzędnego, + taka sama zasada tyczy się nadpisywania plików, wówczas plik źródłowy + otrzyma kontekst SELinux od pliku, który został nadpisany. + Aby zachować kontekst SELinux należy użyć opcji + --preserve wraz z wartością context. +

+

+ Przenoszenie nie ma wpływu na kontekst SELinux. Kontekst + pozostaje w nienaruszonym stanie. +

+

+ Jeśli istnieje potrzeba aby zachować kontekst SELinux w + archiwach tar to należy użyć opcji --selinux. +

+

+ Przetestujemy sobie część tych przypadków podczas przykładów. +

+

21.1.6. Kontekst SELinux portów sieciowych

+

+ SELinux definiuje atrybuty bezpieczeństwa dla każdego rozdzaju + obiektu w tym i dla portów. Typy (w ujęciu SELinux) dla + portów możemy podejrzeć za pomocą polecenia semanage + wraz z podpoleceniem port oraz opcją -l. +

+
+[user@rhel90 ~]$ sudo semanage port -l
+Typ portu SELinuksa            Protokół Numer portu
+ftp_data_port_t                tcp      20
+ftp_port_t                     tcp      21, 989, 990
+ftp_port_t                     udp      989, 990
+http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
+ssh_port_t                     tcp      22
+
+

+ Wyjście prezentowane jest kolumnach, w przypadku portów spotykamy się + z typem, tak jak w przypadku plików. Domyślnie SELinux + pozwala na nasłuchiwanie usługom tylko na określonych przez typy + portach. +

+

21.1.7. Zmiana domeny SELinux

+

+ SELinux pozwala procesom na zmianę domeny, aby mogły uruchomić + aplikację, która może działać tylko w jednej określonej domenie. Tego + typu zachowanie jest oczywiście poparte regułami w polityce, które + wspierają tego typu działania. Zmiana domeny możliwa jest za pomocą + uprawnienia entrypoint, które kontroluje taką + możliwość. Najprostszym tego przykładem jest zmiana hasła. +

+

+ SELinux w swojej polityce posiada zasady, dzięki którym + proces działający w domenie passwd_t może + modyfikować plik z typem shadow_t. W tej polityce + istnieje także uprawnienie entrypoint w domenie + passwd_exec_t. Dzięki czemu polecenie + passwd może modyfikować plik /etc/shadow, gdzie + tak naprawdę nikt nie ma żadnych klasycznych uprawnień. Poniżej + znajdują się atrybut wraz kontekstem zarówno polecenia passwd + oraz pliku /etc/shadow. +

+
+[user@server10 ~]$ ls -lZ /usr/bin/passwd 
+-rwsr-xr-x. 1 root root system_u:object_r:passwd_exec_t:s0 32648 2021-08-10  /usr/bin/passwd
+[user@server10 ~]$ ls -lZ /etc/shadow
+----------. 1 root root system_u:object_r:shadow_t:s0 1368 08-03 08:47 /etc/shadow
+
+

21.1.8. Wartości logiczne SELinux

+

+ Wartości logiczne SELinux są używane jako przełączniki + włączające lub wyłączające pozwolenie na wykonanie pewnej akcji. + W ujęciu polityki przełączają one zasady bez potrzeby ich pownownego + wczytywania. Za pomocą tych wartości możemy pozwolić aby anonimowi + użytkownicy FTP mogli zapisywać na serwerze dane. Wszyskie + te wartości są złożone w katalogu /sys/fs/selinux/booleans. + Poniżej znajduje się fragment listingu tego katalogu, w systemie takim + jak RHEL znajduje się wiele tych wartości +

+
+[user@server10 ~]$ ls -l /sys/fs/selinux/booleans/ | head 
+razem 0
+-rw-r--r--. 1 root root 0 08-06 09:07 abrt_anon_write
+-rw-r--r--. 1 root root 0 08-06 09:07 abrt_handle_event
+-rw-r--r--. 1 root root 0 08-06 09:07 abrt_upload_watch_anon_write
+-rw-r--r--. 1 root root 0 08-06 09:07 antivirus_can_scan_system
+-rw-r--r--. 1 root root 0 08-06 09:07 antivirus_use_jit
+-rw-r--r--. 1 root root 0 08-06 09:07 auditadm_exec_content
+-rw-r--r--. 1 root root 0 08-06 09:07 authlogin_nsswitch_use_ldap
+-rw-r--r--. 1 root root 0 08-06 09:07 authlogin_radius
+-rw-r--r--. 1 root root 0 08-06 09:07 authlogin_yubikey
+...
+
+

+ Nazwa kazdego pliku odpowiada nazwie wartości używanej do zmiany jej + stanu. + Jeśli na podstawie nazwy nie możemy wywnioskować do czego służy podana + wartość, to możemy zainstalować pakiet selinux-policy-doc i + wyszukać odpowiednią stronę podręcznika podając nazwę wartości + poleceniu man po opcji -K. +

+

+ Możemy przeglądać wartości logiczne i zmieniać ich stan tymczasowo co + nię będzie miało wpływu na politykę lub na stałe, wówczas te będzie + musiało mieć już swoje odzwierciedlenie w polityce. +

+

21.2. Zarządzanie SELinux

+

+ Zarządzanie SELinux to wiele zadań obejmujących aktywację + mechanizmu, zmianę jego stanu operacyjnego, aktualizacje kontekstu + zarówno podmiotów jak i obiektów oraz przełączanie wartości logicznych. + W tym celu w RHEL znajduje się wiele narzędzi, które możemy + wykorzystać do tego celu. +

+

21.2.1. Polecenia zarządzające

+

+ RHEL dostarcza wiele poleceń, dzięki którym możemy realizować + nasze zadania związane z SELinux. Wiele z nich odpowiada za + konkretne czynności, jednak jedno semanage pozwala na + zrealizowanie tych zadań dobierając odpowiednie podpolecenie. + Innym poleceniem, na które należy zwrócić uwagę jest + chcon, które pozwala na zmianę contekstu obiektu oraz + restorcon, które przywraca kontekst z bazy (plików + wymienionych w poprzednim podrozdziale, podczas omawiania kontektu + plików). Poniżej znajdują się przykłady, dzięki którym poznamy + jak należy zarządzać SELinux w praktyce oraz niezbędne do tego + polecenia. +

+

21.2.2. Zmiana stanu operacyjnego SELinux

+

+ Stan operacyjny tego mechanizmu możemy zmienić, zmieniając wartość + jednej z dyrektyw w pliku konfigracyjny SELinux. W tym pliku + możemy również wyłączyć ten mechanizm. Na poniższym przykładzie + znajduje się jego zawartość: +

+
+[user@server10 ~]$ cat /etc/selinux/config 
+
+# This file controls the state of SELinux on the system.
+# SELINUX= can take one of these three values:
+#     enforcing - SELinux security policy is enforced.
+#     permissive - SELinux prints warnings instead of enforcing.
+#     disabled - No SELinux policy is loaded.
+# See also:
+# https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-selinux/
+#getting-started-with-selinux-selinux-states-and-modes
+#
+# NOTE: In earlier Fedora kernel builds, SELINUX=disabled would also
+# fully disable SELinux during boot. If you need a system with SELinux
+# fully disabled instead of SELinux running with no policy loaded, you
+# need to pass selinux=0 to the kernel command line. You can use grubby
+# to persistently set the bootloader to boot with selinux=0:
+#
+#    grubby --update-kernel ALL --args selinux=0
+#
+# To revert back to SELinux enabled:
+#
+#    grubby --update-kernel ALL --remove-args selinux
+#
+SELINUX=enforcing
+# SELINUXTYPE= can take one of these three values:
+#     targeted - Targeted processes are protected,
+#     minimum - Modification of targeted policy. Only selected processes are protected.
+#     mls - Multi Level Security protection.
+SELINUXTYPE=targeted
+
+

+ Zachowanie SELinux możemy kontrolować za pomocą dyrektywy + SELINUX. Dyrektwa może przyjmować + takie wartości jak: +

+
    +
  • enforcing - wymuszając tym samym stosowanie + polityki względem podmiotów.
  • +
  • permissive - w tym przypadku SELinux + nie będzie wymuszać stosowania polityki, ale jej naruszenia będą + rejestrowane.
  • +
  • disabled - wyłączenie ładowania polityki, co + powoduje, że działanie SELinux nie będzie mieć wpływu na + system.
  • +
+

+ Inna wartością kontrolujcą ten mechanizm jest dyrektywa + SELINUXTYPE wymuszająca typ polityki. + Domyślnie stosowaną jest polityka ukierunkowana + (targeted). Pozostałe wartości + znajdują się w komentarzu nad dyrektywą. +

+

+ Do uzyskania informacji na temat działania SELinux możemy + skorzystać z polecenia getenforce. +

+
+[user@server10 ~]$ sudo getenforce
+[sudo] hasło użytkownika user: 
+Enforcing
+
+

+ Tymczasem do chwilowej zmiany stanu tego mechanizmu możemy użyć + polecenia setenforce. +

+
+[user@server10 ~]$ sudo setenforce
+usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
+[user@server10 ~]$ sudo setenforce 0
+[user@server10 ~]$ sudo getenforce
+Permissive
+
+

+ Przy czym do wyboru mamy tylko Enforcing + (1) lub + Permissive + (0). +

+

+ Aby jednak na stałe zmienić stan operacyjny SELinux musimy + zmienić to pliku konfiguracyjnym a następnie uruchomić ponownie + system. +

+

+ Odnośnie egzaminu
+ Jeśli zajdzie taka potrzeba możemy przełączać się między stanami + operacyjnymi, aby na przykład rozwiązać problem z usługą. + Po rozwiązaniu problemów, możemy powrócić do normalnego stanu. +

+

21.2.3. Sprawdzanie stanu SELinux

+

+ Z pomocą polecenia sestats, mozemy sprawdzić stan + mechanizmu SELinux oraz wyświetlić kilka dodatkowych + informacji na jego temat. +

+
+[user@server10 ~]$ sestatus
+SELinux status:                 enabled
+SELinuxfs mount:                /sys/fs/selinux
+SELinux root directory:         /etc/selinux
+Loaded policy name:             targeted
+Current mode:                   enforcing
+Mode from config file:          enforcing
+Policy MLS status:              enabled
+Policy deny_unknown status:     allowed
+Memory protection checking:     actual (secure)
+Max kernel policy version:      33
+
+

+ Z informacji zwracanych przez to polecenie możemy wywnioskować w jakim + trybie działa SELinux + (Current mode:) oraz rodzaj używanej + polityki (Loaded policy name:). +

+

+ Używając opcji -v możemy wyświetlić kontekst, niektórych + plików oraz procesów. Są one zapisane w pliku /etc/sestatus.conf. +

+

21.2.4. Modyfikowanie kontekstu SELinux plików

+

+ Do modyfikowania kontekstu słuzy polecenie chcon. + Chcąc zmienić użytkownika SELinux używamy opcji + -u, do zmiany typu wykorzystujemy opcję -t. Jeśli + zmiany mają być rekurencyjne wówczas należy uzyć opcji -R. + Na poniższym przykładzie zobrazowałem to zmieniając kontekst + katalogu /tmp/testsedir1 w którym znajdował się plik + testsefile2. +

+
+[user@server10 ~]$ ls -ldZ /tmp/testsedir1/
+drwxr-xr-x. 2 user user unconfined_u:object_r:user_tmp_t:s0 25 08-06 12:34 /tmp/testsedir1/
+[user@server10 ~]$ ls -lZ /tmp/testsedir1/testsefile2 
+-rw-r--r--. 1 user user unconfined_u:object_r:user_tmp_t:s0 0 08-06 12:34 /tmp/testsedir1/testsefile2
+
+[user@server10 ~]$ sudo chcon -v -u user_u -t public_content_t /tmp/testsedir1 -R
+[sudo] hasło użytkownika user: 
+zmiana kontekstu bezpieczeństwa '/tmp/testsedir1/testsefile2'
+zmiana kontekstu bezpieczeństwa '/tmp/testsedir1'
+
+[user@server10 ~]$ ls -ldZ /tmp/testsedir1/
+drwxr-xr-x. 2 user user user_u:object_r:public_content_t:s0 25 08-06 12:34 /tmp/testsedir1/
+[user@server10 ~]$ ls -lZ /tmp/testsedir1/testsefile2 
+-rw-r--r--. 1 user user user_u:object_r:public_content_t:s0 0 08-06 12:34 /tmp/testsedir1/testsefile2
+
+

+ Jak możemy zauważyć na powyższym przykładzie zmieniliśmy typ oraz + użytkownika SELinux. +

+

21.2.5. Dodwanie oraz zatwierdzanie kontekstu plików SELinux

+

+ Aby zatwierdzić zmieniony kontekst plików należy dodać go do bazy + kontekstów. Do tego posłużymy się poleceniem semanage + wraz z podpoleceniem fcontext, za pomocą opcji -a + wskazujemy akcje dodania nowego kontekstu, opcja -s wskazuje + na użytkownika SELinux, opcja -t wskazuje na typ + w tym przypadku. Na końcu podajemy ścieżkę do pliku lub katalogu. + Jeśli zmiany mają obejmować katalog wraz z jego zawartością to wówczas + należy użyć wyrażenia regularnego: (/.*)? w ścieżce + katalogu. Teraz dodam zmiany z wcześniejszego podrozdziału do bazy. +

+
+[user@server10 ~]$ sudo semanage fcontext -a -s user_u -t public_content_t '/tmp/testsedir1(/.*)?'
+[sudo] hasło użytkownika user: 
+
+[user@server10 ~]$ sudo semanage fcontext -Cl
+fcontext SELinuksa       typ                Kontekst
+
+/tmp/testsedir1(/.*)?    all files          user_u:object_r:public_content_t:s0 
+
+

+ Za pomocą opcji -Cl wyświetliłem ostatnie zmiany w bazie + kontekstów plików SELinux. Teraz jeśli zmienimy kontekst + tego katalogu lub któregoś z zawartych w nim plików to będziemy mogli + powrócić do poprzedniego stanu za pomocą + polecenia restorecon bazując na wpisie w bazie + danych, który dodaliśmy we wcześniejszym przykładzie. Aby to + za prezentować zmienię teraz kontekst zarówno katalogu jak i jego + zawartości. +

+
+[user@server10 ~]$ ls -ldZ /tmp/testsedir1/
+drwxr-xr-x. 2 user user user_u:object_r:public_content_t:s0 25 08-06 12:34 /tmp/testsedir1/
+[user@server10 ~]$ ls -lZ /tmp/testsedir1/testsefile2 
+-rw-r--r--. 1 user user user_u:object_r:public_content_t:s0 0 08-06 12:34 /tmp/testsedir1/testsefile2
+
+[user@server10 ~]$ sudo chcon -v -u user_u -t usr_t /tmp/testsedir1 -R
+zmiana kontekstu bezpieczeństwa '/tmp/testsedir1/testsefile2'
+zmiana kontekstu bezpieczeństwa '/tmp/testsedir1'
+
+[user@server10 ~]$ ls -ldZ /tmp/testsedir1/
+drwxr-xr-x. 2 user user user_u:object_r:usr_t:s0 25 08-06 12:34 /tmp/testsedir1/
+[user@server10 ~]$ ls -lZ /tmp/testsedir1/testsefile2 
+-rw-r--r--. 1 user user user_u:object_r:usr_t:s0 0 08-06 12:34 /tmp/testsedir1/testsefile2
+
+[user@server10 ~]$ sudo restorecon -Rv /tmp/testsedir1/
+Relabeled /tmp/testsedir1 from user_u:object_r:usr_t:s0 to user_u:object_r:public_content_t:s0
+Relabeled /tmp/testsedir1/testsefile2 from user_u:object_r:usr_t:s0 to user_u:object_r:public_content_t:s0
+
+[user@server10 ~]$ ls -ldZ /tmp/testsedir1/
+drwxr-xr-x. 2 user user user_u:object_r:public_content_t:s0 25 08-06 12:34 /tmp/testsedir1/
+[user@server10 ~]$ ls -lZ /tmp/testsedir1/testsefile2 
+-rw-r--r--. 1 user user user_u:object_r:public_content_t:s0 0 08-06 12:34 /tmp/testsedir1/testsefile2
+
+

+ Opcja -R polecenia restorecon + włącza rekurencję, natomiast -v + włącza wyświetlanie komunikatów diagnostycznych. +

+

+ Odnośnie egzaminu:
+ Podczas zmiany kontekstu plików oraz katalogów warto korzystać z + polecenia semanage oraz restorecon aby dodawać + kontekst do bazy a następnie przywrócić go na pliku. Przez co + będziemy mieć pewność że zmiany z pewnością przetrwają ponowne + uruchomienie serwera. +

+

21.2.6. Dodawanie i usuwanie portów sieciowych w ujęciu SELinux

+

+ Jak mogliśmy się dowiedzieć domyślnie SELinux pozwala na + nasłuchiwanie tylko na określonych typami portach więc jeśli nasza + usługa + musi nasłuchiwać na inny niż te w określonym type musimy dodać ten port + do mechanizmu SELinux. +

+

+ Dodawnie portów możemy zrealizować za pomocą polecenia semanage, + ale na początku określimy typ portu SELinux. Za pomocą podpolecenia + port wraz z opcją -l możemy wylistować wszystkie + porty wraz z protokołami oraz typami portów. Załóżmy, że chcę dodać + port do usługi http, wówczas możemy wyszukać portów + powiązanych z tą usługą za pomocą polecenie grep. +

+
+[user@server10 ~]$ sudo semanage port -l | grep 'http'
+[sudo] hasło użytkownika user: 
+http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
+http_cache_port_t              udp      3130
+http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
+pegasus_http_port_t            tcp      5988
+pegasus_https_port_t           tcp      5989
+
+

+ Potrzebny port dodam do typu + http_port_t. +

+
+[user@server10 ~]$ sudo semanage port -at http_port_t -p tcp 8010
+[user@server10 ~]$ sudo semanage port -l | grep 'http_port_t'
+http_port_t                    tcp      8010, 80, 81, 443, 488, 8008, 8009, 8443, 9000
+
+

+ Aby dodać port użyłem podpolecenia + port wraz z opcjami + -at, które + nakazują dodanie portu oraz wskaznie na typ portu SELinux. + Następnie po opcji -p podałem protokół oraz numer portu. + Na koniec wyświetliłem jeszce ten typ portu, aby sprawdzić czy zmiany + zostały zatwierdzone. +

+

+ Jeśli port przestanie nam być potrzebny możemy go usunąć, za pomocą + opcji -d oraz opcji -p po której podajemy protokół + i numer portu. Teraz usunę ten port, który wcześniej dodałem. +

+
+[user@server10 ~]$ sudo semanage port -d -p tcp 8010
+[sudo] hasło użytkownika user: 
+[user@server10 ~]$ sudo semanage port -l | grep 'http_port_t'
+http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
+
+

+ Jak możemy zauważyć nie ma już portu 8010 na początku listy + przydzielonej do typu http_port_t. +

+

+ Odnośnie egzaminu
+ Aby korzystać z niestandarowych portów dla usług należy dodać je do + typów tych usług w SELinux. +

+

21.2.7. Zachowanie kontekstu SELinux podczas kopiowania

+

+ Aby zachować kontekst SELinux dla kopiowanych plików, należy + użyć opcji --preserve=context polecenia cp. W tym + podrozdziale sobie to zobrazujemy. Nasz plik testowy w katalogu + /tmp/testsedir1 prezentuje się z następującymi atrybutami: +

+
+[user@server10 ~]$ ls -lZ /tmp/testsedir1/testsefile2 
+-rw-r--r--. 1 user user user_u:object_r:public_content_t:s0 0 08-06 12:34 /tmp/testsedir1/testsefile2
+
+

+ Teraz jeśli przekopiuje go z pomocą polecenia cp do katalogu + /var/local jego atrybuty będą prezentować się w następujący + sposób. +

+
+[user@server10 ~]$ ls -ldZ /var/local/testsefile2 
+-rw-r--r--. 1 root root unconfined_u:object_r:var_t:s0 0 08-06 14:36 /var/local/testsefile2
+
+

+ Jak widzimy kontekst uległ zmianie. Jeśli jest to dla nas ważne z + pewnych względów, to aby temu zapobiec należy używać opcji + --preserve=context. Teraz usunę wcześniej skopiowany plik + następnie skopiuje go jeszcze raz tym raz wykorzystując do tego + wspomnianą opcję. +

+
+[user@server10 ~]$ sudo cp --preserve=context /tmp/testsedir1/testsefile2 /var/local/
+[user@server10 ~]$ ls -ldZ /var/local/testsefile2 
+-rw-r--r--. 1 root root user_u:object_r:public_content_t:s0 0 08-06 14:40 /var/local/testsefile2
+
+

+ Jak widzimy, w tym przypadku kontekst nie uległ zmianie. Ta opcja tyczy + się wyłącznie kopiowania, ponieważ przenoszenie nie zmienia kontekstu. +

+
+[user@server10 ~]$ sudo mv /tmp/testsedir1/testsefile2 /var/local/
+[user@server10 ~]$ ls -ldZ /var/local/testsefile2
+-rw-r--r--. 1 user user user_u:object_r:public_content_t:s0 0 08-06 12:34 /var/local/testsefile2
+
+

21.2.8. Zmiana wartości logicznych SELinux

+

+ Zabierając się za zmianę wartości logicznych SELinux warto, + na początku upewnić się jaki stan mają wartości. Możemy to zrobić + za pomocą trzech różnych narzędzi. Na potrzeby przykładu wybrałem + wartość use_nfs_home_dirs. Poniżej znajdują się trzy możliwe + sposoby na sprawdzenie stanu tej wartości. +

+
+[user@server10 ~]$ sudo semanage boolean -l | grep 'use_nfs_home_dirs'
+use_nfs_home_dirs              (wyłączone,wyłączone)  Allow use to nfs home dirs
+[user@server10 ~]$ sudo getsebool -a | grep 'use_nfs_home_dirs'
+use_nfs_home_dirs --> off
+[user@server10 ~]$ sudo sestatus -b | grep 'use_nfs_home_dirs'
+use_nfs_home_dirs                           off
+
+

+ Najlepszym sposóbem wydaje mi się, że jest użycie pierwszego polecenia, + gdyż domyślnie zwraca więcej informacji. W nawiasie wyjścia tego + polecenia + możemy zauważyć dwa stany pierwszy z nich to stan obecny, + natomiast drugi to stan pobrany z polityki. +

+

+ Aby zmienić stan wartości logicznej należy użyć polecenia + setsebool, jako argument to polecenie przyjmuje + nazwę wartości oraz stan, w tym przypadku 0 lub 1. +

+
+[user@server10 ~]$ sudo setsebool use_nfs_home_dirs 1
+[sudo] hasło użytkownika user: 
+[user@server10 ~]$ sudo semanage boolean -l | grep 'use_nfs_home_dirs'
+use_nfs_home_dirs              (włączone,wyłączone)  Allow use to nfs home dirs
+
+

+ Teraz ta wartość jest włączona, ale jeśli uruchomie komputer ponownie, + to wartość wróci do stanu określonego w polityce. Jeśli chcemy aby, + zmiany były trwałe + należy dodać do wcześniej użytego polecenia opcję -P. +

+
+[user@server10 ~]$ sudo setsebool -P use_nfs_home_dirs 1
+[user@server10 ~]$ sudo semanage boolean -l | grep 'use_nfs_home_dirs'
+use_nfs_home_dirs              (włączone,włączone)  Allow use to nfs home dirs
+
+

+ Teraz stan wartości został ustawiony na stałe. +

+

21.2.9. Monitorowanie naruszeń SELinux

+

+ Nie zależnie od trybu działania SELinux, generuje ostrzeżenia + i zapisuje je za pomocą demona auditd do pliku + /var/log/audit/audit.log lub przy użyciu rsyslog + do pliku /var/log/messages + jeśli demon audit jest niedostępny. Ostrzeżenia generowane są + podczas odmowy dostępu i zapisywane wraz z odpowiednimi informacjami + w wyżej wymienionych plikach. SELinux analizuje te ostrzeżenia + w celach identyfikacji powodu odmowy dostępu. Wyniki tych analiz są + zapisywane wraz z możliwymi rekomendacjami jak naprawić napotkamy + problem. +

+

+ Za pomocą polecenia sealert wraz z opcją -a możemy + sprawdzić podany plik pod kątem występowania ostrzeżeń. Jeśli takowe + wstąpią zostanie nam zwrócony na ten temat raport. +

+
+[user@server10 ~]$ sudo sealert -a /var/log/audit/audit.log
+100% done
+found 0 alerts in /var/log/audit/audit.log
+
+

+ W moim systemie niestety brak alertów. +

+

Ćwiczenie 1: Zmiana trybu operacyjnego SELinux

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1 wyłącz SELinux z poziomu + pliku konfiguracyjnego, następnie uruchom ponownie komputer i sprawdź + stan operacyjny SELinux. Następnie przywróć go z powrotem do + trybu enforcing i znów uruchom ponownie komputer. Potwierdź + zmianę trybu za pomocą odpowiedniego polecenia. +

+

Ćwiczenie 2: Modyfikacja kontekstu plików

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1. Utwórz w katalogu /tmp + katalog d1 zawierający podkatalog d2. Następnie zmień + rekurencyjnie kontekst katalogu /tmp/d1 ustawiając + typ SELinux etc_t. Potwierdź to następnie dodaj + zmiany bazy kontekstów. +

+

Ćwiczenie 3: Dodawanie portów

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1, dodaj port 8010 do typu + SELinux dla + usługi HTTP. Potwierdź wykonanie tej czynności. +

+

Ćwiczenie 4: Kopiowanie plików z zachowaniem kontekstu

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1, utworz plik o nazwie sef2 w + katalogu /tmp, wyświetl jego kontekst. Skopiuj go do katalogu + /usr z zachowaniem kontekstu, ponownie wyświetl kontekst + pliku w katalogu /usr aby upewnić się, że kontekst + rzeczywiście się nie zmienił. +

+

Ćwiczenia 5: Zmiana stanu wartości logicznej SELinux

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server1, wyświetl stan wartości logicznej + ssh_use_tcpd za pomocą polecenia getsebool oraz + sestatus. Użyj odpowiedniego polecenia aby zmienić jej stan. + Potwierdź to, wyświetlając go na wszystkie trzy sposoby. +

+

Podsumowanie

+

+ Ten rozdział został poswięcony w pełni podstawom znajomości oraz + obsługi mechanizmu SELinux. Poznaliśmy podstawy teoretyczne + łącznie wymaganą do rozeznania w temacie terminologią. W dalszej + części rozdzialu zapoznaliśmy się w jaki sposób możemy manipulować + elementami tego mechanizmu w praktyce. Na koniec poznaliśmy metodę na + monitorowanie ostrzeżeń generowanych przez SELinux. + W następnym rozdziale zapoznamy się z podstawami tworzenia skryptów + powłoki. +

+

22. Skrypty powłoki

+

+ Skrypty powłoki są to listy poleceń zapisywane w jednym pliku + tekstowym. Polecenia zapisane w skryptach są najzwyklejszymi + poleceniami, tak jakbyśmy chcieli wykonać je z poziomu wiersza + polecenia. + Skrypty służą głównie automatyzacji nudnych oraz powtarzalnych zadań, + na przykład w systemie należy utworzyć konta dla 100 użytkowników. + Skrypty składają się z trzech głownych składników: poleceń/instrukcji, + konstrukcji kontroli (tj. konstrukcji warunkowych oraz pętli) i + komentarzy, które służą wyłącznie opisowi tego co się dzieje w skrypcie + i nie biorą udziału w jego interpretacji. Skrypt powłoki są + interpretowane przez powłokę, która jest uruchamiana + wraz uruchomieniem skryptu. Rozwijane są użyte w skryptach wyrażania a + polecenia są uruchamiane po kolei, jedno po drugim tak jak + wpisywalibyśmy je ręczenie. W przypadku błędów powłoka zwróci + odpowiedni komunikat oraz numer linii, w której ten błąd wystąpił. +

+

22.1. Podstawy skryptów powłoki

+

+ Jeśli spytamy się kogo kolwiek jak jest najlepsza metoda nauki jakiegoś + języka programowania, zapewne usłyszymy kilka zdań, które można + streścić + do: czytaj, zrozum, pisz, powtórz. Tak może być i w tym przypadku. + Obecnie skrypty powłoki BASH uznawane są branży IT + jako podstawowe narzędzie do automatyzacji i konstrukcje używane do + budowy skryptów uznaje się za język programowania. Zatem zaczniemy od + czegoś prostego, skryptu który wpisze nam podstawowe informacje o + systemie. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/sys_info.sh
+     1	#!/bin/bash
+     2	
+     3	# Ten skrypt ma nazwe sys_info.sh i został napisany przez xf0r3m 8 sierpnia 2022
+     4	# Ten skrypt powinien znajdować się w katalogu /usr/local/bin
+     5	# Ten skrypt wyświetla podstawowe informacje o systemie:
+     6	
+     7	echo "Podstawowe informacje o systemie:";
+     8	echo "================================";
+     9	echo;
+    10	echo "Nazwa komputera, informacje o sprzęcie oraz systemie operacyjnym:";
+    11	/usr/bin/hostnamectl;
+    12	echo;
+    13	echo "Obecnie w systemie zalogowani są następujący użytkownicy:";
+    14	/usr/bin/who;
+
+

+ Na początku każdego skryptu znajduje się nagłówek, w którym jest + ścieżka, wskazująca na program interpretera zawartości skryptu. + Nagłówek zaczyna się od specjalnego typu kometarza jakim jest + shebang (#!). W tym przypadku jest + wskazaniem na program bash w katalogu + /bin. W ten sposób wskazujemy, że + zawartością tego pliku będzie skrypt powłoki BASH. Kolejnymi + elementami skryptu są komentarze (zwykłe). Komentarz poprzedzony jest + tylko i wyłącznie krzyżykiem (#), w komentarzach + najczęściej umieszczane są wyjaśnienia bardziej skomplikowanych + konstrukcji lub toku myślenia programisty. Na początku skryptu + umieszcza się bardziej informacyjne treści jak nazwę skryptu, imię, + nazwisko, bądź pseudomnim autora; date jego wytworzenia; domyślną + lokalizacje; krótki opis co on robi oraz przykłady użycia. W dalszej + części przykładu znajdują się już właściwe polecenia. Polecenie + echo służy do wypisywania na + stdout tego co zostanie podane jako argument polecenia. W + skryptach to polecenie służy do wyświetlania informacji w terminalu. + Później znajdują się polecenia, które odpowiadają za czynności, do + których skrypt został stworzony. Zwrócimy uwagę na to, że + są one zapisane w postaci plików, które rzeczywiście z tego polecenia + są odpowiedzialne. Ten zapis zapewnia, że napewno zostanie uruchmiony + ten program, a nie np. jakiś alias lub polecenie wbudowane. +

+

+ hostnamectl uruchomiony bez żadnych + argumentów, zwróci podsumowanie na temat używanego sprzętu oraz + systemu operacyjnego. Natomiast polecenie + who wyświetla zalogowanych + użytkowników. +

+

+ Dobrym miejscem na nasze skrypty jest katalog /usr/local/bin. + Prze co będzie nam łatwiej je uruchamiać, ponieważ ten katalog znajduje + się w ścieżce wyszukiwania poleceń każdego użytkownika. Niestety zapis + do tego katalogu wymaga podniesienia uprawnień. + Po zapisaniu takie skryptu jeśli zwrócimy uwagę na jego atrybuty, + brakuje w nich bitu wykonania a on jest niezbędny aby można było taki + program uruchomić. +

+
+[user@server10 ~]$ ls -l /usr/local/bin/sys_info.sh
+-rw-r--r--. 1 root root 494 08-08 08:38 /usr/local/bin/sys_info.sh
+
+

+ Bit nadamy każdej z grupie, żebyśmy mogli uruchomić go jako zwykły + użytkownik. Do nadania bitu użyjemy polecenie chmod. +

+
+[user@server10 ~]$ sudo chmod +x /usr/local/bin/sys_info.sh
+[user@server10 ~]$ ls -l /usr/local/bin/sys_info.sh
+-rwxr-xr-x. 1 root root 494 08-08 08:38 /usr/local/bin/sys_info.sh
+
+

+ Teraz wszyscy mogą uruchomić ten plik, a z racji tego iż znajduje się + on na ścieżce wyszukiwania poleceń wystarczy, że podamy w wierszu + polecenia nazwę pliku. +

+
+[user@server10 ~]$ sys_info.sh 
+Podstawowe informacje o systemie:
+================================
+
+Nazwa komputera, informacje o sprzęcie oraz systemie operacyjnym:
+ Static hostname: server10.example.com
+       Icon name: computer-vm
+         Chassis: vm 🖴
+      Machine ID: 301347671a7c47a5934351c451479d32
+         Boot ID: bb68cbe389874bebaa4cf60693187c89
+  Virtualization: kvm
+Operating System: Red Hat Enterprise Linux 9.0 (Plow)     
+     CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseos
+          Kernel: Linux 5.14.0-70.13.1.el9_0.x86_64
+    Architecture: x86-64
+ Hardware Vendor: Red Hat
+  Hardware Model: KVM
+
+Obecnie w systemie zalogowani są następujący użytkownicy:
+user     pts/0        2022-08-08 08:28 (192.168.122.1)
+
+

22.1.1. Debugowanie skryptu

+

+ Jeśli w skrypcie występuje jakiś problem możemy uruchomić go w trybie + debugowania. Taki tryb dostępny jest albo poprzez dodanie do nagłówka + skryptu opcji -x lub uruchomienia skryptu za pomocą polecenia + bash wraz z opcją -x. W tym trybie będą + wyświetlane wykonywane koleno polecenia wraz z rozwinięciami wyrażeń, + czy przypisywane wartości zmiennym. Osobiście jako, że BASH + jest + moim podstawowym językiem to uważam, że ta opcja jest szczególnie + przydatna oczywiście w bardziej zaawansowanych skryptach. Poniżej + znajduje się wcześniej analizowany skrypt uruchomiony w trybie + debugowania. +

+
+[user@server10 ~]$ bash -x /usr/local/bin/sys_info.sh
++ echo 'Podstawowe informacje o systemie:'
+Podstawowe informacje o systemie:
++ echo ================================
+================================
++ echo
+
++ echo 'Nazwa komputera, informacje o sprzęcie oraz systemie operacyjnym:'
+Nazwa komputera, informacje o sprzęcie oraz systemie operacyjnym:
++ /usr/bin/hostnamectl
+ Static hostname: server10.example.com
+       Icon name: computer-vm
+         Chassis: vm 🖴
+      Machine ID: 301347671a7c47a5934351c451479d32
+         Boot ID: bb68cbe389874bebaa4cf60693187c89
+  Virtualization: kvm
+Operating System: Red Hat Enterprise Linux 9.0 (Plow)     
+     CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseos
+          Kernel: Linux 5.14.0-70.13.1.el9_0.x86_64
+    Architecture: x86-64
+ Hardware Vendor: Red Hat
+  Hardware Model: KVM
++ echo
+
++ echo 'Obecnie w systemie zalogowani są następujący użytkownicy:'
+Obecnie w systemie zalogowani są następujący użytkownicy:
++ /usr/bin/who
+user     pts/0        2022-08-08 08:28 (192.168.122.1)
+
+

+ Linie oznaczone plusem, są poleceniami zapisanymi w skrypcie. Pod nimi + znajduje się wynik działania tego polecenia. +

+

22.1.2. Zmienne

+

+ Jak pamiętamy albo nie z rozdziału o powłoce BASH, dostępne są + dwa rodzaje zmiennych. Zmienne powłoki nazywane także zmiennymi + prywatnymi lub lokalnymi, mogą być wykorzystywane w skryptach, nie + tylko w obsłudze wiersza polecenia. W skryptach możemy również uzyskać + dostęp do zmiennych środowiskowych. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/use_var.sh
+     1	#!/bin/bash
+     2	
+     3	echo "Ustawienie zmiennej powłoki";
+     4	echo "===========================";
+     5	SYSNAME="server10.example.com";
+     6	echo "Nazwa komputera tej maszyny to: $SYSNAME";
+
+

+ W powyższym skrypcie utworzyłem jedną zmienną której nadałem + przedstawioną wartość a następnie odwołałem się do niej w poleceniu + echo. Warto tutaj też wspomnieć o tym, że każdy skrypt + uruchamiany jest jako oddzielny proces powłoki BASH - + uruchamiany jest w podpowłoce. Zmienne zdefiniowane w skrypcie nie + będą dostępne, kiedy skończy on swoje działanie (chyba że do wykonania + skryptu użyjemy polecenia source). +

+

+ Dostęp do zmiennych środowiskowych wymaga jedynie odwołnia się do nich. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/pre_env.sh 
+     1	#!/bin/bash
+     2	
+     3	echo "Lokalizacja mojej powłoki znajduje się: ";
+     4	echo $SHELL;
+     5	echo "Jestem zalogowany w systemie jako: $LOGNAME";
+
+

+ W bardziej zaawansowanych skryptach pożądane jest aby przechować wynik + działania jakiegoś polecenia lub polecenia potokowego w zmiennej, żeby + można było go użyć do różnych celów. Wynik działania tego polecenia + może trafić do zmiennej za sprawą + podstawienia polecenia. Poniżej + znajduje się skrypt, w którym pokazano dwa sposoby na podstawienie + polecenia do zmiennej. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/cmd_out.sh 
+     1	#!/bin/bash
+     2	
+     3	SYSNAME=$(hostname);
+     4	KERNVER=`uname -r`;
+     5	
+     6	echo "Nazwa komputera to: $SYSNAME";
+     7	echo "Wersja jądra to: $KERNVER";
+
+

+ Jak widzimy podstawienie polecenia możemy dokonać na dwa sposoby + za pomocą nawiasów poprzedzonych znakiem dolara ($()) + lub za pomocą ukośnego apostrofu (``). Ten skrypt + przechowuje w nazwę komputera w zmiennej + SYSNAME oraz wersję jądra w zmiennej + KERNVER. Te informacje zostały + zdefiniowane w zmiennych za pomocą mecanizmu podstawienia polecenia, + następnie zostały on wyświetlone przy użyciu polecenia echo. +

+

22.1.3. Parametry powłoki

+

+ Chcąc przekazać jakieś informacje do skryptu z zewnątrz, możemy + wykorzystać mechanizm parametrów powłoki. Wywołując + jakieś polecenie + w wierszu polecenia, zazwyczaj zapisujemy jego nazwę. To jest parametr + powłoki. Wśrod parametrów powłoki możemy wyróżnić takie rzeczy jak + zmienne, parametry specjalne oraz parametry pozycjne. Na potrzeby tego + materiału zajmiemy się tylko parametrami pozycyjnymi oraz obsługującymi + je parametrami specjalnymi. Nazwa polecenia lub skryptu jest + pierwszym parametrem pozycyjnym. Każdy kolejny argument + zapisany po nazwie polecenia to kolejny parametr pozycyjny. Parametry + pozycyjne są liczone od zera. Możemy odwołać się do nich podając po + znaku dolara numer parametru. Parametrów + pozycyjnych może być wiele. Przy czym, aby odwołać się do parametru + powyżej 9 należy umieść numer parametru w nawiasach klamrowych np. + (${11}). Poniżej znajduje się skrypt oraz jego + wywołanie, który obrazuje przekazanie parametrów do skryptu. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/cmd_line_arg.sh 
+     1	#!/bin/bash
+     2	
+     3	echo "Do skryptu wprowadzono $# argumenty pozycyjne";
+     4	echo "Są nimi kolejno: $*";
+     5	echo "Pierwszym argument jest: $1";
+     6	echo "Identyfikator powłoki uruchamiającej ten skrypt to: $$";
+
+[user@server10 ~]$ /usr/local/bin/cmd_line_arg.sh test test2 test3 1 2 3 4 5 6 7 8 9 0
+Do skryptu wprowadzono 13 argumenty pozycyjne
+Są nimi kolejno: test test2 test3 1 2 3 4 5 6 7 8 9 0
+Pierwszym argument jest: test
+Identyfikator powłoki uruchamiającej ten skrypt to: 1874
+
+

+ W skrypcie odwołano się do drugiego parametru pozycjnego, czyli do + argumentu o numerze 1 (linia: 5). W skrypcie + użyto parametrów specjalnych takich jak: liczba przekazanych argumentów + pozycyjnych - ($#); wszystkie przekazane argumenty - + ($*) oraz numer PID podpowłoki, która + jest odpowiedzialna za wykonanie tego skryptu - ($$). +

+

+ Chcąc używać po kolei parametrów pozycyjnych, musimy tak też je zapisać + w skrypcie, a co jeśli ilość tych zmiennych nie będzie nam + znana. W tym przypadku wówczas możemy przesuwać wszystkie parametry + o jeden w lewo. Jeśli użyjemy wartość drugiego parametru pozycjnego + ($1) i nie będzie nam już ona potrzebna, możemy użyć + polecenia shift, które przesunie wszystkie parametry + o jeden w lewo (domyślnie, ponieważ polecenie to przyjmuje argument w postaci + liczby, o ile wartości przesunąć parametry). Dlatego też wartość + trzeciego parametru przejdzie na drugą pozycję, czwartego na trzecią + itd. Po użyciu tego polecenia oryginalna wartość drugie parametru + zostanie utracona. Poniżej znajduje się skrypt, w którym zobrazowano + działanie tego polecenia. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/cmd_line_arg_shift.sh
+     1	#!/bin/bash
+     2	
+     3	echo "Do skryptu wprowadzono $# argumenty pozycyjne";
+     4	echo "Są nimi kolejno: $*";
+     5	echo "Pierwszym argument jest: $1";
+     6	echo "Identyfikator powłoki uruchamiającej ten skrypt to: $$";
+     7	shift;
+     8	echo "Nowym pierszym argumentem po pierwszym przesunięciu jest: $1";
+     9	shift;
+    10	echo "Nowym pierwszy argumentem po drugim przesunięciu jest: $1";
+
+

+ Jak widzimy przy użyciu polecenia shift + nie musimy używać innych odwołań do parametrów poza odwołaniem do + drugiego (parametr o numerze 1). +

+

22.2. Konstrukcje logiczne w skryptach powłoki

+

+ Konstrukcje logiczne nie tylko w skryptach powłoki mają za zadanie + warunkować na podstawie wyrażeń logicznych wykonanie pewnych bloków + kodu. Konstrukcje logiczne kontolują przepływ wykonania poleceń w + skryptach. W BASH możemy spotkać z dwoma kontrukcjami + logicznymi: konstrukcją if-then-fi oraz konstrukcją + case. Omawianie konstrukcji case wychodzi poza ramy + tego materiału, wiec skupimy się tylko if-then-fi i + jej rozszerzeniach, ale najpierw zaczniemy od przedstawienia czym są + kody wyjściowe oraz wyrażenia warunkowe. +

+

22.2.1. Kody wyjściowe

+

+ Każde polecenie uruchomione w powłoce po zakończeniu pracy, nie ważne + czy pomyślnie, czy nie zwraca do powłoki tzw. exit code + - kod wyjściowy. Możemy użyć tych kodów w wyrażeniach warunkowych aby + mieć pewność, że działanie polecenia uruchomionego w poprzedniej linii + zakończyło się sukcesem i można kontynuować wykonywanie przez skrypt + kolejnych zadań. Kod wyjściowy poprzedniego polecenia znajduje się + w specjalnym parametrze powłoki $?. +

+
+[user@server10 ~]$ pwd
+/home/user
+[user@server10 ~]$ echo $?
+0
+[user@server10 ~]$ man
+Jakiej strony podręcznika potrzebujesz?
+For example, try 'man man'.
+[user@server10 ~]$ echo $?
+1
+
+

+ Pierwsze polecenie, którego wykonanie zakończyło sie sukcesem zwróciło + kod wyjściowy 0. Natomiast w przypadku + polecenia man przy którym zapomniałem + o podaniu argumentu zwróciło wartość 1. + W przypadku zastrzeżeń co do poprawnego wykonania zwracanym kodem + wyjściowym jest najczęściej wartość niezerowa, nie zawsze jest to 1. + Te wartości mogą być różne i zależne od programu. +

+

+ Dlaczego mówie o kodach wyjściowych w przypadku konstrukcji logicznych, + otóż powody są dwa. Można użyć kodów wyjściowych do budowania + warunków, oraz konstrukcja if-then-fi podejmuje decyzje na + podstawie kodu wyjściowego wyrażenia warunkowego. Zatem jeśli wyrażenie + zwróci 0, to wówczas wykona się blok kodu zapisany po instrukcji + then. +

+

22.2.2. Wyrażenia warunkowe

+

+ Zadaniem wyrażenia warunkowego jest obliczenie równania logicznego. + Na przykład czy: 3 < 4. Wynikiem takiego równia jest 1, czyli + prawda, jeśli odwrócimy operandy równiania wówczas + wówczas otrzymamy 0 czyli fałsz. Kiedy wyrażenie + warunkowe obliczy prawdę wówczas zwraca kod wyjścia równy 0, a w + przeciwnym wypadku jest 1. Elementami powłoki odpowiedzialnymi za + wyrażenia warukowe jest polecenie test oraz rozszerzenie + nawiasu kwadratowego ([]) i to tego rozszerzenia + będziemy używać w konstrukcjach warunkowych. + Na stronie podręcznika polecenia BASH w sekcji + CONDITIONAL EXPRESSIONS znajdują się wszystkie dostępne + operatory wyrażeń warunkowych jakie możemy użyć w skryptach. +

+

+ Odnośnie egzaminu
+ Bardzo ważna jest dobra znajomość instrukcji logicznych oraz ich + operatorów. +

+

22.2.3. Konstrukcja if-then-fi

+

+ Za pomocą konstrukcji if-then-fi możemy warunkować + na podstawie kodu wyjściowego wykonanie poleceń zapisanych w + konstrukcji. Poniżej znajduje się przykładowy skrypt zawierający + tę konstrukcję. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/if_then_fi.sh
+     1	#!/bin/bash
+     2	
+     3	if [ $# -ne 2 ]; then 
+     4		echo "Błąd. Nie poprawna liczba podanych argumentów";
+     5		echo "Użycie $0 plik_zrodlowy plik docelowy";
+     6		exit 2;
+     7	fi
+     8	echo "Skrypt zakończył swoje działanie";
+
+

+ Konstrukcję rozpocznamy od słowa kluczowego if + następnie podajemy polecenie lub wyrażenie warunkowe, którego kod + wyjściowy będzie decydować czy wykonać polecenia zawarte po słowie + klczowym then na przykładzie są to linie od 4 do 6. + Konstrukcja kończy się słowem kluczowym fi, które + musi być zawarte inaczej próba uruchomienia takiego skryptu zakończy + się błędem. Jako + ciekawostkę podam, że blok zawarty po słowie then konczy się + poleceniem exit, dzięki któremu możemy zakończyć + działanie skryptu z określonym kodem wyjściowym. +

+

+ Na zamieszczonym przykładzie użyłem do przedstawienia warunku + rozszerzenia nawiasu kwadratowego, w ktorym sprawdzam czy podano + dokładnie dwa paramentry pozycjne, operator którego użyłem + -ne, który sprawdza czy lewy operand + jest nierówny prawemu. Jeśli tak, to kod wyjściowy warunku będzie + równy 0 i dojdzie do wykonania poleceń, co tym przypadku oznacza, że + podaliśmy jeden lub więcej niż dwa parametry pozycyjne podczas + uruchamiania tego skryptu. +

+

22.2.4. Konstrukcja if-then-else-fi

+

+ Ta konstrukcja jest rozszerzeniem standardowej konstrukcji if. + Zawiera ona dodatkowy blok else, który będzie + wykonywany w momencie gdy + kod wyjściowy warunku/polecenia będzie niezerowy. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/if_then_else_fi.sh
+     1	#!/bin/bash
+     2	
+     3	if [ $1 -gt 0 ]; then
+     4		echo "$1 jest wartością dodatnią";
+     5	else
+     6		echo "$1 jest wartością ujemną";
+     7	fi
+
+

+ W tym przypadku warunek w postaci rozszerzenia nawiasów kwadartowych + (najpopularniejsza forma warunków w skryptach powłoki) sprawdza czy + wartość podana jako drugi parametr pozycyjny jest większa od 0. Jeśli + tak, to wykonane zostanie polecenie znajdujące się w po słowie + then a jeśli nie to polecenie po + słowie kluczowym else. +

+

22.2.5. Konstrukcja if-then-elif-fi

+

+ Rozszerzenie konstrukcji if o słowo kluczowe + elif pozwala na zdefiniowane kolejnego warunku. W + przypadku konstrukcji if-then-elif-fi, warunków + możebyć nieskończeniei wiele i dodatkowo możemy zakończyć całą + konstrukcję blokiem else. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/if_then_elif_fi.sh 
+     1	#!/bin/bash
+     2	
+     3	if [ $1 -gt 0 ]; then
+     4		echo "$1 jest dodatnią wartością.";
+     5	elif [ $1 -lt 0 ]; then
+     6		echo "$1 jest ujemną wartością.";
+     7	elif [ $1 -eq 0 ]; then
+     8		echo "Podana wartość to 0.";
+     9	else
+    10		echo "Podano wartość, która nie jest cyfrą";
+    11	fi
+
+

+ Na powyższym przykładzie drugi parametr pozycyjny poddawany jest wielu + warunkom. Początkowy warunek sprawdza czy jest on większy od 0 + (operator -gt), następnie czy może jest mniejszy od + 0 (operator -lt) i ostatni czy jest on równy 0 + (operator -eq). W bloku else znajduje się + komunikat mówiący, że podana wartość nie jest liczbą, będzie on + wykonywany gdy jako argument podamy literę lub znak specjalny. + Podczas uruchomienia tego skryptu wraz z literowym argumentem możemy + zauważyć błąd. Ten błąd jest generowany z tego względu, iż wymienione + wyżej operatory są przeznaczone dla liczb całkowitych, a litera jest + znakiem. +

+

22.3. Konstrukcje pętli

+

+ Za pomocą konstrukcji pętli możemy wykonywać ten sam blok poleceń dla + określonych, zmienianych w trakcie działania bloku pętli zmiennych. + Zmienne w trakcie działania pętli najczęściej są + iterowane - ich wartość zmienia się o jeden lub o + jakąś stałą określoną wartość. W BASH-u dostępne są trzy + rodzaje pętli: for-do-done, while-do-done + oraz until-do-done. W tym materiale skupimy się tylko na + pętli for-do-done. +

+

22.3.1. Konstrukcja pętli for-do-done

+

+ Pętla for jest inną pętlą niż te dwie pozostałe, gdyż działa + ona na określonej liście wartości, które są kolejno przypisywane + zmiennej pętli. Pętla działa do momentu, aż wyczerpią się wszystkie + elementy na liście. Poniżej znajduje się przykład skryptu w którym + użyłem pętli for. +

+
+[user@server10 ~]$ cat -n /usr/local/bin/for_do_done.sh 
+     1	#!/bin/bash
+     2	
+     3	count=0;
+     4	for LETTER in {A..Z}; do
+     5		count=$((count + 1));
+     6		echo "$count literą alfabetu jest [${LETTER}]";
+     7	done
+
+

+ Pętla zaczyna się od słowa kluczowego + for następnie zapisywana jest zmienna + pętli (LETTER) po słowie kluczowym + in występuje lista elementów, na + której operuje pętla ({A..Z}) zwróćmy + uwagę na to, iż możemy definiować tutaj zakresy co pokazano na + przykładzie. Dla celów tego skryptu jeszcze przed pętlą utworono + zmienną, która jest w tym przypadku jej licznikiem. Jest ona bowiem + iterowana na początku bloku pętli, za pomocą wyrażenia arytmetycznego + ($(())), w tym wyrażeniu nie odwołujemy się do + zmiennej tylko podajemy jej nazwę. Odwołanie nastąpi automatycznie + podczas interpretacji tego wyrażenia. Następnie wyświetlany jest + komunikat, zawierający licznik oraz zmienną pętli. Pętla wypisze + wszystkie litery alfabetu łacińskiego, poprzedzając je numerem w + kolejności. +

+

+ Aby lepiej zobrazować sobie działanie pętli możemy uruchomić ten + skrypt w trybie debugowania. +

+

Ćwiczenie 1: Poprawienie skryptu

+

+ Jako użytkownik z możliwością podniesienia uprawnień na maszynie + oznaczonej jako server10. Popraw skrypt z podrozdziału + o konstrukcji if-then-elif-fi, tak aby nie wyświetlał błędu. + Możesz posłużyć się stroną podręcznika powłoki BASH oraz + trybem debugowania. +

+

Podsumowanie

+

+ W tym rozdziale poznaliśmy podstawy tworzenie skryptów powłoki. + Dowiedziliśmy się jaką budowę ma skrypt powłoki oraz poznaliśmy ich + podstawowe elementy. Poznaliśmy konstrukcje warunkowe oraz prostą + konstrukcję pętli jąką jest pętla for. Jeśli domyślnie nie + korzystamy z powłoki BASH przestawione tutaj przykłady po + drobnych przeróbkach będą działać na pozostałych powłokach Uniksa. + W następnym już ostatnim rozdziale zapoznamy się z mechanizmem + konteneryzacji dostępnym w RHEL. +

+

23. Kontenery

+

+ Kontener to sposób na uruchomienie aplikacji w + odrębnym środowisku dzięki czemu, może ona działać i wykonywać swoje + zadania bez wpływu na inne procesy przy zachowaniu jak największej + oszczędności zasobów systemu. Kontenery dostarczają do systemu + właściwą aplikację wraz cały środowiskiem niezbędnym do jej działania, + wygląda ona tak samo jakby była zainstalowana na fizycznym serwerze. + Aplikacja uruchamiana w kontenerze nazywana jest + aplikacją konteneryzowaną. +

+

+ Kontenery do swojego działania wykorzystują funkcje jądra Linux, + takie jak grupy kontrolne (przydzielanie zasobów + procesom), przestrzeń nazw (udostępnienie zasobów + systemowych takich jak interfejsy sieciowe) oraz moduł + seccomp i SELinux, które odpowiadają + za kontrolowanie dostępu procesów. Wykorzystując te komponenty + kontenery + zapewniają w pełni kontrolowane środowisko o wysokim stopniu + bezpieczeństwa. +

+

+ Korzystanie z kontenerów przynosi ze sobą wiele korzyści takich jak + izolacja aplikacji w kontenerach, małe powiązanie z system w którym + kontener działa, niezależność kontenerów wobec siebie czy + mniejsze obciążenie systemu. Korzyści jest naprawdę bardzo dużo, + dlatego też konterneryzacja wypiera wirtualizację, ale oczywiście to + wszystko zależy od konkretnego przypadku. +

+

+ Przy wyborze miejsca docelowego dla konternerów możemy zastanawiać się + nad fizycznym serwerem albo maszyną wirtualna. Korzystanie z maszyn + wirtualnych wprowadza dodatkową warstwę hipernadzorcy, który + je kontroluje. W przypadku jeśli kontenery mają swiadczyć usługi, mogą + on spokojnie rezydować na fizycznym serwerze, bez dodatkowych + komplikacji. Więc wybór wydaje się dość łatwy. +

+

+ Kontenery są rozprowadzane na zasadzie obrazów + (ang. images) zawierających całe środowisko określonej + aplikacji, dzięki czemu może poprawnie pracować w izolowanym + środowisku. Mechnizmy konteneryzacji dostarczane wraz z + RHEL, przestrzegają zasad Inicjatywy Otwartych + Kontenerów - OCI, dzięki czemu użytkownicy mogą tworzyć obrazy o + przemysłowych standardach. Do zarządzania obrazami OCI + wykorzystywane są takie narzędzia Docker oraz dostarczany + wraz z Red Hat podman. Obrazy OCI + korzystają z kontroli wersji, tak więc możemy skorzystać z + niekoniecznie najnowszej wersji, a pobrany obraz może być + wykorzystywany w więcej niż jednym kontenerze. +

+

+ Obrazy konternerów przechowywane są w rejestrach. + Rejestry mogą być prywatne i aby pobrać obraz należy + się zalgować lub mogą być ogólno dostępne, publiczne + i każdy może pobierać z nich obrazy. W internecie dostępnych jest kilka + rejestrów, z czego tylko trzy z nich wykorzystuje się w + RHEL: Red Hat Container Catalog występujący w dwóch + różnych rejestrach + oraz Docker Hub. Przyczym tylko Docker Hub jest + rejestrem publicznym. Obrazy posiadają swoje nazewnictwo, nazwane + FQIN (ang. Full Qualified Image Name). Ta + nazwa składa się czterech części: +

+
    +
  1. Nazwy rejestru
  2. +
  3. Nazwy właściciela/Nazwy organizacji
  4. +
  5. Nazwy repozytorium
  6. +
  7. Wersji (opcjonalnie)
  8. +
+

+ Po złożeniu tych elementów ścieżka może wyglądać w następujący sposób: + nazwa_rejestru/nazwa_organizacji/nazwa_repozytorium:wersja. +

+

+ Kontenery mogą być uruchamiane za równo przez superużytkownika - + mowimy wtedy o kontenerach uprzywilejowanych oraz + przez zwykłych użytkowników - wówczas mówi o kontenerach + nieuprzywilejowanych. Główną różnicą jest brak + możlwości mapowania portów (przekierowania) poniżej portu + 1024. Warto dodać, że uruchamianie kontenerów + uprzywilejowanych może powodować potencjalne problemy z bezpieczeństwem + w systemie. + Kontenery nieuprzywilejowanene dają możliwość interakcji z nimi z + poziomu superużytkownika i jeśli nie będzie takiej potrzeby lepiej + korzystać z tego rodzaju kontenerów. +

+

23.1. Praca z obrazami oraz kontenerami

+

+ Do pracy z kontenerami RHEL dostarcza dwa narzędzia: + wspomniany już wcześniej podman oraz + skopeo. Przyczym wszystkie czynności będą operać się + na wykorzystaniu polecenia podman. Polecenie skopeo + posłuży nam tylko do pobrania bardziej szczegółowych informacji na + temat dostępnego + w rejestrze obrazu. W tym ostatnim rodziale skupimy się na praktyce. + Jeśli będzie trzeba coś dopowiedzieć, zostanie to dopisane podczas + omawiania danej kwestii. Do rozpoczęcia pracy z konterami, potrzebujemy + oprogramowania oraz dostępu do rejestrów Red Hat. Najlepiej + więc zarejestrować tę instalację systemu na koncie firmy + Red Hat, wtedy + bez problemu będziemy mogli zaktualizować system a następnie + zainstalować potrzebne oprogramowanie. +

+

23.1.1. Rejestrowanie systemu Red Hat

+

+ Za pomocą konsoli wirtualne również możemy zarejestrować system w sieci + Red Hat, do tego służy polecenie + subscription-manager wraz z podpoleceniem + register. Polecenie to wydajemy z + podniesieniem uprawnień. Do rejestracji potrzebna jest nazwa + użytkownika (login) podawany podczas logowania do Red Hat, + podajemy ją po opcji --username. Na poniższym przykładzie + przedstawiam składnie polecenia oraz zwracane przez nie informacje +

+
+[xf0r3m@primeb450 ~]$ sudo subscription-manager register --username
+Registering to: subscription.rhsm.redhat.com:443/subscription
+Password: 
+The system has been registered with ID: 12d0865f-3b78-4ce3-93db-b836b50ef879
+The registered system name is: primeb450.morketsmerke.net
+
+

+ Moja nazwa użytkownika została ocenzurowana na tym przykładzie, także + po opcji --username znajduje się + login do sieci Red Hat. Poprawność rejestracji możemy + sprawdzić za pomocą polecenia attach. + Poniżej pokazałem jak to wygląda w przypadku mojego serwera. +

+
+[xf0r3m@primeb450 ~]$ sudo subscription-manager attach
+[sudo] password for xf0r3m: 
+All installed products are covered by valid entitlements. No need to update subscriptions at this time.
+Installed Product Current Status:
+Product Name: Red Hat Enterprise Linux for x86_64
+Status:       Subscribed
+
+

+ Teraz możemy korzystać z repozytoriów sieci Red Hat i na + początek radzę zaktualizować system. Jeśli będziemy korzystać z tego + systemu w celach innych niż testy jego i jego możliwości oraz + zawartości, możemy podłączyć ten system już podczas instalacji. +

+
+[xf0r3m@primeb450 ~]$ sudo dnf update
+[sudo] password for xf0r3m: 
+Updating Subscription Management repositories.
+Red Hat Enterprise Linux 9 for x86_64 - BaseOS (RPMs)                   2.5 MB/s | 3.6 MB     00:01    
+Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs)                6.1 MB/s | 9.2 MB     00:01    
+Dependencies resolved.
+...
+
+

23.1.2. Instalacja oprogramowania kontenerów

+

+ Moduły RHEL 9 nie są jeszcze dostępne. Pojawią się dopiero w + kolejnym mniejszym wydaniu (9.1), ale w repozytoriach znajduje się + pakiet, który wraz z zależnościami odpowiada za obsługę kontenerów + w tej wersji systemu Red Hat. Tym pakietem jest + container-tools. +

+
+[xf0r3m@primeb450 ~]$ sudo dnf install container-tools
+[sudo] password for xf0r3m: 
+Updating Subscription Management repositories.
+Red Hat Enterprise Linux 9 for x86_64 - BaseOS (RPMs)                                        8.2 kB/s | 4.1 kB     00:00    
+Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs)                                      10 kB/s | 4.1 kB     00:00    
+Dependencies resolved.
+============================================================================================================================
+ Package                Architecture       Version                        Repository                                    Size
+============================================================================================================================
+Installing:
+ container-tools        noarch             1-10.el9                       rhel-9-for-x86_64-appstream-rpms             8.7 k
+Installing dependencies:
+ podman-docker          noarch             2:4.1.1-1.el9_0                rhel-9-for-x86_64-appstream-rpms              42 k
+ podman-remote          x86_64             2:4.1.1-1.el9_0                rhel-9-for-x86_64-appstream-rpms             8.1 M
+ python3-podman         noarch             3:4.0.0-1.el9                  rhel-9-for-x86_64-appstream-rpms             171 k
+ python3-pyxdg          noarch             0.27-3.el9                     rhel-9-for-x86_64-appstream-rpms             108 k
+ python3-toml           noarch             0.10.2-6.el9                   rhel-9-for-x86_64-appstream-rpms              46 k
+ skopeo                 x86_64             2:1.8.0-4.el9_0                rhel-9-for-x86_64-appstream-rpms             6.7 M
+ toolbox                x86_64             0.0.99.3-3.el9_0               rhel-9-for-x86_64-appstream-rpms             2.2 M
+ udica                  noarch             0.2.6-4.el9                    rhel-9-for-x86_64-appstream-rpms              54 k
+
+Transaction Summary
+============================================================================================================================
+Install  9 Packages
+
+Total download size: 17 M
+Installed size: 65 M
+Is this ok [y/N]: 
+
+

+ Teraz w systemie dostępne będą takie narzędzia jak podman + oraz skopeo. +

+

23.1.3. Polecenie podman

+

+ Polecenie podman jest podstawowym polecenień związanym + z obsługą kontenerów na RHEL. Za jego pomocą będziemy + wykonywać wiekszość czynności związanych z kontenerami. Poniżej + znajdują się najczęściej wykorzystywane podpolecenia. +

+
    +
  • images - wyświetla listę pobranych obrazów.
  • +
  • pull - pobiera wskazany obraz z rejestru na dysk
  • +
  • rmi - usuwa wskazany obraz.
  • +
  • search - poszukuje obrazów pasujących do podanego + słowa kluczowego.
  • +
  • attach - podłącza powłokę pod uruchomiony kontener.
  • +
  • exec - wykonuje polecenie na uruchomionym + kontenerze.
  • +
  • generate - generuje plik, np. jednostki + systemd pozwalający na kontrolę kontenera jakby był zwykłą + usługą.
  • +
  • ps - wyświetla listę działających kontenerów, + dodanie opcji -a, wyświetli listę zatrzymanych kontenerów.
  • +
  • rm - usuwa kontenery.
  • +
  • run - uruchamiana (instaluje) kontenery, jesli + obraz + kontenera nie istnieje na dysku zostanie pobrany z rejestru. To + podpolecenie posiada kilka opcji, które będziemy poznawać podczas + omawiania konkretnych przypadków uruchamiania kontenerów.
  • +
  • start/stop/restart - podstawowe czynności + wykonywane na konternerach, takie uruchomienie, zatrzymanie czy + ponowne uruchomienie.
  • +
+

+ Odnośnie egzaminu:
+ Zrozumienie przedstawionych wyżej podpoleceń oraz swobodne używanie + polecenia podman jest kluczowe do wykonania zadań związanych + z kontenerami. +

+

23.1.4. Polecenie skopeo

+

+ Polecenie skopeo służy do obsługi obrazów zarówno tych + znajdujących się + na dysku, jak i tych, które znajdują się w rejestrach. Nie mniej jednak + w tym materiale skupimy się tylko na jednym podpoleceniu jakim jest + podpoleceniem inspect, które zwraca szczegóły + na temat obrazu. +

+

23.1.5. Plik registries.conf

+

+ W pliku registries.conf przechowywane są adresy rejestrów, + z których możemy pobierać obrazy kontenerów. Plik znajduje się w + katalogu /etc/containers jest on plikem globalnym, a każdy z + użytkowników może przychowywać swoją kopię pliku w katalogu + ~/.config/containers, ustawienia zawarte w plikach + użytkowników nadpisują + te wartości z pliku globalnego, co może być przydatne w przypadku + kontenerów nieuprzywilejowanych. Poniżej znajduje się zawartości tego + pliku: +

+
+[xf0r3m@primeb450 ~]$ grep -v '^#' /etc/containers/registries.conf 
+
+unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]
+
+short-name-mode = "enforcing"
+
+

+ Plik zawiera masę komentarzy wyjaśniających wiele rzeczy. Nas jednak + będzie interesować wyłącznie pierwsza linia zawierająca adresy + rejestrów. W momencie poszukiwania obrazu polecenie podman + odpytuje rejestry w zapisanej kolejności. Oczywiście jeśli jest taka + potrzeba możemy dopisać swoje prywatne rejestry do tego pliku. +

+

+ Odnośnie egzaminu:
+ Podczas egzaminu nie będzie dostępu do sieci, więc prawdopodbnie będzie + trzeba ustawić rejestr prywatny znajdujący się w sieci egzaminacyjnej. +

+

23.1.6. Informacje nt. konfiguracji kontenerów w systemie

+

+ Pierwszą czynnością jaką poznamy odnośnie kontenerów jest sprawdzenie + konfiguracji programu podman, możemy zrealizować to za pomocą + podpolecenia info. Poniżej znajduje się fragment + wyniku działania tego polecenia: +

+
+[xf0r3m@primeb450 ~]$ podman info
+host:
+  arch: amd64
+  buildahVersion: 1.26.2
+  cgroupControllers:
+  - memory
+  - pids
+  cgroupManager: systemd
+  cgroupVersion: v2
+  conmon:
+    package: conmon-2.1.2-2.el9_0.x86_64
+    path: /usr/bin/conmon
+    version: 'conmon version 2.1.2, commit: 1ed53517f446a779f9d0edafe090ce821a41e255'
+  cpuUtilization:
+    idlePercent: 99.94
+    systemPercent: 0.02
+    userPercent: 0.04
+  cpus: 8
+  distribution:
+    distribution: '"rhel"'
+    version: "9.0"
+  eventLogger: journald
+  hostname: primeb450.morketsmerke.net
+...
+
+

+ Polecenie to zwraca masę informacji od architektury przez informacje + o zużyciu procesora, informacje o dystrybucji po informacje na temat + pakietów odpowiedzialnych za kontenery w systemie oraz miejsce + składowania obrazów. Warto wspomnieć że te informację + mogą się różnić kiedy wydamy to polecenie z sudo, wówczas te + informacje + będą dotyczyć konfiguracji globalnej, przeznaczonej dla kontenerów + uprzywilejowanych. +

+

+ Po za tymi informacjami możemy za pomocą podpolecenia + version zwrócić wersję polecenia podman oraz + kilku dostarczanych wraz z nim składników. +

+
+[xf0r3m@primeb450 ~]$ podman version
+Client:       Podman Engine
+Version:      4.1.1
+API Version:  4.1.1
+Go Version:   go1.17.12
+Built:        Wed Jul 27 16:26:10 2022
+OS/Arch:      linux/amd64
+
+

23.2. Zarządzanie obrazami

+

+ Jedną z podstawowych czynności jakie możemy wykonać w obrębie + kontenerów jest zarządzanie obrazami, czyli: wyszukanie, sprawdzenie + szczegółów, pobranie oraz jego usunięcie. Tym zajmiemy się w tym + podrozdziale. +

+

+ Za pomocą polecenia podman z podpoleceniem search + wyszukamy kontenera systemu bazodanowego MySQL. +

+
+[xf0r3m@primeb450 ~]$ podman search mysql
+registry.redhat.io/rhel8/mysql-80                     This container image provides a containerize...
+registry.redhat.io/rhel9/mysql-80                     rhcc_registry.access.redhat.com_rhel9/mysql-...
+
+

+ Te dwa obrazy wydają się najbardziej trafne. Opisy możemy rozwinąć + dodając opcję --no-trunc. W pierwszej kolumnie wyjścia tego + polecenia znajduje się FQIN w drugiej zaś opis obrazu. Obraz + jest przeznaczony dla rhel9 co możemy + wywnioskować po napisie znajującym się w drugiej części nazwy obrazu. + Aby poznać więcej szczegółów na temat tego obrazu posłużymy się + poleceniem skopeo wraz podpoleceniem inspect. + To polecenie przyjmuje jako argument FQIN poprzedzonym + wskazaniem protokołu Docker (docker://). + Poniżej znajdują się informacje jakie udało się uzyskać poleceniu + skopeo na temat tego obrazu. +

+
+[xf0r3m@primeb450 ~]$ skopeo inspect docker://registry.redhat.io/rhel9/mysql-80
+FATA[0000] Error parsing image name "docker://registry.redhat.io/rhel9/mysql-80": unable to retrieve auth token: invalid username/password: unauthorized: 
+Please login to the Red Hat Registry using your Customer Portal credentials. 
+Further instructions can be found here: https://access.redhat.com/RegistryAuthentication 
+
+

+ Jeśli rejestrowaliśmy system za pomocą polecenia + subscription-manager potrzebne może być zalogowanie się za + do rejestrów. Logowania dokonujemy za pomocą polecenia podman + wraz podpolecenie login oraz polecenia skopeo wraz + podpoleceniem login, przy czym przy poleceniu skopeo + należy podać adres rejestru. +

+
+[xf0r3m@primeb450 ~]$ sudo podman login
+[sudo] password for xf0r3m: 
+Username: 
+Password: 
+Login Succeeded!
+
+[xf0r3m@primeb450 ~]$ skopeo login registry.redhat.io
+Username: 
+Password: 
+Login Succeeded!
+
+

+ Polecenia zapytaja nas o nazwę użytkownika sieci Red Hat oraz + o hasło. Moja nazwa użytkownika została ocenzurowana. Teraz powinniśmy + otrzymać interesujące nas informacje na temat żądanego obrazu. +

+
+[xf0r3m@primeb450 ~]$ skopeo inspect docker://registry.redhat.io/rhel9/mysql-80
+{
+    "Name": "registry.redhat.io/rhel9/mysql-80",
+    "Digest": "sha256:e6dbbce33d195df0380cb5b0207167be1ba45e4fe1229e50fc9d769b928e5cb7",
+    "RepoTags": [
+        "1-190-source",
+        "1-197-source",
+        "1-190.1655192188-source",
+        "1-206",
+        "1",
+        "1-206-source",
+        "1-190.1655192188",
+        "1-197",
+        "1-190",
+        "latest"
+...
+
+

+ Na przykładzie znajduje się tylko fragment, ale to polecenie zwraca + bardzo dużo przydatnych informacji, na przykład przy kluczu + RepoTags znajdują się dostępne wersje + tego obrazu jakie możemy pobrać podając je pod dwukropku na końcu + FQIN, domyślnie pobieraną wersją jest latest. + Inną ciekawą wartością jest klucz usage, który zwraca nam + całe polecenie, za pomocą którego możemy uruchomić ten kontener. +

+

+ Za pomocą podpolecenia pull polecenia podman możemy + pobrać wybrany przez nas obraz. To polecenie wymaga podania + FQIN jako argumentu. Poniżej znajduje się wynik działania tego + polecenia: +

+
+[xf0r3m@primeb450 ~]$ podman pull registry.redhat.io/rhel9/mysql-80
+Trying to pull registry.redhat.io/rhel9/mysql-80:latest...
+Getting image source signatures
+Checking if image destination supports signatures
+Copying blob a021685edffe done  
+Copying blob c6e5292cfd5f done  
+Copying blob bf30f05a2532 done  
+Copying blob f540faa799cb done  
+Copying config 536612cfc7 done  
+Writing manifest to image destination
+Storing signatures
+536612cfc795266464d7828ff38ab12c44a55620174a769243d4cf31edadc8db
+
+

+ A tak przezentuje się obraz na liście obrazów polecenia + podman: +

+
+[xf0r3m@primeb450 ~]$ podman images
+REPOSITORY                         TAG         IMAGE ID      CREATED     SIZE
+registry.redhat.io/rhel9/mysql-80  latest      536612cfc795  7 days ago  558 MB
+
+

+ Aby poznać szczegóły pobranego już obrazu należy skorzystać z + podpolecenia inspect polecenia podman. Jako argument + wystarczy że podamy ostatni człon FQIN w tym przypadku będzie + to: mysql-80. +

+
+[xf0r3m@primeb450 ~]$ podman inspect mysql-80
+[
+     {
+          "Id": "536612cfc795266464d7828ff38ab12c44a55620174a769243d4cf31edadc8db",
+          "Digest": "sha256:e6dbbce33d195df0380cb5b0207167be1ba45e4fe1229e50fc9d769b928e5cb7",
+          "RepoTags": [
+               "registry.redhat.io/rhel9/mysql-80:latest"
+          ],
+...
+
+

+ Jeśli obraz nie będzie nam już potrzebny możemy usunąć go z dysku za + pomocą podpolecenia rmi polecenia podman. Podobnie + jak w przypadku podpolecenia inspect wystarczy, że podamy + ostatnią część FQIN. +

+
+[xf0r3m@primeb450 ~]$ podman rmi mysql-80
+Untagged: registry.redhat.io/rhel9/mysql-80:latest
+Deleted: 536612cfc795266464d7828ff38ab12c44a55620174a769243d4cf31edadc8db
+
+

+ Aby potwierdzić usunięcie obrazu możemy jeszcze raz wyświetlić ich + listę. +

+
+[xf0r3m@primeb450 ~]$ podman images
+REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
+
+

23.3. Podstawy zarządzania kontenerami

+

+ Po opanowaniu obsługi obrazów przyszedł czas na pierwszy kontakt z + kontenerami. Kontenery działają tak długo, jak działa aplikacja dla + której są zbudowane. Trzeba sobie to wyjaśnić. Kontenery możemy + podzielić na te nazwane oraz te + bez nazw. Kontenery bez nazwy są jednorazowe i + czesto usuwane po wykonaniu swojego zadania. Nie mniej jednak w tym + pod rozdziale zajmiemy się zarówno jednym i drugim. Dla kontenerów na + nazwanych wybrałem najnowszą wersję obrazu UBI czyli + uniwersalnej bazy, która służy jako podstawa dla innych kontenerów + zawierających już aplikacje. +

+

23.3.1. Zarządzanie konterami nazwanymi

+

+ Aby uruchomić swój pierwszy kontenery należy na początku upewnić się, + że w systemie w katalogu /etc nie znajduje się katalog + docker. Jego obecność może powodować problemy z uprawnieniami. +

+
+[xf0r3m@primeb450 ~]$ ls -l /etc/docker
+ls: cannot access '/etc/docker': No such file or directory
+
+

+ Kiedy tego katalogu nie ma w systemie możemy przejść do uruchomienia + kontenera za pomocą poniższego polecenia. +

+
+[xf0r3m@primeb450 ~]$ podman run -it --name rhel9-base-os ubi9
+Resolved "ubi9" as an alias (/etc/containers/registries.conf.d/001-rhel-shortnames.conf)
+Trying to pull registry.access.redhat.com/ubi9:latest...
+Getting image source signatures
+Checking if image destination supports signatures
+Copying blob bf30f05a2532 done  
+Copying blob c6e5292cfd5f done  
+Copying config 168c58a383 done  
+Writing manifest to image destination
+Storing signatures
+[root@baf4f328600d /]# 
+
+

+ Za pomocą podpolecenia run uruchomiłem + kontener w trybie interaktywnym (-it). + Kontener nazwałem za pomocą opcji + --name, + został on zbudowany w oparciu o obraz + ubi9, czyli obraz bazowy RHEL + 9. Nazwa obrazu została podana w krótkiej wersji, bez FQIN. + W przypadku innych kontenerów niż tez zbudowane na UBI + nie zaleca się używania tej formy przekazywania nazw obrazów. Polecenie + samo rozwiązało FQIN na podstawie informacji zawartych w + pliku + /etc/containers/registries.conf.d/001-rhel-shortnames.conf. + Po pobraniu obrazu oraz uruchomieniu na jego podstawie kontenera, + została na zwrócona powłoka wewnątrz kontenera. W celach testowych + możemy wykonać kilka podstawowych poleceń: +

+
+[root@baf4f328600d /]# ls
+afs  bin  boot	dev  etc  home	lib  lib64  lost+found	media  mnt  opt  proc  root  run  sbin	srv  sys  tmp  usr  var
+[root@baf4f328600d /]# pwd
+/
+[root@baf4f328600d /]# whoami
+root
+[root@baf4f328600d /]# cat /etc/redhat-release 
+Red Hat Enterprise Linux release 9.0 (Plow)
+[root@baf4f328600d /]# cat /etc/os-release 
+NAME="Red Hat Enterprise Linux"
+VERSION="9.0 (Plow)"
+ID="rhel"
+ID_LIKE="fedora"
+VERSION_ID="9.0"
+PLATFORM_ID="platform:el9"
+PRETTY_NAME="Red Hat Enterprise Linux 9.0 (Plow)"
+ANSI_COLOR="0;31"
+LOGO="fedora-logo-icon"
+CPE_NAME="cpe:/o:redhat:enterprise_linux:9::baseos"
+HOME_URL="https://www.redhat.com/"
+DOCUMENTATION_URL="https://access.redhat.com/documentation/red_hat_enterprise_linux/9/"
+BUG_REPORT_URL="https://bugzilla.redhat.com/"
+
+REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 9"
+REDHAT_BUGZILLA_PRODUCT_VERSION=9.0
+REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
+REDHAT_SUPPORT_PRODUCT_VERSION="9.0"
+
+

+ W znaku zachęty, w miejscu nazwy hosta znajduje się + ciąg znaków przedstawiających identyfikator kontenera. Jeśli opuścimy + powłokę kontenera, zostanie on zatrzymany ponieważ wykonane zostało + jego domyślne zadaniem jakim była obsługa procesu powłoki. Zatem tego + kontenera trzeba szukać na liście zatrzymanych kontenerów. +

+
+[root@baf4f328600d /]# exit
+exit
+[xf0r3m@primeb450 ~]$ podman ps -a
+CONTAINER ID  IMAGE                                   COMMAND     CREATED         STATUS                    PORTS       NAMES
+baf4f328600d  registry.access.redhat.com/ubi9:latest  /bin/bash   14 minutes ago  Exited (0) 9 seconds ago              rhel9-base-os
+[xf0r3m@primeb450 ~]$ 
+
+

+ Kontener ten możemy włączy ponownie, za pomocą podpolecenia + start oraz nazwy kontenera. +

+
+[xf0r3m@primeb450 ~]$ podman start rhel9-base-os 
+rhel9-base-os
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE                                   COMMAND     CREATED         STATUS            PORTS       NAMES
+baf4f328600d  registry.access.redhat.com/ubi9:latest  /bin/bash   16 minutes ago  Up 3 seconds ago              rhel9-base-os
+
+

+ Na kontenerach możemy wykonywać polecenia, bez podłączania się do ich + powłoki, temu celowi służy podpolecenie exec. Wymaga ono + podania nazwy uruchomionego kontenera oraz polecenia. +

+
+[xf0r3m@primeb450 ~]$ podman exec rhel9-base-os cat /etc/redhat-release
+Red Hat Enterprise Linux release 9.0 (Plow)
+
+

+ Jeśli jednak chcielibyśmy podłączyć się do powłoki kontenera, to + wówczas należy użyć podpolecenia attach wraz z nazwą + kontenera. +

+
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE                                   COMMAND     CREATED         STATUS            PORTS       NAMES
+baf4f328600d  registry.access.redhat.com/ubi9:latest  /bin/bash   18 minutes ago  Up 2 minutes ago              rhel9-base-os
+[xf0r3m@primeb450 ~]$ podman attach rhel9-base-os 
+[root@baf4f328600d /]# 
+
+

+ Po opuszczeniu powłoki, kontener zostanie zatrzymany. Jeśli + nie potrzebujemy już w systemie kontenerów, możemy je + usunąć za pomocą podpolecenia rm, przy czym należy upewnić + się, że kontener jest zatrzymany inaczej polecenie niepowiedzie się. +

+
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
+[xf0r3m@primeb450 ~]$ podman rm rhel9-base-os 
+baf4f328600dad7e8fce03d854a6c4e480453679181f97233dccee5ea5a9e5dc
+[xf0r3m@primeb450 ~]$ podman ps -a
+CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
+
+

+ Za pomocą pierwszego wywołania podpolecenia ps upewniłem się, + że kontener nie jest uruchomiony, następnie za pomocą podpolecenia + rm usunąłem kontener. Za pomocą podpolecenia ps z + opcją -a sprawdziłem czy kontener jest rzeczywiście + usunięty. +

+

23.3.2. Zarządzanie kontenerami bez nazw

+

+ Zarządzanie kontenerami bez nazw, jest znacznie prostsze, ponieważ + może zostać sprowadzone do jednego polecenia. Poniżej przedstawiłem w + jaki sposób można uruchomić kontener bez nazwy, aby wykonał proces do + które został stworzony następnie został usunięty z systemu. +

+
+[xf0r3m@primeb450 ~]$ podman run --rm docker.io/library/hello-world
+Trying to pull docker.io/library/hello-world:latest...
+Getting image source signatures
+Copying blob 2db29710123e done  
+Copying config feb5d9fea6 done  
+Writing manifest to image destination
+Storing signatures
+
+Hello from Docker!
+This message shows that your installation appears to be working correctly.
+
+To generate this message, Docker took the following steps:
+ 1. The Docker client contacted the Docker daemon.
+ 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
+    (amd64)
+ 3. The Docker daemon created a new container from that image which runs the
+    executable that produces the output you are currently reading.
+ 4. The Docker daemon streamed that output to the Docker client, which sent it
+    to your terminal.
+
+To try something more ambitious, you can run an Ubuntu container with:
+ $ docker run -it ubuntu bash
+
+Share images, automate workflows, and more with a free Docker ID:
+ https://hub.docker.com/
+
+For more examples and ideas, visit:
+ https://docs.docker.com/get-started/
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
+[xf0r3m@primeb450 ~]$ podman ps -a
+CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
+
+

+ Kontener zwrócił informacje powitalną podobnego systemu kontenerów + jakim jest Docker, następnie został usunięty co zostało + potwierdzone za pomocą dwóch ostatnich poleceń na przykładzie. +

+

23.4. Zaawansowane zarządzanie kontenerami

+

+ Po poznaniu podstaw, możemy przejść do bardziej zaawansowanych + czynności wykonywanych na kontenerach, takich jak mapowanie portów, + przekazywanie zmiennych środowiskowych, katalogu hostującej maszyny + czy zarządania kontenerami z poziomu systemd. +

+

23.4.1. Mapowanie portów hosta na porty kontenera

+

+ Odnośnie egzaminu:
+ Podczas wykonywania tej czynność, należy pamiętać o bardzo ważnej + rzeczy. Mianowicie, kontenery nieuprzywilejowane nie mogą mapować + portów na porty hosta poniżej 1024 portu. +

+

+ Mapowanie portów spowoduje, + że jaki kolwiek ruch sieciowy, który będzie skierowany do określonego + portu hosta zostanie przekierowny do portu kontenera. Tą + czynność wykonuje się poprzez użycie opcji -p + podpolecenia run. Rozważmy poniższym przykład. +

+

+ Na początek pobiorę obraz serwera HTTP. +

+
+[xf0r3m@primeb450 ~]$ podman pull registry.redhat.io/rhel9/httpd-24
+Trying to pull registry.redhat.io/rhel9/httpd-24:latest...
+Getting image source signatures
+...
+
+

+ Następnie na podstawie tego obrazu przygotuje nazwany kontener z + mapowaniem portów. +

+
+[xf0r3m@primeb450 ~]$ podman run -d -p 8080:80 --name rhel9-http-map registry.redhat.io/rhel9/httpd-24
+cdb3fe727ec39de7323da49bb230f2dc22bdc51da43bc48e9218d2eeb09b166b
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE                                     COMMAND               CREATED        STATUS            PORTS                 NAMES
+cdb3fe727ec3  registry.redhat.io/rhel9/httpd-24:latest  /usr/bin/run-http...  3 seconds ago  Up 4 seconds ago  0.0.0.0:8080->80/tcp  rhel9-http-map
+
+

+ Za pomocą -d kontener zostaje + odłączony od terminala i kontynuje pracę w tle. Przyczym ma to + zastosowanie wyłącznie w przypadku programów, które oczekują na + połączenia od innych np. demonów. + Teraz ruch przychodzący na port 8080 hosta zostanie + przekierowany do kontenera. Mapowania widać w kolumnie + PORTS. Mapowania możemy zobrazować + lepiej za pomocą podpolecenia port polecenia podman, + przy czym to podpolecenie wymaga podania nazwy kontenera. +

+
+[xf0r3m@primeb450 ~]$ podman port rhel9-http-map 
+80/tcp -> 0.0.0.0:8080
+
+

+ Na koniec usunąłem ten kontener, za pomocą poniższych poleceń. +

+
+[xf0r3m@primeb450 ~]$ podman stop rhel9-http-map 
+rhel9-http-map
+[xf0r3m@primeb450 ~]$ podman rm rhel9-http-map 
+cdb3fe727ec39de7323da49bb230f2dc22bdc51da43bc48e9218d2eeb09b166b
+
+

23.4.2. Przekazywanie zmiennych środowiskowych do kontenerów

+

+ Nie które z konteneryzowanych aplikacji wymagają podania od użytkownika + pewnych parametrów do uruchomienia. Te parametry przekazuje + się za pomocą zmiennych środowiskowych, a są one przezkazywane za + pomocą opcji -e podpolecenia run. +

+

+ Odnośnie egzaminu:
+ Warto dodać, że przekazanie każdej wartości do kontenera wymaga podania + opcji -e. +

+

+ Dobrze obrazuje to poniższy przykład. +

+
+[xf0r3m@primeb450 ~]$ podman run -dt -e VAR1="test1" -e VAR2="test2" --name rhel9-cont-env ubi9
+13a244c2d73d2d604591ebbdf2112e222392f3f046b90e220e55397888cae80a
+[xf0r3m@primeb450 ~]$ podman exec rhel9-cont-env env
+TERM=xterm
+container=oci
+VAR1=test1
+VAR2=test2
+PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+HOME=/root
+
+

+ Za pomocą opcji -dt umożliwiłem + działanie powłoki w tle (głownym procesem obrazów UBI jest + powłoka). Przy użyciu opcji -e + przekazałem do kontenera przedstawione na przykładzie zmienne + środowiskowe. W drugim poleceniu używając podpolecenia + exec uruchomiłem na kontenerze + polecenie env, które zwraca zmienne + środowiskowe. Jak wskazuje wynik działania tego polecenia, przekazane + przez nas wartości są obecne w środowisku kontenera jako zmienne + środowiskowe. Teraz możemy zatrzymać i usunąć ten kontener. +

+
+[xf0r3m@primeb450 ~]$ podman stop rhel9-cont-env 
+rhel9-cont-env
+[xf0r3m@primeb450 ~]$ podman rm rhel9-cont-env 
+13a244c2d73d2d604591ebbdf2112e222392f3f046b90e220e55397888cae80a
+
+

23.4.3. Konfigurowanie miejsca na dane dla kontenerów

+

+ Kontenery działają tak długo, jak długo działa główny proces. Kiedy on + kończy swoje działanie, tak i kontener zostaje zatrzymany. Zatrzymanie + albo restart kontenera powodują utratę wszystkich wytworzonych przez + niego danych. Jeśli te dane mogą być potrzebne, to należy zaopatrzyć + kontenery w miejsce gdzie będą mogły je składować. + Takim miejscem może być katalog znajdujący się gdzieś na hoście. +

+

+ Odnośnie egzaminu:
+ Konfigurując taki katalog należy pamiętać o trzech czynnościach jakie + należy wykonać: 1. Odpowiednie uprawnienia, w przykładach będę stosować + raczej pełnych uprawnień, tj. 777; 2. Prawo własności, jeśli jest to + kontener nieuprzywilejowany to włascicielem oraz grupą, do której ten + katalog należy powinien być użytkownik, który uruchamia kontener; + 3. Właściwy typ pliku SELinux, tej wartości nie trzeba + konfigurować ręcznie, wystarczy że podamy na koniec wartości + przekazywania katalogu + opcję :Z, spowoduje ona samodzielne przypisanie + odpowiedniego kontesktu SELinux. +

+

+ Chcąc zobrazować jak może wyglądać takie przekazanie katalogu. + Czynności należy rozpocząć od utworzenia katalogu, nadania mu + odpowiednich uprawnień oraz prawa własności. +

+
+[xf0r3m@primeb450 ~]$ sudo mkdir /host_dir
+[sudo] password for xf0r3m: 
+[xf0r3m@primeb450 ~]$ sudo chmod 777 /host_dir/
+[xf0r3m@primeb450 ~]$ sudo chown xf0r3m:xf0r3m /host_dir/
+
+

+ Następnie uruchomie kontener przekazując ten katalog jako katalog + /container_dir w głównym systemie plików kontenera. +

+
+[xf0r3m@primeb450 ~]$ podman run -dt --name rhel9-persistent-data -v /host_dir:/container_dir:Z ubi9
+96e45fa0558c0d2da216de2c91747aae1fc177301ea58eb81571f200f8022fb2
+
+

+ Za pomocą opcji -v dokonujemy + przekazania katalogu do kontenera. Zwróćmy uwagę na dodatkową opcję + :Z, powoduje ona dobranie + odpowiedniego kontekstu SELinux. Teraz podłącze się pod + kontener aby sprawdzić uprawnienia przekazanego katalogu, kontekst + SELinux oraz to czy możemy przechowywać w nim dane. +

+
+[root@96e45fa0558c /]# ls -l 
+total 0
+dr-xr-xr-x.   2 root   root     6 Aug  9  2021 afs
+lrwxrwxrwx.   1 root   root     7 Aug  9  2021 bin -> usr/bin
+dr-xr-xr-x.   2 root   root     6 Aug  9  2021 boot
+drwxrwxrwx.   2 root   root     6 Aug 11 11:52 container_dir
+...
+[root@96e45fa0558c /]# cd container_dir/
+[root@96e45fa0558c container_dir]# echo "This is a test message!" > test_file.txt
+[root@96e45fa0558c container_dir]# ls -ldZ /container_dir
+drwxrwxrwx. 2 root root system_u:object_r:container_file_t:s0:c417,c733 27 Aug 11 11:55 /container_dir
+[root@96e45fa0558c container_dir]# ls -lZ /container_dir/
+total 4
+-rw-r--r--. 1 root root system_u:object_r:container_file_t:s0:c417,c733 24 Aug 11 11:55 test_file.txt
+
+

+ Jak możemy zauważyć na powyższym przykładzie katalog przekazany do + kontenera znajduje się w katalogu głównym tak jak to zostało zapisane + podczas jego utworzenia. Następnie sprawdziłem czy da się utworzyć + jakiś plik z zawartością w tym katalogu. Po wydaniu polecenia + echo powłoka nie zwróciła żadnego + błędu więc można było przypuszczać, że zapis do pliku powiódł się. + Na koniec jeszcze sprawdziłem konteskt SELinux. Po zamknięciu + powłoki, sprawdziłem czy utworzony plik znajduje się w katalogu + przeznaczonym dla kontenera oraz plik posiada wcześniej zapisaną + zawartość. Możemy się o tym przekonać analizując poniższy przykład: +

+
+[xf0r3m@primeb450 ~]$ ls -l /host_dir/
+total 4
+-rw-r--r--. 1 xf0r3m xf0r3m 24 Aug 11 13:55 test_file.txt
+[xf0r3m@primeb450 ~]$ cat /host_dir/test_file.txt 
+This is a test message!
+
+

+ Jak widzimy wszystko zadziałało. Teraz możemy usunąć ten kontener. +

+

23.4.4. Kontrolowanie kontenerów przez systemd

+

+ Jeśli konterów w systemie jest bardzo wiele, łatwiej jest nimi zarządać + za pomocą programu typu init, jakim jest systemd. + Za pomocą podpolecenia generate polecenia podman, + możemy wygenerować pliki jednostki usługi, dla każdego kontenera i + zarządzać nimi jak usługami. Tego typu funkcja ma jedną bardzo ważną + cechę przez co jest dość mocno wykorzystywana, mianowicie + automatyczne uruchomienie kontenerów podczas startu systemu. Przy + okazji tego zagadnienia również zauważymy różnicę między kontenerami + nieuprzywilejowanymi oraz uprzyprzywilejowanymi, ponieważ przekazanie + ich kontroli do systemd wygląda nieco inaczej. +

+

+ Kontenery uprzywilejowane: +

+

+ Na początku konfiguracji potrzebujemy kontenera. Utwórzmy prosty + kontener na bazie UBI. +

+
+[xf0r3m@primeb450 ~]$ sudo podman run -dt --name rhel9-cont-systemd ubi9
+[sudo] password for xf0r3m: 
+Resolved "ubi9" as an alias (/etc/containers/registries.conf.d/001-rhel-shortnames.conf)
+Trying to pull registry.access.redhat.com/ubi9:latest...
+Getting image source signatures
+Checking if image destination supports signatures
+Copying blob bf30f05a2532 done  
+Copying blob c6e5292cfd5f done  
+Copying config 168c58a383 done  
+Writing manifest to image destination
+Storing signatures
+d9ef99614a37c58d55edbca805cbc4da5bd99dae9c1674ed3c336893dbe901d6
+
+

+ Nie ma się co dziwić jeśli polecenie to pobierze jeszcze raz obraz. + Wynika to z tego, że konfiguracja kontenerów nieuprzywilejowanych i + tych uprzywilejowanych jest zupełnie inna, te kontenery również mają + oddzielny katalog, który przechowuje ich obrazy. Po utworzeniu katalogu + generujemy plik jednostki, zapisujemy go katalogu konfiguracji + lokalnej /etc/systemd/system. +

+
+sudo podman generate systemd --new rhel9-cont-systemd | sudo tee /etc/systemd/system/rhel9-cont-systemd.service
+
+

+ Podpolecenie generate wymaga podania typu generowanego pliku + w tym przypadku jest systemd. Użyłem + tutaj również opcji --new, co powoduje + za każdym startem utworzenie nowego kontenera. Wynik musiałem + przepuścić przez polecenie tee, + ponieważ przy użyciu operatora przekierowania nie damy rady zapisać + nic w tej + lokalizacji. Po utworzeniu tego pliku możemy załadować plik jednostki + i kontrolować kontener z poziomu systemd. +

+
+[xf0r3m@primeb450 ~]$ sudo systemctl daemon-reload 
+[sudo] password for xf0r3m: 
+[xf0r3m@primeb450 ~]$ sudo systemctl enable --now rhel9-cont-systemd.service
+Created symlink /etc/systemd/system/default.target.wants/rhel9-cont-systemd.service → /etc/systemd/system/rhel9-cont-systemd.service.
+[xf0r3m@primeb450 ~]$ sudo systemctl status rhel9-cont-systemd.service --no-pager
+● rhel9-cont-systemd.service - Podman container-d9ef99614a37c58d55edbca805cbc4da5bd99dae9c1674ed3c336893dbe901d6.service
+     Loaded: loaded (/etc/systemd/system/rhel9-cont-systemd.service; enabled; vendor preset: disabled)
+     Active: active (running) since Thu 2022-08-11 14:44:32 CEST; 12s ago
+       Docs: man:podman-generate-systemd(1)
+    Process: 9123 ExecStartPre=/bin/rm -f /run/rhel9-cont-systemd.service.ctr-id (code=exited, status=0/SUCCESS)
+   Main PID: 9294 (conmon)
+      Tasks: 2 (limit: 48032)
+     Memory: 980.0K
+        CPU: 246ms
+     CGroup: /system.slice/rhel9-cont-systemd.service
+             └─9294 /usr/bin/conmon --api-version 1 -c fa9a83e06b6c9b75b64c69d80925b67e6d7458f3de5d78075b180bb2da0156fb -u fa9a83e06…
+
+[xf0r3m@primeb450 ~]$ sudo podman ps
+CONTAINER ID  IMAGE                                   COMMAND     CREATED         STATUS             PORTS       NAMES
+fa9a83e06b6c  registry.access.redhat.com/ubi9:latest  /bin/bash   37 seconds ago  Up 37 seconds ago              rhel9-cont-systemd
+
+

+ Teraz możemy kontenery zatrzymywać oraz uruchamiać ponownie z poziomu + polecenia systemctl. Zatrzymanie kontenera z tego poziomu + spowoduje jego usunięcie z systemu. Utworzony plik usługi można + traktować wówczas jako pliki szablonu dla kontenerów. +

+

+ Kontenery nieuprzywilejowane: +

+

+ W przypadku tego rodzaju kontenerów sprawa się dodatkowo komplikuje + z powodu tego, iż kontenery są zatrzymywane w momencie wylogowania się + użytkownika. Jednak w tym przypadku stosuje się sztuczkę, która + powoduje pojawienia się użytkownika jeśli tylko jest potrzebny. Ta + metoda nazywana jest lingering. Inną komplikacją jest + fakt, że do obsługi systemd z poziomu zwykłego użytkownika, + musi być on zalogowany albo fizycznie, albo za pomocą SSH, nie może być + to przełączony użytkownik za pomocą poleceń sudo lub + su. +

+

+ Czynności tym razem zaczniemy od utworzenia katalogu + ~/.config/systemd/user oraz włączenia lingeringu. +

+
+[xf0r3m@primeb450 ~]$ mkdir -p ~/.config/systemd/user
+[xf0r3m@primeb450 ~]$ loginctl enable-linger
+
+

+ Lingering włącza się za pomocą pojedynczego polecenia, wiec + nie jest jakoś zbytnio skomplikowane, a naprawdę robi robotę. Teraz + możemy przejść do utworzenia kontenera. +

+
+[xf0r3m@primeb450 ~]$ podman run -dt --name rhel9-unpriv-cont-systemd ubi9
+fbe3ab11d3728470f1fcd38f07b99bd7e151ac2fc0c4a6a8dad85c486c3bce60
+
+

+ Tego przykładu chyba nie muszę tłumaczyć. Teraz wygeneruje plik + jednostki dla tego kontenera w utworzonym wcześniej katalogu. +

+
+podman generate systemd --new rhel9-unpriv-cont-systemd > ~/.config/systemd/user/rhel9-unpriv-cont-systemd.service
+
+

+ Teraz mogłem użyć przekierowania, ponieważ cały czas działam w obrębie + tych samych uprawnień. Teraz załaduje plik jednostki i uruchomię + nowy kontener, tutaj też użyłem opcji + --new. +

+
+[xf0r3m@primeb450 ~]$ systemctl --user daemon-reload 
+[xf0r3m@primeb450 ~]$ systemctl --user enable --now rhel9-unpriv-cont-systemd.service 
+Created symlink /home/xf0r3m/.config/systemd/user/default.target.wants/rhel9-unpriv-cont-systemd.service → /home/xf0r3m/.config/systemd/user/rhel9-unpriv-cont-systemd.service.
+[xf0r3m@primeb450 ~]$ systemctl --user status rhel9-unpriv-cont-systemd.service --no-pager
+● rhel9-unpriv-cont-systemd.service - Podman container-fbe3ab11d3728470f1fcd38f07b99bd7e151ac2fc0c4a6a8dad85c486c3bce60.service
+     Loaded: loaded (/home/xf0r3m/.config/systemd/user/rhel9-unpriv-cont-systemd.service; enabled; vendor preset: disabled)
+     Active: active (running) since Thu 2022-08-11 15:02:52 CEST; 31s ago
+       Docs: man:podman-generate-systemd(1)
+    Process: 9876 ExecStartPre=/bin/rm -f /run/user/1000/rhel9-unpriv-cont-systemd.service.ctr-id (code=exited, status=0/SUCCESS)
+   Main PID: 9914 (conmon)
+      Tasks: 3 (limit: 48032)
+     Memory: 1.4M
+        CPU: 211ms
+     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/rhel9-unpriv-cont-systemd.service
+             ├─9910 /usr/bin/slirp4netns --disable-host-loopback --mtu=65520 --enable-sandbox --enable-seccomp --enable-ipv6 -c -e 3…
+             └─9914 /usr/bin/conmon --api-version 1 -c 73435f815694db611703dca5e48b52321f95849de15e6ac3cd2859f469a2d116 -u 73435f815…
+
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE                                   COMMAND     CREATED         STATUS             PORTS       NAMES
+73435f815694  registry.access.redhat.com/ubi9:latest  /bin/bash   42 seconds ago  Up 43 seconds ago              rhel9-unpriv-cont-systemd
+
+

+ Jak widzimy na przykładzie kontener został uruchomiony, teraz uruchomie + go ponownie za pomocą polecenia systemctl. +

+
+[xf0r3m@primeb450 ~]$ systemctl --user restart rhel9-unpriv-cont-systemd.service 
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE                                   COMMAND     CREATED        STATUS            PORTS       NAMES
+810555dd08f1  registry.access.redhat.com/ubi9:latest  /bin/bash   3 seconds ago  Up 4 seconds ago              rhel9-unpriv-cont-systemd
+[xf0r3m@primeb450 ~]$ systemctl --user restart rhel9-unpriv-cont-systemd.service && podman ps
+CONTAINER ID  IMAGE                                   COMMAND     CREATED                 STATUS                     PORTS       NAMES
+433ac061577e  registry.access.redhat.com/ubi9:latest  /bin/bash   Less than a second ago  Up Less than a second ago              rhel9-unpriv-cont-systemd
+
+

+ Różne identyfikatory kontenerów w pierwszej kolumnie, wyjścia polecenia + podman ps wskazuje, że za każdym + ponownym aktywowaniem jednostki, tworzony jest nowy kontener. Po + wylogowaniu i zalogowaniu się ponownie, kontener nadal działa, co + oznacza, że lingering jest dobrze skonfigurowany. +

+
+[xf0r3m@primeb450 ~]$ exit
+logout
+Connection to 192.168.8.7 closed.
+[xf0r3m@latitude-e5270 ~]$ ssh 192.168.8.7
+xf0r3m@192.168.8.7's password: 
+Activate the web console with: systemctl enable --now cockpit.socket
+
+Register this system with Red Hat Insights: insights-client --register
+Create an account or view all your systems at https://red.ht/insights-dashboard
+Last login: Thu Aug 11 08:37:43 2022 from 192.168.8.168
+[xf0r3m@primeb450 ~]$ podman ps
+CONTAINER ID  IMAGE                                   COMMAND     CREATED        STATUS            PORTS       NAMES
+433ac061577e  registry.access.redhat.com/ubi9:latest  /bin/bash   3 minutes ago  Up 3 minutes ago              rhel9-unpriv-cont-systemd
+
+

Ćwiczenie 1: Utwórzenie laboratorium kontenerów

+

+ Na fizycznym komputerze lub maszynie wirtualne, zainstaluj system + RHEL 9, zarejestruj go w sieci Red Hat podczas + instalacji oraz utwórz użytkownika z uprawnieniami administratora. Po + zainstalowaniu systemu zaktualizuj go i zainstaluj + niezbędne oprogramowanie do obsługi kontenerów w systemie. Wykonanie + tego ćwiczenia jest niezbędne do wykonania pozostałych. +

+

Ćwiczenie 2: Nazwany kontener z mapowaniem portów

+

+ W laboratorium kontenerów, utworz uprzywilejowany kontener z mapowaniem + portu 80:8080 oraz dowolną nazwą. Do tworzenia kontenera wykorzystaj + obraz UBI + dla RHEL 7. Wykonaj kilka poleceń takich jak: ls, pwd, df, + cat /etc/redhat-release oraz cat /etc/os-release. + Sprawdź mapowanie portów. Nie usuwaj jeszcze tego kontenera. +

+

Ćwiczenie 3: Kontener bez nazwy z przekazanymi zmiennymi

+

+ W laboratorium kontenerów, na podstawie UBI dla RHEL + 8 utwórz nieuprzywilejowany kontener bez nazwy + z przekazaniem dwóch zmiennych VAR1="lab1" oraz + VAR2="lab2". Działanie kontenera powinno polegać na + wyświetleniu zmiennych środowiskowych, a kontener powinien zostać + usunięty po skończeniu zadania. + Na koniec usuń także obraz UBI dla RHEL 8. +

+

Ćwiczenie 4: Kontener ze stałym miejscem przechowywania

+

+ W laboratorium kontenerów, utwórz katalog o nazwie /host_perm1 + wraz z plikiem str1 przeznaczony na stałe miejsce dla danych + kontenera uprzywilejowanego, następnie na podstawie UBI dla + RHEL 9 utwórz kontener o nazwie priv-cont-str + przekazując do niego ten katalog pod punkt montowania + /cont_perm1. + Przez powłokę kontenera sprawdź uprawnienia przekazanego katalogu oraz + obecność pliku, następnie utwórz w nim dodatkowy podkatalog. + Opuść powłokę kontenera i na + hoście sprawdź obecność utworzonego podkatalogu. Na koniec + usuń kontener oraz utworzony na potrzeby tego ćwiczenia katalog. +

+

Ćwiczenie 5: Kontener z przekazywaniem portów, zmiennymi oraz stałym miejscem przechowywania

+

+ W laboratorium kontenerów, utworz katalog o nazwie /host_perm2 + na stałe miejsce przechowywania dla kontenera nieuprzywilejowanego, + na podstawie UBI dla RHEL 9 utwórz kontener o nazwie + rootless-adv-cont w trybie interaktywym przekaż do niego dwie + zmienne HISTSIZE=100 oraz MYNAME=RedHat zmapuj + port hosta 9000 na port 8080 kontenera, przekaż wcześniej utworzony + katalog pod punkt montowania /cont_perm2, sprawdź zmienne + oraz punkt montowania, następie opuść powłokę i sprawdź czy mapowanie + portów było prawidłowe. Nie usuwaj tego kontenera jeszcze. +

+

Ćwiczenie 6: Konfigracja kontroli systemd nad kontenerami uprzywilejowanymi

+

+ Korzystając z kontenera z ćwiczenia drugiego, w laboratorium + kontenerów skonfiguruj kontrolę tego kontenera przez systemd. + Aby potwierdzić działanie konfiguracji zrestartuj system. +

+

Ćwiczenie 7: Konfigracja kontroli systemd nad kontenerami nieuprzywilejowanymi

+

+ Korzystając z kontenera z ćwiczenia piątego, w laboratorum + kontenerów skonfiguruj kontrolę tego kontenera przez systemd, + zwróć uwagę na to iż jest to kontener nieuprzywilejowany. Aby + potwierdzić działanie konfiguracji zrestartuj system. +

+

Podsumowanie

+

+ W tym ostatnim już rozdziale zapoznaliśmy się technikami + kontenerów w RHEL. Poznalismy niezbędną wiedzę teoretyczną + oraz narzędzia potrzebne w praktyce. Poznaliśmy wiele przypadków + praktycznej obsługi kontenerów, od przekazywania portów do przekazania + kontroli nad konterami do programu typu init, jakim jest + systemd zapoznaliśmy się też z konfiguracją plików jednostek + użytkownika. Ten rozdział zamyka ten materiał. Jeśli chcemy więcej + technologii Red Hat, możemy przystąpić + kolejnego certyfikatu po zdaniu RHCSA. Powodzenia! +

+
+
+ + diff --git a/articles/terminallog/cwiczenia_python.html b/articles/terminallog/cwiczenia_python.html new file mode 100755 index 0000000..8d24684 --- /dev/null +++ b/articles/terminallog/cwiczenia_python.html @@ -0,0 +1,1799 @@ + + + + + + + + + +
+
+

Python. Ćwiczenia.

+
    +
  1. Część I - Python. + +
  2. +
  3. Część II - Aplikacje internetowe + +
  4. +
+

+ Źródła: +

+
    +
  1. Python. Instrukcje dla programisty. Wydanie II, + Eric Matthes Helion @ 2020
  2. +
+ +
+
+
+
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ +
+

Część I - Python.

+

+ Uwaga! Poniższy zbiór cwiczeń został skopiowany + bezpośrednio z ksiązki (poz. 1 w źródłach) z sekcji + ZRÓB TO SAM. +

+ +

Rozdział 1:

+

1.1. Witryna python.org

+

+ Zapoznaj się ze stroną domową Pythona (http://python.org/) + i spróbuj wyszukać interesujące Cię tematy. Gdy zdobędziesz + nieco więcej doświadczenia w programowaniu w Pythonie, poszczególne części + tej witryny staną się dla Ciebie znacznie użyteczniejsze. +

+

1.2. Błędy w programie typu „Witaj, świecie!”

+

+ Otwórz utworzony w tym + rozdziale plik hello_world.py. Wprowadź dowolny błąd w wierszu kodu, + a następnie uruchom program. Czy potrafisz wprowadzić zmianę powodującą + wygenerowanie komunikatu błędu? Czy ten komunikat błędu ma dla Ciebie sens? + Czy potrafisz wprowadzić zmianę niepowodującą wygenerowania błędu? Na + jakiej podstawie uważasz, że ta zmiana nie jest błędem? +

+

1.3. Niczym nieograniczone umiejętności

+

+ Gdybyś posiadał nieograniczone + umiejętności w zakresie programowania, jaki program byś stworzył? Dzięki tej + książce masz nauczyć się programować. Jeżeli będziesz miał na uwadze pewien + cel, który sam sobie wyznaczysz, zyskasz możliwość częściowego + wykorzystania nowo nabytych umiejętności. Teraz jest więc doskonały moment + na określenie tego, co chciałbyś stworzyć. Dobrym rozwiązaniem jest + prowadzenie dziennika „idei”, do którego będziesz mógł się odwoływać, + rozpoczynając pracę nad nowym projektem. Poświęć kilka minut na opisanie + trzech programów, które chciałbyś stworzyć. +

+

Rozdział 2:

+

+ Utwórz oddzielne programy dla każdego z poniższych ćwiczeń. Poszczególne + programy umieszczaj w plikach o nazwach zgodnych ze standardowymi konwencjami + Pythona, czyli zawierających jedynie małe litery i znaki + podkreślenia, na przykład prosty_komunikat.py i + proste_komunikaty.py. +

+

2.1. Prosty komunikat

+

+ Umieść komunikat w zmiennej, a następnie wyświetl go. +

+

2.2. Proste komunikaty

+

+ Umieść komunikat w zmiennej, a następnie go + wyświetl. Później zmień wartość zmiennej tak, aby zawierała inny komunikat, + i ten nowy komunikat również wyświetl. +

+

2.3. Osobiste powitanie

+

+ Zapisz w zmiennej imię osoby, a następnie wyświetl + dla niej komunikat powitania. Komunikat powinien być prosty, na przykład + „Witaj, Eryk! Czy chcesz dzisiaj poznawać Pythona?”. +

+

2.4. Wielkość liter w imionach

+

+ Zapisz w zmiennej imię osoby, a następnie + wyświetl je za pomocą małych liter, wielkich liter oraz z użyciem wielkiej + litery jako pierwszej litery imienia. +

+

2.5. Sławny cytat

+

+ Odszukaj cytat sławnej osoby, którą cenisz. Wyświetl ten + cytat wraz z imieniem i nazwiskiem jego autora. Wygenerowane dane wyjściowe + powinny wyglądać tak, jak pokazałem poniżej, łącznie ze znakami cytowania: + Albert Einstein powiedział kiedyś: + "Osoba, która nigdy nie popełniła błędu, + jest kimś, kto nigdy nie próbował niczego nowego". +

+

2.6. Sławny cytat 2

+

+ Powtórz ćwiczenie 2.5, ale tym razem imię i nazwisko + autora cytatu umieść w zmiennej o nazwie famous_person. Następnie + przygotuj komunikat i umieść go w nowej zmiennej o nazwie message. + Na koniec wyświetl komunikat. +

+

2.7. Usunięcie białych znaków z imienia

+

+ Zapisz w zmiennej imię osoby + wraz z pewnymi białymi znakami na początku i końcu imienia. Upewnij się, + że co najmniej raz użyłeś sekwencji \t i \n. +

+

+ Wyświetl to imię wraz ze znakami odstępu. Następnie wyświetl je jeszcze trzy + razy, ale za każdym razem wykorzystaj jedną z metod przeznaczonych do + usuwania białych znaków: lstrip(), rstrip() i + strip(). +

+

2.8. Liczba osiem

+

+ Zapisz operacje dodawania, odejmowania, mnożenia i + dzielenia, których wynikiem będzie liczba 8. Upewnij się, że użyłeś funkcji + print(), aby wyświetlić wyniki. Powinieneś utworzyć cztery wiersze, + które będą wyglądały tak jak ten poniżej: +

+
+print(5 + 3)
+
+

+ Wygenerowane dane wyjściowe powinny składać się po prostu z czterech wierszy + wraz z liczbą 8 pojawiającą się jednokrotnie w każdym z nich. +

+

2.9. Ulubiona liczba

+

+ Umieść w zmiennej ulubioną liczbę. Następnie + używając tej zmiennej, utwórz komunikat ujawniający tę ulubioną liczbę. + Wyświetl ten komunikat. +

+

2.10. Dodawanie komentarzy

+

+ Wybierz dwa utworzone dotąd programy + i umieść w nich przynajmniej po jednym komentarzu. Jeżeli nie masz nic + ciekawego do napisania z powodu prostoty dotychczasowych programów, wpisz + na początku pliku po prostu imię i datę. Następnie dodaj jedno zdanie + opisujące przeznaczenie danego programu. +

+

2.11. Zen Pythona

+

+ Wydaj polecenie import this w powłoce + Pythona i przejrzyj + reguły, które nie zostały przedstawione w tym rozdziale. +

+

Rozdział 3:

+

+ Wypróbuj poniższe krótkie programy, aby zdobyć nieco doświadczenia w pracy + z listami Pythona. Możesz utworzyć nowy katalog dla ćwiczeń w poszczególnych + rozdziałach, aby tym samym trochę je uporządkować. +

+

3.1. Imiona

+

+ Utwórz listę o nazwie names i umieść na niej imiona kilku + przyjaciół. Wyświetl wszystkie imiona przez uzyskanie dostępu do + poszczególnych elementów listy (za każdym razem do jednego). +

+

3.2. Powitania

+

+ Rozpocznij od listy utworzonej w ćwiczeniu 3.1, ale zamiast + samego imiona osoby wyświetl komunikat, który będzie jej dotyczył. Tekst + wszystkich komunikatów powinien pozostać taki sam, ale mają być one + spersonalizowane dzięki wykorzystaniu imienia konkretnej osoby. +

+

3.3. Twoja własna lista

+

+ Zastanów się nad ulubionymi środkami transportu, + na przykład motocykl lub samochód, a następnie utwórz listę przechowującą + wiele przykładów. Wykorzystaj tę listę do wyświetlenia kilku zdań o jej + elementach, na przykład „Chciałbym mieć motocykl Honda”. +

+

3.4. Lista gości

+

+ Jeżeli mógłbyś zaprosić kogokolwiek na obiad, żyjącego lub + nieżyjącego, to kogo byś zaprosił? Utwórz listę zawierającą przynajmniej + trzy osoby, które chciałbyś zaprosić na obiad. Następnie wykorzystaj tę + listę do wyświetlenia dla każdej z tych osób komunikatu zapraszającego ją + na obiad. +

+

3.5. Zmiana listy gości

+

+Dowiedziałeś się, że jedna z zaproszonych osób nie +może przyjść na obiad. Konieczne jest więc wysłanie następnych zaproszeń. +Zastanów się, kogo w takim razie jeszcze zaprosisz. +

+

    +
  • Pracę rozpocznij od programu utworzonego w ćwiczeniu 3.4. Na jego + końcu umieść polecenie print() wyświetlające komunikat z + informacją, który z zaproszonych gości nie może przyjść.
  • +
  • Zmodyfikuj listę i dane gościa, który nie będzie mógł przybyć na obiad, + zastąp danymi nowej zaproszonej osoby.
  • +
  • Wyświetl drugi zestaw komunikatów z zaproszeniem, po jednym + komunikacie dla każdej osoby znajdującej się na liście.
  • +
+

3.6. Więcej gości

+

+Znalazłeś większy stół, co oznacza więcej miejsca dla +gości. Zastanów się więc nad jeszcze trzema osobami, które mógłbyś zaprosić +na obiad. +

+
    +
  • Pracę rozpocznij od programu utworzonego w ćwiczeniach 3.4 i 3.5. + Na jego końcu umieść polecenie print() wyświetlające komunikat o + znalezieniu większego stołu.
  • +
  • Za pomocą metody insert() dodaj nowego gościa na początku listy.
  • +
  • Za pomocą metody insert() dodaj nowego gościa w środku listy.
  • +
  • Za pomocą metody append() dodaj nowego gościa na końcu listy.
  • +
  • Wyświetl nowy zestaw komunikatów z zaproszeniem, po jednym + komunikacie dla każdej osoby znajdującej się na liście.
  • +
+

3.7. Kurcząca się lista gości

+

+Okazało się, że większy stół nie zostanie +dostarczony na czas i dlatego masz miejsce dla jedynie dwóch gości. +

+
    +
  • Pracę rozpocznij od programu utworzonego w ćwiczeniu 3.6. Dodaj + nowy wiersz wyświetlający komunikat, że na obiad możesz zaprosić + tylko dwie osoby.
  • +
  • Za pomocą metody pop() usuwaj po jednym gościu z listy, aż + zostaną na niej tylko dwie osoby. Po usunięciu każdej osoby wyświetlaj + przeznaczony dla niej komunikat z przeprosinami za brak możliwości + zaproszenia jej na obiad
  • +
  • Obu osobom pozostałym na liście wyświetl spersonalizowany komunikat + z zaproszeniem na obiad.
  • +
  • Użyj polecenia del do usunięcia dwóch ostatnich osób z listy, + która w ten sposób powinna stać się pusta. Na koniec wyświetl listę, aby + upewnić się, że faktycznie jest pusta.
  • +
+

3.8. Zwiedzaj świat

+

+Pomyśl o pięciu miejscach na świecie, które chciałbyś +odwiedzić. +

+ +

3.9. Goście na obiad

+

+Pracę rozpocznij od jednego z programów utworzonych w +ćwiczeniach od 3.4 do 3.7. Za pomocą funkcji len() wyświetl komunikat +wskazujący liczbę osób, które zostały zaproszone na obiad. +

+ +

3.10. Każda funkcja.

+

+Zastanów się, jakie informacje mógłbyś umieścić na +liście. Na przykład utwórz listę gór, rzek, państw, miast, języków lub +czegokolwiek innego. Przygotuj program, który będzie tworzył listę +przechowującą te informacje i używał co najmniej jeden raz każdej funkcji +wprowadzonej w tym rozdziale. +

+

3.11. Celowy błąd

+

+Jeżeli jeszcze w żadnym z tworzonych programów nie +spotkałeś się z błędem indeksu, spróbuj go teraz wywołać. W dowolnym +programie tak zmień wartość indeksu, aby nastąpiło zgłoszenie błędu indeksu. +Zanim zamkniesz plik programu, upewnij się, że usunąłeś błąd. +

+

Rozdział 4:

+

4.1. Pizza

+

+Pomyśl o przynajmniej trzech rodzajach pizzy. Umieść te nazwy +na liście, a następnie wyświetl je za pomocą pętli for. +

+
    +
  • Zmodyfikuj pętlę for w taki sposób, aby zamiast samej nazwy + pizzy + wyświetlała zdanie wykorzystujące tę nazwę. Dla każdego rodzaju pizzy + powinieneś mieć jeden wiersz danych wyjściowych zawierający proste + zdanie w stylu: „Lubię pizzę pepperoni”.
  • +
  • Poza blokiem pętli, na końcu programu dodaj zdanie informujące o tym, + jak bardzo lubisz pizzę. Wygenerowane dane wyjściowe powinny więc + składać się z co najmniej trzech zdań o Twoich ulubionych rodzajach + pizzy oraz jednego zdania dodatkowego w stylu: „Naprawdę uwielbiam + pizzę!”.
  • +
+

4.2. Zwierzęta

+

+Spróbuj znaleźć trzy różne zwierzęta charakteryzujące się +podobnymi cechami. Umieść ich nazwy na liście, a następnie wyświetl je za +pomocą pętli for. +

+
    +
  • Zmodyfikuj program w taki sposób, aby wyświetlał zdanie dotyczące danego + zwierzęcia, na przykład „Pies jest prawdziwym przyjacielem człowieka. +
  • +
  • Na końcu programu umieść zdanie wskazujące na jakieś podobieństwo + między wymienionymi wcześniej zwierzętami. To może być zdanie w stylu: + „Wszystkie wymienione powyżej zwierzęta są wspaniałe!”.
  • +
+

4.3. Odliczanie do dwudziestu

+

+Użyj pętli for do wyświetlenia liczb od 1 do +20 włącznie. +

+

4.4. Milion

+

+Utwórz listę liczb od jednego do miliona, a następnie wyświetl +ją za pomocą pętli for. (Jeżeli proces wyświetlania danych +wyjściowych trwa zbyt długo, zatrzymaj go przez naciśnięcie klawiszy +Ctrl+C lub po +prostu przez zamknięcie okna danych wyjściowych). +

+

4.5. Sumowanie do miliona

+

+Utwórz listę liczb od jednego do miliona, a następnie za pomocą funkcji +min() i max() sprawdź, czy lista faktycznie zaczyna +się od wartości jeden i kończy na milionie. Ponadto wykorzystaj funkcję +sum(), aby zobaczyć, jak szybko Python może dodać milion +liczb. +

+

4.6. Listy nieparzyste

+

+Za pomocą trzeciego argumentu funkcji range() utwórz +listę liczb nieparzystych z zakresu od 1 do 20, a następnie wyświetl je za +pomocą pętli for. +

+

4.7. Trzy

+

+Utwórz listę liczb od 3 do 30 podniesionych do trzeciej potęgi, +a następnie wyświetl zawartość listy za pomocą pętli for. +

+

4.8. Sześcian

+

+Liczba podniesiona do trzeciej potęgi jest nazywana +sześcianem. Na przykład sześcian liczby 2 jest zapisywany w Pythonie +jako +2**3. Utwórz listę pierwszych dziesięciu sześcianów (to znaczy liczb od 1 +do 10 podniesionych do trzeciej potęgi), a następnie wyświetl je za pomocą +pętli for. +

+

4.9. Sześcian za pomocą listy składanej

+

+Wykorzystaj listę składaną do +wygenerowania listy pierwszych dziesięciu sześcianów. +

+

4.10. Wycinki

+

+Pracę rozpocznij od jednego z programów utworzonych w tym +rozdziale, a następnie na końcu dodaj kilka wierszy kodu wykonujących +wymienione poniżej zadania: +

+
    +
  • Wyświetlenie komunikatu „Pierwsze trzy elementy listy to:”. Następnie + za pomocą wycinka wyświetl trzy pierwsze elementy listy.
  • +
  • Wyświetlenie komunikatu „Trzy elementy w środku listy to:”. Następnie + za pomocą wycinka wyświetl trzy elementy znajdujące się w środku listy. +
  • +
  • Wyświetlenie komunikatu „Ostatnie trzy elementy listy to:”. Następnie + za pomocą wycinka wyświetl trzy ostatnie elementy listy.
  • +
+

4.11. Moja pizza, Twoja pizza

+

+Pracę rozpocznij od programu utworzonego +w ćwiczeniu 4.1 we wcześniejszej części rozdziału. Utwórz kopię listy z +pizzami i nadaj jej nazwę friend_pizzas. Teraz wykonaj wymienione +poniżej zadania: +

+
    +
  • Dodaj nową pizzę do listy początkowej.
  • +
  • Dodaj pizzę (inną niż w poprzednim punkcie) do listy + friend_pizzas.
  • +
  • Sprawdź, czy faktycznie masz dwie oddzielne listy. Wyświetl komunikat + „Moje ulubione rodzaje pizzy to:”, a następnie użyj pętli for + do wyświetlenia zawartości pierwszej listy. Teraz wyświetl komunikat + „Ulubione rodzaje pizzy mojego przyjaciela to:” i za pomocą pętli + for + wyświetl zawartość drugiej listy. Upewnij się, że każda nowa pizza + została umieszczona na odpowiedniej liście.
  • +
+

4.12. Więcej pętli

+

+We wszystkich programach foods.py przedstawionych w tym +rozdziale unikałem użycia pętli for, aby zaoszczędzić nieco miejsca. +Wybierz +dowolną wersję programu foods.py, a następnie utwórz dwie pętle +for w celu wyświetlenie obu list potraw. +

+

4.13. Bufet

+

+Restauracja w stylu bufetu oferuje jedynie pięć prostych +potraw. Wymień więc pięć prostych potraw i umieść je w krotce. +

+
    +
  • Za pomocą pętli for wyświetl wszystkie potrawy oferowane przez + restaurację.
  • +
  • Spróbuj zmodyfikować jeden z elementów i upewnij się, że Python + odrzucił tę zmianę.
  • +
  • Restauracja zmienia menu i zastępuje dwie dotychczasowe potrawy + nowymi. Dodaj blok kodu nadpisujący krotkę, a następnie wykorzystaj + pętlę for do wyświetlenia wszystkich potraw ze zmodyfikowanego + menu.
  • +
+

4.14. Specyfikacja PEP 8

+

+Przejrzyj specyfikację PEP 8, którą znajdziesz na +stronie https://www.python.org/dev/peps/pep-0008/. W tym momencie +niewiele z niej skorzystasz, ale i tak warto ją przynajmniej przejrzeć. +

+

4.15. Przegląd kodu

+

+Wybierz trzy dowolne programy z tych, które przygoto- +wałeś w tym rozdziale, a następnie zmodyfikuj je, aby stały się zgodne z +PEP 8. +

+ +

Rozdział 5:

+

5.1. Testy warunkowe

+

+Utwórz serię testów warunkowych. Wyświetl +polecenia opisujące poszczególne testy oraz przewidywany wynik. Przygotowany +przez Ciebie kod powinien być podobny do poniższego: +

+
+car = 'subaru'
+print("Czy car == 'subaru'? Przewiduję wartość True.")
+print(car == 'subaru')
+print("\nCzy car == 'audi'? Przewiduję wartość False.")
+print(car == 'audi')
+
+
    +
  • Przyjrzyj się dokładnie uzyskanym wynikom i upewnij się, że zrozumiałeś, + dlaczego wartością danego testu jest True lub False. +
  • +
  • Utwórz przynajmniej 10 testów. Niech co najmniej pięć z nich przyjmuje + wartość True, a kolejne pięć wartość False.
  • +
+

5.2. Więcej testów warunkowych.

+

+Nie musisz ograniczać się tylko do 10 +testów. Jeżeli chcesz wypróbować inne porównania, utwórz następne testy +i umieść je w pliku conditional_tests.py. Powinieneś otrzymać co +najmniej po jednym wyniku True i False dla wymienionych +poniżej testów: +

+
    +
  • Sprawdzenie równości i nierówności ciągów tekstowych.
  • +
  • Test z użyciem funkcji lower().
  • +
  • Testy liczbowe obejmujące sprawdzenie równości i nierówności, operacje + większy niż i mniejszy niż, a także większy niż lub równy i mniejszy niż + lub równy.
  • +
  • Testy wykorzystujące słowa kluczowe and i or.
  • +
  • Sprawdzanie, czy element znajduje się na liście.
  • +
  • Sprawdzanie, czy element nie znajduje się na liście.
  • +
+

5.3. Kolory obcych, część 1.

+

+Wyobraź sobie zestrzelenie obcego w grze. +Utwórz zmienną o nazwie alien_color i przypisz jej wartość 'zielony', +'żółty' lub 'czerwony'. +

+ +

5.4. Kolory obcych, część 2

+

+Podobnie jak w ćwiczeniu 5.3 wybierz kolor dla +obcego, a następnie utwórz konstrukcję if-else. +

+ +

5.5. Kolory obcych, część 3

+

+Przygotowaną w ćwiczeniu 5.4 konstrukcję +if-else zastąp konstrukcją if-elif-else. +

+
    +
  • Jeżeli kolor obcego to zielony, wyświetl komunikat informujący gracza, + że zarobił pięć punktów za zestrzelenie tego obcego.
  • +
  • Jeżeli kolor obcego to żółty, wyświetl komunikat informujący gracza, + że zarobił dziesięć punktów za zestrzelenie tego obcego.
  • +
  • Jeżeli kolor obcego to czerwony, wyświetl komunikat informujący gracza, + że zarobił piętnaście punktów za zestrzelenie tego obcego.
  • +
  • Przygotuj trzy wersje programu i upewnij się, że każdy komunikat + zostanie wyświetlony dla odpowiedniego koloru zestrzelonego obcego.
  • +
+

5.6. Etapy życia

+

+Przygotuj konstrukcję if-else ustalającą etap życia danej +osoby. Przypisz wartość zmiennej age, a następnie: +

+
    +
  • Jeżeli osoba ma mniej niż 2 lata, wyświetl komunikat informujący, że + jest niemowlęciem.
  • +
  • Jeżeli osoba ma co najmniej 2 lata, ale mniej niż 4, wyświetl komunikat + informujący, że jest dzieckiem, które uczy się chodzić.
  • +
  • Jeżeli osoba ma co najmniej 4 lata, ale mniej niż 13, wyświetl komunikat + informujący, że jest dzieckiem.
  • +
  • Jeżeli osoba ma co najmniej 13 lat, ale mniej niż 20, wyświetl komunikat + informujący, że jest nastolatkiem.
  • +
  • Jeżeli osoba ma co najmniej 20 lat, ale mniej niż 65, wyświetl komunikat + informujący, że jest dorosłym.
  • +
  • Jeżeli osoba ma co najmniej 65 lat, wyświetl komunikat informujący, że + jest seniorem.
  • +
+

5.7. Ulubione owoce

+

+Przygotuj listę ulubionych owoców. Następnie utwórz +serię niezależnych poleceń if sprawdzających obecność określonych +owoców na liście. +

+
    +
  • Utwórz listę o nazwie favorite_fruits i umieść na niej trzy + ulubione owoce.
  • +
  • Utwórz pięć poleceń if. Każde powinno sprawdzać obecność na + liście + określonego rodzaju owocu. Jeżeli owoc znajduje się na liście, w bloku + if należy wyświetlić komunikat w stylu: + „Naprawdę lubisz banany!”.
  • +
+

5.8. Witaj, administratorze

. +

+Przygotuj listę przynajmniej pięciu nazw +użytkowników, zawierającą między innymi nazwę admin. Wyobraź sobie, że +tworzysz kod odpowiedzialny za powitanie użytkownika po jego zalogowaniu się +w witrynie internetowej. Przeprowadź iterację przez pętlę i dla każdego +użytkownika wyświetl powitanie. +

+
    +
  • Jeżeli nazwa użytkownika to admin, wyświetl powitanie + specjalne w stylu: + „Witaj, admin! Czy chcesz przejrzeć dzisiejszy raport?”. +
  • +
  • Dla pozostałych użytkowników wyświetl zwykłe powitanie w stylu: + „Witaj, Eryk! Dziękujemy, że ponownie się zalogowałeś”. +
  • +
+

5.9. Brak użytkowników

+

+Do przygotowanego w poprzednim ćwiczeniu pliku +hello_admin.py dodaj polecenie if sprawdzające, czy lista +użytkowników nie jest pusta. +

+
    +
  • Jeżeli lista jest pusta, wyświetl komunikat w stylu: „Musimy znaleźć + jakichś użytkowników!”.
  • +
  • Usuń wszystkich użytkowników z listy i upewnij się, że powyższy + komunikat został prawidłowo wyświetlony.
  • +
+

5.10. Sprawdzanie nazw użytkowników

+

+Wykonaj poniższe działania w celu +utworzenia programu symulującego sposób, w jaki witryna internetowa gwa- +rantuje, że każdy użytkownik będzie miał unikatową nazwę. +

+
    +
  • Utwórz listę o nazwie current_users i umieść na niej + przynajmniej pięć nazw użytkowników.
  • +
  • Utwórz kolejną listę o nazwie new_users. Upewnij się, że + przynajmniej + jedna nazwa użytkownika z nowej listy znajduje się także na liście + current_users.
  • +
  • Przeprowadź iterację przez nową listę, aby sprawdzić, czy dana nazwa + użytkownika została już wcześniej użyta. Jeśli tak, wyświetl + użytkownikowi komunikat o konieczności wyboru innej nazwy. Natomiast + jeśli dana nazwa użytkownika nie została wcześniej użyta, wyświetl + użytkownikowi komunikat informujący o możliwości jej wykorzystania.
  • +
  • Upewnij się, że w trakcie porównywania nazw użytkowników wielkość + liter nie ma znaczenia. Jeżeli wcześniej użyto nazwy 'Janek', nowy + użytkownik nie może wybrać dla siebie nazwy 'JANEK'. (To wymaga + utworzenia kopii listy current_users zawierającej zapisane + małymi literami nazwy wszystkich użytkowników).
  • +
+

5.11. Liczby porządkowe

+Liczby porządkowe wskazują położenie elementu +na liście, na przykład pierwszy, drugi, trzeci. W języku angielskim +większość tego rodzaju liczb kończy się na th, poza liczbami 1, 2 i 3. + +
    +
  • Utwórz listę przechowującą liczby od 1 do 9.
  • +
  • Przeprowadź iterację przez listę.
  • +
  • Wykorzystaj konstrukcję if-elif-else wewnątrz pętli do + prawidłowego + wyświetlenia liczb porządkowych w języku angielskim. Wygenerowane + dane wyjściowe powinny mieć postać + 1st, 2nd, 3rd, 4th, 5th, 6th, 7th, 8th, 9thi + a każda liczba powinna znajdować się w osobnym wierszu.
  • +
+

5.12. Nadanie stylu konstrukcji if

+

+Przejrzyj programy utworzone w tym +rozdziale i upewnij się, że zastosowałeś w nich odpowiednie formatowanie +testów warunkowych. +

+

5.13. Twoje pomysły

+

+Na tym etapie masz już znacznie większe możliwości +w zakresie programowania niż na początku książki. Powinieneś już wyraźniej +dostrzegać, jak rzeczywiste sytuacje mogą być modelowane w programach. +Możesz więc zastanowić się nad problemami, które chciałbyś rozwiązywać +we własnych programach. Zanotuj nowe idee dotyczące problemów, które +chciałbyś rozwiązać, gdy zdobędziesz jeszcze większe umiejętności w +zakresie programowania. Zastanów się nad grami, które chciałbyś stworzyć, +zbiorami danych, które chciałbyś przeanalizować, lub aplikacjami +internetowymi, które chciałbyś zbudować. +

+

Rozdział 6:

+

6.1. Osoba

+

+Wykorzystaj słownik do przechowywania informacji o znanej Ci +osobie. W słowniku powinny znaleźć się informacje takie jak imię, nazwisko, +wiek i miasto zamieszkania. Powinieneś więc utworzyć klucze +first_name, +last_name, age i city. Następnie wyświetl wszystkie +informacje przechowywane w słowniku. +

+

6.2. Ulubione liczby

+

+Wykorzystaj słownik do przechowywania ulubionych liczb +różnych osób. Weź pod uwagę pięć osób i ich imion użyj w charakterze kluczy +słownika. Następnie ustal ich ulubione liczby i umieść je w słowniku, +przypisując każdej osobie po jednej liczbie. Wyświetl imiona wszystkich osób +i ich ulubione liczby. Jeżeli chcesz mieć więcej frajdy podczas wykonywania +tego ćwiczenia, zapytaj przyjaciół o ich ulubione liczby i umieść w +programie rzeczywiste dane. +

+

6.3. Glosariusz

+

+Słownik Pythona można wykorzystać do przygotowania rzeczy- +wistego słownika. Jednak w celu uniknięcia niejasności nazwiemy go glosa- +riuszem. +

+
    +
  • Wypisz sobie pięć słów z dziedziny programowania, które poznałeś + we wcześniejszych rozdziałach. Te słowa będą kluczami w glosariuszu, + natomiast wartościami będą znaczenia poszczególnych słów.
  • +
  • Każde słowo i jego znaczenie wyświetl w postaci elegancko + sformatowanych danych wyjściowych. Możesz w jednym wierszu + wyświetlić słowo, dwukropek i później wyjaśnienie danego słowa. + Ewentualnie słowo umieść w jednym wierszu, a jego wyjaśnienie + w następnym, wciętym wierszu. Do wstawienia pustego wiersza między + parami słowo-definicja użyj znaku nowego wiersza (\n).
  • +
+

6.4. Glosariusz 2

+

+Skoro już wiesz, jak można przeprowadzić iterację przez +słownik, to zmodyfikuj kod ćwiczenia 6.3 z wcześniejszej części rozdziału. +Zastąp serię wywołań print() pętlą przeprowadzającą iterację przez +klucze i +wartości słownika. Po upewnieniu się, że pętla działa prawidłowo, do +glosariusza dodaj kolejnych pięć terminów związanych z Pythonem. +Kiedy +ponownie uruchomisz program, nowo dodane terminy i ich definicje powinny +zostać automatycznie uwzględnione w wyświetlonych danych wyjściowych. +

+

6.5. Rzeki

+

+Utwórz słownik zawierający trzy ważne rzeki oraz kraje, przez +które one płyną. Jedna z par klucz-wartość może mieć postać 'nil': 'egipt'. +

+ +

6.6. Ankieta

+

+Użyj kodu znajdującego się w programie favorite_languages.py, +utworzonym nieco wcześniej w tym rozdziale. +

+
    +
  • Utwórz listę osób, które powinny wziąć udział w ankiecie dotyczącej + ulubionego języka programowania. Umieść na niej pewne osoby, które + już znajdują się w słowniku, oraz te, które jeszcze nie zostały zapisane + w słowniku
  • +
  • Przeprowadź iterację przez listę osób, które powinny wziąć udział + w ankiecie. Jeżeli dana osoba już wzięła udział w ankiecie, wyświetl + komunikat z podziękowaniem za jej zaangażowanie. Natomiast jeśli + dana osoba jeszcze nie udzieliła odpowiedzi w ankiecie, wyświetl + komunikat z zaproszeniem do wzięcia w niej udziału.
  • +
+

6.7. Osoby.

+

+Pracę rozpocznij od programu stworzonego w ćwiczeniu 6.1 we +wcześniejszej części rozdziału. Utwórz dwa nowe słowniki przedstawiające +różne osoby, a następnie wszystkie trzy słowniki umieść na liście o nazwie +people. Przeprowadź iterację przez listę osób i wyświetl wszystkie +informacje o poszczególnych osobach. +

+

6.8. Zwierzęta.

+Utwórz kilka słowników i nadaj im nazwy zwierząt. W +poszczególnych słownikach umieść informacje o zwierzętach będących ich +właścicielami. Następnie te słowniki powinny znaleźć się na liście o nazwie +pets. Teraz przeprowadź iterację przez listę i wyświetl wszystkie +informacje o poszczególnych zwierzętach. + + +

6.9. Ulubione miejsca.

+

+Utwórz słownik o nazwie favorite_places. Pomyśl +o trzech imionach i użyj ich jako kluczy słownika. Każdej osobie przypisz +po trzy ulubione miejsca. Aby ćwiczenie stało się jeszcze bardziej +interesujące, możesz poprosić przyjaciół o podanie ulubionych miejsc. +Przeprowadź iterację przez słownik i wyświetl imiona wszystkich osób oraz +ich ulubione miejsca. +

+ +

6.10. Ulubione liczby

+

+Zmodyfikuj program utworzony w ćwiczeniu 6.2 we +wcześniejszej części rozdziału. Po zmianach każda osoba może mieć więcej niż +tylko jedną ulubioną liczbę. Wyświetl wszystkie osoby oraz ich ulubione +liczby. +

+ +

Rozdział 7:

+

7.1. Wypożyczenie samochodu

+

+Utwórz program, który pyta użytkownika, +jakiej marki samochód chciałby wypożyczyć. Następnie wyświetl komunikat +wraz z podaną nazwą samochodu, na przykład: „Chwileczkę, sprawdzę, czy +mamy dostępny samochód Subaru”. +

+

7.2. Stolik w restauracji

+

+Utwórz program pytający klienta, na ile osób chce +zarezerwować stolik. Jeżeli odpowiedzią jest liczba większa niż 8, +powinieneś wyświetlić komunikat o konieczności zaczekania na stolik. W +przeciwnym razie poinformuj klienta, że stolik jest gotowy. +

+

7.3. Wielokrotność dziesięciu

+

+Poproś użytkownika o podanie dowolnej liczby, +a następnie sprawdź, czy jest ona wielokrotnością liczby 10. +

+

7.4. Dodatki do pizzy

+

+Utwórz pętlę proszącą użytkownika o podanie serii +dodatków do pizzy. Działanie pętli powinno zostać zakończone, kiedy zostanie +wpisane słowo 'koniec'. Gdy użytkownik będzie podawał kolejne dodatki, +pętla powinna wyświetlać komunikat o dodaniu danego składnika do pizzy. +

+

7.5. Bilety do kina

+

+Cena biletu do kina jest uzależniona od wieku widza. +Jeżeli widz ma poniżej 3 lat, bilet jest bezpłatny. Dla dzieci w wieku od 3 +do 12 lat bilet kosztuje 10 zł. Dla osób wieku powyżej 12 lat cena biletu +wynosi 15 zł. Utwórz pętlę proszącą użytkownika o podanie wieku, a następnie +na podstawie otrzymanych danych wyświetl komunikat zawierający prawidłową +cenę biletu. +

+

7.6. Trzy wyjścia.

+

+Przygotuj trzy różne wersje ćwiczenia 7.4 lub 7.5, z +których każde będzie przynajmniej raz wykonywać poniższe zadania: +

+ +

7.7. Nieskończoność

+

+Utwórz pętlę działającą w nieskończoność i uruchom +ją. (W celu zakończenia tej pętli naciśnij klawisze Ctrl+C lub zamknij okno +terminala wyświetlającego dane wyjściowe programu). +

+

7.8. Bar

+

+Przygotuj listę o nazwie sandwich_orders i umieść na niej nazwy +różnych kanapek. Następnie przygotuj pustą listę o nazwie +finished_sandwiches. Przeprowadź iterację przez listę zamówionych +kanapek i +wyświetl informację o danym zamówieniu, na przykład: „Przygotowano kanapkę z +tuńczykiem”. Kiedy kanapka zostanie zrobiona, reprezentujący ją element +powinien zostać przeniesiony na listę finished_sandwiches. Gdy lista +sandwich_orders będzie już pusta, wyświetl komunikat zawierający listę +wszystkich zrobionych kanapek. +

+

7.9. Brak pastrami

+

+Wykorzystaj listę sandwich_orders z ćwiczenia 7.8 i +upewnij się, że na liście przynajmniej trzykrotnie pojawia się kanapka z +pastrami. Gdzieś na początku programu umieść kod wyświetlający komunikat, +że w barze skończyło się pastrami, a następnie za pomocą pętli while +usuń +wszystkie wystąpienia pastrami z listy sandwich_orders. +Upewnij się, że żadna kanapka z pastrami nie zostanie umieszczona na liście +finished_sandwiches. +

+

7.10. Wymarzone wakacje

+

+Przygotuj program pytający użytkowników o ich +wymarzone wakacje. Program powinien wyświetlać pytanie w stylu: „Jeżeli +mógłbyś odwiedzić jedno dowolne miejsce na świecie, gdzie byś pojechał?”. +Umieść w programie blok kodu odpowiedzialny za wyświetlenie wyników +przeprowadzonej ankiety. +

+

Rozdział 8:

+

8.1. Komunikat

+

+Utwórz funkcję o nazwie display_messages() wyświetlającą +jedno zdanie informujące o tym, czego się uczysz w tym rozdziale. Wywołaj +przygotowaną funkcję i upewnij się, że komunikat został prawidłowo +wyświetlony. +

+

8.2. Ulubiona książka

+

+Utwórz funkcję o nazwie favorite_book(), która akcep- +tuje jeden parametr title. Ta funkcja powinna wyświetlać komunikat w +stylu: +„Jedną z moich ulubionych książek jest Alicja w krainie czarów”. Wywołaj tę +funkcję i upewnij się, że podałeś tytuł książki jako argument. +

+

8.3. T-shirt

+

+Utwórz funkcję o nazwie make_shirt(), akceptującą wielkość +koszulki oraz tekst, który ma zostać na niej nadrukowany. Funkcja powinna +wyświetlić zdanie zawierające informacje dotyczące zamówionej koszulki: jej +rozmiar i tekst do wydrukowania na niej. +W trakcie pierwszego wywołania funkcji do przygotowania koszulki zastosuj +argumenty pozycyjne. Natomiast w trakcie drugiego wywołania użyj argumen- +tów w postaci słów kluczowych. +

+

8.4. Duże koszulki

+

+Zmodyfikuj funkcję make_shirt() tak, aby domyślnie były +przygotowywane duże koszulki z nadrukowanym tekstem „Uwielbiam Pythona”. +Utwórz koszulki w rozmiarze dużym i średnim (obie z domyślnym tekstem) oraz +koszulkę w dowolnym rozmiarze i z innym tekstem nadrukowanym na niej. +

+

8.5. Miasta

+

+Utwórz funkcję o nazwie describe_city(), akceptującą nazwę +miasta i kraju. Ta funkcja powinna wyświetlać proste zdanie, takie jak +„Warszawa leży w Polsce”. Parametrowi przechowującemu nazwę państwa przypisz +wartość domyślną. Przygotowaną funkcję wywołaj dla trzech różnych +miast, z których przynajmniej jedno nie powinno być położone w domyślnie +zdefiniowanym kraju. +

+

8.6. Nazwy miast

+

+Utwórz funkcję o nazwie city_country() pobierającą nazwę +miasta i kraju, w którym ono leży. Wartością zwrotną funkcji powinien być +ciąg tekstowy sformatowany w poniższy sposób: +Santiago, Chile +Przygotowaną funkcję wywołaj z przynajmniej trzema parami miasto-państwo +i wyświetl wygenerowaną przez nie wartość. +

+

8.7. Album

+

+Utwórz funkcję o nazwie make_album() odpowiedzialną za +zbudowanie słownika reprezentującego album muzyczny. Funkcja powinna pobrać +nazwę zespołu lub artysty oraz tytuł albumu. Wartością zwrotną funkcji +powinien być słownik zawierający te dwa fragmenty informacji. Za pomocą +przygotowanej funkcji utwórz trzy słowniki przedstawiające różne albumy. +Wyświetl każdą wartość zwrotną, aby pokazać, że słowniki prawidłowo +przechowują informacje o albumach. +Wykorzystując wartość specjalną None, do funkcji +make_album() dodaj +opcjonalny parametr pozwalający na przechowywanie liczby utworów +znajdujących się na płycie. Jeżeli wywołanie funkcji będzie zawierało +wartość dla liczby utworów, należy ją dodać do słownika informacji o +albumie. Zdefiniuj co najmniej jedno nowe wywołanie funkcji obejmujące +także liczbę utworów na płycie. +

+

8.8. Albumy użytkowników

+

+Pracę rozpocznij od programu utworzonego +w ćwiczeniu 8.7. Dodaj pętlę while pozwalającą użytkownikom na wprowa- +dzenie artysty i tytułu płyty. Po zebraniu tych informacji wywołaj funkcję +make_album() wraz z podanymi przez użytkownika danymi wejściowymi oraz +wyświetl słownik utworzony przez program. Upewnij się, że zdefiniowałeś war- +tość pozwalającą opuścić pętlę while. +

+

8.9. Komunikaty

+

+Przygotuj listę zawierającą serię krótkich komunikatów, +a następnie przekaż ją do funkcji o nazwie show_messages(), która +powinna wyświetlić każdy komunikat umieszczony na tej liście. +

+

8.10. Wysyłanie komunikatów

+

+Pracę rozpocznij od kopii programu z ćwiczenia 8.9. +Następnie utwórz funkcję o nazwie send_messages(), której zadaniem +będzie wyświetlenie wszystkich komunikatów, a następnie przeniesienie +ich na nową listę o nazwie sent_messages. Po wywołaniu funkcji należy +wyświetlić obie listy i upewnić się o prawidłowym przeniesieniu komunikatów. +

+

8.11. Zarchiwizowane komunikaty

+

+Pracę rozpocznij od kodu utworzonego +w ćwiczeniu 8.10. Wywołaj funkcję send_messages() wraz z kopią listy +komunikatów. Po wywołaniu funkcji wyświetl obie listy, aby pokazać istnienie +pierwotnej listy z zachowanymi komunikatami. +

+

8.12. Kanapki

+

+Utwórz funkcję akceptującą listę składników, które klient +chce umieścić w zamawianej kanapce. Funkcja powinna zawierać jeden parametr +przechowujący dowolną liczbę argumentów przekazanych w wywołaniu +funkcji oraz wyświetlać podsumowanie dotyczące zamówionej kanapki. +Przygotowaną funkcję wywołaj trzykrotnie, za każdym razem z inną liczbą +argumentów. +

+

8.13. Profil użytkownika

+

+Pracę rozpocznij od kopii programu user_profile.py +utworzonego nieco wcześniej w tym rozdziale. Przygotuj własny profil przez +wywołanie funkcji build_profile(), podaj imię, nazwisko oraz trzy +inne pary +klucz-wartość, które Cię opisują. +

+

8.14. Samochody

+

+Utwórz funkcję przechowującą w słowniku informacje +o samochodzie. Ta funkcja zawsze powinna otrzymywać nazwy marki i modelu +pojazdu, po którym można podać dowolną liczbę argumentów w postaci +słów kluczowych. Wywołaj funkcję zawierającą wymagane informacje oraz +dwie dodatkowe pary nazwa-wartość, na przykład opisujące kolor i +wyposażenie dodatkowe. Przygotowana funkcja powinna być wywoływana w sposób +podobny do przedstawionego poniżej: +

+
+car = make_car('subaru', 'outback', color='blue', tow_package=True)
+
+

+Wyświetl zawartość słownika zwróconego przez tę funkcję i upewnij się, że +wszystkie podane informacje zostały w nim prawidłowo zapisane. +

+

8.15. Wydruk modeli

+

+Funkcje z programu print_models.py umieść w +oddzielnym pliku o nazwie printing_functions.py. Na początku pliku +print_models.py umieść polecenie import i zmodyfikuj plik w +taki sposób, aby używać zaimportowanych funkcji. +

+

8.16. Polecenia importu

+

+Wykorzystaj utworzony przez siebie program z jedną +funkcją i przenieś ją do oddzielnego pliku. Zaimportuj tę funkcję w pliku +programu głównego, a następnie wywołaj funkcję na wszystkie wymienione poni- +żej sposoby: +

+
+import nazwa_modułu
+from nazwa_modułu import nazwa_funkcji
+from nazwa_modułu import nazwa_funkcji as fn
+import nazwa_modułu as mn
+from nazwa_modułu import *
+
+

8.17. Nadanie stylu funkcjom

+

+Wybierz trzy dowolne programy utworzone +w tym rozdziale i upewnij się, że są w nich stosowane przedstawione w tym +podrozdziale konwencje dotyczące nadawania stylu funkcjom. +

+

Rozdział 9:

+

9.1. Restauracja

+

+Przygotuj klasę o nazwie Restaurant. Metoda __init__() +w klasie Restaurant powinna przechowywać dwa atrybuty: +restaurant_name +i cuisine_type. Utwórz metodę o nazwie describe_restaurant() +wyświetlającą +te dwa fragmenty informacji oraz metodę o nazwie open_restaurant() +wyświetlającą informacje o godzinach pracy restauracji. +Na podstawie przygotowanej klasy utwórz egzemplarz restaurant. +Wyświetl oddzielnie oba atrybuty, a następnie wywołaj obie metody. +

+

9.2. Trzy restauracje

+

+Pracę rozpocznij od klasy opracowanej w ćwiczeniu +9.1. Utwórz trzy różne egzemplarze na podstawie tej klasy, a następnie +wywołaj metodę describe_restaurant() dla każdego egzemplarza. +

+

9.3. Użytkownicy

+

+Przygotuj klasę o nazwie User. Zdefiniuj w niej dwa +atrybuty (first_name i last_name), a następnie utwórz kilka innych +atrybutów, które +zwykle są przechowywane w profilu użytkownika. Zdefiniuj metodę o nazwie +describe_user(), wyświetlającą podsumowanie informacji zebranych o +użytkowniku. Utwórz jeszcze drugą metodę o nazwie greet_user(), która +będzie +wyświetlała użytkownikowi spersonalizowane powitanie. +Utwórz kilka egzemplarzy reprezentujących różnych użytkowników, a +następnie dla każdego z nich wywołaj obie metody. +

+

9.4. Liczba obsłużonych

+

+Pracę rozpocznij od programu utworzonego w +ćwiczeniu 9.1. Dodaj atrybut o nazwie number_served o wartości +domyślnej 0. +Następnie na podstawie klasy utwórz egzemplarz o nazwie restaurant. +Wyświetl +liczbę klientów obsłużonych przez restaurację, zmień tę wartość i później +wyświetl nową. +Dodaj metodę o nazwie set_number_served(), pozwalającą na +zdefiniowanie liczby obsłużonych klientów. Wywołaj tę metodę wraz z różnymi +wartościami i je wyświetl. +Dodaj metodę o nazwie increment_number_served(), pozwalającą na +inkrementację wartości wskazującej na liczbę obsłużonych klientów. Wywołaj +tę +metodę dowolną ilość razy, symulując w ten sposób liczbę klientów obsłużonych +na przykład w ciągu dnia roboczego. +

+

9.5. Próby logowania

+

+Pracę rozpocznij od programu utworzonego w ćwiczeniu 9.3. Do klasy User +dodaj metodę o nazwie increment_login_attempts(), pozwalający na +inkrementację wartości login_attempts o 1. Utwórz drugą +metodę o nazwie reset_login_attempts(), która będzie zerowała wartość +login_attempts. +Utwórz egzemplarz klasy User i kilkukrotnie wywołaj metodę +increment_login_attempts(). Wyświetl wartość login_attempts, +aby mieć pewność o jej +prawidłowej inkrementacji. Następnie wywołaj metodę +reset_login_attempts(). +Ponownie wyświetl wartość login_attempts i sprawdź, czy na pewno +wynosi 0. +

+

9.6. Budka z lodami

+

+Budka z lodami to szczególny rodzaj restauracji. +Zdefiniuj klasę o nazwie IceCreamStand dziedziczącą po klasie +Restaurant +utworzonej w ćwiczeniu 9.1 lub 9.4. Dowolna wersja wymienionej klasy będzie +się sprawdzać — po prostu wybierz jedną z nich. Dodaj atrybut o nazwie +flavors, przechowujący listę różnych smaków lodów. Zdefiniuj metodę +wyświetlającą dostępne smaki lodów. Utwórz egzemplarz klasy +IceCreamStand i wywołaj nową metodę. +

+

9.7. Admin

+

+Administrator to specjalny rodzaj użytkownika. Zdefiniuj klasę +o nazwie Admin dziedziczącą po klasie User utworzonej w +ćwiczeniu 9.3 lub 9.5. +Dodaj atrybut privileges przechowujący listę ciągów tekstowych takich +jak „może dodać post”, „może usunąć post” czy „może zbanować użytkownika”. +Zdefiniuj metodę o nazwie show_privileges(), wyświetlającą listę +uprawnień administratora. Utwórz egzemplarz klasy Admin i wywołaj +nową metodę. +

+

9.8. Uprawnienia

+

+Zdefiniuj oddzielną klasę Privileges. Ta klasa powinna +mieć jeden atrybut (privileges), przechowujący listę ciągów +tekstowych, tak jak +przedstawiłem to w poprzednim ćwiczeniu. Metodę show_privileges() +przenieś +do nowej klasy. Utwórz egzemplarz klasy Privileges jako atrybut w +klasie +Admin. Następnie utwórz nowy egzemplarz klasy Admin i użyj +metody show_privileges() do wyświetlenia uprawnień. +

+

9.9. Uaktualnienie akumulatora

+

+Pracę rozpocznij od ostatniej wersji +programu electric_car.py utworzonej w tym podrozdziale. Do klasy +Battery +dodaj +nową metodę o nazwie upgrade_battery(). Ta metoda powinna sprawdzić +pojemność akumulatora i ustawić ją na 100, jeśli aktualnie jest inna. Utwórz +egzemplarz samochodu o napędzie elektrycznym wraz z akumulatorem +o domyślnej pojemności, wywołaj metodę get_range(), a następnie metodę +upgrade_battery() i ponownie get_range(). Powinieneś zauważyć +zwiększenie zasięgu samochodu. +

+

9.10. Zaimportowana klasa Restaurant

+

+Przenieś do modułu ostatnią wersję +klasy Restaurant i utwórz oddzielny plik importujący tę klasę. Utwórz +egzemplarz klasy Restaurant, a następnie wywołaj metodę tej klasy, aby +sprawdzić, czy polecenie import działa prawidłowo. +

+

9.11. Zaimportowana klasa Admin

+

+Pracę rozpocznij od ćwiczenia 9.8. W +jednym module umieść klasy User, Privileges i Admin. +Przygotuj oddzielny plik, +utwórz w nim egzemplarz klasy Admin i wywołaj metodę +show_privileges(), +aby sprawdzić, czy wszystko działa prawidłowo. +

+

9.12. Wiele modułów

+

+Klasę User umieść w jednym module, natomiast +Privileges i Admin w oddzielnym. Następnie w innym pliku +utwórz egzemplarz +klasy Admin i wywołaj metodę show_privileges(), aby +sprawdzić, czy wszystko działa prawidłowo. +

+

9.13. Kości do gry

+

+Przygotuj klasę Die z jednym atrybutem o nazwie sides, +którego wartością domyślną będzie 6. Utwórz metodę o nazwie +roll_die(), +wyświetlającą losowo wygenerowaną liczbę z zakresu od 1 do wartości +określonej przez liczbę ścianek na kości do gry. Utwórz kość zawierającą sześć +ścianek i zasymuluj rzucenie nią 10 razy. +Później utwórz kości zawierające 10 i 20 ścianek. Każdą nową kością rzuć 10 +razy. +

+

9.14. Loteria

+

+Utwórz listę lub krotkę zawierającą serię dziesięciu liczb i +pięciu liter. Losowo wybierz cztery liczby lub litery z listy, a następnie +wyświetl +komunikat informujący, że kupon zawierający liczby lub litery dopasowane +do wylosowanych wygrywa nagrodę. +

+

9.15. Analiza loterii

+

+Wykorzystaj pętlę do ustalenia, jak trudno jest +wygrać +w loterii, którą modelowałeś w poprzednim ćwiczeniu. Utwórz listę lub +krotkę o nazwie my_ticket. Następnie zdefiniuj pętlę losującą liczby +dopóty, +dopóki nie zostaną dopasowane do Twojego kuponu. Wyświetl komunikat +informujący, ile iteracji pętli trzeba było wykonać, zanim padły liczby +znajdujące się na Twoim kuponie. +

+

9.16. Moduł Pythona tygodnia

+

+Jednym z doskonałych zasobów pomagających w poznaniu biblioteki standardowej +Pythona jest witryna Python Module of the Week. +Przejdź na stronę https://pymotw.com/3/ i przejrzyj spis +treści. +Wybierz moduł, który wygląda interesująco, i przeczytaj informacje na jego +temat. Przejrzyj również dokumentację dotyczącą modułu random. +

+

Rozdział 10:

+

10.1. Poznajemy Pythona

+

+W edytorze tekstu utwórz pusty plik i wpisz w nim +kilka zdań podsumowujących to, czego się dotąd nauczyłeś o języku +Python. +Każdy wiersz rozpocznij od wyrażenia „W Pythonie można...”. Plik +zapisz pod nazwą learning_python.txt w tym samym katalogu, w którym +umieszczasz ćwiczenia z tego rozdziału. Przygotuj program odczytujący powyższy +plik i trzykrotnie wyświetlający jego zawartość. Treść pliku powinna być +wyświetlona raz przez odczytanie całego pliku, raz za pomocą iteracji przez +obiekt pliku oraz raz przez umieszczenie wierszy na liście, a następnie +przetworzenie listy poza blokiem with. +

+

10.2. Poznajemy C

+

+Metodę replace() można wykorzystać do zastąpienia +dowolnego słowa w ciągu tekstowym zupełnie innym słowem. Oto krótki przykład +pokazujący, jak w zdaniu słowo pies zastąpić słowem kot: +

+
+>>> message = "Moje ulubione zwierzę to pies."
+>>> message.replace('pies', 'kot')
+'Moje ulubione zwierzę to kot.'
+
+

+Odczytaj każdy wiersz tekstu w utworzonym wcześniej pliku +learning_python.txt, +a następnie wszystkie wystąpienia słowa Python zastąp nazwą innego +języka +programowania, na przykład C. Każdy zmodyfikowany wiersz wyświetl na +ekranie. +

+

10.3. Gość

+

+Utwórz program, który poprosi użytkownika o podanie imienia. +Gdy użytkownik je wprowadzi, zapisz to imię w pliku o nazwie +guest.txt. +

+

10.4. Księga gości

+

+Utwórz pętlę while, w której każdy użytkownik będzie +musiał podać swoje imię. Gdy użytkownik je wprowadzi, na ekranie wyświetl +komunikat powitania, a do pliku o nazwie guest_book.txt dodaj wiersz +rejestrujący odwiedzenie Twojej strony przez tego użytkownika. Upewnij się, +że każdy wpis jest umieszczany w nowym wierszu w pliku. +

+

10.5. Ankieta dotycząca programowania

+

+Utwórz pętlę while, w której +użytkownicy będą musieli udzielić odpowiedzi na pytanie: „Dlaczego lubisz +programowanie?”. Każdą otrzymaną odpowiedź dodaj do pliku przechowującego +wszystkie udzielone odpowiedzi. +

+

10.6. Dodawanie

+

+Jeden z najczęściej pojawiających się problemów podczas +pobierania danych liczbowych polega na tym, że użytkownicy podają tekst +zamiast liczb. Kiedy tego rodzaju dane wejściowe spróbujesz skonwertować +na typ int, otrzymasz błąd ValueError. Utwórz program, który +prosi +użytkownika o podanie dwóch liczb. Dodaj je i wyświetl wynik. Przechwyć błąd +ValueError, jeżeli którakolwiek wartość przekazana w danych +wejściowych nie +jest liczbą, i wyświetl odpowiedni komunikat błędu. Przetestuj program, +najpierw podając dwie liczby, a później pewien tekst zamiast liczby. +

+

10.7. Kalkulator dodawania

+

+Kod przygotowany w ćwiczeniu 10.6 opakuj +pętlą while, aby użytkownik mógł kontynuować wprowadzanie liczb nawet +po popełnieniu błędu i podaniu tekstu zamiast liczby. +

+

10.8. Koty i psy

+

+Utwórz dwa pliki o nazwach cats.txt i dogs.txt. W +pierwszym +pliku umieść przynajmniej trzy imiona kotów, natomiast w drugim przynajmniej +trzy imiona psów. Przygotuj program próbujący odczytać zawartość tych +plików i wyświetlić ją na ekranie. Zastosuj w kodzie konstrukcję +try-except +aby przechwycić wszelkie błędy typu FileNotFoundError i wyświetlić +użytkownikowi odpowiedni komunikat błędy, gdy żądany plik nie istnieje. Jeden z +utworzonych wcześniej plików przenieś do innego katalogu w systemie i +upewnij się, że opracowany blok except w programie działa prawidłowo. +

+

10.9. Ciche koty i psy

+

+Blok except w programie utworzonym w poprzednim +ćwiczeniu zmodyfikuj w taki sposób, aby brak pliku powodował jedynie ciche +niepowodzenie. +

+

10.10. Najczęściej występujące słowa.

+

+Odwiedź witrynę projektu Gutenberg +(http://www.gutenberg.org/) i wybierz kilka innych książek, które chciałbyś +przeanalizować. Pobierz pliki tekstowe tych dzieł lub niezmodyfikowany zwykły +tekst skopiuj z przeglądarki internetowej do pliku tekstowego w komputerze. +Za pomocą metody count() możesz sprawdzić, ile razy dane słowo lub +wyrażenie występuje w ciągu tekstowym. Na przykład w przedstawionym poniżej +fragmencie kodu sprawdzamy, ile razy słowo za występuje w ciągu tekstowym: +

+
+>>> line = "Za górami, za lasami, za dolinami pobili się dwaj górale
+ciupagami."
+>>> line.count('za')
+2
+>>> line.lower().count('za')
+3
+
+

+Zwróć uwagę na to, że konwersja ciągu tekstowego na zapisany małymi +literami (do tego służy funkcja lower(), którą poznałeś już wcześniej) +powoduje +przechwycenie wszystkich wystąpień sprawdzanego słowa niezależnie od sposobu +jego formatowania. +Utwórz program odczytujący pobrane wcześniej z projektu Gutenberg pliki +tekstowe, a następnie określający, ile razy słowo the występuje w każdym z nich. +Otrzymany wynik będzie jedynie przybliżony, ponieważ uwzględnia również +słowa zawierające 'za', np. 'zachód' lub 'zabawa'. Spróbuj zliczyć +wystąpienia 'za ' (wraz ze spacją w ciągu tekstowym) i zobacz, o ile mniejsza +będzie to liczba. +

+

10.11. Ulubiona liczba

+

+Utwórz program, który prosi użytkownika o podanie +ulubionej liczby. Za pomocą funkcji json.dump() zapisz tę liczbę w +pliku. +Następnie utwórz oddzielny program odczytujący ulubioną liczbę użytkownika i +wyświetlający komunikat w stylu: +„Znam Twoją ulubioną liczbę, to _____”. +

+

10.12. Zapamiętana ulubiona liczba

+

+Oba programy utworzone w poprzednim +ćwiczeniu połącz w jednym pliku. Jeżeli ulubiona liczba została zapisana +w pliku, wyświetl ją użytkownikowi. W przeciwnym razie poproś użytkownika +o podanie ulubionej liczby i zapisz ją w pliku. Uruchom ten program +dwukrotnie i upewnij się, że działa prawidłowo. +

+

10.13. Weryfikacja użytkownika.

+

+W ostatniej wersji programu +remember_me.py przyjęto założenie, że użytkownik już wcześniej podał +swoje +imię, lub też program został uruchomiony po raz pierwszy. Powinniśmy +zmodyfikować ten program na wypadek, gdyby bieżący użytkownik nie był tą +osobą, która ostatnio korzystała z tego programu. +W funkcji greet_user(), zanim za pomocą odpowiedniego komunikatu +powitasz istniejącego już użytkownika, zapytaj go, czy podane imię jest +poprawne. +Jeżeli nie jest, należy wywołać funkcję get_new_username() w celu +użycia prawidłowego imienia. +

+

Rozdział 11:

+

11.1. Miasto, państwo

+

+Przygotuj funkcję akceptującą dwa parametry: nazwy +miasta i państwa. Wartością zwrotną tej funkcji powinien być +pojedynczy +ciąg tekstowy w postaci Miasto, Państwo, na przykład Santiago, Chile. Gotową +funkcję umieść w module o nazwie city_functions.py. +Utwórz plik o nazwie test_cities.py przeznaczony do przetestowania +przygotowanej wcześniej funkcji (pamiętaj o konieczności zaimportowania +modułu unittest oraz funkcji, która ma zostać sprawdzona). Następnie w pliku +test_cities.py zdefiniuj funkcję o nazwie test_city_country() +odpowiedzialną +za sprawdzenie, czy wywołanie utworzonej w poprzednim ćwiczeniu funkcji, +na przykład z wartościami santiago i chile, spowoduje wygenerowanie +oczekiwanego ciągu tekstowego. Uruchom plik test_cities.py i upewnij +się, że test test_city_country() zostaje zaliczony. +

+

11.2. Populacja

+

+Zmodyfikuj przygotowaną wcześniej funkcję, aby wymagała +podania trzeciego argumentu — populacji (population). Teraz wartością +zwrotną funkcji powinien być ciąg tekstowy w postaci Miasto, Państwo - +populacja xxx, na przykład Santiago, Chile - populacja 5000000. Ponownie +uruchom test_cities.py. Upewnij się, że tym razem test zdefiniowany w +metodzie test_city_country() będzie niezaliczony. +Zmodyfikuj funkcję, aby parametr population był opcjonalny. Ponownie +uruchom test_cities.py i upewnij się, że również teraz test +zdefiniowany w metodzie test_city_country() zostanie zaliczony. +Utwórz drugi test o nazwie test_city_country_population(), +sprawdzający, czy można wywołać funkcję z wartościami 'santiago', +'chile' i +'population=5000000'. Raz jeszcze uruchom +test_cities.py i upewnij się, że +nowy test został zaliczony. +

+

11.3. Pracownik

+

+Przygotuj klasę o nazwie Employee. Metoda __init__() +powinna pobierać imię, nazwisko i roczne wynagrodzenie, a następnie +zapisywać te informacje w postaci atrybutów. Utwórz metodę o nazwie +give_raise(), która spowoduje zwiększenie wynagrodzenia domyślnie o +5000 zł, +choć zaakceptuje także inną kwotę. +Przygotuj zestaw testów dla klasy Employee. Utwórz dwie metody testowe +test_give_default_raise() i test_give_custom_raise(). +Wykorzystaj metodę +setUp(), aby uniknąć konieczności tworzenia nowego egzemplarza klasy +Employee w każdej metodzie testowej. Wykonaj zestaw testów i upewnij +się, że oba testy zostaną zaliczone. +

+

Część II - Aplikacje internetowe

+

Rozdział 18:

+

18.1. Nowe projekty

+

+Aby jeszcze lepiej poznać możliwości oferowane przez +framework Django, utwórz kilka pustych projektów i zobacz, z czego się +składają. Utwórz nowy katalog o prostej nazwie, takiej jak snap_gram +lub insta_chat +(na zewnątrz katalogu learning_log), przejdź do nowego katalogu w +powłoce +i utwórz środowisko wirtualne. Zainstaluj Django i wydaj polecenie +django-admin.py startproject snap_gram . +(upewnij się, że umieściłeś kropkę na końcu polecenia). +Zajrzyj do plików i katalogów utworzonych przez powyższe polecenie i +porównaj je z zawartością projektu Learning Log. Procedurę powtórz +kilkukrotnie, aż będziesz wiedzieć, co Django tworzy w nowym projekcie. +Następnie usuń katalogi niepotrzebnych Ci projektów. +

+

18.2. Krótkie wpisy

+

+Metoda __str__() w modelu Entry aktualnie powoduje +dołączenie wielokropka do każdego egzemplarza klasy Entry, gdy +Django +wyświetla go w witrynie administracyjnej bądź w powłoce. Do wymienionej +metody dodaj polecenie if, które spowoduje dodanie wielokropka tylko +dla +wpisów dłuższych niż 50 znaków. Za pomocą witryny administracyjnej dodaj +wpis krótszy niż 50 znaków i sprawdź, czy w trakcie jego wyświetlania jest +dołączany wielokropek. +

+

18.3. API Django

+

+Podczas tworzenia kodu pozwalającego uzyskać dostęp do +danych w projekcie przygotowujesz tak zwane zapytanie. Przejrzyj dostępną +na stronie https://docs.djangoproject.com/en/2.2/topics/db/queries/ +dokumentację dotyczącą tworzenia zapytań pobierających dane. +Większość informacji na podanej stronie będzie dla Ciebie nowością, ale +staną się użyteczne, gdy zaczniesz pracować nad własnymi projektami. +

+

18.4. Pizzeria

+

+Utwórz nowy projekt o nazwie pizzeria wraz z aplikacją o +nazwie pizzas. Zdefiniuj model Pizza wraz z atrybutem +name, który będzie +przechowywał wartości takie jak hawajska lub mięsna. Zdefiniuj drugi model +o nazwie Topping wraz z atrybutami pizza i name. +Atrybut pizza powinien +być kluczem zewnętrznym dla modelu Pizza, natomiast atrybut +name powinien +przechowywać wartości takie jak ananas, bekon i sos. +Zarejestruj oba modele w witrynie administracyjnej. W tej witrynie wprowadź +pewne nazwy pizzy i dodatków. Za pomocą powłoki przejrzyj wprowadzone +dane. +

+

18.5. Jadłospis

+

+Rozważ aplikację ułatwiającą użytkownikom przygotowanie +jadłospisu na cały tydzień. Utwórz nowy katalog o nazwie meal_planner +i rozpocznij w nim pracę nad nowym projektem Django. Następnie utwórz +nową +aplikację o nazwie meal_plans. Przygotuj prostą stronę główną dla tego +projektu. +

+

18.6. Strona główna pizzerii

+

+Dodaj stronę główną do projektu pizzerii, nad którym pracę rozpocząłeś w +ćwiczeniu 18.4. +

+

18.7. Dokumentacja szablonów

+

+Przejrzyj dokumentację szablonów Django, +którą znajdziesz na stronie +https://docs.djangoproject.com/en/2.2/ref/templates/. +Zawsze możesz do niej powrócić, gdy będziesz pracować nad własnymi projektami. +

+

18.8. Strony pizzerii.

+

+Do projektu pizzerii utworzonego w ćwiczeniu 18.6 +dodaj stronę wyświetlającą nazwy dostępnych rodzajów pizzy. Następnie +połącz nazwę każdej pizzy ze stronę wyświetlającą dostępne dodatki do +pizzy. Upewnij się, że użyłeś dziedziczenia szablonów, aby efektywnie +tworzyć strony. +

+

Rozdział 19:

+

19.1. Blog

+

+Rozpocznij pracę nad nowym projektem Django o nazwie Blog. +W tym projekcie utwórz aplikację o nazwie blogs, zdefiniuj w niej +model +BlogPost. Model powinien mieć kolumny takie jak title, +text i date_added. +Utwórz superużytkownika dla projektu, a następnie wykorzystaj witrynę +administracyjną do przygotowania kilku krótkich postów. Strona główna +powinna wyświetlać wszystkie posty w kolejności chronologicznej. +Przygotuj jeden formularz pozwalający na tworzenie nowych postów oraz +drugi przeznaczony do edycji już istniejących. Wypełnij formularze i +upewnij się, że działają prawidłowo. +

+

19.2. Konta bloga.

+

+Do projektu bloga zapoczątkowanego w ćwiczeniu 19.1 +dodaj systemu rejestracji i uwierzytelniania użytkowników. Upewnij się, że +zalogowany użytkownik ma wyświetloną na ekranie swoją nazwę użytkownika, +natomiast niezarejestrowany otrzymuje dostęp do strony pozwalającej mu na +dokonanie rejestracji. +

+

19.3. Refaktoryzacja

+

+W pliku views.py mamy dwa miejsca, w których +sprawdzamy, czy użytkownik będący właścicielem tematu to aktualnie zalogowa +ny użytkownik. Kod odpowiedzialny za tego rodzaju sprawdzenie umieść w +funkcji o nazwie check_topic_owner() i wywołuj ją, gdy zajdzie +potrzeba. +

+

19.4. Ochrona strony new_entry.

+

+Użytkownik może dodać nowy wpis do +tematu należącego do innego użytkownika. W tym celu wystarczy podać adres +URL wraz z identyfikatorem tematu, którego właścicielem jest inny +użytkownik. Zastosuj ochronę przed tego rodzaju atakami i sprawdź przed +zapisaniem nowego wpisu, czy bieżący użytkownik jest właścicielem tematu, +do którego ma zostać dodany ten wpis. +

+

19.5. Ochrona bloga

+

+W budowanym projekcie bloga upewnij się, że każdy +post będzie powiązany z określonym użytkownikiem. Zagwarantuj, że +wszystkie posty są dostępne publicznie, ale tylko zarejestrowani +użytkownicy mogą dodawać nowe posty i edytować te istniejące. Zanim +zostanie przetworzony formularz, w widoku pozwalającym użytkownikowi na +edycję postu sprawdź, czy użytkownik edytuje własny post. +

+

Rozdział 20:

+

20.1. Inne formularze

+

+Style Bootstrapa zastosowaliśmy na stronach login +i add_topic. Wprowadź podobne zmiany w pozostałych stronach opartych na +formularzach: new_entry, edit_entry i register. +

+

20.2. Nadanie stylu blogowi

+

+Wykorzystaj bibliotekę Bootstrap do nadania +stylów projektowi bloga, który utworzyłeś w ćwiczeniach do poprzedniego +rozdziału. +

+

20.3. Wdrożenie bloga

+

+Przeprowadź wdrożenie w Heroku projektu bloga, +nad którym pracujesz. Aby zapewnić wdrożonej aplikacji względne +bezpieczeństwo, upewnij się, że przypisałeś opcji DEBUG wartość +False, aby w przypadku +problemów użytkownicy nie widzieli wyświetlonej pełnej strony błędu +Django. +

+

20.4. Więcej błędów 404

+

+Funkcja get_object_or_404() powinna być używana +również w widokach generowanych przez funkcje new_entry() i +edit_entry(). +Wprowadź odpowiednie zmiany, a następnie przetestuj je, podając adres +URL +taki jak http://localhost:8000/new_entry/999/ i sprawdzając, czy na +pewno otrzymujesz komunikat błędu o kodzie 404. +

+

20.5. Rozbudowa aplikacji Learning Log

+

+Dodaj jedną funkcję do aplikacji +Learning Log, a następnie przekaż zmiany do serwera produkcyjnego. Spróbuj +wprowadzić niewielką zmianę, na przykład nieco obszerniejszy opis +przeznaczenia projektu wyświetlany na stronie głównej. Następnie postaraj +się dodać trochę bardziej zaawansowaną funkcję, na przykład możliwość +publicznego udostępnienia tematu przez jego właściciela. Taka zmiana będzie +wymagała użycia atrybutu o nazwie public jako części modelu +Topic +(wartością domyślną wymienionego atrybutu powinno być False) oraz +elementu +formularza na stronie new_topic pozwalającego użytkownikowi na +oznaczenie +tematu jako prywatnego lub publicznego. +Następnie trzeba będzie przeprowadzić migrację +projektu i zmodyfikować kod w pliku views.py, aby tematy publiczne mogły +być wyświetlane również przez nieuwierzytelnionych użytkowników. Pamiętaj +o migracji bazy danych w serwerze produkcyjnym po przekazaniu +uaktualnionego projektu do Heroku. +

+
+
+ + diff --git a/articles/terminallog/index.html b/articles/terminallog/index.html new file mode 100755 index 0000000..7ca1321 --- /dev/null +++ b/articles/terminallog/index.html @@ -0,0 +1,36 @@ + + + + + + + + +
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ + + + + diff --git "a/articles/terminallog/jak_dzia\305\202a_linux.html" "b/articles/terminallog/jak_dzia\305\202a_linux.html" new file mode 100644 index 0000000..04f0301 --- /dev/null +++ "b/articles/terminallog/jak_dzia\305\202a_linux.html" @@ -0,0 +1,2122 @@ + + + + + + + + +
+     _       _          _     _       _         _     _                  ___ 
+    | | __ _| | __   __| |___(_) __ _| | __ _  | |   (_)_ __  _   ___  _|__ \
+ _  | |/ _` | |/ /  / _` |_  / |/ _` | |/ _` | | |   | | '_ \| | | \ \/ / / /
+| |_| | (_| |   <  | (_| |/ /| | (_| | | (_| | | |___| | | | | |_| |>  < |_| 
+ \___/ \__,_|_|\_\  \__,_/___|_|\__,_|_|\__,_| |_____|_|_| |_|\__,_/_/\_\(_)
+
+

+ ☠ morketsmerke ☠ +

+
+

Jak działa Linux

+
+

Spis treści

+ +
+

+ Opisywany tutaj materiał będzie kompatybilny z dystrybucjami + pochodnymi od GNU/Linux Debian zarówno tymi opartymi na + systemd jak sysvinit oraz tymi z rodziny + RHEL/Fedora/CentOS. +

+

+ GNU/Linux czy raczej sam Linux? Sama nazwa, jest już tematem dość + kontrowersyjnym. Ludzie związani z projektem GNU twierdzą, że ta + pierwsza liczba jest właściwa ponieważ wskazuje ona na to, że isotne + elemnty projektu GNU zostały wykorzystane do stworzenia tego systemu. + W mowie potocznej jednak przyjęło się użycie tej drugiej nazwy. Jest + to jedno, łatwe do zapamiętania słowo. Jeśli mówimy następujące + zdanie wyrażające chęć zainstalowania na jakiejś maszynie omawianego + tutaj systemu, mówimy że "zainstalujemy jakiegoś Linuksa". Słowo + "jakiegoś" zostało tu użyte w kontekscie wyboru konkretnej + dystrybucji. Co to dystrybucja wyjaśnie za chwilę. Bez projektu GNU + niebyło by Linuksa. Wydaje mi się, że każdy kto jest nieco bardziej + związany z tym środowiskiem o tym wie. Ja również jestem tego świadom + dla tego też w tym dokumencie użyje nazwy Linux. Poprostu. +

+

1. Budowa systemu Linux

+

+ Nie zagłebiając się w szczegóły, to Linux składa się z + jądra oraz + przestrzeni użytkownika. Oba kompomenty rezydują w + pamięci więc + wiele, nie które teksty popularno-naukowe mogą włączać pamięć lub + ogólnie sprzęt do składowych systemu operacyjnego Linux, w mojej + opinii jest raczej cecha wykorzystywanych przez nas komputerów + konwencjonalnych. +

+

+ Mówiąc o jądrze możemy wskazać konktretny program, konkretny plik. + W przypadku przestrzeni użytkownika, w systemie nie istnieje żaden + namacalny byt cyfrowy jak w przypadku jądra. Przestrzeń użytkownika + jest bowiem warstwą abstrakcji - czyli terminem, + bądź założeniem wykorzystywanym w celu określenia czynności, funkcji, + zjawiska bez wdawania się w szczegóły. Przestrzeń użytkownika jest + miejscem uruchamiania procesów użytkownika. Procesy + to nic innego jak wystąpienia programów uruchomionych przez + użytkownika. Nie wszystkie procesy są programami użytkownika w + dosłownym tych słów znaczeniu. Część tych procesów to programy + wspomagające wykorzystanie komputera i jego zasobów. Bez nich systemy + operacyjne dalej mogły by spełniać swoją rolę, jednak nie miały by + powszechnie znanej nam dzisiaj formy. Przestrzeń użytkownika składa + się z wielu ogólno dostępnych kompnentów ich istnienie w danej wersji + systemu oraz ich konfiguracja sprawia, iż nie mamy doczynienia z + gotowym jednolitym produktem, ale z dystrybucją. Z jedną z wersji, + gdzie ktoś + wziął jądro, które jest ogolno dostępne i skomponował przestrzeń + użytkownika. Obecnie na rynku mamy dostępnych ok. 600 dystrybucji. + Wiekszość z nich to pochodne innych, oryginalnych rozwiązań + rozwijanych przez setki osób na całym świecie. Kilka takich głównych + dystrybucji, znajduje się w tabeli poniżej. Przejrzałem większość z + nich, a z częsci osobiście korzystałem. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LogoNazwaOpis
linux-mint-logo32Linux Mint + Dystrybucja bardzo przyjazna użytkownikowi. Wykorzystywana + przez nowych niedoświadczonych użytkowników system Linux. + Pod czas + instalacji mogą być instalowane nie wolne moduły oraz nie + wolne oprogramownie. Jej głównym zadaniem jest sprzyjanie + użytkownikowi i umożliwienie mu wykorzystanie Linuksa przy + codziennym wykorzystaniu komputera. Mint rozwijany jest przez + społeczność zebraną wokół niego. +
ubuntu-logo32Ubuntu + Podobnie jak Linux Mint, Ubuntu również jest skierowane dla + osób ceniących sobie wygodne i prostę rozwiązania. Jest + przyjazna użytkownikowi, ma nieco bardziej konserwatywne + podejście do ideii wolnego oprogramowania, jądro może + zawierać nie wolne moduły, jednak zamknięte oprogramowanie + nie jest domyślnie instalowane. Ubuntu rozwijane jest przez + firmę + Canonical. Jej technologię są wdrażane do Ubuntu, dzięki + czemu może ona uchdzić za system klasy enterprise + wśród + dystrybucji opartych o GNU/Linux Debian. Poza wersją na + komputery biurkowe istnieją również wersja skierowana + na serwery oraz inne wersje z preinstalowanymi różnymi + środowiskami graficznymi czy wersja skierowana do obróbki + multimediów zawierająca pozwalające do tego oprogramowanie. + Społeczność zebrana + wokół systemu Linux zarzuca jej siłowe próby wdrożenia + manedżera oprogramowania Snap, rozwijanego przez tę + firmę + przez co może ona pretendować do stopniowego zarzucenia + klasycznego schematu dystrybucji pakietów rozwijanego wraz + z GNU/Linux Debian. +
fedora-logo32Fedora Linux + Fedora jest dystrybucją skierowaną do różnej maści + użytkowników, ponieważ istnieje w kilku głównych wersjach. + oraz wiele wersji pobocznych tzw. spins. Fedora ma + najprzyjźniejszy instalator chyba ze wszystkich możliwych + dystrybucji. Wymaga on głównie wybrania miejsca instalacji + i kliknięcia przycisku dalej. Fedora została stworzona i jest + rozwiajana przez firme Red Hat Inc. (obecnie IBM) jako + upstream (poligon doświadczalny dla zmian), dla + glównego produktu tej firmy Red Hat Enterprise Linux - + płatnej dystrybucji skierowanej do środowisk produkcyjnych + (100$ rocznie). Jest to system o dużej stabilości ze + wsparciem dla najnowszego sprzetu. Fedora również + charakteryzuje się wprowadzeniej jako pierwsza środowiska + GNOME w najnowszej wersji 41 oraz innych nowych technologi + wśród otwartego oraz wolnego oprogramowania. +
debian-logo32GNU/Linux Debian + Debian jest jedną z pierwszy dostępnych dystrybucji, początek + jej istnienia jest datowany na 1993 rok. Dystrybucja + konserwatywna, posiadała w pierwszych latach swojego + istnienia aprobatę FSF (Free Software Fundation). Jednak + została ona wycofana, za zezwolenie na instalację zamkniętego + oprogramowania. Kernel przygotowywany przez twórców tej + dystrybucji pozbawiony jest tzw. blobów binarnych (nie + wolnych prekompilowanych modułów, używanych przy budowaniu + jądra.) Bloby najczęściej dotyczą sterowników sprzętu. + Dystrybucja charkteryzuje się wysoką stabilnościa + porównywalną z RHEL, wsparciem dla starszego sprzętu. Jedną + z cech, która może odstraszać potencjalnych użytkowników + od niej jest długi cykl wydawniczy (co dwa lata) oraz + używanie sprawdzone oprogramowania czy technologii (pozostaje + dość mocno w tyle jeśli chodzi o najnowsze wersje + oprogramowania). Wydaje mi się, że niema + stabilniejszego gotowego rozwiązania niż GNU/Linux Debian. + Debian wymaga nieco większego zaawansowania niż dystrybucje + podane do tej pory. Stosowany jest częściej w środowiskach + produkcyjnych niż np. Ubuntu. Rozwój Debiana opiera się + na zaangażowaniu społeczności z całego świata. +
arch-linux-logo32Arch Linux + Dystrybucja skierowana do zaawansowanych użytkowników. + Charakteryzuje się wysoką konfigurowalnością oraz + dostępnością najnowszych wersji oprogramowania. Nie posiada + oficjalnego instalatora, choć można pobrać skrypt z sieci. + Instalacji dokonuj się ręcznie, wpisującac kolejne polecenia + z podręcznika instalacji w środowisku LiveCD, gdzie + przygotowuje się dysk, pobiera się pakiety i je konfiguruje. + Instalacja i konfiguracji Arch Linux nie jest tak + pracochłonna jak innych dystrybucji, można by powiedzieć, + meta-dystrybucji. Dość ciekawą cechą jest społeczność zebrana + wokół niej, która przechwalająca się swoją wyższością na + innymi (ponieważ przebrneli przez proces instalacji) + używając frazy "I use Arch BTW.". Dystrybucja rozwijana + jest przez społeczność na całym świecie. +
void-linux-logo32Void Linux + Nie zależna dystrybucjna, trochę odmienna od inny dystrybucji + głównego nurtu. Systemd zastąpiono programem runit, + zamiast OpenSSL, użyto projektu OpenBSD LibreSSL jak jedyna + z dystrybucji Linuksa. Kernel Void-a pozbawiony jest blobów, + a domyślna instalacja zawiera tylko wolne oprogramowanie, + posiada on jednak oficjalne repozytorium z zamkniętym + oprogramowaniem. Instalacja pakietów opiera się stworzonym + dla Void menedżerze pakietów XBPS. Pakiety są wydawane stylu + rolling release, co daje szybkie i stabline + aktualizacje. Obok standardowej biblioteki języka C - + GNU libc, mamy również bibliotekę musl. Za pomoca + programu xbps-src możemy tworzyć z kodu źródłowego + własne pakiety XBPS. +
gentoo-linux-logo32Gentoo Linux + Gentoo jest dystybucją na tyle zaawansowaną, że można by się + pokusić o nazwanie jej meta-dystrybucją. Jest ona bowiem + jedną z najbardziej konfigurowalnych dystrybucji. Jedną z + ciekawszych czynności, jakie należy wykonać podczas + instalacji, to ręczna kompliacja jądra. Dystrybucja + skierowana do jeszcze bardziej zaawansowanych użytkowników + niż w przypadku Arch Linux. Instalacja Gentoo na maszynie + wirtualnej wraz z poradnikiem, zajeło mi to jakieś dwie + godziny. +
lfs-logo32Linux from scratch + LFS to w zasadzie projekt, a niżejli sama dystrybucja. + Umożliwia on stworzenie oraz skonfigurowanie własnej + dystrybucji. Na stronie projektu zawarte są wskazówki, co + należy zrobić, aby stworzyć rozwiązanie najbardziej + elastyczne dla siebie. LFS z pewnością może nosić miano + meta dystrybucji. +
+

+ W powyższej tabeli przedstawiłem dystrybucje, na które + warto zwrócić uwagę. Teraz prawdopodobnie czekać będzie Cię duży + dylemat, którą wybrać. W pierwszej kolejności ważny jest sprzęt, + na którym będziemy z tego systemu korzystać. Część sprzętu, + z którego chcemy korzystać może + nie działać out of box, wowczas potrzebne będą sterowniki, + które mogą być własnościowe (nie wolne, generalnie być zamkniętym + oprogramowaniem), jeśli zależy nam na prywatności, to lepiej upewnić + się z jakiego rodzaju sprzętem będzie mieć doczynienia, ponieważ + każde zamknięte oprogramowanie można teoretycznie uznać za + oprogramowanie szkodliwe. Dobrym wyborem może być zakup Thinkpada z + przed 2008 roku. Wówczas będziemy mogli bez obaw wybrać Debiana i + zainstalować np. XFCE (to dość lekkie środowisko graficzne, nadające + się do codziennej pracy, bez zniechęcania się). Kolejną rzeczą do + wyboru dystrybucji jest zapał do pracy. Mimo iż opisując dystrybucje + napisałem że ta jest dla początkujących, a ta dla zaawansowanych to + żadna z + nich nie jest ani dla jednych ani dla drugich. Obsługa czego kolwiek + związanego z komputerami wymaga przeczytania dokumentacji ze + zrozumieniem i umiejętności radzenie sobie z ewentualnymi problemami. + Dlatego dlaczego by nie wybrać Gentoo, zainstalować go + z poradnikiem, skonfigurować, a wrazie problemów użyć Googla, lub + poprość kogoś ze społeczności o pomoc. +

+

+ Dość częstym zjawiskiem, wśród społeczności użytkowników Linuksa jest + tzw. distro-hopping, czyli przesiadanie się z jednej + dystrybucji na drugą. Jest to normalne zjawisko, chciaż można + powszechną opinia jego jest raczej negatywna, głównym argumentem + oponetów jest stwierdzenie, że przez to nie uczymy się niczego. Moim + zdaniem, możemy dojść do wniosku, że tak naprawdę nie ma dystrybucji + tylko produkt w ciągłej ewolucji z dostępnym takim a takim + oprogramowaniem. Nie mam mendżera pakietów, mam program do instalacji + i konfiguracji oprogramowania, nieważne czy jest apt, dnf, yum czy + pacman. Mam stronę podręcznika i znajduj sobie potrzebne opcje. Mam + dostęp do internetu, i wystarczy wyszukać konkretną potrzebną + czynność np.: "Remove packages with all dependencies pacman". I mam + gotowy wynik. Wiele miesięcy błądziłem słuchając mendrców jak RMS + (Richard Matthew Stallman). Myślcie samodzielnie, + przeskakujcie z distro na distro i bawcię się dobrze. +

+

1.1. Sprzęt

+

+ Sprzęt sam w sobie nie mozę wchodzić z skład systemu operacyjnego, + to jego elementy jak pamieć operacyjna, procesor czy pamięć masowa + odgrywają w nim bardzo ważna rolę. +

+

1.1.1. Pamięć operacyjna

+

+ W działaniu systemów operacyjnych takich jak Linux, najważniejszym + komponentem sprzętowym może być pamięć operacyjna, ponieważ to w + niej rezyduje jądro oraz przestrzeń użytkownika. Dane zapisane w + pamięci nie są niczym innym jak zbiorem zer i jedynek określanych + mianem bitów (najmniejsze przetwarzanej ilości + informacji). Procesy oraz jądro są jednymi z takich zbiorów. Takie + zbiory określa się mianem obrazu. +

+

1.2. Jądro

+

+ Jądro Linux jest to nadrzędy proces w całym systemie, realizuje swoje + działania w czterech obszarch funkcjonalności systemu operacyjnego. +

+
    +
  • Zarządzanie procesami - jądro jest + odpowiedzialne za uruchamianie, wstrzymywanie, ponowne uruchomienie + oraz kończenie pracy procesów. Korzystając ze współczesnych + systemów operacyjnych możemy mieć wrażenie uruchomione przez nas + programy (a co za tym idzie ich procesy) mogą działać jednocześnie. + Dzieje się tak dlatego, iż jądro uruchamia kod procesu na ułamek + sekundy, po upłynięciu danego przez jądro wycinka czasu + stan procesora wykonującego kod danego procesu zapisywany jest + w pamięci, a jądro wybiera kolejny proces i ładuje stan procesora + po czym wznawia jego wykonanie. Tych czynności jest znacznie więcej + zostało tu wymionionych. Te + czynności nazywane są przełączaniem kontekstu. + Na współczesnych procesorach dzieje się to tak szybko, że możemy + mieć złudzenie wielozadaniowości. W przypadku + maszyn wielordzeniowych jak i wieloprocesorowych jądro nie musi + zwalniać wykorzystywanego procesora (rdzenia), ale robi to aby + jak najlepiej wykorzystać zasoby.
  • +
  • Zarządzanie pamięcią - każdy proces jest obrazem + w pamięci, każdy proces również potrzebuje pamięci na swoje + obliczenia. Zadaniem jądra jest przydzielanie, zwalnianie jak i + ochrona (przed tym aby proces nie uzyskał dostępu do obszaru + innego procesu) przekazanych procesom obszarów. Czynności z tym + związane są dość złożone, ale jądro może posiłkować się + rozszerzenim MMU we współczesnych procesorach. Pozwala ono podczas + dzielenia pamięci wykorzystać metodę pamięci wirtualnej, + polegającej na zamianie adresów pamięci, przez co proces jest + skonfigurowany, że "tak jakby" miał do dyspozycji całą pamięć + fizyczną maszyny. Zamiana adresów wiąże się z potrzebą posiadania + map (czy też tabel), pozwalających na odzorowanie adresów, co + dokłada czynność aktualizacji mapy podczas przełączania kontekstu. + Mapy adresów nazywane są tablicami stron. +
  • Sterowniki urządzeń - zadaniem sterowników + jest dostarczenie identycznego interfejsu do komunikacji z + poszczególnymi urządzeniami zainstalowanymi w komputerze. Za racji + to iż swobodny dostęp do sprzetu jest potencjalnie niebezpieczny, + to jaka kolwiek próba komunikacji z urządzeniem odbywać się + zawsze będzie za pośrednictwem jądra systemu. Sterowniki w systemie + Linux są częścią jądra, nie oznacza to jednak, że nie możemy + jakiegoś brakującego do instalować. Sterowniki są przechowywane w + postaci modułów, które są ładowane podczas uruchamiania jądra, a + nie które znich mogą być ładowane podczas pracy systemu.
  • +
  • Wywołania systemowe - są to funkcje udostępnione + przez jądro procesom użytkownika. Wywołania realizują zadania, + które są trudne do zrealizowania przez procesy użytkownika lub w + ogóle nie wykonalne. Przykładem wykonywania wywołań systemowych + jest obsługa plików (otwieranie, odczyt czy zapis), innymi + bardzo często wykorzystywanymi wywołaniami są fork() oraz + exec(), wykonywane są za każdym wydanym poleceniem w + powłoce.
  • +
+

+ Inną ciekawą cechą jądra są pseudourządzenia. + Procesy widzą takie urządenia jak każde inne, jednak występują on + wyłącznie w warstwie programowej, dzięki temu nie muszą być częścią + jądra, ale ze względów praktycznych się je tam umieszcza. Inna + implementacja urządzenia /dev/random - służacego + do generowania liczb pseudolosowych, które jest urządzeniem + programowym mogłoby nie być zbyt bezpieczne. +

+

1.3. Przestrzeń użytkownika

+

+ Przestrzeń użytkownika formalnie jest obszarem pamięci, w którym + spedzimy 99% czasu pracy na Linuksie. Wewnątrz przestrzeni + użytkownika znajdują się procesy definiujące dystrybucje wykonujące + różne zadania dla użytkownika, teoretycznie są one wobec siebie + równe, to jednak przestrzeń użytkownika można podzielić na trzy + warstwy, na której warstwie będzie znajdować się proces zależy jak + bardzo skomplikowane zadania wykonuje. Przeglądarka sieci WWW, może + się taka nie wydawać ale to potężny subsystem więc będzie znajdować + na najwyższej warstwie, z kolei proces służący za rejestrowanie + logów, tzw. protokół diagnostyczne będzie znajdować się na najniższej + warstwie blisko jądra, ponieważ nie jest on zbyt skomplikowany w + porównaniu do na przykład przeglądarki, warstwa środkowa + zarezerowana jest dla różnej maści serwerów. Najproście rzecz ujmując + podstawowe usługi znajdują się na najniższej warstwie, usługi + pomocnicze na warstwie środkowej, a aplikacje, które kontroluje już + sam użytkownik będą znajdować się na samej górze. Procesy mogą + komunikować się z innymi procesami o ile te znajdują się na tym + samym lub niższym poziomie. Używanie tego rozdzaju podziału, może + być kłopotliwe ponieważ obecne serwery nie są już tak prostym + oprogramowaniem więc powinny znajdować się tej samej warstwie co + przeglądarka czy klient pocztowy, jednak to te aplikacje mogą + wykorzystywać serwery do realizacji zadań użytkownika, więc ich + miejsce jest raczej na warstwie centralnej (środkowej). +

+

1.4. Użytkownicy

+

+ Użytkownicy w Linksie są odwzorowaniem rzeczywistych obiektów, czyli + encją. Użytkownicy mają prawo do uruchamiania procesów oraz + posiadnia (bycia właścielem) plików. Jądro nie rozpoznaje + użytkowników po ich nazwach, tak jak mają w zwyczaju to ludzie, + używa ono identyfikatorów userid w skrócie + UID. Identyfikatory są przedstawiane za pomocą + liczb. +

+

+ Użytkownicy istnieją wyłącznie po to aby wyznaczać granice. Każdy + proces ma swojego właściela, dlatego też mówi się że proces + uruchamia się z uprawnieniami takiego a takiego użytkownika. + Użytkownicy mogą uruchamiać i konczyć procesy w własnych granicach + (tylko te, których są właścicielami), przez co nie mogą wpływać na + procesy innych użytkowników. Poza procesami, użytkownicy mogą + tworzyć własne pliki, których automatycznie stają się właścicielami. + Mogą oni decydować czy chcą się nimi dzielić, ustalając im + odpowiednie uprawnienia. +

+

+ Poza użytkownikami przypisanymi do konkretnych osób (raczej + spotkamy jednego), istnieje kilku dodatkowych specjalnych + użytkowników, głównie mają oni na celu ograniczenie uprawnień + serwerów. Po za tymi specjalnymi istnieje jeszcze użytkownik + root, którego nie tyczą się zapisane powyżej + ograniczenia dlatego jest on nazywany superużytkownikiem. +

+

+ Osoba pracująca na koncie użytkownika root, nazywana jest + administratorem systemu. Root może kończyć + procesy innych użytkowników, przeglądać cudze pliki czy instalować + oprogramowanie z repozytorium. Praca na tym koncie jest dość + niebezpieczna z punktu widzenia systemu, ponieważ ten użytkownik + jest wstanie wykonać czynności prowadzące do zniszczenia całego + systemu. Na Linuksie root ma do tego pełne prawo, dlatego + projektancji dystrybucji starają się ograniczyć konieczność pracy + z wykorzystaniem tego użytkownika. +

+

+ Innym tworem podobnym to użytkowników są grupy. + Grupy są zbiorem użytkowników, a ich zadaniem jest współdzielenie + plików wewnątrz jednej grupy, między jej użytkownikami. +

+

2. Podstawy obsługi Linuksa

+

+ W tym rozdziale przedstawione zostaną podstawy obsługi systemu + Linux, oczywiście z poziomu powłoki, ponieważ inne sposóby + zależą w dużej mierze od programów, które do tego celu będziemy + wykorzystywać. Takich programów może być kilka, powłok + również dostępnych jest kilka rodzajów, jednak sam program powłoki + nie będzie wpływać na prezentowane w tym rozdziale czynności. Ten + rozdział zaczniem od tego czy jest powłoka. +

+

2.1. Powłoka

+

+ Powłoka jest chyba jednym z najistoniejszych + komponentów systemu + Linux, pozwala ona na uruchamianie róznych poleceń wydawanych przez + użytkownika. Powłoki są również małymi środowiskami programistycznymi. + Nie które narzędzia systemowe są skryptami powłoki - + plikami tekstowymi zawierającymi zbiór wykonywanych kolejno (jedno po + drugim) poleceń powłoki. +

+

+ Pierwotną powłoką była powłoka Bourna, opracowana + jeszcze dla systemu UNIX w laboratoriach Bell Labs. Mimo + niezbyt częstego wykorzystywania, powłoka ta jest stałym kompenetem + nie tylko systemu Linux, ale i innych systemów uniksopodbnych. + Obecnie wykorzystywaną powłoką jest BASH - + ulepszona wersja oryginalnej powłoki. Korzystając z róznych + dystrybucji, domyślna powłoka może być inna. Ten materiał zakłada + wykorzystanie powłoki BASH, szczególnie w rozdziale poświęconym + skryptom powłoki. +

+

2.2. Korzystanie z powłoki

+

+ Dostęp do powłoki może odbywać się w dwojaki sposób wykorzystać + możemy wbudowaną w każdą dystrybucję konsole, nie zależnie od + instalacji wybranej przez nas dystrybucji. Jeśli jest to dystrybucja + skierowana do komputery biurkowe, to możemy skorzystać z wbudowanego + programu terminal. Po uruchomieniu okna powłoki, w prawym + górnym rogu pojawi się symbol zachęty. Jest to ciąg + znaków wskazujący wiersz, w którym będziemy wprowadzać polecenia. + Znak zachęty może przyjmować różną formę: +

+
    +
  • użytkownik@host:ścieżka$ - + użytkownik - nazwa użytkownika, + host - nazwa komputera, + ścieżka - obecna ścieżka + (czym jest ścieżka, będzie za chwilę). Tego typu symbol zachęty + stosowany jest w dystrybucjach opartych na GNU/Linux Debian takich + Linux Mint (Mint oparty jest na Ubuntu, a Ubuntu na GNU/Linux + Debian) czy Ubuntu.
  • +
  • [użytkownik@host:katalog]$ - + użytkownik i + host podobnie jak wyżej, + katalog - katalog w którym się + obecnie znajdujemy, z tego typu znakiem zachęty spotkamy się + w dystrybucjach RHEL/Fedora/CentOS oraz Arch Linux.
  • +
  • bash-wersja$ - Originalny symbol + zachęty powłoki BASH, wersja + przedstawia wersję wykorzystywanej powłoki, spotkamy go + w ręcznych instalacjach powłoki (kompilacji kodu źródłowego)
  • +
  • $ - symbol zachęty + wykorzystywany w celu zaoszczędzenia miejsca w wierszu polecenia.
  • +
+

+ W tych symbolach jeden element jest stały jest to znak dolara + ($), oznacza on że polecenia wydawane będą jako + zwykły użytkownika, innym symbolem jest znak krzyżyka + (#), który mówi nam że polecenia będą uruchamiane + przez superużytkownika. Najprostsze polecenie jakie możemy wydać + jest użycie polecenia echo, które zwraca na + standardowe wyjście podajny mu jako argument ciągu znaków: +

+
+$ echo Witaj świecie.
+
+

+ W przykładach w tym materiale, jeśli polecenia ma zostać wydane z + uprawnieniami zywkłego użytkownika, przed poleceniem będzie + pojawiać się znak dolara ($), a jeśli polecenie ma + być uruchomione z wyższymi uprawnieniami, będą one poprzedzone + znakiem krzyżyka (#) oznaczający uprawnienia + użytkownika root. +

+

2.2.1. Polecnie cat

+

+ Polecenie cat wypisuje na standardowe wyjście + podane w argumentach pliki jeden po drugim dokonując tym samym + połączenia (konkatenacji - stąd nazwa polecenia) na jednym + strumieniu zawartości tych wszystkich plików. +

+
+$ cat plik1 plik2 plik3 ...
+
+

2.2.2. Standardowe wyjście i standardowe + wejście

+

+ Użyłem powyższego polecenia cat, aby nakreślić kontekst dla + omówienia dwóch podstawowcyh strumieni. Linux wykorzystuje strumień + wejściowy do odczytu danych, a strumień wyjściowy do ich zapisu. + Źródłem strumienia wejściowego może być plik, urządzenie, terminal czy + strumień wyjściowy innego procesu. +

+

+ Strumień wejściowy możemy zaobserować poprzez uruchomienie polecenia + cat bez żadnego pliku. Program nie zwróci od razu znaku + zachęty, ponieważ oczekuje na dane. Możemy wpisać co kolwiek, a po + naciśnięciu klawisza enter polecenie powtórzy ten wpisany + tekst. Z racji tego iż nie podaliśmy mu żadnego pliku polecenie + zaczęło korzystać ze strumienia standardowego wejścia, + przekazanego + mu przez jądro, w tym przypadku był to terminal, którym zostało + uruchomione to polecenie. Aby zakończyć to polecenie należy wciśnąć + kombinacje klawiszy Ctrl+d, która oznacza koniec + danych ze standardowego wejścia. +

+

+ Ze standardowym wyjściem jest podobnie, jądro + przezkazuje strumień standardowego wyjścia procesom, do którego + mogą one zapisywać swoje dane. Polecenie cat zawsze + wypisuje swoje + dane na standardowe wyjście, które przez uruchomienie polecenia w + terminalu jest do niego podłączone. Dzięki temu mogliśmy zobaczyć + wypisywane przez polecenie dane. +

+

+ Standardowe wyjście oraz standardowe wejście możemy zapisać + skrótowo stdout oraz stdin. + Takich nazw również należy się spodziewać w wszelakiej dokumentacji. +

+

+ Prócz wspomanianych strumieni istnieje jeszcze trzeci strumień + wejścia-wyjścia - standardowy strumień błędów. + Opiszę go nieco później. +

+

+ Strumienie są dość elastycznym mechanizem, można je zmusić do + odczytywania i zapisywania danych z innych miejsc niż terminal. + O przekierowaniach strumienii będzie nieco poźniej w tym rozdziale. +

+

2.3. Podstawowe polecenia

+

+ Poniżej znajduje się pogrupowane przedstawienie najbardziej + podstawowych poleceń niezbędnych do pracy w powłoce systemu Linux. +

+
    +
  • polecenie ls - wypisuje zawartość katalogu. + Najważniejsze opcje: +
      +
    • -a - powoduje wyświetlenie wszystkich + elementów, łącznie z tzw. dot-files (plikami ukrytymi, + plikami konfiguracyjnymi
    • +
    • -l - wyświetlenie zwartości katalogu w + postaci kilku kolumnowej tabeli zawierającej m.in uprawnienia, + czas ostatniej modyfikacji plików, wielkość czy przypisanie + pliku, katalogu do użytkownika oraz grupy. +
  • +
  • polecenie cp - kopiujej pliki + Najważniejsze opcje: +
      +
    • -p - zachowuje atrybuty kopiowanych plików, + na przykład takie jak uprawnienia czy przypisanego właściela i + grupę
    • +
    • -r - kopiowanie rekurencyjne, kopiuje całe + katalogi wraz z podkatalogami oraz ich zawartością.
    • +
    • -v - włącza komunikaty diagostyczne, + polecenie wypisuje co, gdzie kopiuje. Normalnie program nie + zwraca nic poza znakiem zachęty po zakończonym kopiowaniu.
    • +
  • +
  • polecenie mv - w najprostszym przypadku + polecenie służy do zmiany nazwy pliku, jednak gdy drugim + argumentem będzie katalog, plik zostanie przeniesiony do tego + katalogu. Najważniejsze opcje: +
      +
    • -v - włącza komunikaty diagnostyczne, + identycznie jak w przypadku cp.
    • +
  • +
  • polecenie touch - aktualizuje czas modyfikacji + pliku, jeśli plik nie istnieje to zostanie utworzony pusty plik o + podanej w argumencie nazwie.
  • +
  • polecenie rm - polecenie służy do kasowania + plików. Kombinacja opcji -rf wykorzystywana jest + kasowania całych katalogów z podkatalogami. Najważniejsze opcje: +
      +
    • -r - umożliwia, kasowanie rekurencyjne, + całych katalogów z podkatalogami.
    • +
    • -f - przed każdym kasowaniem pliku polecenie + pyta czy jesteśmy pewni, że chcemy skasować ten plik. Ta opcja + pomija to pytanie wymusząjąc tak jakby kasowanie.
    • +
  • +
  • polecenie echo - polecenie wypisuje ciąg znaków + podany jako argument na standardowe wyjście. Najważniejsze opcje: +
      +
    • -n - ta opcja wyłącza przechodzenie + do nowej linii, po wypisaniu ciągu znaków.
    • +
  • +
+

Polecenia działające na katalogach

+

+ Uniksy w tym i Linux, korzystają ze standardu hierarchi katalogów, + aby utrzymać w porządku dane przestrzeni użytkownika. Za początkowy + katalog uznaje się katalog główny oznaczany prawym + ukośnikiem lub + slashem (/), wewnątrz tego katalogu znajdują się + pod katalogi, przechowujące konkretny rodzaj czy typ plików zgodny + z ich przeznaczeniem. +

+

+ Droga do konkretnego katalogu nosi nazwę ścieżki. + Jeśli ścieżki zaczynają się od /, czyli od katalogu głównego + mamy doczynienia ze ścieżką bezwzględną. Elementy + katalogów na + ścieżkach katalogi mogą być również wyrażane z pomocą jednej lub + dwóch kropek. + Dwie kropki (..) oznaczają katalog nadrzędny + względem aktualnego katalogu, zaś jedna kropka oznacza + (.) aktualny katalog. Ścieżki nie zawierające + slasha na początku, czyli nie zaczynające się od katalogu głównego + są wówczas określane mianem ścieżki względnej. +

+
    +
  • polecenie cd - polecenie służy do zmiany + aktualnego katalogu, jako argument przyjmuje katalog, do którego + checemy przejść, równie dobrze możemy przenieść się w dowolne + miejsce w systemie plików (w katalogu głównym) podając jako + argument ścieżkę. Nie podanie argumentu spowowduje przejście do + katalogu domowego użytkownika.
  • +
  • polecenie mkdir - polecenie tworzy nowy katalog. + Jako argument przyjmuje nazwę katalogu lub ścieżkę. Najważniejsze + opcje: +
      +
    • -p - opcja tworzy katalogi nadrzędne podane + w ścieżce o ile te nie istnieją. Za pomocą odpowiednich + podstawień powłoki oraz tej opcji można tworzyć całe struktury + katalogowe.
    • +
  • +
  • polecenie rmdir - usuwa katalog po warunkiem, że + jest on pusty. W przeciwnym razie polecenie zwróci błąd. Chcąc + usuwać całe katalogi z danymi oraz podkatalogami należy użyć + polecenia rm -rf.
  • +
+

2.4.1. Nazwy wieloznaczne.

+

+ Dzięki możliwością powłoki możemy porównywać proste wzorce z nazwami + plików w obrębie aktualnego katalogu roboczego (katalogu w którym + się znajdujemy) czynność ta nazywana jest rozwijaniem nazw lub + globbingiem. Jednym z elementów biorących udział w + rozwiązywaniu nazw jest gwiazdka (*) oznaczająca + dowolną ilość dowolnych znaków. Dla przykładu poniższe polecenie: +

+
+$ echo *
+
+

+ Zwróci nazwy wszystkich plików i katalogów znajdujących się w + katalogu. Innym + znakiem wykorzystywanym przy nazwach wieloznacznych jest + znak zapytania (?) reprezentuje on jeden dowolny + znak, dla wzorca b?at pasującymi nazwami mogą być + blat oraz brat. Rozwinięcia nazw dokonuje powłoka + przed uruchomieniem, więc jeśli chcemy aby, któreś ze znaków + wieloznacznych trafiło do polecnie to należy umieść je w pojedyńczych + cudzysłowach. +

+

2.5. Polecenia pośredniczące

+
    +
  • polecenie grep - wyszukuje wzorzec + w podanym pliku. Polecenie to korzysta z systemu wzorców nazwanych + wyrażeniami regularnymi. Najważniejszymi opcjami: +
      +
    • -i - wyłącza rozróżnianie małych i + wielkich liter.
    • +
    • -v - podwoduje odwrócenie wyszukiwania, + zwracane są wyniki nie pasujące do wzorca.
    • +
    • -e - wykorzystuje rozszerzony zestaw + instrukcji pozwalajacych na tworzenie wyrażeń regularnych.
    • +
    • -o - opcja powoduje zwrócenie dokładnie + tylko tych znaków pasujących do wzorca. Normalnie polecenie zwraca + linię z elementami pasującymi do wzorca, w przypadku wielu plików + zwraca również nazwę pliku.
    • +
    + Tworzenie wyrażeń regularnych oraz więcej opcji tego polecenia + znajduje się na stronie podręcznika uruchamianej poleceniem: +
    +$ man grep
    +
    + Do najważniejszych wyrażeń, które każdy powinien znać należą: +
      +
    • .* - oznaczające dowolną ilość dowolnych + znaków.
    • +
    • . - oznacza jeden dowolny znak.
    • +
  • +
  • polecenie less - wypisuje dane z pliku, lub + ze strumienia wykorzysując podział na strony. Jedna strona to jeden + ekran. Następne strony są wyświetlane za naciśnięciem spacji + stronę możemy cofnąć klawiszem b, zakończyć przeglądanie + danych klawiszem q. Dane możemy przeglądać linia po linii + używając strzałek. Możliwe jest również wyszukiwanie fraz w danych + za pomocą / (wyszukiwanie w przód) lub za pomocą + ? (wyszukiwanie w tył).
  • +
  • polecenie pwd - wyświetla obecny katalog + roboczy powłoki (świeżkę na której się znajdujemy). Polecenie + niepozorne choć przydatne, ze względu na dowiązania symboliczne + (będzie o nich w dalszej części materiału), które mogą przesłaniać + ścieżkę wyświetlaną w znaku zachęty. Najważnejsza opcja jest + uruchamiana, gdy nie ma żadnej opcji, więc jej opis pominę. + Warto dodać, że obecne systemy posiadają polecenie pwd + wbudowane w powłokę. Dlatego też opcja -P + rozwijająca fizyczne ścieżki nie jest automatycznie uruchamiana + w przypadku poprostu wydania polecenia pwd, prawdziwe + polecenie pwd uruchamiamy: +
    +$ /usr/bin/pwd
    +
    +
  • +
  • polecenie diff - wszukuje różnice pomiędzy + dowoma plikami tekstowymi. Polecenie to posiada wiele różnych opcji + formatowania danych wyjściowych, najbardziej czytelnym pozostaje + chyba użycie opcji -u. Polecenie wykorzystywane + programistów oraz system kontroli wersji git.
  • +
  • polecenie file - polecenie zwraca format pliku + podanego jako argument. W uniksach nie potrzeby stosowania + rozszerzeń plików, więc to polecenie może pomóc nam dowiedzieć + się co zawiera plik.
  • +
  • polecenie find i locate - + polecenia te służą do wyszukiwania plików w systemie. Polecenie + find wymaga podania katalogu po nazwie polecenia, nazwy + wyszukiwanego pliki po opcji -name oraz opcji + -print, która powoduje wyświetlenie na strumieniu + standardowego wyjścia nazw plików pasujących do wzorca podanego w + opcji -name. Polecenie locate na podobne + zastosowanie jak find działa jednak od niego szybciej + ponieważ bazuje na indeksie przygotowywanym co jakiś czas przez + system operacyjny. Może być ono bezużyteczne, kiedy szukamy nowych + plików, gdyż mogą być one nie ujęte jeszcze w indeksie.
  • +
  • polecenie head i tail - + te polecenia służa do prezentowania wycinka danych czy to ze + strumienia lub z pliku. W przypadku polecenia head + prezentowane jest n pierwszych linii, domyslnie 10; + z kolei polecenie tail prezentuje n koncowych linii. + Liczbę linii podajemy bezpośrednio po znaku myślnika + (-). Z tych dwóch poleceń polecenie tail + ma nieco większe zastosowanie niż polecenie head. Mozemy + wywołać to polecenie aby wyświetlić dane od linii, numer linii + podajemy po znaku plusa (+), inna właściwością + chyba najważniejszą jest wyświetlanie danych na żywo, używając + opcji -f, a następnie nazwy pliku lub myślnika + gdy dane pochodzą ze strumienia wyjściowego innego polecenia.
  • +
  • polecenie sort - układa wiersze z pliku + tekstowego w porządku alfabetycznym, jeśli na początku wierszy + znajdują się liczby to aby je posortować należy użyć opcji + -n, aby odwrócić sortowanie możemy użyć opcji + -r.
  • +
+

2.6. Zmiana hasła i powłoki

+

+ W celu zmiany hasła należy użyć polecenia passwd. + Polecenie poprosi o podanie obecnego hasła, po zatwierdzeniu go + zostaniemy poproszeni o nowe hasło i jego potwierdzenie (wpisanie + ponowne nowego hasła). +

+

+ Zmiana aktywnej powłoki odbywa się za pomocą polecenia + chsh, albo użyć poleceń odpowiadających nazwom + innych powłok, kolejno ksh - Korn SHell, + tcsh - TENEX C SHell. Użycie tych poleceń w + aktywnej powłoce, spowoduje uruchomienie podpowłoki. Zamkniecie + jej spowoduje powrót do pierwotnej powłoki. +

+

2.7. Pliki z kropką

+

+ Przeglądając pliki nawet w własnym katalogu domowym możemy znaleźć + pliki, których nazwa zaczyna się od kropki. Nie które źródła mówią + tym o że te pliki są ukryte. Do takich wniosków może dojść, + ponieważ te pliki nie są domyślnie wyświetlane przez polecenie + ls bez opcji -a lub przez menedżery plików dostępne + w desktopowych wersja Linuksa. Jednak te pliki nie różnia się niczym + od inny plików, poza właśnie tym przypadkiem opisanym powyżej. + Oprócz plików, nazwy katalogów również mogą zaczynać się od kropki. + Za pomocą prostego wzorca możemy wyświetlić wszystkie dot-files, + jeśli wsród nich trafi się katalog, wówczas zostanie wyświetlona jego + nazwa a pod nią jego zawartość. +

+
+$ ls .??*
+
+

2.8. Zmienne środowiskowe i powłoki

+

+ Powłoka może przechowywać zmienne tymczasowe, które mogą przechowywać + różne wartości, mogą one kontrolować zachowanie samej powłoki jedną + z takich zmiennych jest zmienna PS1 zawierająca + znak zachęty. Takie zmienne najczęsćiej wykorzystywane są w + skryptach powłoki i nazywane są zmiennymi powłoki. + Definicja zmiennych tego składa się z nazwy zmiennej, operatora + przypisania (znaku równości =) oraz wartości samej + zmiennej. +

+
+$ zmienna=12
+
+

+ Odwołać się do wartości zmiennej możemy w dowolnym momencie, podając + jej nazwę poprzedzoną znakiem dolara ($). +

+
+$ echo $zmienna
+
+

+ Zmienna środowiskowa jest podobna do zmiennej + powłoki, ale nie jest ściśle związana z powłoką, bowiem do pamięci + zmiennych środowiskowych systemach uniksopodobnych mają wszystkie + aplikacje, system operacyjny przezkazuje je do każdego programu + uruchomionego w powłoce, programy te nie mają jednak dostępu do + zmiennych powłoki. Zmienne środowiskowe definiuje się w ten sam + sposób + jak zmienne powłoki, jedna aby taka zmienna stała się zmienną + środowiskową musi zostać przeniesiona do pamięci tych zmiennych + za pomocą polecenia export. +

+
+$ zmienna=21
+$ export zmienna
+
+

+ Nie które programy mogą wykorzystywać zmienne środowiskowe do + własnej konfiguracji. Dla przykładu niektóre programy uruchamiane + w powłoce korzystają ze zmiennej środowiskowej EDITOR + definiujące domyślny program do edycji plików tekstowych. + Wykorzystanie zmiennych środowiskowych zapewne jest opisane w + na stronie podręcznika programu. +

+

2.9. Ścieżka poleceń

+

+ Istnieje specjalna zmienna środowiskowa PATH, + przechowywująca katalogi, w których to powłoka będzie szukać + programów odpowiadających wpisanym poleceniom. Jeśli wśród + przeszukiwanych katalogów znajduje się kilka programów o tej samej + nazwie to powłoka uruchomi pierwszy przez nią znaleziony. Ścieżki + katalogów w tej zmiennej odzielone są dwukropkiem (:). + Posiadając swoje programy, możemy również umieść katalog z nim + wewnątrz zmiennej $PATH. Opcje dodanie katalogu są dwie + i mogą mieć wpływ na funkcjonowanie systemu. Możemy dodać nasz + katalog na początku zmiennej, wówczas powłoka zacznie od niego + poszukiwania, jednak należy pamiętąc przy tym, aby nazwy programów + nie pokrywały się istniejącymi dotychczas poleceniami. +

+
+$ PATH=kat:${PATH}
+
+

+ Na powyższym przykładzie kat, to + nasz katalog z oprogramowaniem. Możemy jednak skorzystać + bezpieczeniejszego rozwiązania - dopisać nasz katalog na końcu listy + katalogów zmiennej PATH, wówczas nawet jeśli nasz program + będzie + nazywać się jak jedno z instniejących już poleceń w systemie, nie + będzie miało to wpływu na działanie systemu. +

+
+$ PATH=${PATH}:kat
+
+

+ Na powyższych przykładach użyłem znaku dolara wraz z nawiasami + klamrowymi. Jest to sposób na separacje nazwy zmiennej od innych + znaków, po to aby powłoka nie potraktowała jak w przykładzie powyżej + ciągu znaków ":kat" jak części nazwy zmiennej. Przedstawione w + przykładach polecenia są nie groźne, jeśli uszkodzimy zawartość + zmiennej PATH, to należy zamknąć okno terminala i otworzyć + nowe. +

+

2.10. Znaki specjalne

+

+ W systemach uniksopodbnych wiele znaków ma szczególne znaczenie. + Poniżej znajduje się tabela przedstawiająca wykorzystwane podczas + używania systemu znaki specjalne. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ZnakNazwaOpis
*gwiazdkaWyrażenie regularne, znak nazwy wieloznacznej
.kropkaAktualny katalog, ogranicznik nazwy pliku lub hosta
!wykrzyknikNegacja, historia poleceń
|potokPotoki poleceń
/slashOgranicznik katalogów, polecenie szukania
\backslashLiterały, makra (nigdy katalogi)
$dolarOznaczenie zmiennych, koniec wiersza
'pojedynczy cudzysłówCiągi znaków literałów
`lewy cudzysłówPodmiana polecenia
"podwójny cudzysłówCiągi znaków pseudoliterałów
^daszekNegacja, początek wiersza
~tyldaNegacja, skrót katalogu
#krzyżykKomentarze, dyrektywy preprocesora, podmiany
[]nawiasy kwadratoweZakresy
{}nawiasy klamroweBloki poleceń, zakresy
_podkreślenieProsty zamiennik spacji
+

+ Często możemy napotkać symbol daszka (^) zastępujący + klawisz Control, przez co zapis ^C jest równe + kombinacji klawiszy Ctrl+C. +

+

2.11. Edycja wiersza poleceń

+

+ Znak zachęty wskazuje wiersz polecenia, który możemy edytować + przesuwając kursor za pomocą strzałek. Chcąc powtórzyć jakąś czynność + nie musimy pisać na nowo tego polecenia, możemy wybrać je z historii + poleceń za pomocą strzałek w góre i w dół. Warto jednak obsługę + wiersza poleceń za pomocą strzałek odstawić na bok. Wykorzystując + skróty z poniższej tabeli, możemy nimi śmiało zastąpić strzałki. + Istnieją ku temu dwa powody. +

+
    +
  • Nie wszystkie klawiatury posiadają strzałki, lub ich użycie jest + strasznie nie konfortowe.
  • +
  • Wiele programów uniksowych (w tym i linuksowych) obsługuje się + za pomocą tzw. biblioteki GNU Readline (skróty + klawiszowe w tabeli poniżej), a nie za pomocą strzałek.
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KlawiszeOperacja
Ctrl+bPrzesunięcie kursora w lewo
Ctrl+fPrzesunięcie kursora w prawo
Ctrl+pPowrót do poprzedniego polecenia (lub przesunięcie kursora + w górę)
Ctrl+nPrzejście do następnego polecenia (lub przesunięcie klawisza + w dół)
Ctrl+aPrzesunięcie kursora na początek wiersza
Ctrl+ePrzesunięcie kursora na koniec wiesza
Ctrl+wUsunięcie słowa poprzedzjącego kursor
Ctrl+uUsunięcie tekstu od kursora do początku wiersza
Ctrl+kUsunięcie tekstu od kursora do końca wiersza
Ctrl+YWyklejanie usuniętego tekstu (na przykłda usuniętego + poleceniem Ctrl+u)
Ctrl+hSubstytut klawisza Backspace
Ctrl+dSubstytut klawisza delete
Ctrl+j, Ctrl+mSubstytut klawisza enter
+

2.12. Edytory tekstu

+

+ Na Linuksie mamy podobną ilość edytorów tekstowych do wyboru jak w + przypadku systemów MS Windows czy Apple macOS. Jak nie więcej. + Co ciekawe macOS, również jest system uniksopodobnym. Więc to co + zostało omówione w tym rozdziale również będzie kompatybilne z tym + systemem. Wracając jednak do edytorów tekstu. Tak naprawdę to + istnieją dwa, na które warto zwrócić uwagę, oba są standardem jeśli + chodzi o edycje tekstu i oba wymagają nauki obsługi. Wybór + pozostawiam do roztrzygniecia Tobie. +

+
    +
  • GNU Emacs - edytor w którym można zrobić + wszystko, od pisania tekstów do wykorzystania go jako menedżer + okien. Jego obsługa nie jest zbyt szybka i często by się + wydawało proste czynności wymagają użycia kliku poleceń. Wydaje + mi się, że nie ma bardziej rozbudowanego uniksowego programu. + Pomoc w obsłudze tego edytora, możemy uruchomić naciskając + Ctrl+H następnie klawisz t.
  • +
  • VIm - szybki edytor uruchamiany w terminalu, + choć można zainstalować wersję graficzną. Obsługuje się go trochę + jak grę. VIm, jest nieco bardziej intuicyjny od Emacsa. Warto + dodać, że edytor ten bywa domyślnie doinstalowywany do wielu + dystrybucji jak i innych systemów uniksowych, choć tam może + występować w podstawowej wersji Vi. Chcąc + nauczyć się edytora Vim, możemy skorzystać z + z instalowanego wraz z edytorem tutoriala, uruchamianego poleceniem + vimtutor.
  • +
+

+ Jeśli potrzebujemy edytora, który jest wstanie zatąpić nam + środowisko graficzne, wybierzmy edytor Emacs. Jeśli jednak + chcemy + poprostu edytować pliki, w każdym możliwym środowisku wybierzmy + edytor Vim. Osobiście jestem przyzwyczajony już do edytora + Vim. +

+

2.13. Uzyskiwanie pomocy

+

+ Dystrybucje Linuksa są rozporowadzane z dużą ilością różnej + dokumentacji. Informacje temat poleceń możemy znaleźć na stronach + podręcznika, wydając polecenie man i podając jako + argument interesujące nas polecenie. Na przykład: +

+
+$ man ls
+
+

+ W ten sposób uruchomimy stronę podręcznika polecenia ls. + Większosć stron podręcznika podaje suche informacje na temat + polecenia, nie ma co tam szukać jakiś samouczków. Opcje podawana są + usystematyzowany sposób (najczęściej alfabetyczny), nie które + strony podręcznika mogą zawierać przykłady. +

+

+ Strony podręcznika możemy przeszukać pod kątem słowa kluczowego, za + pomocą opcji -k, polecenia man. Wynikiem + tego polecenie jest lista poleceń, oraz krótki opis zawierający + podane słowo kluczowe, ciekawa jest liczba podana w nawiasie obok + nazwy polecenia, jest to numer rozdziału. +

+

+ Strony podręcznika są podzielone rozdziały oznaczone numerami, każdy + z nich zawiera innego rodzaju strony podręcznika. Rozdziały + zostały opisane w tabeli poniżej. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RozdziałOpis
1Polecenia użytkownika
2Niskopoziomowe wywołania systemowe
3Dokunentacja wysokopoziomowych bibliotek Uniksa
4Informacje o interfejsach urządzeń i sterownikach
5Opisy plików (konfiguracji systemu)
6Gry
7Formaty plików, konwencje i kodowaniaa (ASCII, przyrostki itd)
8Polecenia systemowe i serwery
+

+ Jak uzupełnienie tego materiału świetnie sprawdzą się rodziały + 1,5,7 i 8. Wywołanie konkretnej strony a danego rozdziału wymaga + podania jego numeru jak pierwszego argumentu, wówczas polecenie + będzie wszukać informacji na temat podanego słowa w danym rodziale. + Świetnym przykładem może być, chęć sprawdzenia na stronach + podręcznika pliku /etc/passwd. Należy wydać polecenie: +

+
+$ man 5 passwd
+
+

+ Dość często wykorzystywanym sposóbem na uzyskanie informacji o + poleceniach mogą być same polecenia, sprawdźmy czy możemy je + uruchomić z opcją -h lub --help. +

+

+ Projekt GNU jakiś czas temu zadecydował, że będzie używać innego + formatu plików pomocy niż strony podręcznika, format nazywana jest + info lub texinfo. Format ten + zawiera więcej informacji choć jest od niego bardziej skomplikowany. + Przypomina prostą stronę internetowa, otworzoną w terminalowej + przeglądarce. Tego typu pliki pomocy uruchamiane są za pomocą + polecenia info, po czym podaje mu się jako argument + interesujące nas polecenie. +

+

+ Nie które z pakietów umieszczają swoją dokumentację w katalogu + /usr/share/doc nie zwracając uwagi na format. Warto + pamiętać o tych miejscach szukając pomocy, oczywiście pozostaje na + do dyspozycji jeszcze internet. +

+

2.14. Wejście i wyjście powłoki

+

+ Omawiając po krótce powłokę, wspomniałem o strumieniach standardowego + wejścia i wyjścia. Wiele poleceń używa wyjścia aby wypisywać + wyniki działa lub komunikaty diagonstyczne. Jeśli nie chcemy ich + widzieć lub nie nadąrzymy ich analizować możemy je przekierować + na przykład do pliku, za pomocą znaku przekierowania (>). +

+

+ Używając tego znaku musimy omówić sobie jedną ważną rzecz, znak ten + powoduje nadpisanie wszystkiego co znajduje się w pliku. Tego typu + czynność nazywana jest wymazywaniem + (ang. clobbering). Możemy jednak zablokwać to działanie + za pomocą odpowiednich ustawień powłoki, dla BASH wystarczy użyć + polecenia set -C. Poza blokowaniem + wymazywania, istnieje jeszcze jeden znak przekierowania, który + powoduje dopisanie przekierowanego wyjścia do pliku: + >>. +

+

+ Za pomocą przekierowań możemy w prosty sposób połączyć wyjście + jednego polecenia z wejściem innego. Służy temu znak potoku + (|). Postawienie ponowej kreski, pomiędzy + poleceniami w wierszu polecenia połączy wyjście pierwszego z wejściem + drugiego. +

+

2.14.1 Standardowy strumień błędów

+

+ Korzystając powyższych znaków przekierowania polecenia, dane + wyjściowe programów zostaną przekierowane np. do pliku. Ale + komunikaty diagnostyczne nadal są wyświetlane. Dzieje się to dlatego + iż komunikaty diagnostyczny wykorzystują trzeci dodatkowy strumień + standardowy strumień błędów zapisywany skrótowo + stderr, który podobnie do stdout jest + podłączony do terminala. +

+

+ Do przekierowania tego strumienia musimy użyć identyfikatorów + strumienii jest to liczba, którą posługuje się jądro do rozrózniania + strumieni. W fachowej + literaturze bądź dokumentacji możemy natknąć się na termin + deskryptor pliku. Taki identyfikator dla stderr + ma wartość 2, a dla stdout 1. + Chcąc przekierować stderr do innego pliku musimy podać jego + identyfikator przed znakiem przekierowania. Innym przypadkiem jest + przekierowanie stderr do tego samego pliku co stdout, + wówczas najprostszym sposób jest podłączenie strumienia błedów do + standardowego wyjścia za pomocą znaku >& + podając przekierowywany strumień po lewej stronie znaku (przed nim) + a strumień docelowy po prawej (za nim). +

+
+$ ls /ffffffff >p 2>&1
+
+

2.14.2. Przekierowanie standardowego wejścia

+

+ Przekierowanie standardowego wejścia występuję dość rzadko ponieważ + większość poleceń przyjmuje plik jako argument, jednak może zdarzyć + się potrzeba przekierowania wejścia do polecenia. Służy temu + znak przekierowania wejścia <. +

+

2.15. Odczytywanie komunikatów o błędach

+

+ Prędzej czy później gdzieś podczas naszej pracy z powłoką zdarzy + się błąd. Ważne jest aby umieć go odczytać i prawidłowo z + interpretować. +

+

+ Sam komunikat składa się przeważnie z nazwy polecenia oraz + komunikatu błędu, w nie których przypadkach w komunikacie + znajduje się nazwa pliku, jednak dotyczy specyficznych komunikatów + o błędach. Poniżej znajduje się + lista, błędów z którym będziemy się spotykać podczas pracy z systemem + Linux. +

+
    +
  • No such file or directory + (nie ma takiego pliku lub katalogu) - występuje gdy + plik lub katalog podany jak argument nie istnieje. Innym powodem + występowania takiego błędu może być błędnie zapisana nazwa + polecenia w skrypcie.
  • +
  • File exists (plik istnieje) - ten + problem występuje w momencie gdy próbujemy stworzyć katalog o + nazwie pliku, który już istnieje.
  • +
  • Not a directory (nie jest katalogiem), + Is a directory (jest katalogiem) - błąd + występuje w momencie gdy probujemy użycie pliku jak katalogu lub + katalogu jak pliku.
  • +
  • No space left on device (brak miejsca w + urządzeniu) - Na pamięci masowej, której próbujemy zapisać + dane brakuje wolnego miejsca.
  • +
  • Permission denied + (niewystarczające uprawnienia) - pojawienie się tego błędu + może mieć dwa powody, pierwszy to zapis lub odczyt informacji z + pliku, do którego nie mamy żadnych uprawnień; drugim jest próba + uruchomienia pliku/programu bez ustawionego bitu wykonania. O + uprawnieniach będzie w dalszej części tego rodziału.
  • +
  • Operation not permitted (brak zezwolenia + na wykonanie operacji) - błąd występuje w momencie gdy + spróbujemy zakończyć proces nie należący do nas.
  • +
  • Segmentation fault (błąd segmentacji) - + błąd programisty. Program, który uruchomiliśmy próbował + użyskać dostęp do wycinka pamięci, którego nie miał żadnych + uprawnień i jego działanie zostało przerwane przez jądro. + Najczęsciej polskie tłumaczenie tego błędu to + Naruszenie ochrony pamięci.
  • +
  • Bus Error
  • (błąd magistrali) błąd + podobny do Naruszenia ochrony pamięci, jednak w tym + przypadku chodzi o dostęp do pamięci w sposób niewłaściwy, a nie + dostęp do innego obszaru pamięci. +
+

+ Jeśli natrafimy na jeden z dwóch ostatnich błędów, to przyczyną mogą + być dane przekazane do programu, których on się nie spodziewał. +

+

2.16. Przeglądanie procesów i + manipulowanie nimi

+

+ Każdy proces jest programem. Jądro pododobnie jak użytkowników + procesy widzi za pomocą liczbowych identyfikator - + process ID - PID. Za pomocą + polecenia ps możemy wylistować wszystkie procesy + uruchomione w powłoce. Domyślnie wynik polecenia podzielony jest na + cztery kolumny. +

+
    +
  • PID - identyfikator procesu
  • +
  • TTY - urządzenie terminala, na którym działa + dany proces.
  • +
  • STAT - stan procesu, np. S + oznacza uśpieje procesu, zaś R - jego dzialanie. + Wszystkie oznaczenia znajdują się na stronie podręcznika + polecenia.
  • +
  • CMD - treść polecenia, warto jednak zaznaczyć, + że procesy mogą ją zmieniać.
  • + +
+

+ Polecenie ps, możemy obsługiwać za pomocą opcji zapisanych w + trzech stylach, jednak najbardziej powszechnym jest styl BSD, i to + zapis opcji w tym stylu przedstawie. +

+
    +
  • ps x - wyświetla wszystkie procesy uruchomione + przez aktualnego użytkownika.
  • +
  • ps ax - wyświetla wszystkie procesy działące + w systemie.
  • +
  • ps u - wyświetla bardziej szczegółowe informacje + o procesach.
  • +
  • ps w - podaje pełne nazwy poleceń, nie + ograniczając się do pojedyńczego wiersza.
  • +
+

+ Tak jak w przypadku innych poleceń, w poleceniu ps, również + możemy łączyć opcje, dla przykładu chcąc wyświetlić wszystkie + procesy w systemie wraz ze szczegółami należy wydać polecenie + ps aux. +

+

+ Wyświetlenie informacji na temat, konkertnych procesów polega na + podaniu po opcjach identyfikatora procesu. +

+

2.16.1. Przerywanie działania procesów

+

+ Możemy zakończyć działanie procesu poprzez wysłanie do niego + sygnału za pomocą polecenia kill. + Wykorzystują to polecenie, jądro systemu proszone jest wysłanie + sygnału do wybranego procesu. Domyślnie wysyłanym sygnałem jest + TERM, a polecenie do swojego działania potrzebuje + tylko identyfikatora PID. +

+

+ Proces możemy zatrzymać wysyłając do niego sygnał STOP. + po nazwie sygnału podajemy PID, tak zatrzymany proces da się + wznowić za pomocą sygnału CONT. Nazwy sygnałów + podajemy po myślniku (-). +

+

+ Naciśnięcie kombinacji Ctrl+c podczas działania programu w + powłoce, jest równoznaczne z wysłaniem sygnału INT + (ang. Interrupt - przerwanie). +

+

+ Jedną z metod zakończenia procesu jest natychmiastowe zakończenie + jego pracy oraz usunięcie go siłą z pamięci, jest to osiągalne + poprzez wysłanie do niego sygnału KILL. Jest to + ostateczność, gdy dany proces nie odpowiada na inne sygnały. Inne + sygnały dają procesom możliwość poprzątania po sobie. +

+

+ Oczywiście nie należy przerywać pracy dowolnym procesom, kiedy nie + wiemy co robią. +

+

2.16.2. Kontrola zadań

+

+ Powłoki posiadają mechanizm dzięki, któremu możemy zatrzymywać oraz + wznawiać prace procesów za pomocą kombinacji Ctrl+z oraz + poleceniami fg, bg. Ten mechanizm + nazywa się kontolą zadań. Podczas działania procesu + w powłoce, możemy wysłać sygnał TSTP (podobny do + sygnału STOP), a następnie kiedy zechcemy do niego wrócić to + wystarczy wydać polecenie fg, które wznowi działanie + polecenia w terminalu, lub polecenia bg wznawiającego + działanie procesu w tle. +

+

+ Podobne działanie ma program GNU Screen, który jest + multiplekserem terminala, a co najlepsze jesteśmy wstanie odłączyć + sesję programu od pierwszego planu i pozostanie ona w + niezmienionej postaci, tak długo jak włączony jest komputer. +

+

2.16.3. Procesy działające w tle

+

+ Uruchamiając polecenie w powłoce dostęp do znaku zachęty, a co za tym + idzie wolnego wiersza polecenia otrzymujemy dopiero po zakończeniu + działania programu. Jednak możemy odłożyć wykonanie polecenia do tła, + poczym od razu uzyskamy dostęp znaku zachęty. Jest to przydatna + funkcją, gdy uruchamiamy polecenie, którego wykonanie może + zająć trochę czasu. Wykonanie odkładamy do tła dopisując + ampersand (&) na końcu polecenia (jako ostatni + argument). Działanie takiego programu + może trwać nawet po naszym wylogowaniu. Jeśli proces zakończy + działanie zostaniemy o tym poinformowani. +

+

+ Problem związanym z procesami działającymi w tle jest, możliwe + pobieranie informacji z standardowego wejścia. Jeśli nie + przewidzieliśmy takiego zachowania programu, to wówczas może zostać + on zatrzymany lub zakończony. Można go wznowić za pomocą polecenia + fg o ile został zatrzymany. Innym problemem jest wypisywanie + danych przez proces w tle na standardowe wyjście oraz strumień błędów. + Przed uruchomieniem takiego polecenia należy przekierować te + strumienie, ponieważ podczas pracy w terminalu z innymi aplikacjami + dane ze strumieni mogą zaburzać ich wyświetlanie. Jeśli powłoka + będzie dziwnie się zachowywać, wystarczy wydać polecenie + reset i wszystko wróci do normy. +

+

2.17. Tryb pliku i uprawnienia

+

+ Każdy plik na Uniksie (więc na Linuksie też), posiada komplet + uprawnień określajacy czy można go odczytać, + zapisać do niego lub go + uruchomić. Pierwsza kolumna wyniku polecenia ls -l + zawiera tryb pliku. Dane trybu możemy podzielić na cztery części + Typ, Uprawnienia użytkownika (właściciela), + Uprawnienia grupy, Uprawnienia pozostałych + użytkowników.. +

+

+ Pierwszy znak to typ pliku, jesli występuję w nim myślnik (-), + to mamy doczynienia ze zwykłym plikiem, innym typem pliku może być + litera d oznaczająca katalog. +

+

+ Pozostałe znaki, definiują uprawnienia. Dzieli się je na trzy grupy + wypisane powyżej, po trzy znaki na każdą z nich. W grupie (zestawie + uprawnień, przeznaczonym dla konkretnej grupy lub osoby) mogą + wystąpić 4 rodzaje znaków. +

+
    +
  • r - oznacza, że plik można czytać.
  • +
  • w - oznacza, że do pliku można pisać.
  • +
  • x - oznacza, że plik można uruchomić.
  • +
  • - - oznacza, brak uprawnienia.
  • +
+

+ Mówiąc o użytkowniku w pierwszym rodziale, wspomniałem że może być + on właścicielem pliku i do niego należy pierwszy zestaw uprawnień. + Drugi zestaw określa uprawnienia dla grupy, jaka została przypisana + temu plikowi, z tych uprawnień będzie korzystać każdy użytkownik tej + grupy, próbujący uzyskać dostęp do pliku. Trzeci grupa, należy do + pozostałych użytkowników systemu. Użytkownika root nie + obejmują żadne z powyższych grup, choć to może zależć od konfiguracji + systemu, mimo to superużytkownik może sobie zmieniać dowolnie + uprawnienia. +

+

+ Nie wymieniony na powyższej liście dodatkowym bitem (o uprawnieniach + możemy mówić jak o bitach, np. "potrzebuje bitu odczytu aby odczytać + dane z pliku") jest bit s - wybierz identyfikator + użytkownika. Pojawia się on zamiast bitu wykonywania x i + tyczy się wyłącznie plików wykonywalnych. Programy z ustawionym tym + bitem zawsze uruchamiają się z uprawnieniami ich właściciela bez + znaczenia, kto uruchamia ten program. Wiele programów korzysta z tego + rozwiązania, aby uzyskać uprawnienia superużytkownika i móc zapisywać + dane w różnych plikach systemowych. +

+

2.17.1. Modyfikacja uprawnień

+

+ Do zamiany uprawnień wykorzystamy polecenie chmod, + jako pierwszy podaje się zbiór uprawnień, a następnie bit uprawnienia + ze znakiem "+" jeśli chcemy dodać ten bit lub "-" jeśli chcemy ten + bit + usunąć. Zbiór uprawnień podajemy za pomocą pierwszych liter + angielskich + nazw u (ang. user)- użytkownika/właściciel, + g (ang. group) - grupa, + o (ang. others)- pozostali użytkownicy + systemu. +

+
+$ chmod go+r test.sh
+
+

+ Zbiory uprawnień można łączyć ze sobą, tak jak na powyższym + przykładzie lub jeśli chcemy dodać bit do wszystkich zbiorów to + możemy je pominąć jak na poniższym przykładzie. +

+
+-rw-r--r-- 1 xf0r3m xf0r3m 26 03-08 13:13 test.sh
+$ chmod +x test.sh
+-rwxr-xr-x 1 xf0r3m xf0r3m 26 03-08 13:13 test.sh
+
+

+ Przy plikach osobistych, nie warto dawać za dużych oprawnień + pozostałym użytkownikom. Chociaż obecnie może mieć to jedynie + znaczenie, gdy z serwera korzysta wielu wyspecjalizowanych + użytkowników. +

+

+ Innym sposobem na zmianę uprawnień jest użycie liczb, gdzie każda + z trzech liczb określa uprawnienia dla jednego zbioru. Liczby te są + sumami bitów, które reprezentowane są przez poszczególne wartości. +

+
    +
  • r - 4
  • +
  • w - 2
  • +
  • x - 1
  • +
  • - - 0
  • +
+
+$ chmod 644 test.sh 
+
+

+ Uprawnienia właściciela mają wartość 6. + co jest równe 4+2 - u+rw, grupa oraz pozostali mają + 4 co jest identyczne z zapisem + go+r. Liczby wykorzysywane tutaj pochodzą z oktalnego + systemu liczbowego. +

+

+ Zmiana uprawnień nosi nazwę bezwzględnej, ponieważ + zmieniane są uprawnienia wszystkich grup. +

+

+ Odnośnie uprawnień to istnieje bardzo ważna zależność pomiędzy bitami + odczytu oraz wykonania. Nadając katalogowi domowemu uprawnienia + rwxr--r-- czy 744. Pozostali użytkownicy będą + mogli odczytać zawartości katalog, ale nie uzyskają dostępu do pliku + podając go w jakimś poleceniu na ścieżce, do tego potrzebny jest + jeszcze bit wykonania. +

+

+ Za pomocą polecenia umask, możemy zdefiniować + domyślne uprawnienia dla plików. Polecenie to przyjmuje jako + argument te uprawnienia w postaci bezwględnej, które mają zostać + usunięte z nowoutworzonych plików i katalogów. Wydanie polecenia + umask: +

+
+$ umask 022
+
+

+ Spowoduje, że nowoutworzone pliki i katalogi będą mięc uprawnienia + w postaci rwxr-xr-x lub 755. Może wydawać się zbyt + liberalne, więc możemy ustawić argument polecenia nas 077, + wówczas + wszystkie utworzone pliki i katalogi będą wyłącznie dla nas. + Polecenie + umask, czesto występuje w plikach konfiguracyjnych powłoki. +

+ +

+ Dowiązanie syboliczne to jest alias będący plikiem wskazującym na + inny pliki lub katalog. Można uciec się do jednego słowa, że + dowiązanie symboliczne jest poprostu skrótem. +

+

+ Jeśli dowiązanie wskazuje na katalog, to przejście do dowiązania + przeniesie nas w miejsce, na które wskazuje. Cel dowiązania nie + musi nawet istnieć, jeśli jednak spróbuje przejść pod takie + dowiązanie wówczas uzyskamy typowy błąd, o tym że katalog nie + istnieje. Dowiązania uniemożliwają również sprawdzenie + charakterystyki + wskazywanego elementu, nie będzie wiadomo czy jest to plik, katalog + czy inne dowiązanie. Wiele połączonych ze sobą dowiązań symbolicznych + nazywane jest łańcuchem dowiązań +

+

+ Dowiązania symboliczne tworzone są za pomocą polecenia ln + z opcją -s (Ważne, aby użyć tej opcji). + Argumentami jest na początku cel a poźniej nazwa + dowiązania. Zachowanie kolejności argumentów jest ważne, ponieważ + możemy utworzyć dowiązanie, które prowadzi do nikąd i wprowadza + bałagan (być może w plikach systemowych). +

+

+ Mimo swoich wad dowiązanią są wygodną metodą na współdzielenie plików + oraz dodatkowo rozwiązują kilka drobnych problemów. +

+

2.18. Archiwizowanie i + kompresowanie danych

+

+ Przesyłając duża ilość małych plików przez sieć czy tez na pamięć + masową, możemy odczuć że trwa to wieki, na pewno trwa to dłużej niż + przesłanie jednego dużego pliku. Tutaj przedstawię sposoby na + stworzenie + jednego większego pliku z całego katalogu, przy czym użyjemy jeszcze + kilku algorytmów kompresii, przez co zaoszczędzimy na czasie i trochę + na zajmowanym miejscu. +

+

2.18.1. Program tar

+

+ Pierwsze narzędzie będzie służyć do tworzenia archiwum. Archiwa + łączą pliki i katalogi w jeden plik. Tar jest + standardowym program do archiwizacji na uniksach. + Tworzenie archwium za pomocą tar wymaga kilku + opcji. Natomiast składania polecenia jest następująca: +

+
+$ tar -cvf archiwum.tar plik1 plik2...
+
+

+ Opcja -c mówi programowi, że + tworzone będzie nowe archiwum, opcja -v + włącza komunikaty diagnostyczne wyświetlać one będą po kolei pakowane + do archiwum pliki; opcja -f + przekazuje programowi informacje o tym, że archwium będzie plikiem. + Domyślnie tar tworzył archiwa na taśmach. Obecnie pominięcie + tej opcji kończy pracę programu z komunikatem o błędzie. Możemy + natomiast użyć stdout podajac zamiast nazwy archiwum + myślnik (-). Póki co to archiwum nie jest jeszcze + skompresowane. +

+

Rozpakowywanie pliku

+

+ Rozpakowawanie różni się tylko jedną opcją - zamiast -c jest + -x. Następnie podajemy pozostałe opcje, a na końcu + nazwę pliku archiwum. +

+

Wyświetlenie zawartości archiwum

+

+ Wypakowanie całego archiwum może nie być do końca porządane, załóżmy + że potrzebujemy tylko jednego pliki. Za pomocą polecenia tar + z odpowiednim przełącznikiem możemy wyświetlić listę plików w + archiwum. Zamiast -x, używamy + -t reszta pozostaje taka sama, jeśli archiwum jest + duże to możemy podłączyć wyjście tar potokiem do polecenia + less. Samego wypakowania dokonujemy podając wypakowywanego + pliku za nazwą archiwum. +

+

+ Ostanią dość istotną opcję jest -p, która powoduje + zachowanie oryginalnych atrybutów plików, jakie miały podczas + pakowania. Kiedy superużytkownika używa tar, ta opcja jest + domyślnie włączona. +

+

2.18.2. Program gzip

+

+ Program gzip (GNU zip) jest standardowym + narzędziem kompresującym w systemach uniksowych. Pliki skompresowane + za jego pomocą otrzymują rozszerzenie .gz. + Dekompresuje się je za pomocą polecenia gunzip, jako + argument podaje się nazwę pliku. Natomiast kompresji dokonuje za + pomocą polecenia gzip, podając plik do + skompresowania jako argument. +

+

2.18.3. Skompresowane archiwa + tar.gz

+

+ Obsługę skompresowanych archwów przy użyciu gzip, + rozpoczniemy od rozpakowania takiego archiwum. Nie ma sensu używania + do tego dwóch osobnych poleceń, jest to z resztą marnowanie zasobów. + Chcąc rozpakować skompresowane gzip archiwum, należy użyć + polecenia tar a po opcji + -x dodać, opcję -z następnie pozostałe czyli + -vf i na końcu podać nazwę archiwum. Tak jak na przykładzie: +

+
+$ tar -xzvf archiwum.tar.gz
+
+

+ Przy tego typu archiwach, możemy spodziewać się rozszerzenia + .tgz. Są to te same archiwa, jak te mające + rozszerzenie tar.gz. +

+

+ Przy wyświetlaniu zawartości takiego archiwum, zamieniamy opcję + -x na -t. A chcąc takie archwiwum + utworzyć to opcję -x na opcję -c + oraz podać katalog lub listę plików, która ma zostać umieszczona w + archiwum po jego nazwie. +

+

2.18.4. Inne metody kompresji

+

+ Poza archiwami spakowanymi za pomocą gzip, możemy też + spotkać archiwa spakowane za pomocą bzip2 oraz + xz. W przypadku bzip2, to programem + dekompresującym jest bunzip2, a opcją programu + tar jest -j (mała litera j). Jeśli + natrafimy na archiwum skompresowane xz, to programem + dekompresującym jest unxz, a opcją programu + tar jest -J (wielka litera j). +

+

+ Część dystrybucji wyposażona jest w program unzip + pozwalający na rozpakowanie plików .zip przygotowanych + pod systemem MS Windows, jak i samo rozpakowywujących się plików + .exe. +

+

2.19. Hierarchia katalogów

+

+ Struktura katalogów głównego, jest utworzona na + podstawie standardu hierarchii systemu plików, + określającego jakie podkatalogi ma zawierać katalog główny, oraz + co te podkatalogi mają przechowywać. Poniżej opisano na ten czas + najważniejsze z nich. +

+
    +
  • /bin - przechowuje pliki binarne przygotowane + przez kompilator języka C, w nowocześniejszych systemach mogą to + być + skrypty powłoki. W nim przechowywane są te najprostsze polecenia + jak cp.
  • +
  • /dev - przechowuje pliku urządzeń.
  • +
  • /etc - katalog zawierający najważniejsze pliki + konfiguracji systemu. Znajdują się tutaj pliki haseł, konfiguracji + uruchamiania systemu, urządzeń, sieci i innych elementów systemu.
  • +
  • /home - zbiorczy katalog, katalogów domowych + użytkowników. Standard wśród wszystkich nowoczesnych uniksów.
  • +
  • /lib - katalog przechowywujący biblioteki. + Te pliki przechowują kod, który może być wykorzystywany przez + pliki wykonywalne. Biblioteki możemy podzielić na statyczne lub + współdzielone. Tylko biblioteki współdzielone powinny znajdować + się w tym katalogu, pozostałe pliki tego typu znajdują się + w katalogu /usr/lib.
  • +
  • /proc - udostępnia statystyki o systemie w + postaci interfejsu plików i katalogów. +
  • +
  • /sys - ten katalog jest podobny do katalogu + /proc, z tym, że tworzy interfejs dla urządzeń oraz + systemu. Wiecej informacji na ten temat, znajduje się w następnym + rozdziale. +
  • +
  • /sbin - w tym katalogu zapisane są systemowe + pliki wykonywalne. Programy znajdujące się w katalogach + /sbin przeznaczone są do zarządzania systemem, dlatego + ten katalog nie występuje na ścieżce zwykłego użytkownika a wiele + narzędzi będzie działać tylko z kontem root. +
  • +
  • /tmp - w tym katalogu możemy umieszczać pliki + tymczasowe, którymi nikt się nie będzie przejmować. Każdy + użytkownik może zapisywać i odczytywać pliki z katalogu w tym + katalogu, ale nikt nie ma dostępu do plików zapisanych przez innych + użytkowników. Nie które programy wykorzystują, ten katalog jako + przestrzeń roboczą. Nie należy zapisywać ważnych danych do tego + katalogu, gdyż jego zawartość jest przez wiekszość dystrybucji + czyszczona podczas uruchamiania systemu, inne mogą usuwać + starsze pliki co jakiś czas.
  • +
  • /usr - W tym katalogu znajdziemy rozbudowaną, + strukturę katalogów, bardzo podobną to katalogu głównego. W tym + katalogu zapisana jest większa części systemu Linux.
  • +
  • /var - podkatalog zawierający "zmienne" dane + zapisywane przez programy w czasie swojego działania. Tutaj + znajdują się m.in. pliki dzienników systemowych.
  • +
+

2.19.1. Pozostałe katalogi główne

+
    +
  • /boot - przechowuje plik ładujące jądro systemu + w czasie uruchamiania komputera. W większości dystrybucji w tym + katalogu przechowywane są właściwe pliki jądra oraz początkowego + systemu plików w pamięci RAM. Początkowy system plików pamięci RAM + zostanie omówiony w dalszej materiału.
  • +
  • /media - w wielu dystrybucjach jest to główny + punkt przyłączania wszystkich mediów wymiennych, takich jak + karty pamięci Flash.
  • +
  • /opt - może przechowywać dodatkowe + oprogramowanie firm trzecich. W wielu systemach katalog /opt + nie jest wykorzystywany.
  • +
+

2.19.2. Katalog /usr

+

+ To właśnie w katalogu /usr znajduje się większość programów + i danych przestrzeni użytkownika, a są one rozlokowane po jego + podkatalogach. Poniżej znajduje się opis co znajduje się w + poszczególnych podkatalogach tego katalogu: +

+
    +
  • bin - większość, jak nie wszystkie + ogólnodostępne programy w systemie.
  • +
  • include - przechowuje pliki nagłówkowe + wykorzystywane przez kompilator języka C.
  • +
  • info - zawierają strony dokumentacji + GNU info.
  • +
  • local - miejsce gdzie administratorzy mogą + mogą instalować swoje oprogramowanie, katalog ten może zawierać + podobną identyczną strukturę, jak katalog /usr lub + katalog główny.
  • +
  • man - przechowuje strony podręcznika + systemowego.
  • +
  • share - kiedyś ten katalog był katalogiem + współdzielonym między komputerami, obecnie stracił na znaczeniu. + Mimo to dalej przechwouje informacje, przeważnie są to pliki ikon, + pliki zawierające znaki + towarowe dystrybucji oraz inne dane z których może korzystać wiele + programów. Ten katalog może zawierać podkatalogi takie jak + man oraz info.
  • +
+

2.19.3. Umiejscowanie jądra w systemie

+

+ Wspomniałem już że plik jądra znajduje się w katalogu /boot, + plik ten rozpoczyna się od nazwy vmlinuz, po tych + znakach + mogą wystąpić inne inforamcje oznaczające jego wersje. Po załadowaniu + jądra przez program rozruchowy, sam plik przestaje być + potrzebny. W trakcie pracy systemu operacyjnego jądro wykorzystuje + najróżniejsze ładowane i usuwane dodatkowo modułu. Ładowane + moduły jądra umieszczane są w katalogu /lib/modules. +

+

2.20. Uruchamianie poleceń przez superużytkownika

+

+ Korzystając z linuksa na naszym osobistym komputerze, przyjdzie taki + moment że będziemy musieli skorzystać z konta użytkownika + root. Aby to zrobić możemy przelogować się na jego konto + wykonać potrzebne czynności a następnie się wylogować. Ta czyność + przyniosła by zamierzony efekt ale nie jest bez wad. Dlatego też + możemy skorzystać z polecenia sudo, które + pozwoli, na uruchomienie polecenia podanego jako arugment + z uprawnieniami + superużytkownika. Jeśli polecenie nie występuje w systemie, to jest + dobry czas aby przelogować się na użytkownika root, i je + zainstalować. Polecenie po zainstalowaniu nie zadziała samo w sobie + potrzebne jest jeszcze określenie, którzy użytkownicy mogą używać + tego polecenia i co za jego pomocą mogą zrobić. Za to odpowiada + pliki /etc/sudoers. +

+

2.20.1. Plik /etc/sudoers

+

+ Samo polecenie sudo ma bardzo duża ilość opcji, jednak na tym + etapie nie skorzystamy z większości z nich. Najprostszym sposobem + na konfiguracje pliku /etc/sudoers jest odnalezienie w pliku + linii rozpoczynającej się pod słowa root a następnie + pod tą linią wpisać linię rozpoczynjącą się nazwy użytkownika oraz + dopisaniu kilku opcji, tak jak na poniższym przykładzie. +

+
+user ALL=(ALL) ALL
+
+

+ Pierwsze ALL, oznaczna dowolny + komputer. Drugie + (ALL) w nawiasach oznacza, że możemy + wydać polecenie jako dowolny użytkownik, być może spotkamy się + z takim zapisem w nawiasie (ALL:ALL), oznacza ono dowolnego + użytkownika i dowolną grupę. Trzecie ALL + oznacza dowolne polecenie. +

+

+ Jeśli drażnić nas będzie ciągłe wpisywanie haseł, to możemy przed + trzecim ALL w konfiguracji umieścić opcję + NOPASSWD, pamiętając aby pomiędzy te opcje wstawić + dwukropek (:) bo tak naprawdę określamy jakie + polecenia mają być uruchamiane bez podawania hasła. +

+

2.21. Podsumowanie

+

+ Po przeczytaniu tego rodziały wydaje mi się, że każdy ma solidne + podstawy obsługi systemu Linux z poziomu powłoki. Powłoka jest + jednym ze stałych komponentów dystrybucji, a wiele z nich dalej + obstaje przy BASH-u, jako domyślnej powłoce. +

+

3. Urządzenia

+

+ Odkąd powstał system Linux, w sposobach prezentowania urządzeń + użytkownikowi zachodziło wiele zmian. Na początku tego rodziału + omówimy sobie tradycjny system sysfs. Aby potem + zająć się opisem systemu udev, pozwalającego + program przestrzeni użytkownika automatycznie konfigurować oraz + używać nowych urządzeń. Poznamy zasady, zgodnie z którymi jądro + wysyła do procesów komunikaty przy użyciu systemu udev + oraz dowiemy się w jaki sposób one reagują na nie. +

+

3.1. Pliki urządzeń

+

+ Jądro udostępnia wiele urządzeń pod postacią plików, co daje nam + możliwość prostej manipulacji nimi. Te pliki są często nazywane + węzłami urządzeń. Korzystać z urządzeń możemy + za pomocą zwykłych operacji na plikach. Tego typu rozwiązanie nie + jest bez wad dlatego też nie wszystkie urządzenia lub ich funkcje + są udostępnianie w ten sposób. +

+

+ Pliki urządzeń są przechowywane w katalogu /dev. + A najprostszym sposobem interakcji z urządziem jest przekierowanie + wyniku jakiegoś polecenia do urządzenia /dev/null. + Urządzenie to jest miejscem na nie potrzebne nam dane ze strumieni, + ponieważ co kolwiek trafi do tego urządzenia, jest przez jądro + poprostu ignorowane. +

+

+ Wyświetlając sobie zawartość katalogu w bardziej szczegółowej liście + może zauważyć dziwne oznaczenia w trybie pliku. Litery te określają + rodziaje urządzeń a wśród nich możemy wyszczególnić: +

+
    +
  • Urządzenia blokowe - b - Procesy mogą odczytywać + dane z urządzeń blokowych przy użyciu bloków o stałej wielkości. + Pamięci masowe są przykładem urządzeń blokowych. Łatwo dzieli się + je na bloki, a ogólna wielkość + takiego urządzenia jest stała i można ją zindeskować co daje + możliwość jądru na dostępu do dowolnego bloku danych.
  • +
  • Urządzenia znakowe - c - Urządzenia znakowe + działają w oparciu o strumienie danych. Do takich urządzeń można + zapisywać i odczytywać pojedyńcze znaki. Jądro zazwyczaj wykonuje + operacje odczytu i zapisu na fizycznym urządzeniu. Drukarki są + przykładami urządzeń znakowych. Warto wspomnieć, że jądro nie + jest w stanie ponownie odczytać danych ze strumienia po przekazaniu + ich dalej.
  • +
  • Urządzenia potokowe - p - tzw. + nazwane potoki są to urządzenia podobne do + urządzeń znakowych z tą jednak różnicą, że na drugim końcu + strumienia wejścia-wyjścia nie znajduje się fizyczne urządzenia ale + inny proces.
  • +
  • Urządzenia gniazdkowe - s - tzw. gniazda + są interfejsami specjalnego przeznaczenia i służa komunikacji + międzyprocesowej. Mogą występować poza katalogiem /dev/.
  • +
+

+ Inną dość rzucającą się w oczy informacją na listingu katalogu, są + dwie liczy odzielone przecinkiem zamiast rozmiaru pliku, jest + numer główny i numer poboczny. + Te numer ułatwiają jądru identyfikacje urządzeń. Dla przykładu + partycje tego samego dysku mają ten sam numer główny ale + inny numer poboczny. +

+

+ Nie wszystkie urządzenia mają swoje pliki, takim przykładem są + interfejsy sieciowe. Jądro wykorzystuje dla nich inny interfejs + wejścia-wyjścia. +

+

3.2. Ścieżka urządzeń sysfs

+

+ Ze względu na uproszczoną interakcje z urządzeniami poprzez + odwołowywanie się do pliku w katalogu /dev/ oraz fakt, że + jądro systemu nadaje plikom z tego katalogu nazwy na podstawie + koleności wykrywania urządzenie pod czas uruchamiania systemu + Wewnątrz jądra zaimplementowano interfejs sysfs, + który jest ujednoliconym sposobem prezentacji urządzeń bazującym + na atrybutach sprzętowych, mający formę struktury katalogów i plików. + Główny katalogiem tego system jest katalog /sys/devices. + Przykładowa ścieżka dla pierwszego dysku SATA mającego swój plik + /dev/sda może wyglądać następująco: +

+
+/sys/devices/pci0000:00/0000:00:1f:2/host0/target0:0:0/0:0:0:0/block/sda
+
+

+ Warto tutaj zaznaczyć iż, scieżki systemu sysfs nie służą + uzyskaniu dostępu do urządzeń, umożliwają przeglądanie informacji + oraz zarządzanie urządzeniami. Dane zawarte na plikach na ścieżkach + sysfs powinny być odczytywane przez programy nie przez + ludzi. +

+

+ Chcąc sprawdzić scieżkę sysfs dla dowolnego urządzenia z + katalogu /dev należało by programu system udev + udevadm. +

+
+$ udevadm info --query=all --name=/dev/sda
+
+

+ Wykonując to polecenie dowiemy się przy okazji ile danych można + uzyskać informacji z systemu udev. +

+

3.3. Polecenie dd

+

+ Polecenie jest dość prostym, aczkolwiek przydatnym narzędziem jeśli + choodzi o prace z urządzeniami znakowymi czy blokowymi. Jedyną + rzeczą, którą robi to polecenie jest odczyt danych z pliku + wejściowego lub ze strumienia i zapisanie go do wyjściowego pliku + lub strumienia, przy okazji dokonując pewnych konwersji. Najczęsciej + używane przeze mnie polecenie znajduje się poniżej. +

+
+$ sudo dd if=/dev/zero bs=1M of=/dev/sdX count=1
+
+

+ Polecenie wykorzystuje uprawnienia superużytkownika, aby uzyskać + dostęp do urządzenia blokowego. Samo polecenie zapisuje jeden + blok o wielkości 1M za pomocą zer z pliku /dev/zero + (nieskończony strumień zer), co powoduje usunięcie tablicy partycji. +

+ +
+

+ 2022; COPYLEFT; ALL RIGHTS REVERSED; +

+ + diff --git a/articles/terminallog/konfiguracja_HAProxy_dla_HTTP_i_HTTPS.html b/articles/terminallog/konfiguracja_HAProxy_dla_HTTP_i_HTTPS.html new file mode 100755 index 0000000..804119e --- /dev/null +++ b/articles/terminallog/konfiguracja_HAProxy_dla_HTTP_i_HTTPS.html @@ -0,0 +1,380 @@ + + + + + + + + + +
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ +
+

Konfiguracja HAProxy dla HTTP + oraz HTTPS

+

+ HAProxy jak podaje Wikipedia jest + load-balancerem oraz serwerem proxy dla połączeń TCP oraz + aplikacji HTTP. Dla mnie jest program, który zrobił robotę + jeśli chodzi o hosting aplikacji internetowych na + kontenerach. Bez HAProxy, aplikacje WWW na + innych fizycznych serwerach musiały mieć odzielny publiczny + adres IP. To się zmieniło, właśnie dzięki temu oprogramowaniu. Ten + materiał pojawia się na "terminallog", bo jest o stricte + jednym programie bez wskazania konkrenej platformy czy + systemu operacyjnego. +

+

+ Ja HAP-a konfigurowałem na Ubuntu 18.04 oraz 20.04. + Jednak, tak jak już wspomniałem możemy sobie nawet go + skonfigurować na OpenBSD. Mój wybór wtedy padł na Ubuntu, gdyż + dopiero co zaznajomiłem się technologią kontenerów LXD. +

+

+ Przejdźmy może już do konfiguracji. Ten materiał będzie + składał się w bardzo dużej części z listingów plików konfiguracyjnych + oraz ich opisów. Takie informacje na szybko, bez zbędnej + teorii. +

+

+ Rozpoczniemy od proxy dla HTTP, poniżej znajduje się + konfiguracja dostarczana wraz z pakietem. +

+
+global
+	log /dev/log	local0
+	log /dev/log	local1 notice
+	chroot /var/lib/haproxy
+	stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
+	stats timeout 30s
+	user haproxy
+	group haproxy
+	daemon
+
+	# Default SSL material locations
+	ca-base /etc/ssl/certs
+	crt-base /etc/ssl/private
+
+	# Default ciphers to use on SSL-enabled listening sockets.
+	# For more information, see ciphers(1SSL). This list is from:
+	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
+	# An alternative list with additional directives can be obtained from
+	#  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
+	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:
+	ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
+	ssl-default-bind-options no-sslv3
+
+defaults
+	log	global
+	mode	http
+	option	httplog
+	option	dontlognull
+        timeout connect 5000
+        timeout client  50000
+        timeout server  50000
+	errorfile 400 /etc/haproxy/errors/400.http
+	errorfile 403 /etc/haproxy/errors/403.http
+	errorfile 408 /etc/haproxy/errors/408.http
+	errorfile 500 /etc/haproxy/errors/500.http
+	errorfile 502 /etc/haproxy/errors/502.http
+	errorfile 503 /etc/haproxy/errors/503.http
+	errorfile 504 /etc/haproxy/errors/504.http
+
+
+

+ Wartość opcji + ssl-default-bind-ciphers złamano tylko i wyłączenie + dla celów estetycznych strony. +

+

+ Kolejny listing przestawia już gotową konfigurację HTTP +

+
+	global
+	log /dev/log	local0
+	log /dev/log	local1 notice
+	chroot /var/lib/haproxy
+	stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
+	stats timeout 30s
+	user haproxy
+	group haproxy
+	daemon
+
+	# Default SSL material locations
+	ca-base /etc/ssl/certs
+	crt-base /etc/ssl/private
+
+	# Default ciphers to use on SSL-enabled listening sockets.
+	# For more information, see ciphers(1SSL). This list is from:
+	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
+	# An alternative list with additional directives can be obtained from
+	#  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
+	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:
+	ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
+	ssl-default-bind-options no-sslv3
+
+defaults
+	log	global
+	mode	http
+	option	httplog
+	option	dontlognull
+	option	forwardfor
+	option	http-server-close
+        timeout connect 5000
+        timeout client  50000
+        timeout server  50000
+	errorfile 400 /etc/haproxy/errors/400.http
+	errorfile 403 /etc/haproxy/errors/403.http
+	errorfile 408 /etc/haproxy/errors/408.http
+	errorfile 500 /etc/haproxy/errors/500.http
+	errorfile 502 /etc/haproxy/errors/502.http
+	errorfile 503 /etc/haproxy/errors/503.http
+	errorfile 504 /etc/haproxy/errors/504.http
+
+frontend www_front
+	bind *:80
+	acl host_stronya hdr(host) -i example.edu.pl www.example.edu.pl
+	
+	use_backend stronaa if host_stronya
+
+
+backend stronaa
+	http-request set-header X-Client-IP %[src]
+	server stronaa 192.168.56.2:80 check
+
+
+

+ Wartość opcji + ssl-default-bind-ciphers złamano tylko i wyłączenie + dla celów estetycznych strony. +

+

+ Więc, co się zmieniło względem konfiguracji bazowej? W konfiguracji domyślnej + defaults + zmieniono dwie opcje: +

    +
  • option forwardfor - + dzięki, której włączono wstawianie nagłówka + X-Forwarded-For do żądań wysyłanych do + serwera. Dzięki temu nagłówku do logów serwera trafi + prawdziwy adres IP klienta a nie adres HAP-a,
  • +
  • option http-server-close - + włącza zamykanie połączeń przez serwer. Użycie tej + opcji ma na celu zmniejszyć zużycie zasobów + serwera.
  • +
+ Dodano sekcję frontend. + Zawiera ona opcje uruchomieniowe proxy takie jak port, na + którym HAP ma nasłuchiwać oraz reguły, według których należy + traktować spływające do usługi dane. Na przykład do jakiego + serwera przekierować żądanie na konkretny adres. W + przypadku proxy dla HTTP, wystarczą tylko poniższe opcje: +
    +
  • + + acl host_stronya hdr(host) -i example.edu.pl www.example.edu.pl + - ACL-ele są warunkami, które + określają kryteria przekazywania danych przez proxy. + Te warunki użwane są np. przez polecenia wskazujące + na konkretny serwer. Sama reguła ACL + składa się w tym przypadku z: +
      +
    • Słowa kluczowego: + acl, +
    • +
    • nazwy: + host_stronya, +
    • +
    • kryterium: + hdr(host) - + To kryterium może być niezrozumiałe. W konteście + ACL polega ono na przyrównaniu zawartości + nagłówka host żądania z wartościami na końcu + reguły, +
    • +
    • flagi: + -i - + brak czułości na wielkość znaków, +
    • +
    • wartości do przyrównania: + example.edu.pl www.example.edu.pl +
    • +
    +
  • +
  • + + use_backend stronaa if host_stronya + - polecenie wskazujące na serwer, którego + deklaracja znajduje się w sekcji + backend o nazwie + stronaa na podstawie ACL-ki + host_stronya. +
  • +
+ Jeśli chodzi o HTTP, to tak naprawdę tyle. Ta konfiguracja + powinna bez trudu działać. +

+

+ Konfigurację HAProxy możemy przetestować przed + uruchomieniem za pomocą poniższego polecenia: +

+
+$ sudo haproxy -f <ścieżka_do_pliku_konfiguracyjnego> -c
+
+

+ Użycie HAProxy dla HTTPS, wydaje się być jeszcze + prostsze. Poniżej znajduje się listing konfiguracji dla HTTPS + jednak w tym przypadku jest TCP/443. +

+
+global
+	log /dev/log	local0
+	log /dev/log	local1 notice
+	chroot /var/lib/haproxy
+	stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
+	stats timeout 30s
+	user haproxy
+	group haproxy
+	daemon
+
+	# Default SSL material locations
+	ca-base /etc/ssl/certs
+	crt-base /etc/ssl/private
+
+	# Default ciphers to use on SSL-enabled listening sockets.
+	# For more information, see ciphers(1SSL). This list is from:
+	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
+	# An alternative list with additional directives can be obtained from
+	#  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
+	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:
+	ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
+	ssl-default-bind-options no-sslv3
+
+defaults
+	log	global
+	mode	tcp
+	option	tcplog
+	option	dontlognull
+        timeout connect 5000
+        timeout client  50000
+        timeout server  50000
+	errorfile 400 /etc/haproxy/errors/400.http
+	errorfile 403 /etc/haproxy/errors/403.http
+	errorfile 408 /etc/haproxy/errors/408.http
+	errorfile 500 /etc/haproxy/errors/500.http
+	errorfile 502 /etc/haproxy/errors/502.http
+	errorfile 503 /etc/haproxy/errors/503.http
+	errorfile 504 /etc/haproxy/errors/504.http
+
+frontend port443
+	mode tcp
+	bind *:443
+	tcp-request inspect-delay 5s
+	tcp-request content accept if { req_ssl_hello_type 1 }
+	use_backend www if { req_ssl_sni -i www.example.edu.pl }
+	use_backend www if { req_ssl_sni -i example.edu.pl }
+	
+backend www 
+	mode tcp
+	server www 192.168.56.2:443
+
+
+

+ Wartość opcji + ssl-default-bind-ciphers złamano tylko i wyłączenie + dla celów estetycznych strony. +

+

+ Jeśli przyrównamy sobie konfiguracje dla HTTP oraz TCP (HTTPS), + to pierwszą rzeczą, która będzie rzucać się nam w oczy będzie + zmiana trybu w sekcji defaults +

+
+defaults
+...
+	mode tcp
+	option tcplog
+...
+
+

+ Z tej sekcji usunięto również opcje + forwardfor oraz + http-server-close, ponieważ + są to ustawienia trybu http +

+

+ W sekcji frontend nie ma + już ACL-elek są warunki są używane bezpośrednio + przez polecenie use_backend, + więc po kolei: +

    +
  • mode tcp - + ustawienie trybu TCP,
  • +
  • bind *:443 - + ustawienie nasłuchiwania na porcie 443 na wszystkich + adresach w systemie,
  • +
  • tcp-request inpspect-delay 5s - + Maksymalny czas oczekiwania na dane podczas + sprawdzania zawartości. Ustawiany w celu oczekiwania na przesłanie + przez klienta danych SSL hello,
  • +
  • tcp-request content accept if { req_ssl_hello_type 1 } - + Zaakceptowanie zawartości żądania o ile przesłana + przez klienta wiadomość SSL hello jest typu + nr. 1.
  • +
+ Kolejnymi liniami tej sekcji są już polecenia + use_backend, które przekazują żądania do konkretnego + serwera na podstawie warunku. Tym warunkiem jest przypasowanie + wartości SSL SNI do ciągu znaków (w tym przypadku + www.example.edu.pl) bez + rozróżniania wielkości znaków (flaga -i). +

+
+use_backend www if { req_ssl_sni -i www.example.edu.pl }
+
+

+ Po sekcji frontend występują + już sekcje backend, wewnątrz + sekcji znajduje się ustawienie trybu TCP oraz opcja + server wraz z adresem IP oraz + portem serwera. +

+
+backend www 
+	mode tcp
+	server www 192.168.56.2:443
+
+

+ To już jest wszystko co trzeba zrobić, aby skonfigurować + HAProxy w podstawowy sposób. Te konfiguracje + przedstawiają HAP-a jako proxy, które może zastąpić + reverse-proxy lokalnie instalowane na serwerach + przy pomocy NGINX czy Apache2. Wystarczy tylko skonfigurować + aplikacje tak, aby nasłuchiwały na wszystkich interfejsach + systemu. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/terminallog/laboratorium_sieci_VPN.html b/articles/terminallog/laboratorium_sieci_VPN.html new file mode 100755 index 0000000..91b69c3 --- /dev/null +++ b/articles/terminallog/laboratorium_sieci_VPN.html @@ -0,0 +1,379 @@ + + + + + + + + + +
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ +
+

Laboratorium sieci VPN

+ +

+ Laboratorium sieci prywatnych, powstało w celu sprawdzenia wartości merytorycznej, materiału Sieci VPN w kategorii terminallog. +

+

+ Z tego co udało mi się zaobserwować to że mamy cztery główne metody realizacji, takich sieci czy też połączeń. +

+
    +
  • program Stunnel,
  • +
  • protokół SSH,
  • +
  • program OpenVPN,
  • +
  • protokół IPSec (w implementacji libreswan),
  • +
+

+ W zależności od naszych potrzeb możemy użyć, któregoś z powyższych narzędzi. Jeśli musimy zabezpieczyć połączenie punkt-punkt dla jednej usługi, to możemy kłaniać się ku dwóm pierwszym rozwiązaniom. Oczywiście wszystko ma swoje wady. Dla programu Stunnel, potrzebować będziemy certyfikatów, oczywiście wystawionych przez wiarygodne źródło certyfikacji, nic nie stoi na przeszkodzie, abyśmy sami stworzyli nasze własne CA. +

+

Stunnel wymagania:

+
    +
  • certyfikaty x509,
  • +
  • urząd certyfikacji CA,
  • +
  • Najlepiej gdyby serwer nasłuchiwał na pętli zwrotnej,
  • +
+

+ Wadą protokołu SSH jest to, że potrzebujemy serwera SSH gdzieś w Internecie. +

+

+ SSH wymagania: +

+
    +
  • Serwer SSH gdzieś w internetach.
  • +
+

+ Zaletami tych dwóch rozwiązań są kolejno: +

+

+ Zalety Stunnel: +

+
    +
  • Samowystarczalne wymagania
  • +
+

+ Zalety SSH: +

+
    +
  • Realizuje połączenia, które z racji konfiguracji sieci nie mogłyby być + zrealizowane (robi magiczne sztuczki)
  • +
+

+ Co można rozumieć przez "samowystarczalne wymagania", otóż są to wymogi które możemy zrealizować samodzielnie, bez angażowania osób trzecich lub dodatkowych środków pieniężnych. Jeśli jesteśmy spłukani i możemy sobie pozwolić na konto shell, z możliwością tunelowania (większość darmowych zabrania tunelowania). Pozostaje na jedyne wyjście Stunnel. +

+

Stunnel

+

+ Naszą przygodę rozpoczynamy od czystej maszyny wirtualnej, najlepiej z jakiś bezpiecznym Linuksem. Ja wybrałem do tego celu, i nie tylko jak się przekonamy później, dystrybucje Alpine Linux. Instaluje się ją jakieś 5 min. Opis instalacji znajdziemy pod tym adresem. Po zainstalowaniu już systemu, tworzymy nasze nowe CA (urząd certyfikacji). +

+

+ Edytujemy plik /etc/ssl/openssl.cnf. Odnajdujemy sekcję [ CA_default ] ustawiamy tylko opcje dir, tak aby wskazywała na /etc/ssl. Zapisujemy plik. Tworzymy pusty plik index.txt, inicjujemy plik serial za pomocą ciągu '00' (dwa zera), tworzymy katalogi crl i newcerts oraz tak jak plik serial inicjujemy plik crlnumber za pomocą dwóch zer. +

+

+ Teraz generujemy klucz prywatny oraz certyfikat dla CA, dzięki niemu będziemy mogli, podpisywać certyfikaty. Polecenie odnośnie generowania klucza znajdują się pod tym linkiem. Pamiętając zarazem aby nazwy plików były takie jak w pliku konfiguracyjnym openssl. W Common Name wpisujemy FQDN hosta CA. +

+

+ W na końcach poleceń na wiki znajduje się przy niektórych liczba 1024, jest długość klucza. Ponieważ, obecnie klucze poniżej 2048 bitów są uznawane za niebezpieczne, warto pominąć tę wartość. W pliku /etc/ssl/openssl.cnf wartość wskazująca na domyślną długość klucza ustawiona jest 2048 bity. +

+

+ Korzystając z poleceń na wiki, generujemy certyfikat CA oraz klucz prywatny serwera, po wygenerowaniu klucza, przechodzimy do wygenerowania wniosku dla serwera. W polu Common Name wpisujemy FQDN serwera. Teraz dopiero ustawienia CA w pliku konfiguracyjnym OpenSSL zostaną zweryfikowane. Wszystkie błędy zwracane są dość zrozumiałe. Więc nie powinno być problemów z ich identyfikacją i naprawą. Po wygenerowaniu certyfikatu warto zdjąć hasło, z klucza prywatnego serwera, będzie to konieczne, gdy nasz tunel będzie zestawiany wraz ze startem systemu, ponieważ oczekiwanie na hasło klucza będzie wstrzymywać start systemu i może go unieruchomić, jeśli pracujemy gdzieś zdalnie. Jednak nie należy tego robić na CA, ale na hoście docelowym gdzie Stunnel będzie pracować. +

+

+ Akurat to nie Stunnel zwrócił mi uwagę na ten problem, nie mniej jednak warto wyrobić w sobie pewne nawyki. +

+

+ Teraz przechodzimy do dość trudnego zdania, generalnie na wiki jest napisane, aby stworzyć CA na jakimś bezpiecznym komputerze, najlepiej nie podłączonym do sieci. Ja mam dwie wariacje na ten temat. Otóż możemy wykorzystać do tego celu Raspberry Pi 0, które hardwarowo jest offline, i komunikować się tylko z naszym komputerem za pomocą protokołu RNDIS, lub skorzystać z maszyny wirtualnej, tak jak w tym przypadku. Gdzie tworzymy maszynę z natywnym dostępem do internetu. Sprawdzamy czy mamy pakiet OpenSSL, jeśli nie to go instalujemy. Po zainstalowaniu lub upewnieniu się że pakiet jest obecny w systemie, wyłączamy maszynę. Ustawiamy interfejsy na nie podłączone, lub je usuwamy. + Teraz do sedna, zanim włączymy maszynę ustawiamy jej katalog współdzielony na jeden z katalogów na naszym komputerze. Uruchamiamy maszynę, po jej uruchomieniu montujemy, katalog współdzielony, metoda na zamontowanie katalogu współdzielonego hipernadzorcy VirtualBox w Alpine Linux, znajduje się tutaj. Tam możemy przekopiować wygenerowane przez nas certyfikaty. Następnie przenieść je na inną maszynę. +

+

+ Obecnie w większości dystrybucji Linux, stunnel występuje pod nazwą stunnel4 (gdzie 4 oznacza wersję protokołu IP z jaką pracuje). Stunnel, możemy zainstalować z paczki systemowej, lub skompilować samodzielnie. Po zainstalowaniu programu w przypadku systemu Alpine Linux w katalogu /var/run pojawia się katalog stunnel oraz jeden dodatkowy użytkownik, jednak konfiguracje rozpoczynamy od przygotowania pliku certyfikatu. Tworzymy nowy plik w /etc/stunnel przekierowując zawartość pliku klucza prywatnego. Następnie do owego pliku dodajemy linję ze samą spacją, przekierowując wyjście polecenia echo oraz dopisując do wszystkiego zawartość pliku z certyfikatem z serwera. Dla danego pliku ustawiamy odpowiednie uprawnienia 600 oraz właściciela i grupę na root. Teraz tworzymy w katalogu /var/run/stunnel, katalog wraz z podkatalogiem mianowicie var/log, tam będą umieszczane nasze logi z połączenia. + Wracamy do katalogu /etc/stunnel tworzymy plik konfiguracyjny wg. wzorca. Teraz możemy uruchomić nasz tunel, wzór pliku konfiguracyjnego oraz uruchomienie tunelu znajdują się tutaj. Pamiętajmy dwie rzeczy, że bezpiecznie byłoby zmusić demona naszej zabezpieczanej usługi do nasłuchu tylko i wyłącznie na pętli zwrotnej o ile stunnel uruchamianym bezpośrednio na serwerze. Można go również uruchomić na routerze, opis znajduje się tutaj, oraz żeby zmienić porty i adresy na te które mamy tunelować, a nie kopiuj-wklej konfiguracje, a potem płacz że coś nie działa. +

+

SSH

+

+ Tunele SSH są o tyle proste, że ich konfiguracja sprowadza się do wydania jednego polecenia. Oczywiście musimy mieć gdzieś w sieci serwer z SSH. Za pomocą tych tuneli możemy rozwiązać trzy konkretne problemy: +

+
    +
  • +

    + Problem 1. Zabezpieczenie transmisji protokołów które, szyfrowania nie oferują. Problem ten technicznie nazywamy tunelem lokalnym. Np. mamy na naszym serwerze SSH również serwer SAMBA, i chcielibyśmy z niej w bezpieczny sposób skorzystać. To w tym celu wydajemy poniższe polecenie: +

    +
    +$ ssh username@server.example.com -L 11445:127.0.0.1:445
    +
    +

    + Kolejno znaczenie:
    +

      +
    • + -L - Oznacza że tunel będzie, tunelem lokalnym. Tunelem pomiędzy klientem (osobą inicjującą tunel), a serwer SSH. +
    • +
    • + 11445: - Oznacza port otwierany na pętli zwrotnej komputera klienta. +
    • +
    • + 127.0.0.1 - Adres pętli zwrotnej. +
    • +
    • + 445 - tunelowany port (port po stronie serwera z którym zestawiany jest tunel) +
    • +
    +

    +

    + Problem jest identyczny jaki rozwiązuje stunnel. Jednak z wykorzystaniem protokołu SSH. Po wywołaniu polecenia zostaniemy poproszeni o hasło lub nie, o ile importowaliśmy wcześniej klucz publiczny na nasz serwer. Normalnie zostaniemy zalogowani na serwerze Musimy pamiętać aby nie zamykać lub nie wylogowywać, tak jak długo jesteśmy zalogowani. Tyle trwa tunel. Aby teraz połączyć z sambą łączymy sie z 127.0.0.1:11445. +

    +
  • +
  • +

    + Problem 2. Chcemy połączyć się z jakąś usługą, jednak port został zablokowany przez administratora. Ten problem możemy rozwiązać za pomocą portów dynamicznych. Porty dynamiczne polegają na przekazywaniu połączeń za pomocą proxy SOCKSv5 przez nasz serwer SSH. Aby uruchomić porty dynamiczne wydajemy następujące polecenie: +

    +
    +$ ssh username@server.example.com -D 8080
    +
    +

    + Gdzie: +

      +
    • + -D - oznacza uruchomienie dynamicznych portów +
    • +
    • + 8080 - oznacza port otwierany po stronie klienta dla proxy. +
    • +
    +

    +

    + Przy używaniu portów dynamicznych należy pamiętać o tym że adresem na jakim nasłuchuje proxy jest adres pętli zwrotnej. Najprostszą metodą użycia jest skonfigurowanie proxy SOCKSv5 w przeglądarce Firefox, lub użycie któregoś z programów opisanego tutaj. +

    +
  • +
  • +

    + Problem 3. Musimy otworzyć port dla usługi, jednak nasza sięć jest skonfigurowana w taki sposób, że nie mamy dostępu aby taki port otworzyć. Problem ten jest często spotykany w sieciach osiedlowych, gdzie na interfejsie WAN naszego routera dostajemy adres sieci prywatnej oznacza to ni mniej ni więcej, że gdzieś znajduje się router nadrzędny, i to na nim należało by takiego przekierowania portów dokonać. Jednak jest prawie nie możliwe, abyśmy załatwili sobie coś takiego na telefon, często gdy naszym usługodawcą internetowym jest jakaś korporacja. Dlatego jednym z najciekawszych rozwiązań dostarczanych przez SSH jest zdalny tunel z przekazywaniem. Tutaj aby się nie pogubić użyjemy przykładu z Bobem i Alice. +

    +

    +

    + Powiedzmy że Bob, chce udostępnić zdalny pulpit na swoim domowym komputerze Alice, jednak po telefonie i 10 minutowej rozmowie z Kobietą z wyraźnym wschodnim akcentem, nie dowiedział się niczego nowego. Zatem przy kolej na plan B, otóż Bob miał w zanadrzu jeszcze dostęp do maszyny, która pracowała sobie spokojnie na farmie serwerów, z którą łączył się za pomocą protokołu SSH. Więc Bob po uruchomieniu usługi zdalnego pulpitu wydaje następujące polecenie otwierając port zdalny. +

    +$ ssh bob@server.bogobo.org -R 11111:127.0.0.1:3389
    +
    + Gdzie:
    +
      +
    • -R - uruchamia tunel zdalny
    • +
    • 11111 - port tunelu zdalnego - otwierany na serwerze
    • +
    • 127.0.0.1 - adres pętli zwrotnej zrówno serwera jak i klienta
    • +
    • 3389 - port lokalnej usługi komputera zestawiającego tunel
    • +
    +

    +

    + Teraz Bob instruuje Alice, aby wpisała poniższe polecenie w swoim terminalu, jednocześnie przekazując jej hasło do konta SSH. Polecenie Alice to (opis opcji znajduje się przy pierwszym problemie): +

    +
    +$ ssh bob@server.bogobo.org -L 13389:127.0.0.1:11111
    +
    +

    + Zatem tunel zdalny z przekazywaniem polega na otwarciu portu na serwerze, z którym zestawiany jest połączenie z lokalną usługą otwierającego tunel. Możemy stwierdzić że Bob za pomocą tunelu zahostował RDP swojego domowego komputera. Kiedy tunel jest otwarty, Alice otwiera tunel lokalny na port serwera 11111 ze swoim portem 13389 oczywiście na pętli zwrotnej. Dzięki czemu, może teraz połączyć się z komputerem Boba przez 127.0.0.1:13389 za pomocą aplikacji wbudowanej w systemie. Cała sztuczka polega na tym że jednym jawnym zdalnym połączeniem Alice i Boba jest połączenie z portem SSH serwera Boba. +

    +

    + Ważna uwaga, należy wybierać numery portów powyżej 1024, w innym, przypadku będziemy potrzebować konta użytkownika root, inaczej tunel nie dojdzie do skutku. Najlepiej używać portów powyżej 10000. +

    +

    +
  • +
+

OpenVPN

+

+ OpenVPN jest chyba najpopularniejszą metodą zdalnego dostępu, i o dziwo korzystając z przykładów z książki, opisanych po tym adresem: https://morketsmerke.net/site/articles/terminallog/sieci_VPN#openvpn. Gdzie przetestowano zdalny dostęp do zasobów dla pracowników firmy oraz łączenie odziałów firmy to działa to bez zarzutu. Rzeczami, na które warto zwrócić uwagę jest to że musiałem co restart systemu tworzyć urządzenie TUN, (jedno polecenie, również znajduje się na wiki), może być to wina mojego systemu operacyjnego (Alpine Linux), na Lubuntu tego problemu nie było. I jeśli mamy ściągnąć hasło z klucza dla serwera, to zróbmy to już na docelowym hoście, ponieważ kiedy ja ściągałem hasło na CA, potem przeniosłem ten plik okazało się że jest on niezdatny do użycia. Więc to kolejna rzecz. Przy łączeniu oddziałów firmy, zmodyfikowałem scenariusz pod siebie, nie przepuszczałem całego ruchu, z oddziału przez siedzibę tylko za pomocą tras udostępniłem połączanie pomiędzy komputerami siedziby oraz oddziału. Trasy są bardzo proste. +

+

+ Router w oddziale: +

+ip route add 192.168.20.0/24 via 10.3.0.2
+
+ Router w siedzibie: +
+ip route add 192.168.30.0/24 via 10.3.0.1
+
+ Gdzie klasy należą do poszczególnych podsieci X.Y.20.0/24 należy do klasy w siedzibie firmy, natomiast X.Y.30.0/24 należy + do klasy w oddziale. Adres 10.3.0.2 adres TUN w oddziale, a 10.3.0.1 to adres TUN w siedzibie. +

+

+ Myślę że w ta wariacja, jest bardziej aktualna do dzisiejszych czasów, gdzie dysponuje się naprawdę szybkimi łączami + i nie potrzeba przepuszczać przez VPN, ruchu Pani Moniki, która lubi czytać pudelka do śniadania. Ponieważ opisy + konfiguracj + i na wiki działają tu je pominę. +

+

+

IPSec

+

+

+ Sporym nadużyciem było by napisanie że IPSec jest bardziej przezroczystym OpenVPN. OpenVPN to pakiet oprogramowania realizujący połaczenia punkt-punkt. IPSec to zbiór protokołów. Przez zawiłą historię twórców implementacji OpenSWAN, (pakiet który jest opisywany na wiki), opis na wiki jest nieaktualny. Powszechnie jeśli mówimy o IPSec w Linux mamy na myśli pakiet LibreSWAN, który na swojej stronie zawiera gotowe HOW-TO's połączeń host-host oraz podsieć-podsieć. Problem w tym że to nie działa. Znalazłem tutorial na howtoforge.com. Na którym działają obie metody uwierzytelnienia. +

+

+ Konfiguracja LibreSWAN opiera się na dwóch plikach: /etc/ipsec.conf oraz /etc/ipsec.secrets. W pierwszym znich znajduje się właściwa konfiguracja natomiast w drugim znajduje się PSK. Typowe dla IPSec jest to że nie mamy klienta oraz serwera, oczywiście w ramach własnych oznaczeń, możemy nazwać którąś ze stron klientem a którąś serwerem. W IPSec mamy stronę lewą (left) oraz stronę prawą (right). Strona lewa jest tak jakby stroną naszą, czy też lokalną natomiast prawa - stroną obcą, odległa. Po obu stronach musi widnieć ta sama konfiguracja tunelu, jednak z odniesieniem stron, tj. dla strony lewej, to jest tak jak konfigurujemy, natomiast w konfiguracji strony prawej, to ona jest stroną lewą, a lewa prawą. To tak samo jak z ludźmi, kiedy stoją do siebie na przeciwko. Mamy do dyspozycji w IPSec dwa modele połączeń. Jest połączenie punkt-punkt, czy jak to woli host-host lub sieć-sieć. +

+

+ Przed przystąpieniem do konfiguracji, nie twórzmy nowych plików, wykorzystajmy te które są dostarczone wraz pakietem LibreSWAN, tylko zakomentujmy ostatnia dyrektywę include (include /etc/ipsec.d/*.conf), w pliku /etc/ipsec.conf oraz jedyną dyrektywę include (include /etc/ipsec.d/*.secrets) w pliku /etc/ipsec.secrets. Konfiguracje przy użyciu uwierzytelnienia PSK wygląda następująco: +

+

+ Strona lewa:
+ Plik: ipsec.conf
+

+
+config setup
+protostack=netkey
+
+conn mytunnel
+
+	ike=aes256-sha256;modp4096
+	phase2alg=aes256-sha256;modp4096
+	left=172.16.2.144
+	leftsubnet=192.168.20.0/24
+	right=172.16.2.154
+	rightsubnet=172.16.2.154/32
+	authby=secret
+	type=tunnel
+  auto=start
+
+

+ Plik: ipsec.secrets +

+
+172.16.2.144 172.16.2.154: PSK "1234vpn_test1234"
+
+

+ Strona prawa: + Plik: ipsec.conf +

+
+config setup
+protostack=netkey
+
+conn mytunnel
+
+    ike=aes256-sha256;modp4096
+    phase2alg=aes256-sha256;modp4096
+    left=172.16.2.154
+    leftsubnet=172.16.2.154/32
+    right=172.16.2.144
+    rightsubnet=192.168.20.0/24
+    authby=secret
+    type=tunnel
+    auto=start
+
+
+

+ Plik: ipsec.secrets +

+
+172.16.2.154 172.16.2.144: PSK "1234vpn_test1234"
+
+

+ Powyższa konfiguracja przedstawia moją wariację na temat możliwych modeli połączeń. Na pierwszy rzut oka wygląda jak połączenie sieć-sieć, jednak w prawej podsieci znajduje się tylko jeden komputer. A więc można uznać że jest to połączenie sieć-host patrząc od lewej. Nie wiem czy ma sens, opis tych opcji, jeśli ktoś byłby zainteresowany, to use GOOGLE. Ważna rzecz, jeśli chodzi o IPSec. Jeśli korzystamy z pakietów LibreSWAN wbudowanych w system, to należy upewnić się czy mają identyczne wersje, w przeciwnym razie tunel inicjuje strona, która ma nowszą wersję oprogramowania. W przypadku tych samych wersji nie ma znaczenia, która inicjuje tunel. Aby uruchomić tunel, najpierw musimy uruchomić sługę IPSec poleceniem (na obu stronach): +

+
+# ipsec setup start
+
+

+ Po uruchomieniu usługi możemy dodać nasze połączenie (na obu stronach) poleceniem (podajemy nazwę połączenia, nazwa połączenia znajduje sie po słowie conn): +

+
+# ipsec auto --add mytunnel
+
+

+ Po dodaniu przez obie strony połączenia, jedna z nich (ta z wyższą wersją oprogramowania, jeśli po obu stronach są równe to bez znaczenia która) inicjuje tunel: +

+
+# ipsec auto --up mytunnel
+
+

+ Tunel zatrzymujemy poleceniem: +

+
+# ipsec auto --down mytunnel
+
+

+ Warto pamiętać o tym, że w pliku konfiguracyjnym mamy opcje auto ustawioną na start oznacza to że po dodaniu połączenia, będzie ono automatycznie zestawiane przy każdym starcie usługi ipsec. Poniżej przedstawię konfigurację z wykorzystaniem kluczy RSA do uwierzytelnienia. Poniższe kroki wykonujemy na obu komputerach. Te konfigurację zaczynamy od usunięcia obecnych plików /etc/ipsec.secrets. Następnie generujemy klucze właśnie do pliku poleceniem: +

+
+# ipsec newhostkey --output /etc/ipsec.secrets
+
+ Zawartość pliku powinna wyglądać mniej więcej tak: +
+: RSA   {
+        # RSA 3216 bits   a   Thu May 21 19:34:25 2020
+        # for signatures only, UNSAFE FOR ENCRYPTION
+        #ckaid=69f3a4f8d322f423033de7ef0acc3a600a351f43
+        #pubkey=0sAwEAAa235arqmgpHM21of9l7KagM4kOTZQ7VKjOwhPKdW/t+Lgo1Qp5RXcga9ENcIRUDMP3U2iqG8wOFeM0YmwsbMw58zcuTPodjjisuh4HZDf6LBvOfnG47P3mes1AJNdsDHJl96EFlrXpb3QHqK3caH9uX5qPsaiydc6ThjpYtOUyFqBkqBilg6XhO
+        Modulus: 0xadb7e5aaea9a0a47336d687fd97b29a80ce24393650ed52a33b084f29d5bfb7e2e0a35429e515dc81af4435c21150330fdd4da2a86f3038578cd189b0b1b330e7ccdcb933e87638e2b2e8781d90dfe8b06f39f9c6e3b3f799eb3500935d
+        PublicExponent: 0x010001
+        }
+# do not change the indenting of that "}"
+
+

+ Musimy pobrać do notatnika wartość #pubkey, z jednego i drugiego hosta. Następnie musimy je umieścić na pliku /etc/ipsec.conf jako wartości dla poszczególnych opcji. Więc leftrsasigkey, dla lewej strony oraz rightrsasigkey dla strony prawej na lewym hoście na prawym zaś odwrotnie. Konfiguracja wygląda zatem tak: +

+

+ Strona lewa +

+
+config setup
+    protostack=netkey
+
+conn vpn_rsa
+
+    ike=aes256-sha256;modp4096
+    phase2alg=aes256-sha256;modp4096
+    left=172.16.2.156
+    right=127.16.2.157
+    authby=rsasig
+    leftrsasigkey=0sAwEAAa235arqmgpHM21of9l7KagM4kOTZQ7VKjOwhPKdW/t+Lgo1Qp5RXcga9ENcIRUDMP3U2iqG8wOFeM0YmwsbMw58zcuTPodjjisuh4HZDf6LBvOfnG47P3mes1AJNdsDHJl96EFlrXpb3QHqK3caH9uX5qPsaiydc6ThjpYtOUyFqBkqBi
+    rightrsasigkey=0sAwEAAfVs/GW0tllOWsFf9SrXh8w/Nt99a8+HaY7mw0BvtnYRZol+8DOwEpgwkeAMD0A2L02EpFGj8fv3DgVOvrFK3/bI67XeR7K3/m55jhloYT97RrinQGXFoqWxpAQP6TQFADHjjNypn/vHWgncuH8yfBKlsxNSUgmd1ii+ohGK15J8OS9s6
+    type=tunnel
+    auto=start
+
+

+ Strona prawa +

+
+config setup
+    protostack=netkey
+
+conn vpn_rsa
+
+    ike=aes256-sha256;modp4096
+    phase2alg=aes256-sha256;modp4096
+    left=172.16.2.157
+    right=127.16.2.156
+    authby=rsasig
+    leftrsasigkey=0sAwEAAfVs/GW0tllOWsFf9SrXh8w/Nt99a8+HaY7mw0BvtnYRZol+8DOwEpgwkeAMD0A2L02EpFGj8fv3DgVOvrFK3/bI67XeR7K3/m55jhloYT97RrinQGXFoqWxpAQP6TQFADHjjNypn/vHWgncuH8yfBKlsxNSUgmd1ii+ohGK15J8OS9s6
+    rightrsasigkey=0sAwEAAa235arqmgpHM21of9l7KagM4kOTZQ7VKjOwhPKdW/t+Lgo1Qp5RXcga9ENcIRUDMP3U2iqG8wOFeM0YmwsbMw58zcuTPodjjisuh4HZDf6LBvOfnG47P3mes1AJNdsDHJl96EFlrXpb3QHqK3caH9uX5qPsaiydc6ThjpYtOUyFqBkqBi
+    type=tunnel
+    auto=start
+
+

+ Tunel uruchamiamy wg. powyższych poleceń. +

+

Podsumowanie

+

+ Przedstawione zostały tu cztery sposoby, na zabezpieczenie transmisji danych, dzięki którym możemy bez obaw korzystać z usług, które takich mechanizmów nie oferują. Jeśli jeszcze nie zdecydowaliśmy czego powinniśmy użyć. Osobiście polecił bym SSH do zabezpieczania pojedynczych połączeń oraz OpenVPN dla całych sieci. Głównymi wadami, które rzutowały na ten wybór pośród pozostałych to dla Stunnela - dodatkowo potrzebne certyfikaty, a dla IPSec - potrzeba jawnych adresów IP, dokumentacja (żeby na stronie projektu przykłady konfiguracji nie działały, no to coś jest nie halo), gdyby nie te adresy, to dało by się to jakoś znieść, tunel IPSec jest przezroczysty i to jest mega. Nie trzeba ustawiać nawet routingu. Dla mnie prostota i szybkość konfiguracji to ważne rzeczy, nikt nie lubi się bawić całych dzień z daną rzeczą. Istotna jest multiplatformowość dla OpenVPN, który występuje np. na OpenBSD. Oczywiście jest to moje w pełni subiektywne zdanie. +

+
+ + + diff --git a/articles/terminallog/sieci_VPN.html b/articles/terminallog/sieci_VPN.html new file mode 100644 index 0000000..55f230f --- /dev/null +++ b/articles/terminallog/sieci_VPN.html @@ -0,0 +1,3348 @@ + + + + + + + + + +
+ +
+
+
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ +
+

+ VPN (ang. Virtual Private Network) - Wirtualna Sieć + Prywatna jest to usługa sieciowa, która pozwala na bezpieczne i + swobodne (chyba, że konfiguracja stanowi inaczej) połączenie + odległych hostów. +

+

+ + Ta strona jest oparta o książkę Marka Serfina pt. "Sieci VPN. Zdalna + praca i bezpieczeństwo danych. Wydanie II rozszerzone.". Oznacza to + tyle że mogą znaleźć się tu fragmenty, przykłady fragmenty kodu, a + nawet całe rozdziały przepisane 1:1 z książki. Materiał na tej + stronie został dostosowany tak, aby był jak najszybciej przyswajany + oraz służył czytelnikowi za ściągę pod czas wdrażania/administracji + technologią VPN. + +

+

Wstęp

+

+ Żyjemy w czasach ogromnej informatyzacji przedsiębiorstw. Trudno + wyobrazić sobie obecnie działanie korporacji bez przynajmniej jednego + serwera plików czy bazy danych. Współczesne aplikacje pisane są + prawie zawsze w architekturze klient-serwer, co umożliwia łatwy + dostęp do zasobów wielu użytkownikom z różnych komputerów. Budowa + protokołu IP sprawia, że serwer w sieci wewnętrznej może w łatwy + sposób stać się osiągalny z innej sieci lub Internetu. Popularyzacja + stałego, a często także szybkiego dostępu do globalnej sieci sprawia, + że miejsce, w którym się pracuje, przestaje mieć znaczenie. Liczy się + za to stały dostęp do zasobów firmy, a co za tym idzie — możliwość + pracy w dowolnym miejscu o każdej porze. +

+

Słabość protokołów sieciowych i związane z + tym problemy

+

+ Leżący u podstaw działania Internetu protokół IP nie zapewnia sam w + sobie bezpiecznego przesyłu danych przez sieć. Podobnie rzecz ma się + z protokołami warstwy transportowej TCP/UDP — nie zaimplementowano w + nich żadnego algorytmu szyfrowania, uwierzytelniania i sprawdzania + integralności danych. Na domiar złego w powszechnym użyciu są + aplikacje zaprojektowane jeszcze na początku poprzedniej dekady — + takie, jak POP3 czy IMAP, które przesyłają dane (w tym hasła) jawnym + tekstem. +

+

+ Mnogość aplikacji klienckich oraz skala Internetu sprawiają, że nie + można z dnia na dzień wycofać z użycia danego protokołu i zastąpić + go nowszym — łatwo wyobrazić sobie panujący w konsekwencji tego + posunięcia chaos. +

+

+ W odpowiedzi na przedstawione problemy specjaliści IT opracowali + różne metody, a także standardy bezpiecznej transmisji danych w + niezabezpieczonej sieci. Najpopularniejsze z nich to: tunele SSL — + dla pojedynczych aplikacji, lub połączenia VPN — gdy potrzebujemy + przepuścić cały ruch szyfrowanym kanałem (niezależnie od protokołu + warstw wyższych). +

+

SSL jako standard bezpiecznego przesyłania danych

+

+ SSL - Protokół bezpieczeństwa umożliwiający + zabezpieczenie transmisji innych protokołów zapewniający podstawowe + funkcje bezpieczeństwa tj.: +

+
    +
  • uwierzytelnienie stron - czyli potwierdzenie ich autentyczności + na podstawie certyfikatów,
  • +
  • poufność i integralność przesyłu - tzn. ochronę przed + podsłuchaniem i modyfikacją.
  • +
+

Historia i znacznie protokołu SSL

+

+ Protokół SSL został opracowany przez firmę Netscape Communications + Corporation w odpowiedzi na brak zabezpieczeń w popularnych wtedy + protokołach (tj. lata 90, ubiegłego wieku). Obecnie najpopularniejszą + wersją jest TLS 1.3, który jest rozwinięciem SSL. + Mówiąc w obecnych czasach o SSL, to tak naprawdę mówimy o TLS. +

+

+ W założeniach SSL powstał jako zabezpieczenie do protokołu HTTP dla + potrzeb usług e-commerce. Jednak dzięki jego uniwersalności można go + wykorzystać do zabezpieczenia większości usług TCP, a nawet do + tworzenia sieci VPN. +

+

Przebieg nawiązania połączenia SSL

+

+ Zanim protokoły warstwy aplikacji będą mogły wymieniać dane w + bezpieczny sposób, musi nastąpić nawiązanie sesji SSL (ang. + SSL handshake). Na SSL handshake składa się + kilka faz negocjacji, które przedstawiono w poniżej: +

+
    +
  1. + Klient łączy się z serwerem i wysyła pakiet początkowy + Hello, a wraz z nim numer obsługiwanej wersji SSL, + obsługiwane algorytmy szyfrujące, algorytmy kompresji, oraz losowy + numer związany z rozpoczętą sesja (ID).
  2. +
  3. + Serwer w odpowiedzi wysyła klientowi numer obsługiwanej wersji SSL, + obsługiwane algorytmy szyfrujące, a także swój certyfikat (klucz + publiczny).
  4. +
  5. + Na tym etapie klient sprawdza certyfikat serwera - czy jest on + ważny oraz czy wystawił go zaufany urząd (CA). Protokół SSL + przewiduje także możliwość wysłania przez serwer żądania + uwierzytelnienia klienta. Uwierzytelnienie to jest opcjonalnie i + stosuje się je w określonych warunkach.
  6. +
  7. + W przypadku pozytywnego uwierzytelnienia serwera klient generuje + 48-bajtową liczbę zwaną pre-master secret i szyfruje ją, + używając przy tym klucza publicznego serwera (zawartego w + certyfikacie serwera). Liczba pre-master składa się z 2 + bajtów identyfikujących klienta oraz 46 bajtów losowych. +
  8. +
  9. + Serwer po otrzymaniu liczby pre-master odszyfrowuje ją, + używając do tego swojego klucza prywatnego, i porównuje 2 bajty + identyfikujące klienta z danymi, które otrzymał w inicjacyjnym + pakiecie Hello
  10. +
  11. + Jeśli jest wymagane uwierzytelnienie klienta, jest to robione w tej + chwili. Wówczas klient musi przesłać certyfikat.
  12. +
  13. + Na podstawie już wymienionych danych (m.in. pre-master key, + losowe dane wygenerowane w punkcie 1.) serwer i klient generuje + tzw. master-key (znany tylko im).
  14. +
  15. + Zarówno klient, jak i serwer na podstawie master-key + generują symetryczne klucze sesyjne (sześć, trzy w kierunku + serwer-klient i trzy w drugą stronę), które umożliwiają im + szyfrowanie i sprawdzenie integralności przesyłanych danych.
  16. +
  17. + Kończąc handshake, klient przesyła do serwera wiadomość + zaszyfrowaną ustalonym kluczem sesyjnym. Wiadomość ta nazywana + końcowym uzgodnieniem (ang. finished handshake), jest jako + pierwsza szyfrowana tajnym kluczem.
  18. +
  19. + Serwer odpowiada także wiadomością zaszyfrowaną za pomocą wspólnego + klucza. Od tej widomości, sesja SSL jest nawiązna. +
  20. +
+

Znaczenie zaufanego certyfikatu

+

+ Zaufanym certyfikatem możemy określić każdy certyfikat, który został + wystawiony przez wiarygodne (zaufane) Centrum Certyfikacji + (CA). Każda aplikacja korzystająca z SSL, ma gdzieś w swoich + zasobach lokalnych bazę zaufanych wystawców, przez co nie zostajemy + w ogóle poinformowani o nawiązywaniu połączenia czy sesji SSL. +

+

+ Certyfikaty wystawione przez zaufane CA mają znaczenie głównie dla + publicznych serwerów, gdzie ludzie z różnych stron świata mają + pewność, że serwera za który się łączą na pewno jest tym za który się + podaje (np. bank czy sklep internetowy). +

+

+ Z tego względu, iż będziemy korzystać z sesji SSL do tworzenia sieci + VPN, nie ma przeciwwskazań aby twoja organizacja stała się CA + (centrum certyfikacji) i aby można było samodzielnie generować + certyfikaty i instalować je na hostach klienckich sieci. Przecież + możemy zaufać przez nas wygenerowanym certyfikatom. W przeciwieństwie + do HTTPS, SSL w zastosowaniach VPN-owych ważne jest uwierzytelnienie + klienta przez serwer, dzięku temu z naszą siecią będą mogły łączyć + się tylko osoby posiadające odpowiednie certyfikaty. +

+

Generowanie certyfikatów przy użyciu programu OpenSSL

+

+ Zawarte w tej części informacje są niezwykle istotne, dla dalszych + konfiguracji, czy to OpenVPN czy też technologii + IPSec. Dlatego wiele innych zagadnień będzie tu linkować. +

+

+ Niezwykle istotne dla samego uruchomienia sieci VPN jest umiejętność + generowania kluczy i certyfikatów X.509. W systemach + unixopodobnych narzędzie wykorzystywane do tego może się nieco + różnić. W dystrybucjach systemu Linux raczej będziemy spotykać + oryginalnym OpenSSL. Jeśli będziemy się decydować na + skorzystanie z np. OpenBSD (co wg. mnie jest bardziej wskazane na + bramę VPN niż np. Ubuntu. Dlatego że jest bardzo prosty system, ale + oczywiście nie w swojej funkcjonalności raczej w architekturze czy + też budowie, jest on również zorientowany na bezpieczeństwo jeśli + ktoś jest fanem jądra GNU/Linux może Alpine Linux) to skorzystamy z + pakietu LibreSSL, OpenSSL dla Alpine Linux. +

+

+ Zanim jednak przejdziemy do generowania certyfikatów dla serwera i + klientów, musimy stworzyć własny urząd certyfikacji (CA). Dwie uwagi. +

+

+ Istotną rzeczą CA jest utworzenie go na jakimś bezpiecznym komputerze + najlepiej odłączonym od Internetu lub przynajmniej za dodatkowym + firewallem nie dopuszczającym żadnych innych połączeń poza jednym + (tylko jednym) z swoich komputerów. Chodzi głównie aby nie był on + widoczny w Internecie i ograniczyć komunikację z nim w sieci lokalnej. +

+

+ Ważne jest aby robić kopie zapasowe, wystawionych certyfikatów oraz + całego katalogu /etc/ssl, tak aby w razie potrzeby można + było unieważnić, któryś z certyfikatów. +

+
Tworzenie własnego CA
+

+ W pierwszej kolejności odnajdujemy plik openssl.cnf. + Prawdopodobne lokalizacje tego pliku to: +

+
    +
  • /etc/ssl/openssl.cnf - dla instalacji z pakietów + dystrybucji,
  • +
  • /usr/local/etc/openssl.cnf - w przypadkach ręcznej + kompilacji,
  • +
  • C:\OpenSSL\bin - dla systemów MS Windows.
  • +
+

+ W tym pliku musimy odnaleźć sekcje + [ CA_default ]. Powinniśmy zmienić + wpisy tak jak poniżej. +

+
+[ CA_default ]
+dir = /etc/ssl                        # katalog główny, w którym zapisywane są pliki.
+certs = /etc/ssl/certs                # katalog, w którym zapisywane są certyfikaty.
+crl_dir = $dir/crl                        # katalog z listą certyfikatów unieważnionych (CRL)
+private_key = $dir/private/cakey.pem  # klucz prywatny CA
+database = $dir/index.txt             # baza, w której przechowywane są informacje
+                                        o wystawionych certyfikatach wraz ze statusem
+certficate = $dir/cacrt.pem           # Certyfikat CA -  do podpisu wniosków
+serial = $dir/serial                  # plik pomocniczy z bieżącym numerem -
+                                        inkrementowany po każdym wystawieniu certyfikatu
+crl = $dir/crl.pem                    # bieżąca lista certyfikatów unieważnionych
+
+[ v3_ca ]
+# wykazujemy punkt dystrybucji listy CRL
+crlDistributionPoints=URI:http://example.com/crl.pem
+
+

+ Jeśli będziemy edytować istniejący wpis, opcje których nie ma w + sekcji [ CA_default ] + umieszczamy w komentarzu. +

+

+ Upewniamy się czy istnieje katalog podany w zmiennej + dir czyli /etc/ssl, oraz + wszystkie jego podkatalogi. Jeżeli nie, musimy je założyć. Dla + katalogu ssl/private należy ustawić uprawnienia tak, aby + tylko użytkownik root mógł do niego wejść. +

+

+ Stwórzmy pliki /etc/ssl/index.txt oraz + /etc/ssl/serial, używając podanych poniżej poleceń. +

+
+root@ca:~# touch /etc/ssl/index.txt   #(ma być pusty)
+root@ca:~# echo 00 > /etc/ssl/serial  #(ma zawierać wpis 00)
+
+

+ Przystępujemy do generowania klucza prywatnego centrum certyfikacji + CA. Jest to czynność jednorazowa, tzn. po wygenerowaniu klucza + prywatnego CA, a następnie odpowiadającego mu certyfikatu będziemy + ich używać do podpisywania innych certyfikatów. Należy pamiętać aby + zarchiwizować pliki z katalogi /etc/ssl w bezpiecznym + miejscu. +

+

+ Będąc w katalogu /etc/ssl, wydajemy następujące polecenie: +

+
+root@ca:/etc/ssl# openssl genrsa -des3 -out private/cakey.pem 1024
+Generating RSA private key, 1024 bit long modulus
+.....++++++
+...++++++
+e is 65537 (0x10001)
+Enter pass phrase for private/cakey.pem: <podaj hasło klucza prywatnego CA>
+
+

+ Po potwierdzeniu hasła do klucza prywatnego CA klucz zostanie + zapisany w pliku private/cakey.pem. Nie możemy zapomnieć + tego hasła, będzie nam nieraz potrzebne. +

+

+ Kolejną czynnością jest wygenerowanie certyfikatu CA. W tym celu + wpisujemy następujące polecenie: +

+
+root@ca:/etc/ssl# openssl req -new -x509 -days 365 -key private/cakey.pem -out cacert.pem
+
+

+ Zostaniemy poproszeni o podanie danych z kilku pól zawartych w + certyfikacie. +

+
+Country Name (2 letter code) [AU]:PL
+State or Province Name (fuli name) [Some-State]:Wonderland
+Locality Name (eg. city) []: Liberty City
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:morketsmerke.net
+Organizational Unit Name (eg, section) []:
+Common Name (eg, YOUR name) []: ca.morketsmerke.net
+Email Address []:
+
+

+ Zwrócić należy uwagę na pole + Common Name, które powinno zawierać nazwę podmiotu - np. nazwę + użytkownika lub jednostki. W przypadku gdy generujemy certyfikat dla + CA, wpisujemy nazwę domeny firmowej lub podajemy nazwę organizacji. +

+

+ Po podaniu hasła do klucza prywatnego certyfikat zostanie zapisany w + pliku cacert.pem. W powyższym przykładzie czas ważności + certyfikatu będzie wynosić 1 rok. Można go oczywiście przedłużyć. +

+

+ Na tym kończymy tworzenie własnego urzędu CA. Mając pliki + cakey.pem i cacert.pem, czyli klucz prywatny i + certyfikat CA. Teraz można rozpocząć wystawianie certyfikatów innym + podmiotom. +

+
Tworzenie klucza prywatnego dla serwera
+

+ Aby stworzyć klucz prywatny należy na urzędzie CA w katalogu + /etc/ssl wydać polecenie: +

+
+root@ca:/etc/ssl# openssl genrsa -des3 -out private/serverkey.pem 1024
+
+

+ Openssl zapyta o hasło - będzie to hasło klucza prywatnego serwera. + Klucz prywatny zapisany zostanie w pliku + private/serverkey.pem +

+
Generowanie wniosku o wystawienie certyfikatu
+
+root@ca:/etc/ssl# openssl req -new -key private/serverkey.pem  -out serverreq.pem
+
+

+ Potrzebne będzie hasło klucza prywatnego serwera, które podawaliśmy + punkt wyżej. Jeśli hasło będzie poprawne, zostaniesz zapytani o dane + do wniosku. +

+
+Country Name (2 letter code) [AU]:PL
+State or Province Name (fuli name) [Some-State]:Slask
+Locality Name (eg, city) []:G1iwice
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:Moja Firma Sp. z o.o.
+Organizational Unit Name (eg, section) []:
+Common Name (eg, YOUR name) []: server.firma.pl
+Email Address []:
+
+

+ Tutaj jako Common Name powinniśmy + podać pełną nazwę domenową pod, którą serwer działa w Internecie, + czyli FQDN. Wniosek zostanie zapisany w pliku + /etc/ssl/serverreq.pem. +

+
Generowanie certyfikatu dla serwera
+

+ W celu wystawienia certyfikatu dla podmiotu (serwera) musismy + podpisać jego wniosek. Aby to uczynić, należy wpisać poniższe + polecenie. +

+
+root@ca:/etc/ssl# openssl ca -notext -in serverreq.pem -out servercrt.pem
+
+

+ Zostaniemy zapytani o hasło do klucza prywatnego CA + cakey.pem. Nie należy mylić go z hasłem klucza prywatnego + serwera. +

+

+ Następnie OpenSSL pokaże szczegóły certyfikatu i zapyta, czy + chcemy go podpisać. +

+
+Signature ok
+Certificate Details:
+Serial Number: 5 (0x5)
+Validity
+Not Before: Sep 17 12:59:06 2007 GMT
+Not After : Sep 16 12:59:06 2008 GMT
+Subject:
+countryName = PL
+stateOrProvinceName = Slask
+organizationName = Moja Firma Sp. z o.o.
+organizationalUnitName =
+commonName = server.firma.pl
+X509v3 extensions:
+X509v3 Basic Constraints:
+CA:FALSE
+Netscape Comment:
+OpenSSL Generated Certificate
+X509v3 Subject Key Identifier:
+0E: CE: 3E: 06:C4:46:53:78: BO: 05: AB: 18:9B: BA: 90:79:9B: A l : A5 :C8
+X509v3 Authority Key Identifier:
+keyid:FC:B 8 :73:29:C 6 :E4:50:B 2 :3 E :C E :0A:78:8C:62:90:A 5 :62:3 C :87:IB
+DirName:/C-PL/ST=Slask/L-Gliwice/0=Moja Firma Sp. z o.o./
+CN=ca.fi rma.pl/emai 1 Address=admi n@firma.pl
+serial:97:1B:4E:CE:0B:5F:CE:E2
+Certificate is to be certified until Sep 16 12:59:06 2008 GMT (365 days)
+Sign the certificate? [y/n]: y
+1 out of 1 certificate requests certified, commit? [y/n]y
+Write out database with 1 new entries
+Data Base Updated
+
+

+ Odnośnie pracy z tak wygenerowanym certyfikatem jest jeszcze jeden + szczegół. Otóż każde uruchomienie aplikacji korzystającej z tego + certyfikatu będzie nas prosić hasło kluczy prywatnego, użytego do + jego wygenerowania. Co nie jest zbyt pożądane w środowiskach + serwerowych, jest natomiast rozwiązanie tego problemu. Otóż możemy + przepisać klucz pomijając hasło. +

+
Ściąganie hasła z klucza prywatnego serwera
+
+# openssl rsa -in private/serverkey.pem -out private/serverkey.pem_bezhasla
+
+

+ Nie zaleca się ściągania haseł z certyfikatów klientów, ze względu na + możliwość kradzieży komputera, co umożliwi dostęp do VPN. +

+
Unieważnianie certyfikatów
+

+ Powodów unieważnienia certyfikatów może być wiele. Jednak jeśli już + zachodzi taka potrzeba. Możemy użyć parametry + revoke programu OpenSSL. +

+
+root@srv:/etc/ssl/# openssl ca -revoke jkowalskicert.pem
+
+

+ OpenSSL zapyta o hasło klucza CA i po podaniu prawidłowego + unieważni certyfikat: +

+
+Using configuration from /usr/1ib/ssl/openssl.cnf
+Enter pass phrase for /etc/ssl/private/cakey.pem:
+DEBUG[load_index]: unique_subject = "yes"
+Revoking Certificate 04.
+Data Base Updated
+
+

+ Po unieważnieniu certyfikatu należy wygenerować jeszcze + listę CRL, w której zapisane są unieważnione + certyfikaty. +

+
Generowanie listy CRL (Listy unieważnionych certyfikatów)
+
+root@ca:/etc/ssl# openssl ca -gencrl -out crl.pem
+
+

+ Ważne, aby przenieść plik crl.pem do miejsca, które + wskazaliśmy jako crlDistributionPoint + w pliku konfiguracyjnym OpenSSL. +

+
Sprawdzanie ważności certyfikatu
+

+ Aby sprawdzić datę ważności certyfikatu oraz wyświetlić szczegółowe + informacje dla kogo został wystawiony możemy użyć polecenia: +

+
+root@ca:/etc/ssl# openssl x509 -noout -text -i 
+
+
Różne formaty certyfikatów
+

+ Niestety wśród certyfikatów nie ma jednego standardu i różni + producenci preferują różne formaty. Niemniej za pomocą programu + OpenSSL możemy je przekonwertować z jednego formatu na inny. + Klucze są najczęściej zapisywane w formie PEM lub DER (binarny). Dla + certyfikatów używane są PEM, DER, PKCS12. Aplikacje bazujące na + OpenSSL, czyli wszystkie unixowe, używają na ogół formatu + PEM (Base64). Rozszerzenia dla formatu PEM to: *.crt + *.pem, w systemach Windows *.cer +

+

+ Aby przekonwertować certyfikat z jednej postaci na drugą, musimy + przekazać programowi OpenSSL odpowiednie parametry. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format wejściowyFormat wyjściowySkładnia OpenSSL
PEM (cert)DER (cert) + openssl x509 -in cert.pem -out cert.der + -outform DER +
DER (cert)PEM (cert) + openssl x509 -in cert.der -inform DER + -out cert.pem -outform PEM +
PEM (key)DER (key) + openssl rsa -in input.key -inform PEM + -out output.key -outform DER +
DER (key)PEM (key) + openssl rsa -in input.key -inform DER + -out output.key -outform PEM + +
PEM (key,cert)PKCS #12 + openssl pkcs12 -export -out cert.p12 + -inkey userkey.pem -in usercert.pem +
PKCS #12PEM (cert) + openssl pkcs12 -clcerts -nokeys –in + cert.p12 -out usercert.pem +
PKCS #12PEM (key) + openssl pkcs12 -nocerts -in cert.p12 –out + userkey.pem +
+

+ Aby wyświetlić informację o certyfikacie, np. informacje podane + podczas tworzenia wniosku, należy uruchomić program OpenSSL z + następującymi parametrami: +

+
+root@ca:/etc/ssl# openssl x509 -in servercert.pem -subject –noout
+subject= /C=PL/ST=Slask/O=Helion/CN=server1
+
+

+ Jeśli dodamy parametr -issuer, + OpenSSL zwróci także informację o wystawcy (CA): +

+
+root@ca:/etc/ssl# openssl x509 -in servercert.pem -issuer -subject –noout
+subject= /C=PL/ST=Slask/O=Helion/CN=server1
+issuer= /C=PL/ST=Slask/L=Gliwice/O=Helion/CN=CA
+
+

+ Jeżeli certyfikat jest w formie binarnej (DER), do powyższej składni + należy dodać parametr -inform DER. +

+

Kompilacja OpenSSL ze źródeł

+

+ Jeśli z jakichś powodów musimy skompilować OpenSSL, poniżej w + punktach zamieszczono opis, jak to zrobić. +

+
    +
  1. + Pobieramy ze strony http://www.openssl.org/source/ źródła + najnowszej wersji pakietu i zapisz w katalogu /usr/src/, +
  2. +
  3. + Porównujemy wartość MD5 pliku pobranego z sieci (polecenie + md5sum) z wartością udostępnioną na stronie openssl.org, +
  4. +
  5. + Rozpakowujemy zawartość archiwum poleceniem +
    +$ tar zxf openssl-nr_wersji.tar.gz
    +
    +
  6. +
  7. + Przechodzimy do katalogu openssl-nr_wersji. +
  8. +
  9. + Przed przystąpieniem do kompilacji musimy ustalić, w którym katalogu + program ma zostać zainstalowany oraz z jakimi dodatkowymi opcjami, + podając je jako parametry skryptu + ./config. W poniższym przykładzie + skompilujemy program z obsługą biblioteki zlib, a wynikowy + program zostanie zainstalowany w katalogu /usr/local/openssl. + Wpisujemy polecenie: +
    +# ./config --prefix=/usr/local zlib
    +
    +
  10. +
  11. + Jeśli skrypt ./config nie zgłosi + błędu, możemy przejść do właściwej kompilacji programu. W tym celu + wpisujemy polecenie +
    +# make
    +
    +
  12. +
  13. + Proces kompilacji może potrwać kilka minut, po jego zakończeniu + możemy przejść do ostatniego kroku — instalacji skompilowanych + plików we właściwych katalogach. Aby zakończyć instalację, wpisujemy + polecenie: +
    +# make install
    +
    +
  14. +
+

Nakładki graficzne na SSL

+

+ Aby nie męczyć się ze skomplikowanymi poleceniami OpenSSL, + można zainstalować sobie jedną z nakładek graficznych dostępnych także + dla systemu Windows. +

+
    +
  • + XCA - Dzięki tej nakładce możemy utworzyć własny urząd + certyfikacji (Root CA), także generować klucze dla użytkowników i + wystawiać im certyfikaty. Dostępna jest dla większości systemów, + w tym BSD. +
  • +
  • + My Certificate Wizard - Drugą nakładka co prawda nie jest + przeznaczona dla administratorów. Tylko dla zwykłych użytkowników, + służy ona bowiem do generowania kluczy prywatnych oraz wniosków o + wydanie certyfikatu (pliki CSR). Program jest nieco stary. Jego + ostatnia stabilna wersja pochodzi z 2004, a strona twórcy ostatni + raz była aktualizowana w 2008 roku. +
  • +
+

Tunelowanie portów

+

+ Tunel, Tunele - właść. + Tunelowanie portów, technika pozwalając na przesłanie + jednego połączenia wewnątrz drugiego (tunelu). Najczęstszym + zastosowanie tuneli jest szyfrowanie połączeń, które nie zostały + przystosowane do korzystania z SSL czy TLS, kompresja danych czy + obejście blokad portów. +

+

+ Tunelowania używa się też jako prostszej alternatywy dla sieci VPN. + Jednak diametralna różnica między tunelami a siecią VPN jest taka, że + przez VPN operując na warstwie 3 (IP) wprowadzają własną adresacje + modyfikując tabele routingu tak, aby cały ruch niezależnie od aplikacji + czy protokołu przechodził przez szyfrowany kanał. +

+

+ Duża zaletą tuneli jest to, że działają one warstwie użytkownika to + znaczy, że nie potrzeba uprawnień administratora aby zestawić tunel. +

+

+ W praktyce tunele wyglądają tak, że użytkownik za pomocą specjalnej + aplikacji zestawia szyfrowane połączenie, stanowiąc tunel. W momencie + zestawienia tunelu otwierany jest nowy port na interfejsie pętli + zwrotnej (127.0.0.1) komputera klienta. Aplikacja na + komputerze użytkownika (np. program pocztowy) zamiast łaczyć się + bezpośrednio z IP serwera łączy się ze swoim adresem 127.0.0.1, + wysyłając dane, które program obsługujący tunel pobiera, następnie + szyfruje i przesyła przez Internet na drugą stronę tunelu. Po drugiej + stronie połączenia program tunelujący odbiera dane odszyfrowuje i + przekazuje - po interfejsie pętli (127.0.0.1) - do właściwej + aplikacji (np. serwera POP3). +

+

+ Oczywiście tunele, nie są alternatywą dla obsługi przez daemony SSL + czy TLS, główną różnicą jest tutaj ruch między aplikacją daemona, czy + klienta a programem tunelującym. Nie stanowi to jak zagrożenia, do + momentu zarażenia systemu złośliwym oprogramowaniem. +

+

+ Wśród administratorów najpopularniejszymi programami do tworzenie + tuneli są Stunnel oraz SSH, oba + posiadają wersje na UNIX-y oraz na MS Windows. +

+

Stunnel

+

+ Stunnel - rozprowadzany na licencji GNU/GPL program + do tworzenia szyfrowanych połączeń TCP. Program do uwierzytelnienia + wykorzystuje certyfikaty SSL/TLS X.509. +

+

+ Dostępność programu w różnych systemach operacyjnych: +

+
    +
  • Linux : REPOzytorium(Alpine, Arch, Cent OS, Debian, + Fedora, Mageia, OpenMandriva, OpenSUSE(leap), Ubuntu, Slackware) +
  • +
  • *BSD : FreeBSD(REPO), NetBSD(REPO), + OpenBSD(PORTS)
  • +
  • macOS : brew install stunnel
  • +
  • Windows : + https://www.stunnel.org/downloads/stunnel-5.56-win64-installer.exe +
  • +
+

+ Oczywiście program można skompilować samodzielnie potrzebne biblioteki: + libssl, libssl-dev, zlib. Podczas + ./configure podajemy + --prefix=/usr/local/stunnel, z + docelowym miejscem instalacji. Jeśli + ./configure nie zgłosi błędu wykonujemy kolejno: + make oraz + make install. +

+

+ Konfiguracja składa się z jednego pliku konfiguracyjnego oraz plików + certyfikatów. Do jego działania potrzebujemy CA (urządu certyfikacji) + oraz klucz i certyfikat dla serwera (najlepiej bez hasła). +

+

+ Program Stunnel oczekuje klucza prywatnego oraz certyfikatu w jednym + pliku - podawanym w dyrektywie cert + pliku konfiguracyjnego. Musimy przygotować taki plik, uważając na jego + format. Na początku umieszczamy klucz serwera, następnie pustą linijkę + odstępu, a po niej certyfikat. +

+
+root@ca:/etc/ssl# cat private/serverkey_bezhasla.pem > private/server.pem
+root@ca:/etc/ssl# echo " " >> private/server.pem
+root@ca:/etc/ssl# cat servercert.pem >> private/server.pem
+
+

+ Bardzo ważna jest pusta linijka przerwy pomiędzy kluczem a certyfikatem. +

+

+ Tak przygotowane pliki server.pem wraz z certyfikatem wystawcy + CA (plik cacert.pem) musimy przegrać na właściwy serwer + używając bezpiecznego połączenia, np. program SCP/SFTP lub fizycznego + sprawdzonego nośnika np. pendrive'a. Pliki zapisujemy na serwerze w + katalogu /etc/stunnel. +

+

+ Należy pamiętać, aby na docelowej maszynie nadać odpowiednie + uprawnienia do pliku server.pem tak, aby tylko root + mógł go przeczytać. Do tego posłużą dwa poniższe polecenia: +

+
+root@srv:~# chown root:root /etc/stunnel/server.pem
+root@srv:~# chmod 600 /etc/stunnel/server.pem
+
+

+ Czy będą na potrzebne certyfikaty dla klientów? To zależy od aplikacji, + czy posiada ona wewnętrzne metody uwierzytelniania użytkowników. Jeśli + usługa jest ogólnodostępna tak jak np. IRC, warto rozważyć wdrożenie + certyfikatów dla klientów, o ile chcemy utajnić nasz serwer IRC. + Wystawianie dla tuneli certyfikatów klienta ma sens w jeszcze jednym + przypadku, mianowicie chodzi o ograniczenie dostępu do konkretnych + rzeczy - tylko konkretne osoby mogą korzystać z konkretnych zasobów. + Jeśli już decydujemy się na uwierzytelnianie użytkowników, to należy + pamiętać aby w Common Name podać nazwę jednoznacznie + identyfikująca np. login korporacyjny. Decyzje o uwierzytelnieniu + użytkowników, należy podjąć samodzielnie, warto pod jedno za lub + przeciw wziąć liczbę użytkowników. +

+
stunnel.conf
+

+ Plik konfiguracyjny składa się z sekcji globalnej oraz przynajmniej + jednej dotyczącej danego tunelu (instancji/usługi). Puste linie są + ignorowane, podobnie jak komentarze zaczynające się od średnika + (;) lub krzyżyka (#). +

+

+ Wykaz najważniejszych opcji globalnych +

+
    +
  • chroot = katalog (tylko Unix) - + określa katalog, w którym uwięziony zostanie proces programu po + inicjalizacji. Ścieżki podane w opcjach + CApath, CRLpath, + pid, + exec muszą być określone względem + tego katalogu. Owo uwięzienie sprawia, że nawet w przypadku + znalezienia poważnego błędu w aplikacji, umożliwiającego wywołanie + powłoki systemu Unix, napastnik zostanie "uwięziony" wewnątrz + katalogu /var/run/stunnel. Nie będzie mógł po za ten katalog + wyjść, a więc nie będzie miał dostępu do żadnych innych plików + serwera. chroot jest typową metodą + zabezpieczania programów w środowisku uniksowym,
  • +
  • compression = zlib | rle - wybór + algorytmu kompresji przesyłanych danych. Domyślna opcja to brak + kompresji. Możemy skorzystać z prostego algorytmu RLE lub z + bardziej wydajnej biblioteki zlib. W tym drugim przypadku + biblioteka OpenSSL musi być skompilowana z obsługą kompresji + zlib,
  • +
  • debug = wartość - określa poziom + szczegółowości logowania w skali od 1 do 7, odpowiadający poziomom + daemona syslog,
  • +
  • output = plik - użycie tej opcji spowoduje logowanie + informacji do wskazanego pliku zamiast do daemona + syslog,
  • +
  • setuid = uid (tylko Unix) - + identyfikator użytkownika, na którego prawach będzie działał Stunnel. + Program po uruchomieni zrzuca uprawnienia administratora i działa + jako wskazany tutaj użytkownik,
  • +
  • setgid = gid (tylko Unix) - opcja + jak powyżej tylko dotycząca grupy.
  • +
+

+ Opcje dotyczące sekcji usług +

+
    +
  • accept = [adres:]port - nasłuchuje + na podanym adresie i porcie. Jeśli nie zostanie jawnie podany adres + IP, Stunnel będzie nasłuchiwał na wszystkich adresach IP dostępnych + w systemie,
  • +
  • connect = [adres:]port - połacz + się ze zdalnym serwerem na podany port. Domyślnie localhost, +
  • +
  • cert = server.pem - plik z kluczem + prywatnym i certyfikatem,
  • +
  • ciphers = lista_algorytmów - zawiera + listę dozwolonych algorytmów SSL. Przydatna jeśli druga strona nie + wspiera jakiegoś szyfru,
  • +
  • client = yes | no - ustala, czy + sekcja jest klientem czy serwerem. Domyślna wartość: + no - tryb serwerowy,
  • +
  • CRLfile = plik_CRL - plik z listą + odwołanych certyfikatów (CRL). Używana, gdy załączona jest opcja + verify,
  • +
  • ident = nazwa_użytkownika - + weryfikuj nazwę zdalnego użytkownika korzystając z protokołu IDENT, +
  • +
  • verify = poziom - domyślnie + 0 - nie weryfikuj certyfikatu + (klienta). Dyrektywa ta może przyjmować następujące wartości: +
      +
    • poziom 1 - weryfikuj, jeżeli + został przedstawiony,
    • +
    • poziom 2 - weryfikuj + certyfikat przez lokalne CA,
    • +
    • poziom 3 - weryfikuj z + lokalnie zainstalowanym certyfikatem drugiej strony.
    • +
    + Załączenie opcji verify po stronie + serwera jest koniecznie jeśli dostęp do tunelu mają mieć wyłącznie + uwierzytelnieni użytkownicy (z wystawionymi certyfikatami przez + nasze CA).
  • +
  • retry = yes | no (tylko Unix) - + połącz ponownie sekcję connect+exec + po rozłączeniu.
  • +
+
Przykład 1
+

+ Przykład opisuje stworzenie tunelu TCP umożliwiającego bezpieczne + ściąganie poczty przez protokół POP3. +

+

+ Jak wiadomo protokół POP3 w swej pierwotnej postaci przesyła wszystkie + dane, łącznie z hasłem, jawnym tekstem. Naszym celem będzie + przepuszczenie sesji połączenia POP3 przez szyfrowany tunel SSL, tak aby + nikt nie był w stanie odczytać ani treści poczty ani hasła. +

+

+ Ze względu na to, że POP3 uwierzytelnia klientów, certyfikaty dla + użytkowników tunelu nie będą potrzebne. Podstawowym celem tunelu jest + zapewnienie szyfrowania transmisji. Uwierzytelnienie serwera będzie + dobrym pomysłem, bo daje pewność, że łączą się z właściwym serwerem, + a nie z podstawionym przez intruza w wyniku zmiany routingu. Przykład + można wykonać wg. poniższych punktów. +

+
    +
  1. Instalujemy najwygodniejszym dla nas sposobem Stunnel w naszym + systemie,
  2. +
  3. Generujemy na komputerze przeznaczony do CA, klucz i certyfikat dla + serwera, po czym łączymy ze sobą oba pliku w plik server.pem, + pamiętając o pustej linijce przerwy.
  4. +
  5. Przegrywamy na serwer docelowy przygotowany plik server.pem + oraz cacert.pem - certyfikat CA. Pamiętając o zmianie + uprawnień dla pliku server.pem.
  6. +
  7. Tworzymy plik /etc/stunnel/stunnel.conf z zawartością + pokazaną w poniżej: +
    +# stunnel.conf po stronie serwera
    +# opcje globalne
    +chroot = /var/run/stunnel ; ścieżka do chroota
    +pid = /stunnel.pid
    +setuid = stunnel   ; zrzuć uprawnienia do użytkownika stunnel
    +setgid = stunnel   ; jw. dla grupy
    +debug = 3
    +output = /var/log/stunnel.log
    +
    +# sekcja związana z sekcją pop3
    +[pop3s]            ; początek sekcji pop3
    +accept  = 995      ; oczekuj połączeń na porcie 995
    +connect = 110      ; przekazuj dane do portu 110 localhosta
    +cert = /etc/stunnel/server.pem   ; plik PEM z kluczem prywatnym i certyfikatem
    +CAfile = /etc/stunnel/cacert.pem ; certyfikat CA
    +verify = 0         ; nie sprawdzamy certyfikatów użytkowników
    +
    + Czytając ten plik konfiguracyjny wraz z komentarzami można zrozumieć + jak będzie działał program Stunnel. Najważniejszą rzeczą jak trzeba + by tutaj zaznaczyć, jest że POP3 nasłuchuje na pętli zwrotnej + (127.0.0.1) na portcie 110. Jeśli instalując jakąś usługę + już wiemy że będziemy używać tunelu do realizowania połączenia między + jej daemonem a klientem, to w konfiguracji należy ustawić jako adres + nasłuchiwania 127.0.0.1. Klienci łączą się na standardowym + porcie 995 (standardowy port pop3s) z tunelem, ten przekazuje dane + wewnątrz serwera na port 110 pętli zwrotnej do daemona POP3.
  8. +
  9. Uruchamiamy tunel na serwerze: +
    +# stunnel /etc/stunnel/stunnel.conf
    +
    +
  10. +
  11. Instalujemy na komputerze klienta Stunnel.
  12. +
  13. Przenosimy plik z certyfikatem CA - cacert.pem - na komputer + klienta.
  14. +
  15. Tworzy plik konfiguracyjny klienta pokazany poniżej: +
    +debug = 3
    +output = stunnel.txt ; loguj do pliku
    +[pop3s] ; początek sekcji połączenia POP3S
    +accept = 127.0.0.1:110 ; słuchaj na porcie 110 interfejsu pętli zwrotnej
    +connect = 85.198.209.251:995 ; połącz się ze zdalnym serwerem na port 995
    +client = yes ; jestem klientem
    +CAfile = certs.pem ; certyfikat CA potrzebny do uwierzytelnienia serwera
    +verify = 2 ; weryfikuj certyfikat serwera
    +
    + Warto zaznaczyć że współczesne programy pocztowe obsługują SSL/TLS + same w sobie, dlatego punkty 6-8 są zbędne. Jednak aby program nie + zgłaszał błedu w połączeniu należy dodać certyfikat naszego CA do + zaufanych wystawców, a po stronie serwera natomiast należy wyłączyć + opcje weryfikacji klienta. (verify = 0 + ), ponieważ programy pocztowe nie przedstawiają swojego + certyfikatu (a przynajmniej nie wszystkie da się do tego zmusić). +
  16. +
+
Przykład 2
+

+ Przykład przedstawia stworzenie tunelu TCP umożliwiającego bezpieczny + dostęp do aplikacji bazodanowej wewnątrz sieci LAN. +

+

+ Zadanie to możemy rozwiązać za pomocą programu Stunnel, przy czym w tym + przypadku program będzie działał na routerze, a nie bezpośrednio na + serwerze bazodanowym. Przyda nam się tutaj opcja uwierzytelniania + klientów, a także załączenie kompresji. +

+

+ Zadanie wykonujemy wg. poniższych punktów. +

+
    +
  1. Zainstalujemy program Stunnel na routerze.
  2. +
  3. Generujemy na osobnym komputerze (CA) klucz i certyfikaty dla serwera + i użytkowników. Pamiętajmy, aby nie ściągać haseł z kluczy dla + użytkowników.
  4. +
  5. Przenosimy przygotowany plik server.pem oraz certyfikat CA + (plik cacert.pem) na router. Ustawiamy uprawnienia tak aby + tylko root był właścicielem i tylko on miał prawo odczytu. +
  6. +
  7. Ustalamy, na jakim porcie i jakim adresie działa baza danych.
  8. +
  9. Przygotowujemy plik konfiguracyjny po stronie routera
  10. +
  11. Odblokowujemy na firewallu możliwość łączenia się z portem, + na którym słucha program Stunnel.
  12. +
  13. Przenosimy klucz i certyfikat (w formie client.pem) oraz + certyfikat CA (cacert.pem) na komputer użytkownika. + Pozostawiamy kopie certyfikatów użytkowników na komputerze CA.
  14. +
  15. Przygotowujemy plik konfiguracyjny klienta i testujemy połączenie. +
  16. +
+

+ Jeśli jest to możliwe to dobrze by było, żeby Stunnel od strony Internetu + nasłuchiwał na jakimś wysokim porcie, z którym nie jest skojarzona żadna + usługa. +

+

+ Poniżej przedstawiono plik konfiguracyjny routera: +

+
+# plik konfiguracyjny programu Stunnel po stronie routera
+# opcje globalne
+chroot = /var/run/stunnel ; ścieżka do chroota
+pid = /stunnel.pid
+setuid = stunnel   ; zrzuć uprawnienia do użytkownika stunnel
+setgid = stunnel   ; jw. dla grupy
+debug = 3
+output = /var/log/stunnel.log
+
+# sekcja związana z dostępem do serwera SQL
+[sqls]               ; początek sekcji SQL
+accept  = 11298      ; oczekuj połączeń na tym porcie
+connect = 192.168.20.6: 3050   ; przekazuj do portu 3050 hosta 192.168.20.6
+cert = /etc/stunnel/server.pem
+CAfile = /etc/stunnel/cacert.pem
+verify = 2
+
+

+ Jeśli na naszym routerze domyślną polityką jest blokuj, to w + następnej kolejności należy odblokować port na którym słucha + Stunnel. +

+

+ Do uruchomienia tunelu pozostała jeszcze konfiguracja klienta. W tym + celu należy zainstalować program Stunnel oraz przegrać + przygotowane wcześniej certyfikaty client.pem oraz + cacert.pem. Konfiguracja klienta jest przestawiona poniżej. +

+
+debug = 3
+output = stunnel.txt ; loguj do pliku
+[sqls]
+accept = 127.0.0.1: 3050       ; słuchaj na porcie 110 interfejsu pętli zwrotnej
+connect = 85.198.209.251:11298 ; połącz się z serwerem na port 11298
+client = yes       ; jestem klientem
+CAfile = certs.pem ; plik z certyfikatem CA, ewentualnie certyfikatem serwera
+cert = client.pem  ; plik z kluczem i certyfikatem użytkownika
+verify = 2   ; weryfikuj certyfikat serwera przez CA
+
+

+ Ostatnią rzeczą jaką należy zrobić jest zmiana adresu IP serwera bazy + danych aplikacji, która ma korzystać z tej bazy na adres pętli zwrotnej. + Do testowania działania tunelu przydaje się Telnet - po połączeniu się + z portem lokalnego interfejsu, powinien odpowiedzieć serwer bazy danych. +

+

SSH

+

+ SSH - protokół sieciowy umożliwiający bezpieczne + (szyfrowane) połączenie z powłoką/terminalem (interfejsem tekstowym + komputera). +

+

+ Generalnie SSH, służy nie tylko do pracy za pomocą zdalnej powłoki na + odległych serwerach, za pomocą poleceń możemy wygenerować klucze RSA, + których później możemy użyć do logowania bez hasła, lub jednego + odrębnego hasła dla wszystkich innych serwerów czy bezpiecznego + transferu plików jak i również zestawić szyfrowany tunel. Jedyne czego + potrzebujemy to konta na serwerze oraz takich możliwości (są + ogólnodostępne serwery oferujące konta powłoki, jednak + opcje tunelowania są tam niedostępne - przyp. red. 2021). +

+

+ W niniejszym punkcie zostanie przedstawionych kilka praktycznych + przykładów dla tunelowania SSH. +

+
Przykład 1
+

+ Podstawowym przykładem będzie zestawienie tunelu SSH pomiędzy lokalnym + portem TCP/12345 a portem TCP/445 odległej maszyny. Przy użyciu unixowego + klienta ssh składnia polecenia będzie + następująca: +

+
+jkowalski@srv10:~$ ssh admin@123.10.12.11 -L 12345:127.0.0.1:445
+
+

+ Liczba podana po -L określa, który + lokalny port klienta ma zostać użyty dla potrzeb tunelu. + 127.0.0.1:445 mówi nam, że zdalna strona + - serwer SSH, ma połączyć się z adresem + 127.0.0.1 + na port TCP/445. Czyli w tym przypadku + koniec tunelu stanowić będzie lokalny interfejs zdalnego serwera i + działająca tam SAMBA. +

+

+ Po podaniu hasła użytkownika zdalnego, tunel zostanie utworzony. W + systemach unixowych uruchomienie usługi na porcie poniżej 1024 wymaga + uprawnień administratora (root) o czym warto pamiętać. Nie ma + to miejsca w systemach Windows. +

+

+ Czasami może się zdarzyć, że chcemy zestawić tunel na określony czas, + a także żeby proces przeszedł w tło. Dla przykładu możemy zestawić + tunel trwający 10 minut. +

+
+$ ssh -f -n -L 12345:127.0.0.1:445 admin@123.10.12.11 sleep 600
+
+

+ Opcja -f powoduje przeniesienie na tło + wykonania polecenia /bin/sleep, z kolei opcja + -n jest często używana z opcją + -f, powoduje ona przekierowanie pliku + /dev/null na standardowego wejścia dla procesu uruchomionego + w tle. Opcja -n zostanie + zignorowana gdy ssh będzie prosił o + hasło. +

+
Utworzenie tunelu z portami 1:1
+

+ Przydatne wtedy, gdy aplikacja ma już zdefiniowane odgórnie porty. +

+
+xf0r3m@KAT2:~$ ssh xf0r3m@dl.morketsmerke.net -L 445:127.0.0.1:445
+
+
Przykład 2 - SSH jako Socks Proxy
+

+ Tunele SSH można wykorzystać do zestawiania końców tunelu z różnymi + hostami, do tej port hosta na końcu tunelu był stały. Twórcy SSH + zaimplementowali coś takiego jak tunele dynamiczne. Jeśli pakiet zostanie + przekazany na przykład przez jakieś ustawienie proxy na port, na którym + jest uruchomiony tunel dynamiczny, serwer zdalny zestawi koniec tunelu + pomiędzy sobą a hostem docelowym na danym porcie zwartym w pakiecie. + Można użyć tej techniki do omijania blokad portów. +

+
+xf0r3m@KAT2:~$ ssh xf0r3m@dl.morketsmerke.net -D 8080
+
+
Przykład 3 - tunele z przekazywaniem zdalnym
+

+ SSH pozwala na jeszcze jeden rodzaj tuneli. Mianowicie tunel z + przekazywaniem zdalnym. Polega on na tym że nasz serwer, który z jakiś + powodów nie może być normalnie wypuszczony do Internetu, tworzy + specjalny rodzaj tunelu, który otwiera port na serwerze. Otwarcie tego + portu pozwoli na połączenie się potencjalnego klienta z problematycznym + serwerem, warunkiem jest zestawienie kolejnego tunelu, tym razem takie + jak wcześniej (lokalnego), który przekieruje dane z aplikcji na port + otwarty na serwerze, a ten z kolei na nasz serwer. Jeśli jesteśmy + administratorem serwera SSH, możemy ustawić go tak aby zdalny port + nasłuchiwał na wszystkich adresach na serwerze, co analogicznie + uwidacznia go z poziomu internetu (nie koniecznie, może być jeszcze + wymagany port forwarding na routerze/bramie), służy do tego opcja + GatewayPorts, która domyślnie ustawiona + jest na no ze względów bezpieczeństwa, + niweluje nam potrzebę zestawiania lokalnego przekazywania (klasycznego + tunelu SSH). Warunek jest prosty. Czy otwarty przez zdalne przekazywanie + serwera ma być ogólnodostępny w internecie. Jeśli tak to (i oczywiście + mamy do tego odpowiednie uprawnienia) możemy przestawić tę opcję na + yes. Jeśli nie to pozostaje nam + zestawić tylko tunel pomiędzy lokalnym portem a otwartym zdalnym portem. +

+
+#port zdalny
+xf0r3m@KAT2:~$ ssh xf0r3m@dl.morketsmerke.net -R 11111:127.0.0.1:3389
+
+
+#port lokalny
+xf0r3m@KAT2:~$ ssh xf0r3m@dl.morketsmerke.net -L 13389:127.0.0.1:11111
+
+

+ Podobno jeśli używamy XP wersji Professional to nie powinniśmy + przekierowywać lokalnego tunelu na 3389, ponieważ może na nim działać + lokalny serwer usług terminalowych (sic!). +

+

+ Po zestawieniu tych tuneli powinniśmy móc się połączyć, za pomocą + klienta RDP, na lokalnie przekierowanym porcie czyli TCP/13389. +

+

Tunel UDP po SSH

+

+ W przykładach na powyższych stronach, tunelowane były inne połączenia + TCP. To tutaj zostanie przedstawiony pomysł na tunelowanie UDP przez + połączenie SSH (TCP). Generalnie do tunelowanie UDP bardziej nadają się + sieci VPN, jednak przestawiony sposób działa dobrze i może przydać do + prostych zastosowań. +

+

+ Załóżmy, że musimy połączyć się z usługa UDP na porcie 7777, jednak nasz + komputer jest podłączony do sieci, która blokuje połączenia UDP na tym + porcie. +

+

+ W tym celu musimy zestawić połączenie TCP naszego komputera z serwerem + pośredniczącym SSH na interesujących nas portach. W tym celu na naszym + komputerze wpisujemy polecenie: +

+
+xf0r3m@srv01:~$ ssh -L 7777:localhost:7777 xf0r3m@srv02.morketsmerke.net
+
+

+ Teraz na serwerze SSH musimy utworzyć "przekaźnik" danych, który dane + odczytane z TCP 7777 prześle do portu 7777 UDP do serwera. Wykorzystamy + do tego kolejkę FIFO oraz program Netcat. Na serwerze pośredniczącym + wpisujemy polecenie: +

+
+root@srv02:~# mkfifo /tmp/fifo
+
+

+ Kolejnym krokiem będzie uruchomienie programu Netcat, który będzie + słuchał na porcie TCP 7777 serwera (pobierał dane z tunelu) a następnie + już bezpośrednio będzie przekazywał je do serwera: +

+
+xf0r3m@srv02:~$ nc -l -p 7777 < /tmp/fifo | nc -u 123.10.12.11 7777 > /tmp/fifo
+
+

+ W pierwszej części nc nasłuchuje na adresie pętli zwrotnej + na porcie 7777, pobierając dane z tunelu a następnie przekaże je do + potokiem to kolejnej instancji nc, która wyśle je do serwera, + natomiast odpowiedzi przekaże z powrotem do kolejki, a te trafią tunelem + do naszego komputera. +

+

+ Teraz wracamy do naszego komputera i tam tworzymy nową kolejkę FIFO.: +

+
+xf0r3m@srv01:~# mkfifo /tmp/fifo
+
+

+ Następnie uruchamiamy program Netcat z odpowiedni parametrami: +

+
+xf0r3m@srv01:~#nc -l -u -p 7777 < /tmp/fifo | nc localhost 7777 > /tmp/fifo
+
+

+ NC uruchamia port 7777 UDP, to z nim będzie się łączyć nasza aplikacja, + dane wyjściowe przekazywane są do tunelu gdzie przekazywane są do serwera + odpowiedzi są przekazywane do kolejki, a następnie jako dane wejściowe + (pobrane z kolejki FIFO) do aplikacji. +

+

+ Powinniśmy teraz móc się połączyć. Jeśli jest z czymś problem to warto + upewnić się czy do kolejki trafią dane, na wolnej konsoli możemy + wyświetlić jej zawartość poleceniem (na obu maszynach): +

+
+$ tail -f /tmp/fifo
+
+

OpenVPN

+

+ OpenVPN - to działający w oparciu o protokół SSL/TLS + program do zestawiania wirtualnych sieci prywatnych. +

+

+ Do najważniejszych cech można zaliczyć m.in.: +

+
    +
  • prosta instalacja i konfiguracja,
  • +
  • działa w warstwie użytkownika,
  • +
  • wykorzystuje dobrze znany i sprawdzony protokół SSL,
  • +
  • dostępny jest na licencji GPL w wersji 2,
  • +
  • działa z większością systemów operacyjnych nawet z Windows Mobile,
  • +
  • działa bezproblemowo w sieciach za NAT-em.
  • +
+

Instalacja

+

+ Instalacja programu OpenVPN różni się w zależności od + zainstalowanego systemu operacyjnego. W systemach Linux możemy + zainstalować program, używając właściwego dla swojej dystrybucji + narzędzia do zarządzania pakietami, lub też pobrać źródła programu + OpenVPN i skompilować je samodzielnie. W przypadku systemu FreeBSD zaleca + się użycie systemu portów. Dla systemów MS Windows (2000, XP, Vista) + dostępny jest pakiet instalacyjny, który oprócz właściwego programu + zainstaluje też sterownik wirtualnego interfejsu TAP. +

+

+ Poniżej przedstawione zostanie instalacja w systemie GNU/Linux Debian + z wykorzystaniem apt-get a także + kompilacje ze źródeł. +

+
Instalacja w systemie GNU/Linux Debian
+

+ Będąc zalogowanym jako root wpisujemy polecenie: +

+
+root@srv01:~# apt-get install openvpn
+
. +

+ Program apt-get ściągnie z sieci paczkę + z programem OpenVPN i zainstaluje plik w odpowiednich katalogach. + Skrypt instalacyjny zapyta także, czy utworzyć plik urządzenia + /dev/net/tun. Na te pytania należy odpowiedzieć twierdząco, + urządzenie jest potrzebne do działania VPN. Skrypt instalacyjny Debiana + zapyta także o to czy w przypadku aktualizacji programu OpenVPN + powinien wyłączyć usługę przed aktualizacją, czy też robić to po + aktualizacji. Odpowiedź na to pytanie jest istotna w przypadku gdy dostęp + do konsoli serwera mamy tylko przez nasz tunel VPN - wówczas należy + odpowiedzieć NIE (nie zatrzymuj usługi przed + aktualizacją). W przeciwnym razie stracilibyśmy łączność z serwerem. + W przypadku "paczek" Debianowych program zostanie + zainstalowany w katalogu /usr/sbin, a pliki konfiguracyjny + powinien znajdować się w /etc/openvpn. +

+
Instalacja przez kompilację źródeł programu (Linux)
+

+ Opis instalacji ze źródeł jest uniwersalny dla większości systemów + *niksowych. Przed kompilacją upewnij się, czy masz zainstalowane w + systemie tzw. narzędzia deweloperskie ( np. dla dystrybucji opartych na + Debianie jest to pakiet pod nazwą build-essentials) tj. + kompilator języka C++ (pakiet g++) i program make. Jako że + OpenVPN działa w oparciu o protokół SSL, potrzebna będzie także + zainstalowana biblioteka openssl wraz z nagłówkami (pakiety + libssl, libssl-dev). Dystrybucje, w których instalacja + oprogramowania na ogół polega na kompilacji źródeł, powinny mieć + wszystkie potrzebne biblioteki już zainstalowane. +

+

+ Przed kompilacją programu OpenVPN upewnij się że masz + zainstalowaną w systemie bibliotekę LZO (wraz z nagłówkami) - + odpowiedzialną za kompresje danych. Wprawdzie można skompilować + OpenVPN bez tej biblioteki, jednakże pozbawimy się możliwości + używania kompresji w połączeniach VPN. Aby sprawdzić czy mamy + zainstalowane pliki nagłówkowe biblioteki LZO wykonujemy poniższe + polecenie. +

+
+srv:~# find /usr/ -type -f -name 'lzo1x.h'
+
+

+ Jeśli nie znaleziono pliku lzo1x.h, to musimy jeszcze + skompilować i zainstalować bibliotekę LZO. W tym celu wykonujemy + poniższe czynności. +

+
    +
  1. Pobieramy kod źródłowy biblioteki LZO ze strony + + http://www.oberhumer.com/opensource/lzo/#download. Musimy pobrać + pełną wersję, nie wybierajmy wersji Mini-LZO, która nie zawiera + potrzebnych plików nagłówkowych. Rozpakowujemy kod w jakiś katalog + tymczasowy np. /usr/src/lzo-2.10. +
  2. +
  3. Wpisujemy polecenie: +
    +# ./configure && make && make install
    +
    +
  4. +
+

+ Jeśli mamy zainstalowane w systemie podstawowe narzędzia deweloperskie, + biblioteka powinna skompilować się bez problemów. W wyniku instalacji + (polecenia make install) powinny + powstać pliki nagłówkowe biblioteki LZO - w katalogu + /usr/local/include/lzo. Teraz możemy przejść do kompilacji + programu OpenVPN. +

+
    +
  1. Pobieramy źródła stabilnej wersji programu OpenVPN ze strony + głównej projektu + https://openvpn.net/community-downloads/. +
  2. +
  3. Rozpakowujemy plik w katalogu /usr/src/. W tym celu + wpisujemy polecenie: +
    +# unzip openvpn-<numer_wersji>.zip
    +
  4. +
  5. Przechodzimy do katalogu openvpn-<numer_wersji> i + wpisujemy polecenie: +
    +# ./configure
    +
  6. +
  7. Możemy zapoznać się z listą dostępnych opcji wpisując polecenie +
    +# ./configure --help | more
    +
    , + jednakże w większości przypadków domyślne opcje konfiguracyjne są + wystarczające.
  8. +
  9. Jeśli podczas działania skryptu + ./configure nie zostaną zgłoszone + błędy, możemy uruchomić właściwą kompilacje programu w tym celu + wpisujemy polecenie: +
    +# make
    +
    + Kompilacja nie trwa długo, na szybkim komputerze po około minucie + program make zakończy działanie.
  10. +
  11. Ostatnim krokiem jest instalacja skompilowanych plików we właściwych + katalogach. W tym celu wpisujemy polecenie: +
    +# make install
    +
    + Program powinien zainstalować się w katalogu /usr/local/bin +
  12. +
+

+ OpenVPN potrzebuje też do działania wirtualnego interfejsu + sieciowego TUN/TAP, którego sterownik musi być wkompilowany w + jądro systemu, bądź mieć postać modułów (Linux). Jeśli nie kompilowaliśmy + jądra swojego systemu samodzielnie, to najprawdopodobniej odpowiedni + sterownik mamy już w systemie (popularne dystrybucje dodają go w postaci + modułów). Aby się o tym przekonać wpisujemy polecenie: +

+
+# modprobe tun
+
+

+ Jeśli program modprobe nie zgłosi błędu, + możemy wpisać komendę dmesg, aby + sprawdzić, czy moduł jądra został załadowany do pamięci. Szukajmy napisu + zawierającego "TUN/TAP". Gdy program + modprobe zgłosi + następujący błąd: + Can't locate module tun, + oznacza to, że albo sterownik interfejsu TUN/TAP został + wkompilowany w jądro, albo też sterownika nie ma ani w jądrze, ani w + postaci modułu. Aby sprawdzić to, wpisujemy polecenie: + dmesg | grep -i tun. Powinniśmy + zobaczyć komunikat świadczący o obecności sterownika TUN/TAP, w + przeciwnym razie jądro nie obsługuje tego sterownika i będzie trzeba je + przekompilować. +

+

+ + (od Redaktora strony: Tutaj ze względu na to, że książka została + wydana 10 lat temu. Ta część zostanie zakończona. Rekompilacja + jądra przedstawiona w tym miejscu w książce była kompatybilna z + jądrem 2.6, w momencie pisania jest 5.5.10, wiele rzeczy z tym + związane mogło zostać zmienione, natomiast nie umiejętna + rekompilacja jądrą może unieruchomić system, ta część zostanie + pominięta) + + +

+

+ Ostatnim etapem instalacji programu OpenVPN jest stworzenie + pliku urządzenia interfejsu TUN oraz modyfikacja skryptów + startowych. Wpisujemy polecenie: +

+
+# mknod /dev/net/tun c 10 200
+
+

+ Jeśli instalowaliśmy OpenVPN z paczki, jest wielce prawdopodobne, + że plik już istnieje, więc wywołanie tego polecenia zwróci błąd o tym że, + pliki istnieje. Nie należy się nim przejmować. W przypadku gdy sterownik + TUN jest w postaci modułu, upewnijmy się czy jest on dopisany w + pliku odpowiedzialnym za ładowanie modułów przy starcie systemu. Niestety + nie ma tutaj spójności pomiędzy systemami. Poniżej znajdują się ścieżki + dla najpopularniejszych dystrybucji: +

+
    +
  • /etc/modules - dystrybucja Debian i wszystkie bazujące na + niej,
  • +
  • /etc/rc.modules - dystrybucja Slackware,
  • +
  • /etc/modprobe.conf - dystrybucja RedHat, Fedora, Aurox, + o inne bazujące na RHEL.
  • +
+

+ Jako, że do działania sieci VPN na pewno będzie potrzebne przekazywanie + pakietów (ang. forwarding) dopisujemy do pliku + /etc/sysctl.conf linijkę: + net.ivp4.ip_forward = 1. +

+

+ Ze względów bezpieczeństwa serwera na potrzeby działania programu + OpenVPN powinieneś stworzyć osobne konto bez możliwości + logowania się i bez możliwości uruchomienia powłoki. Program + OpenVPN zaraz po uruchomieniu się zrzuci uprawnienia użytkownika + root na to specjalne konto. +

+

+ Zakładamy konto OpenVPN oraz grupę o takiej samej nazwie. W tym + celu wykonujemy poniższe polecenia. +

+
    +
  1. groupadd openvpn
  2. +
  3. usermod -g openvpn -d /usr/local/etc/openvpn + -s /bin/false -f 1 openvpn
  4. +
  5. mkdir /user/local/etc/openvpn
  6. +
  7. chown openvpn:openvpn /usr/local/etc/openvpn +
  8. +
+

+ W powyższym przykładzie konfiguracje programu OpenVPN będziemy + przechowywali w katalogu /usr/local/etc/openvpn. Możemy ją + zmienić oczywiście dostosowując je do własnych potrzeb. +

+

Konfiguracja OpenVPN

+

+ Konfiguracja programu OpenVPN polega na stworzeniu jednego pliku + konfiguracyjnego oraz ewentualnym przygotowaniu klucz i certyfikatów SSL + dla serwera i klientów. Liczba opcji konfiguracyjnych sukcesywnie rosła, + osiągając już całkiem pokaźne rozmiary. Jednak w typowych konfiguracjach + używać będziemy używać tylko podstawowych opcji. Nim przejdziemy do + praktycznych przykładów, zostaną opisane najważniejsze właściwości + programu OpenVPN. +

+

+ OpenVPN może działać w jednym z dwóch podstawowych typów: +

+
    +
  • Tryb routera - używany w przypadku konfiguracji + typu brama + wielu klientów lub brama-brama. Dobrym przykładem jest + tutaj zdalny dostęp do zasobów firmy przez mobilnych pracowników.
  • +
  • Tryb bridge'a - używany najczęściej w przypadku + łączenia dwóch lub większej liczby sieci. W tym przypadku między + sieciami przekazywany jest cały ruch łącznie z broadcastami. + Przykładem wykorzystania tego trybu jest stworzenie tuneli VPN + pomiędzy oddziałem firmy a centralą, tak aby działał między nimi + protokół IPX.
  • +
+

+ Trybu bridge'a powinniśmy używać tylko w gdy jest naprawdę konieczne. We + wszystkich pozostałych lepszym rozwiązaniem jest tryb routera. Przede + wszystkim dla tego że nie przesyła pakietów broadcast. Po drugie + w przypadku routera każdy z klientów ma osobną podsieć IP, dzięki czemu + możemy prosto i skutecznie definiować, który użytkownik do czego ma + dostęp na firewallu (np. iptables). +

+

+ Drugą istotną kwestią, którą musismy rozważyć, jest sposób + uwierzytelniania klientów. Tutaj także mamy dwie możliwości: +

+
    +
  • Uwierzytelnianie przez współdzielony stały klucz znany obu stronom. + Rozwiązanie proste w konfiguracji, nie nadaje się dla wielu + użytkowników. Znakomicie sprawdza się jednak w przypadku łączenia + podsieci, np. oddziału firmy z centralą,
  • +
  • Uwierzytelnianie przez certyfikaty SSL X.509, znane z poprzedniego + rozdziału. To rozwiązanie znakomicie nadaje się do tworzenia zdalnego + dostępu dla pracowników. Dzięki własnościom protokołu SSL/PKI możemy + wystawiać użytkownikom certyfikat na określony czas, w razie potrzeby + unieważnić je, nadawać dostęp na podstawie właściciela certyfikatu + itp.
  • +
+

+ Jeśli mamy wybrać metodę to uwierzytelnianie po przez certyfikaty X.509 + należy zastosować wszędzie tam, gdzie mamy do czynienia z czynnikiem + ludzkim (odchodzący pracownicy, nieznani użytkownicy). Rozwiązanie z + kluczem współdzielonym wystarcza w przypadku łączenia ze sobą routerów. +

+

+ UDP czy TCP - który protokół transportowy wybrać dla potrzeb tunelu? + OpenVPN może działać z wykorzystaniem zarówno protokół UDP, jak + i TCP. Autorzy OpenVPN zalecają używanie protokołu UDP, co może + na pierwszy rzut oka wydawać się dziwne, ponieważ UDP nie zapewnia + mechanizmów kontroli przesyłu ani mechanizmów potwierdzeń. Powodem jest + wydajność transmisji. Chodzi tutaj o znany problem, jak pojawia się w + przypadku przesyłania transmisji TCP zawartej (tunelowanej, + enkapsulowanej) w ramach innej sesji TCP - co miałoby miejsce w przypadku + uruchomienia tunelu po TCP. Mechanizm retransmisji sprawdza się bardzo + dobrze na zawodnych łączach internetowych, natomiast gdy ten sam zgubiony + pakiet próbują retransmitować dwa protokoły TCP, prowadzi to do zapchania + łącza. Wyobraźmy sobie sytuacje, w której pierwsza warstwa transportowa + (ta, po której działa tunel) zaczyna gubić pakiety. W czasie, w którym + warstwa niższa czeka na retransmisje, warstwa wyższa TCP (ta, która + "przenosi" właściwie dane użytkownika wewnątrz tunelu) nie dostaje + potwierdzeń od hosta docelowego i sama zaczyna retransmitować brakujące + segmenty - zatykając tym samym i tak przytkaną już warstwę niższą. To + zjawisko nazywa się efektem meltdown lub TCP meltdown. +

+

+ W praktyce dużo zależy od tego, jakie dane będą przesyłane przez tunel + VPN, oraz od jakości połączenia. W przypadku dobrego łącza i małego + obciążenia różnica może być pomijalna. Jeśli zamierzamy uruchomić bramę + dostępować dla pracowników mobilnych, musimy pod uwagę, że "nietypowe" + porty UDP mogą być blokowane w takich miejscach jak hotel czy publiczny + hotspot itp. Ostatecznie nic nie stoi na przeszkodzie aby uruchomić dwa + osobne tunele, jeden działający na TCP, drugi na UDP. +

+

Praktyczny przykład - zdalny dostęp do zasobów dla pracowników firmy

+

+ Możemy rozważyć następujący przypadek. Dostępu do zasobów sieci LAN, tj. + dysków udostępnionych na serwerze Windows 2003, bazy danych MySQL + oraz aplikacji intranetowej, potrzebuje grupa handlowców. Brama + internetowa w firmie działa na Linuksie, użytkownicy mają na laptopach + system MS Windows XP. Klasa adresowa wewnątrz sieci firmowej to + 192.168.10.0/24. +

+

+ Jako, że mamy tu do czynienia z czynnikiem ludzkim na pewno zastosujemy + uwierzytelnianie użytkowników przez certyfikaty SSL. Zanim jeszcze + przejdziemy do konfiguracji programu OpenVPN, należy przygotować + klucze i certyfikaty SSL dla serwera (bramy) i użytkowników. +

+
Generowanie certyfikatów SSL
+

+ Aby móc skonfigurować niezbędne będzie utworzenie urzędu certyfikacji + oraz certyfikatów zarówno dla serwera jak i dla poszczególnych + użytkowników, zostało zobrazowane w sekcji poświęconej SSL: + Generowanie certyfikatów SSL +

+
Konfiguracja po stronie serwera
+

+ Konfiguracje serwera rozpoczynamy od przegrania na nasz serwer + OpenVPN do katalogu z konfiguracją, certyfikatu; klucza + prywatnego serwera oraz certyfikatu wystawcy CA. Następnie po stronie + serwera musimy wygenerować plik pomocniczy z parametrami algorytmu + kryptograficznego Diffiego-Hellmana. Algorytm ten umożliwia uzgodnienie + stronom wspólnego klucza do szyfrowania symetrycznego, który będzie znany + tylko im. Do tego celu potrzebne są wylosowane dwie liczby pierwsze + zawarte w pliku DH. Obecnie za bezpieczne uznaje się aby klucz użyty w + protokole DH był długości 1024 bitów. Do celu użyjemy biblioteki + OpenSSL. Wpisujemy polecenie podane poniżej, +

+
+openssl dhparam -out dh1024.pem 1024
+
+

+ Operacja może potrwać nawet kilka minut - w zależności o szybkości + procesora. Podczas generowania klucza (1024-bitowej liczby pierwszej) + na ekranie zobaczymy kropki. Przygotowany plik dh1024.pem przegrywamy do + katalogu konfiguracyjnego programu OpenVPN. Teraz możemy przejść + do edycji po stronie serwera. Przykładowy plik został podany poniżej. +

+
+dev tun                        ; rodzaj interfejsu — dla routera zawsze TUN
+local 85.198.209.251           ; adres, na którym będzie działał VPN
+proto udp                      ; tunel będzie działał na porcie UDP
+port 17003                     ; używany port
+user openvpn                   ; zrzuć uprawnienia na wskazanego użytkownika
+group openvpn                  ; jw. dla grupy
+ca cacert.pem                  ; plik certyfikatu CA
+cert servercert.pem            ; certyfikat serwera
+key serverkey.pem_bezhasla     ; plik z kluczem prywatnym serwera
+dh dh1024.pem                  ; plik z parametrami protokołu Diffiego-Hellmana
+server 10.8.0.0 255.255.255.0  ; klasa adresowa, z której przydzielane będą adresy IP klientom
+ifconfig-pool-persist ipp.txt  ; zawiera informacje o przydzielonych adresach IP
+client-config-dir ccd          ; katalog z plikami specyficznych ustawień użytkowników
+keepalive 10 120               ;
+comp-lzo                       ; algorytm kompresji
+
+

+ Spośród tego pliku konfiguracyjnego szerszego omówienia wymagają dwie + opcje. + ifconfig-pool-persist <nazwa pliku> + w pliku wskazanym w tej dyrektywie OpenVPN zapisuje nazwy + użytkowników oraz adresy IP, jakie zostały przydzielone klientom z puli + adresów określonej dyrektywą server. + Nazwa użytkownika to zawartość pola Common Name z certyfikatu klienta. + Adres IP zapisane są w postaci podsieci o masce /30 + (255.255.255.252). Dzięki plikowi + ifconfig-pool-persist klient + może otrzymać to samo IP po ponownym podłączeniu. + Z plikiem ipp.txt związana jest pewna nieścisłość która zostanie + wyjaśniona przy okazji opisu bardziej złożonej konfiguracji. Kolejną + dyrektywą wartą omówienia jest + client-config-dir <nazwa katalogu>, + opcja ta wskazuje katalog, w którym znajdują się konfiguracje + poszczególnych użytkowników. Twórcy OpenVPN przewidzieli + możliwość dostosowywania konfiguracji do konkretnych użytkowników. W + momencie zestawiania połączenia VPN program sprawdza, czy istnieje plik + konfiguracyjny użytkownika w katalogu ccd i jeśli tak, + przetwarza zapisane w nim opcje. Pliki w katalogu ccd muszą mieć + nazwy zgodne z polem Common Name certyfikatu klienta. + Między innymi dlatego pole Common Name certyfikatu SSL jest + dla programu OpenVPN takie ważne. Najczęściej poprzez CCD + przekazujemy użytkownikowi adres IP, adresy serwerów DNS, informacje o + routingu. +

+
Uruchomienie usługi serwera
+

+ Mając przygotowany plik konfiguracyjny, możemy uruchomić proces serwera. + W tym celu wpisujemy polecenie: +

+
+/usr/sbin/openvpn --config /usr/local/etc/openvpn/server.conf
+
+

+ Dostosowując oczywiście ścieżki dostęp do według własnej konfiguracji. + Jeśli mamy skonfigurowaną zaporę sieciową na domyślne blokowanie musimy + odblokować ją na porcie jaki podaliśmy dla usługi OpenVPN. +

+
Konfiguracja klienta
+

+ Aby przetestować nasze pierwsze połączenia VPN, musimy jeszcze + skonfigurować ustawienia po stronie użytkownika. Zakładając, że pliki z + kluczem prywatnym oraz certyfikatem użytkownika mamy już przygotowane. + Należy przegrać je na komputer użytkownika nazywając odpowiednio + user.key i user.crt. Przegrać musimy też certyfikat + urzędu CA - plik cacert.pem, aby było wygodnie pisać plik + konfiguracyjny i darować sobie pisanie ścieżek do certyfikatów umieścimy + je w tym samym katalogu co plik konfiguracyjny. Poniżej znajduje się + przykładowy plik konfiguracyjny dla klienta. +

+
+dev tun                    ; interfejs typu TUN (router)
+client                     ; tryb klienta
+remote 85.198.209.251      ; adres zdalnego serwera
+proto udp                  ; użyty protokół transportowy
+port 17003                 ; port, z którym się połączy
+nobind                     ; nie otwieraj portu po stronie klienta
+ca cacert.pem              ; plik z certyfikatem CA
+cert user.crt              ; plik z certyfikatem użytkownika
+key user.key               ; plik z kluczem prywatnym użytkownika
+comp-lzo                   ; załączona kompresja
+verb 3                     ; poziom komunikatów
+
+

+ Podczas zestawiania połączenia program kliencki czy na Windows czy to na + Linux będzie wyświetlać komunikaty, z nich możemy wywnioskować czy + połączenie zostało zestawione czy też nie. Jeśli wydaje nam się, że tak + to dla pewności możemy spingować adres interfejsu TUN na + serwerze. W razie problemów przydatnym staje się program tcpdump + lub Wireshark. Jednak, że adres przydzielony przez serwer w + sieci VPN nie daje nam jeszcze możliwości komunikacji z hostami w sieci + LAN w siedzibie firmy. Aby móc wykorzystać zasoby z siedziby firmy, + należy ustawić trasę w systemie aby ruch skierowany na adresy w sieci + firmowej przechodził przez interfejs TUN (wirtualny interfejs + sieci VPN). +

+

+ Ustawienia trasy czy też statycznych adresów serwerów DNS, możemy ustawić + tak, aby były one przekazywane przy połączeniu. Polecenie + push może zostać umieszczone w pliku + konfiguracyjnym wtedy mamy do czynienia z konfiguracją globalną, lub w + katalogu ccd w plikach konfiguracyjnych użytkowników. Składnia + polecenia push dla + route: +

+
+push "route 192.168.10.20 255.255.255.255"
+
+

+ Zwróćmy uwagę na to, że nie ma adresu bramy. Otóż OpenVPN sam + dobierze sobie adres bramy odpowiedni dla tunelu klienta. +

+

Bardziej złożona konfiguracja z wieloma użytkownikami

+

+ Załóżmy, że do sieci firmowej zdalny dostęp przez VPN powinna mieć spora + liczba pracowników - np. trzydziestu. Jako że osoby te należą do różnych + działów, uprawnienia do zasobów wewnętrznych muszą różnić się. + Pomijając dalsze uwierzytelnienia w warstwie aplikacji (hasło do bazy + danych itd.), powinniśmy tak skonfigurować zdalny dostęp, aby + pracownik "widział" jedynie to, co powinien, a nie całą sieć wewnętrzną. + Nie wątpliwie najprościej ten cel zrealizować przez blokadę na + firewallu. Tutaj świetnie sprawdzi się iptables. +

+

+ W pierwszej kolejności wygenerujemy klucze wraz certyfikatami dla wszystkich + użytkowników, następnie powinniśmy gdzieś sobie rozpisać kto do czego + powinien mieć dostęp. Należy pamiętać, aby użytkownik zdalny miał dostęp + TYLKO! do niezbędnych zasobów. Jeśli nie ma + konieczności to nie powinien on również mieć dostępu do Internetu przez + sieć VPN. Są w sumie trzy takie zasady, dzięki którym będziemy realizować + naszą konfiguracje. Otóż: +

+
    +
  1. + Każdemu z użytkowników, OpenVPN powinien przydzielać zawsze to + samo IP, na podstawie którego będziemy przyznawać dostęp tylko do + określonych zasobów w sieci LAN (serwerów, usług).
  2. +
  3. + Poprzez mechanizm CCD (client-config dir) będziemy przekazywać + użytkownikom ich konfiguracje (modyfikacja tabeli routingu, zmiana + serwerów DNS itp.).
  4. +
  5. + Informacje o adresach IP oraz dostępnie do serwerów wewnętrznych + będzie zapisywali w plikach konfiguracyjnych OpenVPN oraz w + postaci reguł iptables.
  6. +
+
Przypisywanie stałych adresów IP użytkownikom
+

+ Za przydzielanie użytkownikom stałych adresów IP odpowiada dyrektywa + ifconfig-push, którą umieścimy w plikach + ustawień użytkowników - w katalogu ccd. Składnia instrukcji + ifconfig-push jest następująca: +

+
+ifconfig-push <adres_klienta> <adres_serwera>
+
+

+ Na przykład: +

+
+ifconfig-push 10.8.0.10 10.8.0.9
+
+
Pliki ustawień użytkowników w katalogu ccd
+

+ Poprzez pliki konfiguracyjne w katalogu ccd możemy przekazać + różne parametry, poniżej znajduje się klika przykładów. +

+
    +
  • push "route <adres> <maska>" + - dodaje wpis do tablicy routingu klienta.
  • +
  • + push "dhcp-option DNS <adres_IP_serwera_DNS> + - ustawia nowy DNS w konfiguracji klienta.
  • +
  • + push "dhcp-option DOMAIN <nazwa_domeny> + - ustawia sufiks domeny w konfiguracji DNS klienta.
  • +
  • push "redirect-gateway" - ustawienie + tej opcji spowoduje przekierowanie całego ruchu klienta (domyślna + trasa)
  • +
+

+ Skorzystanie z ostatniej opcji + (redirect-gateway) będzie wymagało + utworzenia regułek NAT-u, aby + użytkownik mógł "wychodzić na świat" z adresu firmowego routera. +

+

+ Korzystając z ww. opcji, utworzymy dla każdego z użytkowników odpowiedni + plik w katalogu ccd. Będziemy przekazywali adres IP oraz wpisy + dodające trasy w tabeli routingu. +

+
Logowanie zdarzeń do pliku
+

+ Jeśli planujemy produkcyjnie wdrożyć program OpenVPN z większą + liczbą użytkowników, warto mieć możliwość szybkiego i łatwego sprawdzenia + informacji takich jak: kto, kiedy i skąd połączył się z VPN. Informacje + tego typu warto archiwizować jako ewentualny "dowód w sprawie". Może też + wrzucić je do bazy SQL dla łatwiejszej obróbki i generowania statystyk. + Do tego celu możemy wykorzystać opcję serwera OpenVPN + learn-address. Opcja ta - jeśli jest + załączona - wywoła skrypt podany jako parametr podczas zdarzeń takich + jak podłączenie się klienta, zmiana adresu IP czy rozłączenie. + Składnia opcji jest następująca: +

+
+learn-address <skrypt>
+
+

+ OpenVPN przekaże do skryptu parametry takie, jak: +

+
    +
  1. parametr: akcja + (add,delete,update) - w zależności + od tego co miało miejsce,
  2. +
  3. parametr: adres IP klienta (przydzielony w ramach tunelu),
  4. +
  5. parametr: nazwa Common Name + użytkownika.
  6. +
+

+ Niestety żaden skrypt nie jest dołączony do OpenVPN. Musimy + napisać go samodzielnie. +

+

Unieważnianie certyfikatów

+

+ Przy większej liczbie użytkowników prędzej czy później zajdzie potrzeba + zablokowania dostępu do VPN któremuś z nich. Powody mogą być różne, + najczęstsze to odjeście z pracy lub kradzież laptopa. +

+

+ Załóżmy, że chcemy unieważnić certyfikat użytkownika jkowalski. + W pierwszej kolejności musimy korzystając z programu OpenSSL, + unieważnić certyfikat. Logujemy się na komputer CA, i przechodzimy do + katalogu /etc/ssl, a następnie wpisujemy polecenie: +

+
+root@ca:/etc/ssl# openssl ca -revoke jkowalskicert.pem
+
+

+ OpenSSL zapyta o hasło klucza CA i po podaniu prawidłowego unieważni + certyfikat. Po unieważnieniu certyfikatu dostaniemy informacje zwrotną, + że baza została zaktualizowana. Możemy teraz podejrzeć zawartość pliku + index.txt - przy użytkowniku jkowalski zobaczymy + znacznik R (ang. revoked). +

+

+ Musimy jeszcze wygenerować listę CRL, w której zapisane są wszystkie + unieważnione certyfikaty. +

+
+root@ca:/etc/ssl# openssl ca -gencrl -out crl.pem
+
+

+ Teraz należy wygenerowany plik crl.pem, przegrać na serwer do + katalogu z konfiguracją OpenVPN. Następnie do pisać do pliku + konfiguracyjnego: +

+
+crl-verify crl.pem
+
+

+ Restartujemy usługę (zatrzymujemy i uruchamiamy ponownie) + OpenVPN. Teraz możemy przetestować czy jkowalski + rzeczywiście nie ma już dostępu do VPN, zestawiając połączenie jako on. + Nie dostaniemy żadnego komunikatu, po stronie klienta. Połączenie po + prostu się nie zestawia. +

+

Łączenie oddziałów firmy

+

+ Rozważmy przypadek, w którym musimy połączyć siedzibę firmy z nowo + powstałym oddziałem w innym mieście. +

+

+ Sposób pierwszy, podobny w działaniu do poprzedniego przypadku, tunel + VPN działający w trybie routera. W tym przypadku komputery w siedzibie A + i siedzibie B będą w innych klasach adresowych i do komunikacji między + sobą będą używały bram. Rozwiązanie dobre bo separuje podsieć + przepuszczając tylko wymagany ruch. Niestety nie zawsze się to sprawdza, + gdyż, jak wiemy routery nie przekazują pakietów wysyłanych na + adres rozgłoszeniowy sieci (ang. broadcast), a niektóre + protokoły używają tego adresu do poprawnego działania. +

+

+ W związku z powyższym omówimy też drugie rozwiązanie - oparte na mostach + sieciowych. W tym przypadku tunel VPN będzie przezroczysty dla warstwy + sieci, dzięki czemu komputery będą się widziały tak, jakby oddziały były + połączone siecią Ethernet. Wówczas komputery w oddziałach A i B będą w + tej samej klasie adresowej i do komunikacji nie będą używały bram. +

+

+ Generalnie zalecam używanie trybu routera wszędzie tam gdzie to tylko + możliwe. Rozwiązanie "mostkowe" przepuszcza przez tunel cały ruch + warstwy sieci, w tym także zapytania ARP, co oczywiście wpływa na + obciążenie łącza VPN. +

+
Przykład rozwiązania z routerem
+

+ Rozważmy przypadek. Siedzibę firmy A musimy połączyć tunelem z oddziałem + B. Klasa używana w sieci wewnętrznej w siedzibie A to + 192.168.20.0/24. Komputery w oddziale B + powinny mieć dostęp do trzech serwerów z sieci w siedzibie A: + 192.168.20.3, 192.168.20.4, 192.168.20.5. + Dodatkowo komputery z oddziału B powinny mieć dostęp do Internetu przez + łącze z siedziby A. Routery po obu stronach działają na Linuksie. +

+

+ Na interfejsach tunelu użyjemy klasy + 10.3.0.0/30. Dla potrzeb + sieci wewnętrznej w oddziale B wykorzystamy klasę + 192.168.30.0/24. +

+
    +
  1. Instalujmy program OpenVPN na obu routerach opisany w + początkowych sekcjach tego artykułu.
  2. +
  3. Generujemy współdzielony klucz na serwerze. W tym celu wpisujemy + polecenie: +
    +openvpn --genkey --secret secret.key
    +
    + W omawianym przypadku jako metodę uwierzytelnienia zastosujemy + współdzielony klucz (ang. pre-shared key - PSK) - ponieważ + jest tylko jeden klient, nie ma potrzeby generowania certyfikatów. +
  4. +
  5. Przegrywamy plik secret.key na drugi router, używając + bezpiecznej transmisji danych - najlepiej połączenia SCP lub SFTP: +
    +scp secret.key root@router.siedzibab.pl:/etc/openvpn
    +
    +
  6. +
  7. Przygotowujemy plik konfiguracyjny dla serwera (brama w siedzibie A) +
    +dev tun                         ; rodzaj interfejsu — dla routera zawsze TUN
    +local 85.98.29.251              ; adres routera, na którym „słucha” OpenVPN
    +proto udp                       ; tunel będzie działał na porcie UDP
    +port 17003                      ; używany port
    +ifconfig 10.3.0.1 10.3.0.2      ; adres serwera, adres klienta
    +secret /etc/openvpn/secret.key  ; ścieżka do współdzielonego klucza (PSK)
    +user openvpn                    ; zrzuć uprawnienia na wskazanego użytkownika
    +group openvpn                   ; jw. dla grupy
    +keepalive 10 120
    +comp-lzo                        ; algorytm kompresji
    +verb 3                          ; poziom szczegółowości logowania
    +
    +
  8. +
  9. Przygotowujemy plik konfiguracyjny dla klienta (brama w siedzibie B) +
    +dev tun                         ; rodzaj interfejsu — dla routera zawsze TUN
    +remote 85.98.29.251             ; adres drugiej strony — routera w siedzibie A
    +proto udp                       ; tunel będzie działał na porcie UDP
    +port 17003                      ; używany port
    +ifconfig 10.3.0.2 10.3.0.1      ; adres klienta, adres serwera
    +secret /etc/openvpn/secret.key  ; ścieżka do współdzielonego klucza (PSK)
    +user openvpn                    ; zrzuć uprawnienia na wskazanego użytkownika
    +group openvpn                   ; jw. dla grupy
    +keepalive 10 120
    +comp-lzo                        ; algorytm kompresji
    +verb 3                          ; poziom szczegółowości logowania
    +
    + Zauważ brak słowa kluczowego client + w pliku konfiguracyjnym klienta. Nie jest to błąd. Opcja + client jest synonimem opcji + tls-client, a w tym przypadku nie + używamy uwierzytelnienia TLS. +
  10. +
  11. Upewniamy się, czy na obu routerach załączone jest przekazywania + pakietów. +
    +cat /proc/sys/net/ipv4/ip_forward
    +
    + Polecenie powinno na obu routerach zwrócić 1, jeśli zwraca 0. To + należy wykonać polecenie: +
    +echo 1 > /proc/sys/net/ipv4/ip_forward
    +
    + oraz dopisać do linijkę skryptów startowych systemu + (sysctl.conf)
  12. +
  13. Jeżeli domyślną polityką bezpieczeństwa na serwerze (bramie w + siedzibie A) jest blokuj, to musimy otworzyć port 17003. W + tym celu wpisujemy polecenie: +
    +iptables -I INPUT -i ethX -p udp -d IP_routera --dport 17003 -j ACCEPT
    +
    + Gdzie ethX jest nazwą interfejsu + łączącego router z Internetem, IP_routera + adres IP, pod którym router jest dostępny w Internecie. Pamiętajmy + aby zapisać nasze reguły firewalla.
  14. +
  15. Jeżeli komputery oddziale B mają mieć dostęp do Internetu przez tunel + VPN, to na routerze w siedzibie B musimy zmienić domyślną bramę. + Powinna wskazywać adres IP tunelu VPN routera w siedzibie A. Obecnej + bramy (przydzielonej przez ISP dla siedziby B użyjemy tylko do + komunikacji z routerem w siedzibie A. Na routerze w siedzibie B + wpisujemy polecenie: + Uwaga!Jeśli pracujemy zdalnie na routerze + ważna jest tutaj kolejność działania. Gdybyśmy zaczęli od usunięcia + domyślnej bramy na routerze w oddziale, skutkowało by to utratą + komunikacji z nim! +
    +rtr-officeB:~# ip route add <IP_rtr_w_office_A>/32 via <Brama_ISP_w_office_B>
    +
    + Jeśli w naszym systemie brakuje polecenia + ip, to należy użyć starszego + polecenia: +
    +rtr-officeB:~# route add -host <IP_rtr_w_office_A> gw <Brama_ISP_w_office_B>
    +
    + Następnie usuwamy istniejącą domyślną trasę: +
    +rtr-officeB:~# ip route delete default
    +lub
    +rtr-officeB:~# route delete default
    +
    +
  16. +
  17. Pora na zestawienie tunelu i sprawdzenie czy strony widzą się na + wzajem po adresach ustawionych w plikach konfiguracyjnych w + dyrektywie ifconfig: +
    +# openvpn --config <ścieżka do pliku konfiguracyjny>
    +
  18. +
  19. Jeśli mamy wzajemną widoczność, musimy ustawić bramę domyślną na + routerze w biurze B: +
    +rtr-officeB:~# ip route add default via <ip_tun_w_office_A>
    +lub
    +rtr-officeB:~# route add default gw <ip_tun_w_office_A>
    +
    + Od tej chwili cały ruch z oddziału B będzie przechodził przez łącze + VPN.
  20. +
  21. Pozostało jeszcze skonfigurować reguły firewalla na routerze w + siedzibie A. Musimy określić na co zezwalamy komputerom z sieci + "oddziałowej" 192.168.30.0/24. Jako, + że domyślną polityką może być blokuj, każdy dostep trzeba + jawnie zadeklarować. Zgodnie z założeniami komputery z siedziby B + powinny mieć dostęp do odpowiednich serwerów. Na routerze w siedzibie + A wpisujemy poniższe polecenia: +
    +iptables -I FORWARD -i tun0 -p ip -s 192.168.30.0/24 -d 192.168.20.3 -j ACCEPT
    +iptables -I FORWARD -i tun0 -p ip -s 192.168.30.0/24 -d 192.168.20.4 -j ACCEPT
    +iptables -I FORWARD -i tun0 -p ip -s 192.168.30.0/24 -d 192.168.20.5 -j ACCEPT
    +
    + Aby zapewnić komputerom z oddziału B połączenie z Internetem, musimy + jeszcze stworzyć jakąś regułę NAT. Przykładowa może wyglądać + następująco: +
    +iptables -t nat -A POSTROUTING -o ethX -s 192.168.30.0/24 -j SNAT --to <ADRES NAT>
    +
    + ethX oznacza interfejs, przez + których łączymy się z Internetem. + ADRES NAT jest to adres na jaki + zachodzić ma translacja adresów, przeważnie adres interfejsu, przez + który łączymy się z Internetem. +
  22. +
+
Tunel VPN z mostkowaniem
+

+ W niniejszym przykładzie rozważymy przypadek połączenia oddziału firmy z + centralą "przezroczystym" tunelem VPN. Założenie jest takie aby przez + tunel przekazywane były pakiety rozgłoszeniowe. Klasa adresowa używana w + obu podsieciach to 192.168.20.0/24. Most zbudujemy z dwóch + interfejsów: karty sieciowej eth1 łączącej router z siecią LAN oraz + wirtualnego interfejsu TAP. Oprócz programu OpenVPN będziemy + potrzebowali wkompilowanego w jądro systemu (bądź w postaci modułu) + sterownika mostów sieciowych oraz programu do administracji mostem. + Do zarządzania mostem służy pakiet bridge-utils, który na ogół + nie wchodzi w skład popularnych dystrybucji i będzie trzeba go + doinstalować. W przypadku dystrybucji opartych o GNU/Linux Debian: +

+
+# apt-get install bridge-utils
+
+
    +
  1. Przygotowanie środowiska +
      +
    1. Instalujemy program OpenVPN na obu routerach opisany + na początku sekcji sposób,
    2. +
    3. Generujemy współdzielony klucz na serwerze. W tym celu + wpisujemy polecenie: +
      +# openvpn --genkey --secret secret.key
      +
      + W omawianym przypadku jako metodę uwierzytelnienia zastosujemy + współdzielony klucz (ang. pre-shared key - PSK) - + ponieważ jest tylko jeden klient, nie ma potrzeby generowania + certyfikatów,
    4. +
    5. Przegrywamy plik secret.key na drugi router, używając + bezpiecznej transmisji danych - najlepiej połączeniem SCP/SFTP: +
      +# scp secret.key root@router.siedzibab.pl:/etc/openvpn
      +
      +
    6. +
    7. Przygotowujemy plik konfiguracyjny dla serwera (brama w + siedzibie A) +
      +dev tap                                 ; rodzaj interfejsu — dla bridge zawsze TAP
      +local 85.98.29.251                      ; adres routera, na którym „słucha” OpenVPN
      +proto udp                               ; tunel będzie działał na porcie UDP
      +port 17003                              ; używany port
      +ifconfig 192,168.20.0 255.255.255.0     ; adres serwera, adres klienta
      +secret /etc/openvpn/secret.key          ; ścieżka do współdzielonego klucza (PSK)
      +user openvpn                            ; zrzuć uprawnienia na wskazanego użytkownika
      +group openvpn                           ; jw. dla grupy
      +keepalive 10 120
      +comp-lzo                                ; algorytm kompresji
      +verb 3                                  ; poziom szczegółowości logowania
      +
      +
    8. +
    9. Przygotowujemy plik konfiguracyjny dla klienta (brama w + siedzibie B) +
      +dev tap                                  ; rodzaj interfejsu — dla bridge zawsze TAP
      +remote 85.98.29.251                      ; adres drugiej strony — routera w siedzibie A
      +proto udp                                ; tunel będzie działał na porcie UDP
      +port 17003                               ; używany port
      +ifconfig 192,168.20.0 255.255.255.0      ; adres klienta, adres serwera
      +secret /etc/openvpn/secret.key           ; ścieżka do współdzielonego klucza (PSK)
      +user openvpn                             ; zrzuć uprawnienia na wskazanego użytkownika
      +group openvpn                            ; jw. dla grupy
      +keepalive 10 120
      +comp-lzo                                 ; algorytm kompresji
      +verb 3                                   ; poziom szczegółowości logowania
      +
      + Zwróćmy uwagę na brak słowa kluczowego + client w pliku konfiguracyjnym + klienta. Nie jest to błąd. Opcja + client jest synonimem opcji + tls-client, a w tym przypadku + nie używamy uwierzytelnienia TLS.
    10. +
    11. Jeżeli domyślną polityką bezpieczeństwa na serwerze (bramie w + siedzibie A) jest blokuj, to musimy otworzyć port + UDP/17003. W tym celu wpisujemy polecenie: +
      +# iptables -I INPUT -i ethX -p udp -d IP_routera --dport 17003 -j ACCEPT
      +
      + Gdzie ethX jest nazwą + interfejsu łączącego router z Internetem, + IP_routera adres IP, pod + którym router jest dostępny w Internecie. Pamiętajmy aby + zapisać nasze reguły firewala.
    12. +
    13. Uruchamiamy program OpenVPN i sprawdzamy czy istnieje + on liście procesów (w obu sidzibach). +
      +# openvpn --config <plik konfiguracyjny>
      +
      +
    14. +
    15. Tworzymy na obu routerach most używając programu + brctl. W tym celu wpisujemy + podane poniżej polecenia zachowując kolejność na obu + komputerach. +
      +# brctl addbr br0                         # tworzy interfejs dla bridge'a
      +# brctl addif br0 eth1                    # dodaje do bridge'a interfejs eth1
      +# brctl addif br0 tap0                    # dodaje do bridge'a interfejs tap0
      +# ifconfig eth1 0.0.0.0 promisc up        # przestawia karty eth1 i tap0
      +# ifconfig tap0 0.0.0.0 promisc up        # w tryb nasłuchiwania (promiscuous mode)
      +
      + Szczególną uwagę warto zwrócić na komendę + brcrl addif br0 eth1, a + konkretnie na interfejs eth1 podany jako parametr. Powinien to + być interfejs łączący router z siecią lokalną, a nie Internetem. + Pomyłka w tym miejscu będzie skutkować utratą komunikacji z + serwerem (jeśli pracujemy zdalnie). Następną rzeczą, na którą + warto zwrócić uwagę jest to, że na interfejsie + eth1 nie przydzielamy adresu + IP! Interfejsy mostu są przezroczyste dla warstwy sieciowej i + nie posiadają adresów IP. Aby nasz router miał przydzielony + adres z klasy lokalnej, musimy skonfigurować go na interfejsie + br0. Nadajmy więc routerom + adresy z puli lokalnej. Przypisujemy IP + 192.168.20.1 routerowi po + stronie siedziby A. +
      +# ifconfig br0 192.168.20.1 up
      +
      + Routerowi w oddziale B przypiszemy adres IP 192.168.20.200. +
      +# ifconfig br0 192.168.20.200 up
      +
      + Jeśli wszystko poszło pomyślnie to strony powinny się + "pingować". +
    16. +
    + Zauważmy że adres 192.168.20.1 przydzielony na interfejsie + br0 routera w siedzibie A pełni też + funkcje bramy domyślnej dla komputerów w swoim LAN-ie (komputerów w + siedzibie A)! W związku z powyższym wszystkie reguły firewalla, które + dotyczyłyby interfejsu eth1, teraz + dotyczą interfejsu br0. Most nie + potrzebuje załączonego przekazywania pakietów, natomiast + w związku z faktem że serwer w siedzibie A, pełni funkcje mostu i + routera, przekazywanie musi być załączone. Upewnijmy się, czy plik + /proc/sys/net/ipv4/ip_forward ma zawartość 1. +
    +# cat /proc/sys/net/ipv4/ip_forward
    +
    + Jeśli nie to mu ją wpisujemy: +
    +# echo 1 > /proc/sys/net/ipv4/ip_forward
    +
    +
  2. +
  3. Debugowanie +

    + Nie wykluczone, że za pierwszym razem wszystko nie zadziała od razu. + Zostanie tutaj przedstawione kilka kroków, które przydają się + podczas debugowania. +

    +
      +
    1. Sprawdzamy czy tunel w ogóle się zestawił - przeglądamy logi + programu OpenVPN. Sprawdzamy, czy program widnieje na + liście procesów - za pomocą polecenia +
      +# ps aux | grep vpn
      +
      +
    2. +
    3. Sprawdzamy, czy interfejs br0 powstał po obu stronach tunelu. + Wpisujemy polecenie: +
      +# ifconfig | grep br0
      +
      +
    4. +
    5. Używając polecenia + brctl show br0, + sprawdzamy, czy oba interfejsy + (tap0 + i eth1) widnieją na liście + interfejsów członkowskich na moście br0. Jeśli któregoś z nich + brakuje - dodajemy go, za pomocą polecenia: +
      +# brctl addif <interfejs>
      +
      +
    6. +
    7. Upewniamy się czy wszystkie interfejsy tworzące most działają w + trybie promiscuos (nasłuchiwania). Wpisujemy polecenia: +
      +# ifconfig eth1 promisc
      +# ifconfig tap0 promisc
      +
      +
    8. +
    9. Możemy użyć programu tcpdump, do przeglądania + pakietów pojawiających się na obu stronach mostu.
    10. +
    11. Możemy podglądać na bierząco jak most uczy się adresów MAC. + Listę adresów sprawdzamy poleceniem: +
      +brctl showmacs br0
      +
      +
    12. +
    13. Jeśli w dalszym ciągu nic nie działa, czasem dobrym + rozwiązaniem jest zresetowanie komputerów i rozpoczęcie + wszystkiego od nowa
    14. +
    15. Jeśli pracujemy zdalnie na odległym serwerze, dobrym + rozwiązaniem będzie napisanie skryptu, który będzie pingował + wybrany serwer co 20 min. W przypadku braku odpowiedzi, skrypt + powinien zresetować serwer.
    16. +
    +
  4. +
+

IPSec

+

+ IPSec (ang. IP Security - bezpieczeństwo w IP) - + to zestaw protokołów kryptograficznych opracowanych przez grupę IETF w + odpowiedzi na zapotrzebowanie rynku IT na bezpieczną komunikację sieciową + przez Internet. +

+

+ Podstawowym założeniem przy projektowaniu IPSec było zapewnienie + integralności i poufności przesyłanych danych niezależnie od używanych + protokołów warstw wyższy modelu OSI (TCP/UDP itd.). Zapewnienie + integralności przesyłanych danych, czyli możliwości wykrycia tego, czy + pakiet nie został zmodyfikowany, osiągnięto poprzez stosowanie skrótów + kryptograficznych zamiast zwykłych sum kontrolnych w protokole IP, (które + można przeliczyć po modyfikacji pakietu). Poufność z kolei, zapewnia + szyfrowanie danych kluczem symetrycznym (np. DES, 3DES, AES). Przy czym + IPSec nie narzuca wyboru algorytmu szyfrowania, dzięki czemu protokół + jest bardzo uniwersalny. W razie złamania w przyszłości, któregoś z + obecnie używanych algorytmów wystarczy jego zamiana bez potrzeby + przebudowy całego protokołu. +

+

+ IPSec może być wykorzystywany w jednym z dwóch trybów. Pierwszy to tryb + transportowy, w którym nagłówek IPSec wstawiany jest pomiędzy oryginalny + nagłówek IP a nagłówek warstwy transportowej. Tryb transportowy używany + jest pomiędzy dwoma hostami komunikującymi się przez IPSec. Drugim + rodzajem połączeń IPSec jest tryb tunelowy, w którym cały pierwotny + pakiet IP enkapsulowany jest wewnątrz nagłówka IPSec. Tryb tunelowy na + ogół wykorzystywany jest do łączenia całych sieci korporacyjnych z + wykorzystaniem bram VPN. W tym przypadku komputery w sieciach + wewnętrznych "nie wiedzą" w ogóle o fakcie, że pakiety po opuszczeniu + routera opakowane są w nagłówki IPSec i w zaszyfrowanej formie wędrują + przez Internet. Brama VPN po drugiej stronie wyodrębnia pierwotne pakiety + IP i przesyła do właściwego hosta wewnątrz sieci lokalnej. Warto zauważyć, + że w trybie tunelowania w razie ewentualnego podsłuchu transmisji osoba + podsłuchująca nie jest wstanie dowiedzieć się nawet, pomiędzy jakimi + hostami wymieniane są dane. Adresy źródłowy i docelowy nagłówka IPSec + zawierają adresy bram VPN, a nie rzeczywistych hostów. +

+

+ Dwa podstawowe protokoły wchodzące w skład IPSec to AH i ESP. Protokół + AH (ang. Authentication Header) zapewnia integralność danych, + ale nie zapewnia poufności. Nie jest możliwy spoofing czy inna + modyfikacja pakietu ponieważ suma kontrolna została zabezpieczona + kryptograficznie (funkcją skrótu - metoda HMAC) przy użyciu tajnego + klucza znanego tylko nadawcy i odbiorcy. +

+

+ Przed właściwą komunikacją zabezpieczoną protokołem AH (lub ESP) strony + nawiązują logiczne połączenie w warstwie sieci, tworząc tzw. skojarzenie + bezpieczeństwa SA (ang. Security Association). SA charakteryzują + następujące elementy: +

+
    +
  • idetyfikator używanego protokołu bezpieczeństwa (AH lub ESP),
  • +
  • źródłowy i docelowy adres IP połączenia,
  • +
  • 32-bitowa liczba będąca identyfikacją połączenia, określana mianem + SPI (ang. Security Parameter Index).
  • +
+

+ Skojarzenie bezpieczeństwa SA jest jednokierunkowe, dlatego do + bezpiecznej komunikacji dwustronnej potrzebne są dwa niezależne kanały + SA, po jednym w każdnym kierunku. Zauważmy jednak, że w pewnych + okolicznościach wystarczy zabezpieczenie tylko jednej strony (np. + odpowiedzi serwera DNS), stąd koncepcja "jednokierunkowości" połączeń + jest uzasadniona. +

+

+ Z protokołem AH związane jest także pojęcie SN - serial number, + którego celem jest zabezpieczenie transmisji przez atakiem polegającym + na wielokrotnym przesyłaniu tego samego pakietu do odbiorcy przez hosta, + który podsłuchał pakiet (ang. reply attack). Na początku + komunikacji strony ustawiają wartość SN na 0, a następnie + inkrementują ją wraz z każdym wysłanym pakietem. Dzięki temu odbiorca + może wykryć, że odebrany właśnie pakiet to kopia już wcześniej + otrzymanego. +

+

+ Protokół ESP (ang. Encapsulated Security Payload) pierwotnie + zapewniał wyłącznie szyfrowanie transmisji przy użyciu któregoś z + szyfrów blokowych (DES, 3DES, AES). Dlatego dla zapewnienia integralności + i poufności danych wykorzystywano oba protokoły - AH i ESP - jednocześnie. +

+

+ Obecnie jednak ESP zapewnia także sprawdzenia integralności danych + (zasada działania bardzo podobna do AH - suma kontrolna zabezpieczona + kryptograficznie), dlatego protokół AH wychodzi z użycia. W przypadku + gdy szyfrowanie transmisji nie jest konieczne, w ESP istnieje możliwość + zastosowania algorytmu NULL zamiast któregoś z algorytmów + kryptograficznych. Istotną różnicą między protokołami ESP i AH jest fakt, + że w przypadku ESP ochrona integralności nie obejmuje nagłówka IP (tego + widzianego przez pośredniczące routery), dzięki czemu protokół IPSec/ESP + może przechodzić przez połączenia za NAT-em. +

+

+ Za automatyczną negocjację parametrów połączenia tj. uwierzytelnianie, + ustalenie relacji SA oraz późniejsze uzgadniania kluczy kryptograficznych + odpowiada osobny protokół wymiany kluczy - IKE + (ang. Internet Key Exchange), także wchodzący w skład IPSec . + Przy czym samo uwierzytelnienie może być przeprowadzone różnymi metodami + - współdzielony klucz, podpisy RSA, certyfikaty X.509 lub Kerberos. +

+

+ Protokół IKE działa w dwóch fazach. Pierwsza faza - ISAKMP (ang. + Internet Security Association and Key Management Protocol), + odpowiada za przeprowadzenie uwierzytelnienia, utworzenie kanału ISAKMP + SA i zarządzanie nim. Druga faza - Oakley, odpowiada za uzgadnianie klucz + (wg. algorytmu DH) i związków SA w trakcie połączenia. +

+

+ ISAKMP może zostać przeprowadzona w trybie głównym (ang. + main mode) + lub w tzw. trybie agresywnym (ang. aggresive mode). W trybie + głównym wymieniane są 3 dwukierunkowe komunikaty (komunikat-odpowiedź - + razem 6). W trybie agresywnym natomiast przesyłane są jedynie 3 + komunikaty. + Tryb agresywny jest szybszy, natomiast ma pewną słabość, którą w pewnych + okolicznościach można wykorzystać do odgadnięcia klucz PSK. Otóż w trybie + agresywnym cześć informacji przesyłana jest przez ustanowieniem + bezpiecznego kanału. W przypadku uwierzytelnienia przez PSK i użycia + trybu + agresywnego osoba podsłuchująca transmisję jest w stanie podejrzeć hash + współdzielonego klucza, a następnie próbować odnaleźć klucz metodą + słownikową/siłową. Znając PSK, atakujący może zestawić tunel VPN, + podszywając się pod pracownika firmy, którego połączenie wcześniej + podsłuchał. Oprócz rozkodowania PSK możliwy jest w tym przypadku atak + typu man-in-the-middle. +

+

+ Z powyższego wynika, że powinniśmy unikać trybu agresywnego w połączeniu + z uwierzytelnianiem PSK. Ogólnie nie powinniśmy używać uwierzytelnienia + przez PSK dla tuneli zdalnych pracowników, gdzie IP drugiej strony tunelu + nie jest znane (możliwość siłowego odgadnięcia hasła). +

+

+ Faza druga (Oakley) przebiega zawsze w trybie quick mode. Jako + że jest to faza druga, nie przeprowadza ona własnych metod + uwierzytelnienia i umożliwia szybkie (stąd nazwa) zestawienie relacji + IPSec SA. +

+

+ Z drugą fazą związane jest także opcjonalne pojęcie PFS (ang. Perfect + Forward Secrecy) - poufność doskonała. Przez pojęcie to rozumie się + sposób wymiany kluczy sesyjnych w trakcie połączenia IPSec. Załączenie + PFS, zapewnia że materiał klucza głównego może być używany do + wygenerowania tylko jednego klucza sesji. Przed utworzeniem nowego klucza + sesji jest przeprowadzana wymiana kluczy (algorytm Diffiego-Hellmana) w + celu wygenerowania nowego materiału klucza głównego. Dzięki zastosowaniu + PFS uzyskanie przez atakującego pojedynczego klucza pozwala mu na + odczytanie tylko wiadomości zaszyfrowanych tym kluczem. Niestety, + załączenie PFS wiąże się ze spadkiem wydajności (i wzrostem obciążenia + procesora). Dodatkowo nie wszystkie implementacje obsługują tę właściwość. +

+

+ Każda ze stron przechowuje informacje o nawiązanych skojarzeniach SA w + tzw. bazie SAD (ang. Security Association Database). +

+

+ Do terminologi związanej z IPSec musimy jeszcze dołożyć pojęcia SPD - + Security Policy Database. SPD to baza odpowiadająca przyjętej + polityce bezpieczeństwa. Baza SPD jest używana dla pakietów wychodzących. + System sprawdza przed wysłaniem, czy dla określonego hosta docelowego + (sieci docelowej) istnieje jakiś wpis określający, czy protokół IPSec ma + zostać użyty. Jeżeli tak, przeglądana jest baza SAD w poszukiwaniu + skojarzenia SA odpowiedzialnego za komunikacje w określonym hostem + docelowym. +

+

IPSec a translacja adresów (maskarada)

+

+ NAT (ang. Network Address Transtalation) to + translacja adresów popularnie zwana maskaradą. Najkrócej mówiąc polega + ona ukrywaniu hosta wewnętrznego poprzez zamianę adresu źródłowego w + nagłówku pakietu IP - na adres routera. W tym przypadku NAT (a w zasadzie + PAT - Port Address Translation) stara się zachować port + źródłowy, który został wybrany przez hosta źródłowego; dopiero gdy ten + port jest zajęty przez inne połączenie NAT, zostanie zamieniony na inny. + Router pełniący rolę NAT-u przechowuje wszystkie bieżące połączenia w + specjalnej tabeli NAT, dzięki czemu wie, do którego hosta przekierować + ma odpowiedzi przychodzące na dany port. Mechanizm ten doskonale sprawdza + się w przypadku połączeń TCP/UDP, gdzie bezproblemowo możemy przekierować + połączenie przychodzące na port 1234 do portu 5673 komputera wewnątrz + sieci (za maskaradą). +

+

+ W przypadku połączeń IPSec sprawa nie wygląda tak prosto z dwóch powodów. + Po pierwsze w przypadku protokołu AH nie jest możliwa zmiana adresu + źródłowego w nagłówku pakietu IP, gdyż cały nagłówek zabezpieczony jest + przed zmianą - do nagłówka dodawany jest skrót kryptograficzny utworzony + z sumy kontrolnej pakietu oraz tajnego hasła. Jakakolwiek modyfikacja + nagłówka pakietu uznana będzie za naruszenie integralności danych (router, + nie znając hasła nie będzie w stanie wygenerować odpowiedniego skrótu). + Na to nic nie poradzimy. Dla protokołu AH nie jest możliwa translacja + adresów. +

+

+ W przypadku protokołu ESP sprawa wygląda lepiej, gdyż, ochronie + integralności nie podlega "zewnętrzny" nagłówek IP, tak więc możliwa jest + zamiana źródłowego adresu IP. Pojawia się jednak niestety problem z + wieloma klientami znajdującymi się za tym samym routerem (maskaradą). + Protokół ESP nie wykorzystuje portów, jak ma to miejsce w protokołach TCP + i UDP, dlatego nie można w prosty sposób odróżnić połączeń IPSec + inicjowanych z różnych hostów wewnątrz sieci. +

+

+ Rozwiązanie powyższego problemu jest tzw. NAT-Traversal. + Mechanizm ten polega na enkapsulacji protokołu ESP wewnątrz połączenia + UDP (najczęściej port 4500) +

+

+ Jak widać działanie protokołu IPSec (zespołu protokołów) jest dość + złożone. Przedstawiono tutaj najistotniejsze elementy, tak aby poza + posiadaniem wiedzy praktycznej, warto posiadać wiedzę teoretyczną, która + to pomoże zrozumieć nam gdzie zrobiliśmy błąd, jeśli coś nie zadziała lub + nagle przestanie. Na szczęście konfiguracja połączenia IPSec z + automatyczną wymianą kluczy (IKE) nie jest wcale taka trudna, co zostanie + zobrazowane. +

+

Najważniejsze pojęcia związane z IPSec

+
    +
  • Protokół ESP (ang. Encapsulated Security Payload) + - podstawowy składnik IPSec. Pierwotnie zapewniał wyłączenie poufność, + tj. szyfrowanie transmisji przy użyciu któregoś z szyfrów blokowych + (DES, 3DES, AES). Obecnie jednak ESP zapewnia także sprawdzenie + integralności danych. ESP w przeciwieństwie do AH nie zabezpiecza + nagłówka IP pierwotnego pakietu,
  • +
  • Protokół AH (ang. Authentication Header) - jeden z + protokołów wchodzących w skład IPSec. Jego zadaniem jest zapewnienie + integralności przesyłanych danych (funkcja skrótu HMAC). Protokół AH + nie zapewnia poufności. Wychodzi on obecnie z użycia, ponieważ ESP + zapewnia tę samą funkcjonalność oraz szyfrowanie,
  • +
  • Protokół ISAKMP (ang. Internet Security Association and + Key Management Protocol) - odpowiada za negocjacje + parametrów IPSec, przeprowadzenie uwierzytelnienia, tworzenia kanału + SA i zarządzanie nim. Do działania wykorzystuje port 500 UDP,
  • +
  • Związek SA (ang. Security Association) - + inaczej relacja SA, jednokierunkowy, logiczny kanał komunikacyjny + zestawiany w komunikacji IPSec. Do dwustronnej komunikacji IPSec + potrzebne są dwa kanały SA. Skojarzenie SA identyfikowane jest przez + 32-bitową liczbę zwaną SPI (ang. Security Parametr Index),
  • +
  • SPI (ang. Security Parametr Index) - + 32-bitowa liczba, będąca identyfikatorem skojarzenia SA w komunikacji + IPSec,
  • +
  • Baza SAD - każda ze stron tunelu IPSec przechowuje + informacje o nawiązanych relacjach SA w tzw. bazie SAD,
  • +
  • DH (Diffie-Hellman) - algorytm uzgadniania + klucza, w którym dwie strony na podstawie wymienionych liczb + uzgadniają liczbę wynikową - klucz. Osoba podsłuchująca transmisje + nie jest w stanie na podstawie tego co usłyszała, wyliczyć klucza,
  • +
  • Grupa DH - informacja mówiąca o wielkości liczb + używanych w obliczeniach w algorytmie Diffiego-Hellmana. DH1:768bitów, + DH2:1024bity, DH5:1536 bitów. Grupa pierwsza obecnie uważna jest za + słabą,
  • +
  • Hash - inaczej funkcja skrótu. Dla dowolnie długiego + ciągu wejściowego wyliczany jest skrót o stałej długości. Do + najczęściej używanych funkcji należą MD5 i SHA-1, SHA-2. Funkcje + skrótu wykorzystywane są do tworzenia sygnatur (np. cyfrowe + zabezpieczenie sumy kontrolnej pakietu lub pliku),
  • +
  • HMAC (ang. keyed-Hash Message Authentication Code) + - zabezpieczona hasłem funkcja skrótu. Dzięki temu oprócz + ochrony integralności zapewniona jest też autentyczność pochodzenia. + Osoba zabezpieczająca dokument podaje hasło i na podstawie hasła oraz + dokumentu tworzony jest skrót. Osoba sprawdzająca znając hasło, jest + w stanie potwierdzić autentyczność,
  • +
  • SHA (SHA-1, SHA-2) - funkcje skrótu służące to + tworzenia sygnatur,
  • +
  • MD5 - funkcja skrótu, w wyniku której powstaje + 128-bitowy hash,
  • +
  • DES (ang. Data Encryption Standard) - + algorytm szyfrowania symetrycznego. Ze względu na słabość klucza - + 56 bitów - obecnie wyszedł z użycia. Jego następcy to 3DES oraz AES,
  • +
  • AES (ang. Adavanced Encryption Standard) + - silny szyfr blokowy, możliwe długości klucza to 128, 192, 256 bitów. + Powstał w wyniku konkursu na następcę DES. Obecnie często + wykorzystywany w kryptografii. m.in w IPSec,
  • +
  • RSA - jeden z algorytmów kryptografii asymetrycznej, + stosowany m.in. w podpisach cyfrowych,
  • +
  • Transform-set - w terminologii Cisco zbiór + parametrów związanych z połączeniem IPSec. Do parametrów metrów tych + należą m.in.: rozdzaj protokołu IPSec (ESP, AH) używany protokół + szyfrowania (3DES, AES), używana funkcja skrótu (SHA, MD5) itp,
  • +
  • Crypto-map - w terminologii Cisco to ustawienie, + które wiąże niejako wszystkie parametry tunelu w całość. Zawiera + nazwę transform-seta (parametry IPSec), adres IP zdalnego + routera oraz numer listy dostępu, kontrolującej jaki ruch zostanie + przesłany tunelem VPN.
  • +
+

+ W niniejszym artykule zostanie omówione przygotowanie systemu do + działania z protokołem IPSec. +

+

IPSec - przygotowanie środowiska w systemie Linux

+

+ Z punktu wiedzenia systemu operacyjnego połączenia IPSec można podzielić + na dwie części: +

+
    +
  1. Część odpowiedzialną za zarządzanie pakietami (protokół AH/ESP) - tj. + enkapsulację pakietów IP w pakiety IPSec, zabezpieczenie sum + kontrolnych itd. Z racji tego, że operacje te muszą być wydajne, ich + obsługą zajmują się moduły jądra systemu.
  2. +
  3. Część odpowiedzialną za zestawienie połączenia i późniejszą wymianę + kluczy (protokół IKE). Obsługę tych funkcji zajmuje się program + (daemon) działający w warstwie użytkownika - w systemie Linux to + demon Pluto (wchodzący w skład OpenSWAN).
  4. +
+

+ Obecnie każde współczesne jądro Linuxa ma już wbudowane moduły dla + protokołu IPSec. Nie potrzeby przeprowadzania żadnych modyfikacji. +

+

Instalacja programu OpenSWAN

+

+ OpenSWAN to implementacja protokołu IPSec w systemie + Linux rozwijana + przez grupę developerów, którzy wcześniej pracowali nad projektem + FreeSWAN. W trakcie prac doszło do konfliktu i część deweloperów + rozpoczęła pracę nad OpenSWAN. +

+

+ Jeżeli używana przez nas dystrybucja wspiera automatyczną instalację + pakietów, możesz zainstalować program OpenSWAN z gotowych paczek. + W przypadku Debian możesz zastosować pakiet używając programu + apt. +

+

+ Opcjonalnym składnikiem, który należałoby zainstalować jest serwer L2TP - + najlepiej xl2tpd. Dlaczego opcjonalnym? Gdyż nie wszystkie + rozwiązania IPSec używają tunelowania L2TP. Niemniej implementacja IPSec + firmy Microsoft wbudowana w każdy z systemów Windows wymaga do działania + właśnie protokołu L2TP. Jeśli zamierzamy łączyć z bramą VPN, używając + wbudowanych w Windows mechanizmów IPSec, musimy zainstalować demon L2TP. +

+

+ Protokół L2TP umożliwia przesłanie ramek połączenia PPP przez przez + protokół IP (Internet), które to połączenie normalnie realizowane jest + tylko w bezpośrednim połączeniu punkt-punkt (modemy, linie szeregowe + itd.). Samo połączenie PPP operuje w warstwie drugiej modelu OSI i służy + do enkapsulacji protokołów warstwy wyższej (IP, IPX itd.), zapewniając + jednocześnie uwierzytelnienie oraz kompresję. Połączenie protokołu L2TP + z PPP umożliwia tunelowanie protokołu IP w ramach innego połączenia IP, + dlatego często wykorzystywane jest w sieciach VPN. Wykorzystanie protokołu + PPP daje także dodatkowe możliwości, jak np. przydzielanie adresów IP + tunelowi, przekazywanie parametrów sieciowych, takich jak DNS, WINS itp. +

+

+ Naturalnie aby tunelowanie połączenia PPP przez protokół L2TP mogło + działać, potrzebny jest także demon PPP. Jako że nie jest już instalowany + domyślnie w popularnych dystrybucjach możemy go zainstalować z + repozytorium dystrybucji, dla Debiana możemy skorzystać z polecenia + apt +

+

Praktyczny przykład - brama IPSec/VPN dla użytkowników mobilnych

+

+ W tej sekcji stworzymy bramę VPN dla użytkowników mobilnych łączących + się zdalnie z siedzibą firmy. Użytkownicy używają na laptopach systemu + Microsoft Windows i wbudowanego weń "klienta" IPSec. Analogicznie jak dla + przykładu z bramą OpenVPN, użytkownicy powinni mieć dostęp do kilku + serwerów w sieci LAN. Adresy IP użytkowników mobilnych nie są znane i + mogą oni się łączyć z różnych miejsc, także zza maskarady (połączenia + GPRS, hotspot itd.). Po stronie bramy VPN wykorzystamy system Linux oraz + oprogramowanie OpenSWAN. +

+
Konfiguracja bramy IPSec (Linux)
+

+ Konfigurację zaczniemy od przygotowania demona L2TP. Tworzymy plik + konfiguracyjny /etc/l2tp/l2tpd.conf. Zawartość pliku + l2tpd.conf powinna wyglądać następująco: +

+
+[global]
+ listen-addr = 85.98.29.251                   ;adres internetowy bramy
+ port = 1701                                  ;port — zostawiamy domyślny
+[lns default]
+ip range = 192.168.10.198-192.168.10.250      ;pula IP dla klientów
+local ip = 85.98.29.251                       ;IP lokalny połączenia PPP
+require chap = yes                            ;wymagamy uwierzytelniania CHAP
+;refuse pap = yes
+require authentication = yes
+name = ipsec
+ppp debug = yes
+pppoptfile = /etc/ppp/options.l2tpd           ;pozostały
+length bit = yes
+
+

+ Zwrócić należy uwagę na wymóg uwierzytelniania dotyczy tutaj połączenia + PPP a nie L2TP. Demon L2TP nie możliwości przeprowadzenia swojego + uwierzytelniania, ale nie jest to w tym przypadku potrzebne. +

+

+ Teraz tworzymy plik z opcjami programu pppd - + /etc/ppp/options.l2tpd. Przykładową konfigurację + przedstawiono poniżej. +

+
+ipcp-accept-local             ; pppd zaakceptuje lokalny adres połączenia
+ipcp-accept-remote            ; jw. dla adresu drugiej strony
+require-mschap-v2             ; wymagamy uwierzytelniania MSCHAP wersji drugiej
+auth
+proxyarp
+idle 1800
+mtu 500
+mru 500
+# eof
+
+

+ Następnie konfigurujemy plik z danymi uwierzytelniającymi dla PPP - + /etc/ppp/chap-secrets +

+
+# Secrets for authentication using CHAP
+# client        server  secret                  IP addresses
+user      *    "test"
+
+

+ gdzie user to nazwa użytkownika a + "test" - hasło. +

+

+ W sytuacji gdyby PPP było jedynym uwierzytelnieniem, moglibyśmy wpisać do + pliku chap-secrets wszystkich użytkowników. Nie ma to jednak + sensu, gdyż podstawowym uwierzytelnieniem będą certyfikaty X.509. Niemniej + konfiguracje PPP można wykorzystać do przypisywania stałych adresów IP + dla poszczególnych klientów, np.: +

+
+jacek * "test12" 192.168.10.220
+michal * "test13" 192.168.10.221
+
+

+ Ostatni element przygotowania bramy IPSec to właściwa konfiguracja + programu OpenSWAN, która sprowadza się w najprostszym przypadku + do edycji dwóch plików - ipsec.conf oraz ipsec.secrets. + Poniżej został przedstawiony plik ipsec.conf W tym przypadku + metodą uwierzytelnienia jest klucz współdzielony a klientami mogą być + użytkownicy Windowsa znajdujący się za NAT-em. +

+ +
+version 2.0
+config setup
+        interfaces=%defaultroute
+        plutodebug=none
+        forwardcontrol=yes
+        nat_traversal=yes
+virtual_private=%v4:10.0.0.0/8,%v4:172.16.0.0/12,%v4:192.168.0.0/16,%v4:!192.168.10.0/24
+conn roadwarrior-l2tp
+        leftprotoport=17/1701
+        rightprotoport=17/1701
+        also=roadwarrior
+conn roadwarrior
+        auth=esp
+        authby=secret
+        compress=yes
+        keyexchange=ike
+        keyingtries=3
+        pfs=no
+        rekey=yes
+        left=%defaultroute
+        right=%any
+        rightsubnet=vhost:%no,%priv
+        auto=add
+#Disable Opportunistic Encryption
+include /etc/ipsec.d/examples/no_oe.conf
+
+

+ Twórcy programu OpenSWAN przyjęli konwencję, aby stron + połączenia nie nazywać w klasyczny sposób: "serwer" i "klient" (lub też + "źródło" i "cel"), tylko "strona lewa" (ang. left) i + "strona prawa" (ang. right). Ma to swoje uzasadnieniem, ponieważ + tak naprawdę i tak zestawiane są dwa nie zależne skojarzenia SA - dla + każdego z kierunków transmisji. Poza tym nie zawsze jest jasne, która + strona jest bardziej serwerem, a która bardziej klientem (przykład + łączenia oddziałów firm). Przez "left" rozumie się lokalną konfigurację, + a przez "right" odległą stronę. Zauważyć warto, że w przypadku połączenia + typu użytkownik mobilny-brama IPSec, patrząc od strony bramy IPSec, + strona "right" najczęściej nie jest znana (nie znamy adresu IP, z którego + będzie łączyć się użytkownik). W przypadku łączenia dwóch bram IPSec + (łączenie oddziałów firmy) strony "left" i "right" są na ogół ściśle + określone. W anglojęzycznej terminologii pracowników mobilnych, który + łączą się z rożnych miejsc kraju i świata, przyjęło nazwywać się + roadwarrior. +

+

+ Poniżej znajduje się analiza najważniejszych wpisów z pliku + konfiguracyjnego. Plik jest podzielony na kilka sekcji. Podstawowe opcje + - tzw. globalne - są zwarte w sekcji + config setup. +

+
    +
  • version 2.0 - informuje program + OpenSWAN, że + składnia pliku będzie zgodna z OpenSWAN, a nie z + przestarzałym FreeSWAN.
  • +
  • interfaces=%defaultroute - oznacza + interfejs, na którym ma działać IPSec. Wartość domyślna to + %defaultroute, co oznacza, że + zostanie użyty adres IP bramy domyślnej komputera. Na ogół + %defaultroute jest poprawną + wartością.
  • +
  • plutodebug=none - definiuje poziom + szczegółowości logów demona pluto. Inne możliwe wartości to: + all, raw, krypt, parsing, emitting, control. Najbardziej + optymalną jest opcja control, gdy logi nie będą nam już + potrzebne, to przełączamy na none.
  • +
  • forwardcontrol=yes|no - sprawdza, + czy załączone jest przekazywanie pakietów IP (ang. IP + forwarding). Jeżeli nie, to je załącza. Po zakończeniu działania + tunelu przywraca poprzednią wartość.
  • +
  • nat_traversal=yes|no - domyślnie: + no. Ważna opcja, jeżeli spodziewasz + się połączeń zza NAT-a (maskarady). Złączenie jej sprawi, że + OpenSWAN będzie oczekiwał także połączeń na porcie UDP 4500, + po którym przenoszone są pakiety IPSec.
  • +
  • virtual_private - określa podsieci + (z zakresu "prywatnych" klas IP), z których mogą łączyć się klienci. + Na ogół podaje się tutaj wszystkie pule IP zdefiniowane do użytku + prywatnego, z wyjątkiem puli używanej w sieci firmowej, do której + użytkownicy chcą mieć dostęp przez VPN.
  • +
+

+ Sekcja conn roadwarrior-l2tp - + odpowiedzialna za połączenia L2TP (port UDP/1701). Jest ona potrzebna, + jeśli oczekujemy połączeń od klientów wbudowanych w systemy Windows. + Ważne jest, aby sekcja L2TP umieszczona była w pliku przed właściwą + sekcją odpowiedzialną za połączenia klientów. + (conn roadwarrior). +

+
    +
  • conn roadwarrior - właściwa sekcja + połączeń dla pracowników zdalnych.
  • +
  • auth=esp - określa protokół IPSec. + Możliwe opcje to ah lub esp. + Zalecaną metodą jest ESP, ponieważ obsługuje uwierzytelnienie i + szyfrowanie.
  • +
  • authby=secret - określa sposób + uwierzytelnienia stron. Wartość secret + oznacza współdzielony klucz (PSK). W przypadku uwierzytelnienia z + wykorzystaniem certyfikatów opcja powinna mieć wartość + rsasig
  • +
  • compress=yes - możliwa kompresja + danych.
  • +
  • keyexchange=ike - wartość + ike oznacza, że do uzgodnienia + kluczy zostanie użyty protokół IKE (Internet Key Exchange). Użycie + IKE jest zalecane, także przez twórców OpenSWAN.
  • +
  • keyingtries=3 - określa, ile prób + negocjacji SA może nastąpić (maksymalnie).
  • +
  • pfs=yes|no - włącza + (yes) lub + wyłącza (no) PFS.
  • +
  • rekey=yes - określa, czy połączenie + po wygaśnięciu powinno być renegocjowane. Możliwe wartości to + yes lub + no. Domyślnie yes.
  • +
  • right=%any - określa adres drugiej + strony. Słowo kluczowe %any oznacza, + że adres IP nie jest znany (przypadek mobilnych pracowników).
  • +
  • rightsubnet=vhost:%no,%priv - opcja + rightsubnet określa podsieć drugiej + strony. W przypadku połączeń typu roadwarriors z + możliwym NAT-em oraz "nie NAT-em" powinna mieć wartość + vhost:%no,%priv Przez NAT oraz + "nie NAT" należy rozumieć że użytkownicy mogą łączyć się zza NAT-u + lub też mieć "zewnętrzny" adres IP i obie konfiguracje będą działać + jednocześnie.
  • +
  • auto=add - opcja przyjmuje wartości: + start, add, ignore(domyślna!) oraz manual. + Znaczenie poszczególnych opcji jest następujące: +
      +
    • start - załaduj konfigurację i inicjuj połączenie z + druga stroną. Wartość najczęściej używana w przypadku połączeń + dwóch routerów lub jeśli strona jest klientem (ma inicjować + połączenie z drugą stroną).
    • +
    • add - załaduj konfiguracje i odpowiadaj na + przychodzące połączenia (czekaj na połączenia od drugiej + strony). Wartość używana dla konfiguracji typu + roadwarriors - nie znamy ani czasu, ani adresu IP, z + jakiego połączy się mobilny pracownik. Jedyne, co możemy zrobić + odpowiedzieć na jego połączenia.
    • +
    • ignore - ignoruje sekcję tego połączenia. Uwaga: jest + to wartość domyślna, dlatego musisz przypisać jakąś wartość + sekcjom, które mają działać.
    • +
    • manual - opcja używana przy ręcznej konfiguracji + wymiany kluczy (zamiast użycia IKE). Opcja niepolecana.
    • +
  • +
+

+ W ostatniej linijce pliku konfiguracyjnego widzimy dołączony plik: +

+
+#Disable Opportunistic Encryption
+include /etc/ipsec.d/examples/no_oe.conf
+
+

+ Dołączenie powyższego pliku wyłącza tzw. szyfrowanie oportunistyczne, + które w tym przypadku nie jest potrzebne (strony uwierzytelniają się w + inny sposób), a pozostawienie go załączonego skutkowałoby serią + komunikatów w logach systemowych, mówiących o nie możliwości sprawdzenia + informacji w DNS-ie. Idea szyfrowania oportunistycznego polega na + możliwości uwierzytelnienia dowolnych hostów w internecie bez + wcześniejszej wymiany tajnego klucza, (lub kluczy publicznych), + Uwierzytelnienia hosta odbywa się tutaj na podstawie informacji + pobranych z bezpiecznych serwerów DNS (ang. Secure DNS). +

+

+ Ogólna uwaga odnośnie składni pliku ipsec.conf. Należy pamiętać + aby pomiędzy sekcjami połączeń była jedna linijka przerwy. Nazwa sekcji + nie powinna się zaczynać od spacji czy tabulacji. Opcje w ramach sekcji + mogą zaczynać się od tabulacji. +

+

+ Pozostał nam jeszcze do konfiguracji plik /etc/ipsec.secrets. W + przypadku współdzielonego klucza oraz połączeń z nie znanych adresów IP + składnia pliku jest następująca: +

+
+<adres_ip_odpowiednik_%defaultroute> %any: PSK "<klucz_współdzielony>"
+
+

+ Po zapisaniu pliku, należy zmienić uprawnienia, tak aby możliwość odczytu + pliku miał tylko użytkownik root ( + chmod 600). +

+
Uruchomienie tunelu
+

+ Aby uruchomić tunel (proces nasłuchiwania), wpisujemy poniższe polecenie: +

+
+# ipsec setup start
+
+

Konfiguracja klienta Windows

+

+ W tej sekcji zajmiemy się konfiguracją połączenia IPSec w systemach + Windows, tak aby ich użytkownicy mogli się połączyć z naszą bramą + Linuksową. Metodą uwierzytelnienia będzie klucz współdzielony oraz + dodatkowe uwierzytelnianie w połączeniu PPP (MS-CHAP v2). Do połączenia + będziemy używać wbudowanego w Windows klienta IPSec. W nowszych + systemach Windows konfiguracja sprowadza się dodania nowego połączenia + przy użyciu kreatora. Aby dodać nowe połączenie, wykonujemy poniższe + czynności: +

+
    +
  1. Wchodzimy do Panelu sterowania i wybieramy + Połączenia sieciowe,
  2. +
  3. Uruchom Kreatora nowego połączenia. Kreator zapyta o rodzaj + połączenia - wybieramy opcje "Połącz z siecią w miejscu pracy". + Następnie klikamy przycisk Dalej,
  4. +
  5. W następnym kroku wybieramy opcje Połączenie wirtualnej sieci + prywatnej, następnie klikamy przycisk Dalej,
  6. +
  7. Wpisujemy nazwę połączenia np. ipsec1,
  8. +
  9. Podajemy adres IP lub nazwę DNS bramy VPN
  10. +
  11. Kończymy pracę kreatora, klikając przycisk Zakończ. + Przed uruchomieniem naszego połączenia trzeba zmodyfikować dwie opcje. + Wchodzimy we właściwości nowego połączenia - klikamy prawym + przyciskiem myszy ikonę nowego połączenia i wybieramy z menu opcje + Właściwości. Postępujemy wg. poniższych punktów,
  12. +
  13. Przechodzimy do zakładki Zabezpieczenia i wybieramy opcje + Ustawienia protokołu IPSec,
  14. +
  15. Zaznaczamy opcje Użyj klucza wstępnego do uwierzytelniania + oraz wpisujemy w polu Klucz: hasło podane w pliku + /etc/ipsec.secrets na Linuksie. Zatwierdzamy przyciskiem + OK,
  16. +
  17. Następnie przechodzimy do zakładki Sieć i zmieniamy wartość + pola Typ wirtualnej sieci prywatnej (VPN) z + Automatyczny na Sieć VPN a protokołem L2TP IPSec,
  18. +
  19. Zapisujemy zmiany.
  20. +
+

+ W tej chwili możemy połączyć się z bramą IPSec. Klikamy dwukrotnie myszką + na ikonę połączenia VPN. W oknie dialogowym podajemy nazwę użytkownika i + hasło, a następnie klikamy przycisk Połącz. Nazwa użytkownika i + hasło to oczywiście dane uwierzytelniające połączenie PPP + (patrz plik /etc/ppp/chap-secrets na Linuksie). +

+

Debugowanie połączenia

+

+ Jeśli wykonaliśmy wszystkie kroki z poprzednich punktów połączenie + powinno zadziałać od razu. W praktyce pewnie pojawią się jakieś + komplikacje. W tej sekcji zostanie podanych kilka porad dotyczących tego, + jak znaleźć błąd. +

+

+ W przypadku połączeń Windows-Linux (OpenSWAN) opartych na PSK + błąd wystąpi prawdopodobnie gdzieś po stronie Linuksa. Konfiguracja + Windowsa jest bowiem tak prosta, że trudno byłoby w niej coś zrobić źle. +

+

+ Zaczynamy od przekierowania wszystkich logów systemowych do jednego pliku, + aby łatwiej było podglądać na bieżąco, co się dzieje. Dlaczego wszystkie + do jednego pliku? Otóż dlatego że IPSec nie składa się z jednego demona, + jest ich wiele, wiec wygodniej jest przeglądać jeden plik niż wiele. Aby + przekierować wszystkie logi wpisujemy do pliku /etc/syslog.conf + poniższą linijkę: +

+*.*    /var/log/all
+
+

+ Następnie przeładowujemy konfiguracje demona Syslog. Wpisujemy polecenie: +

+
+killall -HUP syslogd
+
+

+ W środowisku produkcyjnym plik na serwerze może szybko przyrastać. Należy + pamiętać, aby po zakończonych testach usunąć wpis z konfiguracji Sysloga. + Łączymy sie z serwerem z innej konsoli, lub jeśli pracujemy lokalnie, + przełączamy się na drugą konsolę). Wpisujemy polecenie: +

+
+tail -f /var/log/all
+
+

+ Na tej konsoli będziesz miał stały podgląd logów systemowych. Jeśli na + serwerze działają inne usługi, które możemy wyłączyć (np. poczta, czy + dhcp), zróbmy to - im mniej logów, tym łatwiej je przeglądać. Przełączamy + się na pierwszą konsolę i sprawdzamy następujące rzeczy: +

+
    +
  1. Czy działa demon L2TP - wpisujemy polecenie: +
    +# ps -aux | grep "l2tp"
    +
    + Powinniśmy zobaczyć proces. Jeśli nie działa - uruchamiamy go + wpisując polecenie: +
    +# xl2tpd
    +
    + Sprawdzamy ponownie, czy widnieje na liście procesów. Jeżeli nie - + sprawdzamy co mówią logi na drugiej konsoli.
  2. +
  3. Sprawdzamy poleceniem netstat, czy + serwer nasłuchuje na portach 4500 (NAT Traversal), 500 (Pluto - IKE) + oraz 1701 (L2TP). W tym celu wpisujemy polecenie: +
    +netstat -anp | grep udp
    +
    + Powinniśmy zobaczyć nasłuchujące procesy powiązane z danymi portami.
  4. +
  5. Upewniamy się, czy firewall nie blokuje potrzebnych portów UDP oraz + protokołu ESP. Najlepiej na czas testów w ogóle wyłączyć firewall, + tzn. ustawiamy domyślną politykę zapory na ACCEPT.
  6. +
  7. Sprawdzamy, czy w systemie na pewno jest zainstalowany program + pppd - wpisujemy polecenie: +
    +which pppd
    +
    +
  8. +
  9. Upewnijmy się, że w pliku ipsec.conf widnieje wpis + pfs=no, który oznacza, że PFS nie + jest konieczne (możliwe gdy druga strona to obsługuje). Implementacja + Microsoftu nie obsługuje PFS, dlatego nie możemy go wymuszać.
  10. +
+

+ Po stronie Windowsa debugowanie jest utrudnione z racji braku "sysloga". + Można jedna zainstalować program Wireshark - bardzo dobry + sniffer sieciowy - i analizować nim fazy połączenia. W przypadku Windows, + należy upewnić się że żaden program typu firewall nie blokuje połączenia + zwłaszcza takie kombajny jak różne pakiety "Internet Security". +

+

Konfiguracja z uwierzytelnianiem przez certyfikat

+

+ W tej sekcji utworzymy bramę IPSec dla mobilnych użytkowników, z tą tylko + różnicą, że do uwierzytelnienia użyjemy certyfikatów X.509, a nie klucza + współdzielonego. Konfiguracja taka jest zdecydowanie bardziej zalecana + przy zdalnym dostępie pracowników, gdyż umożliwia w razie potrzeby + unieważnienie certyfikatu użytkownikowi. +

+

+ Zakładamy tutaj że mamy już wygenerowane klucze i certyfikaty dla serwera + i użytkownika (na razie jeden użytkownik wystarczy). +

+

+ Konfiguracja po stronie Linuksa (bramy VPN) znacząco się nie różni - + więcej pracy będzie w systemie Windows. +

+
Konfiguracja OpenSWAN z wykorzystaniem certyfikatów.
+

+ Po stronie Linuksa - w stosunku do konfiguracji z użyciem PSK - zmianie + ulegają tylko pliki ipsec.conf oraz ipsec.secrets, + pozostałe konfiguracje pozostają identyczne (demon L2TP, konfiguracja + pppd). +

+

+ Konfiguracje wykonujemy wg. następujących punktów: +

+
    +
  1. Zapisujemy klucz prywatny serwera jako: + /etc/ipsec.d/private/serverkey.pem
  2. +
  3. Zapisujemy certyfikat serwera jako + /etc/ipsec.d/certs/servercrt.pem
  4. +
  5. Zapisujemy certyfikat CA jako + /etc/ipsec.d/cacerts/cacert.pem
  6. +
  7. Plik z listą unieważnionych certyfikatów (poźniejszy etap) powinien + znajdować się w katalogu /etc/ipsec.d/crls/.
  8. +
  9. Dokonujemy zmian w pliku /etc/ipsec.secrets, tak aby miał + następującą składnię: +
    +: RSA serverkey.pem "<hasło_klucza_prywatnego>"
    +
    + gdzie: +
      +
    • serverkey.pem - to nazwa pliku + z kluczem prywatnym, którego program OpenSWAN oczekuje + w katalogu /etc/ipsec.d/private/,
    • +
    • hasło_klucz_prywatnego - to + hasło do klucza prywatnego serwera. W przypadku gdy klucz nie + jest zabezpieczony hasłem, można je pominąć. Wstawienie + wartości %prompt spowoduje, że program OpenSWAN + przy starcie będzie pytał o hasło do klucza.
    • +
  10. +
  11. Tworzymy plik konfiguracyjny /etc/ipsec.conf +
    +version 2.0
    +config setup
    +        interfaces=%defaultroute
    +        plutodebug=none
    +        forwardcontrol=yes
    +        nat_traversal=yes
    +        virtual_private=%v4:10.0.0.0/8,%v4:172.16.0.0/12,%v4:192.168.0.0/16,%v4:!192.168.10.0/24
    +conn roadwarrior-l2tp
    +        leftprotoport=17/1701
    +        rightprotoport=17/1701        
    +        also=roadwarrior
    +conn roadwarrior
    +        auth=esp
    +        authby=rsasig
    +        compress=yes
    +        keyexchange=ike
    +        keyingtries=3
    +        pfs=no
    +        left=%defaultroute
    +        leftcert=/etc/ipsec.d/certs/servercrt.pem
    +        right=%any
    +        rightrsasigkey=%cert
    +        rightsubnet=vhost:%no,%priv
    +        rightca=%same
    +        auto=add
    +#Disable Opportunistic Encryption
    +include /etc/ipsec.d/examples/no_oe.conf
    +
    + Opcja rightrsasigkey=%cert + oznacza, że druga strona uwierzytelni się, przedstawiając swój + certyfikat. Opcja rightca=%same + oznacza, że certyfikat drugiej strony (klienta) musi być wystawiony + przez to samo CA co certyfikat serwera, czyli przez CA, którego + certyfikat znajduje się na serwerze w pliku: + /etc/ipsec.d/cacert/cacert.pem.
  12. +
  13. Uruchamiamy usługę IPSec, wpisując polecenie: +
    +ipsec setup start
    +
  14. +
+

Import certyfikatów w systemie Windows

+

+ Zakładając, że wygenerowaliśmy już użytkownikom klucz oraz wystawiliśmy + certyfikaty podpisane przez nasze CA. Powinniśmy mieć już pliki + user.key i user.crt. Będziemy musieli przekonwertować + nasze klucze i certyfikaty na format PKCS#12 używany w systemach Windows. + Konwersje zostały przedstawione podkoniec sekcji poświęconej + SSL. +

+

+ Przy imporcie certyfikatów należy powstrzymać się od instalowania + certyfikatów w systemie Windows przez kliknięcie na plik. Ta metoda nie + działa prawidłowo. Zamiast tego będziemy używać przystawki MMC. +

+

+ Utworzymy przystawkę MMC, dzięki której będziemy mogli importować nasze + klucze i certyfikaty. Naciskamy kombinację klawiszy (Win + r), w okienku + uruchom pisujemy polecenie: mmc - uruchomi się konsola MMC. +

+

+ Z menu Plik konsoli MMC wybieramy opcję + Dodaj/Usuń przystawkę.... Pojawi się okno + Dodaj/Usuń przystawkę - klikamy przycisk Dodaj. +

+

+ Na liście dostępnych przystawek zaznaczamy Certyfikaty, a + następnie klikamy Dodaj - uruchomi się kreator konfiguracji + przystawki. Wybieramy Konto komputera, następnie + klikamy Dalej. W następnym kroku wybieramy opcję + Komputer lokalny oraz klikamy przycisk Zakończ. +

+

+ Z menu Plik wybieramy opcję Zapisz, aby zapisać gotową + przystawkę na dysku. Możemy ją nazwać dowolnie - np. + ipsec.mmc. +

+

+ Mając gotową przystawkę, możemy zaimportować certyfikat. W tym celu + rozwiń przystawkę Certyfikaty, a następnie kliknij prawym + przyciskiem myszy folder Osobisty. Z menu wybieramy + Wszystkie zadania a następnie Importuj... - uruchomi + się kreator importu certyfikatów. +

+

+ W kreatorze dodawania certyfikatów wskazujemy przygotowany wcześniej plik + certyfikatu użytkownika. Kreator zapyta o hasło klucza prywatnego - + podajemy je. Klikamy przycisk Dalej, następnie wybieramy opcje + Automatycznie wybierz magazyn certyfikatów na podstawie typu + certyfikatu (WAŻNE!) oraz ponownie klikamy + Dalej. +

+

+ Musimy jeszcze zainstalować certyfikat swojego CA w katalogu zaufanych + urzędów certyfikacji. W tym celu klikamy prawym przyciskiem myszy katalog + Zaufane główne urzędy certyfikacji, a następnie z menu wybieramy + opcję Wszystkie zadania/Importuj. +

+

+ Po wybraniu opcji Importuj uruchomi się kolejny kreator importu + certyfikatów. Musimy wskazać plik z certyfikatem CA (ca.crt). + Kreator importu certyfikatów oczekuje pliku z rozszerzeniem + *.crt, a nie *.pem, dlatego przed importem musimy się + upewnić czy plik ma takie rozszerzenie. +

+

+ Klikamy przycisk Dalej, a następnie wybierz opcję Umieść + wszystkie certyfikaty w następującym magazynie - Zaufane główne urzędy + certyfikacji. Wychodzimy z konsoli zapisując zmiany. +

+
Konfiguracja połączenia
+

+ Konfiguracja połączenia przeprowadzamy dokładnie w taki sam sposób, jak w + przykładzie z kluczem współdzielonym. Jedyna różnica polega na tym, aby w + zakładce Zabezpieczenia nie zaznaczymy opcji Ustawienia + protokołu IPSec/Użyj klucza wstępnego do uwierzytelniania. + Zapisujemy zmiany i próbujemy się połączyć. +

+

+ Jeśli pojawi się błąd odnośnie certyfikatu, to należy upewnić się że + poprawnie zaimportowaliśmy certyfikat CA w magazynie + Zaufane główne urzędy certyfikacji. Najlepiej zrobić to jeszcze + raz. +

+

+ Jeśli połączenie się zestawiło, spróbujmy spingować drugą stronę wtedy + będzie mieli pewność. +

+

Łączenie oddziałów firmy tunelem IPSec

+

+ W tej sekcji stworzymy tunel łączący siedzibę firmy A z oddziałem B. W + obu lokalizacjach routery działają pod kontrolą Linuksa z instalowanym + programem OpenSWAN. Celem tunelu jest zapewnienie bezpiecznej + komunikacji w oddziałach. +

+

+ Do uwierzytelnienia obu stron użyjemy tym razem kluczy RSA (klucz + prywatny i publiczny). Jeżeli routery mają stałe IP, możesz użyć nawet + klucza współdzielonego (hasła), ale pamiętajmy, aby zablokować na + firewallu możliwość łączenia się z protokołem IPSec ze wszystkich hostów + wyjątkiem adresu IP "drugiej strony" (w przeciwnym razie ktoś będzie mógł + próbować odgadnąć hasło, np. przez atak typu brute force). +

+

+ Ponieważ implementacja IPSec w Linuksie nie wymaga użycia protokołu PPP + oraz L2TP, konfiguracja tutaj jest znacznie prostsza niż w przypadku + połączenia z użytkownikami mobilnymi. +

+

+ Tworzymy plik konfiguracyjny podany na listingu poniżej będzie to + plik siedziby firmy A. +

+

+version 2.0
+config setup
+        interfaces=%defaultroute        
+        forwardcontrol=yes        
+        rp_filter=0        
+        nat_traversal=noconn
+linux-to-linux
+        auth=esp        
+        authby=rsasig        
+        pfs=yes        
+        left=91.192.0.186        
+        leftsubnet=192.168.20.0/24
+        leftrsasigkey=0sAQPuvae6KEw/yHijDjqHomCyLo8oO3H8wl3UExuTArCXtzc1DO5X2E8QFIu0grLofzIzgoCy8AkoFthFPJIyDF3zKVH9ppMS8XQQL2naWp+YOm2cROstRlAfyvC/jF7GvWlRIjxzHzCLCIJXihZmFZGN1ku/DExLx5TjzqG/bXQ9DQ==
+        right=91.192.0.185        
+        rightsubnet=192.168.30.0/24
+        rightrsasigkey=0sAQODH/CRwexspJ6mu/bThfQzs84IpaHBYNs5MeDpxbiLdacZjM22PqOvbVIqeQlYg4zHMAnB2EyUIgYHskJqyRmtmg6S5ELxnNHqvTE92KI5Bdicn458CowdqR2Jtc4tvD7OWHv/RFzmt6W1kIHPiILAOkR2mSvATgI/QhZtNN4oaw==        
+        auto=start
+include /etc/ipsec.d/examples/no_oe.conf
+
+

+ Znaczenie ważniejszych opcji jest następujące: +

+
    +
  • authby=rsasig - uwierzytelnianie + przez klucze RSA,
  • +
  • left=91.192.0.186 - adres IP routera + w siedzibie firmy A ("lewa strona" - lokalna routera),
  • +
  • leftsubnet=192.168.20.0/24 - sieć + LAN za routerem w siedzibie firmy A,
  • +
  • leftrsasigkey=0sAQPuvae6KE... - + klucz publiczny "lewej strony" (routera w siedzibie A), +
  • right=91.192.0.185 - adres IP bramy + odległej lokalizacji (oddziału B),
  • +
  • rightsubnet=192.168.30.0/24 - sieć + LAN za routerem w oddziale B,
  • +
  • rightrsasigkey=0sAQODH/CRw... - + klucz publiczny prawej strony.
  • +
+

+ Warto zauważyć że PFS zostało włączone, nie trzeba tego robić jawnie, + jest to opcja domyślna dla połączeń linux-linux. Ponieważ jest ona + obsługiwana nie należy jej wyłączać. +

+

+ Ze względu na to iż powyższy listing jest gotowcem pobranym z plików + załączonych do pakietu OpenSWAN, aby użyć go w swoim przypadku + należy zmienić wyżej wymienione opcje, prócz + authby. Aby zmienić klucze musimy je + wygenerować poleceniem pakietu OpenSWAN. Poniżej znajduje się + lista czynności do wykonania, aby uruchomić tunel IPSec łączący oddziały + firmy. +

+
    +
  1. Na obu routerach wydajemy poniższe polecenie: +
    +# ipsec rsasigkey 1024 > /root/key.rsa
    +
    +
  2. +
  3. Na obu routerach kopiujemy ciąg znaków zaczynający się + od #pubkey=... i umieszczamy go w + pliku ipsec.conf przy parametrze + leftrsasigkey=, po czym usuwamy skopiowany ciąg znaków z pliku + klucza.
  4. +
  5. Kopiujemy ciąg umieszczony w + leftrsasigkey do pliku konfiguracyjnego w oddziale B, + umieszczając go przy parametrze + rightrsasigkey=
  6. +
  7. Klucz przy parametrze leftrsasigkey= umieszczamy w pliku + konfiguracyjnym routera w siedzibie firmy A przy parametrze + rightrsasigkey=
  8. +
  9. Otwieramy do edycji plik /etc/ipsec.secrets i umieszczamy w + nim następujący wpis: +
    +91.192.0.186 91.192.0.185: RSA {
    +
    +//część klucz prywatnego pobrana z pliku /root/key.rsa
    +//począwszy od linii: Modulus do końca pliku
    +
    +}
    +
    + gdzie 91.192.0.186 to w powyższym przykładzie adres IP + "lewej strony" (IP lokalnego routera), a 91.192.0.185 to IP + odległego routera. Na drugim routerze wpis wygląda odwrotnie. W + sekcji pomiędzy nawiasami klamrowymi + ({...}) powinien znaleźć się klucz + prywatny RSA.
  10. +
  11. Uruchamiamy tunel po obu stronach, wpisując poniższe polecenie: +
    +# ipsec setup start
    +
    +
  12. +
  13. Sprawdzamy czy połączenie IPsec zostało zestawione. Wpisujemy + polecenie: +
    +# ip xfrm state
    +
    +
  14. +
+
+
+ + diff --git "a/articles/terminallog/\305\233ci\304\205ga_z_PYTHONga.html" "b/articles/terminallog/\305\233ci\304\205ga_z_PYTHONga.html" new file mode 100755 index 0000000..11b80a2 --- /dev/null +++ "b/articles/terminallog/\305\233ci\304\205ga_z_PYTHONga.html" @@ -0,0 +1,5464 @@ + + + + + + + + + + +
+
+

Ściąga z PYTHONga

+
    +
  1. Część 1: Zapoznanie się z językiem Python + +
  2. +
  3. Część 2: Aplikacje internetowe + +
  4. +
+ +
+
+
+
+ _                      _             _ _
+| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
+| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
+| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
+ \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
+			                        |___/
+
+ +
+

Część 1: Zapoznanie się z językiem Python

+

1.1. Wstęp.

+

+ Informacje zawarte tutaj odnoszą się do wersji Pythona powyżej 3.6. + Python powinien być zainstalowany domyślnie we wiodących dystrybucjach + systemu Linux. Jeśli nie ma w ogóle Pythona w wersji >= 3. To warto + sprawdzić czy istnieją pakiety w repozytorium dystrybucji z wersją + powyżej 3.6. Jeśli tak to instalujemy te pakiety. Jeśli nie, to wtedy + należałoby pobrać kod źródłowy najnowszego Pythona i go skompilować. + Zazwyczaj nie kompiluje, ale w przypadku kiedy użyłem dystrybucji + BunsenLabs Helium, to pre-instalowanego Pythona miałem w wersji + 3.5. Za mało na najnowszy Crash Course. Kompilacje wykonujemy w + następujących krokach: +

+
    +
  1. Instalujemy odpowiednie dla naszej dystrybucji build-essential + oraz dwa pakiety, których nieobecność została zauważona przy + wykonywaniu polecenia make altinstall + i zwrócona jako błąd, mianowicie chodzi o zlib1g oraz + zlib1g-dev.
  2. +
  3. Pobieramy najnowszą wersję kodu z + https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xz.
  4. +
  5. Rozpakowujemy: + tar -xvf Python-3.8.3.tar.xz
  6. +
  7. Przechodzimy do katalogu: + cd Python-3.8.3.tar.xz
  8. +
  9. Ja w swoim systemie zachowałem obecną wersję Pythona, wskazując + skryptowi konfiguracyjnemu opcje prefix + wskazującą na katalog utworzony w moim katalogu domowym: + ./configure --prefix="/home/xf0r3m/bin/python3.8". + Użycie opcji prefix, przekazuje + skryptowi, aby przygotował środowisko do kompilacji względem podanej + ścieżki. Jeśli nie zostanie zwrócony żaden błąd podczas pracy skryptu, + zostanie nam wygenerowany tzw. plik makefile.
  10. +
  11. Wydajemy polecenie kompilacji kodu: make. + Po poprawnie zakończonej kompilacji, to znaczy po wyświetlonych przez + polecenie make następnych + kompilacjach, zostanie nam zwrócony prompt, możemy przejść + do ostatniej części kompilacji czyli instalacji pakietu w systemie. + Ze względu na to iż zostawiłem pre-instalowaną wersję 3.5, wydaje + polecenie 'make altinstall po + wykonaniu tego polecenia nasz Python 3.8 znajduje się w podkatalogu + bin na ścieżce, którą podaliśmy w opcji + prefix.
  12. +
  13. Ostatni punkt jest dla wygodnych. W pliku .bashrc możemy + sobie zdefiniować alias python dla naszego nowo + zainstalowanego Pythona. Po uruchomieniu polecenia + python powiśmy zobaczyć + prompt powłoki wraz z informacjami odnośnie wersji.
  14. +
+
+Python 3.8.2 (default, Apr 27 2020, 15:53:34)
+[GCC 9.3.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>>
+
+

+ Poniżej znajdują się zagadnienia z książki które warto mieć przy sobie + przy pierwszych projektach tworzonych w tym języku. Kolejność jest + identyczna z kolejnością występowania w książce. +

+

1.2. Witaj w świecie Pythona.

+

+ print() - instrukcja wyświetlająca wszystko co umieścimy + pomiędzy nawiasami. +

+

+ Konwencja nadawania wartości zmiennym w Pythonie wygląda w ten sposób: +

+
+greetinsg_message = "Hello, World!"
+
+

+ Warto pamiętać o spacjach pomiędzy operatorem. Podobnie zresztą wygląda + konwencja stosowania jakichkolwiek operatorów. +

+

1.2.1. Ciągi tekstowe w Pythonie

+

+ Ciągi tekstowe f - formatowane ciągi tekstowe. + Litera f pochodzi od słowa format, ich głównym zadaniem jest + zamiana nawiasu klamrowego wraz z nazwą zmiennej na jej wartość w ciągu. + Taki ciąg tworzy się w następujący sposób: +

+
+imie = 'xf0r3m'
+print(f"Witaj {imie}! Czy chcesz zanurzyć się w świat Pythona?")
+
+

+ Czy w innej zmiennej czy poleceniu print() + zapisanie litery f przed znakami + cudzysłowu lub apostrofu, spowoduje że dany ciąg będzie ciągiem f. +

+

+ Uwaga! Ciągi f są dostępne dopiero od wersji 3.6. +

+

+ Formatowanie ciągu przed wersją Pythona 3.6. + Takie formatowanie polega na użyciu wbudowanej metody + format(). Przykład poniżej. +

+
+imie = 'xf0r3m'
+print("Witaj {}! Czy chcesz zanurzyć się w świat Pythona?".format(imie))
+
+

+ Dodatkowa zmienna do wyświetlenia, to dodatkowa para nawiasów i kolejna + zmienna jako argument metody format. +

+

+ Do obróbki ciągów tekstowych, a konkretnie ich normalizacji + mogą służyć nam poniższe metody: +

+
    +
  • title() - Zwraca ciąg tekstowy jak tytuł, czyli + każdy wyraz w ciągu zaczyna się z wielkiej litery.
  • +
  • lower() - Zwraca ciąg tekstowy po całości zapisany + małymi literami.
  • +
  • upper() - Zwraca ciąg tekstowy zapisany po całości + z wielkich liter
  • +
+

+ Warto zaznaczyć że te metody nie zmieniają wartości ciągu, o ile nie + przypiszemy nie ich wartości zwrotnych. +

+

+ Białe znaki w ciągach tekstowych. Białe znaki w naszych + ciągach uzyskuje się w bardzo prosty sposób, po prostu po przez + umieszczenie w ciągu: +

+
    +
  • \t - tabulator
  • +
  • \n - znak nowej linii
  • +
+
+imie = 'xf0r3m'
+print(f"Witaj \t{imie}!\nCzy chcesz zanurzyć się w świat Pythona?")
+
+

+ Usuwanie białych znaków. Może zdarzyć się taka sytuacja, + że weźmie się skądś dane, i nagle gdzieś nasz algorytm nie działa, bo + ma nieprawidłowe dane. Gdzieś na początku albo na końcu ciągu znajdują + się nadmiarowe białe znaki np. skopiowaliśmy jakiś ciąg ze spacją na + końcu. To zresztą zdarza się dość często. W tym przypadku korzystamy z + metody strip() jeśli nie potrafimy jasno + określić czy z lewej lub prawej strony ciągu znajdują się nadmiarowe + białe znaki. Dla znaków po lewej stronie możemy użyć lstrip() + a dla znaków po prawej rstrip(). Warto mieć na uwadze, + że te metody nie dokonują w zmiennej żadnych zmian, aby zapisać + zmiany musimy nadać zmiennej wartość zwracaną przez tą metodę. +

+
+dirty_strings='  python  '
+washed_strings=dirty_strings.strip()
+
+

1.2.2. Więcej o zmiennych

+

+ Wielkie liczby możemy zapisywać za pomocą grup rozdzielonych przy + pomocy znaku podkreślenia (_), na przykład: +

+
+one_bilion = 1_000_000_000
+
+

+ Z poziomu Pythona nie ma znaczenia, czy jest 1000000000 czy + 1_000_000_000. Podobnie jest z mniejszymi liczbami, takimi jak + 1000 (1_000). Uwaga! Ta funkcjonalność dostępna + jest od Pythona 3.6 w górę. +

+

+ Wiele przypisań wartość możemy skrócić sobie do + praktycznego, aczkolwiek nie zawsze czytelnego zapisu. Na przykład: +

+
+x, y, z = 0, 0, 0
+a, b, c = 3, 4, 5
+
+

+ W Pythonie nie ma stałych, jednak wśród programistów nie tylko Pythona + przyjęło się, że każdą zmienną, której nazwa (identyfikator) będzie + zapisany wielkimi literami traktuje się jako stałą. +

+
+UNIX_EPOCH = "01-01-1970"
+
+

1.2.3.Komentarze

+

+ Komentarze w Pythonie zaczynają się od krzyżyka + (#). Wszystko co zostanie umieszczone po tym znaku + zostanie zignorowane w przez interpreter Pythona. +

+
+NIGGA_AM = 300
+#BANG!
+
+

1.2.4. Kilkanaście zasad.

+

+ Zen Pythona - to kilka zasad stworzonych przez + społeczność Pythona. Cenne uwagi, które warto wziąć sobie do serca + programując nie tylko w Pythonie. Warto sobie zrobić z tego swoisty + kodeks programisty - 18 zasad. +

+
+>>> import this
+The Zen of Python, by Tim Peters
+
+Beautiful is better than ugly.
+Explicit is better than implicit.
+Simple is better than complex.
+Complex is better than complicated.
+Flat is better than nested.
+Sparse is better than dense.
+Readability counts.
+Special cases aren't special enough to break the rules.
+Although practicality beats purity.
+Errors should never pass silently.
+Unless explicitly silenced.
+In the face of ambiguity, refuse the temptation to guess.
+There should be one-- and preferably only one --obvious way to do it.
+Although that way may not be obvious at first unless you're Dutch.
+Now is better than never.
+Although never is often better than *right* now.
+If the implementation is hard to explain, it's a bad idea.
+If the implementation is easy to explain, it may be a good idea.
+Namespaces are one honking great idea -- let's do more of those!
+
+

1.3. Listy

+

+ Listy - bardzo podobne do tablic. Do poszczególnych + elementów uzyskujemy dostęp poprzez podanie indeksu w nawiasie + kwadratowym: +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+print(cars[2])
+
+

+ Dostęp do końcowych elementów listy następuje poprzez podanie + ujemnego indeksu, począwszy od -1 wskazujący + ostatni element listy, kolejno -2 to przedostatni itd. +

+

+ Nadając zmiennej parę nawiasów kwadaratowych możemy utworzyć + pustą listę, do której wrazie potrzemy będziemy mogli + dodać elementy. +

+
+cars=[]
+
+

1.3.1. Dodawanie elementów do listy

+

+ Dodawanie elementów na końcu listy możemy zrealizować za pomocą + wbudowanej metody append(). Jak argument + metoda przyjmuje wartość dodawanego elementu. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+cars.append('toyota')
+
+

+ Za pomocą metody insert(), możemy + wstawić element w dowolny indeks listy. Metoda jako argumenty przyjmuje + indeks dla nowego elementu oraz jego wartość. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+cars.insert(2, 'daewoo')
+
+

1.3.2. Usuwanie elementów z listy

+

+ Usuwanie elementów z listy możemy przeprowadzić na trzy + sposoby. Po prostu usuwając element poprzez podanie nazwy listy oraz + indeksu (tak jak byśmy uzyskiwali dostęp do wartości) instrukcji + del. +

+
+del cars[1]
+
+

+ Kolejnym sposobem może być zabranie danej wartości z listy za pomocą + metody pop(). Jako argument metoda + przyjmuje indeks, tak więc możemy pobrać dowolny element, jeśli nie + podamy żadnych argumentów metoda pobierze ostatni element. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+fura = cars.pop()
+
+

+ Ostatnim, chyba najciekawszym sposobem jest metoda + remove(), która wyszukuje element na + podstawie wartości. Poszukiwaną wartość podajemy jak argument metody. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+swag_gablota = 'bmw'
+cars.remove(swag_gablota)
+
+

+ Uwaga! Metoda remove() + usuwa tylko pierwsze wystąpienie danej wartości na liście, więc jeśli + jest więcej niż jedna taka wartość to tylko pierwsza odnaleziona zostanie + usunięta. +

+

1.3.3. Sortowanie list

+

+ Elementy na liście mogą być innej kolejności niż moglibyśmy sobie tego + życzyć, w Pythonie istnieje kilka sposób na uporządkowanie listy + (sortowanie). +

+

+ Pierwszą z nich jest użycie metody + sort(), metoda ta wyróżnia się tym, że + wprowadza zmiany samej liście, czyli jej użycie w kodzie zmieni kolejność + wartości na liście. Domyślnie metoda sort() sortuje rosnąco, + jednak możemy mieć na to wpływ, podając jej argument + reverse=True, teraz metoda posortuje + listę malejąco. +

+

+ Kolejnym sposobem na sortowanie jest sposób tymczasowy, na przykład gdy + kolejność danych ma znaczenie i nie możemy jej od tak sobie zmieniać, ale + jednak wypadałoby aby użytkownikowi wypisać posortowane dane. + Za sortowanie tymczasowe odpowiada funkcja + sorted(). Funkcja od metody tym + kontekście różni się tym że musimy podać jako argument listę, a następnie + zrobić coś z danymi zwróconymi albo przechować je w zmiennej albo wypisać + za pomocą polecenia print(). Oczywiście + funkcja sorted() również przyjmuje argument reverse=True. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+cars.sort()
+print(cars)
+cars.sort(reverse=True)
+print(cars)
+
+cars = ['audi', 'bmw', 'renault', 'honda']
+print(sorted(cars))
+print(sorted(cars, reverse=True))
+
+

+ W Pythonie sortowanie jest nieco bardziej skomplikowane, ponieważ ciągi + tekstowe sortowane są za pomocą wartości tablicy ASCII. Mniejszą + wartość (liczbę całkowitą przyporządkowaną do znaku w tablicy) mają + wielkie litery, dlatego jeśli elementy listy mają wartość nie jednakowe + (wszystkie z wielkiej/wszystkie z małej) to możemy spodziewać się, że + wartość zapisane wielką literą będą miały pierwszeństwo na posortowanej + liście. +

+

1.3.4. Odwracanie listy.

+

+ Inną metodą na organizację listy jest jej odwrócenie. To znaczy, że + ostatni element będzie pierwszym, przedostatni drugim itd, + do odwracania listy służy metoda reverse(). +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+cars.reverse()
+
+

+ Warto wspomnieć, że reverse() trwale zmienia kolejność listy. +

+

1.3.5. Długość listy

+

+ Wielkość listy możemy określić przy pomocy funkcji + len(), funkcja jako argument przyjmuje + naszą listę. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+len(cars)
+
+

1.4. Pętla for

+

+ Pętla for w Pythonie jest podobna konstrukcyjnie do pętli + for z BASH-a, również używa się słowa kluczowego + in. Jeśli chcielibyśmy przetłumaczyć na + język potoczny pętlę for to będzie to mniej więcej tak: "Dla + zmiennej value przypisz element z listy, następnie wykonaj blok + kodu, na koniec przesuń się na kolejny element listy". Ten rodzaj pętli + służy głównie iteracjom przez listy lub listy tworzone przez funkcję + range() (określone zbiory danych). Przy pętli for po + raz pierwszy spotkamy się z zagnieżdżaniem bloków kodu. Przy każdej + konstrukcji operującej na bloku kodu pojawia się dwukropek + (:), oznaczający początek blok kodu. Wszystkie linie, + które mają znaleźć się w owym bloku przesuwamy o jeden tab. Ponieważ + wcięcia Pythonie są wykorzystywane do oznaczania bloku kodu, trzeba + uważać przy ich stosowaniu. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+for car in cars:
+	print(car)
+
+

1.5. Funkcja range

+

+ Za generowanie serii liczb ujętych w listę odpowiedzialna jest funkcja + range(). Jako argumenty przyjmuje ona + zakres dla generowanej serii liczb. Cechą funkcji, o której warto + wiedzieć to to, że ostatnia liczba z zakresu jest traktowana w sposób + wyłączny, to znaczy, że jeśli użyjemy funkcji range() do + wygenerowania listy od 1 do 10, to jeśli podamy argumenty 1,10 to listę + otrzymamy od 1 do 9. +

+
+for number in range(1,10):
+print(number)
+
+

+ Funkcja range() może przyjmować jeden argument, zakres końcowy. +

+
+for number in range(5):
+	print(number)
+
+

+ Dane wyjściowe takiej pętli będą od 0 od 4 - 5 elementów. +

+

+ Funkcję range()możemy wykorzystać wraz inna funkcją - + list() do tworzenia list liczbowych. +

+
+numbers = list(range(1,11))
+for number in numbers:
+	print(number)
+
+

+ Po za określeniem zakresu funkcja range() przyjmuje również + krok, czyli o ile ma zwiększyć kolejne elementy. +

+
+even_numbers = list(range(2,11,2))
+for evenn in even_numbers:
+	print(evenn)
+
+

1.6. Proste funkcje statystyczne

+

+ W Pythonie mamy dostępnych kilka bardzo prostych wybudowanych funkcji + statystycznych. Mianowicie: +

+
    +
  • min() - zwraca najmniejszą wartość na liście
  • +
  • max() - zwraca największa wartość na liście
  • +
  • sum() - zwraca sumę wszystkich elementów listy
  • +
+

1.7. Lista składana

+

+ Aby ograniczyć do minimum proces tworzenie list. Python wprowadza coś + takiego co nazywa się listą składaną. Taka lista składa + się z modelu wartości elementu (np. value**2) oraz z pętli for + wraz z funkcją range(). Liczba stworzonych elementów znajduje + się w argumencie funkcji range(). Elementy będą miały wartość + obliczoną w modelu. +

+
+squares = [value**2 for value in range(1,11)]
+print(squares)
+
+

1.8. Wycinek listy.

+

+ Powiedzmy, że do obliczeń potrzebujemy dwóch środkowych wartości z listy. + Aby wydobyć je w najbardziej efektywny sposób możemy użyć + wycinka listy. Wycinek tworzymy, podając w miejscu + indeksu przy normalnym odwoływaniu się do listy, zakres składający się z + wartości początkowej (uwaga, liczonej od 0), dwukropka + (:) oraz wartości końcowej, z tym, że z wartością + końcową jest identycznie co w przypadku funkcji range(). Chcąc + stworzyć wycinek z drugiego oraz trzeciego elementu, należy policzyć od 0, + czyli drugi element będzie mieć indeks 1, zakres końcowy trzeba podać o 1 + większy więc licząc od 0 trzeci element to 2 oraz jeszcze 1 więc koniec, + końców zakres końcowy to 3. +

+
+even_numbers = list(range(2,11,2))
+evenn_slice = even_numbers[1:3]
+
+

+ Zakres wartości w wycinkach, jest nieco bardziej elastyczny. Na przykład + chcemy wszystkie elementy do czwartego to zamiast [0:4] podajemy + po prostu [:4] możemy pominąć wartość początkową, wtedy + domyślnie będzie 0. Podobnie jest z wartością końcową + [2:] ten zakres oznacza, że wycinek będzie zawierał wszystkie + elementy od 3 do końca listy. Podobnie jak w przypadku indeksów, możemy + podać ujemne wartości, przyczym podajemy tylko wartość początkową. Taki + wycinek będzie zawierać elementy od tego wskazanego do końca listy. Przy + podawaniu warto pamiętać że ostatni element to -1, im większa wartość ujemna tym bliżej początku listy jesteśmy. +

+
+even_numbers = list(range(2,11,2))
+end_values = even_numbers[-2:]
+
+

1.8.1. Krok w wycinku listy

+

+ Zakres wycinku ma możliwość podania trzeciego argumentu, wartości kroku + przy tworzeniu wycinka. +

+
+numbers = list(range(1,11))
+non_even_numbers=numbers[0::2]
+
+

1.8.2. Iteracja przez wycinek listy

+

+ Do wskazania pętli for możemy użyć wycinka listy. Na poniższym + przykładzie zaprezentowano jak należy to wykonać: +

+
+numbers = list(range(1,11))
+for value in numbers[0::2]:
+	print(value)
+
+

1.8.3. Kopia listy

+

+ Często może zdarzyć się taka sytuacja, że chcemy zachować pierwotną + wersję listy, ale musimy użyć jej wartości do jakiś operacji, które mogą + naruszyć wartości jakiś jej elementów, w tym wypadku możemy stworzyć + kopię listy. +

+
+cars = ['audi', 'bmw', 'renault', 'honda']
+cars_bkp = cars[:]
+
+

1.9. Krotki

+

+ Może zdarzyć się potrzeba posiadania listy stałych, których wartość nie + może zmienić się przez cały cykl życia programu. Z taką listą jest już + lepiej w niż ze zwykłymi stałymi. Taką listę nazywa się + krotką. Definiowanie krotki, przypomina definiowanie + listy, jednak zamiast nawiasów kwadratowych, mamy zwykłe okrągłe. + Definicja wygląda w następujący sposób: +

+
+rgb = ('red', 'green', 'blue')
+print(rgb[0])
+print(rgb[1])
+print(rgb[2])
+
+

+ Dostęp do elementów krotki, jest identyczny jak do elementów listy, co + zostało zobrazowane powyżej. Teraz dla eksperymentu możemy spróbować + zmienić jeden z elementów krotki. +

+
+>>> rgb = ('red', 'green', 'blue')
+>>> rgb
+('red', 'green', 'blue')
+>>> rgb[0]='yellow'
+>>> Traceback (most recent call last):
+	File "", line 1, in 
+TypeError: 'tuple' object does not support item assignment
+
+

+ Iteracja przebiega tak samo jak na listach. Jedyną rzeczą jaką możemy + zrobić przy krotce aby zmodyfikować jej zawartość, jest jej nadpisanie. +

+
+rgb = ('red', 'green', 'blue')
+print(rgb[0])
+print(rgb[1])
+print(rgb[2])
+
+rgb = ('cyan', 'yellow', 'magenta', 'black')
+
+

+ Krotka zawierająca jedną wartość musi zawierać przecinek na końcu, + ponieważ dzięki niemu zmienna jest rozpoznawana jako krotka. +

+

1.10. Wyrażenia warunkowe

+

+ Każdy bardziej rozbudowany program będzie potrzebował instrukcji + decyzyjnej. Te instrukcje uruchamiają blok kodu na podstawie testów + warunkowych. Najprostszym z nich jest sprawdzenie równości. +

+
+>>> car = 'Audi'
+>>> car == 'audi'
+False
+
+

+ W powyższym przykładzie wyszedł na jaw bardzo ważny szczegół, Python jest + case-sensitive, rozróżnia wielkość liter. Dlatego warto przed + jakimkolwiek testami warunkowymi przeprowadzić normalizacje. +

+
+>>> car = 'Audi'
+>>> car.lower() == 'audi'
+True
+
+

+ Kolejnym testem jaki możemy przeprowadzić na wszystkich typach danych + jest sprawdzenie nierówności. +

+
+>>>  car = 'Audi'
+>>>  car.lower() != 'audi'
+False
+
+

+ Porównania mniejsze niż, mniejsze bądź równe, większe niż, większe bądź + równe, są testami wykonywanymi na liczbach. Nawet jeśli zestawimy sobie w + porównaniu dwa ciągi znaków, to Python porówna wartości z tablicy ASCII + pierwszych znaków i na podstawie tego zostanie zwrócona + wartość logiczna True lub False. +

+
+>>> age = 19
+>>> age > 21
+True
+>>> age >= 21
+True
+>>> age > 21
+False
+>>> age >= 21
+False
+car1 = 'audi'
+>>> car2 = 'bmw'
+>>> car1 > car2
+False
+>>> car2 > car1
+True
+>>> car2='Kamaz'
+>>> car1 > car2
+True
+
+

+ Czasami może być tak, że takie najzwyklejsze testy jak te przeprowadzone + powyżej nie wystarczą, aby instrukcja warunkowa uruchomiła blok kodu + potrzebne będzie sprawdzenie kilku połączonych ze sobą warunków do + łączenia ze sobą testów służą operatory logiczne. +

+
    +
  • and - operator służy do mnożenia wyników + pomniejszych wyrażeń logicznych, używany gdy wszystkie warunki muszą + zwrócić tę samą wartość logiczną.
  • +
  • or - operator służy do dodawania wyników + pomniejszych wyrażeń logicznych, używany gdy ocena końcowa testu + wynika z sum poszczególnych wyrażeń.
  • +
  • not - operator służy do negowania wyniku całego + wyrażenia. Negowanie polega na odwróceniu wartość, kiedy mamy + True to po zanegowaniu otrzymamy False i vice + versa.
  • +
+
+age = 19
+(age >= 13) and (age > 20)
+True
+
+

+ Słowa kluczowego in nie wykorzystujemy + tylko w pętli for, możemy również je wykorzystać do wyrażenia + warunkowego, w którym to możemy określić czy dana wartość znajduje się na + liście. +

+
+>>>  pojazdy = ['audi', 'bmw', 'Kamaz']
+>>> 'audi' in pojazdy
+True
+
+

+ Dodając słowo kluczowe not przed słowem + in możemy sprawdzić czy danej wartości nie ma na liście. +

+
+pojazdy = ['audi', 'bmw', 'Kamaz']
+'audi' not in pojazdy
+False
+
+

1.11. Konstrukcja if

+

+ Oczywiście do sterowania wykonaniem programu za pomocą testów warunkowych + służy + instrukcja if, które jest częścią dużej konstrukcji + warunkowej, składającej się z polecenia if, rozpoczynającego + całą konstrukcje i definiującego pierwszy test warunkowy, jeśli test + zwrócić wartość True zostanie wykonany blok kodu instrukcji + if. +

+
+if test_warunkowy:
+	#blok_kodu_instrukcji_if
+
+

+ A co jeśli test warunkowy zwróci wartość False, w tym wypadku + możemy poddać wykonanie programu jeszcze jednemu warunkowi za pomocą + instrukcji elif lub za pomocą ogólnego bloku + przeznaczonego dla tego przypadku - else. Powiedzmy, że + chcemy sprawdzić jeszcze jeden warunek. +

+
+if test_warunkowy:
+	#blok_kodu_instrukcji_if
+elif test_warunkowy2:
+	#blok_kodu_instrukcji_elif
+
+

+ Co jeśli oba warunki zawiodą to powinniśmy zdefiniować kod blok kodu dla + takiej sytuacji. Z racji tego iż można pominąć w Pythonie blok + else, ja zachęcam do jego stosowania. Autor książki + podaje że: +

+
+

+ Blok else jest wykorzystywany w sytuacji, gdy nie został spełniony + żaden warunek z warunków wcześniej zdefiniowanych za pomocą poleceń + if lub elif. Brak spełnienia warunku może wynikać z + podania nieprawidłowych danych lub danych o złośliwym działaniu. + Jeżeli istnieje konkretny, ostateczny warunek do sprawdzenia, rozważ + użycie bloku elif i całkowite pominięcie bloku else. + W ten sposób zyskasz absolutną pewność, że kod będzie wykonywany + jedynie po spełnieniu oczekiwanych warunków. +

+
+

+ Moim zdaniem blok domyślny przy nie spełnieniu żadnego warunku, daje nam + szanse na reakcje na nieprawidłowe dane wejściowe. Najprościej jeśli nie + spełniony został żaden warunek to kończymy działanie programu. +

+
+if test_warunkowy:
+	#blok_kodu_instrukcji_if
+elif test_warunkowy2:
+	#blok_kodu_instrukcji_elif
+else:
+	#blok_kodu_else
+
+

+ Przydatną rzeczą jaką możemy zrobić z poleceniem + if jest sprawdzenie przed rozpoczęciem + pracy z listą, czy lista aby nie jest pusta. +

+
+cars=[]
+
+if cars:
+	for value in cars:
+		print(value)
+else:
+	print("Lista jest pusta")
+
+

+ Jak widać powyżej, aby sprawdzić czy lista jest pusta w Pythonie + wystarczy podać jej nazwę w miejscu testu warunkowego. +

+

1.12. Słowniki

+

+ Słowniki przypominają trochę format JSON + zaimplementowany do języka programowania. Najprostszy słownik wygląda + tak: +

+
+miasto1 = { 'kraj': 'Polska', 'powierzchnia': 517.14, 'populacja': 1_790_658, }
+
+

+ Nie, przecinek na końcu nie jest błędem. Wskazuje tylko, że do słownika + mogą zostać wprowadzone nowe pary klucz-wartość. + Kluczem określamy wartość występującą w słowniku, + zawsze ujętą w apostrofy lub cudzysłowie, z dwukropkiem na końcu, dzięki + kluczowi będziemy odwoływać się do wartości pary. Dostęp do dowolnej + wartości słownika: +

+
+miasto1 = { 'kraj': 'Polska', 'powierzchnia': 517.14, 'populacja': 1_790_658, }
+print(miasto1['powierzchnia'])
+
+

+ Kiedy chcemy uzyskać dostęp do konkretnej wartości to przy słowniku, + klucz zapisujemy w nawiasie kwadratowym. Analogicznie do tablic + asocjacyjnych w innych językach programowania. +

+

+ Pusty słownik definiujemy podobnie jak pustą listę tylko + inne są znaki. +

+
+empty_dict={}
+
+

+ Jeśli chcemy zmodyfikować wartość z jakieś pary, to tak + samo jak w przypadku list, tylko że klucz zapisujemy w miejscu indeksu. +

+
+miasto1['kraj'] = 'Polska'
+
+

+ Kiedy jakieś dane w słowniku staną nam się zbędne, możemy je usunąć przy + pomocy polecenia del. +

+
+del miasto1['populacja']
+
+

1.12.1. Dodawanie nowych wartości do słownika

+

+ Dodawanie nowych par klucz-wartość jest analogiczne do modyfikacji. Jeśli + będzie modyfikować wartość pod kluczem, który nie istnieje w słowniku to + zostanie ona dodana jako nowa para. +

+

+ Co jeśli podczas pracy z słownikiem odwołamy się do klucza, który nie + istnieje? Python zwróci błąd. +

+
+>>> print(miasto1['gestosc'])
+Traceback (most recent call last):
+	File "", line 1, in 
+KeyError: 'gestosc'
+
+

+ Python daje możliwość użycia specjalnej metody + get(), która jest wstanie zwrócić + wartość podanego jako argument klucza, lub też zdefiniowanego jako + kolejny argument komunikatu, w momencie kiedy dany klucz nie istnieje. + Komunikat nie jest wymagany w przypadku jego braku nie zostanie nam nic + zwrócone. Metoda get() nadaje się jako test czy dany klucz + istnieje. +

+
+if miasto1.get('gestosc'):
+	#Gęstość istnieje, zrób to i to
+else:
+	#Gęstość nie istnieje, zrób to i to
+
+

1.12.2. Iteracja przez słownik

+

+ Iteracji przez słownik w sumie są trzy rodzaje: przez pary, przez klucze + i przez wartości. Przez pary, będzie prawdopodobnie najpopularniejszą z + wszystkich rodzajów. +

+
+miasto1 = { 'kraj': 'Polska', 'powierzchnia': 517.14, 'populacja': 1_790_658, }
+
+for key,value in miasto1.items():
+	print(f"Klucz: {key}")
+	print(f"Wartość: {value}\n")
+
+

+ Metoda items() w dużym skrócie rozbije + na dwie listy wszystkie klucze i wszystkie wartości, i to na nich pętla + for w pamięci będzie przeprowadzać iteracje. +

+

1.12.2.1. Iteracja przez klucze i wartości.

+

+ Iteracja przez klucze, zadziała na podobnej zasadzie co przez parę jednak + do iteracji wykorzystuje się tylko jedną listę, listę z kluczami. + Analogicznie z iteracją przez wartości tylko że listę z wartościami. +

+
+miasto1 = { 'kraj': 'Polska', 'powierzchnia': 517.14, 'populacja': 1_790_658, }
+
+for key in miasto1.keys():
+	print(f"Klucz: {key}\n")
+
+for value in miasto1.values():
+	print(f"Wartość: {value}\n")
+
+

+ Metody keys() i + values() tworzą listy, dlatego też + możemy przeprowadzić na nich iterację z wykorzystaniem pętli for + oraz in. +

+

+ W wydaniach Pythona począwszy od 3.7, słownik zachowuje kolejność, w + której były dodawane pary. Podczas pracy z słownikiem jego domyślną + uporządkowaniem jest kolejność dodawania par. +

+

+ Listę kluczy możemy obudować funkcją sorted() aby je + uporządkować. +

+

1.13. Zbiory

+

+ Klucze muszą być unikatowe, aby wartości się na siebie nie nakładały. Ale + wśród wartości już takich wymagań nie ma. Python udostępnia funkcję + set(), która na podstawie przekazanej listy tworzy zbiór + z unikatowych elementów. Zbiór jest składniowo bardzo podobny do + słownika, jednak zawiera sam wartości, nie zawiera on żadnych danych + porządkowych. +

+
+jezyki = {'python', 'ruby', 'c', 'python'}
+>>> jezyki
+{'python', 'ruby', 'c'}
+
+

+ Sposobem na to aby uzyskać dostęp do danych zapisanych na zbiorze jest + iteracja lub konwersja na listę za pomocą funkcji sorted(). + Należy pamiętać aby zapisać gdzieś listę zwróconą przez sorted() +

+

1.14. Zagnieżdznie złożonych typów danych

+

+ Przedstawienie słowników umożliwia zaprezentowanie + zagnieżdżania. Pozwala ono na umieszczenie jednego + złożonego typu w drugim, możemy stworzyć między innymi + listę słowników, listę w słowniku czy też słownik w słowniku. Listę + słowników najlepiej rozpocząć od pustej listy, następnie czy to w skutek + iteracji czy danych napływających do programu tworzyć nowy słownik i + załadować go do listy za pomocą metody append(). Trochę + eksperymentując zauważyłem ciekawą rzecz, mianowicie kiedy stworzyłem + sobie model słownika powyżej iteracji, i chciałem odpowiednio według + testów warunkowych modyfikować wartości modelu, to na listę trafiała + tylko pierwsza aktualizacja przez całą iterację. Dostęp do danych + zagnieżdżonych wygląda trochę jak tablice wielowymiarowe. + W zależności od tego czy jest to lista słowników, to na początku podajemy + indeks a później klucz, w przypadku zagnieżdżenia listy w słowniku, + sytuacja jest odwrotna. +

+

+ Ostatnim przypadkiem jest słownik w słowniku, tu podajemy klucz - klucz. + Do operacji na zagnieżdżeniach warto wykorzystać metody stosowane do + iteracji na słownikach. Ważną rzeczą stosowaną przy zagnieżdżeniach jest + ich jak największe ograniczenie, jeśli algorytm zakłada większe + zagnieżdżenie niż powyżej jednego poziomu (tj. każdy klucz zawiera + pojedynczą listę lub każdy element listy zawiera słownik bez zagnieżdżeń), + to oznacza że ma on poważne wady konstrukcyjne i na pewno jest jakiś + lepszy sposób na rozwiązanie tego problemu. +

+

1.15. Pobieranie danych od użytkownika.

+

+ Pobieranie danych od użytkowników jest realizowane dzięki funkcji + input(). Funkcja ta jako argument + przyjmuje, komunikat zachęcający użytkownika do wpisania danych tzw. + znak zachęty. Dane wpisane przez użytkownika są zwracane w postaci ciągu + tekstowego. +

+

+ Jeśli musimy pobrać od użytkownika dane do obliczeń, to wartością + zwracaną przez funkcje input() jest ciąg tekstowy. W tym wypadku + musimy dokonać konwersji na typ całkowity. Odpowiada za to funkcja + int(), której wartością zwracaną jest + liczba całkowita, a argumentem dowolna wartość przypominająca liczbę, + która ma zostać skonwertowana ja postać liczby całkowitej. Do obliczeń + nie zawsze będziemy potrzebowali wartości całkowitej. Może zdarzyć się, + że będziemy potrzebować wartości zmiennoprzecinkowej, aby uzyskać wartość + w postaci liczby zmiennoprzecinkowej należy użyć funkcji + float(). Te konwersje można odwrócić + uzyskując ciąg tekstowy z liczb za pomocą funkcji + str(). +

+
+>>> age = input("Ile masz lat?")
+Ile masz lat? 12
+>>> age
+'12'
+>>> age = int(age)
+>>> age
+12
+>>> age >= 18
+False
+
+

+ Konwersje można skrócić do jednej linii, obudowując funkcję + input() funkcją funkcją + int(). +

+
+age = int(input("Ile masz lat? "))
+Ile masz lat? 18
+>>> age
+18
+>>> age >= 18
+True
+
+

1.16. Operator modulo (reszty z dzielenia).

+

+ Przydatną rzeczą jeśli chodzi o obliczenia liczbowe wykorzystywane w + programowaniu napewno jest operator modulo (%). + Przyjmuje dwa operandy (dzielną i dzielnik), zwraca resztę z dzielenia + dzielnej przez dzielnik. Najprostszym przykładem użycia operatora modulo + (%) jest sprawdzenie czy dana wartość jest parzysta czy + też nie. +

+
+if number % 2 == 0:
+	print(f"{number} jest liczbą parzystą.")
+else:
+	print(f"{number} nie jest liczbą parzystą.")
+
+

1.17. Pętla while.

+

+ Jeśli potrzebujemy pętli która działa do pewnego momentu, np. dopóki dana + zmienna ma wartość taką a taką, to wtedy musimy skorzystać z pętli + while. Pętla ta działa dopóty, dopóki warunek + umieszczony obok słowa kluczowego while + będzie zwracał wartość True. Pętla while nie posiada + wbudowanego licznika, dlatego takowy licznik musimy sobie zbudować sami. +

+
+number=1
+while number >= 10:
+	if number % 2 == 0:
+		print(f"{number} jest parzysta.")
+  else:
+		print(f"{number} nie jest parzysta.")
+  number += 1
+
+

+ Wynik działania powyższego przykładu: +

+
+1 nie jest parzysta.
+2 jest parzysta.
+3 nie jest parzysta.
+4 jest parzysta.
+5 nie jest parzysta.
+6 jest parzysta.
+7 nie jest parzysta.
+8 jest parzysta.
+9 nie jest parzysta.
+10 jest parzysta.
+
+

+ Zmienna number przybrała w tym przykładzie rolę danych, na których + operujemy oraz licznika. +

+

+ Czasami może zajść potrzeba aby kontrolować wykonanie programu za pomocą + pętli while. Powiedzmy że mamy aplikacje, która wyświetla nam + listę opcji, następnie prosi nas jej wybór, wybieramy jedną z opcji, + następnie po wykonaniu czynności dedykowanych dla tych opcji wracamy do + menu, gdzie znów możemy wybrać jedną z opcji lub zakończyć program. + Konstrukcja takie aplikacji może opierać się na pętli while, + której warunek zwraca wartość True, kiedy wybieramy opcje + "Exit/Wyjście", no właśnie co się dzieje? Możliwości są trzy. +

+
    +
  • Możliwość 1: Wybór konkretnej opcji przypisuje do zmiennej określoną + wartość, pętla wykonuje się dopóty, dopóki wyżej wymieniona zmienna + jest nie równa wartości przypisywanej po wyborze opcji + "Exit/Wyjście".
  • +
  • Możliwość 2: Przed rozpoczęciem pętli deklarowana zmienna tzw. flaga, + której przypisywana jest wartość True. Pętla wykonuje się do + momentu gdy wartość wartość flagi jest równa True. Wybranie + opcji "Exit/Wyjście", zmienia wartość flagi na False, co + powoduje nie spełnienie warunku, czego następstwem jest przerwanie + pracy pętli.
  • +
  • Możliwość 3: Kod zdefiniowany pod opcją "Exit/Wyjście" zawiera tylko + jedną instrukcję słowo kluczowe + break. Instrukcja ta + powoduje zatrzymanie wykonania bloku kodu i przejście wykonania na + pierwszą instrukcję po bloku kodu pętli.
  • +
+

+ Istotną rzeczą dla każdej iteracji jest możliwość jej zrestartowania, + kiedy gdzieś w kodzie pętli zostanie umieszczone słowo kluczowe + continue, spowoduje powrót do + sprawdzenia warunku a następnie wykonania bloku pętli od początku. To + polecenie przydatne może być gdy chcemy pominąć jakieś elementy +

+

+ Przy pracy z pętlami while warto pamiętać o prawidłowym warunku, zmianie + licznika czy o zakończeniu pętli w odpowiednim momencie. Patrząc na pętle, + o której mówiłem akapit wcześniej, odnośnie sterowania programem to są to + pętle, które bez odpowiednich mechanizmów zatrzymujących będą wykonywać + się w nieskończoność. Warunek nie zawiera licznika. Zmienna w teście + warunkowym bez mechanizmów stopujących nie zmieni swojej wartości. + Chociaż i w pętlach while opartych na licznikach też łatwo o + nieskończoną pętle. Wystarczy zapomnieć zmienić licznik na końcu bloku. +

+

+ Pętla while również nadaje się do pracy z listami czy słownikami, + jedną taką ciekawą rzeczą jeśli chodzi o listy jest taki mechanizm, że + jeśli umieścimy w warunku pętli nazwę listy, to pętla będzie wykonywać + się dopóki na tej liście będą jakieś elementy, mechanizmem kontroli tutaj + będzie pobieranie elementów listy za pomocą metody pop(). Jak w + każdym innym teście warunkowym w warunku pętli while również + istnieje możliwość użycia operatora in +

+

1.18. Funkcje

+

+ Funkcje służą do przygotowania bloku kodu , który możemy + później wykorzystać wielokrotnie w części głównej programu. Funkcje + ułatwiają zarządzanie kodem, testowanie oraz ewentualne debugowanie z + racji tego, iż jest to wydzielony fragment kodu, który możemy wykonywać + niezależnie od pozostałej części programu. +

+

1.18.1. Definiowanie funkcji

+

+ Definiowane funkcji rozpoczynamy od słowa kluczowego + def następnie podajemy nazwę funkcji po + nazwie umieszczamy bez spacji + parę nawiasów okrągłych po nawiasach oczywiście występuje dwukropek. + W nowej linii od pojedynczego tabulatora rozpoczynamy blok kodu funkcji. +

+

1.18.1.1 Komentarze w funkcji

+

+ Komentarze w funkcji umieszcza się jako tzw. docstring, + którego zadaniem jest opis działania funkcji. Wszystko co zostało ujęte + pomiędzy parą potrójnych cudzysłowów ("""...""") jest + traktowane jako docstring. +

+
+def hello_user():
+	"""To jest funkcja, która wita użytkownika"""
+
+

+ Docstring wykorzystywany jest przez Python do tworzenia opisów + funkcji podczas generowania dokumentacji dla poszczególnych projektów. +

+

1.18.1.2. Parametry funkcji

+

+ Bardziej zaawansowane funkcje, które mają nieco więcej czynności niż + wypisane "Witaj świecie!", zazwyczaj potrzebują jakiś danych z zewnątrz. + Dane, parametry funkcji deklarujemy w nawiasie zaraz + obok nazwy funkcji, w ten sposób zaznaczamy że nasza funkcją będzie + wymagać jakiś informacji do działania. +

+
+def hello_user(username):
+	"""To jest funkcja, która wita użytkownika"""
+	print(f"Witaj, {username}!")
+
+

+ Prawdziwe dane przekazujemy w momencie wywołania funkcji w części głównej. + Wywołanie funkcji jest realizowane poprzez podanie jej + nazwy w raz parą nawiasów okrągłych, w których w zależności od definicji + umieszczamy dane niezbędne do jej wykonania. Oczywiście jeśli funkcja nie + potrzebuje żadnych danych, para nawiasów pozostaje pusta. +

+
+uname = 'xf0r3m'
+hello_user(uname)
+
+

1.18.1.3. Argumenty pozycjne

+

+ Zmienne lub też dane umieszczone w wywołaniu funkcji nazywamy + argumentami. Argumenty może przekazać do funkcji na dwa + różne sposoby. Pierwszy sposób to sposób klasyczny, sposób + argumentów pozycyjnych, opera się on kolejności. + W jakiej kolejności parametry zostały podane w definicji funkcji, to w + takiej samej kolejności należy przekazać do funkcji argumenty. +

+
+def func1(para1, para2, para3):
+	print(f"{para1} {para2} {para3}")
+
+func1('Ala', 'ma', 'kota')
+# Ala ma kota
+
+

+ Python nie zwróci błędu jeśli pomylimy kolejność. Ale wynik działania + funkcji może być nieoczekiwany. +

+
+def func1(para1, para2, para3):
+	print(f"{para1} {para2} {para3}")
+	#arg1=param3, arg2=param2 arg3=param1
+
+func1('kota', 'ma', 'Ala')
+# kota ma Ala
+
+

1.18.1.4. Argumenty w postaci słów kluczowych

+

+ Drugą metodą jest przekazywanie argumentów w postaci słów kluczowych. + Opiera się ona zasadzie par "nazwa=wartość", w tym przypadku + "parametr=argument". Tutaj kolejność nie ma znaczenia. Ponieważ już + podczas wywołania przypisujemy parametrowi wartość argumentu. +

+
+def func1(para1, para2, para3):
+	print(f"{para1} {para2} {para3}")
+
+func1(para3='kota', para1='Ala', para2='ma')
+# Ala ma kota
+
+

+ Może zdarzyć się że musimy przygotować funkcję dla typowych, ciągle + powtarzających się danych, które mogli byśmy podać już podczas definicji + funkcji. A jeśli zajdzie taka potrzeba będziemy mogli nadpisać + wartość domyślną parametrów funkcji dla innych danych. +

+
+def func1(para3, para1='Ala', para2='ma'):
+	print(f"{para1} {para2} {para3}"
+
+func1('psa')
+# Ala ma psa
+func1('kota')
+# Ala ma kota
+func1('nierówno pod sufitem')
+# Ala ma nierówno pod sufitem
+
+func1('w LoL-a', 'Tola', 'gra')
+# Tola gra w LoL-a
+
+

+ Jak można zauważyć parametry w definicji funkcji zmieniły kolejność, jest + wymagane przez Python, aby parametry, które będą przekazywane jako + argumenty pozycyjne zawsze były na pierwszym miejscu i tak też należy + przekazywać argumenty. +

+

1.18.1.5. Zwracanie wartości przez funkcje

+

+ Funkcje często są wykorzystywane do obliczeń. Niestety co nam po + obliczonych wartościach kiedy pozostają one w bloku kodu funkcji. Możemy + oczywiście zwrócić wartość uzyskaną przez funkcje. Służy do tego słowo + kluczowe return. +

+
+def pitagoras_need_c_square(a,b):
+	return (a**2 + b**2)
+
+c_square = pitagoras_need_c_square(3,4)
+print(c_square)
+# 25
+
+

+ Jak widać przy zwrocie wartości wywołanie funkcji musimy przypisać do + zmiennej. +

+

1.18.2. Przekazywanie do funkcji złożonych typów dancyh

+

+ Do funkcji możemy przekazać nie tylko pojedyncze dane oraz zmienne, ale + również całe listy i składniowo nie rożni się to przekazania pojedynczych + danych. +

+
+def iteration_via_list(l):
+	for list_element in l:
+		print(f"{list_element}")
+
+

+ Warto zaznaczyć, że tak jak przekazujemy zmienne, to przekazujemy ich + wartość. W przypadku listy prawdopodobnie zamiast wartość przekazywane + jest miejsce w pamięci rozpoczęcia listy, przez to lista zdefiniowana w + głównej części programu może zostać przez tą funkcję zmodyfikowana. + Istnieje technika dzięki, której możemy się przed tym uchronić, możemy + przekazać kopię listy (wycinek od pierwszego do ostatniego elementu). +

+
+received_cars = ['audi', 'bmw', 'toyota', 'subaru'];
+repaired_cars = [];
+
+def repair_car(rcev_cars, rep_cars):
+
+	while rcev_cars:
+		repaired_car = rcev_cars.pop()
+		print(f"Naprawiam: {repaired_car}")
+		rep_cars.append(repaired_car)
+
+def print_raport(rcev_cars, rep_cars):
+	print("Otrzymano następujące samochody: ")
+	for rcev_car in rcev_cars:
+		print(f"\t - {rcev_car}")
+
+	print("\nNaprawiono następujące samochody: ")
+	for rep_car in rep_cars:
+		print(f"\t - {rep_car}")
+
+repair_car(received_cars[:], repaired_cars)
+repaired_cars.reverse()
+print_raport(received_cars, repaired_cars)
+
+

+ O ile nie istnieje żaden ważny powód należy przekazywać funkcjom + prawdziwą listę, użycie kopii może być mniej efektywne oraz zajmować + więcej pamięci. +

+

1.18.3. Przekazywanie nieokreślonej liczy argumentów

+

+ Podczas prac z kodem możemy spotkać się z takim problemem że nie będziemy + potrafili przewidzieć ile może być potrzebnych argumentów. W Pythonie + możliwe jest przekazanie dla parametru dowolnej liczby argumentów. Taki + parametr definiuje się z gwiazdka (*) przed nazwą. + Przekazanie kilku argumentów pod ten parametr powoduje utworzenie krotki + z tymi argumentami, przez które możemy normalnie iterować. +

+
+def make_pizza(*toppings):
+    print("Tworze pizzę: ")
+    for toping in topings:
+        print(f"\tDodaję: {topping}")
+
+make_pizza('ser', 'szynka', 'pieczarki')
+
+

+ Nic nie stoi na przeszkodzie aby użyć np. argumenty pozycyjnego wraz z + krotką argumentów. Należy oczywiście pamiętać o + kolejności. Python zwróci błąd ponieważ za parametrem tego typu nie + powinny znajdować się już żadne inne parametry. +

+

+ Istnieje również metoda, która umożliwi przekazanie wielu argumentów jako + słów kluczowych. Podobnie do powyższego przypadku wykorzystane są + gwiazdki (**), dwie a nie jedna. Po przekazaniu par + nazwa-wartość w funkcji zostanie utworzony słownik. +

+
+def make_car(make, model, **car):
+    car2={}
+    car2['make'] = make.title()
+    car2['model'] = model.title()
+
+    for k,v in car.items():
+        car2[k]=v
+
+    return car2
+
+car = make_car('subaru', 'outback', color='blue', towPackage=True)
+
+print(car)
+
+

+ Ten przykład jest nieco bardziej skomplikowany. Przy korzystaniu z + przekazywania wielu argumentów za pomocą słów kluczowych należy pamiętać + o tym że dane w słowniku są ułożone według kolejności dodawania + danych do słownika (Ta + zależność pojawiła się dopiero od Pythona >=3.7). W tym + przypadku dane do słownika przekazane przez '**car' trafiają + jeszcze przed przejściem do wykonywania kodu funkcji. Dlatego jeśli + chcemy mieszać argumenty jak na powyższym przykładzie, należy o tym + pamiętać. Poprzez utworzenie nowego słownika i na początku dodanie + argumentów pozycyjnych następnie przepisanie danych ze słownika + car do słownika + car2 danych dodanych jako wielu + argumentów słów kluczowych. W ten sposób uzyskaliśmy słownik o kolejności + identycznej jak argumenty podane w funkcji. +

+

1.19. Moduły

+

+ W Pythonie w prosty sposób możemy utworzyć tzw. moduły w + innych językach możemy nazwać je np. plikami nagłówkowymi. Tworzymy je + poprzez utworzenie oddzielnego pliku i wpisanie tam wszystkich funkcji. + Kiedy mamy funkcje w oddzielnym pliku pozostaje je tylko zaimportować. + Poniżej znajdują się metody importu, wraz z przykładem użycia funkcji z + zaimportowanego modułu. +

+
+#import sandwich
+#sandwich.make_sandwich('pszenne', 'szynka', 'ser', 'ketchup')
+
+#from sandwich import make_sandwich
+#make_sandwich('pszenne', 'szynka', 'ser', 'ketchup')
+
+#from sandwich import make_sandwich as fn
+#fn('pszenne', 'szynka', 'ser', 'ketchup')
+
+#import sandwich as mn
+#mn.make_sandwich('pszenne', 'szynka', 'ser', 'ketchup')
+
+#from sandwich import *
+#make_sandwich('pszenne', 'szynka', 'ser', 'ketchup')
+
+

+ Możemy używać słowa kluczowego import + do zaimportowania całego modułu, lub zaimportować konkretną funkcję z + danego modułu poprzez kombinacje słów kluczowych + from oraz import. Gdzie po + słowie from podajemy nazwę modułu, po słowie import + podajemy nazwę funkcji. Ciekawą techniką jest tworzenie + aliasów dla zaimportowanych modułów lub funkcji. Po + nazwie modułu lub funkcji oraz po słowie kluczomym + as podajemy alias czyli taką nazwę + zastępczą lub pseudonim. Tworzenie aliasów przydaje się gdy np. mamy + podejrzenie, że funkcja w module ma taką samą nazwę jak funkcja w + głównej części programu. Linia przed ostatnia z powyższego przykładu + mogą wydawać się równoznaczne, ale ostatnii przykład pokazuje nam w + jaki sposób możemy zaimportować funkcje z modułu. Ta czynność pozwala + na pominięcie prefixu nazwy modułu +

+

1.20. Programowanie zorientowane obiektowo

+

+ Programowanie zorientowane obiektowo jest metodą, + która pozwala programistom przedstawiać przy użyciu komputera rzeczy + znane nam z realnego świata. Weźmy takiego człowieka. Człowiek jest + obiektem zarówno w znanym nam świecie, jak i również + może zostać przedstawiony jako obiekt w świecie wirtualnym. Jeśli + człowiek staje się obiektem w ujęciu programistycznym, to jego cechy + szczególne stają się właściwościami/atrybutami obiektu. + Czynności jakie wykonuje mogą być metodami. +

+

+ Człowiek jest przedstawicielem gatunku. Gatunku ludzkiego. Obiekty są + również przedstawicielami gatunku jaki sobie zdefiniujemy. Tym + gatunkiem są klasy. +

+

+ Definicje klasy rozpoczynamy od słowa kluczowego + class następnie podajemy + nazwę tej klasy oraz zaraz obok nazwy bez spacji parę nawiasów + okrągłych oraz dwukropek. W następnej linii po jednym znaku tabulacji + możemy rozpoczynać definicję klasy. Klasa z poziomu kodu źródłowego + składa się głównie z funkcji, które tutaj nazywają się metodami. + Pierwszą definiowaną metodą jest metoda + __init__. Uwaga, przy + zapisie tej nazwy należy uważać na to, że jest ona obudowana dwoma + znaki podkreślenia (__). Ta metoda jest metodą + specjalną, ma za zadanie zainicjować właściwości zapisane w jej bloku. + Te atrybuty będą atrybutami obiektu. Argumenty dla tej metody są + przekazywane podczas tworzenia egzemplarza klasy, czyli obiektu. +

+
+class User():
+    def __init__(self,firstname,lastname,age,sex):
+        self.firstname = firstname
+        self.lastname = lastname
+        self.age = age
+        self.sex = sex
+
+

+ Parametr self jest obiektem, który + będzie tworzony na podstawie tej klasy. Słowo kluczowe self + będzie oznaczać po prostu obiekt tej klasy. To atrybutowi obiektu tej + klasy w metodzie __init__ nadajemy wartość parametru + firstname. Z racji tego że obiekt jest + egzemplarzem klasy stąd słowo self (samemu sobie). +

+

1.20.1. Objekt

+

+ Egzemplarz klasy (obiekt) tworzymy nadając zmiennej wartości w postaci + wywołania zdefiniowanej wcześniej klasy. +

+
+user1 = User('Jan', 'Nowak', '47', 'M')
+
+

+ Argumentami przekazywanymi klasie są tak naprawę argumenty dla metody + __init__, ponieważ to ona jest uruchamiana podczas tworzenia + obiektu. Argument self jest przekazywany automatycznie. +

+

+ Powiedzmy że mamy utworzy obiekt 'user1'. Dostęp do jego właściwości + uzyskujemy dzięki notacji kropki (.). +

+
+print(f"Witaj {user1.firstname} {user1.lastname}")
+# >>> Witaj Jan Nowak
+
+

1.20.2. Metody

+

+ Mamy już cechy szczególne, to teraz pora na czynności jakie ten obiekt + może wykonać. Do opisu czynności obiektu wykorzystuje się metody, czyli + funkcje w kontekście obiektowym. Z pierwszą metodą mieliśmy już do + czynienia przy okazji metody __init__, może jest ona nieco + przezroczysta, jednak to nadal metoda. W poniższym przykładzie stworzymy + sobie metodę, która opisze nam tego użytkownika, bo na razie właściwości + to suche dane. +

+
+def describe_user(self):
+    print(f"Imie i nazwisko: {self.firstname} {self.lastname}")
+    print(f"\t-wiek: {self.age}\n\t-płeć: {self.sex}")
+
+

+ Metoda tym różni się od funkcji, że znajduje się wewnątrz klasy oraz tym, + że zawsze ma parametr self, który pozwala jej na dostęp do + właściwości obiektu. Metody wywołujemy prawie przez cały czas pod czas + zabawy Pythonem, więc wywołanie metody naszej klasy nie powinno być + problemem. +

+
+user1.describe_user()
+
+

1.20.3. Praca z atrybutami obiektów.

+

+ Właściwości/atrybuty obiektu nie muszą być zawsze przekazywane przez + użytkownika podczas tworzenia obiektu mogą przyjmować + wartości domyślne w zdefiniowane wewnątrz + metody __init__. +

+
+class User():
+    def __init__(self, firstname, lastname, age, sex):
+        self.firstname = firstname
+        self.lastname = lastname
+        self.age = age
+        self.sex = sex
+        self.rank = 'Junior user'
+
+

+ Wraz z biegiem programu opartego na obiektach ich właściwości mogą, + czasami wręcz muszą się zmienić. W Pythonie możemy to zrealizować na trzy + sposoby. +

+
    +
  • Sposób 1: Zmiana bezpośrednia. Po prostu bierzemy + obiekt następnie za pomocą notacji kropki uzyskujemy + dostęp + do właściwości i za pomocą operatora przypisania (=) + nadajemy atrybutowi nową wartość. Ta technika generalnie nie jest + polecana.
  • +
  • Sposób 2: Nowa metoda przeznaczona do aktualizowania + wartości poszczególnych właściwości. Tworzymy metodę w parametrem + self oraz z parametrem, który będzie przechowywał nową + wartość metody, w bloku w metody do atrybutów uzyskujemy dostęp + poprzez parametr self oraz notację kropki i nadajemy mu nową + wartość parametru, która ma zostać przekazana w postaci argumentu z + głównej części programu.
  • +
  • Sposób 3: Nowa metoda inkrementująca lub + dekrementując wartość właściwość. Ta metoda od tej ze sposobu nr. 2 + różni się w zasadzie tylko znakiem w tym wypadku jest to + += a nie =. Wartość o jaką będziemy + zmieniać naszą właściwość również podajemy w postaci parametru. + Oczywiście może to zależeć od metody.
  • +
+

+ Sposób 1: +

+
+user1.rank = 'Standard user'
+
+

+ Sposób 2: +

+
+class User():
+    def __init__(self, firstname, lastname, age, sex):
+        self.firstname = firstname
+        self.lastname = lastname
+        self.age = age
+        self.sex = sex
+        self.rank = 'Junior user'
+
+    def promote_user(self, new_rank):
+        self.rank = new_rank
+
+user1 = User('Jan', 'Nowak', '47', 'M')
+user1.promote_user('Standard user')
+
+

+ Sposób 3: +

+
+class User():
+    def __init__(self, firstname, lastname, age, sex):
+        self.firstname = firstname
+        self.lastname = lastname
+        self.age = age
+        self.sex = sex
+        self.rank = 'Junior user'
+
+    def promote_user(self, new_rank):
+        self.rank = new_rank
+
+    def happy_birthday(self):
+        print(f"Happy Birthday {self.firstname.title()}")
+        self.age += 1
+
+user1 = User('Jan', 'Nowak', '47', 'M')
+user1.promote_user('Standard user')
+user1.happy_birthday()
+
+

1.20.4. Dziedziczenie

+

+ Mamy sobie naszych użytkowników. Jednak potrzebujemy specjalnego + użytkownika, który będzie tym wszystkim zarządzał - Administratora. Problem + napotykamy wtedy kiedy chcemy zdefiniować jakieś ekstra metody dla admina, + ale nie chcemy umieszczać ich w tej samej klasie do definiowania + użytkowników, musimy również pamiętać, że admin to też użytkownik, i + wypadało by mieć w bazie jego dane. Przekopiowanie kodu jest nieefektywne, + ale z pomocą przechodzi na dziedziczenie, czyli tworzenie + klas potomnych na podstawie istniejącej już klasy. +

+

+ Przy tworzeniu klas potomnych warto pamiętać o jednej rzeczy. Klasa potomna + jest to oddzielna klasa zawierająca połączenie z klasą nadrzędną. + Klasy potomne mogą inicjować dla swoich obiektów właściwość klasy + nadrzędnej oraz obiekty klas potomnych mogą korzystać z metod klasy + nadrzędnej. Definicja takiej klasy wygląda następująco. +

+
+class User():
+    def __init__(self, firstname, lastname, age, sex):
+        self.firstname = firstname
+        self.lastname = lastname
+        self.age = age
+        self.sex = sex
+        self.rank = 'Junior user'
+        self.quota = 100_000_000
+
+    def promote_user(self, new_rank):
+        self.rank = new_rank
+
+    def happy_birthday(self):
+        print(f"Happy Birthday {self.firstname.title()}")
+        self.age += 1
+
+    def check_quota_type(self):
+        if self.quota < 0:
+            print('Unlimited')
+        else:
+            print('100MB')
+
+class Admin(User):
+    def __init__(self, firstname, lastname, age, sex):
+        super().__init__(firstname, lastname, age, sex)
+        self.quota = -1
+        self.rank = 'Admin'
+
+    def ban_user(self, username):
+        print(f'Użytkownik {username} został zbanowany')
+
+

+ Cechami po których można poznać że dana klasa jest klasą potomną, jest to, + że w parametrach klasy znajduje się nazwa klasy nadrzędnej. W metodzie + __init__ występuje metoda + super(), której celem jest realizowanie + połączenia pomiędzy klasą potomną a klasą nadrzędną. Użycie metody + super() zależy od konstrukcji klasy nadrzędnej. Utworzenie + takiego obiektu różni się tylko nazwą klasy. +

+
+root = Admin('Jan' 'Kowalski', 25, 'M')
+root.happy_birthday()
+# Happy Birthday Jan
+root.check_quota_type()
+# Unlimited
+
+

+ Atrybuty mogą przechowywać wiele rzeczy, od pojedynczych wartość po + obiekty innych klas. Istnieje możliwość wewnątrz klasy + przekazać atrybutowi jako wartość egzemplarz obiektu. Rozważmy to że + musimy każdemu z naszych użytkowników zdefiniować uprawnienia, co im + wolno, a co nie. Możemy spojrzeć na zestaw uprawnień jak na obiekt. +

+
+class User():
+    def __init__(self, firstname, lastname, age, sex):
+        self.firstname = firstname
+        self.lastname = lastname
+        self.age = age
+        self.sex = sex
+        self.rank = 'Junior user'
+        self.quota = 100_000_000
+        self.permissions = Permissions('User')
+
+    def promote_user(self, new_rank):
+        self.rank = new_rank
+
+    def happy_birthday(self):
+        print(f"Happy Birthday {self.firstname.title()}")
+        self.age += 1
+
+    def check_quota_type(self):
+        if self.quota > 0:
+            print('Unlimited')
+        else:
+            print('100MB')
+
+class Permissions():
+    def __init__(self, user_type):
+        if user_type == 'Administrator':
+           self.permissions = ['może dodać post',
+               'może usunac post',
+               'może zbanować użytkownika']
+        else:
+           self.permissions = ['może dodać post', 'może usunać post']
+
+    def show_permissions(self):
+        for permission in self.permissions:
+            print(f"- {permission}")
+
+
+class Admin(User):
+    def __init__(self, firstname, lastname, age, sex):
+        super().__init__(firstname, lastname, age, sex)
+        self.quota = -1
+        self.rank = 'Admin'
+        self.permissions = Permissions('Administrator')
+
+    def ban_user(self, username):
+        print(f'Użytkownik {username} został zbanowany')
+
+root = Admin('Jacek', 'xf0r3m', 25, 'M')
+root.permissions.show_permissions()
+print('\n')
+user1 = User('Jan', 'Nowak', 47, 'M')
+user1.permissions.show_permissions()
+
+

+ W powyższym przykładzie pokazano jak można użyć obiektu jako wartości + atrybutu innego obiektu oraz jak uzyskać dostęp do metod takiego obiektu. + root jest obiektem w klasie + Admin, następnie po kropce podajemy + nazwę atrybutu w tym przypadku jest + permissions, aby po następnej kropce + (z racji tego że wartość permissions to + też obiekt) podajemy nazwę metody + show_permissions() i w ten sposób + uzyskaliśmy dostęp do zdefiniowanych w innym obiekcie uprawnień + przypisanych do obiektów użytkowników jako atrybuty. +

+

+ Klasy podobnie jak funkcje też można umieszczać w modułach, klasy + umieszcza się w modułach w identyczny sposób jak funkcje. Identycznie też + się je importuje. Kilka akapitów wyżej jest opis jak to zrobić. +

+

1.21. Biblioteka standardowa

+

+ Wiele modułów zwierających pomocne klasy oraz funkcje jest dostarczanych + wraz z Python jako standardowe biblioteki. Wśród nich możemy znaleźć taki + moduł jak random, który zawiera funkcje + służące do generowania liczb pseudolosowych - + randint() oraz np. + choice(), która zwraca nam losowo + wybraną wartość z listy lub krotki. +

+
+>>> from random import choice
+>>> cars = ['Shelby Cobra', 'Chevy', 'Pontiac', 'Dodge', 'Mustang']
+>>> today_car = choice(cars)
+>>> today_car
+'Dodge'
+
+

1.22. Obsługa plików

+

+ Python tak wiele języków programowania umożliwia pracę z plikami. Dostęp + do pliku uzyskujemy w dość dziwny, ale bezpieczny (dla pliku) oraz + efektywny sposób. +

+
+with open('filename.txt') as file_object
+
+

+ Samemu otwarciu pliku służy funkcja open(), + jednak jeśli skorzystalibyśmy z niej bez tej specyficznej obudowy, po + zakończeniu wykonywania na nim jakiś operacji, musielibyśmy go zamknąć. + Tylko pytanie, kiedy? Po ostatniej czynności na nim wykonanej? Nie + wiadomo. Dlatego też w Pythonie pliki otwiera się za pomocą słowa + kluczowego with, które to zamyka plik + kiedy przestaje być potrzebny, czy to naszemu programowi, czy to + Pythonowi podczas interpretacji kodu. Sekcja + as file_object, będzie nam przedstawić + odniesie do pliku jako obiekt file_object. Wielu przypadkach + możemy spotkać się ze skróceniem file_object do + f. Czynności wykonywane na pliku są umieszczane w bloku + kodu pod linią otwarcia pliku z użyciem słowa kluczowego with. +

+

+ W powyższym przykładzie, wewnątrz funkcji + open() znajduje się argument o nazwie + filename.txt, jest to ścieżka dostępowa + do pliku, która może być względna - odnosić się od danego miejsca, lub + też bezwzględna - pełna ścieżka od najwyższego katalogu na systemie + plików w systemach uniksopodobnych (root, katalog głowny - + /), w systemach MS Windows (Katalog dysku np. + c:\ itp.). Argument filename.txt + jest ścieżką względną, ponieważ odnosi się od CWD (obecnego katalogu + roboczego - katalogu, w którym się znajdujemy, mamy otwarte IDE lub w + katalogu lub w którym wykonuje się skrypt Pythona). W MS Windows + stosujemy ten sam ukośnik (/) co w systemach uniksopodobnych, + lub jeśli się już upieramy przy Windowsowych lewych ukośnikach + (\), to musimy podać je podwójnie, ponieważ lewy ukośnik + w Python oznacza rozpoczęcie białego znaku. +

+

+ Dane z plików możemy odczytać na trzy różne sposoby. +

+
    +
  • Sposób 1 - Ściągnięcie całej zawartości pliku jako ciągu tekstowego do zmiennej.
  • +
  • Sposób 2 - Iteracja przez odniesienie do pliku.
  • +
  • Sposób 3 - Przechowanie pliku jako lista wierszy występujących w pliku.
  • +
+

+ Sposób 1: +

+
+with open('filename.txt') as f:
+    plik = f.read()
+
+

+ Warto zwrócić uwagę na dodatkowy ostatni pusty wiersz. + Metoda read() po napotkaniu końca pliku + zwraca pusty wiesz. Z racji tego, że pusty wiersz (znak przejścia do + nowej linii '\n') to biały znak, cały plik ściągnęliśmy do + zmiennej w postaci pojedynczego ciągu tekstowego, to oznacza to, że znak + znajduje się po prawej stronie ciągu, więc za pomocą metody operującej na + ciągach tekstowych rstrip() możemy usunąć ten pusty wiersz. +

+

+ Sposób 2: +

+
+with open('filename.txt') as f:
+    for line in f:
+        print(f"{line.replace('Python', 'C')}")
+
+

+ Metoda replace() zamienia wszystkie wystąpienia w ciągu + pierwszego argumentu na drugi argument. +

+

+ Sposób 3: +

+
+with open('filename.txt') as f:
+    plik = f.readlines()
+
+for linia in plik:
+    print(f"{linia.replace('Python', 'C')}")
+
+

+ Metoda readlines() zwraca nam listę + wierszy znajdujących się w pliku. +

+

1.22.1. Funkcja open

+

+ Funkcja open() pozwala na wybranie atrybutu dla otwieranego + pliku. +

+
    +
  • 'r' - Atrybut domyślny, otwiera tylko plik do odczytu.
  • +
  • 'w' - Otwiera plik do zapisu. Jeśli nie może znaleźć + pliku, nie generuje błędu. Tworzy nowy plik pod podaną funkcji ścieżką. + Jeśli plik o takiej nazwie już istnieje to zostaje nadpisany.
  • +
  • 'a' - Otwiera plik do dopisywania. Dopisuje dane do + pliku. Nie nadpisuje danych w pliku. Podobnie jak atrybut w w + przypadku braku pliku na ścieżce, to zostanie o utworzony.
  • +
  • 'r+' - Rozszerza otwarcie pliku do odczytu o + możliwości dopisania danych.
  • +
+

+ Zapis danych w pliku polega na otwarciu pliku do zapisu lub dopisywania + używając wyżej wymienionych atrybutów jako drugiego argumenty funkcji + open(). Plik nie musi istnieć na podanej ścieżce, zostanie + utworzony w momencie zamknięcia odniesienia prze słowo kluczowe + with +

+
+with open('filename.txt', 'w') as f:
+    f.write('xf0r3m')
+
+with open('filename.txt') as f:
+    plik = f.read()
+
+print(f"{plik}")
+# xf0r3m
+
+

1.23. Obsługa błędów

+

+ Python posiada konstrukcję do obsługi błędów, to znaczy, że jeżeli w + pewnym bloku umieścimy kod (technicznie, umieszcza się tam tylko jedną + linię do której nie możemy być pewni, że uruchomienie jej nie spowoduje + błędu), to jeśli spowoduje on błąd określony w drugiej części + konstrukcji, zostanie wykonany kod z bloku tej drugiej części. Tą + konstrukcją jest try-except. Koronnym + przykładem jest chyba dzielenie przez zero. +

+
+try:
+    print(8 / 0)
+except ZeroDivisionError:
+    print("Nie wolno dzielić przez 0")
+
+

+ Jeśli kod w bloku try wykona się bez błędu, to zostanie + wyświetlony wynik z dzielenia. Jednak nigdy nie się to nie stanie. + Ponieważ wykonanie linii print(8/0) + spowoduje wygenerowanie błędu division by zero. Błędy w + programowaniu możemy nazwać wyjątkami od wykonania. Każdy błąd jest + częścią obiektu wyjątku w tym przypadku obiektem wyjątku + dla błędu jest ZeroDivisionError. Skąd + to wiadomo ? Otóż z komunikatów zwróconych przez sam Python jako + stos wywołań. Ostatnia linia komunikatu o błędzie. + Mówi nam: 'obiekt wyjątku: błąd'. Aby obsłużyć błąd, + w linii except podajemy obiekt wyjątku, następnie w jej + bloku definiujemy kod, który ma się wykonać kiedy Python napotka błąd + tego typu. Jeśli potrzebujemy obiektu wyjątku, to spróbujmy zmusić tę + niepewną linię do wygenerowania błędu bez jego obsługi. Python poda nam + nazwę obiektu wyjątku. +

+

+ W skład tej konstrukcji wchodzi jeszcze + else, w tym bloku definiowany jest kod, + który jest wykonywany, kiedy kod w bloku try nie spowoduje + błędu. +

+
+a = input("Podaj pierwszą liczbę: ")
+b = input("Podaj drugą liczbę: ")
+
+try:
+    result = int(a) + int(b)
+except ValueError:
+    print("Jedna z podanych wartości jest tekstem nie liczbą!")
+else:
+    print(f"{result}")
+
+

+ Często będzie tak, że nie będziemy chcieli wykonywać żadnego kodu, ani + informować nikogo o tym, że wystąpił wyjątek. Wtedy możemy skorzystać ze + słowa kluczowego pass, którego celem jest rezerwacja + miejsca w bloku, na potrzeby późniejsze rozbudowy. Użycie instrukcji + pass możemy tłumaczyć jako do nothing. Z racji tego, + że instrukcja pass pozwala na ciche przyzwolenie na błędy. + Musimy zdecydować kiedy użytkownik naszego programu powinien być + informowany o błędzie. Na pewno wtedy gdy wyjątek powoduje jakaś + informacja, która pochodzi od niego samego. +

+

1.24. Wykorzystanie formatu JSON w Pythonie

+

+ Z racji tego iż mamy omówione pliki oraz wyjątki, czyli możemy definiować + kod, który obsłuży sytuacje, gdy próbujemy odczytać plik który nie + istnieje. Możemy zapisywać dane z naszych programów do pliku, a przy + następnym uruchomieniu je wczytywać. Do tego celu wykorzystamy moduł + json, który umożliwia użycie formatu + JSON (JavaScript Object Notation) do przechowywania danych. A w + szczególności dwie funkcje, dump() oraz + load(). +

+

+ Funkcja dump() jak argumenty pobiera, dane (jako pierwszy + argument pozycyjny) np. zmienną, równie dobrze może być to lista. Drugim + argumentem jest odniesie do pliku. +

+
+import json
+
+username = 'xf0r3m'
+
+with open('filename.json', 'w') as f:
+    json.dump(username,f)
+
+

+ Dane zostaną za pisane w pliku. Nie koniecznie w formacie JSON jaki znamy + z JavaScript. Idealnie funkcja dump() na JSON przerabia słowniki, + którym chyba najbliżej do tego formatu. Odczyt danych z takiego pliku + jest wykonywany jest za pomocą funkcji load(). +

+
+import json
+
+with open('filename.json') as f:
+    username = json.load(f)
+
+print(f"{username})
+# xf0r3m
+
+

1.25. Testy jednostkowe

+

+ Python za pomocą modułów biblioteki standardowej umożliwia nam + przeprowadzenie testów jednostkowych dla stworzonych przez nas funkcji + oraz klas. Jeśli chcemy tworzyć naprawdę dobry kod, i to nie zależnie od + języka powinniśmy go testować. Nie mówię o tworzeniu testów jednostkowych + dla hello world, ale kiedy nasz projekt dość pokaźnie urósł. + Zawiera klasy lub/i funkcję, to powinien on zawierać testy tych + konstrukcji. Na czym polega test jednostkowy? Najprościej rzecz biorąc na + sprawdzeniu czy wartość zwracana przez funkcje lub atrybut modyfikowany + przez metodę jest równy z predefiniowaną przez nas wartością, którą + uznajemy za poprawną. Takie porównanie nazywamy asercją. Zakładamy, że + wartość użyta do asercji jest równa zdefiniowanej wartości. + Jeśli tak jest to test zostaje zaliczony, w przeciwnym wypadku wykonanie + zostaje przerwane (w przypadku asercji jako funkcji). Asercja w Pythonie + nie organiczna się tylko do sprawdzenia równości. Poniżej znajduje się + tabelka z możliwymi funkcjami asercji zaimplementowanymi w module + unittest. To ten moduł odpowiada za testy jednostkowe. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetodaOpis
assertEqual(a, b)Sprawdza czy a == b
assertNotEqual(a, b)Sprawdza czy a != b
assertTrue(x)Sprawdza czy x przyjmuje wartość True
assertFalse(x)Sprawdza czy x przyjmuje wartość False
assertIn(element, lista)Sprawdza czy element jest na liście
asserNotIn(element, lista)Sprawdza czy element nie znajduje się na liście
+
Metody asercji oferowane przez moduł unittest
+
+

1.25.1. Testy jednostkowe funkcji

+

+ Na potrzeby przedstawienia testów zaczniemy od zdefiniowania sobie w + module (city_functions.py) prostej funkcji 'city_countries', + która pobiera od użytkownika nazwę miast oraz nazwę kraju, w którym to + miasto leży następnie zwraca ciąg np. dla danych Warszawa Polska: + Warszawa, Polska. +

+
+def city_countries(city, country):
+  cc = f"{city.title()}, {country.title()}"
+  return cc
+
+

+ Aby wywołać taką funkcje z racji tego, że jest plik modułu w nowym pliku + musimy zaimportować moduł i wywołać funkcję: +

+
+from city_functions import city_countries
+city_countries('Warszawa', 'Polska')
+# Warszawa, Polska
+
+

+ Powiedzmy z racji tego, że jest to funkcja dużego projektu, musimy + stworzyć dla niej test jednostkowy. Testy definiuje się w klasie potomnej + klasy TestCase modułu unittest. Jedna metoda w wewnątrz klasy = jeden + test. Taka klasa staje się zbiorem testów. Kiedy dla każdej funkcji w + naszym projekcie zdefiniujemy chociaż jeden test, to możemy mówić wówczas + o całkowitym pokryciu zbioru testów. Zatem dla testów + jednostkowych utworzymy nowy plik, nazwiemy go test_cities.py +

+
+import unittest
+from city_functions import city_countries
+
+class TestCitiesFunctions(unittest.TestCase):
+
+    def test_city_countries(self):
+        cc = city_countries('Warszawa', 'Polska')
+        self.assertEqual(cc, 'Warszawa, Polska')
+
+unittest.main()
+
+

+ importujemy moduł unittest, następnie + importujemy naszą funkcję. Tworzymy klasę potomną klasy + unittest.TestCase, w tym przypadku o + nazwie TestCitiesFunctions. Wewnątrz + niej jako metodę definiujemy test. Funkcja + main() modułu unittest + uruchomi automatycznie każdą metodę w zbiorze, których nazwy zaczynają + się od ciągu test_, zatem nie potrzeba jej wywoływać. + Wewnątrz metody wywołujemy naszą funkcję zachowując jej wartość zwracaną + w zmiennej cc następnie w jednej z metod + asercji w tym przypadku assertEqual + podstawiamy otrzymaną wartość następnie wartość, którą naszym zdaniem + powinniśmy otrzymać od funkcji dla podanych w wywołaniu argumentów. Na + końcu uruchamiamy zbiór testów. Wynik testu znajduje się poniżej. +

+
+.
+----------------------------------------------------------------------
+Ran 1 test in 0.000s
+
+OK
+
+ +

+ W prawdzie nie wiele informacji, choć nas powinna zaciekawić pierwsza + linijka, zwracany jest w niej rezultat testu, jeśli widzimy kropkę + (.), oznacza to że test zakończył się + sukcesem. Innymi wartościami zwrotnymi jest wielka litera + F, oznaczająca nie powodzenie asercji, otrzymaliśmy inny + wynik niż zakładaliśmy, oraz wielka litera E, + oznaczająca błąd gdzieś w kodzie. Np. jeśli rozbudowujemy funkcje o + kolejne parametry, ale już zapomnimy w teście tych parametrach. +

+

+ Rozbudujemy naszą funkcję o kolejny parametr pozwalający przedstawić populacje. +

+
+def city_country(city, country, population):
+    cc = f"{city.title()}, {country.title()} - populacja {population}"
+    return cc
+
+

+ Próbując wykonać test dla tej funkcji dostaniemy o taką odpowiedź: +

+
+E
+======================================================================
+ERROR: test_city_country (__main__.TestCitiesFunctions)
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "/home/xf0r3m/python/test_cities.py", line 8, in test_city_country
+    cc = city_country('Warszawa', 'Polska')
+TypeError: city_country() missing 1 required positional argument: 'population'
+
+----------------------------------------------------------------------
+Ran 1 test in 0.001s
+
+FAILED (errors=1)
+
+

+ Błąd polega na tym, że zapomnieliśmy jednym argumencie, jeśli zmienimy + ten argument na opcjonalny, wtedy test zostanie pomyślnie wykonany. + Poniżej zamieszczam również dane zwracane, kiedy wartość rzeczywista + różni się od przez nas założonej, pojawia się wtedy błąd asercji. +

+
+F
+======================================================================
+FAIL: test_city_country (__main__.TestCitiesFunctions)
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "/home/xf0r3m/python/test_cities.py", line 9, in test_city_country
+    self.assertEqual(cc, 'Warszawa, Polska')
+AssertionError: 'Warszawa, Polska - populacja ' != 'Warszawa, Polska'
+- Warszawa, Polska - populacja
++ Warszawa, Polska
+
+
+----------------------------------------------------------------------
+Ran 1 test in 0.001s
+
+FAILED (failures=1)
+
+

+ Oczywiście kiedy zdefiniujemy kolejne testy, to będą pojawiać się + w pierwszej linijce kropki lub litery E czy F, wszystko w zależności od + wyniku testu. +

+

1.25.2. Testy jednostkowe metod

+

+ Testy jednostkowe możemy tworzyć nie tylko dla funkcji ale i dla klas + (bardziej metod). Przygotowałem poniżej klasę modelującą pracownika w + swoich atrybutach zawiera imię, nazwisko oraz roczne zarobki. W klasie + znajduje się również metoda odpowiedzialna za przyznawanie podwyżki, + domyślną wartością podwyżki jest 5000. Naszym zadaniem jest stworzenie + dwóch testów sprawdzających ową metodę. Jak w przykładzie z funkcją, + klasę umieszczamy w odrębnym pliku modułu. +

+

+ Plik: pracownik.py +

+
+class Employee():
+
+    def __init__(self, imie, nazwisko, y_salary):
+        self.imie = imie
+        self.nazwisko = nazwisko
+        self.y_salary = y_salary
+
+    def give_raise(self, amount_raise=5000):
+        self.y_salary += amount_raise
+
+

+ Poniżej znajduje się plik ze zbiorem testów. Dla klas tworzymy go w + identyczny sposób jak dla funkcji, z jedną różnicą. Dla poprawności testu, + każdy test powinien otrzymać oddzielny egzemplarz klasy, aby nie + powtarzać kodu tworzenia egzemplarza, z pomocą przychodzi nam metoda + unittest o nazwie setUp. + Kiedy definiujemy taką + metodę w wewnątrz zbioru testów, powinna zawierać kod przeznaczony do + utworzenia egzemplarza danej klasy. Ta metoda będzie wywoływana przez + Python przed każdym wywołaniem testu. +

+

+ Plik: test_employee.py +

+
+import unittest
+from pracownik import Employee
+
+class EmployeeTest(unittest.TestCase):
+
+    def setUp(self):
+
+        imie = 'Jan'
+        nazwisko = 'Nowak'
+        y_salary = 140_000
+
+        self.new_employee = Employee(imie, nazwisko, y_salary)
+
+    def test_give_default_raise(self):
+
+        self.new_employee.give_raise()
+        self.assertEqual(self.new_employee.y_salary, 145_000)
+
+    def test_give_custom_raise(self):
+        self.new_employee.give_raise(25_000)
+        self.assertEqual(self.new_employee.y_salary, 165_000)
+
+unittest.main()
+
+

+ Naszymi testami było sprawdzenie metody odpowiedzialnej za przyznawanie + podwyżek. Pierwszy test to podwyżka o wartość domyślnej a drugi to + podwyżka zdefiniowana przez użytkownika. Danymi zwracanymi przez Python + dla uruchomienia tych testów są: +

+
+..
+----------------------------------------------------------------------
+Ran 2 tests in 0.001s
+
+OK
+
+

1.26. Koncepcje stylu kodu źródłowego

+

+ Poniżej przedstawiam koncepcje stylu nadawanego zapisom kodu źródłowego, + ponieważ Now is better than never oraz + Beautiful is better than ugly. +

+

+ Kilka reguł, których należy stosować pod czas używania zmiennych w + Pythonie. +

+
    +
  • W nazwach zmiennych mogą znajdować się jedynie, cyfry i znaki + podkreślenia. Nazwa może rozpoczynać się od litery lub znaku + podkreślenia ale nie od cyfry.
  • +
  • Niedozwolone jest stosowanie spacji w nazwach zmiennych, choć znak + podkreślenia można stosować w charakterze separatora.
  • +
  • Należy unikać używania w nazwach zmiennych słów kluczowych Pythona + oraz nazw funkcji.
  • +
  • Nazwa zmiennej powinna być krótka, choć jednocześnie czytelna.
  • +
  • Ostrożnie należy używać małej litery l oraz wielkiej litery + O. Mogą zostać mylnie odczytane jako 1 lub 0.
  • +
+

+ Zmienne w Pythonie zapisujemy z małych liter. +

+

+ Odnośnie komentarzy, to warto sobie opisywać jakieś bardziej złożone + fragmenty naszego programu, żeby później, kiedy powrócimy do kodu po + jakimś czasie, nie tracić czasu na próbę zrozumienia co autor miał na + myśli. +

+

+ Generalnie konwencje stylu, będą stosowane nie po to aby kod był łatwy do + zapisu, ale do odczytu właśnie. Jest dokument w sieci nazywa się PEP 8 + (Python Enhancement Proposal), który opisuje sposoby nakładania + stylu na tworzony kod. Pierwszą rzeczą którą jest podczas zapisu kodu + łatwego do odczytu, są wcięcia. W Pythonie sprawa jest + nieco paradoksalna, ponieważ nie możemy sobie szastać wcięciami na prawo + i lewo, ponieważ wcięcia często oznaczają blok kodu, ale jednocześnie + przez to Python sam nakazuje nam stosowanie wcięć przy definiowaniu bloku + kodu. Specyfikacja PEP 8 zaleca użycia czterech spacji jako jednego + poziomu wcięcia. Najnowsze wersje edytorów ustawiają jeden znak tabulacji + na wielkość czterech spacji. Kolejną rzeczą jest + długość wiersza, która nie powinna przekraczać 80 znaków + takie zalecenie później ułatwi nam pracę kiedy na jednym ekranie będziemy + musieli mieć podzielone okno edytora na kilka plików naraz. + W oknie edytora możemy zobaczyć taką pionową kreskę, właśnie ona stoi na + miejscu 80-tego znaku. Taka linia powinna być już włączona, jeśli nie + jest to zawsze można ją włączyć. Do organizacji kodu w schludny plik + tekstowy mogą pomóc nam puste wiersze. Nie należy ich + jednak nadużywać. Metodę jaką ja stosuje jest rozdzielanie kodu ze + względu na jego kontekst. Np. mam sobie wywołanie funkcji, która zwraca + mi wartość do zmiennej - jest jedna linia. Teraz chcę to wypisać - to + jest druga linia operująca na tych samych danych, czyli umieszczam ją + jedna pod drugą. Kiedy muszę wywołać podobnie inną funkcję muszę robię + linię odstępu przed kolejnymi instrukcjami. +

+

+ PEP 8 opisuje również styl dla testów warunkowych. W tego zalecenia + powinniśmy rozdzielać operandy od operatora spacją, zarówno w test + prostych jak i złożonych. +

+

+ Podczas nadawania stylu funkcjom powinniśmy pamiętać o kilku kwestiach. + Nazwa funkcji powinna sugerować jej przeznaczenie i składać się z małych + liter i znaków podkreślenia. W kodzie każdej funkcji powinien znajdować + się komentarz zaraz na początku bloku kodu funkcji, dla komentarza + należy użyć formatu docstring. W przypadku definiowania + parametrów domyślnych lub też opcjonalnych po obu stronach znaku równości + nie należy umieszczać żadnych spacji. Jeżeli parametry w definicji nam + się nie mieszczą 80 znakach, to możemy bez trudu złamać tą linię za + przecinkiem, dać dwa znaki tabulatora aby nie zostało to potraktowane + jako blok funkcji i kontynuować zapisywanie parametrów na końcu + zamykając nawias, podając znak dwukropka. Jeśli przechowujemy naszą + funkcję w module i ta funkcja nie jest jedyna w tym module, to możemy + poszczególne funkcje w module rozdzielić dwoma pustymi wierszami. +

+

+ Nazwa klasy powinna stosować styl CamelCase: każde słowo nazwy pisane + wielką literą, brak znaków podkreślenia. Z kolei nazwy egzemplarzy klas + powinny być zapisane małymi literami, a wykorzystanie w tych nazwach + znaków podkreślenia między słowami jest dopuszczalne. Na początku każdej + klasy należy umieścić komentarz typu docstring wyjaśniający + przeznaczenie klas znajdujących się w danym module. W kodzie klasy + umieszczamy pusty wiersz pomiędzy metodami. Klasy w module rozdzielamy + dwoma pustymi wierszami. +

+

+ Importując moduły z biblioteki standardowej oraz swoje, w pierwszej + kolejności należy podać polecenia import modułów biblioteki a dopiero + później swoje moduły. +

+

+ Ostatnim pojęciem ze stylów będzie refaktoryzacja. Jest + to podział dużego kodu na funkcje wykonujące zazwyczaj konkretne zadanie. +

+

+ Tutaj kończy się część pierwsza, czyli poznawanie Pythona, jego składni, + poleceń i konstrukcji. Teraz przejdziemy do konkretnego zagadnienia, + gdzie raczej będziemy analizować studium przypadku. Przypadku tworzenia + aplikacji internetowej, podobnej do tej jaką tworzy się za pomocą takich + języków jak np. PHP. +

+

+ Koniec części pierwszej. +

+

Część 2: Aplikacje internetowe

+

+ Django to zestaw narzędzi + (czyt. framework) pozwalający na tworzenie aplikacji + internetowych/interaktywnych witryn za pomocą Pythona. +

+

+ Tworząc witrynę czy też aplikacje w Django, tworzymy projekt. Każdy + projekt składa się z wielu mniejszych części zwanych + aplikacjami stworzonych za pomocą Pythona według zasad + Django. Każdy porządny projekt powinien mieć jasno określone założenia, + na których skupiają się programiści podczas pracy, taki określony zbiór + cech i funkcjonalności nazywamy specyfikacją. +

+

Środowisko wirtualne

+

+ Rozpoczynając pracę z Django musimy skonfigurować + środowisko wirtualne, w którym będziemy mogli dowolnie + instalować rzeczy, nie powodując bałaganu w modułach Pythona na naszym + systemie. Każde środowisko można bez problemu usunąć wydając odpowiednie + dla systemu polecenie powłoki służące do usuwania plików. W tej części + będę przedstawiał polecenia z systemu Linux, dystrybucji opartych o + Debian, takich jak np. Ubuntu. Przepraszam za pominięcie innych systemów. + Konfiguracje środowiska wirtualnego zaczynamy od zainstalowania modułu w + systemie. +

+
+$ sudo apt install python3-venv
+
+

+ Po zainstalowaniu pakietu, dla większego porządku tworzymy sobie katalog, + w którym będziemy przechowywać nasz projekt. Wewnątrz katalogu wydajemy + poniższe polecenie. +

+
+$ python3 -m venv project_env
+
+

+ Za project_env możemy podstawić swoją + nazwę. Po wydaniu tego polecenia Python utworzy katalog + project_env, w którym będą przechowywane wszystkie pliki + utworzonego środowiska wirtualnego. Na tym konfiguracja się kończy. + Kiedy chcemy uruchomić nasze środowisko wydajemy poniższe polecenie. +

+
+$ source project_env/bin/activate
+
+

+ Polecenie powinno zakończyć działanie zaraz po uruchomieniu nie zwracając + żadnych danych. Jedyną rzeczą, która się zmieni jest prompt + (znak zachęty), przednim będzie znajdował się nawias, zawierający nazwę + naszego katalogu ze środowiskiem wirtualnym. +

+
+(project_env) xf0r3m@macbook:/python/django$
+
+

+ Środowisko możemy wyłączyć wydając polecenie: +

+
+(project_env) xf0r3m@macbook:/python/django$ deactivate
+
+

+ lub po prostu zamykając powłokę, w której je aktywowaliśmy. Po + uruchomieniu środowiska będziemy używać polecenia + python, to polecenie będzie odnosić się + do wersji Pythona jakiej użyliśmy to stworzenia środowiska, w tym + przypadku nie będziemy używać polecenia python3. + Teraz możemy przejść do instalacji Django. Wydajemy polecenie w + aktywowanym środowisku wirtualnym: +

+

Podstawy pracy z frameworkiem Django

+

2.2.1. Instalacja django

+
+(project_env) xf0r3m@macbook:python/django$ pip install django
+
+

+ Kiedy polecenie skończy działanie, przechodzimy do utworzenia naszego + projektu. +

+

2.2.2. Stworzenie nowego projektu w Django

+

+ Powiedzmy że stworzymy stronę pizzerii, gdzie będzie można + zamówić pizzę i przejrzeć menu dla zamówień telefonicznych. Aby utworzyć + projekt wydajemy poniższe polecenie. +

+
+(project_env) xf0r3m@macbook:python/django$ django-admin startproject pizzeria .
+
+

+ W tym poleceniu najważniejsza jest kropka na końcu + powodująca, że projekt zostanie utworzony w katalogu, w którym się + znajdujemy. Brak kropki spowoduje utworzenie projektu w jeszcze jednym + wewnętrznym katalogu. Spoglądając na pliki umieszczone w naszym folderze + powinniśmy dostrzec plik manage.py, folder środowiska + wirtualnego zakończony sufiksem _env oraz folder o nazwie + pizzeria zawierający pliki naszego projektu. +

+

2.2.3. Tworzenie bazy danych dla projektu

+

+ Jak wszyscy wiemy, aplikacje internetowe często przetwarzają jakieś dane. + Te dane należy gdzieś składować, najpopularniejszą metodą magazynowania + danych przez aplikacje sieci WWW są bazy danych. Django + również korzysta z baz danych, a my wykorzystamy najprostszą z nich, w + postaci jednego pliku - bazy SQLite3. W przypadku + innych systemów bazodanowych niezbędna będzie instalacja dodatkowych + modułów Pythona. Na tym etapie po prostu stworzymy bazę danych dla + naszego projektu aby wszystko funkcjonowało poprawnie. Wydajemy + polecenie: +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py migrate
+
+

+ W Django, czynności na bazie wykonujemy za pomocą opcji + migrate skryptu manage.py. + Teraz kiedy nasza baza nie istnieje, polecenie migrate spowoduje + jej utworzenie. +

+

2.2.4. Uruchomienie serwera projektu

+

+ Teraz możemy uruchomić nasz + serwer aplikacji. Wydajemy polecenie: +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py runserver
+
+

+ Po uruchomieniu tego polecenia, z danych przeznie zwracanych powinniśmy + dowiedzieć się, że nasz serwer nasłuchuje na pętli zwrotnej + (localhost/127.0.0.1) na porcie 8000. Możemy przejść pod ten + adres za pomocą przeglądarki, a naszym oczom ukaże się strona domyślna + projektu, predefiniowana przez Django. +

+

2.2.5. Tworzenie aplikacji Django

+

+ Jak wiemy z początkowych akapitów, na projekt w Django składają się na + mniejsze części nazywane aplikacjami, często odpowiadają one za konkretne + rzeczy. Teraz stworzymy aplikacje odpowiedzialną za nasze pizze i ich + dodatki. +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py startapp pizzas
+
+

+ Po wykonaniu tego polecenia na chwilę się zatrzymamy. Na początku + wyświetlimy sobie zawartość utworzonego katalogu aplikacji. +

+
+(project_env) xf0r3m@macbook:python/django$ ls pizzas
+admin.py  __init__.py  models.py    templates  urls.py
+apps.py   migrations   __pycache__  tests.py   views.py
+
+

2.2.6. Modele

+

+ Katalogiem templates zajmiemy się później, natomiast katalog + __pycache__ nie jest w ogóle istotny, jest on tworzony przez + Python podczas uruchamiania skryptu. Każda aplikacja w Django + reprezentuje wzorzec model-view-template, na + modele składają się reprezentacje danych w postaci klas. + Weźmy sobie zatem taką pizzę, co może ją opisać? Na przykład nazwa. + Każda pizza ma swoją nazwę, mamy zatem jakąś właściwość, która składa się + na ten model, modele posiadają także metodę, która pozwala na + reprezentowanie danego modelu. Kiedy wyciągniemy egzemplarz modelu z + bazy, to odwołując się do niego uzyskamy, jakąś wartość. Może być to po + prostu nazwa. Z technicznego punktu widzenia modele to klasy potomne, + klasy Model z modułu + django.db.models. Wewnątrz tej klasy znajdują się atrybuty, + oraz metoda __str__. + Modele przypominają tabele relacyjnych baz danych, nawet są do nich + konwertowane podczas migracji, każda właściwość takiego + modelu staje się kolumną w bazie. Modele definiujemy w pliku + models.py w folderze aplikacji, a tak przedstawia się model naszej pizzy. +

+
+class Pizza(models.Model):
+    name = models.CharField(max_length=30)
+
+    def __str__(self):
+        return self.name
+
+

+ W powyższym przykładzie mamy jeden atrybut znakowy + (CharField) o długość 30 znaków. + Odpowiada to SQL-owemu VARCHAR(30). Mamy również w naszej klasie + metodę odpowiadającą za reprezentacje danego modelu. W tym wypadku + zwracamy po prostu nazwę. Modele mogą być ze sobą połączone. Rozważmy + przykład, posiadamy model pizzy i mamy model dodatku na pizzę, teraz + chcieli byśmy dowiedzieć się jakie są dodatki dla konkretnej pizzy, aby + metaforycznie położyć dodatki na pizzy skorzystamy z tak zwanego klucz + obcego lub klucza zewnętrznego - odniesienia się do innego modelu. +

+
+class Toping(models.Model):
+    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE)
+    name = models.CharField(max_length=200)
+
+    def __str__(self):
+        return self.name
+
+

+ Za nasze połączenie opowiada metoda + ForeignKey, która jako argumenty pobiera + nazwę modelu, do którego będzie odnosić się właściwość + pizza, drugi argument jest zachowaniem, + w przypadku usunięcia egzemplarza pizzy, do którego odnoszą się + egzemplarze dodatków, kiedy jest ustawiony na + models.CASCADE, to gdy usuniemy pizzę to + również powiązane z nią dodatki zostaną usunięte. +

+

2.2.7. Instalacja aplikacji w projekcie

+

+ Kiedy mamy już zdefiniowane modele, to możemy je teraz wstawić do naszej + bazy. Przed przeprowadzeniem migracji, trzeba ją najpierw przygotować. + Jednak przed przygotowaniem migracji, należy na początku zainstalować + naszą aplikacje, aby Python wiedział, że + pizzas należy do projektu + pizzeria i mógł w bazie danych projektu utworzyć tabele. + Instalacja przebiega w następujący sposób, otóż w katalogu projektu + odszukujemy plik settings.py. W nim szukamy zmiennej + INSTALLED_APPS, a następnie umieszczamy + nazwę naszej aplikacje w pojedynczych apostrofach na samym początku listy. + Musimy pamiętać o przecinku po nazwie aplikacji. +

+
+INSTALLED_APPS = [
+    'pizzas',
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+]
+
+

+ Dlaczego umieściliśmy naszą aplikacje, na samym początku listy? Lista + zawiera aplikacje domyślnie instalowane przez Django w naszym projekcie + aby zapewnić mu podstawową funkcjonalność, oraz zaoszczędzić czas na + tworzenie aplikacji. Aplikacje te realizują identyczne zadania dla + każdego projektu. Może jednak zdarzyć się tak że będzie trzeba nadpisać + funkcje domyślnej aplikacji, dlatego też swoje aplikacje dopisujemy + powyżej aplikacji domyślnych. +

+

2.2.8. Zatwierdzanie modeli w bazie danych.

+

+ Aby przygotować migrację wydajemy poniższe polecenie: +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py makemigrations pizzas
+
+

+ Jeśli modele są poprawne pod względem składni, to przez skrypt zostaniemy + poinformowani mniej więcej takim komunikatem. +

+
+Migrations for 'pizzas':
+  pizzas/migrations/0001_initial.py
+    - Create model Pizza
+    - Create model Topping
+
+

+ Ten komunikat oznacza również wygenerowanie plik migracji. + Wydajemy poniższe polecenie aby zatwierdzić nasze zmiany w bazie: +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py migrate
+
+

+ Wywołanie tego polecenia spowoduje utworzenie modeli. Warto zaznaczyć w + tym momencie, że każda poważniejsza zmiana w modelu musi zostać + zatwierdzona w bazie. Każdą zmianę na modelach możemy próbować migrować, + najwyżej Python nie wygeneruje pliku migracji, ponieważ uzna, że zmiana, + którą wprowadziliśmy nie była istotna dla modelu w bazie. Najlepiej kiedy + jednak tworzymy model postarać się przemyśleć każdą właściwość, ponieważ + zmiany wprowadzane w trakcie jego działania są nieco bardziej + skomplikowane. Zostały one (dodawnie kolumny) opisane pod koniec strony + podczas zabezpieczania naszego projektu. Przypuszczam że zmiany w bloku + metody __str__ są takim zmianami, których nie trzeba + zatwierdzać w bazie. +

+

2.2.9. Zarządzanie modelami za pomocą wirtyny administracyjnej Django

+

+ Po dokonaniu migracji, możemy wprowadzić dane początkowe do naszych + modeli, do wprowadzania danych początkowych, możemy posłużyć się + witryną administracyjną dostarczaną nam przez Django. Jednak przed samym + rozpoczęciem musimy wykonać dwie czynności. Pierwszą rzeczą jest + utworzenie konta superużytkownika - użytkownika witryny administracyjnej. + Wydajemy poniższe polecenie: +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py createsuperuser
+
+

+ Skrypt zapyta nas o kilka rzeczy. Mianowicie o nazwę użytkownika, która + może zostać domyślna - nazwa użytkownika systemowego, który wydał + polecenie utworzenia superużytkownika. Adres skrzynki mailowej, który + jest opcjonalny. Ostatnią rzeczą jaką będziemy musieli podać to hasło. + Dwukrotnie aby je potwierdzić. Po utworzeniu superużytkownika, możemy + przejść do drugiej czynności. +

+

+ Aby móc zarządzać danym z modeli za pomocą witryny administracyjnej, + należy je najpierw zarejestrować. Modele rejestrujemy w + pliku admin.py. Na początku importujemy nasz moduł z modelami za + pomocą linii: +

+
+from .models import Pizza,Toping
+
+

+ Kropka przed models + oznacza, że Python ma wziąć moduł z tego samego katalogu, w którym + znajduje się interpretowany plik admin.py. Następnie przy pomocy + metody register() obiektu + admin.site rejestrujemy każdy z + zaimportowanych modeli. +

+
+admin.site.register(Pizza)
+admin.site.register(Toping)
+
+

+ Po zarejestrowaniu modeli możemy uruchomić nasz serwer deweloperski. +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py runserver
+
+

+ Otwieramy w przeglądarce następujący adres + http://127.0.0.1:8000/admin . Następnie logujemy się na konto + superużytkownika. Po zalogowaniu zobaczymy dwie sekcje w jednej są nasze + modele, a w drugie modele użytkowników i grup. Na co chciałbym zwrócić + uwagę, to fakt że nazwy modeli są zapisane w liczbie mnogiej. My tych + zapisów nie generowaliśmy, Python sam sobie wywnioskował (dodał literę + 's' i tyle). Jednak wiemy, że tworzenie odmian nazw języków ludzi w + świecie komputerów od zawsze było problemem. Tak jest i w tym przypadku. + Załóżmy że mamy (tylko tak dla przykładu), model o nazwie 'Entry'. Liczba + mnoga od 'Entry' to 'Entries'. Python domyślnie stworzy 'Entrys'. + Oczywiście zostało to przewidziane. W celu zdefiniowania prawidłowej + nazwy dla liczby mnogiej możemy użyć podklasy (klasy w + klasie, nie mylić z klasą potomną) Meta, która definiuje + tak jakby atrybuty opisujące samą klasę, w niej definiujemy atrybut + verbose_name_plural. Pamiętajmy o tym że klasa Meta + musi być zawarta w innej klasie. +

+

+ Wracając do dodawania danych do modeli za pomocą witryny administracyjnej. + Dane dodajemy przy użyciu plusika - zostaniemy przeniesieni bezpośrednio + do formularza wprowadzającego dane do bazy, albo klikając na nazwę modelu + - zostaniemy przeniesieni do strony zawierającej egzemplarze tego modelu, + gdzie klikamy przycisk "Add <nazwa_modelu> +". Kiedy dodamy jakiś + egzemplarz (wypełniając formularz i klikając przycisk save), + to podglądając listę egzemplarzy modelu to dane odnośnie egzemplarza + jakie widzimy są właśnie wynikiem działania metody __str__. + Jak widać panuje pełna dowolność, co zostanie nam przestawione jako + reprezentacja danego modelu. +

+

2.2.10. Powłoka Django

+

+ Po dodaniu danych, możemy przejść do powłoki Django. Tę + powłokę możemy wykorzystać (a nawet powinniśmy) testowania zapytań do + bazy. Powłokę uruchamiamy poleceniem. +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py shell
+
+

+ Przed przystąpieniem do wydawania zapytań, należy zaimportować do powłoki + niezbędne nam modele. Najprostsze zapytanie wygląda następująco. +

+
+# Import modeli
+from pizzas.models import Pizza, Toping
+
+pizzas = Pizza.objects.all()
+
+

+ W poleceniu from, + pizzas jest nazwą aplikacji. + Zmienna pizzas będzie przechowywać listę (tzw. + query set) wszystkich rekordów z tabeli (egzemplarzy modelu). + Aby pobrać konkretny rekord użyjemy innej metody. + Metoda get() pobiera jako argument + warunek, na podstawie którego ma wybrać danych rekord, jeśli nie podamy + warunku, to zostanie zgłoszony błąd że funkcja zwróciła więcej niż jeden + egzemplarz. +

+
+pepperoni = Pizza.objects.get(name='Pepperoni')
+
+

+ Teraz mając jeden rekord w zmiennej, mamy możliwość sprawdzenia jakie są + dodatki na naszej pizzy, odwołując się do innego modelu za pomocą naszego + klucza zewnętrznego/obcego. +

+
+pepperoni_tops = pepperoni.toping_set.all()
+
+

+ Aby odwołać się do innego modelu za pomocą klucza obcego, używamy + atrybutu naszej wydobytej już pizzy (bo to jej dodatki chcemy obejrzeć), + który jest obiektem o nazwie składającej się z nazwy modelu do, którego + się odwołujemy, napisanego za pomocą małych liter (Uwaga, + zapis nazwy modelu małymi literami jest istotny!), zakończonego sufiksem + (przyrostkiem) _set oraz metody, + która wydobędzie nam rekordy. Tak wydobyte dane możemy sobie posortować, + do sortowania służy metoda order_by() + jako argument przyjmuje nazwę pola według jakiego ma sortować zwracane + dane. Nazwę pola umieszczamy jako ciąg tekstowy, czy to w apostrofach, + czy w cudzysłowie. Wynik sortowania możemy odwrócić, stawiając myślnik + (-) przed nazwą pola, nadal w ciągu tekstowym. +

+
+pepperoni_tops = pepperoni.toping_set.order_by('-name')
+
+

+ Powłoka w naszej pracy z Django będzie odgrywać ważną rolę, dzięki niej + możemy testować nasze zapytania zanim umieścimy je w widokach, co jest + znacznie lepszym rozwiązaniem a niżeli używanie niepewnych zapytań. +

+

2.3. Tworzenie aplikacji

+

+ Kiedy mamy omówione modele oraz zapytania to teraz możemy przejść do + tworzenia naszych stron aplikacji. Tworzenie stron aplikacji możemy + podzielić na trzy czynności: mapowanie adresów URL, + utworzenie widoku oraz utworzenie + szablonu strony. Skupimy się w tym momencie na stronie + głównej. Strona główna powinna zostać wyświetlona, kiedy użytkownika poda + adres strony np. https://terminallog.morketsmerke.net. Kiedy my podamy + teraz adres naszego serwera dostaniem stronę z informacją o tym, że nasz + projekt Django jest gotowy do pracy. +

+

2.3.1. Mapowanie stron aplikacji

+

+ Aby moc mapować nasze adresy na + konkretne strony, musimy przekierować adres serwera w pliku + urls.py w katalogu naszego projektu na plik mapowania URL + (urls.py) w katalogu naszej aplikacji. Jakby jeszcze tego było + mało, Django mapując URL-e, całkowicie ignoruje adres serwera. +

+

+ Na początku w katalogu naszej aplikacji pizzas tworzymy plik o + nazwie urls.py. Wewnątrz pliku importujemy funkcje + path z modułu + django.urls oraz importujemy widoki + (o widokach za chwilę). Następnie definiujemy zmienną + app_name z nazwą aplikacji, pozwoli nam + to na łatwe tworzenie odnośników, do innych podstron tej aplikacji, + następnie wewnątrz listy urlpatterns + deklarujemy nasze mapowania, zawartość pliku powinna wyglądać mniej + więcej tak. +

+
+"""Definiuje wzorce adresów URL dla pizzas."""
+
+from django.urls import path
+
+from . import views
+
+app_name='pizzas'
+urlpatterns = [
+    path('', views.index, name='index'),
+]
+
+

+ Funkcja path przyjmuje + jak widzimy powyżej trzy argumenty. Pierwszy z nich, jest ciąg, który + zostanie przekazany przez przeglądarkę w momencie żądania danej strony. + Teraz ten ciąg jest pusty, ponieważ po przez adres serwera będziemy żądać + strony głównej naszej aplikacji. Drugim argumentem jest funkcja widoku, + której zadaniem jest przetworzenie i przygotowanie danych do użycia w + szablonie. Jeśli mówimy o czynnościach jakie wykonuje dana + aplikacja internetowa w Django, to mówimy o czynnościach wykonywanych + właśnie przez kod zdefiniowany ciele funkcji widoku. Przeważnie jedna + podstrona to jedna funkcja widoku. Funkcja widoku jest uruchamiana w + momencie gdy żądanie zostanie dopasowane do pierwszego argumentu funkcji + path. Ostatnim argumentem jest nazwa zmiennej używana przy + tworzeniu odnośników w szablonach, Python podstawi wartość pierwszego + parametru jeśli tworząc odnośnik odwołamy się do tej zmiennej. +

+

2.3.2. Tworzenie widoku

+

+ Po zdefiniowaniu mapowania, czas na drugą czynność. Na zdefiniowanie kodu + funkcji widoku. Przechodzimy do pliku views.py następnie + tworzymy nową funkcję o nazwie index przyjmującej parametr o + nazwie request. Z racji tego że jest to strona główna, to będzie + się ona opierać głównie na szablonie. Więc tutaj nasza funkcja widoku, + będzie mieć tylko jedną linę, kiedy otworzymy plik views.py + pierwsza linia zawiera import funkcji + render, + odpowiada ona za wygenerowanie gotowego pliku HTML z szablonu, który + zrozumie każda przeglądarka. Funkcja render przyjmuje w tym + przypadku dwa argumenty. Żądanie przechowywane w parametrze + request oraz ścieżkę dostępu do + szablonu. Plik views.py powinien wyglądać następująco. +

+
+from django.shortcuts import render
+
+# Create your views here.
+
+def index(request):
+    """Strona główna aplikacji Pizzas"""
+    return render(request, 'pizzas/index.html')
+
+

2.3.3. Tworzenie szablonu

+

+ Ze ścieżką dostępu do szablonu jest o tyle zabawnie że, aby szablon był + widziany przez Django musi być umieszczony w katalogu aplikacji następnie + w podkatalogu templates, w którym znajduje się kolejny + podkatalog o nazwie aplikacji, a w nim dopiero szablon. Pliki szablonów + to tak naprawdę pliki HTML, które zawierają + znaczniki szablonu, dzięki którym możemy wprowadzać + nasze dane na strony witryny, ale również w prosty sposób nią zarządzać. + Szablon strony głównej nie zawiera wiele informacji, nie zawiera nawet + żadnego znacznika szablonu. +

+
+<p>Pizzeria</p>
+
+<p>Aplikacja ta pozwala na przymowanie zamówień oraz wyświetlanie menu pizzerii</p>
+
+

2.3.4. Mapowanie aplikacji

+

+ Chcąc uruchomić do co zrobiliśmy do tej pory, musimy przed uruchomieniem + serwera wskazać w pliku mapowania URL-i projektu konkretną aplikację. Tę + czynność należy wykonać w pliku <nazwa_projektu>/urls.py w + tym konkrentym przypadku jest to pizzeria/urls.py. Wykonanie + czynności rozpoczynamy od zaimportowanie funkcji include. + Funkcją ta jest dostępna w module django.urls więc po + path na górze pliku do pisujemy + , include. +

+
+from django.urls import path, include
+
+

+ Następnie podobnie do mapowań stron aplikacji, jako kolejny element list + podajemy wywłołanie funkcji path wraz + z pustym żądaniem oraz zamiast podawać funkcję widoku oraz nazwę zmiennej + wywołujemy funkcję include wraz ze + wskazaniem pliku mapowania stron aplikacji w postaci + 'nazwa_aplikacji.urls' +

+
+from django.contrib import admin
+from django.urls import path, include
+
+urlpatterns = [
+    path('admin/', admin.site.urls),
+    path('', include('pizzas.urls')),
+]
+
+

2.3.5. Rozszerzanie przykładu

+

+ Z racji tego że mamy trochę za mało informacji, aby zaprezentować duże + możliwości szablonów w Django, rozbudujemy trochę naszą aplikacje o jedną + podstronę zawierającą menu naszej pizzerii. +

+

+ Naszą rozbudowę zaczniemy od stworzenia szablonu, w którym to będą + znajdować się same odnośniki do naszych podstron, Inne szablony będą + dziedziczyć te elementy od niego. W naszym katalogu z szablonami + tworzymy plik o nazwie base.html. Plik zawiera w sumie dwie linijki +

+
+<a href="{% url 'pizzas:index' %}">Pizzeria>/a<
+
+{% block content %}{% endblock content %}
+
+

+ Znacznik szablonu url w atrybucie + href wstawi bezwzględny adres URL + zawierający wzorzec przypisany do nazwy + index w funkcji path w pliku + urls.py. Po przeniesieniu tytułu jako odnośnika do + szablonu nadrzędnego. Możemy teraz wpisać linię ustawiającą + dziedziczenie w szablonie + index.html. Linię wstawiamy na samej górze. +

+
+{% extends 'pizzas/base.html' %}
+
+

+ Kiedy mamy już odpowiednie miejsce gdzie będziemy umieszczać odnośniki do + naszych podstron. Możemy przejść teraz do utworzenia widoku naszej + podstrony, naszą stronę nazwiemy klasycznie + menu. W pliku views.py naszej + aplikacji pizzas, umieszczamy poniższy kod. +

+
+def menu(request):
+
+    from pizzas.models import Pizza,Toping
+
+    pizzas = Pizza.objects.all()
+
+    pizza_dict={}
+    pizzas_list=[]
+
+    class PizzaClass():
+        def __init__(self, name, topings):
+            self.name = name
+            self.topings = topings
+
+    for pizza in pizzas:
+        pizza_name = f"{pizza}"
+        topings = pizza.toping_set.all()
+        t=""
+        for toping in topings:
+            if len(t) == 0:
+                t=f"{toping}, "
+            else:
+                t=f"{t}{toping}, "
+        t=t.rstrip(', ')
+        some_pizza = PizzaClass(pizza_name, t)
+        pizzas_list.append(some_pizza)
+
+    pizza_dict['pizzas']=pizzas_list
+
+    return render(request, 'pizzas/menu.html', pizza_dict)
+
+

+ Przed przystąpieniem do objaśniania chciałbym przestawić model + wyświetlania danych, otóż chciałem uzyskać taki sam lub zbliżony ulotkom + z pizzerii wydruk menu, czyli: +

+

+ nazwa_pizzy - składniki/dodatki +

+

+ A więc problem nie był kod widoku, ponieważ tu mogliśmy zbudować kod + realizujący to samo zadanie w znacznie prostszy sposób, ale kod szablonu. + Znaczniki szablonu mają duże możliwości, jednak nie są pełnym + odwzorowaniem tego co można zrobić w Pythonie. Rozwiązanie było banalne. + Mamy listę z nazwami pizz, uruchamiamy pętle, wewnątrz tej iteracji, + odwołujemy się nazwą pizzy do listy składników i problem rozwiązany. + Jednak w szablonach Django, jedyne co możemy zrobić z zmiennymi to nadać + im wartość i wypisać. Nie możemy użyć zmiennej szablonu jako klucza aby + odwołać się do kolejnej listy w zagnieżdżonej pętli + for. Używanie zmiennej context + w szablonie zakończyło się fiaskiem, mogliśmy pisać kod szablonu, który + niczego nie generował. Zajrzałem więc do oficjalnej dokumentacji Django, + rozwiązanie od razu nie przypadło mi do gustu, słownik + lista + obiekty, + jednak jak możemy się o tym przekonać rozwiązanie działa. + Słownik w tym przypadku jest strukturą danych przekazywaną do szablonu za + sprawą funkcji render, lista jest + strukturą dzięki, której może odbyć się iteracja przez nasze pizze, + obiekty pizzy został użyty w celu spięcia nazwy pizzy oraz jej dodatków w + jednej strukturze, do której będziemy mogli się odwołać w szablonie. + Zapewne istnieje inne rozwiązanie, jednak jeśli drogi czytelniku w życiu + stworzyłeś może jeden program w Pythonie, przeczytałeś całą pierwszą + część Crash Course (uwaga wykonując większość ćwiczeń, + wszystkich nie trzeba ponieważ się powtarzają, ewentualnie trzeba zmienić + jedną rzecz jednak logika pozostaje ta sama) i dotarłeś aż tutaj to moja + umiejętność programowania w Pythonie jest mniej więcej na Twoim poziomie. +

+

+ Tak więc co się dzieje w widoku, już tłumaczę. Na początku importujemy + nasze modele, żeby było skąd dane pobrać. Wydane zostaje zapytanie do + modelu Pizza o wszystkie (egzemplarze + modelu) rekordy, tworząc listę naszych pizz. + Tworzymy klasę naszej pizzy, klasa będzie zawierać tylko metodę + __init__ a oraz dwie właściwości nazwę + oraz dodatki jako ciągi tekstowe. Przeprowadzając iteracje z elementu + naszej listy pizz tworzymy nazwę pizzy po prostu przechowując ją w + zmiennej jako ciąg tekstowy, pobieramy listę naszych dodatków odwołując + się kluczem obcym pizzy do modelu Toping. + Przerabiamy listę dodatków na ciąg tekstowy. Po utworzeniu listy dodatków + jako ciągu możemy, zacząć tworzyć obiekty. Nowo utworzone obiekty + trafiają do listy i tak kończy się iteracja. Na samym końcu dodajmy naszą + listę obiektów do słownika, który w ostatniej linii naszego widoku jest + przekazywany do szablonu za pomocą funkcji + render. Poniżej znajduje się kod naszego + szablonu. +

+
+{% extends 'pizzas/index.html' %}
+
+{% block content %}
+
+<p>Menu</p>
+
+<ul>
+    {% for pizza in pizzas %}
+        <li>
+            {{ pizza.name }}
+            <small>- {{ pizza.topings }}</small>
+        </li>
+    {% endfor %}
+</ul>
+
+
+{% endblock content %}
+
+

+ W tym momencie powinniśmy mieć gotowe menu. Teraz przygotujemy stronę, + która wyświetli nam listę dodatków każdej z pizzy, abyś mogli zobaczyć + jak działa przekazywanie danych do aplikacji za pomocą adresu URL. +

+

+ Naszą rozbudowę rozpoczęliśmy od utworzenia widoku dla nowej strony. + Widok jak widać poniżej jest bardzo prosty. +

+
+def pizza_site(request, pizza_id):
+
+    from pizzas.models import Pizza,Toping
+
+    context = {}
+
+    name = Pizza.objects.get(id=pizza_id)
+    topings = name.toping_set.all()
+
+    context['name'] = name
+    context['topings'] = topings
+
+    return render(request, 'pizzas/pizza_site.html', context)
+
+

+ Zwrócić uwagę należy na dodatkowy parametr przekazywany do widoku. + Parametr o nazwie pizza_id będzie + przekazywali za pomocą adresu URL, taki parametr definiuje się we wzorcu + adresu URL. Wzorcem zajmiemy się pod koniec naszych prac. + Szablon dla tej strony został przedstawiony poniżej. Za pomocą słownika + context została przekazana nazwa pizzy + oraz lista z jej składnikami, nową rzeczą wprowadzoną tutaj jest + znacznik szablonu {% empty %} oznacza on + mniej więcej to że jeśli interpreter natrafi na pustą listę to możemy + zdefiniować w bardzo prosty sposób komunikat o tym że składniki na tej + pizzy są na życzenie. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+<p>{{ name }}</p>
+  <ul>
+    {% for toping in topings %}
+        <li>{{ toping }}</li>
+    {% empty %}
+        <li>Dodatki na życzenie</li>
+    {% endfor %}
+</ul>
+
+{% endblock content %}
+
+

+ Mając już szablon możemy przejść do mapowania URL-i. W aplikacji + pizzas w pliku urls.py za pomocą funkcji + path dopisujemy do listy + urlspattern kolejny wzorzec adresu. +

+
+path('pizza/<int:pizza_id>', views.pizza_site, name='pizza_site')
+
+

+ Stąd właśnie bierze się parametr widoku + pizza_site, jeśli po pizza/ + podamy liczbę całkowitą to wywołamy widok pizza_site przekazując + tę liczbę jako identyfikator rekordu pizzy. Wszystko świetnie, + jednak nie znamy id pizz. Należało by stworzyć odnośnik do + konkretnej pizzy w menu. W obecnej formie naszego menu próżno szukać + id. Dlatego też musimy zmodyfikować widok menu dodając do + naszej klasy atrybut id, który można pobrać bezpośrednio z egzemplarza + modelu za pomocą notacji kropki i właściwości o nazwie id. Poniżej + wstawiam zmieniony kod widoku menu. +

+
+def menu(request):
+
+    from pizzas.models import Pizza,Toping
+
+    pizzas = Pizza.objects.all()
+
+    pizza_dict={}
+    pizzas_list=[]
+
+    class PizzaClass():
+        def __init__(self, id, name, topings):
+            self.id = id
+            self.name = name
+            self.topings = topings
+
+    for pizza in pizzas:
+        pizza_name = f"{pizza}"
+        topings = pizza.toping_set.all()
+        t=""
+        for toping in topings:
+            if len(t) == 0:
+                t=f"{toping}, "
+            else:
+                t=f"{t}{toping}, "
+        t=t.rstrip(', ')
+        some_pizza = PizzaClass(pizza.id, pizza_name, t)
+        pizzas_list.append(some_pizza)
+
+    pizza_dict['pizzas']=pizza_list
+
+    return render(request, 'pizzas/menu.html', pizza_dict)
+
+

+ Teraz musimy utworzyć nasz odnośnik w pętli w pliku szablonu menu, aby + pojawił się dla każdej pizzy. +

+
+{% extends 'pizzas/index.html' %}
+
+{% block content %}
+
+<p>Menu</p>
+
+<ul>
+    {% for pizza in pizzas %}
+        <li>
+            {{ pizza.name }}
+            <small>- {{ pizza.topings }}</small>
+            <a href="{% url 'pizzas:pizza_site' pizza.id %}">Pokaż</a>
+        </li>
+    {% endfor %}
+</ul>
+
+
+{% endblock content %}
+
+

+ Podczas tworzenia adresu odnośnika za pomocą znacznika szablonu + url odwołujemy się do wzorca + zdefiniowanego za pomocą wartości nadanej parametrowi name + funkcji pathw pliku urls.py, tym razem wartość + pizza_id podajemy obok odwołania się do wzorca. Teraz przy + wywołaniu strony menu przy każdej z pizz powinien pokazać się odnośnik + "Pokaż" kierujący nas do konkretnej strony pizzy. +

+

2.4. Aplikacja users

+

+ Skoro mamy już stronę główną, mamy menu i jest z czego wybierać możemy + teraz przejść do składania zamówień. Złożenie zamówienia w naszej + pizzerii będzie wymagało utworzenia konta. Obsługą kont zajmie się + odrębna aplikacja users, którą teraz utworzymy. Przechodzimy do + katalogu naszego projektu i wydajemy następujące polecenie: +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py startapp users
+
+

+ Po wydaniu tego polecenia zostanie utworzona struktura plików identyczna + jak dla aplikacji pizzas. Teraz instalujemy aplikacje + users w identyczny sposób jak instalowaliśmy aplikacje + pizzas. +

+
+INSTALLED_APPS = [
+    'pizzas',
+    'users',
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+]
+
+

2.4.1. Logowanie użytkowników

+

+ Naszą przygodę z kontami użytkowników zaczniemy od dania możliwości + logowania potencjalnym klientom naszej pizzerii. Samo logowanie w Django + jest banalne ponieważ korzystać będziemy z gotowego, przygotowanego przez + Django widoku dla logowania. Jedynego czego będziemy potrzebować to + mapowania URL oraz szablonu. Zaczniemy od mapowania. + W pliku urls.py projektu pizzeria na liście + urlpatterns dokonujemy takiego samego + przekierowania jak w przypadku przekierowania w aplikacji pizzas + jednak naszym wzorcem będzie users/ a + pliku urls.py będzie znajdował się w katalogu aplikacji + users (jako argument funkcji + include podajemy + users.urls). +

+
+urlpatterns = [
+    path('admin/', admin.site.urls),
+    path('users/', include('users.urls')),
+    path('', include('pizzas.urls'))
+]
+
+ +

+ W aplikacji users tworzymy plik urls.py. W nim importujemy + funkcje path oraz + include z modułu + django.urls, definiujemy + app_name następnie na liście + urlpatterns dodajemy jedno wywołanie + funkcji path kierujące puste domyślne + zapytanie do pliku zdefiniowanego przez Django + django.contrib.auth.urls. +

+
+from django.urls import path,include
+
+app_name="users"
+urlpatterns = [
+    path('', include('django.contrib.auth.urls'))
+]
+
+

+ Teraz kiedy mapowanie jest gotowe, możemy przejść do utworzenia szablonu. + Domyślna funkcja widoku stworzona do logowania generuje stronę na + podstawie szablonu login.html umieszczonego w katalogu + templates/registration. + Te nazwy muszą zostać zachowane. Utwórzmy te katalogi + wewnątrz katalogu aplikacji users. Następnie utworzymy plik z + szablonem. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+    <form action="{% url 'users:login' %}" method="post">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button name="submit">Zaloguj się</button>
+       <input type="hidden" name="next" value="{% url 'pizzas:index' %}" />
+    </form>
+
+{% endblock content %}
+
+

+ Tak prezentuje się nasz szablon logowania. Warto zwrócić uwagę na to jak + łatwy jest dostęp do zasobów innej aplikacji wystarczy odpowiednia + ścieżka (patrz znacznik extends), w atrybucie + action zdefiniowana została strona, która ma obsłużyć dany + formularz. Znacznik szablonu csrf_token + służy zabezpieczeniu formularza przez atakiem CSRF. Następnie wyświetlany + jest sam formularz, który przechowywany jest w zmiennej + form. Wyświetlenie jej wraz z + as.p spowoduje, że etykiety oraz pola + wprowadzania danych zostaną wyświetlone jako jeden akapit i tak dla + każdego z elementów formularza. Formularze w Django nie zawierają + przycisków, trzeba je zdefiniować samemu. Ostatnią rzeczą jest + przekazanie wraz z formularzem do widoku adres strony, do której ma + zostać przekierowany użytkownik po poprawnym zalogowaniu. Jako + ciekawostkę możemy sobie dodać warunek w formularzu, który wyświetli nam + komunikat z informacją o tym że formularz nie został poprawnie + wypełniony. W ten czas nasz formularz wyglądać będzie tak: +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+    {% if form.errors %}
+        <p>
+            Nazwa użytkownika i hasło są niepoprawne. Spróbuj ponownie.
+        </p>
+    {% endif %}
+
+    <form action="{% url 'users:login' %}" method="post">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button name="submit">Zaloguj się</button>
+        <input type="hidden" name="next" value="{% url 'pizzas:index' %}" />
+   </form>
+
+{% endblock content %}
+
+

+ Dlaczego jednak jako ciekawostkę? Otóż Django sam dodaje takową + informacje jeśli formularz nie przejdzie walidacji. Teraz dodamy warunek + w pliku w szablonie bazowym aplikacji pizzas, po to abyśmy + wiedzieli, że zostaliśmy zalogowani oraz w przeciwnym wypadku wyświetli + odnośnik prowadzący do strony logowania. Poniżej znajduje się już + uzupełniony kod szablonu bazowego aplikacji pizzas. +

+
+<p>
+    <a href="{% url 'pizzas:index' %}">Pizzeria</a>-
+    <a href="{% url 'pizzas:menu' %}">Menu</a>
+</p>
+
+{% if user.is_authenticated %}
+    <p>
+        Witaj, {{ user.username }}
+    </p>
+{% else %}
+    <p>
+        <a href="{% url 'users:login' %}">Zaloguj się</a>
+    </p>
+{% endif %}
+
+{% block content %} {% endblock content%}
+
+

+ Jednego użytkownika już mamy. Możemy się zalogować się jako + superużytkownik. Po poprawnym zalogowaniu zostaniemy przeniesieni z + powrotem na stronę główną, jednak teraz zamiast Zaloguj się + zobaczymy Witaj, pizza_admin. Teraz pod powitaniem umieścimy + przycisk Wyloguj, który będzie kończył sesję użytkownika w + aplikacji. Wylogowanie również jest funkcją, która jest dostarczana wraz + z Django. Mapowanie URL-u wylogowania jest również dostarczane przez + Django, tak jak mapowanie URL-u logowania. Szablon bazowy wygląda + następująco po dodaniu nowego odnośnika. +

+
+<p>
+    <a href="{% url 'pizzas:index' %}">Pizzeria</a>-
+    <a href="{% url 'pizzas:menu' %}">Menu</a>
+</p>
+
+{% if user.is_authenticated %}
+    <p>
+        Witaj, {{ user.username }}
+    </p>
+    <p>
+        <a href="{% url 'users:logout' %}">Wyloguj</a>
+    </p>
+{% else %}
+    <p>
+        <a href="{% url 'users:login' %}">Zaloguj się</a>
+    </p>
+    <p>
+        <a href="{% url 'users:register' %}">Zarejestruj się</a>
+    </p>
+{% endif %}
+
+{% block content %} {% endblock content%}
+
+

+ W ramach eksperymentu, kliknijmy w ten odnośnik. Zostaniemy poinformowani + o wylogowaniu z naszej aplikacji przez witrynę administracyjną Django. + Nie zbyt fajnie, co? Oczywiście to zachowanie możemy zmienić, tworząc + nowy szablon w katalogu templates/registration. + Uwaga, Plik musi nazywać się: logged_out.html. + Po rozszerzeniu pliku o szablon bazowy, między znacznikami szablonu + oznaczającymi zawartość strony w tym szablonie możemy umieścić wszystko + co nam się podoba. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+    <p>
+        Dziękujemy za skorzystanie z naszej aplikacji.
+   </p>
+
+{% endblock content %}
+
+

2.4.2. Rejestracja użytkowników

+

+ Teraz możemy dać możliwość samodzielnego utworzenia konta na stronie + naszej pizzerii. Tutaj nie jest już tak kolorowo. Jedyne co nam + Django oferuje w tym przypadku jest formularz. Widok, szablon oraz + mapowanie URL-u musimy utworzyć samodzielnie. Zaczynamy od widoku dla + formularza rejestracji. +

+
+from django.shortcuts import render, redirect
+from django.contrib.auth.forms import UserCreationForm
+from django.contrib.auth import login
+
+def register(request):
+
+    if request.method != 'POST':
+        form = UserCreationForm()
+    else:
+        form = UserCreationForm(data=request.POST)
+        if form.is_valid():
+            new_user = form.save()
+            login(request, new_user)
+            return redirect('pizzas:index')
+   content = {'form': form}
+   return render(request, 'registration/register.html", context)
+
+

+ W tym przypadku aby funkcja widoku mogła poprawnie działać oraz + wyświetlać nam formularz, potrzebujemy modułów. Pierwszą funkcją jaką + importujemy jest redirect, powoduje ona + przekierowanie HTTP, na stronę podaną jako argument. Adresy stron podane + jako argumenty funkcji redirect czy też w znacznikach szablonu + url podajem w formacie + nazwa_aplikacji:nazwa_mapowania - + wartość argumentu name funkcji path w pliku + urls.py. Następnie importujemy nasz formularz oraz + funkcję login. Za pomocą tej funkcji będzie możliwe automatyczne + zalogowanie nowo utworzonego użytkownika. Funkcje widoku obsługujące + formularz posiadają pewien schemat. Taka funkcja rozpoczyna się od + sprawdzenia użytej metody przesłania danych do serwera, protokół HTTP + wyróżnia dwie GET oraz POST. + Metoda GET służy głównie do obsługi żądań osób odwiedzających + witrynę. Poniżej żądanie wyświetlenia strony konkretnej pizzy. +

+
+http://localhost:8000/pizza/1
+
+

+ Żądanie wyświetlenia konkretnej pizzy zostało przesłane do serwera za + pomocą żądania GET. Najprościej można to ująć w ten sposób, że + żądania GET są przesyłanie w adresie strony. Natomiast + żądania POST są przesyłane oddzielnym pakietem transmisji. + W żądaniach POST najczęsciej są przesyłane dane formularzy. +

+

+ Jeśli nasz widok, ktoś wywołał za pomocą żądania GET to wtedy + zmiennej form zostanie nadany pusty + formularz. Następnie definiowana jest zmienna + context zawierająca wszelkie dane dla + szablonu w tym nasz formularz. Na sam koniec funkcja widoku zwraca + wygenerowaną przed funkcję render() + stronę, na której znajduje się nasz formularz rejestracji. W przeciwnym + wypadku jeśli nasza funkcja została wywołana za pomocą żądania POST + (np. kiedy użytkownik przesłał formularz), to tworzona jest zmienna z + formularzem gdzie jego dane są pobierane z właściwości + POST obiektu + request. + Za pomocą instrukcji warunkowej if oraz + metody formularza is_valid() sprawdza + jest poprawność wypełnienia pól formularza, jeśli któraś z wartości pół + nie przechodzi walidacji (sprawdzenia poprawności), to następną czynnością + jest wpisanie formularza do zmiennej + context i wygenerowanej strony z + formularzem oraz komunikatem błędu. + Zaś kiedy formularz został wypełniony bezbłędnie to wykonywana jest + metoda formularza save(), która powoduje + zapisanie danych z formularza w bazie danych na podstawie przypisanego do + niego modelu. Zwróćmy uwagę na to, że wartość zwraca przez metodę + save() została zapisana do zmiennej + new_user. Dzięki tej zmiennej będzie + możliwe automatyczne zalogowanie zarejestrowanego użytkownika, kiedy mamy + tą zmienną możemy zalogować użytkownika za pomocą funkcji + login() ta funkcja pobiera dwa argumenty + obiekt żądania (request) oraz odniesienie do użytkownika ( + new_user). + Kiedy użytkownik został zalogowany, możemy teraz przekierować go na + stronę główną, która zostanie wyświetlona ze spersonalizowanym powitaniem + oraz odnośnikiem do wylogowania się z konta na naszej stronie. Teraz + potrzebujemy jeszcze szablonu, który poza odnośnikiem nie różni się + niczym do szablonu logowania. +

+

+ Plik szablonu formularza rejestracji znajduje się w folderze + templates/registration pod nazwą register.html: +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+    {% if form.errors %}
+        <p>Rejestracja nie powiodła się. Spróbuj ponownie</p>
+    {% endif %}
+
+    <form action="{% url 'users:register' %}" method="post"<
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button name="submit">Zarejestruj się</button>
+        <input type="hidden" name="next" value="{% url 'pizzas:index' %}" />
+    </form>
+
+{% endblock content %}
+
+

+ Funkcja mapowania w pliku users/urls.py wygląda następująco: +

+
+path('register/', views.register, name="register"),
+
+

+ Teraz możemy do szablonu bazowego aplikacji pizzas dodać + odnośnik dla niezalogowanych, prowadzący do naszej strony z rejestracją. +

+
+<p>
+    <a href="{% url 'pizzas:index' %}">Pizzeria</a>-
+    <a href="{% url 'pizzas:menu' %}">Menu</a>
+</p>
+
+{% if user.is_authenticated %}
+    <p>
+        Witaj, {{ user.username }}
+    </p>
+    <p>
+        <a href="{% url 'users:logout' %}">Wyloguj</a>
+    </p>
+{% else %}
+    <p>
+        <a href="{% url 'users:login' %}">Zaloguj się</a>
+    </p>
+    <p>
+        <a href="{% url 'users:register' %}">Zarejestruj się</a>
+    </p<
+{% endif %}
+
+{% block content %} {% endblock content%}
+
+

2.5. Rozbudowa aplikacji 'pizzas'.

+

+ Teraz kiedy mamy logowanie oraz rejestracje. To powinniśmy mieć możliwość + złożenia zamówienia w naszej pizzerii (aplikacja pizzas). Sama + operacja jest dość złożona bo do realizacji tego zadania potrzebujemy + aż 5 elementów: modelu zamówienia, widoku wyświetlającego zamówienia, + widoku dodającego zamówienia, formularza, szablonu i mapowania URL. + Zaczniemy od modelu zamówienia. Na nasze zamówienie będzie składać się + pizza, wielkość, sos pierwszy oraz sos drugi, dowóz czy odbiór własny + oraz datę zamówienia. Model prezentuje się poniżej. Stosować będziemy + skróty, które nasz kucharz będzie stanie odszyfrować dlatego pola są + takie małe. +

+
+class Order(models.Model):
+
+    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE)
+    size = models.CharField(max_length=10)
+    sauce1 = models.CharField(max_length=10)
+    sauce2 = models.CharField(max_length=10)
+    deliver = models.CharField(max_length=10)
+    date_order = models.DateTimeField(auto_now_add=True)
+
+    def __str__(self):
+        return f"{self.pizza.name} - {self.size},{self.sauce1},\
+        {self.sauce2},{self.deliver} - {self.date_order}"
+
+
+

+ Po dopisaniu naszego modelu zamówienia musimy wykonać migrację. +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py makemigrations pizzas
+(project_env) xf0r3m@macbook:python/django$ python manage.py migrate
+
+

+ Po pomyślnej migracji zarejestrujemy nowy model na witrynie + administracyjnej, po to aby dodać kilka testowych wartość do sprawdzenia + widoku wyświetlania złożonych zamówień. Widok złożonych zamówień + prezentuje się następująco: +

+
+def orders_view(request):
+
+    from pizzas.models import Order
+
+    orders = Order.objects.order_by('-date_order')
+    context = {'orders': orders}
+    return render(request, 'pizzas/orders_view.html', context)
+
+

+ W szablonie zamiast używać listy użyjemy tabeli. Poniżej znajduje się kod + szablonu. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+<table>
+    <thead>
+        <tr>
+            <td>Numer zamówienia>/td>
+            <td>Pizza<td>
+            <td>Wielkość</td>
+            <td>Sos_1>/td>
+            <td>Sos_2<td>
+            <td>Dostawa</td>
+        </tr>
+    </thead>
+    <body>
+    {% for order in orders %}
+        <tr>
+            <td>{{ order.id }}</td>
+            <d>{{ order.pizza.name }}</td>
+            <td>{{ order.size }}</td>
+            <td>{{ order.sauce1 }}</td>
+            <td>{{ order.sauce2 }}</td>
+            <td>{{ order.deliver }}</td>
+        </tr>
+    {% empty %}
+        <tr><td colspan="6">Brak zamówień</td></tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+{% endblock content %}
+
+

+ Teraz możemy przejść do składania zamówień na naszą pizzę, zaczniemy od + formularza. Nie jest on może trudny w interpretacji ale jest nieco + bardziej złożony niż te przedstawione w książce. +

+
+from django import forms
+
+from .models import Order
+
+class NewOrder(forms.ModelForm):
+    class Meta:
+        model = Order
+        fields = ['pizza', 'size', 'sauce1', 'sauce2', 'deliver']
+        labels = {
+            'pizza': 'Pizza',
+            'size': 'Wielkość',
+            'sauce1': 'Pierwszy sos',
+            'sauce2': 'Drugi sos',
+            'deliver': 'Dostawa'
+        }
+        size_choice = [
+            (None, '-----------'),
+            ('S', 'Mała'),
+            ('M', 'Duża'),
+            ('L', 'Familijna'),
+            ('XL', 'XXL 55cm')
+        ]
+        sauce_choice = [
+            ('br', '-----------'),
+            ('k', 'Ketchup'),
+            ('m', 'Majonez'),
+            ('cz', 'Czosnkowy'),
+            ('pik', 'Pikantny')
+        ]
+        deliver_choice = [
+            (None, '-----------'),
+            ('odb', 'Odbiór osobisty'),
+            ('dwz', 'Dowóz')
+        ]
+        widgets = {
+            'size': forms.Select(choices=size_choice),
+            'sauce1': forms.Select(choices=sauce_choice),
+            'sauce2': forms.Select(choices=sauce_choice),
+            'deliver': forms.Select(choices=deliver_choice)
+        }
+
+

+ Formularze w Django to nic innego jak klasy potomne, klasy + ModelForms modułu + django.forms, jednak kodu określającego + formularz nie tworzymy w samej klasie potomnej tylko w pod klasie + Meta. Z racji tego, że klasa + ModelForm bazuje na modelach (zresztą jak sama nazwa wskazuje) + musimy pamiętać o ich imporcie jeszcze przed zdefiniowaniem samej klasy. + W klasie Meta podajemy takie informacje jak + model na jakim bazuje formularz + (zmienna model), pola formularza + (lista fields) oraz etykiety + (słownik labels), z + racji tego że informacje przekazywane przez zamawiającego mogą być + predefiniowane, to cały formularz oprzemy na jednym elemencie, na liście + wyboru select. + Jeśli nasz model zawiera klucz obcy, to pole z automatu jest + ustawiane przez Django jako element select. Resztę + naszych pól musimy ustawić samodzielnie. + Zmianie elementów przydzielanych przez Django, służy słownik + widgets, w którym każdemu polu + przypisujemy wyświetlany element, w tym przypadku jest to + forms.Select czyli element HTML + select jako argument choices + podajemy listę z dwuelementowych krotek, w naszym przypadku + zdefiniowaną powyżej słownika widgets. +

+

+ Jako ciekawostkę podam fakt, że jeśli w jakieś krotce w pierwszym + elemencie podamy jako pierwszy argument, czyli wartość elementu + option, wartość None to pole automatycznie stanie się + polem required, czyli jego wartość musi być ustawiona + inaczej przeglądarka nie pozwoli wysłać formularza. Poniżej znajduje się + kod widoku obsługującego ten formularz. +

+
+def new_order(request):
+
+    if request.method != 'POST':
+        form = NewOrder()
+    else:
+        form = NewOrder(data=request.POST)
+        if form.is_valid():
+            form.save()
+            return redirect('pizzas:thank_you')
+    context = {'form': form}
+    return render(request, 'pizzas/new_order.html', context)
+
+

+ Ten przypadek obsługi jest chyba najprostszy. Nie ma tu nic złożonego, po + przejściu walidacji zamówienie jest zapisywane w bazie. Pod mapowaniem + thank_you kryje się jeden akapit z podziękowanie za złożenie + zamówienia. Poniżej znajduje kod szablonu. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+    {% if form.errors %}
+        <p>
+            Złożenie zamówienia nie powiodło się. Spróbuj ponownie
+       </p>
+    {% endif %}
+
+    <form action="{% url 'pizzas:new_order' %}" method="post">
+        {% csrf_token %}
+        {{ form.as_p }}
+	<button name="submit">Zamów</button>
+    </form>
+
+{% endblock content %}
+
+

+ Powiedzmy że zamówiliśmy pizzę, ale w pizzerii skończył się jeden jej + składnik. Kelnerka po kontakcie telefonicznym z klientem doszła do + porozumienia i klient wybrał inną pizzę. Jednak w systemie nie ma + możliwości zmiany zamówienia. Utworzymy ją. Do tego celu potrzebujemy + dodatkowego widoku, mapowania, szablonu oraz odnośnika do edycji + zamówienia w tabeli z zamówieniami. Edycje danych wpisywanych za pomocą + formularza tworzy się bardzo szybko ponieważ wystarczy skopiować widok + oraz szablon. W widoku dodać kilka rzeczy, w szablonie zmieć dwie rzecz + oraz dodać jedną. Poniżej znajduje się kod widoku, najważniejszy w tym + przedsięwzięciu. +

+
+def edit_order(request, order_id):
+
+    from .models import Order
+
+    order = Order.objects.get(id=order_id)
+
+    if request.method != 'POST':
+        form = NewOrder(instance=order)
+    else:
+        form = NewOrder(instance=order, data=request.POST)
+        if form.is_valid():
+            form.save()
+            return redirect('pizzas:edit_ok')
+    context = {'form': form, 'order': order}
+    return render(request, 'pizzas/edit_order.html', context)
+
+

+ Zatem po kolei żeby było wiadomo jakie zamówienie mamy zmienić + potrzebujemy jego identyfikatora, id z tabeli w bazie danych. + Potrzebne nam id będzie przekazywane w żądaniu GET, + przez kliknięcie w łącze na stronie z zamówieniami. Na początku naszego + widoku importujemy model Order, aby + uzyskać dostęp do egzemplarzy tego modelu w bazie. Za pomocą zapytania + Order.objects.get(id=order_id), + pobraliśmy rekord zamówienia do zmiennej + order. Następnie wykonuje się klasyczna + obsługa formularza z tą jednak różnicą, że kiedy tworzone są egzemplarze + formularza to przekazywany jest argument + instance, któremu nadawana jest wartość + naszego zapytania, ustawienie argumentu instance powoduje + wypełnienie pół formularza danymi z zapytania, + strona edit_ok zawiera jeden akapit z informacją że zapisano + zmiany w zamówieniu. + W zmiennej context została dodana + wartość obiektu order pod kluczem + order. Jest to niezbędne kiedy zmieniamy + rekordy, ponieważ w atrybucie action + formularza musimy podać id zmienianego rekordu, ponieważ ten + widok będzie wykonywany po raz drugi gdy użytkownik prześle dane. Dlatego + też po słowie kluczowym else gdzie + deklarowany jest formularz, podano argument + instance, aby było wiadomo jaki rekord + należy zmienić. Poniżej znajduje się kod szablonu. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+    {% if form.errors %}
+        <p>
+            Zmiana zamówienia nie powiodła się. Spróbuj ponownie
+        </p>
+    {% endif %}
+
+    <form action="{% url 'pizzas:edit_order' order.id %}" method="post">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button name="submit"&t;Zapisz zmiany</button>
+    </form>
+
+{% endblock content %}
+
+

+ Tutaj zmieniono atrybut action na + edit_order, dodano + order.id oraz zmieniono treść + przycisku. Poniżej znajduje się zawartość pliku pizzas/urls.py + z uwzględnieniem nowego mapowania oraz zmieniony kod szablonu + pizzas/orders_view.html. +

+

+ Plik pizzas/urls.py +

+
+from django.urls import path
+
+from . import views
+
+app_name='pizzas'
+urlpatterns = [
+    path('', views.index, name='index'),
+    path('menu', views.menu, name='menu'),
+    path('pizza/<int:pizza_id>', views.pizza_site, name='pizza_site'),
+    path('orders/', views.orders_view, name="orders"),
+    path('new_order/', views.new_order, name="new_order"),
+    path('edit_order/<int:order_id>', views.edit_order, name='edit_order')
+]
+
+

+ Plik pizzas/templates/pizzas/orders_view.html +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+<table border="1">
+    <thead>
+        <tr>
+            <th>Numer zamówienia</th>
+            <th>Pizza</th>
+            <th>Wielkość</th>
+            <th>Sos_1</th>
+            <th>Sos_2</th>
+            <th>Dostawa</th>
+            <th>>/th>
+        </tr>
+    </thead>
+    <tbody>
+    {% for order in orders %}
+        <tr>
+            <td>{{ order.id }}</td>
+            <td>{{ order.pizza.name }}>/td>
+            <td>{{ order.size }}</td>
+            <td>{{ order.sauce1 }}</td>
+            <td>{{ order.sauce2 }}</td>
+            <td>{{ order.deliver }}</td>
+            <td><a href="{% url 'pizzas:edit_order' order.id %}">Zmień</a></td>
+        </tr>
+    {% empty %}
+        <tr><td colspan="7">Brak zamówień</td></tr>
+    {% endfor %}
+    <tbody>
+</table>
+
+{% endblock content %}
+
+

2.6. Zabezpieczenie aplikacji

+

+ Kolejną rzeczą jak należy zrobić to zabezpieczyć pewne strony przed + niepowołanym dostępem. W zależności od tego jakie restrykcje chcemy + wprowadzić możemy użyć konkretnych metod. Pierwszą z nich jest wymaganie + logowania, jeśli nie zalogowani przejedziemy pod adres + http://localhost:8000/new_order. Zostanie nam przedstawiona + strona do składania zamówień. W ten sposób osoba złośliwa może po + nabijać zamówień, zostawiając jedynie ślad w logach o ile uruchomiliśmy + serwer wraz z opcją zapisywania dziennika. Django daje nam banalny sposób + na zabezpieczenie się przed tego typu sytuacjami. + W pliku views.py w aplikacji pizzas importujemy + dekorator (dodatek/modyfikator do funkcji) o nazwie + login_required. +

+
+from django.contrib.auth.decorators import login_required
+
+

+ Dekorator login_required sprawdzi czy + jesteśmy zalogowani, kiedy będziemy wywoływać funkcje widoku. Dekoratora + używamy w pomocą znaku @ oraz nazwy + dekoratora tuż nad definicją widoku, tak jak przedstawiono to + poniżej: +

+
+@login_required
+def orders_view(request):
+    ...
+
+@login_required
+def new_order(request):
+    ...
+
+@login_required
+def edit_order(request, order_id):
+
+

+ Aby działało to poprawnie w ustawieniach projektu pizzeria/settings.py + musimy zdefiniować zmienną LOGIN_URL na samym dole pliku, jeśli tego nie + zrobimy niezalogowani użytkownicy, przechodzący pod zabezpieczoną przez + dekorator stronę otrzymają stronę błędu, że nie znaleziono strony. + Wartość zmiennej LOGIN_URL zapisujemy w + klasycznym odniesieniu do strony, tak jak w przypadku znaczników szablonu + URL, czy funkcji redirect + (nazwa_aplikacji:nazwa_mapowania_URL). +

+
+LOGIN_URL = 'users:login'
+
+

+ Teraz kiedy nie zalogowani, spróbujemy na przykład podejrzeć zamówienia. + Zostaniemy przekierowani na stronę logowania, identycznie będzie z + wywołaniem widoku new_order, czyli złożeniem nowego zamówienia + oraz z jego edycją. +

+

+ Drugi sposób w jaki możemy zabezpieczyć naszą aplikacje, jest + wyświetlenie użytkownikom rzeczy stricte tyczących się ich. Powiedzmy że + użytkownik powinien mieć wgląd w swoje zamówienia. Ta zmiana będzie + wymagać trochę pracy, ale myślę że jest ciekawy do opisania przypadek, + ponieważ musimy zmienić już wdrożony model danych. Dodać jedną kolumnę do + tabeli, to nie jest problem jeśli tabela była by pusta, ale co jeśli dane + do tej tabeli już zostały wprowadzone dane. Zaczniemy od zaimportowania + modelu User w pliku pizzas/models.py. +

+
+from django.contrib.auth.models import User
+
+

+ Następnie dodamy do naszego modelu Order + nowe kolumnę o nazwie owner, która + będzie kluczem obcym w modelu User dostarczanym przez Django. +

+
+class Order(models.Model):
+
+    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE)
+    size = models.CharField(max_length=10)
+    sauce1 = models.CharField(max_length=10)
+    sauce2 = models.CharField(max_length=10)
+    deliver = models.CharField(max_length=10)
+    date_order = models.DateTimeField(auto_now_add=True)
+    owner = models.ForeignKey(User, on_delete=models.CASCADE)
+
+    def __str__(self):
+        return f"{self.pizza.name} - {self.size},{self.sauce1},\
+        {self.sauce2},{self.deliver} - {self.date_order}"
+
+

+ Aby wdrożyć nasze zmiany musimy wykonać migrację. +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py makemigrations pizzas
+
+

+ Podczas wykonywania tego polecenia Python wyświetli informacje o tym, że + próbujemy dodać nie-zerowe pole do modelu Order bez wartości + domyślnej i nie jest to możliwe, ponieważ zmiany muszą być również + uwzględnione na istniejących już rekordach. Python daje nam do wyboru + dwie opcje, albo podanie teraz wartość jaka zostanie przypisana w polu + owner dla istniejących już rekordów, lub porzucenie migracji i + dodanie wartości domyślnej w deklaracji pola w klasie modelu. +

+
+You are trying to add a non-nullable field 'owner' to order without a default; 
+we can't do that (the database needs something to populate existing rows).
+Please select a fix:
+ 1) Provide a one-off default now (will be set on all existing rows with a null
+    value for this column)
+ 2) Quit, and let me add a default in models.py
+Select an option: 2
+
+

+ Teraz wybierzemy opcje nr. 2. Jeśli podczas testowania rejestracji + stworzyliśmy użytkownika to możemy mu nadać wszystkie zamówienia, + models.ForeignKey() zawiera identyfikatory (id) z + zewnętrznej tabeli. Aby dowiedzieć się jakie id mają + nasi użytkownicy skorzystamy z pomocy powłoki Django. +

+
+(project_env) xf0r3m@macbook:python/django$ python manage.py shell
+
+
+>>> from django.contrib.auth.models import User
+>>> users = User.objects.all()
+>>> for user in users:
+...     print(f"{user.id} {user.username}")
+...
+1 pizza_admin
+2 xf0r3m
+
+

+ Na początku importujemy nasz model, następnie pobieramy wszystkie + egzemplarze tego modelu aby poprzez iteracje wpisać id oraz + nazwę użytkownika. Teraz wiemy, że nasz stworzony w celach testowych + użytkownik ma id = 2. Oczywiście moglibyśmy to pominąć i + domyślić się że musi mieć id = 2. Jednak chciałem przedstawić + tutaj sposób w jaki możemy to sprawdzić aby mieć pewność. Również możemy + wyszukać użytkownika za pomocą lekko zmodyfikowanego zapytania. +

+
+>>> user = User.objects.get(username='xf0r3m')
+>>> user.id
+2
+
+

+ Teraz kiedy znamy już id możemy ponownie wydać polecenie + migracji. Python znów nas zapyta o to samo, jednak teraz wybieramy opcje + nr. 1 a następnie po znaku zachęty >>> wpiszemy + id naszego użytkownika. +

+
+You are trying to add a non-nullable field 'owner' to order without a default;
+we can't do that (the database needs something to populate existing rows).
+Please select a fix:
+ 1) Provide a one-off default now (will be set on all existing rows
+ 	with a null value for this column)
+ 2) Quit, and let me add a default in models.py
+Select an option: 1
+Please enter the default value now, as valid Python
+The datetime and django.utils.timezone modules are available,
+so you can do e.g. timezone.now
+Type 'exit' to exit this prompt
+>>> 2
+
+

+ Teraz zmodyfikujemy widok order_views, + tak aby wyświetlał zamówienia wszystkich użytkowników, jeśli zalogowanym + użytkownikiem jest pizza_admin, czyli + nasz superużytkownik. A jeśli zalogowany jest kto inny, to widzi on + tylko swoje zamówienia. +

+
+@login_required
+def orders_view(request):
+
+    from pizzas.models import Order
+
+    if request.user.username != 'pizza_admin':
+        orders = Order.objects.filter(owner=request.user).order_by('-date_order')
+    else:
+        orders = Order.objects.order_by('-date_order')
+
+
+    context = {'orders': orders}
+    return render(request, 'pizzas/orders_view.html', context)
+
+

+ Ważną rzeczą użytą w tym przypadku jest to, iż egzemplarz klasy + User zalogowanego użytkownika jest przechowywany w właściwości + user obiektu + request. Jednak chcąc + przyrównać nazwy użytkowników musimy użyć właściwości username. + Ze względu na iż zmodyfikowaliśmy model Order teraz nie możliwe + jest dodanie nowego zamówienia bez zmian uwzględniających właściciela. + Poniżej znajduje się kod widoku new_order uwzględniający właściciela. +

+
+@login_required
+def new_order(request):
+
+    if request.method != 'POST':
+        form = NewOrder()
+    else:
+        form = NewOrder(data=request.POST)
+        if form.is_valid():
+            new_order = form.save(commit=False)
+            new_order.owner = request.user
+            new_order.save()
+            return redirect('pizzas:index')
+    context = {'form': form}
+    return render(request, 'pizzas/new_order.html', context)
+
+

+ Z założeń wynika iż użytkownik raz przypisany do zamówienia jest + nietykalny, nie musimy w ogóle zmieniać kodu widoku edit_order. + Wprowadziłem lekką zmianę do szablonu orders_view.html aby + wyświetlał datę, według narzuconego formatu. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+<table border="1">
+    <thead>
+        <tr>
+            <th>Numer zamówienia</th>
+            <th>Pizza</th>
+            <th>Wielkość</th>
+            <th>Sos_1</th>
+            <th>Sos_2</th&t;
+            <th>Dostawa</th>
+            <th>Data zamówienia</th>
+            <th></th>
+        </tr>
+    </thead>
+    <tbody>
+    {% for order in orders %}
+        <tr>
+            <td>{{ order.id }}</td>
+	    <td>{{ order.pizza.name }}</td>
+            <td>{{ order.size }}</td>
+	    <td>{{ order.sauce1 }}</td>
+            <td>{{ order.sauce2 }}</td>
+            <td>{{ order.deliver }}</td>
+            <td>{{ order.date_order|date:'d M Y H:i'  }}</td>
+	    <td><a href="{% url 'pizzas:edit_order' order.id %}">Zmień</a></td>
+        </tr>
+    {% empty %}
+        <tr><td colspan="7">Brak zamówień</td></tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+{% endblock content %}
+
+

+ Pionowa kreska | oraz + date:'d M Y H:i' są to filtry + znaczników szablonu, w tym przypadku jest filtr daty, który wyświetla + nam date w formacje 01 Jan 1970 00:00. +

+

+ Aby upewnić się ze wszystko działa utwórzmy trzeciego użytkownika i + złóżmy zamówienie. Użytkownicy powinni widzieć tylko swoje zamówienia, + z kolei superużytkownik powinien widzieć je wszystkie. Ostatnią rzeczą + jaka pozostała do zabezpieczenia, jest wyłączność na edycje zamówień + przez superużytkownika. Zwykli użytkownicy nie powinni mieć dostępu do + zmiany zamówienia. Zmian musimy dokonać w dwóch miejscach: w szablonie + oraz w widoku edit_order. Najpierw rozpoczniemy od szablonu. + Poniżej zmieniony kod szablonu +

+
+{% extends 'pizzas/base.html' %}
+
+{% block content %}
+
+<table border="1">
+    <thead>
+        <tr>
+            <th>Numer zamówienia</th>
+            <th>Pizza</th>
+            <th>Wielkość</th>
+            <th>Sos_1</th>
+            <th>Sos_2</th>
+            <th>Dostawa</th>
+            <th>Data zamówienia</th>
+        {% if user.username == 'pizza_admin' %}
+            <th></th>
+        {% endif %}
+        </tr>
+    </thead>
+    <tbody>
+    {% for order in orders %}
+        <tr>
+            <td>{{ order.id }}</td<
+            <td>{{ order.pizza.name }}</td>
+            <td>{{ order.size }}</td>
+            <td>{{ order.sauce1 }}</td<
+            <td>{{ order.sauce2 }}</td>
+            <td>{{ order.deliver }}</td>
+            <td>{{ order.date_order|date:'d M Y H:i'  }}</td>
+            {% if user.username == 'pizza_admin' %}
+                <td><a href="{% url 'pizzas:edit_order' order.id %}">Zmień</a></td>
+            {% endif %}
+        </tr>
+    {% empty %}
+        <tr><td colspan="7">Brak zamówień</td></tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+{% endblock content %}
+
+

+ Dodaliśmy dwa znaczniki warunkowe szablonu, sprawdzające czy + uwierzytelniony użytkownik to + pizza_admin. Teraz zajmiemy się kodem + widoku, na początek importujemy dwie rzeczy z modułu + django.http. +

+
+from django.http import HttpResponseRedirect, Http404
+
+

+ Następnie w kodzie widoku dopisujemy warunek, który przyrówna + request.user.username do ciągu + pizza_admin jeśli się te wartości nie + będą się zgadzać wtedy zostanie zgłoszony wyjątek + Http404. Poniżej znajduje się + kod zmodyfikowanej funkcji widoku. +

+
+@login_required
+def edit_order(request, order_id):
+
+    if request.user.username != 'pizza_admin':
+        raise Http404
+
+    from .models import Order
+
+    order = Order.objects.get(id=order_id)
+
+    if request.method != 'POST':
+        form = NewOrder(instance=order)
+    else:
+        form = NewOrder(instance=order, data=request.POST)
+        if form.is_valid():
+            form.save()
+            return redirect('pizzas:index')
+    context = {'form': form, 'order': order}
+    return render(request, 'pizzas/edit_order.html', context)
+
+

2.7. Nadawanie stylu aplikacji - Bootstrap 4

+

+ Przed nami ostatni rozdział podróży przez Pythona oraz przez Django. + Zostały jeszcze dwa zagadnienia, które należało by omówić w kontekście + Django. Nadawanie stylu oraz oraz wdrożenie naszej aplikacji na + platformie sieciowej Heroku. Zaczniemy od nadawania stylu, aby + nasza aplikacja zaczęła wyglądać bardziej profesjonalnie za pomocą + znanego zestawu narzędzi jakim jest Bootstrap 4. Dla + naszej aplikacji skorzystamy z prostego motywu. Na początku instalujemy + dodatek zawierający Bootstrap przygotowany do współpracy z Django. W + aktywnym środowisku wirtualnym wydajemy polecenie: +

+
+(project_env) xf0r3m@macbook:python/django$ pip install django-bootstrap4
+
+

+ Po zainstalowaniu Bootstrap, dopisujemy go zainstalowanych aplikacji w + naszym projekcie. Plik pizzeria/settings.py, zmienna + INSTALLED_APPS. +

+
+INSTALLED_APPS = [
+    'users',
+    'pizzas',
+    'bootstrap4',
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+]
+
+

+ Teraz kiedy nasz Bootstrap jest już zainstalowany. Możemy podmienić kod z + szablonu base.html na ten poniżej. +

+

+ Najprościej rzecz ujmując, ten szablony stworzy bazową stronę naszej + aplikacji. Na górze strony zostanie umieszczony responsywny pasek + nawigacyjny, zawierający wszystkie nasze dotychczasowe odnośniki oraz + nazwę aplikacji. Responsywność wygląda w ten sposób że jeśli strona + zostanie wyświetlona na wąskim ekranie, odnośniki zostaną schowane w + wysuwanym na dół menu. A na pasku zostanie wyświetlona nazwa aplikacji + czy już w tym przypadku projektu oraz przycisk aktywujący wysunięcie + menu. Poniżej znajduje się kod szablonu bazowego. +

+
+{% load bootstrap4 %}
+
+<!doctype html>
+<html lang="pl">
+    <head>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
+        <title>Pizzas>/title<
+        {% bootstrap_css %}
+        {% bootstrap_javascript jquery='full' %}
+    </head>
+    <body<
+        <nav class="navbar navbar-expand-md navbar-light bg-light mb-4 border">
+            <a class="navbar-brand" href="{% url 'pizzas:index' %}"<
+                Dolce&Gusto
+            </a>
+            <button class="navbar-toggler" type="button" data-toggle="collapse" 
+            data-target="#navbarCollapse" aria-controls="navbarCollapse" 
+            aria-expanded="false" aria-label="Toggle navigation">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="collapse navbar-collapse" id="navbarCollapse">
+                <ul class="navbar-nav ml-auto">
+                    {% if user.is_authenticated %}
+                        <li class="nav-item"<
+                            <span class="navbar-text">
+                                Witaj, {{ user.username }}
+                            </span>
+                        </li>
+                        {% if user.username == 'pizza_admin' %}
+                            <li class="nav-item">
+                                <a class="nav-link" href="{% url 'pizzas:orders' %}">
+                                    Zamówienia
+                                </a>
+                            </li>
+                        {% else %}
+                            <li class="nav-item">
+                                <a class="nav-link" href="{% url 'pizzas:new_order' %}">
+                                    Złóż zamówienie
+                                </a>
+                            </li>
+                            <li class="nav-item">
+                                <a class="nav-link" href="{% url 'pizzas:orders' %}">
+                                    Moje zamówienia
+                                </a>
+                            </li>
+                        {% endif %}
+                        <li class="nav-item">
+                            <a class="nav-link" href="{% url 'users:logout' %}">
+                                Wyloguj
+                            </a>
+                        <li>
+                    {% else %}
+                        <li class="nav-item">
+                            <a class="nav-link" href="{% url 'users:register' %}">
+                                Rejestruj
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="{% url 'users:login' %}">
+                                Zaloguj
+                            </a<
+                        </li>
+                    {% endif %}
+                </ul>
+            </div>
+        </nav>
+        <main role="main" class="container">
+            <div class="pb-2 mb-2 border-bottom"<
+                {% block page_header %} {% endblock page_header %}
+            </div>
+            <div>
+                {% block content %}{% endblock content %}
+            </div>
+        </main>
+    </body>
+</html>
+
+

+ W tym szablonie na samy początku ładujemy Bootstrap 4 aby + mieć możliwość skorzystania ze znaczników szablonu przygotowanych przez + tę aplikację. Następnie tworzona jest podstawowa struktura strony HTML, + z zaznaczeniem użycia języka polskiego w atrybucie + lang w znaczniku otwierającym HTML, w + nagłówku strony - pomiędzy znacznikami + head, przekazywane są informacje + odpowiedzialne za kodowanie strony <meta + charset="utf-8">, responsywność + <meta name="viewport" ...>, + ustawienie tekstu wyświetlanego w tytule karty lub/i okna przeglądarki + <title></title>. + Następnie mamy dwa znaczniku szablonu Django, w których to ładowane są + pliki arkusza stylów CSS oraz biblioteki JavaScript ze wskazaniem o + użyciu pełnej biblioteki, a nie wersji odchudzonej (nie zawierającej + obsługi AJAX-a oraz efektów - takich rzeczy jak np. slideToggle). +

+

+ W ciele strony - między znacznikami + <body> umieszczamy nasz pasek + nawigacyjny <nav ...>. Na pasku + nawigacyjnym umieszczamy odnośnik do strony głównej zatytułowany nazwą + projektu w Django, przycisk widoczny jedynie na małych ekranach, + zwężonych oknach przeglądarki lub dużych zoomach, powodujący wyjechanie + menu ukrytego w wyżej wymienionych sytuacjach zaraz pod przyciskiem + znajduje się znajduje się sekcja + <div> z menu przedstawionym tutaj + za pomocą listy nieuporządkowanej. Wewnątrz listy znajdują się znaczniki + szablonu oraz odnośniki znane nam z poprzedniej wersji pliku + base.html. Pod paskiem nawigacji znajduje się element główny + naszej strony, zwierający dwa znaczniki sekcji. +

+

+ Pierwszy z nich zawiera, parę znaczników szablonu + block page_header, dzięki temu + zdefiniowany na innej stronie znaczniki block page_header + zostanie wstawiony w to miejesce, nieco enigmatyczne wydają się użyte w + tej sekcji klasy, pierwszy z nich pb-2 + oznacza wewnętrzny odstęp dolny treści elementu krawędzi elementu + (padding-bottom) o wielkości + $spacer * 0,5, gdzie $spacer + (zmienna SASS - język pre procesora kompilowany do CSS) przyjmuje wartość + 16px. klasa pb istnieje w 5 wariantach. od * 0,25 od * 3. + Identycznie jest z drugą klasą, tylko że zamiast dopełnienia (odstęp + pomiędzy treścią elementu a jego krawędzią), mamy margines czyli odstęp + między krawędzią elementu a krawędzią następnego elementu, w naszym + przypadku mamy margines dolny, ponieważ po literce + m występuje literka + b następnie po myślniku mamy warjant, + klasa border-bottom powoduje nałożenie stylów zdefiniowanych w tej + klasie na dolną krawędź elementów. + Nie ma co rozwodzić się na wszystkimi użytymi tym przykładzie klasami. + Ponieważ ten kod w 90% został zaczerpnięty z przykładów znajdujących + się po tym adresem + https://getbootstrap.com/docs/4.5/examples/ + jedne co zostało zmienione to podział elementu + main na dwie sekcje div i nadanie + większego odstępu pierwszej sekcji od drugie wyżej wymienionymi stylami. + Teraz nadamy styl stronie głównej. +

+

+ Poniżej prezentuje się kod szablonu strony głównej, w przeciwieństwie do + poprzedniego nie jest tak obszerny. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block page_header %}
+<div class="jumbotron">
+    <div class="container">
+      <h1 class="display-3">Dolce&Gusto</h1>
+      <p>Pyszna pizza tylko na dowóz. Zamów już dziś.</p>
+      <p>>a class="btn btn-primary btn-lg" href="{% url 'users:register' %}" role="button"<Zarejestruj się &raquo;</a></p>
+    </div>
+</div>
+{% endblock page_header %}
+
+

+ Tutaj zostaje wykorzystany blok page_header + aby umieścić element nazwany przez Bootstap Jumbotronem. Jest to + wyróżniający się duży prostokąt, przeważnie z dużym tytułem, drobnym + opisem oraz łączem w postaci przycisku. "&raquo;" to encja HTML + (encje zawierają znaki specjalnej, cięzko jest wpisać za pomocą + klawiatury) przedstawiąca dwa połączone znaki większości lub jak kto woli + dwa prawe ostre nawiasty "»" . Przycisk kieruje na formularz rejestracji, + teraz sobie obstylujemy formularze. Styl dla formularzy rejestracji + będzie taki podstawowy, a styl dla formlarza logowania weźmiemy z + przykładów na stronie Bootstrap. +

+

+ Poniżej znajduje się kod formularza rejestracji, jest to klasyczny + książkowy przykład nadawania formularzom w Django stylów Bootstrap 4. +

+
+{% extends 'pizzas/base.html' %}
+{% load bootstrap4 %}
+
+{% block page_header %}
+    <h2>Rejestracja</h2>
+{% endblock page_header %}
+
+{% block content %}
+
+    <form action="{% url 'users:register' %}" method="post">
+
+        {% csrf_token %}
+        {% bootstrap_form form %}
+        {% buttons %}
+            <button name="submit" class="btn btn-primary">Zarejestruj się</button>
+        {% endbuttons %}
+
+        <input type="hidden" name="next" value="{% url 'pizzas:index' %}" />
+    </form<
+
+{% endblock content %}
+
+

+ Ten formularz będzie nieco inny, dodamy obraz w bloku + page_header. Musimy dodać również + dostosowane dlatego tego formularza style. W tym przykładzie warto + zwrócić uwagę na to że nie wykorzystaliśmy formularza przygotowanego + przez Django, skorzystaliśmy jedynie z nazw pól odpowiednich dla + formularza i przesłaliśmy nasz spersonalizowany formularz. Kod jest nieco + obszerny. +

+
+{% extends 'pizzas/base.html' %}
+
+{% block page_header %}
+    <img src="https://i.imgur.com/olxvhk5.jpg" style="width: 100%;" />
+{% endblock page_header %}
+
+{% block content %}
+<style>
+.form-signin {
+  width: 100%;
+  max-width: 330px;
+  padding: 15px;
+  margin: auto;
+}
+.form-signin .checkbox {
+  font-weight: 400;
+}
+.form-signin .form-control {
+  position: relative;
+  box-sizing: border-box;
+  height: auto;
+  padding: 10px;
+  font-size: 16px;
+}
+.form-signin .form-control:focus {
+  z-index: 2;
+}
+.form-signin input[type="email"] {
+  margin-bottom: -1px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.form-signin input[type="password"] {
+  margin-bottom: 10px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+</style>
+
+    {% if form.errors %}
+    <div class="alert alert-danger alert-dismissible fade show" role="alert">
+        Niepoprawny login lub hasło. Spróbuj ponownie.
+        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button<
+      </div>
+    {% endif %}
+
+    <form class="form-signin" action="{% url 'users:login' %}" method="post">
+        {% csrf_token %}
+        <h1 class="h3 mb-3 font-weight-normal text-center">Zaloguj się</h1>
+        <label for="username" class="sr-only">Nazwa użytkownika</label>
+        <input type="text" id="username" name="{{form.username.html_name}}" 
+        class="form-control" placeholder="Nazwa użytkownika" required autofocus>
+        <label for="form.password" class="sr-only">Hasło</label>
+        <input type="password" id="password" name="{{form.password.html_name}}" 
+        class="form-control" placeholder="Hasło" required>
+        <button class="btn btn-lg btn-primary btn-block" 
+        type="submit">Zaloguj</button>
+        <p class="mt-5 mb-3 text-muted text-center">&copy; 2020</p>
+        <input type="hidden" name="next" value="{% url 'pizzas:index' %}" />
+    </form>
+
+{% endblock content %}
+
+

+ Z racji tego iż nasz formularz jest dostosowywany. Musieliśmy też dodać + również własny komunikat o tym że logowanie się nie powiodło. Alert z + możliwością zamknięcia znajduje się w pomiędzy warunkowymi znacznikami + szablonu. Do obstylowania pozostała jeszcze tabelka z zamówieniami, + formularz zamówienia, edycja zamówienia, menu, strona pizzy oraz strona + wylogowania. Poniżej znajdują sią szablony obstylowanych już stron. +

+

+ Strona podglądu zamówień: +

+
+{% extends 'pizzas/base.html' %}
+
+{% block page_header %}
+    <img src="https://i.imgur.com/olxvhk5.jpg" style="width: 100%;" /<
+{% endblock page_header %}
+
+{% block content %}
+
+<table class="table">
+    <thead>
+        <tr>
+            <th scope="col">Nr zamówienia</th>
+            <th scope="col">Pizza</th>
+            <th scope="col">Wielkość</th;>
+            <th scope="col">Sos_1</th>
+            <th scope="col">Sos_2</th>
+            <th scope="col">Dostawa</th>
+            <th scope="col">Data zamówienia</th>
+        {% if user.username == 'pizza_admin' %}
+            <th></th>
+        {% endif %}
+        </tr>
+    </thead>
+    <tbody>
+    {% for order in orders %}
+        <tr>
+            <th scope="row">{{ order.id }}</th>
+            <td>{{ order.pizza.name }}>/td<
+            <td>{{ order.size }}</td>
+            <td>{{ order.sauce1 }}</td>
+            <td>{{ order.sauce2 }}</td>
+            <td>{{ order.deliver }}</td>
+            <td<{{ order.date_order|date:'d M Y H:i'  }}</td>
+            {% if user.username == 'pizza_admin' %}
+                <td><a href="{% url 'pizzas:edit_order' order.id %}">Zmień</a></td>
+            {% endif %}
+        </tr>
+    {% empty %}
+        <tr><td colspan="7">Brak zamówień</td></tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+{% endblock content %}
+
+

+ Strona formularza zamówień: +

+
+{% extends 'pizzas/base.html' %}
+{% load bootstrap4 %}
+
+{% block page_header %}
+    <img src="https://i.imgur.com/olxvhk5.jpg" style="width: 100%;" />
+{% endblock page_header %}
+
+{% block content %}
+
+    <form action="{% url 'pizzas:new_order' %}" method="post">
+        {% csrf_token %}
+        {% bootstrap_form form %}
+        {% buttons %}
+            <button name="submit" class="btn btn-primary">Zamów</button>
+        {% endbuttons %}
+    </form>
+
+{% endblock content %}
+
+

+ Warto zaznaczyć że usunięto znacznik warunkowy, który wyświetlał + informacje, o ile zapisanie zmian się nie powiodło, otóż jeśli + wyświetlenie formularza pozostawiamy Bootstrapowi, to on sam wyświetli + komunikat jeśli w formularzu pojawią się błędy. +

+

+ Strona edycji zamówień: +

+
+{% extends 'pizzas/base.html' %}
+{% load bootstrap4 %}
+
+{% block page_header %}
+    >img src="https://i.imgur.com/olxvhk5.jpg" style="width: 100%;" />
+{% endblock page_header %}
+
+
+{% block content %}
+
+    <form action="{% url 'pizzas:edit_order' order.id %}" method="post">
+        {% csrf_token %}
+        {% bootstrap_form form %}
+        {% buttons %}
+        <button name="submit" class="btn btn-primary">Zapisz zmiany</button>
+        {% endbuttons %}
+    </form>
+
+{% endblock content %}
+
+

+ Strona menu: +

+
+{% extends 'pizzas/index.html' %}
+
+{% block page_header %}
+    <img src="https://i.imgur.com/olxvhk5.jpg" style="width: 100%;" />
+{% endblock page_header %}
+
+{% block content %}
+
+<table class="table">
+    <thead<
+        <th scope="col">Pizza</th>
+        <th scope="col">Składniki</th>
+        <th scope="col"></th>
+    </thead>
+    <tbody>
+        {% for pizza in pizzas %}
+        <tr<
+            <th scope="row">{{ pizza.name }}</td>
+            <td>{{ pizza.topings }}</td>
+            <td><a href="{% url 'pizzas:pizza_site' pizza.id %}">Wybierz</a></td>
+        </tr>
+    {% empty %}
+        <tr>Nie ustalono jeszcze menu</tr>
+    {% endfor %}
+    </tbody>
+</table>
+
+
+{% endblock content %}
+
+

+ Strona pizzy: +

+
+{% extends 'pizzas/base.html' %}
+
+{% block page_header %}
+    <img src="https://i.imgur.com/olxvhk5.jpg" style="width: 100%;" />
+{% endblock page_header %}
+
+{% block content %}
+
+<h2>{{ name }}</h2>
+
+<ul class="list-group list-group-flush">
+    {% for toping in topings %}
+        <li class="list-group-item">{{ toping }}<li>
+    {% empty %}
+        <li class="list-group-item">Dodatki na życzenie>/li>
+    {% endfor %}
+</ul>
+
+{% endblock content %}
+
+

+ Strona wylogowania: +

+
+{% extends 'pizzas/base.html' %}
+
+{% block page_header %}
+    <img src="https://i.imgur.com/olxvhk5.jpg" style="width: 100%;" />
+{% endblock page_header %}
+
+
+{% block content %}
+
+<div class="alert alert-primary" role="alert">
+    Dziękujemy za skorzystanie z naszej aplikacji.
+  </div>
+
+
+
+{% endblock content %}
+
+

2.8. Platforma Heroku

+

+ Teraz kiedy mamy obstylowaną naszą aplikacje, możemy wrzucić ją na + platformę sieciową Heroku. Wdrożenie danych na platformę + Heroku, będzie wymagało trochę zachodu. Na początku sprawdzimy czy w + naszym systemie są dostępne pakiety, które umożliwią kompilacje + instalowanego przez pip oprogramowania. Poniższa procedurę + testowano na Ubuntu LTS Desktop 20.04, w terminalu wydajemy następujące + polecenie. +

+
+$ sudo apt install python3-psycopg2 python3-dev libpq-dev postgresql-server-dev-all build-essential
+
+

+ Powyższe polecenie zainstaluje wybrane pakiety jeśli, któregoś brakuje w + systemie. Aby móc w ogóle pracować z Heroku potrzebujemy założyć sobie na + platformie konto, aby to zrobić przechodzimy pod ten adres: + https://signup.heroku.com/. +

+

+ Po założeniu konta możemy zainstalować heroku w naszym systemie. +

+
+$ sudo snap install --classic heroku
+
+

+ Kiedy nasze oprogramowanie zostanie zainstalowane, możemy przejść do + katalogu naszą aplikacją i uruchomić środowisko wirtualne. +

+
+$ cd python/django3
+python/django3 $ source blog_env/bin/activate
+
+

+ W środowisku wirtualnym instalujemy wymagane poniższe pakiety. +

+
+(blog_env) python/django3 $ pip install wheel
+(blog_env) python/django3 $ pip install psycopg2
+(blog_env) python/django3 $ pip install django-heroku
+(blog_env) python/django3 $ pip install gunicorn
+
+

+ Aby nasza aplikacja mogła działać na platformie Heroku w sposób + identyczny jak na komputerze lokalnym, musi mieć zainstalowane takie + samo oprogramowanie jakie instalowaliśmy przez + pip do tej pory. Nie było tego dużo, + django oraz django-bootstrap4. Jednak Heroku nie + rozwiąże sobie zależności samodzielnie, dlatego na liście trzeba + uwzględnić wszystko razem z zależnościami, to zadanie możemy wykonać + jednym poleceniem. +

+
+(blog_env) python/django3 $ pip freeze > requirements.txt
+
+

+ Plik musi nazywać requirements.txt. Tak wygląda jego zawrtość: +

+
+asgiref==3.2.10
+beautifulsoup4==4.9.1
+dj-database-url==0.5.0
+Django==3.1
+django-bootstrap4==2.2.0
+django-heroku==0.3.1
+gunicorn==20.0.4
+psycopg2==2.8.5
+pytz==2020.1
+soupsieve==2.0.1
+sqlparse==0.3.1
+whitenoise==5.2.0
+
+

+ Uwaga, może się zdarzyć że w tym pliku znajdzie się taka + linia: pkg-resources==0.0.0. Należy ją + usunąć, gdyż nasz projekt nie zostanie zbudowany na Heroku, bo nie będzie + mógł odnaleźć takiej zależności. Ta linia nie jest istotna, została + wpisana do pliku przez błąd pip. +

+

+ Po utworzeniu listy zależności należy wskazać Heroku, jakiej + wersji Pythona ma używać dla naszego projektu, wersje sprawdzimy + poniższym poleceniem. +

+
+(blog_env) python/django3 $ python --version
+Python 3.8.2
+
+

+ Natomiast zawartość pliku runtime.txt (nazwa pliku musi być + identyczna) musi wyglądać następująco: +

+
+python-3.8.2
+
+

+ Python z małej litery i myślnik zamiast spacji. Nastepnym a zarazem + ostatnim potrzebnym nam plikiem, będzie plik stricte Heroku + Procfile, w nim zostanie zdefiniowany proces maszyny wirtualnej + odpowiedzialny za hostowanie naszego projektu. +

+

+ Zawrtość pliku Procfile +

+
+web: gunicorn blog.wsgi --log-file -
+
+

+ Teraz kiedy mamy wszystkie pliki możemy dopisać ustawienia dla Heroku w + naszym projekcie. W głównym katalogu projektu w pliku + settings.py na samym końcu pliku dopisujemy poniższe linie. +

+
+import django_heroku
+django_heroku.settings(locals())
+
+

+ Aby móc synchronizować nasz kod źródłowy z platformą Heroku skorzystamy z + systemu kontroli wersji Git. Git w dużym skrócie tworzy + zatwierdzenie (commit) zmian w kodzie, które są tak jakby + oddzielną jego wersją. Projekty tworzą repozytoria, w których + przechowywane są zatwierdzenia, każda nowa funkcjonalność może być + (nawet dobrze, gdyby była) kolejnym zatwierdzeniem. Daje nam to + możliwość powrotu do poprzedniej wersji w razie problemów. Git jest + obecnie standardem zarządania kodem źródłowym, w nie długim czasie od + publikacji tego materiału pojawi się kolejny tym razem dużo mniejszy + posty odnośnie podstaw Git-a. +

+

+ Git powinien być już zainstalowany w systemie. Jednak warto się upewnić + wydając polecenie: +

+
+$ git --version
+
+
+git version 2.25.1
+
+

+ Jeśli dostaniemy taki wynik polecenie, oznacza to że Git jest już + zainstalowany w systemie. Instalacja na Ubuntu wymaga jednego polecenia: +

+
+$ sudo apt install git
+
+

+ Teraz możemy przejść do konfiguracji, musimy podać nazwę użytkownika oraz + adres e-mail, który dokonuje zatwierdzeń, ponieważ Git to monitoruje, + jeśli zapomnimy o tym kroku, Git będzie wymagał podania tych danych przy + pierwszym przesłaniu kodu do zdalnego repozytorium na platformie Heroku. +

+
+$ git config --global user.name "xf0r3m"
+$ git config --global user.email "morketsmerke@gmail.com"
+
+

+ Po skonfigurowaniu gita możemy utworzyć puste repozytorium w katalogu z + danymi projektu wydając bardzo proste polecenie +

+
+python/django3 $ git init
+
+

+ Powinniśmy dostać taki wyniki działania dla tego polecenia: +

+
+Initialized empty Git repository in /home/xf0r3m/python/django3/.git/
+
+

+ Teraz dodamy plik, w którym zdefiniujemy wszystkie pliki/katalogi, które + mają być ignorowane przez Git podczas dodawania zmian do repozytorium. + Tworzymy plik .gitignore, plik ten będzie ukryty z powodu kropki + poprzedzającej nazwę pliku. W tym pliku wpisujemy katalog środowiska + wirtualnego blog_env/, katalog __pycache__/ oraz + wszystkie pliki baz danych *.sqlite3. Dlaczego? Otóż monitowanie + plików lokalnej bazy danych jest generalnie złą praktyką i może + doprowadzić do niezłych tarapatów, kiedy np. nadpiszemy bazę produkcyjną + tą na platformie Heroku, bazą testową z Git-a. Dlatego pomijamy ten plik. + Poniżej znajduje się zawartość pliku .gitignore +

+
+	blog_env/
+__pycache__/
+*.sqlite3
+
+

+ Teraz kiedy mamy już zdefiniowany plik .gitignore, możemy + przejść do pierwszego zatwierdzenia. W katalogu projektu wydajemy + polecenie: +

+
+$ git add .
+
+

+ To polecenie doda do repozytorium wszystkie pliki projektu poza plikami i + katalogami z pliku .gitignore. +

+
+$ git commit -am "Projekt gotowy do wdrożenia na platformie Heroku"
+
+

+ Powyższe polecenie powoduje właśnie zatwierdzenie. Opcja + -a powoduje uzwględnienie wszystkich + zmodyfikowanych plików do zatwierdzenia, natomiast opcja + -m powoduje dodanie komunikatu do + zatwierdzenia. +

+

+ Po wydaniu powyższego polecenia warto wydać polecenie: +

+
+$ git status
+
+

+ Aby sprawdzić stan wykonanego zatwierdzania, wynik działania polecenia + powinien wyglądać podobnie jak poniżej. +

+
+$ git status
+On branch master
+nothing to commit, working tree clean
+
+

+ Po wykonaniu pierwszego zatwierdzenia przyszedł czas na przekazanie + projektu do Heroku. Teraz musimy przypomnieć sobie adres e-mail, na jaki + zakładaliśmy konto Heroku oraz jakie było do niego hasło. Jeśli mamy już + te dane w pobliżu wydajemy polecenie +

+
+python/django3 $ heroku login
+heroku: Press any key to open up the browser to login or q to exit:
+Logging in... done
+Logged in as user@example.com
+
+

+ Po wydaniu powyższego polecenia, zgodnie z instrukcją naciskamy dowolny + klawisz poza literą q, aby otworzyła + nam się przeglądarka. Tam podajemy dane dostępowe do Heroku, po poprawny + zalogowaniu, zostanie wyświetlony komunikat o poprawyn zalogowaniu oraz + o tym że możemy już zamknąć okno przeglądarki. W terminalu pod instrukcją + wyświetloną przez polecenie, zostaną dopisane pozostałe dwie linie takie + jak przedstawione powyżej. +

+

+ Po zalogowaniu możemy już utworzyć nową aplikację wydając w terminalu + poniższe polecenie. +

+
+python/django3 $ heroku create
+Creating app... done, ⬢ dry-atoll-67152
+https://dry-atoll-67152.herokuapp.com/ | https://git.heroku.com/dry-atoll-67152.git
+
+

+ W odpowiedzi na to polecenie otrzymamy nazwę nowo utworzonej aplikacji na + Heroku, potem zmienimy ją na bardziej przystępną, oraz dwa adresy. Jeden + pod którym aplikacja jest dostępna w internecie, natomiast drugi to adres + zdalnego repozytorium Git, na który będziemy wpychać + zatwierdzenia kodu naszej aplikacji. Adres Git dla naszej aplikacji + Heroku został już automatycznie zdefiniowany jako adres zdalnego + repozytorium pod nazwą heroku. + Dokonajmy teraz pierwszego wepchnięcia oraz zbudujmy naszą aplikacje na + platformie Heroku. Budowa następuje automatycznie po wepchnięciu. +

+
+python/django3 $ git push heroku master
+
+

+ Po wydaniu tego polecenia na ekranie zostanie wyświetlony cały proces + budowania aplikacji w Heroku. +

+
+Enumerating objects: 46, done.
+Counting objects: 100% (46/46), done.
+Delta compression using up to 4 threads
+Compressing objects: 100% (39/39), done.
+Writing objects: 100% (46/46), 9.12 KiB | 1.14 MiB/s, done.
+Total 46 (delta 6), reused 0 (delta 0)
+remote: Compressing source files... done.
+remote: Building source:
+remote:
+remote: -----> Python app detected
+remote:  !     Python has released a security update! Please consider upgrading to python-3.8.5
+remote:        Learn More: https://devcenter.heroku.com/articles/python-runtimes
+remote: -----> Installing python-3.8.2
+remote: -----> Installing pip 20.1.1, setuptools 47.1.1 and wheel 0.34.2
+remote: -----> Installing SQLite3
+remote: -----> Installing requirements with pip
+remote:        Collecting asgiref==3.2.10
+remote:          Downloading asgiref-3.2.10-py3-none-any.whl (19 kB)
+remote:        Collecting beautifulsoup4==4.9.1
+remote:          Downloading beautifulsoup4-4.9.1-py3-none-any.whl (115 kB)
+remote:        Collecting dj-database-url==0.5.0
+remote:          Downloading dj_database_url-0.5.0-py2.py3-none-any.whl (5.5 kB)
+remote:        Collecting Django==3.1
+remote:          Downloading Django-3.1-py3-none-any.whl (7.8 MB)
+remote:        Collecting django-bootstrap4==2.2.0
+remote:          Downloading django_bootstrap4-2.2.0-py3-none-any.whl (24 kB)
+remote:        Collecting django-heroku==0.3.1
+remote:          Downloading django_heroku-0.3.1-py2.py3-none-any.whl (6.2 kB)
+remote:        Collecting gunicorn==20.0.4
+remote:          Downloading gunicorn-20.0.4-py2.py3-none-any.whl (77 kB)
+remote:        Collecting psycopg2==2.8.5
+remote:          Downloading psycopg2-2.8.5.tar.gz (380 kB)
+remote:        Collecting pytz==2020.1
+remote:          Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB)
+remote:        Collecting soupsieve==2.0.1
+remote:          Downloading soupsieve-2.0.1-py3-none-any.whl (32 kB)
+remote:        Collecting sqlparse==0.3.1
+remote:          Downloading sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
+remote:        Collecting whitenoise==5.2.0
+remote:          Downloading whitenoise-5.2.0-py2.py3-none-any.whl (19 kB)
+remote:        Building wheels for collected packages: psycopg2
+remote:          Building wheel for psycopg2 (setup.py): started
+remote:          Building wheel for psycopg2 (setup.py): finished with status 'done'
+remote:          Created wheel for psycopg2: 
+filename=psycopg2-2.8.5-cp38-cp38-linux_x86_64.whl size=483298 
+sha256=7daad67c78674aaee0b224f104bccb4ab6a0dbc40682c37b80f6f6e5572f5f7e
+remote:          Stored in directory: /tmp/pip-ephem-wheel-cache-105idbzs/
+wheels/35/64/21/9c9e2c1bb9cd6bca3c1b97b955615e37fd309f8e8b0b9fdf1a
+remote:        Successfully built psycopg2
+remote:        Installing collected packages: asgiref, soupsieve, beautifulsoup4, 
+dj-database-url, pytz, sqlparse, Django, django-bootstrap4, whitenoise, psycopg2,
+django-heroku, gunicorn
+remote:        Successfully installed Django-3.1 asgiref-3.2.10 
+beautifulsoup4-4.9.1 dj-database-url-0.5.0 django-bootstrap4-2.2.0 
+django-heroku-0.3.1 gunicorn-20.0.4 psycopg2-2.8.5 pytz-2020.1
+soupsieve-2.0.1 sqlparse-0.3.1 whitenoise-5.2.0
+remote: -----> $ python manage.py collectstatic --noinput
+remote:        132 static files copied to '/tmp/build_f49f7b9a/staticfiles', 
+418 post-processed.
+remote:
+remote: -----> Discovering process types
+remote:        Procfile declares types -> web
+remote:
+remote: -----> Compressing...
+remote:        Done: 56.1M
+remote: -----> Launching...
+remote:        Released v5
+remote:        https://dry-atoll-67152.herokuapp.com/ deployed to Heroku
+remote:
+remote: Verifying deploy... done.
+To https://git.heroku.com/dry-atoll-67152.git
+ *[new branch]      master -> master
+
+

+ Jeśli otrzymaliśmy podobny input, to znaczy że cały proces przebiegł + prawidłowo. Teraz jeśli wydamy polecenie: +

+
+python/django3 $ heroku open
+
+

+ Zostanie otworzona przeglądarka z nasza aplikacją w Heroku. Jednak, + jeśli klikniemy w odnośnik 'Menu', zostanie nam zrócona strona błedu + ProgrammingError, oznacza to mniej więcej tyle i aż tyle że nie + ma bazy danych. Utworzenie bazy danych oraz dodanie superużytkownika, to + dwie kolejne czynności, które możemy wykonać dwa różne sposoby. + Przedstawie je poniżej, aby byśmy zwrócili uwagę na to że z aplikacjami + na Heroku można wchodzić w interakcje w dwojaki sposób. Pierwszy z nich + to wydawanie konkretnych poleceń poprzedzając nasze polecenie słowami + heroku run. Uruchamiamy daną czynność + tak samo jak w środowisku wirtualnym na naszym lokalnym komputerze. Tak + też stworzymy bazę danych. +

+
+python/django3 $ heroku run python manage.py migrate
+Running python manage.py migrate on ⬢ dry-atoll-67152... up, run.7671 (Free)
+Operations to perform:
+  Apply all migrations: admin, auth, blogs, contenttypes, sessions
+Running migrations:
+  Applying contenttypes.0001_initial... OK
+  Applying auth.0001_initial... OK
+  Applying admin.0001_initial... OK
+  Applying admin.0002_logentry_remove_auto_add... OK
+  Applying admin.0003_logentry_add_action_flag_choices... OK
+  Applying contenttypes.0002_remove_content_type_name... OK
+  Applying auth.0002_alter_permission_name_max_length... OK
+  Applying auth.0003_alter_user_email_max_length... OK
+  Applying auth.0004_alter_user_username_opts... OK
+  Applying auth.0005_alter_user_last_login_null... OK
+  Applying auth.0006_require_contenttypes_0002... OK
+  Applying auth.0007_alter_validators_add_error_messages... OK
+  Applying auth.0008_alter_user_username_max_length... OK
+  Applying auth.0009_alter_user_last_name_max_length... OK
+  Applying auth.0010_alter_group_name_max_length... OK
+  Applying auth.0011_update_proxy_permissions... OK
+  Applying auth.0012_alter_user_first_name_max_length... OK
+  Applying blogs.0001_initial... OK
+  Applying blogs.0002_blogpost_owner... OK
+  Applying sessions.0001_initial... OK
+
+

+ Jak można zauważyć na początku trwa nawiązywanie połączenia z naszym + kontenerem (naszą aplikacją), a następnie wykonywane jest polecenie. + Drugim sposobem jest uruchomienie powłoki w środowisku kontenera Heroku, + za pomocą tej metody utworzymy superużytkownika. Aby uruchomić powłokę + należy wydać następujące polecenie. +

+
+python/django3 $ heroku run bash
+Running bash on ⬢ dry-atoll-67152... up, run.8503 (Free)
+~ $
+
+

+ Po połączeniu zostanie na zrócony taki charakterystyczny, krótki znak + zachęty. Zaraz zanim wydajemy polecenie, takie jakie wydawaliśmy podczas + tworzenie superużytkownika na naszym komputerze. +

+
+~ $ python manage.py createsuperuser
+Użytkownik (leave blank to use 'u17122'): blog_admin
+Adres email:
+Password:
+Password (again):
+Superuser created successfully.
+
+

+ Teraz możemy przjeść do naszej aplikacji oraz móc sprawdzić moduł + logowania oraz zalogować się do witryny administracyjnej aby zdefiniować + trochę danych. +

+

+ Teraz kiedy nasza aplikacja jest gotowa, możemy przjeść do nadania jej + nieco przyjaźniejszej nazwy. Zmianę nazwy realizujemy za pomocą + polecenia: +

+
+python/django3 $ heroku apps:rename blogs-morkme-v01
+
+

+ Pamiętać jednak należy o tym że podczas nadawania nazw w Heroku + możemy korzystać jedynie z liter, cyfr oraz myślników. +

+

+ Teraz przejdziemy do zabepieczenia naszej aplikacji. Zwróćmy uwagę na to, + że gdy w plikach naszego projektu na Heroku zabrakło bazy danych, została + na zwrócona strona z opisem błędu ProgrammingError, ta strona + została przygotowana przez Debuger. W środowisku testowym jest + powszechne i często spotykane zjawisko, że w razie błędów zostanie + wyświetlona strona z informacjami o tym gdzie szukać danego błędu, + jednak w środowisku produkcyjnym takim jak Heroku jest to + niedopuszczalne, takie strony zazwyczaj zwracają za dużo newralgicznych + danych i mogą być wykorzystane do ataków przeciwko nam. Na podstawie + zmiennej środowiskowej będziemy regulować wyświetlanie stron debugera. + Z racji tego iż w Django zmienna Debug przyjmuje wartość + boolowską, a z kolei zmienne środowiskowe przechowują ciągi tekstowe, + będzie nam potrzebna konstrukcja if, którą zaimplementujemy w pliku + settings.py w głównym katalogu projektu. +

+

+ Naszą implementacje zaczynamy od zaimportowania obiektu + environ modułu + os na górze pliku. Następnie na samym + dole pliku wprowadzamy poniższy kod. +

+
+if environ.get('DEBUG') == 'TRUE':
+    DEBUG = True
+elif environ.get('DEBUG') == 'FALSE':
+    DEBUG = False
+
+

+ Za pomocą metody get obiektu + environ, pobieramy wartość zmiennej środowiskowej, której nazwa + jest pobierana jako ciąg tekstowy w pierwszym argumencie. W zależności od + wyniku przyrównania wartości w zmiennej + DEBUG nadawana jest wartość boolowska + True or + False. Z racji tego iż przesłaliśmy plik + settings.py, wraz ustawioną opcją DEBUG na + True. To teraz musimy ją zmienić w naszej aplikacji na + platformie Heroku, możemy tego dokonać za pomocą jednego polecenia. +

+
+python/django3 $ heroku config:set DEBUG=FALSE
+
+

+ To polecenie spowoduje ustawienie podanej zmiennej środowiskowej na + podaną wartość oraz restart aplikacji. Teraz otworzymy naszą aplikację za + pomocą polecenia heroku open i + przejdziemy pod stronę, której nie zaimplementowano w naszej aplikacji. + Powinniśmy otrzymać typowy komunikat Not Found. Ten komunikat + nie pasuje do szaty graficznej naszej aplikacji, my jednak możemy dodać + własne szablony dla typowych błędów. Szablony będą banalne, ale będą + miały jedną ważną cechę. Będą ładować podstawowy wygląd naszej aplikacji. + Zaczynamy od utworzenia katalogu templates w głównym katalogu + projektu. W tym katalogu tworzymy dwa pliki: 404.html oraz + 500.html. Poniżej zamieszczam zawartość każdego szablonu. +

+

+ Plik 404.html +

+
+{% extends 'blogs/base.html' %}
+
+{% block page_header %}
+    <h2<Żądana strona nie zostałą odnaleziona (404).</h2>
+{% endblock page_header %}
+
+

+ Plik 500.html +

+
+{% extends 'blogs/base.html' %}
+
+{% block page_header %}
+    <h2>Wystąpił wewnętrzny błąd serwera (500).</h2>
+{% endblock page_header %}
+
+

+ Teraz wracamy do naszego pliku settings.py w nim ustawiamy jedną + rzecz. Na początku importujemy obiekt path z modułu os. + Następnie odszukujemy klucz DIRS w słowniku wenątrz listy + TEMPLATES. Następnie wewnątrz listy DIRS wpisujemy jedną wartość + zwracaną przez metodę join obiektu path, która jako + argumenty przyjmuje ścieżkę bazową BASE_DIR oraz ścieżkę dostępu + do szablonów względem ścieżki bazowej. Trochę to zagmatwane, ale jak + spojrzymy w górę kodu dostrzerzemy fakt iż BASE_DIR to zmienna, + którą możemy sobie odtworzyć w powłoce. Jako__file__ podstawimy + ścieżke do dostępową do pliku settings.py względem naszego + katalogu głównego z plikami, gdzie znajdują katalog projektu, katalogi + aplikacji oraz katalog ze środowiskiem wirtualnym. + Poniżej zamieściłem listing z konsoli jak możemy sprawdzić naszą ścieżkę. +

+
+>>>from pathlib import Path
+>>> base_dir = Path('blog/settings.py').resolve(strict=True).parent.parent
+>>> base_dir
+PosixPath('/home/xf0r3m/python/django3')
+
+

+ Teraz znając już wartość naszej zmiennej BASE_DIR możemy + perfekcyjnie ustalić ścieżke dostępową do naszych szablonów. +

+

+ Warto pamiętać o tym, że te szablony będą wyświetlane tylko wtedy, gdy + opcja DEBUG jest ustawiona na False. Możemy je przetestować + żądając strony, której nie ma, otrzymamy stronę błędu 404. Natomiast + jeśli spróbujemy edytować zamówienie, którego niema to w ten czas + otrzymamy stronę błędu 500. Skupmy się przez chwilę na tym drugim + przypadku, kiedy chcemy edytować zamowienie, którego nie ma. + Przezkazujemy za pomocą metody GET identyfikator zamówienia, + kiedy widok próbuje wydobyć informacje odnośnie rekordu o takim + identyfikatorze otzymuje wartość None oznacza to tyle, że nie ma + takiego rekordu, jeśli więc nie ma takiego rekordu to żądana strona + edycji zamówienia nie może istnieć, więc lepiej użyć strony 404 niż 500. + Można to zrealizować wykorzystując funkcję + get_object_or_404 z tego samego modułu + django.shortcuts, z którego + importowaliśmy funkcje render oraz redirect, następnie + możemy jej użyć w każdym widoku wymagającym identyfikatora np. w + zapytaniach do bazy. +

+
+# order = Order.objects.get(id=order_id)
+order = get_object_or_404(Order, id=order_id)
+
+

+ Zbliżamy się do końca tego materiału, jednak zanim się rozejdziemy dalej + poznawać świat Pythona, posprzątamy po sobie. Jednak jeśli chcesz możesz + w ramach ćwiczenia rozwinąć projekt Pizzeria do stanu użytczeności. +

+

+ Jednak jeśli ta aplikacja, która była z nami przez dłuższą część nauki + frameworka Django przestała być potrzebna, to możemy ją usunąć z + platformy wydajac polecenie: +

+
+python/django2 $ heroku apps:destroy pizzeria-morkme-1a
+ ▸    WARNING: This will delete ⬢ pizzeria-morkme-1a including
+ ▸    all add-ons.
+ ▸    To proceed, type pizzeria-morkme-1a or re-run this
+ ▸    command with --confirm pizzeria-morkme-1a
+ >
+
+

+ Heroku zarząda od nas potwierdzenia, w postaci ponownego wprowadzenia + nazwy aplikacji. Po jej podaniu, otrzymamy informacje poprawnym + zniszczeniu (usunięciu) aplikacji na platformie Heroku. +

+
+> pizzeria-morkme-1a
+Destroying ⬢ pizzeria-morkme-1a (including all add-ons)... done
+
+

+ Jeśli chodzi o podstawy Pythona oraz Django to wydaje mi się, że mamy je + już za sobą. +

+
+
+ + diff --git a/articles/tnt/automatyczne_montowanie_partycji_przy_starcie_systemu.html b/articles/tnt/automatyczne_montowanie_partycji_przy_starcie_systemu.html new file mode 100755 index 0000000..c618b34 --- /dev/null +++ b/articles/tnt/automatyczne_montowanie_partycji_przy_starcie_systemu.html @@ -0,0 +1,75 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Automatyczne montowanie partycji podczas uruchamiania systemu

+

+ Dla takiego dysku należy utworzyć wpis w pliku + /etc/fstab. Ten plik jest czytany podczas + ładowania systemu, stąd wiadomo, który dysk należy podmontować jako "/" + (root - główny system plików). Bardzo rzadko występuje tam + standardowe nazewnictwo dla dysków, takie jak na przykład + /dev/sda1. Raczej występują tam UUID lub PARTUUID. Klasyczne + oznaczenia bywają zwodniczne, mogą zmieniać się, kiedy podłączymy + kolejny dysk. Dostęp do UUID oraz PARTUUID uzyskujemy za pomocą + polecenia blkid. Wywołanie tego + polecenia, w niektórych distro możemy wymagać uprawnień roota. +

+
+$ sudo blkid
+/dev/sda1: UUID="240040b5-fda6-4540-95f2-ce02cfdc96b9" TYPE="ext4" PARTUUID="802e3498-01"
+...
+
+

+ Jeśli nie wiemy czy wybrać UUID lub PARTUUID, to spójrzmy na linię, + która montuje glówny system plików. Na podstawie tego możemy zdecydować, + którą z tych informacji należy umieścić. Sam wpis wygląda następująco: +

+
+UUID="..."	/home	ext4	defaults	0	2
+
+

+ Gdzie: +

+
    +
  • UUID="..." - UUID (identyfikator + urządzenia) sciągnięty z wyniku polecenia + blkid,
  • +
  • /home - punkt montowania,
  • +
  • ext4 - montowany system plików
  • +
  • defaults - opcje systemów plików, + każdy system posiada swoje, ext4 posiada opcję + defaults dla domyślnego zestawu,
  • +
  • 0 - oznacza ustawienie kopii + zapasowej programu dump,
  • +
  • 2 - oznacza ustawienie sprawdzania + systemu plików przez program fsck. Wartość 2 + oznacza ze system będzie sprawdzany po głownym systemie plików.
  • +
+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/automatyczne_przewini\304\231cie_strony_na_sam_d\303\263\305\202_w_JS.html" "b/articles/tnt/automatyczne_przewini\304\231cie_strony_na_sam_d\303\263\305\202_w_JS.html" new file mode 100755 index 0000000..6ab80da --- /dev/null +++ "b/articles/tnt/automatyczne_przewini\304\231cie_strony_na_sam_d\303\263\305\202_w_JS.html" @@ -0,0 +1,48 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,<(__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Automatyczne przewinięcie strony na sam dół w JavaScript

+

+ Autoscroll, czyli automatyczne przewinięcie treści + elementu, musi być wykonane w oparciu o jakieś zdarzenie. W funkcji + zdarzenia dopisujemy poniższą linię. +

+
+<zmienna_z_elementem>.scrollTop = <zmienna_z_elementem>.scrollHeight;
+
+

+ Kiedy dojdzie do zdarzenia treść elementu zostanie przewinięta na sam + dół. +

+

+ Źródło: znalezione gdzieś na stackoverflow, nie zapisałem linku, gdyż + jest to fragment kodu, jednego z moich projektów. +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/dowi\304\205zania_symboliczne_na_udziale_samba.html" "b/articles/tnt/dowi\304\205zania_symboliczne_na_udziale_samba.html" new file mode 100755 index 0000000..c0b3626 --- /dev/null +++ "b/articles/tnt/dowi\304\205zania_symboliczne_na_udziale_samba.html" @@ -0,0 +1,76 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Dowiązania symboliczne na udziale Samba

+

+ W tym celu w pliku konfiguracyjnym /etc/samba/smb.conf, + wpisujemy sekcji globalnej +

+
+allow insecure wide links = yes
+
+

+ Następnie przchodzimy do definicji udziału i dodajemy poniższe opcje. +

+
+follow symlinks = yes
+wide links = yes
+
+

+ Zapisujemy i zamykamy plik, następnie restartujemy usługę. +

+
+$ sudo systemctl restart smbd
+$ sudo systemctl restart nmbd
+
+

+ W sumie to tyle, jednak jeśli mamy zamiar wykorzystać nasz udział do + tworzenia stron WWW, to warto dodać naszego użytkownika do grupy + www-data i wymusić na udziale za pomocą poniższych opcji + zmianę domyślnego właściciela oraz grupę dla nowo utworzonych plików. +

+
+force user = www-data
+force group = www-data
+
+

+ Jeśli to ustawimy, to należy ustawić grupę oraz właściciela katalogu + głównego serwera WWW /var/www na + www-data:www-data oraz zmienić maski na udziale na + 0775. +

+

+ Źródła: +

    +
  1. + Odpowiednie opcje oraz ich rozmieszczenie
  2. +
+

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/tnt/index.html b/articles/tnt/index.html new file mode 100755 index 0000000..54bdd38 --- /dev/null +++ b/articles/tnt/index.html @@ -0,0 +1,54 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + + + + + + + diff --git a/articles/tnt/katalog_hostingu_WWW_poza_var_www.html b/articles/tnt/katalog_hostingu_WWW_poza_var_www.html new file mode 100755 index 0000000..b8a4776 --- /dev/null +++ b/articles/tnt/katalog_hostingu_WWW_poza_var_www.html @@ -0,0 +1,53 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Katalog hostingu WWW poza + /var/www

+

+ W pliku konfiguracyjnym hostingu dopisujemy poniższą dyrektywę katalogu. +

+
+<Directory docelowy_katalog_witryny>
+	Options Indexes FollowSymLinks Includes ExecCGI
+	AllowOverride All
+	Require all granted
+	Allow from all
+</Directory>
+
+

+ Po tej deklaracji hosting tej strony będzie znajdował się w katalogu + (ścieżce) podanym w polu + docelowy_katalog_witryny. +

+

+ Źródło: Internet. +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/tnt/konfiguracja_programu_pocztowego_mutt.html b/articles/tnt/konfiguracja_programu_pocztowego_mutt.html new file mode 100644 index 0000000..59f909e --- /dev/null +++ b/articles/tnt/konfiguracja_programu_pocztowego_mutt.html @@ -0,0 +1,152 @@ + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Konfiguracja programu pocztowego MUTT

+

+ Klient pocztowy MUTT, do proste w obsłudze narzędzie + umożliwiające korzystanie z popularnych skrzynek mailowych z poziomu + terminala czy konsoli serwera. Sprawdza się on wśród hackerów + (like a Stallman not Mitnick) oraz osób chcących odbierać powiadomienia + z serwera na swoją skrzynkę, ponieważ wysyłanie maili w skryptach w + przypadku MUTT jest bardzo proste. Tutaj pokaże wam jak wygląda + integracja z MUTT z GMail-em. Jednak na początku musimy na naszej + skrzynce. +

+
    +
  • Wyłączyć uwierzytelnianie dwuskładnikowe o ile mamy je włączone,
  • +
  • Włączyć dostęp do skrzynki z mniej bezpiecznych aplikcji.
  • +
+

+ Przygotowując plik konfiguracyjny korzystałem z dystrybucji GNU/Linux + Debian, zatem instalacje przeprowadzę z poziomu managera pakietów tej + dystrybucji. Ten materiał mógł znajdować się w kategorii Linux, jednak + opiera się o program, który do zainstalowania jest na wiekszości + popularnych platform. Przed instalacją jakiego kolwiek oprogramowania + zawsze zalecam zaktualizować system. +

+
+$ sudo apt update
+$ sudo apt upgrade
+$ sudo apt install mutt
+
+

+ Po zainstalowaniu upewnijmy się czy został stworzony ukryty katalog + .mutt na katalogu domowym użytkownika, w przeciwym wypadku + należy taki katalog stworzyć. Poniżej znajduje się plik konfiguracyjny. + Możemy go sobie skopiować do edytora, wpisać wymagane rzeczy ujęte w + ostre nawiasy (< >) i zapisać w + $HOME/.mutt/.muttrc. Pod wstawionym listingiem znajduje się + opis poszczególnych opcji. +

+
+set ssl_starttls=yes
+set ssl_force_tls=yes
+set imap_user='<nazwa_użytkownika>@gmail.com'
+set imap_pass='<hasło_do_konta>'
+set from='<nazwa_użytkownika>@gmail.com'
+
+set realname='<RN>'
+set folder=imaps://imap.gmail.com/
+set spoolfile=imaps://imap.gmail.com/INBOX
+set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"
+
+set header_cache="~/.mutt/cache/headers"
+set message_cachedir="~/.mutt/cache/bodies"
+set certificate_file="~/.mutt/certificates"
+
+set smtp_url="smtps://<nazwa_użytkownika>@gmail.com@smtp.gmail.com"
+set smtp_pass='<hasło_do_konta>'
+set move = no
+set imap_keepalive = 900
+
+

+ Warto zaznaczyć że przed pierszym uruchomieniem MUTT, + header_cache, message_cachedir, certificate_file + muszą istnieć w systemie. +

+
    +
  • ssl_starttls - wykorzystanie + STARTTLS,
  • +
  • ssl_force_tls - wymaganie + szyfrowania wszystkich połączeń pomiędzy serwerem a klientem,
  • +
  • imap_user - nazwa użytkownika + serwera IMAP,
  • +
  • imap_pass - hasło użytkownika + serwera IMAP,
  • +
  • from - domyślny adres email + nadawcy, będzie wyświetlał się w polu 'Od:' wiadomości,
  • +
  • realname - Nazwa personalna nadawcy, + najczęściej imię i nazwisko, wykorzystywana w celu prezentacji nadawcy, + np. w skrzynce odbiorczej,
  • +
  • folder - domyślna lokalizacja + głównej skrzynki mailowej (jak katalog / [root]), w tym przypadku jest + serwer IMAP Gmaila.
  • +
  • spoolfile - lokalizacja skrzynki + odbiorczej,
  • +
  • postponed - lokalizacja skrzynki z + kopiami (wersjami) roboczymi,
  • +
  • header_cache - plik pamięć + podręcznej zawierający nagłówki wiadomości,
  • +
  • message_cachedir - katalog na + pamięć podręczną zawierającą wiadomości,
  • +
  • certificate_file - plik + zawierający zaakceptowane przez nas certyfikaty,
  • +
  • smtp_url - adres serwera SMTP, + w wewnątrz adresu zawarta jest już nazwa użytkownika,
  • +
  • smtp_pass - hasło do konta + użytkownika na serwerze SMTP.
  • +
  • move - przenoszenie przeczytanych + wiadomości ze skrzynki odbiorczej do skrzynki na przeczytane,
  • +
  • imap_keepalive - ilość czasu + (w sekundach) utrzymania połączenia z serwerem IMAP, stosowane aby + serwer przedwcześnie nie zamknął połączenia.
  • +
+

+ Po skonfigurowaniu naszej skrzynki i pierwszym jej otwarciu w tym + programie, MUTT jest gotowy do wysyłania maili z poziomu wiersza poleceń. +

+
+$ cat message.txt | mutt -s "To jest temat maila" adresat@example.com
+
+

+ Przekierowując zawartość pliku tekstowego tworzymy treść wiadomości, + którą wysyłamy na adres + adresat@example.com, opisując całość + tematem zawartym po przełączniku -s. +

+

+ Niestety ten artykuł należy uznać za przestarzały, ze względu na użyty + przypadek. Od 30 maja 2022 Google wyłączy możliwość logowania się + na konto Google aplikacjom innych firm, które używają wyłącznie loginu + i hasła. Mimo to sam sposób logowania do innych dostawców, którzy nadal + korzystają tradycyjnych metod powinien być jak najbardziej aktualny. +

+

+ ~xf0r3m +

+
+ + + + + diff --git "a/articles/tnt/miejsce_montowania_udzia\305\202u_samba_przez_GNOME_pliki.html" "b/articles/tnt/miejsce_montowania_udzia\305\202u_samba_przez_GNOME_pliki.html" new file mode 100755 index 0000000..17c1cc5 --- /dev/null +++ "b/articles/tnt/miejsce_montowania_udzia\305\202u_samba_przez_GNOME_pliki.html" @@ -0,0 +1,35 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + +
+

Miejsce montowania udziału samba przez + menadżer plików środowiska GNOME

+

+ Udział montowany jest na ścieżce /run/user/<uid>/gvfs/smb-share:<SERWER>,share:<nazwa_udziału>. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/tnt/montowanie_virtualbox_shared_folder_na_Alpine_Linux.html b/articles/tnt/montowanie_virtualbox_shared_folder_na_Alpine_Linux.html new file mode 100755 index 0000000..3d5e5d5 --- /dev/null +++ b/articles/tnt/montowanie_virtualbox_shared_folder_na_Alpine_Linux.html @@ -0,0 +1,83 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Montowanie VirtualBox Shared Folder + na Alpine Linux

+

+ Pierwszą rzeczą jaką należy wykonać jest włączenie repozytoriów + społeczności, w pliku /etc/apk/repositories usuwamy znak + komentarza na początku linii zawierającej taki ciąg znaków + 'v3.11/community', gdzie v3.11 to wersja systemu Alpine. +

+
+#/media/cdrom/apks
+http://ftp.icm.edu.pl/pub/Linux/distributions/alpine/v3.11/main
+http://ftp.icm.edu.pl/pub/Linux/distributions/alpine/v3.11/community
+#http://ftp.icm.edu.pl/pub/Linux/distributions/alpine/edge/main
+#http://ftp.icm.edu.pl/pub/Linux/distributions/alpine/edge/community
+#http://ftp.icm.edu.pl/pub/Linux/distributions/alpine/edge/testing
+
+

+ Zapisujemy zmiany, następnie instalujemy niezbędne oprogramowanie. +

+
+# apk add build-base virtualbox-guest-additions virtualbox-guest-modules-virt
+
+

+ Po instalacji restartujemy system. +

+
+# reboot
+
+

+ Kiedy system się załaduje, możemy dodać moduł do jądra. +

+
+# modprobe -a vboxsf
+
+

+ Jeśli dodanie modułu do jądra nie zwróci żadnych błędów, możemy przejść + do montowania folderu współdzielonego VirtualBox. +

+
+# mount -t vboxsf vbox_share /media
+
+

+ Gdzie vbox_share to nazwa folderu + współdzielonego. +

+

+ Źródła: +

    +
  1. + Folder współdzielony VirtualBox - Dokumentacja Alpine Linux
  2. +
+

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/obs\305\202uga_uploadu_plik\303\263w_za_pomoc\304\205_obszaru_dropzone_JS.html" "b/articles/tnt/obs\305\202uga_uploadu_plik\303\263w_za_pomoc\304\205_obszaru_dropzone_JS.html" new file mode 100755 index 0000000..51b7948 --- /dev/null +++ "b/articles/tnt/obs\305\202uga_uploadu_plik\303\263w_za_pomoc\304\205_obszaru_dropzone_JS.html" @@ -0,0 +1,78 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + +
+

Obsługa uploadu plików za pomocą obszaru + dropzone w JavaScript

+

+ Aby tego dokonać możemy użyć poniższego kodu. +

+
+<script>
+function uploadFiles(plik) {
+
+	var xhr = new XMLHttpRequest();
+	var fd = new FormData();
+
+	xhr.open("POST", '/service.php', true);
+	xhr.onload = function () {
+		if ( xhr.status === 200 ){
+	  	alert(xhr.responseText);
+		}
+	}
+	fd.append('pliki', plik);
+	xhr.send(fd);
+}
+
+var dropzone = document.getElementById("dropzone");
+
+dropzone.ondragover = dropzone.ondragenter = function (e) {
+	e.stopPropagation();
+	e.preventDefault();
+}
+
+dropzone.ondrop = function (e) {
+	e.preventDefault();
+	e.stopPropagation();
+	var plikiTab = e.dataTransfer.files;
+
+	for (var a=0; a < plikiTab.length; a++) {
+		uploadFiles(plikiTab[a]);
+	}
+}
+</script>
+<div id="dropzone">Przeciągnij i upuść pliki tutaj.</div>
+
+

+ Jedyne co musimy zrobić to przygotować plik PHP, który obsłuży nam + wysłany plik. +

+

+ Źródło: Kod perfidnie ukradziony z internetu. +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/pobieranie_film\303\263w_z_xvideos.html" "b/articles/tnt/pobieranie_film\303\263w_z_xvideos.html" new file mode 100755 index 0000000..8580b23 --- /dev/null +++ "b/articles/tnt/pobieranie_film\303\263w_z_xvideos.html" @@ -0,0 +1,37 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + +
+

Pobranie filmów z XVIDEOS.com

+

+ Możemy je pobrać za pomocą zwykłego terminala. URL do filmu znajduje + się na stronie, wystarczy go wydobyć. +

+
+$ wget --no-check-certificate <url z filmem>
+$ url=$(cat <plik_strony_z_filmem> | grep "setVideoUrlHigh" | cut -d "'" -f 2);
+$ wget --no-check-certificate $url
+
+
+ + + diff --git a/articles/tnt/przekierowanie_na_HTTPS_w_pliku_hostingu_apache2.html b/articles/tnt/przekierowanie_na_HTTPS_w_pliku_hostingu_apache2.html new file mode 100755 index 0000000..4ed84d6 --- /dev/null +++ b/articles/tnt/przekierowanie_na_HTTPS_w_pliku_hostingu_apache2.html @@ -0,0 +1,48 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + +
+

Przekierowanie HTTP na HTTPS w pliku hostingu Apache2

+

+ W pliku hostingu HTTP, dopisujemy poniższe opcje. +

+
+RewriteEngine On
+RewriteCond %{HTTPS} !on
+RewriteRule (.*) https://${HTTP_HOST}%{REQUEST_URI}
+
+

+ Aby te opcje zadziałały, niezbędne jest włączenie modułu rewrite. +

+
+$ sudo a2enmod rewrite
+
+

+ Źródło: Internet. +

+

+ ~xf0r3m +

+
+ + + diff --git a/articles/tnt/przenoszenie_systemu_operacyjnego_z_maszyny_wirtualnej_na_fizyczny_komputer.html b/articles/tnt/przenoszenie_systemu_operacyjnego_z_maszyny_wirtualnej_na_fizyczny_komputer.html new file mode 100755 index 0000000..1033988 --- /dev/null +++ b/articles/tnt/przenoszenie_systemu_operacyjnego_z_maszyny_wirtualnej_na_fizyczny_komputer.html @@ -0,0 +1,402 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Przenoszenie systemu operacyjnego z + maszyny wirtualnej na fizyczny komputer

+

+ W zeszłym tygodniu na mój warsztat trafiły dwa laptopy. Jeden zupełnie + nowy, zakupiony na potrzeby programu diagnostycznego dla ciężarówek. + Drugi zaś nieco już zużyty. Wymieniony program diagnostyczny jest + rozpowadzany na zasadzie + gotowego środowiska znajdującego się na maszynie wirtualnej VMware. + Mój zleceniodawca poprosił mnie abym oczyścił ten stary laptop i + generalnie przystosował go do tego aby działa na nim tylko ten program, + nic więcej. Starszy laptop to Dell Inspiron 3542 z i3 czwartej + generacji, 4GB ramu oraz tradycjnym dyskiem talerzowym o pojemności + 500GB. Szału nie ma, na VMware ten laptop jest za słaby. Sprawdziłem, + że sama maszyna ma przydzielone 3 GB pamięci operacyjnej, najwyraźniej + tyle wymaga. +

+

+ Do głowy przyszedł mi pomysł: a co jeśli by wyciągnąć obraz dysku z + maszyny. Na początku straciłem trochę czasu, na szukanie sprawdzonego + narzędzia, które musiało zginąć pod czas uszkodzenia przez mnie + LVM-u na serwerze plików w warsztacie. No cóż stwierdziłem, że jak + nie mam obrazu, to go zrobie. Niestety po odszukaniu na gryzoniu + programu w odpowiedniej wersji, nie byłem wstanie utworzyć obrazu płyty + gdyż ADK dla Windows 8.1, nie jest już dostępne. Microsoft radzi użycie + ADK dla Windows 10, ten program nie chce jednak tego przyjąć. + Utworzone + na dysku usb oparte na Linuksie środowisko, nie miało w ogóle funkcji + utworzenia kopii zapasowej dysku. Więc zacząłem szukać jakiejś + alternatywy, najlepiej open source i do głowy wpadła mi + Clonezilla - to dystrybucja GNU/Linux oparta na + Debianie służąca tworzeniu kopii zapasowych partycji jak i całych + dysków. +

+

+ Obrazy przeznaczone dla i386 oraz amd64 znajdziemy na stronie projektu. + Tu warto zaznaczyć, że najlepiej jest wybrać jako mirror OSDN. + Dla celów testowych przedstawie przypadek, przeniesienia Windows 7 + Starter 32 bit na netbooka Acer Aspire One. Aby przenieść system z + maszyny wirtualnej dobrze jest operować udziałem Samba, + ponieważ łatwiej jest utworzyć obraz dysku maszyny wirtualnej na + udziale, a Clonezilla jest wstanie + utworzyć backup dysku na udziale sieciowym. Tak wygląda maszyna + wirtualna, z której będziemy przenosić nasz system: +

+

+ 01-clonezilla-okno-z-maszyn +

+

Tworzenie obrazu

+

+ Pracę rozpoczynamy od załadowania do napędu maszyny wirtualnej obrazu + płyty z Clonezillą, następnie uruchomiamy ją z niego. Z menu + programu rozruchowego wybieramy pierwszą, domyślną opcję. +

+

+ 02-clonezilla-uruchomienie-clonezilla +

+

+ Po uruchomieniu zostaniemy zapytani o ustawienia lokalizacyjne takiej + jak język (Clonezilla jest po polsku). +

+

+ 03-clonezilla-wybor-jezyka +

+

+ oraz układ klawiatury (pozostawiamy go domyślnie). +

+

+ 04-clonezilla-uklad-klawiatury +

+

+ Nastepnie uruchamiamy już właściwy proces wybierając opcje + Start_Clonezilla. +

+

+ 05-clonezilla-uruchomienie-clonezilla +

+

+ Program może pracować w wielu trybach, jednak nas będzie interesować + wyłącznie praca z obrazami dlatego w następnym oknie wybieramy opcje + device-image. +

+

+ 06-clonezilla-praca-z-obrazami +

+

+ Tak jak już wspomniałem na wstępnie, jako miejsca docelowego na obraz + wykorzystamy udział Samba. Tworząc obrazy na fizycznych maszynach + możemy użyć pendrive-a lub dysku zewnetrznego, jednak w naszym + przypadku potrzeba by nieco więcej zachodu aby przekazać maszynie dysk + zewnętrzny, a wydajność mogłaby być niezbyt zadowalająca. Dlatego też + teraz wybieramy opcje samba_server. +

+

+ 07-clonezilla-wybranie-miejsca-docelowego-dla-obrazow +

+

+ Przechodząc przez kolejne okna będziemy musieli podać wszystkie + parametry potrzebne do połączenia z udziałem. Jednak najpierw musimy + dokonać konfiguracji sieci środowiska Clonezilla. Możemy + pobrać ją z serwera DHCP, więc pozostawiamy domyślną opcję. + Po tej konfiguracji przyszła pora na podanie parametrów + do połączenia się z udziałem. +

+

+ 08-clonezilla-konfiguracja-karty-sieciowej +

+

+ Podajemy adres ip serwera Samba. +

+

+ 09-clonezilla-wskazujemy-nazwe-lub-ip-serwera-samba +

+

+ Następnie domenę (jeśli domena nie jest ustawiona na serwerze, + wybieramy przycisk "Anuluj"). +

+ 10-clonezilla-domena-na-serwerze-samba +

+

+ Teraz podajemy nazwę użytkownika mającego uprawnienia do zapisu na + docelowym udziale. +

+

+ 11-clonezilla-uzytkownik-udzialu-na-serwerze +

+

+ Nazwę udziału (uwaga), podajemy po slashu - jak by to był + folder, ale to nazwa udziału. +

+

+ 12-clonezilla-wskazanie-nazwy-udzialu +

+

+ Po podaniu ostatniej informacji, zostaniemy poproszeni o wybór wersji + protokołu SMB. Mój serwer to Samba postawiona na Debian 10, + więc pozostawiam tę wartość domyślnie. +

+

+ 13-clonezilla-wybranie-wersji-protokolu +

+

+ Kolejną jest "tryb bezpieczestwa", jeśli udział nie stoi na jakimś + archaiczym Windowsie pozostawiamy auto. +

+

+ 14-clonezilla-wybor-trybu-bezpieczenstwa +

+

+ Po zatwierdzeniu tej opcji, zostanie nam wyświetlony monit o potrzebie + podania hasła do udziału. Polecenie pokazane w oknie jest tylko + poglądowe i nie ma nic wspólnego z właściwym poleceniem montującym + udział. +

+

+ 15-clonezilla-monit-o-podaniu-hasla +

+

+ Po wybraniu "OK" zostanie zwrócony znak zachęty proszący o hasło aby + podmontować udział. Każdy kto kiedyś montował udział SMB za pomocą + wiersza poleceń będzie znać ten symbol. +

+

+ 16-clonezilla-wpisywanie-hasla-do-udzialu +

+

+ Po prawidłowym podłączeniu udziału, Clonezilla zwróci nam + tabelę z informacjami na temat udziału (dostępna przestrzeń dysku, + punkt montowania). +

+

+ 17-clonezilla-informacja-zwrotna-o-zamontowanym-udziale +

+

+ Po zamontowaniu miejsca docelowego + w /home/partimag, pora wybrać tryb pracy programu + Clonezilla. Do wyboru będziemy mieli tryb Beginner - + początkujący lub Expert. Jako iż jest to moja druga w ogóle + styczność z tym narzędziem, sam wybrałem tryb dla początkujących. +

+

+ 18-clonezilla-tryb-beginner +

+

+ Po uruchomieniu programu w trybie dla początkujących, musimy określić + sposób + tworzenia kopii. Clonezilla może tworzyć kopie całych dysków + lub + poszczególnych partycji. Dla rozpatrywanego przypadku najlepszym + rozwiązaniem jest zapisanie całego dysku. Instalacja najnowszych + systemów Windows jest zazwyczaj rozbijana na kilka partycji. Zatem + wybieramy opcje savedisk. +

+

+ 19-clonezilla-zapisujemy-lokalny-dysk-jako-obraz +

+

+ W następnym oknie zostaniemy poproszeni o podanie nazwy dla katalogu, + w którym przechowywany będzie obraz. To dobry i jedyny moment, aby go + opisać. +

+

+ 20-clonezilla-nazwa-dla-katalogu-obrazu +

+

+ Po utworzeniu odpowiedniego katalogu, pora na wybór dysku źródłowego. + Zaznaczamy dysk z listy, przechodzimy na przycisk "OK" i klikamy Enter. +

+

+ 21-clonezilla-wybieramy-zrodlo-dla-naszego-obrazu +

+

+ W kolejnym pytaniu program za sugeruje man sprawdzenie i ewenualną + naprawę systemu plików. Jednak dla systemów takich jak NTFS jest to + nie możliwe, więc wybieramy opcje -sfsck (pominięcie + sprawdzenia systemu plików). +

+

+ 22-clonezilla-sprawdzenie-systemow-plikow-przed-stworzenien-obrazu-dla-ntfs-mozna-pominac +

+

+ Domyślnie Clonezilla chce sprawdzić + poprawność zapisanego obrazu. W tym przypadku zostawiam pełną + dowolność. Ja, aby nie przedłużać tworzenia obrazu, czy zakończenia + procesu pominąłem sprawdzanie obrazu. +

+

+ 23-clonezilla-czy-sprawdzic-zapisany-obraz +

+

+ Kolejne okno zawiera pytanie o + szyforwanie obrazu, tutaj również pozostawiam dowolność, jednak jeśli + tworzymy obraz zaszyfrowanego dysku, to sam obraz również dobrze jest + zaszyfrować. +

+

+ 24-clonezilla-pytanie-o-szyfrowanie-obrazu +

+

+ Przed wykonaniem obrazu należy zdefiniować jeszcze + czynność wykonywaną po ukończeniu tego procesu. Co ma zrobić + Clonezilla. Może przejść do wiersza poleceń, wyłączyć lub + zrestartować komputer. Może również przjeść do menu, z którego + wybierzemy inną czynność. Jest to przydatne kiedy chcemy utworzyć obrazy + większej ilości dysków, ponieważ będziem mogli uruchomić program od + pewnego momentu, pomijąjąc część konfiguracji. Tutaj też możemy wybrać + dowolnie. Ja wybrałem opcję -choose uruchamiającą owe menu. +

+

+ 25-clonezilla-akcja-do-wykonania-po-stworzeniu-obrazu +

+

+ Teraz kiedy wszystkie ustawienia zostały przyjęte. Clonezilla + wyświetli polecenie, którego możemy użyć korzystając z wiersza poleceń, + aby utworzyć obraz ponownie bez przechodzenia przez te wszystkie okna. + Klikamy "Enter" w celu kontynuowania działania programu. +

+

+ 26-clonezilla-informacja-o-zapisaniu-uzytego-polecenia +

+

+ Po przetworzeniu kilku informacji o dysku źródłowym, program wyświetli + informacje o tym, że zostanie utworzony obraz źródłowego dysku oraz + pytanie czy chcemy kontynuować. Potwierdzamy odpowiadając na pytanie + y i klikając "Enter". +

+

+ 27-clonezilla-consent-o-utworzenie-obrazu +

+

+ W tym momencie rozpoczyna pracę już właściwy program Partclone + znany między innymi z projektu FOG (Free Open-source Ghost - ma podobne + zastosowanie co Clonezilla, jednak jest bardziej ukierunkowny + na wykorzystanie sieciowe oraz masowe. Przydaje się przy reinstalacji + systemów operacyjnych w szkolnych salach komputerowych). +

+

+ 28-clonezilla-tworzenie-obrazu +

+

+ O zakończonym procesie tworzenia obrazu zostaniemy poinformowani. + Pozostało nam tak naprawdę tylko kliknąć klawisz "Enter". Po tym + nastąpi akcja, którą wcześniej wybraliśmy. +

+

+ 29-clonezilla-informacja-zwrotna-po-utworzeniu-obrazu +

+

Przywracanie obrazu

+

+ Początkowe fazy przywracania obrazu, są identyczne jak przy jego + tworzeniu. Po zamontowaniu miejsca, w którym składowane są obrazy, + podczas wybierania trybu wybieramy restoredisk, przywracając + tym samym stan zapisany w obrazie na dysk. +

+

+ 01-clonezilla2-przywracanie-dysku +

+

+ Program przeszuka teraz magazyn w poszukiwaniu obrazów i zostaną one + wyświetlone w menu do wyboru. Naszym zadanie jest wybrać obraz jaki + ma zostać przywrócony na tym komputerze. +

+

+ 02-clonezilla2-wybor-pliku-obrazu +

+

+ Dla wybranego obrazu musimy teraz wskazać docelowy dysk. Środowisko + Clonezilli przeszuka komputer pod względem dysków i zostaną one + wyświetlone w menu do wyboru. +

+

+ 03-clonezilla2-wybor-dysku-docelowego-dla-obrazu +

+

+ Teraz program zapyta o to czy sprawdzić obraz przed przywróceniem. + Jeśli jest to dla nas ważne, możemy go sprawdzić. Jednak jeśli + testujemy Clonezillę. Możemy sobie darować, stracimy tylko + czas. +

+

+ 04-clonezilla2-pominiecie-sprawdzania-obrazu +

+

+ Tak jak i w przypadku tworzenia obrazu, należy wskazać czynność jaka + zostanie wykonana po przywróceniu. +

+

+ 05-clonezilla2-akcja-po-zakonczeniu-przywracania-obrazu +

+

+ Następnie zostanie nam zwrócone + polecenie użyte do przywrócenia, mamy szanse je zapisać, aby + zaoszczędzić te kilka chwil spędzonych na pytaniach programu + przywracając ten obraz ponownie w tych samych okolicznościach. +

+

+ 06-clonezilla2-zapisanie-polecenia-przywracania +

+

+ Po naciśnięciu klawisza "Enter", narzędzie zapyta nas dwukrotnie, czy + chcemy kontynuować przywracanie obrazu, ponieważ ta czynność nadpisze + wszelkie dane znajdujące się na dysku. +

+

+ 08-clonezilla2-drugi-z-dwoch-consentow-o-nadpisanie-danych-na-dysku +

+

+ Po potwierdzeniu, rozpoczyna się już właściwa procedura przywracania + realizowana przez program Partclone. Po jej zakończniu zostanie + wykonana czynność wybrana przed przywracaniem. +

+

+ 11-clonezilla2-przywracanie-obrazu-na-fizycznym-komputerze +

+

+ Poniżej znajduje się zdjęcie przedstawiające pulpit laptopa, na którego + system został przeniesiony z maszyny wirtualnej. Powyższe zdjęcie + również pochodzi z procedury przywracania systemu na tym sprzęcie. + Jak widać system się uruchomił, pozostało tylko zainstalować + sterowniki i można działać. Przenoszenie powiodło się zarówno w moim + jak i testowym przypadku. Póki co czekam na feedback czy + program działa. +

+

+ 12-clonezilla2-gotowy-pulpit-na-fizycznym-komputerze +

+

+ Część rysunków w podczas przywracania to zrzuty ekranu z maszyny + wirtualnej, dlatego iż były prostsze do zarejestrowania niż robienie + zdjęć błyszczącej matrycy. +

+

+ ~xf0r3m +

+
+ + + + diff --git a/articles/tnt/tworzenie_maszyn_wirtualnych_VirtualBox_z_poziomu_terminala.html b/articles/tnt/tworzenie_maszyn_wirtualnych_VirtualBox_z_poziomu_terminala.html new file mode 100755 index 0000000..3bb2f25 --- /dev/null +++ b/articles/tnt/tworzenie_maszyn_wirtualnych_VirtualBox_z_poziomu_terminala.html @@ -0,0 +1,123 @@ + + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Tworzenie maszyn wirtualnych VirtualBox z poziomu terminala

+

+ Wykonujemy poniższą sekwencje poleceń, aby utworzyć maszynę VirtualBox + poziomu terminala. +

+

+ Rozpoczniemy od utworzenia samej maszny, a następnie będziemy ją + konfigurować. +

+
+$ vboxmanage --createvm --name <nazwa_maszyny> --ostype <goszczony_system_operacyjny> --register
+
+

+ W katalogu maszyny $HOME/VirtualBox VMs/<nazwa_maszyny>, + utworzymy dysk. +

+
+$ vboxmanage createhd --filename <nazwa_dysku> --size <rozmiar_dysku_w_MB> --format VDI --variant Standard
+
+

+ Po utworzeniu dysku możemy przejść do utworzenia kontrolera dysków na + maszynie. +

+
+$ vboxmanage storagectl <nazwa_maszyny> --name SATA0 --add sata
+
+

+ Kiedy mamy już dodany kontroler, możemy załadować dysk oraz obraz płyty, + z którego będziemy instalować system. +

+
+#DYSK:
+$ vboxmanage storageattach <nazwa_maszyny> --storagectl SATA0 --port 0 --type hdd --medium <nazwa_pliku/scieżka dysku>
+
+#OBRAZ PŁYTY
+$ vboxmanage storageattach <nazwa_maszyny> --storagectl SATA0 --port 1 --type dvddrive --medium <ścieżka_do_iso>
+
+

+ Teraz możemy ustawić ilość pamięci (pamięć jest wyrażana w megabajtach) + oraz interfejs sieciowy. +

+
+#Pamięć RAM:
+$ vboxmanage modifyvm <nazwa_maszyny> --memory 2048
+
+#Sieć NAT (jest ustawiana domyślnie podczas tworzeznia maszyny):
+$ vboxmanage modifyvm <nazwa_maszyny> --nic1 nat
+
+#Sieć Bridged:
+$ vboxmanage modifyvm <nazwa_maszyny> --nic1 bridged
+$ vboxmanage modifyvm <nazwa_maszyny> --bridgedadapter1 <interfejs_sieciowy_komputera>
+
+

+ Jeśli uruchamiamy maszynę gdzieś na serwerze i nie mamy dostępu do + środowiska graficznego, wtedy możemy skorzystać z RDP. Jednak wymaga + ono zainstalowania Oracle VM VirtualBox Extension Pack. +

+
+$ vboxmanage modifyvm <nazwa_maszyny> --vrde on
+$ vboxmanage modifyvm <nazwa_maszyny> --vrdeport <port_dla_vrde>
+
+

+ Teraz możemy wystartować maszynę, jeśli korzystamy z serwera to należy + ją uruchomić w headless. +

+
+#Serwer zdalny bez GUI:
+$ vboxmanage startvm <nazwa_maszyny> --type headless
+#Normalna stacja robocza:
+$ vboxmanage startvm <nazwa_maszyny>
+
+

+ Jeśli nie podamy goszczonego systemu podczas rejestracji (tworzenia + maszyny), to: +

+
    +
  • Dla systemu Windows należy ustawić te dwie rzeczy: +
    +$ vboxmanage modifyvm <nazwa_maszyny> --chipset ich9
    +$ vboxmanage modifyvm <nazwa_maszyny> --ioapic on
    +
    +
  • +
  • Dla systemów BSD należy ustwić poniższą opcję: +
    +$ vboxmanage modifyvm <nazwa_maszyny> --hwvirtex on
    +
    + Jednakże przy wirtualizcji sprzętowej należy pamiętać że, jeśli + chcemy jej użyć musi być ona wspierana przez procesor oraz włączona + w BIOS. +
  • +
+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/tworzenie_szyfrowanych_archiw\303\263w_za_pomoc\304\205_7-zip.html" "b/articles/tnt/tworzenie_szyfrowanych_archiw\303\263w_za_pomoc\304\205_7-zip.html" new file mode 100755 index 0000000..d3f6f1f --- /dev/null +++ "b/articles/tnt/tworzenie_szyfrowanych_archiw\303\263w_za_pomoc\304\205_7-zip.html" @@ -0,0 +1,40 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + +
+

Tworzenie szyfrowanych archiwów za pomocą 7-zip

+
+$ 7z a -t7z -mhe=on -p<hasło> <nazwa_archiwum> <plik/pliki/katalog>
+
+
    +
  • a - utworzenie archiwum,
  • +
  • -t7z - ustawienie formatu archiwum jako 7-zip,
  • +
  • -mhe=on - szyfrowanie nagłówków, dzięki temu hasło będzie wymagane nawet do otwarcia archiwum,
  • +
  • -p<haslo> - hasło archiwum, używane do jego zaszyfrowania.
  • +
+

+ Reszta jest raczej czytelna i nie wymaga komentarza. +

+
+ + + diff --git a/articles/tnt/uruchomienie_kodu_JS_w_tle_innego_skryptu_JS.html b/articles/tnt/uruchomienie_kodu_JS_w_tle_innego_skryptu_JS.html new file mode 100755 index 0000000..26a394c --- /dev/null +++ b/articles/tnt/uruchomienie_kodu_JS_w_tle_innego_skryptu_JS.html @@ -0,0 +1,57 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Uruchomienie kodu JavaScript w tle innego + skryptu

+

+ Możemy użyć techiki tzw. Workerów. Poniżej znajduje się kod, + ustawiono w nim interwał, który uruchamia tą funkcję co jakiś czas w + tym przypadku jest 0,5 sekundy. +

+
+//plik główny .js:
+var w = new Worker('<plik_z_funkcją_działającą_w_tle>');
+
+w.onmessage = function(e) {
+	//po uzyskaniu wyniku pracy funkcji w tle, zrób coś...
+}
+
+//plik z funkcją działającą w tle:
+
+function getMsgFromServer () {
+	//zrób cos ...
+	postMessage(wiadomosc_zwrotna);
+
+	//Uruchom funkcje po odczekaniu timeout-u 0,5 sek.
+	setTimeout("getMsgFromServer()", 500);
+}
+getMsgFromServer();
+
+

+ ~xf0r3m +

+
+ + + diff --git a/articles/tnt/uruchomienie_ssh_na_raspberry_pi.html b/articles/tnt/uruchomienie_ssh_na_raspberry_pi.html new file mode 100755 index 0000000..3bff942 --- /dev/null +++ b/articles/tnt/uruchomienie_ssh_na_raspberry_pi.html @@ -0,0 +1,40 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Uruchomienie SSH na Raspberry Pi

+

+ Opcje są dwie. Kiedy urządzenie już działa możemy uruchomić SSH za + pomocą polecenia $ sudo raspi-config + -> 5. Interfaceing Options -> + P2 SSH -> + yes. +

+

+ Drugim rozwiązaniem jest utworznie pustego plik o nazwie ssh + na partycji boot karty pamięci. +

+
+ + + diff --git "a/articles/tnt/ustawienie_kodowania_polskich_znak\303\263w_w_MySQL.html" "b/articles/tnt/ustawienie_kodowania_polskich_znak\303\263w_w_MySQL.html" new file mode 100755 index 0000000..4fa41e0 --- /dev/null +++ "b/articles/tnt/ustawienie_kodowania_polskich_znak\303\263w_w_MySQL.html" @@ -0,0 +1,79 @@ + + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Ustawienie kodowanie polskich znaków w MySQL

+

+ Kodowanie polskich znaków możemy ustawić poprzez dopisanie kilku opcji + w pliku konfiguracyjnym MySQL. Plik znajduje się na ścieżce + /etc/mysql/conf.d/mysql.conf, oczywiście tam gdzie serwer baz + danych to MySQL a nie MariaDB. W pliku dopisujemy następujące opcje. +

+
+[mysql]
+default-character-set = utf8
+[mysqld]
+collation-server = utf8_polish_ci
+init-connect = 'SET NAMES utf8'
+character-ser-server = utf8
+
+

+ Restartujemy serwer. +

+
+$ sudo systemctl restart mysql
+
+

+ Po zrestartowaniu serwera możemy sprawdzić ustawienia za pomocą dwóch + poleceń. +

+
+mysql> SHOW VARIABLES LIKE 'char%'
+
+

+ Powinniśmy zobaczyć, że każda zmienna jest ustawiona na + utf8, poza jedną - ustawioną na + binary. +

+
+mysql> SHOW VARIABLES LIKE 'colla%'
+
+

+ Pierwsza zmienna powinna mieć wartość + utf8_general_ci, natomiast pozostałe + utf8_polish_ci. Te zmiany spowodują + wyświetlanie polskich znaków w konsoli MySQL. Także pozwolną na użycie + modyfikatorów ORDER BY z polskimi + znakami w operandach. +

+

+ Źródło: Internet. +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/ustawienie_protoko\305\202u_VNC_dla_maszyn_VirtualBox_uruchamianych_w_trybie_headless.html" "b/articles/tnt/ustawienie_protoko\305\202u_VNC_dla_maszyn_VirtualBox_uruchamianych_w_trybie_headless.html" new file mode 100755 index 0000000..001ac7d --- /dev/null +++ "b/articles/tnt/ustawienie_protoko\305\202u_VNC_dla_maszyn_VirtualBox_uruchamianych_w_trybie_headless.html" @@ -0,0 +1,61 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + +
+

Ustawienie protokołu VNC dla maszyn VirtualBox uruchamianych w trybie headless

+

+ W przypadku zdalnych ekranów maszyn VirtualBox najważniejsze + to posiadać zainstalowany VNC Extension Pack na + komputerze, który tą maszynę uruchomił. W przeciwym wypadku maszynę + należy wyłączyć a następnie zainstalować paczkę rozszerzeń + Oracle VM VirtualBox Extension Pack i użyć protoku + RDP, który wymaga do konfiguracji jedynie dwóch pierwszych poleceń + czyli włączenia samego zdalnego dostępu oraz wybrania portu, + oczywiście istnieje możliwość zabezpieczenia dostępu hasłem, w + przeciwnym wypadku uwierzytelnienie działa na zasadzie kto pierwszy + ten lepszy. +

+
+$ vboxmanage modifyvm <nazwa_maszyny> --vrde on
+$ vboxmanage modifyvm <nazwa_maszyny> --vrdeport <port_rdp/vnc>
+$ vboxmanage modifyvm <nazwa_maszyny> --vrdeproperty VNCPassword=<hasło_dla_połaczenia>
+
+

+ Po wykonaniu tych poleceń możemy uruchomić maszynę wirtualną. Do + połączenia możemy wykorzystać np. program Remmina, który jest + standardowym pakietem, odpowiedzialnym za połączenia RDP oraz VNC w + systemach GNU/Linux. Wybieramy protokół, przez który będziemy się + łączyć z maszyną. Następnie w adresie serwera podajemy adres IP, + komputera który uruchomił maszynę lub localhost, po dwukropku + (:) port. Podczas zestawiania połączenia zostaniemy + zapytani o zdefiniowane w ostatnim poleceniu hasło, o ile użyliśmy VNC. +

+

+ Źródło: Internet +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/usuni\304\231cie_tablicy_RAID_madm.html" "b/articles/tnt/usuni\304\231cie_tablicy_RAID_madm.html" new file mode 100755 index 0000000..696018b --- /dev/null +++ "b/articles/tnt/usuni\304\231cie_tablicy_RAID_madm.html" @@ -0,0 +1,63 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Usunięcie tablicy RAID madm

+

+ Żeby usunąć tablicę RAID musimy na początku + zatrzymać urządzenie RAID za pomocą poniższego + polecenia. +

+
+$ sudo mdadm --stop <urządzenie_RAID>
+
+

+ Teraz możemy zainicjować dysk za pomocą polecenia + fdisk, sformatować partycję i zacząć + z niej korzystać. +

+
+$ sudo fdisk /dev/sdb
+> o
+> n
+> p
+> [ENTER]
+> [ENTER]
+> [ENTER]
+>  w
+> quit
+
+$ sudo mkfs.ext4 /dev/sdb1
+
+$ sudo mount /dev/sdb1 /mnt
+
+

+ Źródło: Internet +

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/u\305\274ycie_polecenia_rsync_w_PHP.html" "b/articles/tnt/u\305\274ycie_polecenia_rsync_w_PHP.html" new file mode 100755 index 0000000..e4a25dd --- /dev/null +++ "b/articles/tnt/u\305\274ycie_polecenia_rsync_w_PHP.html" @@ -0,0 +1,59 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Użycie polecenia rsync w PHP

+

+ Użyć polecenia rsync możemy za pomocą instrukcji + exec(), wartością zwracaną przez tą + instrukcje są dane wyjściowe polecenia. +

+

+ W celu uruchomienia polecenia rsync, + należy pamiętać o wymianie kluczy między stronami oraz o tym aby + użytkownik www-data posiadał w swoim katalogu domowym + (zazwyczaj /var/www) katalog .ssh z kluczami. Katalog + ten powinien mieć ustawionego właściciela na www-data oraz + odpowienie uprawnienia (644, dla katalogu, 600 dla + klucza prywatnego [plik bez rozszerzenia .pub]). Warto również użyć + kilku opcji SSH (przez SSH rsync + łączy się z serwerem) takich jak 'StrictHostKeyChecking' ustawione na + 'no' (StrictHostKeyChecking=no) oraz + 'UserKnowHostFile' ustawione na /dev/null + (UserKnownHostsFile=/dev/null) + Aby w ogóle użyć opcji SSH w rsync, + należy użyć przełącznika -e jako + wartość tej opcji w podwójnych apostrofach podaje się polecenie + ssh gdzie, każdą z opcji podaje się + po przełączniku -o. +

+
+exec('rsync -re \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" <katalog_lokalny> <użytkownik_zdalny>@<adres_ip_serwera>:<katalog_zdalny>');
+
+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/zabezpieczenie_dost\304\231pu_RDP_do_maszyn_VirtualBox_has\305\202em.html" "b/articles/tnt/zabezpieczenie_dost\304\231pu_RDP_do_maszyn_VirtualBox_has\305\202em.html" new file mode 100755 index 0000000..a3b4c2d --- /dev/null +++ "b/articles/tnt/zabezpieczenie_dost\304\231pu_RDP_do_maszyn_VirtualBox_has\305\202em.html" @@ -0,0 +1,73 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + + +
+

Zabezpieczenie dostępu RDP do maszyny VirtualBox hasłem

+

+ Na wyłączonej maszynie musimy ustawić poniższe opcje: +

+
+vboxmanage setproperty vrdeauthlibrary "VBoxAuthSimple"
+vboxmanage modifyvm "<nazwa_vm>" --vrdeauthtype external
+vboxmanage internalcommands passwordhash <hasło>
+vboxmanage setextradata "<nazwa_vm>" "VBoxAuthSimple/users/<nazwa_użytkownika>" <hash>
+
+

+ Gdzie: +

+
    +
  • nazwa_użytkownika - Możemy podać + dowolny ciąg znaków. Ta wartość będzie sprawdzana z polem + "nazwa użytkownika" programu, z którego bedziemy się łączyć z maszyną.
  • +
  • hash - hash wygenerowany przez + polecenie + vboxmanage internalcommands passwordhash + <hasło>
  • +
+

+ Jeśli wcześniej nie uruchamialiśmy maszyn z VRDE to upewnijmy + się najpierw, że mamy zainstalowany Extension Pack. Po wydaniu + tych poleceń możemy uruchamiać maszynę. Więcej informacji odnośniku + źródłowym. +

+

+ Programy, przez które będzimy się łączyć z maszyną mogą nie zwrócić + monitu o dane uwierzytelniające. Wyświetlą jedynie informacje o tym, + że nie udało się połączyć z danym serwerem. Wtedy należy utworzyć + profil połączenia, i z tego poziomu powinno się już połączyć + (przynajmniej tak jest na Remminie na GNU/Linux Debian). +

+

+ Źródło: +

    +
  1. + Podręcznik VirtualBox (dokumentacja)
  2. +
+

+

+ ~xf0r3m +

+
+ + + diff --git "a/articles/tnt/zwrot_warto\305\233ci_logicznej_dla_sparsowanego_zapytania_SQL_w_PHP.html" "b/articles/tnt/zwrot_warto\305\233ci_logicznej_dla_sparsowanego_zapytania_SQL_w_PHP.html" new file mode 100755 index 0000000..af1bccb --- /dev/null +++ "b/articles/tnt/zwrot_warto\305\233ci_logicznej_dla_sparsowanego_zapytania_SQL_w_PHP.html" @@ -0,0 +1,41 @@ + + + + + + + + +
+  _______            ___   ______     _      __
+ /_  __(_)___  _____( _ ) /_  __/____(_)____/ /_______
+  / / / / __ \/ ___/ __ \/|/ / / ___/ / ___/ //_/ ___/
+ / / / / /_/ (__  ) /_/  </ / / /  / / /__/ ,< (__  )
+/_/ /_/ .___/____/\____/\/_/ /_/  /_/\___/_/|_/____/
+     /_/
+
+ + +
+

Zwrot wartości logicznej dla sparsowanego zapytania SQL w PHP

+

+ Instrukcja sprintf zwraca + FALSE, w razie błedu podczas parsowania. Najczęstszą przyczyną + jest za mało lub za dużo o jeden format + (%s) albo argument + (mysqli_real_escape_string($connection, ...)). +

+

+ Źródło: Internet. +

+

+ ~xf0r3m +

+
+ + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..0434438 --- /dev/null +++ b/index.html @@ -0,0 +1,227 @@ + + + + + + + + +
+			 __        __                           __
+   ____ ___  ____  _____/ /_____  / /__________ ___  ___  _____/ /_____
+  / __ `__ \/ __ \/ ___/ //_/ _ \/ __/ ___/ __ `__ \/ _ \/ ___/ //_/ _ \
+ / / / / / / /_/ / /  / ,< /  __/ /_(__  ) / / / / /  __/ /  / ,< /  __/
+/_/ /_/ /_/\____/_/  /_/|_|\___/\__/____/_/ /_/ /_/\___/_/  /_/|_|\___/
+
+
+
+ +

 

+

+ Changelog: +

+
    +
  • 14.04.2023 - Utworzenie kategorii dla dokumentacji Immudex
  • +
  • 23.12.2022 - Dodanie "Instalacja własnościowego sterownika graficznego Nvidii na Debian 11"
  • +
  • 10.12.2022 - Zmiana layoutu dużych materiałów na terminallog
  • +
  • 10.12.2022 - Odświerzenie artykułu 'Ściąga z PYTHONga'
  • +
  • 10.09.2022 - Dodanie "Python. Ćwiczenia." na terminallog
  • +
  • 01.09.2022 - Wydanie immudex w wersji 0.0.0
  • +
  • 01.09.2022 - Dodanie "Red Hat Enterprise Linux 9 - RHCSA" na terminallog
  • +
  • 24.07.2022 - Dodanie "Uruchomienie skryptu podczas ładowania systemu - jednostka systemd"
  • +
  • 20.05.2022 - Dodanie "Przenoszenie systemu operacyjnego z maszyny wirtualnej na fizyczny komputer"
  • +
  • 15.05.2022 - Zmiana FAQ na Tips&Tricks
  • +
  • 13.05.2022 - Dodanie "Podłączanie 7-calowego ekranu dotykowego (1024x600) do Raspberry Pi"
  • +
  • 07.05.2022 - Przeniesienie strony na adres https://morketsmerke.github.io
  • +
  • 06.05.2022 - Wydanie greenOS 1.4
  • +
  • 05.05.2022 - Zmiany w greenOS. Wydanie wersji greenOS 1.3 (btw i use Arch)
  • +
  • 27.04.2022 - Wydanie OTP w wersji 1.0.5
  • +
  • 17.04.2022 - Wydanie OTP w wersji 1.0.4
  • +
  • 16.04.2022 - Wydanie OTP w wersji 1.0.3
  • +
  • 31.03.2022 - Przeniesienie strony na inny serwer. Powrót do domeny morketsmerke.net. Home Sweet Home.
  • +
  • 29.03.2022 - Test GitHub CLI
  • +
  • 27.03.2022 - Wydanie greenOS greenServer
  • +
  • 27.03.2022 - Wydanie wersji greenOS 1.2
  • +
  • 27.02.2022 - Usunięcie dotychczasowej serii "Jak działa Linux". Wymaga ona przeredagowania.
  • +
  • 13.02.2022 - Wydanie OTP w wersji 1.0.2
  • +
  • 13.02.2022 - Wydanie greenOSTe 9.0.1
  • +
  • 11.02.2022 - Upublicznienie archiwum z greenOSAE
  • +
  • 11.02.2022 - Przeniesienie danych z ftp.morketsmerke.net na serwis sourceforge.net oraz aktualizacja adresów odnośników na stronie greenOS
  • +
  • 30.01.2022 - Wydanie greenOS Ratpoison
  • +
  • 30.01.2022 - Wydanie greenOS 1.1
  • +
  • 22.01.2022 - Dodanie kolejnego rozdziału do serii "Jak działa Linux?"
  • +
  • 07.01.2022 - Dodanie kolejnego rozdziału do serii "Jak działa Linux?"
  • +
  • 04.01.2022 - Dodanie "linux/Szyfrowany rootfs na greenOSTe"
  • +
  • 30.12.2021 - Wydanie pierwszej wersji greenOS Trisquel edition (Torwards the sun)
  • +
  • 23.12.2021 - Dodanie "Szyfrowany rootfs na greenOS"
  • +
  • 22.12.2021 - Wydanie OTP w wersji 1.0.1
  • +
  • 19.12.2021 - Dodanie kolejnego rozdziału do serii "Jak działa Linux?"
  • +
  • 12.12.2021 - Wydanie pierwszej wersji OTP o nazwie kodowej "Wise choice".
  • +
  • 06.12.2021 - Rozpoczęcie prac nad OTP.
  • +
  • 05.12.2021 - Reaktywacja projektu greenOS (Wydanie wersji 1 [Torwards the sun])
  • +
  • 18.11.2021 - Dodanie kolejnego rodziału do serii "Jak działa Linux?"
  • +
  • 14.11.2021 - Update materiału "Parabola GNU/Linux-libre"
  • +
  • 12.11.2021 - Dodanie "Parabola GNU/Linux-libre"
  • +
  • 28.10.2021 - Dodanie kolejnego rozdziału do serii "Jak działa Linux?"
  • +
  • 15.10.2021 - Dodanie kolejnego rozdziału do serii "Jak działa Linux?"
  • +
  • 03.10.2021 - Dodanie kolejnego rozdziału do serii "Jak działa Linux?"
  • +
  • 26.09.2021 - Przeniesie morketsmerke.net na morketsmerke.github.io
  • +
  • 24.09.2021 - Zwieszenie wsparcia dla greenOS
  • +
  • 19.09.2021 - Dodanie "greenOSAE"
  • +
  • 05.09.2021 - Dodanie "Raspberry Pi jako przekaźnik bluetooth"
  • +
  • 03.09.2021 - Dodanie "Instalacja systemu z własnego obrazu LiveCD z Debianem"
  • +
  • 02.09.2021 - Dodanie "Własne LiveCD z Debianem"
  • +
  • 21.08.2021 - Wydanie pierwszej oficjalnej wersji greenOS
  • +
  • 30.07.2021 - Dodanie "GNU mailutils jako program mailowy"
  • +
  • 29.07.2021 - Dodanie "Raspberry Pi jako serwer poczty"
  • +
  • 30.06/01.07.2021 - Uruchomienie mirroru Debiana dla stable, oldstable dla architektur amd64 oraz i386
  • +
  • 12-13.06.2021 - Rozpoczęcie prac nad greenOS
  • +
  • 08.06.2021 - Rozpoczęcie serii materiałów "Jak działa Linux?"
  • +
  • 15.05.2021 - Uaktualnienie "Laboratorium sieci VPN".
  • +
  • 15.05.2021 - Dodanie "Sieci VPN" na terminallog.
  • +
  • 07.05.2021 - Dodanie "Konfiguracja HAProxy dla HTTP oraz HTTPS" na terminallog.
  • +
  • 05.05.2021 - Aktualizacja FAQ.
  • +
  • 03.05.2021 - Zmiany w "lost+found".
  • +
  • 02.05.2021 - Dodanie "20 letni Sun Netra T1 jako serwer mailowy z wykorzystaniem NetBSD".
  • +
  • 30.04.2021 - Dodanie "Instalacja NetBSD".
  • +
  • 11.04.2021 - Dodanie "Dziennika OpenBSD".
  • +
  • 04.04.2021 - Zakończenie prac nad obecną formą strony.
  • +
  • 26.03.2021 - Zakończenie przenoszenia treści na nową wersję strony.
  • +
  • 01.11.2020 - Przenosiny zakończone, utworzenie frontpage-a morketsmerke.net.
  • +
  • 28.10.2020 - Rozpoczęcie przenosin na inny sprzęt.
  • +
  • 19.10.2020 - Rozpoczęcie redagowania artykułu Bash Bushido dla terminallog.
  • +
  • 16.10.2020 - Rozpoczęcie przenoszenia treści na nową wersję strony.
  • +
  • 15.10.2020 - Utworznie statycznych podstron dla katalogów.
  • +
  • 14.10.2020 - Rozpoczęcie tworzenia nowej odsłony strony morketsmerke.net.
  • +
+

Ostatnie zmiany w projektach: https://github.com/xf0r3m

+ +

Ostatnie zgłoszenia w serwisie BugTrack: https://bugtrack.morketsmerke.org

+
    +
  • #87 - immudex-lhe - problem - immudex_hostname
  • +
  • #86 - immudex-lhe - problem - immudex_crypt - nie można okeślić systemu plików.
  • +
  • #85 - immudex-lhe - problem - pl - spacja przy linku
  • +
  • #83 - immudex-testing - ulepszenie - create_media - nuke
  • +
+

 

+

+ O mnie +

+
+ +

+ Cześć, mam imię Jakub i jestem entuzajstą systemów uniksopodobnych, + serwerów (zarówno fizycznych maszyn jak i demonów) oraz różnych + dziwnych + rozwiązań komputerowych jak np. cienkie klienty. Żaden ze mnie + sysadmin. Ta strona jest przedłużeniem mojej pamięci i + powstała w jednym celu - zapisać wszystko z czym miałem styczność + podczas moich zabaw z komputerami (if u know what i mean ;)). Często + korzystałem z różnych źródeł próbując coś sobie skonfigurować na + Linuksie czy innym Uniksie i zawarte tam informacje nie zawsze były + trafne, akurat w moim przypadku. (Oczywiście!) Dlatego też zamiast + 15 minut, spędzałem nad nią kilka godzin. + Kiedy już osiągnąłem cel, doszedłem do wniosku że tyle pracy nie może + przecież pójść na marne i zacząłem te swoje rozwiązania spisywać + do plików .txt. Później wpadłem na pomysł, że przecież mogę utworzyć + bloga i tam wszystko umieszczać. Ta strona miała kilka wersji, + charakteryzujących się różnorakim designem, layoutem. + czy rozwiązaniem. Ta jest wersją 6. Czy ostateczną? Tego niewiadomo. + Sądząc po tym jak szybko się nudze i jak bardzo nie służy mi stagnacja + z dużym prawdopodobieństwem chyba nie. + +

+
+

+ Materiały tutaj zamieszczone, tworzę wyłącznie z myślą o sobie samym. + Materiały są pełne literówek, błędów językowych, gramatycznych czy + ortograficznych (spędzając wiecej czasu w książkach o Linuksie czy + jezykach oprogramowania nabawiłem się chyba jakiejś dysleksji, może te + akapity uda się napisać poprawnie). + Te można sobie darować, jednak pracuje nad tym aby każdy materiał był + jak najbardziej merytoryczny i zawierał jak najmniej tego typu błędów. + Jednym słowem grafomania. Materiały zawarte na tej stronie są publikowne + w oparciu o copyleft. (Nie chce mi się przytaczać pełnej nazwy + tej licencji. Nawet jej nie znam. W kwestajach licencyjnych jestem + straszym ignoratem, liczą się tylko te najbardziej liberalne jak + GPL [zaraz i tak się dowiem, że GPL nie jest, aż tak mocno + liberalna], zatem moją licencje mogę określić mianem JCh - "Bierzcie i + korzystajcie z tego wszyscy, to jest moja praca wydana na wieki + wieków", wszystkie inne licencje ograniczające użytkownika to ściek.) + Dlatego też śmiało można korzystać ze wszystkich materiałów tutaj + umieszczonych. Nie obiecuje, że ta strona będzie komukolwiek przydatna, + ale jak już jesteście to siadajcie. Brawo dotarłeś do końca internetu. +

+

+ Jakby ktoś potrzebował kontaktu ze mną, to znajdzie go pod tym + adresem mailowm: itaktegonieodczytam@gmail.com. +

+

 

+

+ Oznaczenia tekstu stosowane w materiałach:
+ (autor zastrzega sobie możliwość niestosowania się do poniższych + reguł) +

+
    +
  • +
    +# rcctl enable dnsmasq
    +
    + (<pre class=".code-block"></pre>) - bloki kodu; + zawartość plików konfiguracyjnych powyżej jednej linii; informacje zwracane + przez programy, +
  • +
  • + rcctl enable dhcpd + (<code class="code-inline"></code>) - fragmenty + bloków oznaczonych klasą .code-block; pojedyńcze linie poleceń lub + linie plików konfiguracyjnych oraz ewentualne ich fragmenty użyte w innych + elementach niż te opisane powyższą klasą; informacje zwracane przez programy + wykorzystane w akapitach, +
  • +
  • <em></em> - wyrazy obce; nazwy programów; scieżki; + nazwy plików, +
  • +
  • <strong></strong> - przedstawienia znaków; + szczególny nacisk na fragmenty tekstu; pierwsze wystąpienie frazy w + przeznaczonym dla niej fragmencie tekstu. +
  • +
  • <u></u> - nałożenie nacisku na termin + mniej istotny niż znacznik strong +
  • +
+
+

 

+ + + + diff --git a/style.css b/style.css new file mode 100644 index 0000000..a6238ec --- /dev/null +++ b/style.css @@ -0,0 +1,137 @@ +body { + background-color: #282828; + color: #c7cbd0; + font-family: monospace; + font-size: 13pt; +} + +.code-block { + display: block; + background-color: #353535; + font-family: monospace; + font-weight: bolder; +} + +.code-inline { + background-color: #353535; + font-family: monospace; + font-weight: bolder; +} + +p { + text-align: justify; +} + +.main { + margin-left: auto; + margin-right: auto; + width: 80%; +} + +.links { + margin: 0; + padding: 0; + outline: 0; + font-size: 14pt; +} + +.header_link { + margin: 15px; + padding: 0; + outline: 0; + font-size: 18pt; +} + +.special_list { + list-style-type: none; + font-size: 14pt; +} + +.title { + text-align: center; +} + +td { + border-bottom: 1px solid #c7cbd0; +} + +th { + border-top: 1px solid #c7cbd0; + border-bottom: 1px solid #c7cbd0; +} + +a:link { + color: #5555ff; +} + +.footer { + margin: 15px; + padding: 0; + outline: 0; +} + +.toc { + list-style-type: none; +} + +.mainToc { + padding-left: 0; +} + +#tableOfContent { + width: 38%; + height: 100vh; + float: left; + overflow: scroll; + padding-right: 1%; + margin-left: 1%; +} + +#content { + width: 56%; + height: 100vh; + float: left; + overflow: scroll; + margin-left: 2%; + padding-right: 1%; +} + +#contentHeader { + width: 100%; + float: left; +} + +#contentHeaderLink { + float: left; + padding-left: 5%; + padding-top: 5%; +} + +#divisionBaner { + font-size: 9pt; + float: left; +} + +.warn-sign { + font-weight: bold; +} + +.notice { color: black; } +.warning { color: red; } + +.reduced-list { + overflow-y: scroll; + height: 150px; +} + +.centered-text { + text-align: center; +} + +.lefted-text { + text-align: left; +} + +.no-border { + border: hidden; +}