Diskfrie noder med Gentoo

Michael Andrews  Researcher
Kristian Jerpetjoen  Redaktør
Sven Vermeulen  Reviewer
Xavier Neys  Reviewer
Jesper Brodersen  Oversætter
Arne Mejlholm  Korrektur
Jesper Brodersen  Korrektur

Opdateret 1. juni 2005
The original version of this document was last updated January 25, 2009

1.  Introduktion

Om denne HOWTO

Denne HOWTO vil hjælpe dig med sætte diskfrie arbejdsstationer op, baseret på Gentoo Linux distributionen. Vi prøver at lave det så brugervenligt som muligt, og sørger for Linux-newbien, fordi alle var én på et specifikt tidspunkt :) Da en erfaren bruger sagtens kan samle de mange HOWTOer, som er tilgængelige omkring diskfrie noder og netværk sammenlagt, håber vi at denne vejledning kan lette installationen for alle interesserede brugere, nørd eller ej.

Hvad er en diskfri maskine?

En diskfri maskine er en PC, uden nogen af de normale opstartsenheder, som harddiske, floppydrev eller CDROM-drev. Den diskfrie node starter via et netværk og skal bruge en server, som kan levere det med lagerplads, som en lokal harddisk ville gøre. Fra nu af, kalder vi serveren master, imens vi kalder den diskfrie maskine for slave (det ligger i navnet :). Slave-noden kræver en netværksadapter, som understøtter PXE-opstarti eller Etherboot; tjek Etherboot.org for understøttede lister. De fleste kort understøtter PXE og mange indebygget adaptere på bundkorte vil også virke.

Før du starter

Du bør have Gentoo installeret på din master-node, og nok plads på master til at gemme filsystemer til slave-noderne. Vær også sikker på at du har en grænseflade til Internet separeret fra din lokale/interne forbindelse (LAN).

2.  Opsætning af master og slave

Om kerner

Bemærk: Hvis du vil lave en cluster af dine noder til en openMosix-cluster, vær sikker på at du bruger den patchede kerne til openMosix. Den kan findes i portage under sys-kernel/openmosix-sources. Du burde læse vores openMosix HOWTO for at lære om, hvordan du kompilerer din kerne til openMosix.

Kernen er det software, som sidder imellem dit hardware og alt andet software, som du har hentet på din maskine, er essensen af et kerne baseret operativsystem. Når din computer er startet, vil BIOS udføre instruktioner, som er fundet på et reserveret opstartsplads på din harddisk. Disse instruktioner er typisk en boot-loader, som henter din kerne. Efter at din kerne er blevet hentet, er alle processer håndteret af kernen.

Flere informationer om kerner og kerneopsætning kan du finde ved at kigge på kernel HOWTO (engelsk, dansk version på vej).

Opsætning af masters kerne

Masterens kerne kan være så stor og skræddersyet, som du ville ønske det, men der er få krævede kerne-valgmuligheder, som du skal vælge. Gå ind i din kerne-opsætningsmenu ved at taste:

Kode oversigt 2.1: Redigering af masters kerneopsætning

# cd /usr/src/linux
# make menuconfig

Du burde få et grå og blåt grafisk grænseflade (GUI), som leverer et sikkert alternativ til manuelt redigering af /usr/src/linux/.config filen. Hvis din kerne er funktionsdygtig, så er det måske en god idé at gemme den nuværende opsætningsfil ved at afslutte GUIen og taste:

Kode oversigt 2.2: Backup af masters kerneopsætning

# cp .config .config_working

Gå ind i følgende under-menuer og være sikker på at de viste ting er afkrydset som 'built-in' (og IKKE som moduler). Indstillingerne, som er vist forneden er taget fra 2.6.10 kerneversionen. Hvis du bruger en anden version, så kan teksten eller opstillingen være anderledes. Vær sikker på at du vælger mindst dem vist forneden.

Kode oversigt 2.3: masters kerneindstillinger

Code maturity level options  --->
  [*] Prompt for development and/or incomplete code/drivers

Device Drivers --->
Networking options --->
  <*> Packet socket
  <*> Unix domain sockets
  [*] TCP/IP networking
  [*]   IP: multicasting
    [ ] Network packet filtering (replaces ipchains)
  
File systems --->
  Network File Systems  --->
    <*> NFS server support
    [*]   Provide NFSv3 server support


Hvis du vil have adgang til Internet igennem din masters node og/eller
har en sikker firewall, vær sikker på at tilføje understøttelse til
iptables

  [*] Network packet filtering (replaces ipchains)
  IP: Netfilter Configuration --->
    <*> Connection tracking (required for masq/NAT)
    <*> IP tables support (required for filtering/masq/NAT)

Hvis du ønsker at bruge pakke-filter (packet filtering), kan du tilføje resten af modulerne senere. Vær sikker på at læse Gentoo sikkerhedshåndbog, kapitel omkring Firewall (engelsk) for at sætte dette ordentligt op.

