3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【中学生カーネル探求記】なぜBashを使わない?自作OSのためにRustで「究極のミニマルシェル」を開発した話

Posted at

もし皆さんがOSの心臓部を自分で設計するプログラマーだったら、どんな「シェル」を選びますか?

たぶん多くの方は、「普段使い慣れているBashやZshで十分ではないか」とお考えになるかと思います。もちろん、それらは最高に使いやすく、パワフルなツールですよね。私も日頃から大変お世話になっています。

でも、私は深く考えたんです。 「もし私が、ゼロから自分のOSを作るなら、その上で動かすシェルも、全部自分の手でコントロールしたい!」 って。まるで、自分で育て上げたOSの「声」を、自分が開発したシェルを通して聞きたい、そんな衝動に駆られました。

ご挨拶が遅れました。中学3年生プログラマーのAqua です。🌱

普段は学校に通いながら、コンピュータのいちばん根っこにある「低レイヤー」の世界に夢中になっています。OSのカーネルを自分で作ってみたり、WebブラウザやJavaScriptエンジンの仕組みを奥深く掘り下げてみたり…ちょっとマニアックって言われるかもしれませんが、この探求が私の毎日の楽しみなんです。そして今回、この低レイヤーへの情熱が、一つのプロジェクトになりました。

それは、 「自身のOSのためだけの、究極にミニマルで、本質的なシェルを、Rustでゼロから開発すること」 です。

この記事では、私がなぜこの挑戦に至ったのか、そしてRustで開発中のシェル「NexusShell」がどんな風に動いているのか、私の熱い思いをたっぷり込めて語らせていただきますね!

🚀 プロジェクトの始まり:なぜ私は「自分のOS」のためにシェルを自作したのか?

皆さんが日々コマンドを打ち込む「シェル」。これはコンピュータと対話するための、まさに「玄関」のような存在です。BashやZsh、WindowsならPowerShellなんかがその代表格ですよね。

これらのシェルは確かに便利で高機能です。だけど、私が「自分のOSを作る」という夢を追いかける中で、ある疑問が湧いてきました。「もし私の自作OSにシェルを載せるなら、既存の巨大なシェルでいいのだろうか?」と。

もちろん、既存のシェルは完成度が高いものです。だけど、規模が大きすぎて、その内部の全てを私が把握し、完全にコントロールすることは難しいと感じました。そして何より、私の自作OSは「軽量性」と「本質的な機能」を追求したいという目標があります。そのような私の哲学とは、少しだけ方向性が異なるように感じたんです。

だから私は決心しました。「よし、自分のOSのためだけの、究極にミニマルで、本質的なシェルを、ゼロから作ろう!」これが、私がRustで「NexusShell」というプロジェクトを始めた、一番の理由なんです。

✨ NexusShellの心臓部:Rustで自作したコマンドの数々

私が目指しますのは、決してBashやZshのような超高機能なシェルではありません。まずは、自作OS上で開発や基本的な操作ができるように、本当に必要な最小限のコマンドを、私自身がRustで一から実装することにこだわりました。

私が記述したRustコードは約1400行です。OS全体や大規模なシェルに比べれば、確かに「非常に小規模」です。ですが、この1400行には、私の低レイヤーへの探求心と、「一つ一つの機能を自分の手で作り上げる」という、私にとっての最高の喜びが詰まっています。

1. ファイルシステム操作の基礎を「自作」するということ

lscdmkdirrm といった、日常的に使用する基本的なファイル・ディレクトリ操作コマンドは、私が自分でRustで実装しました。

  • ls: ファイルの一覧を表示します。-a (隠しファイルを含む)、-l (詳細表示)、-h (人間が読みやすいサイズ)、-t (最終更新日でソート)、-r (逆順ソート)、-S (サイズでソート) といったオプションにも対応させています。
    • 私のこだわり: ls -lで表示されるファイル権限やタイムスタンプのフォーマットは、既存のUNIXコマンドの挙動を参考に、Rustの強力な型システムとファイルI/O機能を用いて丁寧に作成しました。特にタイムスタンプの表示は、chronoクレートを使用して正確な時刻情報を取得しています。このような細部にまで自分で手を動かせるのが、自作の醍醐味だと感じています。
  • cd: カレントディレクトリの変更を行います。パスの解釈やエラーハンドリングも自ら実装しました。
  • mkdir / rm: ディレクトリの作成・削除を行います。再帰的な削除なども含め、シンプルながら堅牢な動作を目指しました。

2. テキスト処理と検索も「自分の手で」

ファイルの内容を確認したり、特定の文字列を検索したりするコマンドも自作しました。

  • cat: ファイルの内容をターミナルに表示します。巨大なファイルでも効率的に表示できるように意識しました。
  • grep: ファイル内の文字列検索を行います。正規表現にも対応させています。regexクレートを使用してパワフルな検索を実現しました。これは、ログファイルから特定のエラーを探したり、コードベースから特定のパターンを見つけたりするのに非常に便利です。
  • find: ファイルやディレクトリを検索します。ファイルタイプ(-type fでファイルのみなど)を指定して検索できるようにしました。再帰的にディレクトリを探索するロジックも、walkdirクレートを使いつつ自ら制御しています。

3. シェルの「顔」となる基本機能とシステムユーティリティ

プロンプトの表示から、システムの簡易的な情報取得まで、シェルとしての「顔」となる部分も私の手で構築しました。

  • 対話型プロンプト: 皆さんが普段見慣れている「ユーザー名@ホスト名:カレントディレクトリ$」形式のプロンプトです。whoamiクレートを使用してユーザー名やホスト名を取得し、std::envでカレントディレクトリを管理しています。
  • コマンド履歴: rustylineクレートを使用して、入力したコマンドを記憶し、上下の矢印キーで簡単に呼び出せるようにしました。これは開発効率に直結する、本当に重要な機能です。
  • エイリアス機能: llls -laのエイリアス)やhhelpのエイリアス)など、よく使うコマンドに短い別名を付けて、タイピング量を減らせるようにしています。
  • 環境変数: 内部で簡易的な環境変数管理を行っています。
  • echo / sort / clear_screen: 文字列出力、テキストソート、画面クリアといった基本的なユーティリティコマンドも実装済みです。特にclear_screenではcrosstermクレートを直接操作して、ターミナルをクリアしています。
  • version / help / whoami: シェルのバージョン情報、コマンドリスト、現在のユーザー情報などを表示します。
  • show_performance_metrics: NexusShell自身の簡易的なパフォーマンス(CPU使用率、メモリ使用量)を表示するコマンドです。これは私が低レイヤーに興味があるからこそ、シェル自体がどのようなリソースを使用しているのかを把握したいという思いから実装しました。

💻 開発におけるこだわりと「未来」へのビジョン

現在のNexusShellは、主にWindows環境で動作テストができるように構築しています。しかし、これはあくまで私の究極の目標「自作OSへの組み込み」のためのステップなんです。

1. 既存OSSへの依存を極限まで減らす理由、今一度

私は、既存の強力なツール(Bashなど)をそのまま利用するのではなく、なぜ自分で一から開発することにこだわったのか? 今一度、私の「なぜ?」をお伝えさせてください。

  • 完全な理解と制御: 私の自作OSの基盤となるシェルは、その隅々まで自分でコードを記述し、その動作原理を完璧に理解したいと考えています。ブラックボックスをなくし、すべてが自分の手の中にある感覚を味わいたいんです。
  • 軽量性: 私が開発する自作OSは、必要最低限のリソースで動作することを目標としています。巨大なシェルを搭載するのではなく、私が要求する機能だけを持つミニマルなシェルを自作することが、その目標に最も合致するんです。
  • 思想との合致: 私がOSやJSエンジンの自作に熱中していますのは、「なぜコンピュータは動作するのか?」という根源的な問いを探求したいからです。シェルもまた、OSと直接対話する存在として、その探求の、まさに最前線に位置していると考えています。

2. Rustを選んだ理由、そして「未来」へ向かう道筋

この「究極のミニマルシェル」を開発する言語としてRustを選んだのは、パフォーマンスとメモリ安全性の両立が最大の理由です。OSの根幹に関わる部分だからこそ、高速に動作し、かつクラッシュしにくい堅牢さが求められます。Rustはまさにその要求に応えてくれる、私にとって最高の言語です。

そして、このNexusShellの最大の目標は、私が開発中の自作OSの標準シェルとして機能させることです。今はstd::process::Commandで外部コマンドを呼び出したり、std::fsでファイルシステムを操作したりしていますが、将来的にはこれらの処理を、私の自作OSのカーネルが提供するシステムコールを直接呼び出す形に書き換えていく計画です。

例えば、lsコマンドは、最終的には自作OSのファイルシステムと直接やり取りするシステムコールを呼び出すようになるでしょう。外部コマンドの実行も、OSカーネルのforkexecに相当する私自身の機能と連携する形で、真のプロセス管理をシェル側で担うように進化させていこうと思っています。

これは、私にとって非常に大きな挑戦であり、まさに「夢」そのものなんです!

🚀 最後に:私の小さな挑戦が、誰かの心に火を灯すかもしれない

私がRustでシェルを自作していますのは、まだ道のりの途中です。非常に小規模なプロジェクトではありますが、この「NexusShell」の開発を通じて、私は日々新しい発見と学びを得ています。

OSの奥底にある仕組みや、コマンドがどのように動作しているのか、なぜRustが素晴らしいのか…私のこの挑戦が、皆様の低レイヤーへのご興味や、何かを「ゼロから作り上げる」ことの楽しさを知るきっかけに、少しでもなれば、私は本当にうれしいです!

ぜひ、このプロジェクトに関する皆様からのコメントやご意見、アドバイスをいただけますと、大変励みになります!これからも、低レイヤーの世界を探求し続けていきます!


📚 関連情報

📱 連絡先


3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?