20 poleceń systemu Linux dla administratora systemu

System Linux udostępnia ogromny zestaw poleceń i narzędzi, które pozwalają na sprawne i skuteczne wykonywanie zadań administracyjnych.

W ramach obowiązków administratora systemów znajduje się instalacja i konfiguracja oprogramowania, kontrola uprawnień dostępu, monitorowanie wydajności, dbałość o dostępność usług, tworzenie i odtwarzanie kopii zapasowych, a także rozwiązywanie problemów awaryjnych.

W tym opracowaniu skupimy się na wybranych poleceniach, które administratorzy systemów Linux wykorzystują w swojej codziennej praktyce.

uname

Uruchomienie polecenia uname z opcją -a pozwala na wyświetlenie szczegółowych informacji o systemie. Zostaną przedstawione: nazwa jądra, wersja jądra, edycja jądra, nazwa hosta, typ procesora oraz dane o platformie sprzętowej.

[email protected]:~$ uname -a
Linux ubuntu18 5.3.0-1028-azure #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Poniżej znajduje się wyjaśnienie poszczególnych elementów:

kernel name:Linux 
hostname: ubuntu18 
kernel release: 5.3.0-1028-azure 
kernel version: #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020 
machine hardware name: x86_64 
processor: x86_64 
hardware-platform: x86_64 
operating system: GNU/Linux

df

Polecenie df umożliwia sprawdzenie rozmiaru partycji dyskowych oraz dostępnego miejsca. Uruchomione bez dodatkowych parametrów, prezentuje informacje w blokach 1K.

[email protected]:~$ df 
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              437208       0    437208   0% /dev
tmpfs              91100     692     90408   1% /run
/dev/sda1       30309264 2383952  27908928   8% /
....

Opcja -h przedstawia dane w sposób bardziej zrozumiały dla użytkownika, tj. w megabajtach (MB) i gigabajtach (GB).

[email protected]:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            427M     0  427M   0% /dev
tmpfs            89M  692K   89M   1% /run
/dev/sda1        29G  2.3G   27G   8% /
tmpfs           445M     0  445M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           445M     0  445M   0% /sys/fs/cgroup
/dev/sda15      105M  3.6M  101M   4% /boot/efi
/dev/sdb1       3.9G   16M  3.7G   1% /mnt
tmpfs            89M     0   89M   0% /run/user/1001 

Aby wykluczyć określone systemy plików, na przykład tmpfs, co skutkuje bardziej przejrzystym wynikiem, należy zastosować flagę -x.

[email protected]:~$ df -h -x tmpfs
Filesystem      Size  Used Avail Use% Mounted on
udev            427M     0  427M   0% /dev
/dev/sda1        29G  2.3G   27G   8% /
/dev/sda15      105M  3.6M  101M   4% /boot/efi
/dev/sdb1       3.9G   16M  3.7G   1% /mnt

Do wyświetlenia informacji tylko o określonym typie systemu plików, można użyć opcji -t. Na przykład, by zobaczyć tylko system plików ext4:

[email protected]:~$ df -h -t ext4
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        29G  2.3G   27G   8% /
/dev/sdb1       3.9G   16M  3.7G   1% /mnt

Dodanie flagi --total skutkuje wyświetleniem w ostatniej linii sumarycznych danych:

[email protected]:~$ df -h -t ext4 --total
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        29G  2.3G   27G   8% /
/dev/sdb1       3.9G   16M  3.7G   1% /mnt
<b>total            33G  2.3G   31G   8% -</b>

du

Polecenie du jest wykorzystywane do weryfikacji zajętości dysku przez poszczególne katalogi. Przykładowo, aby skontrolować wykorzystanie przestrzeni dyskowej w /var/log, a dane przedstawić w czytelnej formie, użyj flagi -h.

[email protected]:~$ sudo du -h /var/log
24K	/var/log/Microsoft/Azure/NetworkWatcherAgent/Logs
28K	/var/log/Microsoft/Azure/NetworkWatcherAgent
32K	/var/log/Microsoft/Azure
36K	/var/log/Microsoft
60K	/var/log/apt
4.0K	/var/log/samba
177M	/var/log/journal/0f4f926f583b4691af7de11025b19ff6
177M	/var/log/journal
...
204M	/var/log

Aby wyświetlić tylko ogólne podsumowanie, wystarczy zastosować flagę -s (summary).

