AssyLinuxの世界観に戻るUNIXシステム管理1(OS設計)UNIXやLinuxのシステム管理(システム・コマンド・設定)に関する世界観1(OS設計)です。Linux全般そもそもLinuxとはLinuxは、北欧フィンランドの当時大学生だったリーナス・トーバルズによって開発された、オープンソースのUNIX互換OSの「カーネル」と呼ばれるソフトウェア。OSには、カーネルとユーザーランドがある。カーネルとは、低水準なハードウェアデバイスを操作したり、プログラムを複数同時に実行したり、ファイルやディレクトリといったファイルシステムやソケット通信のネットワークを低レベルレイヤーで提供したりというように、全てのプログラムに共通に必要な機能をユーザーランドのプログラムに提供するための基盤となるソフトウェア。このカーネルの上で、OSの全てのプログラムは動いている。カーネルの上で動くプログラムのことをユーザーランドという。リーナスは、このカーネルという部分を開発した。OSは通常、カーネルだけでは使えない。その上にさまざまなコマンドラインプログラムあるいはGUIプログラムがなければ、人間がそもそもコンピュータを使う目的である、さまざまな機能を持った「アプリケーション」がなければ、それはOSとは言えない。Unixの略)というプロジェクトがあり、コンパイラ(C言語のソースコードを実行ファイルに変換するソフトウェア)やコマンドラインシェル(コマンド入力から指定のプログラムを実行する)などユーザーランド一式を提供していた。Linuxは、GNUのコンポーネントと組み合わせて利用される。GNUが「LinuxではなくGNU/Linuxと呼ぶべきだ」と主張しているのはこのため。LinuxはオープンソースのライセンスであるGPLでライセンスされており、ソースコードが万人に開かれている。Linuxの歴史そもそも、UNIXというソフトウェアも、またLinuxやGNUとは別個の、それも太古の昔のOSである。UNIXはアメリカの電話・通信会社AT&Tのベル研究所によって1960年代に開発がはじめられた。Multicsという巨大プロジェクトを抱えていたベル研だったが、巨大かつ複雑すぎて使い物にならなかった。ベル研のMultics開発メンバーはこれに嫌気がさし、シンプルかつ単純なUNIX(Multiに対してUni)と呼ばれるOSを開発した。AT&Tは独占禁止法からコンピュータ業界への参入を禁じられており、UNIXをパブリックドメインで公開した。無料で利用でき、ソースコードを見ることも、コピーすることも改造することも第三者に与えることも自由だった。技術的に見ると、当時としては目新しい、C言語である高級言語(CPUに依存した機械語の命令セットを使う直接のアセンブリ言語ではなく、開発した後で機械語に変換する人間に読みやすいプログラミング言語)で書かれており、別のCPUプロセッサやアーキテクチャに移植することが簡単だった。マルチタスク・マルチユーザのタイムシェアリングシステムとして設計されており、文字ベースのコマンドを使いながら、複数の端末でひとつの中央コンピュータ(ワークステーション)を操作し、全てのプログラムを並列かつ多数のタスクで動かすことができた。UNIXは、大学や研究機関のワークステーションに爆発的に普及する。カリフォルニア大学バークレー校の学生たちは、UNIXに独自のソフトウェアや改造を加えたBSD(バークレー・ソフトウェア・ディストリビューション)を開発。これにはviやcshを開発したUNIX界の神様のようなスーパープログラマーであるビル・ジョイも開発者に含まれる。Microsystemsなどの商業会社にも使われる。Sunにはビル・ジョイも入社している。当時のUNIXの強みはネットワークとオープン。Sunは「ネットワークこそコンピュータ」であるという宣伝文句によって、NFSやJavaなどの技術を開発し、自社のSunOS(以後にSolarisという名前になる)と呼ばれる商業UNIXやSPARCという独自のプロセッサとともにライセンス販売を行う。したオープンだったUNIXだが、AT&Tが独占禁止法から解放されたため、パブリックドメインではなくプロプライエタリになり、ソースコードにアクセスできなくなる。AIラボのリチャード・ストールマンは、フリーなUNIXのクローンとしてGNUの開発を決め、自身もテキストエディタEmacsやコンパイラGCCを開発しながら協力者を探す。GPLというパブリックドメインより厳しいライセンスを裁定した。これにより、絶対にGNUがフリーでなくなることがなくなった。BSDからAT&Tのコードを削除した386BSDなども開発されるが、起訴問題などにより配布できなくなる。Hurdというマイクロカーネルの開発がいつまでたっても進まなかった。ここではマイクロカーネルという問題があった。カーネルの設計には旧来のモノリシックカーネルと先進的なマイクロカーネルがあるが、マイクロカーネルはモノリシックカーネルよりも開発や実用化が難しい。そのためGNUはカーネルだけが開発されないまま、ほとんどのUNIXツールの開発を終え、カーネルさえあれば使い物になるレベルになった。ここで、フィンランドのリーナス・トーバルズによるLinuxが開発される。リーナスは当初Minixと呼ばれる教育用のUNIX系OSを使っていたが、Minixの機能に限界を感じ、自分でMinixを改良する。その結果、改良した部分のコードだけでOSとして成り立つようになった。386プロセッサによって「庶民のコンピュータ」が実現されつつある時代であり、リーナスも386プロセッサでUNIXワークステーションを使いたいと思ったが、そのためにGNUもBSDも386向けのフリーに入手できるカーネルを提供できていなかったため、リーナスはひとりで386向けのカーネルを書いた。リーナスは、このLinuxカーネルをインターネットのニューズグループで公開し、フリーで配布するとともに開発者として参加したい人を募った。386向けの小さなカーネルだったが、開発参加者によってさまざまなアーキテクチャに移植され、またMinixのコンポーネントはGNUのコンポーネントに置き換えられ、独自の商用利用を禁じたライセンスはGPLに変更された。)の高いカーネルに成長した。Linuxカーネルの特徴として、モノリシックカーネルであることが挙げられる。Hurdとは違い、カーネルの中の各コンポーネントをサーバーに分けることはせず、一枚岩の巨大なソフトウェアとして実装する。これは伝統的でありパフォーマンスも良くなるが、Minixの作者タネンバウムからは「時代遅れだ」と批判された。Linuxはただのカーネルであり、ユーザーランドのソフトウェアがなければ動作しないが、伝統的にLinuxカーネルはGNUのツールとともに組み合わさって提供される。GNUはBashやGCCなどUNIXのほとんどのツールを開発・提供している。GNUとLinuxとが協調して動くために、Linuxの開発者とGNUの開発者は協力した。したことから、GNUのストールマンは「LinuxではなくGNU/Linuxと呼ぶべき」だと主張している。System(UNIXでGUIのグラフィックスアプリケーションを使うのに必要となるウィンドウシステムと呼ばれるソフトウェアで、以前はXFree86という名前で386向けのものが提供されていたが、今ではプロジェクトのごたごたでX.orgという新しいプロジェクトに置き換わった)など、必要となるツールを一緒に配布し、簡単にインストールできるようインストーラが付属したものが提供されており、これを「Linuxディストリビューション」と呼ぶ。昔はSlackwareなどが普通だったが、今ではソフトウェアの管理をしやすくするパッケージ管理システムと呼ばれる、ソフトウェアを自分で手作業で調整しなくても、ある程度インストールや依存関係の把握などを自動でやってくれる機構を使って作られている。HatのライバルであるドイツのSUSE、また会社ではなくコミュニティで作られている、Debというパッケージ形式を使う硬派なDebianなどが有名だが、ディストリビューションは雨後の竹の子のように増えており、必ずしもこれらを使うわけではなく、Distrowatch.comというサイトで最新のディストリビューションの情報を得られる。Linuxを使う時は、こうしたディストリビューションのどれかを導入し、その上でLinuxカーネルとGNUユーザーランドを使う形になる。System(Xにバージョン番号を加えてX11と略される)とともにGNOMEやKDEといったデスクトップ環境を使うことで、Windowsと同等の「デスクトップPCで操作しやすい」環境を導入することができる。KDEはドイツ、GNOMEはメキシコで生まれ、二大デスクトップ環境となっている。Linuxのもっとも大きな特徴は、オープンソースであること。全てのソフトウェアがオープンソースで公開されており、フリーで利用できる。フリーとは無料という意味ではなく自由という意味で、自由にソフトウェアをコピーしたり再配布したりソースコードを確認・変更できることを意味する。Linuxカーネルは「バザール開発」と呼ばれるオープンな新しい開発方式を用いて、インターネットとメールを通じたゆるやかな集団として開発が行われており、たくさんの「善意のボランティアの貢献者」によって開発されている。「伽藍とバザール」という論文を書いたエリック・レイモンドは、「数千人の片手間のプログラマによって超一流のOSが生み出された破壊的現象」と記述していて、これがMicrosoftとのブラウザ戦争に負けたNetscapeがブラウザを存続させるためにオープンソース化した「Mozilla.org」の動きにつながる。今では、アフリカ発のUbuntu(南アフリカ人によって開発)など全く目的や理想の違う人々とともに開発されている。Hatのようなオープンソース企業はGPLでソフトウェアをライセンスしながら、長期サポート(セキュリティホールやバグの修正)によって利益を上げている。Linuxの読み方Linuxの読み方について、フィンランド出身でスウェーデン語を母語とするリーナス・トーバルズによれば、「誰がどのように読んでも良い」とのこと。日本では、昔は「リヌックス」や「リーヌークス」と呼ばれることもあったが、今では「リナックス」が標準的になっている。そもそもLinuxという言葉自体リーナスがつけたものではなく、サーバーのディレクトリに置く際に別の人間が勝手に付けた名前であり、リーナスは呼び名や発音にはこだわっていない。ソフトウェア開発とオープンソース精神OSのようなソフトウェアは、「パソコンでコードが動いている」という理解をしている人が多いと思いますが、このコードは、どのパソコンでも基本的に同じコードが動いています。場合場合によって、異なる使い方がされるプログラムのコードですが、コード自体はどの実行状況でも同じコードが動きます。開発者は、全ての使用ケースを想定しながら、どんな状況にでも対応できるように、コードを書かなければなりません。「どんな場合にも対応できるようにコードを書く」ということは、とても難しいことです。ソフトウェアのバグにはたくさんの種類や状況がありますが、単なる書き間違いのバグや、言語やプラットフォームや使用する技術のことを不勉強だから起きるバグや、アルゴリズムそのものが実装できていない「作りかけ」のバグだけではなく、こうした「想定外」の状況が起きることで、使用されると思っていた状況だけではない状況でそのプログラムを動かすことで起きるバグ、というものもあります。(ほかにも、設計そのものが間違っていたり、機能を増やすことで従来の設計が成り立たなくなったり、そもそも作りたいと思っていた完成形のソフトウェア像や要求された仕様そのものに間違いがあることもあります。)こうした「想定外のバグ」は、商用企業はお金を儲けることでそのお金を使ってバグを直しますが、それでも、ひとつの会社がクローズドソースでテストし修正するバグ修正には限界があります。これに対して、オープンソースでよく言われるのが、「目玉がたくさんあれば、どんなバグも深刻ではない」という考え方です。これは、ソースコードをオープンに公開し、同時にたくさんの参加者がそのコードを「使用する人間自らがチェックする」ことで、みんなでバグがあるかどうかを確認し、それぞれがそれぞれの環境でテストし、バグを修正することで、どんなバグでも直すことができる、という、「ハッキング性善説」のような考え方です。みんなでハックすれば、どんなバグでも必ず修正できる、という理想郷のような考え方がLinuxにはあります。これはユーザーが開発者と同じ能力やスキルを持っている場合に限られます。そのため、オープンソース界では、「Do-it-yourself」という精神がよく言われます。ユーザーには開発者と同等のスキルや知識、あるいは開発者よりも高い技術が求められます。最初から、そうした「できる人材」だけを求めていて、使えないソフトウェアがあった場合には、自分の手間や時間を捧げて「自分で使えるものになるように改良する」という精神が求められるのです。WindowsはそもそもMicrosoftの利益のために開発されており、ユーザーが広がっても得をするのはMicrosoftに限られます。Windowsユーザーの利益にもなるとは思いますが、使い続けるためにはお金を払わなければいけません。これに対して、オープンソースソフトウェアは、「使うのも作るのも自分たち」であるため、力を持つのはユーザー自身です。そのため、オープンソースで開発すること、それを外部に無償で貢献することは、「ソフトウェア業界全体の公共の利益」になると言えます。OSとはプログラムからハードウェア機器を操作しやすくする仲介役OSとは、ソフトウェアとハードウェアの間に入って、ソフトウェア(プログラム)からハードウェア(実際の電子機器)を操作しやすくする、仲介役として使われる「基本ソフトウェア」です。OSは、ハードウェアの操作のために必要な「低水準な処理」と、ソフトウェアからそのハードウェアを操作するための「システムインターフェース」を提供します。OSがあるために、プログラムからハードウェア機器が操作しやすくなり、たとえばopen/close/read/writeというシステムコールでストレージデバイスの中のファイルシステムを簡単に操作したり、socket関数を利用することで実際のネットワークプロトコルを意識しなくても、ネットワーク機器による通信をプログラムから簡単に実現できます。現代的なOSでは、ハードウェアを単純に操作する以外に、多くの機能を提供します。仮想CPU(非常に短い時間で複数のプログラムを順番に実行することで並列処理を実現する)や仮想メモリ(仮想アドレス空間を導入することで、プログラムが使う仮想メモリ領域を現実の物理メモリ領域に変換し、たくさんのプログラムを安全に同時実行する)といった機能によって、マルチタスク(同時に複数のプログラムを実行する)が実現されます。ほかにも、UNIXにはカーネルとユーザーランドの権限を分け、ユーザーのデータを他のユーザーから見えなくするマルチユーザーの機能があり、ひとつの中央コンピュータを複数の端末から同時にログインして使うことができます。デバイスドライバを使うことで、個々のデバイスの詳細を知らなくても、同じインターフェースからデバイスを操作できます。割り込み機能によって、デバイスの処理を待っている間、OSは別の処理を行うことができます。ストレージデバイスにおいては、ファイルシステムにより、記録媒体の低レベルな処理をしなくても、ファイルやディレクトリを使ってストレージデバイスの中のデータを読み書きできます。UNIXのファイルシステムは、入出力機構と統合されており、コマンドの入出力は簡単にファイルに読み書きできます。ネットワーク通信の機能があることにより、クライアントとサーバーの双方で、細かい方式やプロトコルを知らなくても、たとえばLANにおけるイーサネットやTCP/IPによる通信ができます。した機能を提供するソフトウェアを、OSの中核という意味で「カーネル」と呼びます。LinuxなどのOSの設計では、ハードウェアデバイスとソフトウェアの間に必ずカーネルがあり、カーネルを通じてプログラムはデバイスにアクセスします。Linuxのように、カーネルの全ての機能を、ひとつのプログラムとして実装した一枚岩で実装したものを「モノリシックカーネル」と呼び、MachやL4のように、カーネルには最低限の機能だけを実装し、あとはサーバーとして実装したものを「マイクロカーネル」と呼びます。マイクロカーネルは新しい発想ですが、処理の効率や性能に問題があり、実装も難しいため、Machを元に開発されているGNUのHurdは、今でも完成されていません。System、あるいは書籍を出版するための組版システムTeXなどがあります。したライブラリや低水準のソフトウェアを使うことで、システムの機能を拡張でき、標準Cライブラリ関数のさまざまな機能を使ってプログラムを開発するなど、「もっとたくさんのことができる」ようになります。ApacheやJava/Tomcat/JBossのようなミドルウェアをカーネルの上で動かすことで、エンタープライズ向けの機能を使うことができます。したソフトウェアを含めて「広義のOS」と呼びます。この広義なOSとしてのLinuxを呼称する際に、カーネル以外のソフトウェア・システムとしてGNU由来のソフトウェアを多く採用しているため、GNUは「LinuxではなくGNU/Linuxと呼んでほしい」と主張しています。GNU/Linuxなどは、そうしたGNUの意見を踏まえて名称を決定しています。Linuxカーネルはオープンソースであり、OSの設計図が公開されており、簡単にコピーや改造や再配布ができます。Linuxカーネルはモジュールという単位でカーネルの機能を分割したり動的読み込み(最初の起動時にはその機能を読み込まず、必要になった段階で動的に読み込む)ができます。必要のない機能は削除できるほか、自分でコードを書き直したり分割したりすることもできるため、別の技術者が改良したりカスタマイズすることに長けています。このため、組み込みやIoTなどの「パソコン以外のOS」に搭載されることも多く、モバイルOSであるAndroidはカーネルにLinuxを使っています。最近では自動車などでもオープンソースで安定しバグの少ないLinuxのコードベースが利用される機会も増えています。LinuxはGNUによるGPLと呼ばれるライセンスで配布されており、このGPLではGPLで一度配布されたソフトウェアを再度配布したい場合には、GPLに基づいて配布しなければなりません。よって、Linuxをカスタマイズして作った派生版Linuxカーネルは、元のLinuxと同じようにGPLで配布する必要があります。これには、派生ソフトウェアや一部のソースコードを利用して作られたソフトウェアも含まれます。したLinuxカーネルの「厳しいライセンス」に比べて、Linuxと同様のUNIX系のOSカーネルとして、FreeBSDやNetBSDやOpenBSDがあり、これらはBSDライセンスと呼ばれるライセンスで提供されています。BSDライセンスでは、再配布する際に同じライセンスで配布する必要が無く、商用利用のためのコードベースとしてはLinuxよりも優れています。最近のパソコン向けのOSは、インターフェースがコマンドラインではなく、グラフィカルなウィンドウシステムを搭載しています。最近は、OSと言えばこうした「GUIインターフェース」を指すようになりました。Windowsでは、カーネルと統合されたデスクトップ環境(Explorer)が動作しますが、Linuxではこうしたウィンドウシステムはカーネルと統合されていません。X11と呼ばれる専用のディスプレイサーバーソフトウェアの上で、GNOMEやKDEといったそれぞれのデスクトップ環境を動作させることができます。GNOMEを使う場合はGNOMEのインターフェース、KDEを使う場合はKDEのインターフェースを用いながら、GNOMEアプリケーションやKDEアプリケーションを利用できます。LinuxがWindowsに比べてあまり普及していないのは、Windowsの囲い込み戦略によります。WindowsではMS-Officeなどを抱き合わせて販売し、そのファイル形式が広まることで、結果MS-Officeが必要となり、他のOfficeを使うことは現実的でなく、LibreOfficeのように互換性のある無料Officeがあったとしても、「せっかく買ったMS-OfficeをLibreOfficeと引き換えに失うのは避けたい」という心理が働くため、結果MS-Officeを使わざるを得ません。Frameworkと呼ばれるJavaと同様の機構を使うことで、最近は安定して動くようになりました。サーバーなどの用途ではLinuxが使われる機会が多いですが、デスクトップなどの用途ではLinuxやオープンソースはMicrosoftに負けています。これは、単なる競争というよりも、「IT資本主義とオープンソース共産主義の戦い」であると言えます。Microsoftは資本主義の大企業であり、とても長大な利益をあげて、その利益によって製品を作っているため、UNIXの基本設計がいくら優れていても、オープンソースと比べて細部の品質やできが良く、今のWindowsはUbuntuなどと比べて「どうして良いか分からなくなるような問題や不具合」が少ないため、Windowsもしばらくは「MSの信頼できるOS」として使われ続けるでしょう。Windowsに比べたLinuxの良さは、「シンプルであること」ではないかと思います。Linuxというカーネルの上でコマンドが動く、言ってしまえばそれだけのシステムにすぎません。したウィンドウシステムはありますが、それらはオープンに開かれており、自分の手で開発できます。した「開かれたシンプルさ」が、UNIXが長らくワークステーションで使われてきた理由ではないかと思います。そのため、systemdに代表されるようなLinuxの新技術は、たまにきわめて嫌われることがあります。「UNIXはシンプルであるべき」という格率のようなものがあるため、GNOMEやKDEのような「巨大なデスクトップ環境」は多くの人に嫌われており、Xfceのような軽量なデスクトップ環境が好まれることも多いです。WindowsはOSにたくさんの機能を統合したため、複雑で致命的なバグの多いものになっています。セキュリティホールや脆弱性は毎度のことのように見つかっており、またMFCや.NETなどは複雑すぎて分かりにくいという一面があります。OSの役割OSの役割についてさらに詳しくは、OSを参照してください。UNIXLinuxはUNIX互換OSとして、UNIXと同じ操作方式や良く似たシステムを提供します。UNIXについてはUNIXを参照してください。LinuxとはオープンソースのUNIX互換OSLinuxは、オープンソースで開発されている、UNIX互換OSです。UNIXと同様にC言語で開発されており、Windowsのようにバイナリ(プログラムの動作に必要)だけではなく、ソースコード(人間がプログラムを開発するために必要な、人間の理解できるおおもとの設計図としてのプログラム)が公開されています。このソースコードは自由にコピーや再配布ができます。誰でもこのコードをネットで配布できるため、多くの場合無料です。UNIXとは、コンピュータのOSとしては伝統的なOSで、マルチタスク・マルチユーザーのタイムシェアリングシステムとして知られています。開発の早くからマルチタスクで設計されており、安定や信頼性が高く、サーバーやワークステーションのように「多くの人々とネットワークで接続して動作する」という優位性に長けています。UNIXはAT&Tによって「シンプルなOS」として開発され、当時のAT&Tが独占禁止法のためにコンピュータ業界への参入を禁じられており、パブリックドメインでソースコードを公開したことから大学や研究所のミニコンやワークステーションなどに爆発的に普及しました。その後カリフォルニア大学バークレー校のBSDなどを経て改良されましたが、独占禁止法が解除されたためにパブリックドメインではなくなりました。結果、GNUなどがフリーなUNIXのクローンを開発することを目指し、BSDからAT&Tの権利のあるコードを書きなおしたPC用のBSDなども開発されましたが、それらがなかなか提供されず、MINIXという教育用のUNIX互換OSを使っていたリーナス・トーバルズが、MINIXを改良し、リーナスが書いたコードだけで全ての部分が動くモノリシックカーネルに成長し、GNUと組み合わせることで完全にフリーなOSとなりました。Hatなどの企業も参入して、今日に至ります。ほとんどのソフトウェアがオープンソースLinuxでは、ほとんどのソフトウェアがオープンソースで、多くのディストリビューション(Linuxカーネルとさまざまなソフトウェアを合わせてひとつのOSとして動くようにした、Linuxの配布・提供版)ではパッケージ管理システムから、簡単にコマンド操作で新しいソフトウェアを導入することができます。パッケージ管理システムは上手くできていて、リポジトリと呼ばれるサーバー上のパッケージの提供場所で配布され、すでにコンパイルされており全ての必要事項(インストールや設定や依存関係の解決のための事前準備)が整っています。Debianではapt、Fedoraではdnfで簡単に公式のリポジトリからパッケージを導入できます。コマンド一発で全てのパッケージをリポジトリに公開される最新版に更新できます。ほとんどのソフトウェアがオープンソースであるため、自分の手で開発することがとても簡単です。このため、良く「ハッカーのOS」と言われます。このハッカーとは、システムを破壊し不正に侵入する「クラッキング」を行う悪意あるハッカーではなく、システムを自分の手で作り変え、とても高度なことを実現する「善意のハッキング」をする人を指します。コマンド操作が主体UNIXはそもそもがコマンドラインでの操作を念頭に置いており、Linuxでも本当のLinuxのパワーを発揮する現場はコマンドラインです。cdなどのコマンドと、BashやTcshのようなシェルを使うことで、コマンド操作でプログラムを実行できます。このメリットは、「プログラム自体が単純になる」、「スクリプトなどで自動化しやすい」、「ネットワークからリモート操作をSSHのようなリモートログイン操作で行うことができる」、「GUIのウィンドウシステムからもターミナルと呼ばれるソフトウェアで簡単にコマンド操作ができる」などがあります。UNIXの考え方として、「システムは単体のプログラムではなく複数のプログラムの関係から生まれる」というものがあります。このため、ファイルシステムや入出力とともに、パイプやリダイレクトのような機能を使うことで、「簡単にコマンドとコマンドを組み合わせて操作する」ことができます。X11ではさまざまなデスクトップ環境があるLinuxの基本はコマンド操作ですが、現代的なOSとしてはコマンドと文字だけのOSというのは考えられません。ディスプレイに表示されたウィンドウをマウスで操作しながら、プログラムを目で確認しながらクリックやキー入力で操作したいでしょう。Linuxには、こうしたGUI操作を実現する「ウィンドウシステム」と呼ばれるソフトウェアとして、X11という機構があります。Linuxの上でX11サーバーを動かし、Xサーバーをマウスで操作しながら、Xクライアントと呼ばれる、Windowsで言えばWindowsアプリケーションに当たるGUIプログラムを操作することができます。X11にはWindowsのような「標準的なGUI」は存在しません。Linuxでは、X11をコアの機構として導入しながら、さまざまなデスクトップ環境やウィンドウマネージャを試すことができます。Cinnamonなどが存在します。ウィンドウの部品(スクロールバーやメニューボタンなど)も、X11の素の状態では提供されていません。した部品はウィジェット・ツールキットと呼ばれます。KDEではQtと呼ばれるツールキットを使います。Linuxにはコマンドのプログラムも多いですが、X11を用いたGUIのプログラムも意外と多いです。Firefoxや、OfficeソフトウェアのLibreOffice、イラスト・デザインソフトウェアのGIMPやInkscapeなどがあります。Linuxの真価はサーバー用途にLinuxを使う上で、一般的に使われるぐらい優れたソフトウェアはサーバーです。サーバーとは、Webブラウザなどでインターネットを見る時に、自分の側にあるソフトウェアがWebブラウザだとするなら、Webサイトの相手側にあるソフトウェアをWebサーバーと呼びます。サーバーにはWeb以外のサーバーもありますが(たとえばファイルサーバーのNFSやSamba、メールサーバーのPostfixなど)、Linuxで良く使われるのはApacheやNginxと呼ばれるWebサーバーです。このWebサーバーに加えて、スクリプト言語であるPerl/PHP/Python/Rubyや、データベース管理システムであるMySQL/PostgreSQLが良く使われます。最近はRails/Django/LaravelのようなWebフレームワークや、Node.jsなどJavaScriptによる最先端のソフトウェア基盤、あるいはコンテナ・仮想化技術であるDockerやKubernetesなどが良く使われます。Linuxはこうしたサーバーとネットワークのために良く使用されています。その理由は、コマンドラインのOSであるため、GUI機能を導入しなくて良く、またUNIX系のOSであるため安定性や信頼性に優れており、UNIXのツール(たとえばviやsed)を使うことでシステムの管理がしやすいから、などの理由です。UNIXはそもそもが端末とメインのコンピュータを分けて使うことを想定しており、シングルタスクのDOSをベースとしたWindowsと違って早くからマルチタスクを取り入れているため、並列的なネットワーク処理に優れています。パソコンで動くWindows以外のOSを入れてみたい方にLinuxは、パソコンで動くWindows以外のOSを「少し触ってみたい」という方にもおすすめです。最近のLinuxは初心者向けになっており、複雑な設定ファイルをいじらなくても、自動認識と自動設定、そしてGUIからの設定ツールで多くのことができるようになっているからです。プログラミングの勉強がしたい方にも向いています。それは、開発ツールも無料で手に入るからです。Studioという高価なソフトウェアを購入しなければなりませんが、LinuxではGCCなどが無料かつオープンソースで手に入ります。「Windowsをただ使うだけではなく、新しいOSを入れてカスタマイズしたい」という方にも向いています。先に書いたデスクトップ環境以外に、X11のウィンドウマネージャをカスタマイズすることができます。タイル型ウィンドウマネージャなどの面白いウィンドウマネージャがたくさんあり、これらはGNOMEやKDEの代わりに使うことができます。それから、「Linuxの独特の雰囲気に触れてみたい」という方にもおすすめできます。GNOMEアプリケーションやKDEアプリケーションでは、ウィンドウマネージャだけではなく、それぞれの独自のGUIアプリケーションを開発しており、それぞれのプロジェクトで雰囲気が違います。KDEアプリケーションには、ウィンドウマネージャだけではなく、「あらゆるアプリケーションをありったけ開発している」という特徴があり、それぞれのKDEアプリケーションを触りながら、簡単に開発に参加できます。覚えることは多いLinuxには、けっこう覚えることは多いです。コマンドについては基本的な考え方やオプションを知る必要がありますし、デバイスファイルやマウントなどを中心とするファイルシステムの考え方や、カーネルとユーザーランドの違い、設定ファイルの記法、ログや監視機構、あるいはシステムコールの記法なども覚えなければ、本当の意味でLinuxのマスターにはなれません。実際のところ、Linuxはそうした部分が面白いのです。した部分を知れば知るほど、どんどんLinuxの世界にはまっていって、病みつきになります。ある意味、ディストリビューションによってシステムのさまざまなことが変わってくる、というのも、難しいとは言えますが、逆に面白いです。FedoraやDebianでやっていたことが、GentooやArchでは全く違います。同じソフトウェアを動かすのであっても、パッケージやシステムの関係からやり方が全く違ってきます。Rubyなどの絶好の「練習用プラットフォーム」になります。言語だけではなく、gitやmakeなどの開発ツールについても同様で、絶好の実験台になるでしょう。OSというのはカーネルが中心にあり、それ以外のソフトウェアは多くがカーネルと協調して動きます。Linuxはモノリシックカーネルですが、優れたスケジューラやプロセス管理機構、仮想メモリ管理機構、ファイルシステム、ネットワーク、そしてデバイスドライバなどのカーネル由来の機構があります。本当にハードウェアに近いところを触りたいのであれば、Linuxカーネルはその練習機会を与えてくれるでしょう。素人には簡単には難しく、MINIX本のようなリーナス・トーバルズが読んだ本などを勉強する必要があります。第2版」を読みながら自分で考えて書きました。ユーザーとグループUNIXにはユーザーとグループがある。自分の所有するファイルは、他のユーザーから見ることはできない。実際のところ、他のユーザーとも共有したいファイルがあるかもしれない。いう時に、グループという機能を利用できる。ユーザーは、所属ユーザーには読み書き実行を許可し、所属グループには読み込みだけ許可したりすることができる。このために、ファイルにはパーミッションと呼ばれる権限が定められている。したユーザーの仕組みに対して、ひとつ特権的なユーザーがUNIXには必ずあり、それを「rootユーザー」という。rootユーザーは、全てのユーザーのデータにアクセスでき、全てのユーザーのプロセスに干渉できる。プロセスとマルチタスクUNIXでは、プロセスという「実行コンテキスト」を持っている。プロセスはプログラムの意味でもあるが、複数のプログラムを順次実行するプロセスや、同じプログラムを実行する複数のプロセスというのも考えられる。昔のOSでは、プロセスはひとつしか存在せず、CPUはプロセスが専有し、メモリのアドレス空間はひとつだけだった。UNIXはマルチタスクと呼ばれる仕組みを採用しており、タイムシェアリングシステムとも呼ばれる。UNIXでは、プロセスは複数同時に実行でき、それぞれのプロセスが別々のアドレス空間を持つ。そのために、プログラムをそれぞれ別々に実行するスケジューラと呼ばれる機構があり、複数のプログラムを時間ベースで次々に切り替えて実行する。実際は、プログラムを実行している時に別のプログラムの実行が要求されると、プログラムはレジスタなどの必要なデータをレジスタ外に退避させ、そのプログラムを停止する。新しいプロセスが実行される。スケジューラによって次々にこの切り替え命令が実行される。切り替えが行われると、今動いているプロセスを停止して別のプロセスを実行できる。プロセスの持つアドレス空間は、実際にアクセスされる前にカーネルによって翻訳される。よって、プログラムがメモリを使用するために必要なアドレス空間を、それぞれのプログラムの中に「閉じる」ことができる。ファイルとディレクトリファイルはデータの保管を抽象的に扱ったもので、プログラムはデータをストレージに保管する際にファイルとして保管する。UNIXでは「原則ファイルとして扱う」という哲学があり、デバイスドライバによって操作されるデバイスもファイルとして扱われる。ディレクトリはファイルを集めてひとつの場所に格納するもの。絶対パスと相対パス絶対パスはルートディレクトリ(/)から始まる絶対的なファイルの場所のこと。相対パスは、今の自分のいるディレクトリ、すなわち「作業ディレクトリ」から始まる相対的な場所のこと。通常、ファイル名だけでアクセスする時は、作業ディレクトリからの相対パスとして扱われるが、「/」から始まるパスを指定すると絶対パスとして扱われる。相対パスにおいて、「.」は現在のディレクトリ、「..」は現在のディレクトリの上のディレクトリ(親ディレクトリ)を表す。「./hogehoge」とすることで、現在のディレクトリの中にあるhogehogeを指定できる。リンクファイルには、名前が設定されるが、この名前は本当は複数設定できる。名前のことをリンクあるいはハードリンクという。さまざまな制約(ユーザがディレクトリに対するハードリンクを作れないことや、同じファイルシステム内のハードリンクしか作れないこと)があることから、通常ハードリンクは使われなくなった。ハードリンクは名前を複数設定するだけのものだが、これに対して、小さなリンク専用のファイルを作ってそこからパスを辿っていく、ソフトリンクあるいはシンボリックリンクが広く使われている。ファイル、ディレクトリ、シンボリックリンク、ブロック型デバイスファイル、キャラクタ型デバイスファイルのほか、名前付きパイプやソケットなどもファイルとして扱われることがある。ブロック型デバイスとキャラクタ型デバイスデバイスファイルには複数の種類があり、ブロック型デバイスとキャラクタ型デバイスと呼ばれる。ブロック型デバイスはデータの蓄積として扱われ、別々のファイルを前後しながら読める。キャラクタ型デバイスはストリームとして扱われ、別々のファイルを読むことも、前後して読むこともできない。一般的に、ブロック型デバイスはファイルシステムに「マウント」されてファイルを読み書きするために使われる。キャラクタ型デバイスはマウスやキーボードなど、「バイト列を読む」ために使われる。これとは別にネットワークインターフェースのデバイスドライバがあり、通信に利用し、デバイスファイルからの読み書きはできない。健治)を参考に執筆しました。)実際のところ、Linuxではデバイスドライバによって感知されたデバイスは/devディレクトリの中にファイルができる。これをデバイスファイルと呼ぶ。プログラムがデバイスファイルにアクセスすると、対応するI/Oデバイスを用いて、デバイスを直接触ることができる。シェルとコマンドコンソールのUNIXが起動すると、ログインとパスワードを要求する。パスワードを入力するとパスワードを確認するプログラムが実行され、ログインできるとコマンド入力を受け付けるシェルが実行される。XなどのGUI環境ではこの限りではない。通常はウィンドウシステムと、ウィンドウの操作を行う「ウィンドウマネージャ」が別プロセスとして起動し、それぞれの画面を構成するそれぞれのプロセスがたくさん起動する。ターミナルエミュレータを開くと、そのターミナルのウィンドウとシェルのプロセスが起動し、シェルから別のプロセスを実行する。コマンド操作環境では、プログラムのバイナリ名を指定して、その後にスペースを開けて引数やオプションを指定する。バイナリは環境変数のPATHの中から検索される。引数にはプログラムに与えるファイルのファイル名などを指定する。オプションは-abcのようなショートオプションと、--helpのようなロングオプションがある。カーネルモードとユーザモードUNIXのカーネルは、CPUのカーネルモードとユーザモードという「ハードウェアの機能」を利用して、カーネルとユーザーの世界を分けている。UNIXで実行されるプログラムは、多くの場合ユーザーモードで実行される。カーネルの機能が必要になった段階で、ユーザーはシステムコールを通じて、カーネルに処理を要求する。これに応える形でカーネルはカーネルモードにプログラムを切り替えて処理を切り替えて、カーネルモードでプログラムを実行する。現代的なUNIXカーネルでは、カーネルはカーネルスレッドの集合体として設計されることがある。この時、カーネルスレッドの切り替えはプロセスの切り替えよりも素早く、効率的に行われる。割り込みと同期処理カーネルは、常に多くの割り込み処理、すなわち目的のプログラムを実行し続けながら、ハードウェアからの応答に対応してプログラムの実行を切り替える必要がある。このために、カーネルの中では「同期処理」が行われる。必要とあれば、カーネルはロックを行う。シグナルとプロセス間通信プロセスに対して「強制終了せよ」という命令を下すために、UNIXカーネルはシグナルと呼ばれる機構を採用している。プロセスとプロセスの間でデータを共有するために、プロセス間通信(IPC)という機構をUNIXは採用していることが多い。移植性Linuxはそもそもリーナス・トーバルズによってx86システム向けに設計されたが、さまざまなカーネル開発者によって他のCPUアーキテクチャに移植された。これらの機種依存のコードはarchサブディレクトリの中にある。多くはC言語とアセンブリ言語で記述されている。標準規格UNIXにはPOSIXのような標準規格がある。POSIXでは、UNIXカーネルのインターフェース部分についての標準化が行われている。そのため、別のUNIXで動いていたコードは、Linuxでも動く場合がある。標準的なシステムコールしか使っていない場合は、何の変更もパッチも当てなくても、そのまま動く。POSIXではインターフェース部分の標準化しか行われていないため、カーネルの内部については干渉されない。カーネルがどのような設計で実装されていても、カーネル開発者の自由である。カーネルの開発体制Linuxカーネルは、商用UNIXとは違い、商用の企業目的で機能が実装されない。このため、不安定かつ使えない機能が大々的な宣伝とともに採用されることが少ない。Linuxカーネルは、自由に開発されており、また、効率を重視して機能が採用されている。このため、非効率的な機能(STREAMSなど)をリーナスが却下することもある。情報の探し方Linuxに関する情報を探す際に、良く言われることは既知の情報があるかどうかを探すことです。以下のような方法があります。・コマンドに類することであれば、manコマンド・infoコマンドの実行。・ソフトウェア個別のことであれば、tarballの中にあるREADME(インストール方法であればINSTALL)や、システムのdocディレクトリ(/usr/share/doc/や/usr/docや/usr/share/[アプリケーション名]などのディレクトリ)を参照する。・TLDPやJFなどでLinux関連のマニュアルを読む。・Webブラウザを起動し、アプリケーションを開発しているプロジェクトのサイトに行って、公式のドキュメントやリファレンスを探す。チュートリアルやAPIリファレンスなど。・ディストリビューション付属のマニュアルを読む。・GNOMEやKDEのヘルプなどのヘルプ機能から使い方を探す。・Googleで検索する。ブログや個人サイトを検索できるほか、エラーメッセージや設定ファイル名などを検索するとピンポイントでダイレクトに分かる場合が多い。・フォーラムやメーリングリストやIRCで教えてもらう。過去のアーカイブなどから同じ質問がないか調べてみる。以下のサイトが参考になるかもしれない。メディアラボ株式会社とりあえずこれだけ読んどけば何とかなる!とりあえずこれだけ読んどけばなんとかなる、という文書は多い。僕は以下の2つをお勧めする。Linuxについて何も知らないよ、という人向け。Linuxのインストールを通じてUNIXのシステム管理の方法を知りたいという人向け。Kernelを読むことをお勧めする。難しすぎる、量が多すぎる、と言う方は、まさに僕の書いたこの文章がお勧め。それでも難しいという人がたくさん居ると思う。Googleの検索結果はあまり参考にならない(古い情報や馬鹿が多すぎる)ので、色んなところでリンクされている定番サイトを見るのをお勧めする。HatカスタマーポータルとArchWikiは内容が良いので見てみても良いだろう。右上の地球アイコンから日本語を選べます。ArchWiki簡単なディストリビューションの紹介は以下のサイトにある。distrowatch.comあるいは、僕個人の意見としては、@ITとgihyo.jpがお勧め。@ITgihyo.jpあるいは、個人サイトやブログはたくさんあって網羅できない。自分で検索してほしい。検索していると、qiitaがかかることが多い。僕が思うにqiitaの内容はあまり良くない。みんなの知っていることを共有することはできるが、品質が高くない。Projectに賢い内容が多いので、疑わず参考にしてほしい。HOWTO-INDEXを参照しても良いだろう。英語でも頑張って読めば良いさ。