Subversion Repositories livecd

Rev

Rev 166 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 166 Rev 167
1
#!/bin/ash
1
#!/bin/ash
2
#
2
#
3
# Functions library :: for Linux Live scripts 5.x.y
3
# Functions library :: for Linux Live scripts 5.x.y
4
# Author: Tomas M. <http://www.linux-live.org>
4
# Author: Tomas M. <http://www.linux-live.org>
5
#
5
#
6
# modified by Urs Beyerle, PSI
6
# modified by Urs Beyerle, PSI
7
# - to allow LiveCD mounted over nfs
7
# - to allow LiveCD mounted over nfs
8
# - add scsi_mod, sd_mod for usb-storage module
8
# - add scsi_mod, sd_mod for usb-storage module
9
# - only with boot option "automount", all devices in fstab are rw automounted
9
# - only with boot option "automount", all devices in fstab are rw automounted
10
# - remove detect of CD and Floppy (done by fstab-sync)
10
# - remove detect of CD and Floppy (done by fstab-sync)
11
# - add sr_mod (USB CDROM support)
11
# - add sr_mod (USB CDROM support)
12
# - add SATA to modprobe_usb_modules -> modprobe_usb_sata_modules
12
# - add SATA to modprobe_usb_modules -> modprobe_usb_sata_modules
13
# - add fscache (for SL5) 
13
# - add fscache (for SL5) 
14
# - add ide-cd, sr_mod, cdrom (for SL5 cdrom support)
14
# - add ide-cd, sr_mod, cdrom (for SL5 cdrom support)
15
# - add aufs (unionfs replacement)
15
# - add aufs (unionfs replacement)
16
# - to allow LiveCD mounted over NFS (for diskless client)
16
# - to allow LiveCD mounted over NFS (for diskless client)
17
# - add functions get_dhcp_lease() and load_network_modules()
17
# - add functions get_dhcp_lease() and load_network_modules()
18
# - add ata_piix to modprobe_usb_sata_modules
18
# - add ata_piix to modprobe_usb_sata_modules
19
# - works with unionfs 2.x
19
# - works with unionfs 2.x
20
# - better detection of network card in case of diskless client
20
# - better detection of network card in case of diskless client
21
# - add sg, sata_nv module
21
# - add sg, sata_nv module
22
# - to allow LiveCD mounted over CIFS (for diskless client)
22
# - to allow LiveCD mounted over CIFS (for diskless client)
23
#
23
#
24
 
24
 
25
# ===========================================================
25
# ===========================================================
26
# user interface functions
26
# user interface functions
27
# ===========================================================
27
# ===========================================================
28
 
28
 
29
# echolog
29
# echolog
30
# $1 = text to show and to write to /var/log/messages
30
# $1 = text to show and to write to /var/log/messages
31
#
31
#
32
echolog()
32
echolog()
33
{
33
{
34
   echo "LIVECD:" "$@" >>/var/log/livedbg
34
   echo "LIVECD:" "$@" >>/var/log/livedbg
35
   echo "$@"
35
   echo "$@"
36
}
36
}
37
 
37
 
38
# debug
38
# debug
39
# commands executed when debug boot parameter is present
39
# commands executed when debug boot parameter is present
40
#
40
#
41
debug()
41
debug()
42
{
42
{
43
   echo
43
   echo
44
   echo "====="
44
   echo "====="
45
   echo ": Debugging started. Here is the root shell for you."
45
   echo ": Debugging started. Here is the root shell for you."
46
   echo ": Type your desired command or hit Ctrl+D to continue booting."
46
   echo ": Type your desired command or hit Ctrl+D to continue booting."
47
   echo
47
   echo
48
   ash
48
   ash
49
}
49
}
50
 
50
 
51
# header
51
# header
52
# $1 = text to show
52
# $1 = text to show
53
#
53
#
54
header()
54
header()
55
{
55
{
56
   echolog "$1"
56
   echolog "$1"
57
}
57
}
58
 
58
 
59
fatal()
59
fatal()
60
{
60
{
61
   header "Fatal error occured - $1"
61
   header "Fatal error occured - $1"
62
   echolog "Something went wrong and we can't continue booting :("
62
   echolog "Something went wrong and we can't continue booting :("
63
   echolog "You may explore the system by using simple commands like ls, lsmod, mount, etc."
63
   echolog "You may explore the system by using simple commands like ls, lsmod, mount, etc."
64
   echolog "You may also try to hit Ctrl+D. Booting will continue. Use at your own risk."
64
   echolog "You may also try to hit Ctrl+D. Booting will continue. Use at your own risk."
65
   echolog "To be safe, hit Ctrl+Alt+Delete to reboot."
65
   echolog "To be safe, hit Ctrl+Alt+Delete to reboot."
66
   echolog
66
   echolog
67
   ash
67
   ash
68
}
68
}
69
 
69
 
70
# ===========================================================
70
# ===========================================================
71
# text processing functions
71
# text processing functions
72
# ===========================================================
72
# ===========================================================
73
 
73
 
74
# egrep_o is a replacement for "egrep -o". It prints only the last
74
# egrep_o is a replacement for "egrep -o". It prints only the last
75
# matching text
75
# matching text
76
# $1 = regular expression
76
# $1 = regular expression
77
#
77
#
78
egrep_o()
78
egrep_o()
79
{
79
{
80
   cat | egrep "$1" | sed -r "s/.*($1).*/\\1/"
80
   cat | egrep "$1" | sed -r "s/.*($1).*/\\1/"
81
}
81
}
82
 
82
 
