Git メモ

はじめに

Gitの個人メモ。
文書中のコマンドもハイライトにしたかったけど、やり方がわからんかった・・・。

目次

インストール

インストールされている事が多いですが、念の為。yum install でインストールしよう。

[centos@ip-172-31-3-100 ~]$ sudo yum install git

git --version でバージョンが確認できればインストールは完了

[centos@ip-172-31-3-100 ~]$ git --version
git version 1.7.1
[centos@ip-172-31-3-100 ~]$

使い方

初期セットアップ

git config コマンドにパラメータを指定して、ユーザ名とメールアドレスを設定。これをしないとcommit 出来ないので、最初にやっておく。

[centos@ip-172-31-3-100 ~]$ git config --global user.email "hogehoge@domain.com"
[centos@ip-172-31-3-100 ~]$ git config --global user.name "hogehoge"

設定内容の確認方法。git config --list で全てのパラメータを確認出来る。--list を個別パラメータに変更すれば、個別に確認可能。

[centos@ip-172-31-3-100 shellscript]$ git config user.email
hogehogehoge@domain.com
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git config --list
user.email=hogehoge@domain.com
user.name=hogehoge
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=git@bitbucket.org:hogehoge/shellscript.git
branch.master.remote=origin
branch.master.merge=refs/heads/master
[centos@ip-172-31-3-100 shellscript]$

設定内容はいろいろな場所に保存される可能性が、基本的にはユーザのホームディレクトリの .gitconfig に保存されています。 修正したい場合は、対象ファイルをを直接編集してもOK。

[centos@ip-172-31-3-100 ~]$ cat ~/.gitconfig
[user]
        email = hogehoge@domain.com
        name = hogehoge
[centos@ip-172-31-3-100 ~]$

SSHのセットアップ

HTTPだと毎回パスフレーズ入力が必要なので、パスなしの秘密鍵を作成しておく。

秘密鍵の作成は、下記記事を参考。 chimay.hatenablog.com

公開鍵を確認して、Github,GitBucketなどのアカウント設定でSSH公開鍵を登録する

[centos@ip-172-31-3-100 .ssh]$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvXUH47WGmheQRJxtp3t572Srn6NLy/SdPvPstrtKz330B+il9xaNHhPkPRmqA3HtgkR/jKo4OFYX1oU7/ql0XLVt+E7JKnE/dyhkW893pP0ROOMB4lr1gA/h+GgAkB/JtYjGhMjbZrMc7NCGrB8x6o5cv6EI+b5e/tGSpj1JuokCI9/7w6J9ZaJkQuu65DaCBIJKXEMJZY3GU8klDdDZgQdQP2ANdmmCrefZfIZiYG0Aq4Fr+rdYXnijIqAjCHAgOa/12hcHhcIDeF0LUbYpvwN2HQ20jmu0ez7+9wA2NaGWPHZipRcP33o9+aZLs84mSUZ6aAw92dRJG6qO9F45uQ== centos@ip-172-31-3-100
[centos@ip-172-31-3-100 .ssh]$

秘密鍵の権限を確認する。
owner と group がユーザでかつ権限が 600 のみになっている事。

[centos@ip-172-31-3-100 ~]$ ls -la ~/.ssh/id_rsa
-rw-------. 1 centos centos 1675 Jun 24 21:31 /home/centos/.ssh/id_rsa
[centos@ip-172-31-3-100 ~]$

権限が異なる場合は、変更する

[centos@ip-172-31-3-100 ~]$ chown centos:centos /home/centos/.ssh/id_rsa
[centos@ip-172-31-3-100 ~]$ chmod 600 /home/centos/.ssh/id_rsa
[centos@ip-172-31-3-100 ~]$ ls -la ~/.ssh/id_rsa
-rw-------. 1 centos centos 1675 Jun 24 21:31 /home/centos/.ssh/id_rsa
[centos@ip-172-31-3-100 ~]$

リポジトリの複製

SSHの設定が問題なく登録できれば、パスなしでリモートからローカルに複製できる。URLは適宜置き換えてください。

[centos@ip-172-31-3-100 ~]$ git clone git@bitbucket.org:hogehoge/shellscript.git
Initialized empty Git repository in /home/centos/shellscript/.git/
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 21 (delta 7), reused 0 (delta 0)
Receiving objects: 100% (21/21), done.
Resolving deltas: 100% (7/7), done.
[centos@ip-172-31-3-100 ~]$

ブランチの確認

git branch コマンドで確認可能。-a オプションを付ける事で remote のbranch も確認出来ます。

[centos@ip-172-31-3-100 shellscript]$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
[centos@ip-172-31-3-100 shellscript]$

ブランチの作成

git branch コマンドの引数に作成したいブランチ名を指定。例ではローカルで開発用のdevというブランチを作成しています。作成するだけでは、ブランチが切り替わらない点も注意です。

[centos@ip-172-31-3-100 shellscript]$ git branch dev
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git branch -a
  dev
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
[centos@ip-172-31-3-100 shellscript]$

ブランチの切り替え

git checkout コマンドでブランチ名を指定する事でブランチが切り替わります。切り替わった事を確認したら、実際に編集してみる。

[centos@ip-172-31-3-100 shellscript]$ git checkout dev
Switched to branch 'dev'
[centos@ip-172-31-3-100 shellscript]$ git branch -a
* dev
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
[centos@ip-172-31-3-100 shellscript]$

変更履歴を確認する

git status コマンドを使って確認できる。変更前の確認。

[centos@ip-172-31-3-100 shellscript]$ git status
# On branch dev
nothing to commit (working directory clean)
[centos@ip-172-31-3-100 shellscript]$

新規ファイル(test.sh)を作成。再度、git status で変更履歴がしっかり表示されていることを確認

[centos@ip-172-31-3-100 shellscript]$ git status
# On branch dev
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test.sh
nothing added to commit but untracked files present (use "git add" to track)
[centos@ip-172-31-3-100 shellscript]$

変更差分を確認する

git diff コマンドで変更したファイルの変更差分を確認する事ができる。diff のあとにファイルを指定する事で特定ファイルのみの差分確認も可能。なお、空ファイルの作成では diff の結果として出力されなかった。

[centos@ip-172-31-3-100 shellscript]$ git status
# Not currently on any branch.
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   test2.sh
#
no changes added to commit (use "git add" and/or "git commit -a")
[centos@ip-172-31-3-100 shellscript]$ git diff
diff --git a/test2.sh b/test2.sh
index e69de29..48b1ba2 100644
--- a/test2.sh
+++ b/test2.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "Hellow World"
[centos@ip-172-31-3-100 shellscript]$

インデックスへの追加

commit の前に変更したファイルをインデックスに追加する必要がある。git add コマンドの引数にファイルパスを指定する事で、指定したファイルをインデックスに登録できる。

[centos@ip-172-31-3-100 shellscript]$ git add test.sh
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git status
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   test.sh
#
[centos@ip-172-31-3-100 shellscript]$

もし、誤って違うファイルを追加した場合でも git resetコマンドで対象ファイルを指定すればインデックスから削除する事が出来る

[centos@ip-172-31-3-100 shellscript]$ git reset test.sh
[centos@ip-172-31-3-100 shellscript]$ git status
# On branch dev
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test.sh
nothing added to commit but untracked files present (use "git add" to track)
[centos@ip-172-31-3-100 shellscript]$

複数ファイルを変更した場合だといちいちファイルを指定してられないので、git add --all (もしくは -A) を付与する事で全てのファイルを追加できる。

[centos@ip-172-31-3-100 shellscript]$ git status
# On branch dev
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test.sh
#       test2.sh
nothing added to commit but untracked files present (use "git add" to track)
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git add --all
[centos@ip-172-31-3-100 shellscript]$ git status
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   test.sh
#       new file:   test2.sh
#
[centos@ip-172-31-3-100 shellscript]$

コミットする

git commit コマンドでインデックスに登録した変更内容をコミットする。-m オプションでコミットメッセージを指定。コメントは必須なので、作業内容を誰が見てもわかるように解りやすく指定する。

[centos@ip-172-31-3-100 shellscript]$ git commit -m "initial commit"
[dev 439582b] initial commit
 1 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 test.sh
 create mode 100644 test2.sh
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git status
# On branch dev
nothing to commit (working directory clean)
[centos@ip-172-31-3-100 shellscript]$

なお、git commit コマンドに -a オプションを付与する事でインデックスへの登録とコミットを同時に行う事ができる。但し、削除・変更のみで 新規ファイルの追加は -a オプションではコミットされないので注意。

[centos@ip-172-31-3-100 shellscript]$ git status
# Not currently on any branch.
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   test2.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test3.sh
no changes added to commit (use "git add" and/or "git commit -a")
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git commit -a -m "create test3.sh"
[detached HEAD b206404] create test3.sh
 1 files changed, 3 insertions(+), 0 deletions(-)
[centos@ip-172-31-3-100 shellscript]$ git status
# Not currently on any branch.
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test3.sh
nothing added to commit but untracked files present (use "git add" to track)
[centos@ip-172-31-3-100 shellscript]$

コミットログを確認する

git log コマンドで変更履歴を確認する事ができる。--oneline を付与する事で、各コミットログを1行にまとめる事ができる。短縮されたハッシュ値でもコマンドの引数としては有効に動作します。

[centos@ip-172-31-3-100 shellscript]$ git log
commit 439582b1b43ae87e84e9bbaa8cade472ff57f835
Author: hogehoge <hogehogehoge@domain.com>
Date:   Sun Jun 26 19:48:08 2016 +0000

    initial commit
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git log --oneline
439582b initial commit
[centos@ip-172-31-3-100 shellscript]$

ファイルを削除する

git rm コマンドで不要なファイルを削除することができる。インデックスに登録済みの場合でも、-f を付与する事で削除できる。

[centos@ip-172-31-3-100 shellscript]$ git rm -f test2.sh
rm 'test2.sh'
[centos@ip-172-31-3-100 shellscript]$

特定のリビジョンに戻る

git checkout コマンドで特定のリビジョンのコミットハッシュ値を指定する事で、指定したリビジョンまで戻る事ができる。短縮されたハッシュ値でも有効。

[centos@ip-172-31-3-100 shellscript]$ git commit -m "delete test2.sh"
[detached HEAD 0ff40e8] delete test2.sh
 0 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test2.sh
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git log --oneline
0ff40e8 delete test2.sh
439582b initial commit
2bf942c 変数化
5417639 new file
61979b7 backup2s3 created online with Bitbucket
6fa1a30 sendmessage_perl.sh created online with Bitbucket
1d79198 swap.sh created online with Bitbucket
ccabd68 create check_access.sh
6be6f02 Initial commit with contributors
[centos@ip-172-31-3-100 shellscript]$ git checkout 439582b
Previous HEAD position was 0ff40e8... delete test2.sh
HEAD is now at 439582b... initial commit
[centos@ip-172-31-3-100 shellscript]$

未登録のファイルを削除する

git cleanを使う事で未登録ファイルを削除する事ができる。未登録とは git status コマンドで Untracked になっているファイルの事。この例だと、test3.sh のみインデックスに登録したのでそれ以外は削除される事になる。デフォルトの設定では -f オプションを付与しないと事故防止の意味合いもあって、エラーになる。clean.requireForce という設定値を変更する事で、変えられるがあまりお勧めはしない。

また、-n オプションを付与する事で削除対象ファイルを確認する事ができる。削除はくれぐれも慎重に!

[centos@ip-172-31-3-100 shellscript]$ touch test{3..30}.sh
[centos@ip-172-31-3-100 shellscript]$ git add test3.sh
[centos@ip-172-31-3-100 shellscript]$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   test3.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test10.sh
#       test11.sh
#       test12.sh
#       test13.sh
#       test14.sh
#       test15.sh
#       test16.sh
#       test17.sh
#       test18.sh
#       test19.sh
#       test20.sh
#       test21.sh
#       test22.sh
#       test23.sh
#       test24.sh
#       test25.sh
#       test26.sh
#       test27.sh
#       test28.sh
#       test29.sh
#       test30.sh
#       test4.sh
#       test5.sh
#       test6.sh
#       test7.sh
#       test8.sh
#       test9.sh
[centos@ip-172-31-3-100 shellscript]$ git clean -n
Would remove test10.sh
Would remove test11.sh
Would remove test12.sh
Would remove test13.sh
Would remove test14.sh
Would remove test15.sh
Would remove test16.sh
Would remove test17.sh
Would remove test18.sh
Would remove test19.sh
Would remove test20.sh
Would remove test21.sh
Would remove test22.sh
Would remove test23.sh
Would remove test24.sh
Would remove test25.sh
Would remove test26.sh
Would remove test27.sh
Would remove test28.sh
Would remove test29.sh
Would remove test30.sh
Would remove test4.sh
Would remove test5.sh
Would remove test6.sh
Would remove test7.sh
Would remove test8.sh
Would remove test9.sh
[centos@ip-172-31-3-100 shellscript]$
[centos@ip-172-31-3-100 shellscript]$ git clean -f
Removing test10.sh
Removing test11.sh
Removing test12.sh
Removing test13.sh
Removing test14.sh
Removing test15.sh
Removing test16.sh
Removing test17.sh
Removing test18.sh
Removing test19.sh
Removing test20.sh
Removing test21.sh
Removing test22.sh
Removing test23.sh
Removing test24.sh
Removing test25.sh
Removing test26.sh
Removing test27.sh
Removing test28.sh
Removing test29.sh
Removing test30.sh
Removing test4.sh
Removing test5.sh
Removing test6.sh
Removing test7.sh
Removing test8.sh
Removing test9.sh
[centos@ip-172-31-3-100 shellscript]$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   test3.sh
#
[centos@ip-172-31-3-100 shellscript]$

まとめ

まだまだできる事があるので、気が向いたら随時アップデートしていきます。

ssh-keygen まとめ

はじめに

ssh-keygen のよく使うオプションをまとめてみた。

作成

オプションなし

特にオプションなしでも作れる。この場合、OpenSSHのバージョン依存で bitや鍵の種類が決まるのであまりお勧めはしない。

[centos@ip-172-31-3-100 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/centos/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/centos/.ssh/id_rsa.
Your public key has been saved in /home/centos/.ssh/id_rsa.pub.
The key fingerprint is:
fb:f2:a0:05:3b:62:cf:cf:42:3a:87:c6:16:53:e4:a1 centos@ip-172-31-3-100
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|      o          |
|     + .         |
|    E o          |
|     .. S        |
|    o .o .       |
|   .o*o +        |
|   .B+o=.o       |
|   o o+oooo      |
+-----------------+
[centos@ip-172-31-3-100 ~]$

bit 指定

-b でbit 指定。今なら 2048bit 以上が推奨。

[centos@ip-172-31-3-100 ~]$ ssh-keygen -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/centos/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/centos/.ssh/id_rsa.
Your public key has been saved in /home/centos/.ssh/id_rsa.pub.
The key fingerprint is:
da:02:a4:c1:7b:2b:d7:f7:19:1c:15:7f:bf:00:79:06 centos@ip-172-31-3-100
The key's randomart image is:
+--[ RSA 4096]----+
|           E.    |
| .          oo   |
|  o .      o.o. .|
|   =       .+  ..|
|  o o   S .  .  .|
|   . + o . .  . .|
|  . o + o o    . |
|   o   o . o     |
|          o      |
+-----------------+
[centos@ip-172-31-3-100 ~]$

鍵の種類の指定

SSH1 しか使えないような環境であれば、rsa1 を指定*1。それ以外であれば、rsa で問題なし。

[centos@ip-172-31-3-100 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/centos/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/centos/.ssh/id_rsa.
Your public key has been saved in /home/centos/.ssh/id_rsa.pub.
The key fingerprint is:
68:d2:72:a3:65:33:dd:16:1f:59:82:a2:5c:33:f0:a6 centos@ip-172-31-3-100
The key's randomart image is:
+--[ RSA 2048]----+
|      ..   .. .  |
|       .= .  +   |
|     . oo+. o    |
|     .o= . o .   |
|    o E S o .    |
|     O + .       |
|    .            |
|                 |
|                 |
+-----------------+
[centos@ip-172-31-3-100 ~]$

ワンライナー

-q で標準出力無効、-f で鍵の保存場所、-N でパスフレーズを指定出来る。

[centos@ip-172-31-3-100 ~]$ ssh-keygen -q -f /home/centos/.ssh/id_rsa -N hogehoge
[centos@ip-172-31-3-100 ~]$

管理

パスワード変更

既存の鍵ファイルのパスワード変更。-f で古い秘密鍵ファイルを指定していますが、指定なければ対話式でファイルパスを入力します。

[centos@ip-172-31-3-100 ~]$ ssh-keygen -p -f /home/centos/.ssh/id_rsa.
Enter old passphrase:
Key has comment '/home/centos/.ssh/id_rsa.'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
[centos@ip-172-31-3-100 ~]$

公開鍵の再生成

秘密鍵から公開鍵を再生成する。-f オプションがなくした場合はファイルパスを聞かれます。

[centos@ip-172-31-3-100 ~]$ ssh-keygen -y -f /home/centos/.ssh/id_rsa
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtzibgUiUJs/MOO/Jl1Xt3ZcEhcHdQWJ8pv4WV1/WYXTMZYS7pEE+PmnegefV3Nf/3wgRePJf7Ac2myheTeFe8hnzw6UT8Hzs8Ijg8XB0YKeUFh2vSKnK1cTTW6ZgA9GA3KEm1EMqakgXCMgQjdCtM2Vn+eTIUvY7WHOyzrOrRmP+l4OWOOc6Y7tagiEdMAymcW5DQl4FU0kk7HQBHTC05naw1Rz7DkcYVdZ74od5lfMlqgfAlTZwqOIPSt5y7paxbRzhjci1CqEyf8JAjvH7AiPudpDTR/eT4hZtmlMuM8XM4kZDMhBu5Y9umzdyuIpVwMOVJecFBXEvO0xMBMdPOQ==
[centos@ip-172-31-3-100 ~]$

まとめ

鍵生成程度なら、TereTermやPutty単体でも作成出来る。 もっと知りたい人は、man ssh-keygen で!

*1:そもそも、SSH1は脆弱性があるのでSSH2にすべき

alternatives コマンドによる複数バージョンの使い分け

はじめに

AmazonLinuxでは、各種ソフトウェアが複数バージョンで用意されている事が多いです。
一例を上げると、Java,ruby,python などがあります。

[root@ip-172-31-11-130 ~]# ruby
ruby     ruby2.0  ruby2.3
[root@ip-172-31-11-130 ~]# ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux-gnu]
[root@ip-172-31-11-130 ~]#

この場合、ruby2.3をアンインストールしないと /usr/bin/ruby を使って ruby2.0 が使えないのかというとそんなことはありません。

alternatives コマンドによる切り替え

[root@ip-172-31-11-130 ~]# ll /usr/bin/ruby*
lrwxrwxrwx 1 root root   22 Jun 10 16:26 /usr/bin/ruby -> /etc/alternatives/ruby
-rwxr-xr-x 1 root root 5592 Jan 14 21:04 /usr/bin/ruby2.0
-rwxr-xr-x 1 root root 5576 Feb 24 22:23 /usr/bin/ruby2.3
[root@ip-172-31-11-130 ~]# ll /etc/alternatives/ruby
lrwxrwxrwx 1 root root 16 Jun 10 16:26 /etc/alternatives/ruby -> /usr/bin/ruby2.3
[root@ip-172-31-11-130 ~]#

このコマンド結果の通り、シンボリックリンクで実体の向け先を変えている事がわかります。 この向け先変更を行うコマンドが alternatives です。

類似するソフトウェアの切り替えなどで使われていましたが、こういうケースでも利用出来ます(sendmail,postfixの切り替えなど)。

変更方法

今回試しているAmazonLinuxの環境では、ruby2.0とruby2.3のパッケージをインストールしています。

[root@ip-172-31-11-130 ~]# alternatives --display ruby
ruby - status is manual.
 link currently points to /usr/bin/ruby2.3
/usr/bin/ruby2.0 - priority 2000
 slave erb: /usr/bin/erb2.0
 slave gem: /usr/bin/gem2.0
 slave irb: /usr/bin/irb2.0
 slave rake: /usr/bin/rake2.0
 slave rdoc: /usr/bin/rdoc2.0
 slave ri: /usr/bin/ri2.0
 slave testrb: /usr/bin/testrb2.0
 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.0.pc
 slave erb.1: /usr/share/man/man1/erb2.0.1.gz
 slave irb.1: /usr/share/man/man1/irb2.0.1.gz
 slave rake.1: /usr/share/man/man1/rake2.0.1.gz
 slave ri.1: /usr/share/man/man1/ri2.0.1.gz
 slave ruby.1: /usr/share/man/man1/ruby2.0.1.gz
/usr/bin/ruby2.3 - priority 230
 slave erb: /usr/bin/erb2.3
 slave gem: /usr/bin/gem2.3
 slave irb: /usr/bin/irb2.3
 slave rake: /usr/bin/rake2.3
 slave rdoc: /usr/bin/rdoc2.3
 slave ri: /usr/bin/ri2.3
 slave testrb: (null)
 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.3.pc
 slave erb.1: /usr/share/man/man1/erb2.3.1.gz
 slave irb.1: /usr/share/man/man1/irb2.3.1.gz
 slave rake.1: /usr/share/man/man1/rake2.3.1.gz
 slave ri.1: /usr/share/man/man1/ri2.3.1.gz
 slave ruby.1: /usr/share/man/man1/ruby2.3.1.gz
Current `best' version is /usr/bin/ruby2.0.
[root@ip-172-31-11-130 ~]#

--display でどちらのrubyが使われているかがわかります。また、表示されているように各種ライブラリなども切り替わります。gemもちゃんと切り替わってくれるので安心ですね。

[root@ip-172-31-11-130 ~]# alternatives --config ruby

There are 2 programs which provide 'ruby'.

  Selection    Command
-----------------------------------------------
*  1           /usr/bin/ruby2.0
 + 2           /usr/bin/ruby2.3

Enter to keep the current selection[+], or type selection number: 1
[root@ip-172-31-11-130 ~]#

--config で切り替える事が出来ます。

[root@ip-172-31-11-130 ~]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
[root@ip-172-31-11-130 ~]#

ちゃんとバージョンが変わっていますね。
ちなみに、--display で再度確認してみると全て切り替わっている事が分かります。

[root@ip-172-31-11-130 ~]# alternatives --display ruby
ruby - status is manual.
 link currently points to /usr/bin/ruby2.0
/usr/bin/ruby2.0 - priority 2000
 slave erb: /usr/bin/erb2.0
 slave gem: /usr/bin/gem2.0
 slave irb: /usr/bin/irb2.0
 slave rake: /usr/bin/rake2.0
 slave rdoc: /usr/bin/rdoc2.0
 slave ri: /usr/bin/ri2.0
 slave testrb: /usr/bin/testrb2.0
 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.0.pc
 slave erb.1: /usr/share/man/man1/erb2.0.1.gz
 slave irb.1: /usr/share/man/man1/irb2.0.1.gz
 slave rake.1: /usr/share/man/man1/rake2.0.1.gz
 slave ri.1: /usr/share/man/man1/ri2.0.1.gz
 slave ruby.1: /usr/share/man/man1/ruby2.0.1.gz
/usr/bin/ruby2.3 - priority 230
 slave erb: /usr/bin/erb2.3
 slave gem: /usr/bin/gem2.3
 slave irb: /usr/bin/irb2.3
 slave rake: /usr/bin/rake2.3
 slave rdoc: /usr/bin/rdoc2.3
 slave ri: /usr/bin/ri2.3
 slave testrb: (null)
 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.3.pc
 slave erb.1: /usr/share/man/man1/erb2.3.1.gz
 slave irb.1: /usr/share/man/man1/irb2.3.1.gz
 slave rake.1: /usr/share/man/man1/rake2.3.1.gz
 slave ri.1: /usr/share/man/man1/ri2.3.1.gz
 slave ruby.1: /usr/share/man/man1/ruby2.3.1.gz
Current `best' version is /usr/bin/ruby2.0.
[root@ip-172-31-11-130 ~]#

まとめ

AmazonLinuxのパッケージを利用したメジャーバージョンアップでも使えるかもしれないですね。 なお、自分でビルドしたrubyパッケージを対象にしたい場合は自分で管理対象に追加する必要があります。

詳しくは、下記参考ページがとても詳細に解説されています。 alternatives による標準コマンドの切り替え

Install Jenkins on Amazon Linux

はじめに

JenkinsをAmazon Linuxにインストールした際のメモ

EC2作成

Jenkins requires Java7 or above to function. Java8 is recommended. Jenkins requires a fair amount of memory to operate well. Smaller installations should start around 256MB-1GB.

256MBから1GBとあるので t2.micro で作成し必要に応じてスペック変更を行います。

やっておくべきこと

  • Jenkinsはデフォルトで tcp/8080 を使うのでSecurityGroupで開放しておく
  • IAM roleの権限を最小限で良いので作成時に割り当てておく

インストール

パッケージが提供されているので、yumコマンドでインストール出来ます。

Jenkins

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins

Java

AmazonLinuxにOpenJDK 1.7 が既にインストール済みなので、そのまま利用

起動

sudo service jenkins start/stop/restart
sudo chkconfig jenkins on

初期パスワードの確認

cat /var/lib/jenkins/secrets/initialAdminPassword

まとめ

http://IPアドレス:8080
にアクセスして、下記画面が表示されたら確認した初期パスワードでログイン

f:id:nanashimei:20160610225036j:plain

あとは必要に応じてプラグインのインストールを行ってください。
パッケージ化されているので、非常に簡単ですね。それでは、良い CI を!

参考

Installing Jenkins - Jenkins - Jenkins Wiki

NFSの統計情報

はじめに

メモ書きです。間違っている箇所があるかもしれませんが、ご容赦ください。

調査方法

クライアントとサーバ側でそれぞれ取得出来る情報でわけてみます。

NFSクライアント

nfsstat

nfsstatコマンドは、NFS の統計情報を表示するコマンドです。オプションを使い分ける事で、サーバ側とクライアント側の統計情報を見る事が出来ます。
/proc/net/rpc/nfs のデータを利用しています。

オプションの意味

  -s     サーバ側の統計のみを表示する。デフォルトではサーバとクライアント両者の統計を表示する。

  -c     クライアント側の統計のみを表示する。

  -n     NFS の統計のみを表示する。デフォルトでは NFS と RPC 両者の情報を表示する。

  -r     RPC の統計のみを表示する。
# nfsstat -c
Client rpc stats:
calls      retrans    authrefrsh
450        2          452

Client nfs v4:
null         read         write        commit       open         open_conf
0         0% 56        0% 40        0% 0         0% 48        0% 19        0%
open_noat    open_dgrd    close        setattr      fsinfo       renew
0         0% 0         0% 585996    0% 36112     0% 6         0% 0         0%
setclntid    confirm      lock         lockt        locku        access
1         0% 1         0% 616957    0% 0         0% 35        0% 2         0%
getattr      lookup       lookup_root  remove       rename       link
865149    0% 6130763   2% 2         0% 8         0% 13        0% 0         0%
symlink      create       pathconf     statfs       readlink     readdir
0         0% 1         0% 4         0% 584       0% 0         0% 623      94%
server_caps  delegreturn  getacl       setacl       fs_locations rel_lkowner
10        0% 0         0% 0         0% 0         0% 0         0% 598877    0%
secinfo      exchange_id  create_ses   destroy_ses  sequence     get_lease_t
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
reclaim_comp layoutget    getdevinfo   layoutcommit layoutreturn getdevlist
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
(null)
0         0%

#
# cat /proc/net/rpc/nfs
net 0 0 0 0
rpc 662 2 484
proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
proc3 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
proc4 48 0 75 15 0 59 55 0 0 708 04 6 0 1 1 57 0 55 4 23 48 2 13 11 0 0 1 4 56 0 783 10 0 0 0 0 19 0 0 0 0 0 0 0 0 0 0 0 0
#

-m オプションを使う事で、マウントポジションのオプションもわかる

# nfsstat -m
/var/www from 192.168.1.1:/var/www
 Flags: rw,relatime,vers=4,rsize=8192,wsize=8192,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.2,minorversion=0,local_lock=none,addr=192.168.1.1

#
nfsiostat

nfsiostatコマンドは、マウントポジション毎の iostat をエミュレートしてくれるコマンドです。 普段から iostat を見ている人であれば、馴染みやすいですね。

# nfsiostat 1

192.168.1.1:/var/www:

   op/s         rpc bklog
1499.72            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  4.787          21.138           4.415        0 (0.0%)           2.601           2.750
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  4.047          21.863           5.403        0 (0.0%)          27.929          27.960

192.168.1.1:/var/www:

   op/s         rpc bklog
   0.00            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.000           0.000           0.000        0 (0.0%)           0.000           0.000
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.000           0.000           0.000        0 (0.0%)           0.000           0.000

192.168.1.1:/var/www:

   op/s         rpc bklog
  12.00            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  2.000           4.184           2.092        0 (0.0%)           0.000           0.000
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  1.000           2.723           2.723        0 (0.0%)          30.000          30.000

見慣れないパラメータの意味。
上から、再送回数、クライアントからRPCリクエストが受信されるまでの平均時間、クライアントからRPCリクエストが完了するまでの時間。

          - retrans
                 This is the number of retransmissions.
          - avg RTT (ms)
                 This is the duration from the time that client's
                 kernel sends the RPC request until the time it
                 receives the reply.
          - avg exe (ms)
                 This is the duration from the time that NFS client
                 does the RPC request to its kernel until the RPC
                 request is completed, this includes the RTT time
                 above.

サーバ側

nfsstat

クライアント側で紹介した nfsstat コマンドのサーバ側で実行した場合の出力 こちらは /proc/net/rpc/nfsd のデータを利用しています。

$ sudo nfsstat -s
Server rpc stats:
calls      badcalls   badclnt    badauth    xdrcall
629        0          0          0          0

Server nfs v4:
null         compound
4         0% 608 99%

Server nfs v4 operations:
op0-unused   op1-unused   op2-future   access       close        commit
0         0% 0         0% 0         0% 3         0% 6         0% 0         0%
create       delegpurge   delegreturn  getattr      getfh        link
1         0% 0         0% 0         0% 40        1% 42        1% 0         0%
lock         lockt        locku        lookup       lookup_root  nverify
15        0% 0         0% 4         0% 47  1% 0         0% 0         0%
open         openattr     open_conf    open_dgrd    putfh        putpubfh
12        0% 0         0% 3         0% 0         0% 459      48% 0         0%
putrootfh    read         readdir      readlink     remove       rename
4         0% 25        0% 856      46% 0         0% 9         0% 5         0%
renew        restorefh    savefh       secinfo      setattr      setcltid
2         0% 0         0% 5         0% 0         0% 3         0% 3         0%
setcltidconf verify       write        rellockowner bc_ctl       bind_conn
3         0% 0         0% 4         0% 17        0% 0         0% 0         0%
exchange_id  create_ses   destroy_ses  free_stateid getdirdeleg  getdevinfo
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
getdevlist   layoutcommit layoutget    layoutreturn secinfononam sequence
0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
set_ssv      test_stateid want_deleg   destroy_clid reclaim_comp
0         0% 0         0% 0         0% 0         0% 0         0%

$
# cat /proc/net/rpc/nfsd
rc 0 2891 2622
fh 0 0 0 0 0
io 2551 1159
th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
ra 32 0 0 0 0 0 0 0 0 0 0 0
net 321 0 512 4
rpc 279 0 0 0 0
proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
proc3 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
proc4 2 4 854
proc4ops 59 0 0 0 857 149 0 1 0 0 38 68 0 29 0 86 38 0 0 30 0 2 0 68 0 4 13 28 0 6 25 2 0 15 0 66 3 3 0 18 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#

それぞれの値の見方は下記記事が参考になります。

NFS/トラブルシューティング - ArchWiki

まとめ

ブログを継続させるのって、難しい!

AWS 認定ソリューションアーキテクト – プロフェッショナル の受験メモ

はじめに

AWSのソリューションアーキテクトのアソシエイトを取得していたのですが、4月で切れるために上位資格であるプロフェッショナルを受験した際のメモです。結果は一応、合格していますが 66% と本当にギリギリでした。

情報収集

AWSの資格全てに言えますが、いわゆる対策本がありません。
出題範囲を確認して、やるべき範囲の確認から始めました。

出題される分野は問題を見た際に、どの分野の問いなのか判断つくように覚えておくと良いと思います。

あとは、既に合格されている方の記事も参考にさせて頂きました。

以下、参考にさせて頂いた方

qiita.com

blog.manabusakai.com

yomon.hatenablog.com

皆様、ありがとうございました!

サンプル問題

公開されている サンプル問題を解いてみます。

有り難い事に答えも載っているので、サンプル問題の答えとその理由を説明できるようになりましょう。
追加でやった方が良いと思っているのが、他の試験問題のサンプル問題も解いてみる事です。同様に答えと理由が説明できるようになるといいと思います。

ドキュメント参照

AWSのドキュメントは非常に解りやすく書いてあり、普段触るプロダクトでも知らない事に気付けます。 他の皆様が書いてありますが、ドキュメントを読むだけではなく、コンソールから実際に操作してみる事をおすすめします。

Black Belt Tech シリーズも理解を深める助けとなりますが、最終的にはドキュメントが一番だと思います。

模擬試験

途中で疲れて、模擬試験をいきなり申し込んで受けてみました。
ですが、この模擬試験も結構疲れますw
ある程度体調を整えて、受けた方が良いと思います。

受験の際、問いがどの分野に対するものなのかを意識して回答するように意識してみました。
結果は散々でしたが、ここで出題されるプロダクトを最低限覚えておくと良いと思います。これでどのドキュメントを読めば良いかある程度限定できると思います。

AWS Cloud Design Pattern の参照

AWS-CloudDesignPatternAWSのベストプラクティスを頭に入れました。

各CDPは1ページにうまくまとめられているので、非常に読みやすいですね。業務でも役に立つので、全部覚えると良いと思います。

ホワイトペーパー 参照

私は時間があまりなかった関係で参照出来ていませんが、日本語のホワイトペーパーもあるので最低限そこぐらいは読んでおきましょう。

アソシエイトの受験

どうせ勉強するならと思い、他のアソシエイトも取得しようと考え申し込んで受験しました。結果は2つとも合格でした。

AWS 認定デベロッパー – アソシエイト AWS 認定システムオペレーション(SysOps)アドミニストレーター – アソシエイト

受験当日

試験時間が170分もある試験なので、体調管理が非常に重要です。
後悔する事になるので、間違っても前日に夜更かしするのは避けましょう!

眠くならないように食べ過ぎも注意です。可能なら、試験は午前中とかに入れると集中力も増すと思います。

まとめ

結果はギリギリで合格していますが、正直もう少し高いだろうと思っていたところがありました。なので、間違って覚えている事があると思います。今後はDevOpsの取得を目指して、もう少し勉強してみます。

あと、この試験に合格する人なら他のアソシエイト試験も全部合格すると思いますので、一緒に受けると良いと思います。

おすすめ書籍

CDPの書籍です。業務で触ることが多い人は本で持っておいても損はないと思います。

Linuxの負荷調査

はじめに

前回は負荷について書きました。 chimay.hatenablog.com

今回は、Linux OSにおける各リソースの利用状況の調査方法をまとめてみます。 インフラエンジニアの道具となるためのコマンドがほとんどなので、それぞれのコマンドの特徴を理解して使い分けができるようにしましょう。

※環境は、Amazon Linux を利用

負荷調査の流れ

大まかな流れ

  1. 現状把握
  2. 原因調査
  3. 復旧対処

現状把握

まずは、サーバで発生している状況を理解しない事には始まりません。 CPU、メモリ、トラフィック、ディスクの使用率を調査しましょう。

筆者は下記の順番で見る事が多いです。LoadAverageは全体把握のためですが、それ以外の理由は可能性が高いと考えている順番です。

1.LoadAverage
2.CPU使用率
3.メモリ使用率
4.ディスク使用率
5.トラフィック使用率

LoadAverage

まずは、LoadAverageです。 サーバの負荷状態を数値化したようなものだと思ってください。高ければ高いほど、サーバ負荷は高いです。 但し、CPU数に依存するので LoadAverage / CPU数 でサーバ毎に計算してください。

uptime

現在時刻、稼働時間、ログインユーザ数、load average がわかります。

$ uptime
 07:53:23 up  1:20,  1 user,  load average: 0.00, 0.01, 0.02
$
w

uptime でわかる情報にプラスで、実際にログインしているユーザとログイン元、ログイン時間などがわかります。調査時は、uptime よりも w で済ませる事の方が多いと思います。
スクリプトでデータを取得する際は uptime の方がデータ加工しやすいです。

$ w
 07:01:57 up 28 min,  1 user,  load average: 0.00, 0.01, 0.01
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
ec2-user pts/0    xxx.xxx.xxx.xxx 07:00    4.00s  0.00s  0.00s w
$

CPU使用率

CPU使用率が高い原因が、CPU不足なのか 処理待ちによる wait値の上昇なのかを見るようにしましょう。

top

出力される情報が多く、リアルタイムで情報が更新されるので 負荷調査時にはよく使われます。オプションが非常に多いので、詳細は割愛します。

$ top
top - 08:01:05 up  1:27,  1 user,  load average: 0.00, 0.01, 0.02
Tasks:  69 total,   1 running,  68 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.1%sy,  0.0%ni, 99.7%id,  0.1%wa,  0.0%hi,  0.0%si,  0.1%st
Mem:    503380k total,   253740k used,   249640k free,    67308k buffers
Swap:        0k total,        0k used,        0k free,    90516k cached
sar

このコマンドもオプションを使い分ける事でいろいろな情報を確認出来ます。詳細はそのうち別記事で書きます。リアルタイムで見たい場合は、 1 のオプションを付与しましょう。

※1 は実際には間隔(秒)の指定なので、5 を付与すれば 5秒間隔で出力出来ます。

$ sar
Linux 4.1.13-19.31.amzn1.x86_64 (igrashi)       05/03/2016      _x86_64_        (1 CPU)

06:33:15 AM       LINUX RESTART

06:40:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
06:50:01 AM     all      0.00      0.00      0.00      0.01      0.00     99.99
07:00:01 AM     all      0.01      0.00      0.01      0.01      0.00     99.97
07:10:01 AM     all      0.01      0.00      0.01      0.02      0.00     99.96
07:20:01 AM     all      0.00      0.00      0.01      0.01      0.00     99.99
$ sar 1
Linux 4.1.13-19.31.amzn1.x86_64 (labo)  05/03/2016      _x86_64_        (1 CPU)

09:00:30 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
09:00:31 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
09:00:32 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
09:00:33 AM     all      0.99      0.00      0.00      0.00      0.00     99.01
09:00:34 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
09:00:35 AM     all      0.00      0.00      0.99      0.00      0.00     99.01
09:00:36 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
09:00:37 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
09:00:38 AM     all      0.00      0.00      0.99      0.00      0.00     99.01
^C
$

メモリ使用率

スパップアウトが発生しているかどうかを確認するようにしましょう。

free

Amazon Linuxでは、-a オプションを付与する事をおすすめします。available という列が追加されて表示されます。これは、buffers/cacheの開放できるメモリを含めた空き容量になります。

$ free -a
             total       used       free     shared    buffers     cached  available
Mem:        503380     255532     247848         60      67484      91988     455580
-/+ buffers/cache:      96060     407320
Swap:            0          0          0
$
vmstat

とはいえ、リアルタイムでスパップアウトが発生しているかどうかはこちらのコマンドでの確認になります。si と so がそれぞれスパップインとスパップアウトになります。

※1行目は過去の統計データなので、無視してください。

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 247748  67528  91988    0    0    27     3   11   18  0  0 100  0  0
 0  0      0 247732  67528  91988    0    0     0     0   13   17  0  0 100  0  0
 0  0      0 247732  67528  91988    0    0     0     0    9   12  0  0 100  0  0
 0  0      0 247732  67528  91988    0    0     0     0   13   21  0  0 100  0  0
 0  0      0 247732  67528  91988    0    0     0     0   12   18  0  0 100  0  0
cat /proc/meminfo

実はいろいろ用意されているコマンドは /proc 配下に格納されている情報を読み込んで整形しているだけだったりします。なので、直接該当ファイルを開いてもOKです。

※当然ですが、意味がわかるかどうかは別にして、こちらの方が情報量は多いです。

$ cat /proc/meminfo
MemTotal:         503380 kB
MemFree:          247716 kB
MemAvailable:     455520 kB
Buffers:           67552 kB
Cached:            91988 kB
SwapCached:            0 kB
Active:           133556 kB
Inactive:          43148 kB
Active(anon):      17164 kB
Inactive(anon):       52 kB
Active(file):     116392 kB
Inactive(file):    43096 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         17184 kB
Mapped:            15804 kB
Shmem:                60 kB
Slab:              67904 kB
SReclaimable:      58876 kB
SUnreclaim:         9028 kB
KernelStack:        1376 kB
PageTables:         2540 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      251688 kB
Committed_AS:      65324 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        1560 kB
VmallocChunk:   34359732383 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       22528 kB
DirectMap2M:      501760 kB
$

ディスク使用率

意外と100%になるディスク使用率。100%になると、新しいファイルの生成が出来なくなるのでシステムの挙動がおかしくなります。なので、確実に確認はしておきましょう。

df

使用量を確認する事が出来ます。ついでに、i-node も確認すると尚良。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  3.7G  4.0G  49% /
devtmpfs        237M   56K  237M   1% /dev
tmpfs           246M     0  246M   0% /dev/shm
$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 165728 358560   32% /
devtmpfs        60669    430  60239    1% /dev
tmpfs           62922      1  62921    1% /dev/shm
$
iostat

リアルタイムでI/O状況の確認には、iostatを利用しましょう。先程紹介した、vmstat の bi と bo を見ることでもI/Oを確認する事が出来ます。

$ iostat
Linux 4.1.13-19.31.amzn1.x86_64 (labo)  05/03/2016      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.08    0.00    0.05    0.09    0.08   99.70

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
xvda              3.06        53.48        13.99     388969     101776

$

トラフィック使用率

sar -n DEV

sar のオプションの1つで過去のトラフィック値を確認出来ます。こちらもオプションに 1 を付与する事でリアルタイムで確認する事が出来ます。

$ sar -n DEV
Linux 4.1.13-19.31.amzn1.x86_64 (igrashi)       05/03/2016      _x86_64_        (1 CPU)

06:33:15 AM       LINUX RESTART

06:40:01 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
06:50:01 AM      eth0      0.11      0.11      0.01      0.01      0.00      0.00      0.00
06:50:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:00:01 AM      eth0      0.12      0.12      0.01      0.01      0.00      0.00      0.00
07:00:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:10:01 AM      eth0      0.24      0.24      0.02      0.03      0.00      0.00      0.00
07:10:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:20:01 AM      eth0      0.10      0.10      0.01      0.01      0.00      0.00      0.00
07:20:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
ifstat

リアルタイムの確認には、ifstat などもあります。

$ ifstat
#kernel
Interface        RX Pkts/Rate    TX Pkts/Rate    RX Data/Rate    TX Data/Rate
                 RX Errs/Drop    TX Errs/Drop    RX Over/Rate    TX Coll/Rate
lo                     2 0             2 0           140 0           140 0
                       0 0             0 0             0 0             0 0
eth0                8495 0          6041 0         5656K 0         1769K 0
                       0 0             0 0             0 0             0 0
$
ifstatus

視覚的に判りやすいのコマンドでは、ifstatus などがあります。 テキストだと解りづらいので、キャプチャです。

f:id:nanashimei:20160503082548j:plain

原因調査

ある程度リソースの利用状況がわかったら、次はそれを引き起こしている原因(プロセス)の特定です。

ps

psコマンドでは各プロセス毎のリソースの利用状況がわかるので、前もって調べておいた情報を元に特定しましょう。

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4  19644  2496 ?        Ss   06:33   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    06:33   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    06:33   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   06:33   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    06:33   0:00 [kworker/u30:0]
root         7  0.0  0.0      0     0 ?        S    06:33   0:00 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    06:33   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    06:33   0:00 [migration/0]
root        10  0.0  0.0      0     0 ?        S<   06:33   0:00 [khelper]
root        11  0.0  0.0      0     0 ?        S    06:33   0:00 [kdevtmpfs]
root        12  0.0  0.0      0     0 ?        S<   06:33   0:00 [netns]
root        13  0.0  0.0      0     0 ?        S<   06:33   0:00 [perf]
root        14  0.0  0.0      0     0 ?        S    06:33   0:00 [kworker/u30:1]
root        16  0.0  0.0      0     0 ?        S    06:33   0:00 [xenwatch]
root        21  0.0  0.0      0     0 ?        S    06:33   0:00 [xenbus]
root        22  0.0  0.0      0     0 ?        S    06:33   0:00 [kworker/0:1]
root       124  0.0  0.0      0     0 ?        S    06:33   0:00 [khungtaskd]
root       125  0.0  0.0      0     0 ?        S<   06:33   0:00 [writeback]
root       127  0.0  0.0      0     0 ?        SN   06:33   0:00 [ksmd]
root       128  0.0  0.0      0     0 ?        S<   06:33   0:00 [crypto]
root       129  0.0  0.0      0     0 ?        S<   06:33   0:00 [kintegrityd]
root       130  0.0  0.0      0     0 ?        S<   06:33   0:00 [bioset]
root       132  0.0  0.0      0     0 ?        S<   06:33   0:00 [kblockd]
root       479  0.0  0.0      0     0 ?        S<   06:33   0:00 [md]
root       610  0.0  0.0      0     0 ?        S    06:33   0:00 [kswapd0]
root       681  0.0  0.0      0     0 ?        S    06:33   0:00 [fsnotify_mark]
root       696  0.0  0.0      0     0 ?        S<   06:33   0:00 [kthrotld]
root       740  0.0  0.0      0     0 ?        S<   06:33   0:00 [deferwq]
root      1366  0.0  0.0      0     0 ?        S<   06:33   0:00 [ata_sff]
root      1380  0.0  0.0      0     0 ?        S    06:33   0:00 [scsi_eh_0]
root      1381  0.0  0.0      0     0 ?        S<   06:33   0:00 [scsi_tmf_0]
root      1391  0.0  0.0      0     0 ?        S    06:33   0:00 [scsi_eh_1]
root      1392  0.0  0.0      0     0 ?        S<   06:33   0:00 [scsi_tmf_1]
root      1457  0.0  0.0      0     0 ?        S    06:33   0:00 [jbd2/xvda1-8]
root      1458  0.0  0.0      0     0 ?        S<   06:33   0:00 [ext4-rsv-conver]
root      1489  0.0  0.0      0     0 ?        S<   06:33   0:00 [kworker/0:1H]
root      1501  0.0  0.5  11464  2736 ?        Ss   06:33   0:00 /sbin/udevd -d
root      1591  0.0  0.0      0     0 ?        S<   06:33   0:00 [kpsmoused]
root      1632  0.0  0.4  11460  2172 ?        S    06:33   0:00 /sbin/udevd -d
root      1646  0.0  0.0      0     0 ?        S    06:33   0:00 [kworker/0:3]
root      2080  0.0  0.0      0     0 ?        S    06:33   0:00 [kauditd]
root      2088  0.0  0.4  15936  2384 ?        Ss   06:33   0:00 crond
root      2121  0.0  0.0      0     0 ?        S<   06:33   0:00 [ipv6_addrconf]
root      2252  0.0  0.4   9360  2240 ?        Ss   06:33   0:00 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
root      2293  0.0  0.3  46536  1964 ?        S<sl 06:33   0:00 auditd
root      2311  0.0  0.5 243236  2584 ?        Sl   06:33   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
root      2327  0.0  0.0   4380    88 ?        Ss   06:33   0:00 rngd --no-tpm=1 --quiet
rpc       2341  0.0  0.4  35292  2252 ?        Ss   06:33   0:00 rpcbind
rpcuser   2358  0.0  0.6  39860  3308 ?        Ss   06:33   0:00 rpc.statd
dbus      2389  0.0  0.0  21792   228 ?        Ss   06:33   0:00 dbus-daemon --system
root      2421  0.0  1.3 152080  6820 ?        S    06:33   0:00 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid
root      2484  0.0  0.5  77816  2572 ?        Ss   06:33   0:00 /usr/sbin/sshd
ntp       2509  0.0  0.8  29292  4368 ?        Ss   06:33   0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
root      2584  0.0  1.2  92948  6424 ?        Ss   06:33   0:00 /usr/libexec/postfix/master
postfix   2591  0.0  1.3  93200  6552 ?        S    06:33   0:00 qmgr -l -t fifo -u
nobody    2593  0.0  0.7 159124  3720 ?        Ss   06:33   0:00 proftpd: (accepting connections)
root      2618  0.0  0.3   6460  1616 ttyS0    Ss+  06:33   0:00 /sbin/agetty ttyS0 9600 vt100-nav
root      2620  0.0  0.2   4312  1492 tty1     Ss+  06:33   0:00 /sbin/mingetty /dev/tty1
root      2623  0.0  0.2   4312  1444 tty2     Ss+  06:33   0:00 /sbin/mingetty /dev/tty2
root      2625  0.0  0.2   4312  1388 tty3     Ss+  06:33   0:00 /sbin/mingetty /dev/tty3
root      2627  0.0  0.2   4312  1392 tty4     Ss+  06:33   0:00 /sbin/mingetty /dev/tty4
root      2629  0.0  0.2   4312  1488 tty5     Ss+  06:33   0:00 /sbin/mingetty /dev/tty5
root      2631  0.0  0.3  10876  1628 ?        S    06:33   0:00 /sbin/udevd -d
root      2632  0.0  0.2   4312  1408 tty6     Ss+  06:33   0:00 /sbin/mingetty /dev/tty6
root      2689  0.0  1.3 117784  6712 ?        Ss   07:00   0:00 sshd: ec2-user [priv]
ec2-user  2691  0.0  1.1 117784  5652 ?        S    07:00   0:00 sshd: ec2-user@pts/0
ec2-user  2692  0.0  0.6 115348  3288 pts/0    Ss   07:00   0:00 -bash
postfix   2907  0.0  1.3  93032  6584 ?        S    08:13   0:00 pickup -l -t fifo -u
ec2-user  3050  0.0  0.6 115348  3396 pts/0    S    08:22   0:00 bash
ec2-user  3220  0.0  0.4 117204  2460 pts/0    R+   08:44   0:00 ps aux
$
netstat

トラフィックの場合は、netstat コマンドで接続が多いプロセスを特定しましょう。下記のようなオプションで、PIDも出力する事が出来ます。

$ sudo netstat -anep
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       User       Inode      PID/Program name
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      0          10059      2484/sshd
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      0          10309      2584/master
tcp        0      0 0.0.0.0:33410               0.0.0.0:*                   LISTEN      29         9566       2358/rpc.statd
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      0          9825       2421/snmpd
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      0          9488       2341/rpcbind
tcp        0    464 172.31.15.196:22            xxx.xxx.xxx.xxx:19752       ESTABLISHED 0          12759      2689/sshd
tcp        0      0 :::21                       :::*                        LISTEN      99         10425      2593/proftpd
tcp        0      0 :::22                       :::*                        LISTEN      0          10061      2484/sshd
tcp        0      0 :::39943                    :::*                        LISTEN      29         9572       2358/rpc.statd
tcp        0      0 :::111                      :::*                        LISTEN      0          9491       2341/rpcbind
udp        0      0 0.0.0.0:820                 0.0.0.0:*                               0          9487       2341/rpcbind
udp        0      0 0.0.0.0:68                  0.0.0.0:*                               0          8856       2252/dhclient
udp        0      0 127.0.0.1:838               0.0.0.0:*                               0          9560       2358/rpc.statd
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               0          9486       2341/rpcbind
udp        0      0 172.31.15.196:123           0.0.0.0:*                               0          10144      2509/ntpd
udp        0      0 127.0.0.1:123               0.0.0.0:*                               0          10143      2509/ntpd
udp        0      0 0.0.0.0:123                 0.0.0.0:*                               0          10136      2509/ntpd
udp        0      0 0.0.0.0:161                 0.0.0.0:*                               0          9824       2421/snmpd
udp        0      0 0.0.0.0:47782               0.0.0.0:*                               29         9563       2358/rpc.statd
udp        0      0 :::820                      :::*                                    0          9490       2341/rpcbind
udp        0      0 :::52050                    :::*                                    29         9569       2358/rpc.statd
udp        0      0 :::111                      :::*                                    0          9489       2341/rpcbind
udp        0      0 fe80::4b2:53ff:fe38:5837:123 :::*                                    0          10146      2509/ntpd
udp        0      0 ::1:123                     :::*                                    0          10145      2509/ntpd
udp        0      0 :::123                      :::*                                    0          10137      2509/ntpd

復旧対処

調査の結果わかった内容で対策を考えましょう。

まとめ

こんなに書いといてあれですが、実際には、いきなり ps コマンドで特定する事の方が多いかもしれません。

また、サーバにログインして確認するコマンドを紹介しましたが、実際の運用では可能な限りモニタリングツールを導入してサーバへのログインなしに確認できる環境を作りましょう。サーバが複数台の環境だとコマンドで見るよりもグラフを見た方が何倍も判りやすく、早い解決が期待出来ます。

おすすめ書籍

より詳しい内容は下記書籍が初心者にもわかりやすいと思います。今回の内容だと特に最初の1冊をお勧めします。