Bemærk: Disse kerneopsætningsindstillinger skulle kun blive tilføjet dine systemspecifikke opsætningsindstillinger og er ikke ment til at erstarte din egen kernes indstillinger fuldstændigt.

Efter at du har genindstillet masters kerne, vil du få brug for at genbygge den:

Kode oversigt 2.4: Genkompilering af masters kerne og moduler

# make && make modules_install
(Vær sikker på at /boot er mountet, før du kopierer til den)
# cp arch/i386/boot/bzImage /boot/bzImage-master
# cp System.map /boot/System.map-master

Tilføj så et punkt for den nye kerne i lilo.conf eller grub.conf, afhængigt af hvilken boot-loader du bruger og lav den nye kerne, valgt som standard. Nu da den nye bzImage er blevet kopieret til dit boot-bibliotek, er alt hvad du skal gøre er, at genstarte systemet for at hente disse nye indstillinger.

Om slaves kerne

Det er anbefalet, at du kompilerer slaves kerne uden nogen moduler, idet at hente og indstille dem via en fjern-kontroleret opstart er svært og en unødvendig process. I tilføjelse af dette, burde slaves kerne være så lille og kompakt som muligt, for at kunne opstarte effektivt fra netværket. Vi skal til at kompilere slaves kerne i det samme sted, som master var opsat.

For at undgå misforståelser og spild af tid, er det sikkert en god idé at lave en backup af masters opsætningsfil ved at taste:

Kode oversigt 2.5: Backup af masters kerneopsætning

# cp /usr/src/linux/.config /usr/src/linux/.config_master

Nu skal vi til at opsætte slaves kerne på den samme måde, som vi opsatte masters kerne. Hvis du vil starte med en ren opsætningsfil, kan du altid genskabe standard /usr/src/linux/.config-filen ved at taste:

Kode oversigt 2.6: Genskabelse af en ren kerneopsætning

# cd /usr/src/linux
# cp .config_master .config

Gå nu ind i opsætningsGUIen ved at taste:

Kode oversigt 2.7: Redigering af slaves kerneopsætning

# cd /usr/src/linux
# make menuconfig

Du vil nok være sikker på at du har valgt de følgende indstillinger som indbygget og IKKE som kerne-moduler:

Kode oversigt 2.8: slaves kerneindstillinger

Code maturity level options  --->
  [*] Prompt for development and/or incomplete code/drivers

 
Device Drivers --->
  [*] Networking support
Networking options --->
  <*> Packet socket
  <*> Unix domain sockets
  [*] TCP/IP networking
  [*]   IP: multicasting
  [*]   IP: kernel level autoconfiguration
  [*]     IP: DHCP support (NEW)


File systems --->
  Network File Systems  --->
    <*> file system support 
    [*]   Provide NFSv3 client support
    [*]   Root file system on NFS

Bemærk: Et alternativ til en DHCP-server er at opsætte en BOOTP-server.

Vigtigt: Det er vigtigt at du tilføjer dit netværksadapter ind i kernen (og ikke som et modul) på noderne. Brug af moduler er dog generelt ikke et problem for diskfrie noder.

Nu mangler slaves kerne at blive kompileret. Du skal være omhyggelig her, idet du ikke ønsker at ødelægge modulerne (hvis nogen) som du har bygget til master:

Bemærk: Hvis du bruger forskellige arkitekturer, bør du nok gemme hver opsætning til .config_arch. Gør det samme med billedfiler: gem dem i /diskless som bzImage_arch.

Kode oversigt 2.9: Kompilering af slaves kerne

# cd /usr/src/linux
# make 

Lav nu et bibliotek på master, som du vil bruge til at indeholde slaves filer og krævede systemfiler. Vi bruger /diskless, men du kan vælge den placering, som du ønsker. Kopiér nu slaves bzImage ind i /diskless biblioteket:

Bemærk: Hvis du bruger forskellige arkitekturer, bør du gemme hver opsætning som .config_arch. Gør det samme med billed-filerne: gem dem i /diskless som bzImage_arch.

Kode oversigt 2.10: Kopiering af slaves kerne

# mkdir /diskless
# cp /usr/src/linux/arch/i386/boot/bzImage /diskless

Opsætning af en slaves indledende filsystem

Masters og slaves filsystemer kan blive fin-indstillet og ændret en del. Lige nu er vi kun interesseret i at få lavet et indledende filsystem med passende opsætningsfiler og mount-punkter. Først skal vi lave et bibliotek inde i /diskless til den første slave. Enhver slave kræver dens eget overordnede filsystem, fordi at dele specifikke systemfiler, kan skabe problemer med rettigheder og at det hele går ned. Du kan kalde de biblioteker alt hvad du ønsker, men vi foreslår at bruge slavernes IP-adresser, idet de er unikke og ikke misledende. Den statiske IP på vores første slave vil være, f.eks. 192.168.1.21:

Kode oversigt 2.11: Oprettelse af et fjernstyret rodbibliotek

# mkdir /diskless/192.168.1.21

Forskellige opsætningsfiler i /etc skal modificeres for at virke på slaven. Kopiér masters /etc-bibliotek ind i din nye slaves rod ved at taste:

Kode oversigt 2.12: Oprettelse af /etc til slaves filsystem

# cp -r /etc /diskless/192.168.1.21/etc

Stadigvæk er filsystemet ikke klart, fordi at den kræver flere mount-punkter og biblioteker. For at oprette dem, tast:

Kode oversigt 2.13: Oprettelse af mount-punkter og biblioteker til slaves filsystem

# mkdir /diskless/192.168.1.21/home
# mkdir /diskless/192.168.1.21/dev
# mkdir /diskless/192.168.1.21/proc
# mkdir /diskless/192.168.1.21/tmp
# mkdir /diskless/192.168.1.21/mnt
# chmod a+w /diskless/192.168.1.21/tmp
# mkdir /diskless/192.168.1.21/mnt/.initd
# mkdir /diskless/192.168.1.21/root
# mkdir /diskless/192.168.1.21/var
# mkdir /diskless/192.168.1.21/var/empty
# mkdir /diskless/192.168.1.21/var/lock
# mkdir /diskless/192.168.1.21/var/log
# mkdir /diskless/192.168.1.21/var/run
# mkdir /diskless/192.168.1.21/var/spool
# mkdir /diskless/192.168.1.21/usr
# mkdir /diskless/192.168.1.21/opt
(Kun for openMosix)
# mkdir /diskless/192.168.1.21/mfs

De fleste af disse "stumper" skulle være forståeligt for dig; Stumper som /dev eller /proc vil være befolket, når slaven starter, de andre vil blive mountet senere. Du skulle også ændre /diskless/192.168.1.21/etc/hostname-filen til at vise værtnavnet til slave. Binære filer, underprogrammer (libs) og andre filer vil blive befolket senere i denne HOWTO lige før du vil prøve at starte slave.

Selvom /dev bliver udfyldt af udev seneres, så bliver du stadig nødt til at lave console indgangen. Hvis du ikke gør dette, så kan det resultere i en "unable to open initial console" fejl.

Kode oversigt 2.14: At lave en konsol indgang til /dev

# mknod /diskless/192.168.1.21/dev/console c 5 1

3.  Opsætning af DHCP-server

Om DHCP-serveren

DHCP står for 'Dynamic Host Configuration Protocol'. DHCP-serveren er den første computer, som slaverne kommunikerer med, når de starter via PXE. Den primære hensigt af DHCP-serveren er at tildele IP-adresser. DHCP-serveren kan tildele IP-adresser, baseret på værtens MAC-adresse. Når en slave har en IP-adresse, vil DHCP-serveren fortælle slaven, hvor den skal få fat i det indledende filsystem og kerne.

Før du starter

Der er flere forskellige ting, som du burde vær sikker på at virker, før du begynder. Tjek først din netværksforbindelse:

Kode oversigt 3.1: Tjek af netværksindstillinger

# ifconfig eth0 enable multicast
# ifconfig -a

Du burde også være sikker på at have en eth0-enhed kørende. Den burde se ud som dette her:

Kode oversigt 3.2: En passende eth0-enhed, som virker

eth0      Link encap:Ethernet  HWaddr 00:E0:83:16:2F:D6
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26460491 errors:0 dropped:0 overruns:2 frame:0
          TX packets:32903198 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:100
          RX bytes:2483502568 (2368.4 Mb)  TX bytes:1411984950 (1346.5 Mb)
          Interrupt:18 Base address:0x1800

Det er vigtigt, at den siger MULTICAST, og hvis den ikke gør dette, så bliver du nødt til at gen-kompilere din kerne til at inkludere multicast-understøttelse.

Installation af DHCP-serveren

Hvis dit netværk ikke allerede har en DHCP-server installeret, så vil du få brug for at installere én:

Kode oversigt 3.3: Installation af dhcp-server

# emerge dhcp

Hvis dit netværk allerede har en DHCP-server installeret, så skal du redigere opsætningsfilen for at få PXE-opstart til at virke korrekt.

Opsætning af DHCP-serveren

Der er kun én opsætningsfil, som du skal redigere før du starter DHCP-serveren: /etc/dhcp/dhcpd.conf. Kopiér og redigér den leverede smagsprøve-fil:

Kode oversigt 3.4: Redigering af dhcp-serverens opsætningsfil

# cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
# nano -w /etc/dhcp/dhcpd.conf

Det generelle layout af filen er indstillet med hensigt og ser ud som følgende:

Kode oversigt 3.5: Smagsprøve af dhcpd.conf layout

# globale muligheder her
ddns-update-style none;
shared-network LOCAL-NET {
# delte netværksmuligheder her
subnet 192.168.1.0 netmask 255.255.255.0 {
    # undernetværksmuligheder her
    host slave{
        # muligheder specifikt for vært her
    }
    group {
        # muligheder specifikt for gruppe her
    }
}
}

