Rust用LinuxカーネルのビルドとRustカーネルモジュールのサンプル

プログラミングLinux

Rustでカーネルモジュール

先日、C言語、アセンブリ以外でカーネルモジュールが書けるようになるというニュースがありました。

Rustというプログラミング言語でカーネルを記述できるようになります。

ということで、カーネルモジュールをお試しで書いてみました。

いくつか、超えるべきハードルがありますので、説明します。

超えるべきハードル

RustでLinuxカーネルを書くための環境作りをやっていきます。

Rust for Linuxのクイックスタートに書いてある通りです。

さて、いくつかやるべきことがあります。

  • Rust用カーネルをダウンロードする
  • LLVM, clangのインストール
  • rustのツールのインストール

どうやるかは順に説明します。

Rust用カーネルをダウンロードする

Linuxの6.1からRust用カーネルがサポートされるそうです。

2022/11/29時点で最新は6.0なので、Linuxカーネルをgitで取ってくる必要があります。これが時間かかりました。

※時間がたてば6.1がリリースされディストリビューション配布のカーネルになるはずです。

# apt install git
$ mkdir ~/rust-linux
$ cd ~/rust-linux
$ git clone https://github.com/Rust-for-Linux/linux.git

以下、git cloneしたソースで作業します。

$ cd linux

2022/12/14追記

ついにLinux 6.1が2022/12/11(アメリカ時間)にリリースされました。

最新機能を試したいときは上記のようにrust-linuxからとってくる方がよいですが、そうでない方はメインラインからとってくればよいことになります。

The Linux Kernel ArchivesでLatestを取得してください。

$ wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.tar.xz
$ tar xvf linux-6.1.tar.xz
$ cd linux-6.1

LLVM, clangのインストール

Debian testingではaptでインストールするだけです。

# apt install llvm libclang-dev

2022/11時点ではUbuntuやDebian stableではaptでインストールできませんので、llvmのビルドをやってください。こちらです。これをやるよりは、Debian testingをインストールする方が楽だと思いますが。

※時間がたてば、安定なディストリビューションで採用されるはずです。

rustのツールのインストール

Rustをインストールしていなければ、インストールしてください。

# apt install curl
$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
$ exec bash

以下でRustのHello Worldをやってます。

>>> HelloWorldへの道 Rust編 Windows上のプログラミング環境構築

rustc

次に、rustcのバージョンを合わせます。

$ rustup override set $(scripts/min-tool-version.sh rustc)

rust-src

Rust標準ライブラリのためのソースをダウンロードします。

$ rustup component add rust-src

bindgen

bindgenをインストールします。

$ cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen

Rust用カーネルのビルド

configをどこからか持ってきてください。私は別のソースで事前にコンパイルしていたので、それを使います。

事前に他カーネルでビルドするのは以下で。

>>> はじめてのLinuxカーネルのビルド方法 手順と気を付けること

$ cp ~/kernel/linux-source-6.0/.config . #ここは人それぞれ
$ make oldconfig
$ make menuconfig

General Seup -> Rust supportをチェックできればOKです。

チェックできない場合(選択肢が出てこない場合もある)は、/rustで検索して、依存するものが正しいかを確認します。

私の場合は、MODVESIONSがnのはずがyだったので、/MODVESIONSを検索してEnable loadable module suport でModule versioning support のチェックをはずしました。

正しく設定を合わせればGeneral Seup -> Rust supportが登場します。チェックしてください。

念のため、以下でRust用カーネルをビルドできるかを確認します。

$ make LLVM=1 rustavailable

何かエラーが出たら対応してください。

以下でカーネルをビルドしてインストールです。

$ make LLVM=1
# make modules_install
# make install

再起動できたら成功です。uname -rで確認してください。

カーネルモジュールを作ってみる

最後に、Rustでカーネルモジュールを作ってみます。

Sampleがsamples/rustにありますので覗いてみてください。

$ make menuconfig

として、Kernel Hacking -> Sample kernel code -> Rust samplesでビルドしたいカーネルモジュールをチェックします。

下記は、Minimalをチェックしているところです。

再びビルドします。

$ make LLVM=1
# make modules_install

rust_minimalを動作させる

rust_minimalを動作させてみましょう。

カーネルモジュールの情報を見てみる。

# modinfo rust_minimal

カーネルモジュールをインストールしてみる。

# modprobe rust_minimal

minimalはdmesgにメッセージを出すだけのカーネルモジュールですのでdmesgで確かめてください。

# dmesg |grep rust

また、モジュールがあるかどうかは以下でも確かめることができます。

# lsmod | grep rust
# cat /proc/modules | grep rust

まとめ

Rust用Linuxカーネルをビルドして、Rustのカーネルモジュールのサンプルを作ってみました。

まだまだ先進機能ですので、ややこしい準備がありましたが、楽しめましたか?

今日からあなたもカーネルハッカーです。楽しんでいきましょう。

>>> 今日を生き抜くプログラミングの知識 Rustの知識

コメント

スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました