Subversion Repositories livecd

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 beyerle@PS 1
#!/bin/bash
2
# initrd_create:  make initrd rootdisk by using busybox
3
#
4
# Author:	  Tomas M. <http://www.linux-live.org>
5
#
169 beyerle@PS 6
# added by Urs Beyerle:
1 beyerle@PS 7
#
8
# add modules: nfs, sunrpc, lockd, nfs_acl (found in nfs_common)
9
# add drivers/net
10
# add x86_64 support
11
# add sata modules: ata_piix, libata
12
# add module: jbd
13
# add module: sr_mod
14
# unionctl.static can be installed locally
15
# add module ahci
16
# add module forcedeth 
17
# source ../../livecd.conf instead of ../config
18
# changes need for SL5:
19
#  - initrd blocksize to 4096 (instead of 1024)
20
#  - add fscache (for NFS support)
21
#  - add ide-cd, cdrom (for CD-ROM support)
23 beyerle@PS 22
# read $KERNEL from $1, can overwrite setting in livecd.conf
39 beyerle@PS 23
# add aufs (replacement for unionfs)
24
# add rev to static-binaries (for unionctl of aufs)
99 beyerle@PS 25
# create links to all busybox commands (for busybox 1.6.1)
116 beyerle@PS 26
# add sg.ko
126 beyerle@PS 27
# add sata_nv
158 beyerle@PS 28
# add cifs kernel module
205 beyerleu 29
# add sata_svw
1 beyerle@PS 30
#
31
 
32
# . ../config || exit 1
23 beyerle@PS 33
 
1 beyerle@PS 34
. ../../livecd.conf || exit 1
35
 
23 beyerle@PS 36
# set an other kernel than the one set in livecd.conf
37
[ "$1" ] && KERNEL=$1
1 beyerle@PS 38
echo "take blocksize=$INITRD_BLOCKSIZE for initrd"
39
 
40
# arch
41
ARCH=$( /bin/arch )
42
[ "$ARCH" != "x86_64" ] && ARCH=i686
43
 
23 beyerle@PS 44
 
45
 
1 beyerle@PS 46
# rcopy is a recursive cp, which copies also symlink's real source
47
# $1 = source (may be a regular file or symlink)
48
# $2 = target PARENT
49
#
50
rcopy()
51
{
52
   if [ -L "$1" ]; then
53
      REALPATH="`readlink -f \"$1\"`"
54
      cp --parent -R "$REALPATH" "$2"
55
      ln -sf "$REALPATH" "$2/$1"
56
   else
57
      cp --parent -R "$1" "$2"
58
   fi
59
   if [ "$?" -ne 0 ]; then
60
      echo "---------------------------"
61
      echo "Error occured while trying to copy \"$1\" to \"$2\""
62
      echo "nevertheless your LiveCD may still work."
63
      echo "Possible reason: not enough free space in initrd or source doesn't exist"
64
      echo "---------------------------"
65
   fi
66
}
67
 
68
# copy file/dir only if it exists, else skip with no error
69
# $1 = source (may not exist)
70
# $2 = target PARENT
71
#
72
rcopy_ex()
73
{
74
   if [ -a "$1" ]; then
75
      rcopy "$1" "$2"
76
   fi
77
}
78
 
79
debug()
80
{
81
   # uncomment to show debug messages
82
   # echo "$@"
83
   return 0
84
}
85
 
86
##################################################
87
# Create INITRD image now:
88
 
89
MOUNTDIR=/tmp/initrd_mountdir_$$
90
INITRD_TREE=/tmp/initrd_tree_$$
91
 
92
LMK="lib/modules/$KERNEL"
93
 
39 beyerle@PS 94
UNIONFS_TYPE=""
95
 
96
if [ -e /$LMK/kernel/fs/unionfs/unionfs.ko ] || \
97
   [ -e kernel-modules/${KERNEL}_$ARCH/unionfs.ko.gz ]; then
98
    UNIONFS_TYPE="unionfs"
1 beyerle@PS 99
fi
39 beyerle@PS 100
if [ -e /$LMK/kernel/fs/aufs/aufs.ko ] || \
101
   [ -e kernel-modules/${KERNEL}_$ARCH/aufs.ko.gz ]; then
102
    UNIONFS_TYPE="aufs"
103
fi
104
if [ ! $UNIONFS_TYPE ]; then
107 beyerle@PS 105
    echo "ERROR: Neither aufs nor unionfs kernel module found."
39 beyerle@PS 106
    exit 1
107
fi
1 beyerle@PS 108
 
109
if [ ! -e /$LMK/kernel/fs/squashfs/squashfs.ko ] && \
110
   [ ! -e kernel-modules/${KERNEL}_$ARCH/squashfs.ko.gz ]; then
111
    echo "ERROR: Squashfs kernel module not found."
112
    exit 1
113
fi
114
 
115
debug "creating directories"
116
mkdir -p $INITRD_TREE/{etc,dev,bin,mnt,livecd,proc,lib,sbin,sys,tmp,var/log}
117
 
118
debug "creating some essential devices in rootdisk"
119
mknod $INITRD_TREE/dev/console c 5 1
120
mknod $INITRD_TREE/dev/null c 1 3
121
mknod $INITRD_TREE/dev/ram b 1 1
122
mknod $INITRD_TREE/dev/systty c 4 0
123
mknod $INITRD_TREE/dev/tty c 5 0
69 beyerle@PS 124
for i in 1 2 3 4 5 6; do
125
  mknod $INITRD_TREE/dev/tty$i c 4 $i;
126
done
1 beyerle@PS 127
 
128
loops=255
129
while [ $loops -ge 0 ]; do
130
   mknod $INITRD_TREE/dev/loop$loops b 7 $loops
131
   loops=$(($loops-1))
132
done
133
 
134
debug "copying files to the rootdisk"
135
touch $INITRD_TREE/etc/{m,fs}tab
136
cp {linuxrc,liblinuxlive} $INITRD_TREE # symlink will be copied as original file
137
chmod a+x $INITRD_TREE/linuxrc
138
 
139
cp static-binaries/modprobe $INITRD_TREE/sbin
140
cp static-binaries/busybox $INITRD_TREE/bin
100 beyerle@PS 141
# cp static-binaries/unionctl_${ARCH} $INITRD_TREE/bin/unionctl 
142
if [ -x /usr/sbin/unionctl.static ]; then 
143
    cp -a /usr/sbin/unionctl.static $INITRD_TREE/bin/unionctl 
144
else
145
    echo "NOTE: /usr/sbin/unionctl.static was not found !"
146
    echo "assuming you're using unionfs 2.x"
147
fi
1 beyerle@PS 148
ln -s busybox $INITRD_TREE/bin/[
98 beyerle@PS 149
ln -s busybox $INITRD_TREE/bin/[[
97 beyerle@PS 150
BUSYBOXCMDS="ash awk basename cat chmod chown chroot \
151
        clear cp cut dd df dirname du echo egrep eject \
152
        expr false fdisk fgrep find free grep gunzip halt \
153
        hdparm head hostname ifconfig ifdown ifup insmod \
154
        kill killall last ln logger losetup ls lsmod md5sum \
155
        mkdir mkfifo mknod mkswap mktemp more \
156
        mount mv pivot_root poweroff ps pwd readlink realpath \
157
        reboot rm rmdir rmmod route sed sh sleep sort \
158 beyerle@PS 158
        swapoff swapon switch_root sync tail tar tee test touch tr \
105 beyerle@PS 159
        true udhcpc umount uname uniq vi which wc xargs \
160
        zcat"
97 beyerle@PS 161
for c in $BUSYBOXCMDS; do
162
    ln -s busybox $INITRD_TREE/bin/$c
163
done
164
 
1 beyerle@PS 165
# dhcp startup script
166
cp static-binaries/udhcpc.script $INITRD_TREE/bin
167
ln -s ../bin/busybox $INITRD_TREE/sbin/ifconfig
168
 
169
# lspci and pcitable for network card detection
37 beyerle@PS 170
cp static-binaries/lspci    $INITRD_TREE/sbin
1 beyerle@PS 171
cp static-binaries/pcitable $INITRD_TREE/bin
172
 
39 beyerle@PS 173
# rev needed for unionctl of aufs
174
if [ "$UNIONFS_TYPE" = "aufs" ]; then
175
    cp static-binaries/rev      $INITRD_TREE/bin
176
fi
1 beyerle@PS 177
 
178
LMK="lib/modules/$KERNEL"
179
 
39 beyerle@PS 180
# necessary modules and dependency files
1 beyerle@PS 181
mkdir -p $INITRD_TREE/$LMK/kernel/fs
182
cp kernel-modules/${KERNEL}_$ARCH/unionfs.ko.gz $INITRD_TREE/$LMK/kernel/fs 2>/dev/null
37 beyerle@PS 183
cp kernel-modules/${KERNEL}_$ARCH/aufs.ko.gz $INITRD_TREE/$LMK/kernel/fs 2>/dev/null
1 beyerle@PS 184
cp kernel-modules/${KERNEL}_$ARCH/squashfs.ko.gz $INITRD_TREE/$LMK/kernel/fs 2>/dev/null
185
rcopy_ex /$LMK/kernel/fs/unionfs $INITRD_TREE 2>/dev/null
37 beyerle@PS 186
rcopy_ex /$LMK/kernel/fs/aufs $INITRD_TREE 2>/dev/null
1 beyerle@PS 187
rcopy_ex /$LMK/kernel/fs/squashfs $INITRD_TREE 2>/dev/null
188
 
39 beyerle@PS 189
# copy filesystem modules, if not directly copied into kernel
1 beyerle@PS 190
rcopy_ex /$LMK/kernel/lib/zlib_inflate $INITRD_TREE 2>/dev/null
191
rcopy_ex /$LMK/kernel/drivers/block/loop* $INITRD_TREE 2>/dev/null
192
 
193
rcopy_ex /$LMK/kernel/fs/isofs $INITRD_TREE 2>/dev/null
194
rcopy_ex /$LMK/kernel/fs/fat $INITRD_TREE 2>/dev/null
195
rcopy_ex /$LMK/kernel/fs/vfat $INITRD_TREE 2>/dev/null
196
rcopy_ex /$LMK/kernel/fs/ntfs $INITRD_TREE 2>/dev/null
197
rcopy_ex /$LMK/kernel/fs/ext3 $INITRD_TREE 2>/dev/null
198
rcopy_ex /$LMK/kernel/fs/jbd $INITRD_TREE 2>/dev/null
199
 
200
# for NFS support
201
rcopy_ex /$LMK/kernel/fs/nfs $INITRD_TREE 2>/dev/null
202
rcopy_ex /$LMK/kernel/fs/nfs_common $INITRD_TREE 2>/dev/null
203
rcopy_ex /$LMK/kernel/fs/lockd $INITRD_TREE 2>/dev/null
204
rcopy_ex /$LMK/kernel/fs/fscache $INITRD_TREE 2>/dev/null
205
rcopy_ex /$LMK/kernel/net/sunrpc $INITRD_TREE 2>/dev/null
206
 
158 beyerle@PS 207
# for cifs-support
208
rcopy_ex /$LMK/kernel/fs/cifs $INITRD_TREE 2>/dev/null
209
 
1 beyerle@PS 210
# net drivers
104 beyerle@PS 211
rcopy_ex /$LMK/kernel/drivers/net               $INITRD_TREE 2>/dev/null
1 beyerle@PS 212
rcopy_ex /$LMK/updates/drivers/net/sky2/sky2.ko $INITRD_TREE 2>/dev/null
213
 
214
# add language support for filesystems
69 beyerle@PS 215
# rcopy_ex /$LMK/kernel/fs/nls/ $INITRD_TREE 2>/dev/null
120 beyerle@PS 216
# rcopy_ex /$LMK/kernel/fs/nls/nls_cp437.*     $INITRD_TREE 2>/dev/null
217
# rcopy_ex /$LMK/kernel/fs/nls/nls_iso8859-1.* $INITRD_TREE 2>/dev/null
218
# rcopy_ex /$LMK/kernel/fs/nls/nls_iso8859-2.* $INITRD_TREE 2>/dev/null
166 beyerle@PS 219
rcopy_ex /$LMK/kernel/fs/nls/nls_utf8.*        $INITRD_TREE 2>/dev/null
1 beyerle@PS 220
 
221
# cdrom support (for SL5)
222
rcopy_ex /$LMK/kernel/drivers/ide/ide-cd.ko $INITRD_TREE 2>/dev/null
223
rcopy_ex /$LMK/kernel/drivers/cdrom/cdrom.ko $INITRD_TREE 2>/dev/null
224
 
225
# usb modules
226
rcopy_ex /$LMK/kernel/drivers/usb/storage $INITRD_TREE 2>/dev/null
227
rcopy_ex /$LMK/kernel/drivers/usb/host/ehci-hcd* $INITRD_TREE 2>/dev/null
228
rcopy_ex /$LMK/kernel/drivers/usb/host/ohci-hcd* $INITRD_TREE 2>/dev/null
229
rcopy_ex /$LMK/kernel/drivers/usb/host/uhci-hcd* $INITRD_TREE 2>/dev/null
230
rcopy_ex /$LMK/kernel/drivers/scsi/scsi_mod.ko $INITRD_TREE 2>/dev/null
231
rcopy_ex /$LMK/kernel/drivers/scsi/sd_mod.ko $INITRD_TREE 2>/dev/null
232
rcopy_ex /$LMK/kernel/drivers/scsi/sr_mod.ko $INITRD_TREE 2>/dev/null
233
 
39 beyerle@PS 234
# disk (scsi, ide, raid, pcmcia) modules
1 beyerle@PS 235
#rcopy_ex /$LMK/kernel/drivers/scsi $INITRD_TREE
236
#rcopy_ex /$LMK/kernel/drivers/ide $INITRD_TREE
237
#rcopy_ex /$LMK/kernel/drivers/pcmcia $INITRD_TREE
238
 
39 beyerle@PS 239
# disk sata (some sata modules)
1 beyerle@PS 240
rcopy_ex /$LMK/kernel/drivers/scsi/libata.ko $INITRD_TREE 2>/dev/null
120 beyerle@PS 241
rcopy_ex /$LMK/kernel/drivers/ata/libata.ko $INITRD_TREE 2>/dev/null
1 beyerle@PS 242
rcopy_ex /$LMK/kernel/drivers/scsi/ata_piix.ko $INITRD_TREE 2>/dev/null
122 beyerle@PS 243
rcopy_ex /$LMK/kernel/drivers/ata/ata_piix.ko $INITRD_TREE 2>/dev/null
1 beyerle@PS 244
rcopy_ex /$LMK/kernel/drivers/scsi/ahci.ko $INITRD_TREE 2>/dev/null
122 beyerle@PS 245
rcopy_ex /$LMK/kernel/drivers/ata/ahci.ko $INITRD_TREE 2>/dev/null
126 beyerle@PS 246
rcopy_ex /$LMK/kernel/drivers/scsi/sata_nv.ko $INITRD_TREE 2>/dev/null
247
rcopy_ex /$LMK/kernel/drivers/ata/sata_nv.ko $INITRD_TREE 2>/dev/null
205 beyerleu 248
rcopy_ex /$LMK/kernel/drivers/ata/sata_svw.ko $INITRD_TREE 2>/dev/null
116 beyerle@PS 249
rcopy_ex /$LMK/kernel/drivers/scsi/sg.ko $INITRD_TREE 2>/dev/null
1 beyerle@PS 250
 
251
 
252
debug "gzipping kernel modules"
253
find $INITRD_TREE -name "*.ko" | xargs -r gzip --best
254
 
255
debug "generating module dependency files"
256
depmod -b $INITRD_TREE $KERNEL
257
 
258
debug "creating empty image file $INITRDIMG"
259
dd if=/dev/zero of=$INITRDIMG bs=$INITRD_BLOCKSIZE count=$RAM0SIZE >/dev/null 2>/dev/null
260
 
261
debug "making filesystem"
262
mkfs -t ext2 -F -m 0 -b $INITRD_BLOCKSIZE -i 1024 $INITRDIMG 2>/dev/null >/dev/null
263
 
264
debug "creating empty directory $MOUNTDIR"
265
rm -Rf $MOUNTDIR
266
mkdir $MOUNTDIR
267
 
268
debug "mounting $INITRDIMG to it"
269
mount -o loop $INITRDIMG $MOUNTDIR
270
if [ "$?" -ne 0 ]; then
271
   echo "Error mounting initrd! Not enough free loop devices?"
272
   exit 1
273
fi
274
 
275
debug "copying content of $INITRD_TREE to $MOUNTDIR"
276
rmdir $MOUNTDIR/lost+found
277
cp -R --preserve $INITRD_TREE/* $MOUNTDIR
278
 
279
debug "unmounting $MOUNTDIR"
280
umount $MOUNTDIR
281
 
282
debug "gzipping $INITRDIMG"
283
gzip --best $INITRDIMG
284
 
285
debug "deleting directory $MOUNTDIR"
286
rmdir $MOUNTDIR
287
 
288
debug "deleting directory $INITRD_TREE"
289
rm -Rf $INITRD_TREE
290
 
291
debug "$INITRDIMG.gz created"