[email protected]:~$ sudo du -hs /var/log
204M	/var/log

free

free jest poleceniem, które pokazuje całkowitą, zużytą oraz wolną pamięć operacyjną systemu. Dla lepszej czytelności danych można użyć flagi -h.

[email protected]:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:           889M        272M        100M        712K        517M        443M
Swap:            0B          0B          0B
total - Całkowita ilość zainstalowanej pamięci (memtotal + swaptotal)
used - Pamięć zajęta
free - Pamięć nieużywana (memfree + swapfree)
buffers - Pamięć wykorzystywana przez bufory jądra
cache - Pamięć zajęta przez pamięć podręczną
buff/cache - Suma buforów i pamięci podręcznej
available - Szacowana dostępna pamięć dla nowych aplikacji bez użycia swap

ps

ps dostarcza informacji o aktualnym stanie procesów działających w systemie. Aby wyświetlić wszystkie procesy przypisane do użytkownika „ubuntu”, należy użyć flagi -u wraz z nazwą użytkownika:

[email protected]:~$ ps -u ubuntu
   PID TTY          TIME CMD
  7804 ?        00:00:00 systemd
  7805 ?        00:00:00 (sd-pam)
  7940 ?        00:00:00 sshd
  7941 pts/0    00:00:00 bash
  8111 ?        00:00:00 sshd
  8112 pts/1    00:00:00 bash
 13868 ?        00:00:00 sshd
 13869 pts/2    00:00:00 bash
 13885 pts/0    00:00:00 man
 13895 pts/0    00:00:00 pager
 18111 pts/2    00:00:00 man
 18121 pts/2    00:00:00 pager
 18485 pts/1    00:00:00 ps

Aby wyświetlić wszystkie działające procesy, polecenie ps należy uruchomić z flagami aux:

[email protected]:~$ ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.7 160076  7020 ?        Ss   Jun29   0:34 /sbin/init
root          2  0.0  0.0      0     0 ?        S    Jun29   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        I<   Jun29   0:00 [rcu_gp]
root          4  0.0  0.0      0     0 ?        I<   Jun29   0:00 [rcu_par_gp]
root          6  0.0  0.0      0     0 ?        I<   Jun29   0:00 [kworker/0:0H-kb]
....

gdzie:

Nagłówek
Znaczenie
PID
Identyfikator procesu
%CPU
Procent czasu wykorzystania procesora
%MEM
Procent wykorzystania pamięci RAM
VSZ
Użycie pamięci wirtualnej w kilobajtach (KB)
RSS
Użycie pamięci fizycznej w kilobajtach (KB)
TTY
Terminal przypisany do procesu
STAT
R – Uruchomiony lub gotowy do pracy, S – Uśpiony, I – Nieaktywny, T – Zatrzymany, Z – Zombie, D – Oczekiwanie na operacje wejścia/wyjścia dysku, X – Martwy, W – Wymieniony, N – Proces o obniżonym priorytecie, < – Proces o podwyższonym priorytecie

top

O ile polecenie ps przedstawia statyczny obraz stanu procesów, top zapewnia dynamiczny, na bieżąco aktualizowany (domyślnie co trzy sekundy) widok listy procesów systemowych, posegregowanych według wykorzystania zasobów procesora.

Dane wyjściowe polecenia top podzielone są na dwie główne sekcje: podsumowanie stanu systemu w górnej części oraz tabela procesów, zorganizowana według obciążenia procesora.

top - 14:25:32 up 44 days, 11:37,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 114 total,   1 running,  59 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   910992 total,   101208 free,   274712 used,   535072 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   458492 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND    
 50497 ubuntu    20   0   44528   3944   3368 R  0.7  0.4   0:00.15 top        
     1 root      20   0  160076   7020   4400 S  0.0  0.8   0:34.85 systemd    
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.08 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:+
     9 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 mm_percpu_+

Opis wybranych pól w sekcji podsumowania systemu:

up
Czas pracy systemu (uptime). Okres od ostatniego uruchomienia komputera.
load average
Średnie obciążenie systemu, czyli liczba procesów oczekujących na uruchomienie. Wartość poniżej 1.0 sygnalizuje, że system nie jest przeciążony. Podawane są trzy wartości: średnia z ostatniej minuty, z ostatnich 5 minut oraz z ostatnich 15 minut.
%Cpu(s)

