わたしの名はフレイ 作家・デザイナー見習い
神々とともに生きる詩人 一等星シリウスの導きを信じて

Linuxとは

そもそもLinuxとは

Linuxは、北欧フィンランドの当時大学生だったリーナス・トーバルズによって開発された、オープンソースUNIX互換OSの「カーネル」と呼ばれるソフトウェア。

まず、OSには、カーネルとユーザーランドがある。カーネルとは、低水準なハードウェアデバイスを操作したり、プログラムを複数同時に実行したり、ファイルやディレクトリといったファイルシステムやソケット通信のネットワークを低レベルレイヤーで提供したりというように、全てのプログラムに共通に必要な機能をユーザーランドのプログラムに提供するための基盤となるソフトウェア。このカーネルの上で、OSの全てのプログラムは動いている。カーネルの上で動くプログラムのことをユーザーランドという。

リーナスは、このカーネルという部分を開発した。

OSは通常、カーネルだけでは使えない。その上にさまざまなコマンドラインプログラムあるいはGUIプログラムがなければ、人間がそもそもコンピュータを使う目的である、さまざまな機能を持った「アプリケーション」がなければ、それはOSとは言えない。

UNIX業界では、Linuxよりも古くからフリーソフトウェアだけでUNIX互換OSを作ろうとするGNU (GNU's Not Unixの略)というプロジェクトがあり、コンパイラC言語ソースコードを実行ファイルに変換するソフトウェア)やコマンドラインシェル(コマンド入力から指定のプログラムを実行する)などユーザーランド一式を提供していた。Linuxは、GNUコンポーネントと組み合わせて利用される。GNUが「LinuxではなくGNU/Linuxと呼ぶべきだ」と主張しているのはこのため。

LinuxオープンソースのライセンスであるGPLでライセンスされており、ソースコードが万人に開かれている。

Linuxの歴史

そもそも、UNIXというソフトウェアも、またLinuxGNUとは別個の、それも太古の昔のOSである。

UNIXアメリカの電話・通信会社AT&Tベル研究所によって1960年代に開発がはじめられた。Multicsという巨大プロジェクトを抱えていたベル研だったが、巨大かつ複雑すぎて使い物にならなかった。ベル研のMultics開発メンバーはこれに嫌気がさし、シンプルかつ単純なUNIX(Multiに対してUni)と呼ばれるOSを開発した。

AT&T独占禁止法からコンピュータ業界への参入を禁じられており、UNIXパブリックドメインで公開した。無料で利用でき、ソースコードを見ることも、コピーすることも改造することも第三者に与えることも自由だった。

技術的に見ると、当時としては目新しい、C言語である高級言語(CPUに依存した機械語の命令セットを使う直接のアセンブリ言語ではなく、開発した後で機械語に変換する人間に読みやすいプログラミング言語)で書かれており、別のCPUプロセッサやアーキテクチャに移植することが簡単だった。また、マルチタスク・マルチユーザのタイムシェアリングシステムとして設計されており、文字ベースのコマンドを使いながら、複数の端末でひとつの中央コンピュータ(ワークステーション)を操作し、全てのプログラムを並列かつ多数のタスクで動かすことができた。

UNIXは、大学や研究機関のワークステーションに爆発的に普及する。

また、カリフォルニア大学バークレー校の学生たちは、UNIXに独自のソフトウェアや改造を加えたBSDバークレー・ソフトウェア・ディストリビューション)を開発。これにはviやcshを開発したUNIX界の神様のようなスーパープログラマーであるビル・ジョイも開発者に含まれる。

また、UNIXは商業的なエンタープライズシステムとして、Sun Microsystemsなどの商業会社にも使われる。Sunにはビル・ジョイも入社している。当時のUNIXの強みはネットワークとオープン。Sunは「ネットワークこそコンピュータ」であるという宣伝文句によって、NFSJavaなどの技術を開発し、自社のSunOS(以後にSolarisという名前になる)と呼ばれる商業UNIXSPARCという独自のプロセッサとともにライセンス販売を行う。

そうしたオープンだったUNIXだが、AT&T独占禁止法から解放されたため、パブリックドメインではなくプロプライエタリになり、ソースコードにアクセスできなくなる。

ここで、MIT AIラボのリチャード・ストールマンは、フリーなUNIXのクローンとしてGNUの開発を決め、自身もテキストエディタEmacsコンパイラGCCを開発しながら協力者を探す。また、新しいGNUのOSのライセンスとして、「コピーレフト」と呼ばれる継承条項(OSのコードをオープンソースに公開しなければならず、改良版や誰かが派生した派生版についてもGPLで同じ権利を守らなければならない、つまりいつまでもGPLを継承しなければならない)を持ったGNU GPLというパブリックドメインより厳しいライセンスを裁定した。これにより、絶対にGNUがフリーでなくなることがなくなった。

BSDからAT&Tのコードを削除した386BSDなども開発されるが、起訴問題などにより配布できなくなる。

GNUは優れたコンパイラフリーソフトウェアとして提供していたため、コンパイラや開発ツールとして良く使われたが、GNU Hurdというマイクロカーネルの開発がいつまでたっても進まなかった。ここではマイクロカーネルという問題があった。カーネルの設計には旧来のモノリシックカーネルと先進的なマイクロカーネルがあるが、マイクロカーネルモノリシックカーネルよりも開発や実用化が難しい。そのためGNUカーネルだけが開発されないまま、ほとんどのUNIXツールの開発を終え、カーネルさえあれば使い物になるレベルになった。

ここで、フィンランドリーナス・トーバルズによるLinuxが開発される。リーナスは当初Minixと呼ばれる教育用のUNIX系OSを使っていたが、Minixの機能に限界を感じ、自分でMinixを改良する。その結果、改良した部分のコードだけでOSとして成り立つようになった。

当時は、Intel 386プロセッサによって「庶民のコンピュータ」が実現されつつある時代であり、リーナスも386プロセッサでUNIXワークステーションを使いたいと思ったが、そのためにGNUBSDも386向けのフリーに入手できるカーネルを提供できていなかったため、リーナスはひとりで386向けのカーネルを書いた。

リーナスは、このLinuxカーネルをインターネットのニューズグループで公開し、フリーで配布するとともに開発者として参加したい人を募った。最初はIntel 386向けの小さなカーネルだったが、開発参加者によってさまざまなアーキテクチャに移植され、またMinixコンポーネントGNUコンポーネントに置き換えられ、独自の商用利用を禁じたライセンスはGPLに変更された。当時、UNIXワークステーションIntel 386のPC/AT互換機でも使いたいという人はたくさんいて、こうした人々が「善意のボランティア」として参加した結果、Linuxはバグのないとてもパフォーマンス(速度・性能・効率・安定性)の高いカーネルに成長した。

Linuxカーネルの特徴として、モノリシックカーネルであることが挙げられる。Hurdとは違い、カーネルの中の各コンポーネントをサーバーに分けることはせず、一枚岩の巨大なソフトウェアとして実装する。これは伝統的でありパフォーマンスも良くなるが、Minixの作者タネンバウムからは「時代遅れだ」と批判された。

また、Linuxはただのカーネルであり、ユーザーランドのソフトウェアがなければ動作しないが、伝統的にLinuxカーネルGNUのツールとともに組み合わさって提供される。GNUBashGCCなどUNIXのほとんどのツールを開発・提供している。また、GNULinuxとが協調して動くために、Linuxの開発者とGNUの開発者は協力した。こうしたことから、GNUストールマンは「LinuxではなくGNU/Linuxと呼ぶべき」だと主張している。

また、LinuxGNUプログラムは、最初から組み合わせて使うことを想定している場合が多いため、LinuxカーネルGNU、そしてX Window SystemUNIXGUIのグラフィックスアプリケーションを使うのに必要となるウィンドウシステムと呼ばれるソフトウェアで、以前はXFree86という名前で386向けのものが提供されていたが、今ではプロジェクトのごたごたでX.orgという新しいプロジェクトに置き換わった)など、必要となるツールを一緒に配布し、簡単にインストールできるようインストーラが付属したものが提供されており、これを「Linuxディストリビューション」と呼ぶ。

昔はSlackwareなどが普通だったが、今ではソフトウェアの管理をしやすくするパッケージ管理システムと呼ばれる、ソフトウェアを自分で手作業で調整しなくても、ある程度インストールや依存関係の把握などを自動でやってくれる機構を使って作られている。代表的なものはRPMというパッケージ形式を使うRed Hatというアメリカのオープンソース会社による商用ディストリビューションや、Red HatのライバルであるドイツのSUSE、また会社ではなくコミュニティで作られている、Debというパッケージ形式を使う硬派なDebianなどが有名だが、ディストリビューションは雨後の竹の子のように増えており、必ずしもこれらを使うわけではなく、Distrowatch.comというサイトで最新のディストリビューションの情報を得られる。

Linuxを使う時は、こうしたディストリビューションのどれかを導入し、その上でLinuxカーネルGNUユーザーランドを使う形になる。

また、Linuxのベースシステムでは、コマンドを用いた単純な文字ベースのプログラムしか用意されていないが、X Window System(Xにバージョン番号を加えてX11と略される)とともにGNOMEKDEといったデスクトップ環境を使うことで、Windowsと同等の「デスクトップPCで操作しやすい」環境を導入することができる。KDEはドイツ、GNOMEはメキシコで生まれ、二大デスクトップ環境となっている。

Linuxのもっとも大きな特徴は、オープンソースであること。全てのソフトウェアがオープンソースで公開されており、フリーで利用できる。フリーとは無料という意味ではなく自由という意味で、自由にソフトウェアをコピーしたり再配布したりソースコードを確認・変更できることを意味する。

また、Linuxカーネルは「バザール開発」と呼ばれるオープンな新しい開発方式を用いて、インターネットとメールを通じたゆるやかな集団として開発が行われており、たくさんの「善意のボランティアの貢献者」によって開発されている。「伽藍とバザール」という論文を書いたエリック・レイモンドは、「数千人の片手間のプログラマによって超一流のOSが生み出された破壊的現象」と記述していて、これがMicrosoftとのブラウザ戦争に負けたNetscapeがブラウザを存続させるためにオープンソース化した「Mozilla.org」の動きにつながる。今では、アフリカ発のUbuntu南アフリカ人によって開発)など全く目的や理想の違う人々とともに開発されている。

また、最近ではIBMIntelなどの巨大企業もLinuxのオープン開発に参加するようになっていて、特にRed Hatのようなオープンソース企業はGPLでソフトウェアをライセンスしながら、長期サポート(セキュリティホールやバグの修正)によって利益を上げている。

Linuxの読み方

Linuxの読み方について、フィンランド出身でスウェーデン語を母語とするリーナス・トーバルズによれば、「誰がどのように読んでも良い」とのこと。

日本では、昔は「リヌックス」や「リーヌークス」と呼ばれることもあったが、今では「リナックス」が標準的になっている。

そもそもLinuxという言葉自体リーナスがつけたものではなく、サーバーのディレクトリに置く際に別の人間が勝手に付けた名前であり、リーナスは呼び名や発音にはこだわっていない。

ソフトウェア開発とオープンソース精神

OSのようなソフトウェアは、「パソコンでコードが動いている」という理解をしている人が多いと思いますが、このコードは、どのパソコンでも基本的に同じコードが動いています。

場合場合によって、異なる使い方がされるプログラムのコードですが、コード自体はどの実行状況でも同じコードが動きます。

開発者は、全ての使用ケースを想定しながら、どんな状況にでも対応できるように、コードを書かなければなりません。

ですが、「どんな場合にも対応できるようにコードを書く」ということは、とても難しいことです。

ソフトウェアのバグにはたくさんの種類や状況がありますが、単なる書き間違いのバグや、言語やプラットフォームや使用する技術のことを不勉強だから起きるバグや、アルゴリズムそのものが実装できていない「作りかけ」のバグだけではなく、こうした「想定外」の状況が起きることで、使用されると思っていた状況だけではない状況でそのプログラムを動かすことで起きるバグ、というものもあります。(ほかにも、設計そのものが間違っていたり、機能を増やすことで従来の設計が成り立たなくなったり、そもそも作りたいと思っていた完成形のソフトウェア像や要求された仕様そのものに間違いがあることもあります。)

こうした「想定外のバグ」は、商用企業はお金を儲けることでそのお金を使ってバグを直しますが、それでも、ひとつの会社がクローズドソースでテストし修正するバグ修正には限界があります。

これに対して、オープンソースでよく言われるのが、「目玉がたくさんあれば、どんなバグも深刻ではない」という考え方です。

これは、ソースコードをオープンに公開し、同時にたくさんの参加者がそのコードを「使用する人間自らがチェックする」ことで、みんなでバグがあるかどうかを確認し、それぞれがそれぞれの環境でテストし、バグを修正することで、どんなバグでも直すことができる、という、「ハッキング性善説」のような考え方です。みんなでハックすれば、どんなバグでも必ず修正できる、という理想郷のような考え方がLinuxにはあります。

ですが、これはユーザーが開発者と同じ能力やスキルを持っている場合に限られます。そのため、オープンソース界では、「Do-it-yourself」という精神がよく言われます。ユーザーには開発者と同等のスキルや知識、あるいは開発者よりも高い技術が求められます。最初から、そうした「できる人材」だけを求めていて、使えないソフトウェアがあった場合には、自分の手間や時間を捧げて「自分で使えるものになるように改良する」という精神が求められるのです。

また、WindowsはそもそもMicrosoftの利益のために開発されており、ユーザーが広がっても得をするのはMicrosoftに限られます。Windowsユーザーの利益にもなるとは思いますが、使い続けるためにはお金を払わなければいけません。これに対して、オープンソースソフトウェアは、「使うのも作るのも自分たち」であるため、力を持つのはユーザー自身です。そのため、オープンソースで開発すること、それを外部に無償で貢献することは、「ソフトウェア業界全体の公共の利益」になると言えます。

プログラムからハードウェア機器を操作しやすくする仲介役

OSとは、ソフトウェアとハードウェアの間に入って、ソフトウェア(プログラム)からハードウェア(実際の電子機器)を操作しやすくする、仲介役として使われる「基本ソフトウェア」です。

OSは、ハードウェアの操作のために必要な「低水準な処理」と、ソフトウェアからそのハードウェアを操作するための「システムインターフェース」を提供します。

OSがあるために、プログラムからハードウェア機器が操作しやすくなり、たとえばopen/close/read/writeというシステムコールでストレージデバイスの中のファイルシステムを簡単に操作したり、socket関数を利用することで実際のネットワークプロトコルを意識しなくても、ネットワーク機器による通信をプログラムから簡単に実現できます。

現代的なOSでは、ハードウェアを単純に操作する以外に、多くの機能を提供します。

たとえば、仮想CPU(非常に短い時間で複数のプログラムを順番に実行することで並列処理を実現する)や仮想メモリ(仮想アドレス空間を導入することで、プログラムが使う仮想メモリ領域を現実の物理メモリ領域に変換し、たくさんのプログラムを安全に同時実行する)といった機能によって、マルチタスク(同時に複数のプログラムを実行する)が実現されます。

ほかにも、UNIXにはカーネルとユーザーランドの権限を分け、ユーザーのデータを他のユーザーから見えなくするマルチユーザーの機能があり、ひとつの中央コンピュータを複数の端末から同時にログインして使うことができます。

また、デバイスドライバを使うことで、個々のデバイスの詳細を知らなくても、同じインターフェースからデバイスを操作できます。割り込み機能によって、デバイスの処理を待っている間、OSは別の処理を行うことができます。

ストレージデバイスにおいては、ファイルシステムにより、記録媒体の低レベルな処理をしなくても、ファイルやディレクトリを使ってストレージデバイスの中のデータを読み書きできます。UNIXファイルシステムは、入出力機構と統合されており、コマンドの入出力は簡単にファイルに読み書きできます。

