Raspberry – gonta https://hiro-gear.com Sat, 25 Jul 2026 07:11:14 +0000 ja hourly 1 https://wordpress.org/?v=7.0.3 単なるテキスト検索からの脱却。「OKF対応」で進化したGraph RAGがAIに伝える立体的コンテキスト https://hiro-gear.com/2026/07/25/%e5%8d%98%e3%81%aa%e3%82%8b%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e6%a4%9c%e7%b4%a2%e3%81%8b%e3%82%89%e3%81%ae%e8%84%b1%e5%8d%b4%e3%80%82%e3%80%8cokf%e5%af%be%e5%bf%9c%e3%80%8d%e3%81%a7%e9%80%b2/ https://hiro-gear.com/2026/07/25/%e5%8d%98%e3%81%aa%e3%82%8b%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e6%a4%9c%e7%b4%a2%e3%81%8b%e3%82%89%e3%81%ae%e8%84%b1%e5%8d%b4%e3%80%82%e3%80%8cokf%e5%af%be%e5%bf%9c%e3%80%8d%e3%81%a7%e9%80%b2/#respond Sat, 25 Jul 2026 07:11:14 +0000 https://gonta.f5.si/2026/07/25/%e5%8d%98%e3%81%aa%e3%82%8b%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e6%a4%9c%e7%b4%a2%e3%81%8b%e3%82%89%e3%81%ae%e8%84%b1%e5%8d%b4%e3%80%82%e3%80%8cokf%e5%af%be%e5%bf%9c%e3%80%8d%e3%81%a7%e9%80%b2/ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true });

前回、Obsidianのデータを独立したRAGとしてMCP化し、あらゆるAIから横断検索できる「最強のマルチAI手帳」について解説しました。
今回は、そのアーキテクチャの次なる進化である「OKF(Open Knowledge Format)への対応」と「Graph RAG化」について深掘りします。

なぜ従来のRAGは「平面的」なのか?

一般的なRAGシステムでは、Markdownなどのテキストファイルを適当な長さ(チャンク)に分割してベクトル化し、AIに渡します。
しかし、これには大きな欠陥があります。AIは「検索にヒットしたテキストの断片」を受け取るだけで、「そのノートがどのプロジェクトに属しているのか」「どんな他のタスクと関連しているのか」といった『文脈の繋がり』を理解できないのです。

Google提唱の「OKF」を取り入れた解決策

そこで今回、Googleが提唱する「OKF(Open Knowledge Format)」の概念をObsidianの運用ルールに導入しました。
これは、情報を単なるテキストの羅列ではなく、「YAMLの構造化データ(メタデータ)」+「Markdown本文」として扱うアプローチです。

具体的には、Obsidianのノートの先頭にプロパティ(YAML)を持たせ、明示的にエッジ(関係性)を記述します。

---
parent: "[[AIエージェント開発プロジェクト]]"
type: "task"
---

Graph RAGがAIに伝える「立体的な知識」

裏側で動いている自作のインポーター(Watcher)を改修し、このYAMLフロントマターから parentrelated といったプロパティを抽出し、意味付きのエッジ(関係性の型) としてSQLite(Graph DB)に記録するようにしました。

そして、MCPサーバー経由でAIが検索を行った際、単にヒットしたテキストを返すだけでなく、以下のような「ナレッジグラフ構造(トポロジー)」を文字列の先頭にマッピングしてAIに渡します。

【ナレッジグラフ構造 (Knowledge Graph Topology)】
[現在のタスク] --(parent)--> [AIエージェント開発プロジェクト]
[現在のタスク] --(link)--> [関連技術メモ]

【コンテンツ詳細 (Content)】
...(ノート本文)...

AIが文脈を「理解」し始めた

この改修を行った結果、MCPを利用するAIエージェント(GonrasやAntigravity等)の推論能力が劇的に向上しました。
キーワードのマッチングだけでなく、「このタスクはあのプロジェクトの子タスクだから、全体のスケジュールに関わるな」といった、手帳内の立体的なつながり(Graph Topology)を認識した上で回答してくれるようになったのです。

単なる「AI×Obsidian」の連携から一歩進み、自分自身の脳内のリンク構造をそのままAIにインストールする。これこそが、次世代のパーソナルAIの最適解だと確信しています。

]]>
https://hiro-gear.com/2026/07/25/%e5%8d%98%e3%81%aa%e3%82%8b%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e6%a4%9c%e7%b4%a2%e3%81%8b%e3%82%89%e3%81%ae%e8%84%b1%e5%8d%b4%e3%80%82%e3%80%8cokf%e5%af%be%e5%bf%9c%e3%80%8d%e3%81%a7%e9%80%b2/feed/ 0
単なるObsidian×AI連携ではない。「RAGのMCP化」が創る最強のマルチAI手帳 https://hiro-gear.com/2026/07/20/%e5%8d%98%e3%81%aa%e3%82%8bobsidianxai%e9%80%a3%e6%90%ba%e3%81%a7%e3%81%af%e3%81%aa%e3%81%84%e3%80%82%e3%80%8crag%e3%81%aemcp%e5%8c%96%e3%80%8d%e3%81%8c%e5%89%b5%e3%82%8b%e6%9c%80%e5%bc%b7/ https://hiro-gear.com/2026/07/20/%e5%8d%98%e3%81%aa%e3%82%8bobsidianxai%e9%80%a3%e6%90%ba%e3%81%a7%e3%81%af%e3%81%aa%e3%81%84%e3%80%82%e3%80%8crag%e3%81%aemcp%e5%8c%96%e3%80%8d%e3%81%8c%e5%89%b5%e3%82%8b%e6%9c%80%e5%bc%b7/#respond Mon, 20 Jul 2026 11:29:30 +0000 https://gonta.f5.si/2026/07/20/%e5%8d%98%e3%81%aa%e3%82%8bobsidianxai%e9%80%a3%e6%90%ba%e3%81%a7%e3%81%af%e3%81%aa%e3%81%84%e3%80%82%e3%80%8crag%e3%81%aemcp%e5%8c%96%e3%80%8d%e3%81%8c%e5%89%b5%e3%82%8b%e6%9c%80%e5%bc%b7/ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true });

最近、「Obsidian(ローカルMarkdownメモ)をAIと組み合わせる」というアプローチが世間で流行っています。しかし、私が今回最もこだわり、そして到達した結論は単なる連携ではありません。
それは、「Obsidianの情報をRAG(検索拡張生成)システムとして独立させ、さらにそれをMCP(Model Context Protocol)化する」という設計です。

このアーキテクチャにより、私のObsidianは単なるメモ帳から、あらゆるAI(市販のAIツールや自作のAIエージェント)から共通して参照できる「My手帳(汎用ナレッジベース)」へと進化しました。

構成図(アーキテクチャ)

graph TD
    subgraph Obsidian_Vault [Obsidian Vault]
        NOTES["📝 My手帳 (Obsidian)
日々の記録・アイデア"] end subgraph Unified_RAG_MCP [Unified RAG MCP - Raspberry Pi] WATCHER["👁 Watcher
(3分待機で自動ベクトル化)"] VECTOR_DB[("🗄 SQLite Vector DB
(Gemini Embeddings)")] MCP_SERVER["🔌 MCP Server
(RAG検索APIを提供)"] NOTES -.->|ファイル更新検知| WATCHER WATCHER -->|見出しベースで高速チャンク化| VECTOR_DB VECTOR_DB <-->|検索リクエスト| MCP_SERVER end subgraph AI_Clients [AI Clients - マルチアクセス] ANTIGRAVITY["🤖 Antigravity
(最先端のMCP対応AI)"] GONRAS["🦅 Gonras
(日々の対話をこなす独自AI)"] ANTIGRAVITY <-->|ツールとしてRAGを呼び出し| MCP_SERVER GONRAS <-->|ツールとしてRAGを呼び出し| MCP_SERVER end

一般的なObsidian×AIの限界

よくある構成は、Obsidianのプラグインを使ってChatGPTを呼び出したり、特定のAIアプリにObsidianのフォルダを読み込ませたりするアプローチです。
しかしこれでは、「その特定のAI」からしか手帳を使えません。また、巨大な手帳データを毎回AIに読ませるのは非効率であり、すぐにコンテキスト(記憶枠)の限界に達してしまいます。

私がこだわった「RAGのMCP化」というブレイクスルー

そこで私は、Obsidianのデータを外部のRAG(ベクトルデータベース)として独立させました。
さらに、そのRAGシステムを話題のMCP(Model Context Protocol)サーバーとして包み込みました。これが最大のポイントです。

これにより、以下のような「マルチAIアクセス」が可能になりました。

  1. 独自AIエージェント(Gonras)からの利用
    私が自作したAIエージェント「Gonras」は、私と会話する中で「あ、これは手帳に書いてあったな」と思えば、MCP経由でRAGを検索し、文脈を踏まえた返答をしてくれます。
  2. 最先端AIツール(Antigravity等)からの利用
    GeminiやClaudeなどの最先端モデルを搭載したMCP対応ツールも、この「My手帳MCP」を接続するだけで、初対面なのに私の個人的な知識や背景(サーバーの設定から自転車の趣味まで!)をすべて理解したアシスタントに早変わりします。

究極の「My手帳」エコシステムの完成

  • 人間はただObsidianにメモを書くだけ。
  • 裏側(Watcher)がそれを自動で高速にチャンク化(意味段落に分割)し、ベクトルDBを更新。
  • MCPを通じて、どんなAIエージェントも瞬時にその知識を引き出せる。

AIの進化は日進月歩で、明日にはもっと賢い新しいAIモデルが登場するでしょう。
しかし、この「RAGのMCP化」というアーキテクチャを組んでおけば、AIモデルがどれだけ変わろうと、「自分の脳(Obsidian)」をプラグのように新しいAIへ挿し込むだけで済みます。

これこそが、情報過多の時代を生き抜くための、真にポータブルで無敵な「My手帳」の姿です。

]]>
https://hiro-gear.com/2026/07/20/%e5%8d%98%e3%81%aa%e3%82%8bobsidianxai%e9%80%a3%e6%90%ba%e3%81%a7%e3%81%af%e3%81%aa%e3%81%84%e3%80%82%e3%80%8crag%e3%81%aemcp%e5%8c%96%e3%80%8d%e3%81%8c%e5%89%b5%e3%82%8b%e6%9c%80%e5%bc%b7/feed/ 0
iPhoneの写真を自宅のRaspberry Piに自動保存!容量不足を解消するスマートな仕組みづくり https://hiro-gear.com/2026/07/20/iphone%e3%81%ae%e5%86%99%e7%9c%9f%e3%82%92%e8%87%aa%e5%ae%85%e3%81%aeraspberry-pi%e3%81%ab%e8%87%aa%e5%8b%95%e4%bf%9d%e5%ad%98%ef%bc%81%e5%ae%b9%e9%87%8f%e4%b8%8d%e8%b6%b3%e3%82%92%e8%a7%a3%e6%b6%88/ https://hiro-gear.com/2026/07/20/iphone%e3%81%ae%e5%86%99%e7%9c%9f%e3%82%92%e8%87%aa%e5%ae%85%e3%81%aeraspberry-pi%e3%81%ab%e8%87%aa%e5%8b%95%e4%bf%9d%e5%ad%98%ef%bc%81%e5%ae%b9%e9%87%8f%e4%b8%8d%e8%b6%b3%e3%82%92%e8%a7%a3%e6%b6%88/#respond Mon, 20 Jul 2026 07:46:08 +0000 https://gonta.f5.si/2026/07/20/iphone%e3%81%ae%e5%86%99%e7%9c%9f%e3%82%92%e8%87%aa%e5%ae%85%e3%81%aeraspberry-pi%e3%81%ab%e8%87%aa%e5%8b%95%e4%bf%9d%e5%ad%98%ef%bc%81%e5%ae%b9%e9%87%8f%e4%b8%8d%e8%b6%b3%e3%82%92%e8%a7%a3%e6%b6%88/ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true });

スマートフォンで写真を撮る機会が増えると、すぐに直面するのが「クラウドストレージ(iCloudなど)の容量不足」という問題です。毎月のサブスクリプション費用を節約しつつ、安全に大量の写真を保管するために、私は自宅のRaspberry Pi(ラズパイ)を活用した「自分だけの写真バックアップ環境」を構築しました。

この記事では、専門知識がない方にもわかりやすく、どのような仕組みでiPhoneから写真をローカルサーバーへ保存しているのか、具体的な構成やメリットをご紹介します。

なぜ自宅に写真保管庫を作るのか?

  • 月額費用がゼロ: iCloudなどのクラウドサービスは、一定の容量を超えると毎月課金が必要になります。自宅にストレージ(HDDやSSD)を用意すれば、初期費用のみでテラバイト級の保存領域が手に入ります。
  • データの手元管理: 外部サービスに依存せず、大切な思い出の写真を自分自身の管理下で安全に保管できます。
  • プライバシーの保護: 写真データが意図せずクラウドのAI学習に利用されたり、流出したりするリスクを軽減できます。

構築した仕組みの全体像

graph LR
    iPhone[iPhone - Nextcloud App] -- Wi-Fi --> RPi[Raspberry Pi]
    subgraph RaspberryPiSystem
        RPi --> Storage[(External HDD)]
        RPi --> PhotoPrism[PhotoPrism - AI Gallery]
        PhotoPrism -.-> Storage
    end

    style iPhone fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e293b
    style RPi fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#1e293b
    style Storage fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#1e293b
    style PhotoPrism fill:#f3e8ff,stroke:#a855f7,stroke-width:2px,color:#1e293b

私の環境では、Raspberry Pi という小型の省電力コンピューターを自宅のサーバーとして24時間稼働させ、そこに大容量のストレージを接続しています。
iPhoneからの写真転送は以下の流れで行われます。

1. アプリを使った自動アップロード

iPhoneには、「Nextcloud」や「PhotoSync」などのアプリをインストールしています。このアプリは、Wi-Fi環境に入ったタイミングで、新しく撮影された写真や動画を自動的に自宅のRaspberry Piに転送してくれます。

2. Raspberry Piでの安全な受信と保存

Raspberry Pi上では、Nextcloudサーバー(または同様のファイル共有システム)が稼働しており、iPhoneから送られてきた写真を受け取ります。受け取ったデータは、外付けの大容量ドライブに保存されます。

3. PhotoPrismを活用した美しい写真ギャラリー

単にファイルを保存するだけでは、あとから写真を見返すのが大変です。そこで私は、PhotoPrismというAI搭載の写真管理アプリをRaspberry Pi上で動かしています。
PhotoPrismは、保存された写真を自動的に解析し、被写体や場所ごとにアルバムを作成してくれます。iPhoneの「写真」アプリのように、美しく快適に過去の写真を楽しむことができます。

初心者でもできる?構築のポイント

このような仕組みを作るには、少しだけサーバーの知識が必要ですが、最近は非常に簡単になっています。

  1. Dockerの活用: サーバーソフトを直接インストールするのではなく、「Docker(ドッカー)」という仕組みを使います。これを使えば、難しい設定を省いて、ブロックを組み立てるようにNextcloudやPhotoPrismを立ち上げることができます。
  2. バックアップの二重化: 自宅サーバーはHDDが壊れるリスクがあります。大切な写真を守るため、Raspberry Piに繋いだ別のHDDへ定期的にコピー(バックアップ)する仕組みも用意しておくと完璧です。

まとめ

iPhoneの写真容量問題は、Raspberry Piを活用することでスマートに解決できます。最初は設定に少し手間がかかりますが、一度仕組みを作ってしまえば、あとは全自動で写真が自宅に溜まっていき、月額料金もかかりません。
「自分だけのクラウド」を作る楽しさもあるので、容量不足でお悩みの方はぜひ挑戦してみてください!

]]>
https://hiro-gear.com/2026/07/20/iphone%e3%81%ae%e5%86%99%e7%9c%9f%e3%82%92%e8%87%aa%e5%ae%85%e3%81%aeraspberry-pi%e3%81%ab%e8%87%aa%e5%8b%95%e4%bf%9d%e5%ad%98%ef%bc%81%e5%ae%b9%e9%87%8f%e4%b8%8d%e8%b6%b3%e3%82%92%e8%a7%a3%e6%b6%88/feed/ 0
LVMキャッシュでHDDをSSD並に高速化する構成(dm-cache / lvmcache) https://hiro-gear.com/2026/03/04/lvm%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5%e3%81%a7hdd%e3%82%92ssd%e4%b8%a6%e3%81%ab%e9%ab%98%e9%80%9f%e5%8c%96%e3%81%99%e3%82%8b%e6%a7%8b%e6%88%90%ef%bc%88dm-cache-lvmcache%ef%bc%89/ https://hiro-gear.com/2026/03/04/lvm%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5%e3%81%a7hdd%e3%82%92ssd%e4%b8%a6%e3%81%ab%e9%ab%98%e9%80%9f%e5%8c%96%e3%81%99%e3%82%8b%e6%a7%8b%e6%88%90%ef%bc%88dm-cache-lvmcache%ef%bc%89/#respond Wed, 04 Mar 2026 13:13:40 +0000 https://gonta.f5.si/?p=218 はじめに

デスクトップPCで大容量 HDD を使いつつ、SSD 並みの速度を得たい ── そんな要望に応えるのが Linux カーネル標準の dm-cache(lvmcache) だ。本記事では、2TB HDD のルートパーティションを NVMe SSD でキャッシュし、高速化している実際の構成を紹介する。


環境

項目内容
マシンASUSTeK TUF B450M-PLUS GAMING
OSUbuntu 24.04.4 LTS (Noble Numbat)
カーネルLinux 6.8.0-101-generic (x86-64)
HDDSeagate ST2000DM001 (2TB, SATA)
NVMe SSDWD Blue SN550 500GB (WDS500G2B0C)

ストレージ構成

NVMe SSD (WD Blue SN550 / 465.8GB)
├─ nvme0n1p1  200MB  EFI       → /boot/efi
├─ nvme0n1p3  243GB  BitLocker → Windows
└─ nvme0n1p6  221GB  LVM       → キャッシュプール (180GB data + 2GB meta)

HDD (Seagate ST2000DM001 / 2TB)
├─ sda1       928GB  BitLocker → Windows
├─ sda2       488GB  LVM       → ルートLV のオリジン (320GB)
└─ sda3       447GB  ext4      → /mnt/backup

LVM 構成:
  VG: vg_main
  ├─ root_lv        320GB  ext4  → / (キャッシュ済み)
  ├─ root_lv_corig  320GB        → オリジンデータ(HDD sda2 上)
  └─ cache_lv_cpool              → キャッシュプール(SSD nvme0n1p6 上)
      ├─ cpool_cdata  180GB      → キャッシュデータ
      └─ cpool_cmeta    2GB      → キャッシュメタデータ

ポイント

  • Windows とのデュアルブート環境で、Linux パーティションのみ LVM キャッシュを適用
  • HDD の 488GB パーティション上に 320GB のルート LV を配置し、SSD の 180GB でキャッシュ
  • SSD の容量は HDD の約 56% をカバーしており、高いヒット率が期待できる

LVMキャッシュ(dm-cache)の仕組み

アプリケーション
      ↓
  root_lv(320GB / ext4 / マウント: /)
      ↓
  dm-cache(カーネル層)
  ├─ キャッシュ HIT  → SSD(NVMe)から高速読み出し
  └─ キャッシュ MISS → HDD から読み出し → SSD にキャッシュ保存

dm-cache は Linux カーネルの Device Mapper サブシステムに含まれるブロックレベルのキャッシュ機構。LVM2 が lvmcache コマンドとしてフロントエンドを提供しており、LVM の論理ボリュームに対して透過的にキャッシュを追加できる。

キャッシュモード

モード動作特徴
writethrough書き込みは HDD と SSD の両方に同時に行う安全性が高い。SSD 故障時もデータ損失なし
writeback書き込みは SSD のみ。後から HDD に非同期反映書き込みも高速だが、SSD 故障時にデータ損失リスクあり

本構成では writethrough(デフォルト)を採用。読み込みが SSD 速度になり、書き込みの安全性も確保される。

キャッシュポリシー: smq

Linux 4.2 以降のデフォルトポリシー smq(Stochastic Multiqueue) を使用。アクセス頻度に基づいてキャッシュ対象を自動選択し、メモリ消費も少ない優れたアルゴリズム。


セットアップ手順

1. 前提条件

  • LVM2 がインストール済みであること
  • キャッシュに使う SSD パーティションが同じ VG に属していること
sudo apt install lvm2

2. 物理ボリューム(PV)の作成

# HDD パーティション
sudo pvcreate /dev/sda2

# SSD パーティション
sudo pvcreate /dev/nvme0n1p6

3. ボリュームグループ(VG)の作成

sudo vgcreate vg_main /dev/sda2 /dev/nvme0n1p6

4. ルート論理ボリューム(LV)の作成

# HDD 上にオリジン LV を作成
sudo lvcreate -L 320G -n root_lv vg_main /dev/sda2

# ファイルシステム作成
sudo mkfs.ext4 /dev/vg_main/root_lv

5. キャッシュプールの作成とアタッチ

# SSD 上にキャッシュプール LV を作成
sudo lvcreate --type cache-pool -L 180G -n cache_lv_cpool vg_main /dev/nvme0n1p6

# キャッシュプールをルート LV にアタッチ
sudo lvconvert --type cache --cachepool vg_main/cache_lv_cpool vg_main/root_lv

これだけで root_lv へのアクセスが自動的に SSD キャッシュ経由になる。既存のマウントポイントやファイルシステムの変更は不要。

6. 確認

# キャッシュの状態確認
sudo lvs -a -o +cache_mode,cache_policy vg_main

# Device Mapper の状態確認
sudo dmsetup status vg_main-root_lv

現在の使用状況

$ df -h /
Filesystem                    Size  Used Avail Use%  Mounted on
/dev/mapper/vg_main-root_lv  315G  107G  194G  36%  /
項目
ルート LV サイズ320GB(実効 315GB)
使用量107GB(36%)
キャッシュデータサイズ180GB
キャッシュメタデータサイズ2GB
キャッシュモードwritethrough
キャッシュポリシーsmq

使用量 107GB に対してキャッシュが 180GB あるため、頻繁にアクセスされるデータのほぼすべてが SSD 上にキャッシュされ、高速にアクセスできる状態にある。


Bcache との比較

同じ「SSD で HDD をキャッシュする」仕組みとして Bcache がある(Raspberry Pi 5 での Bcache 構成記事を参照)。両者の違いを整理する。

比較項目lvmcache(dm-cache)Bcache
管理方法LVM コマンドで統合管理専用ツール(bcache-tools)
カーネル統合Device Mapper の一部独立したカーネルモジュール
既存 LV への追加容易(lvconvert 一発)デバイス再作成が必要
RAID との組み合わせLVM RAID と統合可能mdadm RAID の上に構成
キャッシュポリシーsmq(自動最適化)lru / fifo
運用の柔軟性キャッシュの着脱が容易分離手順がやや複雑

LVM を既に使っている環境であれば lvmcache が管理しやすく、Bcache は LVM を使わない構成や Raspberry Pi のような環境で手軽に導入できる利点がある。


まとめ

構成要素役割
HDD(Seagate 2TB)大容量データの永続保存
NVMe SSD(WD Blue 500GB)180GB のキャッシュで読み込みを高速化
lvmcache(dm-cache)ブロックレベルで透過的にキャッシュ
writethrough モードデータ安全性を確保しつつ読み込みを高速化

LVM キャッシュは既存の LVM 環境に対して lvconvert 一発でキャッシュを追加でき、ファイルシステムの変更も不要という手軽さが最大の利点だ。2TB の HDD を 500GB の NVMe SSD でキャッシュすることで、日常的なデスクトップ用途ではほぼ SSD の速度で動作する環境を実現できている。


作成日: 2026年3月

]]>
https://hiro-gear.com/2026/03/04/lvm%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5%e3%81%a7hdd%e3%82%92ssd%e4%b8%a6%e3%81%ab%e9%ab%98%e9%80%9f%e5%8c%96%e3%81%99%e3%82%8b%e6%a7%8b%e6%88%90%ef%bc%88dm-cache-lvmcache%ef%bc%89/feed/ 0
Raspberry Pi 5 で Bcache を使ったストレージ高速化構成 https://hiro-gear.com/2026/03/04/raspberry-pi-5-%e3%81%a7-bcache-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8%e9%ab%98%e9%80%9f%e5%8c%96%e6%a7%8b%e6%88%90/ https://hiro-gear.com/2026/03/04/raspberry-pi-5-%e3%81%a7-bcache-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8%e9%ab%98%e9%80%9f%e5%8c%96%e6%a7%8b%e6%88%90/#respond Wed, 04 Mar 2026 12:35:38 +0000 https://gonta.f5.si/?p=211 はじめに

Raspberry Pi 5 は USB や SATA 接続のストレージを活用できるが、大容量 HDD は読み書き速度が遅いという課題がある。
本記事では、安価な SSD をキャッシュとして使う Linux のカーネル機能 Bcache を活用し、HDD の速度を SSD 並みに引き上げる構成を紹介する。


環境

項目 内容
機器 Raspberry Pi 5 Model B (8GB RAM)
OS Debian Bookworm (Linux 6.12, aarch64)
ブート microSD 119GB (/boot/firmware)

ストレージ構成

SSD (MSI S270 240GB / SATA)  ← キャッシュデバイス
 └─ sda2 (200GB) → bcache キャッシュ

HDD1 (1.8TB / sdb)
 ├─ sdb1 (1.5TB) ─┐
 └─ sdb2 (327GB)  ─┤
                   │ RAID1 (ミラーリング)
HDD2 (3.6TB / sdc) │
 ├─ sdc1 (1.5TB) ─┤→ md2  (1.5TB RAID1) → bcache0 → /data (1.5TB)
 └─ sdc3 (336GB)  ─┘→ md127 (327GB RAID1) → bcache1 → /     (327GB)

