google-code-prettify

2008-07-10

disklabelとエンディアン

disklabelを調べて、ちょっとわかった事をまとめる。
disklabelを読み書きするにはdisklabel(8)を使うのだが、2通りの方法がある。
  • disklabel(8)は、ioctlでdisklabelの内容をkernel経由で読み(書き)する。

  • disklabel(8)に-rを渡すと、ディスクから直接disklabelを読み(書き)する。


disklabelのパーサーは、kernel内とdisklabel内の2つが存在し、disklabel(8)に-rを渡すと後者が使われる。

で、このパーサーに違いがある。
  • kernel内でのdisklabelのパーサーはSH3ではarch/sh3/sh3/disksubr.c。これは、デフォルトではEndian Independentではない。つまり、i386で作ったdisklabelをBig EndianのCPUでは読めない。

  • disklabel(8)内のdisklabelのパーサーは、Endian Independent。


これによって、どんな現象が起こるかと言うと、i386でdisklabelを付けたCFをsh3-ebで読もうとした場合に、
  • # disklabel wd0のようにすると、disklabelが無いかのように扱われる。(kernelが自動作成したfictitiousなdisklabelが見える)
  • # disklabel -r wd0とすると、i386で作ったdisklabelが読める


SH3でdisksubr.cをEndian Independentにするには、confにoptions BSDDISKLABEL_EIと書くと良い。

0 件のコメント: