Debianのunstable版でtesting版のパッケージを使用する(Pinning)

Posted on February 12, 2022 by nobiruwa

切っ掛け

Debianのunstable版を使っていると、apt upgradeを行ったタイミングでXが使えなくなることがあります。

少なくとも私のPCでは、NvidiaGraphicsDrivers#Build_failures - Debian WikiにあるようにNVIDIAのドライバが新しいカーネルに対応していない場合に起こっています。

この記事では回避方法として以下の3つが上げられています。

Solutions for this, from most to least recommended, are temporarily using an older kernel until the driver is updated, installing a newer version of the driver from Debian Experimental if one is available that supports your kernel version, or finding a patch for the build failure online that can be added to DKMS.

  1. ドライバーが更新されるまでより古いカーネルを使う
  2. experimental版のより新しいドライバーをインストールする
  3. オンラインでDKMSに追加できるパッチを探す

今回は、ドライバーが更新されるまでの暫定的な対応として、testing版から古いカーネルとドライバなど他のパッケージをpinning(ピン留め)を使ってインストールすることにしました。

症状

以下のようにxserver-xorg-video-nvidiaの依存パッケージであるxorg-video-abi-NN(NNはバージョン番号)を解決できずに失敗します。 xorg-video-abi-NNはvirtual packageであり、実際には適切なバージョンのxserver-xorg-coreがないということを示しています。

The following packages have unmet dependencies:
 xserver-xorg-video-nvidia : Depends: xorg-video-abi-24 or
                                      xorg-video-abi-23 but it is not installable or
                                      xorg-video-abi-20 but it is not installable or
                                      xorg-video-abi-19 but it is not installable or
                                      xorg-video-abi-18 but it is not installable or
                                      xorg-video-abi-15 but it is not installable or
                                      xorg-video-abi-14 but it is not installable or
                                      xorg-video-abi-13 but it is not installable or
                                      xorg-video-abi-12 but it is not installable or
                                      xorg-video-abi-11 but it is not installable or
                                      xorg-video-abi-10 but it is not installable or
                                      xorg-video-abi-8 but it is not installable or
                                      xorg-video-abi-6.0 but it is not installable
                             Depends: xserver-xorg-core (< 2:1.20.99) but 2:21.1.3-2 is to be installed
E: Unable to correct problems, you have held broken packages.

sources.listの設定

まずは/etc/apt/sources.listtesting版のリポジトリを追加します。

[...snip...]
deb http://ftp.jp.debian.org/debian/ testing main contrib non-free
[...snip...]

パッケージを更新します。

$ sudo apt update

apt_preferencesの設定

次に、3.10 How to keep specific versions of packages installed (complex) - APT HOWTO (Obsolete Documentation)の説明を参考にしつつ、/etc/apt/preferences.d/testing.prefを作り以下の内容を記述しました。

# downgrade dependencies
Package: *
Pin: release a=testing
Pin-Priority: 50

# downgrade packages (Pin-Priority must be more than 1000.)
Package: linux-image-* linux-headers-* nvidia-driver nvidia-driver-bin xserver-xorg-video-nvidia nvidia-vdpau-driver nvidia-alternative nvidia-kernel-dkms nvidia-legacy-check nvidia-driver-libs nvidia-driver-libs-nonglvnd xserver-xorg-core xserver-xorg-input-*
Pin: release a=testing
Pin-Priority: 1001

1個目のPinningの内容

testingアーカイブのパッケージをまずPin-Priotrity: 50、つまり明示しない限りインストールの対象とならないようにします。

他のパッケージの依存関係として必要な場合もインストールされます。

2個目のPinningの内容

ダウングレードを可能とするために、Pin-Priority1001にしています。

testingアーカイブからpinningするパッケージをPackagesセクションに列挙します。

以下の設定が必要でした。

  1. カーネルのダウングレードに必要だった設定
    • linux-image-* linux-headers-*
  2. ドライバのダウングレードに必要だった設定
    • nvidia-driver nvidia-driver-bin xserver-xorg-video-nvidia nvidia-vdpau-driver nvidia-alternative nvidia-kernel-dkms nvidia-legacy-check nvidia-driver-libs nvidia-driver-libs-nonglvnd xserver-xorg-core
      • nvidia-driverからnvidia-driver-libs-nonglvndまではHow to properly setup and install nvidia on Debian/Devuan - @Kreyren’s GitHub Gistからそのまま拝借しました。
      • testing版とunstble版のnvidia-driverなどNVIDIAのドライバに関係するパッケージのバージョンは同一だったので、pinningが真に必要なパッケージはxserver-xorg-coreだけなのかもしれませんが、一応すべてpinningすることにしました。
  3. マウスとキーボードを使用可能にするために必要だった設定

Pinningの確認

/etc/apt/preferences.d/testing.prefの設定がapt-cache policyに反映されているかを確認します。

$ sudo apt-cache policy
Package files:
[...snip...]
  50 http://ftp.jp.debian.org/debian testing/non-free i386 Packages
     release o=Debian,a=testing,n=bookworm,l=Debian,c=non-free,b=i386
     origin ftp.jp.debian.org
  50 http://ftp.jp.debian.org/debian testing/non-free amd64 Packages
     release o=Debian,a=testing,n=bookworm,l=Debian,c=non-free,b=amd64
     origin ftp.jp.debian.org
  50 http://ftp.jp.debian.org/debian testing/contrib i386 Packages
     release o=Debian,a=testing,n=bookworm,l=Debian,c=contrib,b=i386
     origin ftp.jp.debian.org
  50 http://ftp.jp.debian.org/debian testing/contrib amd64 Packages
     release o=Debian,a=testing,n=bookworm,l=Debian,c=contrib,b=amd64
     origin ftp.jp.debian.org
  50 http://ftp.jp.debian.org/debian testing/main i386 Packages
     release o=Debian,a=testing,n=bookworm,l=Debian,c=main,b=i386
     origin ftp.jp.debian.org
  50 http://ftp.jp.debian.org/debian testing/main amd64 Packages
     release o=Debian,a=testing,n=bookworm,l=Debian,c=main,b=amd64
     origin ftp.jp.debian.org
[...snip...]
Pinned packages:
     xserver-xorg-input-evdev -> 1:2.10.6-2 with priority 1001
     xserver-xorg-input-mouse -> 1:1.9.3-1 with priority 1001
     nvidia-alternative -> 470.103.01-1 with priority 1001
     xserver-xorg-core -> 2:1.20.14-1 with priority 1001
     xserver-xorg-input-all -> 1:7.7+23 with priority 1001
     xserver-xorg-input-kbd -> 1:1.9.0-1+b2 with priority 1001
     xserver-xorg-input-mutouch -> 1:1.3.0-2+b1 with priority 1001
     xserver-xorg-input-joystick -> 1:1.6.3-1+b1 with priority 1001
     xserver-xorg-input-xwiimote -> 0.5-1+b3 with priority 1001
     xserver-xorg-input-elographics -> 1:1.4.2-1 with priority 1001
     nvidia-driver-bin -> 470.103.01-1 with priority 1001
     xserver-xorg-input-aiptek -> 1:1.4.1-3+b1 with priority 1001
     nvidia-driver-libs -> 470.103.01-1 with priority 1001
     nvidia-driver -> 470.103.01-1 with priority 1001
     xserver-xorg-input-synaptics -> 1.9.1-2 with priority 1001
     nvidia-kernel-dkms -> 470.103.01-1 with priority 1001
     xserver-xorg-input-mtrack -> 0.3.1-1+b3 with priority 1001
     xserver-xorg-input-libinput -> 1.2.0-1 with priority 1001
     xserver-xorg-input-evdev-dev -> 1:2.10.6-2 with priority 1001
     nvidia-legacy-check -> 470.103.01-1 with priority 1001
     xserver-xorg-input-wacom -> 0.34.99.1-1+b1 with priority 1001
     xserver-xorg-input-joystick-dev -> 1:1.6.3-1 with priority 1001
     nvidia-vdpau-driver -> 470.103.01-1 with priority 1001
     xserver-xorg-input-libinput-dev -> 1.2.0-1 with priority 1001
     xserver-xorg-input-synaptics-dev -> 1.9.1-2 with priority 1001
     xserver-xorg-video-nvidia -> 470.103.01-1 with priority 1001
     xserver-xorg-input-multitouch -> 1.0~rc3-2+b1 with priority 1001

期待通りに反映されていることが確認できました。

パッケージのダウングレードインストール

最後にダウングレードインストールを行って完了です。

以下のステップによりXが再び使えるようになりました。

  1. testing版のカーネルとヘッダーをインストール
  2. testing版のドライバーをインストール
  3. マウスとキーボードが使えなくなるので再インストール
  4. /etc/X11/xorg.confを念の為更新

実際のコマンドは以下の通りです。

$ sudo apt install linux-{image,headers}-5.15.0-3-amd64 linux-kbuild-5.15
$ sudo apt install nvidia-driver/testing xserver-xorg-core/testing
$ sudo apt install xserver-xorg-input-all
$ sudo nvidia-xconfig

他にもステップの途中でautoremoveを求められるパッケージで削除されては困るものをインストールしました。

$ sudo apt install xdg-dbus-proxy libwayland-client0

startxで動作テストに成功した後、Xが使えないカーネルは削除しました。

unstable版のパッケージに戻してよいかのチェック

unstable版のパッケージに戻してよいかは、以下のapt -s installコマンドで確認できます。

$ sudo apt update
$ sudo apt -s install xserver-xorg-core/unstable nvidia-driver/unstable xserver-xorg-video-nvidia/unstable

新しいカーネルに戻す場合は、linux-image-<version>-<ARCH>linux-headers-<version>-<ARCH>だけでなくlinux-kbuild-<version>パッケージもインストールするようにしてください。

参考