Gentoo võrguboot

Allikas: Kuutõrvaja
Redaktsioon seisuga 15. detsember 2011, kell 13:45 kasutajalt Jj (arutelu | kaastöö)
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)

Gentoo startimine üle võrgu PXE, TFTP ja NFS abil

  • võimalus startida testserver enne production serverit, ja proovida kas nt meilitarkvara töötab veeb töötab
  • upgrademise lihtus, ühe buildi e skripti käivitamisega saab värske tarkvara kõik peale ja viimasepeal süsteemi
  • võimalus kiirelt konfi muutes bootida ühes paraleelseid servereid balancingu jaoks või uute teenuste
  • nfsi üle käib vaid serveri boot, seega nfs pudelikaelaks ei jää hilisemal kasutamisel
  • Kokkuvõtteks 2a juba see käigus EENeti kõige rasvasematel teenustel ja ühe korra päästis selline lahendus pigem ülikiirelt paljude kasutajatega süsteemi jukerdavalt raualt, teinekord võimaldas aga liiga rasvase veebi jaoks startida sama konfiga uue serveri spetsiaalselt nimetatud teenusele
  • nfs serveril pole reaalset erilist koormust, kasutust leiab aktiivselt vaid serveri stardil

Selline lahendus võimaldab mugavuse

käivitatakse skript ./build_new_masin test mis tõmbab kõige uuema tarkvara, pakib lahti, konfib lahendab sõltuvuse teen test masinale boodi...vaatan, et töötab annan käsu ./build_new_masin work ja teen tollele reboodi

Skeem mille alusel süsteem tööle hakkab

Antud näide koosneb kolmest serverist A. bootserverist, B. testserverist ja C. Ametlikust tööserverist

            ____
           |    | A (Bootserver kus asetsevad NFS, DNCP, TFTPD teenused)
           |____| 192.168.0.10

       ....              
        Sisevõrk....
           ..... 
    ____          ____
   |    |B       |    |C        (PXE bootivad serverid)
   |____|        |____|

192.168.1.20    192.168.1.21 

Vajalik NFS toega kernelit bootserverile.

Gentoo paigalduse skript

Kuna Gentoo paigaldus võtab isegi eksperdil aega mitu tundi on mõistlik see paljude serverite puhul automatiseerida bash skripiga. Järgnev skript tekitab kettale /srv/server kataloogi millelt saab bootida juba üle NFSi

 #!/bin/bash                                      
 
 PXEROOT="/srv/server/"
 STAGE="/srv/gentoo/stage3-amd64-20100429.tar.bz2"
 NFS_SERVER="192.168.1.10"
 ROOTPW="parool"
 NS="192.168.14"

 # kontrollime failide kaustade olemasolu 
 [ -z "$PXEROOT" ] && error "Missing install root (PXEROOT). Terminating!"
 [ -f "$STAGE" ] || error "Missing STAGE tarball $STAGE"

 echo "Extracting stage: $STAGE ..."                    
 tar xjf $STAGE -C $PXEROOT                             
 [ $? -ne 0 ] && error "Cannot extract tarball [$STAGE] into [$PXEROOT]"
 
 # Loome /usr/portage and /etc/portage directories, vajalikud emerge jaoks
 [ -e $PXEROOT/usr/portage ] || mkdir -pv $PXEROOT/usr/portage                
 [ -e $PXEROOT/etc/portage ] || mkdir -pv $PXEROOT/etc/portage                
 
 # Loome minimaalse /dev haru
 [ -e $PXEROOT/dev ] || mkdir -pv $PXEROOT/dev
 ( cd $PXEROOT/dev && ../sbin/MAKEDEV std )   
 
 # Seadistame ajatsooni
 rm -f $PXEROOT/etc/localtime
 ln -s /usr/share/zoneinfo/$TZONE $PXEROOT/etc/localtime
 echo "TIMEZONE=\"${TZONE}\"" >> $PXEROOT/etc/conf.d/clock
 
 # Süsteemi charset on UTF-8
 echo 'LC_ALL="en_US.utf8"' >> $PXEROOT/etc/env.d/02locale                                                  
 
 # Täidame resolv.conf faili
 echo "domain $DOMAIN" >  $PXEROOT/etc/resolv.conf
 echo "search $DOMAIN" >> $PXEROOT/etc/resolv.conf
 echo "nameserver $NS" >> $PXEROOT/etc/resolv.conf
                                                              
 # Paigaldame mõned fundamentaalsed paketid, kuna see töö tuleb teha chroot keskkonnas tuleb 
 # siin veidi trikitada, esiteks tekitame pxeroot alla skripti mis sisaldab vajalikke 
 # käske ning seejärel käivitame selle skripti chroot keskkonnas
 cat > $PXEROOT/paigalda.sh  <<EOT  
 emerge mail-mta/postfix sys-process/vixie-cron app-admin/syslog-ng
 # NFS client needs portmap
 emerge net-nds/portmap net-fs/nfs-utils sys-apps/kexec-tools
 EOT                            

 chmod 755 $PXEROOT/paigalda.sh
 mount --bind /usr/portage $PXEROOT/usr/portage
 mount -t proc none $PXEROOT/proc
 chroot $PXEROOT /paigalda.sh
 umount -f $PXEROOT/proc
 umount -f $PXEROOT/mnt/pkgcache
 umount -f $PXEROOT/usr/portage
 rm -f $PXEROOT/paigalda.sh
 ln -vs /etc/init.d/{vixie-cron,syslog-ng,sshd} $PXEROOT/etc/runlevels/default/
                                                
 # Kexec vajab kernelit, kernel tuleb eelnevalt valmis buildida ja patchida      
 cp -rp /srv/kernel/kern-2.6.32-unionfs $PXEROOT/bzImage
 
 # Moodulite otsimise vältimiseks
 echo 'CDBOOT="yes"' >> $PXEROOT/etc/conf.d/modules
 echo 'CDBOOT="yes"' >> $PXEROOT/etc/conf.d/bootmisc
 install -D /dev/null $PXEROOT/lib/modules/2.6.32-gentoo/modules.dep
 
 # Võrguseaded tulevad DHCPlt
 echo 'config_eth0=( "noop" )' > $PXEROOT/etc/conf.d/net 
                                     
 # checkroot gets error after 'rm' and halts the boot
 sed -i -e 's|rm -f /etc/mtab|#rm -f /etc/mtab|' $PXEROOT/etc/init.d/checkroot
 
 # Speed up booting
 sed -i  -e 's|^svcmount="no"$|svcmount="yes"|' $PXEROOT/etc/conf.d/rc
 
 # To not make persistent rules onto readonly disk
 > $PXEROOT/lib64/udev/move_tmp_persistent_rules.sh
 
 # fstab fail
 cat > $PXEROOT/etc/fstab <<EOT
 ${NFS_SERVER}:${PXEROOT%.tmp} / nfs ro 0 0
 proc /proc proc defaults 0 0              
 tmpfs /dev/shm tmpfs defaults 0 0         
 EOT                                       
                                                               
 # SSHD võtmed                       
   /usr/bin/ssh-keygen -t rsa1 -b 1024 -f $PXEROOT/etc/ssh/ssh_host_key -N ''
   /usr/bin/ssh-keygen -d -f $PXEROOT/etc/ssh/ssh_host_dsa_key -N ''         
   /usr/bin/ssh-keygen -t rsa -f $PXEROOT/etc/ssh/ssh_host_rsa_key -N ''     
 
 # Sätime root kasutaja parooli
 pw=`ruby -e "print '${ROOTPW}'.crypt('\\$1\\$ABcdefGH\\$')"`
 sed -i -e "1 s|^root:\*:|root:${pw}:|" $PXEROOT/etc/shadow
 
 
 # Suuname kirjutatavad failid ümber /fstmp alla
 mkdir $PXEROOT/fstmp/{tmp,run,lock}
 rm -rf $PXEROOT/tmp
 ln -s fstmp/tmp $PXEROOT/tmp
 rm -rf $PXEROOT/var/tmp
 ln -s ../fstmp/tmp $PXEROOT/var/tmp
 rm -rf $PXEROOT/var/run
 ln -s ../fstmp/run $PXEROOT/var/run
 rm -rf $PXEROOT/var/lock
 ln -s ../fstmp/lock $PXEROOT/var/lock
 rm -f $PXEROOT/etc/mtab
 ln -s ../proc/mounts $PXEROOT/etc/mtab
 chmod 711 $PXEROOT/fstmp
 
 # init skript rc-extra mis tekitab tmpfs failisüsteemi ajutiseks hoidlaks
  cat > $PXEROOT/etc/conf.d/rc-extra <<'EOT'
  if [[ $1 = "sysinit" && ! -f /fstmp/.fstmp ]]; then
   mount -n -t tmpfs -o size=256m,nodev,noexec,nosuid temp /fstmp
   mkdir /fstmp/{tmp,run,lock,log,mail}
   chmod 711 /fstmp
   chmod 1777 /fstmp/tmp
   chmod 755 /fstmp/{run,lock,log}
   mount -n -t unionfs -o dirs=/fstmp/log=rw:/var/log=ro none /var/log
   if [ -d /var/spool/postfix ]; then
     mount -n -t unionfs -o dirs=/fstmp/mail=rw:/var/spool/postfix=ro none /var/spool/postfix
   fi
   touch /fstmp/.fstmp
   echo "/fstmp mounted."
 fi
 EOT
 
 # Tühjad logfiles
 > $PXEROOT/var/log/dmesg
 > $PXEROOT/var/log/lastlog
 > $PXEROOT/var/log/messages
 > $PXEROOT/var/log/wtmp

Masinat saab täiendavalt konfida ja sedaistada kui minna kausta /srv/server/ ja käivitada seal käsk:

# chroot .

DHCP seadistamine

Paigaldame dhcp serveri, võib paigaldada ka mingi teise lemmik dhcp serveri erinevalt selles näites esitatust

# emerge dhcp

/etc/dhcp/dhcpd.conf

defineerime siin ära esiteks dns serveri, tftp serveri, pxekerneli nime ja kaks masinat mis sellelt boodivad, test serveri ja teenuste serveri

option domain-name "zoo.ee";                                          
option domain-name-servers 192.168.1.1;                         
default-lease-time 14400;
max-lease-time 28800;    
authoritative;
ddns-update-style none;
log-facility local7;                                     
                                                               
group {
  next-server 192.168.1.10;
  server-name "bootserver";
  filename "pxelinux.0";  
  host vabrikutest {                              
     hardware ethernet 00:15:10:94:72:01;
    fixed-address 192.168.0.20;            
  }                                      
  host vabrikuserver {                          
    hardware ethernet 00:23:B9:14:8C:BC; 
    fixed-address 192.168.0.21;            
  }                                                                       
}

Sedistame võrgukaardi millel dhcp kuulab failist /etc/conf.d/dhcp

IFACE="eth1"

TFTPD

paigaldame ftpd tarkvara

# emerge tftp-hpa

Määrame ära tftpd töökausta asukoha ja pordid/ipd mida ta kuulab

/etc/conf.d/in.tftpd

INTFTPD_PATH="/srv/tftproot/"
INTFTPD_OPTS="-R 4096:32767 -s ${INTFTPD_PATH} -a <serveri ip aadress>"

Stardime teenuse

# rc-update add in.tftpd default

PXElinux ja selle konfiguratsioon

/srv/tftproot/ kausta tekitame esiteks unionfs'iga patchitud kerneli, pxelinux.0 faili ja kausta pxelinux.cfg kuhu tekitame iga masina kohta tema MAX aadressi nimelise konfiguratsioonifaili

pxelinux.0 tuleb paketist

# emerge syslinux

Paigaldame selle õigesse kausta

# cp /usr/share/syslinux/pxelinux.0 /srv/tftproot
# mkdir /srv/tftproot/pxelinux.cfg
# touch /srv/tftproot/pxelinux.cfg/default

PXE otsib pxelinux.cfg/ kaustast kahte tüüpi konfifaile, esieks mac aadressi kujul ja teiseks hexadecimal kujul ip aadresse, selles näites kasutame füüsilse aadress nimelisi konfiguratsioonifaile

