FreeBSD QandA 1845

FreeBSD QandA

Q. FreeBSD で 640MB の MO に UFS (FFS) を作成して使いたい。

A. SCSI 接続の MO ドライブならば、4.0-RELEASE 以降は da(4) ドライバで対応してお
   り、基本的には標準のシステムで利用可能です。(*1) 
   ATAPI の MO は 4.4-RELEASE の時点ではそのままでは使えませんが、使えるように
   する方法が [FreeBSD-users-jp 65621] で報告されています。
   以下では da0 が MO ドライブであるとして説明します。

   基本的には、他のメディア同様 disklabel を作成して newfs すれば使えます。
   しかし 640MB の MO はセクタサイズが 512 バイトでなく2048 バイトなので、そ
   ういう指定が必要な場合があります。
   disklabel の前に fdisk で slice を作成することももちろん可能ですが、ここで
   は割愛します。

   (a) disklabel の書き込み (*2)
    [管理番号 680] の A2、A3 を参考にします。
    disklabel が

      root# disklabel -r -w da0 auto
      disklabel: /dev/da0c: Undefined error: 0

    というエラーを出力して終了してしまう場合、A2 にしたがって slice の情報を消
    す必要がありますが、dd の引数に bs=2048 が無いとエラーになって書き込みでき
    ないことに注意してください。(*3)

    エラーになる場合:
      root# dd if=/dev/zero of=/dev/da0 count=4
      dd: /dev/da0: Invalid argument
      1+0 records in
      0+0 records out
      0 bytes transferred in 0.000411 secs (0 bytes/sec)

    うまく行く場合:
      root# dd if=/dev/zero of=/dev/da0 bs=2048 count=4
      4+0 records in
      4+0 records out
      8192 bytes transferred in 1.138270 secs (7197 bytes/sec)

    また A3 で「最小限のパーティション設定」というのは, c だけが存在するという
    意味です。a パーティションが必要ならば、disklabel -e で編集するか、
    /etc/disktab に 640MB MO 用の項目を用意しておいて、auto の代わりにそれを指
    定しなければなりません。ここでは od-driver のパッチキットに含まれているも
    のを使いました。([管理番号 22] 参照)
    例えば、

      root# disklabel -r -w da0 auto
      user% disklabel -r da0 | tail -2
      #        size   offset    fstype   [fsize bsize bps/cpg]
        c:   310352        0    unused        0     0         # (Cyl.    0 - 151*)

    これに対して,

      root# disklabel -r -w da0 mo640
      user% disklabel -r da0 | tail -3
      #        size   offset    fstype   [fsize bsize bps/cpg]
        a:   310352        0    4.2BSD     2048  8192     0   # (Cyl.    0 - 151*)
        c:   310352        0    unused        0     0         # (Cyl.    0 - 151*)

    の様になります。

   (b) ファイルシステムの構築 (参考 [管理番号 575])

      root# newfs da0a  (*4)
      Warning: Block size restricts cylinders per group to 10.
      Warning: 3776 sector(s) in last cylinder unallocated
      /dev/da0a:      1241408 sectors in 76 cylinders of 1 tracks, 16384 sectors
              606.2MB in 8 cyl groups (10 c/g, 80.00MB/g, 9600 i/g)
      super-block backups (for fsck -b #) at:
       32, 163872, 327712, 491552, 655392, 819232, 983072, 1146912

    Warning が二つ出ました。
    一つ目は、すぐ上の disklabel -r の結果において a パーティションの bps/cpg が
    0 になっているためです。newfs 後にもう一度 disklabel -r すると、ここが 10 に
    なっています。
    二つ目は、セクタをグループ化したときに端数が出てしまったという意味です。
    この 8 MB 弱は利用できないことになります。まあ 8/640  なので良しとしましょう。

    これで 640MB MO のメディアの準備ができましたので、mount して利用できます。


   (*1) MO を利用するのに od-driver が推奨されることがあります。これは、いくつ
     かのコマンドやカーネルに対するパッチですが。4.0-RELEASE 以降は MO を利用
     するのに必須のものではなくなりました。
     現在 MO を利用する際に od-driver を用いる利点は
     - da(4) の代わりに od(4) でアクセスできるので、ハードディスクと間違わない
     - removable メディアに配慮しているので、ライトプロテクトした MO をうっかり
       read&write で mount してもシステムがハングアップしない
     などです。

   (*2) /etc/disktab に 640MB MO 用の項目があれば、[FreeBSD-users-jp 53060] で
     報告されている通り、disklabel を省いて newfs のみで disklabel も同時に書
     き込むことも出来ます。

       root# newfs da0c mo640
       Warning: Block size restricts cylinders per group to 10.
       Warning: 3776 sector(s) in last cylinder unallocated
       /dev/da0c:      1241408 sectors in 76 cylinders of 1 tracks, 16384 sectors
               606.2MB in 8 cyl groups (10 c/g, 80.00MB/g, 9600 i/g)
       super-block backups (for fsck -b #) at:
        32, 163872, 327712, 491552, 655392, 819232, 983072, 1146912

     これで da0c を mount して使用することが出来ます。
     パーティション c を disk 全体を表すものとして fstype を unused のままにす
     る慣習に従い、4.2BSD となっていると disklabel が下記の warning を出します
     が、使用する上で支障はありません。

       Warning, partition c is not marked as unused!
       Warning, An incorrect partition c may cause problems for standard system utilities

     また、disklabel が正しく書き込まれない場合があります。

       user% disklabel -r da0 | tail -3
       disklabel: bad pack magic number (label is damaged, or pack is unlabeled)

     またこの方法では、disktype に auto を指定することは出来ません。

       root# newfs da0c auto
       newfs: auto: unknown disk type

     となります。

   (*3) 230MB のメディアは bs を指定しなくても書き込めます。

   (*4) ここでは a パーティションにを newfs しました。当然ですが既に作成されて
     いるパーティションしか newfs できません。/etc/disktab の 640MB MO のエント
     リを使わずに auto で disklabel した場合には、c パーティションが存在するの
     みですから、`newfs da0c' としなければいけません。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。