2015年1月4日日曜日

CentOS(RHEL)6 クラッシュダンプ用のメモリ割り当てを無効にする


クラッシュダンプを取得する必要がない + kexec-toolsのパッケージを導入していない(kdumpの機能を有効にしていない)にもかかわらず、クラッシュダンプ用にメモリの割り当て(消費)だけはされてしまうという状況を回避しようというのが今回の内容です。
※評価は、CentOS6.6(x86_64)でメモリ2GBを搭載したマシンで行っています


grub.confのkernel行にある”crashkernel=auto”の記述を削除する方法

(注意)
CentOS(RHEL)6系では、新しいkernelをインストールすると、必ず”crashkernel=auto”が付与されるようになっているので、新しいkernelをインストールした場合はその都度、削除をする必要があります
 ⇒ rpm -q --scripts kernel-<version> とするとその付与する処理が確認できます


/etc/init/kexec-disable.confを修正する方法

ファイルの中で”crashkernel=auto"をgrepしているのですが、/proc/cmdlineには実際に割り当てられたメモリの容量が入ってくるので、修正をしないと機能しません。
具体的には以下のように修正するか、その行自体を削除してしまっても良いと思います。

# diff -u /etc/init/kexec-disable.conf.orig /etc/init/kexec-disable.conf
--- /etc/init/kexec-disable.conf.orig     2015-01-02 23:02:11.067185577 +0900
+++ /etc/init/kexec-disable.conf  2015-01-02 23:06:03.607481618 +0900
@@ -8,7 +8,7 @@
 script
        if [ ! -x /sbin/kexec ] || ! chkconfig kdump 2>/dev/null ; then
-               grep -q "crashkernel=auto" /proc/cmdline && \
+               grep -q "crashkernel" /proc/cmdline && \
                echo -n "0" > /sys/kernel/kexec_crash_size 2>/dev/null
        fi
        exit 0
#

これで以下の条件にマッチすると、メモリの割り当てが無効になります。
・kexec-toolsパッケージがインストールされていない
・kexec-toolsパッケージがインストールされているが、自動起動がonになっていない

2014年12月1日月曜日

rsyslog 複数のポートで待ち受けるには

ログサーバとしてrsyslogを稼動させる時に、複数のポートで待ち受けしてみようというのが今回の内容です。
#検証は、CentOS6.6 + rsyslog-8.5.0で行っています


TCPの514ポートと5140ポートで待ちうけをする場合は、rsyslog.confを以下のように編集します。
module(load="imtcp")
input(type="imtcp" port="514")
input(type="imtcp" port="5140")

編集完了後にrsyslogをrestartし、状態を確認すると以下のようになります。
# netstat -antup | grep rsyslog
tcp        0      0 0.0.0.0:5140    0.0.0.0:*   LISTEN      1333/rsyslogd
tcp        0      0 0.0.0.0:514     0.0.0.0:*    LISTEN      1333/rsyslogd
#


※UDPでも同様の方法で設定できます。

2014年11月15日土曜日

rsyslog + MySQL 特定ホストだけMySQLへの出力を停止するには

以前、シスログをMySQLへ書き出す「rsyslog + MySQL」という記事を書きました。
今回はその記事に少し内容をプラスしてみます。

・ログサーバで、リモートから受け取ったログをファイルとして保存する以外に、MySQLにも保存している
・非常に大量のログを出力するホストがいるが、そのホストからのシスログだけMySQLには出力したいくない

といったシナリオを実現させる方法について2つピックアップしてみます。
※評価は、CentOS6.6 + rsyslogのver8.5.0で行っています


ファシリティで除外する方法


ログを送ってくる側でファシリティを指定できるのであれば、そのファシリティだけMySQLに出力されないようにするのがお手軽です。
*.*;local4.none     :ommysql:localhost,Syslog,rsyslog,PASSWORD


アクションで除外する方法


記述は面倒になりますが、以下のように記述する事で192.168.233.100と192.168.233.101から送られてくるシスログはMySQLへは出力されなくなります。
この場合のキモは”stop”の記述で、それ以降のログ出力の停止、つまりMySQLへのログ出力を停止する事ができます。

$template STOPSQL, "/var/log/%fromhost%/%$year%%$month%%$day%.log"

if \
  ( $fromhost-ip == '192.168.233.100' or \
   $fromhost-ip == '192.168.233.101' ) \
then {
        action(type="omfile"
          DirCreateMode="0750"
          DirGroup="logadmin"
          FileCreateMode="0640"
          FileOwner="logadmin"
          dynaFile="STOPSQL")
        stop
}

