Linux デバイスドライバをバックポートする
(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 以上を要求するように変更するとのことです。
バックポートを実行
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
-
構文の具体的な変更点はこちらの issue を参照してください。 https://github.com/coccinelle/coccinelle/issues/135 ↩︎
-
1.0.5 はビルドできないので 1.0.4 を使用しています。 ↩︎
Discussion