Näiteks vabrikutesti füüsiline aadress on 00:15:10:94:72:01; ning fail peab olema siis 01-00-15-10-94-72-01, põhiline on kirjutada mac aadressi ette 01 ja asendada koolonid kaldkriipsudega

Faili sisuks kirjutame esiteks kerneli nime ja root failisüsteemi asukoha ehk ip ja jaotise

DEFAULT /kern-2.6.32-unionfs
APPEND ip=dhcp root=/dev/nfs nfsroot=193.168.0.10:/srv/vabrikutest

Seadistame NFS serveri, tekitame selle konfiguratsiooni kaks järgnevat rida

Võrgust startivate masinate tuum

Vaja tekitada bootiv kernel mis unionfsiga patchitud

Tõmbame alla värske kerneli koodi, hetkel viimaseks Gentoo portages 2.6.34-r1

# emerge gentoo-sources

Liigume kausta kuhu emerge paigaldas kerneli koodi

# cd /usr/src

Liigutame kerneli ümber uue nime alla, igasjuhuks

# cp -rp linux-2.6.34-gentoo-r1 linux-2.6.34-gentoo-r1-unionfs 

Liigume aadressile http://www.fsl.cs.sunysb.edu/project-unionfs.html ja tõmbame sealt enda kerneli versioonile sobiva paiga NB! kerneli ja unionfsi versioonid peavad kindlasti klappima.

# wget http://download.filesystems.org/unionfs/unionfs-2.x/unionfs-2.5.5_for_2.6.34.3.diff.gz

Liigutame patchi kerneli kausta

# mv unionfs-2.5.5_for_2.6.34.3.diff.gz linux-2.6.34-gentoo-r1-unionfs

Ja anname käsu

# gzip -dc unionfs-*.diff.gz | patch -p1

Ning seejärel kompileerime kerneli

Serverivabriku buildimis skriptis tuleb muuta veel vastavaks rida

# install -D /dev/null $PXEROOT/lib/modules/2.6.32-gentoo/modules.dep

PS. Kui fireholi käivitamisel kurdab, et kerneli võiks /proc/config toega kokku ehitada. Viimane näitab mis konfiguratsiooniga on kernel nimelt kokku ehitatud. Seadistada saab seda kerneli kompileerimisel General setup alt

$ head /proc/config
CONFIG_X86=y
CONFIG_UID16=y
CONFIG_EXPERIMENTAL=y
CONFIG_MODULES=y
CONFIG_MODVERSIONS=y
CONFIG_KMOD=y
CONFIG_M386=y
CONFIG_X86_L1_CACHE_SHIFT=4
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_X86_PPRO_FENCE=y

Firehol võib moodulite kohta infot küsides lihtsalt netist bootitud masina muidu hanguma panna

proc/config lahendust saab kasutada ka soovides kompileerida täpselt samasugust kernelit kui originaal, lihtsalt tuleb anda käsk

zcat /proc/config.gz > /usr/src/linux/.config

Pole vaja "make install" ega "make modules_install" kirjutada. Fail arch/x86/boot/bzImage tuleb kopeerida /srv/tftproot/ alla ja /srv/tftproot/pxelinux.cfg/servertest esimesel real viidata.

NFS server

NB! kernelis peab olema NFS tugi sisse lülitatud

<*>   NFS server support                                                                                     

Seejärel paigaldame utiliidid

# emerge nfs-utils

Ning jagame kaustad võrku välja

/etc/exports

/srv/servertest 192.168.0.0/255.255.255.0(ro,sync,no_root_squash,no_subtree_check,no_acl)
/srv/vabrikuserver 192.168.0.0/255.255.255.0(ro,sync,no_root_squash,no_subtree_check,no_acl)

Kindlustame, et nfs ka peale rebooti stardiks

# rc-update add nfs default

Paneme lõpuks kõik teenusd tööle

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

Alternatiiv kasutades pxegrubi pxelinux.0 asemel

# echo "sys-boot/grub netboot" >> /etc/portage/package.use
# emerge -av grub
# cp /usr/lib/grub/pxegrub /diskless/eta/boot/pxegrub
# nano -w /diskless/eta/boot/grub.lst

TODO

Võrgust veel lisalugemist