Linux


Podstawowe komendy użytkowe

Podstawowe komendy użytkowe

Poruszanie się w CLI / BASH / SSH

Wprowadzenie:

W systemach Linux/Unix praca odbywa się głównie w środowisku tekstowym (terminalu). Zrozumienie, jak nawigować po systemie plików, jest fundamentem pracy administracyjnej. Poniżej przedstawiamy podstawowe i zaawansowane komendy do poruszania się po strukturze katalogów.

1. Komenda pwd – gdzie jestem?

pwd

Polecenie pwd (print working directory) wyświetla pełną, bezwzględną ścieżkę do katalogu, w którym aktualnie się znajdujemy. Jest to podstawowa komenda pozwalająca na orientację w strukturze katalogów systemu.

Przykład:

$ pwd
/home/admin/projekty

2. Komenda ls – co jest w katalogu?

ls

Komenda ls (list) wyświetla listę plików i katalogów w bieżącym katalogu. To podstawowe narzędzie do przeglądania zawartości systemu plików.

Najczęściej używane opcje:

ls -l

Wyświetla szczegółowe informacje o plikach: uprawnienia, właściciela, grupę, rozmiar, datę modyfikacji i nazwę.

ls -a

Pokazuje również pliki ukryte (których nazwa zaczyna się od kropki .).

ls -lh

Łączy opcję -l z -h (human-readable), wyświetlając rozmiary plików w formacie czytelnym dla człowieka (KB, MB, GB).

ls -lah

Połączenie wszystkich trzech opcji – szczegółowy widok ze wszystkimi plikami (w tym ukrytymi) i czytelnymi rozmiarami.

ls -lt

Sortuje pliki według daty modyfikacji (najnowsze na górze).

ls -lS

Sortuje pliki według rozmiaru (największe na górze).

3. Komenda cd – poruszanie się między katalogami

cd /ścieżka/do/katalogu

Polecenie cd (change directory) zmienia aktualny katalog roboczy na wskazany.

Najważniejsze sposoby użycia:

cd ~

Przechodzi do katalogu domowego aktualnego użytkownika (np. /home/admin).

cd ..

Przechodzi do katalogu nadrzędnego (rodzica) względem bieżącego katalogu.

cd -

Wraca do poprzedniego katalogu, w którym byliśmy przed ostatnią zmianą.

cd ./katalog

Wchodzi do podkatalogu katalog znajdującego się w bieżącej lokalizacji.

cd /

Przechodzi do katalogu głównego systemu (root directory).

4. Zrozumienie kropek w ścieżkach

Przykłady:

cd ../dokumenty     # przejdź poziom wyżej, potem do katalogu dokumenty
cd ~/projekty       # przejdź do katalogu projekty w katalogu domowym
cd ../../tmp        # dwa poziomy wyżej, potem do katalogu tmp

6. Komenda tree – drzewo katalogów

tree

Wyświetla strukturę katalogów w formie drzewa (jeśli narzędzie jest zainstalowane). Pozwala na szybką wizualizację zagnieżdżenia katalogów.

tree -L 2

Ogranicza głębokość wyświetlania do 2 poziomów.

Podsumowanie praktyczne:

# Sprawdź, gdzie jesteś
pwd

# Wyświetl pliki w bieżącym katalogu ze szczegółami
ls -lah

# Przejdź do katalogu projekty
cd ~/projekty

# Wróć do poprzedniego katalogu
cd -

# Przejdź poziom wyżej
cd ..

# Wyświetl pełną ścieżkę do pliku
readlink -f config.conf
Podstawowe komendy użytkowe

Obsługa przegladania plików : CAT, HEAD, TAIL

1. cat – wyświetlanie zawartości pliku

cat plik.txt

Wyświetla całą zawartość pliku plik.txt na standardowe wyjście (terminal). Używany też do łączenia plików i przekierowania ich zawartości.

Przykład łączenia plików i zapisu do nowego pliku:

cat plik1.txt plik2.txt > polaczony_plik.txt

2. head – wyświetlanie początkowych linii pliku

head plik.txt

Wyświetla domyślnie pierwsze 10 linii pliku plik.txt.

Zmiana liczby wyświetlanych linii:

head -n 20 plik.txt

Wyświetla pierwsze 20 linii pliku.


3. tail – wyświetlanie końcowych linii pliku

tail plik.txt

Wyświetla ostatnie 10 linii pliku.

Śledzenie zmieniającego się pliku (np. pliku logu):

tail -f /var/log/syslog

Na żywo wyświetla kolejne dodawane linie do pliku (przydatne przy monitorowaniu logów).

Wyświetlenie określonej liczby ostatnich linii:

tail -n 50 plik.log

Ostatnie 50 linii pliku plik.log.


Praktyczne zastosowania połączeń narzędzi

Wyświetlenie ostatnich 100 linii z monitorowaniem na żywo (analogicznie jak tail -f):

tail -n 100 -f /var/log/system.log

Wyświetlenie pierwszych 50 linii wyszukanego pliku, np. połączone z grep:

grep "error" /var/log/syslog | head -n 50

Parametry komendy ich wykorzystanie: 

-n (–lines=ILE)

Opcja pozwala określić liczbę wyświetlanych linii od końca pliku.

tail -n 20 plik.txt

Wyświetli ostatnie 20 linii pliku plik.txt. Domyślnie jest to 10 linii, jeśli nie podamy opcji.

-f (–follow[=OPTION])

Opcja stosowana do śledzenia pliku na bieżąco. Wypisuje najpierw ostatnie linie, potem wyświetla na żywo nowe linie dopisywane do pliku.

tail -f /var/log/syslog

Przydatne do monitorowania plików logów w czasie rzeczywistym.

-c (–bytes=ILE)

Wypisuje z pliku zamiast linii określoną liczbę ostatnich bajtów.

tail -c 100 plik.txt

Wyświetla ostatnie 100 bajtów pliku. Jeden bajt to jeden znak lub nowa linia.

-q (–quiet, –silent)

Przy wyświetlaniu wielu plików nie wyświetla ich nazw nad zawartością.

tail -q -n 10 plik1.txt plik2.txt

-v (–verbose)

Zawsze wyświetla nazwę pliku nad jego zawartością nawet przy jednym pliku.

Inne przydatne opcje

Przykład kompleksowy:

tail -n 50 -f -s 2 /var/log/app.log

Wyświetla ostatnie 50 linii pliku app.log, a następnie śledzi plik, odświeżając co 2 sekundy.

Użycie w potoku i z filtrowaniem:

tail -f /var/log/app.log | grep --color "ERROR"

Monitoruje na żywo plik logów i podświetla słowo "ERROR".

Podstawowe komendy użytkowe

Obsługa komendy "ps" - Proces Status

Komenda ps (process status) jest jednym z fundamentalnych narzędzi administracyjnych do monitorowania procesów w systemach Unix/Linux. Pozwala na identyfikację, śledzenie i diagnostykę działających aplikacji. W pracy z serwerami (szczególnie przy Proxmox, FreeBSD czy administracji gra serwerów MT2) niezbędna jest umiejętność interpretacji wyniku ps.

Podstawowe użycie ps

ps

Wyświetla procesy bieżącego użytkownika w aktualnej sesji terminalowej. Bardzo podstawowe, rzadko wystarczające dla administratora.

image.png

Przeglądanie wszystkich procesów z pełnymi informacjami

ps aux

To najczęstsze polecenie dla administratorów. Wyświetla wszystkie procesy w systemie (a – wszystkie, u – szczegółowy format, x – procesy bez terminala). Kolumny oznaczają: USER (właściciel), PID (ID procesu), %CPU (procent CPU), %MEM (procent pamięci), VSZ (rozmiar wirtualny), RSS (resident set size – fizyczna pamięć), TTY (terminal), STAT (status), START (czas startu), TIME (czas CPU), COMMAND (polecenie).

image.png

Alternatywny format wyświetlania

ps -ef

Inny sposób na wyświetlenie wszystkich procesów, bardziej zbliżony do formatu Linuksa (zamiast BSD-owego aux). PPID (ID procesu nadrzędnego) jest tu bardziej widoczne.

image.png

Filtrowanie procesów konkretnego użytkownika

ps -u 'nazwa_usera'

image.png

Pokazuje tylko procesy należące do użytkownika admin. Przydatne gdy szukamy co robi konkretny użytkownik.

ps -u root,www-data

Procesy należące do wielu użytkowników naraz.

Wyszukiwanie konkretnych procesów

ps aux | grep 'nazwa procesu'

Wyszukuje procesy związane z danym procesem

image.png

ps aux | grep -v grep
image.png
image.png

Eliminuje z wyniku samo polecenie grep (często pojawia się w wynikach).

pgrep -lf 'nazwa_procesu'

Szuka procesu po pełnej nazwie polecenia (bardziej precyzyjne niż grep).

image.png

Sortowanie procesów

ps aux --sort=-%cpu | head -20

