11 ポイント 投稿者 GN⁺ 2025-02-21 | 24件のコメント | WhatsAppで共有

LinuxカーネルにRustを導入すべき理由

  • 過去15年間にわたり、ほぼすべてのLinuxカーネルのバグ修正とセキュリティ問題を見てきた経験をもとに、Rust導入の必要性を語りたい
  • すべてのバグ修正が安定版ツリーに反映されるわけではないが、おおむね重要なものは反映されており、私はすべてのカーネルCVEを確認する立場にある

Cの限界とRustの利点

  • Linuxカーネルで発生するバグの大半は、C言語の構造的な限界に起因している
  • 特に、単純なミスによって発生するバグが多く、このような問題はRustではほとんど発生しない
    • メモリ上書き(Rustがすべてのケースを検出できるわけではないが、かなりの部分を解決できる)
    • エラーパスのクリーンアップ問題
    • エラー値のチェック漏れ
    • Use-after-free(解放後使用)バグ
  • Rustをカーネルに導入すれば、開発者やメンテナーはこうした初歩的なミスから解放され、本当に難しい問題(ロジックエラー、競合状態など)に集中できる

既存のCコードベースも引き続き維持する必要がある

  • 現在のLinuxカーネルは3,000万行を超えるCコードで構成されており、短期間でこれをRustに置き換えることは不可能である
  • したがって、KeesやGustavoをはじめとする開発者たちが進めているCコードのセキュリティ強化作業は不可欠であり、継続されるべきである
  • Rustが既存コードを置き換えるのではなく、新しいコード(特にドライバ)をRustで書いて問題を減らす方式が理想的である

Rustが提供するAPIの安全性

  • Rustはカーネル内部APIをより安全で使いやすく設計できるようにする
  • 現在のCベースのカーネルAPIは複雑でミスを誘発しやすく、メンテナーが細かくレビューしなければならないことが多い
  • たとえば、struct cdevのような構造体を安全に使う方法はいくつもあり、それを正しく活用するには多くの経験が必要である
  • Rustを使えばAPIをより明確に定義できるため、開発者がミスをする可能性を大きく減らせる
  • これは単にRust利用者のためだけではなく、既存のCコード利用者にとっても有益な変化である
広告

Rust導入は難しいのではないかという懸念への反論

  • Rustは万能の解決策ではない → しかし既存の問題のかなりの部分を解決できる
  • メンテナーの負担増 → しかしRust導入を望む開発者たちが自ら作業を進めている
  • 混在言語コードベースの保守の難しさ → しかしLinuxカーネルはこれまで、はるかに難しい問題を解決してきた

結論

  • Linuxは世界中の無数の開発者が問題解決のために使うツールであり、
  • 今やハードウェア向けに安全なコードを書きたいという開発者の要求があるなら、それを無視すべきではない
  • Linuxの開発モデルは誰も予想しなかった規模にまで成長し、卓越したエンジニアリング能力を示してきた
  • いまこそRust導入を通じて、今後20年以上の発展に向けて進むべき時である

新しい技術とアイデアを受け入れ、コミュニティとともに成功できるよう努力しなければならない。

24件のコメント

 
bus710 2025-02-23

Rust の導入は、memory safety を考えると避けがたい変化でしょう。おそらく適度な折衷案を通じて、再び取りまとめを試みるのではないかと思います。

ただ、個人的には Rust のキーワードがあまり目に入ってこなかったり、しばらくしてから見返したときにまた思い出しにくかったりして、どうも手が伸びないんですよね ;;;; どれも必要なものだとは分かっていますが、英語の不規則動詞を無理やり暗記するような感覚になることがあります。それでも、Rust で書かれた成果物が現場で問題を起こしにくいのもまた事実なので.....

 
lostid 2025-02-22

まだ成熟していない言語をカーネルに含めないということが、ここまで非難されるようなことなのかと思います。今すぐ身の回りで Rust を手慣れたレベルで扱える人を探してみろと言われても、ほとんどいないのではないでしょうか。言語がもう少し成熟し、ユーザーもレガシー言語のユーザーほどではないにせよ十分に確保できた時に含まれても遅くはないと思います。
Rust 言語が有用だということは、Linux カーネルに適用されなくても十分に証明できると信じています。

 
pcpenpal 2025-02-22

