Diskløs Debian-maskine

Version 1.0

Thor Dreier

      
      

Fredag d. 28. februar 2003

I denne guide beskrives hvordan man sætter Debian GNU/Linux (Woody) op uden harddisk, men istedet booter over et netværk.

Nyeste version af denne guide kan findes på http://apt-get.dk/howto/diskless/


Indholdsfortegnelse
1. Ophavsret
2. Changelog
3. Introduktion
4. Opsætning af serveren
4.1. Opsætning af DHCP server
4.2. Opsætning af TFTP server
4.3. Opsætning af NFS server
5. Kompilering af Kerne til klienten
6. Lav bootable images
7. Debian installation
8. De sidste konfigurationer

1. Ophavsret

Guiden er udgivet under "Åben dokumentlicens (ÅDL) - version 1.0" som kan læses på http://www.sslug.dk/linuxbog/licens.html. Du har bl.a. herved frit lov til at kopiere dette værk uændret på ethvert medium.


2. Changelog


3. Introduktion

Denne guide fortæller hvordan man sætter en diskløs Debian-maskine op. Selve filsystem m.m. vil ligge på en anden maskine, som bliver mounted over nfs, så man derved kan have en meget lydløs computer.

Hvor man med LTSP kan sætte en x-terminal op der kun kører en X-server og herefter kører alle programmer på en andet maskine, så vil man med denne guide kunne sætte en alm. Debian op (dog uden nogen diske direkte tilsluttet).

Der findes guides der fortæller hvordan man kan få klienten og serveren til at dele den samme Linux installation, dog vil jeg med denne guide vise hvordan man laver en seperat installation, og derved undgå at det fucker når to maskiner skal dele konfigurationsfiler m.m.

I denne guide viser jeg hvordan det skal sættes op hvis både server og klient kører/skal køre Debian GNU/Linux.

Jeg ud fra følgende ting:

Alle kommandoer bliver i denne HOWTO kørt som root. Det kan være være smart at køre mange af tingene som en anden bruger.


4. Opsætning af serveren

Vi starter med at installere en DHCP server, TFTP server, NFS server og værktøjer til at lave images der kan bootes fra netværk:

server:~# apt-get install dhcp tftpd nfs-kernel-server netboot
Jeg har prøvet at bruge nfs-user-server istedet, men den virker ikke ordentligt. Den står bl.a. og hænger meget lang tid under installationen af Debian på klienten (så lang tid at jeg ikke gad lade den blive færdig). Når man bruger nfs-kernel-server bliver man nød til at have kompileret dette med ind i kernen (eller have det loaded som modul).

4.1. Opsætning af DHCP server

Sørg for at /etc/dhcpd.conf ser ud på nogenlunde denne måde:

default-lease-time 21600;
max-lease-time 21600;

option subnet-mask              255.255.0.0;
option broadcast-address        10.0.255.255;
option routers                  10.0.0.1;
option domain-name-servers      10.0.0.2;
option domain-name              "lokal";

shared-network WORKSTATIONS {
        subnet 10.0.0.0 netmask 255.255.0.0 {
        }
}

group   {
        use-host-decl-names             on;
        host diskless {
                hardware ethernet       00:00:00:00:00:00;
                fixed-address           10.0.0.22;
                filename                "/tftpboot/diskless/install";
        }
}
Og genstart DHCP serveren:
server:~# /etc/init.d/dhcp restart

4.2. Opsætning af TFTP server

Sørg for at denne linie findes i /etc/inetd.conf

tftp   dgram  udp   wait   nobody   /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot
Og reload evt. inetd for at ændringen kan tage effekt:
server:~# /etc/init.d/inetd reload

4.3. Opsætning af NFS server

Indsæt følgende linie i /etc/exports:

/home/diskless            10.0.0.22(rw,no_root_squash,sync)
Opret /home/diskless:
server:~# mkdir -p /home/diskless
Og reload NFS serveren:
server:~# /etc/init.d/nfs-kernel-server reload

5. Kompilering af Kerne til klienten

Vi skal nu kompilere kernen der skal bruges af klienten. Det kan være meget smart at lægge kernesovsen under /home/diskless, eller et andet sted der vil bliver mounted på klienten (dette er dog ikke nødvendigt). Lad dog være med at lægge den hvor jeg foreslår hvis du vil mounte /home fra et andet drev.