Wyświetla 20 procesów zużywających najwięcej CPU, posortowanych malejąco.

image.png

ps aux --sort=-%mem | head -20

Wyświetla 20 procesów zużywających najwięcej pamięci RAM.

image.png

ps aux --sort=-vsz

Sortuje po wirtualnym rozmiarze pamięci.

image.png

ps aux | wc -l

Liczy całkowitą liczbę procesów w systemie.

image.png

Monitorowanie procesów hiearchy – relacje między procesami

ps auxf

Wyświetla procesy w formie drzewa, pokazując które procesy są "dziećmi" innych procesów.

pstree -p user

Pokazuje drzewo procesów danego użytkownika z PID.

Monitorowanie procesów w czasie – status i sygnały

ps aux | grep -E 'S|Ss|R|T'

Statusy procesów: S (sleeping – uśpiony), Ss (session leader), R (running – działający), T (stopped – zatrzymany), Z (zombie).

Zombie procesy – problem w naszych czatach:

ps aux | grep Z

Wyszukuje procesy zombie (znane z naszych dzienników z serwera MT2SRV, gdzie czasami pojawiały się procesy nieusunięte prawidłowo).

Wyświetlanie konkretnych kolumn

ps -o pid,user,%cpu,%mem,comm

Wyświetla tylko wybrane kolumny: PID, użytkownik, CPU, pamięć i nazwa polecenia.

ps aux -o pid,ppid,user,comm

PID, PPID (proces nadrzędny), użytkownik i nazwa polecenia – przydatne do zrozumienia zależności między procesami.

Monitorowanie procesów w pętli rzeczywistej – ale nie programem top

while true; do ps aux | grep game; sleep 2; done

Monitoruje konkretny proces co 2 sekundy. Przydatne gdy chcemy obserwować czy proces się restartuje.

Specjalistyczne zapytania

ps aux | awk '$3 > 10 { print $0 }'

Wyświetla procesy zużywające więcej niż 10% CPU.

ps aux | awk '$4 > 20 { print $2, $4, $11 }'

Wyświetla procesy zużywające więcej niż 20% pamięci (PID, %MEM, komenda).

Praktyczne scenariusze

# Sprawdzenie stanu serwera gry MT2SRV
ps aux | grep -E 'game|db|auth'

Szukamy trzech kluczowych procesów serwera.

# Znalezienie procesu zużywającego zasoby
ps aux --sort=-%mem | head -1

Proces zużywający największą pamięci.

# Znalezienie i zabicie zombie procesów
ps aux | grep Z | awk '{print $2}' | xargs kill -9

Ostrożnie! Usuwa procesy zombie (choć powinny być usunięte automatycznie).

Podstawowe komendy użytkowe

Monitorowanie procesów na żywo: top i htop

top to standardowe narzędzie do monitorowania systemu w czasie rzeczywistym. htop to nowoczesna, bardziej przyjazna alternatywa z kolorowym interfejsem i lepszą nawigacją.

Komenda top – klasyczne monitorowanie

top

Uruchamia interaktywny monitor systemowy. Domyślnie sortuje procesy wg CPU.

image.png

Klawisze i komendy w top

q – wyjście z top

h – pomoc

M – sortuj wg pamięci (zamiast CPU)

P – sortuj wg CPU (domyślnie)

T – sortuj wg czasu uruchomienia

u – pokaż procesy konkretnego użytkownika

k – zabij proces (przydatne gdy proces "szaleje")

r – zmień priorytet procesu (nice value)

Uruchamianie top z opcjami

top -u 'nazwa_usera'

Pokazuje tylko procesy użytkownika admin.

top -p 1234,5678

image.png

Monitoruje konkretne procesy po PID.

top -n 1

Pokazuje tylko jeden snapshot (raz odświeża) i wyłącza się (przydatne w skryptach).

top -o %MEM

Sortuj wg zużycia pamięci przy uruchomieniu.

Praktyczne zastosowanie z naszych czatów:

top -p $(pgrep -f game | tr '\n' ','))

Monitoruj procesy serwera gry (game, db, auth).

Komenda htop – ulepszona wersja

htop

Uruchamia interaktywny monitor z kolorowym interfejsem.

Zalety htop nad top

Klawisze w htop

q – wyjście

F3 – wyszukaj proces

F4 – filtruj (np. po użytkowniku)

F5 – widok drzewa procesów

F6 – zmień kolumnę sortowania

F9 – wyślij sygnał do procesu (kill, SIGSTOP, etc.)

u – pokaż procesy użytkownika

Porównanie top vs htop

Cecha top htop
Dostępność Zawsze zainstalowany Wymaga instalacji
Interfejs Tekstowy Kolorowy, przyjazny
Wyszukiwanie Trudne Łatwe (F3)
Zabijanie procesów Wymaga PID Zaznacz i F9
Drzewo procesów Brak F5

Wykorzystanie htop

htop

image.png

Uruchom htop, press F4 by filtrować procesy, wpisz np "docker".

image.png

Zabij proces szalejący (zużywający 100% CPU):

top

Znajdź proces, naciśnij k, wpisz sygnał (9 dla SIGKILL).

Monitoruj konkretny proces i jego dzieci (fork):

htop -p [PID]

Lub w htop: F5 dla Forest View, wyszukaj proces.

Podstawowe komendy użytkowe

Zaawansowane wyszukiwanie z użyciem find i grep


1. find – wyszukiwanie plików i katalogów

find /ścieżka -iname "wzorzec"

Szukamy plików lub katalogów według nazwy ze zignorowaniem wielkości liter (opcja -iname).
Przykład: find /var/log -iname "*.LOG" znajdzie wszystkie pliki z rozszerzeniem .log lub .LOG.

find . -type f

Szukamy wyłącznie zwykłych plików w bieżącym katalogu i jego podkatalogach. (-type f = file)

find . -type d

Szukamy tylko katalogów. (-type d = directory)

find /home -mtime -7

Wyszukujemy pliki zmodyfikowane w ciągu ostatnich 7 dni. (-mtime to czas modyfikacji, -7 oznacza mniej niż 7 dni temu)

find /var/www -size +10M

Wyszukujemy pliki większe niż 10 megabajtów. (+10M oznacza większe niż 10MB)

Co oznaczają opcje:


2. grep – wyszukiwanie tekstu wewnątrz plików lub strumieni danych

grep "wzorzec" plik.txt

Wyszukuje linie zawierające wzorzec w podanym pliku.

grep -i "blad" plik.txt

Ignoruje wielkość liter, znajdzie "blad", "Blad", "BLAD" itd.

grep -r "error" /var/log

Rekurencyjnie wyszukuje słowo "error" we wszystkich plikach w katalogu /var/log.

grep -n "start" plik.txt

Wyświetla numer linii, w której znaleziono dopasowanie.

grep -c "fail" plik.txt

Liczy liczbę linii, które zawierają "fail".

grep -v "warning" plik.txt

Wyświetla linie, które nie zawierają słowa "warning".

grep -l "TODO" *.c

Wyświetla tylko nazwy plików z rozszerzeniem .c, w których znaleziono słowo "TODO".

Opisy opcji:


3. Łączenie find z grep – wyszukiwanie wzorców tekstowych w określonych plikach

find /var/www -type f -name "*.php" -exec grep -l "mysqli_connect" {} \;

Znajduje wszystkie pliki .php w katalogu /var/www, które zawierają tekst "mysqli_connect".

find /var/www -type f -iname "*.conf" -exec grep -iH "server" {} \;

Znajduje pliki konfiguracyjne (bez zwracania uwagi na wielkość liter w nazwie) zawierające słowo "server" (ignorując wielkość liter, pokazując nazwy plików i linie).

find . -iname "test*" -print0 | xargs -0 grep -l "error"

Wyszukuje pliki zaczynające się na "test" i sprawdza, czy zawierają słowo "error". Bezpieczne dla nazw z odstępami dzięki -print0 i xargs -0.


Praktyczne wskazówki 


Podsumowanie

find i grep to podstawowe, lecz bardzo potężne narzędzia do wyszukiwania plików i danych w nich zawartych, ich właściwe stosowanie znacząco ułatwia administrowanie systemami i skryptowanie operacji.

Podstawowe komendy użytkowe

Obsługa dysków i systemów plików: df, du, lsblk, lscsi

Zarządzanie dyskami i miejscem na nich to kluczowa część administracji systemów. W serwerach (szczególnie Proxmox, FreeBSD czy serwery gier) ważne jest monitorowanie pojemności dysków i szybkie diagnozowanie problemów z miejscem na dysku. Gdy dysk się zapełni, serwis przestaje działać – stąd konieczność bieżącego monitorowania i konserwacji.

Komenda df – informacje o systemach plików

df

Wyświetla użycie dysku dla wszystkich zamontowanych systemów plików (domyślnie w blokach 1K). Jest to podstawowe narzędzie do szybkiego sprawdzenia "ile miejsca zostało".

