Cvičení 1 – Základy Linuxu


Poslední změna: pondělí 9. března 2009

1. Přihlášení do systému

Při zapnutí počítače je potřeba zvolit bootování ze sítě. Po naběhnutí OS se přihlaste svým uživatelským jménem a heslem jako obvykle.

2. Základní koncepty Unixu

2.1. Shell

Shell, neboli příkazová řádka, je základním prostředkem pro komunikaci uživatele a počítače. Linuxový shell má oproti tomu, co bylo v DOSu nebo je nyní ve Windows, mnoho výhod. Je to v podstatě kompletní programovací jazyk.

Po spuštění se shell ohlásí tzv. promptem.

[sojkam1@stud1-186 src]$

Co je zobrazeno v promptu je volitelné a v příkladu výše je uvedeno jméno uživatele (sojkam1), jméno počítače (stud1-186) a název aktuálního adresáře (src). Poslední znak $ oznamuje, že se jedná o normálního uživatele. Pokud by tam byl znak #, je to upozornění, že jste přihlášen jako tzv. superuživatel (root). Viz sekce 2.3 – „Uživatelé“ a 2.4 – „Souborový systém“.

2.1.1. Příkazy

Za promptem může uživatel psát příkazy. Příkaz je název spustitelného souboru. Například příkazem ls se vypíše obsah aktuálního adresáře:

[sojkam1@stud1-186 src]$ ls
linux  linux-2.4  linux-2.4.25  redhat

Příkazům lze předávat různé parametry. Jméno příkazu a jednotlivé parametry se oddělují mezerou. Speciálním typem parametru jsou tzv. přepínače, což jsou (většinou) buď jednopísmenné řetězce začínající znakem - nebo delší slova začínající --.

[sojkam1@stud1-186 src]$ ls -l --reverse linux-2.4.25
total 3848
-rwxr-xr-x    1 root     root      3098440 Feb 25 09:55 vmlinux
-rw-r--r--    1 root     root       563823 Feb 25 09:55 System.map

V tomto příkladu byl spuštěn příkaz ls s přepínači -l a --reverse a parametrem linux-2.4.25.

Přepínače mohou a nemusí mít parametr. Například přepínač -l nemá žádný parametr, ale jak uvidíme dále, překladači jazyka C obvykle předáváme přepínač -o s parametrem, který udává jméno výsledného souboru (-o soubor).

2.1.2. Tabulátorové doplňování

Většina často používaných Unixových příkazů je velmi krátká. Jejich názvy mají dva nebo tři znaky a tak není problém je psát velmi rychle. Občas se ale setkáme s dlouhými názvy příkazů nebo potřebujeme napsat na příkazovou řádku dlouhé jméno souboru. Tabulátorové doplňování vám velmi usnadní život. Začněte psát začátek příkazu nebo jména souboru a stiskněte klávesu Tab. Pokud to, co jste doposud napsali je jedinečné, automaticky se doplní zbytek názvu. V opačném případě se ozve pípnutí a po dalším stisku Tab se objeví seznam všech příkazů nebo jmen souborů, které začínají napsanou sekvencí znaků.

2.2. Dokumentace

2.2.1. Manuálové stránky

V unixových systémech bývá zvykem, že ke všemu existuje dokumentace. Základním typem dokumentace jsou tzv. manuálové stránky. Pro zobrazování manuálových stránek slouží příkaz man[1]. Jako parametr se uvádí jméno příkazu, jméno konfiguračního souboru nebo jméno funkce.

man man
man ls
man strlen

Manuálové stránky jsou děleny do osmi kapitol (sections). Například v kapitole 1 jsou všechny příkazy, v kapitole 2 systémová volání a v kapitole 3 knihovní funkce (více viz např. tato stránka). Pokud zadáme např. man printf, zobrazí se stránka příkazu printf a ne to co pravděpodobně chceme víc – stránka funkce printf. To se dá napravit uvedením čísla kapitoly. Např. man 3 printf.

2.2.2. Info stránky

Manuálové stránky obsahují většinou jen stručný přehled základních informací a jsou určeny spíš pro uživatelé, kteří jsou s příkazem/funkcí již seznámeni. Naproti tomu info stránky (někdy se jim říká TeXinfo dokumentace) obsahují většinou mnohem více informací, jsou hypertextové a jsou koncipovány jako kniha. Základním příkazem pro zobrazení info stánek je příkaz info, ale jeho ovládání není příliš intuitivní. Lepší je používat program pinfo.

