NetBSDで3TBのHDDを扱う (gpt, dkctl)
2012/05/14(月) 25:36 NetBSD はてブ情報 はてブに登録 はてブ数

3TBのHDDはNetBSDでどう扱えば良いのでしょうか?

Linuxのときに少し手間取ったので、何かあるなと思ってはいましたが、やっぱりいくつか失敗しながらなんとか使えるようになりました。少しまとめておきます。

まずは、こんな感じで見えてます。
root@zbox>dmesg | grep sd0
sd0 at scsibus0 target 0 lun 0: <I-O DATA, HDCA-U, 1337> disk fixed
sd0: 2794 GB, 16383 cyl, 16 head, 63 sec, 512 bytes/sect x 5860533168 sectors
大きなHDDはfdiskが使えないのでLinuxではpartedを使いました。
partedはpkgsrc/wipにあり、これを使おうとmakeするとLinuxだけだよと怒られます。

じつはgptコマンドというそのものズバリのコマンドがあり、これを使えば良いというのを初めてしりました。

まずは、ディスクの状態を見てみます。
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1  5860533134         
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header

なんか、セカンダリGPT table, headerしかない変な状態に見えます。
ということで一度クリアすることにしました。

gpt destroyで情報を消します。
root@zbox>gpt destroy sd0
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1  5860533167         

あらたにgpt createで区画を作ります。
root@zbox>gpt create sd0
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101         
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
ちゃんとプライマリの情報とセカンダリの情報ができてます。区画情報を冗長化してるんですかね。

man gptのEXAMPLEに近い状態になったので、いざ、先に進みます。

まずは区画を作ります。デフォルトだとFFSでディスク全体を区画にします。
今回はでかい区画が欲しいのでこれでよしとします。
root@zbox>gpt add sd0
Partition added, use:
        dkctl sd0 addwedge <wedgename> 34 5860533101 <type>
to create a wedge for it
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101      1  GPT part - NetBSD FFSv1/FFSv2
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
区画にラベルをふってあげます。名前を付ける感じですね。
ラベル名はgpt showに-lをつけると見えるようです。最初は空っぽ。
root@zbox>gpt show -l sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101      1  GPT part - ""
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
gpt labelに区画を指定する引数を与えて名前を付けます。今回はshareという名前にしました。
root@zbox>gpt label -i 1 -l share sd0
partition 1 on rsd0d labeled share

root@zbox>gpt show -l sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101      1  GPT part - "share"
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
これで区画ができたので使えるようにしましょう。
いつものようにdisklabelです。最初は空っぽ。
root@zbox>disklabel -r sd0
disklabel: could not read existing label
disklabel -i -I sd0あたりでそれっぽいラベルを作ります。
root@zbox>disklabel sd0
# /dev/rsd0d:
type: SCSI
disk: HDCA-U          
label: fictitious
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 16383
total sectors: 1565565872
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0 

4 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a: 1565565872         0     4.2BSD      0     0     0  # (Cyl.      0 - 1553140*)
 d: 1565565872         0     unused      0     0        # (Cyl.      0 - 1553140*)
作ったらnewfsしてマウントです。newfsではrawデバイスを指定しないといけなかったですね。
root@zbox>newfs -O2 /dev/sd0a
newfs: /dev/sd0a is a block device. use raw device

root@zbox>newfs -O2 /dev/rsd0a
/dev/rsd0a: 764436.5MB (1565565872 sectors) block size 16384, fragment size 2048
        using 4133 cylinder groups of 184.98MB, 11839 blks, 22976 inodes.
super-block backups (for fsck_ffs -b #) at:
160, 379008, 757856, 1136704, 1515552, 1894400, 2273248, 2652096, 3030944, 3409792, 3788640, 4167488, 4546336, 4925184, 5304032, 5682880, 6061728, 6440576, 6819424, 7198272,
..................................................................................................................................................................................

root@zbox>mount /dev/sd0a /mnt
root@zbox>df -k
Filesystem    1K-blocks       Used      Avail %Cap Mounted on
/dev/wd0a      77398560   20353514   53175118  27% /
kernfs                1          1          0 100% /kern
ptyfs                 1          1          0 100% /dev/pts
procfs                4          4          0 100% /proc
/dev/sd0a     758910582          2  720965052   0% /mnt
見事に使えるようになりました。

でも、おかしいですね。3TBにしては小さすぎます。
もしかしたらdisklabelでは3TBは扱えないのかも、とおもってmanを読むと、BUGSに
The disklabel structure stored on disk cannot support partitions/disks
     greater than 2TB.  Please use gpt(8) and dkctl(8) to manage partitions
     and disks larger than 2TB.
ありゃ、やっぱりそうでしたか。ここにあるgptは使ったけど、dkctlって何でしょう。

そういえば、gpt addしたときのコマンドの応答にそういうのがあったような...
root@zbox>gpt add sd0
Partition added, use:
        dkctl sd0 addwedge <wedgename> 34 5860533101 <type>
to create a wedge for it
おぉ、これです。もしかしたら、このコマンドで区画を有効化しなさいということなのかも。

まずは、umountします。
root@zbox>umount /mnt
さっきのコマンドに引数をいくつか与えて実行してみます。
wedgenameはsd0a, typeはffsにしました。wedgenameは、少し考えて、ださいけどこうしました。
root@zbox>dkctl sd0 addwedge sd0a 34 5860533101 ffs
dk0 created successfully.
どうやらdk0というのがfdiskでいうsd0aに相当するみたいですね。
情報を見てみます。
root@zbox>dkctl sd0 listwedges
/dev/rsd0d: 1 wedge:
dk0: sd0a, 5860533101 blocks at 34, type: ffs
やっぱりwedgenameはshareとかにすべきでしたねー。

まぁ、それほど見る機会もないだろうからnewfsしちゃいましょう。
root@zbox>newfs -O2 dk0
/dev/rdk0: 2861588.4MB (5860533100 sectors) block size 16384, fragment size 2048
        using 15470 cylinder groups of 184.98MB, 11839 blks, 22976 inodes.
super-block backups (for fsck_ffs -b #) at:
160, 379008, 757856, 1136704, 1515552, 1894400, 2273248, 2652096, 3030944, 3409792, 3788640, 4167488, 4546336, 4925184, 5304032, 5682880, 6061728, 6440576, 6819424, 7198272,
..................................................................................................................................................................................
いざ、mountです
root@zbox>mount /dev/dk0 /mnt
root@zbox>df -g
ilesystem    1G-blocks       Used      Avail %Cap Mounted on
/dev/wd0a            73         19         50  27% /
kernfs                0          0          0 100% /kern
ptyfs                 0          0          0 100% /dev/pts
procfs                0          0          0 100% /proc
/dev/dk0           2709          0       2573   0% /mnt
きましたね。ちゃんと2TB以上の領域として認識したみたいです。

1: sage 2012年05月16日(水) 午後4時08分

gptパーティションの開始セクタは8の倍数にしたほうが良いかと(4kセクタ問題対策)

2: tokuda 2012年06月01日(金) 午前8時21分

そうでした。Webを見てみると8の倍数だと思った以上に差があるみたい。USBの先につながっているからあんまり効果なかったりするかもしれないけど。


名前:  非公開コメント   

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