Gentoo võrguboot
Sisukord
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