shared-network-blokken er valgfri og skulle blive brugt til IPer, som du ønsker at være tildelt, for at tilhøre de samme netværkssteder. Mindst én af subnet skal være erklæret og den valgfrie group-blok tillader dig at gruppere opsætninger imellem punkter. Et godt eksempel på dhcpd.conf ser ud som følgende:

Kode oversigt 3.6: Smagsprøve af dhcpd.conf

# DHCP configuration file for DHCP ISC 3.0
 
ddns-update-style none;
 
# Definition af PXE-specifikke indstillinger
# Code 1: Multicast IP-adresse af boot-filserveren
# Code 2: UDP-port, som en klient burde overvåge til MTFTP-responser
# Code 3: UDP-port, som MTFTP-servere bruger til at lytte for MTFTP-requests
# Code 4: Sekunder, som en klient skal lytte til en aktivitet, før den prøver
#         at starte en ny MTFTP-overførsel
# Code 5: Sekunder, som en klient skal lytte til, før den prøver at genstarte
#         en MTFTP-overførsel
 
option space PXE;
option PXE.mtftp-ip               code 1 = ip-address;
option PXE.mtftp-cport            code 2 = unsigned integer 16;
option PXE.mtftp-sport            code 3 = unsigned integer 16;
option PXE.mtftp-tmout            code 4 = unsigned integer 8;
option PXE.mtftp-delay            code 5 = unsigned integer 8;
option PXE.discovery-control      code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr   code 7 = ip-address;
 
subnet 192.168.1.0 netmask 255.255.255.0 {


  class "pxeclients" {
    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
    option vendor-class-identifier "PXEClient";
    vendor-option-space PXE;
 
    # Mindst én af de salg-specifikke PXE-indstillinger skal være indstillet
    # for at klients opstartsROM kan forstå at vi har en PXE-understøttet
    # server. Vi kan indstille MCAST IP-adressen til 0.0.0.0 for at fortælle
    # opstartsROM at vi ikke kan levere multicast-TFTP (adressen 0.0.0.0 betyder
    # ingen adresse).
 
    option PXE.mtftp-ip 0.0.0.0;
 
    # Dette er navnet på filen, som opstartsROM burde hente.
    filename "pxelinux.0";
    # Dette er navnet på den server, som vi skal få det fra.
    # Brug masters IP
    next-server 192.168.1.1;
  }

# Hvis du bruger etherboot med en ikke-specifik billedfil
class "etherboot" {
    if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
    filename "/diskless/vmlinuz";
    }
}

  pool {
    max-lease-time 86400;
    default-lease-time 86400;
    # Dette forhinder at ulistede maskiner kan få en IP
    deny unknown clients;
  }
 
  host slave21 {
       # Brug slaves MAC-adresse
       hardware ethernet                00:40:63:C2:CA:C9;
       # Giv slave en statisk IP
       fixed-address                    192.168.1.21;
       server-name                      "master";
       # Brug din gateways IP, hvis krævet
       option routers                   192.168.1.1;
       # Brug din DNSs IP, hvis krævet
       option domain-name-servers       192.168.1.1;
       option domain-name               "mydomain.com";
       # Brut slaves værtsnavn
       option host-name                 "slave21";


       # Etherboot og pxe-boot med en mac-specifik billedfil
       option root-path                 "/diskless/192.168.1.21";

       if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
       			filename "/vmlinuz_arch";
	} else if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
			filename "/pxelinux.0";
	}

  }
}

Bemærk: Der er ikke noget der forhindrer brugen af både PXE-boot og Etherboot samtidigt. Den ovenforstående Kode listning er blot et eksempel, hvis du har problemer, så konsulter DHCPd dokomentationen.

IP-adressen efter next-server vil blive spurgt efter et specificeret filename (filnavn). Denne IP-adresse skal være IPen på TFTP-serveren, som normalt er den samme, som masters IP-adresse. filename er relativ til /diskless-biblioteket (dette er til TFTP-serverens specifikke indstillinger, som vil blive dækket senere). Inde i host-blokken specificerer hardware ethernet-indstillingen en MAC-adresse, og fixed-address tildeler en fast IP-adresse til en specifik MAC-adresse. host-name-indstillingen er sikkert en god idé at inkludere og er bare værtsnavnet på en specifik slave. Der er en pæn god man-page om dhcpd.conf med instillinger udover omfanget af denne HOWTO. Du kan læse den, ved at taste:

Kode oversigt 3.7: Læsning af man-pages for dhcpd.conf

# man dhcpd.conf

Start af DHCP-serveren

Før du starter DHCPs initialiseringsscript, så redigér /etc/conf.d/dhcp-filen, så at den ser ud som dette her:

Kode oversigt 3.8: Smagsprøve af /etc/conf.d/dhcp

IFACE="eth0"
# indsæt de andre indstillinger, som er nødvendige

IFACE-variablen er enheden, som du ønsker at køre din DHCP-server på, i dette tilfælde eth0. Tilføjelser af flere punkter til IFACE-variablen kan være brugbart til et komplekse netværkssteder, med flere netværkskorte. For at starte DHCP-serveren, tast:

