Subversion Repositories livecd

Rev

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

Rev 169 Rev 170
1
#!/bin/ash
1
#!/bin/ash
2
#
2
#
3
# Original version from http://www.linux-live.org/
3
# Original version from http://www.linux-live.org/
4
#
4
#
5
# modified by Urs Beyerle
5
# modified by Urs Beyerle
6
# - to allow LiveCD mounted over NFS
6
# - to allow LiveCD mounted over NFS
7
# - add support for LiveCD on SATA devices
7
# - add support for LiveCD on SATA devices
8
# - to allow LiveCD mounted over CIFS
8
# - to allow LiveCD mounted over CIFS
9
 
9
 
10
export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin
10
export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin
11
. liblinuxlive
11
. liblinuxlive
12
 
12
 
13
 
13
 
14
echolog "mounting /proc and /sys filesystems"
14
echolog "mounting /proc and /sys filesystems"
15
mount -t proc proc /proc
15
mount -t proc proc /proc
16
mount -t sysfs sysfs /sys
16
mount -t sysfs sysfs /sys
17
ln -sf /proc/mounts /etc/mtab # this allows us to use umount -a
17
ln -sf /proc/mounts /etc/mtab # this allows us to use umount -a
18
 
18
 
19
# setup DEBUGCMD variable. If debug boot option is present, call debug()
19
# setup DEBUGCMD variable. If debug boot option is present, call debug()
20
# function several times during script's execution
20
# function several times during script's execution
21
if [ "`cmdline_parameter debug`" ]; then DEBUGCMD="debug"; else DEBUGCMD=""; fi
21
if [ "`cmdline_parameter debug`" ]; then DEBUGCMD="debug"; else DEBUGCMD=""; fi
22
 
22
 
23
$DEBUGCMD
23
$DEBUGCMD
24
 
24
 
25
# amount of RAM to store changes
25
# amount of RAM to store changes
26
RAMSIZE="`cmdline_value ramsize`"
26
RAMSIZE="`cmdline_value ramsize`"
27
if [ "$RAMSIZE" = "" ]; then RAMSIZE="70%"; fi
27
if [ "$RAMSIZE" = "" ]; then RAMSIZE="70%"; fi
28
 
28
 
29
# I have to set these variables very carefully
29
# I have to set these variables very carefully
30
UNION=/union
30
UNION=/union
31
MEMORY=/memory
31
MEMORY=/memory
32
MOUNTDIR=livecd
32
MOUNTDIR=livecd
33
CHANGES=$MEMORY/changes
33
CHANGES=$MEMORY/changes
34
COPY2RAM=$MEMORY/copy2ram
34
COPY2RAM=$MEMORY/copy2ram
35
IMAGES=$MEMORY/images
35
IMAGES=$MEMORY/images
36
INITRAMDISK=$MOUNTDIR/live
36
INITRAMDISK=$MOUNTDIR/live
37
 
37
 
38
# set NFSROOT and NFSOPT 
38
# set NFSROOT and NFSOPT 
39
NFSROOT="`cmdline_value nfsroot`"
39
NFSROOT="`cmdline_value nfsroot`"
40
NFSOPTS="`cmdline_value nfsopts`"
40
NFSOPTS="`cmdline_value nfsopts`"
41
if [ "$NFSOPTS" = "" ]; then
41
if [ "$NFSOPTS" = "" ]; then
42
    NFSOPTS=nolock,ro,rsize=8192,wsize=8192,hard,intr
42
    NFSOPTS=nolock,ro,rsize=8192,wsize=8192,hard,intr
43
fi
43
fi
44
 
44
 
45
# set CIFSROOT and CIFSOPTS
45
# set CIFSROOT and CIFSOPTS
46
CIFSROOT="`cmdline_value cifsroot`"
46
CIFSROOT="`cmdline_value cifsroot`"
47
CIFSOPTS="`cmdline_value cifsopts`"
47
CIFSOPTS="`cmdline_value cifsopts`"
48
 
48
 
49
# we need cdrom support, isofs support, unionfs/aufs support, etc
49
# we need cdrom support, isofs support, unionfs/aufs support, etc
50
modprobe_essential_modules
50
modprobe_essential_modules
51
 
51
 
52
# disable DMA if nodma parameter is used
52
# disable DMA if nodma parameter is used
53
setup_dma
53
setup_dma
54
 
54
 
55
$DEBUGCMD
55
$DEBUGCMD
56
 
56
 
57
# if NFSROOT is set:
57
# if NFSROOT is set:
58
echolog "check for nfsroot or cifsroot"
58
echolog "check for nfsroot or cifsroot"
59
if [ "$NFSROOT" != "" ]; then
59
if [ "$NFSROOT" != "" ]; then
60
 
60
 
61
   echolog "nfsroot: $NFSROOT"
61
   echolog "nfsroot: $NFSROOT"
62
   $DEBUGCMD
62
   $DEBUGCMD
63
   load_network_modules
63
   load_network_modules
64
   $DEBUGCMD
64
   $DEBUGCMD
65
   get_dhcp_lease
65
   get_dhcp_lease
66
   $DEBUGCMD
66
   $DEBUGCMD
67
   modprobe_nfs_modules
67
   modprobe_nfs_modules
68
 
68
 
69
# if CIFSROOT is set
69
# if CIFSROOT is set
70
elif [ "$CIFSROOT" != "" ]; then
70
elif [ "$CIFSROOT" != "" ]; then
71
 
71
 
72
   echolog "cifsroot: $CIFSROOT"
72
   echolog "cifsroot: $CIFSROOT"
73
   $DEBUGCMD
73
   $DEBUGCMD
74
   load_network_modules
74
   load_network_modules
75
   $DEBUGCMD
75
   $DEBUGCMD
76
   get_dhcp_lease
76
   get_dhcp_lease
77
   $DEBUGCMD
77
   $DEBUGCMD
78
   modprobe_cifs_modules
78
   modprobe_cifs_modules
79
 
79
 
80
fi
80
fi
81
 
81
 
82
$DEBUGCMD
82
$DEBUGCMD
83
 
83
 
84
# $UNION will be used as a root directory, livecd modules will be added soon.
84
# $UNION will be used as a root directory, livecd modules will be added soon.
85
echolog "setup union on $UNION"
85
echolog "setup union on $UNION"
86
mkdir -p $UNION
86
mkdir -p $UNION
87
mkdir -p $MEMORY
87
mkdir -p $MEMORY
88
 
88
 
-
 
89
# looking for changes= parameter
89
CHANGESDEV="`cmdline_value changes`"
90
CHANGESVAL="`cmdline_value changes`"
90
if [ "$CHANGESDEV" != "" ]; then
91
if [ "$CHANGESVAL" != "" ]; then 
-
 
92
    # disable kernel warnings
91
   echo "mounting $CHANGESDEV to $MEMORY"
93
    PRINTK=`cat /proc/sys/kernel/printk`
92
   # we may need usb and sata support
94
    echo "0" >/proc/sys/kernel/printk
-
 
95
    find_changes
93
   modprobe_usb_sata_modules
96
    # enable kernel warnings
94
   mount_device $CHANGESDEV $MEMORY
97
    echo "$PRINTK" >/proc/sys/kernel/printk
-
 
98
fi
-
 
99
 
95
else false; fi
100
$DEBUGCMD
96
 
101
 
97
# mount tmpfs only in the case when changes= boot parameter was empty
102
# mount tmpfs only in the case when changes= boot parameter was empty
-
 
103
if [ "$CHANGESVAL" = "" ]; then 
98
# or we were not able to mount the storage device
104
    echolog "mount tmpfs"
99
if [ $? -ne 0 ]; then mount -t tmpfs -o "size=$RAMSIZE" tmpfs $MEMORY; fi
105
    mount -t tmpfs -o "size=$RAMSIZE" tmpfs $MEMORY
-
 
106
    $DEBUGCMD
-
 
107
fi
100
 
108
 
101
mkdir -p $CHANGES
109
mkdir -p $CHANGES
102
mkdir -p $COPY2RAM
110
mkdir -p $COPY2RAM
103
mkdir -p $IMAGES
111
mkdir -p $IMAGES
104
 
112
 
105
# mount unionfs or aufs
113
# mount unionfs or aufs
106
lsmod | grep -q ^unionfs
114
lsmod | grep -q ^unionfs
107
if [ $? -eq 0 ]; then  
115
if [ $? -eq 0 ]; then  
108
    mount -t unionfs -o dirs=$CHANGES=rw unionfs $UNION
116
    mount -t unionfs -o dirs=$CHANGES=rw unionfs $UNION
109
    if [ $? -ne 0 ]; then fatal "can't setup union in $UNION directory"; fi
117
    if [ $? -ne 0 ]; then fatal "can't setup union in $UNION directory"; fi
110
    echolog "unionfs mounted"
118
    echolog "unionfs mounted"
111
else
119
else
112
    mount -t aufs -o br:$CHANGES=rw aufs $UNION
120
    mount -t aufs -o br:$CHANGES=rw aufs $UNION
113
    if [ $? -ne 0 ]; then fatal "can't setup union (aufs) in $UNION directory"; fi
121
    if [ $? -ne 0 ]; then fatal "can't setup union (aufs) in $UNION directory"; fi
114
    echolog "aufs mounted"
122
    echolog "aufs mounted"
115
fi
123
fi
116
 
124
 
117
$DEBUGCMD
125
$DEBUGCMD
118
 
126
 
119
# try to find livecd data directory. If not found, try modprobing
127
# try to find livecd data directory. If not found, try modprobing
120
# USB and SATA kernel modules and repeat the find procedure again
128
# USB and SATA kernel modules and repeat the find procedure again
121
echolog "looking for data modules"
129
echolog "looking for data modules"
-
 
130
 
-
 
131
# disable kernel warnings
-
 
132
PRINTK=`cat /proc/sys/kernel/printk`
-
 
133
echo "0" >/proc/sys/kernel/printk
122
DATA="`find_live_data_dir $MOUNTDIR`";
134
DATA="`find_live_data_dir $MOUNTDIR`"
-
 
135
# enable kernel warnings
-
 
136
echo "$PRINTK" >/proc/sys/kernel/printk
-
 
137
 
123
if [ "$DATA" = "" ]; then modprobe_usb_sata_modules; DATA="`find_live_data_dir $MOUNTDIR`"; fi
138
if [ "$DATA" = "" ]; then modprobe_usb_sata_modules; DATA="`find_live_data_dir $MOUNTDIR`"; fi
124
if [ "$DATA" = "" ]; then fatal "Data for LiveCD not found."; fi
139
if [ "$DATA" = "" ]; then fatal "Data for LiveCD not found."; fi
125
echolog "LiveCD found in: $DATA"
140
echolog "LiveCD found in: $DATA"
126
 
141
 
127
$DEBUGCMD
142
$DEBUGCMD
128
 
143
 
129
# If toram or copy2ram boot parameter is present, copy all .mo modules to RAM.
144
# If toram or copy2ram boot parameter is present, copy all .mo modules to RAM.
130
# (skip modules from /optional/ which are not listed in load= boot option)
145
# (skip modules from /optional/ which are not listed in load= boot option)
131
# Finaly modify DATA variable so it will point to correct directory
146
# Finaly modify DATA variable so it will point to correct directory
132
if [ "`cmdline_parameter toram`" != "" -o "`cmdline_parameter copy2ram`" != "" ]; then
147
if [ "`cmdline_parameter toram`" != "" -o "`cmdline_parameter copy2ram`" != "" ]; then
133
   echolog "copying modules to RAM, this may take some time"
148
   echolog "copying modules to RAM, this may take some time"
134
   copy_to_ram $DATA $COPY2RAM
149
   copy_to_ram $DATA $COPY2RAM
135
   cd_autoeject 1
150
   cd_autoeject 1
136
   umount $DATA 2>/dev/null
151
   umount $DATA 2>/dev/null
137
   if [ $? -ne 0 ]; then umount `dirname $DATA` 2>/dev/null; fi
152
   if [ $? -ne 0 ]; then umount `dirname $DATA` 2>/dev/null; fi
138
   DATA=$COPY2RAM
153
   DATA=$COPY2RAM
139
   cd_autoeject 0
154
   cd_autoeject 0
140
fi
155
fi
141
 
156
 
142
mkdir -p $UNION/boot
157
mkdir -p $UNION/boot
143
mount -o bind $DATA $UNION/boot
158
mount -o bind $DATA $UNION/boot
144
 
159
 
145
$DEBUGCMD
160
$DEBUGCMD
146
 
161
 
147
# DATA contains path to the base directory of all .mo images which need
162
# DATA contains path to the base directory of all .mo images which need
148
# to be mounted and inserted into live filesystem. Do it now.
163
# to be mounted and inserted into live filesystem. Do it now.
149
echolog "inserting all modules and creating live filesystem"
164
echolog "inserting all modules and creating live filesystem"
150
union_insert_modules $UNION $DATA $IMAGES
165
union_insert_modules $UNION $DATA $IMAGES
151
 
166
 
152
$DEBUGCMD
167
$DEBUGCMD
153
 
168
 
154
echo "copying rootchanges"
169
echo "copying rootchanges"
155
copy_rootchanges $DATA $UNION
170
copy_rootchanges $DATA $UNION
156
 
171
 
157
$DEBUGCMD
172
$DEBUGCMD
158
 
173
 
159
echo "creating /etc/fstab"
174
echo "creating /etc/fstab"
160
activate_fstab $UNION
175
activate_fstab $UNION
161
 
176
 
162
# More likely these directories aren't there.
177
# More likely these directories aren't there.
163
# Even if they are, this won't hurt.
178
# Even if they are, this won't hurt.
164
mkdir -p $UNION/proc
179
mkdir -p $UNION/proc
165
mkdir -p $UNION/sys
180
mkdir -p $UNION/sys
166
mkdir -p $UNION/tmp
181
mkdir -p $UNION/tmp
167
chmod 1777 $UNION/tmp
182
chmod 1777 $UNION/tmp
168
mkdir -p $UNION/dev
183
mkdir -p $UNION/dev
169
mkdir -p $UNION/initrd
184
mkdir -p $UNION/initrd
170
 
185
 
171
$DEBUGCMD
186
$DEBUGCMD
172
 
187
 
173
# no X? (set runlevel to 3)
188
# no X? (set runlevel to 3)
174
if [ "`cmdline_parameter nox`" ]; then
189
if [ "`cmdline_parameter nox`" ]; then
175
  echo "set runlevel to 3"
190
  echo "set runlevel to 3"
176
  sed -i "s/id:.:initdefault:/id:3:initdefault:/" $UNION/etc/inittab
191
  sed -i "s/id:.:initdefault:/id:3:initdefault:/" $UNION/etc/inittab
177
fi
192
fi
178
 
193
 
179
$DEBUGCMD
194
$DEBUGCMD
180
 
195
 
181
# Union contains all the files and directories unioned from all modules.
196
# Union contains all the files and directories unioned from all modules.
182
# Change root directory to it, and move initrd's root to /livecd/live/initramdisk
197
# Change root directory to it, and move initrd's root to /livecd/live/initramdisk
183
# Finaly execute /sbin/init to start the distribution.
198
# Finaly execute /sbin/init to start the distribution.
184
echolog "changing root directory..."
199
echolog "changing root directory..."
185
cd $UNION
200
cd $UNION
186
mkdir -p $INITRAMDISK
201
mkdir -p $INITRAMDISK
187
 
202
 
188
umount /sys # we won't need it anymore
203
umount /sys # we won't need it anymore
189
 
204
 
190
# if [ ! -e $UNION/dev/console ]; then mknod $UNION/dev/console c 5 1; fi
205
# if [ ! -e $UNION/dev/console ]; then mknod $UNION/dev/console c 5 1; fi
191
 
206
 
192
# Copy all dev files (found by mdev) to unioned dev directory
207
# Copy all dev files (found by mdev) to unioned dev directory
193
# so at least disk devices exist (your Linux may need them).
208
# so at least disk devices exist (your Linux may need them).
194
# Two exceptions, do not copy pty* and tty* devs.
209
# Two exceptions, do not copy pty* and tty* devs.
195
if [ ! -e /dev/console ]; then mknod /dev/console c 5 1; fi
210
if [ ! -e /dev/console ]; then mknod /dev/console c 5 1; fi
196
cp -fdR /dev . 2>/dev/null
211
cp -fdR /dev . 2>/dev/null
197
 
212
 
198
if [ -x $UNION/usr/sbin/chroot ];
213
if [ -x $UNION/usr/sbin/chroot ];
199
  then CHROOT=/usr/sbin/chroot
214
  then CHROOT=/usr/sbin/chroot
200
  else CHROOT=/usr/bin/chroot
215
  else CHROOT=/usr/bin/chroot
201
fi
216
fi
202
 
217
 
203
echolog "End of linux live scripts"
218
echolog "End of linux live scripts"
204
 
219
 
205
# pure magic ;-)
220
# pure magic ;-)
206
cat $UNION/bin/true >/dev/null
221
cat $UNION/bin/true >/dev/null
207
 
222
 
208
$DEBUGCMD
223
$DEBUGCMD
209
 
224
 
210
pivot_root . $INITRAMDISK
225
pivot_root . $INITRAMDISK
211
exec $CHROOT . sbin/init <dev/console >dev/console 2>&1
226
exec $CHROOT . sbin/init <dev/console >dev/console 2>&1
212
 
227
 
213
header "ERROR!"
228
header "ERROR!"
214
echolog "You are not supposed to be here, something went wrong!"
229
echolog "You are not supposed to be here, something went wrong!"
215
echolog "Even Ctrl+Alt+Del won't help you in kernel panic."
230
echolog "Even Ctrl+Alt+Del won't help you in kernel panic."
216
 
231