頭弱いがPCの勉強する

正真正銘のPC初心者。勉強ノートのつもり。
ITなんてトンチンカン、だから書くことやること全部適当。

SysVinitとUpstartとSystemdについて

2018-03-10 17:26:08 | Linuxの勉強
こんにちは、今回はLinuxの起動の仕組みについての話です。
ここら辺について詳しくは学んだことは無く軽く勉強したので軽くまとめたいと思います。

SysVinit
Upstart
Systemd
これらはLinuxの起動の仕組みの種類です。
簡単な関係性に表すと一番古いのがSysVinitで、その次の改良版がupstart、それの改良版がSystemdだそうです。
現在主流なのはSystemdです。

それぞれについて説明していきます。
従来のLinuxでは「SysVinit」という起動の仕組みが取られていました。
SysVinitを採用しているLinuxマシンが起動するときは、
ハードウェア起動

BIOS/UEFI起動

OSのカーネル起動

initプロセス起動

ユーザープロセス起動

ユーザープロセス起動

といった感じでユーザプロセスが順番に処理されていくので起動が遅くなります。


それに比べてUpstartはイベント駆動型の仕組みです。
ハードウェア起動

BIOS/UEFI起動

OSのカーネル起動

initプロセス起動

ユーザープロセス起動 ユーザープロセス起動 …

といった感じで並列的にプロセスを起動していくのでSysVinitよりも高速で起動することが可能になっています。
しかしながら問題点も存在しています。
Upstartはイベント駆動というだけあって、プロセスが起動するイベント(条件)を設定ファイルに記述する必要があります。
しかも、指定したイベントがそろうとジョブは無条件で起動、停止をしてしまうので不必要なジョブへの操作が行われてしまうかもしれません。
Upstartではジョブの依存関係をイベントに書き換えて記述しなおさないといけないため、SysVinitからの移行には手間がかかります。


そして現在主流となっているSystemdです。
SystemdもUpstartと同じくユーザープロセスを並列起動可能です。
ただ、Upstartと違い必要なプロセスのみを起動するのでより高速です。
Upstartの場合は最初に発動したイベントをトリガーに連鎖的にジョブを起動させていきます、
なのでシステムに不必要なジョブまで起動してしまうとのことです。
その点はSystemdで改善されています。
Systemdはジョブではなくユニットという単位で管理でプロセスを管理しており、起動したいユニットに必要なユニットのみ起動することで改善されています。
そのほかにも機能が多数追加されています。
・スナップショット機能
systemdの動作状態をある時点で保存しておくことにより、復元可能にする。
・cgroups
Upstartでは孫プロセスまでしか監視できないが、systemdではcgroupsを単位に監視するので同一グループのプロセスはすべて監視できる。
・SysVinitとの互換性
Upstartと違いSysVinitとの互換モードが存在するので移行に便利

Systemdでは様々な機能をsystemctlコマンドで操作します。
SysVinit/Upstartの場合はserviceコマンドでした。
以降したばっかりの頃は、SysVinit/Upstartの癖が抜けずに苦しんだ人が続出したとかしないとか。

にわか知識ですので、ご指摘あったらぜひともください。

Docker使ってみました

2018-03-03 12:30:25 | Linuxの勉強
以前から使ってみたいと思っていました、そう思ったまま一年経っていたDockerをようやく触ることができました。
勉強会でDockerとリバースプロキシを用いてマルチドメインを実装するのを見たので、自分もやってみました。

まずDockerとはなにか
Dockerとはコンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。
従来の仮想環境はホスト型もハイパーバイザー型もゲストOSは必要でしたが、コンテナ型仮想環境であるDockerは違います。
ホストOSのカーネルを利用した仮想環境を構築し、別マシンが動いているかのように動かすことができるのでメモリやリソースが従来より少量ですみます。
Dockerによって起動された仮想マシンはコンテナと呼ばれます。
コンテナはコードによって構築することが可能なので、コードを記したファイルを用いれば同じ環境をすぐさま構築することができます。

基本操作
・docker pull イメージ名
dockerではpullコマンドでイメージをダウンロードできます。
ダウンロードしたイメージを指定して起動すれば簡単に用意されていた環境を起動することができます。

・docker run イメージ名
pullでダウンロードしたイメージファイルを元に仮想環境を構築します。
各種オプションを付けることで様々な設定をすることができます。


今回はAWS EC2でやります。
ホスト環境
ubuntu16.04
docker
nginx←リバースプロキシとして

コンテナ1(A.com)
apache

コンテナ2(B.com)
apache

本当はCentOSでやりたかったんですがAWSの無料枠だとなかったんで、今回はubuntuです。
RHELもいいかと思ったんですが、docker-ceがインストールできなかったので。
今回はdockerとnginxはインストールされている&二つのドメインの登録済という前提で進めます。

1.Dockerイメージの取得
今回コンテナとして使うのはapacheなのでapacheイメージを取得します。
# docker pull httpd
取得できたか確認するため、取得イメージを一覧表示します。
# docker images

2.Dockerネットワークの作成
コンテナの属するネットワークを定義します
# docker network create --subnet=192.168.30.0/24 user_defined_nw


3.Dockerコンテナの作成
イメージを元にコンテナを作成します。
コンテナ1
# docker run -d --name server1 -p 80 --net=user_defined_nw --ip=192.168.30.101 -v /var/www/html1:/usr/local/apache2/htdocs httpd

# docker run -d --name server2 -p 80 --net=user_defined_nw --ip=192.168.30.102 -v /var/www/html2:/usr/local/apache2/htdocs httpd

各オプションについて説明します。
・-d
コンテナをバックグラウンドで動作させます。
・--name 名前
コンテナに名前を付けることができます。これによりコンテナIDだけでなく名前でも操作可能になります。
・--net=ネットワーク名
先ほど作成したネットワークグループを指定し、そこへ所属します。
・--ip=IPアドレス
コンテナのIPアドレスをしていします。
・-v /var/www/html:/usr/local/apache2/htdocs
ホストOSの「/var/www/html」をコンテナ内の「/usr/local/apache2/htdocs」にマウントします。
今回はwww下にhtml1とhtml2を作成し、それぞれに割り当てています。
・httpd
コンテナイメージの指定です。指定したイメージを元に起動します。


4.nginxの設定
マルチドメインにするための設定ファイルを新規作成します。
# vi /etc/nginx/sites-available/web_serverA
内容:
server {
server_name A.com;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
location / {
proxy_pass http://192.168.30.101;
}
}

# vi /etc/nginx/sites-available/web_serverB
内容:
server {
server_name B.com;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
location / {
proxy_pass http://192.168.30.102;
}
}

5.nginxの設定の有効化
sites-enabled下にシンボリックリンクを作成し設定を有効化します
# sudo ln -s /etc/nginx/sites-available/web_serverA /etc/nginx/sites-enabled/
# sudo ln -s /etc/nginx/sites-available/web_serverB /etc/nginx/sites-enabled/
そしてサービスの再起動
#systemctl restart nginx

/var/www/html1と/var/www/html2にそれぞれ違うhtmlファイルを用意し、二つのURLでアクセスしてそれぞれ違うページが表示されれば成功です。