Kode oversigt 3.9: Start af DHCP-server på master

# /etc/init.d/dhcp start

For at tilføje DHCP-serveren til dit opstartsscript, tast:

Kode oversigt 3.10: Tilføjelse af DHCP-server til masters standard runlevel

# rc-update add dhcp default

Fejlfinding af DHCP-server

For at se at noden starter, kan du tage et kig på /var/log/syslog.log. Hvis denne node starter med succes, vil syslog.log-filen have nogle linjer i bunden, som ser ud som dette:

Kode oversigt 3.11: Smagsprøve af logfil-punkter oprettet af DHCP

DHCPDISCOVER from 00:00:00:00:00:00 via eth0
DHCPOFFER on 192.168.1.21 to 00:00:00:00:00:00 via eth0
DHCPREQUEST for 192.168.1.21 from 00:00:00:00:00:00 via eth0
DHCPACK on 192.168.1.21 to 00:00:00:00:00:00 via eth0

Bemærk: Denne logfil vil også hjælpe dig med at finde slavernes MAC-adresser.

Hvis du får følgende besked, er det sikkert fordi at der er noget galt med opsætningsfilen, men også at DHCP-serveren stadigvæk sender korrekt.

Kode oversigt 3.12: Smagsprøve af en DHCP-serverfejl

no free leases on subnet LOCAL-NET

Hver gang at du ændrer opsætningsfilen, skal du genstarte DHCP-serveren. For at genstarte serveren, tast:

Kode oversigt 3.13: Genstart af DHCP-server på master

# /etc/init.d/dhcpd restart

4.  Opsætning af TFTP-server og PXE Linux boot-loader og/eller Etherboot

Om TFTP-serveren

TFTP står for 'Trivial File Transfer Protocol'. TFTP-serveren vil levere slave med en kerne, og et indledende filsystem. Alle slave-kerner og filsystemer vil blive gemt på TFTP-serveren, så det er sikkert en god idé at lave master til TFTP-serveren.

Installation af TFTP-server

En virkelig anbefalet tftp-server er klar som tftp-hpa pakken. Denne tftp-server er skrevet af SYSLINUX-forfatteren og den virker meget godt sammen med pxelinux. For at installere, bare tast:

Kode oversigt 4.1: Installation af tftp-serveren

# emerge tftp-hpa

Opsætning af TFTP-server

Rediger /etc/conf.d/in.tftpd. Du bør specficere tftproot-folderen med INTFTPD_PATH og hvilketsomhelst kommandolinie-valgmulighed med INTFTPD_OPTS. Det bør se ud som noget lignende dette:

Kode oversigt 4.2: Smagsprøve af /etc/conf.d/in.tftpd

INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"

-l-optionen indikerer at serveren lytter i 'stand alone mode', så den ikke skal køre inetd. -v indikerer at log-/fejl-beskeder skal være verdslige. -s /diskless specificerer roden af din tftp-server.

Start af TFTP-server

For at starte tftp-serveren tast:

Kode oversigt 4.3: Start af master's tftp-server

# /etc/init.d/in.tftpd start

Dette bør starte tftp-serveren med de valgmuligheder, som du specficerede i /etc/conf.d/in.tftpd. Hvis du vil have at denne server bliver automatisk startet ved opstart, tast:

Kode oversigt 4.4: Tilføjelse af tftp-server til masters default run-level

# rc-update add in-tftpd default

Om PXELINUX

Denne sektion er ikke krævet, hvis du kun bruger Etherboot. PXELINUX er en netværksboot-loader, som kan sammenlignes med LILO eller GRUB, og vil være behandlet via TFTP. Det er essentielt et lille sæt af instruktioner, som fortæller klienten, hvor den skal finde sin kerne og indledende filsystem og tillader forskellige kerneopsætninger.

Før vi starter

Du vil få brug for pxelinux.0 filen, som kommer med SYSLINUX-pakken af H. Peter Anvin. Du kan installere denne pakke ved at taste:

Kode oversigt 4.5: Installation af syslinux

# emerge syslinux

Opsætning af PXELINUX

Bemærk: Dette er ikke nødvendigt til Etherboot.

Før du starter din TFTP-server, skal du indstille pxelinux. Du skal først kopiere pxelinux-binærfilen ind i dit /diskless-bibliotek:

Kode oversigt 4.6: Indstilling af en fjernstyret boot-loader

# cp /usr/lib/syslinux/pxelinux.0 /diskless
# mkdir /diskless/pxelinux.cfg
# touch /diskless/pxelinux.cfg/default

Dette vil oprette en standard boot-loader opsætningsfil. Den binære pxelinux.0 vil kigge i pxelinux.cfg-biblioteket efter en fil, hvis navn er klientens IP-adresse i hexadecimal. Hvis den ikke finder denne fil, vil den slette det højre ciffer fra samme filnavn og prøve igen, indtil den ikke har flere cifre at bruge. Version 2.05 og senere udgaver af syslinux laver først en søgning efter en fil navngivet efter MAC addressen. Hvis den ikke finder nogen fil, så starter den med den førnævnte opdagelsesmetode. Hvis ingen fil er fundet, vil den bruge default-filen.

Kode oversigt 4.7: Filer som PXE kigger efter i pxelinux.cfg/ i rækkefølge

(Er første ciffer 01, betyder det Ethernet, de efterfølgende bytes passer til vores slaves MAC-adresse)
01-00-40-63-c2-ca-c9

(Tildelt IP i hexadecimal)
C0A80115
C0A8011
C0A801
C0A80
C0A8
C0A
C0
C

default

Bemærk: Disse er alle med små bogstaver.

Lad os starte med default-filen:

Kode oversigt 4.8: Smagsprøve af pxelinux.cfg/default

DEFAULT /bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21

DEFAULT-taggen dirigerer pxelinux til kernens bzImage, som vi har kompileret tidligere. APPEND-taggen tildeler kernens intialiseringsopsætning. Siden vi har kompileret slaves kerne med NFS_ROOT_SUPPORT vil vi specificere nfsroot her. Den første IP er masters IP, og det andet IP er biblioteket, som var oprettet i /diskless til at gemme slaves indledende filsystem.

Om Etherboot

Bemærk: Dette er ikke krævet, hvis du bruger PXE-boot.

Etherboot opstarter netværks-opstartsbilledfiler fra en TFTP-server. Som PXEen, er dette sammenlignelig med LILO eller GRUB. mknbi-værktøjet sørger for at du kan oprette forskellige billedfiler, som bruger forskellige valgmuligheder.

Før du starter

Du vil få brug for mknbi-pakken (værktøj til at lave tagged kerne-billedfiler, som er brugbart til netopstart) for at oprette dine Etherboot-billedfiler. Dette værktøj vil oprette en præ-opsat kerne-billedfil fra din originale kerne. Denne indeholder opstarts-valgmulighederne, som er vist længere nede.

Kode oversigt 4.9: Installation af mknbi

# emerge mknbi

Opsætning af Etherboot

I denne sektion vil vi oprette en simpel etherboot-billedfil. Idet DHCP-serveren uddeler klientens rod-sti i "option root-path" dhcp.conf, skal vi ikke tilføje den her. Flere detaljer kan blive fundet i mknbis manual.

Kode oversigt 4.10: mknbi manual

# man mknbi

Oprettelse af opstart-billedfiler. Dette vil oprette en ELF opstartbar billedfil, som kan tilføje DHCP og rod-stien til kernen. Den tvinger også kernen til at browse netværket for en DHCP-server.

Kode oversigt 4.11: Oprettelse af netopstart-billedfiler

# mkelf-linux -ip=dhcp /diskless/bzImage > /diskless/vmlinuz 

Bemærk: Til arkitektur-specifikke billedfiler, skal du indtaste bzImage_arch og vmlinuz_arch.

Fejlfinding af netværksopstartsprocessen

Der er få ting, som du kan gøre for at kigge på netværksopstartsprocessen. Primært kan du bruge et værktøj, kaldet tcpdump. For at installere tcpdump, tast:

Kode oversigt 4.12: Installation af tcpdump

# emerge tcpdump

Du kan nu lytte til forskelligt netværkstrafik og vurdere at din klient/server-interaktion er funktionelt. Hvis noget ikke virker, er der få ting, som du måske skulle kigge efter. Først, vær sikker på at klient/server er fysisk forbundet ordentligt, og at netværkskabler ikker er ødelagte. Hvis din klient/server ikke modtager 'requests' på en specifik port, vær sikker på at der ikke er nogen firewall-afbrydelser. For at lytte til interaktionen imellem to computere, tast:

Kode oversigt 4.13: Lytte til klient- og server-interaktion via tcpdump

# tcpdump host client_ip og server_ip

Du kan også bruge tcpdump til at lytte til en specifik port, som f.eks. tftp-porten, ved at taste:

Kode oversigt 4.14: Lytte til tftp-server

# tcpdump port 69

EN typisk fejl, som du vil modtage, er: "PXE-E32: TFTP open time-out". Det er sikkert pga. fireware-problemer. Hvis du bruger TCPwrappers, burde du måske tjekke /etc/hosts.allow og etc/hosts.deny og sørge for at de er opsat ordentligt. Klienten burde være tilladt til at forbinde til serveren.

5.  Opsætning af NFS-serveren

Om NFS-serveren

NFS står for 'Network File System'. NFS-serveren vil blive brugt til at behandle biblioteker til slave. Disse kan blive personlige senere, men lige nu, er alt hvad vi vil, er at få en indlendende slave-node til at starte diskfrit.

Om Portmapper

