読者です 読者をやめる 読者になる 読者になる

😃 mattintosh note 📝

Hello Raspberry Pi!

Wine のプロファイルの隠蔽化

iNSTANTWiNE で試用中の「スパースバンドル」の話。「スパースバンドル」っていうのは可変サイズディスクイメージでマウントしていない場合は“何か”のデータが入ったただのフォルダ。多分これならマウントしていない間は Wine のプロファイルを見ることはできない(はず)。「Finder の検索とかで Wine のゲームのデータが見つかっちゃ困る!」っていう方向けに使っています。

で、この記事は手動でパスワード保護付きのスパースバンドルを作成し、Wine のプロファイルを隠蔽化してみようという話です。

スパース・バンドル・イメージの作成

hdiutil でパスワード保護付きのスパース・バンドル・イメージを作成する。以下の例では「1234」というパスワードをかけたディスクイメージを作成する。

printf '1234' | hdiutil create -encryption -stdinpass -type SPARSEBUNDLE -size 128g -fs HFS+J -volname `uuidgen` default
-encryption
パスワード保護付きのイメージを作成する。-stdinpass で標準入力からパスフレーズを受け取る。
-type SPARSEBUNDLE
スパース・バンドルタイプのイメージを作成する。SPARSEBUNDLE は大文字。
-size 128g
イメージの最大容量。実際にどこまで利用できるかは物理領域次第。例では 128 GB。足りないと面倒なのでできるだけ多めに。
-fs HFS+J
ファイルシステム。HFS+ か HFS+J (JHFS+)で作成しておけば多分問題ない。
-volname `uuidgen`
マウント時に利用するボリューム名。特定の場所にマウントするので名前はなんでもいいけど、他と被らないように uuidgen でランダム文字列を使用。

エイリアスの設定

  1. スパース・バンドルのマウント
  2. WINEPREFIX の指定と Wine の起動
  3. スパース・バンドルのアンマウント

という処理を行うエイリアスを作成する(関数でもいい)。

まずはスパース・バンドルのマウント。マウントポイントの指定が重要。これが WINEPREFIX になる。(uuidgen でボリューム名を作成した場合は恐らく被ることがないのでマウントポイントを指定せずに WINEPREFIX=/Volumes/[uuidgen で作成したボリューム名] とするのもいいかもしれない)

hdiutil attach $HOME/default.sparsebundle -mountpoint $HOME/.secret-wine

次は WINEPREFIX の指定と Wine の起動。

WINEPREFIX=$HOME/.secret-wine wine explorer

最後にスパース・バンドルのアンマウント。即時アンマウントを行おうとするとリソースが使用中でアンマウントできないため sleep 5 で遅延させる。

sleep 5
hdiutil detach $HOME/.secret-wine

以上を繋げるとこんな感じ。最初のマウントが失敗した場合にはそれ以降の処理を行わないようにしておく。

alias secret-wine="hdiutil attach $HOME/default.sparsebundle -mountpoint $HOME/.secret-wine && {
WINEPREFIX=$HOME/.secret-wine wine explorer
sleep 5
hdiutil detach $HOME/.secret-wine
}"

事前に export WINEPREFIX=$HOME/.secret-wine しているならマウントポイントなどは $WINEPREFIX と書ける。Finder にマウント状態を表示したくないのであれば attach のオプションに -nobrowse を追加する(その場合、手動でアンマウントするときはコマンドラインか「ディスクユーティリティ.app」を使うことになる)。

実行

コマンドを実行しようとするとパスワード入力を求められるためパスワードを知らないユーザーは起動できない。もしこれが不便で、Finder からマウントできないだけにしておきたいなら -stdinpass を使って入力を省略できる(どこかにパスワードを書かなくてはいけないので他人に知られる可能性がある)。

$ secret-wine
“default.sparsebundle”にアクセスするにはパスワードを入力してください:

/dev/disk2              GUID_partition_scheme
/dev/disk2s1            EFI
/dev/disk2s2            Apple_HFS                       /Users/hoge/.secret-wine

… (Wine のプロセス)

"disk2" unmounted.
"disk2" ejected.

スパースバンドルのクリーニング

スパースバンドルはイメージ内のデータが増えれば当然本体のファイルサイズも増える。hdiutil compact を使用することで空き領域を再使用可能にできる。

$ hdiutil compact $HOME/secret-wine.sparsebundle

圧縮を開始中...
空き領域を再び利用可能にしています...
.......................................................................................................................................................................................................
圧縮の仕上げ中...
空き領域 127.2 GB のうち 5.4 MB を再び利用可能にしました。

ディスクイメージ内のデータ量にもよると思うけど、数秒しかからないのでマウントする前に hdiutil compact を実行するようにしておくといいかもしれない。


既存の Wine のプロファイルをスパースバンドルに移行したい場合はスパースバンドルを作成して、Wine のプロファイル(例えば $HOME/.wine 以下のファイル)を全てコピーすればいいだけ。

/Volumes 以下にすでに同じ名前のボリュームがある場合、例えば untitled というボリューム名であれば untitled 1 といった名前に変更されてしまうこともあるのでボリューム名はできるだけ被らない名前が望ましいと思われる(マウントポイントで指定する場合は同名のファイルやフォルダが存在しないように)。

WINEPREFIX を /Volumes 以下に設定し、パスが存在しない場合は Wine はフォルダを作成出来ないためそのまま終了する。

スパースバンドルを使った Wine の運用は現在試用中なのでもしかしたら何か問題があるかもしれません。運用は自己責任で。