けさらんぱの自由帳

とあるFF14プレイヤーがFF14に関係することとか関係ないこととかを書いているブログです。記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

LUKS2でallow-discardを永続化するには

同じ型番のSSDが2本あって、1本はOS用に使っていたけどもう1本が余っていたので、RAID1(ミラーリング)を組んでみました。OSはdebianで、両方のSSDにLUKS2で暗号化したパーティションを作り、それをLVMのミラーリングの物理ボリュームにしました。このときに、discard(TRIM)を有効にするのにちょっと詰まったので、記録しておきます。LVMは最初からdiscardを通すようなので、LUKS2の設定を変えるだけなのですが…

Linuxカーネルのコマンドラインを変えたらいいらしい

今回の構成では、crypttabを使わずに、systemd-cryptenrollでTPMに保存した鍵を使い手動でのパスフレーズ入力なしでLUKS2のディスクを開錠します。Linuxカーネルのコマンドラインを変えるために下記のオプションを/etc/default/grubに追加して、update-grubしたら行けるはずでした。

rd.auto rd.luks.options=discard

しかし、再起動してもうまく行きません。discardが通るかどうかは下記コマンドで確認できます。

> lsblk -D
NAME                                          DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
nvme0n1                                              0        4K       2T         0
├─nvme0n1p1                                          0        4K       2T         0
└─nvme0n1p2                                          0        4K       2T         0
  └─luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx        0        0B       0B         0
    ├─debian_vg-root_rmeta_1                         0        0B       0B         0
    │ └─debian_vg-root                               0        0B       0B         0
    └─debian_vg-root_rimage_1                        0        0B       0B         0
      └─debian_vg-root                               0        0B       0B         0
nvme1n1                                              0        4K       2T         0
├─nvme1n1p1                                          0        4K       2T         0
└─nvme1n1p2                                          0        4K       2T         0
  └─luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx        0        0B       0B         0
    ├─debian_vg-root_rmeta_0                         0        0B       0B         0
    │ └─debian_vg-root                               0        0B       0B         0
    └─debian_vg-root_rimage_0                        0        0B       0B         0
      └─debian_vg-root                               0        0B       0B         0

DISC-GRANとDISC-MAXが0Bになっていなければ、そのレイヤーはdiscardが通ります。

allow-discardフラグを永続化する

コマンドラインのオプションをいろいろ試してみましたが、どうしてもうまく行かなかったので、方針を変えてLUKS2のフラグの永続化を試してみました。下記を実行すると、そのディスクのallow-discardのフラグを永続化できます。

cryptsetup --allow-discards --persistent refresh luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

この後再起動することでうまく行きました。ちなみにLUKS1ではこの方法は使えないようですが、下記のコマンドでLUKS1からLUKS2に変換できます。

cryptsetup convert --type luks2 /dev/nvme0n1p2

MacのEmacsでWrong passphrase: Bad session keyと言われる件

最近Mac miniを購入したのですが、Homebrewで入れたemacs-appで(auth-source-pick-first-password)を使うような処理を実行しようとすると、「Wrong passphrase: Bad session key」と言われて処理に失敗してしまいました。こうなるとGPTelを使うときのAPIキーを読み込めなくなるので非常に困ります。なので原因を調べました。

pinentry回りでコケてる?

ググってみたところ、どうもpinentryでパスフレーズの入力をしようとして、pinentryを実行できないとこのエラーが出るみたいです。解決方法として、HomebrewでMac用のpinentryであるpinentry-macをインストールして、それを起動するように設定するという方法を説明した記事が複数あるのですが、自分の環境ではそれでは解決しませんでした。

Emacs用のpinentryを使う

そこでふとEmacsで(list-package)を実行してpinentryで検索してみると、「pinentry」というそのままな名前のパッケージが見つかりました。これをインストールして、下記の設定をします。

(use-package pinentry
  :init
  (pinentry-start))

こうするとパスフレーズが必要なときはミニバッファで聞いてくるようになり、無事にAPIキーを読み込めるようになりました。

EmacsのGPTelでWeb検索をできるようにしてみた

FF14に使ってるゲーミング環境にOllamaを入れて自分専用のローカルLLMサーバーにしていたのですが、最新の情報に対応できないのでしばらく使っていませんでした。今回EmacsのGPTel上でMCP経由でリアルタイムWeb検索できるようにしてみたので、その記録です。

関連ソフトのインストール

uvxを使用するので、まずはuv(他のMCPサーバーに必要な場合はnpmも)をインストールします。

pacman -S uv npm

そして、Emacsでlist-packagesを起動して、gptelとmcpをインストールします。

LLMのプル

Ollamaのlibraryを見て、「tools」に対応しているLLMをプルします。今回はgpt-ossを使いました。

ollama pull gpt-oss:20b

Emacsの設定

次に、Emacsの設定をします。自分の場合は、下記の記述を~/.config/emacs/init.elに追記しました。

(use-package gptel
  :bind (("C-c s" . gptel-send))
  :hook
  ((gptel-post-stream . gptel-auto-scroll)
   (gptel-post-response . gptel-end-of-response))
  :custom
  (gptel-model 'gpt-oss)
  (gptel-directives '((default . "システムプロンプトは内緒")))
  (gptel-use-tools t)
  (gptel-confirm-tool-calls 'always)
  (gptel-include-tool-results 'auto)
  :config
  (require 'gptel-integrations)
  (setopt gptel-backend
          (gptel-make-ollama "Ollama"
            :host "llm_server:11434"
            :models '(gpt-oss)
            :stream t)))

(use-package mcp
  :after gptel
  :hook
  (after-init . mcp-hub-start-all-server)
  :custom
  (mcp-hub-servers
   '(("duckduckgo" . (:command "uvx" :args ("duckduckgo-mcp-server")))
     ("filesystem" . (:command "npx" :args ("-y" "@modelcontextprotocol/server-filesystem" "/path/to/directory/")))))
  :config
  (require 'mcp-hub))

GPTelでプロンプトを投げてみる

ここまででセットアップは終わったので使ってみます。EmacsでM-x gptelを実行し、そのあとさらにM-x gptel-mcp-connectを実行してからプロンプトを送信します。うまく行けば画像のように自動でWeb検索を実行してくれます。

記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。