Forskellige klient/server-tjenester lytter ikke til en specifik port, men stoler i stedet for på RPCer (Remote Procedure Calls). Når denne tjeneste er startet, vil den lytte på en hvilkensomhelst port og så registrere denne port med Portmapper-værktøjet. NFS stoler på RPCer og derfor kræver den Portmapper er startet, før den er startet.

Før du starter

NFS-serveren kræver kernens level-understøttelse, så hvis du ikke har dette, skulle du genkompilere din masters kerne. For at dobbelt-tjekke din masters kerne-opsætning, tast:

Kode oversigt 5.1: Tjek af NFS-specifik opsætning

# grep NFS /usr/src/linux/.config_master

Du burde se et output, som ser ud som dette, hvis din kerne er blevet sat ordentligt op:

Kode oversigt 5.2: Ordentlig NFS-specifik opsætning i masters kerneopsætning

CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETFILTER is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_NFS_V4 is not set
# CONFIG_NFS_DIRECTIO is not set
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_V4 is not set
# CONFIG_NFSD_TCP is not set

Installation af NFS-serveren

NFS-pakken kan fåes igennem portage, ved at taste:

Kode oversigt 5.3: Installation af nfs-utils

# emerge nfs-utils

Denne pakke vil emerge en portmapping-værktøj, nfs server og nfs-client værktøjer, og vil automatisk ordne initialiseringsafhængigheder.

Opsætning af NFS-serveren

Der er tre store opsætningsfiler, som du skal redigere:

Kode oversigt 5.4: NFS opsætningsfiler

/etc/exports
/diskless/192.168.1.21/etc/fstab
/etc/conf.d/nfs

/etc/exports-filen specificerer hvordan, til hvem og hvad at eksportere igennem NFS. Slaves fstab vil blive ændret sådan, at den kan mounte NFS-filsystemer, som master eksporterer.

En typisk /etc/exports til master, skulle se ud lige som dette:

Kode oversigt 5.5: Smagsprøve af masters /etc/exports

# En linie som denne til hver slave
/diskless/192.168.1.21   192.168.1.21(sync,rw,no_root_squash,no_all_squash)
# Fælles for alle slaver
/opt   192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/usr   192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/home  192.168.1.0/24(sync,rw,no_root_squash,no_all_squash)
# Hvis du vil have en delt log
/var/log   192.168.1.21(sync,rw,no_root_squash,no_all_squash)

Det første felt indikerer biblioteket, som bliver eksporteret og det næste felt indikerer til hvem og hvordan. Dette felt kan blive delt i to dele: hvem bør have tilladelse til at mounte det specifikke bibliotek og hvad den mountede klient kan gøre med filsystemet: ro for 'read only', rw for 'read/write'; no_root_squash og no_all_squash er vigtige til diskfri klienter, som skriver til disken, så de ikke bliver "smadret", når de laver 'I/O requests'. Slaves fstab-fil, /diskless/192.168.1.21/etc/fstab, bør se ud som dette:

Kode oversigt 5.6: Smagsprøve af slaves fstab

# Disse punkter er essentielle
master:/diskless/192.168.1.21   /         nfs     sync,hard,intr,rw,nolock,rsize=8192,wsize=8192    0 0
master:/opt                     /opt      nfs     sync,hard,intr,ro,nolock,rsize=8192,wsize=8192    0 0
master:/usr                     /usr      nfs     sync,hard,intr,ro,nolock,rsize=8192,wsize=8192    0 0
master:/home                    /home     nfs     sync,hard,intr,rw,nolock,rsize=8192,wsize=8192    0 0
none                            /proc     proc    defaults                                     0 0
# Brugbart, men ikke nødvendigt
master:/var/log                 /var/log  nfs     hard,intr,rw                                 0 0

(kun hvis du opsætter en openMosix-cluster)
none                            /mfs      mfs     dfsa=1                                       0 0

I dette eksempel er master kun værtnavnet for master, men det kunne med med lethed være IP for master. Det første felt indikerer biblioteket, som bliver mountet og det andet felt indikerer hvor. Det tredje felt beskriver filsystem og bør være NFS til enhvert NFS-mountet bibliotek. Det fjerde felt indikerer forskellige indstillinger som kan blive brugt til mount-processen (se mount(1) for flere mount-indstillinger). Nogle folk har problemer med 'soft' mount-punkter, så vi laver dem alle 'hard', men du skulle kigge på forskellige /etc/fstab-indstillinger for at gøre din cluster mere effektiv.

Den sidste fil, som du skal redigere er /etc/conf.d/nfs, som beskriver nogle få indstillinger til NFS, når den er startet, og ser ud som følgende:

Kode oversigt 5.7: Smagsprøve af masters /etc/conf.d/nfs

# Config file for /etc/init.d/nfs

# Antal af servere, som skal startes som standard
RPCNFSDCOUNT=8

# Indstillinger til at sende til rpc.mountd
RPCMOUNTDOPTS=""

Du bør ændre RPCNFSDCOUNT til det antal af diskfrie noder på netværket.

Start af NFS-serveren

Du skal starte NFS-serveren med dens init-script, som er placeret i /etc/init.d, ved at taste:

