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))
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検索を実行してくれます。
