2014年7月16日水曜日

CentOS7 使いはじめメモ

現在書きかけです。

RHEL7.0 RC を弄って、少し探ってはいましたが、CentOS 7.0 をサーバ利用し始めるにあたり、自分なりの勘所をまとめてみようと思います。

■インストール開始前に考えること(2014-07-16)
CentOS 6 以下でも、OS ディスクのパーティション構成、割り当てサイズについては考えていたわけですが、CentOS 7 ではファイルシステムの選択肢が増えているために、どれにしようか迷うかもしれません。選択肢は3つ XFS(デフォルト), Ext4, Btrfs(まだTechnology Preview) あります。
また、LVM を使うか否かも考慮事項ですが、新しく LVM のシンプロビジョニングを利用することもできます。
さらに、ソフトウェア RAID は md ではなく、Btrfs の RAID 機能を利用できます。Btrfs は、データとメタデータのチェックサム機能を備えており、RAID 機能を利用すれば、md を越える耐障害性を発揮できる(はず)です。・・・でも Red Hat 社は、RHEL7.0 では、まだ Btrfs は Technology Preview と言ってますので、リスクが高いと考えられます。Btrfs は、透過圧縮機能も魅力なのですが。

■ファイルシステムはどれにしたらいいか?(2015-01-22追記)
レッドハット社は XFS を推してますが、わたしとしては、OS 領域については、ext4 でよいのではと考えます。CentOS 6(または RHEL6)以下の利用経験があれば、その経験値(システムバックアップのノウハウなど)を使える点からの選択です。もしも、RHEL7+商用サポートサービス(N社やF社など)を利用するならどうかというと、やはり ext4 を選択するのがよかろうと思います。ext4 ならば、障害事例やノウハウが商用サポートベンダに、豊富に蓄積されていることが期待でき、従って、トラブル発生時の対応時間が XFS よりは短くて済むと考えられるためです。
さて、次にデータ領域のファイルシステムをどうするかということですが、だいたい5年先(たいていのサーバの利用年数はこのくらいでは)を考えて、データ量が 16TB を越えることが予想されるのであれば、XFS を選択すれば良いだろうと思います。ext4 上に既存データがあり、そのデータ量が5年先でも 16TB を越えそうにないのならば、RHEL7系に移行しても、引き続き ext4 を使うのが良いのではと思います。現在の ext4 ならば、ブロックサイズを 4K を越える値(例えば 8K)にすることで、16TB を越えられるはずですが、この使用形態は商用実績がほとんど無いものと考えられるので、リスクが高いと思われます。
2015-01-25追記、認識が間違っていたようで、ブロックサイズは 4K のままのようです。こちらを参照。

2014-11-12追記
まとめようと思いつつ放っているが、過去の経験上、安定志向ならば RHEL7.2 あたりから使ったほうが良いだろうと思う。あくまで個人的感触。

2015-04-23追記
RHEL7.1/CentOS7.1 がリリース済みですが、期待の Btrfs は、引き続きTechnology Previewのままでした。

2015-09-05追記
RHEL7.2 Beta のリリースノートが公開されましたが、期待の Btrfs は、今回もTechnology Previewのままでした。
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7-Beta/html/7.2_Release_Notes/index.html
ですが、カーネルのchangelogを眺めてみると、精力的に取り組んでいる様子が伺えます。RHEL6系カーネルのほうのchangelogには Btrfs: がぽつぽつとしか出てきませんので、見比べればわかります。

2015-11-23追記
RHEL7.2 がリリースされたようですが、やっぱり Btrfs は Technology Preview でした。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/7.2_Release_Notes/index.html

2014年7月5日土曜日

Perlのprintf("%d")の落とし穴

古いマシンで、32bit版のCentOS6を使っているのですが、その環境で手持ちのPerlスクリプトの出力値がおかしく(負値になる)、つまるところ2Gを越える整数値をprintf("%d")で表示しようとすると、オーバーフローするためのようでした。
[root@hoge ~]# cat /etc/redhat-release 
CentOS release 6.4 (Final)
[root@hoge ~]# uname -p
i686
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024;printf("%d\n",$a*$b);'
1073741824
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*2;printf("%d\n",$a*$b);'
-2147483648
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*3;printf("%d\n",$a*$b);'
-1073741824
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*4;printf("%d\n",$a*$b);'
-1
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*5;printf("%d\n",$a*$b);'
-1
現象はわかりましたが、ちゃんと表示できるようにするにはどうしたらいいのか、しばし格闘したのち、%sを使えば、よきに計らってくれることがわかりました。Perlよ、ありがとう。
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*2;printf("%s\n",$a*$b);'
2147483648
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*3;printf("%s\n",$a*$b);'
3221225472
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*4;printf("%s\n",$a*$b);'
4294967296
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*5;printf("%s\n",$a*$b);'
5368709120
あるいは、いったん変数に入れれば、次のように書けます。場合によっては、こちらのほうがいいかも。
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*2;$c=$a*$b;print("$c\n");'
2147483648
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*3;$c=$a*$b;print("$c\n");'
3221225472
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*4;$c=$a*$b;print("$c\n");'
4294967296
[root@hoge ~]# perl -e '$a=1024*1024;$b=1024*5;$c=$a*$b;print("$c\n");'
5368709120
もちろん、64bit環境では%dであっても、負にはなりません。

2014年5月8日木曜日

bash でシェル変数が定義されているかを判定する方法は?

bash でシェル変数が(nullかどうかではなくて)定義されているかを判定したいと思って、調べたのですが、エレガントな方法がみつかりませんでした。

最初は、
if [ "${VAR:-UNDEF}" = "UNDEF" ] ; then
    ...
fi
だろうかと思ったのですが、VAR="" の時も真となってしまうので、微妙に違いました。それと、実際には無いはずとしても VAR="UNDEF" だったら、意図しない状況になってしまうのが引っかかります。処理内容によってはセキュリティホールのタネにもなるのではないか。

書籍調査/ネット検索の末に、
if ! set | grep -m 1 -q ^VAR= ; then
    ... # VARが未定義の場合に行う処理を記述
fi
とするしかなさそうなのですが、もっとエレガントな方法は無いものでしょうかね。現在のマシンでは大した処理コストではないですが、目的に対しては仰仰しいと思いました。
bash にそういった機能(isset のような)があったらいいように思いますが、需要がほとんどないし不要ということだろうか。

2014-05-10追記
匿名様(コメント参照)から情報頂き、
if [ -z "${VAR+x}" ] ; then    # VARが定義済み(nullを含む)の場合 x が返るので、-z でテストすれば OK
    ... # VARが未定義の場合に行う処理を記述
fi
と書けると知りました。少々難しい(慣れの問題?)ですが、手短に書けて良いでね。

2014-05-17追記
RHEL7.0 RC を調べていて、[ -v VAR ] が追加されているのを見つけました。
[root@hoge ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.0 (Maipo)
[root@hoge ~]# bash --version
GNU bash, バージョン 4.2.45(1)-release (x86_64-redhat-linux-gnu)
...
[root@hoge ~]# help test
...
    Other operators:
    
      -o OPTION      True if the shell option OPTION is enabled.
      -v VAR  True if the shell variable VAR is set
...
bash の CHANGES を確認してみると、バージョン 4.2 で追加されたようです。
------------------------------------------------------------------------------
This document details the changes between this version, bash-4.2-alpha,
and the previous version, bash-4.1-release.
...
3.  New Features in Bash
...
f.  test/[/[[ have a new -v variable unary operator, which returns success if
    `variable' has been set.
...
いちおう動作確認です。
[root@hoge ~]# VAR="set" ; [ -v VAR ] ; echo $?
0
[root@hoge ~]# unset VAR ; [ -v VAR ] ; echo $?
1
RHEL6/CentOS6 以下の bash では使えないので、当面は利用できないですが、メモまで。
人気ブログランキングへ にほんブログ村 IT技術ブログへ