Subversion Repositories livecd

Rev

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

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