Home

 

Linux::Bestandssystemen

Naar index

Bestandssystemen Introductie

bouwenOm bestanden op een schijf of partitie te beheren gebruikt het systeem methoden en datastructuren ondergebracht in het bestandssysteem.
Kenmerkend hierbij is dat d.m.v. tabellen het besturingssysteem bijhoudt waar op de schijf de informatie zich fysiek bevindt. Het bestandssysteem kan de bestanden ook van bepaalde eigenschappen voorzien.
Bij het kopiëren van bestanden naar een schijf waarbij geen bestandssysteem gebruikt wordt, gaan alle gegevens die al op de schijf staan verloren. Een bestandssysteem zorgt er namelijk voor dat elk bestand zijn logische plaats op een harde schijf krijgt.

Het Linux bestandssysteem is opgebouwd als een hiërarchiesche boomstructuur en bovenaan staat de rootdirectory. Deze wordt aangegeven door een slash (/).
Alle bestanden endirectories komen onder deze rootdirectory.
De hele bestandsstructuur kan voorkomen op één partitie, maar meestal zal hem om meerdere partities en schijven gaan. Elk van deze partities, schijven en andere storage-devices worden d.m.v. het commando: # mount in het bestandssysteem geïmporteerd.
Zelfs een USB-stick of cd-rom (device) wordt onder Linux gekoppeld aan een directory ergens onder de rootdirectory en wordt dus niet door middel van een driveletter benaderd.

Standaard directories
Linux heeft net als Windows met o.a. Mijn Documenten en Programmabestanden een indeling met standaard directories.
Hieronder volgt een overzicht, hoewel het mogelijk is dat de diverse distributies de nodige verschillen hebben:

pixy pixy
/bin Bevat commando's nodig voor het opstarten van de computer. Gebruikers mogen er meestal gewoon gebruik maken
/sbin Bevat systeembestanden voor het beheer van het systeem. Gebruikers zonder beheersrechten moeten toestemming van de beheerder krijgen om ze te kunnen gebruiken. Verkeerd gebruik zou namelijk ernstige gevolgen kunnen hebben.
/etc Bevat configuratiebestanden, beveiligingsbestanden, de rc.d opstartbestanden en de configuratiebestanden voor programma's zoals bijv. Apache . Ook bijv. de bestanden passwd en shadow met gebruikers gegevens staan hier.
/lib De belangrijkste gedeelde librairy bestanden met programmacode die meerdere programma's kunnen gebruiken.
/dev Hier staan de device bestanden die gebruikt worden om contact te maken met de apparaten (devices) in de computer. Elk apparaat heeft een bestand in de directory /dev waardoor het besturingssysteem het kan benaderen. De Linux-kernel hoeft niet op de hoogte te zijn van een specifiek apparaat om ermee te communiceren, zolang het maar weet wat voor apparaat het is. Enkele voorbeelden: /dev/console: Het beeldscherm dat rechtstreeks aan de computer gekoppeld is. /dev/hd: Device-interface naar IDE-harddisks. De eerste partitie op de masterschijf zal /dev/hda1 heten. /dev/usb: Aparte directory met divice bestanden voor alle USB devices die op het systeem kunnen voorkomen.
/usr Bevat alle zaken en programma's die gerelateerd zijn aan de gebruiker. Vaak op een aparte partitie om te voorkomen dat het rootbestandsysteem volgeschreven wordt. Deze directory heeft belangrijke subdirectories als /usr/bin, /usr/sbin, /usr/lib, /usr/etc, /usr/man, /usr/info en /usr/doc.
/var Bestanden van variabele grootte zoals printopdrachten, e-mail, logs, etc. Bij voorkeur ook weer op aparte partitie.
/home Voor de individuele home directories van de gebruikers gedefiniëerd op het systeem. Ook bij voorkeur op aparte partitie.
/boot Hier staan de bestanden voor het opstarten van Linux, als de kernel. Vaak aparte partitie van 20 Mb als eerste op schijf.
/opt Niet altijd gebruikt. Bedoeld om omvangrijke programma's te scheiden van de kleinere die voorkomen op /usr.
/proc Komt niet voor op de harddisk. Is interface naar de datastructuren gebruikt door de kernel, dus een soort pointer naar een bepaalde locatei in het werkgeheugen van de computer..

Naar index

Bestandssoorten
Naast de device-bestanden in /dev zijn er de 'normale' bestanden, directories en de verschillende links die op een Linux systeem aangemaakt kunnen worden. De gegevens in een bestand kunnen uit van alles bestaan zoals ASCII-tekst, uitvoerbare code of data van wat voor soort dan ook. Hierbij maakt Linux alleen onderscheid tussen uitvoerbare en niet uitvoerbare bestanden.
Gebruik het commando: # file om de inhoudspatronen van bestanden te bekijken, bijv.: # file /etc/passwd resulteert in /etc/passwd: ASCII text

Directories en inodes
Bestanden worden in directories opgeslagen die technisch gesproken ook een soort bestand zijn, namelijk een bestand dat als inhoud een lijst van bestanden bevat met een verwijzing naar de administratie van een bestand. Deze laatste is opgeslagen in inodes.
In de inode van een bestand staat precies beschreven in welke blocks de data van een bestand staan opgeslagen. De inodes op hun beurt staan in een tabel aan het begin van een opslagmedium. Elk medium heeft z'n eigen inode-tabel en boven aan de lijst staat de inode van de rootdirectory van het medium. In de inodes staan nog meer gegevens zoals eigenaar, permissies, datum/tijd laatste wijziging, etc.
Wanneer een proces een bestand wil gebruiken zoekt het systeem eerst op basis van directorie en bestandsnaam naar de inode van het bestand in de inode-tabel.

Voor het zoeken van bijv. /ect/hosts.allow vindt het volgende plaats:
1. Systeem kijkt in de directory / (root) en zoekt het inode-nummer van de subdirectory etc
2. Systeem vindt inode in inode-tabel en leest de informatie uit met fysieke locatie van de directory op de schijf.
3. Op deze fysieke locatie zoekt het systeem het inode-nummer van het bestand hosts.allow
4. Systeem vindt inode in inode-tabel en vindt met informatie in de inode de fysieke locatie (blokken) die het bestand bevatten.

Als gebruiker op een ext2/ext3 bestandssysteem kunnen we de inodeinformatie als volgt bekijken:
1. Vindt inode-nummer met commando: # ls -i /etc/hosts.allow ->resultaat bijv. 311319 /etc/hosts/allow
2. Open met commando: # debugfs de partitie waarop het bestand voorkomt bijv. debugsfs /dev/hda1
3. Geef nu het commando: # stat <311319> en je ziet de volledige administratie van het bestand met onder andere onder de kop BLOCKS een overzicht van de blokken waarin het bestand bewaard wordt.

Naar index

Hard en Symbolic Links
Een link is een verwijzing naar een bestand. Dit kan in Linux op twee manieren, namelijk naar naar de inode van het bestand of de naam van een bestand. Dit zijn respectievelijk een hard en een symbolic link.
Een hard link is een bestandsnaam in een directory die verwijst naar een inode waar ook al een andere bestandsnaam naar verwijst. Dus eigenlijk is het een inode waar twee bestandsnamen aan verbonden zijn en er is ook geen onderscheid tussen origineel en kopie. De gegevensblokken kan het systeem pas vrijgeven als alle links weggegooid zijn. Hardlinks moeten op hetzelfde medium voorkomen als de inode, want elk medium heeft zijn eigen inode-tabel.
Een symbolic link is geen verwijzing naar een inode maar naar een bestandsnaam. Het is niets meer dan een snelkoppeling, maar het voordeel is dat ze ook kunnen verwijzen naar bestanden op een ander medium, mogelijk zelfs op een andere computer.
Als het originele bestand weggegooid wordt is de link onbruikbaar, het verwijst naar iets wat niet meer bestaat.

Met het commando: #ls -l is te achterhalen of we met een symbolic link ( bestandsnaam) of hard link (inode) van doen hebben bijv. in het volgende resultaat:
lrwxrwxrwx 1 root root [..] initrunlvl -> ../var/run/initrunlvl
---x--x--x 2 root root [..] foo

Als het een 'symbolic link' is dan zie je de bestandsnaam waarnaar de link verwijst. Ook is bij de permissies de eerste letter een l.
In geval het een 'hard link' is zoals in de 2e regel dan wordt er na de permissies aangegeven hoeveel bindingen er naar deze inode zijn.

Een link wordt aangemaakt met het commando: # ln
bijvoorbeeld: # ln /etc/passwd, resulteerd in een 'hard link' (verwijzing) naar de inode van /etc/passwd
en # ln -s /etc/passwd levert een 'symbolic link' op naar het bestand /etc/passwd

Voor het verwijderen van beide soorten links wordt het commando: # rm gebruikt. Hierbij wordt alleen de link verwijderd als het een 'symbolic' link is.
Bij een hard link worden ook de gegevens op de inode verwijderd als het de enige link naar de inode is. In het geval er nog meer 'hard links' zijn, wordt alleen de gespecificeerde link ongedaan gemaakt en blijven de gegevens op de inode bestaan.

Naar index

Mount
Om een device zoals een extra harde schijf te gebruiken moet het eerst beschikbaar gesteld worden aan het bestandssysteem door het te koppelen (mounten) aan een directory. Dit kan zelfs gedaan worden voor een device op het netwerk.
Om een device te kunnen mounten moet hiervoor eerst een directory aangemaakt worden. Dit wordt meestal gedaan in de directory /mnt, bijv # mkdir /mnt/cdrom, en daarna commando # mount /dev/sr0 /mnt/cdrom .
Bij het opstarten willen we dat de verschillende devices gemount worden en de argumenten hiervoor staan opgeslagen in het bestand /etc/fstab:

/dev/hda1 / ext2 defaults 1 1
/dev/hda5 swap swap defaults 0 0
/dev/hda2 /home ext3 defaults 0 0
/dev/cdrom /sr0 iso9660 ro 0 0

In de eerste kolom wordt het device of bestandssysteem beschreven dat gemount moet worden, bijv.: /dev/hda1. In de 2e kolom wordt het mount-point of te wel de directory beschreven waar het gemount moet worden. De 3e kolom beschrijft welk type bestandssysteem het betreft. In de 4e kolom staan de opties bij het mounten. De 5e kolom bepaald of een backup van het bestandssysteem gemaakt moet worden. Wordt bijna niet meer gebruikt. De laatste kolom specificeert of met fsck de integriteit gecontroleerd moet worden. Rootsysteem waarde 1 om als eerste gecontroleerd te worden en de rest waarde 2. Of de waarde 0 als er niet gecontroleerd hoeft te worden.

Als er geen gebruik gemaakt wordt van het bestand fstab
moeten de opties als argument meegegeven worden aan het commando # mount. Zie hiervoor ook # man mount. Bijvoorbeeld met de optie -t kan het type bestandssysteem gespecificeerd worden: # mount -t ext3 /dev/hdb1 /mnt/data. Alles wat met commando mount is geactiveerd wordt bijgehouden in het bestand /etc/mtab. Het commando # mount zonder argumenten leest het bestand /etc/mtab uit en laat het op het scherm zien.

Naar index

Unmount en Lazy Unmount
Het deactiveren van een bestandssysteem kan gedaan worden met het commando # umount.
Bijv. voor bovenstaande: # umount /mnt/data, maar ook # umount /dev/hdb1 is hetzelfde.
Dit werkt alleen als het betreffende bestandssysteem niet bezig is. Als we toch een actief systeem willen unmounten gebruiken we de Lazy Unmount.
Voorbeeld: Als we de directory /var op een ander device plaatsen, maken we eerst een copy van /var op het nieuwe device en we noemen het nwvar. Gebruik # cp met optie -a (archive) om te zorgen dat de user en usergroup attributen ongewijzig blijven.
Nu willen we mounten naar de /nwvar directory en hiertoe moeten we dus eerst unmounten van het actieve /var.
Dit werkt lazy met # umount -l /var. Nu kunnen we /var verwijderen of hernoemen naar bijv. /oldvar en vervolgens doen we een rename van nwvar met # mv nwvar var. Pas nu fstab aan voor de nieuwe gewenste mount en reboot.
Zie voor een uitgewerkt voorbeeld in sectie FAQ en oplossingen: Verhuizen van bijvoorbeeld /HOME naar eigen partitie of andere HDD.

Naar index

Onderhoud en Comprimeren

Onderhoud
Om te zorgen dat het systeem op beschadigde bestanden gecontroleerd wordt en of de i-node tabel nog overeenkomt met de inhoud van de disk moet op regelmatige basis het bestandssysteem gecontroleerd worden met het commando # fsck. Zonder interventie doet Linux dit automatisch elke 20e keer dat het systeem opgestart wordt. Het is ook mogelijk dit op de hand te doen, maar wordt ten zeerste afgeraden dit op actieve partities te doen. Het is zelfs onmogelijk dit op een rootpartitie te doen en alle andere partities moet je eerst unmounten. Dit kan eventueel geforceerd worden zoals hiervoor beschreven met een lazy unmount (# umount -l) waarbij het wel belangrijk is onmiddelijk erna het systeem te rebooten.

Compressie en archivering van bestanden
Comprimeren en decomprimeren kan met het programma # gzip. Het nadeel is dat één bestand tegelijk gecomprimeerd kan worden en na comprimeren komt alleen nog het gecomprimeerde bestand voor. Zie # man gzip voor opties. Er is een soortgelijk programma # bzip2 met 10-20% meer compressie. Voor decomprimeren kan ook het commando # gunzip gebruikt worden.
Als er meerdere bestanden tegelijk gecomprimeerd moeten worden is het beter de zgn. Tape ARchieving utility # tar te gebruiken. Hiermee worden de bestanden eerst samengebracht in een archief en één van de opties hierbij is comprimeren. Het commando # tar heeft 3 argumenten nodig; als eerste minstens één van de opties Acdrtux. Het volgende argument is de naam van het device of bestand waarnaar gearchiveerd wordt. Het derde argument is de naam (of namen) van files en/of directories. Het resultaat is een archief met de extentie .tar en dit archief kan dan eventueel gecomprimeerd worden met commando # gzip. Met het commando # tar -cfz wordt met de optie -z het archiveren en compressie in één keer uitgevoerd.
Voorbeeld: # tar -cf ~/test.tar /etc Hierbij is optie -c voor create, dus maak een nieuw archief en optie -f voor de 'filename'.
Dit commando resulteert in een archief in huidige directory met de naam test.tar met daarin alle bestanden in /etc en subdirectories. Dit archief kan nu gecomprimeerd worden met het commando # gzip test.tar met als resultaat het gecomprimeerde bestand test.tar.gz en het gewone archief test.tar bestaat niet meer.
Het uitpakken gaat in omgekeerde volgorde: # gunzip test.tar.gz resulteert in test.tar en daarna wordt het archief uitgepakt met het commando # tar -xf test.tar. De optie -x is voor extract en -f voor filename gevolgd door de naam van het uit te pakken bestand. Als bij het inpakken in het derde argument een directory-naam gespecificeerd wordt met een absolute padnaam dan zal bij het terugzetten van het archief ook hersteld worden naar die directory ongeacht welk huidig pad waaruit het commando gegeven wordt. Wordt er echter bij het inpakken een relatieve padnaam gespecificeerd dan zal bij het uitpakken het archief teruggezet worden met het pad relatief aan de huidige directory van waaruit het commando gegeven wordt.

Naar index

Partitioneren

Partities
Een partitie is een logische ruimte op een harde schijf toegewezen aan een bestandssysteem. Elk bestandssysteem heeft zijn eigen partitie nodig. In de partitietabel wordt het type besturingssyssteem aangegeven en het is niet verstandig om bijvoorbeeld een DOS partitie aan te maken met Linux. Beter is het partities aan te maken met het besturingssysteem dat die partitie moet gebruiken.

In Linux is het standaardprogramma voor het aanmaken fdisk en hiermee wordt ruimte toegewezen aan een bepaald bestandssysteem en het is menu-driven, zie # man fdisk voor opties. In principe wordt fdisk alleen gebruikt bij installatie van een systeem of als later een harddisk wordt toegevoegd, maar kan ook gebruikt worden om later een harddisk opnieuw te (her)indelen. In geval je een 'multiboot-systeem' in wilt richten, is het beter eerst het andere besturingssysteem te installeren. Het Linux fdisk programma zal deze herkennen en zich er naar voegen in tegenstelling tot oa. Windows. Het programma cfdisk functioneert hetzelfde als fdisk maar is cursor-driven.

FDISK wordt gestart met het commando # fdisk met als argument de device die bewerkt moet worden bijv.:
# fdisk /dev/hda
Dit resulteert aan de prompt met:
# Opdracht (m voor hulp):_
En als we hier m intypen volgt een menu met de beschikbare commando's:


