#!/usr/bin/perl @ARGV >= 2 or die "usage: $0 all|other|cdrom|hd|network|usb|blank|pcmcia|live|tftp|tftprd\n"; use Config; use MDK::Common; Config->import; my ($arch) = $Config{archname} =~ /(.*?)-/; ($img, $type) = @ARGV; # 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'; $default_append = "ramdisk_size=32000 root=/dev/ram3"; $default_vga = "vga=788"; $instdir = "mdk-stage1"; $mnt = "/tmp/drakx_mnt"; $mke2fs = "/sbin/mke2fs -q -m 0 -F -s 1"; if ($>) { $sudo = "sudo"; $ENV{PATH} = "/sbin:/usr/sbin:$ENV{PATH}"; } sub __ { print @_, "\n"; system(@_); } sub _ { __ @_; $? and die; } _ "$sudo mkdir $mnt" unless -e $mnt; _ "$sudo mkdir ${mnt}2" unless -e "${mnt}2"; $install = $ {{ all => "stage1-full", other => "stage1-full", blank => "stage1-full", live => "stage1-full", tftp => "stage1-full", tftprd => "stage1-full", pcmcia => "stage1-full", network => "stage1-network", usb => "stage1-usb", cdrom => "stage1-cdrom", hd => "stage1-disk", live64 => "stage1-full", tftp64 => "stage1-full", tftprd64 => "stage1-full", pcmcia64 => "stage1-full", network64 => "stage1-network", cdrom64 => "stage1-cdrom", hd64 => "stage1-disk", }}{$type} or die; mkdir "images"; chomp($main = `cat kernel/all.kernels/.main`); if ($img =~ /blank|other|pcmcia/) { @kernels = $main; } else { @kernels = map { m|kernel/all.kernels/(.*)| } glob('kernel/all.kernels/*'); $img =~ /usb/ and @kernels = grep { $_ !~ /2\.2\.14/ } @kernels; #- 2.2.14 is too old, usb support was not working properly } foreach (@kernels) { if ($img =~ /rdz$/) { initrd($mnt, "$img-$_"); } else { print STDERR "calling boot_img_$arch\n"; $::{"boot_img_$arch"}->($mnt, "$img-$_", glob("kernel/all.kernels/$_/boot/vmlinu*")); rename("$img-$main", "$img"); } } if ($arch =~ /i.86/ && $img =~ /all/) { isolinux($main, @kernels); my ($img, $img_sav) = ("images/cdrom.img-$main", 'images/cdrom.img-sav'); rename($img, $img_sav); $type = 'cdrom'; boot_img_i386($mnt, $img, "kernel/all.kernels/$main/boot/vmlinu*", sub { $_[0] =~ s/\bautomatic=\S+\b//; "$_[0] changedisk" }); rename($img, 'images/cdrom-changedisk.img'); rename($img_sav, $img); } if (my ($tftpboot) = grep { -e $_ } qw(/tftpboot /var/lib/tftpboot)) { system("/bin/cp -f kernel/all.kernels/$main/boot/vmlinu* $tftpboot/vmlinuz 2>/dev/null"); system("/bin/cp -f images/network.rdz-$main $tftpboot/network.rdz 2>/dev/null"); } sub install_stripped { _ "strip $_[0]"; _ "$sudo install $_[0] $_[1]" } sub initrd { my ($mnt, $img) = @_; my ($ltype, $I) = $type =~ /(.*?)(64)/; $ltype ||= $type; my $tmp = "$ENV{HOME}/tmp/initrd"; my $tar = "$instdir/stage1-data/stage1.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" ? 4000 : 2000)); _ "$mke2fs $tmp"; _ "$sudo mount -t ext2 $tmp $mnt -o loop"; _ "$sudo tar xjC $mnt -f $tar"; install_stripped("$instdir/init", "$mnt/sbin"); install_stripped("$instdir/$install", "$mnt/sbin/stage1"); if ($type eq "network" || $type eq "usb" || $type eq "all" || $type eq "other" || $type eq "blank") { 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/ && $arch !~ /ia64/) { _ "$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)"; $modz = "kernel/all.modules$I/$ext"; _ "$sudo cp -f $modz/${ltype}_modules.mar $mnt/modules/modules$I.mar" if $type !~ /blank/; _ "$sudo cp -f $modz/modules.dep $mnt/modules/"; _ "$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 = ""; $automatic = "automatic=method:cdrom" if ($type eq "cdrom"); $automatic = "automatic=method:disk" if ($type eq "hd"); 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 $_->[1]" } group_by2(@simple_entries)), if_(member($type, "cdrom", "all"), oem => "automatic=method:cdrom $default_vga rescue oem rw"), if_($type eq "all", all => "pcmcia $default_vga"), ); map { [ $_->[0], "$default_append $_->[1]" ] } group_by2(@entries); } sub boot_img_i386 { my ($mnt, $img, $kernel, $args_callback) = @_; __ "$sudo umount $mnt 2>/dev/null"; if ($type eq "hd") { _ "bunzip2 -c $instdir/init-data/msgboot.img.bz2 > $img"; } elsif ($type eq "all") { _ "bunzip2 -c $instdir/init-data/msgboot-graphicallogo-2880.img.bz2 > $img"; } elsif ($type eq "blank") { _ "bunzip2 -c $instdir/init-data/msgboot-blank.img.bz2 > $img"; } else { _ "bunzip2 -c $instdir/init-data/msgboot-graphicallogo.img.bz2 > $img"; } _ "$sudo mount -t vfat -o umask=0 $img $mnt -o loop"; _ "cat $kernel > $mnt/vmlinuz" if $type !~ /blank/; my $rdz = $img; $rdz =~ s/\.img/.rdz/; initrd("${mnt}2", $rdz) if !-e $rdz; eval { _ "cp -f $rdz $mnt/$type.rdz" }; if ($@) { unlink "$mnt/$type.rdz"; my $avail = (split ' ', `df $mnt`)[-3]; my $s = int((-s $rdz) / 1024); die sprintf("not enough room for $rdz: need %dKB (available %dKB < needed %dKB)\n", $s - $avail, $avail, $s); } 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 { my $args = $args_callback ? $args_callback->($_->[1]) : $_->[1]; "label $_->[0] kernel vmlinuz append initrd=$type.rdz $args " } entries_append($type)); _ "sync"; _ "df $mnt"; } sub boot_img_alpha { my ($mnt, $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" if $type !~ /blank/; -f "$type.rdz" ? _ "cp -f $type.rdz $mnt" : initrd("${mnt}2", "$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, $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", " 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, $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("${mnt}2", "$dir/$boot/live$1.rdz"); output("$dir/$boot/silo.conf", " 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=32000 root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=text initrd=/$boot/live.rdz append=\"ramdisk_size=32000 text root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=expert initrd=/$boot/live.rdz append=\"ramdisk_size=32000 expert root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=ks initrd=/$boot/live.rdz append=\"ramdisk_size=32000 ks root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=rescue initrd=/$boot/live.rdz append=\"ramdisk_size=32000 rescue rw root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=linux alias=install initrd=/$boot/live64.rdz append=\"ramdisk_size=32000 root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=text initrd=/$boot/live64.rdz append=\"ramdisk_size=32000 text root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=expert initrd=/$boot/live64.rdz append=\"ramdisk_size=32000 expert root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=ks initrd=/$boot/live64.rdz append=\"ramdisk_size=32000 ks root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=rescue initrd=/$boot/live64.rdz append=\"ramdisk_size=32000 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("${mnt}2", "$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"; my ($ltype, $I) = $type =~ /(.*?)(64)/; $ltype ||= $type; __ "$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" if $type !~ /blank/; -f "$type.rdz" ? _ "cp -f $type.rdz $dir" : initrd("${mnt}2", "$dir/$type.rdz"); output("$dir/boot.msg", " Welcome to Mandrake Linux 7.1 Press to install or upgrade a system 7mMandrake Linux7m "); output("$dir/silo.conf", " partition=1 default=linux timeout=100 read-write message=/boot.msg image=/vmlinux$I.gz label=linux initrd=/$type.rdz append=\"ramdisk_size=32000 $ltype 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 { my ($mnt, $img, $kern, $modz) = @_; my $dir = "/export"; my $boot = "boot"; #- non-absolute pathname only! my ($extension) = $modz =~ /.*\/([^\/]+)/; _ "mkdir -p $dir/$boot"; _ "cp -f $kern $dir/$boot/vmlinux"; _ "cp -f images/all.rdz$extension $dir/boot/all.gz"; _ "cp -f tools/ppc/yaboot $dir/boot/yaboot"; output("$dir/$boot/yaboot.conf", " init-message = \"\\nWelcome to Mandrake Linux PPC!\\nHit for boot options.\\n\\n\" timeout = 150 default = install-novideo image = cd:,\\\\\\\\vmlinux label = install-novideo root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz initrd-size = 32000 append = \" video=ofonly\" image = cd:,\\\\\\\\vmlinux label = install-atyfb root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz initrd-size = 32000 append = \" video=atyfb:vmode:17\" image = cd:,\\\\\\\\vmlinux label = install-aty128fb root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz initrd-size = 32000 append = \" video=aty128fb:vmode:17\" image = cd:,\\\\\\\\vmlinux label = install-text root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz initrd-size = 32000 append = \" text video=ofonly\" image = enet:0,vmlinux label = install-net root = /dev/ram3 initrd = enet:0,all.gz initrd-size = 32000 append = \" video=ofonly\" image = enet:0,vmlinux label = install-net-text root = /dev/ram3 initrd = enet:0,all.gz initrd-size = 32000 append = \" text video=ofonly\" image = cd:,\\\\\\\\vmlinux label = rescue root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz initrd-size = 32000 append = \" rescue video=ofonly\" image = enet:0,vmlinux label = rescue-net root = /dev/ram3 initrd = enet:0,all.gz initrd-size = 32000 append = \" rescue video=ofonly\" "); #- seem to need 2 yaboot.conf, one in the root, and one in boot _ "cp -f $dir/boot/yaboot.conf $dir/yaboot.conf"; output("$dir/$boot/README", " To Build a Bootable CD-ROM, do: cd /tools/ppc ./mkINSTALLCD /export ppc-cd.img "); } sub isolinux { my ($main, @kernels) = @_; @kernels = ($main, grep { $_ ne $main } @kernels); _ "rm -rf isolinux"; mkdir "isolinux", 0777; my $i = 0; foreach (@kernels) { mkdir "isolinux/alt$i", 0777; my ($kernel) = glob("kernel/all.kernels/$_/boot/vmlinu*"); _ "cp $kernel isolinux/alt$i/vmlinuz"; _ "cp images/all.rdz-$_ isolinux/alt$i/all.rdz"; $i++; } if (-e "isolinux-graphic.bmp") { #- change here for newer picture isolinux-graphic.bmp and newer parameters. _ "lilo-bmp2mdk mode:0x103 progress:425,173,16,8,64+2 clear:600,800,64+2 pos:0,0 isolinux/boot.msg"; } _ "cp /usr/lib/syslinux/isolinux.bin isolinux/isolinux.bin"; output "isolinux/isolinux.cfg", " default linux prompt 1 timeout 150 " . (-e "isolinux/boot.msg" ? "display boot.msg" : "display help.msg") . " F1 help.msg F2 advanced.msg " . (-e "isolinux/boot.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_vga " } @kernels); output "isolinux/help.msg", (-e "isolinux/boot.msg" && pack "C*", 0x0E, 0x80, 0x03, 0x00) . " 0aWelcome to 09Mandrake Linux0a install help07 In most cases, the best way to get started is to simply press the 0e07 key. If you experience problems with standard install, try one of the following install types (type the highlighted text and press 0e07): o 0fvgalo07 for low resolution graphical installation. o 0ftext07 for text installation instead of the graphical one. o 0flinux07 for standard graphical installation at normal resolution. o 0fexpert07 for expert graphical installation at normal resolution. To use this CD to repair an already installed system type 0frescue07 followed by 0e07. You can also pass some 0f07 to the Linux kernel. For example, try 0flinux mem=128M07 if your system has 128Mb of RAM but the default kernel ($main) does not detect it correctly. 0cNOTE07: You cannot pass options to modules (SCSI, ethernet card) or devices such as CD-ROM drives in this way. If you need to do so, use expert mode. " . (-e "isolinux/boot.msg" ? "0c[F1-Help] [F2-Advanced Help] [F3-Main]07" : "0c[F1-Help] [F2-Advanced Help]07") . "\n"; output "isolinux/advanced.msg", (-e "isolinux/boot.msg" && pack "C*", 0x0E, 0x80, 0x03, 0x00) . " The following install types may be used instead of previously notified : o 0fvgahi07 for high resolution graphical installation. o 0fvga1607 for 640x480 in 16 colors graphical installation. The following options may be added on the command line : o 0freadonly=107 to disable editing disk partitions. o 0fdisplay=ackbar:007 to export display to 09ackbar07 machine screen 0 during installation. o 0fnoauto07 to disable automatic detection (generally used with 0fexpert07). o 0fsecurity=n07 to set security level to value 09n07. o 0fupdatemodules07 to use the special update floppy containing modules updates. o 0fpatch07 to use a patch from the floppy (file named 09patch.pl07). o 0fauto_install=floppy07 to enable auto_install using 09auto_inst.cfg07 file on the floppy. You can choose the following kernels : " . join('', map_index { " o 0falt$::i07 is kernel $_\n" } @kernels) . " " . (-e "isolinux/boot.msg" ? "0c[F1-Help] [F2-Advanced Help] [F3-Main]07" : "0c[F1-Help] [F2-Advanced Help]07") . "\n"; }