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 ../../ fakeroot debian/rules binary 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
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.