ZeroClawで作るWSL2のセキュアなローカルAIエージェント環境構築& OpenClawとの比較

#AI
本記事について

現時点ではZeroClawの積極的な活用までは至っていませんが、WSL2へのインストール手順をまとめました。

AIエージェントが単なる「チャット相手」から「自律的にPCを操作するアシスタント」へと進化を遂げる中、ローカル環境で動作するエージェントフレームワークが爆発的な注目を集めています。

本記事では、AIエージェント界隈を席巻している「OpenClaw」と、その軽量・高速なオルタナティブとして急浮上した「ZeroClaw」の違いを比較します。さらに、WSL2上でZeroClawを極めてセキュアかつ実用的に運用するための環境構築手順書を公開し、今後の拡張アイデアについても解説します。

1. 🚀 OpenClaw と ZeroClaw の比較

現在、オープンソースのAIエージェントランタイムとして主流になりつつあるのが OpenClawZeroClaw です。それぞれの特徴と使い分けを見てみましょう。

1.1. OpenClaw:巨大なエコシステムを持つパイオニア

OpenClawは、Telegram、WhatsApp、Slackなどの多様なチャネルから指示を受け取り、ローカルPC上でファイル操作やブラウザ操作を自律的に行うAIエージェントの火付け役です。

1.2. ZeroClaw:極限まで最適化されたRust製ランタイム

ZeroClawは、OpenClawのインフラを再定義する形で登場した、100% Rust製の軽量ランタイムです。

1.3. 📊 比較まとめ

比較項目 OpenClaw ZeroClaw
開発言語 / 基盤 複数言語・大規模コンポーネント 100% Rust
リソース消費 比較的高め 非常に低い(軽量・省メモリ)
拡張エコシステム 最大級(ClawHub経由で多数のスキル) 必要十分なツールに厳選
セキュリティアプローチ コミュニティによる事後対策が進行中 初期設計から堅牢・最小権限に親和性
ターゲット層 多機能な万能AIアシスタントを求める層 パフォーマンスと安全性を重視する開発者

今回は、よりセキュアで軽量な ZeroClaw を採用し、WSL2のWindowsファイルシステムから完全に切り離された安全なサンドボックス環境を構築します。

2. なぜ OpenRouter と DeepSeek の組み合わせなのか?

今回の環境構築では、ZeroClawの頭脳となるAIプロバイダーに OpenRouter、利用するモデルに DeepSeek を採用しています。自律型AIエージェントを実運用する上で、この組み合わせが現在最も理にかなっている理由を解説します。

2.1. OpenRouter:単一APIで世界中のモデルへアクセス

OpenRouterは、OpenAI、Anthropic、Google、そして多数のオープンソースモデルなど、世界中のあらゆるLLMに「単一のAPIエンドポイント」からアクセスできる統合プラットフォームです。

2.2. DeepSeek-V3.2:破壊的コストパフォーマンスとトップクラスの推論性能

DeepSeekは、現在AI業界で最も注目を集めているオープンウェイトモデルです。最新バージョンの DeepSeek-V3.2 は、独自の「DeepSeek Sparse Attention(DSA)」を採用することで長文処理(最大128Kコンテキスト)の効率を劇的に向上させています。大規模な強化学習によって推論(思考プロセス)やエージェントタスクに特化したバリアント(V3.2-Speciale など)も存在し、そのコーディング能力や論理的思考力は、Gemini 3.0 Proなどの最新のクローズドな最上位モデルに匹敵する性能を誇ります。

エージェント運用コストの劇的な削減: 自律型AIエージェントは、1つのタスクを完了させるために「計画の立案 → ツールの実行 → 結果の検証 → 再計画」というループを何度も回します。つまり、裏側で大量のAPI呼び出しが発生します。DeepSeek-V3.2は他社のハイエンドモデルと比較してAPI利用料が圧倒的に安価(数十分の一のコスト)なため、エージェントを常駐させて日常的に使い倒しても、ランニングコストを劇的に抑えることができます。