server:~# mkdir -p /home/diskless/home/kernel
server:~# cd /home/diskless/home/kernel
server:/home/diskless/home/kernel# wget \
http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.bz2
server:/home/diskless/home/kernel# tar -jxvf linux-2.4.20.tar.bz2
server:/home/diskless/home/kernel# cd linux-2.4.20
server:/home/diskless/home/kernel/linux-2.4.20# make menuconfig
Ting der skal kompileres ind i kernen (ikke som modul) for at man kan boote fra Netværk:
CONFIG_IP_PNP
  Networking options --->
    IP: kernel level autoconfiguration

CONFIG_IP_PNP_DHCP
  Networking options --->
    IP: kernel level autoconfiguration --->
      IP: DHCP support

CONFIG_NFS_FS
  File systems --->
    Network File Systems --->
      NFS file system support

CONFIG_NFS_V3
  File systems --->
    Network File Systems --->
      NFS file system support --->
        Provide NFSv3 client support

CONFIG_ROOT_NFS
  File systems --->
    Network File Systems --->
      NFS file system support --->
        Root file system on NFS
Ting der skal kompileres ind i kernen for at Debian-installeren virker (er ikke nødvendige når først Debian er installeret):
CONFIG_BLK_DEV_LOOP
  Block devices --->
    Loopback device support

CONFIG_BLK_DEV_RAM
  Block devices --->
    RAM disk support

CONFIG_BLK_DEV_INITRD
  Block devices --->
    Initial RAM disk (initrd) support

CONFIG_FAT_FS
  File systems --->
    DOS FAT fs support

CONFIG_MSDOS_FS
  File systems --->
    DOS FAT fs support --->
      MSDOS fs support

CONFIG_UMSDOS_FS
  File systems --->
    DOS FAT fs support --->
      MSDOS fs support --->
        UMSDOS: Unix-like file system on top of standard MSDOS fs

CONFIG_EXT2_FS
  File systems --->
    Second extended fs support
Derudover er det vigtigt at dit netkort ikke er valg som modul, men bliver kompileret ind i kernen.

Kompiler nu kernen og kopier filer til de rigtige steder:

server:/home/diskless/home/kernel/linux-2.4.20# make dep && make bzImage && \
make modules && make modules_install INSTALL_MOD_PATH=/home/diskless
server:/home/diskless/home/kernel/linux-2.4.20# mkdir -p /home/diskless/boot
server:/home/diskless/home/kernel/linux-2.4.20# cp System.map \
/home/diskless/boot/System.map-2.4.20
server:/home/diskless/home/kernel/linux-2.4.20# cp arch/i386/boot/bzImage \
/home/diskless/boot/vmlinuz-2.4.20
server:/home/diskless/home/kernel/linux-2.4.20# cp .config \
/home/diskless/boot/config-2.4.20
server:/home/diskless/home/kernel/linux-2.4.20# rm \
/home/diskless/lib/modules/2.4.20/build
server:/home/diskless/home/kernel/linux-2.4.20# ln -s \
/home/kernel/linux-2.4.20 /home/diskless/lib/modules/2.4.20/build

6. Lav bootable images

Hent først Debians installer:

server:~# cd /tmp
server:/tmp# wget http://ftp.uk.debian.org/debian/dists/stable/main/\
disks-i386/current/images-1.44/bf2.4/root.bin
Lav biblioteket hvor vores bootable images skal ligge:
server:/tmp# mkdir -p /tftpboot/diskless
server:/tmp# cd /tftpboot/diskless
Lav install image der skal bruges når Debian skal installeres:
server:/tftpboot/diskless# mknbi-linux -a "ip=dhcp" -r /tmp/root.bin \
/home/diskless/home/kernel/linux-2.4.20/arch/i386/boot/bzImage install
Lav standard image der skal bruges når Debian skal boote normalt op:
server:/tftpboot/diskless# mknbi-linux -a "ip=dhcp \
nfsroot=10.0.0.148:/home/diskless" \
/home/diskless/home/kernel/linux-2.4.20/arch/i386/boot/bzImage standard
Hvis man som jeg ikke har et netkort der kan boote, så kan man på http://www.rom-o-matic.org/ hente et diskette-image der kan gøre tricket. Dette vil dog gøre at din maskine ikke er kan være helt diskløs.

Start nu klienten op så den booter på netkortet. Klienten vil nu prøve at få et ip-nummer vha. DHCP, hvilket den ikke får (medmindre der står en anden DHCP server på netværket) da vi ikke har sat DHCP serveren færdigt op endnu.

Vi skal nu finde ud af hvilken MAC-adresse netkortet i klienten har:

server:~# tail /var/log/daemon.log
Feb 26 04:09:28 server dhcpd: DHCPDISCOVER from 01:23:45:67:89:ab via eth0
Feb 26 04:09:28 server dhcpd: no free leases on subnet WORKSTATIONS
I dette tilfælde har den 01:23:45:67:89:ab. Ændr nu i /etc/dhcpd.conf så linien med "hardware ethernet" har den korrekte MAC-adresse og genstart DHCP serveren:
server:~# /etc/init.d/dhcp restart

7. Debian installation

Hvis du starter klienten nu, så skulle den gerne boote op i Debian-installeren.

Følgende ting skal sættes op:

Vælg Configure the Keyboard for at få sat tastaturet op.

Vi skal nu have mounted NFS drevet, men da Debian installeren ikke har inkluderet lockd, og den som standard ikke mounter med nolock, vil vi mounte drevet via en shell (vælg Execute a Shell i bunden af menuen eller tryk på ALT+F2). Hvis du har tålmodighed kan du godt vælge Initialize a Linux Partition fra menuen, men den vil stå og hænge i lang tid før den kommer videre (et kvarter da jeg prøvede det):

# mount -t nfs -o nolock 10.0.0.148:/home/diskless /target
Da netværket er konfigureret af kernen selv vha. DHCP er der ikke nogen grund til at sætte dette op, men /etc/resolv.conf eksisterer ikke endnu, så den skal vi have lavet. Der findes dog en fil i /proc med det indhold som /etc/hosts skal have, så den skal vi bare have symlinket til:
# ln -s /proc/net/pnp /etc/resolv.conf
Af en eller anden åndsvag grund bliver rescue.bin losset over i en ramdisk der som standard har en blocksize på 1024b, selvom det filsystem der ligger i rescue.bin (FAT 12, tror jeg nok) ikke kan håndtere blocksize på over 512b. Hvis man så tror at man bare kan loade kernen med parameteren "ramdisk_blocksize=512", så tager man fejl. Dette gør godt nok at man får en kerne hvor man kan losse rescue.bin over på en ramdisk og mounte den, men tilgengæld kan den nu ikke finde ud af at mounte root.bin (der hvor Debians installer ligger). Hvis ens kommende root partition ligger på noget andet end nfs, så vil den ikke benytte sig af en ramdisk, men istedet af et loopback device hvor det virker fint nok (jeg fatter ikke hvorfor det er lavet på denne måde i Debians installer - det kunne være at man skulle lave en bug report, jeg har bare ikke gidet endnu). På den følgende måde får vi installeren til at benytte sig af et loopback device istedet for af en ramdisk:
# rm /dev/ram
# ln -s /dev/loop0 /dev/ram
# dd if=/dev/zero of=/ram bs=1k count=1440
# losetup /dev/loop0 /ram
Hop nu tilbage til menuen.

Vælg nu Install Kernel and Driver Modules. Selvom systemet ikke skal bruge denne kerne til noget bliver du nød til at vælge dette punkt da der ellers er nogle ting der ikke bliver sat ordentligt op.

Hvis du har brug for at sætte nogle kernemoduler op skal du vælge Configure Device Driver Modules.

Vælg Configure the Hostname, men lad være med at vælge Configure the Network, da dit netkort allerede er sat op og den bare vil kage i det hvis du prøver at sætte det op endnu engang. Hvis du bare sørger for at konfigurere hostname, så virker 127.0.0.1 når maskinen bliver genstartet.

Vælg Install the Base System for at installere selve systemet.

Lilo skal ikke sættes op da vi booter fra netværket, så nu skal du bare vælge Reboot the System.


8. De sidste konfigurationer

Vi skal nu på serveren have ændret så klienten booter op i den nyligt installerede Debian, istedet for i installeren. Derfor skal vi have ændret i /etc/dhcpd.conf/tftpboot/diskless/install bliver til /tftpboot/diskless/standard, og DHCP serveren skal genstartes:

server:~# /etc/init.d/dhcp restart
Når du nu starter klienten skulle den gerne starte op og gøre installationen færdig.

Når installation er færdig, så log ind som root, da der er en enkelt ting vi mangler at sætte op.

Lilo skal afinstalleres da den ikke kan finde ud af at root filsystemet ikke ligger på et blockdevice:

diskless:~# apt-get remove lilo
Din diskløse Debian skulle nu gerne være sat op. Har du problemer kan du med stor sandsynlighed få hjælp i DebianForum.dk.