From mboxrd@z Thu Jan 1 00:00:00 1970
Received: from lists.gentoo.org ([140.105.134.102] helo=robin.gentoo.org)
by nuthatch.gentoo.org with esmtp (Exim 4.60)
(envelope-from
Questo HOWTO intende illustrare la creazione di una rete formata da postazi=
oni
Una postazione diskless =C3=A8 un comune computer sprovvisto delle consuete=
periferiche di avvio quali: dischi fissi, lettori
floppy e lettori di cdrom. La postazione diskless esegue la procedura d'avv=
io tramite la scheda di rete, pertanto =C3=A8 richiesta la presenza di un s=
erver che le fornisca lo spazio fisico su cui salvare i propri dati. D'ora =
in avanti ci riferiremo al server con il termine di
Sul PC master dovrebbe essere installato Gentoo Linux e dovrebbe esserci ab=
bastanza spazio libero per contenere
anche l'intero file system degli slave. Inoltre =C3=A8 necessario controlla=
re d'avere due schede di rete sul pc master, una collegata ad internet e l'=
altra collegata alla rete locale.
Il kernel =C3=A8 il cuore del sistema operativo, =C3=A8 un programma che pe=
rmette a tutti i programmi presenti di interfacciarsi
con l'hardware della propria macchina. Quando un computer =C3=A8 avviato il=
BIOS legge delle istruzioni presenti in un
settore riservato del disco fisso; queste istruzioni non sono altro che il =
boot loader, il quale si preoccupa di caricare
il kernel. In seguito sar=C3=A0 il kernel a gestire tutti i processi in ese=
cuzione.
Per ulteriori informazioni sul kernel e su come configurarlo =C3=A8 consigl=
iata la lettura di
Il kernel della postazione master non ha limiti di dimensione, sono solo ri=
chieste alcune opzioni.
Per attivarle occorre entrare nel menu di configurazione del kernel tramite=
i seguenti comandi:
A questo punto si presenta un'interfaccia grafica: si tratta di un'alternat=
iva pi=C3=B9
rapida rispetto alla modifica a mano del file
Entrare nei seguenti sotto-menu e controllate che le opzioni elencate siano=
impostate come compilate staticamente (e
Se si desidera utilizzare il packet filtering =C3=A8 possibile compilare le=
sue sotto-opzioni modularmente.
Per configurare correttamente il proprio firewall =C3=A8 consigliata la let=
tura del capitolo numero 12 della
Dopo aver riconfigurato il kernel del master =C3=A8 necessario procedere al=
la sua compilazione:
Infine aggiungere una nuova voce per il nuovo kernel all'interno di
E' consigliabile compilare il kernel degli slave senza moduli, dato che la =
presenza dei moduli renderebbe la procedura
d'avvio remoto difficoltosa. Inoltre il kernel degli slave deve essere il p=
i=C3=B9 piccolo e compatto possibile, in modo da
essere efficiente al momento dell'avvio. Si compili il kernel degli slave n=
ello stesso percorso in cui abbiamo
compilato quello del master.
Per evitare confusione e inutili sprechi di tempo =C3=A8 consigliabile fare=
una copia della configurazione del kernel del
master. Digitare semplicemente:
Si procede ora alla configurazione del kernel degli slave nello stesso modo=
con cui =C3=A8 stato configurato quello del master.
Se si desidera lavorare su una configurazione "pulita" (ovvero senza avere =
le opzioni selezionate precedentemente per=20
il master) =C3=A8 possibile recuperare il file
Ora =C3=A8 possibile lanciare nuovamente l'interfaccia grafica di configura=
zione del kernel digitando:
Accertarsi d'avere selezionato le seguenti voci come compilate staticamente=
e
Ora non resta altro che compilare il kernel dello slave. In questa fase =C3=
=A8 opportuno prestare molta attenzione controllando
che non siano sovrascritti e/o eliminati i moduli compilati precedentemente=
per il master (sempre se presenti).
Ora creare una directory sul master per contenere i file si sistema richies=
ti dallo slave. E' possibile scegliere il percorso che
si preferisce, ad esempio questo:
Il file system del master e dello slave possono essere modificati a proprio=
piacimento, al momento =C3=A8 interessante avere un file system iniziale c=
on le giuste configurazioni ed i punti di mount esatti. Per prima cosa =C3=
=A8 necessario creare
all'interno di
Molti file presenti in
Il filesystem non =C3=A8 ancora pronto, ci sono ancora da creare diversi pu=
nti di mount e directory. Per crearli digitare:
La maggior parte delle directory create precedentemente dovrebbero essere f=
amiliari. Directory quali
Anche se la directory
La sigla DHCP significa: Dynamic Host Configuration Protocol. Il server DHC=
P =C3=A8 il primo computer con cui gli slave
comunicano all'avvio. Lo scopo principale del server DHCP =C3=A8 l'assegnaz=
ione degli indirizzi
IP. Volendo, il server DHCP pu=C3=B2 assegnare gli indirizzi IP in base all=
'indirizzo MAC della scheda di rete dello slave.
Non appena lo slave ottiene un indirizzo IP il server DHCP gli fornisce le =
indicazioni su dove trovare il suo file system
iniziale ed il suo kernel.
Prima di iniziare =C3=A8 meglio controllare il funzionamento di alcune cose=
=2E Per prima cosa controlliamo la connessione di
rete:
E' opportuno controllare che il dispositivo
E' importante che appaia la voce
Se la rete non ha ancora un server DHCP =C3=A8 necessario crearne uno:
Invece se la rete ha gi=C3=A0 un server DHCP non c'=C3=A8 da fare altro che=
configurarlo in maniera da supportare il protocollo PXE.
Dovrete modificare solamente il file
Si tratta di un file indentato che dovrebbe apparire cos=C3=AC:
Il blocco d'
L'indirizzo IP in indicato dopo la voce
Prima di lanciare lo script d'avvio del server dhcp modificare il file
La variabile
Per avviare il server dhcp fin dall'avvio del master digitare:
E' possibile verificare l'avvio di una postazione remota leggendo il file <=
path>/var/log/syslog.log.
Se la postazione esegue con successo la procedura di boot, verso la fine de=
l file
Nel caso in cui si ottenga il seguente messaggio esistono degli errori all'=
interno del file di configurazione, ma il server
continua comunque a funzionare correttamente in broadcast.
Ogni volta che sono fatte delle modifiche alla configurazione =C3=A8 necess=
ario riavviare il server dhcp.
Per riavviarlo digitare:
La sigla TFTP significa Trivial File Transfer Protocol.
Il server TFTP ha la funzione di fornire agli slave il loro kernel ed il lo=
ro filesystem iniziale.
Tutti i kernel ed i filesystem degli slave saranno conservati sul server TF=
TP, =C3=A8 quindi una buona idea avviare il
server TFTP sul master.
E' consigliabile utilizzare l'ebuild
Modificare il file
L'opzione
Per avviare il server tftp digitate:
In questo modo il server tftp viene avviato usando le opzioni specificate i=
n
E' possibile saltare questa sezione se si ha intenzione di utilizzare solam=
ente Etherboot.
PXELINUX =C3=A8 un bootloader di rete, equivalente a LILO o GRUB, che fa us=
o di un server TFTP.
Sostanzialmente =C3=A8 un insieme di istruzioni che spiegano al pc dove rep=
erire il proprio kernel ed il proprio filesystem.
Come tutti i bootloader anche PXELINUX permette il passaggio di parametri a=
ll'avvio del kernel.
E' necessario procurarsi il file
Prima d'avviare il server tftp si deve configurare pxelinux. Per prima cosa=
copiare il binario di pxelinux
all'interno della directory
Questo crea una configurazione di default per il bootloader. L'eseguibile <=
path>pxelinux.0 andr=C3=A0 a cercare,
all'interno della directory in cui =C3=A8 contenuto il file
Si analizzi ora il file
Alla variabile
Etherboot carica l'immagine del kernel da un server TFTP. Cos=C3=AC come P=
XE, anche Etherboot =C3=A8 equivalente a LILO o
GRUB. Il programma
E' necessario installare il pacchetto
In questa sezione si crea una semplice immagine d'avvio di etherboot. Dato =
che il server dhcp fornisce ai client il
percorso della loro directory di root (=C3=A8 stata specificata all'interno=
del
Si procede ora alla creazione delle immagini d'avvio. In questa fase si cre=
ano delle immagini d'avvio in ELF in grado di
fornire al kernel le informazioni relative al dhcp ed al percorso del files=
ystem remoto; inoltre si forza il kernel a cercare nella rete un server dhc=
p.
Ci sono un paio di modi per individuare gli errori che si verificano durant=
e la fase d'avvio remoto. Per prima cosa
=C3=A8 possibile utilizzare un programma chiamato
Ora =C3=A8 possibile controllare il traffico della vostra rete, accertandos=
i che le iterazioni client/server funzionino a dovere.
Se non si riesce a vedere il traffico tra i due host dovete controllare un =
paio di cose. Per primo verificare che i due
host siano collegati fisicamente in maniera corretta, e che il cavo di rete=
non sia danneggiato. Se il client/server
non riceve le richieste destinate ad una certa porta allora verificare la p=
resenza di eventuali firewall e la loro
configurazione. Per leggere il traffico tra due pc digitare:
E' possibile utilizzare
# cd /usr/src/linux
# make menuconfig
# cp .config .config_funzionante
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
=20
Device Drivers --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[ ] Network packet filtering (replaces ipchains)
=20
File systems --->
Network File Systems --->
<*> NFS server support
[*] Provide NFSv3 server support
# make && make modules_install
# cp /usr/src/linux/.config /usr/src/linux/.config_master
# cd /usr/src/linux
# cp .config_master .config
# cd /usr/src/linux
# make menuconfig
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
=20
Device Drivers --->
[*] Networking support
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support (NEW)
=20
=46ile systems --->
Network File Systems --->
<*> file system support=20
[*] Provide NFSv3 client support
[*] Root file system on NFS
# cd /usr/src/linux
# make
# mkdir /diskless
# cp /usr/src/linux/arch/i386/boot/bzImage /diskless
# mkdir /diskless/192.168.1.21
# cp -r /etc /diskless/192.168.1.21/etc
# 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/sys
# 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
# mknod /diskless/192.168.1.21/dev/console c 5 1
# ifconfig eth0 multicast
# ifconfig -a
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
# emerge dhcp
# cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
# nano -w /etc/dhcp/dhcpd.conf
# DHCP configuration file for DHCP ISC 3.0
=20
ddns-update-style none;
=20
# Definizione delle opzioni relative a PXE
# Code 1: Indirizzo IP multicast del server di boot
# Code 2: Porta UDP che il client dovrebbe monitorare per le risposte MTFTP
# Code 3: Porta UDP su cui il server MTFTP =C3=A8 in attesa delle richieste=
MTFTP
# Code 4: Numero di secondi di inattivit=C3=A0 prima che il client inizi un=
nuovo trasferimento MTFTP
# Code 5: Numero di secondi di inattivit=C3=A0 prima che il client provi a =
riavviare un trasferimento MTFTP
=20
option space PXE;
option PXE.mtftp-ip code 1 =3D ip-address;
option PXE.mtftp-cport code 2 =3D unsigned integer 16;
option PXE.mtftp-sport code 3 =3D unsigned integer 16;
option PXE.mtftp-tmout code 4 =3D unsigned integer 8;
option PXE.mtftp-delay code 5 =3D unsigned integer 8;
option PXE.discovery-control code 6 =3D unsigned integer 8;
option PXE.discovery-mcast-addr code 7 =3D ip-address;
=20
subnet 192.168.1.0 netmask 255.255.255.0 {
=20
=20
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) =3D "PXEClien=
t";
option vendor-class-identifier "PXEClient";
vendor-option-space PXE;
=20
# Deve essere indicata almeno una delle opzioni PXE relative alla propr=
ia scheda di rete, solo cos=C3=AC
# le schede dei client capiscono che c'=C3=A8 un server compatibile PXE=
=2E E' necessario mettere il
# valore 0.0.0.0 alla variabile MCAST IP, in questo modo i client capis=
cono che non c'=C3=A8 un
# server TFPT multicast (il valore 0.0.0.0 indica l'assenza dell'host).
=20
option PXE.mtftp-ip 0.0.0.0;
=20
# Questo =C3=A8 il nome del file che la scheda di rete del client deve =
scaricare.
filename "pxelinux.0";
# Questo =C3=A8 l'indirizzo del server presso il quale =C3=A8 possibile=
scaricare il file.
# man dhcpd.conf
IFACE=3D"eth0"
# /etc/init.d/dhcp start
# rc-update add dhcp default
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
no free leases on subnet LOCAL-NET
# /etc/init.d/dhcpd restart
# emerge tftp-hpa
INTFTPD_PATH=3D"/diskless"
INTFTPD_OPTS=3D"-l -v -s ${INTFTPD_PATH}"
# /etc/init.d/in.tftpd start
# rc-update add in.tftpd default
# emerge syslinux
# cp /usr/lib/syslinux/pxelinux.0 /diskless
# mkdir /diskless/pxelinux.cfg
# touch /diskless/pxelinux.cfg/default
DEFAULT /bzImage
APPEND ip=3Ddhcp root=3D/dev/nfs nfsroot=3D192.168.1.1:/diskless/192.168.1.=
21
# emerge mknbi
# man mknbi
# mkelf-linux -ip=3Ddhcp /diskless/bzImage > /diskless/vmlinuz
# emerge tcpdump
# tcpdump host
TCPwrappers vi consigliamo di controllare=
i file
NFS significa Network File System. Il server NFS viene utilizzato per forni= re lo spazio di lavoro agli slave. Il server NFS pu=C3=B2 essere configurat= o in vari modi, ma questi esulano dagli intenti di questa guida.
Molti servizi dei client e dei server non sono in ascolto su una determinat= a porta, ma si affidano alle RPCs (Remote Procedure Calls). Quando il servizio =C3=A8 inizializzato si mette in ascol= to su una porta a caso e poi registra questa porta tramite l'uso di Portmapper. NFS si affida alle RPCs e pertanto Portmapper = deve essere in esecuzione prima del suo avvio.
Il server NFS richiede delle opzioni abilitate all'interno del kernel, nel = caso non siano selezionate =C3=A8 necessario ricompilare il kernel del master. Per controllare rapidamente la selezione = di queste opzioni digitare:
# grep NFS /usr/src/linux/.config_master
Se il kernel =C3=A8 stato configurato correttamente si dovrebbe avere un ri= sultato simile al seguente:
CONFIG_PACKET=3Dy # CONFIG_PACKET_MMAP is not set # CONFIG_NETFILTER is not set CONFIG_NFS_FS=3Dy CONFIG_NFS_V3=3Dy # CONFIG_NFS_V4 is not set # CONFIG_NFS_DIRECTIO is not set CONFIG_NFSD=3Dy CONFIG_NFSD_V3=3Dy # CONFIG_NFSD_V4 is not set # CONFIG_NFSD_TCP is not set
Per installare il pacchetto contenente i programmi di NFS digitare:
# emerge nfs-utils
Questo pacchetto installa i programmi richiesti per un corretto funzionamen= to di NFS, preoccupandosi di risolvere tutte le loro dipendenze.
I principali file da configurare sono:
/etc/exports /diskless/192.168.1.21/etc/fstab /etc/conf.d/nfs
All'interno del file
Una configurazione tipica del file
# aggiungete un linea come questa per ogni slave /diskless/192.168.1.21 192.168.1.21(sync,rw,no_root_squash,no_all_squash)# comune a tutti gli slave /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)# se si desidera avere dei log comuni /var/log 192.168.1.21(sync,rw,no_root_squash,no_all_squash)
Il primo campo indica la directory da esportare, quello successivo indica a=
chi e come condividerla..
Il secondo campo pu=C3=B2 essere diviso in due parti: nella prima si indica=
chi pu=C3=B2 accedere alla condivisione, nel secondo campo si indicano i s=
uoi permessi sulla directory. I permessi possono essere di sola lettura(
# queste voci sono essenziali master:/diskless/192.168.1.21 / nfs sync,hard,intr,rw,nolock,= rsize=3D8192,wsize=3D8192 0 0 master:/opt /opt nfs sync,hard,intr,ro,nolock,= rsize=3D8192,wsize=3D8192 0 0 master:/usr /usr nfs sync,hard,intr,ro,nolock,= rsize=3D8192,wsize=3D8192 0 0 master:/home /home nfs sync,hard,intr,rw,nolock,= rsize=3D8192,wsize=3D8192 0 0 none /proc proc defaults = 0 0# voci utili ma opzionali master:/var/log /var/log nfs hard,intr,rw = 0 0(solo se si sta configurando un cluster openMosix) none /mfs mfs dfsa=3D1 = 0 0
Nell'esempio la variabile
L'ultimo file da modificare =C3=A8
# Config file for /etc/init.d/nfs # Number of servers to be started up by default RPCNFSDCOUNT=3D8 # Options to pass to rpc.mountd RPCMOUNTDOPTS=3D""
E' necessario cambiare il parametro
Per avviare il server nfs utilizzare lo script situato in
# /etc/init.d/nfs start
Per avviare il server nfs all'avvio del master digitare:
# rc-update add nfs default
A questo punto =C3=A8 possibile sincronizzare il filesytem dello slave con = quello del master fornendo i binari necessari, ma mantendo i file propri dello slave.
# rsync -avz /bin /diskless/192.168.1.21 # rsync -avz /sbin /diskless/192.168.1.21 # rsync -avz /lib /diskless/192.168.1.21
Gli script di base cercano di lanciare
(Si crea il file /fastboot per il prossimo avvio) # touch /diskless/192.168.1.21/fastboot(Si crea il file /fastboot ad ogni avvio) # echo "touch /fastboot" >> /diskless/192.168.1.21/etc/conf.d/loca= l.start
Dato che i filesystem remoti devono essere smontati il pi=C3=B9 tardi possi=
bile bisogna modificare il file
depend() { before *
Se si sta usando un file system live, non bisogna dimenticarsi di eseguir=
e
A questo punto si =C3=A8 liberi d'aggiungere tutti gli script d'avvio che s=
i desidera all'interno di
/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 =20 /diskless/192.168.1.21/etc/runlevels/boot: total 0 lrwxrwxrwx 1 root root 20 2003-10-18 17:28 bootmisc -> /et= c/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/i= nit.d/clock lrwxrwxrwx 1 root root 22 2003-10-18 17:28 domainname -> /= etc/init.d/domainname lrwxrwxrwx 1 root root 20 2003-10-18 17:28 hostname -> /et= c/init.d/hostname lrwxrwxrwx 1 root root 22 2003-10-18 17:28 localmount -> /= etc/init.d/localmount lrwxrwxrwx 1 root root 19 2003-10-18 17:28 modules -> /etc= /init.d/modules 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 -> /et= c/init.d/netmount lrwxrwxrwx 1 root root 21 2003-10-18 17:28 rmnologin -> /e= tc/init.d/rmnologin lrwxrwxrwx 1 root root 19 2003-10-18 17:28 urandom -> /etc= /init.d/urandom =20 /diskless/192.168.1.21/etc/runlevels/default: total 0 lrwxrwxrwx 1 root root 23 2003-10-18 17:28 consolefont -> = /etc/init.d/consolefont lrwxrwxrwx 1 root root 19 2003-10-18 17:28 distccd -> /etc= /init.d/distccd lrwxrwxrwx 1 root root 19 2003-10-18 17:28 keymaps -> /etc= /init.d/keymaps lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/i= nit.d/local lrwxrwxrwx 1 root root 16 2003-10-18 17:28 sshd -> /etc/in= it.d/sshd lrwxrwxrwx 1 root root 21 2003-10-18 17:28 syslog-ng -> /e= tc/init.d/syslog-ng lrwxrwxrwx 1 root root 17 2003-10-18 17:28 vixie-cron -> /= etc/init.d/vixie-cron =20 /diskless/192.168.1.21/etc/runlevels/nonetwork: total 0 lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/i= nit.d/local =20 /diskless/192.168.1.21/etc/runlevels/single: total 0
Questa =C3=A8 la fine, =C3=A8 ora di avviare il proprio slave. In bocca al lupo!