Rustが今くらいの段階でも「まだ成熟していない言語」と言われること自体も驚きですが、それとは別に、いまだに安全でない言語の比重をカーネルで減らしていこうというのが、ここまで非難されることなのかと思います。実際、周りにC言語でカーネルに貢献できるほど習熟したうえで安全なコードを書ける人が、そんなに多いでしょうか。C言語にこれ以上の成熟を期待するよりも、新しい時代の要求が十分に整った今こそ、遅すぎない時期なのだと思います。

Rustはすでに有用であり、カーネルに取り込まれようとしているのは、その有用性を証明するためではないのでしょう。

 
aer0700 2025-02-22

最初にRustを導入しようとしたとき、議論はあったのだろうとは思う。
Cの熟練者とRustの熟練者のどちらが層として厚いかを考えると、Cのほうが圧倒的ではあるだろう。
とはいえ、すでにドメイン知識を十分に持っているプログラマが言語を1つ追加で学ぶことが、そこまで大変なことなのかとも思うが、
カーネルを扱う人たちが求める習熟度となると、また別の話なのだろうけど……

 
roxie 2025-02-22

この意見もいいですね

 
nemo1275 2025-02-21

「フォークして出ていけ」という主張は、まったく理解できません。いったいなぜリーナスがLinuxをフォークして出ていかなければならないのでしょうか?

 
regentag 2025-02-22

リーナスに「フォークして出ていけ」と言う人がいるんですか? この論争でそんなことを言う人は見たことがない気がするのですが..

 
cloverhearts 2025-02-21

私もRustユーザーですが、RustコードとCコードが混在すると、オープンソースでどこまでRustコードを許容するのかという厳格な規約がない限り、制御不能になるか、少なくともレビューや保守のコストが非常に上がるように思います。なので、追加せずにforkするのが最も賢明な選択だと見ています。

 
aer0700 2025-02-21

カーネルはあまり詳しくありませんが、CコードをRustに自動翻訳できるならいいなと思います。もちろん、コード翻訳の問題だけでなく人の問題もあるでしょうが。

 
regentag 2025-02-21

カーネルにRustを導入してほしい人がこれほど多いのなら、フォークして新しいプロジェクトに移ればいいのではありませんか? そうして十分に成熟したら、主要なディストリビューションがRustベースのカーネルへ移行することになるでしょう。
なぜお互いに争っているのか、よく分かりません。

 
gurugio 2025-02-21

カーネル開発の経験がある方なのか私にはよく分からないので、何と申し上げればよいのか分かりませんが、
まず、Rust言語を適用するというのは、カーネルをRustに置き換えようという話ではありません。分離して別のカーネルを作ればいいのではないかと思われるかもしれませんが、
Rust言語でカーネルを作ろうというのではなく、カーネル内でデバイスドライバ向けのインターフェースだけをRustでwrapperとして作り、デバイスドライバだけをRustで
作れるように改善してみよう、ということです。ですので、新しいプロジェクトにするというのは意味がありません。

 
regentag 2025-02-21

Linux側の開発をしたことはありません。
デバイスドライバのRustラッパーは、カーネルから切り離せない構造なのですね...

 
mammal 2025-02-21

カーネルの安定性を理由に攻撃的な物言いを正当化してきたLinuxコミュニティが、今になって「気に入らないならフォークしろ」という反応を理にかなった返答だと見なしているのは、なんとも皮肉ですね。

 
regentag 2025-02-21

私はLinuxコミュニティの人間ではありませんが...

 
roxie 2025-02-21

その方々とこのコメントの投稿者を同じコミュニティと見なすべきではないと思います。

 
jeiea 2025-02-21

フォークした結果がマイグレーションになるのか、群雄割拠の時代になるのか予想しにくいところがありそうです。
フォークした後もアップストリームの変更事項を反映するのは、あまり気分のよい状況ではなさそうです。

 
savvykang 2025-02-21

https://ja.news.hada.io/topic?id=16860
Realtime Linuxのフォークが20年ぶりに統合されたことを見ても、フォークは慎重に判断すべきではないかと思います

 
regentag 2025-02-21

私はこれを見てそう話していたんです。
リアルタイム機能を長い間カーネルから分離したプロジェクトとして維持できていて、必要な人はそれを取り込んでカーネルに適用して使えばよかったんですから。

 
ilsubyeega 2025-02-21

Rustユーザーではありますが、r/rust に投稿された hgwxx7_ のコメントが印象的でした1

I think what Greg does really well here is demonstrating technical leadership.Leadership doesn't mean being right. He is right, but that's not the point.

Leadership means bringing along on the path he thinks is best. He doesn't crack the whip, chiding or coercing maintainers who disagree. Instead, he first acknowledges their very valid concerns about maintaining a code base with two languages. This is good, because they're right about that, their lives do get harder before they get easier.

He then ends on an inspirational note, pointing out that they've done much harder things and this is well within their abilities. He gently nudges them to welcome R4L devs.

Absolute masterclass of leadership.
I don't know if the other maintainers will be convinced when they read this. But it's hard for me to imagine a more convincing pitch than this one.

 
gurugio 2025-02-21

stableバージョンへのバックポートが必要になるなどして連絡してみると、あれほど忙しい中でもきちんと返事をくれたのを覚えています。

 
codemasterkimc 2025-02-21

"Rustで新しいコードを書くことは、みんなにとって利益になる" - Greg K-H

"Rustが唯一の正解ではないが、JavaやPythonよりは正解に近い" -codemaster kimc-

 
GN⁺ 2025-02-21
Hacker Newsの意見
  • Rustバインディングがあると、カーネルの内部ABIを自由に進化させにくくなり、プロジェクトがCコアとRust側に分裂するリスクがある。ただし、内部APIが安定化すればLinuxにとって利益になる可能性がある
  • 主要な問題はコミュニティと人である。現在カーネル作業をしている人たちがこの方向性を好まないのであれば、大きな問題になる
  • Linuxのリーダーシップは人の問題に十分注目していないように見える。現在カーネル開発をしている人たちがこの方向性に同意している証拠がどこにあるのか疑問である
  • Rustを受け入れることで得られる利益よりも苦痛のほうが大きいと考える人たちがいる。別の方法でも利益は得られるはずだと考えている
    • たとえば、bounds checkingやRAIIのような単純な割り当て/解放の簡略化は、Rustなしでも可能かもしれない
    • Clangを必須コンパイラにし、こうした拡張を採用すれば、より容易に効果を得られる
  • 新しいコード/ドライバをRustで書けば、この種のバグは発生しない。これは皆にとって利益である
  • ほとんどの人はメモリ安全性を望んでいるが、全体のメンテナになることは望んでいない
  • プロジェクトの実際の目標は、内部カーネルAPIの表面をモダン化することである。RustでこのAPIを書いたときにどこまで耐えられるかが、進捗を測る最良の尺度である
  • 過去15年間にほぼすべてのカーネルのバグ修正とセキュリティ問題を見てきた者として言えば、ほとんどのバグはCの小さなコーナーケースで発生している。Rustではこうした問題が消える
  • 新しいコード/ドライバをRustで書けば、この種のバグは発生しない。C++はこのような利点を提供しない
  • RustはカーネルAPIを定義する際の誤りをほぼ不可能にする。これはLinux全体をより良くする
  • Rustバインディングは魔法のように見えるが、学び、開発者たちと協力していく意思がある
  • Rustはあらゆる問題を解決する銀の弾丸ではないが、多くの面で役に立つ
  • Linuxは誰もが問題を解決するための道具である。開発者がハードウェア向けのコードを書くとき、こうしたバグが発生しないことを望んでいる
  • 混在言語のコードベースは保守が難しいが、私たちはカーネル開発者である。新しいアイデアを受け入れ、ともに成功するため努力すべきだ
  • この議論を前に進めるために、この声明が必要だった
  • 技術的な利点に焦点が当てられている一方で、新しいプログラミング言語/ツールチェーンを学ぶ努力が適切に評価されていない
  • 新しいプログラミング言語を習得するのは簡単ではなく、個人的な関心や動機の問題から望まないメンテナもいるかもしれない
  • C++言語委員会の問題は、誰もができるだけ早くその言語を捨てるべきだということを示している
 
hbahk42 2025-02-22

こういうヘイトコメントは通報できないのですか?

 
kodingwarrior 2025-02-22

同意します。