LPS:Implementace nového FAI
Nutné kroky pro zprovoznění nového FAI na Debianu Lenny
Přidání nového jádra do FAI
chroot /var/lib/fai/nfsroot.amd64/live/filesystem.dir apt-get install linux-image-2.6.30-2-amd64 linux-headers-2.6.30-2-amd64 m-a a-i aufs -t -l 2.6.30-2-amd64 cd /usr/src dpkg -i aufs-modules-2.6.30-2-amd64_0+20090302-3+2.6.30-8_amd64.deb update-initramfs -k all -u logout
Dále okopírovat z /var/lib/fai/nfsroot.amd64/live/filesystem.dir/boot/ soubory initrd* a vmlinuz* na bootovací médium.
Úprava busyboxu
Je nutné překompilovat v nfsrootu busybox s podporou NFS rootu tzn. kompilovat s parametrem CONFIG_FEATURE_MOUNT_NFS=y. Pak je potřeba bloknout busybox proti přeinstalaci
cd /usr/src apt-get source busybox apt-get build-dep busybox cd busybox-VERSION/debian/build sed -i 's/# CONFIG_FEATURE_MOUNT_NFS is not set/CONFIG_FEATURE_MOUNT_NFS=y/g' */.config cd ../../ dpkg-buildpackage -rfakeroot -uc -b cd .. dpkg -i busybox-VERSION.deb aptitude hold busybox
Úprava initramfs skriptů
Nejprve zkopírujeme současný initrd do nějaké nové složky a rozbalíme jej
mv initrd initrd.gz gunzip initrd.gz cpio -i < initrd
Initramfs nepodporuje mountovaní NFS pomocí nfsmount ale pouze mount -t nfs, to je zapříčiněno použitím balíku nfs-user-server. Toto je nutné upravit v /usr/share/initramfs-tools/scripts/live V souboru etc/initramfs-tools/initramfs.conf umístěném v nfsrootu je třeba změnit následující položky
MODULES=netboot BOOT=live
Pozor parametr BOOT=nfs nefunguje!!! Také jej bloknem proti úpravám a vygenerujeme nový initrd
aptitude hold live-initramfs update-initramfs -c -k all
úpravy v balíku live-initramfs
Změnit /usr/share/initramfs-tools/scripts/live, tak aby byl pro dhcp klienta timeout a NFS se mountovalo přes mount:
--- live.orig 2009-09-16 13:12:34.000000000 +0200 +++ live 2009-09-16 12:03:23.000000000 +0200 @@ -704,7 +704,7 @@ udevsettle fi - ipconfig ${DEVICE} | tee /netboot.config + ipconfig -t 180 ${DEVICE} | tee /netboot.config # source relevant ipconfig output OLDHOSTNAME=${HOSTNAME} @@ -832,7 +832,7 @@ i=0 while [ "$i" -lt 60 ] do - nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break + mount -t nfs -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break sleep 1 i="$(($i + 1))" done
Chyby ve FAI
Netvoří se /dev/mdX zařízení
Bohužel, nyní používaná verze FAI (3.2.16) špatně vytváří (resp. nevytváří) zařízení /dev/md1 a další. Řešením je buď počkat na verzi >3.2.18 nebo ručně aplikovat patch:
--- Commands.pm.orig 2008-12-08 15:56:58.000000000 +0100 +++ Commands.pm 2008-12-08 17:33:23.000000000 +0100 @@ -224,7 +224,7 @@ $pre_req =~ s/^,//; &FAI::push_command( "yes | mdadm --create /dev/md$id --level=$level --force --run --raid-devices=" - . scalar(@eff_devs) . " --spare-devices=" . scalar(@spares) . " " + . scalar(@eff_devs) . (scalar(@spares) !=0 ? " --spare-devices=" . scalar(@spares) : "") . " " . join(" ", @eff_devs) . " " . join(" ", @spares), "$pre_req", "exist_/dev/md$id" );
Nedetekuje /dev/xvdX zařízení
Bug už byl nahlášen včetně jeho řešení, stačí postupovat dle instrukcí na http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=561489
Zkráceně je potřeba přidat i '/dev/xvd??' zařízení do filtru:
/usr/lib/fai# diff -u disk-info.orig disk-info --- disk-info.orig 2010-10-12 09:31:16.203730676 +0000 +++ disk-info 2010-10-12 09:27:38.022599796 +0000 @@ -21,6 +21,6 @@ } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # echo a space separated list of devices and their block size -egrep ' i2o/hd.\b| cciss/c.d.\b| ida/c.d.\b| rd/c.d.\b| hd.\b| sd[a-z]{1,2}\b|/disc\b| vd.\b' /proc/partitions | diskandsize +egrep ' etherd/e[[:digit:]]+\.[[:digit:]]+\b| i2o/hd.\b| cciss/c.d.\b| ida/c.d.\b| rd/c.d.\b| hd.\b| sd[a-z]{1,2}\b|/disc\b| vd.\b| xvd[a-z]{1,2}\b' /proc/partitions | diskandsize
A zařadit tento typ zařízení mezi fyzická:
/usr/share/fai/setup-storage# diff -u Init.pm.orig Init.pm --- Init.pm.orig 2010-10-12 14:39:35.000000000 +0000 +++ Init.pm 2010-10-12 14:38:04.000000000 +0000 @@ -163,7 +163,7 @@ ################################################################################ sub phys_dev { my ($dev) = @_; - if ($dev =~ m{^/dev/(i2o/hd[a-t]|sd[a-t]{1,2}|hd[a-t]|vd[a-t])(\d+)?$}) + if ($dev =~ m{^/dev/(i2o/hd[a-t]|sd[a-t]{1,2}|xvd[a-z]{1,2}|hd[a-t]|vd[a-t])(\d+)?$}) { defined($2) or return (1, "/dev/$1", -1); return (1, "/dev/$1", $2);
Podpora pro geometrii disku
Aby bylo možné bootovat Windows z grubu přes PXE, je třeba zajistit stejnou geometrii disků při instalaci, jakou mají přednstaveny windowsy. Proto je ve $FAI/class/*.var souborech nastavena proměnná diskgeometry_<device>="<geometry>", jež se použije při rozdělování HDD. Pro toto rozšíření je třeba upravit v nfsroot skript /usr/sbin/setup_harddisks tímto patchem:
--- setup_harddisks.orig 2009-09-11 15:11:30.000000000 +0200 +++ setup_harddisks.zcu 2009-09-11 15:17:17.000000000 +0200 @@ -176,6 +176,7 @@ my $FAIOutputFile = "$ENV{LOGDIR}/disk_var.sh"; # write output variables to this file # old partition tables +my %DiskGeometry = (); # disks geometry (C/H/S) my %DiskUnits = (); # unit size of each disk in sectors my %DiskSize = (); # size of every disk in units my %SectorsAlignment = (); # tracksize in sectors @@ -274,10 +275,15 @@ print "Disks found:"; $result = `sh -c "LC_ALL=C sfdisk -g -q $devdisklist"`; foreach my $line(split(/\n/,$result)){ + $line =~ m'^/dev/(.+?):'i; + $line = $ENV{"diskgeometry_$1"} if $ENV{"diskgeometry_$1"}; if($line =~ m'^/dev/(.+?):\s+(\d+)\s+cylinders,\s+(\d+)\s+heads,\s+(\d+)\s+sectors'i){ $disk = $1; - $DiskUnits{$disk} = $3 * $4;# heads * sectors = cylinder size in sectors - $DiskSize{$disk} = $2; # cylinders + $DiskGeometry{C}{$disk} = $2; + $DiskGeometry{H}{$disk} = $3; + $DiskGeometry{S}{$disk} = $4; + $DiskUnits{$disk} = $DiskGeometry{H}{$disk} * $DiskGeometry{S}{$disk};# heads * sectors = cylinder size in sectors + $DiskSize{$disk} = $DiskGeometry{C}{$disk}; # cylinders ($DOS_Alignment eq "yes") ? ($SectorsAlignment{$disk} = $4) : ($SectorsAlignment{$disk} = 1); print " $disk"; } @@ -751,7 +757,7 @@ print FILE $sfdiskTables{$disk}; close(FILE); } - $command = "LC_ALL=C sfdisk $sfdisk_options /dev/$disk < $filename"; + $command = "LC_ALL=C sfdisk $sfdisk_options -C $DiskGeometry{C}{$disk} -H $DiskGeometry{H}{$disk} -S $DiskGeometry{S}{$disk} /dev/$disk < $filename"; if($test != 1){ print "$command\n"; $result = `sh -c "$command"`;
Příklad použití nastavení geometrie disku:
diskgeometry_hda="/dev/hda: 4863 cylinders, 255 heads, 63 sectors/track"
V současné době se jedná o učebny CD203, HJ3xx, KL209.
Squeeze
buzikbox
cd /usr/src apt-get source busybox apt-get build-dep busybox sed -i 's/# CONFIG_FEATURE_MOUNT_NFS is not set/CONFIG_FEATURE_MOUNT_NFS=y/g' busybox-1.17.1/debian/config/pkg/* cd busybox-xxx dpkg-buildpackage -rfakeroot -uc -b cd .. dpkg -i busybox_1.17.1-8_i386.deb aptitude hold busybox
initramfs
Initramfs nepodporuje mountovaní NFS pomocí nfsmount ale pouze mount -t nfs, to je zapříčiněno použitím balíku nfs-user-server. Toto je nutné upravit v /usr/share/initramfs-tools/scripts/live V souboru etc/initramfs-tools/initramfs.conf umístěném v nfsrootu je třeba změnit následující položky
MODULES=netboot BOOT=live
Dale je treba upravit zdrojove skripty initramfs-live a nahradit nfsmount za mount -t nfs
sed -i 's/nfsmount/mount -t nfs/g' /usr/share/initramfs-tools/scripts/live update-initramfs -u -k all aptitude hold live-boot-initramfs-tools