- run linuxrc in linemode on s390
[opensuse:installation-images.git] / bin / mk_initrd
1 #! /usr/bin/perl
2
3 # Create an initrd and put everything on it.
4 #
5 # Source files and the file list are taken from data/initrd; the initrd is
6 # stored in images/initrd.
7 #
8 # Usage:        mk_initrd
9
10 =head1 mk_initrd
11
12 C<mk_initrd> creates an initial ram disk C<initrd>.
13
14 The files to go onto the ram disk (aka initrd) are taken from
15 C<data/initrd/initrd.file_list>.
16
17 The initrd uses a Ext2 file system. The actual fs size and inode numbers
18 are coded in the C<mk_initrd> script. You I<can> vary these values but it
19 doesn't really pay of much. You will gain or loose a few bytes of the
20 compressed initrd size only.
21
22 The final compressed image is stored as C<images/initrd>.
23
24 =cut
25
26 #'quote for emacs
27
28 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
29 # the usual fuss...
30
31 BEGIN { unshift @INC, ( $0 =~ /(.*?)((?<![^\/])bin\/)?[^\/]+$/ )[0] . "lib" }
32 use ReadConfig;
33 use MakeMinixImage;
34 use MakeExt2Image;
35 use AddFiles;
36 use Conv2Image;
37 use CompressImage;
38
39 die "usage: $Script\n" if @ARGV;
40
41
42 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
43 # some config data
44
45 $srcdir = "${DataPath}initrd";
46 $tmpdir = "${BasePath}tmp/initrd";
47 $tmpdir_root = "${BasePath}tmp/root";
48 $moddir = "${BasePath}tmp/initrd/modules";
49 $modlist = "${BasePath}tmp/initrd.modlist";
50 $tmpdirx = "${BasePath}tmp/.initrd";
51 $image = "${ImagePath}initrd";
52 $arch = "$ConfigData{suse_arch}";
53 $gendir = "${DataPath}boot/gen";
54
55 # the compressed image size varies only slightly with these; about +-1k with
56 # reasonable inode/block combinations
57
58 # leave that much space
59 $extra_size = 600;              # kbyte
60 $extra_inodes = 200;
61
62 # just make them large enough
63 $start_size = 60000;            # kbyte
64 $start_inodes = 15000;
65
66 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
67 # now we really start...
68
69 # default to 'large'
70 $ENV{'initrd'} = 'large' if $ENV{'initrd'} eq '';
71
72 $image = "${ImagePath}$ENV{'initrd_name'}" if $ENV{'initrd_name'};
73
74 if($ENV{'keepinitrd'} != 1) {
75   # clean up
76   if(-d $tmpdir) {
77     SUSystem "rm -rf $tmpdir" and
78       die "$Script: failed to remove old $tmpdir";
79   }
80   if(-d $tmpdirx) {
81     SUSystem "rm -rf $tmpdirx" and
82       die "$Script: failed to remove old $tmpdirx";
83   }
84
85   SUSystem "rm -f ${BasePath}tmp/initrd.opt_mods";
86   SUSystem "rm -f $modlist";
87
88   $fl = "initrd";
89   $fl = $ENV{'filelist'} if exists $ENV{'filelist'};
90
91   AddFiles $tmpdir, "${srcdir}/$fl.file_list", $srcdir, $ENV{'initrd'}, "${BasePath}tmp/initrd.opt_mods" or
92     die "$Script: failed to setup initrd image";
93
94   print "creating devices...\n";
95   SUSystem "sh -c 'cd $tmpdir; RPM_ARCH=$ENV{'RPM_ARCH'} ./makedevs.floppy >/dev/null'" and
96     die "$Script: could not create all devices";
97   SUSystem "rm $tmpdir/makedevs.floppy";
98
99   print "stripping object files...\n";
100   SUSystem "strip_dir $tmpdir";
101 }
102
103 # on S/390, the initrd contains shared objects
104 if ($arch eq 's390' || $arch eq 's390x') {
105     print "updating ld.so.cache...\n";
106     SUSystem "ldconfig -r $tmpdir";
107     die "$Script: failed to run ldconfig" unless -f "$tmpdir/etc/ld.so.cache";
108
109     if($debug =~ /\bignore\b/ || $debug =~ /\bignorelibs\b/) {
110       system "check_libs $tmpdir" and
111         warn "$Script: error in shared lib config, please fix\n";
112     }
113     else {
114       system "check_libs $tmpdir" and
115         die "$Script: error in shared lib config, please fix\n";
116     }    
117 }
118
119 @m = `ls $moddir/*.o 2>/dev/null`;
120 for (@m) {
121   chomp;
122   s#.*/##;
123   s/\.o$//;
124   push @m1, "$_\n"
125 }
126
127 open F, ">$modlist";
128 print F @m1;
129 close F;
130
131 # create the image
132 if($ENV{initrd_fs}) {
133   $fstype = $ENV{initrd_fs};
134 }
135 else {
136   $fstype = $arch eq 'i386' || $arch eq 'x86_64' ? 'minix' : 'ext2';
137 }
138
139 # add an inode for each symlink that will be added from the initrd to
140 # the instsys.  this nice idea creates an unwanted dependency between
141 # mk_root and mk_initrd:
142 #$extra_inodes += `CONDOM=echo $tmpdir_root/usr/bin/conservative_lndir $tmpdir_root $tmpdir | grep "^ln" | wc --lines`;
143 # thus we hardcode 800 additional inodes:
144 $extra_inodes += 800; 
145 Conv2Image $image, $tmpdir, $fstype, $start_size, $start_inodes, $extra_size, $extra_inodes;
146 $i = CompressImage $image;
147 print "$Script: compressed initrd to \"$image\" ($i bytes)\n";
148
149 # add boot splash
150 if(($ENV{'initrd'} eq 'large' || $ENV{'initrd'} eq 'medium' || $ENV{'bootsplash'} eq 'yes') && $ENV{'bootsplash'} ne 'no') {
151   system "tail -c4 $image >${image}.tmp";
152   system "cat ${BasePath}tmp/base/$ConfigData{theme}.splash >>$image";
153   system "cat ${image}.tmp >>$image";
154   unlink "${image}.tmp";
155   $i = -s "$image";
156   print "$Script: $ConfigData{theme} bootsplash added to \"$image\" (new size: $i bytes)\n";
157 }
158
159 mkdir $gendir, 0755;
160
161 die "$Script: $!" unless open F, ">$gendir/initrdsize";
162 print F "initrdsize\t", int(($i + 511) / 512), "\n";
163 close F;
164
165