FDISK Errormessage met command 'w' op gemounte disk
Nadat met #fdisk wijzigingen aangebracht zijn in partities moet de nieuwe tabel weggeschreven worden naar de schijf met commando 'w'.
Als dit gedaan wordt met een schijf waarvan 1 of meer partities gemount moet blijven (bv. /dev/sda waarvan sda1 met het systeem) dan gaat het wegschrijven welliswaar goed, maar er volgt daarna een error message:

WAARSCHUWING: Opnieuw inlezen van partitietabel mislukt met fout 16: Apparaat of hulpbron is bezig. De kernel gebruikt nog de oude tabel. De nieuwe tabel wordt na opnieuw opstarten gebruikt.

Dit houdt in dat de kernel nog steeds de oude tabel gebruikt waardoor conflicten kunnen onstaan als we gewoon verder gaan met bijvoorbeeld het formatteren van een zojuist nieuw aangemaakte partitie.
In plaats van te re-booten is het beter de kernel te forceren de nieuw weggeschreven tabel opnieuw in te lezen met het commando # partprobe

Command action
a wel/niet opstartbaar instellen
b bsd schijflabel bewerken
c wel/niet dos compatibel instellen
d een partitie verwijderen
l bekende partitiesoorten opsommen
m dit menu weergeven
n een nieuwe partitie toevoegen
o een nieuwe, lege DOS partitietabel maken
p de partitietabel weergeven
q afsluiten zonder wijzigingen op te slaan
s een nieuwe, lege Sun schijflabel maken
t systeem id van partitie wijzigen
u weergave/invoer eenheden wijzigen
v de partitietabel controleren
w tabel naar schijf schrijven en afsluiten
x extra functionaliteit (alleen experts)

Partitioneren voor servers:
Met name op een server is het belangrijk het systeem op een slimme manier in partities in te delen. Dit is sterk afhankelijk van de totale schijfruimte en de soorten bestanden die op de server voorkomen en gekozen locaties door de Linux distributie, bijv. de webpages in de /var partitie of een dedicated /www.

Hier een richtlijn voor een 'gemiddeld systeem':
/boot 20 MB,  swap 512 MB,  / (root) 20 GB,   /usr 20 GB,  /var 30 GB,  /home 10 GB
Zie ook sectie Installeren: Handmatig partitioneren

Naar index

Partitioneren - voorbeeld

Taak: Richt 30 Gb harddisk (2e in systeem) in met 20 GB partitie voor data en 0,5 GB swap space.

1. Start fdisk met commando # fdisk /dev/hdb en verifieer dat ruimte beschikbaar is met menuoptie: p

Command (m for help): p

Disk /dev/hdb:30,7GB
255 heads, 63 sectors, 3.738 cylinders
Units = cylinders of 16.065 * 512 = 8.225.280 bytes

Elke cylinder heeft 255 heads * 63 sectors/head = 6065 sectors
6065 sectors * 512 bytes/sector = 8,23 MB.
Dus 3738 cylinders * 8,23 MB = 30,7 GB

2. De nieuwe partitie moet worden toegevoegd menuoptie: n

Command (m for help):n

Command action
eextended
pprimairy partition (1-4)
p

Partition number (1-4): 1
First Cylinder (1-3738): 1
Last Cylinder or size or sizeM or sizeK (1-3738): 2431

Kies voor p (primaire partitie) behalve als er meer dan 4 partities op dit device moeten.
Geef daarna het gewenste partitienummer aan en op welke cylinder de partitie moet beginnen.
De grootte van de partitie kan op meerdere manieren gegeven worden. Bijvoorbeeld zoals hier gedaan met het cylindernummer (2431*8,23=20 GB).
Maar het kan ook met het een plusteken gevolgd door de grootte, bijv +20000M

Controleer nu resultaat met menuoptie: p

Command (m for help): p

Disk /dev/hdb:30,7GB
255 heads, 63 sectors, 3.738 cylinders
Units = cylinders of 16.065 * 512 = 8.225.280 bytes
DeviceBoot Start End Blocks Id System
/dev/hdb112431 19995 83 Linux
Het systeem heeft de eerste Linux native partitie aangemaakt (System Linux).
De tweede partitie voor de swap wordt hierna op dezelfde manier aangemaakt als primaire partitie, met partitienummer 2, startcylinder 2432 en grootte +500M

Wijzig van de laatst aangemaakte partitie het systeem id naar Linux Swap met menuoptie: t

Command (m for help):t

Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap)
Gebruik menuoptie t: change a partitions system id om de tweede partitie te veranderen naar Linux Swap. Controleer nog een keer met menuoptie p en schrijf het weg met menuoptie w

Naar index

Bestandssysteem aanmaken

Na het aanmaken van een partitie moet deze nog geformatteerd worden voor het gewenste bestandssysteem.
Dit wordt gedaan met het commando:
# mkfs -t fstype device, bijvoorbeeld # mkfs -t ext3 /dev/fd0 zal een diskette formatteren met het ext3 systeem.

Als geen bestandstype ingevoerd wordt zal er geprobeerd worden in /etc/fstab te achterhalen wat voor systeem te gebruiken en anders wordt het default-systeem ext2 gebruikt.

Swap-files of Swap-partities
Om uit te zoeken of er wel 'swap-space' nodig is gebruik dan het commando: # free resulterend in een overzicht van het werkgeheugen dat in gebruik is.
Linux ondersteund twee soorten 'swap-space': swap-files en swap-partities. De voorkeur wordt gegeven aan een toegewijde swap-partitie omdat er dan geen interferentie plaats kan vinden en op de partitie hoeft geen bestandssysteem aangemaakt worden. Data kunnen dus direct benaderd worden zonder dat tabellen geraadplaagd moeten worden, dus het is sneller.

Een swap-partitie moet eerst met commando # fdisk aangemaakt worden met als systeem: 82, Linux swap (zie bovenstaand voorbeeld).
Daarna wordt de partitie klaargemaakt voor gebruik met het commando: # mkswap [-c] device [size-in-blocks]. Door de optie -c wordt de partitie gecontroleerd op bad blocks. Als size-in-blocks niet gespecificeerd is wordt de hele partitie gebruikt. Nu wordt de swap-partitie geactiveerd met het commando: # swapon device, waarbij device de partitie aangeeft bijvoorbeeld /dev/hdb2

Een swap-file wordt verkregen met de volgende stappen:
Maak eerst een bestand aan met het commando: # dd if=/dev/zero of=/swap bs=1024 count=10240
Hierbij kopieert # dd een bestand uit /dev/zero of te wel uit het niets. Hierdoor wordt een EOF (end-of-file) teken in het bestand gezet.
Het argument of=/swap resulteert er in dat het bestand aangemaakt wordt met de naam /swap in de root. Met bs=1024 specificeren we blocks van 1024 bytes en met count=10240 bepalen we dat er 10240 van deze blocks zijn, dus een swap-file van 10 MB.
De file wordt nu klaargemaakt voor gebruik met commando: # mkswap /swap.
Om te zorgen dat voorgaande commando's niet alleen in de cache van het werkgeheugen uitgevoerd zijn geven we het commando: # sync, waardoor alles weggeschreven wordt naar de harde schijf. Tot slot wordt de swap-file geactiveerd met het commando: # swapon /swap

Naar index

Boot proces

Bij het booten van Linux worden de volgende stappen doorlopen:

1 Starten PC
2 BIOS wordt bekeken voor het vinden van de bootdevice
3 MBR op het bootdevice wordt uitgelezen en ook de aanwezige partitie-tabel waarin staat welke partitie 'active' is zodat ook de bootsector van die partitie uitgelezen kan worden voor aanvullende bootcode.
4 De bootcode in de MBR in combinatie met de code in de bootsector van de actieve partitie zal uiteindelijk verwijzen naar een locatie op de harddisk(s) waar zich de secundaire bootloader zoals LILO of GRUB bevindt.
5 Met de bootloader wordt geselecteerd welk OS opgestart moet worden. De bootloader moet altijd in een bootsector staan en dat kan zijn de Master Boot Record (MBR) van het bootdevice, de bootsector van de actieve partitie of van een diskette.

De beste manier om een MBR te repareren is door middel van een universele opstart-CD of -USB met een Linux-installatie in gecomprimeerde vorm.

Naar index

Lilo bootloader

Om LINUX met LILO te starten moet als eerste een configuratiebestand /etc/lilo.conf gemaakt worden. De instellingen in dit bestand worden daarna naar de bootsector weggeschreven met het commando #lilo.
Als daarna een wijziging in het systeem aangebracht wordt is het niet voldoende het bestand lilo.conf aan te passen. De instellingen moeten daarna opnieuw weggeschreven worden naar de bootsector met commando # lilo.
Hieronder een éénvoudig voorbeeld hoe lilo.conf eruit kan zien:
boot=/dev/hda
read only
timeout=100
image=/boot/redhat/vmlinuz
root=/dev/hda3
label=Redhat
other=/dev/hda1
table=/dev/hda
label=Windows


Met de belangrijkste regel boot=/dev/hda wordt bepaald op welke device LILO de bootloader weg moet schrijven, in dit geval dus de MBR.
Read only faciliteert dat het root bestandssyteem eerst read-only gemount wordt zodat fsck zijn werk kan doen tijdens het opstarten.
Met timeout wordt de tijd in seconden gegeven die de user krijgt voor het maken van een keuze. Als die niet gemaakt wordt zal het systeem opstarten met de eerst gespecificeerde menukeuze.
De eerste menukeuze zal in dit geval Redhat zijn, de naam in het menu wordt bepaald door de regel label=.
De regel image=/boot/redhat/vmlinuz geeft de locatie waar de kernel gevonden wordt en root=/dev/hda3 waar de rootdirectory met het besturingssysteem zich bevindt. Hierna volgt een verwijzing voor het opstarten van bijvoorbeeld Windows.
Vervolgens zal het commando # lilo ervoor zorgen dat de benodigde informatie naar de bootsector weggeschreven wordt en daarnaast ook een aantal bestanden worden aangemaakt voor het opstarten die in de directory /boot voorkomen.
boot.nnnn, is een kopie van de oude bootsector voor teugzetten met # lilo -u.
boot.b is de primaire bootloader die LILO gebruikt om te kunnen starten.
map is een bestand met de fysieke locatiedetails van de kernel.
chain.b zal de code bevatten voor het starten van andere besturingssystemen zoals DOS en Windows.

Naar index

Grub bootloader

Naast LILO kan ook GRUB (Grand Unified Bootloader) gebruikt worden voor het opstarten van Linux en ander besturingssytemen. GRUB heeft een aantal voordelen zoals de mogelijkheid van meerdere Windows-versies, elk op hun eigen primaire partitie. Ook kunnen bestanden bekeken worden in een partitie van een ander besturingssysteem zonder dit systeem op te moeten starten. Hiervoor open je een Grub-prompt door commando # grub en geeft dan in de grub-shell bijv. het commando # cat hda6/etc/hosts (zie ook # man grub).
Om GRUB te installeren zijn de volgende stappen nodig:
1. Installatie van de primaire bootloader 'stage1' in een bootsector, bijv. de Master Boot Record (MBR)
2. Installatie van de secundaire bootloader 'stage2'
3. Configuratie van een bootmenu met daarin de op te starten besturingssystemen.

Zie opnieuw # man grub voor details, maar het installatie commando zou als volgt kunnen zijn:
# install (hd0,1) /boot/grub/stage1 (hd0) (hd0,1) /boot/grub/stage2 p (hd0,4) /boot/grub/menu.conf
Het eerste deel verwijst naar het bestand stage1 dat zich bevindt op hda2 (hd0,1) onder /boot/grub/ en dat geïnstalleerd moet worden in de bootsector van hda (hd0). Het tweede deel specificeert de locatie van stage2 in dit geval hda2/boot/grub en het derde deel de locatie waar menu.conf gevonden kan worden.
De plaats van de bootsector ligt nu vast dus geen noodzaak dit nog in het configuratiebestand te vermelden.

GRUB instellingen worden bij elke boot gelezen van het configuratiebestand menu.conf, dus wijzigingen hoeven niet elke keer naar de bootsector worden weggeschreven zoals bij LILO. Dit configuratiebestand kan er als volgt uitzien:
title Redhat Linux
root (hd1,5)
kernel /boot/vmlinuz
boot
title Windows
rootnoverify (hd0,0)
makeactive
chainloader +1
boot

Eerst wordt de titel van het te kiezen besturingssysteem gegeven, gevold door de locatie van het root-bestandssysteem en daarna de vermelding waar de kernel zich bevindt en uitgevoerd door commando boot.

Naar index

LINUX RESCUE