Kode oversigt 5.8: Start af masters NFS-server

# /etc/init.d/nfs start

Hvis du vil have at dette script starter ved opstart, tast følgende:

Kode oversigt 5.9: Tilføjelse af NFS-server til masters standard runlevel

# rc-update add nfs default

6.  Afslutning af slaves filsystem

Kopiering af de manglende filer

Vi vil nu sørge for slaves filsystem er ajour med masters og levere de nødvendige binære filer, imens vi stadigvæk bevarer slaves specifikke filer.

Kode oversigt 6.1: Oprettelse af slaves filsystem

# rsync -avz /bin /diskless/192.168.1.21
# rsync -avz /sbin /diskless/192.168.1.21
# rsync -avz /lib /diskless/192.168.1.21

Bemærk: Begrundelsen for at bruge rsync -avz istedet for cp er for at opretholde symlinks og rettigheder.

Start-scripts

Standard-scripterne vil prøve at køre checkroot, som ikke er logisk for dine slave-noder. Den svære vej er at manuelt redigere /diskless/192.168.1.21/sbin/rc-scriptet, men dette er byrdefuldt, farligt og kunne ødelægge det hele, når du vil ajourføre din nodes filsystem igen og glemmer at lade denne script være. Fidusen er at have en /fastboot-fil, når dit system starter op. Denne fil fortæller checkroot om ikke at køre nogen tjek af filsystem. Men dette vil også slette filen, når den er færdig med programstartsprocessen. Derfor skal vi oprette filen igen i slutningen af programstartsprocessen, som dette:

Kode oversigt 6.2: At forhindre programstartsscripte i at køre et filsystemstjek

(Oprettelse af /fastboot filen til næste genstart)
# touch /diskless/192.168.1.21/fastboot
(Oprettelse af /fastboot filen på enhver opstart)
# echo "touch /fastboot" >> /diskless/192.168.1.21/etc/conf.d/local.start

Da unmounting af netværksfilsystemerne bør ske så sent som muligt, så bliver du nødt til at ændre din /etc/init.d/netmount så den siger:

Kode oversigt 6.3: Et ændre /etc/init.d/netmount

depend() {
   before *

Bemærk: Baselayout version 1.11.* og senere behøves ikke dette.

Hvis du gør dette på et system der er i gang, så glem ikke at køre depscan.sh for at ordne service afhængighederne. Du kan med sikkerhed ignorere enhver advarsel om at den vil kollidere med /etc/init.d/checkroot,da du slår den fra via fastboot filen som du satte op i den forgående paragraf.

Du får brug for mange programstartsscripter under /diskless/192.168.1.21/etc/runlevel, idet du behøver tjenester på dine diskfrie noder. Det afhænger alt efter du vil have dine slaver til at gøre.

Advarsel: Brug ikke rc-update programmet til at tilføje eller fjerne scripter i slaves runlevel'er, når du er logget ind på din master. Dette ville ændre din masters runlevel'er. Du skal oprette henvisninger manuelt eller logge ind til dine slave-noder ved brug af ssh eller tilslutte en skærm og tastatur til din slave.

Kode oversigt 6.4: Typiske slave runlevels

/diskless/192.168.1.21/etc/runlevels/:
total 16
drwxr-xr-x    2 root     root         4096 2003-11-09 15:27 boot
drwxr-xr-x    2 root     root         4096 2003-10-01 21:10 default
drwxr-xr-x    2 root     root         4096 2003-03-13 19:05 nonetwork
drwxr-xr-x    2 root     root         4096 2003-02-23 12:26 single
 
/diskless/192.168.1.21/etc/runlevels/boot:
total 0
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx    1 root     root           23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 hostname -> /etc/init.d/hostname
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 localmount -> /etc/init.d/localmount
lrwxrwxrwx    1 root     root           18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 netmount -> /etc/init.d/netmount
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 portmap -> /etc/init.d/portmap
lrwxrwxrwx    1 root     root           21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin
lrwxrwxrwx    1 root     root           18 2003-10-18 17:28 serial -> /etc/init.d/serial
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 urandom -> /etc/init.d/urandom
 
/diskless/192.168.1.21/etc/runlevels/default:
total 0
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 distccd -> /etc/init.d/distccd
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 metalog -> /etc/init.d/metalog
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 ntp-client -> /etc/init.d/ntp-client
lrwxrwxrwx    1 root     root           16 2003-10-18 17:28 ntpd -> /etc/init.d/ntpd
lrwxrwxrwx    1 root     root           16 2003-10-18 17:28 sshd -> /etc/init.d/sshd
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 vcron -> /etc/init.d/vcron
 
/diskless/192.168.1.21/etc/runlevels/nonetwork:
total 0
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local
 
/diskless/192.168.1.21/etc/runlevels/single:
total 0

Nu er det et godt tidspunkt at starte din slave og krydse dine fingre. Virker det? Tillykke!, du er nu en stolt ejer af (en) diskfri(e) node(r) :)