83
# look into cmdline and echo $1 back if $1 is set
83
# look into cmdline and echo $1 back if $1 is set
84
# $1 = value name, case sensitive, for example livecd_subdir
84
# $1 = value name, case sensitive, for example livecd_subdir
85
# $2 = file to use instead /proc/cmdline, optional
85
# $2 = file to use instead /proc/cmdline, optional
86
#
86
#
87
cmdline_parameter()
87
cmdline_parameter()
88
{
88
{
89
   CMDLINE=/proc/cmdline
89
   CMDLINE=/proc/cmdline
90
   if [ "$2" != "" ]; then CMDLINE="$2"; fi
90
   if [ "$2" != "" ]; then CMDLINE="$2"; fi
91
   cat "$CMDLINE" | egrep_o "(^|[[:space:]]+)$1(\$|=|[[:space:]]+)" | egrep_o "$1"
91
   cat "$CMDLINE" | egrep_o "(^|[[:space:]]+)$1(\$|=|[[:space:]]+)" | egrep_o "$1"
92
}
92
}
93
 
93
 
94
# look into cmdline and echo value of $1 option
94
# look into cmdline and echo value of $1 option
95
# $1 = value name, case sensitive, for example livecd_subdir
95
# $1 = value name, case sensitive, for example livecd_subdir
96
# $2 = file to use instead /proc/cmdline, optional
96
# $2 = file to use instead /proc/cmdline, optional
97
#
97
#
98
cmdline_value()
98
cmdline_value()
99
{
99
{
100
   CMDLINE=/proc/cmdline
100
   CMDLINE=/proc/cmdline
101
   if [ "$2" != "" ]; then CMDLINE="$2"; fi
101
   if [ "$2" != "" ]; then CMDLINE="$2"; fi
102
   cat "$CMDLINE" | egrep_o "(^|[[:space:]]+)$1=([^[:space:]]+)" | egrep_o "=.*" | cut -b 2- | tail -n 1
102
   cat "$CMDLINE" | egrep_o "(^|[[:space:]]+)$1=([^[:space:]]+)" | egrep_o "=.*" | cut -b 2- | tail -n 1
103
}
103
}
104
 
104
 
105
# ===========================================================
105
# ===========================================================
106
# system functions
106
# system functions
107
# ===========================================================
107
# ===========================================================
108
 
108
 
109
# modprobe module $1, including all dependencies, suppress all messages
109
# modprobe module $1, including all dependencies, suppress all messages
110
# (own function because modprobe in busybox doesn't work with gzipped modules)
110
# (own function because modprobe in busybox doesn't work with gzipped modules)
111
# $1 = module name, eg. ehci-hcd
111
# $1 = module name, eg. ehci-hcd
112
# $2 = optional argument
112
# $2 = optional argument
113
#
113
#
114
modprobe_module()
114
modprobe_module()
115
{
115
{
116
  if [ "$1" = "" ]; then return 1; fi
116
  if [ "$1" = "" ]; then return 1; fi
117
  PRINTK=`cat /proc/sys/kernel/printk`
117
  PRINTK=`cat /proc/sys/kernel/printk`
118
  echo "0" >/proc/sys/kernel/printk
118
  echo "0" >/proc/sys/kernel/printk
119
 
119
 
120
  KERNEL="`uname -r`"; LSMOD=/tmp/lsmod
120
  KERNEL="`uname -r`"; LSMOD=/tmp/lsmod
121
  MODULEDEPS="`cat /lib/modules/$KERNEL/modules.dep | egrep \"$1\\.ko(\\.gz)?:\"`"
121
  MODULEDEPS="`cat /lib/modules/$KERNEL/modules.dep | egrep \"$1\\.ko(\\.gz)?:\"`"
122
 
122
 
123
  for MODULE in `echo $MODULEDEPS | cut -d ":" -f 2-` `echo $MODULEDEPS | cut -d ":" -f 1`; do
123
  for MODULE in `echo $MODULEDEPS | cut -d ":" -f 2-` `echo $MODULEDEPS | cut -d ":" -f 1`; do
124
     MODULE=${MODULE%%:};   # remove : at the end, a bug 
124
     MODULE=${MODULE%%:};   # remove : at the end, a bug 
125
     TMPMOD="/tmp/`basename $MODULE .gz`";
125
     TMPMOD="/tmp/`basename $MODULE .gz`";
126
     # if the module is not loaded already
126
     # if the module is not loaded already
127
     if [ "`cat $LSMOD 2>/dev/null | egrep \"^$TMPMOD\\\$\"`" = "" ]; then
127
     if [ "`cat $LSMOD 2>/dev/null | egrep \"^$TMPMOD\\\$\"`" = "" ]; then
128
        gunzip -c $MODULE 2>/dev/null >$TMPMOD
128
        gunzip -c $MODULE 2>/dev/null >$TMPMOD
129
        if [ $? -ne 0 ]; then cp $MODULE $TMPMOD; fi # can't gunzip? copy
129
        if [ $? -ne 0 ]; then cp $MODULE $TMPMOD; fi # can't gunzip? copy
130
        insmod $TMPMOD $2; err=$?
130
        insmod $TMPMOD $2; err=$?
131
        ### insmod $TMPMOD $2 >/dev/null 2>/dev/null; err=$?
131
        ### insmod $TMPMOD $2 >/dev/null 2>/dev/null; err=$?
132
        if [ "$err" -eq 0 ]; then echo $TMPMOD >>$LSMOD; fi # module log
132
        if [ "$err" -eq 0 ]; then echo $TMPMOD >>$LSMOD; fi # module log
133
        rm $TMPMOD
133
        rm $TMPMOD
134
     fi
134
     fi
135
  done
135
  done
136
 
136
 
137
  echo "$PRINTK" >/proc/sys/kernel/printk
137
  echo "$PRINTK" >/proc/sys/kernel/printk
138
  if [ "$err" -ne 0 ]; then echolog "error inserting module $1 ($err)"; fi
138
  if [ "$err" -ne 0 ]; then echolog "error inserting module $1 ($err)"; fi
139
  return $err
139
  return $err
140
}
140
}
141
 
141
 
142
# Mount device $1 to $2
142
# Mount device $1 to $2
143
# $1 = /dev device to mount, eg. /dev/hda1
143
# $1 = /dev device to mount, eg. /dev/hda1
144
# $2 = mountpoint, eg. /mnt/hda1
144
# $2 = mountpoint, eg. /mnt/hda1
145
# $3 = mount options, for example "loop", "ro", or "remount,rw"
145
# $3 = mount options, for example "loop", "ro", or "remount,rw"
146
#
146
#
147
mount_device()
147
mount_device()
148
{
148
{
149
  mkdir -p $2
149
  mkdir -p $2
150
  if [ "$3" != "" ]; then OPTIONS="-o $3"; else OPTIONS=""; fi
150
  if [ "$3" != "" ]; then OPTIONS="-o $3"; else OPTIONS=""; fi
151
 
151
 
152
  PRINTK=`cat /proc/sys/kernel/printk`
152
  PRINTK=`cat /proc/sys/kernel/printk`
153
  echo "0" >/proc/sys/kernel/printk
153
  echo "0" >/proc/sys/kernel/printk
154
 
154
 
155
  mount -t auto $1 $2 $OPTIONS >/dev/null 2>/dev/null
155
  mount -t auto $1 $2 $OPTIONS >/dev/null 2>/dev/null
156
  err=$?
156
  err=$?
157
 
157
 
158
  if [ "$err" -ne 0 ]; then rmdir $2 2>/dev/null; fi
158
  if [ "$err" -ne 0 ]; then rmdir $2 2>/dev/null; fi
159
  echo "$PRINTK" >/proc/sys/kernel/printk
159
  echo "$PRINTK" >/proc/sys/kernel/printk
160
  return $err
160
  return $err
161
}
161
}
162
 
162
 
163
# ===========================================================
163
# ===========================================================
164
# live module functions
164
# live module functions
165
# ===========================================================
165
# ===========================================================
166
 
166
 
167
# Create module
167
# Create module
168
# call mksquashfs with apropriate arguments
168
# call mksquashfs with apropriate arguments
169
# $1 = directory which will be compressed to squashfs module
169
# $1 = directory which will be compressed to squashfs module
170
# $2 = output .mo file
170
# $2 = output .mo file
171
# $3 = optional -keep-as-directory argument
171
# $3 = optional -keep-as-directory argument
172
#
172
#
173
create_module()
173
create_module()
174
{
174
{
175
   mksquashfs $1 $2 $3 >/dev/null
175
   mksquashfs $1 $2 $3 >/dev/null
176
   if [ $? -ne 0 ]; then return 1; fi
176
   if [ $? -ne 0 ]; then return 1; fi
177
   chmod oga-x $2 # remove execute attrib
177
   chmod oga-x $2 # remove execute attrib
178
}
178
}
179
 
179
 
180
# Mount .mo module to destination directory
180
# Mount .mo module to destination directory
181
# $1 = path to .mo livecd compressed module
181
# $1 = path to .mo livecd compressed module
182
# $2 = destination folder
182
# $2 = destination folder
183
#
183
#
184
mount_module()
184
mount_module()
185
{
185
{
186
   mount -t squashfs -o loop,ro $1 $2
186
   mount -t squashfs -o loop,ro $1 $2
187
}
187
}
188
 
188
 
189
# Insert a directory tree $2 to an union specified by $1
189
# Insert a directory tree $2 to an union specified by $1
190
# Top-level read-write branch is specified by it's index 0
190
# Top-level read-write branch is specified by it's index 0
191
# $1 = union absolute path (starting with /)
191
# $1 = union absolute path (starting with /)
192
# $2 = path to data directory
192
# $2 = path to data directory
193
#
193
#
194
union_insert_dir()
194
union_insert_dir()
195
{
195
{
196
   which unionctl >/dev/null 2>&1
196
   which unionctl >/dev/null 2>&1
197
   if [ $? -eq 0 ]; then
197
   if [ $? -eq 0 ]; then
198
       # unionfs 1.x or aufs
198
       # unionfs 1.x or aufs
199
       unionctl "$1" --add --after 0 --mode ro "$2"
199
       unionctl "$1" --add --after 0 --mode ro "$2"
200
   else
200
   else
201
       # unionfs 2.x
201
       # unionfs 2.x
202
       mount -t unionfs -o remount,add=:${2}=ro none "$1"
202
       mount -t unionfs -o remount,add=:${2}=ro none "$1"
203
   fi
203
   fi
204
}
204
}
205
 
205
 
206
# List all modules in all directories (base, modules, optional)
206
# List all modules in all directories (base, modules, optional)
207
# and filter out unneeded optional modules (not specified by load= kernel parameter)
207
# and filter out unneeded optional modules (not specified by load= kernel parameter)
208
# $1 = root directory of mounted DATAdir
208
# $1 = root directory of mounted DATAdir
209
#
209
#
210
list_modules()
210
list_modules()
211
{
211
{
212
   LOAD="`cmdline_value load`"
212
   LOAD="`cmdline_value load`"
213
   ls -A1d $1/*.mo $1/*/*.mo 2>/dev/null | while read LINE; do
213
   ls -A1d $1/*.mo $1/*/*.mo 2>/dev/null | while read LINE; do
214
      MODNAME="`basename $LINE .mo`"
214
      MODNAME="`basename $LINE .mo`"
215
      if [ "$LOAD" != "*" -a "`echo $LINE | grep optional`" != "" -a "`echo $LOAD | egrep \"(^|,)$MODNAME(\\\$|,)\"`" = "" ]; then continue
215
      if [ "$LOAD" != "*" -a "`echo $LINE | grep optional`" != "" -a "`echo $LOAD | egrep \"(^|,)$MODNAME(\\\$|,)\"`" = "" ]; then continue
216
        else echo $LINE; fi
216
        else echo $LINE; fi
217
   done
217
   done
218
}
218
}
219
 
219
 
