Zliczenie wystąpień poszczególnych wywołań systemowych i wyświetlenie czasu wykonania tych wywołań:
strace -c dd if=/dev/urandom of=/dev/null count=1000
Wykonanie programu ./program i zapisanie do pliku strace.out wszystkich wywołań systemowych, których użył ten program:
strace -o strace.out -f ./program
Utworzenie pliku o rozmiarze 4MB, sformatowanie go jako pliku wymiany i podłączenie w systemie jako dodatkowej przestrzeni wymiany:
dd if=/dev/zero of=/tmp/swap.dat bs=1k count=4096
mkswap /tmp/swap.dat
swapon /tmp/swap.dat
Włącza zrzucanie rdzenia do pliku:
ulimit -c unlimited
Wyświetla PID polecenia cmd:
pgrep -n cmd
Wyświetla aktualny katalog roboczy z zastąpieniem symlinków katalogami do których one prowadzą:
pwd -P
Wymuszenie na gcc pozostawienia pliku asemblera do którego jest tłumaczony kod w c.
Plik ten znajduje się w katalogu /tmp (np. /tmp/ccQrSAQZ.s):
gcc -v -c main.c
Skompilowanie kodu w asemblerze do pliku obiektowego:
as -V -Qy -o main.o /tmp/ccQrSAQZ.s
Listuje otwarte pliki w systemie:
lsof
Listuje otwarte przez proces o podanym PID-zie pliki:
lsof -p 1234
Wypisuje procesy, które mają otworzony podany plik:
fuser jakis_plik.txt
Ubija wszystkie procesy, które mają otworzony podany plik:
fuser -k -KILL jakis_plik.txt
Wypisuje wszystkie procesy, które mają otworzone jakieś pliki należące do podanego systemu plików:
fuser -m /media/flash
Wypisuje nazwy podanych plików oraz ich uprawnienia w formacie symbolicznym i liczbowym:
stat --format="%-15n %A,%a" /dev/log dev/sda /dev/zero
Wypisuje czas ostatniego dostępu do pliku w sekundach od 1970-01-01 00:00:00:
stat -c %X plik.txt
Wyświetla wszystkie co najmniej czteroznakowe ciągi tekstowe występujące w podanym pliku:
strings filename.dat
Wyświetla wszystkie co najmniej czteroznakowe (w bajtach) ciągi tekstowe wraz z ciągami zakodowanymi
binarnie w UTF-8 występujące w podanym pliku:
strings -eS filename.dat
Wypisuje dane w formacie binarnym, każde słowo ma 16-bitów, wyświetla w prawej kolumnie znaki ascii:
xxd filename.dat
Wypisuje dane w formacie binarnym, każde słowo ma 32-bity:
xxd -g4 filename.dat
Wypisuje dane w formacie binarnym, każde słowo ma 16-bitów, nie wyświetla w prawej kolumnie znaków ascii:
hexdump filename.dat
Wypisuje dane w formacie binarnym, każde słowo ma 32-bity, nie wyświetla w lewej kolumnie offsetów ani w prawej kolumnie znaków ascii:
hexdump -e '6/4 "%8x "' -e '"\n"' filename.dat
Wypisanie obiektów pamięci współdzielonej:
ipcs -m -m
Wypisanie obiektów pamięci współdzielonej oraz informacji o tym, który proces (PID) dany obiekt utworzył oraz
który proces jako ostatni związał się z tym obiektem lub usunął dowiązanie do niego:
ipcs -p
Sprawdzenie, które procesy korzystają z danego obiektu pamięci współdzielonej ([shmid] jest wybranym identyfikatorem danego obiektu):
ipcs -m
ipcs -m -p
lsof | head -1 ; lsof | grep [shmid]
Wyświetlenie dodatkowych infrmacji na temat wybranego obiektu pamięci współdzielonej:
ipcs -m -i [shmid]
Wypisanie listy istniejących w systemie kolejek komunikatów standardu System V:
ipcs -q
Wypisanie szczegółowych danych na temat kolejki o podanym identyfikatorze msqid (wartość liczbowa):
ipcs -q -i msqid
Usuniecie kolejki o podanym identyfikatorze msqid (wartość liczbowa):
ipcrm -q msqid
Wypisanie listy istniejących w systemie semaforów standardu System V:
ipcs -s
Wypisanie szczegółowych danych na temat semafora o podanym identyfikatorze semid (wartość liczbowa):
ipcs -s -i semid
Usuniecie semafora o podanym identyfikatorze semid (wartość liczbowa):
ipcrm -s semid
Sprawdzenie czy proces działa (jeśli otrzymamy puste wyjście to znaczy, że tak):
kill -0 PID
Usunięcie wybranego obiektu pamieci współdzielonej:
ipcrm -m [shmid]
Wypisuje pid, efektywny identyfikator użytkownika, rzeczywisty identyfikator użytkownika i komendę dla każdego uruchomionego procesu:
ps -eo pid,euser,ruser,comm
Wyświetla funkcję systemową blokującą na semaforze dany proces:
ps -o wchan -p PID
Zamontowanie systemu plików kolejek standardu POSIX:
sudo mount -t mqueue none /mnt/mqs
Wyświetlenie szczegółowych danych wybranej kolejki (pliku) standardu POSIX:
cd /mnt/mqs
touch myqueue
cat myqueue
Aby usunąć kolejkę standardu POSIX, należy po prostu skasować jej plik przy pomocy polecenia rm, np:
rm myqueue
ls -l /dev
Jeśli po wydaniu powyższego polecenia linia reprezentująca kolejny plik zaczyna się od litery:
b (block), c (character), p (pipe) lub s (socket),
to oznacza, że dany plik jest urządzeniem (b, c) lub plikiem specjalnym (p, s).
Wyświetla szczegółowe informacje na temat podanego urządzenia, w tym jego ścieżkę w katalogu /sys/devices:
udevadm info --query=all --name=/dev/sda
Monitorowanie powiadomień uevent (o podłączeniu/usunięciu urządzenia):
udevadm monitor
Monitorowanie powiadomień uevent pochodzących z jądra i dotyczących zmian w podsystemie SCSI:
udevadm monitor --kernel --subsystem-match=scsi
Wyświetla listę urządzeń scsi (przegląda on system plików sysfs: /sys):
lsscsi
Wyświetla listę urządzeń USB:
lsusb
Konwencje w nazewnictwie urządzeń w systemie:
/dev/sd* - | dyski twarde (np. /dev/sda, /dev/sdb) Partycje główne na dysku /dev/sda reprezentowane są przez następujące pliki /dev/sda1 .. /dev/sda4. Jeśli chcemy utworzyć partycje logiczne, to jedną z tych czterech partycji głównych musi być partycja rozszerzona. Partycje logiczne w obrębie partycji rozszerzonej reprezentowane są przez pliki /dev/sda5, /dev/sda6, ... |
---|---|
/dev/sr* - | dyski CD i DVD (np. /dev/sr0, /dev/sr1) Do powyższych plików istnieją dowiązania symboliczne takie jak: /dev/cdrom, /dev/cdrom1, /dev/cdrw, /dev/cdrw1, /dev/dvd, /dev/dvdrw, ... |
/dev/hd* - | dyski twarde PATA (np. /dev/hda, /dev/hdb, /dev/hdc, /dev/hdd) Jest to starszy sprzęt teraz już rzadko spotykany. |
/dev/tty*, /dev/pts/*, /dev/tty - |
terminale
/dev/tty1 - pierwsza konsola wirtualna
W systemie Ubuntu przełączenie się z środowiska graficznego do n-tej (n od 1 do 6) konsoli wirtualnej
następuje po wciśnięciu klawiszy CTRL+Fn. Następnie możemy się przełączać pomiędzy tymi konsolami za
pomocą skrótów Alt+Fn. Powrót do środowiska graficznego następuje po przełączeniu się na siódmą
konsolę wirtualną: Alt+F7.Jeśli jesteśmy już zalogowani do dowolnej konsoli wirtualnej, to możemy się przełączyć do innej konsoli następującym poleceniem: chvt n - gdzie n to numer konsoli docelowej.
|
/dev/ttyS* - | porty szeregowe RS-232
/dev/ttyS0 - odpowiednik windowsowego COM1,
|
/dev/ttyUSB* oraz /dev/ttyACM* - | porty USB
/dev/ttyUSB0, /dev/ttyUSB1, ...,
|
/dev/lp0 i /dev/lp1 - | jednokierunkowe porty równoległe
/dev/lp0 - odpowiednik windowsowego LPT1
Porty te zostały zastąpione portami USB.
|
/dev/parport0 i /dev/parport1 - | dwukierunkowe porty równoległe |
/dev/dsp, /dev/audio, /dev/snd/* - | urządzenia audio Urządzenia ALSA znajdują się w ktalogu /dev/snd. Urządzenia OSS to /dev/dsp i /dev/audio. |
Urządzenia tworzymy przy pomocy polecenia mknod podając plik urządzenia, jego typ oraz numer główny i poboczny, np:
sudo mknod /dev/sda1 b 8 2 - pierwsza partycja dysku twardego sda
Wymusza na jądrze ponowne wczytanie tablicy partycji podanego urządzenia:
blockdev -rereadpt /dev/sdb
Wyświetla numer bajtu licząc od początku dysku, od którego zaczyna się wskazana partycja (sda2):
cat /sys/block/sda/sda2/start
Wyświetla listę partycji dysków twardych z przypisanymi im identyfikatorami UUID oraz ich typami:
sudo blkid
Dla partycji typu VFAT identyfikatorem UUID jest numer seryjny tego woluminu FAT.
Aby zamontować partycję po numerze UUID, wykonujemy polecenie:
mount UUID=..... /mnt/disk
Odmontowuje zamontowany katalog / i ponownie go montuje korzystając z zapisu w pliku /etc/fstab.
Przydaje się gdy system plików / był zamontowany w trybie tylko do odczytu i chcemy go zamontować
z pełnymi uprawnieniami:
mount -n -o remount /
Polecenie służące do sprawdzania systemów plików pod kątem występowania błędów:
fsck
Jest ono okresowo automatycznie wywoływane przez system operacyjny.
W trybie interaktywnym uruchamiamy go podając jako parametr ścieżkę do urządzenia, np.:
fsck /dev/sda5
Sprawdzany system plików musi być odmontowany, gdyż w przeciwnym przypadku mogłoby ono
spowodować błędy systemu plików i utratę danych. Od tej reguły istnieje jeden wyjątek:
jeśli uruchomiliśmy system w trybie jednego użytkownika i podmontowaliśmy główny system plików /
w trybie tylko do odczytu, to wtedy możemy bezpiecznie wykonać fsck dla tego systemu plików.
Sprawdzenie systemu plików bez wprowadzania żadnych modyfikacji (prób naprawczych) do systemu plików:
fsck -n
Zastąpienie uszkodzonego superbloku jego kopią zapasową znajdującą sie w bloku o podanym numerze:
fsck -b numer
Jeśli system plików został utworzony z wartościami domyślnymi, to poniższe polecenie wyświetli
listę numerów bloków zawierających kopie zapasowe superbloku:
mke2fs -n
Utworzenie i aktywowanie partycj wymiany:
mkswap /dev/hda5
swapon /dev/hda5
Wyłączenie podanej partycji wymiany:
swapoff /dev/hda5
Przygotowanie i podłączenie pliku jako przestrzeni wymiany:
dd if=/dev/zero of=plik_wymiany bs=1m count=liczba_megabajtow
mkswap plik_wymiany
swapon plik_wymiany
Do usunięcia partycji lub pliku z przestrzeni wymiany służy polecenie:
swapoff partycja_lub_plik_wymiany
Proces startu systemu:
Parametry jądra użyte w trakcie rozruchu można znaleźć w pliku /proc/cmdline:
cat /proc/cmdline
np.:
BOOT_IMAGE=/boot/vmlinuz-3.2.0-90-generic-pae root=UUID=4b43b290-bce6-478e-a245-997995a92c13 ro quiet splash vt.handoff=7
Parametr ro jest użyty po to by w trakcie uruchamiania program fsck mógł bezpiecznie sprawdzić główny system plików.
Kiedy ta kontrola zostanie zakończona, proces init przemountuje system plików w trybie pełnego dostępu.
GRUB - wiersz poleceń (uruchamiany klawiszem 'c' w menu rozruchowym):
ls - | wypisuje znalezione urządzenia i partycje dyskowe. Słowo kluczowe msdos w nazwie partycji oznacza, że na dysku znajduje się tablica partycji MBR. Słowo kluczowe gpt w nazwie partycji oznacza, że na dysku znajduje się tablica partycji GPT. |
---|---|
ls -l - | wypisuje szczegółowe informacje na temat znalezionych urządzeń, np. identyfikatory UUID, typy systemów plików, czas ostatniej modyfikacji, itp. |
echo $root - | wypisuje nazwę partycji podstawowej |
ls ($root)/ lub ls (hd0,msdos1)/ - | wypisuje listę plików na partycji podstawowej |
ls ($root)/boot - | wypisanie zawartości katalogu /boot na partycji podstawowej |
set - | wyświetla listę zmiennych programu grub. Jedną z najważniejszych zmiennych jest zmienna $prefix przechowująca lokalizację konfiguracji gruba oraz dodatkowych plików z których korzysta. |
Polecenie służące do wygenerowania konfiguracji gruba (na standardowe wyjście):
grub-mkconfig
Zapisanie nowej konfiguracji do podanego pliku:
grub-mkconfig -o /boot/grub/grub.cfg
Wyświetla poziom uruchomienia systemu:
who -r
Rozpoznanie rodzaju działającego w systemie procesu init:
man 8 init
Wypisuje listę aktywnych jednostek (usług) w systemie:
syssystemctl list-units
Zapisanie do logu komunikatu określonego typu:
logger -p daemon.info To jest komunikat w logu systemowym
Wypisuje listę grup, do których należy bieżący użytkownik:
groups
Wypisanie wszystkich procesów w systemie z uwzględnieniem wątków:
ps axm -o pid,tid,command
Monitorowanie podanych procesów:
top -p PID_1 -p PID_2 ...
Pomiar czasu procesora wykorzystanego przez dane polecenie:
/usr/bin/time polecenie
Wypisuje czas działania systemu oraz średnie obciążenie procesora:
uptime
Wyświetla informacje o podstawowych i drugorzędnych błędach stron procesów:
ps -o pid,min_flt,maj_flt,command
Monitorowanie zużycia pamięci i procesora w interwale 5-sekundowym:
vmstat 5
Wypisuje statystyki użycia urządzeń wejścia/wyjścia i procesora:
iostat
Wypisuje statystyki użycia wyłącznie urządzeń wejścia/wyjścia:
iostat -d
Wypisuje szczegółowe informacje na temat użycia dysków wraz z wszystkimi partycjami:
iostat -p ALL
Wyświetla informacje na temat wykorzystania urządzeń wejścia/wyjścia dla wątków
działających w systemie. Wyniki są prezentowane identycznie jak w poleceniu top:
iotop
Wyświetlenie statystyk użycia procesora w interwale 1-sekundowym w czterech krokach:
sar 1 4
Wyświetlenie statystyk użycia pamięci wirtualnej w interwale 1-sekundowym w czterech krokach:
sar -r 1 4
Monitorowanie operacji związanych ze stronicowaniem i działań na pamięci wirtualnej w interwale 1-sekundowym w czterech krokach:
sar -B 1 4
Wyświetlenie statystyk użycia urządzeń blokowych w interwale 1-sekundowym w jednym kroku
(opcja -p powoduje wyświetlenie nazw tych urządzeń a nie numerów pierwszo i drugorzędnych):
sar -d -p 1 1
Wyświetlenie statystyk użycia urządzeń sieci Ethernet w interwale 1-sekundowym w czterech krokach:
sar -n DEV 1 4
Wyświetlenie statystyk błędów urządzeń sieci Ethernet w interwale 1-sekundowym w czterech krokach:
sar -n EDEV 1 4
Wyświetlenie statystyk klienta systemu plików NFS w interwale 1-sekundowym w czterech krokach:
sar -n NFS 1 4
Wyświetlenie statystyk serwera systemu plików NFS w interwale 1-sekundowym w czterech krokach:
sar -n NFSD 1 4
Wyświetlenie statystyk gniazd w interwale 1-sekundowym w czterech krokach:
sar -n SOCK 1 4
Wyświetlenie wszystkich statystyk DEV, EDEV, NFS, NFSD, SOCK w interwale 1-sekundowym w jednym kroku:
sar -n ALL 1 1
Wypisuje szczegółowe informacje o zainstalowanym procesorzez x86 (Intel/AMD):
x86info
Wyświetlenie statystyk opisujących efektywność kodu w zakresie korzystania z pamięci podręcznej:
valgrind --tool=cachegrind ./a.out params
Wypisanie listy wywołań funkcji bibliotek dynamicznych posortowanych wg czasu oczekiwania na dane wywołanie:
ltrace -c polecenie
np.:
ltrace -c dd if=/dev/urandom of=/dev/null count=1000
Wypisanie szczegółowych informacji (wraz z czasem wykonania danej funkcji, parametr -T) wywołania wybranych (parametr -e) funkcji
bibliotek dołączanych dynamicznie:
ltrace -T -e read,write dd if=/dev/urandom of=/dev/null count=1
Wypisanie listy wywołań systemowych posortowanych wg czasu oczekiwania na dane wywołanie:
strace -c polecenie
np.:
strace -c dd if=/dev/urandom of=/dev/null count=1000
Podłączenie się programu strace do działającego już procesu:
strace -ttt -p PID
Profiluje podany program (program musi być skompilowany z parametrem -pg oraz bez żadnych flag optymalizacyjnych):
gprof ./progname
Jak powyżej, ale nie wyświetla opisów poszczególnych pól: gprof -b ./progname
Testowanie ile razy poszczególne wiersze kodu źródłowego programu zostały wykonane:
gcc -fprofile-arcs -ftest-coverage test.c
./a.out
gcov test.c
less test.c.gcov
rm test.c.gcov test.gc*
Wypisuje listę procesów używających portów lub prowadzących ich nasłuch (parametr -n wyłącza rozwiązywanie nazw domen i hostów):
sudo lsof -i -n
Wypisuje proces korzystający z podanego portu:
sudo lsof -n -i:port
Wypisuje wszystkie procesy nasłuchujące na portach TCP:
sudo lsof -iTCP -sTCP:LISTEN
Nasłuchuje na podanym porcie:
netcat -l -p port
Wyświetla listę gniazd domenowych, które są używane w systemie oraz procesy z nich korzystające:
lsof -U
Jeśli jakiś program potrzebuje plików nagłówkowych jądra (pluje błędem: Kernel Headers Not Found), to należy zainstalować następujący pakiet:
sudo apt-get install linux-headers-amd64 (dla wersji 64-bitowej systemu)
Wypisuje obiekty oraz funkcje, które występują w podanej bibliotece statycznej:
nm nazwa_biblioteki.a
Wypisanie bibliotek dzielonych wykorzystywanych przez podany program:
ldd nazwa_programu
Wypisanie tych bibliotek dzielonych, z którymi program został zbudowany, których on nie wykorzystuje:
ldd -u nazwa_programu
Skompilowanie i utworzenie obiektu dzielonego:
gcc -shared -fpic -o mylib.so mylib1.c mylib2.c
Analiza pamięci wykorzystywanej przez dany program:
valgrind --tool=memcheck ./nazwa_programu
Sprawdzenie programu pod kątem wycieków pamięci:
valgrind --quiet --leak-check=full ./nazwa_programu
Analiza pamięci wykorzystanej przez poszczególne funkcje programu:
valgrind --tool=massif ./nazwa_programu
Wyświetla informacje o wybranym oknie:
xwininfo
Wyświetla zdarzenia X serwera:
xev
Wyświetla wszystkie urządzenia wejściowe:
xinput --list
Wyświetla właściwości urządzenia wejściowego o podanym numerze ID:
xinput --list-props ID
Monitorowanie zdarzeń przekazywanych przez usługę D-Bus w trybie systemu:
dbus-monitor --system
Monitorowanie zdarzeń przekazywanych przez usługę D-Bus w trybie sesji:
dbus-monitor --session
Skanuje podany dysk w poszukiwaniu uszkodzonych sektorów:
sudo badblocks -n /dev/sda
Wypisanie wszystkich bibliotek, których dane przechowuje program pkg-config:
pkg-config --list-all
Jak sprawdzić podzespoły komputera:
Procesor: | cat /proc/cpuinfo |
---|---|
Podzespoły: |
sudo dmidecode sudo lshw sudo lshw -c display (tylko karty graficzne) |
Przykładowe pliki wykorzystywane poniżej:
------------------------------------------------------------------------
hello.c
------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
void message(void);
int main(void) {
printf("Hello world\n");
message();
return 0;
}
------------------------------------------------------------------------
dynamic_library.c
------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
void message(void) {
printf("Hello world from dynamic_library.so\n");
}
------------------------------------------------------------------------
------------------------------------------------------------------------
Kompilacja z wypisaniem szczegółowych informacji na temat kompilowanego i łączonego programu/biblioteki statycznej:
gcc -v -o hello hello.c
Wypisanie zależności (wymaganych bibliotek) dla podanego programu/biblioteki:
ldd hello
Wyróżniamy biblioteki statyczne i dynamiczne. Biblioteki statyczne (*.a) są archiwami ar, zawierającymi
pliki obiektowe (*.o). Można je utworzyć tak:
ar clq libname.a file1.o file2.o file3.o ...
Można je rozpakować poleceniem:
ar x libname.a
Kompilator dołącza do programu tylko używane pliki obiektowe z tych bibliotek.
Biblioteki dynamiczne (*.so) nie są dołączane do programu, ale są w całości ładowane do pamięci procesu
w trakcie jego uruchamiania (jeszcze przed wywołaniem funkcji main). W programie znajdują się tylko
informacje o danej bibliotece dynamicznej, po to aby można ją było załadować.
Bibliotekę dynamiczną kompilujemy poleceniem:
gcc -shared -fpic -o libdynamic_library.so dynamic_library.c
Program kompilujemy z danymi bibliotekami wymieniając je w wierszu poleceń:
gcc -o hello hello.c libname.a libdynamic_library.so
lub tak:
gcc -o hello hello.c -L ./ -lname -ldynamic_library
Skompilujmy teraz program hello.c z dołączoną biblioteką dynamiczną:
gcc -shared -fpic -o libdynamic_library.so dynamic_library.c
gcc -o hello hello.c libdynamic_library.so
Teraz gdy uruchomimy ten program, to dostaniemy komunikat:
./hello: error while loading shared libraries: dynamic_library.so: cannot open shared object file: No such file or directory
Aby móc uruchomić program, musimy podać ścieżkę do katalogu zawierającego naszą bibliotekę w zmiennej LD_LIBRARY_PATHstrong>, np.:
LD_LIBRARY_PATH=. ./hello
Można też przekopiować plik biblioteki do katalogu /usr/lib lub /usr/local/lib.
W systemie Ubuntu można też w katalogu /etc/ld.so.conf.d utworzyć plik mylibraries.conf i zapisać w nim ścieżkę do katalogu/ów
zawierającego/zawierających nasze biblioteki (w jednej linii jeden katalog). Następnie żeby odświeżyć cache bibliotek wykonujemy
polecenie:
sudo ldconfig
Uwaga, żeby to zadziałało nazwa pliku z biblioteką musi zaczynać się od przedrostka lib, np. libdynamic_library.
Wyświetlenie informacji o rozmiarach poszczególnych sekcji w pliku wykonywalnym elf, np.:
size hello
Wypisanie symboli oraz ich rozmiaru w pliku obiektowym lub wykonalnym:
nm -S hello
Wypisanie niezdefiniowanych symboli w podanym pliku obiektowym:
nm -u hello.o
Usunięcie symboli z pliku biblioteki:
strip --strip-debug libname
Usunięcie symboli z pliku wykonalnego:
strip --strip-unneeded program
Wyświetla mapę pamięci podanego procesu:
pmap PID
Plik Makefile.in jest odczytywany i przetwarzany przez skrypt configure w celu wygenerowania właściwego pliku Makefile.
Wyświetla kolejne polecenia pliku Makefile bez ich wykonywania:
make -n
Włączenie generowania ostrzeżeń przez kompilator:
CFLAGS=-Wall ./configure