macOSにおけるRAMディスクの作成とログイン項目による自動マウント手順

macOS

macOSのシステム標準機能(Automatorとzshシェルスクリプト)のみを利用して、安全にRAMディスクを構築し、必要に応じた手動マウント、およびmacOSのログイン(起動)時に自動マウントを設定する具体的な手順を解説します。最小限のシステムリソースで環境を汚さずに運用可能です。

本手順におけるシステム仕様と挙動

システム標準機能およびスクリプトを用いて運用する際の、技術的な特性と仕様です。

  • システム環境の維持
    バックグラウンドでの不要なリソース消費や競合のリスクがありません。不要になった際は、作成したアプリケーションファイル(.app)の破棄とログイン項目から登録を削除するだけで、システムを完全に元の状態へ戻せます。
  • ファイルシステムと同期処理の制限
    macOSの標準コマンド(hdiutil)で作成したAPFS/HFS+フォーマットのRAMディスクは、データの整合性を担保する同期システムコール(fsync 等)の処理負荷を直接受けます。そのため、測定環境や書き込み処理のロジックによっては、ストレージの転送レートに頭打ちが発生する仕様となっています。

作業の全体の流れ

設定は以下の2ステップで完了します。

  • ステップ1:Automatorでマウント用アプリケーションを作成する
    指定した容量やフォーマットの設定を内包したスクリプトを、ダブルクリックで実行可能な「.app」形式に変換します。
  • ステップ2:ログイン項目に登録して自動化する
    作成したアプリケーションをmacOSのログイン(起動)時に自動実行するよう登録します。

RAMディスク作成アプリケーションの構築手順

Automatorでマウント用アプリを作成・保存する

  1. MacのSpotlight検索(Command + Space)または「アプリケーション」フォルダから「Automator」を起動します。
  2. メニューバーの 「ファイル」 > 「新規」 を選択します。
  3. 書類のタイプを選択する画面で 「アプリケーション」 を選択し、「選択」をクリックします。
  4. 画面左側の検索窓に「シェル」と入力します。
  5. 絞り込まれたアクションから 「シェルスクリプトを実行」 を選択し、右側のワークスペースへドラッグ&ドロップ(またはダブルクリック)して追加します。
  6. 「シェルスクリプトの実行」の下にある設定2ヶ所を以下のように変更します。
    • シェル: /bin/zsh
    • 入力の引き渡し方法: 引数として

⚠️ 【重要】シェル環境に関する注意点
掲載しているcreate_automator_ramdisk.shは、配列操作の最適化などにおいてzsh専用の固有構文(zsh-specific syntax)を含んでいます。 そのため、Automatorの設定でシェルを /bin/bash や /bin/sh に指定すると正常に動作しません。必ず /bin/zsh が選択されていることを確認してください。

  1. コード入力欄にデフォルトで記述されている for f in "$@" などのテキストをすべて消去し、以下のcreate_automator_ramdisk.shをそのまま貼り付けます。
    Automatorでapp化するのでcreate_automator_ramdisk.shの中にある【使い方】は無視してください。create_automator_ramdisk.shをそのままコピーペーストしてください。
    create_automator_ramdisk.shをシェルスクリプトとして実行する場合のみ【使い方】を実施してください。今回の記事ではシェルスクリプトとして実行するやり方は記載していません。
create_automator_ramdisk.sh
#!/bin/zsh

# ======================================================================
#  Mac macOS用 RAMディスク自動作成・再初期化スクリプト
# ======================================================================
#  ・スクリプト名 : create_automator_ramdisk.sh
#  ・バージョン   : 1.0.0
#  ・公開日/更新日: 2026-05-29
#  ・ライセンス   : MIT License
#  ・著作権表示   : Copyright (c) 2026 ohllengeapplication.com 管理人
# ======================================================================
#  【概要】
#   本スクリプトは、macOSの物理メモリ上に超高速な一時ストレージ(RAMディスク)
#   を安全かつ自動的に構築・再初期化するためのzshスクリプトです。
# ======================================================================
#  【使い方】
#   1. スクリプトへの実行権限付与 (初回のみ)
#      ターミナルで以下のコマンドを実行し、実行権限を与えてください。
#      chmod +x create_automator_ramdisk.sh
#
#   2. 手動での実行
#      スクリプトを実行すると、RAMディスクの作成または再初期化を行います。
#      ./create_automator_ramdisk.sh
#
#   3. RAMディスクの破棄(アンマウント)
#      Finderで通常のディスクと同様に「取り出す」か、ターミナルで以下を実行します。
#      hdiutil detach /Volumes/[DISK_NAMEで指定した名前] -force
# ======================================================================
#  【免責事項】
#   本スクリプトの使用によるデータ損失やシステム不具合等の損害について、
#   作者は一切の責任を負いません。すべて自己責任でご利用ください。
#   ※再起動や電源オフ、アンマウントでデータは完全に消去されます。
# ======================================================================

