{"code":"var Component=(()=>{var o=Object.create;var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var m=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var u=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),y=(s,e)=>{for(var n in e)l(s,n,{get:e[n],enumerable:!0})},t=(s,e,n,a)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let h of g(e))!F.call(s,h)&&h!==n&&l(s,h,{get:()=>e[h],enumerable:!(a=p(e,h))||a.enumerable});return s};var C=(s,e,n)=>(n=s!=null?o(m(s)):{},t(e||!s||!s.__esModule?l(n,\"default\",{value:s,enumerable:!0}):n,s)),f=s=>t(l({},\"__esModule\",{value:!0}),s);var d=u((B,r)=>{r.exports=_jsx_runtime});var E={};y(E,{default:()=>k});var i=C(d());function c(s){let e={a:\"a\",blockquote:\"blockquote\",code:\"code\",em:\"em\",h2:\"h2\",h3:\"h3\",img:\"img\",li:\"li\",p:\"p\",pre:\"pre\",span:\"span\",strong:\"strong\",table:\"table\",tbody:\"tbody\",td:\"td\",th:\"th\",thead:\"thead\",tr:\"tr\",ul:\"ul\",...s.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.p,{children:\"The man page in macOS 27 Golden Gate carries a line that has never been there before:\"}),`\n`,(0,i.jsxs)(e.blockquote,{children:[`\n`,(0,i.jsx)(e.p,{children:\"In macOS 27.0, hdiutil is deprecated. Use diskutil image instead for all disk image operations.\"}),`\n`]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" has been the way you make, mount, convert, and inspect disk images on the Mac since Mac OS X 10.0. If you have ever shipped a \",(0,i.jsx)(e.code,{children:\".dmg\"}),\", scripted an installer, built a CI job that packages a Mac app, or made an encrypted container to keep something private, you have used it \\u2014 directly or through something that called it for you.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"Here is the part that most of the coverage missed: \",(0,i.jsx)(e.strong,{children:\"the replacement is not coming. It is already on your Mac.\"}),\" Open Terminal on macOS 26 Tahoe right now and run \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\". It answers.\"]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.img,{alt:\"hdiutil deprecation in macOS 27\",src:\"/images/blog/hdiutil-deprecated-macos-27-diskutil-image-migration-guide-2026/hero.webp\",width:\"1024\",height:\"541\"})}),`\n`,(0,i.jsx)(e.h2,{id:\"key-takeaways\",children:\"Key Takeaways\"}),`\n`,(0,i.jsxs)(e.ul,{children:[`\n`,(0,i.jsxs)(e.li,{children:[(0,i.jsxs)(e.strong,{children:[(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" already works on macOS 26.\"]}),\" Verified on macOS 26.5.2 (build 25F84). You can migrate and test scripts today, before macOS 27 ships.\"]}),`\n`,(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:\"Deprecated is not removed.\"}),\" \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" still works in macOS 27. Nothing breaks on day one. But Apple has been trimming it for seven years, and the man page documents every step.\"]}),`\n`,(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:\"The command surface is far smaller.\"}),\" \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" exposes 23 verbs. \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" exposes 5 subcommands.\"]}),`\n`,(0,i.jsxs)(e.li,{children:[(0,i.jsxs)(e.strong,{children:[\"There is no \",(0,i.jsx)(e.code,{children:\"detach\"}),\".\"]}),\" You can attach a disk image with \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" but not detach it \\u2014 that moves to \",(0,i.jsx)(e.code,{children:\"diskutil eject\"}),\".\"]}),`\n`,(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:\"Some things genuinely have no replacement yet\"}),\", including \",(0,i.jsx)(e.code,{children:\"verify\"}),\", \",(0,i.jsx)(e.code,{children:\"compact\"}),\", and \",(0,i.jsx)(e.code,{children:\"makehybrid\"}),\". If your build scripts use those, you do not have a migration path today.\"]}),`\n`]}),`\n`,(0,i.jsx)(e.h2,{id:\"first-confirm-it-on-your-own-mac\",children:\"First: Confirm It On Your Own Mac\"}),`\n`,(0,i.jsx)(e.p,{children:\"Do not take my word for any of this. One command:\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsx)(e.code,{children:(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"})]})})})}),`\n`,(0,i.jsx)(e.p,{children:\"On macOS 26.5.2 that prints:\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v 11 c 0,0.564129 -0.435871,1 -1,1 H 6 C 5.4358712,21 5,20.564129 5,20 V 4 C 5,3.4358712 5.4358712,3 6,3 Z M 15,3.4140625 18.585937,7 H 16 C 15.435871,7 15,6.5641288 15,6 Z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"OVERVIEW: Manipulate disk images (attach, create, etc)\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"USAGE: diskutil image [--verbose] [--stdinpassphrase] [--plist] <subcommand>\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"SUBCOMMANDS:\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"  attach                  Attach a disk image as a device.\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"  info                    Print info regarding a disk image.\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"  create                  Create a disk image. Either blank or from an existing\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"                          source (disk, disk image or folder).\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"  resize                  Resize a given image to a specified size if\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"                          applicable.\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"  chpass                  Change the passphrase of a given encrypted image.\"})})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"Five subcommands. Now compare that to what \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" offers, straight from its own man page:\"]}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v 11 c 0,0.564129 -0.435871,1 -1,1 H 6 C 5.4358712,21 5,20.564129 5,20 V 4 C 5,3.4358712 5.4358712,3 6,3 Z M 15,3.4140625 18.585937,7 H 16 C 15.435871,7 15,6.5641288 15,6 Z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"Common verbs include attach, detach, verify, create, convert, and compact.\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"The rest of the verbs are currently: help, info, burn, checksum, chpass,\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"erasekeys, imageinfo, isencrypted, mountvol, unmount, plugins, udifrez,\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"udifderez, resize, segment, makehybrid, and pmap.\"})})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"That is 23 verbs against 5 subcommands. That ratio is alarming at first glance and it is also misleading, because a straight verb-by-verb comparison gets the answer wrong. Several \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" verbs are folded into \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" under different names, several were already deprecated years ago, and one important one moved to a different command entirely.\"]}),`\n`,(0,i.jsx)(e.p,{children:\"Working out which is which is the actual migration, so let us do it properly.\"}),`\n`,(0,i.jsx)(e.h2,{id:\"this-did-not-come-out-of-nowhere\",children:\"This Did Not Come Out of Nowhere\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Before the migration table, some context that makes the deprecation look less abrupt. \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\"'s man page contains a compatibility section that reads as a seven-year record of Apple narrowing the tool. This is on your Mac now \\u2014 \",(0,i.jsx)(e.code,{children:\"man hdiutil\"}),\" and search for the version headings:\"]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"macOS 10.15\"})}),`\n`,(0,i.jsxs)(e.ul,{children:[`\n`,(0,i.jsx)(e.li,{children:\"Introduced lzma compression in the ULMO format\"}),`\n`,(0,i.jsxs)(e.li,{children:[\"Deprecated OS 9-style dual-fork file support (\",(0,i.jsx)(e.code,{children:\"hdiutil flatten\"}),\"/\",(0,i.jsx)(e.code,{children:\"unflatten\"}),\")\"]}),`\n`,(0,i.jsxs)(e.li,{children:[\"Removed the deprecated \",(0,i.jsx)(e.code,{children:\"hdiutil internet-enable\"}),\" command and the IDME attach flags\"]}),`\n`]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"macOS 11.0\"})}),`\n`,(0,i.jsxs)(e.ul,{children:[`\n`,(0,i.jsx)(e.li,{children:\"Removed support for DiskCopy42, DART and NDIF formats\"}),`\n`,(0,i.jsx)(e.li,{children:\"Removed support for AppleSingle and MacBinary encodings\"}),`\n`,(0,i.jsx)(e.li,{children:\"Removed OS 9-style dual-fork file support\"}),`\n`,(0,i.jsx)(e.li,{children:\"Changed the default file system for new images to APFS\"}),`\n`]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"macOS 12.0\"})}),`\n`,(0,i.jsxs)(e.ul,{children:[`\n`,(0,i.jsx)(e.li,{children:\"Deprecated the UDBZ format (bzip2 compression)\"}),`\n`,(0,i.jsxs)(e.li,{children:[\"Deprecated segmented UDIF images (\",(0,i.jsx)(e.code,{children:\"hdiutil segment\"}),\", \",(0,i.jsx)(e.code,{children:\"-segmentSize\"}),\")\"]}),`\n`,(0,i.jsxs)(e.li,{children:[\"Deprecated \",(0,i.jsx)(e.code,{children:\"hdiutil udifrez\"}),\"/\",(0,i.jsx)(e.code,{children:\"udifderez\"}),\" (embed and extract resources)\"]}),`\n`]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"macOS 13.0\"})}),`\n`,(0,i.jsxs)(e.ul,{children:[`\n`,(0,i.jsxs)(e.li,{children:[\"Removed the \",(0,i.jsx)(e.code,{children:\"encrypted-encoding-version\"}),\" option; all new encrypted images use version 2\"]}),`\n`]}),`\n`,(0,i.jsxs)(e.p,{children:[\"The man page also flags, inline, that \",(0,i.jsx)(e.code,{children:\"-passphrase\"}),\" is insecure, that segmented images are deprecated, and that UDBZ is deprecated.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"Read as one arc, macOS 27's deprecation is the last step of a process that started around 2019, not a decision made this summer. That matters for planning: Apple removes things from this tool slowly and announces them in the man page first. \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" in macOS 27 is deprecated, not gone, and there is no announced removal date.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"the-migration-table\",children:\"The Migration Table\"}),`\n`,(0,i.jsx)(e.p,{children:\"This is the map. I tested each of these on macOS 26.5.2.\"}),`\n`,(0,i.jsxs)(e.table,{children:[(0,i.jsx)(e.thead,{children:(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.th,{children:\"What you want\"}),(0,i.jsx)(e.th,{children:(0,i.jsx)(e.code,{children:\"hdiutil\"})}),(0,i.jsx)(e.th,{children:(0,i.jsx)(e.code,{children:\"diskutil image\"})})]})}),(0,i.jsxs)(e.tbody,{children:[(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Mount an image\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil attach x.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"diskutil image attach x.dmg\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Unmount an image\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil detach /dev/diskN\"})}),(0,i.jsxs)(e.td,{children:[(0,i.jsxs)(e.strong,{children:[\"Not in \",(0,i.jsx)(e.code,{children:\"diskutil image\"})]}),\" \\u2014 use \",(0,i.jsx)(e.code,{children:\"diskutil eject /dev/diskN\"})]})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Make a blank image\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil create -size 1g -fs APFS x.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"diskutil image create blank --size 1g x.dmg\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Make an image from a folder\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil create -srcfolder ./dir x.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"diskutil image create from ./dir x.dmg\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Convert format\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil convert in.dmg -format UDZO -o out.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"diskutil image create from in.dmg out.dmg --format UDZO\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Inspect an image\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil imageinfo x.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"diskutil image info x.dmg\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Check if encrypted\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil isencrypted x.dmg\"})}),(0,i.jsxs)(e.td,{children:[(0,i.jsx)(e.code,{children:\"diskutil image info\"}),\" \\u2192 \",(0,i.jsx)(e.code,{children:\"Is Encrypted:\"})]})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Resize\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil resize -size 2g x.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"diskutil image resize\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Change passphrase\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil chpass x.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"diskutil image chpass x.dmg\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Verify checksum\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil verify x.dmg\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.strong,{children:\"No equivalent\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Compact a sparse image\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil compact x.sparsebundle\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.strong,{children:\"No equivalent\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Make a hybrid/ISO image\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil makehybrid\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.strong,{children:\"No equivalent\"})})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Embed a license agreement\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil udifrez\"})}),(0,i.jsxs)(e.td,{children:[(0,i.jsx)(e.strong,{children:\"No equivalent\"}),\" (deprecated in macOS 12)\"]})]}),(0,i.jsxs)(e.tr,{children:[(0,i.jsx)(e.td,{children:\"Burn to optical media\"}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.code,{children:\"hdiutil burn\"})}),(0,i.jsx)(e.td,{children:(0,i.jsx)(e.strong,{children:\"No equivalent\"})})]})]})]}),`\n`,(0,i.jsxs)(e.h3,{id:\"the-convert-surprise\",children:[\"The \",(0,i.jsx)(e.code,{children:\"convert\"}),\" surprise\"]}),`\n`,(0,i.jsx)(e.p,{children:'The most common mistake I have seen in the early commentary is \"there is no convert.\" There is \\u2014 it is just not called that.'}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v 11 c 0,0.564129 -0.435871,1 -1,1 H 6 C 5.4358712,21 5,20.564129 5,20 V 4 C 5,3.4358712 5.4358712,3 6,3 Z M 15,3.4140625 18.585937,7 H 16 C 15.435871,7 15,6.5641288 15,6 Z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"OVERVIEW: Create a disk image from an existing source (disk, disk image or\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"folder).\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"Source and destination disk image can be the same, which will perform the\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"conversion in place.\"})})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.code,{children:\"diskutil image create from\"}),\" takes a disk image as its source, so it is \",(0,i.jsx)(e.code,{children:\"hdiutil convert\"}),\" under a different name, and it additionally supports in-place conversion, which \",(0,i.jsx)(e.code,{children:\"hdiutil convert\"}),\" never did. If you count verbs rather than reading the help text, you will conclude a capability was dropped when it was actually extended.\"]}),`\n`,(0,i.jsxs)(e.h3,{id:\"the-detach-gap-is-real\",children:[\"The \",(0,i.jsx)(e.code,{children:\"detach\"}),\" gap is real\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"This one is not a rename. There is no detach anywhere in \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\":\"]}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"$\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" detach\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /dev/disk12\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"Error:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 2\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" unexpected\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" arguments:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" 'detach',\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" '/dev/disk12'\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"Usage:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" [--verbose] [--stdinpassphrase] [--plist] \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"<\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"subcommand\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\">\"})]})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"The replacement is the top-level \",(0,i.jsx)(e.code,{children:\"diskutil\"}),\" command:\"]}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"$\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" eject\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /dev/disk12\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"Disk\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /dev/disk12\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ejected\"})]})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"Which works fine \\u2014 but note what it does to a script. The clean symmetry of \",(0,i.jsx)(e.code,{children:\"hdiutil attach\"}),\" / \",(0,i.jsx)(e.code,{children:\"hdiutil detach\"}),\" becomes \",(0,i.jsx)(e.code,{children:\"diskutil image attach\"}),\" / \",(0,i.jsx)(e.code,{children:\"diskutil eject\"}),\", two different subcommand levels of the same binary. Any wrapper function you have that pairs attach and detach needs restructuring, not a find-and-replace.\"]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.img,{alt:\"Migrating disk image scripts\",src:\"/images/blog/hdiutil-deprecated-macos-27-diskutil-image-migration-guide-2026/content-1.webp\",width:\"1024\",height:\"572\"})}),`\n`,(0,i.jsxs)(e.h2,{id:\"what-diskutil-image-does-better\",children:[\"What \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" Does Better\"]}),`\n`,(0,i.jsx)(e.p,{children:\"It would be unfair to present this as pure loss. Three things are genuinely improved.\"}),`\n`,(0,i.jsx)(e.h3,{id:\"asif-which-hdiutil-cannot-make-at-all\",children:\"ASIF, which hdiutil cannot make at all\"}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" supports the Apple Sparse Image Format. \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" does not. If you want ASIF \\u2014 and for virtual machine disks on APFS it is the format Apple has been steering toward \\u2014 \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" is the only tool that produces it.\"]}),`\n`,(0,i.jsx)(e.p,{children:\"The format lists are worth knowing:\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v 11 c 0,0.564129 -0.435871,1 -1,1 H 6 C 5.4358712,21 5,20.564129 5,20 V 4 C 5,3.4358712 5.4358712,3 6,3 Z M 15,3.4140625 18.585937,7 H 16 C 15.435871,7 15,6.5641288 15,6 Z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"create blank --format : RAW, ASIF, UDSB          (default RAW)\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"create from  --format : ASIF, RAW, UDRO, UDSB,\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"                        UDZO, ULFO, ULMO         (default ULFO)\"})})]})})}),`\n`,(0,i.jsx)(e.h3,{id:\"it-attaches-over-http-and-makes-ram-disks-directly\",children:\"It attaches over HTTP and makes RAM disks directly\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"From the \",(0,i.jsx)(e.code,{children:\"attach\"}),\" help:\"]}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v 11 c 0,0.564129 -0.435871,1 -1,1 H 6 C 5.4358712,21 5,20.564129 5,20 V 4 C 5,3.4358712 5.4358712,3 6,3 Z M 15,3.4140625 18.585937,7 H 16 C 15.435871,7 15,6.5641288 15,6 Z\" fill=\"currentColor\" /></svg>',children:(0,i.jsx)(e.code,{children:(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"Supports 'ram://<size>', file paths, http[s].\"})})})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"Making a RAM disk on macOS has traditionally been the awkward two-step \",(0,i.jsx)(e.code,{children:\"hdiutil attach -nomount ram://<sectors>\"}),\" followed by \",(0,i.jsx)(e.code,{children:\"newfs_hfs\"}),\" or \",(0,i.jsx)(e.code,{children:\"diskutil eraseVolume\"}),\". Here it is one argument to a documented flag.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"it-is-substantially-faster\",children:\"It is substantially faster\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Jeff Johnson of Lapcat Software benchmarked the two while investigating the deprecation in early August 2026 and measured \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" completing a create operation in 40\\u201345 seconds against \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\"'s 110\\u2013115 seconds, producing a smaller image in the process. That is not a rounding difference. For a CI job that builds disk images on every commit, it is meaningful.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"what-will-actually-break-in-your-scripts\",children:\"What Will Actually Break In Your Scripts\"}),`\n`,(0,i.jsx)(e.p,{children:\"Deprecation warnings do not break builds. These things will.\"}),`\n`,(0,i.jsxs)(e.h3,{id:\"1--puppetstrings-has-no-replacement\",children:[\"1. \",(0,i.jsx)(e.code,{children:\"-puppetstrings\"}),\" has no replacement\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.code,{children:\"hdiutil\"}),\"'s \",(0,i.jsx)(e.code,{children:\"-puppetstrings\"}),\" flag emits machine-parseable progress output, which is precisely what a build system wants. Johnson flags its absence as one of the notable gaps. \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" has \",(0,i.jsx)(e.code,{children:\"--plist\"}),\" for structured \",(0,i.jsx)(e.em,{children:\"results\"}),\", and it prints human-readable progress like:\"]}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v 11 c 0,0.564129 -0.435871,1 -1,1 H 6 C 5.4358712,21 5,20.564129 5,20 V 4 C 5,3.4358712 5.4358712,3 6,3 Z M 15,3.4140625 18.585937,7 H 16 C 15.435871,7 15,6.5641288 15,6 Z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"[5% completed] [79% completed] [98% completed] [100% completed]\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{children:\"test.dmg created\"})})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"If you have tooling that parses \",(0,i.jsx)(e.code,{children:\"PERCENT:\"}),\" lines from \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\", that parser has nothing to attach to.\"]}),`\n`,(0,i.jsxs)(e.h3,{id:\"2-several-create-options-are-simply-gone\",children:[\"2. Several \",(0,i.jsx)(e.code,{children:\"create\"}),\" options are simply gone\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"Johnson's writeup lists \",(0,i.jsx)(e.code,{children:\"-[no]crossdev\"}),\", \",(0,i.jsx)(e.code,{children:\"-[no]scrub\"}),\", \",(0,i.jsx)(e.code,{children:\"-[no]anyowners\"}),\", \",(0,i.jsx)(e.code,{children:\"-skipunreadable\"}),\", \",(0,i.jsx)(e.code,{children:\"-[no]atomic\"}),\", and \",(0,i.jsx)(e.code,{children:\"-copyuid\"}),\" as having no counterpart. If you build images from folders in a controlled way \\u2014 installers, forensic captures, anything where ownership or which files get included must be exact \\u2014 read that list carefully. \",(0,i.jsx)(e.code,{children:\"-skipunreadable\"}),\" and \",(0,i.jsx)(e.code,{children:\"-copyuid\"}),\" in particular are load-bearing for some packaging scripts.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"3-scrubbing-behavior-changed-silently\",children:\"3. Scrubbing behavior changed silently\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Johnson reports that \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" excludes temporary files such as trash folders automatically, behaving as though \",(0,i.jsx)(e.code,{children:\"-scrub\"}),\" is always on. \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" scrubbed only when asked. If your image contents are expected to be byte-identical to a source directory, this will produce a different image without telling you.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"4-permission-handling-fails-quietly\",children:\"4. Permission handling fails quietly\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"This is the one I would test first. Johnson found that where \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" triggers an authentication prompt when it hits root-owned files, \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" does not prompt and simply fails. A script that used to pause for credentials will now produce an incomplete image and, depending on your error handling, may report success.\"]}),`\n`,(0,i.jsx)(e.p,{children:\"If you build images from directories that contain files you do not own, verify the output rather than trusting the exit code.\"}),`\n`,(0,i.jsx)(e.h3,{id:\"5-logging-is-thinner\",children:\"5. Logging is thinner\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Verbose output from \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" is less detailed than \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\"'s. When a build fails at 3 a.m., that is when you find out.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"how-to-migrate-without-breaking-macos-26-support\",children:\"How To Migrate Without Breaking macOS 26 Support\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Most of us have to support both for a while. The good news, and the practical point of this whole article, is that \",(0,i.jsx)(e.strong,{children:\"you do not have to branch on OS version\"}),\", because \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" exists on macOS 26 as well.\"]}),`\n`,(0,i.jsx)(e.p,{children:\"Detect the capability, not the version:\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"#!/bin/bash\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# Prefer diskutil image; fall back to hdiutil where unavailable.\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"if\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --help\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" >\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"/dev/null\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" 2>&1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"; \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"then\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"  USE_DISKUTIL\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"1\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"else\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"  USE_DISKUTIL\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"0\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"fi\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"make_image_from_folder\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"() {\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  local\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" src\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"$1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" dst\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"$2\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  if\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" [ \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$USE_DISKUTIL\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" -eq\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" ]; \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"then\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"    diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" from\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$src\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$dst\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --format\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" UDZO\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  else\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"    hdiutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -srcfolder\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$src\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -format\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" UDZO\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$dst\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  fi\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"}\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"attach_image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"() {\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  local\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" img\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"$1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  if\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" [ \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$USE_DISKUTIL\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" -eq\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" ]; \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"then\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"    diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" attach\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$img\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --nobrowse\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  else\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"    hdiutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" attach\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$img\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -nobrowse\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  fi\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"}\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"detach_device\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"() {\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"  # Note the asymmetry: detach is NOT under `diskutil image`.\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  local\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" dev\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"$1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  if\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" [ \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$USE_DISKUTIL\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" -eq\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" ]; \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"then\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"    diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" eject\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$dev\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  else\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"    hdiutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" detach\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$dev\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"  fi\"})}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"}\"})})]})})}),`\n`,(0,i.jsx)(e.p,{children:\"Then verify the output, because that is where the silent differences live:\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# Compare what actually landed in the image against the source.\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" attach\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" build.dmg\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --nobrowse\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --mountPoint\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /tmp/verify_mnt\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diff\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -rq\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ./src\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /tmp/verify_mnt/src\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" eject\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /tmp/verify_mnt\"})]})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"That \",(0,i.jsx)(e.code,{children:\"diff -rq\"}),\" is the step I would not skip. Between the always-on scrubbing and the quiet permission failures, an image that builds successfully is not the same thing as an image that contains what you meant.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"If you are building out a Mac development environment from scratch, our \",(0,i.jsx)(e.a,{href:\"/blog/ultimate-apple-silicon-development-environment-setup-guide-2025\",children:\"Apple silicon development environment setup guide\"}),\" covers the surrounding tooling, and the \",(0,i.jsx)(e.a,{href:\"/blog/mac-terminal-mastery-2025-command-line-productivity-guide\",children:\"Terminal mastery guide\"}),\" covers the shell fundamentals these scripts assume.\"]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.img,{alt:\"Verifying disk image contents\",src:\"/images/blog/hdiutil-deprecated-macos-27-diskutil-image-migration-guide-2026/content-2.webp\",width:\"1024\",height:\"572\"})}),`\n`,(0,i.jsx)(e.h2,{id:\"a-worked-example-start-to-finish\",children:\"A Worked Example, Start To Finish\"}),`\n`,(0,i.jsx)(e.p,{children:\"Here is a complete round trip run on macOS 26.5.2, so you can see the real output rather than a reconstruction.\"}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"Create an image from a folder:\"})}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"$\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" mkdir\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -p\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" src\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" && \"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"echo\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"hello\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" >\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" src/file.txt\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"$\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" from\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" src\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --format\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" UDZO\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" test.dmg\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"[5% completed] [79% completed] [98% completed] [99% completed] [100% completed]\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"test\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\".dmg\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" created\"})]})]})})}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"Inspect it:\"})}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"$\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" info\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" test.dmg\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"Image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Format:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" UDZO\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"Format\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Description:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" UDIF\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" read-only\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" compressed\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" (zlib)\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\tIdentity\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Info:\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tUUID:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" 061189CB-7502-4EA6-BFE3-424442C16D10\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\tSize\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Info:\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tEmpty\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Bytes:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 3437056\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tTotal\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Bytes:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 4233216\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\tCompression\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Info:\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tCompressed\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Bytes:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 4124\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tCompression\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Type:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" zlib\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\tEncryption\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Info:\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tIs\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Encrypted:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 0\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\tMaster\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Checksum\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Info:\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tChecksum\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Type:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" crc32\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"\t\tChecksum\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Value:\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" c4\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" e3\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" 90\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" 4b\"})]})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"Note that \",(0,i.jsx)(e.code,{children:\"info\"}),\" covers what \",(0,i.jsx)(e.code,{children:\"hdiutil imageinfo\"}),\", \",(0,i.jsx)(e.code,{children:\"isencrypted\"}),\", and part of \",(0,i.jsx)(e.code,{children:\"checksum\"}),\" used to give you separately. It reports the stored checksum \\u2014 it does not verify it. That is the \",(0,i.jsx)(e.code,{children:\"hdiutil verify\"}),\" gap.\"]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"Attach it:\"})}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"$\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" attach\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" test.dmg\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"/dev/disk12\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"  \tGUID_partition_scheme\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"/dev/disk13s1\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"\tApple_APFS_Volume\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"    \t/Volumes/src\"})]})]})})}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsx)(e.strong,{children:\"Detach it \\u2014 with the different command:\"})}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"$\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" eject\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /dev/disk12\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"Disk\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /dev/disk12\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ejected\"})]})]})})}),`\n`,(0,i.jsx)(e.h2,{id:\"encrypted-images\",children:\"Encrypted Images\"}),`\n`,(0,i.jsx)(e.p,{children:\"If you use disk images as encrypted containers, the mechanics are straightforward but the options are narrower.\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# Create an encrypted blank image\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" blank\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --encrypt\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --size\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" 10g\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --volumeName\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Vault\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" vault.dmg\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# Provide the passphrase on stdin rather than interactively\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"printf\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" '%s'\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$PASSPHRASE\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" blank\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --encrypt\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --stdinpassphrase\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" \\\\\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"  --size\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" 10g\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --volumeName\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" Vault\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" vault.dmg\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# Change the passphrase later\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" chpass\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" vault.dmg\"})]})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.code,{children:\"--encrypt\"}),\" is documented as AES-256 and there is no algorithm choice, which is a simplification rather than a loss \\u2014 Apple removed the older encrypted encoding version back in macOS 13.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"The \",(0,i.jsx)(e.code,{children:\"--stdinpassphrase\"}),\" flag is the one to use in any script. \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\"'s own man page warns that \",(0,i.jsx)(e.code,{children:\"-passphrase\"}),\" is insecure, for the ordinary reason that a passphrase on a command line is visible in the process table to every user on the machine.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"If you are relying on disk images for privacy rather than convenience, it is worth reading our \",(0,i.jsx)(e.a,{href:\"/blog/mac-security-privacy-guide-2026\",children:\"Mac security and privacy guide\"}),\" for where an encrypted image sits relative to FileVault \\u2014 they solve different problems, and an encrypted \",(0,i.jsx)(e.code,{children:\".dmg\"}),\" protects nothing while it is mounted.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"what-disk-images-are-still-for\",children:\"What Disk Images Are Still For\"}),`\n`,(0,i.jsx)(e.p,{children:'It is worth asking why any of this matters, because \"disk image\" sounds like a relic and the tooling around it is quietly load-bearing in several places.'}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Application distribution.\"}),\" The \",(0,i.jsx)(e.code,{children:\".dmg\"}),\" remains the standard way to ship a Mac app outside the App Store. A compressed, read-only image containing an app bundle and a symlink to \",(0,i.jsx)(e.code,{children:\"/Applications\"}),\" is the drag-to-install convention users know. Every one of those is built by a script that calls a disk image tool.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Encrypted containers.\"}),\" An encrypted \",(0,i.jsx)(e.code,{children:\".dmg\"}),\" is a portable, self-contained vault that mounts as a volume and works on any Mac without special software. Unlike FileVault, which protects a whole disk at rest, an encrypted image protects a specific set of files that you can move around \\u2014 onto a USB stick, into cloud storage, to a colleague.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Virtual machine disks.\"}),\" This is where ASIF matters and where Apple's direction becomes obvious.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Sparsebundles for network backup.\"}),\" Time Machine backing up to a network destination stores the backup inside a sparsebundle \\u2014 a disk image split into many small band files so that only changed bands need syncing. Anyone who has maintained one of these has run \",(0,i.jsx)(e.code,{children:\"hdiutil compact\"}),\" to reclaim space from deleted bands.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Forensics and archival.\"}),\" A block-level image of a volume, with a checksum, is how you preserve a disk's exact state. \",(0,i.jsx)(e.code,{children:\"hdiutil verify\"}),\" is how you confirm it later.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"Look at that list against the migration table and the gaps line up with specific communities rather than being random. App developers lose the license-agreement mechanism and \",(0,i.jsx)(e.code,{children:\"-puppetstrings\"}),\". Backup and sparsebundle users lose \",(0,i.jsx)(e.code,{children:\"compact\"}),\". Archival and forensics users lose \",(0,i.jsx)(e.code,{children:\"verify\"}),\". Everyone doing routine create-convert-attach work is fine.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"asif-the-format-only-the-new-tool-makes\",children:\"ASIF: The Format Only the New Tool Makes\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"The Apple Sparse Image Format is the clearest signal of why Apple wants people off \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\", because \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" cannot produce it at all.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"A sparse image only occupies disk space for blocks that actually contain data. A 100GB sparse image holding 10GB of files takes about 10GB on disk and grows as you add data. The old \",(0,i.jsx)(e.code,{children:\"UDSP\"}),\" sparse image and \",(0,i.jsx)(e.code,{children:\"UDSB\"}),\" sparsebundle formats did this too, with known problems: sparsebundles fragment into thousands of band files, and both formats historically reclaimed space poorly, which is exactly why \",(0,i.jsx)(e.code,{children:\"hdiutil compact\"}),\" had to exist.\"]}),`\n`,(0,i.jsx)(e.p,{children:\"ASIF is designed against APFS rather than bolted on top of it, which lets the filesystem's own sparse-file support do the work instead of the image format emulating it. In practice the payoff shows up most in virtualization, where a VM's virtual disk is a large mostly-empty file that changes constantly \\u2014 the case that punished the old formats hardest.\"}),`\n`,(0,i.jsx)(e.p,{children:\"You can create one today:\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# A 100GB ASIF image that occupies only what it uses\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" blank\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --format\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ASIF\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --size\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" 100g\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" \\\\\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"  --volumeName\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" VMDisk\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" vmdisk.asif\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# Convert an existing image to ASIF\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" from\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" old.dmg\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" new.asif\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --format\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ASIF\"})]})]})})}),`\n`,(0,i.jsxs)(e.p,{children:[\"Note that the format is inferred from the extension \\u2014 \",(0,i.jsx)(e.code,{children:\"create blank\"}),\" defaults to \",(0,i.jsx)(e.code,{children:\"RAW\"}),' \"unless the image path has .asif or .sparsebundle extension.\" Naming the file correctly is enough; passing ',(0,i.jsx)(e.code,{children:\"--format\"}),\" as well is belt and braces.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"The trade-off is portability. ASIF is new, and an ASIF image will not open on an older macOS or on anything that is not a Mac. For a VM disk or a local working volume that is irrelevant. For anything you hand to another person, use \",(0,i.jsx)(e.code,{children:\"UDZO\"}),\" and keep the compatibility.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"where-this-fits-in-a-distribution-pipeline\",children:\"Where This Fits in a Distribution Pipeline\"}),`\n`,(0,i.jsx)(e.p,{children:\"If you ship a Mac app outside the App Store, the disk image step sits in the middle of a chain, and it is worth seeing where the change lands.\"}),`\n`,(0,i.jsx)(i.Fragment,{children:(0,i.jsx)(e.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,i.jsxs)(e.code,{children:[(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"#!/bin/bash\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"set\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -euo\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" pipefail\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"APP\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"build/MyApp.app\"'})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"DMG\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"dist/MyApp.dmg\"'})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"STAGE\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"=\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"$('}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"mktemp\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -d\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:')\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 1. Sign the app bundle (unchanged by any of this)\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"codesign\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --force\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --options\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" runtime\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --timestamp\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" \\\\\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"  --sign\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"Developer ID Application: Example Inc (TEAMID123)\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" \\\\\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'  \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$APP\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 2. Stage the contents the user will see\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"cp\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -R\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$APP\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$STAGE\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'/\"'})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"ln\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -s\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /Applications\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$STAGE\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'/Applications\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 3. Build the image \\u2014 the step this article is about\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"diskutil\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" image\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" create\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" from\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$STAGE\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$DMG\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --format\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" UDZO\"})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 4. Sign the image itself\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"codesign\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --force\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --timestamp\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" \\\\\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"  --sign\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"Developer ID Application: Example Inc (TEAMID123)\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" \\\\\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'  \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$DMG\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsx)(e.span,{className:\"line\",children:(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 5. Notarize and staple\"})}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"xcrun\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" notarytool\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" submit\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$DMG\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --keychain-profile\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"AC_NOTARY\"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --wait\"})]}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"xcrun\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" stapler\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" staple\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$DMG\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,i.jsx)(e.span,{className:\"line\"}),`\n`,(0,i.jsxs)(e.span,{className:\"line\",children:[(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"rm\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -rf\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$STAGE\"}),(0,i.jsx)(e.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]})]})})}),`\n`,(0,i.jsx)(e.p,{children:\"Only step 3 changes. Signing, notarization, and stapling are unaffected \\u2014 they operate on the finished image and do not care which tool produced it.\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Two things to watch in a real pipeline. First, verify the staged contents landed correctly, because of the silent scrubbing and permission behavior described above \\u2014 a \",(0,i.jsx)(e.code,{children:\"diff -rq\"}),\" between \",(0,i.jsx)(e.code,{children:\"$STAGE\"}),\" and the mounted result is cheap insurance. Second, if your current script embeds a license agreement with \",(0,i.jsx)(e.code,{children:\"hdiutil udifrez\"}),\", that step has no replacement and has been deprecated since macOS 12. Keep \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" for it while it exists and plan an alternative.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"troubleshooting-common-issues\",children:\"Troubleshooting Common Issues\"}),`\n`,(0,i.jsx)(e.h3,{id:\"diskutil-image-command-not-found-or-the-subcommand-is-unrecognized\",children:'\"diskutil image: command not found\" or the subcommand is unrecognized'}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Problem\"}),\": You are on a macOS version older than 26, where the \",(0,i.jsx)(e.code,{children:\"image\"}),\" verb does not exist.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Solution\"}),\": Use the capability check shown above rather than assuming. \",(0,i.jsx)(e.code,{children:\"diskutil image --help >/dev/null 2>&1\"}),\" returns non-zero on systems that lack it, which is a reliable branch. Do not test \",(0,i.jsx)(e.code,{children:\"sw_vers\"}),\" \\u2014 the presence of the subcommand is what you actually care about.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"the-image-builds-but-is-missing-files\",children:\"The image builds but is missing files\"}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Problem\"}),\": Two likely causes. Either \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" skipped files it could not read as your user and did not prompt for authentication, or its always-on scrubbing removed items \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" would have included.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Solution\"}),\": Mount the result and \",(0,i.jsx)(e.code,{children:\"diff -rq\"}),\" it against the source directory. If files are missing because of ownership, run the build with the necessary privileges rather than expecting a prompt. Do not rely on the exit code alone.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"progress-parsing-broke-in-ci\",children:\"Progress parsing broke in CI\"}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Problem\"}),\": \",(0,i.jsx)(e.code,{children:\"-puppetstrings\"}),\" has no \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" equivalent, so scripts that parsed \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\"'s machine-readable progress have nothing to read.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Solution\"}),\": Use \",(0,i.jsx)(e.code,{children:\"--plist\"}),\" for the structured result and treat progress as unavailable. If your CI needs progress specifically, keeping \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" for that step is legitimate \\u2014 it is deprecated, not removed, and there is no announced removal date.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"cannot-detach--resource-busy\",children:'Cannot detach \\u2014 \"resource busy\"'}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Problem\"}),\": Something still has the volume open. This behaves the same as it always did.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Solution\"}),\": \",(0,i.jsx)(e.code,{children:\"lsof +D /Volumes/YourVolume\"}),\" to find the holder, then \",(0,i.jsx)(e.code,{children:\"diskutil eject\"}),\". Spotlight indexing and antivirus scanners are frequent culprits; mounting with \",(0,i.jsx)(e.code,{children:\"--nobrowse\"}),\" avoids some of it by keeping the volume out of Finder.\"]}),`\n`,(0,i.jsxs)(e.h3,{id:\"a-dmg-with-a-license-agreement-no-longer-builds\",children:[\"A \",(0,i.jsx)(e.code,{children:\".dmg\"}),\" with a license agreement no longer builds\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Problem\"}),\": The license-agreement mechanism relies on \",(0,i.jsx)(e.code,{children:\"hdiutil udifrez\"}),\", which Apple deprecated back in macOS 12 and which has no \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" counterpart.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:\"Solution\"}),\": There is no replacement path. Keep using \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" for that step while it exists, and plan for a distribution method that does not depend on an embedded agreement. This has been on notice for four years, which is worth knowing if you are only discovering it now.\"]}),`\n`,(0,i.jsx)(e.h2,{id:\"faq\",children:\"FAQ\"}),`\n`,(0,i.jsx)(e.h3,{id:\"does-hdiutil-still-work-in-macos-27\",children:\"Does hdiutil still work in macOS 27?\"}),`\n`,(0,i.jsx)(e.p,{children:\"Yes. It is deprecated, not removed. Deprecation is Apple signalling intent and starting a clock \\u2014 it is not a functional change. Nothing that works today stops working when you install macOS 27.\"}),`\n`,(0,i.jsx)(e.h3,{id:\"when-will-hdiutil-actually-be-removed\",children:\"When will hdiutil actually be removed?\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Apple has not said. Looking at the man page's own history, Apple's pattern with this tool has been to deprecate a feature in one release and remove it one or more major versions later \\u2014 \",(0,i.jsx)(e.code,{children:\"internet-enable\"}),\" and the OS 9 dual-fork support each took at least a full cycle. Anyone giving you a specific removal version is guessing.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"can-i-use-diskutil-image-on-macos-26-tahoe\",children:\"Can I use diskutil image on macOS 26 Tahoe?\"}),`\n`,(0,i.jsx)(e.p,{children:\"Yes, and this is the most useful fact in this article. Verified on macOS 26.5.2 (build 25F84). You can migrate scripts and test them now, on the OS you already run, rather than waiting for macOS 27.\"}),`\n`,(0,i.jsx)(e.h3,{id:\"is-diskutil-image-a-full-replacement-for-hdiutil\",children:\"Is diskutil image a full replacement for hdiutil?\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"No, not today. \",(0,i.jsx)(e.code,{children:\"verify\"}),\", \",(0,i.jsx)(e.code,{children:\"compact\"}),\", \",(0,i.jsx)(e.code,{children:\"makehybrid\"}),\", and \",(0,i.jsx)(e.code,{children:\"burn\"}),\" have no counterpart, and several \",(0,i.jsx)(e.code,{children:\"create\"}),\" options for controlling exactly which files get included are absent. For the common path \\u2014 create, convert, attach, inspect, resize, encrypt \\u2014 it is complete.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"why-did-apple-do-this\",children:\"Why did Apple do this?\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"Apple has not published a rationale. What is observable is that \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" is faster in benchmarks, produces smaller images, supports the newer ASIF format that \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" cannot produce, and presents a much smaller command surface. Consolidating disk-image handling into \",(0,i.jsx)(e.code,{children:\"diskutil\"}),\" alongside the rest of storage management is a coherent direction. That is a reading of the evidence, not a statement from Apple.\"]}),`\n`,(0,i.jsx)(e.h3,{id:\"will-my-app-break-if-it-shells-out-to-hdiutil\",children:\"Will my app break if it shells out to hdiutil?\"}),`\n`,(0,i.jsx)(e.p,{children:\"Not in macOS 27. Plan to move anyway \\u2014 and use the capability check so a single code path covers both, which is easier than it sounds precisely because the new command already exists on macOS 26.\"}),`\n`,(0,i.jsx)(e.h2,{id:\"conclusion\",children:\"Conclusion\"}),`\n`,(0,i.jsxs)(e.p,{children:[\"The headline \\u2014 a 25-year-old Terminal command is being retired \\u2014 is true but misleading in both directions. It undersells the change for anyone whose build scripts use \",(0,i.jsx)(e.code,{children:\"verify\"}),\", \",(0,i.jsx)(e.code,{children:\"compact\"}),\", \",(0,i.jsx)(e.code,{children:\"makehybrid\"}),\", or the fine-grained \",(0,i.jsx)(e.code,{children:\"create\"}),\" options, because those have no path forward today. And it oversells it for everyone else, because \",(0,i.jsx)(e.code,{children:\"hdiutil\"}),\" still works in macOS 27, Apple has announced no removal date, and the deprecation is the last step of a narrowing that has been documented in the tool's own man page since macOS 10.15.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"The genuinely useful thing to know is that the replacement is not in the future. \",(0,i.jsx)(e.code,{children:\"diskutil image\"}),\" is on your Mac right now, on macOS 26, with \",(0,i.jsx)(e.code,{children:\"create\"}),\", \",(0,i.jsx)(e.code,{children:\"attach\"}),\", \",(0,i.jsx)(e.code,{children:\"info\"}),\", \",(0,i.jsx)(e.code,{children:\"resize\"}),\", and \",(0,i.jsx)(e.code,{children:\"chpass\"}),\" working. You can do this migration on a Tuesday afternoon on the OS you already have, verify it with \",(0,i.jsx)(e.code,{children:\"diff -rq\"}),\", and stop thinking about it.\"]}),`\n`,(0,i.jsxs)(e.p,{children:[\"Just remember that \",(0,i.jsx)(e.code,{children:\"detach\"}),\" is not where you expect it.\"]}),`\n`,(0,i.jsx)(e.p,{children:(0,i.jsxs)(e.em,{children:[\"Related reading: \",(0,i.jsx)(e.a,{href:\"/blog/mac-terminal-mastery-2025-command-line-productivity-guide\",children:\"Terminal mastery on macOS\"}),\", \",(0,i.jsx)(e.a,{href:\"/blog/ultimate-apple-silicon-development-environment-setup-guide-2025\",children:\"Apple silicon development environment setup\"}),\", and \",(0,i.jsx)(e.a,{href:\"/blog/encrypted-hfs-plus-dropped-macos-28-convert-apfs-time-machine-guide-2026\",children:\"encrypted HFS+ volumes are being dropped in macOS 28\"}),\".\"]})})]})}function k(s={}){let{wrapper:e}=s.components||{};return e?(0,i.jsx)(e,{...s,children:(0,i.jsx)(c,{...s})}):c(s)}return f(E);})();\n;return Component;","toc":[{"title":"Key Takeaways","url":"#key-takeaways","depth":2},{"title":"First: Confirm It On Your Own Mac","url":"#first-confirm-it-on-your-own-mac","depth":2},{"title":"This Did Not Come Out of Nowhere","url":"#this-did-not-come-out-of-nowhere","depth":2},{"title":"The Migration Table","url":"#the-migration-table","depth":2},{"title":"The convert surprise","url":"#the-convert-surprise","depth":3},{"title":"The detach gap is real","url":"#the-detach-gap-is-real","depth":3},{"title":"What diskutil image Does Better","url":"#what-diskutil-image-does-better","depth":2},{"title":"ASIF, which hdiutil cannot make at all","url":"#asif-which-hdiutil-cannot-make-at-all","depth":3},{"title":"It attaches over HTTP and makes RAM disks directly","url":"#it-attaches-over-http-and-makes-ram-disks-directly","depth":3},{"title":"It is substantially faster","url":"#it-is-substantially-faster","depth":3},{"title":"What Will Actually Break In Your Scripts","url":"#what-will-actually-break-in-your-scripts","depth":2},{"title":"1. -puppetstrings has no replacement","url":"#1--puppetstrings-has-no-replacement","depth":3},{"title":"2. Several create options are simply gone","url":"#2-several-create-options-are-simply-gone","depth":3},{"title":"3. Scrubbing behavior changed silently","url":"#3-scrubbing-behavior-changed-silently","depth":3},{"title":"4. Permission handling fails quietly","url":"#4-permission-handling-fails-quietly","depth":3},{"title":"5. Logging is thinner","url":"#5-logging-is-thinner","depth":3},{"title":"How To Migrate Without Breaking macOS 26 Support","url":"#how-to-migrate-without-breaking-macos-26-support","depth":2},{"title":"A Worked Example, Start To Finish","url":"#a-worked-example-start-to-finish","depth":2},{"title":"Encrypted Images","url":"#encrypted-images","depth":2},{"title":"What Disk Images Are Still For","url":"#what-disk-images-are-still-for","depth":2},{"title":"ASIF: The Format Only the New Tool Makes","url":"#asif-the-format-only-the-new-tool-makes","depth":2},{"title":"Where This Fits in a Distribution Pipeline","url":"#where-this-fits-in-a-distribution-pipeline","depth":2},{"title":"Troubleshooting Common Issues","url":"#troubleshooting-common-issues","depth":2},{"title":"\"diskutil image: command not found\" or the subcommand is unrecognized","url":"#diskutil-image-command-not-found-or-the-subcommand-is-unrecognized","depth":3},{"title":"The image builds but is missing files","url":"#the-image-builds-but-is-missing-files","depth":3},{"title":"Progress parsing broke in CI","url":"#progress-parsing-broke-in-ci","depth":3},{"title":"Cannot detach — \"resource busy\"","url":"#cannot-detach--resource-busy","depth":3},{"title":"A .dmg with a license agreement no longer builds","url":"#a-dmg-with-a-license-agreement-no-longer-builds","depth":3},{"title":"FAQ","url":"#faq","depth":2},{"title":"Does hdiutil still work in macOS 27?","url":"#does-hdiutil-still-work-in-macos-27","depth":3},{"title":"When will hdiutil actually be removed?","url":"#when-will-hdiutil-actually-be-removed","depth":3},{"title":"Can I use diskutil image on macOS 26 Tahoe?","url":"#can-i-use-diskutil-image-on-macos-26-tahoe","depth":3},{"title":"Is diskutil image a full replacement for hdiutil?","url":"#is-diskutil-image-a-full-replacement-for-hdiutil","depth":3},{"title":"Why did Apple do this?","url":"#why-did-apple-do-this","depth":3},{"title":"Will my app break if it shells out to hdiutil?","url":"#will-my-app-break-if-it-shells-out-to-hdiutil","depth":3},{"title":"Conclusion","url":"#conclusion","depth":2}],"estimatedTime":21}