« 小ネタ:32bitOS用プログラムのコンパイル | トップページ | つくるJukebox(2) »

2011年1月 9日 (日)

KVMとAFT

KVM(というかXen)のimg形式のファイルをファイルシステムとしてマウントするには

ちょっとやってみたくて調べました。loopback mountするときにoffsetを指定すればいいそうです。

# mount -o loop,offset=32256 some.img /mnt

こうするとマウントできる、ということです。確かにマウントできるんですが、マウントポイントに見えるのは/bootの内容です。

つまり、imgファイルの内容はディスクのイメージそのままなので、ブートセクタなどを読み飛ばして、最初のパーティションが始まるのが32256バイト目ということです。

さて、32256バイト、ちょっと半端ですね。つまり、512バイトセクタが63個で32256バイトです。
勘のいい方は気づいたと思います。つまり、CHSトランスレーションは255トラック63セクタなので、で0シリンダの1トラックの最初のセクタが64番目のセクタ、つまり、32256バイト目です。

実際、イメージをfdiskで見ると

# fdisk go200.img

Command (m for help): p

Disk go200.img: 12.9 GB, 12884901888 bytes
255 heads, 63 sectors/track, 1566 cylinders, total 25165824 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000bca53

    Device Boot      Start         End      Blocks   Id  System
go200.img1   *          63      512064      256001   83  Linux
go200.img2          512065    23060639    11274287+  83  Linux
go200.img3        23060640    25157789     1048575   82  Linux swap / Solaris

こんな結果が返ってきます。2番目のパーティションにアクセスしたければ、512065に512をかけて262177280をオフセットに指定すればマウントできます。

さて、さらに勘のいい人はもう気づいたかとおもいます。WDのディスクはAFTという仕様でできていて、ディスクの物理セクタは4096バイトです。そう、このimgファイルをAFTなディスクで使うと、やっぱり性能が劣化するのです。

AFTとは、つまり、見かけのセクタと実際のセクタサイズが違っていて、ディスクの入出力は4096バイト単位ですが、OSからの要求には512バイト単位で答えます。しかし、今日的なOSは4096バイトより小さい単位の入出力を行うことはないので、OSが要求する4096バイトのクラスタがHDDの物理セクタと一致している分には何の問題もありません。
では、違うとどうなるかというと、HDDは2つのセクタを読み出して、それぞれのセクタにまたがった入出力要求を実施して、命令がWriteなら2つのセクタを書き戻します。この動作が、性能が落ちるといわれる原因です。

じゃぁ、imgは全部だめかというと、どのインストーラを使ったかによります。

# fdisk test1.img

Command (m for help): p

Disk test1.img: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00075096

    Device Boot      Start         End      Blocks   Id  System
test1.img1   *        2048     1026047      512000   83  Linux
test1.img2         1026048    16777215     7875584   8e  Linux LVM

最初のimgはMeegoをインストールしたものですが、こちらはFedora14のimgです。これはちゃんと4k境界にそろえてパーティションが作られています。
そう、このimgをloopback mountするときにはoffsetの値もそのように指定しなければいけません。

Meegoネタは後のために取っておくとして、Meegoのような比較的新しいOSでもCHSトランスレーションそのままです。仮想計算機なので、別のimgをパーティション切って詰め直せばいいのですが。AFT、現状では使いこなすのは結構大変なようです。

« 小ネタ:32bitOS用プログラムのコンパイル | トップページ | つくるJukebox(2) »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/60027/50540382

この記事へのトラックバック一覧です: KVMとAFT:

« 小ネタ:32bitOS用プログラムのコンパイル | トップページ | つくるJukebox(2) »