1999/7/8
UNIXは、コンピュータを動かす基本的なソフトウエアであるオペレーティングシステムの1つです。かなり古くから開発はされていたのですが、特定の企業が開発しているのではなく、研究者や多くの企業が結果的に協調して開発を進めることで、現在にまで至っています。機能的な特徴はこれから解説します。UNIXがここまで広がった理由はもちろん、しっかりした機能を持っていることがありますが、それ以上に基本部分がフリー、つまり無料で配布されているというところがあります。そのような形態を「オープン」と表現することもあります。
そんなことをしたら商売にならないのではないかと心配するかもしれませんが、そのフリーの素材を利用して、特定のコンピュータで動く形式にしたものは商品にすることができます。そのような形態を「ディストリビューション」と呼びます。また、ソフトをインストールしただけでは仕事の役には立ちません。仕事で使えるように、アプリケーションソフトを作ったり、あるいはメンテナンスなどの管理の仕事も発生します。また、誰もがフリーの素材でUNIXを動かせるようになるわけではなく、そのためにはかなりの知識と労力が発生します。かくして、協同あるいは研究者によって作られた部分をフリーにして権利関係の難しさは排除され、その素材を利用して自由に商品化できるというところがUNIXを成長させたといえるのです。
現在、商品としては、Sun MicrosystemsのSolarisやMac OS X Server、UnixWareなどの製品があります。フリーのUNIXとしては、Linux、FreeBSDが有名です。これらは、UNIXとひとくくりにされますが、その中で個別の製品がいろいろあるということです。共通点も多いですが相違点もあり、注意が必要です。特に、あるUNIXで動いているソフトウエアが別のUNIXで動くとは限らないのが一般的です。UNIXは利用するCPU自体がすでに製品によっていろいろ異なっているということがあります。特定のCPU向けに構築されたソフトウエアは、異なるCPUでは機能しません。そのため、ソフトウエアは実行可能な形式ではなく、むしろ、ソフトウエアのもとになるソースプログラムという形態で配布されることがよく行われています。
UNIX OSの1つの重要な仕事は、ファイルの管理です。ハードディスクなどに、ファイルという単位で、データやソフトウエア事態を保管し、管理するようになっています。
OSの最重要な仕事は、なんと言ってもソフトウエアを実行させることです。アプリケーションソフトの実行も可能ですが、UNIXでの特徴的なソフトウエアとして「デーモン」というものがあります。デーモンは一般的には背後で動いているプログラムで、何らかの要求が発生したときに背後で処理をこなしてしまうという形態です。
こうしたソフトウエアは「プロセス」「タスク」などと呼ばれます。これらは厳密には区別されますが、1つのソフトウエアが実行している状態のことをプロセスやタスクと呼ぶと考えればよいでしょう。UNIXはプロセスを複数同時に軌道いすることができます。さらに、こうして起動したプロセスを、OS主導によるスケジューリングを行い、細かい時間ごとに分割してプロセスを実行します。結果的に複数のプロセスが同時に動いているかのようなマルチプロセスが可能になっています。つまり、特定のプロセスの処理が時間がかかって足を引っ張るということはないわけです。長い時間かかる処理をしながら、別のプロセスも並行して機能するというわけです。
マルチユーザーは文字とおりの意味、つまり、複数のユーザーが使えるということです。この場合、複数のユーザーが、特定のコンピュータあるいは別のところにあるコンピュータを通じて、同時に1台のコンピュータを利用するとういことです。1台のハードディスクを利用できるのはもちろん、それぞれのユーザーごとにソフトウエアを利用でき、どのユーザーがどのソフトウエアプロセスを実行しているかという管理もOSで行います。このように、1台のパソコンの中で、ソフトウエアの実行や、各種機器などのリソースを、複数のユーザーが同時に利用しても問題のないように機能するというのが、マルチユーザーということです。
UNIXで使われるファイルは、Windowsと同様にファイル名をつけ、そのファイルで識別されるようになっています。ファイル名は、255バイトまでの数字や文字、記号です。機能的にはすべての記号はOKなのですが、記号の多くは特別な意味をもたせてあり、ファイル名として直接指定することはできません。やや大雑把な結論ですが、
と理解しておいてもらえばよいでしょう。
注意してほしいことは、UNIXでは、大文字と小文字は区別します。Windowsでは区別しなかったので、大文字や小文字の扱いがいいかげんになっているかもしれませんが、UNIXでは厳然と区別します。「Index.html」と「index.html」は別のファイルだと認識するので、同時に存在することができます。
ハードディスクなどにファイルとしてデータが保存されますが、単にだらだらと並んでいるわけではありません。ファイルはディレクトリに分類して入れられます。ディレクトリは、Windowsでのファイルとまったく同じものです。
ディレクトリの中に、さらにディレクトリを作成することもできます。その結果、ディレクトリの構造を抜き出すと、おおもとの部分から始まって枝分かれして行くようになります。おおもとは、ルートと呼ばれます。
どこかのディレクトリに存在するファイルは、ルートからたどると、必ず行き着くことができます。ルートからどのフォルダをたどったかを記述するのがパスです。パスは、ルートからたどったディレクトリを順番に/で区切りながら記述します。ルートは単に「/」だけです。以下に、パスの記述の例をあげておきます。
それではUNIXではファイルを指定するとき、常にルートから始まるパス(フルパスとも言う)を必ず指定しなければならないのでしょうか。それだと、深い階層にあるファイルを指定するのはたくさんキータイプをしないといけないので大変です。そうではないファイルの指定方法が用意されています。それがある特定のディレクトリを基準にしたファイルの指定で、そのような形式を、相対パスなどと呼ばれています。
たとえば、/usr/local/bin/perlというファイルがあります。このファイルは、localというディレクトリを基準にすると、binディレクトリ内にあるperlというファイルです。その場合、「bin/perl」と記述すればいいことになっています。もし、usrが基準になっているのなら「local/bin/perl」です。binが基準なら、単に「perl」です。
一般に、スラッシュで始まるとフルパス、先頭がスラッシュではないときには相対パスになると理解しておいてかまいません。
さて、この基準となるディレクトリのことを「カレントディレクトリ」と呼びます。“現在のディレクトリ”と解釈すればいいでしょう。UNIXでは、あらゆる操作において、このカレントディレクトリを意識しなければなりません。カレントディレクトリは初期状態ではある設定にされますが、コマンドを与えることで移動することができます。
UNIXは複数のユーザーで同時に利用できました。そうすると、みんながあっちこっちにファイルを作って大変と思うかもしれませんが、そうはならない仕組みがいろいろ用意されています。基本的なポリシーは、ユーザーごとに利用できる場所を与える、つまり個室を与えるようなことを行い、異なるユーザーからの干渉を防ぐということを行っています。ある1人のユーザーに対して、特定のディレクトリを与えます。そのディレクトリを「ホームディレクトリ」と呼びます。あるユーザーでログインしたときには、カレントディレクトリはホームディレクトリになっています。
たとえば、/home/usersのようなディレクトリを作っておきます。ここの中に、各ユーザーのホームディレクトリを造ります。たとえば、msykというユーザー向けに/home/users/msykというディレクトリを作るという具合です。普通のユーザーは、このホームディレクトリ内では自由に読み書きはできるものの、その外側では読み込むことしかできないとか、一切何もできない(たとえばどんなファイルがあるかすら見れない)というふうになっています。ここで「外側」とは次のような意味を持っています。ディレクトリのツリー階層を思い浮かべてください。あるユーザーのホームディレクトリよりも下位のディレクトリ(枝分かれしたディレクトリ)は、この場合内側です。外側とは上位のディレクトリ、あるいは上位のディレクトリからたどったディレクトリを外側と呼びます。
あるユーザーが利用できて、別のユーザーが利用できないという設定は、一般にアクセス権と呼ばれています。UNIXでは、各ファイル各ディレクトリすべてに対して、個別にアクセス権が設定できるようになっています。つまり、アクセス権ということを常に意識をしてかからないといけないということがあります。
アクセス権には、次の3種類があります
それぞれ文字とおりの意味ですが、実行可能とは、ファイル自体をプログラムとして解釈して、実行することができるかどうかということを意味します。詳細は省略します。
また、ファイルにはファイル名以外の属性がいろいろとつけられますが、アクセス権関連の重要な設定として、以下の設定があります。
基本的は、ファイルの所有者はそのファイルを作ったユーザーが割り当てられています。グループとは、UNIXシステム全体で利用されるもので、ユーザーのグループです。つまり、ユーザーはグループ分けができるのです。これにより、複数のユーザーにまとめてアクセス権の設定ができます。
ここで、アクセス権は、所有者に対するもの、グループに対するもの、すべてのユーザーに適用されるものの3種類をファイルやディレクトリ単位で管理できます。つまり、以下の表の中身のような管理ができるというわけです。
所有者 | グループ | 全員 | |
読み込み | ○ | ○ | ○ |
書き込み | ○ | × | × |
実行可能 | ○ | × | × |
アクセス権のない処理はできません。あるファイルに対して、読み込みのアクセス権があり、書き込みはなかったとしましょう。すると、そのファイルを開いて中身を見ることができますが、書き換えることができないわけです。ディレクトリに対して読み込みのアクセス権をなしにすると、ディレクトリの中身すらみることができません。つまり、ディレクトリの中にどんなファイルがあるかすら見ることができないわけです。
UNIXサーバーではWebサーバーが1つのプロセス(複数のこともある)として実行されています。Webサーバーの基本的な機能は、特定のディレクトリおよびそれよりも下位のディレクトリをネットワークに対して公開するということです。そして、外から来たリクエストに対応して、指定されたファイルの内容をクライアントに送り出します。
たとえば、/usr/local/www/dataというディレクトリが公開されているとします。そのディレクトリにmypage.htmlというファイルがあるとします。つまり、/usr/local/www/data/mypage.htmlというファイルがあるということです。そうすると、
http://ドメイン名/mypage.html
というアドレスの記述で、そのmypage.htmlを開くことができます。ドメイン名は世界中のネットワークから特定のサーバーコンピュータを指定できる名前で、たとえば「www.slis.keio.ac.jp」です。
それでは、/usr/local/www/data/winter/poem.htmlというファイルがあったとします。つまり、Webサーバーが公開しているディレクトリ内のwinterというディレクトリにあるpoem.htmlというファイルです。これは、
http://ドメイン名/winter/poem.html
で開くことができます。つまり、ドメイン名以降に、相対パスを記述しているということに気づいてください。
ここではHTMLファイルを直接指定しました。Webサーバーは、ディレクトリだけを指定した場合、一般にはそのディレクトリ内にある、index.htmlというファイルを開きます。たとえば、/usr/local/www/data/index.htmlというファイルがあれば、
http://ドメイン名/
で開くことができますし、/usr/local/www/data/winter/index.htmlというファイルがあれば、
http://ドメイン名/winter/
で開くことができるという具合です。一般には、他に、index.htmも自動的に開かれるように設定されています。
Webサーバーは、UNIXのユーザーがそれぞれWebページを持つことができるような工夫がなされています。特定のディレクトリの公開だけだと、そのディレクトリ内にいちいちユーザーごとのディレクトリを作る必要が出てきますが、そういう仕組みは取っていません。次のような規則で動作します。以下のようなアドレスリクエストがWebサーバーに送り届けられたとします。
http://ドメイン名/~ユーザー名/
そうすると、Webサーバーは、指定したユーザーのホームディレクトリにある、public_html(一般的にはこれ)というディレクトリと同等であるとみなします。たとえば、http://ドメイン名/~msyk/は、そのコンピュータのmsykというユーザーのホームディレクトリにあるpublic_htmlディレクトリと同一であるとします。public_htmlに、music.htmlというHTMLファイルがあるとすると、http://ドメイン名/~msyk/music.htmlで参照することができるとうい具合です。もちろん、public_html内にindex.htmlというファイルがある場合には、http://ドメイン名/~msyk/で参照できます。
また、msykのホームにあるpublic_html内に、worksというディレクトリがあって、さらにその中にsongs.htmlというファイルがあれば、http://ドメイン名/~msyk/works/songs.htmlで参照できるという具合です。
このように、Webサーバーでは、個人個人のWebページを持つことができるような機能を持っていて、各自がホームディレクトリ内に決められた名前のディレクトリを作って、そこにファイルを入れるだけでいいというようになっているのです。
コンピュータ間でファイルをやりとりするプロトコルがFTPです。あるコンピュータにあるファイルを、別のコンピュータに送付するときなどに使います。
UNIXコンピュータの操作には、シェルというプログラムを媒介させます。UNIXのさまざまな機能を、人間が操作しやすくするためのソフトウエアだと考えればよいでしょう。そのシェルを使うことによって、キータイプしたコマンドをUNIXシステムが処理するようになります。
一般に使われているシェルは、テキスト形式のもので、テキストでコマンドなどを打ち込み、結果もテキストで返されます。そのテキストの表示や送り出しなどをできるようにするのがtelnetの1つの大きな目的です。telnetもプロトコルの1つですが、シェルはtelnetを経由してコマンドを受け付け、結果を戻すということができるようになっており、こうした使い方が一般的なのです。
なお、Windowsからtelnetで接続するには、telnet(そのまま)やTeraTermなどのアプリケーションを使います。FTPを使う場合、Windowsではftpというコマンドを使います。「ファイル名を指定して実行」でftpと入力してOKをクリックすると、MS-DOSの画面が出てきて、ftpのクライアントソフトが起動します。本来はこうしたコマンドを与えて結果も文字列で戻すtelnetを使ったときのような動作をします。ただし、これだと使いづらいということもあるので、WS_FTPなどのウインドウ形式のインタフェースを備えたFTPクライアントを使います。
UNIXシステムはアクセス権が設定でき、ユーザーはあまり自由が効かないようにしています。好き勝手にファイルを削除とかされると、多人数が使っているコンピュータだけに損害は大きいわけで、これは必要な措置です。
ただし、一部のユーザーはシステム内のほとんどファイルを書き換えたり削除できるなど、いわばアクセス権がほとんど適用されない状態で使うことができます。こうした状態でないと、システムの管理がやりにくいのです。こうした権利を行使できる人を「管理者」などと呼んでいます。
正確には、たいがいのUNIXシステムの場合、rootというユーザーが最初から登録されていて、このrootさんがあらゆることができるのです。しかしながら、一般にはrootでログインするのではなく、通常のユーザーでログインします。そして、「su」というコマンドを使って、rootと同等の権限にグレードアップしてさまざまな操作を行うのが一般的です。システム内の特定のユーザー(wheelグループに所属)がroot権限になることができます。さらに、suというコマンドを入れた後にパスワードを入力しないといけません。このパスワードはrootアカウントのパスワードです。つまり、特別に設定したユーザーであって、そのコンピュータ特有のパスワードを知っていないといけないので、通常のユーザーはroot権限にはまずなれないでしょう。
標準入力、標準出力:データの入力元や出力先を特定のものにせずに、一般的な「入力源」「出力先」があるとして作業する考え方。入力源には、キーボードやファイル,出力先には画面やファイル、プリンタなどがある。いろいろなデータのやり取りを柔軟に行うことを目指している。
パイプ、フィルタ:複数の処理を組み合わせる手法のこと。ある処理の結果を標準出力で得られるとすると、その結果を別の処理の標準入力に引渡すことができる。複数の処理をまとめて行うということに使われる。たとえば、何百行のテキストファイルを一気に画面に出しても読めないが、そのテキストファイルの出力結果を1画面ずつ分割して表示する別の処理と連続させることで、読みやすくなる。こういう場合に、パイプが使われる。
正規表現:ファイル名やファイルの中身の文字などに対し、特定のパターンに対して一致しているかどうかを判別する手法。一定した文字列だけでなく、0〜9の数字といった一定の範囲の文字や、行末や行頭という位置など、さまざまなパターンを認識できる。パターンの指定自体も文字列で行うが、記号を駆使するため、判読はけっこう難しい。また、パターンを作ることもそれなりに訓練がいる。
コマンドを与えることで、UNIXを操作できます。一般には、コマンドには引数として、さまざまな設定を付随させます。複数の引数を指定することもできます。引数やコマンドの区切りは、半角のスペースです。引数には、コマンドの動作を既定するものも指定できますが、一般には「-」とアルファベットや単語で指定し、これらを特別にオプションと呼びます。
なお、以下の例は最低限の説明になっており、完全な説明ではありません。
ディレクトリ関連のコマンドは以下のようなものがあります。
コマンド | 機能 |
pwd | 現在のカレントディレクトリを知る |
cd ディレクトリ | 指定したディレクトリにカレントディレクトリを移動する
|
mkdir ディレクトリ | 引数に指定したディレクトリを作成する
|
rmdir ディレクトリ | ディレクトリを削除する |
ファイル名一覧を得るコマンドは以下のとおりです。複数のオプションを指定することもできます。
コマンド | 機能 |
ls | カレントディレクトリのファイル名の一覧を得る |
ls -l | カレントディレクトリのファイル名の一覧を得るが、ファイルのアクセス権や所有者など、詳しい情報を表示する |
ls -a | すべてのファイルの一覧を得る。-aがない場合、ピリオドで始まるファイル(ドットファイル)は表示されない。これらのファイルは、一般に各種の設定を行うために使われる |
ls ディレクトリ | 指定したディレクトリのファイル一覧を表示する(引数はファイルの指定でもOK) |
以下はファイル名一覧の例です。これで見方を説明します。
-rw-r--r-- 1 msyk 782 Jun 17 17:29 index.html
-rw-r--r-- 1 msyk 17650 Jun 17 17:29 jcode.pl
-rwxr-xr-x 1 msyk 3994 Jun 17 17:37 kimeicho.cgi
drwxrwxrwx 2 msyk 1024 Jun 17 17:31 lock
-rw-rw-rw- 1 msyk 707 Jun 17 17:31 messages.tmp
-rw-rw-rw- 1 msyk 707 Jun 17 17:31 messages.txt
左から、アクセス権、リンク数、所有者、グループ、最終更新日時、ファイル名となっています。
アクセス権のいちばん左にdとあれば、それはディレクトリです。-とあればそれはファイルです。
アクセス権は続いて9つのセクションがありますが、前から順に3つずつに分割して、それぞれ所有者、グループ、全員に対するアクセス権を示しています。rは読み込み、wは書き込み、xは実行の権限を示しています。上記のindex.htmlというファイルは、所有者が読み書きできますが、グループあるいは全員に対しては読み込みしかできません。つまり、msykというユーザーしか修正ができないものの、読むことは誰でもできるという具合です。
ディレクトリ名やファイル名では、任意の文字に合致するワイルドカードが使えます。1文字に合致する?、複数の文字列に合致する*が使えます。たとえば、「ls ~/public_html/*.html」は、ホームディレクトリにあるpublic_htmlフォルダ内にある末尾が.htmlのファイルの一覧を表示します。
ファイルの中身を見るには、catコマンドを使います。引数に見たいファイルのファイル名をつけます。
さらに、「cat index.html|more」のように、縦棒に続けてmoreコマンドを使うと、ファイルの内容を1画面ずつ表示します。「パイプ」の典型的な利用例です。このとき、次の画面に移動するには、スペースを押します。Enterキーだと1行ずつ進みます。Ctrl+Cで表示をやめます。
ファイルの結合もcatコマンドを使います。結合したい順序にファイルを引数として順番に書き並べます。ただし、そのままだと結合した結果を画面に表示しておしまいなので、その結果をファイルに書き込みます。たとえば、「cat file1 file2 > file3」とすれば、file1とfile2を結合した結果を、file3に書き出します。
アクセス権などの設定では以下のコマンドがあります。
コマンド | 機能 |
chmod 権限 ファイル | 指定したファイルに指定した権限を設定する。 |
chown ユーザー ファイル | 指定したファイルの所有者を変更する |
chgrp グループ ファイル | 指定したファイルのグループを変更する |
権限の設定方法はいろいろありますが、代表的なのは3桁の数字を指定する方法です。上位の桁から順に、所有者、グループ、全員のアクセス権を示します。
そして、各桁は次のようになります。読み込みを許可なら4、書き込みを許可なら2、実行を許可なら1という数字を割り当てます。複数の項目を許可する場合は、数値を合計します。たとえば、読み込みと書き込みを許可なら6、すべてを許可するには7という具合です。
たとえば、「chmod 754 file1」というのは、所有者にすべて許可、グループには読み込みと書き込みを許可、全員には読み込みと書き込みを許可するという具合です。
コマンド | 機能 |
cp もとファイル コピー先ファイル | ファイルをコピーする |
mv もとファイル 移動先ファイル | ファイルを移動する。ちょっとややこしいが、ファイル名の変更もこのコマンドで行う |
rm ファイル | ファイルを削除する |
touch | 空のファイルを作成する。本来は、ファイルの更新日時を修正するコマンド |
他にもたくさんあるが、管理者でないと使えないコマンドも多い。以下は知っておくと便利そうなもの。
コマンド | 機能 |
passwd | 自分のパスワードを変更する |
du ~ | ホームディレクトリ内にある全ディレクトリのデータのサイズをKB単位で表示 |
find 場所 -name ファイル名 | 場所で指定したディレクトリ以下にある、指定したいファイル名のファイルを探す。ディレクトリ名も探すことができる |
mail メールアドレス | アドレスにメールを出す。コマンドを入力後、メールの内容をキータイプする。最後には、ピリオドだけでEnterを押す。これが本来のメール機能 |
man コマンド名 | コマンドのマニュアルを表示する |
exit | ログアウトする |
UNIX一年生 http://www.tokaido.co.jp/syoko/index.html
UNIX入門 http://flex.ee.uec.ac.jp/home/edu/98IC1/natu98/UXe2/s_index.html
あさだくんのUNIX入門 http://www.nurs.or.jp/~asada/asada-unix.html
今回もなしにします。今までの課題でできていない分や、講義外の課題をがんばってください。