「システム環境を考えてみる」の版間の差分

提供: UnixClassWiki
移動先: 案内検索
(環境を考えてみる)
(新たなユーザアカウントを加える場合)
 
(同じ利用者による、間の84版が非表示)
1行目: 1行目:
 
===  環境を考えてみる ===
 
===  環境を考えてみる ===
  
もしubuntu、Fedora、 KNOPPIX、あるいはVine Linuxのようなデスクトップ向けGNU/Linuxを使っているのでしたら、使い勝手はいわゆるパソコンと変わらないでしょう。Webブラウザ、ワードプロセッサ、プレゼンテーション、あるいはメールを出すにしてもWindows XPやMacOS Xの上で提供されているのと同じようなアプリケーションスイート[http://www.openoffice.org/ OpenOffice]があります。
+
[[image:Desktop_knoppix.png||thumb|360px|Knoppix Desktop]]
[[image:Desktop_knoppix.png||thumb|280px|Knoppix Desktop]]
+
  
  
[http://uc.h2np.net/index.php/%E7%AC%AC%E4%B8%80%E7%AB%A0#.E4.BD.95.E3.82.92.E3.81.95.E3.81.97.E3.81.A6.E3.82.AA.E3.83.9A.E3.83.AC.E3.83.BC.E3.83.86.E3.82.A3.E3.83.B3.E3.82.B0.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E3.81.A8.E5.91.BC.E3.81.B6.E3.81.AE.E3.81.8B 何をさしてオペレーティングシステムと呼ぶのか]」の所で説明した通り、カーネルと、その上にあるミドルウェア、そしてアプリケーションは独立した存在です。ミドルウェアにしてもアプリケーションにしてもソフトウェアは利用目的あるいは好みによって入れ換えることができます。たとえば多くのGNU/LinuxディストリビューションではGNOME、KDE、xfce、などを好みで入れ替えることができる選択肢が用意されています。
+
もし
 +
[http://www.ubuntu.com/ Ubuntu]、
 +
[https://getfedora.org/ Fedora]、
 +
[https://www.centos.org/ CentOS]、
 +
[https://www.debian.org/ Debian]
 +
あるいは
 +
[http://vinelinux.org/ Vine Linux]
 +
のようなデスクトップ向けGNU/Linuxを使っているのでしたら、使い勝手はいわゆるパソコンと変わらないでしょう。Webブラウザ、ワードプロセッサ、プレゼンテーション、あるいはメールを出すにしてもWindows XPやMacOS Xの上で提供されているのと同じようなアプリケーションスイート(Application suite ) [http://www.openoffice.org/ OpenOffice] / [http://www.libreoffice.org/ LibreOffice] があります。
  
  
「UNIXはキャラクタユーザインタフェース(CUI)である」と思い込んでいる人も世の中にはたくさんいます。UNIXが生まれた1960年代には、そもそも今日のようなGUI(グラフィックユーザインタフェース)などなかったわけですから、むかしはCUI しかなかったというのは当然です。今日のUNIXはCUIでもGUIでもありません。ユーザレベルでCUIかGUIのどちらのインタフェースを選ぶかはユーザ次第だからです。
+
「[[オペレーティングシステムとは何か]]」のページで説明した通り、カーネルと、その上にあるミドルウェア、そしてアプリケーションは独立した存在です。ミドルウェアにしてもアプリケーションにしてもソフトウェアは利用目的あるいは好みによって入れ換えることができます。たとえば多くのGNU/Linuxディストリビューションのデスクトップ環境を変更することができます。デスクトップ環境は、そのコンピュータの使い勝手と印象を決める重要なミドルウェアですが、それであっても
 +
[https://www.gnome.org/ GNOME]、
 +
[https://www.kde.org/ KDE]、
 +
[http://www.xfce.org/ xfce]
 +
などを好みで入れ替えることができる選択肢が用意されています。
  
  
過去においてはGUIとCUIの両方が用意されていてもCUIを選ぶユーザも多かったというのは事実です。なぜかというとGUIを使ってUNIXをきちんと走らせようとすると、高速で高価なハードウェアが必要だったからです。別の言い方をすると、GUIのために計算機の資源を割くといったことよりも、そのための資源を本来の計算すべきものに使っていたといえるでしょう。近年になりデスクトップパソコンレベルでもCPUの処理速度が劇的に速くなり、ハードディスクの容量も格段に大きくなり、大量のメモリを搭載したものが出回るようになって、やっとGUIを使うのが一般的になりました。今やGNU/Linux環境は他のパソコンとかわらないユーザインタフェースを提供しています。
+
「UNIXはキャラクタユーザインタフェース(CUI)である」と思い込んでいる人も世の中にはたくさんいます。UNIXが生まれた1960年代には、そもそも今日のようなGUI(グラフィックユーザインタフェース)などなかったわけですから、むかしはCUI しかなかったというのは当然です。今日のUNIXはCUIでもGUIでもありません。なぜならばユーザレベルでCUIかGUIのどちらのインタフェースを選ぶかはユーザ次第だからです。
  
  
もしエンドユーザとして使うだけであればユーザとしてパソコンを使うようにデスクトップ環境をコンシューマー向けに作っているLinuxのディストリビューションをPCハードウェアにインストールし初心者用解説書を読めばマックやウインドウズと同じようなパソコンとして使えます。2007年においては米国DELL社ではエンドユーザ向けにubuntuをインストールしたパソコンを販売しています。またASUS Eee PC(非日本版)では[http://www.xandros.com/ Xandros]というLinuxのディストリビューションを最初から搭載しています。
+
過去においてはGUIとCUIの両方が用意されていてもCUIを選ぶユーザも多かったというのは事実です。なぜかというとGUIを使ってUNIXをきちんと走らせようとすると、高速で高価なハードウェアが必要だったからです。
 +
別の言い方をすると、GUIのために計算機の資源を割くといったことよりも、そのための資源をたとえばコンパイルとか本来処理すべきものに使っていたといえるでしょう。
 +
近年になりデスクトップパソコンレベルでもCPUの処理速度が劇的に速くなり、ハードディスクの容量も格段に大きくなり、大量のメモリを搭載するようになり、性能の高いグラフィックチップを使うのが一般になり、[https://www.youtube.com/watch?v=PerCs2r8WIA  GUIを使うのがあたりまえ]の時代になりました。
  
=== 携帯からスーパーコンピューターまで ===
 
  
GNU/Linuxは、Googleが携帯電話用OSとして作ったAndroid
+
今やGNU/Linux環境は他のパソコンとかわらないグラフィカルなユーザインタフェース
 
<ref>
 
<ref>
What is Android? http://code.google.com/android/what-is-android.html
+
[http://www.compiz.org/ Compiz fusion] のように高性能グラフィックボードと前提としたOpenGLベースのGUIがもたらす視覚効果はさらにその先を進んでいます。
 
</ref>
 
</ref>
からIBM @server zSeries のようなメインフレームまで基本的には同じ構造のものが動いています。もちろん必要とされるミドルウェアやアプリケーション、カーネルのコンフィグレーションはPDAとメインフレームでは異なってくるのは当然ですが、やはりどちらもGNU/Linuxと呼ばれるものです。
+
を提供しています。既にエンドユーザ市場のために、いわゆるパソコンと呼ばれるコンシューマー向けデスクトップ環境を持つPCハードウェアのセット<ref>国内では2008年10月にDELL Dell™ Inspiron™ Mini 9ベーシックパッケージ(Ubuntu対応)が販売されています。ASUS Eee PCの海外版は[Xandros http://xandros.com]が搭載されています。 </ref>も存在しています。
 +
今日においては、MacやWindowsと同じような使い勝手のパソコンとして販売されるレベルになっています。
  
 +
=== スマートフォンからスーパーコンピューターまで ===
  
* [http://www-6.ibm.com/jp/servers/eserver/zseries/ IBM メインフレーム]
+
[[image:OSFamily2017Nov.png||thumb|300px|Top500のリストより (2017/11)]]
* [http://www.android.com/ Android]
+
* [http://www.top500.org/ 世界のスーパーコンピュータTop500]
+
  
 +
[[image:IDC-Smartphone-OS-share.png||thumb|300px|IDCのスマートフォンOS市場占有率の資料 (2017/5)]]
  
またGNU/Linuxはたくさんのコンピュータをつないたクラスターコンピュータとしても使われています。2008年において世界のスーパーコンピュータのTop500の中で最も使われているのはGNU/Linuxです。Operating System share for 06/2008 2008年6月版
+
Linuxカーネルは、GoogleがスマートフォンOSとして作ったAndroid
 
<ref>
 
<ref>
http://www.top500.org/stats/list/31/os
+
What is Android? http://code.google.com/android/what-is-android.html
もちろん80%弱という数字にはSuseやRedhatもGNU/Linuxとしてカウントされている。
+
 
</ref>
 
</ref>
においては80%弱がGNU/Linuxで占めていることが見て取れます。
+
<ref>
 +
[http://developer.apple.com/library/ios/#documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/IPhoneOSOverview/IPhoneOSOverview.html About iOS Development]
 +
</ref>
 +
から
 +
IBM @server zSeries
 +
<ref>Linux on z Systems empowers your developers  https://youtu.be/ZnP5OnpOxWI </ref>
 +
のようなメインフレームまで基本的には同じ構造のものが動いています。もちろん必要とされるミドルウェアやアプリケーション、カーネルのコンフィグレーションはスマートフォンとメインフレームでは異なってくるのは当然ですが、やはりどちらもLinuxと多くの[https://www.gnu.org/software/ GNUコマンドやライブラリ]から成り立っているのでGNU/Linuxと呼ばれるべきものです。またGNU/Linuxはたくさんのコンピュータをつないたクラスターコンピュータのシステムとしても使われています。
 +
Androidはスマートフォンのプラットホームとして常に81~87パーセント(2016-2017)のシェアを占めています。さらにUNIXとして考えるならiOSもUNIXとして分類出来ますから、2017年第1四半期ではスマートフォン市場の99.8パーセントがUNIXということになります。
 +
HPC分野(スーパーコンピュータ)では広く使われていたGNU/Linuxですが2017年11月期発表のTop500ではOperating System FamilyはLinuxのみになりました。
  
  
クラスターコンピュータとしての使われかたを考えてみましょう。数十台、数百台、数千台のマシンからなるクラスタシステムを想像してください。個々のシステムに対してディスクトップ環境などの環境は重要な要素ではありません。むしろ計算資源を圧迫する不必要な環境でしょう。
+
* [http://www.ibm.com/developerworks/linux/linux390/ IBM メインフレーム] / [https://www-03.ibm.com/systems/z/os/linux/ Linux OS on IBM z Systems]
 
+
* [http://www.android.com/ Android]
 
+
** スマートフォン・マーケットにおける[http://www.idc.com/prodserv/smartphone-os-market-share.jsp Androidのシェア](最新版)
何が必要か、何が不必要かは常にどのような環境で使われるかで違ってきます。狭い範囲でしか使うことしか想定していないようなオペレーティングシステムでは、ここまでの柔軟性は不必要でしょう。柔軟性を持たせると、いろいろな局面で使うことができて便利です。また、使う局面のみ考えて使えばいいので、そんなに難しいことでもありません。しかし、その全容をすべて理解しようとすると、PDA からスーパーコンピュータまで通用する基礎的な知識を一通り学習しなければいけないという世界に入り込んでしまいます。現在ではGNU/Linuxは汎用の計算システムだけではなく、携帯電話やハードディスクレコーダーなどにも組込みOSとして使われるようになってきました。これらも単一のカーネルツリーからコンパイルすることが可能です。そこが醍醐味の一つでもあるのですが、しかし、この当たりが"UNIX(GNU/Linux)は難しい"という部分につながっているのではないかと筆者は想像しています。
+
* [http://www.top500.org/ 世界の HPC Top500]
 
+
  
  
; 調べてみよう :  最新のSupercomputing Top500の中でGNU/Linuxベースなシステムは、どれぐらいのパーセンテージを占めているのであろうか。
+
GNU/Linuxの「何でもできる」というのは醍醐味の一つでもあるのですが、しかし、何でもできるといってもGNU/Linuxが搭載されたスーパーコンピュータを手に入れた初心者がスーパーコンピュータの計算能力をフルに発揮するような操作が出来るわけではありません。
 +
そしてまた、本当のGNU/Linuxの能力の全容を理解しようとすると、本質的にはスマートフォン からスーパーコンピュータまでのコンピューティングを知ることになります。
 +
手に入ることと、使いこなせることとを混同してしまうあたりが"UNIX(GNU/Linux)は難しい"という部分につながっているのではないかと筆者は想像しています。
 +
しかし最も大切なのはUNIX的な考え方(使うことではなく)を理解することではないでしょうか。
  
 
=== GNU/Linuxの何を学ぶべきなのか ===  
 
=== GNU/Linuxの何を学ぶべきなのか ===  
  
「GNU/Linuxでもワードプロセッサのアプリケーションが動きます」というレベルで満足であれば、この先を読み進める必要はありません。なぜならこの文章はGNU/LinuxやUNIXのHOWTOではないからです。アプリケーションレベルでのハウツー本が欲しいのであればインプレス社の「[http://dekiru.impress.co.jp/books/all/index.htm できるシリーズ]」などをお勧めします。このテキストをこれ以上読んでも正直、時間の無駄です。
+
「GNU/Linuxでもワードプロセッサのアプリケーションが動きます」というレベルで満足であれば、この先を読み進める必要はありません。このテキストではGNU/LinuxをベースにしてUNIX的な考え方を学ぶというのがテーマです。残念ながらGNU/LinuxやUNIXのHOWTOではありません。アプリケーションレベルでのハウツー本が欲しいのであれば
 +
[https://goo.gl/ik1LUf Amazonにたくさんの入門本が出ています]ので、自分にあった本を選んで、手元において読んだ方がいいでしょう。
  
  
; 補足 : ちなみに「できるシリーズ」はシリーズ累計3000万部を突破しています。
+
しかしコンピュータサイエンスの基本としてオペレーティングシステムを学ぶのであれば、我々は最初にUNIXが創造された時から脈脈と受け継がれるUNIX的なコンセプトを学ぶことが近道だと筆者は思います。最終的にそれが携帯電話に使われようが、メインフレームに使われようが、スーパーコンピュータで使われようが、学ぶための出発点は同じだからです。
  
  
しかしコンピュータサイエンスの基本としてオペレーティングシステムを学ぶのであれば、我々は最初にUNIXが創造された時から脈脈と受け継がれるUNIX的なコンセプトを学ぶことが近道だと筆者は思います。最終的にそれがPDAに使われようが、メインフレームに使われようが、スーパーコンピュータで使われようが、学ぶための出発点は同じだからです。さて、これからこの先、何を学ぶべきかのポイントをざっくりと書き出してみます。
+
これからこの先、何を学ぶべきかのポイントをざっくりと書き出してみます。
  
  
62行目: 84行目:
 
*  アクセス権限モデル
 
*  アクセス権限モデル
 
** 管理者であるrootと一般ユーザとの区別され一般ユーザは限られた範囲でしか権限を持たない
 
** 管理者であるrootと一般ユーザとの区別され一般ユーザは限られた範囲でしか権限を持たない
**  ユーザIDやグループIDの設定と利用について
+
**  ユーザID(uid)やグループID(gid)の設定と利用について
  
 
* 入出力の統一化
 
* 入出力の統一化
86行目: 108行目:
  
  
これらを実現するために内部がどうなっているのかをGNU/Linuxを取り上げて、さらに詳しく見ていきましょう。
+
本書(本サイト)では、以降の章でこれらの内容を取り上げていきますが、まずはGNU/Linuを触ってみましょう。
  
 
=== ログイン ===
 
=== ログイン ===
 
+
[[image:Ubuntu_804_16.png||thumb|300px|Ubuntu 8.04 ログイン画面]]
 
通常、ユーザがGNU/Linuxを使うには、まずログインするところから始まります。アカウント名とパスワードを入力します。KNOPPIXなどは自動的にログインした状態から始まりますが、このような自動的にログインしているのは例外的です。通常はディストリビューションのインストールの設定の時にインストーラが最低ひとつはユーザアカウントの作成を尋ねてくるので、その指示に従い入力すると自動的に作成されます。
 
通常、ユーザがGNU/Linuxを使うには、まずログインするところから始まります。アカウント名とパスワードを入力します。KNOPPIXなどは自動的にログインした状態から始まりますが、このような自動的にログインしているのは例外的です。通常はディストリビューションのインストールの設定の時にインストーラが最低ひとつはユーザアカウントの作成を尋ねてくるので、その指示に従い入力すると自動的に作成されます。
 +
  
 
==== 新たなユーザアカウントを加える場合 ====  
 
==== 新たなユーザアカウントを加える場合 ====  
  
さらにユーザが必要な場合、adduserコマンド
+
 
 +
最初はインストール時に設定したユーザ名だけですが、
 +
さらにユーザが必要な場合、 adduser コマンドや、あるいは GUI ツールを使って新しいユーザを加えることができます。
 +
 
 +
 
 +
[[image:Gnome-UserSetting.png|right|500px|Gnome ユーザ設定]]
 +
 
 +
 
 +
しかし、ここでは基本中の基本である adduser コマンドを使う場合を説明しましょう。
 
<ref>
 
<ref>
KDEやGnome環境でもGUIを使ったツールは用意されていますが、ここではすべての環境に共通な基本的コマンドを使っての説明を行います。
+
KDE や Gnome 環境でも GUI を使ったツールは用意されていますが、ここではすべての環境に共通な基本的コマンドを使っての説明を行います。
 
</ref>
 
</ref>
を使うと新しいユーザを加えることができます。新しいユーザを加えるにはroot権限を使う必要があります。ここではログインすることなく、sudoを使いコマンドをroot権限で実行します。adduserコマンドを使いユーザのアカウントを造り、パスワードを設定し、ホームディレクトリを作成します。アカウント下はhironobuというアカウントを作る例です。
+
新しいユーザを加えるには root 権限を使う必要があります。ここではログインすることなく、 '''sudo''' を使いコマンドを root 権限で実行します。
 +
adduser コマンドを使いユーザのアカウントを造り、パスワードを設定し、ホームディレクトリを作成します。アカウント下は hironobu というアカウントを作る例です。
 +
adduserもsudoもPOSIX定義のコマンドではありませんが
 +
<ref>
 +
POSIXで定義しているコマンドユーティリティは次のページで参照できます。
 +
http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
 +
</ref>、
 +
GNU/Linuxであればスーパーコンピュータであろうが、サーバであろうが、デスクトップであろうがこれらの基本コマンドは同じものが用意されています。
 +
 
 +
いま作った hironobu というアカウントよりログインするとユーザ hironobu の権限でプログラムが動きます。ユーザの持っているユーザIDやグループID がユーザ権限であり、その権限の範囲でファイルなどへのアクセスなどが出来ます。唯一 root 権限だけが(原則)すべてのファイルにアクセスできます。
 +
 
  
<PRE>
+
<pre class="bash">
 
  $ sudo adduser hironobu
 
  $ sudo adduser hironobu
 
  [sudo] password for foo:
 
  [sudo] password for foo:
119行目: 160行目:
 
         Other []:  
 
         Other []:  
 
  Is the information correct? [y/n] y
 
  Is the information correct? [y/n] y
#
+
</pre>
</PRE>
+
 
+
 
+
 
+
ログインすれば、あとは何かプログラムを起動すると、ログインしたユーザの権限でプログラムが動き始めます。ユーザの持っているユーザIDやグループID が動作時の権限となり、その情報によりファイルへのアクセス等が制限されます。
+
 
+
;補足: 通常はインストール時に1つ以上のユーザアカウントを作成します。
+
  
 
=== コマンドを動かす ===
 
=== コマンドを動かす ===
  
シェルでコマンドを動かす時は、端末上でシェルプロンプトが出ている状態でコマンドを入力します。ルートディレクトリ (ファイルシステムの始まりである"/" ディレクトリを特にルートディレクトリと呼びます ) にどんなファイルやディレクトリがあるかlsコマンドを使って見てみましょう。-Fオプションはファイルの種類を表示するオプションで、表示されている名前の後ろに/があればディレクトリ、@はシンボリックリンク、*は実行ファイル、なければ普通のファイルです。
+
シェルでコマンドを動かす時は、端末上でシェルプロンプトが出ている状態でコマンドを入力します。ルートディレクトリ (ファイルシステムの始まりである"/" ディレクトリを特にルートディレクトリと呼びます ) にどんなファイルやディレクトリがあるかlsコマンドを使って見てみましょう。-Fオプションはファイルの種類
 +
<ref>
 +
表示されている名前の後ろに/があればディレクトリ、@はシンボリックリンク、*は実行ファイル、なければ普通のファイルです。
 +
</ref>
 +
を表示するオプションです。
  
 +
 +
<pre class="bash">
 
   % ls -F /
 
   % ls -F /
 
   bin/  cdrom/  etc/    home/    lib/        mnt/  proc/  sbin/  usr/
 
   bin/  cdrom/  etc/    home/    lib/        mnt/  proc/  sbin/  usr/
 
   boot/  dev/    floppy/  initrd/  lost+found/  opt/  root/  tmp/  var/
 
   boot/  dev/    floppy/  initrd/  lost+found/  opt/  root/  tmp/  var/
 +
</pre>
  
短く説明すると、この表示されている範囲では/bin、/sbinが、あと/usr/bin、/usr/sbinにコマンドが入っています。binは通常使うコマンド、sbinはシステム管理に使うコマンドが入っています。/varはログデータファイルや一時的に保管しているデータファイルを集めているディレクトリです。/devはデバイスファイルが入っているディレクトリです。/procは実際のファイルが入っているわけはなく、カーネルなどの情報をファイルの形で見せているインタフェースです。
 
  
 +
短く説明すると、この表示されている範囲では/bin、/sbin が、あと /usr/bin、/usr/sbin にコマンドが入っています。binは通常使うコマンド、sbin はシステム管理に使うコマンドが入っています。/var はログデータファイルや一時的に保管しているデータファイルを集めているディレクトリです。/dev はデバイスファイルが入っているディレクトリです。/proc は実際のファイルが入っているわけはなく、カーネルなどの情報をファイルの形で見せているインタフェースです。
 +
 +
 +
<pre class="bash">
 
   % pwd  
 
   % pwd  
 
   /home/hironobu
 
   /home/hironobu
 +
</pre>
 +
 +
 +
pwd は自分がどこのディレクトリにいるか表示するコマンドです。
  
pwdは自分がどこのディレクトリにいるか表示するコマンドです。
 
  
 +
<pre class="bash">
 
   % mkdir desk
 
   % mkdir desk
 
   % cd desk
 
   % cd desk
 +
</pre>
  
mkdir はディレクトリを作るコマンドで、今"desk"という名前のディレクトリを作りました。cdは現在いるディレクトリであるカレントディレクトリを移動するコマンドです。もう一度pwdをしてみるとわかります。
 
  
 +
mkdir はディレクトリを作るコマンドで、今"desk"という名前のディレクトリを作りました。cd は現在いるディレクトリであるカレントディレクトリを移動するコマンドです。もう一度pwdをしてみるとわかります。
 +
 +
 +
<pre class="bash">
 
   % pwd  
 
   % pwd  
 
   /home/hironobu/desk
 
   /home/hironobu/desk
 +
</pre>
 +
  
 
自分の現在使っている環境より派生しているプロセスをpsコマンドを使って表示させてみましょう。今のシェルを含めて表示されます。
 
自分の現在使っている環境より派生しているプロセスをpsコマンドを使って表示させてみましょう。今のシェルを含めて表示されます。
  
 +
 +
<pre class="bash">
 
   $ ps
 
   $ ps
 
   PID TTY          TIME CMD
 
   PID TTY          TIME CMD
 
   516 pts/1    00:00:00 bash
 
   516 pts/1    00:00:00 bash
 
   937 pts/1    00:00:00 ps
 
   937 pts/1    00:00:00 ps
 +
</pre>
 +
  
 
PIDはプロセスID、TTYはターミナル名、TIMEは今までにプロセスが消費したCPU時間、CMDはコマンド名です。では、今、このコンピュータ上で動いているプロセスは全部でいくつあるでしょうか。-Aオプションを使うと、すべてのプロセスが表示されます。
 
PIDはプロセスID、TTYはターミナル名、TIMEは今までにプロセスが消費したCPU時間、CMDはコマンド名です。では、今、このコンピュータ上で動いているプロセスは全部でいくつあるでしょうか。-Aオプションを使うと、すべてのプロセスが表示されます。
  
 +
 +
<pre class="bash">
 
  $ ps -A  
 
  $ ps -A  
 +
</pre>
 +
  
 
端末を流れていった行まで戻って数えるのは大変そうです。1行に1プロセスが表示されているのでwcを使ってカウントすれば簡単に数えることができます。パイプ | を使いpsの出力をwcの入力にしてしまいます。行数だけ数えて表示させるにはwcの-lオプションを使います。
 
端末を流れていった行まで戻って数えるのは大変そうです。1行に1プロセスが表示されているのでwcを使ってカウントすれば簡単に数えることができます。パイプ | を使いpsの出力をwcの入力にしてしまいます。行数だけ数えて表示させるにはwcの-lオプションを使います。
  
 +
 +
<pre class="bash">
 
   $ ps -A | wc -l
 
   $ ps -A | wc -l
 
     46
 
     46
 +
</pre>
 +
  
 
;補足: 自分自身のプロセスつまりps -Aのプロセスとwc -lのプロセスをカウントいることを注意してください。
 
;補足: 自分自身のプロセスつまりps -Aのプロセスとwc -lのプロセスをカウントいることを注意してください。
171行目: 237行目:
 
今度は、どんなプロセスがあるのか見てみます。画面を一定量スクロールさせるコマンドmoreを使います。moreで止まっている画面を先に進める時はスペースを入力します。
 
今度は、どんなプロセスがあるのか見てみます。画面を一定量スクロールさせるコマンドmoreを使います。moreで止まっている画面を先に進める時はスペースを入力します。
  
 +
 +
<pre class="bash">
 
   $ ps -A | more  
 
   $ ps -A | more  
 +
</pre>
  
このパイプで送るというのはUNIXが生み出したアイデアです。ps はプロセスを表示するという機能moreやwcは表示のみ、入力された文字数、単語数、行数を数えるのみの、いわば専門の機能を提供するツールです。psにプロセス数を数える機能や、画面で表示した時に画面のサイズに合わせて一旦停止するといった機能をくわえるという発想も可能でしょう。しかし、そうするとpsのプログラムサイズがどんどん大きくなっていきます。またmoreやwcの機能は別にpsに限らず、他のツールでも同様に必要になります。ならばmoreやwcを独立して作
 
り、他のツールでも組み合わせれるように共通化してしまえば、システム全体としてみた場合、必要となるソフトウェアのコード数は少なくなります。これがUNIX的な発想です。この背景はソフトウェア工学的な機能分割によるツールの再利用性向上と組合せによるソフトウェア生産性の向上という意識があります。
 
  
 +
一番最初に見出し行がついているのを忘れていました。先ほどのプロセス数は1つ多いことになります。それでは見出し行を出力しないにはどうしたら良いでしょうか?
 +
オンラインマニュアルでpsを見てみるとオプション "h" を使うことがわかりました。
 +
オプション "--no-headers" も同様に見出し行を出力しない時に使うこともわかりました。
 +
 +
 +
<pre class="bash">
 +
$ ps h -A | wc -l
 +
  45
 +
</pre>
 +
 +
 +
このパイプで送るというのはUNIXが生み出したアイデアです。ps はプロセスを表示するという機能moreやwcは表示のみ、入力された文字数、単語数、行数を数えるのみの、いわば専門の機能を提供するツールです。psにプロセス数を数える機能や、画面で表示した時に画面のサイズに合わせて一旦停止するといった機能をくわえるという発想も可能でしょう。しかし、そうするとpsのプログラムサイズがどんどん大きくなっていきます。またmoreやwcの機能は別にpsに限らず、他のツールでも同様に必要になります。ならばmoreやwcを独立して作
 +
り、他のツールでも組み合わせれるように共通化してしまえば、システム全体としてみた場合、さらにコンパクトになります。これがUNIX的な発想です。この背景はソフトウェア工学的な機能分割によるツールの再利用性向上と組合せによるソフトウェア生産性の向上という共通理解
 +
<ref>
 +
''ソフトウェア作法'' , Brian W.Kernighan (著), P.J.Plauger (著), 木村 泉 (翻訳),
 +
共立出版 (1981/05),
 +
ISBN 4320021428
 +
</ref>
 +
があります。
  
 
=== ファイルを参照する ===  
 
=== ファイルを参照する ===  
182行目: 268行目:
  
  
 +
<pre class="bash">
 
  $ cat /etc/passwd
 
  $ cat /etc/passwd
 +
</pre>
  
  
188行目: 276行目:
  
  
 +
<pre class="bash">
 
  $ sed -e 's/.*/&/' /etc/passwd  
 
  $ sed -e 's/.*/&/' /etc/passwd  
 +
</pre>
  
  
198行目: 288行目:
  
  
 +
<pre class="bash">
 
  $ sed -e 's/.*/&/' /etc/passwd  > /tmp/i
 
  $ sed -e 's/.*/&/' /etc/passwd  > /tmp/i
 +
</pre>
  
  
207行目: 299行目:
  
  
 +
<pre class="bash">
 
  $ sed -e 's/.*/&/' < /etc/passwd  > /tmp/i
 
  $ sed -e 's/.*/&/' < /etc/passwd  > /tmp/i
 +
</pre>
  
  
214行目: 308行目:
  
  
 +
<pre class="bash">
 
  $ diff /etc/passwd /tmp/i
 
  $ diff /etc/passwd /tmp/i
 +
</pre>
  
  
何も出力されません。これは差分がないので何も出力されないのです。うまく
+
何も出力されません。UNIXは寡黙を良しとする文化なので、これは差分がないときは何も出力されないのです。
いっているようです。
+
うまくいっているようです。あと diff の特徴として終了ステータスでも差分があったか否かがわかるようになっているコマンドです。
 +
次のように実行すると、0 (変更なし)、1(差分あり)、2(異常終了した)が表示されます。
  
  
;調べてみよう: 他にファイルの中身を表示させる方法には、どんな方法があるだろうか。少なくともあと2つは考えてみよう。
+
<pre class="bash">
 +
  $ diff foo bar > /dev/null ; echo $?
 +
</pre>
  
  
 +
;調べてみよう
 +
:他にファイルの中身を表示させる方法には、どんな方法があるだろうか。少なくともあと2つは考えてみよう。
  
=== グラフィカルインタフェース ===
+
=== グラフィカルなデスクトップ環境 ===
  
GnomeやKDEといったGUIシステムをGNU/Linuxは用意しています。
+
GnomeやKDEといったグラフィカルなデスクトップ環境をGNU/Linuxは用意しています。
 
今やGNU/LinuxのGUI環境はMacOSやWindowsといった身近なパソコン環境にひけをとりません。
 
今やGNU/LinuxのGUI環境はMacOSやWindowsといった身近なパソコン環境にひけをとりません。
GNU/Linuxの用意している3D GUI環境BerylなどはWindows Vista Aero の機能以上にギミックな機能を兼ね備えています。
+
GNU/Linuxの用意している3Dグラフィック環境 compiz fusionなどは視覚的なギミック(あまり意味はないが、派手に見せて驚かせる)な機能を兼ね備えています。
 +
意味があるかどうかは別としてGUI環境をカスタマイズしてMac OSのように見せることもやろうと思えばできます。
  
;補足: たぶん出回っているGnomeやKDEのスキンの数はMacOSやWindows Vistaよりも多いと思います。自分の好きなようにカスタマイズして使うのがGnomeやKDEユーザの特徴のように感じます。
 
  
  
UNIX系のウインドウシステムの主流はX Window System (以下Xと呼びます)です。Xは画面の描写のためのサーバと、
+
* Customize Ubuntu 18.04 : how to fully customize GNOME 3 | Make Ubuntu 18.04 look like Mac Os
そこと通信を行うためのライブラリ群です。GnomeやKDE やxface4などは、その上に作られたユーザインタフェース環境を統一的に提供するフレーム
+
ワーク環境です。これらはシステム的に競合関係にあり、同時にどちらも使うことはできません。
+
  
 +
<youtube>sfsKwzElxQg</youtube>
  
1980年代UNIX上では、数多くのウインドウシステムが作られ、そして淘汰されていきました。
 
米SUN社は独自のウインドウシステムであるSunViewやNeWS を持っていましたし、日本で作られたGMWなどもありました。
 
それらの中で今日まで生き残ったのがXです。
 
  
  
Xはネットワーク経由でウィンドウシステムを使うためのインフラと開発環境を提供するためのプロジェクトでした。初期の頃は統一的かつ包括的なユーザ環境を提供するという目標はありませんでした。後にMotifやCDEといったフレームワーク(当時はWidget Toolkitと呼んでいた)が出現してきました。MotifやCDEは商用のソフトウェアです。ところが機能的にあまり発展することなく徐々に使われなくなっていきます。一時期はGUI環境がUNIXの弱点だともいわれていました。後に、オープンソースでGnomeやKDEが開発され、広がり、熟成されるに至ります。商用UNIXが提供するよりもはるかに完成度が高く、技術的も高度な、さらに、今風のGUI環境はオープンソースとして提供されて初めて発展することが出来たのです。
 
  
  
 +
* Linux Mint 17.1 Cinnamon Edition - A Quick Look
  
Xはその開発当初の目的から、ネットワーク透過的な、つまりネットワークで接続されているコンピュータを意識させないウインドウシステムを作ること
+
<youtube>K6pmKJ_-nFQ</youtube>
でした。ですから、一台のコンピュータ上で完結しているような単純なウインドウシステムよりは複雑です。またネットワーク透過を前提としているので、
+
ハードウェアコントロールとウィンドウシステムとの連係が弱い面があります。しかしこれらの課題はCPU/GPUの高速化、あるいはツール・ライブラリ類の充実化である程度は差が縮まっています。
+
  
  
 +
* Linux Mint 17.2 Rafaela Cinnamon Edition - See What's New
 +
<youtube>BUrgsngJMVo</youtube>
  
たぶん一番の弱点はデバイスドライバのサポートです。高価なグラフィックボードのデバイスドライバは主にメーカーから供給されるため、GNU/Linuxへの提供は後手後手に回ります。その意味においては「最新のグラフィックボード」は使えないでしょう。しかし、それ以外に関しては今日のGNU/LinuxのGUI環境はなんら引けを取らないといえるでしょう。
+
 
 +
 
 +
UNIX系のウインドウシステムの主流はX Window System (以下Xと呼びます)です。Xは画面の描写のためのサーバと、
 +
そこと通信を行うためのライブラリ群です。尚、GnomeやKDE やxfce4などは、その上に作られたユーザインタフェース環境を統一的に提供するフレーム
 +
ワーク環境です。これらはシステム的に競合関係にあり、同時にどちらも使うことはできません。
 +
 
 +
[[画像:Kde desktop.png|thumb|280px|KDEのスクリーンショット]]
 +
[[画像:Ubuntu screen.jpg|thumb|280px|Gnome (ubuntu)のスクリーンショット]]
 +
 
 +
1980年代UNIX上では、数多くのウインドウシステムが作られ、そして淘汰されていきました。
 +
米SUN社は独自のウインドウシステムであるSunViewやNeWS を持っていましたし、日本で作られたGMW<ref>京都大学、オムロン、アステックが共同で開発</ref>などもありました。
 +
それらの中で今日まで生き残ったのが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の高速化、あるいはツール・ライブラリ類の充実化、実装技法の向上により他のウィンドウシステムと遜色のないものとなっています。
  
 
== 脚注 ==
 
== 脚注 ==
262行目: 382行目:
 
----
 
----
 
[[目次]]へ
 
[[目次]]へ
 +
 +
[[Category:UNIXオペレーティングシステム|3]]

2022年2月17日 (木) 05:18時点における最新版

環境を考えてみる

Knoppix Desktop


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


オペレーティングシステムとは何か」のページで説明した通り、カーネルと、その上にあるミドルウェア、そしてアプリケーションは独立した存在です。ミドルウェアにしてもアプリケーションにしてもソフトウェアは利用目的あるいは好みによって入れ換えることができます。たとえば多くのGNU/Linuxディストリビューションのデスクトップ環境を変更することができます。デスクトップ環境は、そのコンピュータの使い勝手と印象を決める重要なミドルウェアですが、それであっても GNOMEKDExfce などを好みで入れ替えることができる選択肢が用意されています。


「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と同じような使い勝手のパソコンとして販売されるレベルになっています。

スマートフォンからスーパーコンピューターまで

Top500のリストより (2017/11)
IDCのスマートフォンOS市場占有率の資料 (2017/5)

Linuxカーネルは、GoogleがスマートフォンOSとして作ったAndroid [3] [4] から IBM @server zSeries [5] のようなメインフレームまで基本的には同じ構造のものが動いています。もちろん必要とされるミドルウェアやアプリケーション、カーネルのコンフィグレーションはスマートフォンとメインフレームでは異なってくるのは当然ですが、やはりどちらもLinuxと多くのGNUコマンドやライブラリから成り立っているのでGNU/Linuxと呼ばれるべきものです。またGNU/Linuxはたくさんのコンピュータをつないたクラスターコンピュータのシステムとしても使われています。 Androidはスマートフォンのプラットホームとして常に81~87パーセント(2016-2017)のシェアを占めています。さらにUNIXとして考えるならiOSもUNIXとして分類出来ますから、2017年第1四半期ではスマートフォン市場の99.8パーセントがUNIXということになります。 HPC分野(スーパーコンピュータ)では広く使われていたGNU/Linuxですが2017年11月期発表のTop500ではOperating System FamilyはLinuxのみになりました。



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を触ってみましょう。

ログイン

Ubuntu 8.04 ログイン画面

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


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

最初はインストール時に設定したユーザ名だけですが、 さらにユーザが必要な場合、 adduser コマンドや、あるいは GUI ツールを使って新しいユーザを加えることができます。


Gnome ユーザ設定


しかし、ここでは基本中の基本である adduser コマンドを使う場合を説明しましょう。 [6] 新しいユーザを加えるには root 権限を使う必要があります。ここではログインすることなく、 sudo を使いコマンドを root 権限で実行します。 adduser コマンドを使いユーザのアカウントを造り、パスワードを設定し、ホームディレクトリを作成します。アカウント下は hironobu というアカウントを作る例です。 adduserもsudoもPOSIX定義のコマンドではありませんが [7]、 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オプションはファイルの種類 [8] を表示するオプションです。


  % 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的な発想です。この背景はソフトウェア工学的な機能分割によるツールの再利用性向上と組合せによるソフトウェア生産性の向上という共通理解 [9] があります。

ファイルを参照する

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などは視覚的なギミック(あまり意味はないが、派手に見せて驚かせる)な機能を兼ね備えています。 意味があるかどうかは別としてGUI環境をカスタマイズしてMac OSのように見せることもやろうと思えばできます。


  • Customize Ubuntu 18.04 : how to fully customize GNOME 3 | Make Ubuntu 18.04 look like Mac Os



  • Linux Mint 17.1 Cinnamon Edition - A Quick Look


  • Linux Mint 17.2 Rafaela Cinnamon Edition - See What's New


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

KDEのスクリーンショット
Gnome (ubuntu)のスクリーンショット

1980年代UNIX上では、数多くのウインドウシステムが作られ、そして淘汰されていきました。 米SUN社は独自のウインドウシステムであるSunViewやNeWS を持っていましたし、日本で作られたGMW[10]などもありました。 それらの中で今日まで生き残ったのが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の高速化、あるいはツール・ライブラリ類の充実化、実装技法の向上により他のウィンドウシステムと遜色のないものとなっています。

脚注

  1. Compiz fusion のように高性能グラフィックボードと前提としたOpenGLベースのGUIがもたらす視覚効果はさらにその先を進んでいます。
  2. 国内では2008年10月にDELL Dell™ Inspiron™ Mini 9ベーシックパッケージ(Ubuntu対応)が販売されています。ASUS Eee PCの海外版は[Xandros http://xandros.com]が搭載されています。
  3. What is Android? http://code.google.com/android/what-is-android.html
  4. About iOS Development
  5. Linux on z Systems empowers your developers https://youtu.be/ZnP5OnpOxWI
  6. KDE や Gnome 環境でも GUI を使ったツールは用意されていますが、ここではすべての環境に共通な基本的コマンドを使っての説明を行います。
  7. POSIXで定義しているコマンドユーティリティは次のページで参照できます。 http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
  8. 表示されている名前の後ろに/があればディレクトリ、@はシンボリックリンク、*は実行ファイル、なければ普通のファイルです。
  9. ソフトウェア作法 , Brian W.Kernighan (著), P.J.Plauger (著), 木村 泉 (翻訳), 共立出版 (1981/05), ISBN 4320021428
  10. 京都大学、オムロン、アステックが共同で開発

目次