今回はLinuxとコンテナについて説明します。
ヘビーユーズされるサーバにおいて、LinuxOSが活躍する機会は非常に多いです。
Linuxは多くがフリーのOSであることから価格面で有利であるのと、内部が自由にいじりやすいという特徴により、サーバとして役に立ちます。
ただ、自由であるということは複雑な情報を扱うということも意味します。WindowsやMacはユーザーが使いやすいように利用を制限していますが、Linuxを扱う際はコンピュータの仕組みをまずは理解しておく必要があります。
Linuxの基本的な知識やPCの基本についてはYoutubeの方で説明しているので、ここではそれに含まれなかった仮想化やコンテナ、プロセスについて説明していきます。
コンピュータの基本については下記からどうぞ。
Linuxの基本については下記からどうぞ。
仮想マシン
コンテナについて説明する前に、基本となる仮想マシンから説明します。
仮想マシンとはコンピュータ上に別のコンピュータを作成することです。
例えば、Windowsを使っている人がLinuxを使いたいと思ったとします。そんな場合は、仮想化ソフトウェアにより擬似的なLinuxの環境をWindows上に作ることが出来ます。
- 仮想マシン:コンピュータ上に作られた仮想的なコンピュータ。実際はホストOS(実際にあるマシンのOS)の上にゲストOS(仮想的なOS)が乗っかっている
これはWindows上で動くソフトウェア上にLinuxのOSを立てたことになります。つまり、Linuxが想定した本来の使い方ではないため、動作は重いです。
ただ、環境をテストする上では非常に便利です。
仮想マシンを使うことで、1台のコンピュータで様々な環境を構築して、動作テストすることが出来ます。
仮想定期に環境を作るためのツールが整っているので、すぐに入れ直すことも出来ます。
ただ、OSの容量が大きいのでホストマシンの性能がある程度高くないといけないことにご注意ください。もし性能の低いPCに対してLinuxを使用したい場合は、ダブルブートできるようにするという手もあります。(ダブルブートは、2つのOSを並べてインストールし、起動時にどちらを使用するかを選べるようにすること)
コンテナ
コンテナは仮想マシンを更に使いやすくした技術です。
仮想マシンではホストOS上に新しいコンピュータを擬似的に作成するため、諸々の設定があり仮想OSを入れる作業が結構手間でした。
そのため、複数の環境を用意するのが難しかったのですが、それが解消されたのがコンテナです。コンテナとは簡単に言うと一つの仮想環境のことです。
- コンテナ:ホストOS上にコンテナエンジンを乗せて、その上でコンテナを生成する。仮想的な環境を分けて、それぞれの環境でソフトウェアをテストできる。
コンテナは独立した環境でいくつも作れるので、ソフトウェアの競合が起きないという特徴があり、エラーの特定が容易になります。
また、コンテナというひとまとまりにすることで、環境の複製が楽になります。実際、様々な環境がDockerのサイト上で手に入ります。
仮想マシンでは自分で仮想環境のスペックを指定しましたが、コンテナではホストOSのスペックを引き継ぐので、この違いには注意が必要です。
Linuxのブートプロセス
ここからはLinuxのプロセスについて説明していきたいと思います。
まずはブートプロセス、つまり起動時に実行される手順について理解しましょう。
コンピュータを起動すると、まずはBIOSと呼ばれるハードウェアを管理するプロセスが実行されます。
BIOSによりハードウェアが起動すると、ソフトウェアであるOSの起動が始まります。
LinuxOSでは、まず核となるカーネルが起動し、その後様々な設定を読み込むためのinitもしくはsystemdプロセスが実行されます。
現在のLinuxではsystemdが主流であり、systemdはLinuxの起動処理やシステムの管理を行う仕組みのことです。
systemdはユニットという単位で設定が分けられており、何か設定を変えたい場合は対応するファイルを1つ変更するだけで大丈夫です。
変更時は「systemctl」というコマンドにて設定を修正します。
ユニットには大きく分けて2つの種類があり、設定変更に関するtargetとサービスの設定が含まれるserviceです。主にtargetを修正します。
- ~.target:修正によりログイン、再起動、稼働サービスの変更などが行える
- ~.service:サービスに関する情報が入ったファイル
プロセス
ブートプロセスについて理解したところで、プロセスについても学んでいきましょう。
ブートプロセスとは、起動に関する手順でした。それに対して、プロセスとは実行中のプログラムを指します。
- プロセス:実行中のプログラム。スレッドとの違いは、メモリも含んで考えているかどうか。(スレッドはタスクだけを指し、プロセスはタスク+メモリ使用量をあわせた単語)
プロセスには種類があり、一般的に命令したら動作するプロセスもありますが、ユーザーの命令を待機するプロセスであるデーモンも存在します。
- デーモン:待機しているプロセスであり、条件が揃ったら稼働する。ファイル名の語尾にはdがつく。
プロセスの表示
プロセスは「ps」コマンドで表示できます。
コンピュータでは多くのデーモンが稼働しているため、psはデーモンを含む表示を切り替えることが出来ます。
- ps a:全てのプロセスの表示
- ps ax:デーモンを含む全てのプロセスの表示
psコマンドではコマンド実行時の瞬間に動作しているプロセスだけが表示されます。
ただ、プロセスは時々刻々と変化するため、プロセス管理には不便なのでリアルタイム表示できる「top」コマンドが存在します。
- top:リアルタイムでプロセスを表示する。CPU利用順でプロセスが表示される。
- kill:topで表示したプロセスのID(PID)を選択すれば、強制終了できる。
動作中のプロセスを停止する際にはtopのほうが便利であるため、topのほうがよく使われます。
ジョブ
処理をまとめたものをジョブと呼びます。
ジョブはプロセスを含んだものであり、多数のプロセスを含むジョブを作ることが出来ます。
ひとまとまりの処理をジョブとして管理することで、多くの処理をコンピュータが順番に行ってくれるようになります。
ジョブをどの順番で行うかなどの管理はジョブスケジューラで行われます。
ジョブはコマンド実行時に行われるものと裏で行われるものがあります。
- フォアグラウンドジョブ:コマンド実行すると行われるジョブ。動作中はコマンド操作ができない。
- バックグラウンドジョブ:コマンドの最後に「&」をつけると実行されるジョブ。動作中に別のコマンド操作ができる。
Linuxは大型サーバに使われることが多いため、ジョブの管理はLinuxを使用する際は密接に関わるスキルです。
ジョブ管理に関しては別の機会があれば詳しく説明したいと思います。
おわりに
今回はLinuxの基本スキルとして下記について説明しました。
- 仮想マシン
- コンテナ
- ブートプロセス
- プロセスとジョブ
どれも概念さえ理解すれば難しいものではありません。
特にコンテナは使えるかどうかで利便性が大きく変わるため、ぜひ理解しておきましょう。
Linuxの基本については下記からどうぞ。