LPS:Implementace nového FAI

Z HelpDesk

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