Add asciidoc files
[grml-debootstrap.git] / chroot-script
1 #!/bin/sh
2 # Filename:      /etc/debootstrap/chroot-script
3 # Purpose:       script executed in chroot when installing Debian via grml-debootstrap
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 # Latest change: Mon Apr 16 15:26:11 CEST 2007 [mika]
8 ################################################################################
9
10 set -e # exit on any error
11
12 . /etc/debootstrap/config    || exit 1
13 . /etc/debootstrap/variables || exit 1
14
15 [ -r /proc/1 ] || mount -t proc   none /proc
16
17 # use aptitude only if it's available
18 if [ -x /usr/bin/aptitude ] ; then
19    APTINSTALL='aptitude -y install '
20    APTUPDATE='aptitude update'
21 else
22    APTINSTALL='apt-get --force-yes -y install'
23    APTUPDATE='apt-get update'
24 fi
25
26 # variable checks {{{
27 if [ -z "$STAGES" ] ; then
28    STAGES='/etc/debootstrap/stages'
29    [ -d "$STAGES" ] || mkdir -p "$STAGES"
30 fi
31 # }}}
32
33 # helper functions {{{
34 stage() {
35   if [ -n "$2" ] ; then
36      echo "$2" > "$STAGES/$1"
37      return 0
38   elif grep -q done "$STAGES/$1" 2>/dev/null ; then
39      echo "Notice: stage $1 has been executed already, skipping execution therefore.">&2
40      return 1
41   fi
42 }
43 # }}}
44
45 # define chroot mirror {{{
46 chrootmirror() {
47   if [ -n "$CHROOTMIRROR" ] ; then
48      echo "deb $CHROOTMIRROR $RELEASE main contrib non-free" > /etc/apt/sources.list
49   fi
50 }
51 # }}}
52
53 # set up grml repository {{{
54 grmlrepos() {
55   if [ -n "$GRMLREPOS" ] ; then
56      echo 'deb     http://grml.org/repos/ ./' >> /etc/apt/sources.list
57   fi
58 }
59 # }}}
60
61 # set up kernel-img.conf {{{
62 kernelimg_conf() {
63   if ! [ -r /etc/kernel-img.conf ] ; then
64      echo "Setting up /etc/kernel-img.conf"
65      cat > /etc/kernel-img.conf << EOF
66 # Kernel Image management overrides
67 # See kernel-img.conf(5) for details
68 do_initrd = Yes
69 do_symlinks = Yes
70 EOF
71   fi
72 }
73 # }}}
74
75 # create default devices {{{
76 makedev() {
77   if ! [ -r /dev/hda20 ] ; then
78      echo "Creating generic devices in /dev - this might take a while..."
79      cd /dev && MAKEDEV generic
80   fi
81 }
82 # }}}
83
84 # install additional packages {{{
85 packages() {
86   if [ "$PACKAGES" = 'yes' ] ; then
87      if ! [ -r /etc/debootstrap/packages ] ; then
88        echo "Error: /etc/debootstrap/packages not found, exiting."
89        exit 1
90      else
91        $APTUPDATE
92        DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $(cat /etc/debootstrap/packages) $GRMLPACKAGES
93      fi
94   fi
95 }
96 # }}}
97
98 # sarge specific stuff: mkinitrd {{{
99 mkinitrd() {
100   if [ "$RELEASE" = 'sarge' ] ; then
101      sed -i "s#ROOT=probe#ROOT=$TARGET#" /etc/mkinitrd/mkinitrd.conf
102   fi
103 }
104 # }}}
105
106 # install kernel packages {{{
107 kernel() {
108   # do not override $KERNEL if set via config file
109   if [ -z "$KERNEL" ] ; then
110      if [ "$ARCH" = 'i386' ] ; then
111         KERNEL='2.6-686'
112      elif [ "$ARCH" = 'amd64' ] ; then
113         KERNEL='2.6-amd64'
114      fi
115   fi
116
117   if [ -n "$KERNEL" ] ; then
118      $APTUPDATE
119      if [ "$RELEASE" = 'sarge' ] ; then
120         KERNELPACKAGES="kernel-image-$KERNEL kernel-headers-$KERNEL"
121      else
122         KERNELPACKAGES="linux-image-$KERNEL linux-headers-$KERNEL"
123      fi
124       DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $KERNELPACKAGES
125   fi
126 }
127 # }}}
128
129 # reconfigure packages {{{
130 reconfigure() {
131   if [ -n "$RECONFIGURE" ] ; then
132      for package in $RECONFIGURE ; do
133          dpkg --list $package 1>/dev/null 2>/dev/null && \
134          DEBIAN_FRONTEND=$DEBIAN_FRONTEND dpkg-reconfigure $package || \
135          echo "Warning: $package does not exist, can not reconfigure it."
136      done
137   fi
138 }
139 # }}}
140
141 # set password of user root {{{
142 passwords() {
143   echo "Activating shadow passwords."
144   shadowconfig on
145   echo "Setting password for user root:"
146   set +e # do not exit if passwd returns error due to missmatching passwords
147   passwd
148   echo ""
149   set -e # restore default behaviour again
150 }
151 # }}}
152
153 # set up /etc/hosts {{{
154 hosts() {
155   if ! [ -f /etc/hosts ] ; then
156      echo "Setting up /etc/hosts"
157      echo "127.0.0.1       localhost  $HOSTNAME" > /etc/hosts
158   fi
159 }
160 # }}}
161
162 # set up /etc/network/interfaces {{{
163 interfaces() {
164   if ! [ -f /etc/network/interfaces ] ; then
165      echo "Setting up /etc/network/interfaces"
166      cat >> /etc/network/interfaces << EOF
167 iface lo inet loopback
168 iface eth0 inet dhcp
169 auto lo
170 auto eth0
171 EOF
172   fi
173 }
174 # }}}
175
176 # adjust timezone {{{
177 timezone() {
178   if [ -n "$TIMEZONE" ] ; then
179      echo "Adjusting /etc/localtime"
180      ln -sf /usr/share/zoneinfo/$TIMEZONE /etc/localtime
181   fi
182 }
183 # }}}
184
185 # helper function for fstab() {{{
186 createfstab(){
187      echo "Setting up /etc/fstab"
188 cat > /etc/fstab << EOF
189 $TARGET      /            auto    defaults,errors=remount-ro 0   1
190 /sys           /sys         sysfs   rw,nosuid,nodev,noexec     0   0
191 proc           /proc        proc    defaults                   0   0
192 /dev/cdrom     /mnt/cdrom0  iso9660 ro,user,noauto             0   0
193 # some other examples:
194 # /dev/sda2       none         swap    sw                   0   0
195 # /dev/hda1       /Grml        ext3    dev,suid,user,noauto 0  2
196 # //1.2.3.4/pub   /smb/pub     smbfs   defaults,user,noauto,uid=grml,gid=grml 0 0
197 # linux:/pub      /beer        nfs     defaults             0  0
198 # tmpfs           /tmp         tmpfs   size=300M            0  0
199 EOF
200 }
201 # }}}
202
203 # generate /etc/fstab {{{
204 fstab() {
205   # set up /etc/fstab if file is not present (cdebootstrap)
206   if [ ! -f /etc/fstab  ] ; then
207      createfstab
208   fi
209
210   # set up /etc/fstab if file is UNCONFIGURED (debootstrap)
211   if grep -q UNCONFIGURED /etc/fstab ; then
212      createfstab
213   fi
214 }
215 # }}}
216
217 # set up hostname {{{
218 hostname() {
219   if [ -n "$HOSTNAME" ] ; then
220      echo "Setting hostname to ${HOSTNAME}."
221      echo "$HOSTNAME" > /etc/hostname
222   fi
223 }
224 # }}}
225
226 # generate initrd/initramfs {{{
227 initrd() {
228   # assume the first available kernel as our main kernel
229   KERNELIMG=$(ls -1 /boot/vmlinuz-* | head -1)
230   KERNELVER=${KERNELIMG#/boot/vmlinuz-}
231
232   # generate initrd
233   if [ -n "$INITRD" ] ; then
234      if [ "$RELEASE" = 'sarge' ] ; then
235         echo "Release sarge detected, will not create an initrd."
236      else
237         echo "Generating initrd."
238         update-initramfs -c -t -k $KERNELVER
239         if [ -f "/boot/initrd.img-$KERNELVER" ] ; then
240            GRUBINITRD="initrd          /boot/initrd.img-$KERNELVER"
241            LILOINITRD="        initrd=/boot/initrd.img-$KERNELVER"
242         fi
243      fi
244   fi
245 }
246 # }}}
247
248 # grub configuration/installation {{{
249 grub() {
250   if [ -z "$GROOT" ] ; then
251      echo "Warning: \$GROOT is not defined, will not adjust grub configuration therefore."
252   else
253      echo "Adjusting grub configuration for use on ${GROOT}."
254
255      # copy stage-files to /boot/grub/
256      [ -d /boot/grub/ ] || mkdir /boot/grub
257      # i386 specific:
258      [ -d /usr/lib/grub/i386-pc ]   && cp /usr/lib/grub/i386-pc/* /boot/grub/
259      # amd64 specific:
260      [ -d /usr/lib/grub/x86_64-pc ] && cp /usr/lib/grub/x86_64-pc/* /boot/grub/
261      # sarge ships grub files in another directory
262      [ "$RELEASE" = 'sarge' ]       && cp /lib/grub/i386-pc/* /boot/grub/
263
264      # finally install grub
265      if [ -x /usr/sbin/update-grub ] ; then
266         UPDATEGRUB='/usr/sbin/update-grub'
267      else
268         UPDATEGRUB='/sbin/update-grub'
269      fi
270      $UPDATEGRUB -y
271      if [ -f /boot/grub/menu.lst ] ; then
272         sed -i "s/^# groot=.*/# groot=(${GROOT})/g" /boot/grub/menu.lst
273         sed -i "s|^# kopt=root=.*|# kopt=root=${TARGET} ro|g" /boot/grub/menu.lst
274         # not sure why savedefault does not work for me; any ideas?
275         sed -i "s/^savedefault.*/# &/g" /boot/grub/menu.lst
276         $UPDATEGRUB -y
277      fi
278   fi
279 }
280 # }}}
281
282 # make sure we don't have any running processes left {{{
283 services() {
284   for service in ssh mdadm mdadm-raid ; do
285       [ -x "/etc/init.d/$service" ] && "/etc/init.d/$service" stop
286   done
287 }
288 # }}}
289
290 # unmount all filesystems in chroot, make sure nothing is left {{{
291 finalize() {
292   umount -a    1>/dev/null 2>/dev/null || true
293   umount /proc 1>/dev/null 2>/dev/null || true
294   umount /proc 1>/dev/null 2>/dev/null || true
295   umount -a    1>/dev/null 2>/dev/null || true
296 }
297 # }}}
298
299 # execute the functions {{{
300   stage chrootmirror   && chrootmirror   && stage chrootmirror done
301   stage grmlrepos      && grmlrepos      && stage grmlrepos done
302   stage kernelimg_conf && kernelimg_conf && stage kernelimg_conf done
303   stage makedev        && makedev        && stage makedev done
304   stage packages       && packages       && stage packages done
305   stage mkinitrd       && mkinitrd       && stage mkinitrd done
306   stage kernel         && kernel         && stage kernel done
307   stage reconfigure    && reconfigure    && stage reconfigure done
308   stage passwords      && passwords      && stage passwords done
309   stage hosts          && hosts          && stage hosts done
310   stage interfaces     && interfaces     && stage interfaces done
311   stage timezone       && timezone       && stage timezone done
312   stage fstab          && fstab          && stage fstab done
313   stage hostname       && hostname       && stage hostname done
314   stage initrd         && initrd         && stage initrd done
315   stage grub           && grub           && stage grub done
316   stage services       && services       && stage services done
317   stage finalize       && finalize       && stage finalize done
318 # }}}
319
320 # finally exit the chroot {{{
321   echo "Finished chroot installation, exiting."
322   exit 0
323 # }}}
324
325 ## END OF FILE #################################################################
326 # vim: ai tw=80 expandtab foldmethod=marker