次に、FirecrackerのSnapshot作成とResumeについて解説する。Resumeを行うことでマイクロ秒のマシンの復旧が体感できる。
今回はWebサーバを復元するパターンではなく単純なシェルを復元するパターンとしている。
Snapshotの図解は以下となる

スナップショット作成のコードは以下となる。
#!/bin/bash
# create_snapshot.sh
SOCKET="/run/firecracker.socket"
SNAP_DIR="スナップショット保存先"
sudo mkdir -p $SNAP_DIR
echo "=== スナップショット作成を開始します ==="
echo "1. マイクロVMを一時停止 (Pause) しています..."
# 【修正】エンドポイントを /vm/state に変更
sudo curl --unix-socket $SOCKET -i \
-X PATCH 'http://localhost/vm/state' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{ "state": "Paused" }'
echo "2. メモリと設定状態をダンプしています..."
sudo curl --unix-socket $SOCKET -i \
-X PUT 'http://localhost/snapshot/create' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d "{
\"snapshot_type\": \"Full\",
\"snapshot_path\": \"$SNAP_DIR/snapshot_file.snap\",
\"mem_file_path\": \"$SNAP_DIR/mem_file.raw\"
}"
echo "3. ダンプ後にResumeしています..."
sudo curl --unix-socket $SOCKET -i \
-X PATCH 'http://localhost/vm/state' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{ "state": "Resumed" }'
echo "[OK] スナップショットの作成処理が完了しました!"
echo "保存先: $SNAP_DIR"
実行結果
2026-03-26T06:40:15.010005638 [anonymous-instance:fc_api] The API server received a Patch request on "/vm/state" with body "{ \"state\": \"Paused\" }".
2026-03-26T06:40:15.010198716 [anonymous-instance:main] 'pause vm' VMM action took 104 us.
2026-03-26T06:40:15.010265847 [anonymous-instance:fc_api] The request was executed successfully. Status code: 204 No Content.
2026-03-26T06:40:15.010281722 [anonymous-instance:fc_api] 'pause vm' API request took 287 us.
2026-03-26T06:40:15.035763763 [anonymous-instance:fc_api] The API server received a Put request on "/snapshot/create" with body "{\n \"snapshot_type\": \"Full\",\n \"snapshot_path\": \"/home/user/code/fc/blog/snapshots/snapshot_file.snap\",\n \"mem_file_path\": \"/home/user/code/fc/blog/snapshots/mem_file.raw\"\n }".
2026-03-26T06:40:16.689450294 [anonymous-instance:main] 'create full snapshot' VMM action took 1653612 us.
2026-03-26T06:40:16.689508369 [anonymous-instance:fc_api] The request was executed successfully. Status code: 204 No Content.
2026-03-26T06:40:16.689523442 [anonymous-instance:fc_api] 'create full snapshot' API request took 1653770 us.
2026-03-26T06:40:16.716170948 [anonymous-instance:fc_api] The API server received a Patch request on "/vm/state" with body "{ \"state\": \"Resumed\" }".
2026-03-26T06:40:16.716246415 [anonymous-instance:main] Artificially kick devices
2026-03-26T06:40:16.716261147 [anonymous-instance:main] kick net eth0.
2026-03-26T06:40:16.716283063 [anonymous-instance:main] kick block rootfs.
2026-03-26T06:40:16.716343291 [anonymous-instance:fc_vcpu 0] Received a VcpuEvent::Resume message with immediate_exit enabled. immediate_exit was disabled before proceeding
2026-03-26T06:40:16.716492789 [anonymous-instance:main] 'resume vm' VMM action took 247 us.
2026-03-26T06:40:16.716518188 [anonymous-instance:main] Got a spurious notification from api thread
2026-03-26T06:40:16.716528715 [anonymous-instance:main] Got a spurious notification from api thread
2026-03-26T06:40:16.716565437 [anonymous-instance:fc_api] The request was executed successfully. Status code: 204 No Content.
2026-03-26T06:40:16.716668246 [anonymous-instance:fc_api] 'resume vm' API request took 502 us.$ sh create_snapshot.sh
[sudo] hal のパスワード:
=== スナップショット作成を開始します ===
1. マイクロVMを一時停止 (Pause) しています...
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
2. メモリと設定状態をダンプしています...
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
3. ダンプ後にResumeしています...
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
[OK] スナップショットの作成処理が完了しました!
保存先: "スナップショット保存先"次はResumeで、Resumeの図解は以下となる。