またネットワーク通信の機能があることにより、クライアントとサーバーの双方で、細かい方式やプロトコルを知らなくても、たとえばLANにおけるイーサネットTCP/IPによる通信ができます。

こうした機能を提供するソフトウェアを、OSの中核という意味で「カーネル」と呼びます。LinuxなどのOSの設計では、ハードウェアデバイスとソフトウェアの間に必ずカーネルがあり、カーネルを通じてプログラムはデバイスにアクセスします。

Linuxのように、カーネルの全ての機能を、ひとつのプログラムとして実装した一枚岩で実装したものを「モノリシックカーネル」と呼び、MachやL4のように、カーネルには最低限の機能だけを実装し、あとはサーバーとして実装したものを「マイクロカーネル」と呼びます。マイクロカーネルは新しい発想ですが、処理の効率や性能に問題があり、実装も難しいため、Machを元に開発されているGNUHurdは、今でも完成されていません。

また、カーネルの上で動くソフトウェアとして、UNIXのコマンドツール(GNU CoreutilsやコマンドシェルのBash、vi/Emacsエディタなど)やCライブラリのlibc、コンパイラやリンカなどを集めたGNUツールチェイン(GCCなど)、WindowsのようなGUIインターフェースを提供するX Window System、あるいは書籍を出版するための組版システムTeXなどがあります。こうしたライブラリや低水準のソフトウェアを使うことで、システムの機能を拡張でき、標準Cライブラリ関数のさまざまな機能を使ってプログラムを開発するなど、「もっとたくさんのことができる」ようになります。また、ApacheJava/Tomcat/JBossのようなミドルウェアカーネルの上で動かすことで、エンタープライズ向けの機能を使うことができます。こうしたソフトウェアを含めて「広義のOS」と呼びます。そして、この広義なOSとしてのLinuxを呼称する際に、カーネル以外のソフトウェア・システムとしてGNU由来のソフトウェアを多く採用しているため、GNUは「LinuxではなくGNU/Linuxと呼んでほしい」と主張しています。Debian GNU/Linuxなどは、そうしたGNUの意見を踏まえて名称を決定しています。

Linuxカーネルオープンソースであり、OSの設計図が公開されており、簡単にコピーや改造や再配布ができます。Linuxカーネルはモジュールという単位でカーネルの機能を分割したり動的読み込み(最初の起動時にはその機能を読み込まず、必要になった段階で動的に読み込む)ができます。必要のない機能は削除できるほか、自分でコードを書き直したり分割したりすることもできるため、別の技術者が改良したりカスタマイズすることに長けています。このため、組み込みやIoTなどの「パソコン以外のOS」に搭載されることも多く、モバイルOSであるAndroidカーネルLinuxを使っています。最近では自動車などでもオープンソースで安定しバグの少ないLinuxのコードベースが利用される機会も増えています。

ですが、LinuxGNUによるGPLと呼ばれるライセンスで配布されており、このGPLではGPLで一度配布されたソフトウェアを再度配布したい場合には、GPLに基づいて配布しなければなりません。よって、Linuxをカスタマイズして作った派生版Linuxカーネルは、元のLinuxと同じようにGPLで配布する必要があります。これには、派生ソフトウェアや一部のソースコードを利用して作られたソフトウェアも含まれます。こうしたLinuxカーネルの「厳しいライセンス」に比べて、Linuxと同様のUNIX系のOSカーネルとして、FreeBSDNetBSDOpenBSDがあり、これらはBSDライセンスと呼ばれるライセンスで提供されています。BSDライセンスでは、再配布する際に同じライセンスで配布する必要が無く、商用利用のためのコードベースとしてはLinuxよりも優れています。

また、最近のパソコン向けのOSは、インターフェースがコマンドラインではなく、グラフィカルなウィンドウシステムを搭載しています。最近は、OSと言えばこうした「GUIインターフェース」を指すようになりました。Windowsでは、カーネルと統合されたデスクトップ環境(Explorer)が動作しますが、Linuxではこうしたウィンドウシステムはカーネルと統合されていません。X11と呼ばれる専用のディスプレイサーバーソフトウェアの上で、GNOMEKDEといったそれぞれのデスクトップ環境を動作させることができます。GNOMEを使う場合はGNOMEのインターフェース、KDEを使う場合はKDEのインターフェースを用いながら、GNOMEアプリケーションやKDEアプリケーションを利用できます。

LinuxWindowsに比べてあまり普及していないのは、Windowsの囲い込み戦略によります。WindowsではMS-Officeなどを抱き合わせて販売し、そのファイル形式が広まることで、結果MS-Officeが必要となり、他のOfficeを使うことは現実的でなく、LibreOfficeのように互換性のある無料Officeがあったとしても、「せっかく買ったMS-OfficeをLibreOfficeと引き換えに失うのは避けたい」という心理が働くため、結果MS-Officeを使わざるを得ません。ですが、Windowsは昔はフリーズとバグの多いOSでしたが、最近はWindows 9x系のカーネルWindows NTカーネルに書き直し、また.NET Frameworkと呼ばれるJavaと同様の機構を使うことで、最近は安定して動くようになりました。サーバーなどの用途ではLinuxが使われる機会が多いですが、デスクトップなどの用途ではLinuxオープンソースMicrosoftに負けています。これは、単なる競争というよりも、「IT資本主義とオープンソース共産主義の戦い」であると言えます。Microsoftは資本主義の大企業であり、とても長大な利益をあげて、その利益によって製品を作っているため、UNIXの基本設計がいくら優れていても、オープンソースと比べて細部の品質やできが良く、今のWindowsUbuntuなどと比べて「どうして良いか分からなくなるような問題や不具合」が少ないため、Windowsもしばらくは「MSの信頼できるOS」として使われ続けるでしょう。

Windowsに比べたLinuxの良さは、「シンプルであること」ではないかと思います。Linuxというカーネルの上でコマンドが動く、言ってしまえばそれだけのシステムにすぎません。ごちゃごちゃとしたウィンドウシステムはありますが、それらはオープンに開かれており、自分の手で開発できます。こうした「開かれたシンプルさ」が、UNIXが長らくワークステーションで使われてきた理由ではないかと思います。そのため、systemdに代表されるようなLinuxの新技術は、たまにきわめて嫌われることがあります。「UNIXはシンプルであるべき」という格率のようなものがあるため、GNOMEKDEのような「巨大なデスクトップ環境」は多くの人に嫌われており、Xfceのような軽量なデスクトップ環境が好まれることも多いです。WindowsはOSにたくさんの機能を統合したため、複雑で致命的なバグの多いものになっています。特に、セキュリティホール脆弱性は毎度のことのように見つかっており、またMFCや.NETなどは複雑すぎて分かりにくいという一面があります。

OSはハードウェア抽象化であると同時にシステムの操作環境でもある

OSについて言えることとして、「ハードウェアとアプリケーションを繋ぐ抽象化・階層化レイヤー」であると同時に、「システムの操作環境」であると言えます。

カーネルはプログラムと現実の機器を「上手くつなぐ」という役割だけではなく、ユーザーが実際に操作するための「操作環境」でもあります。

そのため、単にカーネルだけでOSというのではなく、コマンドラインシェルやコマンドユーティリティ、X11なども合わせて、OSであるとするのが一般的です。

LinuxではGNUのツールを用いますが、LinuxGNUだけがLinuxの操作環境ではありません。操作環境をどこまでもカスタマイズでき、頑張って勉強して設定すれば、シンプルな環境からクールな環境まで、「自分の手でカスタマイズできる部分が多い」というのが、Linuxの操作環境としてのOSのひとつの特徴かもしれません。また、元々がコマンドラインオープンソースなOSであるため、スクリプトなどを書いて自動的に管理したり、多くのファイルに同じ処理をかけたりすることがしやすく、またソースコードを参考にすることで自分の手で動作を研究し確かめられる、という点も優れているでしょう。たとえば、同じホームページを作るのであっても、ブログで書くのであれば豪華な機能は使えますが、HTMLファイルのように自動的にスクリプトで大量のファイルに処理をかけるのは難しいかもしれません。前者がWindowsであれば後者がLinuxであると言えます。