NFS+pivot_root+chroot et consors

NFS+pivot_root+chroot et consors - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 17-05-2005 à 16:10:13    

J'ai un client sans disque dur qui amorce sur le réseau, y obtient son adresse ip, un noyau et un initrd. Dans celui-ci j'ai mis un script qui charge les pilotes réseaux, montent une partition NFS et amorce le système dessus avec

Code :
  1. echo "Entering ${SYSTEM}"
  2. cd /boot/${SYSTEM}
  3. /sbin/pivot_root . initrd
  4. echo "Booting remote system"
  5. exec chroot . sh -c 'umount /initrd; exec /sbin/init' < dev/console > dev/console 2>&1


 
Ca fonctionne impeccable tant que "/boot/${SYSTEM}" est l'endroit où j'ai monté mon NFS. Mais si je l'ai monté dans "/boot/" et que "${SYSTEM}" est un sous-dossier, le pivot_root échoue avec "argument invalide", puis le "exec chroot ..." lance init qui me dit "Syntax init etc." comme si je l'avais exécuté avec un pid>1.
 
Et pourtant si, à la main, je rentre dans "/boot/${SYSTEM}" et que je tape "chroot . /sbin/init < dev/console > /dev/console 2>&1" ça marche. Et par ailleurs man pivot_root dit explicitement qu'il est possible de pivot_root dans un sous-dossier.
 
Mais que se passe-t-il ? Le work-around est d'éviter le pivot_root et de ne faire qu'un chroot, mais ça m'empêche de libérer la mémoire occupée...
 
Avez-vous des idées? D'avance merci...


Message édité par glacote le 17-05-2005 à 16:10:28
Reply

Marsh Posté le 17-05-2005 à 16:10:13   

Reply

Marsh Posté le 22-05-2005 à 19:00:07    

Bon, pas de solution, mais un work-around: exporter par NFS tous les systèmes possibles. Ce qui donne:

Code :
  1. cat >> syslinux.cfg
  2. DEFAULT linux
  3. IPAPPEND 1
  4. PROMPT 1
  5. TIMEOUT 50
  6. LABEL linux
  7.   KERNEL console/vmlinuz-2.6.11.9
  8.   APPEND initrd=console/ramdisk-2.6.11.9.squash nfs=192.168.3.15:/mnt/systems/console/ boot=default
  9. LABEL mandrake
  10.   KERNEL console/vmlinuz-2.6.11.9
  11.   APPEND initrd=console/ramdisk-2.6.11.9.squash nfs=192.168.3.15:/mnt/systems/console/ boot=Mandrake
  12. LABEL gentoo
  13.   KERNEL console/vmlinuz-2.6.11.9
  14.   APPEND initrd=console/ramdisk-2.6.11.9.squash nfs=192.168.3.15:/mnt/systems/console/ boot=Gentoo
  15. LABEL kubuntu
  16.   KERNEL console/vmlinuz-2.6.11.9
  17.   APPEND initrd=console/ramdisk-2.6.11.9.squash nfs=192.168.3.15:/mnt/systems/console/ boot=Kubuntu


et le script d'initialisation qui lit les variables "nfs" et "boot" et du coup chroot directement dedans:

Code :
  1. cat >> ramdisk/linuxrc << EOF
  2. #!/bin/sh
  3. # Chain loader startup script automatically generated on mar déc 30 02:41:30 CET 2003 for console
  4. if [ "$$" != '1' ]; then
  5. echo "WARNING: $0 should be run with a PID of one instead of $$";
  6. fi
  7. getValue() {
  8. case "$1" in
  9.    *\=*)
  10.      echo "$1" | cut -f2 -d=
  11.    ;;
  12. esac
  13. }
  14. # This is if we want the kernel to automagically mount the NFS root when we exit
  15. echo "Finding root file system"
  16. /bin/mount -n -t proc none /proc
  17. echo 0x100 > /proc/sys/kernel/real-root-dev
  18. for x in `cat /proc/cmdline` ; do
  19. case "${x}" in
  20.    boot\=*)
  21.      SYSTEM=`getValue "${x}"`
  22.      ;;
  23.    ip\=*)
  24.      IP_CONFIGURATION=`getValue "${x}"`
  25.      IP=`echo "${IP_CONFIGURATION}" | cut -f1 -d:`
  26.      DHCP_SERVER=`echo "${IP_CONFIGURATION}" | cut -f1 -d:`
  27.      GATEWAY=`echo "${IP_CONFIGURATION}" | cut -f1 -d:`
  28.      NETMASK=`echo "${IP_CONFIGURATION}" | cut -f1 -d:`
  29.      ;;
  30.    nfs\=*)
  31.      NFS=`getValue "${x}"`
  32.      ;;
  33.     *)
  34.      echo "Skipping unrecognized parameter \"${x}\""
  35.      ;;
  36.    esac
  37. done
  38. /bin/umount /proc
  39. echo "Setting network address to ${IP}:${NETMASK} with gateway ${GATEWAY} and connecting to ${NFS} to launch ${SYSTEM}"
  40. function loadModule() { if /sbin/insmod /modules/`uname -r`/${1}.ko; then echo " (OK)"; else echo "FAILED !"; fi ; }
  41. echo -n "Loading network drivers: "
  42. for driver in exportfs sunrpc lockd nfsd nfs 8139too sis900; do
  43.   echo -n $driver && loadModule ${driver}
  44. done
  45. echo "Configuring network interface"
  46. /sbin/ifconfig eth0 ${IP} up
  47. /sbin/route add ${IP} dev eth0
  48. /sbin/route add default gw ${GATEWAY}
  49. echo -n "Connecting to remote server: "
  50. if /bin/mount -n -o rw -o nolock,rsize=4096,wsize=4096 -t nfs ${NFS}/${SYSTEM} /boot ;
  51. then echo "OK." ;
  52. else echo "FAILED!"; echo "Please mount it to /boot and exit"; /bin/sh ;
  53. fi
  54. echo "Entering ${SYSTEM}"
  55. cd /boot/
  56. /sbin/pivot_root . initrd/
  57. echo "Booting remote system"
  58. exec chroot . sh -c 'umount /initrd; exec /sbin/init' < dev/console > dev/console 2>&1
  59. echo "Real file system exited, last-ditch is a shell ..."
  60. /bin/sh
  61. EOF
  62. mksquashfs initrd/ ramdisk-2.6.11.9.squash -2.0


qui suppose que j'ai préalablement copié les modules qui vont bien dans "initrd/modules/2.6.11.9" avec un  

Code :
  1. mkdir -p initrd/modules/2.6.11.9/
  2. for i in exportfs sunrpc lockd nfsd nfs 8139too sis900 ; do find /lib/modules/2.6.11.9/ -name ${i}.ko -exec cp -v {} initrd/modules/2.6.11.9/ ; done

et que j'ai exporté tous les systèmes mentionnés:

Code :
  1. cat /etc/exports
  2. ...
  3. /mnt/systems/console/default console(async,rw,no_root_squash,async)
  4. /mnt/systems/console/Mandrake console(async,rw,no_root_squash,async)
  5. /mnt/systems/console/Gentoo   console(async,rw,no_root_squash,async)
  6. /mnt/systems/console/Kubuntu   console(async,rw,no_root_squash,async)
  7. ...


Pour que ma réponse soit complète, j'utilise tftp lancé automatiquement par dhcpd3-server avec cette configuration:

Code :
  1. cat /etc/dhcp3/dhcpd.conf
  2. ...
  3. allow booting;
  4. allow bootp;
  5. ...
  6. host console {
  7.   hardware ethernet 00:0B:xx:xx:xx:xx ;
  8.   fixed-address console;
  9.   option routers datajet;
  10.   option domain-name-servers 213.228.0.168, 212.27.32.176, 212.27.32.177;
  11.   server-name "data";
  12.   filename "pxelinux.0";
  13.   default-lease-time 6000;
  14.   max-lease-time 72000;
  15. }
  16. ...


Et voilà, boot sur le réseau comme avec un lilo, le bruit du disque dur en moins. Ce qui permet notamment de mettre les pilotes ide en module, ce qui permet de faire de l'ide hot-plug en prenant soin de rmmod ide_generic && modprobe ide_generic mais c'est une autre histoire.
 
Hope it helps those coming here through the "search" button!


Message édité par glacote le 22-05-2005 à 19:01:57
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed