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

UNIX

AT&T UNIX

シンプルな設計
UNIXの歴史は、MIT、ゼネラル・エレクトリック、当時のAT&Tベル研究所により開発された、MulticsというOSから始まる。

多機能を目指したOSだったが、そのおかげで当時のコンピュータでは使い物にならなかった。

ベル研究所のグループによって、単純な機能を目指したOSが作られた。それがUNIXである。

C言語で書かれたOS

UNIXは当初はアセンブリ言語で書かれたが、後に高級言語C言語で書かれるようになった。そのため、移植性の高いOSになった。

パブリックドメイン

UNIXソースコードは、AT&T独占禁止法の管理下にあったため、商用ではなくパブリックドメインで公開された。

そのことから、大学や研究機関に爆発的に広まった。

また、UNIXソースコードをベースにカルフォルニア大学バークレー校によるBSDが開発された。

だが、時代とともにAT&T独占禁止法の管理下ではなくなり、それまでオープンだったUNIXは非公開の独占的ソフトウェアに戻った。

また、UNIXの名称や商用コードを巡って商売をする、Sunのような商用UNIXベンダーも居た。

そのことから、リチャード・ストールマンによるGNUプロジェクトは新しいフリーのUNIX互換OSとして、GNUを開発した。

ネットワークへの親和性が高い

UNIXはネットワークへの親和性が高いことで知られる。

特に、コンピュータそれぞれに違う役割を持たせたり(ログイン用のマシンやデータ保存用のマシンなど)、コマンドをネットワークで実行することに長けている。

優れたコマンドライン環境

UNIXは優れたコマンドライン環境を備える。現在ではコマンドラインシェルはBashTcshが使われることが多い。

X11というウィンドウ・システムも存在し、GUIウィンドウとしてBashを複数使うこともできるほか、Linuxコマンドライン環境ではAlt+F1~F6で仮想コンソールを使うことが出来る。

マルチタスク・マルチユーザ

UNIXマルチタスク・マルチユーザのタイムシェアリングOSとして、最初から複数のユーザーによって操作されることを念頭に置いている。

UNIXのマルチユーザ環境の特徴は、「そのユーザが実行したプロセスは、そのユーザの権限において実行される」ということであり、これにファイルやディレクトリのパーミッションが加わって、それぞれのユーザが安全にシステムを使うことが出来るようになっている。

UNIXマルチタスク環境では、あるプロセスを実行中に別のプロセスも実行することが出来る。これは、DOSのようなシングルタスクのOSにはない特徴だ。単純なコマンドプログラムだけではなく、デーモンなどもマルチタスクで動作する。

安定したインフラ基盤

パソコンで使うOSというよりも、安定したサーバーやワークステーションでの利用を念頭に置いている。

「ファイル」という考え方

UNIXはリソースのあり方を「ファイル」という概念で一般化した。プログラム、データ、はてはデバイスまで、全てを「ファイル」という考え方に落とし込む。

だが、このファイルという考え方は、ネットワークやGUIなどにおいてはあまり一般的でなくなっている。そのため、新しいPlan 9という研究用の分散OSでは、ネットワークなどについても「ファイル」という考え方を突き詰めている。

オープンソースUNIXの本流

UNIXは、そもそもがパブリックドメインで開発されたOSです。

大学や会社の研究機関とインターネットの違いはあるかもしれませんが、オープンソースであるLinuxUNIX本流の開発のし方をしていると言えます。

UNIXはOSの本家本元

UNIXは、「OS」という考え方をIBM System/360が作ってから、さまざまなOSが生まれたところでの、OSという考え方の本家本元だと言えます。

C言語という高級言語で書かれ、マルチユーザ・マルチタスク・タイムシェアリングといった、今のOSの基本的な考え方の本流です。

そして、IBMメインフレーム用のOSから、BeOSのようなパーソナル向けのOSまで、UNIX互換であり、POSIX互換である、ということは、一種の標準となりました。

WindowsUNIX互換ではありませんが、今あるOSのうちWindowsを除いたOSは、ほとんどがUNIX互換であるか、何らかのUNIXとのつながりを持っていることが多いです。

また、UNIXは安定していて、堅固である、ということは良く言われます。

今のLinuxは、Fedoraの実験指向もあって、昔ほど安定した印象は無くなりましたが、Windowsと比べると、カーネルコマンドラインで言えば安定しているのかな、とは思います。ですが、GNOME/KDE/MATEにはバグは多いです。