Wiersz przedstawiający informacje o wykorzystaniu procesora:
us – Użytkownik
Procent procesora używany przez procesy użytkownika.
sy – System
Procent procesora wykorzystany przez procesy systemowe.
ni – Nice
Procent procesora używany przez procesy o niskim priorytecie.
id – Bezczynność
Procent czasu, w którym procesor jest nieaktywny.
wa – I/O Wait
Procent czasu, w którym procesor oczekuje na operacje wejścia/wyjścia.
hi
Czas spędzony na obsłudze przerwań sprzętowych.
si
Czas poświęcony na obsługę przerwań programowych.
st
Czas spędzony przez wirtualną maszynę w oczekiwaniu na zasoby hipernadzorcy.

Pola tabeli procesów:

PID
Identyfikator procesu
USER
Właściciel procesu
PR
Priorytet procesu
NI
Wartość nice (wpływająca na priorytet)
VIRT
Ilość pamięci wirtualnej używanej przez proces (KB)
RES
Pamięć fizyczna wykorzystywana przez proces
SHR
Pamięć współdzielona używana przez proces
S
Status procesu: R – Uruchomiony, S – Uśpiony, I – Nieaktywny, T – Zatrzymany, Z – Zombie, D – Oczekiwanie na operacje wejścia/wyjścia dysku, W – Wymieniony, X – Martwy
%CPU
Procent wykorzystania czasu procesora przez proces
%MEM
Procent wykorzystania pamięci fizycznej przez proces
TIME+
Całkowity czas użycia procesora przez proces
COMMAND
Nazwa programu

Podczas działania programu top, można korzystać z dodatkowych poleceń. Naciśnięcie klawisza h lub ? wyświetli listę dostępnych opcji. Klawisz k służy do zakończenia procesu, natomiast q umożliwia wyjście z programu.

dig

dig jest znakomitym narzędziem służącym do wykonywania zapytań DNS. Sposób jego użycia prezentuje się następująco:

dig <DNS server> <domain> <query-type>

gdzie:

  • <DNS server> to nazwa serwera DNS, do którego kierujemy zapytanie
  • <domain> to nazwa domeny, o którą pytamy
  • <query-type> to rodzaj rekordu, jaki chcemy uzyskać – A, MX, NS, SOA itp.

Aby pominąć pełne dane wyjściowe, należy zastosować flagę +short.

Aby sprawdzić rekord A dla domeny google.com, należy użyć:

[email protected]:~$ dig google.com +short
172.217.164.174

Aby zobaczyć rekordy MX dla domeny google.com:

[email protected]:~$ dig google.com MX  +short
50 alt4.aspmx.l.google.com.
10 aspmx.l.google.com.
20 alt1.aspmx.l.google.com.
40 alt3.aspmx.l.google.com.
30 alt2.aspmx.l.google.com.

Można również skorzystać z internetowych narzędzi do wyszukiwania rekordów DNS.

who i w

who wyświetla listę zalogowanych użytkowników.

[email protected]:~$ who
ubuntu   pts/0        2020-08-14 17:28 (183.83.211.129)
ubuntu   pts/1        2020-08-14 17:58 (183.83.211.129)

Polecenie w przedstawia aktualnie zalogowanych użytkowników wraz z uruchomionymi przez nich procesami. Nagłówek pokazuje aktualny czas, czas pracy systemu, ilość zalogowanych użytkowników oraz średnie obciążenie systemu.

[email protected]:~$ w
 18:07:33 up 46 days, 15:19,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
ubuntu   pts/0    183.83.211.129   17:28    2.00s  0.10s  0.00s w
ubuntu   pts/1    183.83.211.129   17:58    9:07   0.05s  0.01s vi

W dalszej części wyświetlane są nazwy użytkowników, nazwy terminali, z jakich IP się logują, czas zalogowania, czas bezczynności, JCPU, PCPU i aktualnie uruchomiony program. JCPU to czas wykorzystany przez wszystkie procesy połączone z danym terminalem, a PCPU to czas użyty przez obecny proces.

tar

Za pomocą GNU tar można grupować wiele plików w pojedyncze archiwum.

Na przykład, stwórzmy katalog myfiles oraz trzy pliki a.txt, b.txt, c.txt wewnątrz tego katalogu:

[email protected]:~$ mkdir myfiles ; touch myfiles/{a.txt,b.txt,c.txt}

Teraz utwórzmy archiwum o nazwie allfiles.tar zawierające wszystkie pliki z katalogu myfiles:

[email protected]:~$ tar -cvf allfiles.tar myfiles
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt

Sprawdźmy zawartość aktualnego katalogu. Powinien zawierać katalog myfiles oraz archiwum allfiles.tar:

[email protected]:~$ ls
allfiles.tar  myfiles

Archiwum można rozpakować za pomocą flagi -x. A więc aby rozpakować allfiles.tar:

[email protected]:~$ tar -xvf allfiles.tar
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt

Istnieje możliwość kompresji archiwum za pomocą flagi -z, co stworzy archiwum spakowane algorytmem gzip.

[email protected]:~$ tar -zcvf allfiles.tar.gz myfiles
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt
[email protected]:~$ ls
allfiles.tar.gz  myfiles

Aby rozpakować skompresowane archiwum, należy użyć opcji -z łącznie z -x.

[email protected]:~$ tar -zxvf allfiles.tar.gz 
myfiles/
myfiles/c.txt
myfiles/a.txt
myfiles/b.txt

grep

grep służy do przeszukiwania plików w poszukiwaniu określonego wzorca. Wyświetla wszystkie linie, w których ten wzorzec się znajduje. Przykładowo, aby znaleźć linię zawierającą „ServerRoot” w pliku /etc/apache2/apache2.conf:

[email protected]:~$ grep ServerRoot /etc/apache2/apache2.conf 
# ServerRoot: The top of the directory tree under which the server's
#ServerRoot "/etc/apache2"

Do przeszukania wszystkich plików w katalogu, należy użyć *. Aby przeszukać również podkatalogi, użyj flagi -r (recursive). W celu wyszukania wszystkich linii zawierających „VirtualHost” we wszystkich plikach w katalogu /etc/apache2:

[email protected]:~$ cd /etc/apache2
[email protected]:/etc/apache2$ grep -r VirtualHost *
apache2.conf:# If you do not specify an ErrorLog directive within a <VirtualHost>
apache2.conf:# logged here.  If you *do* define an error logfile for a <VirtualHost>
conf-available/localized-error-pages.conf:# even on a per-VirtualHost basis.  If you include the Alias in the global server
conf-available/other-vhosts-access-log.conf:# Define an access log for VirtualHosts that don't define their own logfile
ports.conf:# have to change the VirtualHost statement in
sites-available/000-default.conf:<VirtualHost *:80>
...

rsync

rsync to szybkie narzędzie do synchronizacji plików i katalogów między dwiema lokalizacjami. Może być używane zarówno do kopiowania lokalnego, jak i zdalnego. Jego szybkość wynika z faktu, że przesyła jedynie różnice między plikami źródłowymi, a plikami docelowymi.

Jest powszechnie używane do tworzenia kopii zapasowych oraz jako alternatywa dla zwykłego kopiowania.

Przykład:

Do skopiowania wszystkich plików z katalogu myfiles do katalogu backups:

[email protected]:~$ rsync -avh myfiles/ /backups
sending incremental file list
./
a.txt
b.txt
c.txt

sent 218 bytes  received 76 bytes  588.00 bytes/sec
total size is 0  speedup is 0.00

Aby zsynchronizować wszystkie pliki z katalogu myfiles z katalogiem na zdalnym hoście, w nazwie docelowej trzeba podać użytkownik_zdalny@host_zdalny. A więc, aby przenieść myfiles na zdalny host o adresie IP 10.0.0.50:

[email protected]:~$ rsync -avh myfiles/ [email protected]:/home/vagrant
[email protected]'s password: 
sending incremental file list
./
a.txt
b.txt
c.txt

sent 230 bytes  received 76 bytes  47.08 bytes/sec
total size is 0  speedup is 0.00

ss

Polecenie ss jest używane do wyświetlania statystyk gniazd, podobnie jak starsze netstat. Aby zobaczyć gniazda TCP, należy użyć flagi -t.

