UNIXやLinuxのシステム管理(システム・コマンド・設定)に関する世界観3(シェル)です。
コンソールのUNIXが起動すると、ログインするユーザ名とパスワードを要求する。パスワードを入力するとパスワードを確認し、ログインできるとコマンドが入力できるようなシェルが実行される。
ただし、XなどのGUI環境ではこの限りではない。通常はウィンドウシステムと、ウィンドウの操作を行う「ウィンドウマネージャ」が別プロセスとして起動し、それぞれの画面を構成するそれぞれのプロセスがたくさん起動する。ターミナルエミュレータを開くと、そのターミナルのウィンドウとシェルのプロセスが起動し、シェルから別のプロセスを実行する。
コマンド操作環境では、プログラムのバイナリ名を指定して、その後にスペースを開けて引数やオプションを指定する。バイナリは環境変数のPATHの中から検索される。引数にはプログラムに与えるファイルのファイル名などを指定する。オプションは-abcのようなショートオプションと、--helpのようなロングオプションがある。
(「詳解 Linuxカーネル 第2版」を読みながら自分で考えて書きました。)
UNIXにはユーザーやパーミッションという考え方があり、シェルにログインしプログラムを実行するユーザーによってプログラムが実行される「権限」が決められる。
また、UNIXのコマンドラインシェルには「カレントディレクトリ」という考え方がある。これは、今の作業ディレクトリを意味しており、シェルには常にカレントディレクトリがどこであるか、という情報とともに、プログラムを「環境として」実行することができる。
また、各ユーザーには「ホームディレクトリ」というディレクトリが与えられる。これは/home/usernameに存在する。この中で、ユーザーは自由なデータやファイルを保管し、自由に作業することが出来る。
また、システムには管理権限を持つrootユーザーが一人存在し、システムを変更・破壊する権限を持つ。パッケージ管理システムなどでシステムをアップデートする場合は、root権限が必要な場合がある。シェルでrootユーザーになるためには、
$ su - (rootユーザーのパスワードを入力) #
と実行する。一般的に、通常ユーザーのシェルは$から、rootユーザーのシェルは#から始まる。コマンド入力例などでこの例があった時、$や#を入力する必要はない。(上の例では、通常ユーザーのシェルにsu -と入力すれば良い。$を入力する必要はない。)
sudoというコマンドを使うことで、いちいちrootユーザーにならなくても、特定のコマンドをrootユーザーで実行することが出来る。Ubuntuなどの一部の初心者向けディストリビューションではこちらのスタイルがとられる場合もある。
あるコマンドを実行した結果の出力を、他のコマンドの入力として渡せる「パイプ」と、入出力とファイルを変換できる「リダイレクト」。
たとえば
find ~ | grep hoge
とすることで、ホームディレクトリにある、「2012」を名前とパスに含むファイルを列挙出来る。
findで~の中を「サブディレクトリまで含めて」列挙し、そこからgrepで名前を検索する。
パイプは、使うとやみつきになる。UNIXは、こうした多数のコマンドプログラムに分けながら、ユーザーが自分の力で環境を操作することを哲学としている。
基本的に、コマンドをそのまま列挙したファイルを作って、実行すればシェルスクリプト。
だが、引数や関数定義が使えたり、if文なども出来るなど、応用範囲は多い。
UNIXでは、何でもかんでも再利用することで、応用性のあるシステム設計を行っている。
コマンドライン環境の中で利用できる、変数のようなもの。
シェル変数と環境変数がある。シェル変数はシェルの中だけで保たれ、起動したプロセスには引き継がれない。シェル変数は、
$ HOGE=hoge
と設定する。
一度シェル変数を設定した上でexportすることで、環境変数を設定できる。
$ export HOGE
コマンドのバイナリファイルを探すPATHやユーザーのホームディレクトリを探すHOMEなどが有名である。
コマンドの詳細は、manと言うコマンドで見ることが出来る。
man ls
コマンドラインオプションは、例えば、詳細表示をしたい時は、以下のように使う。
ls -al
それ以上のコマンドの詳しいことは、manを参照のこと。manは、設定ファイルについても調べることが出来る。
以下のサイトから、オンラインでブラウザからmanを見ることが出来る。
PATHを通すことで、新しいバイナリをインストールしたフォルダを追加することが出来ます。
PATHの確認方法。
$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
PATHの設定方法。
$ PATH=$PATH:/home/assy/bin $ export PATH
PATHの設定ファイル。
.bash_profileに以下の設定を記述することで、ログインした時に自動でPATHを設定してくれます。
PATH=$PATH:/home/assy/bin export PATH
システム全体(すべてのユーザーのシェル)で設定する場合は、/etc/profileに記述します。
以下のページが参考になります。
エイリアスとは、コマンドの別名。
$ alias rm='rm -i'
このようにすると、rmコマンドを入力して実行した際、rm -iコマンドとして扱ってくれる。引数を指定せずにaliasを実行するとエイリアス一覧が見れる。
後日注記:面倒な長いシェルコマンドは、エイリアスにするのが楽。注意点として、.bashrcにaliasを書く時はシングルクオーテーションに変なエスケープ'\'が必要。
たとえば、echoで色を付けるには
\e[色属性m
とする。
また、プロンプトを変更するには、PS1環境変数を変更する。
以下のページを参考に執筆・引用しました。
単純に非同期でプロセスを実行させたいのであれば、Bashで&をつけて実行させれば良い。
UNIXではマルチユーザーという仕組みを採用している。これによって、端末にログインし、その中のリソースにどのようにアクセスするかを、パーミッションという仕組みで管理することができる。
Windowsなどに慣れたユーザーからは考えづらいかもしれないが、Linuxはユーザーにログインして作業する、ということが一般的である。
ログインはローカル資源だけではなく、ネットワーク資源についても言える。SSHなどを使ってネットワークログインし、ネットワーク上で作業することもある。また、Apache httpdなどでは、外部ユーザーにネットワークからプロセス実行要求することもある。
ログインとパーミッションでは、コマンドを実行するユーザーに対して、そのファイルにどれだけアクセスできるのか、という考え方をする。一般ユーザーは/usr/binなどのシステムディレクトリは「破壊」することはできないが、自分の作業ディレクトリの中で自分のファイルを操作・処理するために「利用」することはできる。
ユーザーにはホームディレクトリが与えられ、この中にデータを保存して作業する。だが、大切な顧客のデータをホームディレクトリに保存することはできるだけ避けたい。SQLの関係データベース管理システムを用いて、バックアップも定期的にとることが勧められる。ホームディレクトリを簡単な作業のために使うか、あるいは大事なデータの置き場所にも使うかは議論の分かれるところであるが、SQLサーバーなどを使うこともできるし、専用のユーザーを作って普段そのユーザーを使わないようにしても良いだろう。ApacheはホームページデータをDocumentRootで指定するが、/var/www/htmlなどを指定することが多い。
このほか、システムを「破壊」できるrootユーザーに制限をかけたり、HTTPなどのプロセス単位で制限をすることのできる、SELinuxというセキュアなLinuxも利用することができる。
UNIX系のOSでは、ログイン端末とユーザーの使うコンピュータを分けるなど、「コンピュータの分業化」が比較的やりやすいと言われる。ネットワーク透過なX端末のような発想はここから生まれている。だが、現代的な「パーソナルユーザー」が使うパソコン用OSとしては、少し古びて見えるかもしれない。だが、今日のGNOME/KDEなどは、Windowsの統合などを大きく超えている。GmailやGoogle Driveのようなネットワーク上のサービスにログインしてファイルマネージャからアクセスしたりすることは容易である。だが、伝統的な仕組みも今なお提供されており、NFSなどを用いてネットワーク上にファイルサーバーを作ることも簡単にできる。
自分の書いたブログ「神々とともに生きる詩人」2021/02/22より。
UNIXにおける環境変数は、シェルからプロセスに引き継がれる変数で、使っている環境そのものを設定するために使う。
コマンドとして実行されるバイナリのあるパスを示すPATH、表示されるメッセージなどの言語を決めるLANG、デフォルトのページャやエディタを設定するPAGERやEDITORなどが有名。
X11などでは日本語入力のインプットエンジンなどの設定に使われることもある。
Bashの詳細はBashの世界観をご覧ください。