image.png

df -h

Format czytelny (B, KB, MB, GB) – najczęstszy sposób użycia. Zamiast liczb takich jak 15360000 zobaczymy 15G.

image.png

df -H

Format dziesiętny (1000 zamiast 1024 jako podstawa) – dla jednostek SI. Niektórzy wolą taki zapis.

image.png

df -T

Dodaje kolumnę z typem systemu plików (ext4, xfs, btrfs, zfs, ntfs, etc.). Przydatne gdy zarządzasz różnymi typami systemów plików.

image.png

df -i

Wyświetla inode'y zamiast bloków. Ważne: można mieć wolne miejsce, ale brak inode'ów (gdy mamy miliony małych plików). System wtedy nie pozwoli tworzyć nowych plików mimo wolnego miejsca!

image.png

Praktyczne kombinacje:

df -Th

Typ systemu plików i format czytelny – najbardziej praktyczna forma dla administratorów.

image.png

df -h | grep -v tmpfs

Ukryj tymczasowe systemy plików tmpfs, devtmpfs (często nieistotne).

image.png

df -h | awk '$5 > 80 {print $0}'

Pokaż tylko dyski zapełnione powyżej 80% (kolumna 5 to procent użycia).

image.png

df -hT | sort -k6 -rn

Posortuj dyski wg procentu zajęcia miejsca (kolumna 6) malejąco – szybko znajdziesz problematyczne dyski.

image.png

Komenda du – rozmiar katalogów i plików

du (disk usage) pokazuje ile miejsca zajmują poszczególne katalogi i pliki. Jest niezbędne gdy df pokazuje że dysk jest pełny, a potrzebujemy znaleźć które katalogi lub pliki odpowiadają za ten stan.

du

image.png

Domyślnie wyświetla rozmiary wszystkich podkatalogów rekurencyjnie (może wypisać tysiące linii!).

du -h

Format czytelny (KB, MB, GB).

image.png

du -sh katalog/

Podsumowanie (-s, summary) rozmiaru katalogu w czytelnym formacie. 

image.png

Wszystkie pliki i katalogi (-a, all) z rozmiarami – pokaże też pojedyncze pliki, nie tylko katalogi.

du -d 1 -h /var

Ograniczenie głębokości (-d 1) do jednego poziomu – nie wchodzi głębiej w strukturę.

image.png

Znalezienie największych katalogów i plików:

du -ah /var | sort -rh | head -20

20 największych plików i podkatalogów w /var (sortuj malejąco wg rozmiaru czytelnego dla człowieka).