[sojkam1@stud1-186 src]$ pinfo gcc

Po jednotlivých odkazech ve stránkách se člověk pohybuje pomocí kurzorových kláves.

Z grafických programů lze info (i man) stránky prohlížet například v konqueroru. Do řádky s adresou stačí napsat info:gcc.

2.2.3. Ostatní dokumentace

Spousta programů má i další dokumentaci, která bývá umístěna v adresáři /usr/share/doc/<jméno programu>.

2.3. Uživatelé

Unixové systémy důsledně používají koncept uživatelů. Základní myšlenka je ta, že existuje jeden správce systému (root) a obyčejní uživatelé. Root může všechno, kdežto uživatelé mohou dělat jen to, jim root povolí. Většinou mají povoleny všechny činnosti, kterými neohrožují jiné uživatele.

Každý uživatel má tedy jistá práva. Například právo zapisovat do určitých souborů a adresářů. Pokud uživatel spustí nějaký program, tento program má stejná práva jako uživatel, který program spustil.

Každý uživatel je členem alespoň jedné skupiny. Práva lze přidělovat i skupinám a uživatel má pak i práva všech skupin kterých je členem.

2.4. Souborový systém

Souborový systém v Unixu se liší od souborového systému OS Windows zejména v těchto věcech:

  • Rozlišují se velká a malá písmena.

  • Adresáře se oddělují normálním lomítkem (/) a ne zpětným (\).

  • Všechny disky jsou mountovány (připojovány) do jedné adresářové struktury. Neexistují tedy různé disky jako např. C:. Například CD mechanika je přístupná pod /media/cdrom[2]

  • Každý soubor a adresář má svého majitele a skupinu které patří. Rovněž má práva, která udávají co kdo smí se souborem dělat. Jedno z práv je i právo na spouštění programu.

  • Spustitelné soubory mohou mít libovolnou příponu, ale většinou se používá jméno bez přípony. Že je soubor spustitelný se pozná podle práv.

  • Existují tzv. symbolické odkazy.

Pro práci se soubory slouží různé příkazy. Mezi nejpoužívanější patří ls, cd, cp, mv, mkdir apod. Pro pohodlnější práci lze využít souborový manager Midnight commander mc.

3. Programování

Při vývoji programu v jazyce C se postupuje v několika fázích. Nejdříve se napíší zdrojové texty. Ty se pak přeloží překladačem a výsledkem je tzv. objektový soubor. Máme-li více zdrojových textů, získáme i více objektových souborů. Pro vytvoření spustitelného programu je potřeba objektové soubory slinkovat (spojit) linkerem.

V této sekci se stručně seznámíme s jednotlivými částmi popsaného vývojového řetězce. Základní filozofie Unixu říká, že na program má dělat jednu věc a má jí dělat pořádně. Vzájemnou interakcí různých programů se pak dosahuje požadovaných výsledků. Proto nejprve představíme jednotlivé nástroje a pak si povíme o tom jak jejich činnost spojovat.

Leckdy, zejména při vývoji grafických aplikací, je užitečné mít všechny nástroje integrované do jednoho prostředí, tzv. IDE. Hojně používané IDE pro Linux se jmenuje kdevelop, či Eclipse.

3.1. Editory

Zkušení uživatelé Unixu používají většinou editory Emacs nebo vim. Oba editory jsou velmi silné nástroje, ale naučit se je efektivně ovládat není vůbec jednoduché. Začátečníci spíš sáhnou po editorech, které nenabízí tolik možností, ale jejich ovládání je jednodušší. Takovými editory jsou např. joe nebo mcedit (součást Midnight Commanderu). Z grafických editorů jmenujme například kate.

Zkusíme napsat jednoduchý program hello.c, na kterém si v následujících sekcích vysvětlíme jak pracovat s překladačem.

#include <stdio.h>

int main(int argc, char *argv[])
{
	printf("Hello world!\n");
	return 0;
}

3.2. Překladač gcc

Nejjednodušší způsob jak přeložit výše uvedený program je spustit příkaz

[sojkam1@stud1-191 hello]$ gcc -o hello hello.c

Tím spustíme překladač, kterému říkáme, že má přeložit soubor hello.c a výsledek má uložit do souboru hello. Překladači můžeme předávat spoustu parametrů. Ze všech bych zmínil aspoň přepínač -g, který zapne generování ladicích informací a výsledný soubor lze pak snadno ladit a přepínač -Wall, který zapne vypisování všech možných varování při překladu.

3.2.1. Fáze překladu zdrojového kódu

Na obrázku 1 – „Fáze překladu zdrojového kódu v jazyce C“ je znázorněno schéma překladu zdrojového souboru v jazyku C.

Obrázek 1. Fáze překladu zdrojového kódu v jazyce C

Fáze překladu zdrojového kódu v jazyce C

3.3. Program make

V situaci, kdy máme jeden zdrojový soubor není problém spouštět překladač pokaždé ručně. U větších projektů ale máme souborů víc a často různých typů – máme třeba zdrojové kódy v C a v assembleru, dokumentaci v XML a třeba i něco dalšího. Překládat ručně každý soubor zvlášť a ještě k tomu jiným překladačem a spojovat výsledek dohromady je zbytečně velká práce. Proto byl vymyšlen program make. Jeho základní myšlenka je ta, že se popíše jak se překládá který typ souboru a stanoví se které soubory jsou potřeba pro "vyrobení" jiného souboru.

Program make funguje tak, že po spuštění si přečte soubor Makefile, kde jsou zapsána pravidla pro kompilaci a vyvolává postupně překladače tak, jak je potřeba.

V souboru makefile existují čtyři typy řádek:

  • popis závislostí,

  • příkazy pro kompilaci,

  • nastavování proměnných,

  • komentáře.

Nejjednodušší Makefile pro kompilaci programu hello vypadá následovně.

hello: hello.c

Obsahuje pouze jednu řádku s popisem závislostí. Takto zapsaná řádka říká, že pro vytvoření souboru hello je potřeba soubor hello.c. Tomu, co je vlevo od dvojtečky se říká target (cíl) a vše co je napravo jsou takzvané prerekvizity.

Program make má v sobě vestavěna implicitní pravidla, díky nimž ví, jak má provést překlad. Kdyby tato pravidla neexistovala, musel by náš Makefile vypadat takto:

hello: hello.c
	gcc -Wall -o hello hello.c

Na druhé řádce, která začíná tabulátorem, je příkaz, který bude vykonán pokud make usoudí, že je potřeba překompilovat soubor hello.

Implicitní pravidla říkají, jak z jednoho typu souboru vyrobit jiný typ souboru. Tato pravidla jsou většinou definována pomocí proměnných. Chceme-li implicitní pravidlo jen trochu pozměnit, nemusíme ho definovat znova, ale stačí změnit jen hodnoty proměnných, které se v pravidlech používají.

CFLAGS = -g -Wall
CC = m68k-elf-gcc
hello: hello.c

Pomocí proměnné CFLAGS se například určuje, s jakými přepínači má být spouštěn překladač jazyka C. Jak se jmenuje překladač se zase specifikuje v proměnné CC[3].

Pokud chceme překládat větší projekt, bývá zvykem rozšířit Makefile o další targety:

all: hello

clean:
	rm -f hello

hello: hello.c
	gcc -Wall -g -o hello hello.c

O programu make by toho šlo napsat mnohem víc. Jdou pomocí něj překládat i velmi komplikované projekty jako například samotné jádro Linuxu. Dost často ale není potřeba vytvářet složité soubory Makefile ručně. Nástroje jako autoconf či nějaké IDE většinou Makefile generují automaticky.

4. Ladění programů

Při hledání chyby v programu je užitečné mít možnost program ladit. Máte-li program přeložen s ladicími informacemi (přepínač -g), zkuste spustit debugger příkazem ddd hello.

5. Odkazy



[1] Prohlížeč se ukončí stiskem klávesy q.

[2] Toto umístění se může lišit podle použité distribuce. Ve starších distribucích je to například /mnt/cdrom.

[3] V příkladu je uveden překladač pro jiný procesor, tzv. cross-compiler.

Všechny připomínky k předmětu, obsahu stránek, objevené chyby v ukázkových programech apod. adresujte na autory: