代々木で働く19歳エンジニアのブログ

思ったこととか、技術的なこと書きます。

Linux 実践入門

LINUXシステム実践入門

シェルはユーザーから入力された指示に従い、コマンドを実行し、結果を出力するプログラム。

$ コマンド 引数

コマンドはシステムに処理させる命令で、プログラムやシェルスクリプト、シェルのビルトイン(組み込み)コマンドの名前を利用

manファイルの検索

$ man ls | whatis chmod
chmod(1)                 - change file modes or Access Control Lists
chmod(2), fchmod(2), fchmodat(2) - change mode of file

$ man ls | apropos chmod
chmod(1)                 - change file modes or Access Control Lists
chmod(2), fchmod(2), fchmodat(2) - change mode of file
lchmod(3)                - change mode of file

manファイルにはNAME/名前のセクションにコマンド名と短い要約文が入っている whatis: 検索文字列として指定したコマンド名にマッチするmanファイルの要約文を表示 apropos:検索文字列をコマンド名と要約文から検索して表示する

$ info ls

パーミッション

xが付いてないと、そのディレクトリにアクセスできない→. のつくファイル . →今いるディレクトリを明示 ..→一つ上のディレクトリを明示

total 48
drwxr-xr-x 4 vagrant vagrant 4096 Sep 14  2012 .
drwxr-xr-x 3 root    root    4096 Sep 14  2012 ..
-rw------- 1 vagrant vagrant   22 Sep 14  2012 .bash_history
-rw-r--r-- 1 vagrant vagrant  220 Sep 14  2012 .bash_logout
-rw-r--r-- 1 vagrant vagrant 3486 Sep 14  2012 .bashrc
drwx------ 2 vagrant vagrant 4096 Sep 14  2012 .cache
-rwxr-xr-x 1 vagrant vagrant 6487 Sep 14  2012 postinstall.sh
-rw-r--r-- 1 vagrant vagrant  675 Sep 14  2012 .profile
drwx------ 2 vagrant vagrant 4096 Mar 13 09:13 .ssh
-rw-r--r-- 1 vagrant vagrant    0 Sep 14  2012 .sudo_as_admin_successful
-rw------- 1 vagrant vagrant    6 Sep 14  2012 .vbox_version
-rw------- 1 vagrant vagrant   12 Sep 14  2012 .veewee_version

一桁目はファイルタイプを表している。dはディレクトリ。

suid(set user id): ファイルの所有者権限でコマンドを実行できることを意味する sgid(set group id): ファイル→所有者権限 ディレクトリ→その親ディレクトリと同じ権限 で実行できる スティッキービット: 複数ユーザーでディレクトリを共有する際にsgidとは逆に作成したユーザーのみがファイルを削除できるようにするビット

デフォだとコマンドは実行されたユーザーの権限で実行される

実行ビット:x

suid はコマンドに設定されている所有ユーザー権限で実行される、マルチユーザーシステムであるUNIXでは運用側には便利な仕組み suidをむやみにコマンドに設定すると一般ユーザーが他人の権限でコマンドを実行できてしまうため、システムを某弱にしてしまう。

ファイル

データの最小単位はbit, 0と1 8つの bitを一つにまとめたものをbyteと呼ぶ byte=2の八乗=256 ASCIIの文字コードの一部を表現できる

$ man ascii

ディレクトリ(unix, linux)⇆ フォルダ(windows) 複数のファイルやディレクトリを一くくりにする入れ物のこと 一つ上のディレクトリ 親ディレクトリ 一つ下のディレクトリ 子ディレクトリ、サブディレクト

linuxディレクトリ構成

FHS(filesystem hierarchy standard):linuxディレクトリ階層標準化システム http://www.pathname.com/fhs/

マウント:HDDなどのブロックデバイス上にあるファイルシステムをシステムのディレクトリツリーの一部に配置す

パーティション あるHDDを複数の領域に分割してできた一つの領域のことを言う。

メリット ・システム領域とデータ領域を分けられる ・システム領域とデータ領域の他にlog領域を分けておくことで、万が一両方の残量が0になってもログ領域が残っていればなんとかシステムは起動できる

LVM

複数のパーティションをまとめて一つの論理ボリューム、パーティションとして見せることができる。残り領域が少なくなった際に拡張できる。

ホームディレクト

  • ファイル名はアルファベット
  • .から始まる設定ファイル以外はホーム直下に置かない
  • ダウンロードしたソースアーカイブを配置する srcディレクトリがある
  • リポジトリは個別にディレクトリを作る(git, svn, cvs
  • 一時ファイルディレクトリ(tmp)を用意する
  • ダウンロード、ビデオ、ピクチャー、ミュージックなどは、download, video, picture, musicからの新ボックリンク
  • 作業用ディレクトリ worksがありその下に案件ごとのサブディレクトリが存在する。

ディレクトリ構成

/ ルート

ディレクトリを格納するトップディレクトリ。vmlinuzというlinuxカーネル本体、linuxカーネルソースパッケージを配置することが推奨。

total 85
drwxr-xr-x  2 root    root     4096 Sep 14  2012 bin/
drwxr-xr-x  4 root    root     1024 Sep 14  2012 boot/
drwxr-xr-x 14 root    root     4160 Mar 13 09:13 dev/
drwxr-xr-x 79 root    root     4096 Mar 13 09:13 etc/
drwxr-xr-x  3 root    root     4096 Sep 14  2012 home/
lrwxrwxrwx  1 root    root       33 Sep 14  2012 initrd.img -> /boot/initrd.img-3.2.0-23-generic
drwxr-xr-x 19 root    root     4096 Sep 14  2012 lib/
drwxr-xr-x  2 root    root     4096 Sep 14  2012 lib64/
drwx------  2 root    root    16384 Sep 14  2012 lost+found/
drwxr-xr-x  4 root    root     4096 Sep 14  2012 media/
drwxr-xr-x  2 root    root     4096 Apr 19  2012 mnt/
drwxr-xr-x  4 root    root     4096 Sep 14  2012 opt/
dr-xr-xr-x 90 root    root        0 Mar 13 09:13 proc/
drwx------  2 root    root     4096 Mar 13 23:33 root/
drwxr-xr-x 16 root    root      680 Mar 18 07:11 run/
drwxr-xr-x  2 root    root     4096 Sep 14  2012 sbin/
drwxr-xr-x  2 root    root     4096 Mar  5  2012 selinux/
drwxr-xr-x  2 root    root     4096 Sep 14  2012 srv/
drwxr-xr-x 13 root    root        0 Mar 13 09:13 sys/
drwxrwxrwt  2 root    root     4096 Mar 18 08:17 tmp/
drwxr-xr-x 10 root    root     4096 Sep 14  2012 usr/
drwxr-xr-x  1 vagrant vagrant   136 Mar 13 09:13 vagrant/
drwxr-xr-x 11 root    root     4096 Sep 14  2012 var/
lrwxrwxrwx  1 root    root       29 Sep 14  2012 vmlinuz -> boot/vmlinuz-3.2.0-23-generic

/boot

linuxカーネル・init ram fsファイル・ブートローダGRUBの設定ファイルを含むディレクトリ。

total 23431
-rw-r--r--  1 root root   791023 Apr 11  2012 abi-3.2.0-23-generic
-rw-r--r--  1 root root   140279 Apr 11  2012 config-3.2.0-23-generic
drwxr-xr-x  3 root root     5120 Sep 14  2012 grub/
-rw-r--r--  1 root root 14731890 Sep 14  2012 initrd.img-3.2.0-23-generic
drwxr-xr-x  2 root root    12288 Sep 14  2012 lost+found/
-rw-r--r--  1 root root   176764 Nov 27  2011 memtest86+.bin
-rw-r--r--  1 root root   178944 Nov 27  2011 memtest86+_multiboot.bin
-rw-------  1 root root  2884358 Apr 11  2012 System.map-3.2.0-23-generic
-rw-------  1 root root  4965840 Apr 11  2012 vmlinuz-3.2.0-23-generic

/etc

設定ファイル(OSの設定に必要となるファイルやプログラムの設定ファイル)を格納するディレクト

/bin

システム管理者とユーザーによって利用されるコマンドが配置される(lsとか)。他のパーティションをマウントしなくても実行できるコマンドを集めている。

/sbin

システム管理者が利用するコマンド(システムのブートの一部、データバックアップ・リカバリパーティション調整・ネットワーク設定などのシステムメンテナンス、ユーザーの追加・削除、プロセスの監視などに必要なツール)が配置。

/usr

システムを利用するユーザで共有するデータを保持するディレクトリ。 /usr/local そのpc用のソフトウェアを配置するためのトップディレクトリ。

/home

ユーザーのhomeディレクトリとして扱い、システム利用者が利用するシェルの設定ファイルやメール、データファイルなどを配置。

/var

変わりやすいデータ(スプール(一時的に配置するファイルやディレクトリ)やログ)を配置するディレクトリ /tmp 別の一時ファイル置き場 /{log,spool} システムのいくつかのログが書き込まれるディレクトリ 各アプリケーションが一時ファイルを溜め込むスプールディレクトリ /mail MTA(SMTPサーバー、Mail Transfer Agent)で利用するディレクトリ /run デーモンなどのプログラムを実行する際に割り振られるプロセスID(PID)をテキストファイルとして保存、ソケットファイルなど一時データを保存する際に利用される。 /lock デーモンなどのプログラムの多重起動を防ぐための一時ファイルの保存 /{opt,cache,lib/{misc,locate},local} デーモンやログ以外で一時ファイル以外に利用するディレクトリが割り当てられる。

/proc(procfs)

linuxのプロセスを操作したりシステム情報を処理するための手段を提供する擬似ファイルシステム。 プロセスとカーネル情報を提供する仮想ファイルシステム

/sys(sysfs)

メモリ内ファイルシステムを通してユーザープロセスにカーネル情報を提供するための機能。 デバイス情報を提供する仮想ファイルシステム

/dev

特殊・デバイスファイルを配置するディレクトリ。

/tmp

システムで作業ファイルなどの配置に利用するディレクトリ。

シェル

https://gyazo.com/744812ffa7c8a41e17bed0d503516720

linuxカーネルLinuxディストリビューション(OSを構成する他のソフトウェアや、アプリケーションソフト、インストーラー等を含んでいる)

カーネル(kernel)とは、オペレーティングシステム(OS)の基本機能の役割を担うソフトウエアのこと カーネルは、OSの中でも特に中核的なプログラム このカーネルが、ハードディスクやメモリーなど、コンピューターの資源管理を行なっている

  • アプリケーションの起動
  • プログラム実行順序の変更
  • 変数の保持
  • 実行コマンド履歴の出力

シェルスクリプト:あらかじめコマンドを記述したテキストファイル

linuxのシェル四種類 - bash - csh/tch - dash - zsh

確認コマンド

$ ls -l /bin/sh

一般ユーザー $

⇅ $ sudo su # su 一般ユーザー名

管理者ユーザー #

ジョブ制御機能

複数のプログラムの実行・停止を管理するジョブ制御機能

ユーザーが見える画面 フォアグラウンドジョブ 背後で実行する バックグランドジョブ 停止中 サスペンドジョブ

$ jobs ジョブの一覧を表示。+はカレントジョブ ーその次のjob

^ + z → サスペンドジョブに bg → 指定したjob番号のプロセスをバックグラウンドで実行 fg → そのプロセスをフォアグラウンドに持ってきて稼働状態にする

https://gyazo.com/eb304b946c0e0829008aa50f38ea1712

リダイレクト プログラムの出力をファイルに書き込むこと 0<, 1>, >> をフィルディスクリプタを指定して、プログラムの入出力先を変更する。プログラムの処理結果をファイルに記録、ファイルに記述されている内容をプログラムに渡すのに利用。0は標準入力、1は標準出力、2は標準エラー出力

パイプ プログラムの出力を別のプログラムの入力に利用。

ビルドインコマンド

シェル自身が機能として持っているコマンド =シェルのビルドインコマンド(内部コマンド) 別に用意されたプログラムを外部コマンド

: 何もせずに終了コード0を返す

source もしくは .

現行シェル環境で他のシェルスクリプトを読み込んで実行する。

cd

指定したディレクトリに移動する 環境変数CDPATHを設定すると、cdのあとに移動するディレクトリ名を指定するだけで、そのCDPATHに含まれるディレクトリから移動先を検索する

$ export CDPATH=/var/lib
$ env | grep CDPATH
CDPATH=/var/lib
$ cd dpkg
/var/lib/dpkg

eval

パラメータの間接干渉をする(入れ子になった変数から値を取り出す)

https://gyazo.com/ff61aed4be66f63f813753f1728e9a03

exec

forkシステムコールを使わずに指定されたコマンドを自身で実行する。 通常シェルで外部コマンドを実行するとforkシステムコールを利用してシェルとは別にプロセスが生成され、コマンドを実行する。exec内部コマンドを利用するとforkシステムコールを使わないために別プロセスが生成されずシェル自身が指定されたコマンドに置き換わり実行される。execを使用しない場合、コマンドの実行後はシェルに実行が戻るが、execを使うと戻らない。

https://gyazo.com/b6257db0fe3cff2f66039db7c646e467

read

入力された文字列を指定した変数に取り込むコマンド。 https://gyazo.com/40b7c215c1d727ab33f009696a283798

https://gyazo.com/0ef6ff037286acc40406e63c07922def

シェル宣言

$ コマンド

デフォだと下記の順で以下の環境変数PATHの中から探していく。 https://gyazo.com/f1662ffae16a692c8aa43eaf359b7216

でも自分で作ったシェルスクリプトの場合パスを指定しないといけない。 例)./hello.sh

シェル変数

ユーザーが一時的に値を格納、参照し、起動しているシェル、シェルスクリプト内で利用できる変数 使用中のシェルで有効なシェル変数はsetコマンドで一覧表示できる。unsetを使うと削除できる。

環境変数

定義したシェルから起動したコマンドにも引き継がれる変数。 複数のコマンドで共有できる変数。 定義されている環境変数はenvコマンドで参照。 https://gyazo.com/e3424744716378f1f3a6e2664c01ea13

位置パラメータ

関数などで利用する引数参照に利用する変数 シェルスクリプトを実行する際に引数として値を渡したい場合がある。その値を取得するために使う。 $ cat -n count.sh 1 #!/bin/bash 2 echo $1 3 echo $2 4 echo $3 $ bash ./count.sh a b c d a b c

特殊パラメータ

引数すべてや引数の個数などを表す変数。特殊パラメータはスクリプト名や引数、プロセスIDなどを参照するための変数として利用できる。

https://gyazo.com/9ebd59aabf23a7494b205c6ed47ceb9b

if/while/for/case がある。

シェル関数

shift 位置パラメータを一つずつ移動 $ ./script.sh --version --help

どのタイミングでオプションが来ても対応できる https://gyazo.com/d5aade624226a0a280c604bb4e8a6b3b

""   $1 を特殊記号として扱う ''  テキストをシェルに展開されないようにして特殊記号をそのまま表示、利用できる シングルの方が外(例、'a"bb"')

` もしくは $() : 囲まれるとコマンドとして実行される

ログインシェル

0番目の引数の先頭文字が- --loginが指定されている場合に起動するシェル。 GUIで起動しなかったら、ログイン後に起動するシェルがログインシェル。

/etc/profile ~/.bash_profile ~/.bash_login ~/.bash_profile

対話シェル

ログインシェルでない状態のシェル ホームディレクトリの.bashrcが読まれる

bashの設定を有効化していく

 ユーザとグループ

システムユーザ デーモンを実行するために利用するユーザ

  • ユーザ作成コマンドの設定ファイル/etc/adduser.confなどでシステムユーザIDの範囲が決まっている
  • /etc/shadowを確認すると、システムユーザのパスワードは設定されていない。

一般ユーザ

管理者rootとシステムユーザが利用していないIDを適用されたシステムを利用するだけのユーザ パッケージのインストールなどを実施せず、システムにログインし、インストールされたコマンドを利用するユーザ

各ユーザはグループという所属を設定でき、最低一つはグループに入ることになっている。

unixアカウントを作成、変更する以外は、標準では同じ名前のグループが作成され、そこに所属する。

グループを利用するメリットは、システムリソースの利用制限を実施したり、権限の利用制限を設定できること。

/etc/password(unixアカウント情報が記録されている。)

unixユーザ名 パスワード ユーザID グループID コメント ホームディレクトリ シェル

/etc/shadow(暗号化したパスワードを格納する)

/etc/shadowは暗号化されたパスワードファイルを管理者権限でのみアクセスできるようにする仕組み。

https://gyazo.com/5022f3672f00b151d033155d8bcd8b44

パスワード欄

$id$salt$encrypted id: 利用するハッシュアルゴリズム salt: ユーザのパスワードと合わせて暗号化するためのフレーズ encrypted: IDで指定したハッシュアルゴリズムでハッシュ化したパスワード文字列 ! パスワードが設定されていない * アカウントロック !! パスワードの有効期限切れ

adduser/useradd ユーザの追加 deluser/userdel ユーザの削除 groupadd/groupdel グループの追加、削除 usermod ユーザアカウントの修正 groupmod グループアカウントの修正 passwd パスワード変更 change パスワード有効期限を変更 chsh シェルの変更 chfn 氏名情報変更

/etc/group

システムでのグループ定義を行うファイル

$ cat /etc/group
root:x:0:
グループ名:パスワード:グループID:ユーザ名…

/etc/gshadow グループ名:暗号化パスワード:管理者:メンバー

SSH

SSHポートフォワード

sshプロコトルはリモートシェルやファイル転送だけでなく、そのセッションに別のアプリケーションをカプセル化できる。これによって平文で通信する平文で通信するアプリケーションでも暗号化通信にできる。

https://gyazo.com/128b4cb37f0799fc1db937dbaeec55d2

sshサーバーを起動するには、sshdというデーモンプロセスを稼働させる。 sshdを起動するとデフォルトで、22/tcpを利用して、sshクライアントからの接続を待ち、クライアントから接続が来ると利用するSSHプロトコルのバージョンの交換から通信を始める。 Diffie-Hellman鍵交換によってセッション鍵を得る、そしてサーバーのホスト鍵とクライアントのユーザ鍵をお互いに交換する

  • クライアントにsshサーバーのホスト鍵が登録されている場合 問題なし

  • クライアントにsshサーバーのホスト鍵が登録されていない場合 sshサーバホスト鍵のフィンガープリントを表示して登録することの確認を表示

https://gyazo.com/6be4147543441e9bbfad10cdd155aea7

  • クライアントに登録されているsshサーバーのホスト鍵と異なる場合 man-in-the-middle攻撃の可能性があることを警告表示する

https://gyazo.com/b5b4c65487c11eb703e2aacd78e76f90

セッション鍵を得て暗号化通信を開始した後はサーバとクライアントの認証に入る、パスワード認証・公開鍵認証を利用してアカウントを利用するか判断。

https://gyazo.com/4c60b8392957d137bbfc6f181d777f1b

$ ssh [user@]hostname

認証が通ると、シェルの起動、コマンドの実行、xクライアントの転送などを実行してセッションを開始する

https://gyazo.com/a79e8932572beb41d3ee25749f0759de

http://qiita.com/tag1216/items/5d06bad7468f731f590e

$ ls -l /etc/ssh/
total 160
-rw-r--r-- 1 root root 125749 Apr  2  2012 moduli
-rw-r--r-- 1 root root   1669 Apr  2  2012 ssh_config
-rw-r--r-- 1 root root   2499 Sep 14  2012 sshd_config
-rw------- 1 root root    672 Sep 14  2012 ssh_host_dsa_key
-rw-r--r-- 1 root root    604 Sep 14  2012 ssh_host_dsa_key.pub
-rw------- 1 root root    227 Sep 14  2012 ssh_host_ecdsa_key
-rw-r--r-- 1 root root    176 Sep 14  2012 ssh_host_ecdsa_key.pub
-rw------- 1 root root   1675 Sep 14  2012 ssh_host_rsa_key
-rw-r--r-- 1 root root    396 Sep 14  2012 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id

moduli DH鍵交換に利用するデータ sshd_config sshデーモンが参照する設定ファイル ssh_host_key{,.pub} sshサーバーで保持するSSHホスト鍵 ssh_config SSHクライアントが参照するデフォルト設定ファイル

authorized_keysファイルは一行に1つの公開鍵を記述する

X11Forwarding

sshは必ずしもリモートホストにログインし、コマンドで操作するものではない。 sshログイン先のXクライアントアプリケーションをログイン元のXサーバに転送することができる。

https://gyazo.com/cb80ae3dfa4d5fa7ce39ff4037f590f9

http://qiita.com/kou_bacchus/items/47c40beb147a3040fe5e

SSHクライアント

管理者だけではなく開発者も開発サーバやデプロイ先サーバへのログインなどで多用するツールの一つ

以下の順序で読み込まれる sshコマンドラインオプション ユーザごとのオプション(~/.ssh/config)←ここに長いコマンドをまとめることができる システムのオプション(/etc/ssh/ssh_config) sshコマンドのデフォルトパラメータ

公開鍵暗号秘密鍵と公開鍵を作成し、公開鍵を配布して秘密鍵はユーザが厳重に保持して運用する暗号。 公開鍵と秘密鍵は同時に作られ、秘密鍵から公開鍵の生成、公開鍵から秘密鍵の生成はできない。鍵はアルゴリズムを利用して生成。

公開鍵

一般に公開 持ち主以外の送信者が暗号化に利用 持ち主以外の受信者が署名検証に利用 sshでログインする先のホストに登録して利用

秘密鍵

持ち主が保持 公開鍵で暗号化されたメッセージを秘密鍵で復号化するのに利用 作成したメッセージへの署名に利用 sshコマンド実行時に秘密鍵を指定することで公開鍵を登録したホストへのログインに利用

保持しているサーバの公開鍵と、サーバから送られてきた公開鍵が異なる場合 →SSHサーバの再インストールやリプレースなどでホスト鍵が変更された。(SSHサーバの再インストールやリプレースなどでホスト鍵が変更された。) →SSHサーバとSSHクライアントの間に第三者が入っている。(man in the middle攻撃)

SSHサーバは自身のホスト用公開鍵と秘密鍵を保持している。SSHクライアントはサーバの公開鍵を登録しておくことで、そのサーバが本当に接続対象のサーバかを判断できる。

SSHサーバ管理者に現在利用されている正しい公開鍵情報を提供してもらう SSHでログインするユーザが接続した際に表示される公開鍵のフィンガープリントを確認する

公開鍵認証

ユーザーはログインしたいホストに自身の公開鍵を保存する $ ssh-copy-id -i ~/.ssh/id_rsa sample@192.168.1.24

ssh-copy-idはリモートホストにログインできる状態でないと登録できない。 →リモートホストがパスワード認証を許可しているか既に公開鍵を一つ以上登録しており、SSHログインできることが条件。

リモートホストの管理者に公開鍵を渡して登録してもらう必要がある

sshサーバにおける公開鍵の設定

sshログインを受け付ける側の設定はSSHデーモンの設定変更で公開鍵認証を有効にして(/sshd_config)sshdを再起動する。

sshクライアントでのデバッグ→詳細を見ることでログインできない場合にデバッグできる $ ssh -vvv -l sample 111.111.1.11

cronは決められた時間にコマンドを実行するデーモン。

$ service cron status 
$ ps ax | grep cron
  • /etc/crontab cronデーモンへの指示書
  • /etc/cron.d 
  • /var/spool/cron/crontab ユーザー用cronファイル

https://gyazo.com/c3f3500a439fd2d70d32df838cbb2775

$ cat /etc/crontab (Ubuntu) # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do.

SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) #

分 時 日 月 曜日 実行ユーザ名 コマンドとそのオプション

$ crontab -l ユーザのcron設定ファイルのリストを表示 $ crontab -e ユーザのcron設定ファイルを作成

ここで生成されたファイルは/var/spool/cron/crontabs以下に配置される。

crontabには負荷が高くなる処理の実行を記述した場合のために、ユーザ単位でのアクセス制御が設定できる。

デフォルトでは存在しない/etc/cron.allow /etc/cron.denyというファイルを作成し、一行ごとに1アカウントだけ記述すればリストされたユーザのcrontabの実行を制御できる。

https://gyazo.com/c05bb893e18e1139afcd094cbffd5039

これらの設定によってcrontabの実行を拒否された場合は/var/log/cronにログとして記録される。

cron設定後の動作確認 実行するコマンドにechoやloggerを与え、そのコマンドが指定時刻に実行されるかをデバッグできる。

$ sudo cat /etc/cron.d/du 0 1 * * * root logger "du -hs $HOME"

以下のログを確認することで、変数が正常に展開されているか、指定した時刻に実行されているかなどが確認できる。 echoを使うと実行後にメールが飛んでくる

出力例 $ tail /var/log/messages Sep 25 01:00:01 ogasaka logger: du -hs /root

cronはすべての出力をMAILTO環境変数に指定した宛先、MAILTOがなければrootを宛先として実行後にメールを送信する。 適切に送信先を指定するのも重要だが、不必要な出力をしないことでメール送信しない様にし、エラー出力だけメールするという調整が重要

標準出力も標準エラー出力もメールしない

「du -hs \$HOME > /dev/null 2>&1」

標準出力をdev/nullにリダイレクトするので標準エラー出力だけメールを送信する

「du -hs \$HOME 1> /dev/null」

ログローテーション

カーネルや各デーモンからのメッセージを記録し続けると、ログファイルのサイズは拡大し、ファイルシステムのファイルサイズ制限に達してしまう。それを予防する仕組みがlogrotate。 logrotateはcron経由で起動し、指定されたログファイルを移動、圧縮して新しいログファイルを作成。必要があればデーモンの再起動。

cronが/etc/cron.daily/logrotateを読み込む logrotateが/etc/logrotate.confを設定ファイルとして起動し、logrotate.confに指定されたログファイルを処理する /etc/logrotate.d/以下のファイルを読み込み指定されたログファイルを処理する

https://gyazo.com/7f98f16bdb39fad439d95d5a4b71adf6

Apache HTTP Server

RHEL/CentOS httpd Debian/Ubuntu apache2

http://www.vogella.com/tutorials/ApacheHTTP/article.html

$ sudo apt-get install apache2

$ /etc/init.d/apache2 -l * Usage: /etc/init.d/apache2 {start|stop|graceful-stop|restart|reload|force-reload|start-htcacheclean|stop-htcacheclean|status}

←apache2の後に続けて書くことで、実行できるコマンドの一覧

ディレクティブとは、ディレクティブと値をそれぞれ設定して、記述していくもので、範囲を指定できるものもある。

$ cat /etc/apache2.conf

コメントは省略

55 LockFile ${APACHE_LOCK_DIR}/accept.lock

62 PidFile ${APACHE_PID_FILE} 

プロセスIDを記録するファイル

67 Timeout 300

getリクエストの受け取りを待ち、post/putメソッド利用で次のtcpパケットが届くのを待ち、サーバがクライアントにレスポンスを返すのに、TCPでクライアントからのackが返ってくるまでの待ち時間に関する制限を秒数で指定する。

73 KeepAlive On ←環境によってチューニング

HTTPの持続的な接続を有効にする。例えばブラウザからあるページを要求された場合、そのページにリンクされていた画像についてもWebサーバにリクエストを送信する。HTML以外にも複数画像ファイルに対してGETメソッドを送信するのに、TCPコネクションを貼り直すが、 tcpコネクションを接続したままでHTTPメソッドを送信できれば、送受信パケットを抑えることができる。このコネクションをKeepAliveTimeoutディレクティブで指定された秒数だけ待つ。帯域の狭い環境ではKeepAliveをonにするのは効率的だが、広帯域の場合はKeepAliveをoffにしないとすでに使っていないプロセスが無駄に残ってシステム負荷になる可能性がある。

80 MaxKeepAliveRequests 100 86 KeepAliveTimeout 5

MPMとはクライアントからのリクエストの処理方法をモジュールに分けたもの。event mpm_netware prefork worker

利用するMPMの選択、チューニングはその上で利用するサーバサイド言語やwebフレームワーク、アクセス数、稼働するサーバのメモリ容量によって調整。

98 このモジュールが組み込まれている場合に指定したパラメータが有効になる StartServers 5 起動時に用意する子プロセス数 MinSpareServers 5 待機する子プロセスの最小値 MaxSpareServers 10 待機する子プロセスの最大値 MaxClients 150 ServerLimitとMaxClientsは作成するサーバプロセスと子プロセスの最大数で同じ数値を設定 MaxRequestsPerChild 0 子プロセスが扱えるリクエストの最大値を指定 104

preforkはクライアントからの1リクエストに1プロセスで対応するためにforkシステムコールを使って子プロセスを生成。forkでの子プロセス生成はメモリを独立して利用。アクセス数に応じて子プロセスを増やしていく。

116 StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxClients 150 MaxRequestsPerChild 0 124

133 StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxClients 150 MaxRequestsPerChild 0 141

eventMPMはworkerMPMをベースにしているが、処理している接続だけをマルチスレッドで行うことで効率的に処理するマルチプロセッシングモジュール。

144 User ${APACHE_RUN_USER} 145 Group ${APACHE_RUN_GROUP}

httpdを実行するユーザを指定する。

153 AccessFileName .htaccess 159  ファイルの先頭が.htで始まるファイル名を意味している Order allow,deny  Deny from all Satisfy all 163

デフォルトでは.htaccessが分散設定ファイル名に設定されている。

181 DefaultType None

192 HostnameLookups Off

ipアドレスでログに書き込むという指定

200 ErrorLog ${APACHE_LOG_DIR}/error.log

エラーログを記録するファイル名

207 LogLevel warn

記録するログの粒度を占める記述。デフォはworn

「 210 Include mods-enabled/.load 211 Include mods-enabled/.conf 214 Include httpd.conf 217 Include ports.conf 」他のファイルのの読み込み

224 LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined 225 LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 226 LogFormat "%h %l %u %t \"%r\" %>s %O" common 227 LogFormat "%{Referer}i -> %U" referer 228 LogFormat "%{User-agent}i" agent

ログへの記録フォーマットを定義

234 Include conf.d/ 237 Include sites-enabled/