昨日 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.nix で boot.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";
};
});
};