220
# Insert one single .mo module to the union
220
# Insert one single .mo module to the union
221
# $1 = union absolute path (starting with /)
221
# $1 = union absolute path (starting with /)
222
# $2 = module.mo full path
222
# $2 = module.mo full path
223
# $3 = destination folder, where images will be mounted to
223
# $3 = destination folder, where images will be mounted to
224
#
224
#
225
union_insert_module()
225
union_insert_module()
226
{
226
{
227
   TARGET="$3/`basename $2`"
227
   TARGET="$3/`basename $2`"
228
   while [ -e $TARGET ]; do TARGET=$TARGET.X; done
228
   while [ -e $TARGET ]; do TARGET=$TARGET.X; done
229
   mkdir -p $TARGET
229
   mkdir -p $TARGET
230
   mount_module $2 $TARGET
230
   mount_module $2 $TARGET
231
   if [ $? -ne 0 ]; then echo "can't read module data"; return 1; fi
231
   if [ $? -ne 0 ]; then echo "can't read module data"; return 1; fi
232
   union_insert_dir $1 $TARGET; 
232
   union_insert_dir $1 $TARGET; 
233
}
233
}
234
 
234
 
235
# Insert all .mo modules, in $2 directory and subdirectories, to the union
235
# Insert all .mo modules, in $2 directory and subdirectories, to the union
236
# $1 = union absolute path (starting with /)
236
# $1 = union absolute path (starting with /)
237
# $2 = LiveCD data dir (with directories /base, /modules, etc.)
237
# $2 = LiveCD data dir (with directories /base, /modules, etc.)
238
# $3 = destination folder, where images will be mounted to
238
# $3 = destination folder, where images will be mounted to
239
#
239
#
240
union_insert_modules()
240
union_insert_modules()
241
{
241
{
242
   PRINTK=`cat /proc/sys/kernel/printk`
242
   PRINTK=`cat /proc/sys/kernel/printk`
243
   echo "0" >/proc/sys/kernel/printk
243
   echo "0" >/proc/sys/kernel/printk
244
 
244
 
245
   list_modules $2 | while read MODULE; do
245
   list_modules $2 | while read MODULE; do
246
      echo " -> `basename $MODULE`"
246
      echo " -> `basename $MODULE`"
247
      union_insert_module $1 $MODULE $3
247
      union_insert_module $1 $MODULE $3
248
   done
248
   done
249
 
249
 
250
   echo "$PRINTK" >/proc/sys/kernel/printk
250
   echo "$PRINTK" >/proc/sys/kernel/printk
251
}
251
}
252
 
252
 
