\chapter{Filesystem Essentials}
In dit hoofdstuk zullen we leren hoe bestanden en bestandssystemen
de baas te worden. Dit is een zeer belangrijk aspect van Linux waar
constant gebruik van wordt gemaakt.

\section{Het Linux Virtuele Bestandssysteem}
\vspace{-12pt}
Alle bestanden zijn onder Linux toegankelijk vanaf een enkel ge\"integreerd
bestandssysteem, genaamd een
\term{Virtueel Bestandssysteem}. De basis van dat systeem wordt de
\term{root} genoemd en deze wordt vaak aangeduid met een slash (/). 
De belangrijkste uiteenzetting van de VFS wordt hieronder weergegeven:
\vspace{-12pt}

\vskip-2truept
\hskip-20truept
\nobreak
\hskip-20truept
\begin{figure}[ht!]
 \includegraphics{images/vfs.gif}
  \caption{Linux Virtueel Filesystem}\label{vfs}
 \end{figure}
\newpage


Van deze directory's zijn de belangrijkste voor Linux de \file{/},
\file{/etc},  \file{/etc/rc.d}, \file{/etc/sysconfig}, \file{/usr},
en \file{/var}, alhoewel \file{/etc/rc.d} en \file{/etc/sysconfig} 
\redhat specifiek zijn in hoe ze zijn georganiseerd.

Hieronder staat een voorbeeld van een directorystructuur die vanaf de
root begint, maar waarin de substructuur \file{/var} ontbreekt.

\begin{figure}[ht!]
\large
\label{standaarddirectorystructuur}
\begin{picture}(148.00,305.00)(0.00,500.00)
\put(9.00,805.00){\line(1,0){29.00}}
\put(26.00,805.00){\line(0,-1){112.00}}
\put(26.00,791.00){\line(1,0){12.00}}
\put(26.00,777.00){\line(1,0){12.00}}
\put(26.00,763.00){\line(1,0){12.00}}
\put(64.50,763.00){\line(1,0){29.00}}
\put(81.50,763.00){\line(0,-1){28.00}}
\put(81.50,749.00){\line(1,0){12.00}}
\put(81.50,735.00){\line(1,0){12.00}}
\put(26.00,735.00){\line(1,0){12.00}}
\put(26.00,721.00){\line(1,0){12.00}}
\put(26.00,707.00){\line(1,0){12.00}}
\put(26.00,693.00){\line(1,0){12.00}}
\put(55.50,693.00){\line(1,0){29.00}}
\put(72.50,693.00){\line(0,-1){168.00}}
\put(72.50,676.00){\line(1,0){12.00}}
\put(72.50,659.00){\line(1,0){12.00}}
\put(72.50,642.00){\line(1,0){12.00}}
\put(72.50,625.00){\line(1,0){12.00}}
\put(72.50,608.00){\line(1,0){12.00}}
\put(72.50,591.00){\line(1,0){12.00}}
\put(72.50,574.00){\line(1,0){12.00}}
\put(107.00,608.00){\line(1,0){29.00}}
\put(124.00,608.00){\line(0,-1){51.00}}
\put(124.00,591.00){\line(1,0){12.00}}
\put(124.00,574.00){\line(1,0){12.00}}
\put(124.00,557.00){\line(1,0){12.00}}
\put(72.50,540.00){\line(1,0){12.00}}
\put(100.50,540.00){\line(1,0){29.00}}
\put(72.50,525.00){\line(1,0){12.00}}
\put(8.50,805.00){\framebox(0,0)[rc]{/}}
\put(39.50,805.00){\framebox(0,0)[lc]{bin}}
\put(39.50,791.00){\makebox(0,0)[lc]{dev}}
\put(39.50,777.00){\makebox(0,0)[lc]{etc}}
\put(39.50,763.00){\makebox(0,0)[lc]{home}}
\put(95.00,763.00){\makebox(0,0)[lc]{mary}}
\put(95.00,749.00){\makebox(0,0)[lc]{jane}}
\put(95.00,735.00){\makebox(0,0)[lc]{joe}}
\put(39.50,735.00){\makebox(0,0)[lc]{lib}}
\put(39.50,721.00){\makebox(0,0)[lc]{proc}}
\put(39.50,707.00){\makebox(0,0)[lc]{tmp}}
\put(39.50,693.00){\makebox(0,0)[lc]{usr}}     
\put(86.00,693.00){\makebox(0,0)[lc]{X11R6}}   
\put(86.00,676.00){\makebox(0,0)[lc]{bin}}      
\put(86.00,659.00){\makebox(0,0)[lc]{etc}}   
\put(86.00,642.00){\makebox(0,0)[lc]{include}}
\put(86.00,625.00){\makebox(0,0)[lc]{lib}}
\put(86.00,608.00){\makebox(0,0)[lc]{local}}
\put(86.00,591.00){\makebox(0,0)[lc]{man}}
\put(86.00,574.00){\makebox(0,0)[lc]{spool}}
\put(137.50,608.00){\makebox(0,0)[lc]{bin}}
\put(137.50,591.00){\makebox(0,0)[lc]{emacs}}
\put(137.50,574.00){\makebox(0,0)[lc]{etc}}
\put(137.50,557.00){\makebox(0,0)[lc]{lib}}
\put(86.00,540.00){\makebox(0,0)[lc]{src}}
\put(130.50,540.00){\makebox(0,0)[lc]{linux}}
\put(86.00,525.00){\makebox(0,0)[lc]{tmp}}
\end{picture}
\caption{Een Linux directorystructuur.}
\end{figure}

\subsection{Oefeningen}

\begin{enumerate}
\item
Voor een moderne Linux versie is het hierboven gegeven structuurdiagram niet
correct. Zoek de verschillen en vergelijk ze met je systeem en schrijf de
resultaten op.
\end{enumerate}

\newpage
\section{Bestandskenmerken}

Laten we eens een directoryweergave van \term{mail} dichterbij bekijken. 
Geef de opdracht \program{ls -agl mail}:

\begin{figure}[h]
\begin{alltt}
\Large
drwxrwxrwx   1 \user  users   33 Dec 20 10:49 mail
\end{alltt}
\vskip-20truept
\small
\hspace{-1.5pt}
\rotate{270}{-file type}\endrotate 
\hspace{4.5pt}
\rotate{270}{-user read}\endrotate 
\hspace{4.5truept}
\rotate{270}{-user write}\endrotate 
\hspace{4.3truept}
\rotate{270}{-user execute}\endrotate 
\hspace{4.5truept}
\rotate{270}{-group read}\endrotate 
\hspace{4.3truept}
\rotate{270}{-group write}\endrotate 
\hspace{4.3truept}
\rotate{270}{-group execute}\endrotate 
\hspace{4.5truept}
\rotate{270}{-other read}\endrotate 
\hspace{4.3truept}
\rotate{270}{-other write}\endrotate 
\hspace{4.5truept}
\rotate{270}{-other execute}\endrotate 
\hspace{26truept}
\rotate{270}{ link number}\endrotate 
\hspace{19truept}
\rotate{270}{ user ID}\endrotate 
\hspace{42truept}
\rotate{270}{ group ID}\endrotate 
\hspace{44truept}
\rotate{270}{ Size}\endrotate 
\hspace{24truept}
\rotate{270}{ Month}\endrotate 
\hspace{22truept}
\rotate{270}{ Day }\endrotate 
\hspace{31truept}
\rotate{270}{ Time }\endrotate 
\hspace{35truept}
\rotate{270}{ File Name }\endrotate 
\vskip55truept
\caption{Unix bestandskenmerken}
\end{figure}


De ingang ervan geeft ons heel veel informatie. De gehele toegang staat
volledig open, dus iedereen kan er gegevens uitlezen, naar schrijven en
vanuit uitvoeren. Het eerst weergegeven kenmerk is het type, in dit geval
een ``d'' voor directory. Bestandskenmerken voor beperkte (gewone type)
bestanden worden weergegeven als een koppelteken (-).

De volgende 9 parameters zijn de \term{bestandspermissies} of 
\term{toegangsparameters}. Onder Unix hebben bestanden 3 sets met ieder
3 toegangsparameters of ``permissies''. De eerste 3 zijn voor de eigenaar,
de tweede 3 voor de groep, en de laatste 3 voor ``ander'' of de ``wereld''.
De permissies zijn \term{read} (r), 
\term{write} (w), en \term{execute} (x). Wanneer je een bestandsweergave
in uitgebreid formaat bekijkt, zul je deze kenmerken zien als (r,w,x) 
of achterwege gelaten en daarvoor in de plaats een ``-". Als de kenmerken
aanwezig zijn, is voor die actie toegang verleend, anders is de toegang
ontzegd.

Andere belangrijke bestandstypen zijn onder andere \idea{symbolische links}
(l), een interne verwijzing naar een ander bestand, en \idea{gewone bestanden}
(-).  In de volgende tabel staat een opsomming van de bij Linux horende
bestandstypen zoals weergegeven door de opdracht \program{find}. 
De permissie voor het gewone bestand wordt door \program{ls} nooit als
een (f) weergegeven maar als een koppelteken (-).


\begin{table}[h!]
\begin{center}
\renewcommand{\arraystretch}{1.5} 
\begin{tabular}{| l | l|}
\hhline
b & block special file \\
c & character special file \\
d & directory \\
l & symbolic link \\
p & named pipe (FIFO) \\
s & socket \\
\hline
\end{tabular}
\caption{Bestandstypen zoals weergegeven door \label{filetypes}}
\end{center}
\end{table}

\newpage
\section{Wijzigen van bestandskenmerken met \program{chmod}}

Een belangrijke taak voor elke Linux gebruiker is het beheren van
bestandskenmerken (permissies) met de opdracht \program{chmod}.
De syntax voor \program{chmod} luidt: 

\begin{alltt}
 \command{chmod} \option{ [-R]  MODUS  BESTAND}
\end{alltt}

waar MODUS een combinatie kan zijn van 3 sets symbolen gescheiden door
komma's:

\begin{alltt}
[ugoa][+ - =][rwx]
 
 u --> user
 g --> group
 o --> others
 a --> all
\end{alltt}

Je kunt permissies toevoegen (+), onttrekken (--), of de modus exact (=) 
instellen.
Voorbeelden:

\begin{alltt}
 chmod u+w   mail   # Voeg schrijfprivileges (w) toe voor de \term{gebruiker}
 chmod u-w   mail   # Verwijder de schrijfprivileges van \term{gebruiker} (u).
 chmod g+w   mail   # Voeg schrijfprivileges toe voor de \term{groep} (g)
 chmod g=r   mail   # Ken alleen leesprivileges toe aan de \term{groep} 
                    # meer niet.
 chmod o+x   mail   # Voeg uitvoerprivileges (x) toe voor alle anderen.
 chmod a+x   mail   # Voeg voor iedereen uitvoerprivileges (x) toe.
 chmod a=xr  mail   # Geef iedereen alleen lees en uitvoerpermissie.
 chmod go-r  mail   # Verwijder leesprivileges voor de \term{groep} en 
                    # \term{anderen}..
 chmod ugo+w mail   # Hetzelfde als \program{chmod a+w mail}
\end{alltt}

MODUS kan ook een \term{octale} representatie zijn die de absolute modus
weergeeft:

\begin{alltt}
  1 = others execute # o=x
  2 = others write   # o=w
  4 = others read    # o=r
 10 = group execute  # g=x
 20 = group write    # g=w
 40 = group read     # g=r
100 = user execute   # u=x
200 = user write     # u=w
400 = user read      # u=r
\end{alltt}

\newpage

De truuk met \term{octal} is dat je de verschillende nummers kunt 
toevoegen om alle verschillende combinaties met privileges te krijgen
zoals in:

\begin{alltt}
  1 = others execute # o=x
+ 2 = others write   # o=w
+ 4 = others read    # o=r
-----------------------------
= 7 = other read, write, en execute = o+rwx
\end{alltt}

\begin{alltt}
 10 = group execute  # g=x
 20 = group write    # g=w
 00 = no group read  # 
100 = user execute   # u=x
000 = no user write  # 
400 = user read      # u=r
-------------------------- voeg deze laatste 6 toe 
530 = u=rx, g=wx
\end{alltt}

\begin{alltt}
chmod 750 mail => chmod  u=rwx,g=rx,u=  mail
chmod 700 mail => chmod  u=rwx,g=,u=    mail
chmod 751 mail => chmod  u=rwx,g=rx,o=x mail
chmod 741 mail => chmod  u=rwx,g=r,o=x  mail
\end{alltt}


\subsection{Oefeningen}

\begin{enumerate}
\item
Voor directory's maakt de execution privilege toegang tot de directory
mogelijk, dus alleen lees- en schrijf (rw) privilege is niet genoeg.
Alleen de execute privilege zal toegang tot een directory toestaan. Probeer
dit uit met

\begin{alltt}
\bash{chmod 600 mail}
\bash{cd mail}
\end{alltt}

Er zijn in feite nog veel meer modi die met de eerste (niet octale)
methode kunnen worden ingesteld. Degenen die we hebben besproken zijn
het belangrijkst. Kijk alsjeblieft in de \program{man} pages van
\program{chmod} en \program{ls}.   

\item 
Zet je maildirectory terug naar een bruikbare modus.

\item
Schrijf de opdracht die je net gebruikte op in zowel octale als
symbolisch modus.

\item
Lees de man pages en leer hoe je de ``set user ID on execution'' (SUID) bit
met \command{chmod} instelt en wat de functie ervan is. Bespreek dit met
je klasgenoten en instructeur. Dit concept is een vereiste voor de LPI
examens.

\end{enumerate}

\newpage
\section{Wijzigen van de eigenaar van een bestand met \program{chown} en \program{chgrp}}

Net zoals je de bestandspermissie kunt wijzigen, kun je ook de
\term{eigenaar} en \term{groep} van een bestand wijzigen. 
\program{chown} doet dit voor je met de syntax:

\vskip10pt
\command{chown} \option{ [-R]  GEBRUIKER[.[GROEP]] BESTAND}
\vskip10pt

Merk op dat \program{chgrp} tegelijkertijd de \term{groep} kan wijzigen
zoals is te zien in de volgende voorbeelden.

\begin{alltt}
\bash{chown johnson mail}         # Sorry, alleen johnson en Root kunnen dat.
chown: mail: Operation not permitted
\rootsh{chown \user.users mail}   # Wijzig eigenaar in \user en groep in \group.
\rootsh{chown \user.bozos mail}   # Wijzig eigenaar in \user en groep in bozos.
chown: mail: Operation not permitted   # Je bent geen deelnemer van de bozos groep!
\rootsh{chown .testers mail}      # Ok, je bent deelnemer van de \term{testers} groep.
\end{alltt}

\program{chgrp} is minder krachtig en niet echt nodig maar moet worden
vermeld. De syntax luidt

\vskip10pt
\command{chgrp}\option{ [-R] GROEP BESTAND}
\vskip10pt

Hier is een voorbeeld.
\begin{alltt}
\bash{chgrp testers mail}   # Hetzelfde als ``\program{chown .testers mail}''
\bash{chgrp users   mail}   # Hetzelfde als ``\program{chown .users  mail}''
\end{alltt}

\subsection{Vragen}
Waarom kan je de eigenaar van bestanden van iemand anders niet wijzigen? 
Wie kan dit wel?

\subsection{Oefeningen}

1. Log in als root en wijzig de eigenaar en groep van een aantal bestanden
in de directory \file{/tmp} directory. Zorg dat je je in \file{/tmp} bevindt
en niet in \file{/home/you/tmp} of een andere lokatie.


\newpage
\section{Devices}

Onder Unix wordt alle hardware voorgesteld door bestanden.
De hardwaredevices zijn fundamenteel anders en komen voor in de
directory \file{/dev}. Devicebestanden maken toegang tot hardwaredevices
direct via de kernel mogelijk.

Deze speciale bestanden hebben \term{major} en \term{minor} nummers die
ze identificeren in de Linux kernel.
\term{Major Device Nummers} geven een bepaalde driver aan voor I/O
redirectie in de kernel,
en \term{Minor Device Numbers} geven een device aan dat door die driver
kan worden benaderd. Een typisch voorbeeld is de harddisk \file{/dev/hda}:

\begin{alltt}
   brw-rw----   1 root     disk       3,   0 May  5  1998 /dev/hda
\end{alltt}

Het heeft als major nummer een 3 en minor nummer 0. De voorafgaande ``b''
geeft aan dat dit een \term{block} device is. De eigenaar ervan is
\root\ en de groep is \term{disk}. 

Geef de opdracht \command{ls -agl /dev} om de major en minor nummers van
typische devices te bekijken.

Hieronder volgt een opsomming van de meest gebruikte devices. Merk op dat
\$N\$ een integer getal voorstelt.


\vspace{22pt}
\renewcommand{\arraystretch}{1.5} 

\begin{table}[htb]
\begin{center}
\begin{tabular}{|| l | c | l ||}
\hhline
{\bf Device Name}  & Type  & {\bf Beschrijving} \\
\hhline
/dev/hda           & B & eerste IDE harddisk \\
\hline
/dev/hdaN          & B & Nde partitie van /dev/hda\\
\hline
/dev/sda           & B & eerste SCSI harddisk\\
\hline
/dev/sda$N$        & B & $N^{de}$ partitie van /dev/sda\\
\hline
/dev/loop0         & B & Eerste loopback device\\
\hline
/dev/console       & C & Systeemconsole\\
\hline
/dev/parport0      & C & eerste parallelle poort \\
\hline
/dev/lp0           & C & eerste printerpoort (LPT1)\\
\hline
/dev/null          & C & Systeemvuilnisbak (Zwarte gat) \\
\hline
/dev/tty$N$        & C & $N^{de}$ virtuele console \\
\hline
/dev/pts/$N$       & C & $N^{th}$ pseudo terminal (dynamisch gecre\"eerd) \\
\hline
/dev/ttyS$N$       & C & $N^{th}$ seri\"ele poort \\
\hline
/dev/psaux         & C & PS/2-style mouse poort     \\
\hline
/dev/mouse         & L & Softlink naar een seri\"ele muis zoals psaux \\
\hline
/dev/printer       & S & lpd lokale socket   \\
\hline
\thickhline
\end{tabular}
\caption{Linux Devices (Zie \ref{filetypes} voor type info)}
\end{center}
\end{table}

\newpage
\file{/dev/null} is een grappig device dat alles tot zich neemt wat je
het voedt, net als een
\idea{zwart gat}, dus je plaats hier niets wat je later terugwilt.
Het is erg handig als je af wilt van ongewilde foutmeldingen, zoals in:

\begin{alltt}
\bash{netscape \gt{&} /dev/null & }
\end{alltt}

We zullen in de volgende sectie leren wat de betekenis is van het voorgaande
voorbeeld.
De opdracht \program{cat} geeft een tekstbestand op de console weer en
de opdracht \program{cp} kopieert het ene naar het andere bestand.
Probeer dit voorbeeld uit:

\begin{alltt}
\bash{cat .cshrc}
\bash{cp .cshrc /dev/null }
\bash{cat /dev/null }
\end{alltt}

De laatste opdracht zou niets moeten produceren.

\subsection{Oefening: Leid de uitvoer van de opdracht \command{top} 
om naar het bestand top.log}

\subsection{Bespreking}
