システム環境を考えてみる
環境を考えてみる
もし
Ubuntu、
Fedora、
CentOS、
Debian
あるいは
Vine Linux
のようなデスクトップ向けGNU/Linuxを使っているのでしたら、使い勝手はいわゆるパソコンと変わらないでしょう。Webブラウザ、ワードプロセッサ、プレゼンテーション、あるいはメールを出すにしてもWindows XPやMacOS Xの上で提供されているのと同じようなアプリケーションスイート(Application suite ) OpenOffice / LibreOffice があります。
「オペレーティングシステムとは何か」のページで説明した通り、カーネルと、その上にあるミドルウェア、そしてアプリケーションは独立した存在です。ミドルウェアにしてもアプリケーションにしてもソフトウェアは利用目的あるいは好みによって入れ換えることができます。たとえば多くの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環境は他のパソコンとかわらないグラフィカルなユーザインタフェース
[1]
を提供しています。既にエンドユーザ市場のために、いわゆるパソコンと呼ばれるコンシューマー向けデスクトップ環境を持つPCハードウェアのセット[2]も存在しています。
今日においては、MacやWindowsと同じような使い勝手のパソコンとして販売されるレベルになっています。
スマートフォンからスーパーコンピューターまで
GNU/Linuxは、GoogleがスマートフォンOSとして作ったAndroid
[3]、
[4]
からIBM @server zSeries のようなメインフレームまで基本的には同じ構造のものが動いています。もちろん必要とされるミドルウェアやアプリケーション、カーネルのコンフィグレーションはスマートフォンとメインフレームでは異なってくるのは当然ですが、やはりどちらもGNU/Linuxと呼ばれるべきものです。またGNU/Linuxはたくさんのコンピュータをつないたクラスターコンピュータのシステムとしても使われています。
Androidはスマートフォンのプラットホームとして常に81~87パーセント(2016-2017)のシェアを占めています。さらにUNIXとして考えるならiOSもUNIXとして分類出来ますから、2017年第1四半期ではスマートフォン市場の99.8パーセントがUNIXということになります。
そして世界のスーパーコンピュータTop500 (2017年7月現在) の中で最も使われているのはGNU/LinuxでOperating System Familyの統計をみるとシェア99%を越え、他のUNIXを加えるとトップ500すべてがUNIXとなります。
- IBM メインフレーム
- Android
- スマートフォン・マーケットにおけるAndroidのシェア
- 世界のスーパーコンピュータTop500
GNU/Linuxの「何でもできる」というのは醍醐味の一つでもあるのですが、しかし、何でもできるといってもGNU/Linuxを手に入れた初心者がスーパーコンピュータを操れるわけもありません。
そしてまた、本当のGNU/Linuxの能力の全容を理解しようとすると、本質的にはスマートフォン からスーパーコンピュータまでのコンピューティングを知ることになります。
手に入ることと、使いこなせることとを混同してしまうあたりが"UNIX(GNU/Linux)は難しい"という部分につながっているのではないかと筆者は想像しています。
しかし最も大切なのはUNIX的な考え方(使うことではなく)を理解することではないでしょうか。
GNU/Linuxの何を学ぶべきなのか
「GNU/Linuxでもワードプロセッサのアプリケーションが動きます」というレベルで満足であれば、この先を読み進める必要はありません。このテキストではGNU/LinuxをベースにしてUNIX的な考え方を学ぶというのがテーマです。残念ながらGNU/LinuxやUNIXのHOWTOではありません。アプリケーションレベルでのハウツー本が欲しいのであれば Amazonにたくさん初心者向けの本が出ていますので、自分にあった本を選んで、手元において読んだ方がいいでしょう。
しかしコンピュータサイエンスの基本としてオペレーティングシステムを学ぶのであれば、我々は最初にUNIXが創造された時から脈脈と受け継がれるUNIX的なコンセプトを学ぶことが近道だと筆者は思います。最終的にそれが携帯電話に使われようが、メインフレームに使われようが、スーパーコンピュータで使われようが、学ぶための出発点は同じだからです。
これからこの先、何を学ぶべきかのポイントをざっくりと書き出してみます。
ざっくりリストアップしてみる
- アクセス権限モデル
- 管理者であるrootと一般ユーザとの区別され一般ユーザは限られた範囲でしか権限を持たない
- ユーザID(uid)やグループID(gid)の設定と利用について
- 入出力の統一化
- 入出力は標準入出力とファイルに統一されている
- ただしUNIXの長い歴史の中で不統一な所も出てきてはいる
- / から始まる階層化されたファイルの名前空間
- ディレクトリ中にファイルがあり、絶対パスや相対パスでファイルへアクセスしている
- プロセスの構成
- 親プロセスから子プロセス生成され、実行環境が継承される
- プロセス間での通信
- 記憶空間の共有について
- ファイルもメモリも同じようにアクセスする仕組み
- TCP/IPネットワーク機能について
- 最小の機能構成された豊富なツール
- 小さなツール群を組み合わせて柔軟に処理を行う
- ワークベンチ
- 作業を行うために豊富なツール群を用意している
本書(本サイト)では、以降の章でこれらの内容を取り上げていきますが、まずはGNU/Linuを触ってみましょう。
ログイン
通常、ユーザがGNU/Linuxを使うには、まずログインするところから始まります。アカウント名とパスワードを入力します。KNOPPIXなどは自動的にログインした状態から始まりますが、このような自動的にログインしているのは例外的です。通常はディストリビューションのインストールの設定の時にインストーラが最低ひとつはユーザアカウントの作成を尋ねてくるので、その指示に従い入力すると自動的に作成されます。
新たなユーザアカウントを加える場合
最初はインストール時に設定したユーザ名だけですが、
さらにユーザが必要な場合、 adduser コマンドや、あるいは GUI ツールを使って新しいユーザを加えることができます。
しかし、ここでは基本中の基本である adduser コマンドを使う場合を説明しましょう。
[5]
新しいユーザを加えるには root 権限を使う必要があります。ここではログインすることなく、 sudo を使いコマンドを root 権限で実行します。
adduser コマンドを使いユーザのアカウントを造り、パスワードを設定し、ホームディレクトリを作成します。アカウント下は hironobu というアカウントを作る例です。
adduserもsudoもPOSIX定義のコマンドではありませんが
[6]、
GNU/Linuxであればスーパーコンピュータであろうが、サーバであろうが、デスクトップであろうがこれらの基本コマンドは同じものが用意されています。
いま作った hironobu というアカウントよりログインするとユーザ hironobu の権限でプログラムが動きます。ユーザの持っているユーザIDやグループID がユーザ権限であり、その権限の範囲でファイルなどへのアクセスなどが出来ます。唯一 root 権限だけが(原則)すべてのファイルにアクセスできます。
$ 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
コマンドを動かす
シェルでコマンドを動かす時は、端末上でシェルプロンプトが出ている状態でコマンドを入力します。ルートディレクトリ (ファイルシステムの始まりである"/" ディレクトリを特にルートディレクトリと呼びます ) にどんなファイルやディレクトリがあるかlsコマンドを使って見てみましょう。-Fオプションはファイルの種類 [7] を表示するオプションです。
% 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
一番最初に見出し行がついているのを忘れていました。先ほどのプロセス数は1つ多いことになります。それでは見出し行を出力しないにはどうしたら良いでしょうか?
オンラインマニュアルでpsを見てみるとオプション "h" を使うことがわかりました。
オプション "--no-headers" も同様に見出し行を出力しない時に使うこともわかりました。
$ ps h -A | wc -l 45
このパイプで送るというのはUNIXが生み出したアイデアです。ps はプロセスを表示するという機能moreやwcは表示のみ、入力された文字数、単語数、行数を数えるのみの、いわば専門の機能を提供するツールです。psにプロセス数を数える機能や、画面で表示した時に画面のサイズに合わせて一旦停止するといった機能をくわえるという発想も可能でしょう。しかし、そうするとpsのプログラムサイズがどんどん大きくなっていきます。またmoreやwcの機能は別にpsに限らず、他のツールでも同様に必要になります。ならばmoreやwcを独立して作
り、他のツールでも組み合わせれるように共通化してしまえば、システム全体としてみた場合、さらにコンパクトになります。これがUNIX的な発想です。この背景はソフトウェア工学的な機能分割によるツールの再利用性向上と組合せによるソフトウェア生産性の向上という共通理解
[8]
があります。
ファイルを参照する
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
何も出力されません。UNIXは寡黙を良しとする文化なので、これは差分がないときは何も出力されないのです。
うまくいっているようです。あと diff の特徴として終了ステータスでも差分があったか否かがわかるようになっているコマンドです。
次のように実行すると、0 (変更なし)、1(差分あり)、2(異常終了した)が表示されます。
$ diff foo bar > /dev/null ; echo $?
- 調べてみよう
- 他にファイルの中身を表示させる方法には、どんな方法があるだろうか。少なくともあと2つは考えてみよう。
グラフィカルなデスクトップ環境
GnomeやKDEといったグラフィカルなデスクトップ環境をGNU/Linuxは用意しています。 今やGNU/LinuxのGUI環境はMacOSやWindowsといった身近なパソコン環境にひけをとりません。 GNU/Linuxの用意している3Dグラフィック環境 compiz fusionなどは視覚的なギミック(あまり意味はないが、派手に見せて驚かせる)な機能を兼ね備えています。
- Ubuntu 9.10 3D Desktop
<youtube>lYgWE6Svpag</youtube>
- Linux Mint 17.1 Cinnamon Edition - A Quick Look
<youtube>K6pmKJ_-nFQ</youtube>
- Linux Mint 17.2 Rafaela Cinnamon Edition - See What's New
<youtube>BUrgsngJMVo</youtube>
UNIX系のウインドウシステムの主流はX Window System (以下Xと呼びます)です。Xは画面の描写のためのサーバと、 そこと通信を行うためのライブラリ群です。尚、GnomeやKDE やxfce4などは、その上に作られたユーザインタフェース環境を統一的に提供するフレーム ワーク環境です。これらはシステム的に競合関係にあり、同時にどちらも使うことはできません。
1980年代UNIX上では、数多くのウインドウシステムが作られ、そして淘汰されていきました。 米SUN社は独自のウインドウシステムであるSunViewやNeWS を持っていましたし、日本で作られたGMW[9]などもありました。 それらの中で今日まで生き残ったのがMITのProject Athenaで作られたX Window Systemです。
Project Athenaはネットワーク経由でシステムを使うためのインフラと開発環境を提供するためのプロジェクトでした。
透過的ウィンドウシステムであるX Window Systemは、その中の1つのプロジェクトでした。
初期の頃は統一的かつ包括的なユーザ環境を提供するという能力はありませんでした。後にMotifやCDEといったフレームワーク(初期は Widget Toolkit と呼んでいた)が出現してきました。MotifやCDEは商用のソフトウェアです。ところが機能的にあまり発展することなく徐々に使われなくなっていきます。一時期はGUI環境がUNIXの弱点だともいわれていました。後に、オープンソースでGnomeやKDEが開発され、広がり、熟成されるに至ります。商用UNIXが提供するよりもはるかに完成度が高く、技術的も高度な、さらに、今風のGUI環境はオープンソースとして提供されて初めて発展することが出来たのです。
Xはその開発当初の目的から、ネットワーク透過的な、つまりネットワークで接続されているコンピュータを意識させないウインドウシステムを作ること
でした。ですから、一台のコンピュータ上で完結しているような単純なウインドウシステムよりプロトコルは複雑です。
またネットワーク透過を前提としているので、
ハードウェアコントロールとウィンドウシステムと独立している設計のため特別にハードウェアを意識するようなプロトコルではありません。
しかし今日においては、これらの課題はCPU/GPUの高速化、あるいはツール・ライブラリ類の充実化、実装技法の向上により他のウィンドウシステムと遜色のないものとなっています。
脚注
- ↑ Compiz fusion のように高性能グラフィックボードと前提としたOpenGLベースのGUIがもたらす視覚効果はさらにその先を進んでいます。
- ↑ 国内では2008年10月にDELL Dell™ Inspiron™ Mini 9ベーシックパッケージ(Ubuntu対応)が販売されています。ASUS Eee PCの海外版は[Xandros http://xandros.com]が搭載されています。
- ↑ What is Android? http://code.google.com/android/what-is-android.html
- ↑ About iOS Development
- ↑ KDE や Gnome 環境でも GUI を使ったツールは用意されていますが、ここではすべての環境に共通な基本的コマンドを使っての説明を行います。
- ↑ POSIXで定義しているコマンドユーティリティは次のページで参照できます。 http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
- ↑ 表示されている名前の後ろに/があればディレクトリ、@はシンボリックリンク、*は実行ファイル、なければ普通のファイルです。
- ↑ ソフトウェア作法 , Brian W.Kernighan (著), P.J.Plauger (著), 木村 泉 (翻訳), 共立出版 (1981/05), ISBN 4320021428
- ↑ 京都大学、オムロン、アステックが共同で開発
目次へ