FirecrackerのSnapshotとResume

次に、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         var

567 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

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール