blog.anqou.net
rss
author
tags

NixOS 25.11 で Bluetooth が壊れる

昨日 NixOS が入っているデスクトップマシンを起動したところ、手持ちの Bluetooth ヘッドフォンが接続できないことに気づきました。調べてみると sudo systemctl status bluetooth の出力が怪しく、Bluetooth のデーモンが起動していないように見えました。

このような場合、他の Linux distro を使っている環境ではインターネットに情報を探しに行くのが常ですが(NixOS でもまぁそうですが)、 NixOS の場合、最近実施した更新をロールバックして様子を見るということができます。このマシンの場合、直近で nixpkgs を d7a713c0b7e47c908258e71cba7a2d77cc8d71d5 から 687f05a9184cad4eaf905c48b63649e3a86f5433 に更新していたので、一旦古いハッシュに戻してみてマシンを再起動すると Bluetooth がつながるようになりました。 過去記事で紹介した nh os switch によると、このタイミングで更新されたソフトウェアは以下の通りでした。というわけで以下のどれかが怪しそうです。

CHANGED
[U.] cloud-hypervisor       50.2 -> 52.0
[U*] grafana                12.3.6 -> 12.3.6+security-01
[U.] initrd-linux           6.12.87 -> 6.12.90
[U.] linux                  6.12.87, 6.12.87-modules ×2, 6.12.87-modules-shrunk -> 6.12.90, 6.12.90-modules ×2, 6.12.90-modules-shrunk
[U.] nixos-system-anise     25.11.20260514.d7a713c -> 25.11.20260518.687f05a
[U.] nss                    3.123.1, <others> -> 3.124, <others>
[U*] nvidia-x11             580.142-6.12.87, 580.142-6.12.87-bin, 580.142-6.12.87-firmware, 580.142-6.12.87-lib32 -> 580.142-6.12.90, 580.142-6.12.90-bin, 580.142-6.12.90-firmware, 580.142-6.12.90-lib32
[U*] perf-linux             7.0.6 -> 7.0.9
[U.] postgresql             15.17, 15.17-lib, 15.17-man -> 15.18, 15.18-lib, 15.18-man
[U*] postgresql-and-plugins 15.17 -> 15.18
[U.] zfs-user               2.3.6 -> 2.3.7

ここから nixpkgs の二分探索をやっても良かったのですが、nixpkgs の issue を検索すると既に issue が立っていました:

https://github.com/NixOS/nixpkgs/issues/521528

内容を読むと、どうやら Linux kernel のリグレッションのようです。ワークアラウンドとして Linux kernel にパッチを当てる方法が書かれていますが、この方法では Linux kernel のビルドが手元で走ってしまうので、日々の nh os switch が遅くなってしまいそうです。

ということで、単に Linux kernel のバージョンを、正常動作を確認している 6.12.87 に固定することにします。この方法であればビルド済みのバイナリをキャッシュから引っ張ってくることができます。 Linux kernel の固定は configuration.nixboot.kernelPackages を指定することでできます。なお指定には Linux kernel のソースコードを表すハッシュ値が必要になります。固定したいバージョンで nixpkgs を検索すると、指定すべきハッシュを見つけることができます。

boot = {
  kernelPackages = pkgs.linuxPackagesFor (pkgs.linux_6_12.override {
    argsOverride = rec {
      src = pkgs.fetchurl {
        url = "mirror://kernel/linux/kernel/v6.x/linux-${version}.tar.xz";
        hash = "sha256:0c4qidff0qs2x0mvba83cw3ksaz2af3xwabvc839xvsc9djaf4nc";
      };
      version = "6.12.87";
      modDirVersion = "6.12.87";
    };
  });
};