OSXでループバックデバイスっぽいことをする

OS Xではあまり馴染みがないかもしれませんが、ループバックデバイスっぽいことができます。

itpro.nikkeibp.co.jp

前提

今回入れたもの

ext4を内包するファイルを使ったループバック

OSXだとデフォルトでHFS(+)ですが、後からサイズ変更する方法がわからなかったので、資料があるext系のファイルシステムで試しました。 FUSE for OS Xは以下のサイトからインストーラをダウンロードしてインストールします。

Home - FUSE for OS X

途中、インストールするコンポーネントの選択画面が出ます。MacFUSE Compatibility Layerにチェックを入れます。

fuse-ext2も同様に以下のサイトからインストーラをダウンロードしてインストールします。

sourceforge.net

extを操作するためのコマンドラインツールをインストールします。

$ brew install e2fsprogs

適当なサイズの入れ物を作る。見ての通り小さすぎるとジャーナルできないらしい。 ブロックサイズやinodeの数は自動的に計算されますが、後から変更できないっぽいので、サイズやinode数は適宜調整します。 今回はとにかく作ったものです。

最初にext4ファイルシステムを内包した空のファイル(image.bin)を作ります。

$ cd <作業フォルダ, イメージ格納先>
$ gtruncate -s 1MB image.bin
$ <e2fsprosインストール先(/usr/local/Cellar/e2fspros/あたりなはず)>/sbin/mkfs.ext4 -F image.bin
mke2fs 1.42.13 (17-May-2015)

Filesystem too small for a journal
Creating filesystem with 976 1k blocks and 128 inodes

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

作ったファイルをマウントして使います。

$ mkdir <マウント先>
$ fuse-ext2 -o rw+ image.bin <マウント先>
$ ls volume
lost+found

lost+foundは消しても良いはずです(ファイルシステムを作るときに見つかったデータとかだったと思う)。

もっとサイズが必要になったら拡張ができます。

$ umount <マウント先>
$ <e2fsprogs>/sbin/resize2fs image.bin 50M
resize2fs 1.42.13 (17-May-2015)
Resizing the filesystem on image.bin to 51200 (1k) blocks.
The filesystem on image.bin is now 51200 (1k) blocks long.
$ fuse-ext2 -o rw+ image.bin <マウント先>

圧縮ファイルをマウントする

領域サイズを調整するのが面倒だし、普段使わないので多少スピードが遅くなっても容量を節約したい場合、archivemountを使うと、圧縮ファイルtar.gzをマウントできるようになります。書き換えもできます。

osdn.jp

$ brew install homebrew/fuse/archivemount
$ touch dummy
$ tar czvf image.tar.gz dummy
$ rm dummy
$ archivemount image.tar.gz <マウント先>

使い終わったらアンマウントすると圧縮ファイルの内容が更新されます。

$ umount <マウント先>

リンク先にあるように、archivemountはアンマウント時に圧縮ファイルが2つできます。そのため十分なファイルサイズが必要になります。-o nobackupオプションでバックアップが自動削除されますが、一時的には2つ分の容量を消費するようです。