Verder Terug Inhoud

3. Hoe een Loopback Root Device aan te maken

Nu dat de algemene grondbeginselen zijn uitgelegd, kan de te gebruiken methode voor het aanmaken van het loopback-device worden uiteengezet.

3.1 Benodigdheden

Om het loopback rootdevice aan te maken zijn een aantal dingen benodigd.

Het belangrijkste is de toegang tot een geïnstalleerd Linux-systeem. Dit omdat het loop-device alleen onder Linux kan worden aangemaakt. Dit betekent dat het niet mogelijk is een werkend systeem vanuit het niets te booten. De benodigdheden van het Linux-systeem waar je gebruik van maakt is dat je er een kernel op kunt compileren.

Als het loopback-device éénmaal is aangemaakt, zal het een groot bestand zijn. Ik heb bestanden van 80 MB gebruikt, maar ook al was dit voldoende voor een X-terminal, mogelijk dat het niet genoeg is als je het voor veel meer wilt gebruiken. Dit bestand moet naar de DOS-partitie worden gekopieerd, dus er moet óf van een netwerk, óf van een heleboel diskettes gebruik worden gemaakt.

De benodigde software bestaat uit:

Dit zou voor recente Linux-installaties standaard aanwezig moeten zijn.

3.2 Aanmaken van de Linux Kernel

Ik maakte het loopback-device met Linux-kernel versie 2.0.31, ook andere versies zouden moeten werken, maar op z'n minst moeten de volgende opties opgenomen zijn.

De kernel-opties die je zal moeten activeren zijn:

De eerste twee zijn voor het RAM-diskdevice zelf en voor het initiële ramdisk-device. De volgende is de optie voor het loopback bestandssysteem. De laatste twee bestaan uit de ondersteuning voor het msdos bestandssysteem welke nodig is voor het mounten van de DOS-partitie.

Een kernel compileren zonder modules is de eenvoudigste optie, alhoewel het mogelijk zou moeten zijn als je modules wilt, ik heb het echter niet geprobeerd. Als er modules worden gebruikt, dan zou je ervoor moeten zorgen dat je de bovenstaande opties hebt meegecompileerd en niet als modules.

Mogelijk moet je afhankelijk van de door jouw gebruikte kernel een kernelpatch toepassen. Het is een zeer eenvoudige patch die het je mogelijk maakt het loopback-device als root-bestandssysteem te gebruiken.

Bij 2.0.x kernels moet er in het bestand /init/main.c een enkele regel worden toegevoegd zoals is weergegeven in de hieronder gewijzigde versie. De regel met "loop", 0x0700 is de regel die werd toegevoegd.

static void parse_root_dev(char * line)
{
        int base = 0;
        static struct dev_name_struct {
                const char *name;
                const int num;
        } devices[] = {
                { "nfs",     0x00ff },
                { "loop",    0x0700 },
                { "hda",     0x0300 },

...

                { "sonycd",  0x1800 },
                { NULL, 0 }
        };

...

}

Bij 2.2.x kernels moeten aan het bestand /init/main.c drie regels worden toegevoegd zoals door de gewijzigde versie hieronder wordt getoond. De regel waarin staat "loop", 0x0700 en de regel ervoor en erna zijn degenen die moeten worden toegevoegd.

static struct dev_name_struct {
        const char *name;
        const int num;
} root_dev_names[] __initdata = {
#ifdef CONFIG_ROOT_NFS
        { "nfs",     0x00ff },
#endif
#ifdef CONFIG_BLK_DEV_LOOP
        { "loop",    0x0700 },
#endif
#ifdef CONFIG_BLK_DEV_IDE
        { "hda",     0x0300 },

...

        { "ddv", DDV_MAJOR << 8},
#endif
        { NULL, 0 }
};

Zodra de kernel is geconfigureerd, kan het worden gecompileerd waarmee een bestand zImage wordt geproduceerd (make zImage). Dit bestand zal na de compilatie te vinden zijn in arch/i386/boot/zImage.

3.3 Aanmaken van de Initiële Ramdisk Device

De initiële ramdisk wordt het eenvoudigst van het begin aangemaakt als een loopback-device. Je zal dit als root moeten doen. De commando's die je hiervoor uit zal moeten voeren, staan hieronder. Er wordt vanuit gegaan dat ze vanuit de home-directory van root (/root) worden opgestart.

mkdir /root/initrd
dd if=/dev/zero of=initrd.img bs=1k count=1024
mke2fs -i 1024 -b 1024 -m 5 -F -v initrd.img
mount initrd.img /root/initrd -t ext2 -o loop
cd initrd
[maak de bestanden aan]
cd ..
umount /root/initrd
gzip -c -9 initrd.img > initrdgz.img

Hier zijn een aantal stappen voor, en die kunnen als volgt worden beschreven.

  1. Maak een mountpoint voor de initiële ramdisk (een lege directory).
  2. Maak een leeg bestand van de benodigde grootte aan. Hier heb ik 1024kB gebruikt, mogelijk heb je afhankelijk van de inhoud meer of minder nodig (de grootte is de laatste parameter).
  3. Maak in het lege bestand een ext2 bestandssysteem aan.
  4. Mount het bestand op het mountpoint, dit gebruikt het loopback-device.
  5. Ga naar het gemounte loopback-device.
  6. Maak de benodigde bestanden aan (zie hieronder voor details).
  7. Ga uit het gemounte loopback-device.
  8. Unmount het device.
  9. Maak een comprimeerde versie voor later gebruik.

Inhoud Van De Initiële Ramdisk

De bestanden die je op de ramdisk nodig zult hebben, zijn de minimum vereisten om commando's uit te kunnen voeren.

De initiële ramdisk die ik gebruikte, vind je hieronder. De inhoud kwam uit op 800kB waarbij de overhead van het bestandssysteem is inbegrepen.

total 18
drwxr-xr-x   2 root     root         1024 Jun  2 13:57 bin
drwxr-xr-x   2 root     root         1024 Jun  2 13:47 dev
drwxr-xr-x   2 root     root         1024 May 20 07:43 etc
drwxr-xr-x   2 root     root         1024 May 27 07:57 lib
-rwxr-xr-x   1 root     root          964 Jun  3 08:47 linuxrc
drwxr-xr-x   2 root     root        12288 May 27 08:08 lost+found
drwxr-xr-x   2 root     root         1024 Jun  2 14:16 mnt

./bin:
total 168
-rwxr-xr-x   1 root     root        60880 May 27 07:56 ash
-rwxr-xr-x   1 root     root         5484 May 27 07:56 losetup
-rwsr-xr-x   1 root     root        28216 May 27 07:56 mount
lrwxrwxrwx   1 root     root            3 May 27 08:08 sh -> ash

./dev:
total 0
brw-r--r--   1 root     root       3,   0 May 20 07:43 hda
brw-r--r--   1 root     root       3,   1 May 20 07:43 hda1
brw-r--r--   1 root     root       3,   2 Jun  2 13:46 hda2
brw-r--r--   1 root     root       3,   3 Jun  2 13:46 hda3
brw-r--r--   1 root     root       7,   0 May 20 07:43 loop0
brw-r--r--   1 root     root       7,   1 Jun  2 13:47 loop1
crw-r--r--   1 root     root       1,   3 May 20 07:42 null
crw-r--r--   1 root     root       5,   0 May 20 07:43 tty
crw-r--r--   1 root     root       4,   1 May 20 07:43 tty1
crw-r--r--   1 root     root       1,   5 May 20 07:42 zero

./etc:
total 3
-rw-r--r--   1 root     root         2539 May 20 07:43 ld.so.cache

./lib:
total 649
lrwxrwxrwx   1 root     root           18 May 27 08:08 ld-linux.so.1 -> ld-linux.so.1.7.14
-rwxr-xr-x   1 root     root        21367 May 20 07:44 ld-linux.so.1.7.14
lrwxrwxrwx   1 root     root           14 May 27 08:08 libc.so.5 -> libc.so.5.3.12
-rwxr-xr-x   1 root     root       583795 May 20 07:44 libc.so.5.3.12

./lost+found:
total 0

./mnt:
total 0

De enige complexe stappen hierbij zijn de devices in dev. Gebruik het programma mknod om ze aan te maken, gebruik de bestaande devices in /dev als een template voor het verkrijgen van de benodigde parameters.

Het bestand /linuxrc

Het bestand /linuxrc op de initiële ramdisk is nodig voor alle voorbereidingen zodat het loopback-device voor de root-partitie kan worden gebruikt als 't beëindigt.

Het voorbeeld hieronder probeert /dev/hda1 als een msdos-partitie te mounten en als het daarin slaagt stelt het de bestanden /linux/linuxdsk.img als /dev/loop0 en /linux/linuxswp.img als /dev/loop1 in.

#!/bin/sh

echo INITRD: Probeer /dev/hda1 als msdos te mounten

if /bin/mount -n -t msdos /dev/hda1 /mnt; then

   echo INITRD: Mount OK
   /bin/losetup /dev/loop0 /mnt/linux/linuxdsk.img
   /bin/losetup /dev/loop1 /mnt/linux/linuxswp.img
   exit 0

