How to create a disk image from the command line
Currently part of my build process is as follows;
- Start Utilities/Disk Utility
- Select New Image
- Set Save As to widget
- Set Name to widget
- Set Size to custom size 50 mb
- Set Format Mac OS Extended
but is it possible to do all this from the command line ?
Solution 1:
You can do this with the hdiutil tool. The appropriate configuration in your case would be:
hdiutil create -size 50m -fs HFS+ -volname Widget /path/to/save/widget.dmg
Obviously change the "Widget" and path to whatever you need.
A few additional options that may be useful:
-
-srcfolder /path/to/source
This will create the disk image with the data in the specified folder as the contents. -
-megabytes 50
used instead of-size 50m
. This will use binary sized megabytes (2^20 bytes) instead of decimal (10^6 bytes). -
-srcdevice /dev/diskXsY
This is likesrcfolder
, but makes a block-based copy from another device, like a hard drive partition or DVD. Useful for making clones and images of install disks, etc.
Solution 2:
I made a little bash script to automate a disc image creation.
It creates a temporary directory to store all needed files then export it in a new DMG file. Temporary directory is then deleted.
#!/bin/bash
# Create .dmg file for macOS
# Adapt these variables to your needs
APP_VERS="1.0"
DMG_NAME="MyApp_v${APP_VERS}_macos"
OUTPUT_DMG_DIR="path_to_output_dmg_file"
APP_FILE="path_to_my_app/MyApp.app"
OTHER_FILES_TO_INCLUDE="path_to_other_files"
# The directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# The temp directory used, within $DIR
WORK_DIR=`mktemp -d "${DIR}/tmp"`
# Check if tmp dir was created
if [[ ! "${WORK_DIR}" || ! -d "${WORK_DIR}" ]]; then
echo "Could not create temp dir"
exit 1
fi
# Function to deletes the temp directory
function cleanup {
rm -rf "${WORK_DIR}"
#echo "Deleted temp working directory ${WORK_DIR}"
}
# Register the cleanup function to be called on the EXIT signal
trap cleanup EXIT
# Copy application on temp dir
cp -R "${APP_FILE}" "${WORK_DIR}"
# Copy other files without hidden files
rsync -a --exclude=".*" "${OTHER_FILES_TO_INCLUDE}" "${WORK_DIR}"
# Create .dmg
hdiutil create -volname "${DMG_NAME}" -srcfolder "${WORK_DIR}" -ov -format UDZO "${OUTPUT_DMG_DIR}/${DMG_NAME}.dmg"