253
# Copy modules to RAM directory
253
# Copy modules to RAM directory
254
# $1 = data directory
254
# $1 = data directory
255
# $2 = target directory in RAM
255
# $2 = target directory in RAM
256
#
256
#
257
copy_to_ram()
257
copy_to_ram()
258
{
258
{
259
   cp -R $1/* $2
259
   cp -R $1/* $2
260
   if [ $? -ne 0 ]; then fatal "can't copy to RAM, not enough memory?"; fi
260
   if [ $? -ne 0 ]; then fatal "can't copy to RAM, not enough memory?"; fi
261
}
261
}
262
 
262
 
263
# Copy content of "rootcopy" directory on the CD to $2 (union, usually)
263
# Copy content of "rootcopy" directory on the CD to $2 (union, usually)
264
# $1 = source
264
# $1 = source
265
# $2 = destination
265
# $2 = destination
266
#
266
#
267
copy_rootchanges()
267
copy_rootchanges()
268
{
268
{
269
   cp -a $1/rootcopy/* $2 2>/dev/null # could be empty
269
   cp -a $1/rootcopy/* $2 2>/dev/null # could be empty
270
}
270
}
271
 
271
 
272
# ===========================================================
272
# ===========================================================
273
# discovery functions
273
# discovery functions
274
# ===========================================================
274
# ===========================================================
275
 
275
 
276
# List all CD-ROMs
276
# List all CD-ROMs
277
# by using /proc entries
277
# by using /proc entries
278
#
278
#
279
list_cdrom_devices()
279
list_cdrom_devices()
280
{
280
{
281
   if [ "`cmdline_parameter nocd`" != "" ]; then return 1; fi
281
   if [ "`cmdline_parameter nocd`" != "" ]; then return 1; fi
282
   for CDDEVICE in `cat /proc/sys/dev/cdrom/info | head -n 3 | tail -n 1 | cut -d ":" -f 2`; do
282
   for CDDEVICE in `cat /proc/sys/dev/cdrom/info | head -n 3 | tail -n 1 | cut -d ":" -f 2`; do
283
      echo "/dev/$CDDEVICE"
283
      echo "/dev/$CDDEVICE"
284
   done
284
   done
285
}
285
}
286
 
286
 
287
# List all partition devices
287
# List all partition devices
288
# take list of all partitions and output unique disks.
288
# take list of all partitions and output unique disks.
289
# Return empty result when nohd parameter was given.
289
# Return empty result when nohd parameter was given.
290
#
290
#
291
list_partition_devices()
291
list_partition_devices()
292
{
292
{
293
   if [ "`cmdline_parameter nohd`" != "" ]; then return 1; fi
293
   if [ "`cmdline_parameter nohd`" != "" ]; then return 1; fi
294
   cat /proc/partitions | grep -v loop | sed -r "s/^[0-9[:space:]]+/\/dev\//" | grep /dev/
294
   cat /proc/partitions | grep -v loop | sed -r "s/^[0-9[:space:]]+/\/dev\//" | grep /dev/
295
}
295
}
296
 
296
 
297
# List all disk devices
297
# List all disk devices
298
#
298
#
299
list_disk_devices()
299
list_disk_devices()
300
{
300
{
301
   list_partition_devices | egrep -v "[0-9]"
301
   list_partition_devices | egrep -v "[0-9]"
302
}
302
}
303
 
303
 
304
# List all block devices
304
# List all block devices
305
#
305
#
306
list_block_devices()
306
list_block_devices()
307
{
307
{
308
   list_cdrom_devices
308
   list_cdrom_devices
309
   list_partition_devices
309
   list_partition_devices
310
}
310
}
311
 
311
 
312
# Try to mount all disks, partitions and cdroms and Find where the LiveCD is.
312
# Try to mount all disks, partitions and cdroms and Find where the LiveCD is.
313
# If LiveCD found in the device, echo dirname of it's directory,
313
# If LiveCD found in the device, echo dirname of it's directory,
314
# and leave the device mounted. Mounting is not ro, but without any argument.
314
# and leave the device mounted. Mounting is not ro, but without any argument.
315
# $1 = directory where devices will be mounted
315
# $1 = directory where devices will be mounted
316
# added: mount $NFSROOT to /$1/nfs if NFSROOT is set. and search there for LiveCD
316
# added: mount $NFSROOT to /$1/nfs if NFSROOT is set. and search there for LiveCD
317
#
317
#
318
find_live_data_dir()
318
find_live_data_dir()
319
{
319
{
320
   if [ "$NFSROOT" != "" ]; then 
320
   if [ "$NFSROOT" != "" ]; then 
321
      DIR="/$1/nfs"
321
      DIR="/$1/nfs"
322
      mkdir -p $DIR
322
      mkdir -p $DIR
323
 
323
 
324
      # disable kernel warnings
324
      # disable kernel warnings
325
      PRINTK=`cat /proc/sys/kernel/printk`
325
      PRINTK=`cat /proc/sys/kernel/printk`
326
      echo "0" >/proc/sys/kernel/printk
326
      echo "0" >/proc/sys/kernel/printk
327
      # try to mount nfs dir
327
      # try to mount nfs dir
328
      mount -t nfs -o $NFSOPT $NFSROOT $DIR
328
      mount -t nfs -o $NFSOPT $NFSROOT $DIR
329
      # enable kernel warnings
329
      # enable kernel warnings
330
      echo "$PRINTK" >/proc/sys/kernel/printk
330
      echo "$PRINTK" >/proc/sys/kernel/printk
331
   fi
331
   fi
332
 
332
 
333
   if [ "$CIFSROOT" != "" ]; then
333
   if [ "$CIFSROOT" != "" ]; then
334
      DIR="/$1/cifs"
334
      DIR="/$1/cifs"
335
      mkdir -p $DIR
335
      mkdir -p $DIR
336
 
336
 
337
      # disable kernel warnings
337
      # disable kernel warnings
338
      PRINTK=`cat /proc/sys/kernel/printk`
338
      PRINTK=`cat /proc/sys/kernel/printk`
339
      echo "0" >/proc/sys/kernel/printk
339
      echo "0" >/proc/sys/kernel/printk
340
      # try to mount cifs dir
340
      # try to mount cifs dir
341
      mount -t cifs $CIFSROOT $DIR -o ro,$CIFSOPTS
341
      mount -t cifs $CIFSROOT $DIR -o ro,$CIFSOPTS
342
      # enable kernel warnings
342
      # enable kernel warnings
343
      echo "$PRINTK" >/proc/sys/kernel/printk
343
      echo "$PRINTK" >/proc/sys/kernel/printk
344
   fi
344
   fi
345
 
345
 
-
 
346
   PRINTK=`cat /proc/sys/kernel/printk`
-
 
347
   echo "0" >/proc/sys/kernel/printk
346
   if [ "$DIR" = "" ]; then
348
   if [ "$DIR" = "" ]; then
347
       list_block_devices | while read DEVICE; do
349
       list_block_devices | while read DEVICE; do
348
	   DIR="/$1/`basename $DEVICE`"
350
	   DIR="/$1/`basename $DEVICE`"
349
	   mount_device $DEVICE $DIR
351
	   mount_device $DEVICE $DIR
350
	   if [ $? -ne 0 ]; then continue; fi
352
	   if [ $? -ne 0 ]; then continue; fi
351
	   # FOUND=`ls -A1d $DIR/livecd.sgn $DIR/*/livecd.sgn 2>/dev/null | head -n 1`
353
	   # FOUND=`find $DIR -name livecd.sgn -type f | head -n 1`
352
	   FOUND=`find $DIR -name livecd.sgn -type f | head -n 1`
354
	   FOUND=`ls -A1d $DIR/livecd.sgn $DIR/*/livecd.sgn 2>/dev/null | head -n 1`
353
	   if [ "$FOUND" = "" ]; then umount $DIR 2>/dev/null; rmdir $DIR 2>/dev/null
355
	   if [ "$FOUND" = "" ]; then umount $DIR 2>/dev/null; rmdir $DIR 2>/dev/null
354
	   else dirname "$FOUND"; return 1; fi
356
	   else dirname "$FOUND"; return 1; fi
355
       done
357
       done
356
   else
358
   else
357
      # FOUND=`ls -A1d $DIR/livecd.sgn $DIR/*/livecd.sgn 2>/dev/null | head -n 1`
359
       # FOUND=`find $DIR -name livecd.sgn -type f | head -n 1`
358
       FOUND=`find $DIR -name livecd.sgn -type f | head -n 1`
360
       FOUND=`ls -A1d $DIR/livecd.sgn $DIR/*/livecd.sgn 2>/dev/null | head -n 1`
359
       if [ "$FOUND" != "" ]; then 
361
       if [ "$FOUND" != "" ]; then 
360
	   dirname "$FOUND"
362
	   dirname "$FOUND"
361
       fi
363
       fi
362
   fi
364
   fi
-
 
365
   echo "$PRINTK" >/proc/sys/kernel/printk	   
363
 
366
 
364
}
367
}
365
 
368
 
366
# ===========================================================
369
# ===========================================================
367
# hardware preparation functions
370
# hardware preparation functions
368
# ===========================================================
371
# ===========================================================
369
 
372
 
370
# Create block devices to /dev described by /sys entries
373
# Create block devices to /dev described by /sys entries
371
#
374
#
372
create_block_devices()
375
create_block_devices()
373
{
376
{
374
   echolog "creating /dev entries for block devices"
377
   echolog "creating /dev entries for block devices"
375
   ls -A1d /sys/block/*/dev /sys/block/*/*/dev 2>/dev/null | grep -v loop | while read BLOCK; do
378
   ls -A1d /sys/block/*/dev /sys/block/*/*/dev 2>/dev/null | grep -v loop | while read BLOCK; do
376
      DEVICE="/dev/`basename \`dirname $BLOCK\``"
379
      DEVICE="/dev/`basename \`dirname $BLOCK\``"
377
      if [ ! -b $DEVICE ]; then
380
      if [ ! -b $DEVICE ]; then
378
         MINORMAJOR="`head -n 1 $BLOCK | tr ':' ' '`"
381
         MINORMAJOR="`head -n 1 $BLOCK | tr ':' ' '`"
379
         mknod $DEVICE b $MINORMAJOR
382
         mknod $DEVICE b $MINORMAJOR
380
      fi
383
      fi
381
   done
384
   done
382
}
385
}
383
 