*.*     :ommysql:localhost,Syslog,rsyslog,PASSWORD

(備考)
actionとしてomfileを指定する場合、2つ注意することがあります。

1.DirCreateModeやFileCreateModeなどパーミッションに関連するパラメータは、全体に適用されるようにグローバルで指定してあったとしても、上記のように改めて指定する必要があります
2.さらに出力されるファイルの指定(上記だとdynaFileの行)は、一番最後に指定する必要があります

2014年11月5日水曜日

CentOS 7(RHEL7) でIPエイリアスの操作

CentOS7(RHEL7)になってネットワーク周りの設定もだいぶお作法が変わってきました。
今回はタイトルの通り、IPエイリアスの操作についてです。



一時的な(手動による)操作

※書式を確認するときは、ip addr helpとします
※IPアドレス、ネットマスク、インターフェース名はお使いの環境にあわせて適宜読みかえてください

<追加時>
# ip addr add 192.168.233.8/24 dev ens32

<削除時>
# ip addr del 192.168.233.8/24 dev ens32

※追加作業後にIPアドレスを確認すると、ens32のセカンダリアドレスとして登録されている事が確認できます。
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:7e:2f:54 brd ff:ff:ff:ff:ff:ff
    inet 192.168.233.7/24 brd 192.168.233.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet 192.168.233.8/24 brd 192.168.233.255 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7e:2f54/64 scope link
       valid_lft forever preferred_lft forever
#


恒久的な操作

※上記1.の方法だと再起動すると追加した設定は消えてしまいます。
  恒久的に保存するにはいくつか方法がありますが、今回はnmtui-editコマンドを使ってみる事にします。
 →この操作で/etc/sysconfig/network-scripts/ifcfg-<interface名>に
   IPADDR1とPREFIX1として追加されます


1.nmtui-editコマンドを実行します。
 ※もし書式が崩れるようであれば、 LANG=C nmtui-edit と実行してください

2.IPエイリアスを追加するインターフェースを選択後、[TAB]キーで<Edit...>にカーソルを合わせEnterを押します。










3.次に現在インターフェースに設定されているIPアドレスの下にある<Add...>にカーソルを合わせてEnterを押します。






4.IPエイリアスの設定を追加します。
  追加後、画面右下の<OK>にカーソルを合わせてEnterを押します。







5.一番最初の画面に戻るので、画面右下の<Quit>にカーソルを合わせてEnterを押します。















以上で、OSを再起動しても設定したIPエイリアスが消える事はありません。

2014年11月3日月曜日

CentOS7(RHEL7) デフォルトで起動するkernelを変更するには

CentOS7(RHEL7)になってブートローダーがGRUB2になりました。

kernelのセキュリティアップデートなどで新しいkernelをインストール & リブートして、新しいkernelで起動していると思ったら古いままだったいう事はありませんか?

本来、期待するところとしてはGRUBの時のように、ほっといても一番最新のkernelが起動してくる事です。

ところが(どういった理由でその状態になるかは調べてませんが)、下記のようにmenuentryが登録された場合、OS起動時にデフォルトで起動してくるのは、1番上のkernel(1番古いkernel)になります。

# grep ^menuent /boot/grub2/grub.cfg | awk -F\' '{ print $2 }'
CentOS Linux, with Linux 3.10.0-123.el7.x86_64 <-最も古いkernel
CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64  <-最新のkernel
CentOS Linux, with Linux 3.10.0-123.4.4.el7.x86_64
CentOS Linux, with Linux 3.10.0-123.4.2.el7.x86_64
CentOS Linux, with Linux 0-rescue-09cc85c5693c44fe999137f3ea268654
#

前置きが長くなりましたが、今回はこの例のようにmenuentryがきれいに並んでくれなかった場合に、デフォルトで起動するkernelを任意に指定する方法について3つピックアップしてみます。


1./etc/default/grubのGRUB_DEFAULTに起動するkernelの番号を渡す方法
 
‐ /etc/grub2.confなりで先頭がmenuentryから始まる行を確認する
 - 起動するkernelを番号で指定する 
   -> 最初のmenuentryを0(ゼロ)として上から順に扱われる
   -> 上記の前置きでgrepしたmenuentryの例では、一番最新のkernelで起動するなら"GRUB_DEFAULT=1"と指定する
 - 編集が完了後、以下のコマンドでgrub.cfgを生成し直す
  ※grub2になって、/boot/grub2/grub.cfgは直接編集する事ができなくなりました
# grub2-mkconfig -o /boot/grub2/grub.cfg


2./etc/default/grubのGRUB_DEFAULT=savedを活かして、記述を追記する方法

 - 以下の行を追記します
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true <-追記
 - 編集完了後、以下のコマンドでgrub.cfgを編集し直す
# grub2-mkconfig -o /boot/grub2/grub.cfg
 - OS起動時に起動するkernelを手動で選択する

 以上で、次回からは選択したkernelで起動するようになります。

 
3./etc/default/grubのGRUB_DEFAULT=savedを活かして、grub2-set-defaultコマンドで起動するkernelのmenuentry_id_optionを指定する方法

  - grub2-set-defaultコマンドで指定するmenuentry_id_optionの値を調べてから実施します
# grep ^menuentry /boot/grub2/grub.cfg
# grub2-set-default <上記で調べたmenuentry_id_option>
# grub2-mkconfig -o /boot/grub2/grub.cfg

なお、設定した値は、以下のコマンドで確認することができます。
# grub2-editenv list
saved_entry=gnulinux-3.10.0-123.9.2.el7.x86_64-advanced-8bb0c9cd-5584-492e-a498-0723073163b9


※個人的には、新しいkernelをインストールする度に/etc/default/grubを編集する手間のない2番目がお勧めです



(備考)
・/etc/default/grub2で指定可能なオプションは、info grub2 で確認できます

$ info grub2 とするとメニューが出てくるので、
 -> 矢印キーでカーソルを"* Configuration::"の箇所にもっていきEnter
 -> 次に矢印キーでカーソルを"* Sinple configuration::"の箇所に持っていきEnter

・もしくは以下のURLでも確認できます
http://www.gnu.org/software/grub/manual/html_node/Simple-configuration.html#Simple-configuration

2014年9月8日月曜日

CentOS6.x + S3QL 2系 (Amazon S3マウント編)

前回のインストール編の続きで、Amazon S3ストレージサービスをマウントして使ってみようというのが今回の内容です。
#検証環境は、CentOS6.5(x86_64) + S3QLのバージョン2.11.1です



Amazon Web Serviceでの準備


ここでは詳細な説明は割愛させてもらいますが、AWSにアカウントを作成後、以下の2点を準備しておく必要があります。

1.Amazon S3でバケットの作成
 ⇒今回は、メールBOXの場所として利用しようと思ったので、"s3ql-mail"と作成しました

2.S3にアクセスするためのAccess Key IDとSecret Access Keyの作成


S3QLからの操作


1.ファイルシステムの作成
暗号化パスワードは、この作業で新規に作成します。
# mkfs.s3ql s3://s3ql-mail
Enter backend login: Access Key ID を入力
Enter backend passphrase: Secret Access Key を入力
Before using S3QL, make sure to read the user's guide, especially
the 'Important Rules to Avoid Loosing Data' section.
Enter encryption password: 暗号化パスワード を入力
Confirm encryption password: 暗号化パスワード を再度入力
Generating random encryption key...
Creating metadata tables...
Dumping metadata...
..objects..
..blocks..
..inodes..
..inode_blocks..
..symlink_targets..
..names..
..contents..
..ext_attributes..
Compressing and uploading metadata...
Wrote 150 bytes of compressed metadata.
#

2.マウント
適当なマウントポイント(ここでは、/mail_storage)を作成してマウントします。
※暗号化パスワードは、ファイルシステムの作成時に指定したものを入力します。
※マウントオプションは、"mount.s3ql --help"で確認してください。
# mkdir /mail_storage
# mount.s3ql --allow-other s3://s3ql-mail /mail_storage
Using 2 upload threads.
Autodetected 10202 file descriptors available for cache entries
Enter backend login:Access Key ID を入力
Enter backend passphrase:Secret Access Key を入力
Enter file system encryption passphrase:暗号化パスワード を入力
Using cached metadata.
Setting cache size to 8732 MB
Mounting filesystem...
#
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        13G  1.4G   11G  11% /
tmpfs           935M     0  935M   0% /dev/shm
/dev/sda1       194M   86M   98M  47% /boot
s3://s3ql-mail  1.0T     0  1.0T   0% /mail_storage
#

以上で、後はローカルのファイルシステムと同様に読み書きができます。




(備考1)マウント時にAccess Key ID、Secret Access Key、暗号化パスワードの入力を省略するには
 ⇒authinfo2を以下のように作成する
# touch ~/.s3ql/authinfo2
# chmod 600 ~/.s3ql/authinfo2
# vi ~/.s3ql/authinfo2

<記述内容>==========================
[s3]
storage-url: s3://s3ql-mail
backend-login: Access Key ID
backend-password: Secret Access Key 
fs-passphrase: 暗号化パスワード
====================================

(備考2)OS起動時に自動的にバケットをマウントするには
下記のような起動スクリプトを作成後、ファイルに実行権を付与し、自動起動するようにしてください
# chkconfig --add s3ql

<起動スクリプトの作成例>
※バケット名やマウントポイントなどは各自の環境にあわせて修正する必要があります
#!/bin/bash
#
# chkconfig: 35 60 40
# description: S3QL Backup File System
#
# Source function library.
. /etc/init.d/functions
#
AUTHFILE="/root/.s3ql/authinfo2"
BUCKET="s3://s3ql-mail"
MOUNTPOINT="/mail_storage"
OPTIONS="--allow-other"
start() {
        echo -n $"Mounting S3QL: "
        mount | grep $MOUNTPOINT > /dev/null
        if [ $? -eq 0 ];then
                echo $"Cannot mount $MOUNTPOINT. Already mounted !!"
                echo
                exit 1
        fi
        echo
        fsck.s3ql --batch $BUCKET
        mount.s3ql $OPTIONS $BUCKET $MOUNTPOINT
        RETVAL=$?
        [ $RETVAL -eq 0 ] && success || failure
        echo
}
stop() {
        echo -n $"Unmounting S3QL: "
        mount | grep $MOUNTPOINT > /dev/null
        if [ $? -ne 0 ];then
                echo $"Already unmounted !!"
                echo
                exit 1
        fi
        umount.s3ql $MOUNTPOINT && success || failure
        echo
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo "Usage: `basename $0` {start|stop}"
        exit 1
        ;;
esac

2014年8月30日土曜日

CentOS6.x + S3QL 2系 (インストール編)

2014年9月7日追記:
9月5日にバージョン2.11.1がリリースされています。
⇒主な変更点は、バージョン2.11でmountt.s3qlコマンドがデーモン化しなくなったのが、元に戻った事です。
下記の記事は特に修正はしていませんが、同様の手順でバージョン2.11.1の導入が可能なので、試すのであれば最新版でどうぞ!!



S3QLとは、Amazon S3のようなストレージサービスをローカルにマウントし、通常のハードディスクのようなデータ操作を可能にするツールです。
⇒もちろん実際のデータはローカルではなく、ストレージサービス側に保存されます

現在、S3QLには(原則、機能追加を行わないバグフィックスだけの)バージョン1系と(新機能追加など活発な開発が行われている)バージョン2系が存在します。

どうせ使うなら新しいほうが良いよねという事で、CentOS6.5(x86_64)にバージョン2.11(2014年8月時点での最新版)を導入するのが今回の内容です。


基本的には、以下のドキュメントを参考に進めていきます。
http://www.rath.org/s3ql-docs/installation.html
https://bitbucket.org/nikratio/s3ql/wiki/installation_centos



S3QL ver2.11のインストール


1.ビルドに必要なパッケージをインストール
# yum install autoconf gcc unzip fuse fuse-devel libattr-devel

2.Python3.3のインストール
バージョン2系はPythonの3.3以上が必要になるので、ドキュメントを真似てPUIAS repoからPython3.3をインストールします。
※1行だけ、文字が小さくなってすみません(変なところで改行が入るのを防ぐ為)

# cd /etc/pki/rpm-gpg/
# wget -q http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
# rpm --import RPM-GPG-KEY-puias
# cat <<EOF >> /etc/yum.repos.d/puias-computational.repo
> [PUIAS_6_computational]
> name=PUIAS Computational Base
> mirrorlist=http://puias.math.ias.edu/data/puias/computational/\$releasever/\$basearch/mirrorlist
> gpgcheck=1
> gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias
> EOF
#
# yum install python3 python3-devel python3-libs

3.Pythonのパッケージ管理ツールpipのインストール
この作業でsetuptoolsも一緒にインストールされます。

# wget -O - https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python3
# pip -V
pip 1.5.6 from /usr/lib/python3.3/site-packages (python 3.3)
#
# pip list
pip (1.5.6)
setuptools (5.4.2)
#

4.SQLiteをソースでインストール
OS標準のパッケージsqlite-3.6.20とコンフリクト(上書き)しないように、/usr/local/sqlite-3.8配下にインストールします。

$ wget http://www.sqlite.org/2014/sqlite-autoconf-3080500.tar.gz
$ tar zxf sqlite-autoconf-3080500.tar.gz
$ cd sqlite-autoconf-3080500
$ ./configure --prefix=/usr/local/sqlite-3.8
$ make
$ su
Password: パスワードの入力
# make install
# echo "/usr/local/sqlite-3.8/lib" > /etc/ld.so.conf.d/sqlite.conf
# ldconfig

5.Pythonモジュールのインストール
ドキュメントに指定されているPythonモジュールをインストールします。
# pip install pycrypto
# pip install defusedxml
# pip install requests
# pip install llfuse
# pip install dugong

6.APSWモジュールのインストール
SQLiteを/usr/local/sqlite-3.8配下にインストールしているので、それに合わせてsetup.pyファイルを編集してからインストールを実施します。
# wget https://github.com/rogerbinns/apsw/releases/download/3.8.5-r1/apsw-3.8.5-r1.zip
# unzip apsw-3.8.5-r1.zip
# cd apsw-3.8.5-r1
# cp -p setup.py{,.orig}
# vi setup.py
<編集後のdiff出力>====================================
--- setup.py.orig       2014-06-04 21:32:56.000000000 +0900
+++ setup.py    2014-08-14 22:43:08.417085436 +0900
@@ -19,8 +19,8 @@
 ## http://www.python.org/doc/2.5.2/dist/setup-config.html
 ##
-include_dirs=['src']
-library_dirs=[]
+include_dirs=['src','/usr/local/sqlite-3.8/include']
+library_dirs=['/usr/local/sqlite-3.8/lib']
 define_macros=[]
 libraries=[]
=====================================================
# python3 setup.py install

7.S3QL 導入前の確認
今までの作業の結果、インストールしたモジュール等を確認すると以下のようになります。

# pip list
Warning: cannot find svn location for apsw==3.8.5-r1
apsw (3.8.5-r1)
defusedxml (0.4.1)
dugong (3.2)
llfuse (0.40)
pip (1.5.6)
pycrypto (2.6.1)
requests (2.3.0)
setuptools (5.4.1)
#

8.S3QL 2.11のインストール
APSWモジュールのインストールと同様に、ソースでインストールしたSQLiteを指定してインストールします。
# wget https://bitbucket.org/nikratio/s3ql/downloads/s3ql-2.11.tar.bz2
# tar jxf s3ql-2.11.tar.bz2
# cd s3ql-2.11
#
# python3 setup.py build_ext --include-dirs='/usr/local/sqlite-3.8/include' \
> --library-dirs='/usr/local/sqlite-3.8/lib' --inplace
# python3 runtests.py tests
(snip)
========= 550 passed, 17 skipped, 1 warnings in 161.45 seconds ===========
#
# python3 setup.py install
(snip)
Using /usr/lib64/python3.3/site-packages
Finished processing dependencies for s3ql==2.11
#

 結果、S3QLのコマンド群が以下のようにインストールされます。
# ls -l /usr/bin/*s3ql*
-rwxr-xr-x 1 root root 294 Aug 29 23:17 /usr/bin/fsck.s3ql*
-rwxr-xr-x 1 root root 294 Aug 29 23:17 /usr/bin/mkfs.s3ql*
-rwxr-xr-x 1 root root 296 Aug 29 23:17 /usr/bin/mount.s3ql*
-rwxr-xr-x 1 root root 290 Aug 29 23:17 /usr/bin/s3qladm*
-rwxr-xr-x 1 root root 288 Aug 29 23:17 /usr/bin/s3qlcp*
-rwxr-xr-x 1 root root 292 Aug 29 23:17 /usr/bin/s3qlctrl*
-rwxr-xr-x 1 root root 292 Aug 29 23:17 /usr/bin/s3qllock*
-rwxr-xr-x 1 root root 310 Aug 29 23:17 /usr/bin/s3ql_oauth_client*
-rwxr-xr-x 1 root root 288 Aug 29 23:17 /usr/bin/s3qlrm*
-rwxr-xr-x 1 root root 292 Aug 29 23:17 /usr/bin/s3qlstat*
-rwxr-xr-x 1 root root 298 Aug 29 23:17 /usr/bin/s3ql_verify*
-rwxr-xr-x 1 root root 298 Aug 29 23:17 /usr/bin/umount.s3ql*
#


長くなったのでここまでで一旦終了とし、次回、実際にAmazon S3をマウントしてみたいと思います。