disklabelの不思議
2008/04/08(火) 26:06 NetBSD はてブ情報 はてブに登録 はてブ数

Eee PCで16GBのSDHCカードにNetBSDをインストールしようかと思い、色々試していました。

SDHCカードはUSBのリーダライタ経由で接続し、/dev/sd1として見えていました。

買った状態でのfdisk sd1の結果はこんな感じ。
Disk: /dev/rsd1d
NetBSD disklabel disk geometry:
cylinders: 15326, heads: 64, sectors/track: 32 (2048 sectors/cylinder)
total sectors: 31388672

BIOS disk geometry:
cylinders: 1023, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 31388672

Partition table:
0: Primary DOS with 32 bit FAT - LBA (sysid 12)
    start 8192, size 31380480 (15323 MB, Cyls 0/130/3-1953/217/56)
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
No active partition.
で、disklabel sd1の結果はこんな感じ。
# /dev/rsd1d:
type: SCSI
disk: USB SD Reader   
label: fictitious
flags: removable
bytes/sector: 512
sectors/track: 32
tracks/cylinder: 64
sectors/cylinder: 2048
cylinders: 15326
total sectors: 31388672
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0 

5 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 d:  31388672         0     unused      0     0        # (Cyl.      0 -  15326*)
 e:  31380480      8192      MSDOS                     # (Cyl.      4 -  15326*)
つまり、fdiskでMS-DOSのパーティションが切ってあって、disklabelでそれが反映された格好になっているわけですね。

その後、fdiskでsysid=169 (つまりNetBSD) のパーティションを切って、disklabelを書いたり、いろいろしていたわけです。

色々試した後、もう一度きれいな状態からやってみたくなり、
# dd if=/dev/zero of=/dev/rsd1d bs=512k count=100
てな感じで、マスターブートレコード (MBR) はもちろん、NetBSDパーティションの先頭もつぶしたつもりになっていました。なにしろ50MBほどゼロでつぶしたので、間違いないだろうと。

fdiskしてみると、たしかにすべてのパーティションがUNUSEDになっています。

ところが、disklabel sd1とやると消したはずのディスクラベルが残っています。本来なら、消えているはずなのに。man disklabelしてみると、次のような記述があります。
On systems that expect to have disks with MBR partitions (see fdisk(8)) disklabel will find, and update if requested, labels in the first 8k of type 169 (NetBSD) MBR labels and within the first 8k of the physical disk. On other systems disklabel will only look at the start of the disk. The offset at which the labels are written is also system dependent.
これは、i386のようなMBRがあるようなシステムでは、disklabelはNetBSDパーティションの先頭8kか物理ディスクの先頭8kを探しますってことで、つまりディスクの先頭かパーティションの先頭にラベルが書かれるわけですよね。

さすがに50MBもつぶせばラベルは消えているはず、と考えて間違いなさそうです。

IRCで困ったと叫んでいるとsdだとそうなったことがあるという話を聞いたり、disklabelのmanを読んでいたり、そういやin-coreとかon-diskとかあったような、などと考えつつ、なんとなくUSBのリーダライタを抜き差しして、再度disklabelを叩いてみました。

すると、さっきとは違う表示です。つまり、古いdisklabelではなく、fdiskの内容を反映した結果が表示されました。その後、あれこれやりつつdisklabel -r sd1とdisklabel sd1の結果の違いに気づいてきました。

その結果、in-core disklabelはkernel内で持っているラベル、on-disk disklabelは物理ディスクに書き込まれているラベル、である前提で考えて、次のように整理できるのではないかと思います。
  • in-core, on-diskは同期していない状態が発生しうる
    • 例えば、on-diskに書かれたラベルをkernelが読み込んでin-coreラベルを形成した後、ddなどでon-diskなラベルがつぶされた場合、disklabel -r sd1は"disklabel: could not read existing label"という結果を返すが、disklabel sd1は直前のdisklabelを表示する
  • in-coreの表示は、良きに計らった表示にしてくれることがある
    • 例えば、買ったばかりのSDHCカードはon-diskなラベルが当然存在せずfdisk的にMS-DOSなパーティションが切ってあるだけだが、disklabel sd1とin-coreなラベルを表示させるとfdiskの情報を反映したラベルが表示される (冒頭のdisklabelの結果がそれ)
    • 例えば、ddで先頭をつぶしてfdisk的にもon-diskラベル的にも何の情報もない状態でdisklabel sd1とやると無理矢理4.2BSDのパーティションがあるかのようなin-coreラベルを表示する(次のような)
    • 良きに計らった表示をしてくれるのはin-coreラベルを最初に作ったときだけで、いったんin-coreなラベルができた後にfdiskなどでパーティションを切ったとしてもその情報はin-coreラベルに自動的には反映されない
# /dev/rsd1d:
type: SCSI
中略
4 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  31388672         0     4.2BSD      0     0     0  # (Cyl.      0 -  15326*)
 d:  31388672         0     unused      0     0        # (Cyl.      0 -  15326*)
disklabel: boot block size 0
disklabel: super block size 0
という感じであってますかね?

1: makoto fujiwara 2008年04月09日(水) 午前5時48分

label: fictitious
っていう行が(これは良きにはからったものだよ)という意味
になっているかどうか、つまり本当に、「良きにはからった時」だけに
表示されるかが気になるのですが、自分では実はまだ確めたことが
ないのです。

2: Hiroshi Tokuda 2008年04月09日(水) 午前8時50分

fictitiousの意味を初めて知りました。ということで、disklabelの挙動を調べて今日の日記に書きました。


名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0570/tb/

今日のボク
2008/04/08(火) 25:11 今日のボク はてブ情報 はてブに登録 はてブ数

今日から集団登校です。一か月は慣れるために集団登校するみたい。朝の8時5分に近くの集合場所に出かけて行きました。

しかし、今日は天気が荒れていて、しかも荷物がたくさんあって大変。

といっても、やっぱり午前中でおしまい。午後から学童保育です。学童保育は夕方の5時までで、そのあと一人で家に帰ってくるという初めてかつ単独実行が必要なイベントが待っておりましたが、無事にミッション完了だったようです。

あ、お道具箱も今日持参する必要があったようですが、親子共々わすれておりました。さっそくの忘れ物ですね。

ちなみに、家に帰って確認してみたら、筆箱を学校に忘れてきたようです。これは先が思いやられますね。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0569/tb/