Ubuntu Weekly Recipe

第913回Ubuntu 26.04 LTSで本格的に進むRust版coreutilsへの移行

Ubuntu 26.04 LTSの大きな変更点のひとつがsudoとcoreutilsがRust版になったことです。今回はこのRust版のツール、特にcoreutilsに関してと、その経緯・状況を詳しく紹介しましょう。

図1 Ubuntu 26.04 LTSでは大半のcoreutilsコマンドがRust製に置き換わっており、一部のみがGNU版になっている。ただし置き換わったコマンドも「gnu」のプレフィックスを付ければ利用可能

Ubuntu 26.04 LTSのsudo/coreutils事情

第902回のUbuntu 26.04 LTSの変更点 ⁠24.04→26.04 LTS編]でも紹介したように、Ubuntu 26.04 LTSではcoreutilsがGNU版からRust版に置き換わりました[1]。さらにsudoコマンドもRust版になっています[2]

sudoコマンドは説明するまでもなく、UbuntuのCLIにおいて、特権へと昇格するために必要なコマンドです。26.04では従来のsudoコマンドがsudo.wsの名前になり、update-alternativesの仕組みでRust版のsudoが選ばれています。

$ update-alternatives --display sudo
sudo - 自動モード
  最適なリンクのバージョンは '/usr/lib/cargo/bin/sudo' です
  リンクは現在 /usr/lib/cargo/bin/sudo を指しています
  リンク sudo は /usr/bin/sudo です
/usr/bin/sudo.ws - 優先度 40
/usr/lib/cargo/bin/sudo - 優先度 50

基本的にRust版のsudoをそのまま使っていれば良いはずです。もしどうしてもオリジナルのsudoへと戻したい場合は、一時的にsudo.wsコマンドを実行するか、次のコマンドで切り替えてください。

$ sudo update-alternatives --set sudo /usr/bin/sudo.ws

coreutilsについてはsudoと比べるとより複雑です。もしかするとそもそもcoreutilsとはなんぞやと思う方もいるかもしれません。

従来のcoreutils(GNU Core Utilities)は、GNUプロジェクトで開発しているUnix系オペレーティングシステムで一般的な各種コマンド類を提供するソフトウェアです。具体的にはcpやmv、lsなどのファイル・ディレクトリの操作ツールと、catやtailなどのテキストファイルを扱うツールをひとつにまとめたものとなっています。一般的な用途のLinuxディストリビューションであれば、おおよそインストールされているソフトウェアです。

簡単に言うとUnix系ユーザーがCLIの操作画面に触れたとき、無意識に打ってしまうコマンドのほとんどがcoreutilsに含まれています。

Ubuntu 26.04 LTSでは、そのほぼすべての実装がRust版に置き換えられました。

  • 従来のcoreutils(gnu-coreutils)の提供するコマンドにはすべて「gnu」のプレフィックスが付く名前に変更(例:cpがgnucpになるなど)
  • Rust版のcoreutils(rust-coreutils)は、/usr/lib/cargo/bin/coreutils/以下にコマンドがインストールされる
  • /usr/bin/cpなどのコマンドファイルパスは、上記のいずれかへのシンボリックリンクになる

これにより、システムとしてはGNU版とRust版の両方をインストールしつつ、必要に応じて使い分けられるようになっています[3]

たとえばmkdirコマンドの場合は次のようになっています。

24.04ではただのバイナリファイル:
24.04$ ls -lh $(command -v mkdir)
-rwxr-xr-x 1 root root 75K Jan 23 13:30 /usr/bin/mkdir

26.04ではシンボリックリンクになっている:
26.04$ ls -lh $(command -v mkdir)
lrwxrwxrwx 1 root root 32 Mar 31 01:50 /usr/bin/mkdir -> ../lib/cargo/bin/coreutils/mkdir
26.04$ ls -lhL $(command -v mkdir)
-rwxr-xr-x 115 root root 11M Apr 16 21:41 /usr/bin/mkdir

ただしすべてがRust版に置き換わったわけではありません。次にあげるコマンドはいくつかの事情によりGNU版のままとなりました。

$ find /usr/bin /usr/sbin -type l | xargs ls -l | grep '\-> gnu'
lrwxrwxrwx   1 root root  5 Mar 31 01:50 /usr/bin/cp -> gnucp
lrwxrwxrwx   1 root root  5 Mar 31 01:50 /usr/bin/df -> gnudf
lrwxrwxrwx   1 root root  5 Mar 31 01:50 /usr/bin/mv -> gnumv
lrwxrwxrwx   1 root root  5 Mar 31 01:50 /usr/bin/rm -> gnurm
lrwxrwxrwx   1 root root  7 Mar 31 01:50 /usr/bin/true -> gnutrue

GNU版のままとなっているコマンドも2026年10月リリース予定のUbuntu 26.10までに修正され、Rust版に完全移行する予定です。

実装を勝手に変えられると困るんだけど!

coreutilsに存在するコマンド類は、さまざまなスクリプトやソフトウェアから呼び出されるものです。Ubuntuのリポジトリにあるパッケージでなく、世界中のユーザーが作成したスクリプトからも呼び出される可能性もあります。Rust版のcoreutilsが、GNU版のそれと完全に互換性を維持していれば問題ありません。しかしながら実際には挙動に大小問わず様々な違いが存在します。意図しない不具合によって差異が生じてしまうこともあるでしょう。

そこでUbuntuでは、次のようなフェーズで幅広いテストを募ってきました。

  • 2025年4月に、24.04および25.04で誰でもすぐにRust版coreutilsを使えるようにし、テストを募集した
  • 2025年10月にリリースされたUbuntu 25.10から、Rust版coreutilsを標準で採用し、26.04に向けて各自の環境で試すよう依頼した

その結果としてUbuntuのシステムレベルではほぼ問題ないように作り込んできました。不具合報告の状況から、26.04で移行してもほとんどのユーザーにとって問題ないだろうと判断した結果の対応となります[4]

しかしながら、取りこぼしもあるかもしれません。さらに、残念なことに「26.04がリリースされないと動作確認をしない」タイプの人もそれなりに存在します。そういう人に限って、自身の怠慢を棚に上げて文句だけを言いつつ、結局不具合報告はしなかったりするのです。はい、すみません。自分自身のことです。

残念なことに移行の開始から1年で、網羅的に動作確認できたとは言い難いのも事実です[5]。さらに英語以外の環境で発生する問題も、発見されづらい傾向があります。特にクラウド・コンテナなどサーバー用途のユーザーにとって、26.04への更新に二の足を踏んでしまうのは仕方がないところでしょう。

幸いLTSでは「ポイントリリース」が存在します。つまり7月から8月にかけて予定されている、26.04.1のリリースまでに正しいチャンネルで不具合を報告し、修正手順などを提供できれば、26.04.1のリリースまでには修正されている可能性があります。

たとえばユーザーがテスト環境でUbuntu 26.04 LTSを使い、問題点を洗い出したとします。上記の事情を踏まえたうえで、26.04に移行するにあたって考えられる対策は次のいずれかです。

  1. Rust版の挙動に合わせて作り込む
  2. 不具合として報告し、積極的に修正作業に参加する
  3. GNU版を使うように作り込む(gnuFOOのコマンドを使うようにする)
  4. Ubuntu 24.04 LTSを使い続ける
  5. すべてのcoreutilsコマンドをGNU版に切り替える

Ubuntu的なおすすめは案1か案2です。ただしそれができれば苦労はしません。そもそも問題とは、発覚しない限り認識できないのですから、移行したあとしばらくたってから気づくことも多々あります。第902回でも紹介したように、小さなスクリプトだけであれば案3のようなスクリプト自体をGNU版にしてしまう手もあります。

一番現実的なのは案4です。正直な話、coreutilsの変更によって容易ならざる影響を受けるようなシステムのうち、果たしてどれくらいのシステムが「Ubuntuのアップグレード」に耐えられるのでしょうか。coreutilsの変更の有無に関係なく、24.04をそのまま使い続けてしまうほうが安心です。幸いなことに、24.04は2029年までサポートされます。Ubuntu Proを使えば2034年までセキュリティアップデートを受けられますし、有償のUbuntu Pro Legacyを使えば2039年まで使い続けることが可能です。

