システム環境を考えてみる

提供:UnixClassWiki
2008年10月12日 (日) 12:34時点におけるHironobu (トーク | 投稿記録)による版 (→‎環境を考えてみる)
ナビゲーションに移動 検索に移動

環境を考えてみる

もしubuntu、Fedora、 KNOPPIX、あるいはVine Linuxのようなデスクトップ向けGNU/Linuxを使っているのでしたら、使い勝手はいわゆるパソコンと変わらないでしょう。Webブラウザ、ワードプロセッサ、プレゼンテーション、あるいはメールを出すにしてもWindows XPやMacOS Xの上で提供されているのと同じようなアプリケーションスイートOpenOfficeがあります。

Knoppix Desktop


何をさしてオペレーティングシステムと呼ぶのか」の所で説明した通り、カーネルと、その上にあるミドルウェア、そしてアプリケーションは独立した存在です。ミドルウェアにしてもアプリケーションにしてもソフトウェアは利用目的あるいは好みによって入れ換えることができます。たとえば多くのGNU/LinuxディストリビューションではGNOME、KDE、xfce、などを好みで入れ替えることができる選択肢が用意されています。


「UNIXはキャラクタユーザインタフェース(CUI)である」と思い込んでいる人も世の中にはたくさんいます。UNIXが生まれた1960年代には、そもそも今日のようなGUI(グラフィックユーザインタフェース)などなかったわけですから、むかしはCUI しかなかったというのは当然です。今日のUNIXはCUIでもGUIでもありません。ユーザレベルでCUIかGUIのどちらのインタフェースを選ぶかはユーザ次第だからです。


過去においてはGUIとCUIの両方が用意されていてもCUIを選ぶユーザも多かったというのは事実です。なぜかというとGUIを使ってUNIXをきちんと走らせようとすると、高速で高価なハードウェアが必要だったからです。別の言い方をすると、GUIのために計算機の資源を割くといったことよりも、そのための資源を本来の計算すべきものに使っていたといえるでしょう。近年になりデスクトップパソコンレベルでもCPUの処理速度が劇的に速くなり、ハードディスクの容量も格段に大きくなり、大量のメモリを搭載したものが出回るようになって、やっとGUIを使うのが一般的になりました。今やGNU/Linux環境は他のパソコンとかわらないユーザインタフェースを提供しています。


もしエンドユーザとして使うだけであればユーザとしてパソコンを使うようにデスクトップ環境をコンシューマー向けに作っているLinuxのディストリビューションをPCハードウェアにインストールし初心者用解説書を読めばマックやウインドウズと同じようなパソコンとして使えます。2007年においては米国DELL社ではエンドユーザ向けにubuntuをインストールしたパソコンを販売しています。またASUS Eee PC(非日本版)ではXandrosというLinuxのディストリビューションを最初から搭載しています。

携帯からスーパーコンピューターまで

GNU/Linuxは、Googleが携帯電話用OSとして作ったAndroid [1] からIBM @server zSeries のようなメインフレームまで基本的には同じ構造のものが動いています。もちろん必要とされるミドルウェアやアプリケーション、カーネルのコンフィグレーションはPDAとメインフレームでは異なってくるのは当然ですが、やはりどちらもGNU/Linuxと呼ばれるものです。



またGNU/Linuxはたくさんのコンピュータをつないたクラスターコンピュータとしても使われています。2008年において世界のスーパーコンピュータのTop500の中で最も使われているのはGNU/Linuxです。Operating System share for 06/2008 2008年6月版 [2] においては80%弱がGNU/Linuxで占めていることが見て取れます。


クラスターコンピュータとしての使われかたを考えてみましょう。数十台、数百台、数千台のマシンからなるクラスタシステムを想像してください。個々のシステムに対してディスクトップ環境などの環境は重要な要素ではありません。むしろ計算資源を圧迫する不必要な環境でしょう。


何が必要か、何が不必要かは常にどのような環境で使われるかで違ってきます。狭い範囲でしか使うことしか想定していないようなオペレーティングシステムでは、ここまでの柔軟性は不必要でしょう。柔軟性を持たせると、いろいろな局面で使うことができて便利です。また、使う局面のみ考えて使えばいいので、そんなに難しいことでもありません。しかし、その全容をすべて理解しようとすると、PDA からスーパーコンピュータまで通用する基礎的な知識を一通り学習しなければいけないという世界に入り込んでしまいます。現在ではGNU/Linuxは汎用の計算システムだけではなく、携帯電話やハードディスクレコーダーなどにも組込みOSとして使われるようになってきました。これらも単一のカーネルツリーからコンパイルすることが可能です。そこが醍醐味の一つでもあるのですが、しかし、この当たりが"UNIX(GNU/Linux)は難しい"という部分につながっているのではないかと筆者は想像しています。


調べてみよう
最新のSupercomputing Top500の中でGNU/Linuxベースなシステムは、どれぐらいのパーセンテージを占めているのであろうか。

GNU/Linuxの何を学ぶべきなのか

「GNU/Linuxでもワードプロセッサのアプリケーションが動きます」というレベルで満足であれば、この先を読み進める必要はありません。なぜならこの文章はGNU/LinuxやUNIXのHOWTOではないからです。アプリケーションレベルでのハウツー本が欲しいのであればインプレス社の「できるシリーズ」などをお勧めします。このテキストをこれ以上読んでも正直、時間の無駄です。


補足
ちなみに「できるシリーズ」はシリーズ累計3000万部を突破しています。


しかしコンピュータサイエンスの基本としてオペレーティングシステムを学ぶのであれば、我々は最初にUNIXが創造された時から脈脈と受け継がれるUNIX的なコンセプトを学ぶことが近道だと筆者は思います。最終的にそれがPDAに使われようが、メインフレームに使われようが、スーパーコンピュータで使われようが、学ぶための出発点は同じだからです。さて、これからこの先、何を学ぶべきかのポイントをざっくりと書き出してみます。


ざっくりリストアップしてみる

  • アクセス権限モデル
    • 管理者であるrootと一般ユーザとの区別され一般ユーザは限られた範囲でしか権限を持たない
    • ユーザIDやグループIDの設定と利用について
  • 入出力の統一化
    • 入出力は標準入出力とファイルに統一されている
    • ただしUNIXの長い歴史の中で不統一な所も出てきてはいる
  • / から始まる階層化されたファイルの名前空間
    • ディレクトリ中にファイルがあり、絶対パスや相対パスでファイルへアクセスしている
  • プロセスの構成
    • 親プロセスから子プロセス生成され、実行環境が継承される
  • プロセス間での通信
    • 記憶空間の共有について
    • ファイルもメモリも同じようにアクセスする仕組み
    • TCP/IPネットワーク機能について
  • 最小の機能構成された豊富なツール
    • 小さなツール群を組み合わせて柔軟に処理を行う
  • ワークベンチ
    • 作業を行うために豊富なツール群を用意している


これらを実現するために内部がどうなっているのかをGNU/Linuxを取り上げて、さらに詳しく見ていきましょう。

ログイン

通常、ユーザがGNU/Linuxを使うには、まずログインするところから始まります。アカウント名とパスワードを入力します。KNOPPIXなどは自動的にログインした状態から始まりますが、このような自動的にログインしているのは例外的です。通常はディストリビューションのインストールの設定の時にインストーラが最低ひとつはユーザアカウントの作成を尋ねてくるので、その指示に従い入力すると自動的に作成されます。

新たなユーザアカウントを加える場合

さらにユーザが必要な場合、adduserコマンド [3] を使うと新しいユーザを加えることができます。新しいユーザを加えるにはroot権限を使う必要があります。ここではログインすることなく、sudoを使いコマンドをroot権限で実行します。adduserコマンドを使いユーザのアカウントを造り、パスワードを設定し、ホームディレクトリを作成します。アカウント下はhironobuというアカウントを作る例です。

 $ sudo adduser hironobu
 [sudo] password for foo:
 Adding user hironobu...
 Adding new group hironobu (1001).
 Adding new user hironobu (1001) with group hironobu.
 Creating home directory /home/hironobu.
 Copying files from /etc/skel
 Enter new UNIX password: 
 Retype new UNIX password: 
 passwd: password updated successfully
 Changing the user information for hironobu
 Enter the new value, or press return for the default
        Full Name []: Hironobu SUZUKI
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
 Is the information correct? [y/n] y
 # 


ログインすれば、あとは何かプログラムを起動すると、ログインしたユーザの権限でプログラムが動き始めます。ユーザの持っているユーザIDやグループID が動作時の権限となり、その情報によりファイルへのアクセス等が制限されます。

補足
通常はインストール時に1つ以上のユーザアカウントを作成します。

コマンドを動かす