ポイント

  • 2 台の HDD を RAID1(ミラーリング) で冗長化 → 片方の HDD が壊れてもデータを保護
  • SSD をキャッシュ として RAID1 ボリュームに重ねることでアクセス速度を向上
  • ルートパーティション (/) とデータパーティション (/data) をそれぞれ独立した bcache デバイスとして構成

RAID1(ミラーリング)の構成

RAID1 とは

RAID1 は 2 台以上のディスクに同じデータを書き込むミラーリング方式。
片方のディスクが故障しても、もう片方から読み出し続けられるためデータを失わない

書き込み → [HDD1] ─┐
                   ├─ 同一データ
           [HDD2] ─┘

HDD1 故障時 → HDD2 から自動的に読み続ける(無停止)

本構成での RAID1

アレイ 構成デバイス サイズ マウント先
md2 sdb1 + sdc1 1.5TB bcache0 経由 → /data
md127 sdb2 + sdc3 327GB bcache1 経由 → /

RAID1 セットアップ手順(mdadm)

1. mdadm インストール

sudo apt install mdadm

2. RAID1 アレイ作成

# /data 用 (1.5TB × 2)
sudo mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

# / 用 (327GB × 2)
sudo mdadm --create /dev/md127 --level=1 --raid-devices=2 /dev/sdb2 /dev/sdc3

3. 設定を永続化

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

RAID1 の状態確認

cat /proc/mdstat

正常時の出力例:

md2 : active raid1 sdc1[1] sdb1[2]
      1610480640 blocks super 1.2 [2/2] [UU]

md127 : active raid1 sdc3[0] sdb2[1]
      342768704 blocks super 1.2 [2/2] [UU]

[UU] = 両ディスク正常稼働。[_U][U_] になった場合は片方が故障。

故障時の対応

# 故障ディスクを取り外す
sudo mdadm /dev/md2 --fail /dev/sdb1 --remove /dev/sdb1

# 新しいディスクを追加してリビルド
sudo mdadm /dev/md2 --add /dev/sdb1

# リビルド進捗確認
watch cat /proc/mdstat

Bcache の設定内容

bcache0(/data 用・1.5TB)

パラメータ 説明
cache_mode writeback 書き込みもキャッシュ経由(高速)
sequential_cutoff 0(無効) シーケンシャルアクセスもキャッシュ対象
readahead_cache_policy all 先読みもキャッシュに乗せる
状態 clean キャッシュと本体が同期済み

bcache1(/ 用・327GB)

パラメータ 説明
cache_mode writeback 書き込みもキャッシュ経由(高速)
sequential_cutoff 4MB 4MB 以上の連続アクセスはキャッシュをバイパス
readahead_cache_policy all 先読みもキャッシュに乗せる
状態 dirty キャッシュに未書き込みデータあり(正常)

キャッシュヒット率(実績)

デバイス ヒット数 ミス数 ヒット率
bcache0 (/data) 920,178 72,257 92%
bcache1 (/) 2,205,814 75,134 96%

ルートパーティションで 96% のキャッシュヒット率を達成しており、HDD 単体と比較して体感速度が大幅に向上している。


Bcache の仕組み

アプリ
  ↓
bcache(カーネル層)
  ├─ キャッシュHIT → SSD から高速読み出し(μs オーダー)
  └─ キャッシュMISS → HDD から読み出し&SSD にキャッシュ保存(ms オーダー)

writeback モードとは

書き込みリクエストをまず SSD に書き込み、後から HDD へ非同期に反映するモード。

  • メリット: 書き込み速度が SSD 速度になる
  • デメリット: SSD が突然故障した場合、キャッシュ上の未書き込みデータが失われる可能性がある(本構成では RAID1 で HDD 側を保護)

Bcache セットアップ手順(概要)

1. パッケージインストール

sudo apt install bcache-tools

2. キャッシュデバイスの作成(SSD 側)

sudo make-bcache -C /dev/sda2

3. バッキングデバイスの作成(HDD/RAID 側)

sudo make-bcache -B /dev/md2
sudo make-bcache -B /dev/md127

4. キャッシュデバイスを登録・アタッチ

# キャッシュセット UUID を確認
ls /sys/fs/bcache/

# バッキングデバイスにキャッシュをアタッチ
echo <UUID> | sudo tee /sys/block/bcache0/bcache/attach
echo <UUID> | sudo tee /sys/block/bcache1/bcache/attach

5. キャッシュモードを writeback に変更

echo writeback | sudo tee /sys/block/bcache0/bcache/cache_mode
echo writeback | sudo tee /sys/block/bcache1/bcache/cache_mode

6. 設定を永続化(/etc/rc.localudev ルールで起動時に適用)

# /etc/rc.local の例
echo writeback > /sys/block/bcache0/bcache/cache_mode
echo writeback > /sys/block/bcache1/bcache/cache_mode
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

現在の使用状況

/dev/bcache1 (/)    321GB 中 117GB 使用(39%)
/dev/bcache0 (/data) 1.5TB 中 601GB 使用(42%)

まとめ

構成要素 役割
HDD × 2(RAID1) 大容量・冗長性の確保
SSD(Bcache キャッシュ) アクセス速度の向上
writeback モード 書き込み速度の最大化

Raspberry Pi 5 のような非力なシングルボードコンピューターでも、Bcache を組み合わせることで 実用的なファイルサーバー・ホームサーバー として活用できる。
96% というキャッシュヒット率は、日常的なワークロードではほぼ SSD の速度で動作していることを意味する。


作成日: 2026年3月

]]>
https://hiro-gear.com/2026/03/04/raspberry-pi-5-%e3%81%a7-bcache-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8%e9%ab%98%e9%80%9f%e5%8c%96%e6%a7%8b%e6%88%90/feed/ 0
OpenAI APIを使った時に備忘録メモ https://hiro-gear.com/2025/08/31/openai-api%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e6%99%82%e3%81%ab%e5%82%99%e5%bf%98%e9%8c%b2%e3%83%a1%e3%83%a2/ Sun, 31 Aug 2025 07:29:27 +0000 https://gonta.f5.si/?p=176

OpenAIの基本的な使い方を備忘録として記載。

Toolsを使った呼び出し例

async def process_conversation(user_input: str):
    # 1. メッセージの準備
    messages = [
        {
            “role”: “system”,
            “content”: [
                {“type”: “input_text”, “text”: “システムプロンプト”}
            ]
        },
        {
            “role”: “user”,
            “content”: [
                {“type”: “input_text”, “text”: user_input}
            ]
        }
    ]
   
    # 2. API呼び出し(ツール使用)
    response = client.responses.create(
        model=ai_config[“model”],
        input=messages,
        tools=tools,
        tool_choice=”auto”
    )
   
    # 3. 完了まで待機
    while response.status != “completed”:
        if response.status == “failed”:
            return {“message”: f”エラー: {response.error}”}
        # 待機処理
   
    # 4. ツール呼び出しの処理
    tool_calls = []
    if response.output:
        for tool_call in response.output:
            if tool_call.type == “function_call”:
                tool_calls.append(tool_call)
   
    # 4-1. ツール実行のループ処理
    max_tool_iterations = 7  # 最大ツール実行回数
    tool_iteration_count = 0
   
    while tool_iteration_count < max_tool_iterations and tool_calls:
        # ツール実行処理
        for tool_call in tool_calls:
            # 重複実行チェック
if tool_call.call_id not in processed_tool_calls:
    # ツール実行と結果格納
    # … (詳細は「ツール実行の処理」セクションを参照)
    processed_tool_calls.add(tool_call.call_id)
       
        tool_iteration_count += 1
       
        # 次のツール呼び出しを確認
        if tool_iteration_count < max_tool_iterations:
            # 再度API呼び出ししてツール呼び出しを確認
            response = client.responses.create(
                model=ai_config[“model”],
                input=messages,
                tools=tools,
                tool_choice=”auto”
            )
            # 完了まで待機
            while response.status != “completed”:
                if response.status == “failed”:
                    return {“message”: f”エラー: {response.error}”}
           
            # 新しいツール呼び出しを確認
            tool_calls = []
            if response.output:
                for tool_call in response.output:
                    if tool_call.type == “function_call”:
                        tool_calls.append(tool_call)
   
    # 5. 最終回答の取得(ツール使用なし)
    final_response = client.responses.create(
        model=ai_config[“model”],
        input=messages,
        tools=tools,
        tool_choice=”none”
    )
   
    # 6. 最終回答の処理
    while final_response.status != “completed”:
        if final_response.status == “failed”:
            return {“message”: f”最終回答取得エラー: {final_response.error}”}
   
    # 最終回答を結果に格納
    result = {}
    if final_response.output and len(final_response.output) > 0:
        result[“message”] = final_response.output[-1].content[0].text
    else:
        result[“message”] = “回答を取得できませんでした”
   
    return result

]]>
ストレージを2個以上使ってソフトウェアRAIDを構成(mdadm) https://hiro-gear.com/2025/07/06/%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8%e3%82%92%ef%bc%92%e5%80%8b%e4%bb%a5%e4%b8%8a%e4%bd%bf%e3%81%a3%e3%81%a6%e3%82%bd%e3%83%95%e3%83%88%e3%82%a6%e3%82%a7%e3%82%a2raid%e3%82%92%e6%a7%8b/ Sat, 05 Jul 2025 23:44:21 +0000 https://gonta.f5.si/?p=138 環境を壊しそうなので手順を再現できず。以下のサイトが参考になる。
https://e-penguiner.com/software-raid-using-mdadm-on-linux/
ちなみに後で2台目のHDDを準備する場合は、以下のコマンドのようにmissingを指定すれば、
1本のHDDでRaid1(ミラー)の縮退構成としてセットアップすることができる。
mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sda1

/proc/mdstatを見ると、Raidの状態を確認することができる。

ちなみに、HDDが準備できたら、以下のコマンドで組み込めばOK

mdadm /dev/md0 -a /dev/sdXX

]]>
Raspberry pi 64bit Install方法 https://hiro-gear.com/2025/07/06/raspberry-pi-64bit-install%e6%96%b9%e6%b3%95/ Sat, 05 Jul 2025 23:24:49 +0000 https://gonta.f5.si/?p=130 想定する環境

PCとMicroSDカードが書き込める環境がること

OSの入手方法

RaspberryのサイトからインストーラーをRaspberryPIで認識させるためのSDカードを作るためのソフトウェアを入手する

https://www.raspberrypi.com/software/

OSは、以下から選択。デスクトップ(GUI)を使わなければLiteで十分。