どうしてもUbuntu 26.04 LTSが使いたいのだけれども、絶対にGNU coreutilsでないとダメだという特殊なケースもあるかもしれません。その場合は、次項で紹介するようにRust版からGNU版に切り替えてしまいましょう。

GNU coreutilsに戻したい!

Ubuntu 26.04 LTSではGNU版とRust版のcoreutilsがどちらもインストールされています。初期状態ではRust版を使うようになっていますが、パッケージをインストールし直すことでGNU版に切り替えることが可能です。

まずは26.04のパッケージの構成を確認しましょう。

coreutils
従来のcoreutilsのパッケージ名。26.04ではcoreutils-from-uutilsもしくはcoreutils-from-gnuに依存するただのメタパッケージになった
coreutils-from-uutils
Rust版のcoreutils一式へのシンボリックリンクを提供するパッケージ。coreutils-from-gnuとは同時にインストールできない
coreutils-from-gnu
GNU版のcoreutils一式へのシンボリックリンクを提供するパッケージ。coreutils-from-uutilsとは同時にインストールできない
rust-coreutils
Rust版のcoreutilsを提供するパッケージ。コマンドは「`/usr/lib/cargo/bin/coreutils/`」にインストールされる
gnu-coreutils
GNU版のcoreutilsを提供するパッケージ。コマンドは「`/usr/{bin,sbin}/`」にインストールされる

rust-coreutilsとgnu-coreutilsは同時にインストールできるのですが、coreutils-from-uutilsとcoreutils-from-gnuはどちらか片方しかインストールできません。そのためシンボリックリンクの状態は一意に決まるのです。

よってGNU版に切り戻すにはcoreutils-from-uutilsを削除して、coreutils-from-gnuをインストールする必要があります。

$ sudo apt install coreutils-from-gnu coreutils-from-uutils- --allow-remove-essential
Installing:
  coreutils-from-gnu

REMOVING:
  coreutils-from-uutils

WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
  coreutils-from-uutils

Summary:
  Upgrading: 0, Installing: 1, Removing: 1, Not Upgrading: 0
  Download size: 6902 B
  Freed space: 1024 B

Continue? [Y/n]

coreutils-from-uutilsパッケージはUbuntuにとって必須パッケージ扱いであり、これを削除するには--allow-remove-essentialオプションが必要です。これを付けないと問答無用でエラーになります。

無事にインストールできたら、Rust版にリンクされているファイルを探してみましょう。次のようにsudoコマンド系だけになるはずです。

$ find /usr/bin /usr/sbin -type l | xargs ls -l | grep '\-> .*cargo'
lrwxrwxrwx 1 root root 19 Mar 11 13:27 /usr/bin/su-rs -> ../lib/cargo/bin/su
lrwxrwxrwx 1 root root 21 Mar 11 13:27 /usr/bin/sudo-rs -> ../lib/cargo/bin/sudo
lrwxrwxrwx 1 root root 21 Mar 11 13:27 /usr/bin/sudoedit-rs -> ../lib/cargo/bin/sudo
lrwxrwxrwx 1 root root 23 Mar 11 13:27 /usr/bin/visudo-rs -> ../lib/cargo/bin/visudo

これで24.04までと同じ、GNU coreutilsのみを使う環境になりました[6]

ただし一点だけ注意が必要です。build-essentialパッケージをインストールしている環境では、GNU版coreutilsに切り替えられません。build-essentialは本来パッケージのビルド環境を構築するためのメタパッケージとして提供されていました。build-essentialがRust版coreutilsに依存しているのは、パッケージビルドサーバー上でのビルドを確実にRust版coreutils環境で行うためです。当初は一時的な対応だったのですが、検討した結果としてこのままRust版coreutilsに依存し続けることとなりました。

もしお手軽にコンパイル環境を容易するためにbuild-essentialをインストールするだけであれば、build-essentialパッケージを削除してから上記手順を実行してください。

