Podstawy pracy w systemie Linux
Last updated
Last updated
Popularnie Linuksem nazywamy system operacyjny oparty na jądrze Linux. Występuje on w niezliczonej liczbie odmian, zwanych dystrybucjami. W większości są one darmowe i dostępne w internecie. Zawierają jądro systemu oraz zestawy oprogramowania, różnią się miedzy innymi systemami obsługi oprogramowania, dostępnym oprogramowaniem w repozytoriach (miejscach w sieci skąd można pobrać programy), ustawieniami domyślnymi, modyfikacjami jądra itp. Pewne pojęcie na temat liczby dystrybucji może dać strona distrowatch.com lub ilustracja z Wikipedii pokazująca związki między różnymi dystrybucjami. Ta różnorodność, która na początku może zaskakiwać użytkowników innych systemów operacyjnych (a czasem nawet irytować), jest kolejną zaletą Linuksa. Mamy do wyboru nie tylko wiele dystrybucji ale także środowisk graficznych (np. KDE, Gnome, Xfce, LXDE), które można w znacznym stopniu konfigurować według własnych upodobań a nawet powłok systemowych. Dzięki temu można system dostosować do swoich potrzeb i upodobań, także estetycznych ale także możliwości komputera.
Linuksa można zainstalować zamiast ale także obok innego systemu operacyjnego (np. Windows). W tym drugim przypadku przy włączeniu komputera pojawia się menu, w którym wybieramy który system załadować. Instrukcja instalacji Linuksa wychodzi poza zakres tego kursu ale bez problemu można znaleźć odpowiednie informacje w internecie. Można także zainstalować Linux jako wirtualny system operacyjny, wtedy otwiera się w naszym głównym systemie jako osobne okienko, w którym pracujemy. Można w taki sposób zainstalować Linuksa pod Windows, Mac OSX czy innym Linuksem. Instrukcja takiej instalacji z użyciem programu VirtualBox znajduje się np. na mojej stronie pod adresem http://ggoralski.pl/?p=1408.
W części praktycznej kursu będę się posługiwał dystrybucją wywodzącą się z Debiana, jednak większość, o ile nie wszystkie przykłady (poza instalacją i aktualizacją oprogramowania) powinny działać na dowolnym Linuksie, pod warunkiem zainstalowania używanego oprogramowania. Jedną z wielu zalet Debiana i dystrybucji pochodnych, które korzystają z jego repozytoriów, jest domyślna dostępność wielu programów bioinformatycznych zgromadzonych w repozytorium Debian Med.
Linux jest podobny do systemu UNIX. Z niego wywodzi się struktura systemu, wiele narzędzi a także ,,filozofia'' pisania programów. To ostatnie jest jednym z powodów, że to środowisko powszechnie stosowane w bioinformatyce. O filozofii Uniksa można poczytać np. w dostępnej online książce The Art of Unix Programming, ale z naszego punktu widzenia zwłaszcza istotne są tu trzy elementy:
Programy nie powinny być ,,kombajnami do wszystkiego'', raczej jeden program wykonywać porządnie jedno zadanie
Programy powinny być pisane tak, aby mogły ze sobą współpracować - wyniki jednego programu można przekierować do drugiego jako dane wejściowe
Programy powinny przyjmować dane i produkować wyniki w formie tekstowej.
Dlaczego to takie ważne? Dzięki takiemu podejściu do tworzenia programów możemy je traktować jak klocki, które układamy w taki sposób, że każdy z nich wykonuje określone zadanie, przekazuje wynik swojej pracy następnemu, który przerabia go dalej itd. Przykładowo: program A
gromadzi sekwencje, program B
je wyrównuje, program C
tworzy drzewo filogenetyczne a program D
generuje dendrogram. Programy te można uruchamiać po kolei ręcznie albo automatycznie pisząc odpowiedni skrypt albo łączyć za pomocą potoków (ang. pipe). Jeśli w pewnym momencie stwierdzimy, że np. zamiast programu B
lepiej sprawdzi się program Z
to po prostu podmieniamy je. Użycie tekstu jako ,,uniwersalnego'' formatu pozwala na łatwą komunikację miedzy tymi programami. Niebawem zobaczymy jak to wszystko działa w praktyce.
Taki sposób pracy wiąże się zwykle z pracą w terminalu. Co prawda większość dystrybucji zaopatrzona jest w interfejs graficzny (i to w różnych odmianach) oraz oferuje szeroką gamę ,,okienkowych'' aplikacji, także bioinformatycznych ale wiele zadań, co może się wydawać na początku dziwne, zwyczajnie łatwiej i szybciej wykonuje się używając linii komend. Oczywiście nie zawsze tak jest, w niektórych przypadkach, np. przy obróbce dendrogramów, czy ręcznym poprawianiu dopasowania sekwencji, wygodniej i efektywniej pracuje się w aplikacjach z interfejsem graficznym. Na naszych zajęciach, będziemy używać obu sposobów pracy, jednak z naciskiem na pracę w terminalu. Otwórz zatem terminal. W zależności od dystrybucji, środowiska i środowiska graficznego odpowiedni program można znaleźć w różnych miejscach menu (np. Programy->Narzędzia systemowe->Terminal MATE). Mamy też do dyspozycji różne programy, które udostępniają użytkownikowi terminal pod interfejsem graficznym, ich nazwy zazwyczaj zawierają w sobie Terminal
lub Term
, np. Terminal MATE
, XTerm
. Niektóre z nich mają dodatakowe ułatwienia, np. obsługują wiele zakładek. W każdym razie sugeruję aby od razu po odnalezieniu programu, z którego będziesz korzystać od razu umieścić do niego skrót na pulpicie lub panelu.
Otwarte okno z terminalem (ściśle rzecz biorąc jest to emulator terminala) wygląda mniej więcej tak:
Po otwarciu okna z terminalem zauważysz znak zachęty, który w zależności od konfiguracji może wyglądać np tak (w katalogu domowym):
Albo prościej:
czy np:
To jak wygląda można dość dowolnie modyfikować. Często znajduje się tam nazwa bieżącego katalogu, albo cała ścieżka do niego. Dla uproszczenia przyjmiemy, że wygląda tak:
Więcej na temat znaków zachęty i możliwości ich ustawiania można przeczytać np. tu
Po znaku zachęty widzimy zwykle migający kursor.
Poniżej będę pokazywał komendy i ich wynik w terminalu. To co nie jest poprzedzone znakiem zachęty będzie wydrukiem generowanym przez polecenia.
W terminalu uruchomiona jest powłoka systemowa (ang. shell). Jest to program pełniący rolę pośrednika pomiędzy użytkownikiem i systemem operacyjnym oraz innymi programami. Ogólnie powłoki można podzielić na graficzne (ang. GUI - Graphical User Interface) oraz tekstowe (ang. CLI - Command Line Interface). Teraz zajmiemy się tymi drugimi.
Powłoki tekstowe, jak nazwa wskazuje, przyjmują polecenia od użytkownika i zwracają wyniki działania programów (zazwyczaj) w trybie tekstowym. W Linuksie dostępnych jest (domyślnie bądź po doistalowaniu) wiele powłok (znów ta różnorodność!), np. bash, zsh, ksh, sh, fish. Bash jest zwykle domyślnie zainstalowany i uruchamiany w terminalu, zatem będę się na nim opierał. Jednak warto zaznaczyć, że często zalecany jest zsh, zwłaszcza po doinstalowaniu oh-my-zsh. Udostępnia on wiele ułatwień. Podane przeze mnie przykłady powinny także działać pod zsh.
W Linuksie system plików tworzy jedno wielkie drzewo, które zaczyna się w katalogu głównym (ang. root directory), oznaczanym jako /
. Pod tym względem przypomina nieco drzewo filogenetyczne ;-). Jest to jedna z wielu różnic między systemami uniksopodobnymi a Windows, gdzie każdy dysk (i partycja) stanowi osobną jednostkę i jest częścią pełnej ścieżki, którą podajemy, np:
ścieżka w systemie Windows: C:\Documents and Settings\student\Moje dokumenty
ścieżka w systemie Linux: /home/student/Dokumenty
W powyższych przykładach widać też różnicę w znaku oddzielającym katalogi: w Windows jest to \
, w Linuksie /
.
Gdzie zatem znajdują się w drzewie katalogu dodatkowe dyski i partycje? Są one widoczne jako katalogi. Można je zamontować w zasadzie w dowolnym miejscu, na przykład jako podkatalogi w folderze domowych użytkownika.
Nazywając katalogi i pliki warto trzymać się kilku zasad:
Nie używać spacji. Technicznie można używać spacji w nazwach katalogów i plików, ale zwłaszcza jeśli mamy zamiar pracować w terminalu lepiej tego unikać, ponieważ może to powodować komplikacje. Można je co prawda zwykle obejść ale... po co komplikować sobie pracę? Zatem, lepiej trzymać się zasady: w nazwach katalogów i plików nie używamy spacji.
Jeśli nazwa zawiera wiele słów, można je oddzielić bp. znakami _
czy -
. Na przykład: Wyniki_badan
, atp1-Rumex.fasta
. W nazwach dobrze jest też unikać polskich znaków.
Wielkość liter ma znaczenie: atp1.fasta
, ATP1.fasta
i atp1.FASTA
to różne nazwy plików.
Teraz czas na trochę praktyki.
W terminalu wpisz komendy:
cd
oznacza ,,idź do katalogu'' a /
oznacza katalog główny. ls
drukuje katalogi i pliki znajdujące się w danym folderze. Jeśli po tym poleceniu podamy ścieżkę, np. ls /var/log
otrzymamy listę elementów znajdujących się we wskazanym katalogu.
Powinniśmy zobaczyć taki (lub podobny) wynik:
To są katalogi i pliki systemowe. Mają one swoje konkretne przeznaczenie. Na razie będzie nas interesować katalog home
, przejdź zatem tam i sprawdź co tam się znajduje:
Wynik może wyglądać różne w zależności jakie konta użytkownika znajdują się na komputerze, na przykład tak:
To są katalogi domowe użytkowników, którzy mają konta na tym systemie. Jest jeszcze jeden użytkownik: root
. Jest on panem i władcą całego systemu i może WSZYSTKO (no, prawie wszystko). Jego katalog domowy znajduje się w katalogu głównym (/root
). Początkujący użytkownicy Linuksa mają często pokusę aby po prostu logować się jako root
i pracować na tym koncie. To jednak nie jest, delikatnie mówiąc, najlepszy pomysł. Głównie z powodów bezpieczeństwa. Lepiej przyjąć zasadę, że nawet jeśli jesteś jedynym użytkownikiem systemu, tworzysz dla siebie konto ,,normalnego'' użytkownika a z konta roota
korzystasz tylko wtedy, gdy jest konieczne, np. przy instalacji pakietów, aktualizacji systemu, czy zakładaniu kont nowym użytkownikom. Prawdę mówiąc, zwykle nawet w takich przypadkach nie jest konieczne bezpośrednie logowanie się na konta, lecz korzysta się z narzędzi takich jak sudo
, które pozwalają uruchomić program z prawami roota
.
Dalej zakładamy, że Twoje konto to student
i na nim będziemy pracować.
Najpierw spróbujmy wejść do katalogu innego użytkownika, niech będzie to root
:
Okazuje się, że się nie da:
I bardzo słusznie :-)
Zobaczmy z czego to wynika, używając komendy ls
z dodatkową opcją (inaczej flagą) -l
. Oznacza ona wyświetlanie dodatkowych informacji:
Nie będę omawiał szczegółowo wszystkich wyświetlanych informacji, skupię się na tych najistotniejszych z punktu widzenia kursu.
Zwróć szczególną uwagę na linię:
Na początku linii przyporządkowanej do katalogu znajduje się zestaw znaków, przypadku katalogu root
jest to::
Litera d
oznacza, że mamy do czynienia z katalogiem, ,,zwykły'' plik będzie tam miał znak -
.
Kolejne litery należy odczytywać trójkami, oznaczają one bowiem uprawnienia kolejno dla:
użytkownika, który jest właścicielem pliku/katalogu,
innych członków grupy do której należy właściciel (użytkowników można łączyć w grupy)
wszystkich pozostałych
A teraz zobaczmy co oznaczają kolejne litery w każdej trójce:
r
- prawo odczytu
w
- prawo zapisu/modyfikacji/usuwania
x
- dla pliku: prawo do uruchamiania, dla katalogu: prawo do wejścia do katalogu
Jeśli w danym miejscu zamiast litery znajduje się znak -
, oznacza to brak danego uprawnienia.
Zatem ciąg znaków: drwx------
możemy odczytać tak:
d
: jest to katalog
rwx
: właściciel może go odczytać, modyfikować i wejść do niego,
---
: członkowie grupy nie mogą go ani odczytać ani modyfikować ani wejść do niego
---
: inni też nie mogą go ani odczytać ani modyfikować ani wchodzić do niego
Teraz staje się jasne, dlaczego będąc użytkownikiem student
nie można wejść do katalogu użytkownika root
- może to zrobić tylko sam właściciel. Do uprawnień i ich modyfikacji jeszcze wrócimy.
Co oznaczają dalsze pola? Liczby pomijamy, następnie znajduje się nazwa użytkownika - właściciela i nazwa grupy (tu jest to grupa o nazwie takiej jak właściciel). Kolejna liczba określa wielkość elementu, w przypadku katalogu nie jest to wielkość wszystkich elementów, które zawiera. Następnie mamy datę ostatniej modyfikacji (utworzenia, modyfikacji, zapisu). W końcu widać nazwę elementu.
Przejdźmy teraz do katalogu domowego użytkownika student
i sprawdźmy co tam się znajduje:
Są to standardowe katalogi użytkownika tworzone przy pierwszym logowaniu. W zależności od dystrybucji i ustawień mogą być inne od powyższych.
Teraz użyjmy opcji -a
(jak all - wszystkie)
Jak widać lista plików znacznie się powiększyła. Pojawiły się katalogi i pliki (sprawdź komendą ls -la
co jest czym), których nazwy zawierają na początku kropkę. Są to elementy ukryte, które domyślnie się nie wyświetlają. Zazwyczaj są to pliki konfiguracyjne, albo katalogi zawierające pliki konfiguracyjne. Najbardziej zagadkowe mogą się wydawać katalogi .
oraz ..
. Pierwszy z nich oznacza tyle co ,,bieżący katalog'' a drugi ,,nadrzędny katalog'' (w tym wypadku /home
). Używanie tych ,,kropkowych'' oznaczeń katalogów jest bardzo wygodnie. Jeśli chcesz przejść do katalogu powyżej, wcale nie musisz pamiętać jak się nazywa, po prostu piszesz: cd ..
. Można też wykorzystać je przy innych operacjach np. kopiowaniu czy przenoszeniu plików i katalogów.
Przy okazji ważna uwaga. Większość komend, których będziemy używać posiada (choć np. cd
nie) swoje manuale, które można wywołać poleceniem man komenda
. Tam można znaleźć np. dostępne opcje. Często dostępna też jest krótsza pomoc przy użyciu opcji -h
lub --help
, choć trzeba pamiętać, że -h
może też mieć inne znaczenie w niektórych programach.
Sprawdź man ls
. Dowiedz się do czego służy opcja -h
i jak posortować listę plików/folderów według czasu ich modyfikacji.
Z manuala można wyjść używając klawisza q
.
Kolejna przydatna komenda to pwd
- wyświetla ona ścieżkę do miejsca, w którym się znajdujemy:
Jeśli chcemy szybko przenieść się do swojego katalogu domowego z dowolnego miejsca, nie musimy wpisywać pełnej ścieżki. Możemy użyć znaku ~
. Wykonaj kolejno polecenia:
Ścieżki typu /home/student/Dokumenty
są ścieżkami absolutnymi (bezwzględnymi), używając ich wskazujemy zawsze to samo miejsce w drzewie katalogów. Innym rodzajem ścieżek, są ścieżki względne, które mogą wskazywać różne miejsca w zależności od tego gdzie aktualnie się znajdujemy w linii poleceń. Prostym przykładem jest ..
, czyli ,,katalog wyżej'', ale mogą to być bardziej złożone ścieżki, np. polecenie: cd ../../RESULTS/
oznacza ,,idź do katalogu wyżej, idź do katalogu wyżej, idź do katalogu RESULTS''. Takie ścieżki są przydatne na przykład wtedy, kiedy łatwiej jest nam określić docelowy katalog z bieżącego miejsca położenia, niż z uwzględnieniem całej ścieżki, albo gdy posługujemy się pewnym zestandaryzowanym układem podkatalogów (także w projektach bioinformatycznych).
Kolejnym przydatnym ,,skrótowcem'' jest znak -
używany razem z komendą cd
. Oznacza on ,,katalog w którym byłem poprzednio''. Spróbuj:
Teraz w katalogu domowym stwórz nowy katalog:
mkdir
to polecenie utworzenia nowego katalogu, po którym podaje się jego nazwę.
Sprawdźmy czy się udało:
Przejdź do nowoutworzonego katalogu:
Wyświetl tekst na ekranie, służy do tego komenda echo
:
Utwórz plik tekstowy i sprawdź czy się pojawił:
Komenda touch
tworzy plik, który jest na początku pusty.
Umieśćmy więc w nim jakiś tekst:
Operator >
po komendzie przekazuje tekst generowany przez tą komendę (strumień) do pliku tekstowego. Sprawdźmy zatem, jaka jest zawartość pliku nowy_tekst.txt
. Można do tego użyć edytora tekstu, ale na razie pozostańmy przy linii komend. Żeby zobaczyć zawartość pliku tekstowego można użyć kilku komend, np. more
, less
(która o dziwo może więcej niż more
) czy cat
. Dwie pierwsze komendy przy dłuższych plikach są wygodniejsze, pozwalają łatwiej poruszać się po tekście, ostatnia po prostu drukuje zawartość pliku w terminalu. Przy jednolinijkowym pliku jednak nie zauważysz różnicy.
Teraz coś dopiszmy do pliku:
Zauważ, że tym razem użyliśmy operatora >>
. Co się stanie jeśli ponownie użyjemy znaku >
?
Jak widać, użycie pojedynczego znaku >
spowodowało wymazanie poprzedniej zawartości pliku. Trzeba o tym pamiętać, ponieważ łatwo o pomyłkę - możemy chcieć dopisać coś do pliku a przez użycie >
zamiast >>
skasujemy całą poprzednią zawartość. Ma to znaczenie zwłaszcza przy pisaniu skryptów.
Co się stanie jeśli spróbujemy przekierować tekst do nieistniejącego pliku?
Jak widać w powyższym przykładzie nie było konieczne użycie poprzednio komendy touch
. Jeśli plik nie istnieje, jest on tworzony.
Możemy też skierować strumień (danych) z pliku do polecenia, które jest w stanie go przetworzyć, używając znaku <
:
Czas na poznanie pewnego triku. Konsola potrafi nam ułatwić wpisywanie komend podpowiadając to co możemy wpisać. Wystarczy wpisać część komendy lub nazwy pliku a reszta zostaje dopełniona po naciśnięcia klawisza <Tab>
. Na przykład wpiszemy more nie
, naciśniemy <Tab>
, w linii komend pojawi się pełna nazwa pliku. Jeśli istnieje wiele możliwości dopełnienia komendy czy nazwy pliku, zostaną podane istniejące możliwości. Oczywiście plik czy komenda musi istnieć, komputer nie zgadanie co mamy na myśli ;-) Jest to bardzo wygodne zwłaszcza, gdy podajemy jako argumenty nazwy długich plików, które co gorsza niekoniecznie pamiętamy. Aby to sprawdzić stwórz plik plik_o_bardzo_długiej_i_skomplikowanej_nazwie-0001x7q.txt
, umieść w nim jakiś tekst i wyświetl jego zawartość. Jedynie przy pierwszej komendzie będziesz musiał wpisać pełną nazwę pliku.
Teraz spróbujemy skopiować zawartość plików nowy_plik.txt
i nieistniejący_plik.txt
do kolejnego pliku:
Zauważ, że komenda cat
przyjęła jako argumenty dwie nazwy plików a ich zawartość została przez nią skierowana do trzeciego pliku. Podobnie można postępować z wieloma innymi komendami odwołującymi się do plików czy katalogów.
Na razie może to wyglądać na niespecjalnie użyteczne sztuczki, ale niebawem okaże się, że są one bardzo przydatne w bioinformatyce.
Kolejne dwie komendy przydatne w pracy z katalogami i plikami to cp
i mv
.
cp
służy do kopiowania, w przypadku katalogów należy użyć opcji -r
mv
pozwala na zmianę nazwy, bądź przeniesienie plików i katalogów. Flaga -r
jest konieczna dla folderów, które nie są puste:
Znaki wieloznaczności (ang. wildcards) są bardzo pomocne jeśli chcemy jednocześnie dokonać jakichś operacji na wielu plikach albo gdy dokładna nazwa nie musi być podana. Zobaczmy na przykładzie jak to działa:
Wykonaj polecenia:
Przyjrzyj się wynikom komend, zastanów się jakie znaczenie mają znaki *
i ?
.
Sesja powinna wyglądać tak:
Jak widać znak *
oznacza ,,jakakolwiek liczba (także 0) jakichkolwiek znaków'' a znak ?
oznacza ,,jakikolwiek jeden znak''. Można ich używać z wieloma poleceniami operującymi na plikach i katalogach, mają one także dużo szersze zastosowanie o czym będzie jeszcze mowa.
Wiemy już jak utworzyć plik i folder, czas dowiedzieć się jak je usunąć. Do usuwania służy komenda rm
:
Teraz spróbujemy usunąć katalog:
Jak widać tu też trzeba użyć opcji -r
:
Czasem chcemy otworzyć katalog od razu z podkatalogiem, wtedy przy komendzie mkdir
używamy opcji -p
:
Komenda tree
pokazuje zawartość katalogu w formie drzewa (spróbuj tree ~
). Może nie być zainstalowana w systemie, wtedy trzeba ją doinstalować (dla Debiana i pochodnych dystrybucji: sudo apt-get install tree
).
A co jeśli chcemy stworzyć jeszcze kilka podkatalogów za jednym razem?
Wpisz w przeglądarce adres:
http://ggoralski.pl/files/filogenetyka-data/Orobanchaceae-trnL-trnF-aligned.fasta
Pokaże się plik z wyrównanymi sekwencjami w formacie FASTA
(który omawiałem w części teoretycznej w lekcji Podstawy filogenetyki).
Gdybyśmy chcieli pobrać ten plik, można by użyć odpowiedniej opcji z menu przeglądarki pozwalającej zapisać stronę. Ale jest to dobry przykład, żeby poznać sposoby pobierania plików z linii komend. Do najczęściej stosowanych w tym celu programów należą curl
i wget
.
Stwórz katalog Pobieranie
a następnie wykonaj komendę:
W oknie terminala pokaże się zawartość pliku. Jeśli chcemy go zapisać trzeba ją przekierować do pliku:
Sprawdź komendą more
zawartość utworzonego pliku
Teraz użyjemy wget
:
Jak widać jedną z różnic pomiędzy oboma programami jest to, że curl
domyślnie wyświetla zawartość pobieranego pliku w terminalu a wget
zapisuje go pod oryginalną nazwą. O innych różnicach można poczytać np. tu albo w manualach i pomocy (man curl
, man wget
, curl -h
, wget -h
).