一度停止してSnapshotからResume
=== スナップショットからの爆速起動を開始します ===
1. スナップショットファイルをロードしています...
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
-e
2. マイクロVMを再開 (Resume) します...
HTTP/1.1 204
Server: Firecracker API
Connection: keep-alive
-e
[OK] 復帰完了!Webサーバーが即座に稼働を再開しました。実行結果
$ sudo firecracker.sh
2026-03-26T06:41:51.315142942 [anonymous-instance:main] Running Firecracker v1.14.3
2026-03-26T06:41:51.315452599 [anonymous-instance:main] Listening on API socket ("/run/firecracker.socket").
2026-03-26T06:41:51.316374484 [anonymous-instance:fc_api] API server started.
2026-03-26T06:42:34.146690501 [anonymous-instance:fc_api] The API server received a Put request on "/snapshot/load" with body "{\n \"snapshot_path\": \"/home/user/code/fc/blog/snapshots/snapshot_file.snap\",\n \"mem_backend\": {\n \"backend_path\": \"/home/user/code/fc/blog/snapshots/mem_file.raw\",\n \"backend_type\": \"File\"\n }\n }".
2026-03-26T06:42:34.147075425 [anonymous-instance:main] Host CPU vendor ID: [71, 101, 110, 117, 105, 110, 101, 73, 110, 116, 101, 108]
2026-03-26T06:42:34.147175598 [anonymous-instance:main] Snapshot CPU vendor ID: [71, 101, 110, 117, 105, 110, 101, 73, 110, 116, 101, 108]
2026-03-26T06:42:34.151607110 [anonymous-instance:fc_api] The request was executed successfully. Status code: 204 No Content.
2026-03-26T06:42:34.151635045 [anonymous-instance:fc_api] 'load snapshot' API request took 4967 us.
2026-03-26T06:42:34.176573361 [anonymous-instance:fc_api] The API server received a Patch request on "/vm/state" with body "{ \"state\": \"Resumed\" }".
2026-03-26T06:42:34.176687967 [anonymous-instance:main] Artificially kick devices
2026-03-26T06:42:34.176722727 [anonymous-instance:main] kick net eth0.
2026-03-26T06:42:34.176775054 [anonymous-instance:main] kick block rootfs.
2026-03-26T06:42:34.176890452 [anonymous-instance:fc_vcpu 0] Received a VcpuEvent::Resume message with immediate_exit enabled. immediate_exit was disabled before proceeding
2026-03-26T06:42:34.177021170 [anonymous-instance:main] 'resume vm' VMM action took 367 us.
2026-03-26T06:42:34.177095111 [anonymous-instance:fc_api] The request was executed successfully. Status code: 204 No Content.
2026-03-26T06:42:34.177135439 [anonymous-instance:fc_api] 'resume vm' API request took 567 us
~ # ls
app home media root sys www
bin init.sh mnt run tmp
dev lib opt sbin usr
etc lost+found proc srv var567 usで復元できているため、驚異的な速さでVMを復元できることがわかる。/run配下などメモリにおけばもう少し速度が早くなると思う。
以上がFirecrackerのSnapshotとResumeのパターン。このパターンを使えば安全にVMをどうさせることができるため、VMとの責任分界点がホストマシンとVMで境界が設定できる。
ちなみにrootfsが存在しないと下記のエラーとなるため共有rootfs自体はスナップショットとして保存していないことがわかる。
=== スナップショットからの爆速起動を開始します ===
1. スナップショットファイルをロードしています...
HTTP/1.1 400
Server: Firecracker API
Connection: keep-alive
Content-Type: application/json
Content-Length: 309
{"fault_message":"Load snapshot error: Failed to restore from snapshot: Failed to build microVM from snapshot: Failed to restore devices: Error restoring MMIO devices: Block: Virtio backend error: Error manipulating the backing file: No such file or directory (os error 2) /home/blog/code/fc/blog/rootfs.ext4"}-e
2. マイクロVMを再開 (Resume) します...
curl: (7) Failed to connect to localhost port 80 after 0 ms: Couldn't connect to server
-e
[OK] 復帰完了!Webサーバーが即座に稼働を再開しました。$ sudo firecracker.sh
2026-03-26T06:58:18.893869578 [anonymous-instance:main] Running Firecracker v1.14.3
2026-03-26T06:58:18.893999881 [anonymous-instance:main] Listening on API socket ("/run/firecracker.socket").
2026-03-26T06:58:18.894534493 [anonymous-instance:fc_api] API server started.
2026-03-26T06:58:22.348511331 [anonymous-instance:fc_api] The API server received a Put request on "/snapshot/load" with body "{\n \"snapshot_path\": \"/home/user/code/fc/blog/snapshots/snapshot_file.snap\",\n \"mem_backend\": {\n \"backend_path\": \"/home/user/code/fc/blog/snapshots/mem_file.raw\",\n \"backend_type\": \"File\"\n }\n }".
2026-03-26T06:58:22.349093216 [anonymous-instance:main] Host CPU vendor ID: [71, 101, 110, 117, 105, 110, 101, 73, 110, 116, 101, 108]
2026-03-26T06:58:22.349245399 [anonymous-instance:main] Snapshot CPU vendor ID: [71, 101, 110, 117, 105, 110, 101, 73, 110, 116, 101, 108]
2026-03-26T06:58:22.378414912 [anonymous-instance:fc_api] Received Error. Status code: 400 Bad Request. Message: Load snapshot error: Failed to restore from snapshot: Failed to build microVM from snapshot: Failed to restore devices: Error restoring MMIO devices: Block: Virtio backend error: Error manipulating the backing file: No such file or directory (os error 2) /home/hal/code/fc/blog/rootfs.ext4
2026-03-26T06:58:22.379328008 [anonymous-instance:main] RunWithApiError error: Failed to build MicroVM: Loading snapshot failed..
Error: RunWithApi(BuildMicroVmError(Restore))
2026-03-26T06:58:22.379565125 [anonymous-instance:main] Firecracker exiting with error. exit_code=1