386
 
384
# modprobe kernel modules needed for the LiveCD
387
# modprobe kernel modules needed for the LiveCD
385
#
388
#
386
modprobe_essential_modules()
389
modprobe_essential_modules()
387
{
390
{
388
   echolog "starting loop device support"
391
   echolog "starting loop device support"
389
   modprobe_module loop max_loop=32
392
   modprobe_module loop max_loop=32
390
   echolog "starting cdrom support"
393
   echolog "starting cdrom support"
391
   modprobe_module ide_cd
394
   modprobe_module ide_cd
392
   modprobe_module ide-cd
395
   modprobe_module ide-cd
393
   modprobe_module sr_mod
396
   modprobe_module sr_mod
394
   modprobe_module cdrom
397
   modprobe_module cdrom
395
   echolog "starting cdrom filesystem support"
398
   echolog "starting cdrom filesystem support"
396
   modprobe_module isofs
399
   modprobe_module isofs
397
   echolog "starting squashfs support"
400
   echolog "starting squashfs support"
398
   modprobe_module squashfs
401
   modprobe_module squashfs
399
   echolog "starting unionfs/aufs support"
402
   echolog "starting unionfs/aufs support"
400
   modprobe_module unionfs
403
   modprobe_module unionfs
401
   modprobe_module aufs
404
   modprobe_module aufs
402
   echolog "starting vfat support"
405
   echolog "starting vfat support"
403
   # modprobe_module nls_cp437
406
   # modprobe_module nls_cp437
404
   # modprobe_module nls_iso8859-1
407
   # modprobe_module nls_iso8859-1
405
   # modprobe_module nls_iso8859-2
408
   # modprobe_module nls_iso8859-2
406
   modprobe_module vfat
409
   modprobe_module vfat
407
   echolog "starting ntfs support"
410
   echolog "starting ntfs support"
408
   modprobe_module ntfs
411
   modprobe_module ntfs
409
   modprobe_module nls_utf8
412
   modprobe_module nls_utf8
410
   create_block_devices
413
   create_block_devices
411
}
414
}
412
 
415
 
413
 
416
 
414
# modprobe kernel modules needed for USB masstorage devices
417
# modprobe kernel modules needed for USB masstorage devices
415
#
418
#
416
modprobe_usb_sata_modules()
419
modprobe_usb_sata_modules()
417
{
420
{
418
   echolog "starting USB and SATA support"
421
   echolog "starting USB and SATA support"
419
   modprobe_module ehci-hcd
422
   modprobe_module ehci-hcd
420
   modprobe_module ohci-hcd
423
   modprobe_module ohci-hcd
421
   modprobe_module uhci-hcd
424
   modprobe_module uhci-hcd
422
   modprobe_module scsi_mod
425
   modprobe_module scsi_mod
423
 
426
 
424
   modprobe_module libata
427
   modprobe_module libata
425
   modprobe_module ata_piix
428
   modprobe_module ata_piix
426
   modprobe_module ahci
429
   modprobe_module ahci
427
   modprobe_module sata_nv
430
   modprobe_module sata_nv
428
   modprobe_module sg
431
   modprobe_module sg
429
 
432
 
430
   modprobe_module sd_mod
433
   modprobe_module sd_mod
431
   modprobe_module sr_mod
434
   modprobe_module sr_mod
432
   modprobe_module usb-storage
435
   modprobe_module usb-storage
433
   echolog "waiting for USB devices, max 8 seconds"
436
   echolog "waiting for USB devices, max 8 seconds"
434
   sleep 8
437
   sleep 8
435
   create_block_devices
438
   create_block_devices
436
}
439
}
437
 
440
 
438
# modprobe nfs kernel modules
441
# modprobe nfs kernel modules
439
#
442
#
440
modprobe_nfs_modules()
443
modprobe_nfs_modules()
441
{
444
{
442
   echolog "starting nfs support"
445
   echolog "starting nfs support"
443
   modprobe_module lockd
446
   modprobe_module lockd
444
   modprobe_module fscache
447
   modprobe_module fscache
445
   modprobe_module nfs_acl
448
   modprobe_module nfs_acl
446
   modprobe_module nfs
449
   modprobe_module nfs
447
}
450
}
448
 
451
 
449
# modprobe cifs kernel module
452
# modprobe cifs kernel module
450
#
453
#
451
modprobe_cifs_modules()
454
modprobe_cifs_modules()
452
{
455
{
453
  echolog "starting cifs support"
456
  echolog "starting cifs support"
454
  modprobe_module cifs
457
  modprobe_module cifs
455
}
458
}
456
 
459
 
457
# enable/disable CD autoejecting when unmounted
460
# enable/disable CD autoejecting when unmounted
458
# $1 = 1|0 ... enable|disable
461
# $1 = 1|0 ... enable|disable
459
#
462
#
460
cd_autoeject()
463
cd_autoeject()
461
{
464
{
462
   echo $1 >/proc/sys/dev/cdrom/autoeject
465
   echo $1 >/proc/sys/dev/cdrom/autoeject
463
}
466
}
464
 
467
 
465
# Disable DMA if nodma boot parameter is present
468
# Disable DMA if nodma boot parameter is present
466
#
469
#
467
setup_dma()
470
setup_dma()
468
{
471
{
469
   if [ ! "`cmdline_parameter nodma`" = "" ]; then
472
   if [ ! "`cmdline_parameter nodma`" = "" ]; then
470
      for DEVICE in `list_cdrom_devices` `list_disk_devices`; do
473
      for DEVICE in `list_cdrom_devices` `list_disk_devices`; do
471
         echolog "setting DMA support off for $DEVICE"
474
         echolog "setting DMA support off for $DEVICE"
472
         hdparm -d 0 $DEVICE
475
         hdparm -d 0 $DEVICE
473
      done
476
      done
474
   fi
477
   fi
475
}
478
}
476
 