問題はcuda-toolkitをはじめとする様々な開発系ツールが、その依存関係の結果としてbuild-essentialパッケージを必要としていることです。そのような環境では、coreutils-from-uutilsを削除できず、Rust版coreutilsを使い続ける必要があります。

なんでLTSでこんな大きな変更をしたの?

ここからは単なる背景の説明です。あえて26.04でcoreutilsを変更した理由としてUbuntuのLTSが20周年を迎えて、今後の20年も採用され続けるUbuntuを作ることがあげられています。

おそらく他にも政治的・経済的・戦略的理由はありそうですが、契機のひとつは2025年2月に開催されたFOSDEM 2025の発表でしょう。Debian Developerとして、主にRust関連パッケージのメンテナンスをしているSylvestre Ledruが、コロナ禍によるロックダウン時の時間を使ってはじめたのがcoreutilsをRustで置き換えるuutilsプロジェクトです[7]

ポイントはRustで書き換えた理由です。C言語に対するメモリ安全性や並行処理の作りやすさなどRustの利点をあげているものの、Sylvestre自身はセキュリティが理由ではないとも伝えています。実際Debianパッケージの観点だと、coreutilsのCVEはそこまで多くありません[8]。それよりはより現代的なプログラミング言語とエコシステムを使うことでより若い開発者を呼び込めないかと考えていたようです。

FOSDEMの発表の中では、GNU coreutilsで使っているテストツールのスコアがあがってきたことや、MicrosoftのVisual Studio CodeでもRust版coreutilsが採用されたことなどから、すでにプロダクションで使われているとも紹介しています。

2025年の3月には、CanonicalのJon SeagerがCarefully But Purposefully Oxidising Ubuntu(慎重に、しかし着実にUbuntuをRust化していく)と題した記事を投稿します。そこにはUbuntuの近代化(Modernization)の一環として、半年後にリリースされるUbuntu 25.10においてRust版のcoreutilsを採用する計画が提示されます。

採用する理由としてUbuntuの堅牢性と安全性の向上をあげていました。つまりセキュリティも主目的のひとつとなったのです。ただし、既存の実装が脆弱であるとの考えではなく、今後新しいコントリビューターたちがRustを使うことで、危険なコードをコミットしてしまう可能性を下げながら効率よく開発を進められるようにするとの表現をしていました。いずれにせよ、この時点で「すぐにRust版のcoreutilsをUbuntuで試せる」ようになっており、25.10に向けてさまざまな課題に対応していく流れができます[9]

Ubuntu 25.10のリリースではsudo-rsとともにrust-coreutilsを無事に移行できました。つまりこのリリースで大きな問題が出なかったので、半年後のLTSでの採用も既定路線となります。その後の結末は、ご存知の通りです。

ちなみにリリース後には、26.04の開発中にセキュリティ研究企業であるZellicによる監査が行われたことも報告されました。それによると100件以上の大小様々な問題が見つかったものの、そのほとんどはuutilsプロジェクトに報告され、26.04リリースまでに解消したとのことです。

いずれにせよUbuntu 26.04 LTSでは、Rust版coreutilsの移行が行われました。今後の予定としてはまず積み残しの不具合の修正や、移行しきれなかったcpなどのコマンドの対応が予定されています。2026年10月リリース予定の26.10では、完全に移行する予定です。また、不具合の修正の一部は、26.04にもバックポートされることでしょう[10]

さらにUbuntuのRust化は継続される予定です。直近ではChronyの代わりにntpd-rsを採用する話が浮上しています。この前Chronyに移行したばかりなのに「何言ってんだ」と思いますよね。どうやらNTPだけでなく、NTS(Network Time Security)やPTP(Precision Time Protocol)もまとめて対応してしまおうという思いがあるようです。実はntpd-rs自体はすでにLet's Encryptなどでも採用されている実績があります。26.10でntpd-rsを利用可能にし、27.04で採用する(chronyを置き換える)ことを目指しています。

uutilsプロジェクトでも現在、procpsやutil-linuxなどLinuxなら普通に入っている各種コマンド群のRust版を提供しようとしています。もしかしたらUbuntuも、あと数年で「ベースシステムの多くがRust製」という時代が来るのかもしれません。

おすすめ記事

記事・ニュース一覧