2014年5月6日火曜日

Linux Tips: コンソールでの文字化けを解消するには

久しぶりにDebian系ディストリのインストールを行った。
その際、インストール初期に聞かれるLanguageの画面で”日本語”を選択し、インストールを完了させました。
次に、コンソールを利用したのですが、manを見れば文字化け、apt-get updateをすれば表示されるメッセージは文字化けと困った事に。


原因は、日本語でセットアップしたことにより、localeが以下のように設定されてしまうから。
→コンソールで、ja_JP.UTF-8の表示は基本的にまともにできない
 (いまでもkonとかあるんだろうか → さがしたらkon2とかでてきますね)
~$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
$

前置きが長くなりましたが、この状態を回避しようというのが今回の内容です。


回避策

1.インストール初期のLanguageをEnglishにしてインストールし直す


時間が許せばこの方法が、一番ベストだと思います。
これでlocaleは、en_US.UTF-8あたりに設定されるので、基本的に文字化けしません。
※サーバ用途では、日本語による表示を必要としないのなら、不必要なパッケージのインストールを防ぐという観点から、これを特にお勧めします


2.コンソールにログイン後、環境変数を設定する


ログイン後、以下のコマンドを毎回実行してから作業を実施します。
※これが面倒な場合は下記の3.を試してください。
$ export LANG=C


3. 作業する$TERMにあわせて$LANGを自動的に選択させる


以下の記述を~/.bashrcあたりにすることによって、$TERMの種類により、ログインする環境にあわせた$LANGを設定する事ができます。
※コンソールはCの表示にし、それ以外(例えばxtermやWindows上のPuttyなど)は日本語での表示を可能にします

case $TERM in
   linux)
        LANG=C
        ;;
   *)
    LANG=ja_JP.UTF-8
    ;;
esac
export LANG


(備考)
Redhat系の場合、この3.と同様の設定が、Fedoraだと8あたりから、CentOSだと5から/etc/profile.d/lang.shとして用意されています

2014年5月2日金曜日

Fedora20 インストール画面がまともに表示されなかったら

(自分のところでは、VMware環境で100%なってしまいますが)インストールを開始してパーティショニングするところで、下の画像のように、画面の表示がおかしくなり困った事はないでしょうか?
この状況を回避しようというのが今回の内容です。







回避策


インストーラーのAnacondaで解像度を調整することにより回避する事ができます。

1.インストールが開始されたら画面下部の「Press Tab for full configuration options on menu items.」のメッセージに従って、TABキーを押します。





2.するとブートオプションを入力できるようになるので、ここに解像度を指定してやります。
  ここでは、resolution=1024x768と指定しました。



結果、以下のように画面全てがまともに表示されるようになります。




(備考)
Anacondaのブートオプションには、その他に有用な(面白そうな)ものが結構あるので興味があれば調べてみると良いかもしれません。

https://fedoraproject.org/wiki/Anaconda_Boot_Options?rd=Anaconda/Options

2014年3月26日水曜日

CentOS6(RHEL6)でクラッシュダンプを取得する SSH経由で他のホストへ出力

前回の続きで、タイトルのとおりSSH経由でダンプをリモートのホスト上にはかせてみようというのが今回の内容です。

※評価は、CentOS6.5(x86_64)でメモリ2GBを搭載したマシンを2台用意して行っています
※また、2台のIPアドレスは下記のとおりです
 ダンプを受け取るリモート側のホスト:192.168.233.21
 ダンプをはくホスト        :192.168.233.12



ダンプを受け取るリモート側での作業


ダンプをはく側からSSH経由でアクセスしてくるので、事前にダンプ用ユーザ(下記の例ではkdumpユーザ)の作成とそのユーザでデータを保存できる領域(下記の例では、ホームディレクトリをとして/kdumpを指定)を作成します。
# useradd -m -d /kdump kdump
# grep kdump /etc/passwd
kdump:x:502:502::/kdump:/bin/bash
#




ダンプをはく側での作業



1. /etc/kdump.confの編集

※リモート側で準備したkdumpユーザの権限で、(SCPを使って)データ転送を実施します
※デフォルトで/var/crash配下にデータを転送しようとしますが、その際のアクセス権に注意する必要があります
→pathで任意の場所を指定すれば、デフォルト以外の場所に転送可能なので、下記の例ではリモート側で準備した/kdump配下に転送します
 net kdump@192.168.233.21
 path /kdump
 core_collector makedumpfile -c --message-level 1 -d 31



2. kdump用SSH鍵の登録
以下のようにkdumpスクリプトを使って、ダンプをはく側での秘密鍵と公開鍵の生成とダンプを受け取るリモート側への公開鍵の登録までを実施します。

# /etc/rc.d/init.d/kdump propagate
Generating new ssh keys... done.
kdump@192.168.233.21's password:          ←★パスワードを入力
/root/.ssh/kdump_id_rsa has been added to ~kdump/.ssh/authorized_keys on 192.168.233.21
#
(注意)
ダンプを受け取るリモート側で、SSHのパスワード認証が有効になっている必要があります
→鍵認証のみで運用している場合は、鍵登録に失敗しますが、その際は
  /root/.ssh/kdump_id_rsa.pubを手動でauthorized_keysとして登録します


3.変更の適用
# /etc/rc.d/init.d/kdump restart
Stopping kdump:                                            [  OK  ]
Detected change(s) the following file(s):
  /etc/kdump.conf
Rebuilding /boot/initrd-2.6.32-431.1.2.0.1.el6.x86_64kdump.img
Starting kdump:                                            [  OK  ]
#




動作確認

ダンプをはく側でkernelをクラッシュさせて、リモートで受け取る側にダンプが出力されているか確認します。

# ls -l /kdump/192.168.233.12-2014-03-24-17\:55\:07/
total 19884
-rw-rw-r-- 1 kdump kdump    85833 Mar 24 17:55 vmcore-dmesg.txt
-rw-rw-r-- 1 kdump kdump 20274689 Mar 24 17:55 vmcore.flat
#

2014年3月17日月曜日

CentOS6(RHEL6)でクラッシュダンプを取得する

OSが突然死するとログに手掛かりとなるような出力(判断材料)が意外な程なく、途方にくれる事が多いのですが、その対策としてダンプをはかせてみようというのが今回の内容です。
※評価は、CentOS6.5(x86_64)でメモリ2GBを搭載したマシンで行っています



クラッシュダンプを取得する為のセットアップ


CentOS6.5でクラッシュダンプを取得するには、kdumpサービスを利用します。
以下、その手順です。


1. 必要なパッケージのインストール


kdumpサービスを利用するには、kexec-toolsがインストールされている必要があります。
# yum install kexec-tools


2. メモリー使用量の設定


クラッシュダンプ用に割り当てるメモリ容量を設定します。
→通常、起動しているOSからはそのメモリ領域はないものとして扱われます(※下記の(備考)参照)


設定は、grub.confのkernelの行に”crashkernel”パラメータを渡すことで行いますが、
通常、最初から”crashkernel=auto”と指定されていると思います。

※CentOS6.5では、2GB以上のメモリが搭載されていればkdumpサービスが有効になっていなくても、自動的にメモリの割り当てだけは行われています
※autoで割り当てられたメモリ容量は以下のいずれかのコマンドで確認できます
 # cat /proc/cmdline
 # cat /sys/kernel/kexec_crash_size

※2GB未満の場合は、自動的に割り当てられることはないので、autoの箇所に128Mとじかに指定する必要があります