479
 
477
# create correct fstab file in $1/etc/fstab and create apropriate
480
# create correct fstab file in $1/etc/fstab and create apropriate
478
# mount directories in $1
481
# mount directories in $1
479
# $1 = root directory (union)
482
# $1 = root directory (union)
480
#
483
#
481
activate_fstab()
484
activate_fstab()
482
{
485
{
483
   mkdir -p $1/etc
486
   mkdir -p $1/etc
484
   FSTAB="$1/etc/fstab"
487
   FSTAB="$1/etc/fstab"
485
   echo "tmpfs            /                tmpfs       defaults         0   0" >$FSTAB
488
   echo "tmpfs            /                tmpfs       defaults         0   0" >$FSTAB
486
   echo "devpts           /dev/pts         devpts      gid=5,mode=620   0   0" >>$FSTAB
489
   echo "devpts           /dev/pts         devpts      gid=5,mode=620   0   0" >>$FSTAB
487
   echo "proc             /proc            proc        defaults         0   0" >>$FSTAB
490
   echo "proc             /proc            proc        defaults         0   0" >>$FSTAB
488
 
491
 
489
   # all the rest will be done by runlast or by fstab-sync
492
   # all the rest will be done by runlast or by fstab-sync
490
   # search for SWAP done later in /etc/rc.sysinit
493
   # search for SWAP done later in /etc/rc.sysinit
491
}
494
}
492
 
495
 
493
 
496
 
494
# ===========================================================
497
# ===========================================================
495
# functions used for LiveCD on NFS 
498
# functions used for LiveCD on NFS 
496
# ===========================================================
499
# ===========================================================
497
 
500
 
498
# load network modules, if NFSROOT is set
501
# load network modules, if NFSROOT is set
499
# Urs Beyerle, PSI
502
# Urs Beyerle, PSI
500
#
503
#
501
 
504
 
502
# network devices found ?
505
# network devices found ?
503
#
506
#
504
found_nic()
507
found_nic()
505
{
508
{
506
    found="1"
509
    found="1"
507
    for iface in eth0 eth1 eth2 eth3 eth4 eth5; do
510
    for iface in eth0 eth1 eth2 eth3 eth4 eth5; do
508
	# nic already found ?
511
	# nic already found ?
509
	echo $FOUND_IFACE | grep -q $iface 
512
	echo $FOUND_IFACE | grep -q $iface 
510
	if [ $? -ne 0 ]; then
513
	if [ $? -ne 0 ]; then
511
	    ifconfig $iface > /dev/null 2>&1
514
	    ifconfig $iface > /dev/null 2>&1
512
	    if [ $? -eq 0 ]; then 
515
	    if [ $? -eq 0 ]; then 
513
		FOUND_IFACE="$FOUND_IFACE $iface"
516
		FOUND_IFACE="$FOUND_IFACE $iface"
514
		found="0"
517
		found="0"
515
	    fi
518
	    fi
516
	fi
519
	fi
517
    done
520
    done
518
    return $found
521
    return $found
519
}
522
}
520
 
523
 
521
# 1. load network driver defined by kernel parameter nic
524
# 1. load network driver defined by kernel parameter nic
522
#
525
#
523
load_network_module_nic()
526
load_network_module_nic()
524
{
527
{
525
    NIC="`cmdline_value nic`"
528
    NIC="`cmdline_value nic`"
526
    if [ -n "$NIC" ]; then
529
    if [ -n "$NIC" ]; then
527
	echolog "load module $NIC"
530
	echolog "load module $NIC"
528
	modprobe_module $NIC
531
	modprobe_module $NIC
529
    fi
532
    fi
530
}
533
}
531
 
534
 
532
 
535
 
533
# 2. auto probe for network card drivers
536
# 2. auto probe for network card drivers
534
#
537
#
535
load_network_module_auto()
538
load_network_module_auto()
536
{
539
{
537
    echolog "auto-detection of network driver ..."
540
    echolog "auto-detection of network driver ..."
538
    FOUND_NICS=""
541
    FOUND_NICS=""
539
    KERNEL="`uname -r`"
542
    KERNEL="`uname -r`"
540
    NETDRIVERS="`find /lib/modules/$KERNEL/kernel/drivers/net | grep -v mii | grep .ko | cut -d"/" -f8 | cut -d"." -f1 | uniq`"
543
    NETDRIVERS="`find /lib/modules/$KERNEL/kernel/drivers/net | grep -v mii | grep .ko | cut -d"/" -f8 | cut -d"." -f1 | uniq`"
541
    for driver in $NETDRIVERS; do
544
    for driver in $NETDRIVERS; do
542
       	modprobe_module $driver > /dev/null 2>&1
545
       	modprobe_module $driver > /dev/null 2>&1
543
	found_nic
546
	found_nic
544
	if [ $? -eq 0 ]; then
547
	if [ $? -eq 0 ]; then
545
	    echolog "found network card $driver"
548
	    echolog "found network card $driver"
546
	    echolog "load module $driver"
549
	    echolog "load module $driver"
547
	    FOUND_NICS="$FOUND_NICS $driver"
550
	    FOUND_NICS="$FOUND_NICS $driver"
548
	else
551
	else
549
	    rmmod $driver > /dev/null 2>&1
552
	    rmmod $driver > /dev/null 2>&1
550
	fi
553
	fi
551
    done
554
    done
552
 
555
 
553
    # clean up: remove unused modules until driver "mii"
556
    # clean up: remove unused modules until driver "mii"
554
    LOADED_DRIVERS="`lsmod | grep -v Module | cut -d" " -f1`"
557
    LOADED_DRIVERS="`lsmod | grep -v Module | cut -d" " -f1`"
555
    for driver in $LOADED_DRIVERS; do
558
    for driver in $LOADED_DRIVERS; do
556
	[ "$driver" = "mii" ]  && break
559
	[ "$driver" = "mii" ]  && break
557
	[ "$driver" = "ntfs" ] && break
560
	[ "$driver" = "ntfs" ] && break
558
	[ "$driver" = "vfat" ] && break
561
	[ "$driver" = "vfat" ] && break
559
	do_not_remove=""
562
	do_not_remove=""
560
	for nic in $FOUND_NICS; do
563
	for nic in $FOUND_NICS; do
561
	    echo $driver | grep -q $nic 
564
	    echo $driver | grep -q $nic 
562
	    [ $? -eq 0 ] && do_not_remove="$driver"
565
	    [ $? -eq 0 ] && do_not_remove="$driver"
563
	done
566
	done
564
	[ ! $do_not_remove ] && rmmod $driver > /dev/null 2>&1
567
	[ ! $do_not_remove ] && rmmod $driver > /dev/null 2>&1
565
    done
568
    done
566
}
569
}
567
 
570
 
568
# 3. detecting network card from pcitable list
571
# 3. detecting network card from pcitable list
569
#
572
#
570
load_network_module_pcitable()
573
load_network_module_pcitable()
571
{
574
{
572
    PCITABLE=/bin/pcitable
575
    PCITABLE=/bin/pcitable
573
    NICS=`lspci -n | awk '/Class 0200/ {print $4}' | tr ':' ' ' \
576
    NICS=`lspci -n | awk '/Class 0200/ {print $4}' | tr ':' ' ' \
574
	| while read x y ; do grep "0x$x.*0x$y" $PCITABLE \
577
	| while read x y ; do grep "0x$x.*0x$y" $PCITABLE \
575
	| awk '$3 !~ /"unknown"/ {print $3}' | tr -d '"' ; done`
578
	| awk '$3 !~ /"unknown"/ {print $3}' | tr -d '"' ; done`
576
    
579
    
577
    if [ -n "$NICS" ]; then
580
    if [ -n "$NICS" ]; then
578
	echolog "found network card(s): $NICS"
581
	echolog "found network card(s): $NICS"
579
	for driver in $NICS; do
582
	for driver in $NICS; do
580
	    echolog "load module $driver"
583
	    echolog "load module $driver"
581
	    modprobe_module $driver
584
	    modprobe_module $driver
582
	done
585
	done
583
    fi
586
    fi
584
}
587
}
585
 
588
 
586
# 4. ask the user for a network driver
589
# 4. ask the user for a network driver
587
#
590
#
588
load_network_module_ask()
591
load_network_module_ask()
589
{
592
{
590
    echo "ERROR: No network card detected!"
593
    echo "ERROR: No network card detected!"
591
    echo "Type in your network card driver (e.g. tg3, e1000). "
594
    echo "Type in your network card driver (e.g. tg3, e1000). "
592
    echo "Or ask your system administrator for help."
595
    echo "Or ask your system administrator for help."
593
    echo -n "Network card driver: "
596
    echo -n "Network card driver: "
594
    read driver
597
    read driver
595
    echo "load module $driver"
598
    echo "load module $driver"
596
    modprobe_module $driver
599
    modprobe_module $driver
597
}
600
}
598
 
601
 
599
# Try to find a network driver
602
# Try to find a network driver
600
#
603
#
601
load_network_modules()
604
load_network_modules()
602
{
605
{
603
    echolog "load network modules"
606
    echolog "load network modules"
604
 
607
 
605
    # mii maybe need by NIC driver
608
    # mii maybe need by NIC driver
606
    modprobe_module mii
609
    modprobe_module mii
607
 
610
 
608
    FOUND_IFACE=""
611
    FOUND_IFACE=""
609
    load_network_module_nic
612
    load_network_module_nic
610
    found_nic          || load_network_module_auto
613
    found_nic          || load_network_module_auto
611
    [ "$FOUND_IFACE" ] || load_network_module_pcitable
614
    [ "$FOUND_IFACE" ] || load_network_module_pcitable
612
    [ "$FOUND_IFACE" ] || load_network_module_ask
615
    [ "$FOUND_IFACE" ] || load_network_module_ask
613
 
616
 
614
    # remove mii, if not needed
617
    # remove mii, if not needed
615
    rmmod mii > /dev/null 2>&1
618
    rmmod mii > /dev/null 2>&1
616
}
619
}
617
 
620
 
618
 
621
 
619
# get DHCP lease
622
# get DHCP lease
620
# Urs Beyerle, PSI
623
# Urs Beyerle, PSI
621
#
624
#
622
get_dhcp_lease()
625
get_dhcp_lease()
623
{
626
{
624
    # create /dev/urandom (needed by udhcpc)
627
    # create /dev/urandom (needed by udhcpc)
625
    mknod /dev/urandom c 1 9
628
    mknod /dev/urandom c 1 9
626
 
629
 
627
    for iface in eth0 eth1 eth2 eth3 eth4 eth5; do
630
    for iface in eth0 eth1 eth2 eth3 eth4 eth5; do
628
	# interface up ?
631
	# interface up ?
629
	ifconfig $iface > /dev/null 2>&1
632
	ifconfig $iface > /dev/null 2>&1
630
	if [ $? -eq 0 ]; then
633
	if [ $? -eq 0 ]; then
631
	    # get dhcp lease
634
	    # get dhcp lease
632
	    echolog "try to get DHCP lease on $iface"
635
	    echolog "try to get DHCP lease on $iface"
633
	    udhcpc --now --quit --interface=$iface --script=/bin/udhcpc.script
636
	    udhcpc --now --quit --interface=$iface --script=/bin/udhcpc.script
634
	    [ $? -eq 0 ] && return
637
	    [ $? -eq 0 ] && return
635
	    echo "ERROR: couldn't get DHCP lease on $iface."
638
	    echo "ERROR: couldn't get DHCP lease on $iface."
636
	fi
639
	fi
637
    done
640
    done
638
}
641
}