OSの構成
目次
OSの構成
OSとひとくくりに言ってもその中にはさまざまな区分があり、それぞれに異なる役割を持っています。この章ではUbuntu(Linux)の構成について紹介したいと思います。
さて、初めにLinuxとUbuntuの違いについて説明します。LinuxOSという言葉をよく聞くと思いますが、Linuxとは完全なOSではなく、OSのうち中核の部分のみの機能を指します。こういったOSの心臓部のことをkernelとよびます。 そして、UbuntuはLinux kernelを含み、その他システムを動作させるのに必要な様々な機能(これをDaemonと呼ぶ)を含んだ”ディストリビューション”の一つなのです。
OSは大まかにkernelとApplicationの2種類に分けることができます。
これらの違いは主にそのシステムにどの権限で触れられるか、というところにあります。Application層はuser権限で実行でき(つまり、ファイルを保存したり機能に関わらないプログラムを実行したりできる)、kernel層はroot権限を持たないと実行できません(システム自体に関わるところ)。
それでは、OSの構成をkernel,daemon,shellの3つに分けてみてみましょう。
cpuの動作レベル
このように、OSの各階層を実行するためには異なる実行権限が必要となりますが、これはハードウェアレベルで規定されていることです。cpuの各機能を担う部分には動作レベルというものが設定されており、ICレベルで動作を管理することが出来ます。上では説明しませんでしたが実際にはcpuには主に”machine”,”surperviser”,”user”の3段階の実行レベルがあり、最下層はハードウェア割り込みなどが該当します。例えばUSBを差し込まれたときの動作などがここで規定されています。
実行体という概念
OSの中で実行されるプログラムはすべてスレッドやプロセスという単位で管理されます。 これらはプログラム本体に加え、実行時に使用できるメモリのサイズなどの割り当てもされており、このまとまりのことを”実行体”と呼びます。PCのメモリにプログラムを展開して操作することは、机にタスクを広げることに例えることができるのですが、この場合実行体というのはタスクと、そのために空けた机のスペースを指します。
我々をPCだとして、ロボットを組み立てることがPCにとってのプロセスだとします。パーツをなくしたくないから組み立てに必要な部品をトレーにまとめたりしますよね。このトレー(確保したメモリサイズ)と上に載っているロボット(タスク)をまとめて実行体と呼ぶのです。
kernel
概要
OSのうち、ハードウェアとのやり取りを行うところです。つまり、主にリソース管理(実行体の管理)を担います。リソース管理とは、メモリの分割や割り当てを行うことであるため、ハードウェアにアクセスできる権限が必要になるのです。
kernelはdriverの集合でできています。driverとはハードウェアチップの解釈に関するプログラムで、例えばUSBデバイスやGPUのドライバが存在します。
Wifiドングルもkernelに依存します。driverの読込がうまくいかないときは正しいkernelを選んでいるかどうか確認しましょう。
driverが他のシステムと異なる点は、上にも書きましたがハードウェアと直接やり取りをするということです。これにはsurperviser権限(つまりroot権限)が必要になります。そのため、driverの集合体であるkernel周りのシステムの実行にはroot権限が必要になるのです。
なぜ再起動を求められるのか
kernelが他とは異なる点がもう一つあります。それは、一度起動(boot)すると変更できない点です。ハードウェアの取り扱いに関するところなので実行中に扱い方を変えてしまえばエラーが起きてしまいます。実行体のところで挙げた、ロボットの組み立てを例として使うと、起動中にkernelのシステムを変更することはせっかくトレーでパーツを仕分けしていたのにトレーの形だけ変えられてしまうようなものです。これではまともに組み立てができませんね。PCに変更を加えたとき、時々再起動しないと反映されないことありますが、これはkernel driverに関する変更を反映する必要があるため(ほかの理由の時もありますが)なのです。
driverの管理
Linuxはカスタマイズ性の高いOSである、という話を前の章でしましたが、その理由は使用するdriverを選ぶことが出来るためです。kernelは再起動時に指定されたdriverを読み込んで起動していきます。Linuxは読み込む対象をかなり細かく設定することが出来るのです。 Linux kernelはdriverを管理する方法として主に2つのシステムを持っています。
- modprobe(module probe) / insmod(insert module)
これらはLinux kernelがサポートしているloadable moduleのうち、どれを読み込むか決定するシステムです。 これらのシステムを用いて使用するmoduleを決定したうえで再起動することでドライバシステムを変更できます。 - dkms(dynamic kernel module support)
外部moduleを扱うところです。dkmsに読み込んだモジュールも、再起動時にシステムに取り入れられます。
Daemon
バックグラウンドで動作するプロセスのことです。OSによってはserviceと呼ばれます。OS起動時にkernelがドライバを読み込みますが、この段階ではハードウェアが動かせるようになっただけで、ユーザの動作とハードウェアへの入力はつながりません(もちろん、画面に表示などもできない)。ユーザーとkernelをつなぐのがDaemonです。
ちなみにDaemonの由来はドイツの精霊ダイモーンで、Daemonは人間の見えないところでこっそり手助けしてくれる存在だそうです。ちなみにdemon(英語で悪魔)はこの派生で、そのためDaemonのロゴは悪魔になってます。
さて、Daemonにはどのようなものがあるのでしょう?
- systemd
linuxのシステムを触るとよく出てくるもので、多くのdebien系OSで初めに起動するdaemmonです。system”d”のdはdaemonを表しています - sshd
リモート接続についてのdaemonです - systemctl
これはdaemonではないですが、daemonのうちどれをboot時に実行するか決定することが出来ます。systemdに登録されているものは起動時に実行されます。
よく見る物のみ挙げておきましたが、ほかにもdaemonで動いているものはたくさんあります、というか、バックグラウンドで動作しているものはすべてdaemonで動いているのです。自分でdaemon(service)を作ることで、バックグラウンドで様々な動作をさせることが出来るようになります。
実行権限の切換
動作レベルの説明で、kernelとdaemonの実行権限は異なる、という話をしました。しかしdaemonからハードウェアに直接入力を行ったり、ハードウェアからの入力を割り込みとして処理をしたりしたいときもあります。そんな時には、daemonがkernelの権限を一時的に借りることが出来ます。これをsystem callと呼び、kernel関数を実行することができます。
shell
さて、ユーザーに近づいてきました。shellというのはターミナルやWindowsのコマンドプロンプトなど、ユーザがPCを触るために使うCUIの部分です。shell機能によってdaemonを管理したり、kernelに命令を出してcpuの状態を監視したり、実行体を作成したりすることが出来ます。
ただし、実はGUIの機能も一種のshellで、コマンドラインのみの操作ではなくより人間にとって使いやすいように工夫されています。
ここではLinux系のディストリビューションで用いられているbashというshellについて説明します。
shell command
shellはコマンド入力で動作させることができます。例えばcd,lsなどのコマンドもすべてshell commandです。例えば、echoコマンドについて考えてみましょう。
echo "hello world"
これを実行すると、ターミナルにhello worldと表示されます。これが、シェルコマンドです。
shell script
shell scriptとは、shellコマンドを羅列したtxtファイルです。.shという拡張子が付きます。先ほどのechoコマンドをshell scriptとして使うと、
#!/usr/bin/bash
echo "hello world"
exit 0
となります。ターミナルでこれをhello.shとして保存し、./hello.shと入力すると先ほどと同じ結果が得られます。
shell commandは多くのプログラム言語と同じように変数を作成したり、外部から入力を受け取ったりでき、さらにfor文、if文を使うこともできます。
これらの機能を駆使すると、使いやすいshell scriptを書くことができ、様々な動作を自動化することができるのです。
shellの使いどころ
実はdaemonの中身はshell scriptです。そのため自分で書いたscriptをバックグラウンドで動作するシステムとして用いることができます。また、script事態を補完おおdaemonに読み込ませるようにして自動実行させることも可能です。
コマンドが長くて打つのが面倒なコンパイルや、ビルド、アプリケーションのアップデートなどなど、shell scriptを書けるようになっておくと何度もしなければいけない作業を一部自動化することができます。ぜひshellを書けるようになってください。