セキュリティに関して言えば、最近のLinuxSELinuxなどもっとセキュリティを高める試みをして不安定になる印象はありますが、パッケージ管理システムで全ソフトウェアを一発で最新にすることが可能で、カーネル以外は再起動しなくても良いなど、やはりセキュリティは高いのかなという気がします。

rootユーザーを使わなければ、おそらく簡単にシステムは壊れません。

大規模サーバーではデータフォルダをきちんとバックアップすれば、基本的に壊れることは無いでしょう。

現実的に考えて、IT業界全体の標準まで普及しているWindowsよりは、狙われることは少ない、というのは、シェアが少ない故の長所ではあるかもしれません。

コンピュータはネットワークである

UNIXは、ネットワークとの親和性が高いです。

特に、Sun Microsystemsのような会社の努力もあって、コンピュータをネットワークに繋ぐことを当たり前のものとしました。

コマンドラインで動く可搬性

逆に、UNIXGUIとの親和性は低いかもしれません。今でも、コマンドライン環境だけでネットワークに繋いで利用されることの方が多いでしょう。

ですが、それを逆に言えば、GUIの操作をしなくても、コマンドだけでほとんどのことを行える、という、「コマンド主義」のOSである、という言い方も出来るでしょう。

Windowsは、サーバーに使うWindows Serverでさえ、GUI環境で使うことを基本としています。Linuxコマンドライン環境だけをインストールして、SSHで操作することも出来ます。

なぜかLispとの親和性が高い

GNUなどのシステムについて言えば、なぜかUNIXとは本来関係がないはずのLispとの親和性が高いです。

GNU Emacsは、Lispによる拡張によってコンピュータ総合システムとなります。また、sawfishのようなLispで拡張されるウィンドウマネージャ(昔のGNOMEで使われていた)や、マニアックなところではGNU GuixのようなLispで書かれたパッケージマネージャもあります。

プログラマの仕事台

UNIXプログラマの仕事台と言われているように、プログラマに対する支援が手厚いです。

特に、コンパイラやmakeのようなプログラムは最初から無料で用意されており、そしてスクリプト言語や他のプログラミング言語インタプリタコンパイラも豊富です。

システム・アーキテクチャとしての洗練性が高い

システム・アーキテクチャとしての洗練性が高いです。

プログラムはパッケージ管理システムを利用することで、常に最新のパッケージが自動でインストールされます。

ですが、GNOMEKDEを見ていると、GUI環境の洗練性はWindowsに遅れています。その代り、もっと良いものを目指して日進月歩でみんなで開発しています。

Web開発のためのツールが豊富

Linuxは、特にWeb開発のためのツールが豊富です。

Mozilla FirefoxのようなWebブラウザアプリケーションや、Apacheqmailのようなサーバーソフトウェアが豊富なだけではなく、最先端のRuby on Railsのようなツールを使うことが出来ます。

Perl/CGIのような、インターネットの昔標準であった流行の技術は、多くがUNIXの技術を元にしています。

IEやMS-OfficeのようなWindows標準の技術も、Mozilla.org(旧Netscape)やGoogleの努力もあって、Linuxでデスクトップでインターネットを見ることは難しくは無くなってきています。特に、YouTubeHTML5の標準技術を採用しているため、僕はLinuxYouTubeの高品質な動画や音楽を楽しんでいます。

メインフレームや大規模データセンターの環境と近い

プログラマを目指している人にとっては、メインフレームや大規模なデータセンターの環境と近いことがメリットとして言えるかもしれません。

DockerやjailのようなOSレベルの仮想化環境や、MySQLのような関係データベースサーバーは、たくさんのプロセッサを繋いで一つにしたデータセンターやメインフレームのシステムと近いでしょう。

楽しい・可能性がある

Linuxは楽しいことが長所として挙げられます。全てがオープンに公開され、共同で協力して開発し、成果をみんなと共有するLinuxのバザール開発は、インターネットを使った革新的な開発として、とても「楽しい」ことがメリットとして挙げられます。

バザール開発だけではなく、UNIXはとてもカスタマイズ性が高く、システムをほとんど制限のない無限の自由に設定・拡張することが出来ます。

また、Microsoftのような単一のベンダーではなく、全てのソフトウェア・ハードウェアの開発企業にオープンで開かれていて、誰もが開発に参加出来ます。

そして、UNIXというシステムそのものが、楽しいシステムである、といえるでしょう。Bashやパッケージ管理システムを使うことで、とても楽しくシステムの管理やプログラミングを行うことが出来ます。Gentoo LinuxPortageを使っていると、まるでこの世界の全てを全部自分の力で構築しているような錯覚に陥ります。

出来る人間にしか使えない、という短所もある

