[Iohack-users 188] Re: Root Device in kernelsw

Back to archive index

YOSHIFUJI Hideaki / 吉藤英明 yoshf****@linux*****
2005年 6月 9日 (木) 01:55:28 JST


In article <1997.****@eggpl*****> (at Fri, 3 Jun 2005 22:57:31 +0900 (JST)), kogii****@eggpl***** says:

> >想像としては、block deviceのmajor/minorかな、という気がしますが…
> ご察しのとおり、major/minor番号です。
> 
> >ちなみに、rootを/dev/hda5にするためには
> > '/dev/hda5' => '0x305',
> >を足すだけで動いたし、kernelsw.cを見る限り、
> >kernelに渡された値は使われていないようですが...
> 本値は、カーネルコード中で、ルートデバイスの決定に使用されています。

(まだsourceを追う時間がとれていませんが)
なるほど、ありがとうございます。

hda5などにも対応するpatchを作ってみました。ご査収ください。

diff -ru kernelsw-2.1/kernelsw.pl kernelsw-2.1-dev/kernelsw.pl
--- kernelsw-2.1/kernelsw.pl	2005-03-02 20:13:28.000000000 +0900
+++ kernelsw-2.1-dev/kernelsw.pl	2005-06-09 01:43:35.183832360 +0900
@@ -4,7 +4,11 @@
 # kernelsw.pl version 2.1
 #   SH-Linux Kernel switcher 
 #   http://eggplant.ddo.jp/
-
+#
+# Changes:
+# 	YOSHIFUJI Hideaki <yoshf****@linux*****>
+# 		support more root devices
+#
 
 $version           = '2.1';
 $real_reboot_dir   = '/sbin/reboot_org';
@@ -20,11 +24,26 @@
 $max_image_size    = 512*4096;
 
 %dev_tbl=(
-'/dev/hda1' => '0x301',
-'/dev/hda2' => '0x302',
-'/dev/hda3' => '0x303',
-'/dev/hda4' => '0x304',
-'Not defined' => '0x000',
+    '/dev/hda' => 0x0300,
+    '/dev/hdb' => 0x0340,
+    #'/dev/hdc' => 0x1200,
+    #'/dev/hdd' => 0x1240,
+    #'/dev/hde' => 0x3100,
+    #'/dev/hdf' => 0x3140,
+    #'/dev/hdg' => 0x3200,
+    #'/dev/hdh' => 0x3240,
+    #'/dev/hdi' => 0x3800,
+    #'/dev/hdj' => 0x3840,
+    #'/dev/hdk' => 0x3900,
+    #'/dev/hdl' => 0x3940,
+    #'/dev/hdm' => 0x5800,
+    #'/dev/hdn' => 0x5840,
+    #'/dev/hdo' => 0x5900,
+    #'/dev/hdp' => 0x5940,
+    #'/dev/hdq' => 0x5a00,
+    #'/dev/hdr' => 0x5a40,
+    #'/dev/hds' => 0x5b00,
+    #'/dev/hdt' => 0x5b40,
 );
 
 #-------------- device driver check ---------------
@@ -136,9 +155,9 @@
     close(CONF);
 
     # root_dev check
-    $root_dev=$dev_tbl{$root};
+    $root_dev=&dev2rdev($root);
     if($root_dev eq ''){
-	print "root = $root not suppurt !!\n";
+	print "root = $root not supported !!\n";
 	exit;
     }
 
@@ -166,6 +185,38 @@
     return 0;
 }
 
+sub dev2rdev{
+    my ($dev_file) = @_;
+    my $minor = 0;
+    my $rdev;
+
+    if($dev_file =~ s/(\d+)$//){
+	$minor = $1;
+    }
+    if(defined($dev_tbl{$dev_file})){
+	if($minor && $minor < 0x40){
+	    $rdev = sprintf("%04x", $dev_tbl{$dev_file}+$minor);
+	}
+    }
+    return $rdev;
+}
+
+sub rdev2dev{
+    my ($devno) = @_;
+    my ($base, $offset) = (($devno & 0xff40), ($devno & 0x3f));
+    my $dev = "Unknown";
+    my $rdev;
+    unless($devno & 0x80){
+    	foreach $rdev (keys %dev_tbl){
+	    if ($dev_tbl{$rdev} == $base){
+		$dev = sprintf("%s%u", $rdev, $devno - $base);
+		last;
+	    }
+	}
+    }
+    return $dev;
+}
+
 sub switch(){
     if($driver_installed == 1){
 	open(DEV,"+>$dev_file") || die "Can't open $dev_file. $!\n";
@@ -227,11 +278,7 @@
 	($append) =/^.*\"(.*)\".*$/;
     }
 
-    foreach $i (sort keys %dev_tbl){
-	if(hex($dev_tbl{$i}) == hex($param[2])){
-	    $root = $i;
-	}
-    }
+    $root = &rdev2dev(hex($param[2]));
     
     if(hex($param[0]) == 1){
 	 $readonly_='read-only';


-- 
YOSHIFUJI Hideaki @ USAGI Project  <yoshf****@linux*****>
GPG-FP  : 9022 65EB 1ECF 3AD1 0BDF  80D8 4807 F894 E062 0EEA



Iohack-users メーリングリストの案内
Back to archive index