3. 実行サンプル

4. 🛠️ 構築実践:WSL2 + ZeroClaw 環境構築手順書(Brave常駐 + agent_browser対応版)

以下は、ZeroClawをWSL2上で安全に稼働させるための具体的なセットアップ手順です。

構成: Ubuntu 24.04(zeroclaw)/ Brave ブラウザ(WSL2)/ Telegram / OpenRouter (DeepSeek)

4.1. CDP 接続の構成概要

ZeroClaw(WSL2)から同一WSL2内で常駐している Brave(CDP:9222)に接続します。

graph TD
    subgraph WSL2["WSL2環境"]
        ZeroClaw["ZeroClaw"]
        Brave["Brave ブラウザ<br/>(--remote-debugging-port=9222)"]

        ZeroClaw -- "CDP接続<br/>127.0.0.1:9222" --> Brave
    end

4.2. Step 1: WSL2 に Ubuntu 24.04 をインストール(イメージ名: zeroclaw)

PowerShell(管理者)で実行します:

wsl --install -d Ubuntu-24.04 --name zeroclaw

インストール後、Ubuntu のユーザー名とパスワードを設定します。

4.3. Step 2: システムパッケージの準備(初期ユーザーで実行)

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential pkg-config curl git

4.4. Step 3: zcagent ユーザーの作成

ZeroClaw を sudo 権限のない専用ユーザーで動かします:

sudo useradd -m -s /bin/bash zcagent
sudo passwd zcagent

zcagentapt のみ sudo 権限を付与します:

sudo visudo -f /etc/sudoers.d/zcagent

以下の内容を入力して保存します:

zcagent ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get

設定確認:

sudo -l -U zcagent
# apt と apt-get のみ表示されればOK

4.5. Step 4: wsl.conf の設定(デフォルトユーザーを zcagent に)

sudo nano /etc/wsl.conf
[boot]
systemd=true

[user]
default=zcagent

[automount]
enabled=false
mountFsTab=false

[interop]
enabled=false
appendWindowsPath=false

WSL を再起動します(PowerShell):

wsl --shutdown
wsl -d zeroclaw

再起動後、zcagent でログインされていることを確認します:

whoami
# zcagent と表示されればOK

4.6. Step 4.5: Windows ドライブのアンマウント(systemd)

1から構築する場合は、Step 4 の直後にこの設定を行うと、以降の作業で Windows ドライブがマウントされたままになるリスクがなくなります。

WSL2 では wsl.confautomount=false が効かないことがあるため、systemd サービスで起動直後に強制アンマウントします。

sudo nano /etc/systemd/system/unmount-windows-drives.service
[Unit]
Description=Unmount Windows drives from WSL2
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'umount /mnt/c /mnt/d /mnt/e /mnt/f /mnt/g 2>/dev/null; rmdir /mnt/c /mnt/d /mnt/e /mnt/f /mnt/g 2>/dev/null; true'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

サービスを有効化します:

sudo systemctl enable unmount-windows-drives.service
sudo systemctl start unmount-windows-drives.service

動作確認:

ls /mnt/
# wsl と wslg のみ表示されれば成功

以降、WSL を再起動するたびに Windows ドライブは自動でアンマウントされます。

4.7. Step 5: Telegram Bot の事前準備

オンボーディング前に BotFather で Bot を作成しておきます:

  1. Telegram で @BotFather を検索して開く
  2. /newbot を送信し、表示名とユーザー名(末尾が bot)を入力
  3. 発行された API トークンをコピーしておく

4.8. Step 6: ZeroClaw のインストール(zcagent ユーザーで)

curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash

以下の通り回答します:

