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