hdiutil createは非推奨になり、実行すると、diskutil image createへの移行を勧める警告が表示される。diskutil image createは、フォルダやdmgから作るfromと、空のdmgを作るblankの2つのサブコマンドを持つ。

$ diskutil image create from --volumeName "[ボリューム名]" [フォルダ] [dmgのファイル名].dmg
$ diskutil image create blank --size 20m --volumeName "[ボリューム名]" [dmgのファイル名].dmg

ここでは、diskutil image createでdmgを作る方法と、hdiutilとの違いを紹介する。実行例はmacOS 27.0.1のもの。

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

hdiutilとの対応

hdiutilの主なコマンドは、次のdiskutilのコマンドに置き換えられる。

やりたいことhdiutildiskutil
フォルダからdmgを作るhdiutil create -srcfolderdiskutil image create from
ボリューム名を指定する-volname--volumeName
空のdmgを作るhdiutil create -sizediskutil image create blank --size
ファイルシステムを指定する-fsblankの--fs
形式を変換するhdiutil convert -formatdiskutil image create from --format
暗号化する-encryption--encrypt
マウントするhdiutil attachdiskutil image attach
マウントを解除するhdiutil detachdiskutil eject
dmgの情報を表示するhdiutil imageinfodiskutil image info

この対応は、hdiutilの非推奨の警告が勧める移行先に沿っている。

フォルダからdmgを作る

diskutil image create fromに、フォルダとdmgのファイル名を指定する。

$ diskutil image create from src default.dmg
default.dmg created

形式を指定しない場合の形式は、ULFO(lzfseで圧縮した読み取り専用の形式)である。diskutil image infoで確認できる。

$ diskutil image info default.dmg | grep -E 'Image Format|Format Description'
Image Format: ULFO
Format Description: UDIF read-only compressed image (lzfse)

hdiutil createの既定の形式はUDZOである。形式が違うため、同じフォルダから作ったdmgでも、既定の設定では、形式が異なる。

マウントすると、ボリューム名は、フォルダの名前になる。ファイルシステムはAPFSである。ボリューム名は、--volumeNameで指定する。

$ diskutil image create from --volumeName "My Volume" src vn.dmg
$ diskutil info [マウントポイント] | grep 'Volume Name'
   Volume Name:               My Volume

同名のファイルは上書きされる

作成先に同名のdmgがあっても、エラーにならず、createdと表示されて、dmgが作り直される。hdiutil createの-ovに相当するオプションはない。

$ diskutil image create from src default.dmg
default.dmg created
$ echo $?
0

既存のdmgを残したい場合は、作成先のファイル名を変える。

形式を指定する

--formatで、形式を指定する。fromで指定できる形式は、ASIF、RAW、UDRO、UDSB、UDZO、ULFO、ULMOである。同じフォルダから、形式を変えて作ったdmgの結果を示す。

--format出力先内容サイズ
UDZO.dmgzlibで圧縮した読み取り専用2,025 KB
ULFO.dmglzfseで圧縮した読み取り専用(既定)2,032 KB
ULMO.dmglzmaで圧縮した読み取り専用2,015 KB
UDRO.dmg圧縮しない読み取り専用2,947 KB
RAW.dmg圧縮しない読み書き可能6,332 KB
UDSB.sparsebundleスパースバンドルディレクトリで12,580 KB
ASIF.asifApple sparse image10,527 KB

中身は、約2 MBの乱数のファイルと、圧縮が効くテキストを含む小さなフォルダである。--helpには、出力先の拡張子が.asifか.sparsebundleの場合を除いて、既定の形式はULFOと書かれている。

参考: 【hdiutil】dmgの圧縮形式を選ぶ

ASIFのdmgはhdiutilで開けない

ASIF形式のdmgをhdiutil attachでマウントすると、エラーになる。

$ hdiutil attach f-ASIF.asif -readonly -nobrowse -mountpoint [マウントポイント]
hdiutil: this image format is not supported by hdiutil. Please use 'diskutil image attach'
hdiutil: attach failed - 対応していないイメージフォーマットです
$ echo $?
1

diskutil image attachでは、マウントできた。ASIFのdmgを使う場合は、hdiutilではなく、diskutilで扱う。

notarytool submitが受け付けるファイルは、zip、pkg、UDIF形式のdmgである。ASIFやRAWのdmgを公証できるかは、確認していない。

参考: 【notarytool】dmgを公証する (submit)

空のdmgを作る

diskutil image create blankで、空のdmgを作る。--sizeは必須である。

$ diskutil image create blank --size 20m blank.dmg
blank.dmg created
$ diskutil image info blank.dmg | grep -E 'Image Format|Total Bytes'
Image Format: RAW
		Total Bytes: 19999744

形式を指定しない場合の形式は、RAW(読み書き可能)である。ファイルシステムはAPFS、ボリューム名はuntitledだった。

--size 20mで作ったdmgは、19,999,744バイトだった。hdiutil create -size 20mで作ったdmgは、20 MiB(20,971,520バイト)だった。単位のmの意味が、diskutilとhdiutilで異なる。

ファイルシステムを指定する

--fsで、ファイルシステムを指定する。指定できる値は、APFS、ExFAT、MS-DOS、Noneである。

--fs作成マウント後のファイルシステム
APFS成功APFS
ExFAT成功ExFAT
MS-DOS成功MS-DOS FAT16
None成功マウントできない

--fs Noneで作ったdmgは、ファイルシステムがないため、diskutil image attachがError: Failed to mount the volumeで失敗する。

参考: 【hdiutil】dmgのファイルシステムを指定する

スパースな形式で作る

blankの--formatには、RAW、ASIF、UDSBを指定できる。1 GBの容量で作ると、ASIFは約14.7 MBのファイル、UDSBは約5.3 MBのディレクトリになった。

$ diskutil image create blank --size 1g --format ASIF b.asif
$ diskutil image create blank --size 1g --format UDSB b.sparsebundle

dmgの容量を変更する

diskutil image resizeで、dmgの容量を変更できる。引数にdmgだけを指定すると、容量の下限と上限が表示される。

$ diskutil image resize blank.dmg
Minimum bytes:	4.2 MB
Current bytes:	20.0 MB
Maximum bytes:	454.3 GB

上限の値は、環境によって異なる。

--sizeに新しい容量を指定すると、容量を増やせる。

$ diskutil image resize --size 40m blank.dmg
blank.dmg resized successfully

--size minを指定すると、容量が下限まで小さくなる。20 MBのdmgは、約4.2 MBになった。

$ diskutil image resize --size min blank.dmg
blank.dmg resized successfully

マウントしているdmgの容量は変更できない。Resource busyのエラーで、終了コード1になる。

$ diskutil image resize --size 60m blank.dmg
Error:
The operation couldn’t be completed. Resource busy
$ echo $?
1

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