あとは、書き込んだSDカードをRaspberryPIに差し込んで起動する

SSHの有効化

必須ではないが、RaspberryPIのコンソールからインストール作業をするのはちょっと不便なので、SSHを有効化する。
sudo raspi-config

でコンフィグ画面を起動し3を選択

次にI1を選択

I1を選択しSSHを有効化。

RaspberryPI独自のコマンドとして、サーバにSSHホスト鍵が存在しない場合に生成することができる以下のコマンドを必要に応じて実行

ssh-key-gen -A

]]>
WordPressサーバをローカル環境にお金をかけずに立ち上げる https://hiro-gear.com/2025/05/24/wordpress%e3%82%b5%e3%83%bc%e3%83%90%e3%82%92%e7%ab%8b%e3%81%a1%e4%b8%8a%e3%81%92%e3%82%8b/ Sat, 24 May 2025 12:56:14 +0000 https://gonta.f5.si/?p=86

WordPressをRaspberry上に立ち上げてインターネットに公開する

考慮事項

WordPressの環境をお金をかけずに自宅にある環境に立ててたくなった。
環境を作るといっても漠然と作るとどこかで作り直しになりそうな予感がしたため、予め作る際の要件を整理した。

  • OSは64ビットを使う(非力な環境のため少しでも効率よく動作する環境)
  • データ紛失を避けるためにソフトウェアRAID(mdadm)にてHDDの可用性を向上させる
  • ドメインを取得する(インターネットから検索する上で最低限必要となる住所みたいなもの)
  • SSLサイトにする(情報漏洩は気にしない。Googleから見つけてもらうために最低限のマナーとしてSSLサイトにした)
  • おまけ:音源ボードはアンプにつないであり、Spotify サーバ?を常時起動させ、部屋のBGM用に利用

補足説明

インターネット回線は一般家庭のフレッツ光などの回線を使っており課金して固定IPとしていないため、IPアドレスが変更されても問題とならないDDNSでドメイン登録する方法を選んだ。
私はサブドメインでもいいので無料で使えるDDNS Now(https://ddns.kuku.lu/)を利用(無料)した。
※サブドメインなのでf5.siの下にgontaを申請。IPアドレスがころころ変わるので、
 DDNS Nowに向けて定期的にIPアドレスを通知

更に、SSL用証明書は、無料のLet’s Encryptを利用を利用した。
余談だけど、今は無料でブラウザから信用されている認証局から発行される証明書を取得できるなんて便利な世の中だと思う。
このサービスで発行される証明書の有効期間は数日とかなり短いため、定期的に更新するスクリプトを実装する必要がある。

余談

Raspberry Piのボードに内蔵されているWifiユニットが不安。
※後で調べてみたところ、省電力モードをOFFにすると改善されるという事例あり。
私は無線は使っていないので未検証。
特にCPU使用率が高い際は、ノイズがでているようで頻繁にWifiが切れてしまう。そのために有線接続を実施

]]>
WordPressサーバを立ち上げる https://hiro-gear.com/2025/05/24/wordpress%e3%82%b5%e3%83%bc%e3%83%90%e3%82%92%e7%ab%8b%e3%81%a1%e4%b8%8a%e3%81%92%e3%82%8b-2/ Sat, 24 May 2025 12:56:14 +0000 https://gonta.f5.si/?p=86

WordPressをRaspberry上に立ち上げてインターネットに公開する

考慮事項

WordPressの環境をお金をかけずに自宅にある環境に立ててたくなった。
環境を作るといっても漠然と作るとどこかで作り直しになりそうな予感がしたため、予め作る際の要件を整理した。

  • OSは64ビットを使う(非力な環境のため少しでも効率よく動作する環境)
  • データ紛失を避けるためにソフトウェアRAID(mdadm)にてHDDの可用性を向上させる
  • ドメインを取得する(インターネットから検索する上で最低限必要となる住所みたいなもの)
  • SSLサイトにする(情報漏洩は気にしない。Googleから見つけてもらうために最低限のマナーとしてSSLサイトにした)
  • おまけ:音源ボードはアンプにつないであり、Spotify サーバ?を常時起動させ、部屋のBGM用に利用

補足説明

インターネット回線は一般家庭のフレッツ光などの回線を使っており課金して固定IPとしていないため、IPアドレスが変更されても問題とならないDDNSでドメイン登録する方法を選んだ。
私はサブドメインでもいいので無料で使えるDDNS Now(https://ddns.kuku.lu/)を利用(無料)した。
※サブドメインなのでf5.siの下にgontaを申請。IPアドレスがころころ変わるので、
 DDNS Nowに向けて定期的にIPアドレスを通知

更に、SSL用証明書は、無料のLet’s Encryptを利用を利用した。
余談だけど、今は無料でブラウザから信用されている認証局から発行される証明書を取得できるなんて便利な世の中だと思う。
このサービスで発行される証明書の有効期間は数日とかなり短いため、定期的に更新するスクリプトを実装する必要がある。

余談

Raspberry Piのボードに内蔵されているWifiユニットが不安。
※後で調べてみたところ、省電力モードをOFFにすると改善されるという事例あり。
私は無線は使っていないので未検証。
特にCPU使用率が高い際は、ノイズがでているようで頻繁にWifiが切れてしまう。そのために有線接続を実施

]]>