短所としては、出来る人間や分かっている人間にしか使えない、ということもあります。

特に、サバイバル的な用途が考えられます。自分の力で問題を解決出来る、ITのエキスパートでなければ使えません。デバイスドライバを自分で書け、といわれることすらあります。

ですが、本当はそれらを言う人間は、Linuxカーネルの開発に参加出来るような、上級者を育てたいだけです。

Windowsが家庭料理のレシピ本であるなら、Linuxはプロの料理家に弟子入りするようなものである、といえるかもしれません。全て、出来ないのは自分の責任だと言えます。

ですが、C言語Bashを分かりたい、といった人しか、そもそも使おうとはしないでしょう。ApachePHPは、マニュアルは整備されています。ネットにも情報はあります。怯えずにトライしてください。トライし続ければ、きっと90%の人間は、何かのシステムをきっかけやベースにUNIXとコンピュータのことがきちんと分かる、そういうシステムだと思います。

Live Free or Die

UNIXのプレートに見られる「Live Free or Die」の文字は、元々はアメリカのニューハンプシャー州の標語。

UNIXの「自由を守らなければ死を」という精神が刻銘に刻まれている。

C言語のふるさと

UNIXC言語のふるさとです。C言語は、UNIXを移植性の高いOSにするために開発され、その後UNIXだけではなく多くのシステムの記述を行うシステムプログラミング用の言語として普及しました。

UNIX系のOSであるLinuxでは、GNUのツールチェイン(gcc, binutils, make, gdbなど)をフリーで使うことができます。コンパイラが無料でオープンソースであることは、Windowsのように有料である場合よりも、プログラミング入門者の敷居を著しく低くします。

また、Linuxでは、UNIX系のAPIをネイティブに使うことができます。open, close, write, read, printf, scanfなどのUNIXの標準的なAPIをネイティブに使えます。これらはWindowsなどでも実装はされていますが、WindowsではWindows APIへの依存度も高いです。

ただし、LinuxではGUIの「標準」のAPIがありません。X11を使うのが普通ですが、X11を導入しないサーバーマシンとしての利用もあることから、X11を標準にはしておらず、場合によってはX11を導入せずにコマンドラインで使うことが推奨される場合(SSHでリモートログインする場合など)もありますし、X11が入っていたとしても、GTK+やQtのような追加的なツールキットのAPIを使う場合もあるでしょう。

C言語を学ぶ上で、Linux環境があることはとても良いことです。それは開発環境のツール群が整備されていることだけではなく、Linuxはほとんど全てのソフトウェアをオープンソースで再配布している、ということも言えます。オープンソース・ソフトウェアは、最近はgithubなどを使うことで、ソースコードをすぐに確認し、開発に参加することができます。Windowsの場合、Microsoftの社員にしかアクセスが許されていない情報にも、Linuxならアクセスできます。

このような理由で、UNIXC言語のふるさとである、と言えると思います。

WindowsLinuxどちらのアプリを作るか

Windows環境が必ずしも悪いわけでは全くありません。たとえば、日本やアメリカやほとんどの国において、一般的に使われるOSはWindowsであり、Windows向けのネイティブアプリケーションを開発することは、「多くの人に使ってもらう」上で有利となるでしょう。Linuxでは使われないソフトウェアも、Windowsでは使われる可能性があります。ビジネスチャンスもあります。ですが、Linuxで開発したアプリケーションが、必ずしも誰にも使われないかと言うと、そうでもないのです。それは、デスクトップアプリケーションだけがLinuxではないからです。Linuxにはサーバーアプリケーションもあります。ここで、PHPPythonRubyで作られたWebサービスは、多くの人に使ってもらう可能性を秘めています。ただし、自宅サーバーを立てるのにはコストがかかります。最近はクラウドによるインフラを借りることもできます。最近はネットワークサービス全盛期です。時代はLinuxに向いていると思います。

また、最近はAndroidのアプリケーションもあります。AndroidJavaLinuxで構成されたGoogleによるオープンソースソフトウェアです。Linuxの知識が活かせる可能性はきっとAndroidにもあるでしょう。

また、さらに言ってしまえば、C/C++でネイティブアプリケーションを作る必要は必ずしもありません。それは、Javaスクリプト言語という選択肢があるからです。特に、JavaでSwingなどで作られたアプリケーションは、WindowsでもLinuxでも動作します。モダンなUNIXプログラミングを行うのであれば、JavaPython/Rubyなど(GTK+/QtアプリケーションはPython/Rubyでも開発できる。GTK+/QTはクロスプラットフォームにも対応している。)を選択することもあり得るでしょう。

Plan 9

UNIXを生んだベル研究所AT&Tと、AT&Tからベル研究所を受け継いだルーセント・テクノロジーズ)による、UNIXのファイル指向をさらに進めた研究用の分散OS

9Pという分散ファイルシステムプロトコルの下、全てのリソースをファイルとして扱える。

ネットワークは単一した名前空間であり、階層型のファイルシステムとして扱える。リモートでもローカルでも、どんなリソースも9Pプロトコルとと階層型ファイルシステム名前空間からアクセスできる。

Plan 9分散OS

UNIXでは、ひとつのコンピュータに対して複数の端末が備え付けられ、デバイスもそのローカルな環境でのデバイスを主としてシステムが構築されることを前提としていた。

Plan 9では、たくさんのネットワークに繋がった分散システムにおいて、多くのコンピュータを1つのシステムとして扱えるようにした取り組みがなされている。

MINIXとは

AT&Tによってパブリックドメインで公開されたUNIXは、OSの全ソースコードを自由に閲覧することができた。

だが、AT&Tに対する独占禁止法の措置が解除されるとUNIXパブリックドメインでなくなり、自由にソースコードを見ることができなくなった。

これはOSの技術や実装を学ぶ学生や、OSの仕組みを教える教授にとって望ましいことではない。

そのため、タネンバウム教授によって学生にOSの仕組みを教えるために作られた、IBM PC/AT互換機で動くUNIXのクローンが、MINIXである。

MINIXは当時正式にはオープンソースではなかったが、タネンバウム教授の書籍オペレーティングシステム―設計と理論およびMINIXによる実装からソースコードを見ることができ、学生は自らMINIXを自分のパソコンで動かしながら、ソースコードと解説を書籍で読むことで、OSを自分で作るための学習をすることができる。

しかしながら、MINIXはあくまで教育用を目的としており、OSの機能として目新しい点はないが、マイクロカーネル構造を採用している。しかしながら、i386の仮想記憶に対応していないなど、実用として満足のいくものではなかった。

当時、MINIXを使っていたLinuxカーネル開発者のリーナス・トーバルズは、著作権の問題から提供されていなかったIntel CPU用のBSDカーネルを入手することもできず、GNU Hurdカーネルも完成していなかったため、独自のLinuxというカーネルを作った。最初はターミナルエミュレータのようなものだったが、改良されるにしたがってMINIXに対して付け加えたコードだけで一人前のカーネルとして動作するようになった。このLinuxカーネルを、リーナスは「あくまでホビー的なもので、GNUのような大規模なプロジェクトではない」とした上で、MINIXメーリングリストに公開した。

Linuxカーネルは、同様にフリーなUNIXのクローンを求めていた人々に大人気となり、「自分も使いたい機能を作る」などといってインターネット上のみんなで改良された。独自の商用利用を禁じたライセンスはGPLに置き換えられ、MINIXコンポーネントGNUソフトウェアに置き換えられた。ここに、GNUが「GNU/Linux」と呼ぶような、「完全に無料かつ自由なOS」は完成した。

さまざまな人間が片手間でパッチを作って、それをなんでも取り入れオープンに開発するモデルは「バザール開発」と呼ばれた。また、アラン・コックスのような善意のボランティアによって大幅なバグの修正などがなされ、当時のWindows 9x系OSと比べてもバグが少なく、一部では「Windows陣営に対する革命」であるかのように扱われた。

しかしながら、Linuxカーネルは先進的なマイクロカーネル構造を採用しておらず、旧来のUNIXカーネルが採用していたようなモノリシックカーネルだったため、タネンバウム教授からは「Linuxは時代遅れだ」と言われた。現在でもLinuxカーネルモノリシックカーネルのままだが、Linuxではモジュール機構を取り入れ、個別の機能をモジュールで実行中に動的に追加・削除できるため、マイクロカーネルの長所だけを取り入れていると言える。また、GNU Hurdがいつまでも完成されなかった理由として、GNU創始者ストールマンは「マイクロカーネルデバッグが予想以上に難しかったため」としている。一般にコマンドで対話的に実行されるソフトウェアよりも、サービスやデーモンと呼ばれる非対話型のソフトウェアはデバッグが難しく、それらがポートやメッセージを通じて複雑に関係し合うGNU Hurdのモデルは開発が難しかった。そのため、MachのようなマイクロカーネルのOSカーネルはパフォーマンスの問題があり、Linuxカーネルが「とても高いパフォーマンス」を誇るのはタネンバウム教授の発言に反してモノリシックカーネル構造を採用したためであると言えるかもしれない。