du -sh /* 2>/dev/null | sort -rh

Sprawdź rozmiar wszystkich głównych katalogów systemu (/, /home, /var, /usr itd), ignoruj błędy dostępu.

find /var -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}' | sort -rh

image.png

Znajdź wszystkie pliki większe niż 100MB. Przydatne gdy szukasz co zabiera miejsce.

find /var/log -type f -size +1G

Znajdź pliki logów większe niż 1GB – często to one zapełniają dysk.

image.png

Praktyczne scenariusze z doświadczeń sysadmina:

# Dysk pełny na serwerze – diagnoza krok po kroku
df -h                          # Sprawdź który dysk jest pełny
du -sh /* | sort -rh           # Szukaj dużych katalogów głównych
du -sh /var/* | sort -rh       # Zagłębienie w /var
du -sh /var/log/* | sort -rh   # Sprawdź logi

Sprawdź rozmiar bazy danych

du -sh /var/lib/mysql
du -sh /var/lib/postgresql

Sprawdź cache, tymczasowe pliki

du -sh /tmp /var/tmp /var/cache

Komenda lsblk – lista urządzeń blokowych

Wprowadzenie:

lsblk wyświetla strukturę dysków twardych, partycji, wolumenów logicznych (LVM) oraz punktów montowania. Niezastąpione gdy chcesz szybko zobaczyć "co jest podpięte i gdzie".

lsblk

Wyświetla wszystkie urządzenia blokowe w formie drzewa. Idealnie pokazuje relacje między dyskami, partycjami i punktami montowania.

image.png

lsblk -f

Dodatkowo pokazuje systemy plików, UUID, etykiety (labels) i procent użycia.

image.png

lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE

Wybrane kolumny – dostosuj wyświetlanie do swoich potrzeb.

image.png

lsblk -p

Pokazuje pełne ścieżki urządzeń (np. /dev/sda zamiast sda).

image.png

Komenda lscsi – lista urządzeń SCSI/SATA
lscsi

Wyświetla listę podłączonych urządzeń SCSI/SATA. Przydatne do weryfikacji że wszystkie dyski fizyczne są widoczne w systemie.

image.png

lscsi -s

Dodaje rozmiar dysków.

image.png

Monitorowanie I/O dysku w czasie rzeczywistym
iostat -xz 1

Monitoruj operacje I/O na dyskach co sekundę (wymaga pakietu sysstat). Szukaj kolumny %util > 80% – oznacza mocne obciążenie dysku.

image.png

iotop

Interaktywne narzędzie pokazujące które procesy generują najwięcej operacji I/O (wymaga instalacji i uprawnień root).

image.png

watch -n 1 'df -h | grep -v tmpfs'

Monitoruj zmiany w zajęciu dysku co sekundę (przydatne gdy coś szybko zabiera miejsce).

Diagnostyka problemów z dyskiem – praktyczne scenariusze

Problem: Dysk nagle zapełniony

# Krok 1: Sprawdź który system plików
df -h

# Krok 2: Szukaj dużych katalogów (zacznij od głównych)
du -sh /* 2>/dev/null | sort -rh | head -10

# Krok 3: Zagłębienie (np. jeśli /var jest duży)
du -sh /var/* | sort -rh | head -10

# Krok 4: Sprawdź logi
du -sh /var/log/*
find /var/log -type f -size +500M -exec ls -lh {} \;

# Krok 5: Sprawdź czy nie ma usuniętych plików nadal otwartych
lsof +L1 | grep deleted

Problem: Brak miejsca mimo że pliki nie zajmują tyle

# Sprawdź inode'y (mogą się skończyć przy wielu małych plikach)
df -i

# Jeśli inode'y na wyczerpaniu, znajdź katalogi z wieloma plikami
find / -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20

Problem: Serwer gry MT2SRV – logi zapełniają dysk

# Sprawdź rozmiar logów gry
du -sh /path/to/game/log/*

# Usuń stare logi (ostrożnie!)
find /path/to/game/log -name "*.log" -mtime +7 -delete

# Skompresuj duże logi zamiast usuwać
find /path/to/game/log -name "*.log" -size +100M -exec gzip {} \;

Czyszczenie dysku – bezpieczne metody:

# Wyczyść cache pakietów (Debian/Ubuntu)
apt clean
apt autoclean

# Wyczyść cache pakietów (RedHat/CentOS)
yum clean all

# Usuń stare kernele (Ubuntu - ostożnie!)
apt autoremove --purge

# Wyczyść dzienniki systemd starsze niż 7 dni
journalctl --vacuum-time=7d

# Wyczyść pliki tymczasowe starsze niż 10 dni
find /tmp -type f -mtime +10 -delete

Monitorowanie trendu zajęcia dysku

# Zapisz snapshot dziennie
df -h > /var/log/disk_usage_$(date +%Y%m%d).txt

# Porównaj z wczoraj
diff /var/log/disk_usage_20251122.txt /var/log/disk_usage_20251123.txt
# Prosty skrypt alertu gdy dysk > 90%
#!/bin/bash
USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ $USAGE -gt 90 ]; then
  echo "ALERT: Dysk zapełniony w $USAGE%" | mail -s "Disk Alert" admin@example.com
fi

Sprawdzanie stanu zdrowia dysku (S.M.A.R.T.)  (wymaga pakietu smartmontools).

smartctl -a /dev/sda

image.png

Wyświetla szczegółowe informacje o stanie dysku z S.M.A.R.T. 

smartctl -H /dev/sda

image.png

Szybki test zdrowia dysku (PASSED/FAILED).

LVM, RAID i ZFS

Dla systemów z LVM:

lvs              # Lista logical volumes
pvs              # Lista physical volumes
vgs              # Lista volume groups
lvdisplay        # Szczegóły LV

image.png

Dla systemów z RAID:

cat /proc/mdstat           # Status software RAID
mdadm --detail /dev/md0    # Szczegóły RAID array

Dla systemów z ZFS (FreeBSD, Linux z ZFS):

zpool list              # Lista pool'i ZFS
zpool status            # Status pool'i
zfs list                # Lista systemów plików ZFS
zfs get all             # Wszystkie właściwości

Podsumowanie praktycznych komend

# Quick check – co się dzieje z dyskami
df -Th
du -sh /* | sort -rh | head -10
lsblk -f

# Deep dive – znajdź największe pliki
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null

# Monitoring w czasie rzeczywistym
watch -n 2 'df -h; echo ""; du -sh /var/log /var/cache /tmp'

# Diagnoza performance
iostat -xz 2 5
iotop -o        # tylko aktywne procesy I/O
Podstawowe komendy użytkowe

Linki symboliczne i twarde w systemach Linux/Unix

Wprowadzenie:

Linki w systemach Linux pozwalają na tworzenie alternatywnych nazw i dróg dostępu do plików bez duplikowania ich zawartości. Są dwa typy linków: symboliczne (symlinki) i twarde (hard links), każdy z nich ma swoje zastosowania i ograniczenia.

Tworzenie linku symbolicznego:

ln -s /ścieżka/do/originalu /ścieżka/do/linku

Przykłady praktyczne:

ln -s /usr/local/bin/python3.11 /usr/local/bin/python
ln -s /var/www/html/projekty/strona ~/strona_link

Tworzy wygodny skrót do katalogu projektu w katalogu domowym.

ln -s /mnt/dysk_zewnetrzny/backup ~/backup

Skrót do katalogu backupu na zewnętrznym dysku.

Sprawdzanie linków symbolicznych:

Wyświetla informację o linku i pokazuje gdzie wskazuje, np.:

lrwxrwxrwx 1 user user 24 Nov 23 15:00 strona_link -> /var/www/html/projekty/strona

Usuwanie linku symbolicznego:

Cechy linków symbolicznych:

Tworzenie linku twardego:

ln /ścieżka/do/pliku /ścieżka/do/twardego_linku

Przykłady praktyczne:

ln /var/log/syslog /home/admin/syslog_backup

Tworzy drugi dostęp do tego samego pliku logów. Modyfikacja w jednym miejscu jest widoczna w drugim.

ln dokument.txt dokument_kopia.txt

Obie nazwy wskazują na ten sam plik. Usunięcie jednej nazwy nie usuwa danych, dopóki istnieje druga.

Sprawdzanie linków twardych:

ls -li plik

Opcja -i pokazuje numer inode. Pliki o tym samym numerze inode to linki twarde do tych samych danych.

$ ls -li dokument.txt dokument_kopia.txt
12345678 -rw-r--r-- 2 user user 1024 Nov 23 15:00 dokument.txt
12345678 -rw-r--r-- 2 user user 1024 Nov 23 15:00 dokument_kopia.txt

Ten sam numer inode (12345678) i liczba linków "2" oznacza, że to linki twarde.

Cechy linków twardych:

3. Różnice między linkami symbolicznymi a twardymi

4. Praktyczne zastosowania

Podstawowe komendy użytkowe

Monitorowanie zasobów: free, vmstat, iostat, sara

Monitorowanie dostępnej pamięci jest kluczowe dla stabilności systemu. Przy administracji serwerami, maszyn wirtualnych czy  serwerów ważne jest zrozumienie jak Linux alokuje i zarządza pamięcią.

Komenda free – stan pamięci teraz

free

image.png

Wyświetla podsumowanie zużycia RAM i swap. Domyślnie w kilobajtach (KB).

free -h

Format czytelny (B, KB, MB, GB). Najczęściej stosowana opcja.

image.png

free -m

image.png

Wynik w megabajtach.

free -g

image.png

Wynik w gigabajtach (przydatne na dużych serwerach).

free -w

Rozszerzony format z osobną kolumną na bufory i cache.

image.png

Interpretacja wyniku free -h:

 total used free shared buff/cache available Mem: 15.6G 8.2G 2.1G 0.5G 5.3G 7.4G Swap: 4.0G 0.5G 3.5G

image.png

Monitorowanie pamięci w czasie rzeczywistym

free -h -s 2

Wyświetla stan pamięci co 2 sekundy.

image.png

free -h -s 2 -c 10

Monitoruje co 2 sekundy, 10 razy.

image.png

watch -n 1 'free -h'

Monitorowanie pamięci co sekundę w atrakcyjnym formacie (wymaga pakietu watch).

image.png

Komenda vmstat – Virtual Memory Statistics

Wprowadzenie do vmstat:

Bardziej zaawansowana niż free, pokazuje statystyki pamięci wirtualnej, I/O i swap activity.

vmstat

image.png

Jednorazowy raport.

vmstat 2 5

Raport co 2 sekundy, 5 razy.

image.png

Interpretacja wyniku:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 2048000 51200 5242880 0 0 2 1 50 30 25 5 70 0 0

image.png

Komenda iostat – I/O Statistics

iostat monitoruje aktywność dysków i procesorów. Wymaga pakietu sysstat.

iostat

Ogólne statystyki od ostatniego restartu systemu.

image.png

iostat -x 2 5

Rozszerzone statystyki dysku, co 2 sekundy, 5 razy.

image.png

Interpretacja wyniku:

Device r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz %util sda 10.5 5.2 0.50 0.25 0.5 1.2 5% 10% 2.5ms 5.0ms 0.08 8.5%

image.png

Komenda sar – System Activity Reporter

sar z pakietu sysstat to kompleksowe narzędzie do monitorowania systemu. Może zbierać dane historyczne.

sar -u 2 5

image.png

Statystyki CPU co 2 sekundy, 5 razy.

sar -r 2 5

image.png

Statystyki pamięci.

sar -d 2 5

image.png

Statystyki dysków (podobnie jak iostat).

image.png

sar -b 2 5

I/O i przełączenia stron (page faults).

image.png

Monitorowanie swap activity – problem w systemach

vmstat 1 | grep -v procs | awk '$7 > 0 || $8 > 0 { print "SWAP AKTYWNY!", $0 }'

image.png

Ostrzeżenie gdy system zaczyna pisać do swap

watch -n 1 'vmstat 1 2 | tail -1'

Ciągłe monitorowanie najnowszych danych vmstat.

image.png

Praktyczne problemy z pamięcią i jak je diagnozować

Problem: System powolny, dużo swap activity

# 1. Sprawdź dostępną pamięć free -h
2. Sprawdź swap
vmstat 1 5 | grep -E 'si|so'

3. Szukaj procesów zużywających pamięć
ps aux --sort=-%mem | head -20

4. Sprawdź I/O wait
iostat -x 1 5

Problem: Serwer Metin2 (MT2SRV) zajmuje za dużo pamięci

# Monitoruj samo server gry watch -n 1 'ps aux | grep -E "game|db|auth" | awk "{print \$2, \$4, \$11}"'
Jeśli pamięć rośnie bezustannie (memory leak)
ps aux | grep game | awk '{print $2}' # Uzyskaj PID
cat /proc/[PID]/status | grep VmRSS # Aktualna pamięć tego procesu

Wyzwalanie alertów przy braku pamięci

#!/bin/bash AVAILABLE=$(free -h | awk '/^Mem:/ {print $7}' | tr -d 'G') if (( $(echo "$AVAILABLE < 1" | bc -l) )); then echo "ALARM: Pamięć poniżej 1GB!" fi
Podstawowe komendy użytkowe

Uprawnienia plików i katalogów - chmod i chowa

1. Podstawy modelu uprawnień

Każdy plik i katalog ma przypisane uprawnienia dla trzech grup użytkowników:

Dla każdej z tych grup można przypisać trzy typy uprawnień:

2. Wyświetlanie uprawnień

ls -l plik.txt

Wyświetla szczegółowe informacje, w tym uprawnienia w formacie:

-rwxr-xr--

Gdzie:

3. Komenda chmod – zmiana uprawnień

Format symboliczny (literowy):

chmod u+x skrypt.sh

Dodaje właścicielowi prawo wykonywania pliku skrypt.sh.

chmod g-w dokument.txt

Odbiera grupie prawo do zapisu w pliku dokument.txt.

chmod o+r raport.pdf

Dodaje innym użytkownikom prawo do odczytu pliku raport.pdf.

chmod a+r plik.txt

Dodaje prawo do odczytu dla wszystkich (właściciel, grupa, inni).

chmod go-rwx prywatny.txt

Odbiera grupie i innym wszystkie uprawnienia do pliku.

Format numeryczny (oktalny):

Każde uprawnienie ma wartość liczbową:

Sumując wartości, otrzymujemy kod uprawnień dla każdej grupy:

chmod 755 skrypt.sh

Właściciel: rwx (7), grupa: r-x (5), inni: r-x (5).

chmod 644 dokument.txt

Właściciel: rw- (6), grupa: r-- (4), inni: r-- (4).

chmod 700 prywatny_skrypt.sh

Tylko właściciel ma pełny dostęp, inni nie mają żadnych uprawnień.

4. Rekurencyjna zmiana uprawnień

chmod -R 755 /var/www/strona

Opcja -R (recursive) zmienia uprawnienia dla katalogu i wszystkich plików oraz podkatalogów w nim zawartych.

chmod -R u+rwX /home/user/dokumenty

Duże X dodaje prawo wykonywania tylko do katalogów i plików, które już mają to prawo dla kogokolwiek.

5. Komenda chown – zmiana właściciela i grupy

chown user plik.txt

Zmienia właściciela pliku na użytkownika user.

chown user:grupa plik.txt

Zmienia właściciela na user i grupę na grupa.

chown :grupa plik.txt

Zmienia tylko grupę (właściciel pozostaje bez zmian).

chown -R www-data:www-data /var/www

Rekurencyjnie zmienia właściciela i grupę dla całego katalogu i jego zawartości.

6. Praktyczne przykłady zastosowań

# Nadanie uprawnień wykonywania dla skryptu
chmod +x deploy.sh

# Zabezpieczenie pliku konfiguracyjnego (tylko właściciel może czytać i pisać)
chmod 600 config.ini

# Typowe uprawnienia dla katalogu www
chmod -R 755 /var/www/html
chown -R www-data:www-data /var/www/html

# Odebranie wszystkich uprawnień innym użytkownikom
chmod go-rwx /home/user/tajne_dane

# Sprawdzenie uprawnień przed i po zmianie
ls -l plik.txt
chmod 644 plik.txt
ls -l plik.txt
Podstawowe komendy użytkowe

Atrybuty plików i katalogów

Wprowadzenie:

Poza standardowymi uprawnieniami (rwx), system Linux oferuje dodatkowe mechanizmy kontroli dostępu do plików i katalogów. Należą do nich pliki ukryte oraz rozszerzone atrybuty zarządzane poleceniem chattr.

1. Pliki ukryte w systemie Linux/Unix

Co to są pliki ukryte?

W systemach Unix/Linux plikami ukrytymi nazywamy pliki i katalogi, których nazwa zaczyna się od kropki (.). Są one domyślnie niewidoczne przy standardowym wywoływaniu ls. Pliki ukryte często zawierają konfiguracje użytkownika lub aplikacji.

Wyświetlanie plików ukrytych:

ls -a

Pokazuje wszystkie pliki, w tym ukryte.

ls -la

Szczegółowy widok ze wszystkimi plikami, w tym ukrytymi.

Przykłady typowych plików ukrytych:

Tworzenie ukrytego pliku:

touch .ukryty_plik.txt

Wystarczy, że nazwa zaczyna się od kropki.

2. Rozszerzone atrybuty plików – chattr

Co to są rozszerzone atrybuty?

Rozszerzone atrybuty to dodatkowe flagi kontrolujące zachowanie plików na poziomie systemu plików. Pozwalają one na bardziej precyzyjną kontrolę niż standardowe uprawnienia rwx. Są obsługiwane głównie w systemach plików ext2, ext3, ext4.

Komenda chattr – zmiana atrybutów:

chattr +i plik.txt

Ustawia atrybut niezmienności (immutable). Plik nie może być modyfikowany, usuwany, zmieniany ani przenoszony – nawet przez użytkownika root!

chattr -i plik.txt

Usuwa atrybut niezmienności.

3. Najważniejsze atrybuty chattr

Atrybut i (immutable – niezmienny):

chattr +i /etc/ważny_config.conf

Plik nie może być w żaden sposób modyfikowany. Przydatne do ochrony krytycznych plików konfiguracyjnych przed przypadkową zmianą.

Atrybut a (append only – tylko dopisywanie):

chattr +a /var/log/aplikacja.log

Plik może być tylko rozszerzany (dopisywanie na końcu), ale nie można modyfikować ani usuwać istniejącej zawartości. Idealne dla plików logów.

Atrybut c (compressed – kompresowany):

chattr +c duży_plik.txt

Jądro automatycznie kompresuje plik na dysku (jeśli system plików to obsługuje).

Atrybut d (no dump – pomijany w backup):

chattr +d cache.tmp

Plik jest pomijany przez narzędzie dump podczas tworzenia kopii zapasowej.

Atrybut s (secure deletion – bezpieczne usuwanie):

chattr +s tajny_dokument.txt

Przy usuwaniu pliku, jego bloki na dysku są nadpisywane zerami, co utrudnia odzyskanie danych.

Atrybut u (undeletable – możliwy do odzyskania):

chattr +u ważny_plik.txt

System zachowuje informacje pozwalające na odzyskanie pliku po usunięciu (jeśli system plików to wspiera).

4. Komenda lsattr – wyświetlanie atrybutów

lsattr plik.txt

Pokazuje aktualne atrybuty pliku.

lsattr -d katalog/

Pokazuje atrybuty samego katalogu (a nie jego zawartości).

lsattr -a

Pokazuje atrybuty wszystkich plików, w tym ukrytych.

Przykładowy wynik:

$ lsattr plik.txt
----i---------e----- plik.txt

Litera i oznacza atrybut immutable.

5. Rekurencyjna zmiana atrybutów

chattr -R +i /etc/config/

Opcja -R (recursive) stosuje atrybut do wszystkich plików i podkatalogów.

6. Praktyczne przykłady zastosowań

# Ochrona pliku konfiguracyjnego przed modyfikacją
sudo chattr +i /etc/ssh/sshd_config
# Teraz nawet root nie może go zmienić bez usunięcia atrybutu

# Sprawdzenie atrybutów
lsattr /etc/ssh/sshd_config

# Aby móc edytować, trzeba najpierw usunąć atrybut
sudo chattr -i /etc/ssh/sshd_config

# Zabezpieczenie pliku logów – tylko dopisywanie
sudo chattr +a /var/log/aplikacja.log

# Ochrona całego katalogu przed usunięciem
sudo chattr -R +i /opt/produkcja/

# Weryfikacja atrybutów wszystkich plików w katalogu
lsattr -a /home/user/

7. Ważne uwagi

Podstawowe komendy użytkowe

Obsługa komendy sed

Co to jest sed?

sed (stream editor) to narzędzie do przetwarzania tekstu na poziomie linii, działające linia po linii. Pozwala na automatyczną edycję plików lub strumieni tekstu bez konieczności otwierania ich w interaktywnym edytorze.

Podstawowa składnia polecenia

sed [opcje] 'polecenia' plik

W poleceniu sed wykonujemy polecenia edycyjne na każdej linii pliku lub strumienia.

Najważniejsze polecenia sed używane w przykładach

Wyjaśnienie składni zamiany (substytucji) s/// oraz znaków

Obsługa znaków specjalnych - escape w sed

Przykłady:

Zamiana  adresu IP na inny:

sed 's/192\.168\.1\.1/10.0.0.1/g' plik.conf

Zamienia wszystkie wystąpienia adresu IP 192.168.1.1 na 10.0.0.1, kropki są escape'owane.

Zamiana ścieżek za pomocą innego separatora:

sed 's#/var/www/html#/srv/www#g' plik.conf

Użycie znaku # zamiast / jako separatora pozwala uniknąć escape'ów w ścieżkach.

Komentowanie zakresu linii:

sed '10,20s/^/#/' plik.conf

Dodaje znak # na początku linii od 10 do 20.

Odkomentowanie zakresu linii:

sed '10,20s/^#//' plik.conf

Usuwa znak # z początku linii od 10 do 20.

Usuwanie pustych linii:

sed '/^$/d' plik.conf

Usuwa linie całkowicie puste.

Podwajanie backslash:

sed 's/\\/\\\\/g' plik.conf

Zamienia pojedynczy znak \ na podwójny \\ (używane np. przy generowaniu ścieżek w skryptach).

Zamiana z grupami przechwytywania:

sed 's/\(foo\) \(bar\)/\2 \1/' plik.conf

Zamienia wystąpienie "foo bar" na "bar foo", gdzie \( ... \) wskazuje grupy tekstu, a \1, \2 odwołują się do nich w zamianie.

Zaawansowana zamiana adresu IP z regexp:

sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/10.0.0.1/g' plik.conf

Zamienia dowolny adres IPv4 (4 liczby 0-999 rozdzielone kropkami) na 10.0.0.1.

Edycja pliku in-place na FreeBSD:

sed -i '' 's/stary/nowy/g' plik.conf

Podmienia wszystkie wystąpienia "stary" na "nowy" bez tworzenia kopii zapasowej, ważne jest wymienienie '' po -i.

Podstawowe komendy użytkowe

Obsługa awk

AWK to potężne narzędzie do przetwarzania i analizy tekstu, szczególnie przydatne do pracy z danymi podzielonymi na kolumny. Pozwala na wyszukiwanie, filtrowanie, formatowanie i agregację danych z plików tekstowych lub wyników innych poleceń.

Podstawowa składnia AWK

awk 'warunek { działania }' plik

Wyjaśnienie:

Odwołania do pól i zmienne w AWK

$0       # cała linia tekstu wejściowego
$1, $2, … # kolejne kolumny/ pola w linii (domyślnie pola rozdzielone spacjami)
NR       # numer bieżącego wiersza (count)
NF       # liczba pól w bieżącej linii

Wyjaśnienia:

AWK dzieli każdą linię na pola (domyślnie na spacje/tabulacje). Użycie $1 zwraca pierwszą kolumnę, $2 drugą itd. Zmienna NR oznacza numer bieżącej linii, a NF ilość kolumn w bieżącym wierszu.

Przykłady użycia AWK – pojedyncze komendy

1. Wyświetl pierwszą i trzecią kolumnę każdego wiersza:

awk '{ print $1, $3 }' plik.txt

2. Wyświetl linie, których pierwsza kolumna równa jest "error":

awk '$1 == "error" { print $0 }' plik.txt

3. Sumowanie wartości w kolumnie numer 2:

awk '{ suma += $2 } END { print suma }' plik.txt

Wyjaśnienie: dla każdej linii dodaj wartość pola 2 do zmiennej suma, a na końcu END wypisz wynik.

4. Wypisz numer linii oraz zawartość linii:

awk '{ print NR, $0 }' plik.txt

Wyrażenia regularne (regexp) w AWK

AWK wspiera wyrażenia regularne do dopasowywania tekstu. Można je stosować w warunkach:

awk '/pattern/ { print $0 }' plik.txt

Znajduje i wypisuje linie zawierające pattern.

Można łączyć takie dopasowanie z innymi warunkami i operatorami:

awk '$3 ~ /error/' plik.txt

Wypisuje linie, w których trzecia kolumna zawiera słowo "error".

awk '$2 !~ /^[0-9]+$/' plik.txt

Wypisuje linie, gdzie druga kolumna nie składa się wyłącznie z cyfr.

Przetwarzanie i filtrowanie danych z AWK – bardziej rozbudowane przykłady

Wyświetlanie wierszy, gdzie kolumna 5 jest większa niż 100:

awk '$5 > 100 { print $0 }' plik.txt

Formatowane wypisywanie danych (np. kolumny 1 i 3 oddzielone tabulatorem):

awk '{ printf "%s\t%s\n", $1, $3 }' plik.txt

Podliczanie wystąpień unikalnych wartości w kolumnie 3:

awk '{ counts[$3]++ } END { for (val in counts) print val, counts[val] }' plik.txt

Wywołania specjalne i kontrola przepływu

AWK pozwala na tworzenie bloków BEGIN i END do wykonania instrukcji przed lub po przeczytaniu wszystkich linii:

awk 'BEGIN { print "Start przetwarzania" }
     { print $1 }
     END { print "Koniec przetwarzania" }' plik.txt

Pętla i warunki są typowe dla języków programowania, np.:

awk '{ 
  if ($2 > 100) 
    print $0 
  else 
    next 
}' plik.txt

Ogólne komendy BASH

Ogólne komendy BASH

Sprawdzanie zombie procesów

printf "PID PPID USER STAT CMD\n"; ps -eo pid,ppid,user,stat,command | awk '$4 ~ /Z/'  
Ogólne komendy BASH

Czyszczenie SWAP

Wszystkie komendy wykonuje z CLI bash / sh z uprawnieniami root (sudo)

Komendy weryfikujące status wolnej przestrzeni w pamięci SWAP

Sprawdzenie całego meminfo, które zawiera wszelkie informacje o pamieci na systemie linux

cat /proc/meminfo

image.png

Komenda free sprawdza aktualnie zaalakowaną oraz wolną pamięć operacyjną

free -m

image.png

Komendy wykonujące oczyszczenia pamięci podręcznej 

Oczyszczenie pamięci podręcznej stronicowania (pagecache)

sync; echo 1 > /proc/sys/vm/drop_caches

 Oczyszczenie pamięci podręcznej katalogów (dentries) i i-węzłów (inodes)

sync; echo 2 > /proc/sys/vm/drop_caches

Oczyszczenie całej pamięci podręcznej (pagecache, dentries i inodes)

sync; echo 3 > /proc/sys/vm/drop_caches 
Wyłączenie SWAP
swapoff -a 
Włączenie SWAP
swapon -a 
Kombinacja komend - wyłączenie i włączenie SWAP
sudo swapoff -a && sudo swapon -a
Ogólne komendy BASH

Sprawdzenie czy user może korzystać z sudo

Komendy wykonujemy z CLI bash / sh z uprawnieniami root (sudo)

Weryfikacja użytkownika pod kątem możliwości korzystania z sudo weryfikujemy komendą:

sudo -l -U NazwaUżytkownika

Przykładowy wynik:

image.png

Ogólne komendy BASH

Sprawdzenie daty wygasania hasła użytkownika

Komendy wykonujemy z CLI bash / sh z uprawnieniami root (sudo)

Weryfikacja użytkownika pod kątem wygasanie jego hasła / konta weryfikujemy komendą:

chage -l NazwaUżytkownika

Przykładowy wynik:

image.png

Sieć

Sieć

Przekierowanie ruchu sieciowego pomiędzy kartami sieciowymi

Włączenie przekazywania pakietów (IP Forwarding)

Na początku należy sprawdzić konfigurację sysctl

sudo vim /etc/sysctl.conf

i szukamy wpisu:

net.ipv4.ip_forward = 1

Przeładowujemy konfigurację

sudo sysctl -p

image.png

i sprawdzamy czy opcja jest aktywna:

cat /proc/sys/net/ipv4/ip_forward

image.png

Jeśli wynik to 1, przekazywanie pakietów jest włączone.

Konfiguracja NAT (SNAT) poprzez IPTABLES
sudo iptables -t nat -I POSTROUTING -p all -s AdresacjaIPskąd ! -d AdresacjaIPdokąd -j SNAT --to-source JakimIPmaWychodzić

Przykład z całymi podsieciami:

sudo iptables -t nat -I POSTROUTING -p all -s 172.18.0.0/29 ! -d 172.18.0.0/29 -j SNAT --to-source 10.95.227.9
Co robi ta reguła?

Sprawdzamy czy reguła została dodana:

sudo iptables -t nat -L -v -n

image.png

Zapisujemy konfigurację:

sudo service iptables save
sudo iptables-save | sudo tee /etc/sysconfig/iptables

 

Sieć

Skrypt tworzący reguły przekierowania dla portów mailowych

Uruchamiamy na systemie proxy:

#!/bin/bash

# Sposób użycia: sudo ./mail_routing.sh <docelowy_adres_IP>
#
# Przykład: sudo ./mail_routing.sh 192.168.1.138
# Sprawdzenie, czy podano adres IP

if [ -z "$1" ]; then
    echo "Użycie: $0 <docelowy_adres_IP>"
    exit 1
fi

TARGET_IP="$1"

# Lista standardowych portów pocztowych
MAIL_PORTS=(25 465 587 143 993 110 995)

echo "Usuwanie poprzednich reguł..."
iptables -t nat -F PREROUTING
iptables -F FORWARD
iptables -t nat -F POSTROUTING

echo "Dodawanie nowych reguł przekierowania dla adresu: $TARGET_IP"

# Dodawanie reguł przekierowania dla każdego portu
for PORT in "${MAIL_PORTS[@]}"; do
    echo "Przekierowanie portu $PORT na $TARGET_IP:$PORT"
    iptables -t nat -A PREROUTING -p tcp --dport $PORT -j DNAT --to-destination $TARGET_IP:$PORT
    iptables -A FORWARD -p tcp --dport $PORT -d $TARGET_IP -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -d $TARGET_IP --dport $PORT -j MASQUERADE
done

# Zapisywanie reguł, aby przetrwały restart systemu
echo "Zapisywanie reguł iptables..."
iptables-save > /etc/sysconfig/iptables 2>/dev/null || service iptables save 2>/dev/null

echo "Konfiguracja zakończona! Sprawdzenie reguł:"
iptables -t nat -L -v -n
iptables -L -v -n

Przykładowa część wyniku:

image.png

Sieć

Weryfikacja zapory sieciowej (firewalld) oraz dodanie wyjątków

Komendy wykonujemy z CLI bash / sh z uprawnieniami root (sudo)

Sprawdzenie wszystkich reguł firewallD:
sudo firewall-cmd --list-all

Dodanie portu:

sudo firewall-cmd --add-port=NumerPortu/tcp --permanent

Dodanie portu ograniczając do jednej zone

sudo firewall-cmd --zone=NazwaZony --add-port=NumerPortu/tcp --permanent

Dodanie usługi:

sudo firewall-cmd --permanent --add-service=NazwaService

Po zmianach należy przeładować firewallD:

sudo firewall-cmd --reload
Co to jest "rich rule" w firewallD?

Rich rules to zaawansowane reguły w firewallD, które pozwalają na bardziej precyzyjne definiowanie zasad niż standardowe strefy i usługi. Umożliwiają m.in.:

Przykład dodania rich-rule:

sudo firewall-cmd --add-rich-rule='rule protocol value="NazwaProtokołu" accept' --permanent

Przykład wpuszczenia ruchu ssh z jednego adresu IP

sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent

Po zmianach należy przeładować firewallD:

sudo firewall-cmd --reload

Specyficzne dla Rodziny Enterprise Linux

Specyficzne dla Rodziny Enterprise Linux

Usunięcie nieużywanych kerneli

Komendy wykonujemy w CLI bash bądź sh jako user z uprawnieniami sudo / root.

Sprawdzenie który kernel jest używany aktualnie. Powinien on być najnowszy z listy wynikowej 
sudo rpm -q kernel | sed "/$(uname -r)/ s/$/ ACTIVE/"

Przykład:

image.png

Komenda usunięcia nieużywanych kerneli w starszych systemach operacyjnych EL (wersje 5-7)
sudo package-cleanup --oldkernels --count=1 
Komenda usunięcia nieużywanych kerneli w nowszych systemach operacyjnych EL 8+
sudo dnf remove --oldinstallonly --setopt installonly_limit=2 kernel

Przykład:

image.png

Usunięcie nieużywanych kerneli ręcznie

Przechodzimy do katalogu gzie obrazy kernela się znajdują:

cd /boot 
find . -name '*numer_starej_wersji_kernela*' 

Usuwamy wszystkie wystąpienia znalezione powyższą komendą 

 sudo rm nazwa_pliku
Specyficzne dla Rodziny Enterprise Linux

Ręczna instalacja repozytorium EPEL (Extra Packages for Enterprise Linux)

EPEL (Extra Packages for Enterprise Linux) to repozytorium, które dostarcza dodatkowe pakiety oprogramowania, które nie są dostępne w oficjalnych repozytoriach Red Hat Enterprise Linux (RHEL) oraz jego klonów, takich jak CentOS i Rocky Linux.


Komendy wykonujemy w CLI bash bądź sh jako user z uprawnieniami sudo / root.


Najpierw oczywiście sprawdzamy podstawową komendę:

dnf install epel-release

Dla niektórych dystrybucji warto doinstalować dodatkowe repozytorium CBR (CodeReady Builder).

Red Hat Enterprise Linux 9: 
subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms 
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm 
Rocky Linux 9: 
dnf config-manager --set-enabled crb 
dnf install epel-release 
RHEL 8: 
subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms 
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm  
Rocky Linux 8: 
dnf config-manager --set-enabled powertools 
dnf install epel-release
RHEL 7: 
subscription-manager repos --enable rhel-*-optional-rpms \ 
                           --enable rhel-*-extras-rpms \ 
                           --enable rhel-ha-for-rhel-*-server-rpms 
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm  
subscription-manager repos --disable=rhel-7-server-eus-optional-rpms 
CentOS 7: 
yum install epel-release 
Specyficzne dla Rodziny Enterprise Linux

Podział aktualizacji pakietów pod względem nazw pakietów

Podział aktualizacji na mniejsze partie może być wymagany jeżeli wielkość paczki aktualizacyjnej przekracza dostępne miejsce na dyskach.

Komendy wykonujemy w CLI bash bądź sh jako user z uprawnieniami sudo / root.

sudo dnf update $(dnf list updates | awk '/^[LITERASTARTOWA-LITERAKOŃCOWA1]/ {print $1}') 
sudo dnf update $(dnf list updates | awk '/^[LITERAKOŃCOWA1-LITERAKOŃCOWA2]/ {print $1}') 
Przykład aktualizacji ograniczonej literami od a do c

image.png

Przykład podziału aktualizacji na pół:

sudo dnf update $(dnf list updates | awk '/^[a-j]/ {print $1}') 
sudo dnf update $(dnf list updates | awk '/^[k-z]/ {print $1}') 
Specyficzne dla Rodziny Enterprise Linux

Doinstalowanie obsługi SysV na Rocky 9

W systemie Rocky Linux 9 niektóre aplikacje mogą nadal korzystać "pod maską" z SysV, mimo że przy instalacji utworzyły się usługi systemd. Przykładem takiej aplikacji jest Networker, problem pojawia się, gdy chcemy włączyć autostart usługi networker.service: 

W takim wypadku należy wykonać następujące kroki: 

dnf install -y initscripts chkconfig 

Po wykonaniu powyższych kroków można powtórzyć próbę włączenia autostartu usługi. Teraz komenda powinna wykonać się prawidłowo. 

 

Instalacja systemu Rocky Linux 9 z nazwaniem odpowiednio VG oraz LV

Po uruchomieniu instalatora wybieramy odpowiedni język:

image.png

I wciskamy kombinację klawiszy 

CTRL + ALT + F3

Przeniesie nas to do sesji terminalowej w której będziemy mogli dowolnie zarządzać dyskami. Możemy zweryfikować wykrywane dyski poprzez List Block Devices:

lsblk

image.png

Na początku musimy utworzyć phisical device poprzez komendę pvcreate

pvcxreate /dev/sdX

Przykład wykonania komendy 

pvcreate /dev/sda

image.png

Tworzymy resztę wymaganych urządzeń fizycznych:

image.png

Kolororwanie BASH prompt (zmiana PS1)

Aby zmiany działały dla pojedyńczego usera zmieniamy plik .bash_profile w HOME usera "~"

cd ~
vim .bash_profile

Serwery testowe:  

# User specific environment and startup programs 

export PS1="\[\033[00;36m\]\u\[\033[00;32m\]@\[\033[01;32m\]\h\[\033[00m\\]:\[\033[01;34m\]\w\[\033[01;37m\]$\[\033[00m\]: " 

Serwery produkcyjne:

# User specific environment and startup programs 

export PS1="\[\033[00;36m\]\u\[\033[00;32m\]@\[\033[1;31m\]\h\[\033[00m\]:\[\033[1;31m\]\w\[\033[1;37m\]$\[\033[00m\]: " 

User ROOT, serwery TST: 

# Root-User specific environment and startup programs 

export PS1="\[\033[1;31m\]\u\[\033[1;37m\]@\[\033[01;32m\]\h\[\033[00m\\]:\[\033[01;34m\]\w\[\033[01;37m\]#\[\033[00m\]: "

User ROOT, serwery PRD: 

# Root-User specific environment and startup programs 

export PS1="\[\033[1;31m\]\u\[\033[1;37m\]@\[\033[1;31m\]\h\[\033[00m\]:\[\033[1;31m\]\w\[\033[1;37m\]#\[\033[00m\]: " 

Full Violet

# FoolsTheory-User specific environment and startup programs FoolsTheory Violet:

export PS1="\[\033[1;35m\]\u\[\033[1;37m\]@\[\033[1;35m\]\h\[\033[00m\]:\[\033[1;35m\]\w\[\033[1;37m\]$\[\033[00m\]: "

Można także zmieniać w formacie HEX:

# FoolsTheory-User specific environment and startup programs FoolsTheory Violet:

export PS1="\[\e[38;2;176;132;204m\]\u\[\e[0m\]@\[\e[38;2;176;132;204m\]\h:\w\[\e[0m\] \$ "


Dodanie systemu Linux do domeny AD poprzez RealmD

OS musi rozwiązywać nazwy domeny i mieć odpowiedni ruch puszczony

Instalujemy zestaw paczek:

sudo dnf  install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients vim net-tools telnet tree -y

Dodajemy system do domeny  

realm join --user=NazwaUseraWDomenie NazwaDomeny

image.png

Dodajemy userów z domeny jako userzy z uprawnieniami do sudo :

visudo

dodajemy

%GrupaWdomenie@domena.local ALL=(ALL) NOPASSWD:ALL

image.png

Edytujemy plik sssd dla lepszej kompatybilności logowania:

vim /etc/sssd/sssd.conf

Weryfikujemy czy nasz plik wygląda tak:

[sssd]
domains = NazwaDomeny
config_file_version = 2
services = nss, pam
default_domain_suffix = NazwaDomeny

[domain/NazwaDomeny]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = FOOLSTHEORY.LOCAL
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u@%d
ad_domain = NazwaDomeny
use_fully_qualified_names = True
ldap_id_mapping = True
access_provider = ad

ad_hostname = NazwaKontroleraDC
dyndns_update = true
dyndns_refresh_interval = 43200
dns_update_ptr = true
dynds_ttl = 3600
dyndns_auth = GSS-TSIG

Restartujemy SSSD

image.png

Po tych operacjach można logować się poprawnie:

image.png

Instalacja ODBC MSSQL na dystrybucjach RHEL

Komendy można wykonywać całościowo jako blok tekstu

if ! [[ "7 8 9" == *"$(grep VERSION_ID /etc/os-release | cut -d '"' -f 2 | cut -d '.' -f 1)"* ]];
then
    echo "RHEL $(grep VERSION_ID /etc/os-release | cut -d '"' -f 2 | cut -d '.' -f 1) is not currently supported.";
    exit;
fi

# Download the package to configure the Microsoft repo
curl -sSL -O https://packages.microsoft.com/config/rhel/$(grep VERSION_ID /etc/os-release | cut -d '"' -f 2 | cut -d '.' -f 1)/packages-microsoft-prod.rpm
# Install the package
sudo yum install packages-microsoft-prod.rpm
# Delete the file
rm packages-microsoft-prod.rpm

sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts
sudo ACCEPT_EULA=Y yum install -y msodbcsql18
# optional: for bcp and sqlcmd
sudo ACCEPT_EULA=Y yum install -y mssql-tools18
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo yum install -y unixODBC-devel

Po instalacji oczywiście należy skonfigurować plik połączeń 

/etc/odbc.ini

Przykładowy config dla bazy MSSQL

# DSN dla Microsoft SQL Server (MSSQL) z ODBC Driver 18 i self-signed cert

[DSN_MSSQL]
Driver = ODBC Driver 18 for SQL Server
Server = sqlserver.example.local
Port = 1433
Database = your_database
TrustServerCertificate = Yes

# Uwierzytelnianie SQL (UID i PWD podaje Zabbix przez makra)
# Trusted_Connection=Yes # NIE aktywuj, jeśli nie masz Kerberosa

 

 

Przykładowe konfiguracje ODBC dla różnych baz danych

Wpisy powinny znajdować się w /etc/odbc.ini

Wymagane paczki:

unixODBC-devel
unixODBC

DSN MSSQL

# DSN dla Microsoft SQL Server (MSSQL) z ODBC Driver 18 i self-signed cert
[DSN_MSSQL]
Driver = ODBC Driver 18 for SQL Server
Server = sqlserver.example.local
Port = 1433
Database = your_database
TrustServerCertificate = Yes
# Trusted_Connection=Yes # NIE aktywuj, jeśli nie masz Kerberosa

DSN PostgreSQL

# DSN dla PostgreSQL
[DSN_POSTGRES]
Driver = PostgreSQL Unicode
Servername = postgres.example.local
Port = 5432
Database = your_pgdb

DSN MySQL/MariaDB

# DSN dla MariaDB/MySQL
[DSN_MARIA]
Driver = MariaDB ODBC 3.1 Driver
Server = mariadb.example.local
Port = 3306
Database = your_mariadb
# UID i PWD ustawia Zabbix przez makra

DSN Oracle

# DSN dla Oracle
[DSN_ORACLE]
Driver = Oracle in OraClient12Home1
Server = oracle.example.local
Port = 1521
Database = ORCL

DSN Sybase

# DSN dla Sybase
[DSN_SYBASE]
Driver = Adaptive Server Enterprise
Server = sybase.example.local
Port = 5000
Database = your_sybase_db

Message of the day - MOTD

Message Of The Day (MOTD)

Co to jest MOTD?

Message Of The Day (MOTD) to tekst wyświetlany po zalogowaniu do systemu, zazwyczaj zawiera powitanie lub najważniejsze informacje o systemie. W systemach Unix/Linux plik /etc/motd jest prostym plikiem tekstowym, który nie interpretuje poleceń, wyświetla jedynie statyczną zawartość.

Dlaczego plik /etc/motd nie może wykonywać poleceń?

Plik /etc/motd jest tylko zwykłym plikiem tekstowym i nie jest interpretowany jako skrypt ani polecenie. Aby mieć dynamiczne i kolorowe wiadomości, tworzymy osobny skrypt Bash, który jest wywoływany podczas logowania przez plik startowy powłoki.

Skrypt motd – sekcje i wyjaśnienia poleceń

#!/bin/bash
#!/usr/local/bin/bash

Wyjaśnienie: Ścieżka do interpretera bash w systemach, gdzie bash jest zainstalowany w /usr/local/bin.


RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
CYAN='\033[36m'
RESET='\033[0m'

Wyjaśnienie: Definiujemy zmienne reprezentujące kody ANSI do kolorowania tekstu na terminalu.

echo -e "${CYAN} __  __ _____ ____  ____  ______     __"echo -e "|  \\/  |_   _|___ \\/ ___||  _ \\ \\   / /"echo -e "| |\\/| | | |   __) \\___ \\| |_) \\ \\ / / "echo -e "| |  | | | |  / __/ ___) |  _ < \\ V /  "echo -e "|_|  |_| |_| |_____|____/|_| \\_\\ \\_/   ${RESET}"

Wyjaśnienie: Wyświetlamy kolorowy napis ASCII art symbolizujący nazwę serwera w stylu retro. Polecenie echo -e interpretuje kody ucieczki dla kolorów, a instrukcje formatowania nadają kolor i resetują go po wyświetleniu.

LOAD=$(sysctl -n vm.loadavg | awk '{print $2, $3, $4}')

Wyjaśnienie: Pobieramy średnie obciążenie CPU (load average) korzystając z sysctl, a awk wyciąga drugą, trzecią i czwartą wartość z wyniku (odpowiednio 1-, 5- i 15-minutowy load).

MEM_TOTAL=$(sysctl -n hw.physmem)
MEM_TOTAL_MB=$((MEM_TOTAL / 1024 / 1024))
PAGE_SIZE=$(sysctl -n hw.pagesize)
FREE_PAGES=$(sysctl -n vm.stats.vm.v_free_count)
MEM_FREE_BYTES=$((FREE_PAGES * PAGE_SIZE))
MEM_FREE_MB=$((MEM_FREE_BYTES / 1024 / 1024))

Wyjaśnienie: Pobieramy całkowitą pamięć RAM i wyliczamy jej wartość w megabajtach. Następnie obliczamy ilość wolnej pamięci na podstawie liczby wolnych stron pamięci i rozmiaru strony. Wynik również jest konwertowany na megabajty.

echo -e "${YELLOW}Aktualne obciążenie CPU:${RESET} ${GREEN}${LOAD}${RESET}"
echo -e "${YELLOW}Pamięć całkowita:${RESET} ${GREEN}${MEM_TOTAL_MB} MB${RESET}"
echo -e "${YELLOW}Wolna pamięć:${RESET} ${GREEN}${MEM_FREE_MB} MB${RESET}"

Wyjaśnienie: Wyświetlamy pobrane wartości obciążenia CPU i pamięci RAM z kolorami, nadając nagłówkom i wartościom różne kolory dla czytelności.

df -h | awk -v CYAN="${CYAN}" -v GREEN="${GREEN}" -v RESET="${RESET}" '
NR>1 {
    free_perc = 100 - gensub(/%/, "", "g", $5)
    printf "%s%s%s: %s%d%%%s  ", CYAN, $6, RESET, GREEN, free_perc, RESET
}
END {print ""}'

Wyjaśnienie: Polecenie df -h pokazuje rozmiary systemów plików w czytelnej formie. Za pomocą awk zliczamy procent wolnego miejsca (100 minus procent użycia z kolumny 5) i wyświetlamy punkt montowania (kolumna 6) razem z procentem wolnego miejsca, kolorując je odpowiednio.

count_process() {
  ps aux | grep -w "$1" | grep -v grep | wc -l
}

COUNT_GAME=$(count_process "game")
COUNT_DB=$(count_process "db")
COUNT_AUTH=$(count_process "auth")

Wyjaśnienie: Definiujemy funkcję, która liczy liczbę procesów zawierających podany ciąg znaków w pełnej nazwie procesu. Następnie zliczamy liczbę obecnie działających procesów: "game", "db" oraz "auth".

color_status() {
  if [ "$1" -gt 0 ]; then
    echo -e "${GREEN}RUNNING (${1})${RESET}"
  else
    echo -e "${RED}NOT RUNNING${RESET}"
  fi
}

echo -e "${YELLOW}Status procesów gry MT2SRV:${RESET}"
echo -e "game: $(color_status $COUNT_GAME)"
echo -e "db: $(color_status $COUNT_DB)"
echo -e "auth: $(color_status $COUNT_AUTH)"

Wyjaśnienie: Funkcja color_status przyjmuje liczbę procesów i zwraca tekst z informacją, czy procesy są uruchomione (zielony napis) lub nie (czerwony napis). Następnie wypisujemy status każdej aplikacji gry.

echo -e "${YELLOW}Szczegóły procesów game/db/auth:${RESET}"
ps aux | grep -E 'game|db|auth' | grep -v grep | awk -v GREEN="${GREEN}" -v RESET="${RESET}" '{print GREEN $0 RESET}'

Wyjaśnienie: Pokazujemy szczegóły działających procesów o nazwach zawierających "game", "db" lub "auth". Wynik jest kolorowany na zielono dla lepszej czytelności w terminalu.

Jak używać tego skryptu?

Skrypt zapisujemy jako plik wykonywalny, np. /etc/motd.sh. Nadajemy mu uprawnienia wykonania (chmod +x /etc/motd.sh) i wywołujemy go z pliku startowego powłoki, np. ~/.bash_profile lub globalnie w /etc/profile, dodając w nich linię:

/etc/motd.sh

Dzięki temu podczas każdego logowania do powłoki pojawi się dynamiczny i kolorowy Message Of The Day z najważniejszymi informacjami o systemie i stanie procesów.