else

   echo INITRD: Mount mislukt
   exit 1

fi

Het eerste device /dev/loop0 zal het root-device worden en het tweede /dev/loop1 device de swap-space.

Als je waneer je klaar bent als niet-root gebruiker naar de DOS-partitie wilt kunnen schrijven, dan kun je in plaats daarvan gebruik maken van mount -n -t msdos /dev/hda1 /mnt -o uid=0,gid=0,umask=000,quiet. Hiermee zal alle toegang tot de DOS-partitie naar root worden ingedeeld en zullen de permissies dienovereenkomstig worden ingesteld.

3.4 Aanmaken van het Root Device

Het te gebruiken root-device is het bestand linuxdsk.img. Je zal dit op dezelfde wijze, maar dan groter, aan moeten maken zoals de initiële ramdisk werd aangemaakt. Je kunt iedere gewenste Linux-installatie op deze disk installeren.

De eenvoudigste manier zou kunnen zijn om er een bestaande Linux-installatie naar te kopiëren. Een alternatief is er een nieuwe Linux-installatie op te kopiëren.

Ervan uitgaande dat je dit hebt gedaan, zijn er nog een paar kleine wijzigingen nodig.

Het bestand /etc/fstab moet naar de root-partitie en de swap verwijzen door gebruik te maken van de twee loopback-devices die op de initiële ramdisk zijn ingesteld.

/dev/loop0     /      ext2   defaults 1 1
/dev/loop1     swap   swap   defaults 1 1

Dit zal ervoor zorgen dat de kernel niet in de war zal raken waar het root-device is als het echte root-device zal worden gebruikt. Bovendien maakt het 't mogelijk de swap-space op dezelfde manier toe te voegen zoals het gewoonlijk wordt gedaan. Je zou iedere andere verwijzing naar een rootdisk-device of swap-partitie moeten verwijderen.

Als je nadat Linux is opgestart de DOS-partitie wilt kunnen lezen, dan zal je nog een aantal extra wijzigingen moeten maken.

Maak een directory genaamd /initrd aan, hier zal de initiële ramdisk worden gemount zodra het loopback root-bestandssysteem is gemount.

Maak een symbolische link genaamd /DOS aan dat verwijst naar /initrd/mnt waar de echte DOS-partitie zal worden gemount.

Voeg een regel toe aan het rc bestand waarmee de disks worden gemount. Hier zal het commando mount -f -t msdos /dev/hda1 /initrd/mnt worden uitgevoerd, waarmee een 'nep' mount van de DOS-partitie zal worden aangemaakt, waardoor alle programma's (zoals df) zal weten dat de DOS-partitie is gemount en waar het te vinden is. Als je andere opties gebruikte in het bestand /linuxrc dan zou je die ook hier moeten gebruiken.

Een Linux-kernel op dit root-device is niet nodig, aangezien dat reeds eerder is geladen. Als je echter gebruik maakt van modules, dan zou je ze net als anders op dit device in moeten voegen.

3.5 Aanmaken van het Swap Device

Het root-device dat je zal gaan gebruiken, is het bestand linuxswap.img. Het swap-device is zeer eenvoudig aan te maken. Maak een leeg bestand aan zoals dit werd gedaan voor de initiële ramdisk en start dan mkswap linuxswap.img op om het te initialiseren.

De grootte van de swap-space is afhankelijk van wat je van plan bent met het geïnstalleerde systeem, maar ik raad je een hoeveelheid RAM aan tussen 8 MB en de hoeveelheid RAM dat je hebt.

3.6 Aanmaken van de MSDOS-Directory

De bestanden die gebruikt gaan worden, moeten naar de DOS-partitie worden verplaatst.

Dit zijn de bestanden die nodig zijn in de DOS-directory genaamd C:\LINUX:

3.7 Aanmaken van de opstartdiskette

De opstartdiskette die wordt gebruikt is slechts een gewone DOS geformatteerde opstartdiskette.

Deze wordt vanuit DOS met behulp van format a: /s aangemaakt.

Op deze disk zal je een AUTOEXEC.BAT aan moeten maken (als hieronder) en de kernel, gecomprimeerde initiële ramdisk en het uitvoerbare bestand LOADLIN naar moeten kopiëren.

In het bestand AUTOEXEC.BAT hoort slechts de volgende regel voor te komen.

\loadlin \zImage initrd=\initrdgz.img root=/dev/loop0 ro

Hiermee wordt het te gebruiken kernel-image gespecificeerd, de initiële ramdisk-image, het root-device nadat de initiële ramdisk klaar is en dat de root-partitie read-only zal worden gemount.


Verder Terug Inhoud