配布するdmgは、サイズを小さくしたい場合がある。一方、あとからファイルを書き込みたいdmgは、書き込み可能な形式にする必要がある。hdiutil createの-formatで、dmgの形式を指定できる。

$ hdiutil create -volname "[ボリューム名]" -srcfolder [フォルダ] -format ULFO -ov [dmgのファイル名].dmg

ここでは、-formatに指定できる主な形式と、同じ中身から作ったdmgのサイズの違い、書き込みの可否を紹介する。実行例はmacOS 27.0.1のもの。

参考: 【hdiutil】フォルダからdmgを作る

指定できる形式

hdiutil createで、フォルダからdmgを作る場合の既定の形式は、UDZOである。-formatには、次の形式を指定できる。

形式内容書き込み備考
UDZOzlibで圧縮不可既定の形式
ULFOlzfseで圧縮不可OS X 10.11以降
ULMOlzmaで圧縮不可macOS 10.15以降
UDBZbzip2で圧縮不可非推奨
UDCOADCで圧縮不可
UDRO圧縮しない不可
UDRW圧縮しない可書き込み用

対応するmacOSのバージョンは、man hdiutilの記載による。UDBZは、manページで非推奨と書かれている。

-formatには、スパースイメージ(UDSP、UDSB)など、増える容量に合わせて大きくなる形式も指定できる。

同じ中身で形式ごとのサイズを比べる

同じフォルダから、-formatを変えてdmgを作り、ファイルのサイズを比べた。中身は、圧縮が効きやすいテキストと、圧縮が効かない乱数の2種類である。

  • テキスト: 169個のMarkdownファイル(約1 MB)
  • 乱数: /dev/urandomで作った1個のファイル(20,000,000バイト)
形式テキスト(約1 MB)のdmg乱数(約20 MB)のdmg
UDRO1,453 KB20,262 KB
UDRW13,214 KB32,516 KB
UDZO472 KB20,376 KB
ULFO354 KB20,570 KB
ULMO279 KB20,370 KB
UDBZ268 KB20,464 KB
UDCO325 KB20,056 KB

サイズは、1 KBを1,000バイトとして四捨五入した値である。

テキストでは、圧縮する形式のdmgが、UDROの3分の1から5分の1ほどになった。UDZO、ULFO、ULMOの順に小さくなった。乱数は圧縮が効かず、どの形式でも、元のファイルとほぼ同じサイズになった。圧縮の効果は、中身によって大きく変わる。

UDRWは、圧縮されない。ファイルのサイズは、ボリュームの容量と同じで、中身より大きくなる。テキストのdmgでは、ファイルのサイズが13,213,696バイトで、hdiutil imageinfoのTotal Bytesと一致した。

形式ごとの書き込みの可否

UDRO、UDZO、ULFOのdmgは、マウントしてもファイルを書き込めない。touchで新しいファイルを作ろうとすると、エラーになる。

$ diskutil image attach --mountOptions nobrowse --mountPoint [マウントポイント] [dmgのファイル名].dmg
$ touch [マウントポイント]/new.txt
touch: cannot touch '[マウントポイント]/new.txt': Read-only file system

UDRWのdmgは、ファイルを書き込める。diskutil ejectでマウントを解除したあとに、もう一度マウントしても、書き込んだファイルが残っている。

$ diskutil image attach --mountOptions nobrowse --mountPoint [マウントポイント] text-UDRW.dmg
$ touch [マウントポイント]/new.txt
$ echo $?
0

空のdmgを作って、ファイルを書き込む手順は、別の記事で紹介している。

参考: 【hdiutil】空のdmgを作って中身を書き込む

dmgの形式を確認する

作成したdmgの形式は、hdiutil imageinfoで確認できる。

$ hdiutil imageinfo [dmgのファイル名].dmg | grep -E '^Format'
Format Description: UDIF読み出し専用圧縮(lzfse)
Format: ULFO

Format:の行に、形式が表示される。hdiutil imageinfoは非推奨で、実行すると、diskutil image infoへの移行を勧める警告が表示される。diskutil image infoでも、形式を確認できる。ただし、UDCOのdmgでは、Operation not supportedのエラーになった。

$ diskutil image info [UDCOのdmg].dmg
Error: Failed to retrieve info for disk image: The operation couldn’t be completed. Operation not supported

形式の選び方

配布用のdmgは、読み取り専用の圧縮形式から選ぶ。

  • 特に理由がなければ、既定のUDZOでよい
  • 同じ中身でもっと小さくしたい場合は、ULFOかULMOを指定する。ULMOは、macOS 10.15以降でないと開けない
  • UDBZは非推奨のため、新しく作るdmgには使わない
  • UDRWは、書き込み用の形式である。配布する前に、読み取り専用の圧縮形式に変換する

配布するdmgを、古いmacOSで開けるようにしたい場合は、対応するmacOSのバージョンを確認して、形式を選ぶ。