hack のためのネタ帳, etc,,,

状況

FreeBSD 4.9 の whole disk image を Linux で mount しようとしたんだけど、
BSD は disklabel とか slice とか partition の概念が Linux と違ってるので、
kpartx -a disk.img
みたいにしても loop[0-9]p1 に partition a: しか拾ってくれず、
残りのパーティションを簡単には mount 出来ない。

FreeBSD のパーティション

まず、MBR (MSDOS) 方式のパーティションテーブルを使っているのは Linux と共通だが、
primary partition の事を slice と言うらしく、slice の中に partition が複数切ってあるらしい。
デフォルトだと partition a: が / で b: が swap、c: が slice 全体なんだそうな。
んで e:, f: g: 辺りが、/var, /tmp, /usr 辺りに mount される。

BSD disklabel なんて言い方もするみたいで、
Linux の fdisk だと b コマンドでこれを表示編集することが可能な他、
disktype コマンドを用いても表示することが可能。

今回の場合、以下のような構成だった。
$ disktype disk.img

--- disk.img
Regular file, size 111.8 GiB (120034123776 bytes)
FreeBSD boot manager (i386 boot0 at sector 0)
DOS/MBR partition map
Partition 1: 111.8 GiB (120031478784 bytes, 234436482 sectors from 63, bootable)
  Type 0xA5 (FreeBSD)
  FreeBSD boot loader (i386 boot1 at sector 0)
  FreeBSD boot loader (i386 boot2/BTX 1.01 at sector 2)
  BSD disklabel (at sector 1), 8 partitions
  Partition a: 128 MiB (134217728 bytes, 262144 sectors from 63)
    Type 7 (4.2BSD fast file system)
    Includes the disklabel and boot code
    UFS file system, 8 KiB offset, little-endian
      Last mounted at "/"
  Partition b: 1.954 GiB (2097659904 bytes, 4096992 sectors from 262207)
    Type 1 (swap)
  Partition c: 111.8 GiB (120031478784 bytes, 234436482 sectors from 63)
    Type 0 (Unused)
  Partition e: 256 MiB (268435456 bytes, 524288 sectors from 4359199)
    Type 7 (4.2BSD fast file system)
    UFS file system, 8 KiB offset, little-endian
      Last mounted at "/var"
  Partition f: 256 MiB (268435456 bytes, 524288 sectors from 4883487)
    Type 7 (4.2BSD fast file system)
    UFS file system, 8 KiB offset, little-endian
      Last mounted at "/tmp"
  Partition g: 109.2 GiB (117262730240 bytes, 229028770 sectors from 5407775)
    Type 7 (4.2BSD fast file system)
    UFS file system, 8 KiB offset, little-endian
      Last mounted at "/usr"

partition a: の mount

これは kpartx が /dev/mapper/loopXpY にぶら下げてくれるのでを比較的簡単で、以下のようにすれば mount 出来た。
sudo kpartx -v -a disk.img
sudo mount -r -u ufs -o ufstype=44bsd /dev/mapper/loopXp1 /mnt

「Type 7 (4.2BSD fast file system)」となっていたので、ufstype は old かなと思ったけど 44bsd だった。

他の partition の mount

こっちは kpartx が認識してくれないので、ちょっと苦労したが、
distype の結果を元に、offset と sizelimit を設定すれば行けた。

具体的には、例えば上記の disktype の例で g: の /usr を mount するには以下のようにすればよかった。
sudo mount -r -t ufs -o loop,ufstype=44bsd,offset=$((512*5407775)),sizelimit=117262730240 disk.img /mnt

script

以下のようなスクリプトを作ってみた

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます