いまだ現役で使ってるTS-112ではopenclawが入れられないだろうということで超軽量のpicoclawを入れてDiscordと連携させてみた
geminiとやりとりしながら動作まで漕ぎ着けたので他の賢いAIならもっとスマートな方法を教えてくれるのかも、、
- 手元のPCでTS-112の実行ファイルを作成、SSHでアップロード
- picoclaw onboardでconfig.jsonを作成
- 必要な情報を追加してpicoclaw agentで動かしてみる
- picoclaw gatewayでdiscordで会話できるか確認
- picoclaw gatewayをTS-112起動時に動かすように変更
まずはpicoclaw( https://docs.picoclaw.io/ https://github.com/sipeed/picoclaw/blob/main/docs/project/README.ja.md )、TS-112で動くものをゲットする必要あり
pico clawをqnap nas ts-112にインストールしたいQNAP TS-112(Marvell Kirkwood / 32-bit ARMv5 世代 CPU、メモリ 256MB)への PicoClaw インストール手順と注意点について解説します。
PicoClaw は Go 言語で書かれた超軽量な AI アシスタント(実行時のメモリ消費 10MB 未満)のため、リソースが非常に限られた TS-112 でも動作する最適なツールです。
ただし、TS-112 の CPU は古めの ARMv5 (soft-float) アーキテクチャであるため、GitHub などで配布されている一般的な Linux ARM64 / ARMv7 用のビルド済みバイナリをそのまま実行すると
Illegal instructionエラーになります。PC 上で ARMv5 向けにクロスコンパイル して転送するのが確実で最も簡単な方法です。
1. PC側でのクロスコンパイル
NAS 上でコンパイルを行うとメモリ不足になるため、手元の PC(Windows/Mac/Linux)に Go 言語環境(Go 1.22 以降推奨)を用意してビルドします。
ターミナル(または PowerShell / Command Prompt)で以下を実行します。
# 1. リポジトリの取得 git clone https://github.com/sipeed/picoclaw.git cd picoclaw # 2. ARMv5向けにクロスコンパイル(CGO無効化 & GOARM=5 を指定) CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -o picoclaw .
GOARM=5を指定することで、TS-112 の CPU(Marvell Kirkwood)に対応したバイナリが生成されます。
2. QNAP TS-112 へのバイナリ転送
生成された
picoclawバイナリを SCP や WinSCP、または Win 共有(SAMBA)経由で TS-112 の永続ディレクトリに配置します。# 例: SCPでNASのパブリックフォルダに転送 scp picoclaw admin@<NASのIPアドレス>:/share/HDA_DATA/Public/(※ ストレージ構成により
/share/CACHEDEV1_DATA/Public/や/share/HDA_DATA/Public/などパスが異なる場合があります)
3. TS-112 での初期設定と実行
SSH で TS-112 にログインして実行権限を付与し、初期セットアップを行います。
# SSHでログイン ssh admin@<NASのIPアドレス> # 転送先に移動 cd /share/HDA_DATA/Public/ # 実行権限の付与 chmod +x picoclaw # 初期化(オンボーディング) ./picoclaw onboard画面の指示に従い、利用する LLM プロバイダ(OpenRouter、DeepSeek、OpenAI、Anthropic 等)の API キーやモデル名を入力・設定します。
注意(TLS/SSLルート証明書について): QTS 4.3.3 等の古い QNAP OS では、LLM 側の API 通信時に SSL 証明書エラーが発生することがあります。エラーが出た場合は Entware を導入し、
opkg install ca-certificatesで最新のルート証明書をインストールしてください。
4. バックグラウンド永続化と自動起動
SSH セッションを切断しても動作し続けるよう、バックグラウンド実行を設定します。
簡易起動(nohup を使用)
nohup ./picoclaw agent > picoclaw.log 2>&1 &NAS 再起動時の自動起動(Entware 等の init スクリプト)
QNAP の
/opt/etc/init.d/(Entware 導入時)に起動スクリプトを配置することで、NAS 起動時に自動で立ち上がるように設定できます。
geminiのいうとおりMac 上にコンパイル環境を作ってできた実行ファイルをsshでts-112へコピー。念の為QNAP TS-112 に Entware をインストールして ca-certificates などのパッケージを入れて、PUBLICフォルダを提示してきた理由などを確かめつつ、永続的に存在する場所へコピーしました。ここまではまぁまぁ想定内の手間
パブリックフォルダを例に挙げたのは、PC(Windows/Mac)からファイル共有(SAMBA)経由でファイルを転送する際に、最初から存在するアクセスしやすい場所だからです。
書き込み・実行権限があり、HDD上に保存される場所であれば、お好みのフォルダに配置して構いません。
おすすめの配置場所
1. Entware の実行ファイルフォルダ(一番おすすめ)
Entware を導入済みであれば、
/opt/bin/に配置するのが最もスマートです。 ここに置くと環境変数(PATH)が通るため、どのディレクトリに移動してもコマンド名だけでpicoclawを呼び出せるようになります。# 例: パブリック等に置いたバイナリを /opt/bin/ に移動 mv /share/HDA_DATA/Public/picoclaw /opt/bin/ chmod +x /opt/bin/picoclaw # これでどの場所にいても直接起動できます picoclaw onboard2. 自分で作成した任意の共有フォルダ
QTS のコントロールパネルで作成した共有フォルダ(例:
AppsやToolsなど)の中でも問題ありません。
- 例:
/share/HDA_DATA/Tools/- 例:
/share/CACHEDEV1_DATA/Apps/
⚠️ QNAP TS-112 での注意点(保存してはいけない場所)
QNAP の OS (QTS) は、システム根幹部分が RAM(メモリ)上に展開されて動作する仕組みになっています。そのため、以下の場所にファイルを置くと、NAS を再起動した際にファイルが消えてしまいます。
- ❌
/root/や/tmp/- ❌
/usr/bin/や/bin/などの OS 直下システムフォルダバイナリや設定ファイルは、必ず
/share/...(HDD上の領域)または/opt/...(Entwareの領域)の中に保存・配置してください。
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -o picoclaw . でコンパイルできるのですか
はい、Go 言語がインストールされている PC 上であれば、そのコマンドで QNAP TS-112(ARMv5)向けにコンパイルできます。
Go 言語は標準で強力なクロスコンパイル機能を備えているため、C 言語のような複雑なクロスコンパイル環境(ツールチェーン)を整えなくても、環境変数を指定するだけで異なる OS / CPU 向けのバイナリを生成できます。
コマンドの意味と動く理由
指定項目 役割・理由 CGO_ENABLED=0C 言語依存を完全に切り離し、Pure Go(完全静的バイナリ) としてコンパイルします。これにより、TS-112 側の glibc などのライブラリバージョンが古くても動作するようになります。 GOOS=linuxターゲット OS を Linux に指定します。 GOARCH=armターゲット CPU アーキテクチャを 32-bit ARM に指定します。 GOARM=5最重要ポイントです。 ARMv5(ソフトフロート/FPUなし)を指定します。TS-112 に搭載されている CPU(Marvell Kirkwood)は FPU(浮動小数点演算ユニット)を持たない古めの CPU のため、この指定がないと実行時に Illegal instructionエラーで落ちます。
コンパイル時の注意点(ハマりどころ)
もし実行時にエラーが出る場合は、以下の 2 点を確認してください。
1.
main.goの位置(リポジトリ構造)リポジトリの直下に
main.goがない構成(cmd/picoclaw/main.goなどになっている場合)は、末尾の.をパスに変更する必要があります。# ルート直下に main.go がない場合 CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -o picoclaw ./cmd/picoclaw2. コンパイル結果の確認
PC 上でビルドが完了したら、生成されたファイルが本当に ARMv5 用になっているか確認できます(Linux / macOS の場合)。
file picoclaw # 出力例: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked...
ARM, EABI5やstatically linkedと表示されていれば、TS-112 で動くバイナリの完成です。
package github.com/sipeed/picoclaw/cmd/picoclaw imports github.com/sipeed/picoclaw/cmd/picoclaw/internal/gateway imports github.com/sipeed/picoclaw/pkg/gateway imports github.com/sipeed/picoclaw/pkg/channels/matrix imports maunium.net/go/mautrix/crypto/cryptohelper imports maunium.net/go/mautrix/crypto imports maunium.net/go/mautrix/crypto/libolm: build constraints exclude all Go files
このエラーは、PicoClaw に含まれる Matrix(チャットツール)連携機能の暗号化ライブラリ(
libolm)が C 言語のライブラリ(CGO)に依存していること が原因です。
CGO_ENABLED=0を指定してビルドしたため、CGO を必要とするlibolm内の Go ファイルがすべて対象外となり、「ビルド対象のファイルが存在しない」というエラーが発生しました。macOS 上で ARMv5 向けの C クロスコンパイラを用意するのは非常に煩雑なため、Matrix 機能を使わない場合はソースコードから Matrix チャンネルの読み込みを外してビルドする のが最も確実で簡単な解決策です。
解決手順:Matrix の読み込みを無効化してビルドする
1. ソースコードのインポート文をコメントアウト
PC 上でクローンした
picoclawのフォルダを開き、Matrix を読み込んでいるファイルをテキストエディタで開きます。主に以下のファイル(または
pkg/channels/配下のファイル)に記述があります。
pkg/channels/all/all.goまたはpkg/gateway/gateway.go(またはcmd/picoclaw/main.go)該当ファイル内の Matrix に関連するインポート行をスラッシュ(
//)でコメントアウトします。// 変更前 import ( "github.com/sipeed/picoclaw/pkg/channels/telegram" "github.com/sipeed/picoclaw/pkg/channels/discord" "github.com/sipeed/picoclaw/pkg/channels/matrix" // ← これをコメントアウト ) // 変更後 import ( "github.com/sipeed/picoclaw/pkg/channels/telegram" "github.com/sipeed/picoclaw/pkg/channels/discord" // "github.com/sipeed/picoclaw/pkg/channels/matrix" )※ もし
matrixの初期化コード(matrix.New(...)など)が同じファイル内にある場合は、そちらも併せてコメントアウトしてください。
2. 再度クロスコンパイルを実行
コメントアウト後、ターミナルで再度ビルドコマンドを実行します。
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -o picoclaw ./cmd/picoclawCGO 依存の
libolmが読み込まれなくなるため、エラーなくpicoclawバイナリが生成されます。
(参考)ビルドタグが用意されている場合
PicoClaw のバージョンによっては、ビルドタグで回避できる場合もあります。先に以下のコマンドを試すことも可能です。
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -tags nomatrix -o picoclaw ./cmd/picoclaw
この時はnohup入れてなかった(後から入れたので)。Entware-stdはts-112のAppCenterの歯車からアプリリポジトリタブを選んで、追加画面のURLにhttps://www.myqnap.org/repo.xml をいれてOKして Entware-std をインストールすれば準備完了
QNAP TS-112 の標準環境(BusyBox)には
nohupコマンドが搭載されていないため、そのエラーが発生します。対処法は 「① Entware で nohup を追加インストールする」 か 「② nohup なしでバックグラウンド実行する」 の 2 つがあります。
方法 1:Entware で
nohupをインストールする(推奨)すでに Entware を導入済みですので、以下のコマンドで
nohupを追加できます。opkg update opkg install coreutils-nohupインストール完了後、再度元のコマンドを実行してください。
GODEBUG=http2client=0 nohup ./picoclaw agent > picoclaw.log 2>&1 &
方法 2:
nohupを使わずにバックグラウンド実行する(追加不要)何もインストールせずに、シェル(サブシェル)の機能だけで SSH を切断しても止めないように起動する方法です。
(GODEBUG=http2client=0 ./picoclaw agent > picoclaw.log 2>&1 &)
- コマンド全体をカッコ
()で囲んで末尾に&をつけることで、現在の SSH セッションからプロセスを切り離してバックグラウンド実行します。
どちらの方法でも実行後、
ps | grep picoclawでプロセスが起動していれば成功です。
この後config.jsonをgeminiにゼロから作ってもらおうとしてめちゃくちゃ時間を浪費した。それとpicoclawで使うAIをgeminiにしようとした事もめちゃくちゃ後悔してる。config.jsonはpicoclaw onboardで出てくるものの行数を恐れず自分でいじったほうが多分早かったしpicoclawおすすめのopenrouterにしておけばよかった
次にやったのはdiscordのtokenとopenrouterのkeyを取得すること。この辺の情報はあちこちに転がっているのでそれをみながらスムーズに取得できた
で~/config.jsonの完成版
{
"agents": {
"defaults": {
"provider": "openrouter",
"model_name": "openrouter-auto"
}
},
"channel_list": {
"discord": {
"enabled": true,
"type": "discord",
"settings": {
"token": "YOUR_DISCORD_BOT_TOKEN"
}
}
},
"model_list": [
{
"model_name": "openrouter-auto",
"provider": "openrouter",
"model": "auto",
"api_key": "YOUR_OPENROUTER_API_KEY"
}
]
}
これを既存のconfig.jsonを置き換えてpicoclawを起動すると、全部入りのconfig.jsonと.security.ymlに変換してくれる。ちゃんと動いているか確認するには
./picoclaw agent -m "hello"
とかで、答えが返ってくればOK
次は自動起動
ts-112でpicoclawを起動時に動かすには
QNAP TS-112(QTS OS)は一般的な Linux と異なりsystemdや標準のrc.localが再起動時にリセットされる仕様になっています。そのため、TS-112 で PicoClaw を OS 起動時に自動実行させるには、「ダミー QPKG(App Center 疑似登録)方式」 を使うのが最も確実で安定した方法です。この方法ならファームウェア更新後も設定が保持されます。
以下に設定の手順をまとめました。
設定手順(ダミー QPKG 方式)
1. 起動スクリプトの作成
SSH で TS-112 にログインし、PicoClaw が置いてあるディレクトリ(例:
/share/HDA_DATA/picoclawまたは/share/Public/picoclaw)に起動・停止制御用のスクリプトを作成します。ここでは例として
/share/HDA_DATA/picoclawに設置する手順で説明します。# PicoClaw のディレクトリへ移動 cd /share/HDA_DATA/picoclaw # 起動スクリプトを作成 vi picoclaw_service.sh
picoclaw_service.shの内容を以下のように記述します:#!/bin/sh CONF=/etc/config/qpkg.conf QPKG_NAME="PicoClaw" QPKG_DIR=$(/sbin/getcfg $QPKG_NAME Install_Path -f $CONF) case "$1" in start) ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -f $CONF) if [ "$ENABLED" != "TRUE" ]; then echo "$QPKG_NAME is disabled." exit 0 fi # 既に動作中か確認 if pidof picoclaw > /dev/null; then echo "$QPKG_NAME is already running." exit 0 fi # バックグラウンドで PicoClaw を起動 cd "$QPKG_DIR" nohup ./picoclaw > "$QPKG_DIR/picoclaw.log" 2>&1 & echo "$QPKG_NAME started." ;; stop) echo "Stopping $QPKG_NAME..." killall picoclaw 2>/dev/null ;; restart) $0 stop sleep 2 $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0保存したら、実行権限を付与します:
chmod +x picoclaw_service.sh
2. 手動での動作テスト
作成したスクリプトで起動・停止ができるか確認します。
# 起動テスト ./picoclaw_service.sh start # ログで正常起動したか確認 cat picoclaw.log # 停止テスト ./picoclaw_service.sh stop
3. QTS の起動タスク(qpkg.conf)に登録
QNAP に「PicoClaw」をシステムアプリとして認識させ、起動時にスクリプトを呼ばせます。
/etc/config/qpkg.confを編集します:vi /etc/config/qpkg.confファイルの最下部に以下のブロックを追加して保存します:
[PicoClaw] Name = PicoClaw Class = null Status = complete Enable = TRUE Date = 2026-08-01 Shell = /share/HDA_DATA/picoclaw/picoclaw_service.sh Install_Path = /share/HDA_DATA/picoclaw※
ShellとInstall_Pathのパスは、実際の PicoClaw 設置場所に書き換えてください(1 ベイモデルの TS-112 では通常/share/HDA_DATA/...です)。
4. 動作確認
TS-112 を再起動し、自動起動するか確認します。
reboot再起動完了後、SSH でログインしてプロセスが走っているかチェックします:
ps | grep picoclaw
nohup ./picoclawが表示されていれば、無事に自動起動設定は完了です!
補足(TS-112 での注意点) TS-112 は CPU(Marvell 1.2GHz)とメモリ(256MB)が限られているため、起動直後は QTS 本体の初期化で負荷が高くなります。PicoClaw がうまく起動しない場合は、
picoclaw_service.shのstart処理内にsleep 10などを入れて少し待ってから起動するように調整してみてください。
TS-112の自動起動はrootで動くらしいけど、/rootはファイルが残らないので設定ファイルの置き場としてはふさわしくない。agents.mdやSOUL.mdなどを編集して保持するなら、環境変数PICOCLAW_CONFIGとPICOCLAW_HOMEを設定してconfig.jsonの中にも.picoclawフォルダの置き場設定する必要がある
ついでにconfig.jsonの中のagents-defaults-workspaceのパスもpicoclawと同じフォルダを指すように変更する必要あり
TS-112の自動起動は PICOCLAW_CONFIGとPICOCLAW_HOMEという環境変数セットすることも考えて自動起動させ方を教えて
PICOCLAW_CONFIGとPICOCLAW_HOMEの環境変数を正しく設定し、実行ファイルのあるディレクトリを指す方針は完璧です。QNAP TS-112 などの BusyBox 環境では
nohupコマンドが同梱されていないケースが多いため、「nohupがあれば使い、無ければtrapで HUP シグナルを無視してバックグラウンド実行する」 という自動判別型の起動スクリプトを作成するのが最も確実です。以下に、環境変数対応および
nohupあり/なし 両方の環境で動作する自動起動の手順をまとめました。1
配置と構成の確認
/share/HDA_DATA/picoclaw にファイルをまとめます
以下のように実行ファイルと設定ファイルが同じディレクトリに配置されていることを確認してください。
Plaintext
/share/HDA_DATA/picoclaw/ ├── picoclaw (実行ファイル) └── config.json (設定ファイル)2
起動スクリプトの作成
環境変数と nohup 自動判別ロジックを含めたスクリプトを作成します
SSH で TS-112 にログインし、
/share/HDA_DATA/picoclaw/picoclaw_service.shを作成します。Bash
cd /share/HDA_DATA/picoclaw vi picoclaw_service.sh以下の内容を貼り付けて保存します:
Bash
#!/bin/sh CONF=/etc/config/qpkg.conf QPKG_NAME="PicoClaw" QPKG_DIR=$(/sbin/getcfg $QPKG_NAME Install_Path -f $CONF) # 環境変数の明示的セット export PICOCLAW_HOME="$QPKG_DIR" export PICOCLAW_CONFIG="$QPKG_DIR/config.json" case "$1" in start) ENABLED=$(/sbin/getcfg $QPKG_NAME Enable -u -f $CONF) if [ "$ENABLED" != "TRUE" ]; then echo "$QPKG_NAME is disabled." exit 0 fi # 二重起動チェック if pidof picoclaw > /dev/null; then echo "$QPKG_NAME is already running." exit 0 fi cd "$QPKG_DIR" # nohup の有無に応じて起動処理を分岐 if command -v nohup >/dev/null 2>&1; then # 【nohup がある場合】 nohup ./picoclaw gateway > "$QPKG_DIR/picoclaw.log" 2>&1 & else # 【nohup がない場合】SIGHUPを無視するサブシェルでバックグラウンド実行 (trap '' HUP; ./picoclaw gateway > "$QPKG_DIR/picoclaw.log" 2>&1 &) fi echo "$QPKG_NAME started." ;; stop) echo "Stopping $QPKG_NAME..." killall picoclaw 2>/dev/null ;; restart) $0 stop sleep 2 $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0
nohupがない場合の仕組み:
(trap '' HUP; ... &)という記述により、親プロセス(スクリプト)が終了しても、PicoClaw に「ハングアップ(切断)信号」が届かなくなるため、nohupと同等の常駐動作が可能になります。3
権限付与と手動動作テスト
自動起動登録の前に手動で起動・停止をテストします
実行権限を付与し、実際にテストを行います。
Bash
# 実行権限の付与 chmod +x /share/HDA_DATA/picoclaw/picoclaw_service.sh # 手動起動テスト /share/HDA_DATA/picoclaw/picoclaw_service.sh start # プロセスが残っているか確認 ps | grep picoclaw # ログが出力され、環境変数が効いているか確認 cat /share/HDA_DATA/picoclaw/picoclaw.log # 停止テスト /share/HDA_DATA/picoclaw/picoclaw_service.sh stop4
qpkg.conf への自動起動登録
QNAP OS (QTS) の起動タスクに組み込みます
/etc/config/qpkg.confを編集します。Bash
vi /etc/config/qpkg.confファイルの末尾に以下のブロックを追加します。
Ini, TOML
[PicoClaw] Name = PicoClaw Class = null Status = complete Enable = TRUE Date = 2026-08-02 Shell = /share/HDA_DATA/picoclaw/picoclaw_service.sh Install_Path = /share/HDA_DATA/picoclawこれで設定は完了です。NAS 再起動時にも自動的に
picoclaw_service.sh startが呼び出され、環境変数を保持した状態で背景起動するようになります。
autorun.sh方式との違い気になったので
この方法はautorun.shに設定するより安定ですか
はい、ダミーQPKG方式(
qpkg.conf)の方がautorun.shよりもはるかに安定しており、間違いなくおすすめです。TS-112 を含む QNAP NAS において、
autorun.shではなくダミーQPKG方式を使うべき理由は主に 4 つ あります。ダミーQPKG方式が優れている 4 つの理由
1. HDD(/share)のマウントタイミング(★最大の理由)
autorun.shの問題: システム起動の「超初期段階」で実行されます。この時点ではまだハードディスク(/share/HDA_DATA)がマウントされておらず、PicoClaw のフォルダが存在しないため 「ファイルが見つかりません」エラーで起動に失敗する ことが頻繁に起こります(無理に動かすにはsleep 60などを入れてディスクが立ち上がるのを待つ泥臭い処理が必要です)。- ダミーQPKG方式: システムが HDD を完全に認識・マウントした後の安全なタイミングで実行されるため、確実にファイルを読み込むことができます。
2. 設定の安全性と手間の少なさ
autorun.shの問題: TS-112 でautorun.shを書き換えるには、隠されたフラッシュメモリ(DOM領域)を/tmp/configなどに手動でmountして書き換える必要があり、操作ミスで NAS が起動しなくなるリスクがあります。- ダミーQPKG方式: 通常のファイルシステム上にある
/etc/config/qpkg.confを 1 ファイル編集するだけなので安全です。3. ファームウェア更新時の耐久性
autorun.shの問題: QTS のファームウェアアップデートを行うと、フラッシュメモリ領域が初期化されてautorun.shの記述が消えてしまうことがあります。- ダミーQPKG方式:
/etc/config/qpkg.confは「インストール済みアプリ一覧」として保存されるため、アップデート後も設定が保持されます。4. 停止・再起動などの管理のしやすさ
- ダミーQPKG方式: スクリプトに
start/stop/restartの分岐を作っているため、設定変更時などに NAS 全体を再起動しなくても、コマンド一発(./picoclaw_service.sh restart)で PicoClaw だけを再起動・ログ確認できます。まとめ
autorun.shは「HDDマウント前に動かしたい極小のシステムスクリプト」向けの仕組みです。PicoClaw のように HDD 上の実行ファイルや
config.jsonを読み込んで動くアプリケーション にとっては、今回紹介した ダミーQPKG方式(qpkg.conf)が QNAP におけるベストプラクティス です。安心してお使いください!
ということで、自動起動まで完了
Discordでchatできてます。何をやってもらおうかな
参考サイト
https://lexia-hp.com/blog/sipeed-picoclaw-beginner-guide-10usd-ai-agent#h4331e7a99e
Discordのconfig.jsonに”allow_from”: [ “YOUR_DISCORD_ID” ]をつけたほうがよいらしい