Workarounded rewriting of '/dev/hda' with the contents of '/dev/hda1'.
authorlace <>
Wed, 22 Feb 2006 21:48:55 +0000 (21:48 +0000)
committerlace <>
Wed, 22 Feb 2006 21:48:55 +0000 (21:48 +0000)
 - The installation was not working in fact.

biosautoraid.pl

index 3dd40cd..6d476f7 100755 (executable)
@@ -29,10 +29,10 @@ my $options_error=!GetOptions(
                "i|install"  ,\$opt_install,
                "u|uninstall",\$opt_uninstall,
                );
-local *BIN;
-open BIN,$bin_filename or die "open \"$bin_filename\": $!";
-my $bin=do { local $/; <BIN>; } or die "read \"$bin_filename\": $!";
-close BIN or die "close \"$bin_filename\": $!";
+my $BIN;
+open $BIN,$bin_filename or die "open \"$bin_filename\": $!";
+my $bin=do { local $/; <$BIN>; } or die "read \"$bin_filename\": $!";
+close $BIN or die "close \"$bin_filename\": $!";
 
 my $bin_len=length($bin);
 $bin_len>0 && !($bin_len%0x200) or die "Invalid length of \"$bin_filename\": $bin_len";
@@ -66,23 +66,66 @@ die "Type -i|--install or -u|--uninstall"                     if (!$opt_install
 die "Both -i|--install and -u|--uninstall forbidden together" if   $opt_install &&  $opt_uninstall;
 
 @ARGV<=1 or die;
-my $device_filename=$ARGV[0];
-
-local *DEVICE;
-open DEVICE,"+<".$device_filename or die "open \"$device_filename\": $!";
+my $master_filename=$ARGV[0];
 
+my $master_is_b=(-b $master_filename);
+my $master_is_f=(-f $master_filename);
+die "Invalid device file type: $master_filename" if !$master_is_b && !$master_is_f;
+my $backup_filename;
 my $backup_offset=$BACKUP_SECTOR_START*0x200;
+if ($master_is_f) {
+       $backup_filename=$master_filename;
+       }
+if ($master_is_b) {
+       die "Filename is block device but it is unsupported: $master_filename"
+                       if $master_filename!~m{^/dev/[hs]d[a-z]};
+       $backup_filename=$master_filename."1";
+
+       sub hdparm_g_start_check($$)
+       {
+       my($filename,$start_expected)=@_;
+       
+               local *HDPARM;
+               my $cmdname="hdparm -g '$filename'|";
+               open HDPARM,$cmdname or die "open \"$cmdname\": $!";
+               my $HDPARM=do { local $/; <HDPARM>; } or die "read \"$cmdname\": $!";
+               close HDPARM or die "close \"$cmdname\": $!";
+               my($start)=($HDPARM=~/^\s*\Q$filename\E:\s*geometry\s*=.*,\s*start\s*=\s*(\d+)\s*$/s)
+                               or die "Unparsable output of \"$cmdname\":\n$HDPARM";
+               die "Unexpected 'start' parameter $start (expected $start_expected) of: $filename"
+                               if $start!=$start_expected;
+       }
+
+       hdparm_g_start_check($master_filename,0);
+       hdparm_g_start_check($backup_filename,$backup_offset/0x200);
+       $backup_offset=0;
+       }
+
+my $MASTER;
+open $MASTER,"+<".$master_filename or die "open \"$master_filename\": $!";
 
-sysseek DEVICE,0,SEEK_SET or die "Error seeking $device_filename";
+# Do not write to the '/dev/hda' areas being mapped by: /dev/hda1
+# as reboot will rewrite '/dev/hda' with the contents of: /dev/hda1
+my $BACKUP;
+if ($master_filename ne $backup_filename) {
+       open $BACKUP,"+<".$backup_filename or die "open \"$backup_filename\": $!";
+       die if $backup_offset;
+       }
+else {
+       $BACKUP=$MASTER;
+       die if !$backup_offset;
+       }
+
+sysseek $MASTER,0,SEEK_SET or die "Error seeking $master_filename";
 my $master;
-$bin_len==sysread DEVICE,$master,$bin_len or die "read \"$device_filename\": $!";
-length($master)==$bin_len or die "read \"$device_filename\": ".length($master)."!=$bin_len";
-signature $master,$device_filename,0x1FE,"55AA";
+$bin_len==sysread $MASTER,$master,$bin_len or die "read \"$master_filename\": $!";
+length($master)==$bin_len or die "read \"$master_filename\": ".length($master)."!=$bin_len";
+signature $master,$master_filename,0x1FE,"55AA";
 
-sysseek DEVICE,$backup_offset,SEEK_SET or die "Error seeking $device_filename";
+sysseek $BACKUP,$backup_offset,SEEK_SET or die "Error seeking $backup_filename";
 my $backup;
-$bin_len==sysread DEVICE,$backup,$bin_len or die "read \"$device_filename\": $!";
-length($backup)==$bin_len or die "read \"$device_filename\": ".length($backup)."!=$bin_len";
+$bin_len==sysread $BACKUP,$backup,$bin_len or die "read \"$backup_filename\": $!";
+length($backup)==$bin_len or die "read \"$backup_filename\": ".length($backup)."!=$bin_len";
 
 my $zeroes="\x00"x$bin_len;
 die if length($zeroes)!=$bin_len;
@@ -95,10 +138,10 @@ print "Already instaled? ".($installed ? "YES" : "NO")."\n";
 die "Nothing to uninstall!\n" if $opt_uninstall && !$installed;
 
 if ($installed) {
-       signature $master,$device_filename,$bin_len-2,"BEEF","Different installed SECTOR_LEN?" if !$bin_short;
-       signature $master,$device_filename,0x03      ,unpack("H*","BIOSRAI");
-       signature $master,$device_filename,0x43      ,"5E81A2".sprintf("%X",$BACKUP_SECTOR_START) if !$bin_short;
-       signature $backup,"backup",0x1FE,"55AA";
+       signature $master,$master_filename,$bin_len-2,"BEEF","Different installed SECTOR_LEN?" if !$bin_short;
+       signature $master,$master_filename,0x03      ,unpack("H*","BIOSRAI");
+       signature $master,$master_filename,0x43      ,"5E81A2".sprintf("%X",$BACKUP_SECTOR_START) if !$bin_short;
+       signature $backup,$backup_filename,0x1FE,"55AA";
        }
 if ($opt_install) {
        if (!$installed) {
@@ -114,20 +157,24 @@ if ($opt_install) {
                                );
                        warn "WARNING: Dropping obsolete (but similiar) backup! Use --uninstall next time.\n";
                        }
-               sysseek DEVICE,$backup_offset,SEEK_SET or die "Error seeking $device_filename";
-               $bin_len==syswrite DEVICE,$master or die "Error backing up the master";
+               sysseek $BACKUP,$backup_offset,SEEK_SET or die "Error seeking $backup_filename";
+               $bin_len==syswrite $BACKUP,$master or die "Error backing up the master";
                }
-       sysseek DEVICE,0,SEEK_SET or die "Error seeking $device_filename";
-       $bin_len==syswrite DEVICE,$bin or die "Error writing new master of BIOSautoRAID";
+       sysseek $MASTER,0,SEEK_SET or die "Error seeking $master_filename";
+       $bin_len==syswrite $MASTER,$bin or die "Error writing new master of BIOSautoRAID";
        }
 if ($opt_uninstall) {
-       sysseek DEVICE,0,SEEK_SET or die "Error seeking $device_filename";
-       $bin_len==syswrite DEVICE,$backup or die "Error writing backup back to the master";
-       sysseek DEVICE,$backup_offset,SEEK_SET or die "Error seeking $device_filename";
-       $bin_len==syswrite DEVICE,$zeroes or die "Error clearing the backup area";
+       sysseek $MASTER,0,SEEK_SET or die "Error seeking $master_filename";
+       $bin_len==syswrite $MASTER,$backup or die "Error writing backup back to the master";
+       sysseek $BACKUP,$backup_offset,SEEK_SET or die "Error seeking $backup_filename";
+       $bin_len==syswrite $BACKUP,$zeroes or die "Error clearing the backup area";
        }
 
-close DEVICE or die "close \"$device_filename\": $!";
+close $MASTER or die "close \"$master_filename\": $!";
+if ($master_filename ne $backup_filename) {
+       close $BACKUP or die "close \"$backup_filename\": $!";
+       }
+system("sync") and die "Error running: sync: $!";
 
 print "OK; ".($opt_install ? ($installed ? "re" : "")."installed" : "uninstalled")."\n";
 $all_ok=1;