mdconfig の使い方色々(tmpfs, .iso のマウント, GEOM など)

md (/sbin/mdconfig) を使うと任意のファイルやメモリ領域をファイルシステム化することができます。
これを使うと、 Linux の tmpfs のようにメモリ領域にファイルを置いたり、CD イメージデータなどを仮想ファイルシステムとしてマウントすることができます。
 


■Linux の tmpfs (/dev/shm) のように使う
書式:

mdconfig -a -t swap -s <サイズ> [ -u <デバイス番号>] # swap 込みで確保(推奨)
mdconfig -a -t malloc -o reverse -s <サイズ> [ -u <デバイス番号>] # malloc (9)によるメモリ確保。大容量には向かない

 例:

$ su
# mdconfig -a -t swap -s 10m # あいているデバイス番号でメモリ 10MB を割り当て(0 〜 )
md0 # /dev/md0 が作成された
# newfs /dev/md0 # /dev/md0 に結びついた領域にファイルシステム作成
# mount /dev/md0 /mnt # アクセスできるようにマウント
# df -h | grep md0 # マウントできたか確認。
/dev/md0 9.4M 4.0K 8.7M 0% /mnt
# dd if=/dev/zero of=/mnt/foo.txt bs=1m count=5 # 適当にデータ書き込み
5+0 records in
5+0 records out
5242880 bytes transferred in 0.063932 secs (82007207 bytes/sec)
# dd if=/dev/zero of=/tmp/foo2.txt bs=1m count=5 # 比較用。/tmp より /mnt に書くほうが早くなっているはず
5+0 records in
5+0 records out
5242880 bytes transferred in 0.159325 secs (32906800 bytes/sec)
# ls -l /mnt
total 5138
drwxrwxr-x 2 root operator 512 2 4 17:15 .snap
-rw-r–r– 1 root wheel 5242880 2 4 17:18 foo.txt

 開放手順:

# umount /mnt # マウントポイントから切り離す
# mdconfig -d -u 0 # /dev/md0 をデタッチ


■任意のファイルをファイルシステムとして扱う
 (CD イメージ,ハードディスクイメージなどをマウントする)
 書式:

mdconfig -a -t vnode -f <ファイル名> [ -u <デバイス番号> ] # 指定したファイルをファイルシステムとして扱う

 例:

$ su
# ls /root/cd.iso # マウント対象の CD-ROM イメージ
cd.iso
# mdconfig -a -t vnode -f /root/cd.iso -u 1 # cd.iso を /dev/md1 に結びつける(今回は -u 1 で md1 を明示的に確保)
# mount -t cd9660 /dev/md1 /mnt # CD-ROM なので cd9660 をファイルシステムに指定してマウント。
# ls /mnt # CD-ROM の中身へのアクセス成功。
boot.cat f2.txt f6.txt initrd.gz splash.rle
boot.txt f3.txt f7.txt isolinux.bin
f1.txt f4.txt f8.txt isolinux.cfg
f10.txt f5.txt f9.txt linux

 開放手順: (前述の例と同じ)

# umount /mnt
# mdconfig -d -u 1 # /dev/md1 をデタッチ


■ zip 圧縮してサイズを節約する(geom_uzip: GEOM の利用例)
GEOM_UZIP を使うと、vnode 用イメージファイルをZIP圧縮してサイズを節約することができます。読み込み専用でしかマウントできないという欠点はありますが、CDイメージの保存やデータのバックアップなどの用途には有用です。
 例:

$ dd if=/dev/acd0 of=cdimg.iso bs=2352 # ファイルシステムのイメージデータ(なんでもよいがここでは CDドライブから吸出し(cd9660形式)) (1)
$ mkuzip -o cdimg.uzip cdimg.iso # 元のファイルシステムを geom_uzip で使える形式(*.uzip) に圧縮(2)
$ rm cdimg.iso # cdimg.iso はもう不要 (3)
$ su
# kldload geom_uzip # geom_uzip がカーネルに組み込み済みでなければここでロードする(4)
# mdconfig -a -t vnode -f cdimg.uzip # cdimg.uzip を vnode 形式で仮想ディスク化
md0
# ls /dev/md0* # geom_uzip が認識されていれば,geom_uzip 用イメージを mdconfig すると /dev/md*.uzip が同時に作成される
/dev/md0 /dev/md0.uzip /dev/mdctl
# mount -t cd9660 -r /dev/md0.uzip /mnt # /dev/md*.uzip を元のファイルシステム(この例ではcd9660)で read-only (-r)でマウントする。

 開放手順: (前述の例と同じ)

# umount /mnt
# mdconfig -d -u 1 # /dev/md1 をデタッチ

 
(1) 〜 (3) をまとめて次のように記述することもできます。

dd if=/dev/acd0 bs=2352 | mkuzip -o cdimg.uzip /dev/stdin

恒常的に geom_uzip を使う場合は、(4)のかわりに geom_uzip をカーネルバイナリに組み込むか /boot/loader.conf に次の一文を追加すると起動時に自動でロードされます。

geom_uzip_load=”YES”

 
(4)以降については *.uzip が代用される以外は前述の vnode の例と同じです。


■ geli を使った仮想ファイルシステムの暗号化:
mdconfig を geli(GEOM_ELI) や gdbm(GEOM_DBM) と組み合わせると、TrueCrypt や pgpdisk のように暗号化仮想ファイルシステムを構築することができます。今回は geli の例を紹介します。
 
geli を使うと既存のストレージがファイルシステムごと暗号化され、専用のラッパデバイス(/dev/*.eli) からしかアクセスできなくなります。/dev/*.eli をアタッチするには認証(パスフレーズ+鍵ファイル)が必要なため、必要な時のみアタッチ、マウントすることでデータの機密性を保つことができます。/dev/*.eli を使うユーザからは暗号化がされていない時と同様に利用できるため、大きな変更なしで簡単に利用できます。
 
 /boot/loader.conf:

geom_eli_load=”NO” # Disk encryption driver (see geli(8))

例:

# dd if=/dev/random of=/root/eli.key bs=64 count=1 # geli での認証用鍵ファイル(64byte)
# dd if=/dev/zero of=img.eli count=10 bs=1m # 仮想ファイルシステム用イメージファイル作成(ここでは 10MB=10*1m)。
# su
# mdconfig -at vnode -f img.eli
md0
# geli init -s 4096 -K /root/eli.key /dev/md0 # /dev/md0 を geli 用のファイルシステムとして初期化(暗号化)
Enter new passphrase:
Reenter new passphrase:
# geli attach -k /root/eli.key /dev/md0 # /dev/md0 に透過的にアクセスするためのデバイス取得(/dev/md0.eli が作成される)
Enter passphrase:
# newfs /dev/md0.eli # ファイルシステムは UFS 形式として初期化(暗号化された領域内)
/dev/md0.eli: 10.0MB (20472 sectors) block size 16384, fragment size 4096
        using 4 cylinder groups of 2.50MB, 160 blks, 192 inodes.
super-block backups (for fsck -b #) at:
 160, 5280, 10400, 15520
# mount /dev/md0.eli /mnt # あとは普通に(UFSとして)マウント。

 解放手順:

# umount /mnt # /dev/md0 のマウント先をアンマウント
# geli detach md0.eli # /dev/md0.eli を解除
# mdconfig -du 0 # /dev/md0 を解除

 
最初に作成した鍵ファイル(例では/root/eli.key) はフラッシュメモリなど暗号化デバイスとは別の場所に保存するのが望ましいです。
また、

geli init

の引数に -K <keyfile> を含めない場合はキーレス認証(パスフレーズのみ)での暗号化になり、 -P を追加するとパスフレーズレス認証(鍵ファイルのみ)での暗号化になります。
注意点として、geli init をするとデバイスに結びついたファイルシステムが初期化されることにも気をつけて下さい。詳細については geli(4) を参照のこと。
 


参考:
– mdconfig(8)
mdだって凄いんです。(404 Blog Not Found)
Linux で仮想 CD ドライブをマウントする(Hermit Complex 楽天支店)

# mount -t iso9660 -o loop /home/tagosuck/tagosucd.iso /mnt/tagosucd0