オペレーティングシステム
オペレーティングシステム(以下、OSと記載)とは、コンピュータにおいて、ハードウェアを抽象化したインターフェースをアプリケーションソフトウェアに提供するソフトウェアのことです。 つまり、ハードウェアとアプリケーションソフトを仲介するためのソフトウェアと言えるでしょう。 一部の組み込み機器を除き、今ではほぼ全ての機器にOSは当たり前のように搭載されています。 例えば、身近な家電製品である冷蔵庫やエアコンにもOSは搭載されています。 OSにも種類があり、WindowsやMax OS Xなどが有名でしょう。 最近、スマートフォンのCMなどでAndroid(アンドロイド)という言葉をよく耳にすると思いますが、AndroidもOSです。 そしてもちろん、LinuxもOSです。 ただ、「OS」という用語はかなり曖昧に使われており、確立した定義が定められていません。 少し極端な例ですが、ブラウザがOSの一部であるかないかでマイクロソフトとアメリカ司法省が裁判で争ったという話は有名です。 基本的に「OS」という用語は「広義のOS」と「狭義のOS」の2つに分けて考えることが多いです。 広義のOSには、ウィンドウシステムやデータベース管理システム (DBMS) などのミドルウェア、ファイル管理ソフトウェアやエディタ、各種設定ツールなどのユーティリティ、さらにブラウザや時計などの基本的なアプリケーションも含むことがあります。一般的に「OS」という場合はこちらを指すことが多いです。 狭義のOSは、ハードウェアを直接管理操作するなどの最も中心的な機能の部分を、特にカーネルのことを指します。
Linuxとは
Linuxは、1991年に当時まだ大学生であったLinus Torvalds(リーナス・トーバルズ)氏により開発されたOSです。 今から20年以上前に学生によって開発されたLinuxですが、日本で広く知られるようになったのは2000年に入ってからです。 その頃はWindowsが圧倒的なOSシェアを占めており、Linuxは「第2のOS」と言われていました。 しかし、Linuxがオープンソースという形式を採用していることから、世界中の技術者が協力して開発し合うことができたため、Windows一色となりかけていたOS市場の中でも、Linuxのシステム改良やソフトウェアパッケージの開発は進んでいきます。 また、LinuxはGPLというライセンスに従えば、誰でも無料で使えるというメリットが大きな要因となり、そのシェアを着実に伸ばしていきました。 そして、2012年現在、カーナビやルータなどの情報機器、冷蔵庫やオーブンといった家電機器など様々なところでLinuxが採用されており、普段の何気ない生活の中でたくさんLinuxに触れているのです。 企業のサーバシステムもそうですし、世の中の基盤となるシステムでもLinuxは使われています。 さて、上記で「LinuxはOSである」と表現しましたが、OSという用語が非常に曖昧なため、この表現も曖昧です。 正確には「Linux」という用語はカーネルだけを指しています。 Linuxの作者であるLinusTrovalds氏が開発・管理しているのもカーネルだけです。 つまり、「狭義のOS」に該当します。 しかし、「OS」という用語が「広義のOS」の意味として使われることが多いように、「Linux」という用語を「広義のOS」と捉えて、使われることの方が多いです。 ですので、会話の中で飛び交う「Linux」はカーネルを指しているのか、それともOS(広義のOS)を指しているのかを判断するために前後の脈絡を読む必要があります。 しかしそれだけでは、それまでの開発経験だったり環境だったりで、技術者によって捉え方が異なり、どんどん会話が噛み合わなくなっていくこともあります。(Linuxに限らず、コンピュータ用語は曖昧な表現が多いため、そのようなことは往々にしてあります。) そのため、明示的に「Linuxカーネル」「LinuxOS」と呼び分けている技術者も多いです。
カーネル
Linuxは正確にはカーネルのことを指すということを前回の記事で解説しました。 では、カーネルとはいったい何なのでしょう。 カーネル(kernel)とは英語で「核」を意味します。 これは文字通り、カーネルがOSの核であることから、その名が付けられています。 カーネルが行っている動作は主に下記2つです。 ・アプリケーションからの要求(システムコール)に応える ・ハードウェアからの応答をアプリケーションに伝える 実にシンプルですが、言い方を変えると、 「コンピュータを構成する全てのハードウェアとソフトウェアを管理している」 となり、最も重要な役割を担っていると言えるのです。 ではまず、コンピュータを構成するハードウェアとは何か考えてみましょう。 ・CPU ・メモリ ・ハードディスク ・グラフィックボード ・ネットワークボード ・サウンドカード 他にもありますが、一例として上記のようなものが挙げられます。 では、ソフトウェアとは何でしょう。 ・ワード ・エクセル ・アウトルック(メーラー) ・ウインドウズメディアプレイヤー など、他にもたくさんあります。 (「アプリケーション」と「ソフトウェア」という用語が乱立してしまっていますが、両者の意味は異なります。詳しくはこちら → 「アプリケーションとソフトウェアの違い」) ハードウェアはソフトウェアがないと何もできませんし、ソフトウェアはハードウェアがないとやはり何も出来ません。 持ちつ持たれつの関係が両者間であり、その両者を管理し結びつけているのがカーネルというわけです。 カーネルもプログラムであることには変わりありませんが、上記のとおりやってることが他と異なった特殊なプログラムであるということがわかると思います。
ファイルシステム
Linux上でのファイルには様々な種類があります。 例えば、テキストファイルや画像ファイル、動画ファイル。 それらは一般的な普通のファイルですが、他にもそれらとは異なる特殊なファイルが存在します。 デバイスを操作する際に使用するデバイスファイル、プロセス間通信に使う名前付きパイプ、それからディレクトリもファイルに該当します。 もっと言えば、Linuxを構成しているのはファイルであり、Linuxは全てをファイルとして扱うようになっています。 それらファイルにはファイル名が付けられています。 このファイル名と、ファイルが保存されているディレクトリを示すパスによって、一意のファイルを区別することができるのです。 そして、そのような仕組みを成立させているシステムがファイルシステムです。 ファイルの中身は通常、ハードディスクに保存されています。 そのファイルを操作する際、ファイルシステムはなくてはならない存在であるということは言うまでもありません。 例えば、ユーザーがテキストファイルを開きたいとき、ファイルのデータが物理的にハードディスクのどの領域に保存されているのかを把握しておく必要があります。 もし何も把握していない状態だと、ただのテキストファイルを開くために、ハードディスク上の先頭から全てのセクタをわざわざ探さなくてはいけません。それでは、いくら高速化した現在のPCでも時間がかかってしょうがないです。 さらに、ファイルのサイズを知っておかないと、どこからどこまでを読み込めば良いのかということもわかりません。 ファイルはファイルシステムによって管理されることで、高速なアクセスやリソース使用の効率化が実現されているわけです。 ファイルシステムはいくつか種類がありますが、Linuxで使用される代表的なファイルシステムとして下記表のようなものがあります。 名称特徴 ext2Linuxで広く利用されていたファイルシステム。 ext3ext2を改良したファイルシステム。 ext4ext3の改良版。現在の多くのディストリビュータはext4を標準で採用している。 XFSSGI提供のファイルシステム。 JFSJFS提供のファイルシステム。
マウント
マウントとはコンピュータに接続した周辺機器や外部記憶装置OSに認識させ、利用可能な状態にすることを意味します。 Linuxをインストールする際、通常であれば、ハードディスクを複数のパーティション(区画)に分割し、各パーティションそれぞれにファイルシステムを作成します。 そして、各ファイルシステムをマウントします。 マウントはファイルシステムを利用する上で必ず行わなければならない操作です。 Linuxは、新しく接続されたハードウェアを認識しても、それだけではファイルシステムを利用することができません。 ファイルシステムを利用できないということは、ファイルを作成したり保存したりすることができないということです。 例えば、USBメモリを使用したい場合、パソコンのUSB端子に接続しただけではUSBメモリに保存されているデータを読み込むことも書き込むこともできません。 USBメモリをマウントすることで、はじめてUSBメモリ内のデータをLinux上から読み書きできるようになります。
ハードリンク
ファイルには必ずファイル名が付けられており、ファイル名とパスによって一意のファイルを区別します。 通常、ひとつのファイルに対して、ファイル名はひとつだけ存在するように思えますが、Linuxではひとつのファイルに2つ以上の名前を付けることができます。 そして、ファイルに名前をつけ、ファイルの実体と関連付ける概念のことをハードリンクと言います。 例えば、「A」という名前のついたファイルがあり、そのファイルに新しく「B」という名前を付けたとします。 この操作を「ファイルAを指すハードリンクBを作る」と表現します。 以降、「A」と「B」は同じファイルを指していることになります。 つまり、ファイルAを変更すれば、Bも変更されます。 ファイルは少なくともひとつのハードリンクを持っている必要があります。 そうでなければ、ファイルシステムは一意のファイルを識別することができません。
シンボリックリンク
シンボリックリンクはハードリンクと同様にファイルの実体に新しい名前を付ける仕組みです。 シンボリックリンクを作成すると、ファイルシステム上にはリンク情報が格納された0バイトのファイルが作成されます。 その0バイトのファイルを通して、通常のファイルと同じように扱ってファイルの実体を編集することができます。 では、ハードリンクとは何が違うのでしょう。 ハードリンクはファイルの名前と実体を関連付ける仕組みです。 そしてシンボリックリンクは、名前に名前を関連付けます。 シンボリックリンクはWindowsでのショートカットに似ています。 例えば、デスクトップにインターネットエクスプローラーのショットカットを置いておく方は多いと思いますが、インターネットエクスプローラーの実体はデスクトップにはなく、通常「C:\Program Files\Internet Explorer\iexplore.exe」などに保存されています。 このように、本来の位置にファイルを残しつつそれとは別の場所に置いたり別名を付けてアクセスする手段がWindowsで言うショートカットです。 ただし、ショートカットはリンク先のファイルを実体と同じようには扱えないため、シンボリックリンクとは実装や機能の面では大きく異なります。 シンボリックリンクの主な利用方法は、ファイルやディレクトリに別名をつけることです。 ディレクトリに別名をつける場合の活用例としては下記のようなものがあります。 Linuxと言ってもディストリビューションは様々に存在しますし、歴史も古く、幾度となくバージョンアップが繰り返されています。 そのため、同じLinuxでもディストリビューションやバージョンごとに様々な違いが存在しています。 例えば、ログファイルは「/var/log」ディレクトリに置くのが一般的ですが、中には「/var/adm」ディレクトリに置く場合もあります。 そのような環境で開発されたプログラムは、ログファイルが「/var/adm」ディレクトリに作成されると仮定していることもあり、「/var/log」ディレクトリにログファイルを作成している環境では、うまく動作できません。 そこでシンボリックリンクが役に立ちます。 「/var/adm」ディレクトリ以下へのアクセスを「/var/log」ディレクトリへのアクセスだと関連付けさえすれば、プログラムはどちらの環境でも問題なく動作します。
カーネルの役割
カーネルは、OSの中枢となるソフトウェアです。 システム全体のリソースを管理し、ハードウェア・ソフトウェア間のやりとりを管理します。 以前の記事でも紹介しましたが、カーネルが行っている動作は主に下記2つです。 ・アプリケーションからの要求(システムコール)に応える ・ハードウェアからの応答をアプリケーションに伝える 上図のようにカーネルはアプリケーションとハードウェアの中間に位置し、アプリケーション、およびハードウェアからの要求があれば、何らかの動作を行います。 カーネルを中間の位置に置くことによるメリットは大きいです。 もしカーネルがなければアプリケーションがハードウェアを直接制御することになります。 世の中には無数のハードウェアが市場に出回っていますので、これは非常に非現実的です。 例えば、ワープロソフトで作成したドキュメントをプリンタで印刷したい場合、プリンタメーカーはたくさんありますし、機種も様々に存在しているので、ワープロソフトがそれら全てのプリンタに対応させるのは、とんでもなく大変です。 しかし、カーネルが間に入ることで、カーネルがプリンタ機種による差を吸収してくれるので、ワープロソフトは接続されているプリンタの機種を気にする必要がなくなります。 そして何より、カーネルは「システムの保護」という観点で大いに活躍してくれています。 アプリケーションにはバグはつきものです。 バグが与える影響範囲がそのアプリケーション内で収まれば良いのですが、ほかのアプリケーションにも影響を与えたり、最悪システム全体が落ちてしまうという事態も十分に考えれられます。 カーネルは、アプリケーションのバグ、あるいは悪意のある動作からシステムを守り、全体の安全性を向上に大いに貢献してくれているというわけです。
カーネルの進化
カーネルはOSの中枢です。 そのため、稼働中のシステムに対して、カーネルを途中で入れ替えるということは基本的にやりません。 カーネルを入れ替えるということは、それまで動いていたシステムとはまったく違うものとなるということであり、それまで動いていた環境が入れ替え後もそのまま動くとは限らないからです。 ただ、コンピュータの進化は凄まじく、ハードウェアの数や種類はものすごく多くなってますし、コンピュータの処理能力も年々上がっていきます。 そのような流れに伴い、カーネルに要求される機能は増え、それらの機能に対応していくため、カーネルのサイズはどんどん大きくなっていきます。 この事態は好ましいことではありません。 というのも、前述しましたが、カーネルは途中で入れ替えることはできないからです。 そこで、カーネルにはOSが担う各種機能のうち、必要最小限のみを実装し、残りを部品化し分離することで、全体の設計が簡素化でき、結果的に性能も向上できるという考え方が広まっていきます。 そのような考え方で設計されたカーネルを「マイクロカーネル」と呼び、WindowsやLinuxなど、現在も使われているほとんどのOSはマイクロカーネルであると言えるようになっています。 そして、カーネルから外した部分(部品)は「カーネルモジュール」という形で提供します。 そのような形を取ることで、カーネルモジュールは時代に伴い増えていきますが、カーネルは変えずにカーネルモジュールだけ動的に追加するということが可能となります。
デバイスドライバ
デバイスとは、比較的大きな単位を持った機器、装置のことです。 例えば、CPUやメモリ、グラフィックボードやディスプレイ、マウスやキーボード、プリンタなどのことです。 ハードウェアと同意と考えても問題ないでしょう。 カーネルはそれらデバイス全てを管理しています。 しかし、例えば「プリンタ」と言っても、市場には様々なメーカー、機種が出回っています。 メーカーや機種が異なれば、機能や操作方法も異なります。 カラー印刷できるプリンタもあれば、両面印刷できるプリンタもあります。 それはつまり、プリンタの機種が異なれば、その数だけ、カーネル側でもコードが必要となるわけです。 しかし、プリンタの機種が異なっても、同じプリンタですから、共通する機能があります。 そのような共通部分をそれぞれのプリンタごとに用意してたら無駄です。 そのため、共通化できる部分はカーネルが受け持ち、それ以外の部分は独立させ、交換可能にしておくのが都合が良いです。 その独立した部分がデバイスドライバです。 デバイスドライバの定義はカーネルに包括されます。 つまり、デバイスドライバもカーネルの一部となります。