Voor crash recovery kan gebruik gemaakt worden van een opstart-CD of -USBstick met daarop de geïnstalleerde bootloader om deze bootloader in bijv. de MBR te herstellen. Maar hier kan niets mee gedaan worden als de kernel-image of bootbestanden defect zijn.
Als de Linux-PC kan booten van een CD of USB-stick dan zijn er diverse alternatieven voor recovery in de vorm van Live-distibuties beschikbaar zoals:
Knoppix, Trinity Rescue Kit, SystemRescueCd, SuperRescue, etc. Live-distrubuties draaien geheel virtueel in de RAM.
Dan is er ook nog de Linux Rescue Mode. Dit is geen downloadable tool, maar een mode waarbij opgestart wordt met de Linux boot CD van je geïnstalleerde distributie. Hier kan bij het booten van de CD/DVD gekozen worden voor de optie 'rescue'.

Alle bovenstaande (Live) opties verschaffen de mogelijkheid een Linux OS geheel in RAM te booten van CD/DVD of USB zonder gebruik te maken van de systeem drives. In alle gevallen opent Linux met de opdrachtprompt in BASH en worden de nodige tools beschikbaar gesteld. Op deze manier kunnen de de systeemdrives benaderd worden voor reparatie of vervanging.
Ook moet er rekening mee gehouden worden dat de default root nu een tijdelijke in RAM geladen root partitie is en niet de root van het OS bestandssysteem op de harddisk.

Voorbeelden
In de hierna volgende voorbeelden wordt gebruik gemaakt van de setup van mijn mainserver met de volgende indeling:
Partitie Koppelpunt Inhoud
sda1 / /, /boot, /bin, /sbin, /root, /sys, /etc, /dev, /mnt, /tmp, /opt, /proc
sdb1 /home Met o.a. fileserver voor thuisnetwerk PC's en fotodata tbv. Gallery
sda2 /var Met o.a. de webpagina's
sda3 /usr Met de door gebruiker geïnstalleerde modules
sdc1 /vault Backuploacatie van complete server en alle data

Mounten
Om de partities op de hardisk(s) te benaderen moeten deze eerst gemount worden. Als de namen van alle fysieke partities niet bekend zijn kan hiervan een listing opgevraagd worden met commando: # fdisk -l
# mkdir /mnt/sda1
# mount -t ext3 /dev/sda1 /mnt/sda1

Voor het adresseren van bootproblemen en systeemherstel volstaat bovenstaande mount.
Zonodig kunnen aanvullende mounts tot stand gebracht worden bijvoorbeeld om gebruik te kunnen maken van de backupbestanden op sdc1:
# mkdir /mnt/sdc1
# mount -t ext3 /dev/sdc1 /mnt/sdc1

Chroot
Voor het uitvoeren van commando's vanuit correct relatief adres binnen het te herstellen OS wordt het commando 'chroot' gebruikt. De meeste 'bash' commando's bevinden zich in de directories bin en sbin.
Om bijvoorbeeld de LILO bootloader te herstellen geven we het commando:
# chroot /mnt/sda1 /sbin/lilo
Voor herstel van GRUB is dit:
# chroot /mnt/sda1 /sbin/grub-install /dev/sda1
Om een bestand te zoeken:
# chroot /mnt/sda1 /bin/find / -name "grub*"

Herstel root wachtwoord
1. # vi /mnt/sda1/etc/shadow
2. delete het wachtwoord van root en sla bestand op
3. reboot en login als root, laat wachtwoord leeg en druk <enter>
4. # passwd root en voer nieuw wachtwoord in

Herstel van Linux OS uit Backup-tarball
Als een backup van het OS gemaakt is kan deze gebruikt worden om te herstellen van een crash door het OS terug te zetten.
Zie voor het maken van een backupde sectie Server: Scripting and Backupackup: Backupserver script voor de restore-optie de sectie Gebruikersinstructies voor herstel met backups.

1. # ls /mnt/sdc3 (haalt lijst met de backup tarballs)
2. # chroot /mnt/sda1 /bin/tar -xzvf /mnt/sdc1/20130101-system-backup.tar.gz (voert commando uit vanuit de OS-root en pakt daar de system-backup van sdc1 uit)
3. # chroot /mnt/sda1 /sbin/grub-install /dev/sda1 (herstel potentiëel gecorrupteerde Grub bootloader)

Naar index