7月3日、Phoronixが「Rust Coreutils cp Ended Up Breaking Ubuntu Image Builds With Latest Incompatibility」と題した記事を公開した。Rust製Coreutilsのcpコマンドが引数処理の非互換性によってUbuntuのLiveメディアISO生成を破壊した問題を詳報している。
「Rustに置き換えればメモリ安全になる」——その前提は正しい。しかし、既存ツールとの動作互換性という別の問題が、Rust移行を進めるUbuntuで何度も顕在化し続けている。今回はその最新事例だ。
Rust製cpがUbuntuのLiveメディアISO構築を壊した
UbuntuはUbuntu 25.10からGNU CoreutilsをRust実装(uutils/coreutils)に段階的に置き換える移行を進めている。uutils/coreutilsは、コミュニティ主導でGNU Coreutilsとの互換性を目標に開発が続けられているオープンソースプロジェクトだ。Canonicalはこの移行によってシステム全体のメモリ安全性向上を図っている。
今回問題になったのは、cpコマンドへの-afLという引数の組み合わせだ。-a(アーカイブモード:属性・パーミッションを保持して再帰コピー)、-f(強制上書き)、-L(シンボリックリンクを参照先の実体としてコピー)を同時に指定した場合、Rust実装が-Lの処理を誤り、UbuntuのLiveメディアISO構築スクリプトが失敗するという問題が発生した。LaunchpadのバグレポートはこのIssueを「critical」に分類している。
これが初めてではない
この問題は、移行に伴うトラブルの最新版に過ぎない。Ubuntu 25.10以降、次のような問題がすでに報告されていた:
これらは移行初期に集中して報告されたものだが、今回の問題は「落ち着いたはず」の段階で再び互換性の綻びが見つかったことを示している。
「ビルドスクリプト側を直す」案も出たが、差し戻しが選ばれた
バグレポートでは、GNU Coreutilsに差し戻すのではなく、ビルドスクリプト側を修正するという代替案も提案されていた:
「差し戻しを繰り返していると、こうしたエッジケースを捕捉できなくなる恐れがある。今回もビルドが失敗したからこそ気づけた。代わりに、configファイルにパッチを当てることを検討してはどうか。
cp -afLの組み合わせは1箇所しか使われていない。cp -RL --preserve=all $entry config/のような形に変更できるかもしれない。ローカルで確認したところ動作した。」
-Lをより明示的な-R(再帰)+--preserve=all(全属性保持)に分解することで、Rust実装のシンボリックリンク処理の問題を回避できるという判断だ。しかし最終的には、過去の他のバグと同様にcoreutils-fromパッケージの更新として**cpをGNU Coreutils版に差し戻す**対応が選ばれた。
上流への修正PRはまだマージされず
Rust Coreutils上流リポジトリには修正PRがすでに提出されているが、記事執筆時点ではまだマージされていない。
cpは一見シンプルなコマンドに見えて、シンボリックリンク処理・属性保持・再帰動作といった複数のオプションが組み合わさったとき、細かな動作差異が実運用で顕在化しやすいコマンドの一つだ。「メモリ安全」と「動作互換」は独立した問題であり、片方の解決がもう片方を保証するわけではない。Ubuntuの移行はその点を実地で示し続けている。
詳細はRust Coreutils cp Ended Up Breaking Ubuntu Image Builds With Latest Incompatibilityを参照していただきたい。