Install Linux build dependencies (toolchain/pkg-config/git/curl)? [Y/n] Y
Run a separate prebuild before install? [Y/n] Y
Install zeroclaw into cargo bin now? [Y/n] Y
Run onboarding after install? [y/N] y
Use interactive onboarding? [Y/n] Y
Proceed with this install plan? [Y/n] Y

ビルドに約4〜5分かかります。

4.9. Step 7: オンボーディング(ウィザード)

ビルド完了後、オンボーディングウィザードが自動起動します:

項目 選択・入力内容
ワークスペース Y(デフォルト)
AI プロバイダー openrouter を選択し sk-or-... を入力
モデル deepseek/deepseek-v3.2 など任意
チャンネル Telegram を選択し BotFather のトークンを入力
Tool Mode Sovereign (local only)(デフォルト)
暗号化シークレット Y
Memory バックエンド SQLite with Vector Search(推奨)
会話の自動保存 Y
コミュニケーションスタイル Technical & detailed(推奨)
Tunnel none
サービス登録 Y
チャンネル起動 Y

4.10. Step 8: Telegram ユーザー ID の許可リスト登録

Bot に初めてメッセージを送ると以下のように表示されます:

This bot requires operator approval.
Copy this command to operator terminal:
zeroclaw channel bind-telegram <YOUR_TELEGRAM_USER_ID>

別ターミナルで以下を実行します:

zeroclaw channel bind-telegram <YOUR_TELEGRAM_USER_ID>

config.toml のパーミッションを修正します(警告対応):

chmod 600 ~/.zeroclaw/config.toml

4.11. Step 9: プロセスの競合を解消してチャンネルを再起動

オンボーディング時に起動したプロセスと競合するため、一度すべて停止してから再起動します:

# 全プロセスを停止
pkill -f zeroclaw

# プロセスが残っていないか確認
ps aux | grep zeroclaw

# チャンネルを起動
zeroclaw channel start

Telegram Bot にメッセージを送って応答が返ってきたら動作確認完了です:

Hello, ZeroClaw!

4.12. Step 10: config.toml の修正(ブラウザ・コスト管理)

ここをagent_browser 前提に修正します(今回のポイント)。

nano ~/.zeroclaw/config.toml

4.12.1. Telegram設定の修正(割り込み有効化)

interrupt_on_new_message は Telegram の設定項目のため、[channels_config.telegram] セクション内に追記します。

[channels_config.telegram]
# (既存の設定...)
interrupt_on_new_message = true

4.12.2. ブラウザ設定(agent_browser を使用)

[browser]
enabled = true
allowed_domains = ["*"]
backend = "agent_browser"
native_headless = false
native_webdriver_url = "http://127.0.0.1:9222"

編集後、いったんは手動でチャンネル起動してOKです(次のStep 11でsystemd化します)。

4.12.3. HTTP リクエスト有効化

[http_request]
enabled = true
allowed_domains = ["*"]

4.12.4. コスト管理の有効化

[cost]
enabled = true
daily_limit_usd = 1.0
monthly_limit_usd = 10.0
warn_at_percent = 80
allow_override = false

4.12.5. autonomy の allowed_commands を最小化

[autonomy]
allowed_commands = [
    "ls",
    "cat",
    "grep",
    "find",
    "echo",
    "pwd",
    "wc",
    "head",
    "tail",
    "date",
    "curl",
]

4.12.6. autonomy の auto_approve に file_write を追加

auto_approve = [
    "file_read",
    "memory_recall",
    "file_write",
]

4.13. Step 11: zeroclaw channel start の自動起動設定(systemd)

このStepは概ねそのまま使えます(zeroclawは User=zcagent で起動されます)。

※以降、config.toml編集時はサービス停止→編集→再起動、に揃えると事故が減ります。

ユーザー: sudo 権限のある初期ユーザーで実施

WSL2 起動時に zeroclaw channel start が自動的に実行されるよう、systemd ユーザーサービスとして登録します。zcagent の ~/.cargo/bin に zeroclaw バイナリがあるため、サービスは zcagent ユーザーとして動作させます。

4.13.1. サービスファイルの作成

sudo nano /etc/systemd/system/zeroclaw-channel.service

以下の内容を入力して保存します:

[Unit]
Description=ZeroClaw Channel Server
After=network-online.target brave-cdp.service
Wants=network-online.target
Requires=brave-cdp.service

[Service]
Type=simple
User=zcagent
Environment="HOME=/home/zcagent"
Environment="PATH=/home/zcagent/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
WorkingDirectory=/home/zcagent
ExecStart=/home/zcagent/.cargo/bin/zeroclaw channel start
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

4.13.2. サービスを有効化・起動

sudo systemctl daemon-reload
sudo systemctl enable zeroclaw-channel.service
sudo systemctl start zeroclaw-channel.service

4.13.3. 動作確認

# サービスの状態確認
sudo systemctl status zeroclaw-channel.service

# ログの確認
sudo journalctl -u zeroclaw-channel.service -f

以下のように表示されれば成功です:

● zeroclaw-channel.service - ZeroClaw Channel Server
     Loaded: loaded (/etc/systemd/system/zeroclaw-channel.service; enabled)
     Active: active (running)

4.13.4. サービスの操作コマンド

# 停止
sudo systemctl stop zeroclaw-channel.service

# 再起動
sudo systemctl restart zeroclaw-channel.service

# 自動起動を無効化
sudo systemctl disable zeroclaw-channel.service
注意

zeroclaw channel start を手動で起動したままサービスも起動するとプロセスが競合します。手動起動している場合は先に pkill -f zeroclaw で停止してからサービスを起動してください。

4.14. Step 12: Brave ブラウザ(CDP)の設定(systemd常駐化)

4.14.1. Brave ブラウザのインストール(WSL2)

sudo可能ユーザーで実施

# GPG キーの追加
sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg \
  https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg

# リポジトリの追加
echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] \
  https://brave-browser-apt-release.s3.brave.com/ stable main" \
  | sudo tee /etc/apt/sources.list.d/brave-browser-release.list

# インストール
sudo apt update && sudo apt install -y brave-browser

4.14.2. 日本語フォントのインストール

sudo apt install -y fonts-noto-cjk

4.14.3. Brave を systemd で常駐起動(CDP:9222)

sudo可能ユーザーで作業します。

sudo nano /etc/systemd/system/brave-cdp.service

以下を保存します(User=zcagent で実行、ポートは9222固定)。

[Unit]
Description=Brave Browser CDP Server
After=network.target

[Service]
Type=simple
User=zcagent
Environment="HOME=/home/zcagent"
WorkingDirectory=/home/zcagent
ExecStart=/usr/bin/brave-browser --no-sandbox --disable-gpu --password-store=basic --remote-debugging-port=9222 --remote-allow-origins=* --user-data-dir=/home/zcagent/.brave-debug --headless=new about:blank
Restart=always
RestartSec=3s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

有効化・起動します。

sudo systemctl daemon-reload
sudo systemctl enable brave-cdp.service
sudo systemctl start brave-cdp.service

CDPの疎通確認(zcagentでOK):

curl -s http://127.0.0.1:9222/json/version | python3 -m json.tool

4.15. Step 13: agent-browser のインストール

4.15.1. Node.js のインストール(WSL2)

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

4.15.2. agent-browser のインストール

ユーザー:

sudo npm install -g agent-browser
agent-browser --version

4.15.3. agent-browser の CDP 設定

agent-browser get title などが動くよう、CDPポートを9222に固定します。

mkdir -p ~/.agent-browser
cat > ~/.agent-browser/config.json << 'EOF'
{
  "cdp": 9222,
  "autoConnect": true
}
EOF

4.16. Step 14: サービス起動順(推奨)

Brave→zeroclaw の順で起動すると、zeroclawが browser を使う際にCDPが既に開いていて安定します。

