summaryrefslogtreecommitdiffstats
path: root/make_boot_img
diff options
context:
space:
mode:
authorMystery Man <unknown@mandriva.org>2004-09-21 04:31:26 +0000
committerMystery Man <unknown@mandriva.org>2004-09-21 04:31:26 +0000
commitcc1300f2ac58a8289b998169c77c1c75db133643 (patch)
tree28769c8b2fcbf97248ddbdce11e45bb8b21543ee /make_boot_img
parent386fedbae181da5252f397e5ac9f9fc59367246d (diff)
downloaddrakx-backup-do-not-use-cc1300f2ac58a8289b998169c77c1c75db133643.tar
drakx-backup-do-not-use-cc1300f2ac58a8289b998169c77c1c75db133643.tar.gz
drakx-backup-do-not-use-cc1300f2ac58a8289b998169c77c1c75db133643.tar.bz2
drakx-backup-do-not-use-cc1300f2ac58a8289b998169c77c1c75db133643.tar.xz
drakx-backup-do-not-use-cc1300f2ac58a8289b998169c77c1c75db133643.zip
This commit was manufactured by cvs2svn to create branch
'MDK-10-update'.
Diffstat (limited to 'make_boot_img')
-rwxr-xr-xmake_boot_img824
1 files changed, 824 insertions, 0 deletions
diff --git a/make_boot_img b/make_boot_img
new file mode 100755
index 000000000..108cd37f7
--- /dev/null
+++ b/make_boot_img
@@ -0,0 +1,824 @@
+#!/usr/bin/perl
+
+use Config;
+use MDK::Common;
+Config->import;
+my ($arch) = $Config{archname} =~ /(.*?)-/;
+
+# move stuff to new "kernel" directory
+-d 'kernel' or die "directory kernel is missing\n";
+rename 'all.kernels', 'kernel/all.kernels';
+rename 'all.modules', 'kernel/all.modules';
+
+my $default_append = "ramdisk_size=128000 root=/dev/ram3";
+# full acpi support for amd64, enough acpi support for x86 ht, no acpi for others
+my $default_acpi = $arch =~ /i.86/ ? "acpi=ht" : $arch =~ /x86_64/ ? "acpi=off" : "acpi=off";
+my $default_vga = "vga=788";
+
+my $instdir = "mdk-stage1";
+my $tmp_mnt = '/tmp/drakx_mnt';
+my $tmp_mnt_initrd = '/tmp/drakx_mnt2';
+
+my $sudo;
+if ($>) {
+ $sudo = "sudo";
+ $ENV{PATH} = "/sbin:/usr/sbin:$ENV{PATH}";
+}
+
+sub __ { print @_, "\n"; system(@_) }
+sub _ { __ @_; $? and die }
+sub mke2fs {
+ my ($f) = @_;
+ _ "/sbin/mke2fs -q -m 0 -F -s 1 $f";
+ _ "/sbin/tune2fs -c 0 -U clear -T 1970010101 $f";
+}
+
+_ "$sudo mkdir -p $tmp_mnt $tmp_mnt_initrd";
+mkdir "images";
+
+chomp(my $main = `cat kernel/all.kernels/.main`);
+my @kernels = grep { /^2/ } all('kernel/all.kernels');
+
+
+my @all_images = (
+ if_($arch =~ /i.86/, 'cdrom.img', 'cdrom-changedisk.img', 'pcmcia.img', 'isolinux', 'boot.iso', 'hd_grub.img', 'network.img', 'network_drivers.img'),
+ if_($arch =~ /x86_64/, 'cdrom.img', 'isolinux', 'boot.iso'),
+ if_($arch =~ /ia64/, 'all.img'),
+ );
+
+my @images = @ARGV ? @ARGV : map { "images/$_" } @all_images;
+
+if (any { /move/ } @images) {
+ -e "$instdir/init-move" or die "ERROR: $instdir not built for move\n";
+} else {
+ -e "$instdir/init-move" and die "ERROR: $instdir built for move\n";
+}
+
+foreach my $img (@images) {
+ my ($type, $I, $extension) = $img =~ m!([^/]*)(64)?\.([^.]*)$!;
+
+ if ($img =~ /hd_grub/) {
+ hd_grub($tmp_mnt, $img);
+ } elsif ($img =~ /isolinux/) {
+ isolinux($main, @kernels);
+
+ if (my ($tftpboot) = grep { -e $_ } qw(/tftpboot /var/lib/tftpboot)) {
+ system("/bin/cp -f isolinux/alt0/* $tftpboot");
+ }
+ } elsif ($img =~ /move/) {
+ isolinux_move($main);
+
+ if (my ($tftpboot) = grep { -e $_ } qw(/tftpboot /var/lib/tftpboot)) {
+ system("/bin/cp -f move/isolinux/* $tftpboot/move 2>/dev/null");
+ }
+ } elsif ($img =~ /boot.iso/) {
+ boot_iso($img, 0);
+ } elsif ($img =~ /bootcdrom.iso/) {
+ boot_iso($img, 1);
+ } elsif ($img =~ /drivers/) {
+ drivers($type, $I, "$img-$_") foreach @kernels;
+ rename("$img-$main", $img);
+ } elsif ($extension eq 'rdz') {
+ initrd($tmp_mnt_initrd, $type, $I, "$img-$_") foreach @kernels;
+ } elsif ($extension eq 'img') {
+ print STDERR "calling boot_img_$arch for $img\n";
+ $::{"boot_img_$arch"}->($tmp_mnt, $type, $I, "$img-$_", glob("kernel/all.kernels/$_/boot/vmlinu*")) foreach @kernels;
+ rename("$img-$main", $img);
+ } else {
+ die "unknown image $img";
+ }
+}
+
+sub syslinux_color {
+ "0" . {
+ default => '7',
+ blue => '9',
+ green => 'a',
+ red => 'c',
+ yellow => 'e',
+ white => 'f',
+ }->{$_[0]} || die "unknown color $_[0]\n";
+}
+
+sub syslinux_msg {
+ my ($msg_xml_file, @more_text) = @_;
+
+ require XML::Parser;
+
+ sub xml_tree2syslinux {
+ my ($current_color, $tree) = @_;
+ my (undef, @l) = @$tree;
+ join('', map {
+ my ($type, $val) = @$_;
+ if ($type eq '0') {
+ $val;
+ } else {
+ syslinux_color($type) . xml_tree2syslinux($type, $val) . syslinux_color($current_color);
+ }
+ } group_by2(@l));
+ };
+
+ print "parsing $msg_xml_file\n";
+ my $tree = XML::Parser->new(Style => 'Tree')->parsefile($msg_xml_file);
+ $tree->[0] eq 'document' or die "bad file $msg_xml_file\n";
+ my $text = xml_tree2syslinux('default', $tree->[1]);
+
+ pack("C*", 0x0E, 0x80, 0x03, 0x00) . " "
+ . $text . join('', @more_text)
+ . "\n" . syslinux_color('red') . "[F1-Help] [F2-Advanced Help] [F3-Main]" . syslinux_color('default') . "\n";
+}
+
+sub install_stripped { _ "strip $_[0]"; _ "$sudo install $_[0] $_[1]" }
+
+sub initrd {
+ my ($mnt, $type, $I, $img, $o_raw_stage1_tree_kind) = @_;
+ my $tmp = "$ENV{HOME}/tmp/initrd";
+ my $tar = "$instdir/stage1-data/stage1$o_raw_stage1_tree_kind.tar.bz2";
+
+ __ "$sudo umount $tmp $mnt 2>/dev/null";
+ _ "dd if=/dev/zero of=$tmp bs=1k count=" . ($arch =~ /ia64/ ? ($type eq "all" ? 16386 : 16384) : ($type eq "all" ? 5000 : 2000));
+ mke2fs($tmp);
+ _ "$sudo mount -t ext2 $tmp $mnt -o loop";
+
+ _ "$sudo tar xjC $mnt -f $tar";
+ symlinkf "/tmp/stage2/lib64", "$mnt/lib64" if $arch =~ /x86_64/;
+
+ {
+ my $install = ${{
+ network => "stage1-network",
+ cdrom => "stage1-cdrom",
+ }}{$type} || 'stage1-full';
+ install_stripped("$instdir/init", "$mnt/sbin");
+ install_stripped("$instdir/$install", "$mnt/sbin/stage1");
+ }
+
+ if (member($type, qw(network all))) {
+ install_stripped("$instdir/ppp/pppd-bin", "$mnt/sbin/pppd");
+ install_stripped("$instdir/rp-pppoe/pppoe-bin", "$mnt/sbin/pppoe");
+ _ "$sudo mknod $mnt/dev/ppp c 108 0";
+ _ "$sudo mknod $mnt/dev/ptyp0 c 2 0";
+ _ "$sudo mknod $mnt/dev/ttyp0 c 3 0";
+ }
+
+ if (member($type, qw(pcmcia all network)) && $arch !~ /ppc|ia64|x86_64/) {
+ _ "$sudo cp -a /etc/pcmcia $mnt/etc";
+ _ "cp $mnt/etc/pcmcia/config /tmp/pcmcia_config_tmp";
+ _ "tools/patch_pcmcia_config.pl /tmp/pcmcia_config_tmp kernel/all.modules/$main/modules.dep";
+ _ "sudo mv /tmp/pcmcia_config_tmp $mnt/etc/pcmcia/config";
+ }
+ my ($ext) = $img =~ /rdz-(.*)/ or die "bad initrd name ($img)";
+ my $modz = "kernel/all.modules$I/$ext";
+ _ "$sudo cp -f $modz/${type}_modules.mar $mnt/modules/modules$I.mar";
+ _ "$sudo cp -f $modz/modules.dep $mnt/modules/";
+ _ "$sudo cp -f /sbin/sash $mnt/tmp/sh" if $ENV{DEBUGSTAGE1};
+ _ "$sudo umount $mnt";
+
+# Workaround for vfat-loop bug (quite touchy)
+ _ "gzip -9f $tmp";
+ _ "cp -f $tmp.gz $img";
+ _ "rm -f $tmp.gz";
+# _ "gzip -9 -c $tmp > $img";
+# _ "rm -f $tmp";
+}
+
+sub entries_append {
+ my ($type) = @_;
+
+ my $automatic = $type =~ /cdrom/ ? 'automatic=method:cdrom' : '';
+ $automatic .= " changedisk" if $type =~ /changedisk/;
+
+ my @simple_entries = (
+ linux => $default_vga,
+ vgalo => "vga=785",
+ vgahi => "vga=791",
+ vga16 => "vga16",
+ text => "text",
+ patch => "patch $default_vga",
+ expert => "expert $default_vga",
+ rescue => "rescue rw",
+ );
+ my @entries = (
+ (map { $_->[0] => "$automatic $default_acpi $_->[1]" } group_by2(@simple_entries)),
+ acpi => "$automatic $default_vga",
+ if_(member($type, "cdrom", "all"), oem => "automatic=method:cdrom $default_vga $default_acpi rescue oem rw",),
+ if_($type eq "all", all => "pcmcia $default_vga $default_acpi"),
+ );
+
+ map { [ $_->[0], "$default_append $_->[1]" ] }
+ group_by2(@entries);
+}
+
+sub boot_img_i386 {
+ my ($mnt, $type, $I, $img, $kernel) = @_;
+
+ __ "$sudo umount $mnt 2>/dev/null";
+
+ _ "dd if=/dev/zero of=$img bs=1k count=" . ($type eq 'all' ? 2880 : 1440);
+ _ "mkdosfs -f 1 -r 16 -s 2 $img"; # keep the FAT bookkeeping as small as possible
+ _ "$sudo syslinux-graphic $img";
+
+ _ "$sudo mount -t vfat -o umask=0 $img $mnt -o loop";
+ _ "cat $kernel > $mnt/vmlinuz";
+ bmp_to_msg('isolinux-graphic-simple.bmp', "$mnt/boot.msg", '397,190,14,6', 27, 27);
+
+ output("$mnt/help.msg", syslinux_msg('help.msg.xml'));
+ output("$mnt/advanced.msg", syslinux_msg('advanced.msg.xml'));
+
+ (my $rdz = $img) =~ s/\.img/.rdz/;
+ (my $initrd_type = $type) =~ s/-changedisk//;
+ initrd($tmp_mnt_initrd, $initrd_type, $I, $rdz);
+ my $short_type = substr($type, 0, 8);
+
+ my $timeout = 72;
+ output "$mnt/syslinux.cfg",
+"default linux
+prompt 1
+timeout $timeout
+display boot.msg
+F1 help.msg
+F2 advanced.msg
+F3 boot.msg
+" . join('', map {
+"label $_->[0]
+ kernel vmlinuz
+ append initrd=$short_type.rdz $_->[1]
+" } entries_append($type));
+
+ eval { _ "cp -f $rdz $mnt/$short_type.rdz" };
+ if ($@) {
+ unlink "$mnt/$short_type.rdz";
+ my $avail = (split ' ', `df $mnt`)[-3];
+ my $s = int((-s $rdz) / 1024);
+
+ my ($ext) = $img =~ /\.img-(.*)/ or die "bad initrd name ($img)";
+ my $dir = "kernel/all.modules/$ext";
+ my $pcitable = cat_('/usr/share/ldetect-lst/pcitable');
+ my @l = sort { $a <=> $b } map {
+ my ($name) = /(\S+)\.k?o$/ or die "bad file in .mar";
+ my $gz_size = chomp_(`gzip -c $dir/$_ | wc -c`);
+ sprintf "%7d %6d %s\n", $gz_size, listlength($pcitable =~ /"$name"/g), $name;
+ } split(' ', `mdk-stage1/mar/mar -l $dir/${initrd_type}_modules.mar`);
+ output('.not-enough-room', "gz size - pcitable - name\n", @l);
+
+ warn sprintf("not enough room for $rdz: need %dKB (available %dKB < needed %dKB)\n", $s - $avail, $avail, $s);
+ die qq(check file ".not-enough-room" to see modules size and pcitable usage\n);
+ }
+ unlink $rdz;
+
+ _ "sync";
+ _ "df $mnt";
+ _ "$sudo umount $mnt";
+}
+
+# alias to x86 variant, slightly bigger with images though
+sub boot_img_x86_64 { &boot_img_i386 }
+
+sub boot_img_alpha {
+ my ($mnt, $type, $I, $img) = @_;
+
+ __ "$sudo umount $mnt 2>/dev/null";
+ _ "dd if=/dev/zero of=$img bs=1k count=1440";
+ mke2fs($img);
+ _ "/sbin/e2writeboot $img /boot/bootlx";
+ _ "$sudo mount -t ext2 $img $mnt -o loop";
+ _ "cp -f vmlinux.gz $mnt";
+ -f "$type.rdz" ? _ "cp -f $type.rdz $mnt" : initrd($tmp_mnt_initrd, $type, $I, "$mnt/$type.rdz");
+
+ mkdir "$mnt/etc", 0777;
+ output("$mnt/etc/aboot.conf",
+"0:vmlinux.gz initrd=$type.rdz rw $default_append $type
+1:vmlinux.gz initrd=$type.rdz rw $default_append text $type
+");
+ _ "sync";
+ _ "df $mnt";
+}
+
+sub boot_img_ia64 {
+ my ($mnt, $type, $_I, $img, $kernel) = @_;
+ my $rdz = $img; $rdz =~ s/\.img/.rdz/;
+
+ __ "$sudo umount $mnt 2>/dev/null";
+ _ "dd if=/dev/zero of=$img bs=1k count=16384";
+ _ "mkdosfs $img";
+ _ "$sudo mount -t vfat $img $mnt -o loop,umask=000";
+ _ "$sudo cp -f $kernel $mnt/vmlinux";
+ _ "cp -f $rdz $mnt/$type.rdz";
+ _ "$sudo cp -f tools/ia64/elilo.efi $mnt";
+ output("$mnt/elilo.conf", qq(
+prompt
+timeout=50
+
+image=vmlinux
+ label=linux
+ root=/dev/ram3
+ initrd=$type.rdz
+ append=" ramdisk_size=120000"
+ read-only
+
+image=vmlinux
+ label=rescue
+ root=/dev/ram3
+ initrd=$type.rdz
+ append=" rescue ramdisk_size=120000"
+"));
+ _ "sync";
+ _ "df $mnt";
+
+}
+
+sub boot_img_sparc {
+ my ($mnt, $type, $I, $_img) = @_;
+ if ($type =~ /^live(.*)/) {
+ #- hack to produce directly into /export the needed file for cdrom boot.
+ my $dir = "/export";
+ my $boot = "boot"; #- non-absolute pathname only!
+
+ _ "mkdir -p $dir/$boot";
+ _ "cp -f /boot/cd.b /boot/second.b $dir/$boot";
+ _ "cp -f vmlinux$1 $dir/$boot/vmlinux$1";
+ -f "live$1.rdz" ? _ "cp -f live$1.rdz $dir/$boot" : initrd($tmp_mnt_initrd, $type, $I, "$dir/$boot/live$1.rdz");
+
+ output("$dir/$boot/silo.conf", qq(
+partition=1
+default=linux
+timeout=100
+read-write
+message=/$boot/boot.msg
+image="cat /$boot/boot.msg"
+ label=1
+ single-key
+image="cat /$boot/general.msg"
+ label=2
+ single-key
+image="cat /$boot/expert.msg"
+ label=3
+ single-key
+image="cat /$boot/rescue.msg"
+ label=4
+ single-key
+image="cat /$boot/kickit.msg"
+ label=5
+ single-key
+image="cat /$boot/param.msg"
+ label=6
+ single-key
+image[sun4c,sun4d,sun4m]=/$boot/vmlinux
+ label=linux
+ alias=install
+ initrd=/$boot/live.rdz
+ append="ramdisk_size=128000 root=/dev/ram3"
+image[sun4c,sun4d,sun4m]=/$boot/vmlinux
+ label=text
+ initrd=/$boot/live.rdz
+ append="ramdisk_size=128000 text root=/dev/ram3"
+image[sun4c,sun4d,sun4m]=/$boot/vmlinux
+ label=expert
+ initrd=/$boot/live.rdz
+ append="ramdisk_size=128000 expert root=/dev/ram3"
+image[sun4c,sun4d,sun4m]=/$boot/vmlinux
+ label=ks
+ initrd=/$boot/live.rdz
+ append="ramdisk_size=128000 ks root=/dev/ram3"
+image[sun4c,sun4d,sun4m]=/$boot/vmlinux
+ label=rescue
+ initrd=/$boot/live.rdz
+ append="ramdisk_size=128000 rescue rw root=/dev/ram3"
+image[sun4u]=/$boot/vmlinux64
+ label=linux
+ alias=install
+ initrd=/$boot/live64.rdz
+ append="ramdisk_size=128000 root=/dev/ram3"
+image[sun4u]=/$boot/vmlinux64
+ label=text
+ initrd=/$boot/live64.rdz
+ append="ramdisk_size=128000 text root=/dev/ram3"
+image[sun4u]=/$boot/vmlinux64
+ label=expert
+ initrd=/$boot/live64.rdz
+ append="ramdisk_size=128000 expert root=/dev/ram3"
+image[sun4u]=/$boot/vmlinux64
+ label=ks
+ initrd=/$boot/live64.rdz
+ append="ramdisk_size=128000 ks root=/dev/ram3"
+image[sun4u]=/$boot/vmlinux64
+ label=rescue
+ initrd=/$boot/live64.rdz
+ append="ramdisk_size=128000 rescue rw root=/dev/ram3"
+"));
+
+ output("$dir/$boot/README", "
+To Build a Bootable CD-ROM, try:
+ mkisofs -R -o t.iso -s /$boot/silo.conf /export
+");
+ } elsif ($type =~ /^tftprd(.*)/) {
+ my $dir = "/export";
+ my $boot = "images";
+ my $setarch = $1 ? "sparc64" : "sparc32";
+
+ _ "mkdir -p $dir/$boot";
+ -f "$type.rdz" or initrd($tmp_mnt_initrd, $type, $I, "$type.rdz");
+ _ "cp -f vmlinux$1.aout $dir/$boot/$type.img";
+ _ "$setarch kernel$1/src/arch/sparc$1/boot/piggyback $dir/$boot/$type.img kernel$1/boot/System.map $type.rdz";
+ } elsif ($type =~ /^tftp(.*)/) {
+ my $dir = "/export";
+ my $boot = "images";
+
+ _ "mkdir -p $dir/$boot";
+ _ "cp -f vmlinux$1.aout $dir/$boot/$type.img";
+ } else {
+ my $dir = "floppy";
+ __ "$sudo umount $mnt 2>/dev/null";
+ _ "rm -rf $dir";
+ _ "mkdir -p $dir";
+ _ "cp -f /boot/fd.b /boot/second.b $dir";
+ _ "cp -f vmlinuz$I $dir/vmlinux$I.gz";
+ -f "$type.rdz" ? _ "cp -f $type.rdz $dir" : initrd($tmp_mnt_initrd, $type, $I, "$dir/$type.rdz");
+
+ output("$dir/boot.msg", "
+Welcome to Mandrakelinux 7.1
+
+Press <Enter> to install or upgrade a system 7mMandrakelinux7m
+");
+
+ output("$dir/silo.conf", qq(
+partition=1
+default=linux
+timeout=100
+read-write
+message=/boot.msg
+image=/vmlinux$I.gz
+ label=linux
+ initrd=/$type.rdz
+ append="ramdisk_size=128000 $type root=/dev/ram3"
+"));
+ _ "genromfs -d $dir -f /dev/ram -A 2048,/.. -a 512 -V 'DrakX boot disk'";
+ _ "$sudo mount -t romfs /dev/ram $mnt";
+ _ "silo -r $mnt -F -i /fd.b -b /second.b -C /silo.conf";
+ _ "$sudo umount $mnt";
+ _ "dd if=/dev/ram of=$type.img bs=1440k count=1";
+ _ "sync";
+ _ "$sudo mount -t romfs /dev/ram $mnt";
+ _ "df $mnt";
+ }
+}
+
+sub boot_img_ppc() {
+ #- hack to produce directly into /export the needed file for cdrom boot.
+ my $dir = "/export";
+ my $boot = "boot"; #- non-absolute pathname only!
+ _ "rm -rf $dir/$boot"; mkdir "$dir/$boot", 0777;
+ foreach (glob("kernel/all.kernels/*")) {
+ my $ext = basename($_);
+ if ($ext =~ /2.4/) {
+ _ "cp $_/boot/vmlinux $dir/$boot/vmlinux";
+ _ "cp images/all.rdz-$ext $dir/$boot/all.gz";
+ }
+ if ($ext =~ /2.2/) {
+ _ "cp $_/boot/vmlinux $dir/$boot/vmlinux-2.2";
+ _ "cp images/all.rdz-$ext $dir/$boot/all-2.2.gz";
+ }
+ }
+ _ "cp -f /usr/lib/yaboot/yaboot $dir/$boot/yaboot";
+
+ output("$dir/$boot/ofboot.b", '<CHRP-BOOT>
+<COMPATIBLE>
+MacRISC
+</COMPATIBLE>
+<DESCRIPTION>
+Mandrakelinux PPC bootloader
+</DESCRIPTION>
+<BOOT-SCRIPT>
+" screen" output
+dev screen
+" "(0000000000aa00aa0000aaaaaa0000aa00aaaa5500aaaaaa)" drop 0 8 set-colors
+" "(5555555555ff55ff5555ffffff5555ff55ffffff55ffffff)" drop 8 8 set-colors
+device-end
+3 to foreground-color
+0 to background-color
+" "(0C)" fb8-write drop
+" Booting Mandrakelinux PPC..." fb8-write drop 100 ms
+boot cd:2,\\\\yaboot
+</BOOT-SCRIPT>
+<OS-BADGE-ICONS>
+1010
+000000000000F8FEACF6000000000000
+0000000000F5FFFFFEFEF50000000000
+00000000002BFAFEFAFCF70000000000
+0000000000F65D5857812B0000000000
+0000000000F5350B2F88560000000000
+0000000000F6335708F8FE0000000000
+00000000005600F600F5FD8100000000
+00000000F9F8000000F5FAFFF8000000
+000000008100F5F50000F6FEFE000000
+000000F8F700F500F50000FCFFF70000
+00000088F70000F50000F5FCFF2B0000
+0000002F582A00F5000008ADE02C0000
+00090B0A35A62B0000002D3B350A0000
+000A0A0B0B3BF60000505E0B0A0B0A00
+002E350B0B2F87FAFCF45F0B2E090000
+00000007335FF82BF72B575907000000
+000000000000ACFFFF81000000000000
+000000000081FFFFFFFF810000000000
+0000000000FBFFFFFFFFAC0000000000
+000000000081DFDFDFFFFB0000000000
+000000000081DD5F83FFFD0000000000
+000000000081DDDF5EACFF0000000000
+0000000000FDF981F981FFFF00000000
+00000000FFACF9F9F981FFFFAC000000
+00000000FFF98181F9F981FFFF000000
+000000ACACF981F981F9F9FFFFAC0000
+000000FFACF9F981F9F981FFFFFB0000
+00000083DFFBF981F9F95EFFFFFC0000
+005F5F5FDDFFFBF9F9F983DDDD5F0000
+005F5F5F5FDD81F9F9E7DF5F5F5F5F00
+0083DD5F5F83FFFFFFFFDF5F835F0000
+000000FBDDDFACFBACFBDFDFFB000000
+000000000000FFFFFFFF000000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFFFF00000000
+00000000FFFFFFFFFFFFFFFFFF000000
+00000000FFFFFFFFFFFFFFFFFF000000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFF000000
+</OS-BADGE-ICONS>
+</CHRP-BOOT>
+');
+
+ output("$dir/$boot/yaboot.conf", '
+init-message = "\nWelcome to Mandrakelinux PPC!\nHit <TAB> for boot options.\n\n"
+timeout = 150
+default = install-gui
+message=cd:,\\\\yaboot.msg
+
+image = cd:,\\\\vmlinux
+ label = install-gui
+ root = /dev/ram3
+ initrd = cd:,\\\\all.gz
+ initrd-size = 34000
+
+image = cd:,\\\\vmlinux-2.2
+ label = install-gui-2.2
+ root = /dev/ram3
+ initrd = cd:,\\\\all-2.2.gz
+ initrd-size = 34000
+
+image = cd:,\\\\vmlinux
+ label = install-text
+ root = /dev/ram3
+ initrd = cd:,\\\\all.gz
+ initrd-size = 34000
+ append = " text video=ofonly"
+
+image = cd:,\\\\vmlinux-2.2
+ label = install-text-2.2
+ root = /dev/ram3
+ initrd = cd:,\\\\all-2.2.gz
+ initrd-size = 34000
+ append = " text video=ofonly"
+
+image = cd:,\\\\vmlinux
+ label = install-gui-old
+ root = /dev/ram3
+ initrd = cd:,\\\\all.gz
+ initrd-size = 34000
+ append = " gui-old video=ofonly"
+
+image = cd:,\\\\vmlinux-2.2
+ label = install-gui-old-2.2
+ root = /dev/ram3
+ initrd = cd:,\\\\all-2.2.gz
+ initrd-size = 34000
+ append = " gui-old video=ofonly"
+
+image = enet:0,vmlinux
+ label = install-net
+ root = /dev/ram3
+ initrd = enet:0,all.gz
+ initrd-size = 34000
+ append = " video=ofonly"
+
+image = enet:0,vmlinux-2.2
+ label = install-net-2.2
+ root = /dev/ram3
+ initrd = enet:0,all-2.2.gz
+ initrd-size = 34000
+ append = " video=ofonly"
+
+image = enet:0,vmlinux
+ label = install-net-text
+ root = /dev/ram3
+ initrd = enet:0,all.gz
+ initrd-size = 34000
+ append = " text video=ofonly"
+
+image = enet:0,vmlinux-2.2
+ label = install-net-text-2.2
+ root = /dev/ram3
+ initrd = enet:0,all-2.2.gz
+ initrd-size = 34000
+ append = " text video=ofonly"
+
+image = cd:,\\\\vmlinux
+ label = rescue
+ root = /dev/ram3
+ initrd = cd:,\\\\all.gz
+ initrd-size = 34000
+ append = " rescue video=ofonly"
+
+image = enet:0,vmlinux
+ label = rescue-net
+ root = /dev/ram3
+ initrd = enet:0,all.gz
+ initrd-size = 34000
+ append = " rescue video=ofonly"
+');
+
+ output("$dir/$boot/yaboot.msg", '
+Thanks for choosing Mandrakelinux PPC. The following is a short
+explanation of the various options for booting the install CD.
+
+All options ending with "2.2" will use the 2.2.20-9mdkBOOT kernel.
+The default syntax with no suffix uses the 2.4.18-4mdkBOOT kernel.
+The default if you just hit enter is "install-gui".
+
+install-gui: uses XFree86 fbdev mode
+install-text: text based install
+install-gui-old: old Xpmac gui
+install-net: allows you to use a minimal boot CD,
+ pulling the rest of the install from
+ a network server
+install-net-text: text mode network install
+rescue: boots the rescue image
+rescue-net: boots the rescue image from a network server
+
+');
+
+}
+
+sub bmp_to_msg {
+ my ($bmp, $msg, $progress_place, $progress_color, $clear_color) = @_;
+ #- change here for newer picture isolinux-graphic.bmp and newer parameters.
+ #- for old style pictures (9.1 and previous)
+ # lilo-bmp2mdk mode:0x103 progress:425,173,16,7,64+21 clear:600,800,64+59 pos:0,0 <isolinux-graphic.bmp >isolinux/boot.msg
+ #- for current 9.2 pictures.
+ -e $bmp and _ "lilo-bmp2mdk mode:0x103 progress:$progress_place,64+$progress_color clear:600,800,64+$clear_color pos:0,0 <$bmp >$msg"
+}
+
+sub isolinux {
+ my ($main, @kernels) = @_;
+ @kernels = ($main, grep { $_ ne $main } @kernels);
+ _ "rm -rf isolinux"; mkdir "isolinux", 0777;
+
+ each_index {
+ mkdir "isolinux/alt$::i", 0777;
+ my ($kernel) = glob("kernel/all.kernels/$_/boot/vmlinu*");
+ _ "cp $kernel isolinux/alt$::i/vmlinuz";
+ initrd($tmp_mnt_initrd, 'all', '', "images/all.rdz-$_");
+ _ "mv images/all.rdz-$_ isolinux/alt$::i/all.rdz";
+ } @kernels;
+
+ bmp_to_msg('isolinux-graphic.bmp', 'isolinux/boot.msg', '397,190,14,6', 18, 18);
+
+ _ "cp /usr/lib/syslinux/isolinux.bin isolinux/isolinux.bin";
+ _ "install -m 644 -D /boot/memtest* isolinux/test/memtest.bin";
+ output "isolinux/isolinux.cfg", "
+default linux
+prompt 1
+timeout 150
+display boot.msg
+F1 help.msg
+F2 advanced.msg
+F3 boot.msg
+" . join('', map {
+"label $_->[0]
+ kernel alt0/vmlinuz
+ append initrd=alt0/all.rdz $_->[1] automatic=method:cdrom
+" } entries_append('all'))
+ . join('', map_index {
+"label alt$::i
+ kernel alt$::i/vmlinuz
+ append initrd=alt$::i/all.rdz $default_append $default_acpi $default_vga
+" } @kernels) .
+"label memtest
+ kernel test/memtest.bin
+";
+
+ output("isolinux/help.msg", syslinux_msg('help.msg.xml'));
+ output("isolinux/advanced.msg", syslinux_msg('advanced.msg.xml',
+ "\nYou can choose the following kernels :\n",
+ map_index { " o " . syslinux_color('white') . "alt$::i" . syslinux_color('default') . " is kernel $_\n" } @kernels));
+}
+
+sub isolinux_move {
+ my ($main) = @_;
+
+ my ($kernel) = glob("kernel/all.kernels/$main/boot/vmlinu*");
+ _ "cp $kernel move/isolinux/vmlinuz";
+ initrd($tmp_mnt_initrd, 'all', '', "move/isolinux/all.rdz-$main", '-with-busybox');
+ rename "move/isolinux/all.rdz-$main", "move/isolinux/all.rdz";
+
+ bmp_to_msg('move/data/isolinux-graphic.bmp', 'move/isolinux/boot.msg', '371,144,4,4', 11, 127);
+ _ "cp /usr/lib/syslinux/isolinux.bin move/isolinux/isolinux.bin";
+}
+
+sub hd_grub {
+ my ($mnt, $img) = @_;
+ my $mapfile = '/tmp/device.map.tmp';
+
+ my @grub_files = map { "/boot/grub/$_" } qw(stage1 stage2);
+ my $size = 40_000 + sum(map { -s $_ } @grub_files);
+
+ __ "$sudo umount $mnt 2>/dev/null";
+ _ "dd if=/dev/zero of=$img bs=1 count=$size";
+ _ "mkdosfs $img";
+ _ "$sudo mount -t vfat -o umask=0 $img $mnt -o loop";
+ _ "cp @grub_files $mnt";
+
+ output("$mnt/menu.lst", <<EOF);
+timeout 0
+default 0
+fallback 1
+
+title Mandrake Install
+
+root (hd0,0)
+kernel /cooker/isolinux/alt0/vmlinuz $default_append $default_acpi $default_vga automatic=method:disk
+initrd /cooker/isolinux/alt0/all.rdz
+
+title Help
+
+pause To display the help, press <space> until you reach "HELP END"
+pause .
+pause Please see http://qa.mandrakesoft.com/hd_grub.cgi for a friendlier solution
+pause .
+pause To specify the location where Mandrakelinux is copied,
+pause choose "Mandrake Install", and press "e".
+pause Then change "root (hd0,0)". FYI:
+pause - (hd0,0) is the first partition on first bios hard drive (usually hda1)
+pause - (hd0,4) is the first extended partition (usually hda5)
+pause - (hd1,0) is the first partition on second bios hard drive
+pause Replace /cooker to suits the directory containing Mandrakelinux
+pause .
+pause HELP END
+EOF
+
+ _ "$sudo umount $mnt";
+
+ output($mapfile, "(fd0) $img\n");
+
+ open(my $G, "| grub --device-map=$mapfile --batch");
+ print $G <<EOF;
+root (fd0)
+install /stage1 d (fd0) /stage2 p /menu.lst
+quit
+EOF
+ close $G;
+ unlink $mapfile;
+}
+
+sub boot_iso {
+ my ($iso, $bootcdrom) = @_;
+
+ my $cfg = cat_('isolinux/isolinux.cfg') or die 'isolinux missing';
+ if ($bootcdrom) {
+ $cfg =~ s/(automatic=method:\w+)/changedisk $1/gm;
+ } else {
+ $cfg =~ s/(automatic=method:\w+)//gm;
+ }
+
+ eval { rm_rf('.boot_iso') };
+ mkdir_p('.boot_iso/isolinux');
+ _ "cd .boot_iso/isolinux ; ln -s ../../isolinux/* .";
+
+ my $cfg_file = '.boot_iso/isolinux/isolinux.cfg';
+ unlink $cfg_file;
+ output($cfg_file, $cfg);
+
+ _ "mkisofs -r -f -J -cache-inodes -V 'Mdk Boot ISO' -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o $iso .boot_iso";
+ rm_rf('.boot_iso');
+}
+
+sub drivers {
+ my ($type, $I, $img) = @_;
+
+ _ "dd if=/dev/zero of=$img bs=1k count=1440";
+ mke2fs($img);
+ _ "$sudo mount -t ext2 $img $tmp_mnt -o loop";
+
+ my ($ext) = $img =~ /img-(.*)/ or die "bad image name ($img)";
+ _ "$sudo cp -f kernel/all.modules$I/$ext/${type}_modules.mar $tmp_mnt/modules$I.mar";
+
+ _ "sync";
+ _ "df $tmp_mnt";
+
+ _ "$sudo umount $tmp_mnt";
+}