🔧

Linux デバイスドライバをバックポートする

2021/02/17に公開

(English version => https://zenn.dev/masap/articles/6df6edaf0fd739 )

バックポートとは

古いカーネルでも新しいカーネル向けのデバイスドライバを使いたい場合があります。そのためには、新しいデバイスドライバを古いカーネル向けに修正する必要があり、これをバックポートと言います。

自力でバックポートすることもできますが、 backports というプロジェクトが開発しているツールを使うことで、容易にバックポートすることができます。この文書では backports を用いたバックポートの手順を紹介します。

手順

Linux 4.4 のドライバを Linux 3.10.108 にバックポートする手順を説明します。

linux-next を取得

backports はこの linux-next ツリーに依存しているため取得します。

cd ~/
mkdir git
cd ~/git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

バックポート先のソースを取得

cd ~/git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
cd linux-stable
git checkout v3.10.108

バックポート元のソースを取得

cd ~/git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/backports/backports.git
cd backports
git checkout linux-4.4.y

coccinelle をインストール

使用しているディストリビューションの coccinelle が 1.0.5 以下であれば下記コマンドでパッケージをインストールします。

sudo apt install coccinelle

coccinelle が 1.0.6 以上である場合は構文が変わってしまう[1]ので使用できません。
そのため下記手順で 1.0.4[2] をソースからビルドします。

git clone https://github.com/coccinelle/coccinelle.git
cd coccinelle
git checkout 1.0.4
sudo apt install pkg-config ocaml-native-compilers ocaml-findlib menhir libmenhir-ocaml-dev libpcre-ocaml-dev texlive-fonts-extra texlive-latex-base
./autogen
./configure
make clean
make
sudo make install

これは暫定措置です。メンテナの Johannes によれば、将来的には backports は 1.0.6 以上を要求するように変更するとのことです。
https://marc.info/?l=linux-backports&m=152585249900819&w=2

バックポートを実行

cd ~/git/backports
./gentree.py --copy-list ./copy-list --integrate --clean --git-revision v4.4 ~/git/linux-next ~/git/linux-stable

結果が下記のように出力されます。

Get original source files from git ...
Applying patches from patches to [your home]/git/linux-stable/backports/ ...
Modify Kconfig tree ...
Rewrite Makefiles and Kconfig files ...
Applying patches from integration-patches/ to [your home]/git/linux-stable ...
Done!

ビルド

以下のようにカーネルコンフィグを変更してからビルドします。

cd ~/git/linux-stable
make menuconfig
[*] Backport Linux v4.4-0-gafd2ff9 (backports v4.4.2-1-0-gbec4037)  --->
make -j9
脚注
  1. 構文の具体的な変更点はこちらの issue を参照してください。 https://github.com/coccinelle/coccinelle/issues/135 ↩︎

  2. 1.0.5 はビルドできないので 1.0.4 を使用しています。 ↩︎

Discussion