[email protected]:~$ ss -t 
State       Recv-Q        Send-Q                 Local Address:Port                     Peer Address:Port         
ESTAB       0             0                           10.0.0.4:53852                   168.63.129.16:8037         
ESTAB       0             0                           10.0.0.4:ssh                    183.83.211.129:64118        
ESTAB       0             0                           10.0.0.4:33256                 169.254.169.254:http         
ESTAB       0             1080                        10.0.0.4:ssh                     222.186.30.35:11527        
ESTAB       0             0                           10.0.0.4:ssh                    183.83.211.129:63049

Powyższe polecenie nie wyświetli gniazd nasłuchujących. Aby pokazać zarówno gniazda nasłuchujące jak i nienasłuchujące, użyj flag -t oraz -a.

[email protected]:~$ ss -t -a 
State        Recv-Q        Send-Q                Local Address:Port                     Peer Address:Port         
LISTEN       0             128                         0.0.0.0:ssh                           0.0.0.0:*            
LISTEN       0             80                        127.0.0.1:mysql                         0.0.0.0:*            
LISTEN       0             128                   127.0.0.53%lo:domain                        0.0.0.0:*            
ESTAB        0             0                          10.0.0.4:53852                   168.63.129.16:8037         
ESTAB        0             0                          10.0.0.4:ssh                    183.83.211.129:64118        
ESTAB        0             0                          10.0.0.4:33256                 169.254.169.254:http         
ESTAB        0             1080                       10.0.0.4:ssh                     222.186.30.35:11527        
ESTAB        0             120                        10.0.0.4:ssh                    183.83.211.129:63049        
LISTEN       0             128                            [::]:ssh                              [::]:*            
LISTEN       0             128                               *:http                                *:*

locate

locate używa bazy danych do wyszukiwania plików, co sprawia, że jest ono zazwyczaj dużo szybsze niż find. Jest proste w użyciu, aby wyszukać plik, np. apache2.conf:

[email protected]:~$ locate apache2.conf
/etc/apache2/apache2.conf
/var/lib/dpkg/info/apache2.conffiles

Możesz użyć flagi -c, gdy interesuje Cię jedynie ilość znalezionych pasujących plików.

[email protected]:~$ locate -c apache2.conf
2

Czasami może zajść konieczność odświeżenia bazy danych używanej przez locate, czyli mlocate. W tym celu użyj polecenia updatedb, które wymaga uprawnień administratora.

[email protected]:~$ sudo updatedb

find

find jest jednym z najczęściej używanych poleceń w systemie Linux. Używa się go do wyszukiwania plików na podstawie wielu kryteriów, m.in. nazwy, uprawnień, ID użytkownika, ID grupy, rozmiaru, typu.

Aby wyszukać plik po nazwie w aktualnym katalogu, użyj opcji -name, a po niej nazwy pliku, którego szukasz:

[email protected]:~$ find . -name a.txt
./myfiles/a.txt

Aby wyszukać katalogi, użyj opcji -type d:

[email protected]:~$ find . -type d
.
./.ssh
./myfiles
./.cache
./.gnupg
./.gnupg/private-keys-v1.d
./docker

Aby wyszukać pliki według rozmiaru, na przykład te większe niż 20 MB, użyj opcji -size:

[email protected]:~$ find . -size +20M
./docker/docker-ce-cli_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb
./docker/docker-ce_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb

systemctl

W większości dystrybucji Linuksa systemd zastąpił proces init SysV, a więc do zarządzania usługami i jednostkami systemd wykorzystuje się polecenie systemctl.

Aby uruchomić usługę, na przykład apache2:

[email protected]:~$ sudo systemctl start apache2.service

Można opuścić sufiks .service.

Aby zatrzymać usługę:

[email protected]:~$ sudo systemctl stop apache2

Aby zobaczyć stan usługi, użyj polecenia systemctl status. Poniższy przykład pokazuje status Apache2 w czasie jego pracy:

[email protected]:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Wed 2020-08-19 11:34:04 UTC; 2s ago
  Process: 25346 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 18202 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
  Process: 25536 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 25555 (apache2)
    Tasks: 55 (limit: 1024)
   CGroup: /system.slice/apache2.service
           ├─25555 /usr/sbin/apache2 -k start
           ├─25558 /usr/sbin/apache2 -k start
           └─25559 /usr/sbin/apache2 -k start

Aug 19 11:34:04 ubuntu18 systemd[1]: Starting The Apache HTTP Server...
Aug 19 11:34:04 ubuntu18 systemd[