sudo systemctl restart brave-cdp.service
sudo systemctl restart zeroclaw-channel.service

4.17. 動作確認(Telegram)

Telegram Bot に送信:

ブラウザで https://www.yahoo.co.jp を開いてタイトルを教えて

もし http_request フォールバックが続く場合は、次を貼ってください(切り分け最短)。

curl -s http://127.0.0.1:9222/json/version | python3 -m json.tool
sudo journalctl -u zeroclaw-channel.service -n 200 --no-pager

4.18. トラブルシューティング(CDP / ブラウザ)

症状 原因 対処
curl http://127.0.0.1:9222/json/version が失敗 Brave(brave-cdp.service)が落ちている sudo systemctl status brave-cdp.servicesudo journalctl -u brave-cdp.service -n 200 を確認
Brave 起動時に --no-sandbox エラー root ユーザーで実行している サービスは User=zcagent で実行されているか確認
get_title が使えず http_request にフォールバック agent_browser 未設定または CDP 未接続 config.tomlbackend = "agent_browser"、および agent-browser の導入と ~/.agent-browser/config.json を確認
WSL2 再起動後に接続できない Brave が自動起動していない brave-cdp.serviceenabledsudo systemctl is-enabled brave-cdp.service で確認

4.19. セキュリティ対策まとめ

対策 実装方法
Windows ドライブ遮断 systemd サービスで起動時に強制アンマウント
Windows プロセス呼び出し禁止 wsl.confinterop=false
Windows PATH の引き継ぎ禁止 wsl.confappendWindowsPath=false
非特権ユーザー実行 sudo 権限なしの zcagent ユーザーで動作
apt のみ sudo 許可 sudoers.d/zcagentaptapt-get に限定
API キー暗号化 オンボーディングで暗号化シークレットを有効化
config.toml のパーミッション chmod 600 で所有者のみ読み書き可能に
コマンド実行制限 autonomy.allowed_commands を最小限に絞る
Telegram 認証 bind-telegram で登録ユーザーのみ受け付け
ゲートウェイ公開制限 gateway.host=127.0.0.1 でローカルのみ受け付け
API コスト上限 cost.daily_limit_usd / monthly_limit_usd で制限
監査ログ security.audit.enabled=true で操作を記録

4.20. WSL の自動起動設定

この WSL のイメージを Windows PC 起動時に自動的に起動する方法です。Windows のタスクスケジューラを使うのが最も確実です。PowerShell で設定する手順を紹介します。

4.20.1. 設定手順(PowerShell 管理者)

以下のコマンドを PowerShell(管理者) で実行すると、ログオン時に zeroclaw が自動起動します:

$action = New-ScheduledTaskAction `
  -Execute "wsl.exe" `
  -Argument "-d zeroclaw --exec dbus-launch true"

$trigger = New-ScheduledTaskTrigger -AtLogOn

$settings = New-ScheduledTaskSettingsSet `
  -ExecutionTimeLimit 0 `
  -AllowStartIfOnBatteries `
  -DontStopIfGoingOnBatteries

Register-ScheduledTask `
  -TaskName "WSL2 zeroclaw AutoStart" `
  -Action $action `
  -Trigger $trigger `
  -Settings $settings `
  -RunLevel Highest `
  -Force

4.20.2. 動作確認

# タスクが登録されたか確認
Get-ScheduledTask -TaskName "WSL2 zeroclaw AutoStart"

# 手動で今すぐ起動テスト
Start-ScheduledTask -TaskName "WSL2 zeroclaw AutoStart"

# WSL2 が動いているか確認
wsl -l -v

zeroclawSTATERunning になっていれば成功です。

4.20.3. 再起動手順

WSL2 zeroclaw を再起動する場合は、PowerShell(管理者) で次を順に実行します:

wsl --shutdown
Start-ScheduledTask -TaskName "WSL2 zeroclaw AutoStart"

注意

公式リポジトリは https://github.com/zeroclaw-labs/zeroclaw のみです。zeroclaw.orgzeroclaw.net などの非公式サイトからバイナリを取得しないようにしてください。


5. 今後の課題:AIモデルの手動・自動切り替え(ルーティング)の検証

強固なZeroClaw環境が構築できたら、次に直面する課題は「コストとパフォーマンスの最適化」です。前述の通りDeepSeekは非常に優秀ですが、現状は単一のモデル(例:deepseek-v3.2)での固定運用となっています。複雑なコード生成には最上位モデルを、簡単なファイル検索にはより軽量なモデルを、といったようにタスクの難易度に応じてモデルを柔軟に使い分ける仕組みが必要になります。

ZeroClawではconfig.toml内に query_classification や model_routes といった、プロンプトの意図分類およびモデルの自動ルーティングに関する設定項目が存在します。しかし現状の当環境では、これらを用いた自動切り替えがうまく機能しておらず、実運用レベルでの検証ができていない状態です。

そのため、OpenRouterの強みを活かし、モデルの動的切り替えの実装・検証していく予定です。

6. おわりに

この記事では、AIエージェントの2大巨頭であるOpenClawとZeroClawの比較、OpenRouterとDeepSeekを採用するメリット、そしてWSL2環境における極めてセキュアなZeroClawの構築手順について解説しました。権限の分離やWindowsドライブのアンマウントなど、実運用を見据えた構成は、今後AIに複雑なタスクを任せる上で必須の考え方となります。

7. FAQ

なぜ OpenClaw ではなく ZeroClaw を選?
主な理由は「リソース効率」と「ネイティブな安全性」です。ZeroClaw は Rust で書かれているため、WSL2 のような限られたリソース環境でも高速に動作し、メモリ消費も極めて少なくなっています。また、最小権限(Least Privilege)での運用を前提とした設計になっており、セキュリティを重視する開発者に適しています。
Windows ドライブをアンマウントするのはなぜですか?
エージェントが誤って(あるいは悪意のあるプロンプトによって)Windows 側の重要なファイル(C:\Users\... など)を削除・改ざんするリスクを物理的に遮断するためです。WSL2 内の隔離されたサンドボックス環境で完結させるための重要なセキュリティ対策です。
zcagent ユーザーに apt のみの sudo 権限を与えるのはなぜですか?
完全に sudo 権限を剥奪すると、エージェントが必要なパッケージをインストールできなくなり、利便性が著しく低下します。一方で、全権限を与えると危険なため、visudo で実行可能なコマンドを制限し、システム全体の破壊を防ぎつつ拡張性を確保しています。
agent_browser とは何ですか? 標準の HTTP リクエストと何が違いますか?
agent_browser は、実際のブラウザ(Brave)を操作するためのバックエンドです。単なる HTTP リクエスト(curl 等)では処理できない JavaScript の実行や、動的なコンテンツのスクレイピング、ログインが必要なサイトの操作を、人間がブラウザを使っているのと近い形で行うことができます。
Telegram Bot から「This bot requires operator approval」と言われました。
セキュリティ機能によるものです。ブログ内の Step 8 にある通り、コンソールで zeroclaw channel bind-telegram <ユーザーID> を実行し、あなたの Telegram アカウントを明示的に許可する必要があります。
コスト上限(daily_limit_usd)に達した後はどうなりますか?
設定された上限に達すると、ZeroClaw はそれ以上の API リクエストを拒否し、エージェントは動作を停止します。これにより、予期せぬループによる高額請求を防ぎます。上限を上げたい場合は config.tomlcost セクションを編集してください。今回はOpenRouterを利用しているため、OpenRouter
Windows を再起動しても ZeroClaw は自動で立ち上がりますか?
はい。Step 13 のタスクスケジューラ設定を行っていれば、Windows ログイン時にバックグラウンドで WSL2 と ZeroClaw サービスが自動起動します。