title CentOS (2.6.32-431.5.1.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.5.1.el6.x86_64 <中略> crashkernel=auto
        initrd /initramfs-2.6.32-431.5.1.el6.x86_64.img

(備考)====================================================
・2GBのメモリ搭載し、crashkernelの指定がない場合のメモリ容量

# cat /proc/meminfo
MemTotal:        2046588 kB
MemFree:         1867764 kB
Buffers:            7584 kB
     ・
     ・
・2GBのメモリを搭載し、crashkernel=autoの指定がある場合のメモリ容量
 →2GBからクラッシュダンプ用に割り当てられたメモリ容量が差し引かれて表示されます
# cat /proc/meminfo
MemTotal:        1914492 kB
MemFree:         1733792 kB
Buffers:            7568 kB
     ・
     ・
============================================================


3. 設定ファイル /etc/kdump.confの編集


今回は、デフォルトのままで特に編集を行いませんでした。


4. kdumpサービスの起動と状態確認

# chkconfig kdump on
# /etc/rc.d/init.d/kdump start
No kdump initial ramdisk found.                            [WARNING]
Rebuilding /boot/initrd-2.6.32-431.1.2.0.1.el6.x86_64kdump.img
Starting kdump:                                            [  OK  ]
#

kdumpサービスが有効になったかは以下のコマンドで確認できます
# /etc/rc.d/init.d/kdump status
Kdump is operational
#
# cat /sys/kernel/kexec_crash_loaded
1
#



コアダンプの分析


コアダンプの分析を行うまでの手順は下記のようになります。

1. 必要なパッケージのインストール


デバッグ情報付きでビルドされたカーネルとcrashパッケージをインストールします
→現在running中のkernelに合わせてインストールします
# yum --enablerepo=debug install kernel-debuginfo-`uname -r` crash


2. kernelクラッシュ


今回は、下記コマンドで強制的にkernelクラッシュを発生させます
# echo c > /proc/sysrq-trigger

これで下記のように/var/crashディレクトリ配下にコアダンプが吐かれます。

# ll /var/crash/127.0.0.1-2014-03-17-17\:36\:44/
total 30292
-rw------- 1 root root 30929131 Mar 17 17:36 vmcore
-rw-r--r-- 1 root root    85835 Mar 17 17:36 vmcore-dmesg.txt
#


3. crashユーティリティの実行

# crash /usr/lib/debug/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/vmlinux \
> /var/crash/127.0.0.1-2014-03-17-17\:36\:44/vmcore

以下のようにプロンプトが戻っててきたら、各種コマンドで解析が実施できます。
→利用できるコマンドはhelpで確認できます


crash 6.1.0-5.el6
Copyright (C) 2002-2012  Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010  IBM Corporation
Copyright (C) 1999-2006  Hewlett-Packard Co
Copyright (C) 2005, 2006, 2011, 2012  Fujitsu Limited
Copyright (C) 2006, 2007  VA Linux Systems Japan K.K.
Copyright (C) 2005, 2011  NEC Corporation
Copyright (C) 1999, 2002, 2007  Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002  Mission Critical Linux, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions.  Enter "help copying" to see the conditions.
This program has absolutely no warranty.  Enter "help warranty" for details.

GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu"...

      KERNEL: /usr/lib/debug/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2014-03-17-17:36:44/vmcore  [PARTIAL DUMP]
        CPUS: 1
        DATE: Mon Mar 17 17:36:41 2014
      UPTIME: 00:41:54
LOAD AVERAGE: 0.10, 0.17, 0.08
       TASKS: 71
    NODENAME: kdump.example.com
     RELEASE: 2.6.32-431.1.2.0.1.el6.x86_64
     VERSION: #1 SMP Fri Dec 13 13:06:13 UTC 2013
     MACHINE: x86_64  (3192 Mhz)
      MEMORY: 2 GB
       PANIC: "Oops: 0002 [#1] SMP " (check log for details)
         PID: 4289
     COMMAND: "bash"
        TASK: ffff880037c20ae0  [THREAD_INFO: ffff880037aea000]
         CPU: 0
       STATE: TASK_RUNNING (PANIC)

crash>


2014年2月24日月曜日

rsyslog 制御文字の出力を抑制するには

今回は、$EscapeControlCharactersOnReceiveディレクティブについてです。
※評価はCentOS6.5(x86_64) + rsyslog-7.6.0で行っています


各種ログで以下のように"#0111"などの制御文字が出力され、ログが見にくいなと感じたことはありませんか?

Feb 20 23:31:48 host1 dovecot: auth: Debug: client passdb out: OK#0111#011user=user01@example.com
Feb 20 23:31:48 host1 dovecot: auth: Debug: master in: REQUEST#0113825991681#0111858#0111#01139e00ee36ea2ede7441004cca9bf81c7#011session_pid=1861


$EscapeControlCharactersOnReceive off

とrsyslog.confに設定することにより、この制御文字の出力を抑制することができます。
これですっきりと読みやすいログになりました。

Feb 20 23:33:26 host1 dovecot: auth: Debug: client passdb out: OK   1   user=user01@example.com
Feb 20 23:33:26 host1 dovecot: auth: Debug: master in: REQUEST  3685744641      1877    1       93338956ff312fddeea4e71e715cd44a      session_pid=1882

2014年2月13日木曜日

ひとつのホストで異なるバージョンのPostgreSQLを起動する

今回は、ひとつのホスト上で異なるバージョンのPostgreSQLを起動してみたいと思います。
起動するPostgreSQLは過去にねたとしてあげたコミュニティ版の9.2と9.3とし、OSはCentOS6.5(x86_64)とします。

コミュニティ版のPostgreSQL9.xは、データベースクラスタが最初から同じ位置ではないので、利用するポートがかぶらないようにすれば実現は簡単です。


起動スクリプトを使う場合


PostgreSQL9.3は5432ポートで起動させるので(特別なことをせずに) /etc/rc.d/init.d/postgresql-9.3 start で起動します。

PostgreSQL9.2は"/etc/rc.d/init.d/postgresql-9.2"内のPGPORTの記述をPostgreSQL9.3が利用する5432ポートと異なるものに変更します。
ここでは、5433ポートに変更します。
PGPORT=5433
後は、/etc/rc.d/init.d/postgresql-9.2 start で起動します。


pg_ctlを使う場合


面倒でもフルパスで指定するのが間違いがないでしょう。

[postgres@pgsql ~]$ /usr/pgsql-9.3/bin/pg_ctl start -D /var/lib/pgsql/9.3/data
[postgres@pgsql ~]$ /usr/pgsql-9.2/bin/pg_ctl start -o "-p 5433" -D /var/lib/pgsql/9.2/data


動作確認


下記のように9.2と9.3のPostgreSQLが起動しているのが確認できます。
[postgres@pgsql ~]$ ps -fC postgres
UID        PID  PPID  C STIME TTY          TIME CMD
postgres  1364     1  0 18:19 pts/0    00:00:00 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data
postgres  1365  1364  0 18:19 ?        00:00:00 postgres: logger process
postgres  1367  1364  0 18:19 ?        00:00:00 postgres: checkpointer process
postgres  1368  1364  0 18:19 ?        00:00:00 postgres: writer process
postgres  1369  1364  0 18:19 ?        00:00:00 postgres: wal writer process
postgres  1370  1364  0 18:19 ?        00:00:00 postgres: autovacuum launcher process
postgres  1371  1364  0 18:19 ?        00:00:00 postgres: stats collector process
postgres  1406     1  0 18:21 pts/0    00:00:00 /usr/pgsql-9.2/bin/postgres -D /var/lib/pgsql/9.2/data -p 5433
postgres  1407  1406  0 18:21 ?        00:00:00 postgres: logger process
postgres  1409  1406  0 18:21 ?        00:00:00 postgres: checkpointer process
postgres  1410  1406  0 18:21 ?        00:00:00 postgres: writer process
postgres  1411  1406  0 18:21 ?        00:00:00 postgres: wal writer process
postgres  1412  1406  0 18:21 ?        00:00:00 postgres: autovacuum launcher process
postgres  1413  1406  0 18:21 ?        00:00:00 postgres: stats collector process
[postgres@pgsql ~]$

psqlコマンドはより新しいバージョンのものになりますが、ポートを指定して下位のバージョンに接続する事ができます。
[postgres@pgsql ~]$ psql -V
psql (PostgreSQL) 9.3.2
[postgres@pgsql ~]$
[postgres@pgsql ~]$ psql -p 5433
psql (9.3.2, server 9.2.6)
Type "help" for help.
postgres=#

2014年2月10日月曜日

コミュニティ版PostgreSQL9.3

以前のねたをPostgreSQL9.3でリメイクします。
なお、今回インストールした環境はCentOS6.5なので、ここからCentOS6-x86_64用のものを利用しています。


以下、そのセットアップ手順です。

インストール

[root@pgsql ~]# rpm -ivh http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
[root@pgsql ~]# yum -y install postgresql93-server


環境整備

/usr/pgsql-9.3配下にいろいろインストールされるので、それに合わせて環境を整備する。
[root@pgsql ~]# su - postgres
[postgres@pgsql ~]$ vi .bash_profile

以下、その編集内容
PATH=$PATH:$HOME/bin:/usr/pgsql-9.3/bin
PGDATA=/var/lib/pgsql/9.3/data
MANPATH="$MANPATH":/usr/pgsql-9.3/share/man

export PATH PGDATA MANPATH

即時反映するには、以下を実行
[postgres@pgsql ~]$ source .bash_profile


 データベース・クラスタの作成と起動

※ rootユーザで # service postgresql-9.3 initdb を実行してもデータベース・クラスタの作成はできます。
  しかし、localeは指定できてもEncodingが指定できない(SQL_ASCIIになる)ので、ここでは普通にinitdbを実行して
  データベースクラスタを作成しています。

[postgres@pgsql ~]$ initdb --no-locale -E UTF-8
[postgres@pgsql ~]$ pg_ctl start -D $PGDATA
server starting
[postgres@pgsql ~]$ ps -fC postgres
UID        PID  PPID  C STIME TTY          TIME CMD
postgres  1295     1  0 00:28 pts/0    00:00:00 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data
postgres  1296  1295  0 00:28 ?        00:00:00 postgres: logger process
postgres  1298  1295  0 00:28 ?        00:00:00 postgres: checkpointer process
postgres  1299  1295  0 00:28 ?        00:00:00 postgres: writer process
postgres  1300  1295  0 00:28 ?        00:00:00 postgres: wal writer process
postgres  1301  1295  0 00:28 ?        00:00:00 postgres: autovacuum launcher process
postgres  1302  1295  0 00:28 ?        00:00:00 postgres: stats collector process
[postgres@pgsql ~]$
[postgres@pgsql ~]$ psql -l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     |
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
(3 rows)
[postgres@pgsql ~]$


※あとは、rpmに含まれるinitスクリプトを利用して自動起動するようにしておけば良いと思います。
[root@pgsql ~]# chkconfig postgresql-9.3 on