シェルでコマンドを動かす時は、端末上でシェルプロンプトが出ている状態でコマンドを入力します。ルートディレクトリ (ファイルシステムの始まりである"/" ディレクトリを特にルートディレクトリと呼びます ) にどんなファイルやディレクトリがあるかlsコマンドを使って見てみましょう。-Fオプションはファイルの種類を表示するオプションで、表示されている名前の後ろに/があればディレクトリ、@はシンボリックリンク、*は実行ファイル、なければ普通のファイルです。

 % ls -F /
 bin/   cdrom/  etc/     home/    lib/         mnt/  proc/  sbin/  usr/
 boot/  dev/    floppy/  initrd/  lost+found/  opt/  root/  tmp/   var/

短く説明すると、この表示されている範囲では/bin、/sbinが、あと/usr/bin、/usr/sbinにコマンドが入っています。binは通常使うコマンド、sbinはシステム管理に使うコマンドが入っています。/varはログデータファイルや一時的に保管しているデータファイルを集めているディレクトリです。/devはデバイスファイルが入っているディレクトリです。/procは実際のファイルが入っているわけはなく、カーネルなどの情報をファイルの形で見せているインタフェースです。

 % pwd 
 /home/hironobu

pwdは自分がどこのディレクトリにいるか表示するコマンドです。

 % mkdir desk
 % cd desk

mkdir はディレクトリを作るコマンドで、今"desk"という名前のディレクトリを作りました。cdは現在いるディレクトリであるカレントディレクトリを移動するコマンドです。もう一度pwdをしてみるとわかります。

 % pwd 
 /home/hironobu/desk

自分の現在使っている環境より派生しているプロセスをpsコマンドを使って表示させてみましょう。今のシェルを含めて表示されます。

 $ ps
  PID TTY          TIME CMD
  516 pts/1    00:00:00 bash
  937 pts/1    00:00:00 ps

PIDはプロセスID、TTYはターミナル名、TIMEは今までにプロセスが消費したCPU時間、CMDはコマンド名です。では、今、このコンピュータ上で動いているプロセスは全部でいくつあるでしょうか。-Aオプションを使うと、すべてのプロセスが表示されます。

$ ps -A 

端末を流れていった行まで戻って数えるのは大変そうです。1行に1プロセスが表示されているのでwcを使ってカウントすれば簡単に数えることができます。パイプ | を使いpsの出力をwcの入力にしてしまいます。行数だけ数えて表示させるにはwcの-lオプションを使います。

 $ ps -A | wc -l
    46
補足
自分自身のプロセスつまりps -Aのプロセスとwc -lのプロセスをカウントいることを注意してください。

今度は、どんなプロセスがあるのか見てみます。画面を一定量スクロールさせるコマンドmoreを使います。moreで止まっている画面を先に進める時はスペースを入力します。

 $ ps -A | more 

このパイプで送るというのはUNIXが生み出したアイデアです。ps はプロセスを表示するという機能moreやwcは表示のみ、入力された文字数、単語数、行数を数えるのみの、いわば専門の機能を提供するツールです。psにプロセス数を数える機能や、画面で表示した時に画面のサイズに合わせて一旦停止するといった機能をくわえるという発想も可能でしょう。しかし、そうするとpsのプログラムサイズがどんどん大きくなっていきます。またmoreやwcの機能は別にpsに限らず、他のツールでも同様に必要になります。ならばmoreやwcを独立して作 り、他のツールでも組み合わせれるように共通化してしまえば、システム全体としてみた場合、必要となるソフトウェアのコード数は少なくなります。これがUNIX的な発想です。この背景はソフトウェア工学的な機能分割によるツールの再利用性向上と組合せによるソフトウェア生産性の向上という意識があります。


ファイルを参照する

UNIXでは単純にファイルの中身を見てみるといっても、ツールが色々ある分、色々なアプローチがあります。


$ cat /etc/passwd


catの引数にファイル名を与えると、ファイルを読み込み標準出力へ出力するという動作をします。よってファイルの中身を表示することができます。先程使ったmoreを使っても良いでしょう。他にはどんな方法がありますか?入力が/etc/passwdファイル、出力が標準出力、そして内容を変更しないという条件がそろえばcatと同じことができるはずです。


$ sed -e 's/.*/&/' /etc/passwd 


sedコマンドは文字列を与えたルールに従って置き換えを行うツールです。こ こで与えた置き換えルールは「すべての文字パターンに一致することとし、そ の一致したパターンを一致したパターンに置き換えよ」ということをしていま す。ですから、/etc/passwdと同じ内容が出力されるはずです。本当でしょうか?この標準出力をファイルへセーブして、処理前、処理後の内容を比較て みましょう。


$ sed -e 's/.*/&/' /etc/passwd  > /tmp/i


標準出力をファイルに格納するにはコマンドの後に">"をつけます。この機能 のことをリダイレクションといいます。入力も同じように"<"を使うとファイ ルが標準入力へリダイレクションされます。ファイルではなく"<"を使い標準 入力から読み込むようにすることもできます。


$ sed -e 's/.*/&/' < /etc/passwd  > /tmp/i


これで/tmp/iに出力がセーブされました。今度は差分を探してみます。それに はdiffコマンドを使います。


$ diff /etc/passwd /tmp/i


何も出力されません。これは差分がないので何も出力されないのです。うまく いっているようです。


調べてみよう
他にファイルの中身を表示させる方法には、どんな方法があるだろうか。少なくともあと2つは考えてみよう。


グラフィカルインタフェース

GnomeやKDEといったGUIシステムをGNU/Linuxは用意しています。 今やGNU/LinuxのGUI環境はMacOSやWindowsといった身近なパソコン環境にひけをとりません。 GNU/Linuxの用意している3D GUI環境BerylなどはWindows Vista Aero の機能以上にギミックな機能を兼ね備えています。

補足
たぶん出回っているGnomeやKDEのスキンの数はMacOSやWindows Vistaよりも多いと思います。自分の好きなようにカスタマイズして使うのがGnomeやKDEユーザの特徴のように感じます。


UNIX系のウインドウシステムの主流はX Window System (以下Xと呼びます)です。Xは画面の描写のためのサーバと、 そこと通信を行うためのライブラリ群です。GnomeやKDE やxface4などは、その上に作られたユーザインタフェース環境を統一的に提供するフレーム ワーク環境です。これらはシステム的に競合関係にあり、同時にどちらも使うことはできません。


1980年代UNIX上では、数多くのウインドウシステムが作られ、そして淘汰されていきました。 米SUN社は独自のウインドウシステムであるSunViewやNeWS を持っていましたし、日本で作られたGMWなどもありました。 それらの中で今日まで生き残ったのがXです。


Xはネットワーク経由でウィンドウシステムを使うためのインフラと開発環境を提供するためのプロジェクトでした。初期の頃は統一的かつ包括的なユーザ環境を提供するという目標はありませんでした。後にMotifやCDEといったフレームワーク(当時はWidget Toolkitと呼んでいた)が出現してきました。MotifやCDEは商用のソフトウェアです。ところが機能的にあまり発展することなく徐々に使われなくなっていきます。一時期はGUI環境がUNIXの弱点だともいわれていました。後に、オープンソースでGnomeやKDEが開発され、広がり、熟成されるに至ります。商用UNIXが提供するよりもはるかに完成度が高く、技術的も高度な、さらに、今風のGUI環境はオープンソースとして提供されて初めて発展することが出来たのです。


Xはその開発当初の目的から、ネットワーク透過的な、つまりネットワークで接続されているコンピュータを意識させないウインドウシステムを作ること でした。ですから、一台のコンピュータ上で完結しているような単純なウインドウシステムよりは複雑です。またネットワーク透過を前提としているので、 ハードウェアコントロールとウィンドウシステムとの連係が弱い面があります。しかしこれらの課題はCPU/GPUの高速化、あるいはツール・ライブラリ類の充実化である程度は差が縮まっています。


たぶん一番の弱点はデバイスドライバのサポートです。高価なグラフィックボードのデバイスドライバは主にメーカーから供給されるため、GNU/Linuxへの提供は後手後手に回ります。その意味においては「最新のグラフィックボード」は使えないでしょう。しかし、それ以外に関しては今日のGNU/LinuxのGUI環境はなんら引けを取らないといえるでしょう。

脚注

  1. What is Android? http://code.google.com/android/what-is-android.html
  2. http://www.top500.org/stats/list/31/os もちろん80%弱という数字にはSuseやRedhatもGNU/Linuxとしてカウントされている。
  3. KDEやGnome環境でもGUIを使ったツールは用意されていますが、ここではすべての環境に共通な基本的コマンドを使っての説明を行います。

目次