/[fai]/trunk/scripts/make-fai-nfsroot
ViewVC logotype

Contents of /trunk/scripts/make-fai-nfsroot

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1084 - (hide annotations) (download)
Wed Mar 6 18:11:48 2002 UTC (11 years, 3 months ago) by lange
File size: 13026 byte(s)
do not fail if password contains /
1 lange 46 #! /bin/sh
2 lange 2
3     # $Id$
4     #*********************************************************************
5     #
6     # make-fai-nfsroot -- create nfsroot directory and add additional packages
7     #
8     # This script is part of FAI (Fully Automatic Installation)
9 lange 960 # (c) 2000-2002 by Thomas Lange, lange@informatik.uni-koeln.de
10 lange 2 # Universitaet zu Koeln
11     #
12     #*********************************************************************
13     # This program is free software; you can redistribute it and/or modify
14     # it under the terms of the GNU General Public License as published by
15     # the Free Software Foundation; either version 2 of the License, or
16     # (at your option) any later version.
17     #
18     # This program is distributed in the hope that it will be useful, but
19     # WITHOUT ANY WARRANTY; without even the implied warranty of
20     # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21     # General Public License for more details.
22     #
23     # A copy of the GNU General Public License is available as
24     # `/usr/share/common-licences/GPL' in the Debian GNU/Linux distribution
25     # or on the World Wide Web at http://www.gnu.org/copyleft/gpl.html. You
26     # can also obtain it by writing to the Free Software Foundation, Inc.,
27     # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28     #*********************************************************************
29    
30 lange 1035 # Packages that are install to nfsroot by default Additional packages are
31     # defined with $NFSROOT_PACKAGES in fai.conf
32     packages="dhcp-client file rdate cfengine bootpc wget rsh-client less dump
33     ext2resize strace hdparm parted dnsutils grub ntpdate psmisc hwtools
34 lange 1056 dosfstools sysutils dialog"
35 lange 485
36 lange 217 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
37 lange 2
38 lange 485 if [ "$UID" -ne 0 ]; then
39 lange 1035 echo "Run this program as root."
40     exit 9
41 lange 485 fi
42    
43 lange 1035 while getopts rv opt ; do
44     case "$opt" in
45 lange 119 v) verbose=1 ;;
46 lange 1035 r) recover=1 ;;
47     esac
48 lange 119 done
49    
50 lange 330 set -e
51 lange 936 . /etc/fai/fai.conf
52 lange 1035
53 lange 491 ROOTCMD="chroot $NFSROOT"
54 lange 119
55 lange 1035 RUNDIR=/var/run/fai/make-nfs-root
56     [ ! -d $RUNDIR ] && mkdir -p $RUNDIR
57     [ ! "$recover" ] && rm -rf $RUNDIR/*
58    
59 lange 691 LIBFAI=/usr/lib/fai
60 lange 981 SHAREFAI=/usr/share/fai
61 lange 119 conffile=$NFSROOT/etc/rcS_fai.conf
62 lange 14 export DEBIAN_FRONTEND=Noninteractive
63 lange 2
64 lange 581 trap "umount_dirs" EXIT
65 lange 2 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
66 lange 203 die() {
67    
68 lange 1028 echo "$@"
69 lange 203 exit 99
70     }
71     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
72 lange 1035 call_with_stamp() {
73    
74     local func=$1
75     local stamp=$RUNDIR/$func
76     # call subroutine
77     [ "$recover" -a -f $stamp ] && return 0
78     "$@"
79     > $stamp
80     }
81     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
82 lange 888 call_verbose() {
83    
84     if [ "$verbose" ]; then
85 lange 1035 "$@"
86 lange 888 else
87 lange 1035 "$@" > /dev/null
88 lange 888 fi
89     }
90     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
91 lange 545 install_kernel_nfsroot() {
92 lange 597
93 lange 545 rm -rf $NFSROOT/boot/*-$KERNELVERSION $NFSROOT/lib/modules/$KERNELVERSION
94 lange 999 # since woody we can install the kernel using dpkg -i
95     echo "do_boot_enable=no" > $NFSROOT/etc/kernel-img.conf
96 lange 545 dpkg -x $KERNELPACKAGE $NFSROOT
97     # if $NFROOT/proc/modules exists, then update-modules calls depmod -a without
98     # these special flags; so umount first
99 lange 1035 [ -e $NFSROOT/proc/modules ] && umount $NFSROOT/proc
100 lange 545 chroot $NFSROOT update-modules
101     chroot $NFSROOT depmod -a -F /boot/System.map-$KERNELVERSION $KERNELVERSION
102     }
103     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
104 lange 69 setup_ssh() {
105    
106 lange 485 # nothing to do if no ssh is available in nfsroot
107     [ -f $NFSROOT/var/lib/dpkg/info/ssh.list ] || return 0
108 lange 425 mkdir -p -m 700 $NFSROOT/root/.ssh
109 lange 581 [ -f /etc/ssh/ssh_known_hosts ] && cp /etc/ssh/ssh_known_hosts $NFSROOT/root/.ssh/known_hosts
110 lange 1040 if [ -n "$LOGUSER" ] ; then
111     loguserhome=`eval "cd ~$LOGUSER 2>/dev/null && pwd;true"`
112     [ -d $loguserhome/.ssh ] && cp -p $loguserhome/.ssh/identity* $NFSROOT/root/.ssh/
113     fi
114 lange 425
115 lange 119 # enable root login
116     perl -pi -e 's/PermitRootLogin no/PermitRootLogin yes/' $NFSROOT/etc/ssh/sshd_config
117     if [ -f "$SSH_IDENTITY" ]; then
118 lange 1035 cp -p $SSH_IDENTITY $NFSROOT/root/.ssh/authorized_keys
119     echo You can log into install clients without password using $SSH_IDENTITY
120 lange 119 fi
121 lange 69 }
122     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123 lange 119 copy_fai_files() {
124 lange 2
125 lange 485 # copy to nfsroot
126 lange 1084 perl -pi -e "s#^root::#root:${FAI_ROOTPW}:#" etc/passwd
127 lange 999 mkdir -p $NFSROOT/$FAI/fai_config $NFSROOT/$SHAREFAI $NFSROOT/etc/fai
128 lange 485 cd $NFSROOT
129 lange 991 cp -p $LIBFAI/sbin/dhclient-script $SHAREFAI/etc/dhclient.conf etc/
130 lange 1035 cp -Rp /etc/fai etc/
131 lange 1026 [ -f /etc/fai/.cvspass ] && cp -p /etc/fai/.cvspass .cvspass
132 lange 936 cp -p $LIBFAI/sbin/* sbin/
133 lange 981 cp -p $SHAREFAI/etc/fai_modules_off etc/modutils/
134 lange 485
135 lange 981 cp -p $SHAREFAI/subroutines usr/share/fai
136     cp -p $SHAREFAI/etc/apt.conf etc/apt
137 lange 1035 # potato / woody code
138 lange 999 if [ -d usr/lib/perl5/Debian ]; then
139 lange 1035 cp -p /usr/lib/perl5/Debian/Fai.pm usr/lib/perl5/Debian/
140 lange 931 else
141 lange 1035 cp -p /usr/share/perl5/Debian/Fai.pm usr/share/perl5/Debian/
142 lange 931 fi
143 lange 485 echo $NFSROOT_ETC_HOSTS >> etc/hosts
144 lange 119 }
145     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
146 lange 661 call_debootstrap() {
147 lange 1035
148 lange 674 echo "Creating nfsroot for $1 using debootstrap"
149 lange 661 [ "$verbose" ] && echo "calling debootstrap $1 $NFSROOT $2"
150 lange 1043 yes '' | debootstrap $1 $NFSROOT $2 || true
151 lange 661 }
152     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
153     create_base() {
154    
155 lange 669 if [ "$FAI_DEBOOTSTRAP" ]; then
156 lange 1035 call_verbose call_with_stamp call_debootstrap $FAI_DEBOOTSTRAP
157     $ROOTCMD apt-get clean
158     echo "Creating base.tgz"
159     tar -C $NFSROOT -cf - . | gzip > $NFSROOT/../base.tgz
160     mv $NFSROOT/../base.tgz $NFSROOT/var/tmp/base.tgz
161 lange 661 else
162 lange 1035 # old method for potato
163     call_with_stamp get_basetgz
164     echo "Unpacking base2_2.tgz"
165     zcat /tmp/base2_2.tgz | tar -C $NFSROOT -xpf -
166     cp -p /tmp/base2_2.tgz $NFSROOT/var/tmp/base.tgz
167 lange 661 fi
168     }
169     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
170 lange 119 create_nfsroot() {
171    
172 lange 999 mkdir -p $NFSROOT/$FAI
173 lange 217 cd $NFSROOT || die "Error: Can't cd to $NFSROOT"
174 lange 119
175 lange 1035 call_with_stamp create_base
176    
177     [ ! -c dev/boot255 ] && mknod dev/boot255 c 0 255
178    
179 lange 480 if [ "$FAI_DEBMIRROR" ]; then
180 lange 1035 mkdir -p $NFSROOT/$MNTPOINT
181     mount -o ro,rsize=8192 $FAI_DEBMIRROR $NFSROOT/$MNTPOINT || \
182     die "Can't mount $FAI_DEBMIRROR"
183     fi
184 lange 203
185 lange 119 # hoaks some packages
186 lange 889 # liloconfig, dump and raidtool2 needs these files
187     echo "# UNCONFIGURED FSTAB FOR BASE SYSTEM" > etc/fstab
188 lange 683 > etc/raidtab
189 lange 217 mkdir -p lib/modules/$KERNELVERSION # dirty trick to hoax lvm
190 lange 683 > lib/modules/$KERNELVERSION/modules.dep # dirty trick to hoax lvm
191 lange 485 mkdir -p etc/ssh
192 lange 1080 echo 'NTPSERVERS=""' > etc/default/ntp-servers
193 lange 908
194     # potato only
195 lange 683 > etc/ssh/NOSERVER
196 lange 908 # woody uses debconf
197 lange 119
198 lange 708 if [ "$FAI_SOURCES_LIST" ]; then
199 lange 1035 echo "$FAI_SOURCES_LIST" > etc/apt/sources.list
200 lange 708 else
201 lange 1035 cp /etc/apt/sources.list etc/apt/sources.list
202 lange 708 fi
203 lange 960 [ -f /etc/apt/preferences ] && cp /etc/apt/preferences etc/apt
204 lange 888 echo "Upgrading $NFSROOT"
205 lange 1035 call_verbose call_with_stamp upgrade_nfsroot
206 lange 888 echo "Adding additional packages to $NFSROOT:"
207     echo "$packages"
208 lange 1035 call_verbose call_with_stamp add_packages_nfsroot
209     call_with_stamp copy_fai_files
210 lange 119
211     # set timezone
212 lange 485 rm -f etc/localtime
213     cp -d /etc/localtime /etc/timezone etc
214 lange 119
215 lange 485 # make little changes to nfsroot, because nfsroot is
216 lange 217 # read only for the install clients
217 lange 187 rm -rf etc/mtab var/run
218 lange 485 mv etc/init.d/rcS etc/init.d/rcS.orig
219     ln -s /proc/mounts etc/mtab
220     ln -s /tmp/var/run var/run
221     ln -sf /tmp/etc/resolv.conf etc/resolv.conf
222     ln -s /sbin/rcS_fai etc/init.d/rcS
223 lange 893 ln -s /dev/null etc/network/ifstate
224 lange 714 # for nis
225     [ -d var/yp ] && ln -s /tmp/binding var/yp/binding
226 lange 2
227 lange 217 # turn off logging of loading kernel modules
228 lange 735 [ -d var/log/ksymoops/ ] && rmdir var/log/ksymoops/
229 lange 485 ln -s /dev/null var/log/ksymoops
230 lange 119
231 lange 217 # definition for loopback device
232 lange 485 echo "iface lo inet loopback" > etc/network/interfaces
233 lange 305
234 lange 485 echo "*.* /tmp/syslog.log" > etc/syslog.conf
235 lange 981 echo ". $SHAREFAI/subroutines" >> root/.profile
236 lange 361
237 lange 1035 call_verbose call_with_stamp setup_ssh
238 lange 119
239 lange 217 cat >$NFSROOT/etc/rc2.d/S01fai_abort <<-EOF
240 lange 1035 #!/bin/sh
241     echo FAI: installation aborted.
242     echo reboot with: faireboot
243     echo or after a logout
244     sh
245     cd /
246     umount -ar
247     reboot -dfi
248 lange 2 EOF
249 lange 217 chmod a+rx $NFSROOT/etc/rc2.d/S01fai_abort
250 lange 2 }
251     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
252 lange 27 upgrade_nfsroot() {
253 lange 2
254 lange 242 cp /etc/resolv.conf $NFSROOT/etc
255 lange 491 $ROOTCMD apt-get update
256     $ROOTCMD apt-get check
257 lange 750 rm -rf $NFSROOT/etc/apm
258 lange 485 mount -t proc /proc $NFSROOT/proc
259 lange 750 $ROOTCMD apt-get --purge -y remove debconf+ pcmcia-cs ppp pppconfig </dev/null
260 lange 57
261 lange 217 # fake start-stop-dameon
262 lange 491 $ROOTCMD dpkg-divert --quiet --package fai --add --rename /sbin/start-stop-daemon
263 lange 217 cp $LIBFAI/sbin/start-stop-daemon $NFSROOT/sbin
264 lange 491 $ROOTCMD apt-get -y upgrade
265 lange 888 }
266     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
267     add_packages_nfsroot() {
268    
269 lange 491 $ROOTCMD apt-get -y --fix-missing install $packages </dev/null
270 lange 1040 if [ -n "$NFSROOT_PACKAGES" ] ; then
271     $ROOTCMD apt-get -y --fix-missing install $NFSROOT_PACKAGES </dev/null
272     fi
273 lange 491 $ROOTCMD apt-get clean
274 lange 2 }
275     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
276 lange 69 get_basetgz() {
277 lange 2
278 lange 661 [ -f /tmp/base2_2.tgz ] && return
279     [ "$FAI_BASETGZ" ] || die "No /tmp/base2_2.tgz found and FAI_BASETGZ not defined."
280 lange 274 case $FAI_BASETGZ in
281 lange 1035 ftp:*|http:*)
282     echo "Fetching $FAI_BASETGZ via wget. This may take some time."
283     TMPBDIR=`mktemp /tmp/FAI-wget-XXXXXX` || exit 1
284     rm $TMPBDIR; mkdir $TMPBDIR || exit
285     wget -P$TMPBDIR $FAI_BASETGZ
286     mv $TMPBDIR/base2_2.tgz /tmp
287     rm -rf $TMPBDIR
288     ;;
289     /*/base2_2.tgz)
290     rm -f /tmp/base2_2.tgz
291     test -r $FAI_BASETGZ || die "Can't read $FAI_BASETGZ. Check FAI_BASETGZ in fai.conf."
292     ln -s $FAI_BASETGZ /tmp
293     ;;
294     *)
295     die "FAI_BASETGZ in fai.conf is $FAI_BASETGZ and looks very strange."
296     ;;
297 lange 119 esac
298 lange 69 }
299     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
300 lange 581 umount_dirs() {
301    
302     cd /
303     sleep 2
304     umount $NFSROOT/proc 1>/dev/null 2>&1 || true
305     umount $NFSROOT/dev/pts 1>/dev/null 2>&1 ||true
306     if [ "$FAI_DEBMIRROR" ]; then
307 lange 1035 test -d $NFSROOT/$MNTPOINT && umount $NFSROOT/$MNTPOINT || true
308 lange 581 fi
309     # show directories still mounted on nfsroot
310 lange 586 mount | grep " on $NFSROOT " || true
311 lange 581 }
312     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
313 lange 1022 get_kernel_version() {
314    
315     local package=$1
316     KERNELVERSION=`dpkg --info $1 | grep "Package: kernel-image" | sed -e 's/.*kernel-image-'//`
317     }
318     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
319 lange 1035 setup_bootp(){
320    
321     mknbi-linux --verbose $NFSROOT/boot/vmlinuz-$KERNELVERSION /boot/fai/installimage
322     # imggen is free software from 3com
323     # it converts netboot image to images, that are bootable by 3com network cards
324     imggen=`which imggen || true`
325     if [ -x "$imggen" ]; then
326     imggen -a /boot/fai/installimage /boot/fai/installimage_3com
327     fi
328     echo "BOOTP environment prepared."
329     }
330    
331     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
332     setup_dhcp(){
333    
334     # pxe and dhcp environment
335     cp -p $NFSROOT/boot/vmlinuz-$KERNELVERSION /boot/fai/installkernel
336     rdev /boot/fai/installkernel $NFSROOT/dev/boot255
337     [ -f /usr/lib/syslinux/pxelinux.bin ] && cp /usr/lib/syslinux/pxelinux.bin /boot/fai
338     [ -d /boot/fai/pxelinux.cfg ] || mkdir /boot/fai/pxelinux.cfg || true
339     cp -p /usr/share/fai/etc/pxelinux.cfg /boot/fai/pxelinux.cfg/default
340     echo "DHCP environment prepared. Now enable dhcpd and the special tftp daemon"
341     }
342     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
343 lange 169 # main routine
344    
345 lange 1035 # Kill the directory if not in recover mode
346     if [ -d $NFSROOT/$FAI -a ! "$recover" ]
347     then
348 lange 119 echo $NFSROOT already exists. Removing $NFSROOT
349 lange 361 umount $NFSROOT/dev/pts 1>/dev/null 2>&1 || true
350 lange 691 rm -rf $NFSROOT/.??* $NFSROOT/*
351     # also remove files $NFSROOT/.? but not . and ..
352     find $NFSROOT ! -type d -xdev -maxdepth 1 | xargs -r rm -f
353 lange 2 fi
354    
355 lange 1035 # Create a new nfsroot
356     call_with_stamp create_nfsroot
357 lange 330
358 lange 1035 # Install the kernel package
359 lange 545 if [ -f $KERNELPACKAGE ]; then
360 lange 1022 # determine kernel version
361     get_kernel_version $KERNELPACKAGE
362 lange 1035
363 lange 545 # create tftp boot images
364 lange 1035 call_with_stamp install_kernel_nfsroot
365 lange 914
366 lange 960 grep -q _dhcp_ $NFSROOT/boot/System.map-$KERNELVERSION && TYPE=DHCP
367 lange 914 # only BOOTP need a netboot image, DHCP can do with raw kernels
368 lange 960 if [ "$TYPE" = DHCP ]; then
369 lange 1035 call_with_stamp setup_dhcp
370 lange 960 else
371 lange 1035 call_with_stamp setup_bootp
372 lange 914 fi
373 lange 545 else
374 lange 597 echo "Kernel package $KERNELPACKAGE not found."
375     echo "No install kernel installed in /boot/fai."
376     echo "No kernel modules available in nfsroot."
377 lange 545 fi
378    
379 lange 485 echo make-fai-nfsroot finished.
380 lange 14 exit 0

Properties

Name Value
svn:eol-style native
svn:executable *
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.5