Jun 06 2008

Diskless computer

Category: TechnicalRpx @ 15:04

De cand joc WoW am tot avut o problema… voice chatting.

Evident, jucand fara sunet deoarece imi crapa (thank you blizz for your new and “improved” sound system), nu pot folosi voice-chat-ul din joc, asa ca sunt nevoit sa folosesc Ventrilo. Insa pentru a folosi Ventrilo, imi trebuie windows (pe linux cu Alsa imi face figuri din cauza ca driverul nu suporta full duplex shit, plus ca-mi arunca o gramada de ferestre cu erori). Pentru a avea windows, imi trebuie vmware. Pana aici nimic fenomenal, insa, there’s a catch. That catch is…. vmware nu suporta Alsa, ci doar OSS. Suportand doar OSS, imi monopolizeaza placa de sunet, si nu mai am nici muzica, nici notificari de la pidgin, nici notificari de mail (notificari sonore, bineinteles).

In acest caz mi-am propus sa-mi mai fac un calculator (mai modest) pe care sa rulez vmware cu ventrilo. Configuratia e un Pentium III Celeron 950MHz, cu 384MB ram, pe o placa de baza Acorp 6BX81, cu un ATi Rage128, placa de retea Linksys NC100, placa de sunet Crystal CS4235, fara hard disk.

Cum adica “fara hard disk”? Adica acel computer booteaza de pe retea un linux si apoi ruleaza vmware pe el. Ce rost mai avea sa-mi iau un hard de 80GB (ca oricum mai mici nu gasesti nicaieri) doar ca sa folosesc 6GB din el? Cum am facut asta? Citeste mai departe :)

De ce ai nevoie pentru asta?

– O placa de baza care sa aiba in BIOS optiune de “Boot from LAN”. O placa de retea integrata NU este necesara.

Daca nu ai optiunea de “Boot from LAN” (cum e cazul meu) iti va trebui un floppy disk, USB flash (bineinteles, cu suport in BIOS, insa daca nu ai Boot from LAN, ma indoiesc ca va sti sa booteze de pe un flash USB), sau unitate CD. De preferat, pentru simplitate e o placa de baza cu “Boot from LAN”.

– In cazul in care nu ai o placa de retea on-board, iti va trebui o placa de retea PCI care sa stie PXE.

Daca esti unul din “fericitii” posesori ai celei mai raspandite placi de retea din lume, faimosul Realtek RTL8139, te informez ca ai 95% sanse ca aceasta sa nu stie de PXE. Motivul e ca acesteia ii lipseste o componenta (by default), asta fiind si motivul pentru care o gasesti cu 12 RON nou nouta. Insa nu dispera, se poate rectifica problema daca nu vrei sa cumperi alta placa.Voi explica asta mai jos.

– Un server de DHCP, NFS si TFTP

– Ceva skills si tupeu pentru a compila un kernel.

– Evident, toata discutia se invarte in jurul lui Linux. Pentru windows, va trebui sa mai asteptati vreo 20 de ani ca sa ajunga cu tehnologia din urma.

Ok… let’s get dirty.

1. Daca ai o placa de baza fara “Boot from LAN”, atunci poti folosi orice placa de retea fara nici o modificare, cu conditia ca sa ai un floppy disk/USB flash/CD-Rom de pe care sa poti boota. Daca nu te incadrezi aici, treci la punctul 3.

Primul lucru de facut, ia kitul Etherboot de aici. Dezarhiveaza-l.

  • Daca ai floppy, du-te in directorul gpxe/src si executa comanda make bin/gpxe.dsk. Dupa ce a terminat, “arde” imaginea pe o discheta. dd if=bin/gpxe.dsk of=/dev/fd0
  • Daca ai un stick USB, executa make bin/gpxe.usb. Dupa ce a terminat, “arde” imaginea cu dd if=bin/gpxe.usb of=/dev/sdX. Inlocuieste X cu litera specifica device-ului USB.
  • Daca ai un CD, executa make bin/gpxe.iso. Arde apoi imaginea pe un CD cu un utilitar (cdrdao, k3b, nerolinux, etc).

2. Daca ai o placa de baza capabila de “Boot from LAN”, atunci nu mai ai nevoie de discul de la punctul 1. Daca esti norocos si ai o placa on-board sau o placa PCI care nu e Realtek RTL8139, poti sari deja la punctul 3. Daca nu, read on.

Dupa cum ziceam, placile RTL8139 vin cu un mic handicap. Acest handicap consta in lipsa unui EEPROM in care ar trebui stocat softul de boot.

Realtek RTL8139

In imaginea aceasta, in coltul din dreapta sus se poate observa clar un soclu. Acel soclu are rolul de a tine un EEPROM de 64KB.

Daca nu ai soclul, inseamna ca ai modelul RTL8139D care are memoria partajata cu cea a registrilor placii, caz in care poti trece la punctul 3.

Atmel AT29C512

Daca nu, va trebui sa dai o fuga pana la magazinul de electronice si sa cumperi un EEPROM Atmel AT29C512. Acesta e un EEPROM cu capacitatea de 64KB (512KBits), cu 32 de pini. Dupa ce l-ai cumparat, ia si cupleaza-l pe placa, avand grija ca pinul 0 al EEPROM-ului sa coincida cu pinul 0 al soclului (sunt marcate ambele). Daca-l introduci invers, va trebui sa mai dai o tura la magazin.

Dupa ce l-ai montat, descarca kitul de flash-uire de la Realtek. Cauta BootROM Flash Utility aici. Apoi ia kit-ul de la Etherboot (vezi punctul 1 pentru detalii) si in directorul gpxe/src ruleaza make bin/rtl8139.rom. Copie executabilul de la realtek si fisierul rtl8139.rom pe un floppy/CD si apoi booteaza cu Hiren’s Boot CD (sau orice alt cd/floppy sistem cu MS-DOS).

Executa din command prompt rtflash.exe rtl8139.rom. Ar trebui sa arate un progres 0-100% si apoi sa revina la shell. Evident, aceasta procedura trebuie facuta din MS-DOS si cu placa introdusa in calculator. NU executati comanda din windows!

In acest moment, placa voastra va putea boota de pe retea.

3. In acest moment ar trebui sa avem fie o placa de baza cu placa de retea on-board, capabila de Boot from LAN, fie o placa de baza cu Boot from LAN si cu o placa de retea PCI capabila de PXE, fie o placa de baza mai nefericita, cu o placa de retea capabila sau nu de PXE insa cu un floppy/usb/CD de pe care sa bootam.

In orice caz, de acum procedeul e comun.

In continuare vom crea partitia de root pentru client. Pentru asta exista mai multe metode.

  1. Clonarea sistemului deja existent (asta am folosit eu). Cu alte cuvinte, vom copia ad-literam sistemul intr-un director. Pentru asta, vom reporni in single mode pentru a nu avea procese nenecesare pornite si lock-uri pe fisiere. Vom crea un director (de exemplu /nfsroot) si vom copia in el (cu mc sau cp -a) directoarele /bin, /etc, /lib, /usr, /var. Se vor crea (goale) directoarele dev, home, opt, proc, media, sys, tmp. Vor trebui create cateva noduri necesare pentru pornirea sistemului in dev. Cel mai simplu mod este sa le copiem din /dev. Acestea sunt, /dev/console, /dev/zero, /dev/null. Se vor crea directoarele dev/pts si dev/shm. Nu uitati sa editati TOATE setarile unice din /etc. Foarte important e sa editati etc/fstab incat sa monteze partitia de root de pe NFS si setarile de retea astfel incat sa nu ridice sau sa inchida (la reboot/shutdown) interfetele. Acest lucru se poate face simplu pe redhat/centod/fedora prin editarea lui etc/sysconfig/network si setarea lui NETWORKING=no iar pe debian/ubuntu prin stergerea tuturor interfetelor din etc/network/interfaces
  2. A doua metoda implica ceva mai multa munca. Folosind un software de virtualizare (de exemplu VMWare sau Xen) se poate instala un sistem fresh si apoi copia integral intr-un director de pe host. Desi unora li se pare o metoda mai simpla, mie nu mi se pare, mai ales datorita faptului ca trebuie sa instalez si configurez cap-coada un nou sistem.

4. Acum va trebui sa compilam un kernel proaspat care sa stie sa booteze de pe retea si sa monteze partitia de root de pe NFS.

Pentru mai multe informatii in cazul in care nu le ai cu compilatul kernelului, google is your friend.

Esentiale pentru ceea ce facem noi sunt 3 lucruri.

  1. Selectati pentru incluziune in kernel DOAR ceea ce e necesar. Tot ceea ce poate fi pus ca modul, compilati-l ca modul. Totusi, selectati pentru incluziune neaparat driverul la placa de retea!
  2. Selectati pentru incluziune in kernel suportul pentru NFS si optiunea Root file system on NFS. (vezi imaginea)
  3. Selectati pentru incluziune in kernel suportul pentru autoconfigurarea retelei. (vezi a doua imagine).

NFS Optionssnapshot2.png

Driverele pentru ATA/SATA pot fi omise fara nici o problema. La urma urmei, e un client diskless :)

Compilati kernelul. Dupa compilare, va trebui sa instalati modulele. NU rulati make modules_install de pe server. Mai intai dati chroot /nfsroot (sau oricare e directorul cu root-ul pentru client), si apoi dati make modules_install. Evident, sursa pentru kernel va trebui sa fie in acel arbore de directoare :)

La sfarsit, copiati imaginea comprimata a kernel-ului (bzImage) intr-un director. Ne va trebui la urmatorul pas. (de obicei e arch/i386/boot/bzImage sau arch/x86_64/boot/bzImage in functie de arhitectura).

5. Vom trece la partea de server. Presupun ca deja e instalat un server de DHCP, unul de NFS si unul de TFTP (daca nu, instaleaza-le. Daca nu stii cum, vezi pe google).

Urmatoarele variabile vor fi inlocuite cu valorile lor reale:

  • ${SERVERIP} – IP-ul serverului (NFS/TFTP, presupunand ca sunt pe acelasi calculator)
  • ${CLIENTIP} -IP-ul clientului (adica statia fara disc)
  • ${CLIENTMAC} – MAC-ul placii de retea a clientului

Fata de configuratia standard, vor trebui facute niste modificari la setari.

  • dhcpd.conf

– Se va introduce directiva next-server ${SERVERIP}; inainte de declaratiile de host-uri (in acelasi corp in care se declara option routers).

– Se va introduce in declaratia hostului client directiva filename “pxe.0”;

De exemplu:

host diskless_1{
hardware ethernet ${CLIENTMAC};
fixed-address ${CLIENTIP};
filename “pxe.0”;
}
Dupa modificari, da restart la dhcpd.

  • /etc/exports

Se va adauga o linie care sa exporte structura arborescenta pentru client.

/nfsroot ${CLIENTIP}(rw,no_root_squash,async)

no_root_squash va avea ca efect neschimbarea UID-ului root-ului de pe client, iar async va permite operatii asincrone, ceea ce va determina performanta sporita. Dupa modificare, va trebui repornit serverul de NFS.

  • TFTPD

TFTPD e configurat cel mai bine ca sa ruleze cu xinetd. In cazul asta, va trebui modificata directiva disable din /etc/xinetd.d/tftpd, si setata pe no. Restart apoi la xinetd.

TFTPD are ca director implicit /tftpboot. Primul lucru, vom copia in acel director fisierul /usr/lib/syslinux/pxelinux.0 si-l vom redenumi in pxe.0. NU creati symlink-uri! TFTP nu stie sa lucreze cu ele.

Apoi vom crea directorul pxelinux.cfg iar in el vom crea fisierul text default. In el vom scrie:

DEFAULT vmlinuz
TIMEOUT 100
PROMPT 1
LABEL vmlinuz
KERNEL vmlinuz
APPEND ip=dhcp root=/dev/nfs nfsroot=${SERVERIP}:${NFSROOT}

Inlocuiti ${SERVERIP} si ${NFSROOT} cu ip-ul serverului si directorul exportat.

Ultimul lucru de facut, e sa copiem imaginea kernel-ului compilat in /tftpboot si sa-l redenumim in vmlinuz.

6. Test drive

E timpul pentru un test-drive.

Incearca sa bootezi de pe floppy/usb/cd/pxe si vezi cum merge. Teoretic ar trebui sa porneasca ca si cum ar fi local.

7. Probleme

  1. La prompt-ul boot: imi spune ca nu am o imagine valida de kernel
    Solutie: Probabil ai folosit symlink-uri in /tftpboot. Daca nu, atunci vezi sa fie world-readable toate fisierele si ai grija sa nu fi stalcit vreun nume.
  2. Kernelul se plange de optiunea ip  si nu vrea sa-mi ia IP-ul.
    Solutie: Ai uitat sa incluzi optiunea IP: Kernel level autoconfiguration. Vezi la compilarea kernelului.
  3. Dupa ce incarca kernelul, imi moare cu mesajul “Cannot open console”.
    Solutie: Copie nodurile necesare in dev. Vezi la punctul 3.
  4. La pornire/reboot/shutdown imi moare cand porneste/opreste reteaua.
    Solutie: Dezactiveaza din etc toate optiunile pentru configurarea retelei! Nu poti inchide reteaua avand in vedere ca iti trebuie pana in ultimul moment pentru NFS. Vezi la punctul 3.
  5. Nu merge!
    Solutie: Lasa un comentariu. E posibil sa fi omis ceva (eu am pus aici doar scenariile prin care am trecut eu).

8. It works! Felicitari! Poti folosi aceasta masina ca si pe una normala. Poti instala/dezinstala pachete, poti rula interfata grafica, poti face aproape tot ce poti face cu o masina cu disc. Evident, performantele sunt limitate de catre placa de retea si serverul tau, insa pentru majoritatea cazurilor,  e mai mult decat suficient.

3 Responses to “Diskless computer”

  1. shimrut says:

    asta e un fel de a te scarpina la urechea stanga peste cap, cu mana dreapta
    consider ca mai ushor ar fi fost sa instalezi windows :)

  2. Rpx says:

    Well, nu prea.
    Daca mi-as pune windows as pierde extrem de multe avantaje la partea de server.
    Daca vroiam sa-mi pun windows pe al doilea, mai trebuia sa dau bani pe un hard aditional.

  3. shimrut says:

    in cazul in care fol pentru server, e altceva
    mi-a fost lene sa citesc tot articolu’ si am crezut ca e doar un home computer pt necesitatile zilnice :)

Leave a Reply