set +e

# --- 内部環境変数セーフティ (Launchdやショートカット等の特殊環境対策) ---
export PATH="/usr/sbin:/sbin:/usr/bin:/bin:${PATH}"

# ======================================================================
#  【設定項目】
# ======================================================================
# [NUM_MB] 作成するRAMディスクの容量をメガバイト(MB)単位で指定します。
NUM_MB=4096
# [DISK_NAME] デスクトップやFinder上に表示されるボリューム名を指定します。
DISK_NAME="RAMDisk"
# [FORMAT] 構築するファイルシステム(フォーマット)を指定します。
# ※ スペースを含む名称はエラーの原因となるため、以下の「省略識別名」を指定してください。
# ■ APFS系列 (macOS 10.13 High Sierra 以降推奨・高速・高効率)
#   - "APFS"                      : 標準のAPFS(最も推奨)
#   - "APFSX"                     : 大文字・小文字を区別するAPFS (Case-sensitive APFS)
# ■ Mac OS 拡張系列 (従来の標準・互換性用)
#   - "HFS+"                      : 標準のMac OS 拡張 (ジャーナリング)
#   - "HFSX"                      : 大文字・小文字を区別するMac OS 拡張 (Case-sensitive HFS+)
# ■ 互換性系列 (Windows等とのデータ共有用)
#   - "ExFAT"                     : 4GB超のファイルを扱えるWindows/Mac共通形式
#   - "MS-DOS"                    : FAT32形式
FORMAT="APFS"
# [SAFE_RAM_PERCENT] システム全体の物理メモリに対する、最大割り当て許容限界(%)です。
# ※ Mac全体のメモリ枯渇によるフリーズや強制終了を防ぐための安全弁として機能します。
SAFE_RAM_PERCENT=80

# ======================================================================
#  【内部定数】 (未使用変数を完全に排除し、正しいシェル構文を維持)
# ======================================================================
readonly RAM_PROTOCOL="ram://"			# hdiutil用のプロトコル識別子
readonly SECTORS_PER_MB=2048			# 1MBあたりのセクター数 (512バイト/セクター換算)
readonly BYTES_PER_MB=$(( 1024 * 1024 ))	# 1MBあたりのバイト数
readonly PERCENT_DENOMINATOR=100		# パーセント計算用の分母
readonly MAX_ATTEMPTS=3				# デバイス確保・初期化失敗時の最大リトライ回数
readonly RETRY_INTERVAL_SEC=1			# リトライ時の待機インターバル(秒)
readonly SLEEP_AFTER_DETACH=2			# 既存デバイス解放後のOS同期待ちスリープ(秒)
readonly SLEEP_AFTER_FORMAT=1			# フォーマット完了後のOS認識待ちスリープ(秒)
readonly LOG_DATE_FORMAT="%Y-%m-%d %H:%M:%S"	# エラーログに記録するタイムスタンプ形式
readonly DEFAULT_LOG_DIR="${HOME}/Library/Logs"	# 標準のエラーログ出力先ディレクトリ
readonly SEARCH_FS_TYPE="APFS"			# APFS判定用の基準文字列
readonly LOG_MSG_SEPARATOR=" "			# 改行置換およびログメッセージ用の区切り文字

# ステータス及び終了コード用定数
readonly STATUS_SUCCESS=0			# コマンド成功時のステータス
readonly EXIT_CODE_FAILURE=1			# スクリプト異常終了時の終了コード

# コマンド制御・文字列パターン用定数
readonly DEV_DISK_PREFIX="/dev/disk"		# macOSの物理/仮想ディスク接頭辞
readonly DEV_DISK_PATTERN='/dev/disk[0-9]*'	# ターゲット抽出用の正規表現パターン
readonly PLIST_EXTRACT_KEY="APFSContainerReference"	# plistからAPFSコンテナIDを抜くためのキー
readonly CASE_SENSITIVE_APFS="Case-sensitive APFS"	# 大文字小文字区別APFS用の判定文字列
readonly DISK_MATCH_PATTERN="disk*"		# コンテナIDのバリデーション用パターン

readonly TARGET_PATH="/Volumes/${DISK_NAME}"	# 最終的なマウント先絶対パス
readonly LOG_FILE="${RAMDISK_LOG_FILE:-${DEFAULT_LOG_DIR}/ramdisk_error.log}"	# ログファイルの格納パス

# ログディレクトリの確実な生成
mkdir -p "$(dirname "${LOG_FILE}")" 2>/dev/null

# ======================================================================
#  【内部関数】
# ======================================================================
log_error() {
    local error_msg="$1"
    local timestamp
    timestamp=$(date "+${LOG_DATE_FORMAT}")
    if [[ ! -L "${LOG_FILE}" ]]; then
        echo "[${timestamp}] エラー発生: ${error_msg}" >> "${LOG_FILE}" 2>/dev/null || true
    fi
}

# ======================================================================
#  【メインロジック】
# ======================================================================

# ----------------------------------------------------------------------
#  0. 物理メモリ残量チェック
# ----------------------------------------------------------------------
TOTAL_RAM_BYTES=$(sysctl -n hw.memsize 2>/dev/null || echo 0)
TOTAL_RAM_MB=$(( TOTAL_RAM_BYTES / BYTES_PER_MB ))
MAX_SAFE_MB=$(( TOTAL_RAM_MB * SAFE_RAM_PERCENT / PERCENT_DENOMINATOR ))

if [[ ${TOTAL_RAM_MB} -ne 0 && ${NUM_MB} -gt ${MAX_SAFE_MB} ]]; then
    msg="要求サイズ (${NUM_MB}MB) が安全基準 (${MAX_SAFE_MB}MB) を超えています。"
    echo "エラー: ${msg}" >&2
    log_error "${msg}"
    exit "${EXIT_CODE_FAILURE}"
fi

# ----------------------------------------------------------------------
#  1. 重複チェックと既存RAMディスクの削除 (一括超高速解体)
# ----------------------------------------------------------------------
echo "既存のRAMディスクおよびメモリ残骸を索敵中..."

typeset -A dev_set

# dfとhdiutilを組み合わせ、スペース混じりのボリューム名でも確実にパスを走査
raw_devs=""
if df | grep -F "${TARGET_PATH}" >/dev/null 2>&1; then
    raw_devs+="$(df "${TARGET_PATH}" 2>/dev/null | tail -n 1 | awk '{print $1}')"
fi
raw_devs+="${LOG_MSG_SEPARATOR}"
raw_devs+="$(hdiutil info 2>/dev/null | grep -B 20 "${TARGET_PATH}" 2>/dev/null | grep -o "${DEV_DISK_PATTERN}" || echo '')"

# Zshの (z) フラグを使用してスペース区切りの文字列を安全に配列化して走査
for dev in ${(z)raw_devs}; do
    if [[ -n "${dev}" && "${dev}" == ${DEV_DISK_PREFIX}* ]]; then
        dev_set[${dev}]=1
    fi
done

# 検出したすべての既存デバイス・ゾンビ残骸をループで徹底的に解体
if [[ ${#dev_set} -gt 0 ]]; then
    for EXISTING_DEV in "${(k)dev_set}"; do
        echo "解除対象デバイスを検出しました: ${EXISTING_DEV}"

        # OSの出力フォーマット変更に影響されないplist形式を用いて、APFSコンテナIDを安全に抽出
        if diskutil info "${EXISTING_DEV}" 2>/dev/null | grep -qi "${SEARCH_FS_TYPE}"; then
            apfs_container=$(diskutil info -plist "${EXISTING_DEV}" 2>/dev/null | plutil -extract "${PLIST_EXTRACT_KEY}" raw - 2>/dev/null)
            if [[ -n "${apfs_container}" && "${apfs_container}" == ${DISK_MATCH_PATTERN} ]]; then
                diskutil apfs deleteContainer "${apfs_container}" >/dev/null 2>&1 || true
            fi
        fi

        diskutil unmountDisk force "${EXISTING_DEV}" >/dev/null 2>&1 || true
        hdiutil detach "${EXISTING_DEV}" -force >/dev/null 2>&1 || true
        sleep ${SLEEP_AFTER_DETACH}
    done
fi

if [[ -d "${TARGET_PATH}" ]]; then
    umount -f "${TARGET_PATH}" >/dev/null 2>&1 || true
    rm -rf "${TARGET_PATH}" 2>/dev/null || true
fi
echo "既存ボリューム・残骸の完全解体が完了しました。"

# ----------------------------------------------------------------------
#  2. 新規RAMディスク作成処理 (物理メモリ領域の確保)
# ----------------------------------------------------------------------
NUM_SECTORS=$(( NUM_MB * SECTORS_PER_MB ))

echo ""
echo "=== 新規RAMディスク作成処理を開始 ==="
RAM_DEV=""
RAM_URI="${RAM_PROTOCOL}${NUM_SECTORS}"
LAST_ERROR=""

for (( attempt = 1; attempt <= MAX_ATTEMPTS; attempt++ )); do
    echo "メモリ領域を確保中... (試行 ${attempt}/${MAX_ATTEMPTS})"

    # 文字コードとリダイレクト指定を完全クリーン化(引数誤認を完全に排除)
    ATTACH_OUT=$(hdiutil attach -nomount "${RAM_URI}" 2>&1)
    _attach_status=$?

    if [[ ${_attach_status} -eq ${STATUS_SUCCESS} && -n "${ATTACH_OUT}" ]]; then
        # 改行や前後の空白に影響されないよう、/dev/diskX のパターンのみを厳密にトリミング抽出
        RAM_DEV=$(echo "${ATTACH_OUT}" | grep -o "${DEV_DISK_PATTERN}" | head -n 1)
        break
    else
        # Zshネイティブなパラメータ展開(外部コマンド tr を排除)で改行を置換
        LAST_ERROR="${ATTACH_OUT//$'\n'/$LOG_MSG_SEPARATOR}"
        if [[ ${attempt} -lt ${MAX_ATTEMPTS} ]]; then
            sleep ${RETRY_INTERVAL_SEC}
        fi
    fi
done

if [[ -z "${RAM_DEV}" ]]; then
    echo "エラー: メモリ領域の確保に最終失敗しました。" >&2
    log_error "hdiutil 確保失敗 - 原因: ${LAST_ERROR}"
    exit "${EXIT_CODE_FAILURE}"
fi

echo "デバイス確保成功: ${RAM_DEV}"

# ----------------------------------------------------------------------
#  3. ファイルシステムの初期化とマウント
# ----------------------------------------------------------------------
echo "指定フォーマット (${FORMAT}) で初期化中..."

if [[ "${FORMAT}" == "${SEARCH_FS_TYPE}" || "${FORMAT}" == "${CASE_SENSITIVE_APFS}" ]]; then
    ERASE_OUT=$(diskutil apfs create "${RAM_DEV}" "${DISK_NAME}" 2>&1)
    _erase_status=$?
else
    ERASE_OUT=$(diskutil eraseVolume "${FORMAT}" "${DISK_NAME}" "${RAM_DEV}" 2>&1)
    _erase_status=$?
fi

if [[ ${_erase_status} -eq ${STATUS_SUCCESS} ]]; then
    sleep ${SLEEP_AFTER_FORMAT}

    # APFS以外(HFS+等)で自動マウントされなかった場合のみ、補完的にマウントを実行
    if ! df | grep -F "${TARGET_PATH}" >/dev/null 2>&1; then
        diskutil mount "${RAM_DEV}" >/dev/null 2>&1 || true
    fi

    # ----------------------------------------------------------------------
    #  4. 最終正常性のダブルチェック (ゾンビマウント・権限競合の排除)
    # ----------------------------------------------------------------------
    if [[ -d "${TARGET_PATH}" ]]; then
        # 実際に書き込み可能か、一時ファイルを作成してテスト
        write_test_file="${TARGET_PATH}/.write_test_$$"
        if touch "${write_test_file}" 2>/dev/null; then
            rm -f "${write_test_file}"

            echo "=========================================="
            echo " 成功: RAMディスクが正常に生成されました。"
            echo "=========================================="
            echo "  ・ボリューム名 : ${DISK_NAME}"
            echo "  ・割り当て容量 : ${NUM_MB} MB"
            echo "  ・フォーマット : ${FORMAT}"
            echo "  ・デバイスパス : ${RAM_DEV}"
            echo "  ・マウント先   : ${TARGET_PATH}"
            echo "=========================================="
            exit "${STATUS_SUCCESS}"
        fi
    fi

    # ディレクトリが存在しても書き込めない(ゾンビ状態・権限エラー)場合のセーフティ
    msg="ボリュームは存在しますが、書き込みテストに失敗しました。解放します。"
    echo "エラー: ${msg}" >&2
    log_error "${msg}"
    hdiutil detach "${RAM_DEV}" -force >/dev/null 2>&1
    exit "${EXIT_CODE_FAILURE}"

else
    # 初期化そのものに失敗した場合のロールバック
    format_error="${ERASE_OUT//$'\n'/$LOG_MSG_SEPARATOR}"
    echo "エラー: フォーマットに失敗したため、メモリを解放します。" >&2
    log_error "初期化失敗 (${format_error})"

    hdiutil detach "${RAM_DEV}" -force >/dev/null 2>&1
    exit "${EXIT_CODE_FAILURE}"
fi
  1. メニューバーの 「ファイル」 > 「保存…」 を選択します。
  2. 保存場所に「アプリケーション」フォルダを指定し、任意の名前(例:CreateRAMDiskを設定します。ファイルフォーマットが「アプリケーション」になっていることを確認し、保存します。

保存が完了したら、command(⌘) + Q キーでAutomatorを終了し、Finderでアプリケーションを開きます。アプリケーション内の CreateRAMDisk をダブルクリックすることで、RAMディスクがマウントされます。

CreateRAMDisk をダブルクリックで必要な時のみRAMディスクを使用したい方はここまでとなります。
Macの起動時に自動でRAMディスクを利用できるように設定したい方は、以下のステップ2へ進んでください。


Mac起動時にCreateRAMDisk.appを自動実行する設定(ログイン項目)

  1. 画面左上のAppleメニュー()から 「システム設定…」 を開きます。
  2. 左メニューから 「一般」 を選択し、右側の一覧から 「ログイン項目」(または「ログイン項目と拡張機能」)をクリックします。
  3. 「ログイン時に開く」セクションの下部にある 「+」(追加)ボタン をクリックし、ダイアログの左メニューから「アプリケーション」を選択します。
  4. 先ほどステップ1で保存した 「CreateRAMDisk」 アプリを選択し、「開く」をクリックします。

ログイン項目のリストに、CreateRAMDiskが追加されれば設定は完了です。Macを再起動し、指定したボリューム名でRAMディスクが自動マウントされるか確認してください。

CreateRAMDisk.app自動実行を停止したい場合

次回起動時からの自動実行を停止する手順です。

  1. Appleメニュー()から 「システム設定…」 を開き、「一般」 > 「ログイン項目」へ進みます。
  2. 「ログイン時に開く」の一覧にある、作成したアプリ(CreateRAMDisk)をクリックして選択します。
  3. リスト下部にある 「ー」(削除)ボタン をクリックします。

これにより自動実行の登録が解除されます。


作成後の管理とメンテナンス

データの揮発性と初期化に伴うデータ消失リスク

RAMディスクは、通電時のみデータを保持する揮発性メモリ(RAM)領域を仮想ストレージ化しています。そのため、以下の操作を行った場合、下層の領域ごと解放・再生成される仕様であるため、内部のデータは事前通知なくすべて完全に消去(初期化)されます。

  • Macの再起動、およびシャットダウン(電源オフ)
  • Finderやターミナルコマンドによる手動のアンマウント(取り外し操作)
  • マウント状態で「CreateRAMDisk」を再実行(上書きマウント)

データ喪失を防ぐため、揮発してはならない必要なデータは、電源操作、アンマウント、アプリ再実行の前に必ず内蔵SSDなどの常設ストレージへ退避(コピー)させてください。

RAMディスクの取り外し方(アンマウント)

使い終わったRAMディスクを解体してメモリ領域を解放したい場合は、外付けHDDやUSBメモリと同様の手順で取り外すことができます。

⚠️ 注意
アンマウント(取り外し)を行うと、確保されていたメモリ領域がシステムへ返還されるため、RAMディスク内のデータはすべて消去されます。必要なデータが残っていないか必ず確認してから操作を行ってください。

  • GUIでの操作(推奨):Finderのサイドバーやデスクトップに表示されている指定ボリューム名(初期設定では RAMDisk)のアイコンの横にある「取り出し」アイコンをクリックするか、コンテキストメニューから「”ボリューム名”を取り出す」を選択します。
  • コマンドでの操作:ターミナルからマウントを解除する場合は、create_automator_ramdisk.sh内の DISK_NAME で定義した名称に合わせて以下のコマンドを実行します。hdiutil detach /Volumes/[DISK_NAME] ※初期設定(DISK_NAME=”RAMDisk”)のまま運用している場合は hdiutil detach /Volumes/RAMDisk となります。

容量やフォーマットの設定変更

RAMディスクの確保容量やファイルシステムを変更する場合は、作成した CreateRAMDisk.app をAutomatorアプリへドラッグ&ドロップするか、Automatorから直接ファイルを開き直すことで、コードの設定数値(NUM_MB や FORMAT)を書き換えられます。

修正して保存した後は、変更内容をシステムへ反映させるため、必ず一度データを退避させた上で CreateRAMDisk をダブルクリックして再実行してください。

⚠️ 注意
容量やフォーマットの設定変更後、CreateRAMDiskをダブルクリックして再実行した際、現在マウントされているRAMディスクは一度強制的に解体されるため、中にあるデータはすべて消失します。 必ず必要なデータを常設ストレージへ退避させてから再実行してください。



タイトルとURLをコピーしました