2 ###APPNAME: diskimg-installgrub
4 ###APPDATE: Tue Oct 9 08:02:21 2007
6 ###APPDESC: setup grub on diskimg
7 ###APPUSAGE: disk.img (parttion number)
8 ###APPEXAMPLE: disk.img 1
11 $ARGV[0]="-h" unless(@ARGV);
13 exit(system("plhelp",$0,@ARGV)) if($_ eq "-h" || $_ eq "--help");
18 return (system(@_)==0);
21 return (system("sudo",@_)==0);
35 die("$disk not writable\n") unless( -w
$disk);
37 $num=1 unless($num && $num>0);
38 my $type=`diskimg-fstype $disk $num`;
42 my $partmain=sudo_qx
("losetup -f");
45 die("losetup $partmain $disk:$!\n") unless(sudo_system
("losetup",$partmain,$disk));
46 print("Whole disk of $disk, setup on $partmain\n");
49 my $partFst=sudo_qx
("losetup -f");
51 my $off=`diskimg-offset $disk $num`;
54 die("losetup -o $off $partFst,$disk:$!\n") unless(sudo_system
("losetup","-o",$off,$partFst,$disk));
55 print("First partition of $disk, setup on $partFst\n");
60 unlink $tmpname if( -e
$tmpname);
61 mkdir $tmpname or die("Unable to create mount-point directory:$tmpname\n");
62 die("mount -f $type $partFst $tmpname: $!\n") unless(sudo_system
("mount","-t",$type,$partFst,$tmpname));
63 print("Mount $partFst on $tmpname\n");
65 print("Grub stage files copyed.\n") if(sudo_system
("cp","-vfR","/boot/grub/",$tmpname . '/'));
67 die("$!\n") unless(sudo_system
("umount",$partFst));
68 print("Unmount $partFst\n");
70 rmdir $tmpname or die("$!\n");
71 die("$!\n") if(system("ln","-sf",$partmain,$tmpname));
72 die("$!\n") if(system("ln","-sf",$partFst,$tmpname . "1"));
73 print("Create Symbol links for $partmain and $partFst\n");
75 print("Execute Grub...\n");
76 open(GRUB
,"| sudo grub --batch") or die("$!\n");
77 print GRUB
('device (hd0) ',$tmpname,"\n");
78 print GRUB
("root (hd0,0)\n");
79 print GRUB
("setup (hd0)\n");
83 unlink $tmpname . "1";
85 sudo_system
("losetup","-vd",$partFst);
86 sudo_system
("losetup","-vd",$partmain);