2015-11-30

RHEL7: Old PostgreSQL's initdb fails

下記の環境で PostgreSQL 8.4.17 をビルドすると、

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)

# rpm -q gcc
gcc-4.8.3-9.el7.x86_64

initdb コマンドでエラーが発生。

# su - postgres -c "/usr/local/pgsql-8.4.17/bin/initdb -E UTF8 --no-locale -D ./data" ; echo $?
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale C.
The default text search configuration will be set to "english".

creating directory ./data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in ./data/base/1 ... ok
initializing pg_authid ... FATAL:  wrong number of index expressions
STATEMENT:  CREATE TRIGGER pg_sync_pg_database   AFTER INSERT OR UPDATE OR DELETE ON pg_database   FOR EACH STATEMENT EXECUTE PROCEDURE flatfile_update_trigger();

child process exited with exit code 1
initdb: removing data directory "./data"
1

調べると、GCC 4.8 で発生するらしい。

上記では、結局 GCC 4.7 でないと駄目だった模様。他のネット情報を見ても、大体「GCC 4.7 使え」的な感じ。しかし RHEL7 DVD には GCC 4.7 が入っていないので、解決策がそれだと(個人的に)非常に困る。:-(

という状況で、駄目元で 8.4 系の最新(8.4.22)を取ってきたら、何事もなく動いた。助かった! :-D

該当の部分は多分これ。PostgreSQL 8.4 系では、8.4.18 で入っている。一応、8.4.18 で initdb が動くことは確認した。

現時点で、8.2 / 8.3 の HEAD に対しても同様の修正が入っている。私のように困っている人は、HEAD を落としてくると幸せになれるかも。

2015-10-31

Animes in the 3rd quarter of 2015

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

赤髪という時点でヒロインに強い個性を期待してしまうのだが、その意味でヒロインはキャラが弱かった。話は癖なく纏まっているだけに、タイトル負けした感が強い。

前期より視聴。キャラの多さには慣れたが、何故に話を暗くするのか。原作ファンはこれで満足しているのか疑問。唯一、安易にポリゴンに逃げなかった所だけは評価する。

三期目ということで視聴。ここから見ると既に纏めに入った感を受けるが、各キャラの個性は十分に感じられた。しかし、未視聴分を見ようという気までは起きなかった。

ヒロインが個性的で見て楽しいが、中の人の演技に依る所が大きい。相対的に、他キャラが弱い。原作は四コマらしいが、見てるとそうは思えず、よく話を纏めたなと思う。

前期より視聴。股間へのダイブはもう慣れた。遅ればせながら、ようやく委員長の魅力が分かった気がする。あと、初話でのキャラの違和感がパなかったが、二話目から直った?

最近増えてきた声優業界ネタ。個人的には勉強になるので歓迎だが、本職の人は心に刺さって見るのが辛いのでは?と心配する。で結局、堀江由衣はユリエホイでいいのん?

ヒロインと中の人、キャラ絵のマッチングが素晴らしい。欲を言えば、他の女子三人にもう少し頑張ってもらいたい。しかし今のままでも十分なので、是非とも次回を希望。

地上最強の好き嫌いはともかく、途中から激しくグダる。たぶん、誰もこの作品に「犯人は誰だ!?」的な要素は求めていないと思う。で早速、次回もグダる予感しかない。

またタイムリープ物か、と食傷気味。主人公もパッとしないし、話も取って付けたような内容。だが妹の話だけは良かった。あれなら私もシスコンになれる自信がある。

まだ私には難度が高かったらしく、萌えられず。終わりまで新キャラペースが落ちず、しかも後半ほど難度が上がるという。一般人への布教としては、少し性急だったと思う。

シリーズ視聴。もういい加減、ダラーズの話は漏れなく盛り下がるのでやめて欲しい。今後、カラーギャングと折原の話は禁止でお願いします。いや割とマジで。

主人公は全能で王様プレイ、カテゴリ的には中二病作品だが、何故か苦痛なく見られた。にしてもアルベドは立ち位置ヒロインだろうに、あの残念キャラは何とかならなかったのか。

  • 俺物語!!

少女マンガ原作のアタリは久しぶり感。藩めぐみの演技パない。女子キャラも総じて魅力的。ところで砂川くんのキャラ付けは、やはり女子は○モが好き、ということで良いのだろうか。

話題になっている理由が分からなかったが、原画をチラ見して察した。たぶん漫画から入った人は「この漫画は凄い!」、アニメから入った人は「よく分かんない」となる気がする。

ここまで直球だと最早褒めて良いレベル。石上静香は間違いなく株を上げた。ところで個人的に会長がエロくて良いなと思っていたら、光の速さでビッチになっていた件。

何やら壮大なコラボレーション企画のようで、設定などは非常に凝っており感心するレベル。が、アニメ化に際して凡作になった模様。設定を文字で語るのはアニメとして手抜きだと思う。

これこそ勉強のために見なければ、と見たら色んな意味で想像を超えていた。これがオリジナルの雰囲気をどれ程反映しているのか分からないが、色々と勉強になった。

当時のリアルタイム世代は、見るだけで感慨深いものがあると思う。私も該当するため評価が難しいが、たぶん思い出補正がないと、クソつまらないような気はしている。

可もなく不可もなく、お気に入りのキャラも居なかったため、個人的に非常に評価に困る。結局この作品は、SF、友情、恋愛、その他の何がウリだったのだろう。

昔に小説を途中まで既読。なのでキャラデザには違和感しかない。特にダリューンはもっと華奢でないと駄目だろう、と。絵も話も、私には小説の劣化版に見えてしまう。

シリーズ視聴。今回は「美々の夏休みデビュー」、これに尽きる。この回だけで見た甲斐はあった。逆にシリアス系とかバトルとか、つまらないのでもうやらなくて良いです。

絵が好みでないというハンディを最後まで挽回することができなかった。その中で委員長は惜しかったが、私が萌えるにはまだ足りない。

今回が初視聴だが、私の時系列的に「世界一初恋」にしか見えない。まんま同じキャラやん? 同じ出版業界やん? でやっぱ BL やん? つまり作者は、野球漫画におけるあだち充(BL 版)だと理解した。

テンプレの寄せ集め感。普段から格好良さげな主人公に、いざという時まで格好良くさせたら、余程のことがない限りつまらなくなるのになぜ気が付かないのだろうか。

まず主人公をミスリードさせる導入。それでも中盤まではまずまずだったが、最後、突然のゴリ押しにぽかーん。これ、やっぱり少年を主人公にすべきだったのでは。

2015-08-31

RHEL7: screen: Window title is annoying

screen 使いが RHEL7 を使った時、間違いなく不満に思うこと。

ウィンドウタイトルが ウ ザ い

無駄に長いし、cd する度に長さがパタパタ変わるし、ディレクトリを潜る度にどんどん長くなるし、そのせいで簡単に横幅が溢れるし、とても我慢できたものではない。何故これが初期設定なのか理解不能。誰か喜ぶ人いるの?

調べると、PROMPT_COMMAND のせいらしい。手持ちの環境でざっと比べると、

CentOS 5.5: /etc/bashrc:

# are we an interactive shell?
if [ "$PS1" ]; then
	case $TERM in

	# <...snip...>

	screen)
		if [ -e /etc/sysconfig/bash-prompt-screen ]; then
			PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
		else
		PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\033\\"'
		fi
		;;

CentOS 6.2: /etc/bashrc:

    screen)
        if [ -e /etc/sysconfig/bash-prompt-screen ]; then
            PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
        else
            PROMPT_COMMAND='printf "\033]0;%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
        fi
        ;;

RHEL7.1: /etc/bashrc:

    screen*)
      if [ -e /etc/sysconfig/bash-prompt-screen ]; then
          PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
      else
          PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
      fi
      ;;

実は各バージョンで微妙に違った。ともかく、RHEL7 の設定だけは看過できない。暫く考えて、次のスクリプトを配置することにした。

/etc/profile.d/myscreen.sh:

if [ -n "$PROMPT_COMMAND" ] ; then
    case "$TERM" in
	screen*) PROMPT_COMMAND=${PROMPT_COMMAND/\\033*\\033/\\033k\\033} ;;
    esac
fi

(嬉しい)副作用として、.screenrc に下記の設定を入れると、ウィンドウタイトルが実行中のコマンド名になる。root でなく一般ユーザーなら、「#」の代わりに「$」を使う。確認はしていないが、RHEL6 以前でも動くはず。

~/.screenrc:

shelltitle "#|bash"

RHEL7 のこの仕打ちは、tmux 使いの嫌がらせ 老兵は去れというメッセージかも知れないが、老兵と言えども消えゆくにはまだ早い。screen であと十年は戦える。

2015-08-03

Animes in the 2nd quarter of 2015

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

作者のメルマガは(何故か)購読。てっきり、ゆう医師がおっぱいおっぱい言ってる作品かと思ったら、むしろ医師以外がみんな変態で、「心療内科」的には確かに間違ってはいなかった。

前期に続き視聴。原作を知らない私でも、この辺から「ああ、JoJo だな」と感じる。ただ、あれだけ引っ張った割にはディオとの最終決戦が割と呆気ない。

血闘術には独特のセンスを感じる。中二辺りにはウケが良さそう。ただ戦闘を離れたパートがクソつまらないのと、どうにも主人公が好きになれないのでいまいち乗れない。

前シーズンより視聴。今度はアーチャーが面倒臭い奴になったなと思ったら、「ああ、このオチ聞いたことあるわ」と納得。どうやら私は相当に主人公の性格を受け付けないらしい。

元の四コマをただくっ付けただけなのか、全体的にテンポが非常に悪い。原作を読んだことはないが、これでは原作の持ち味を引き出せていないような気がする。

最初に予想したより随分あっさりした展開。親友同士が戦うという設定上、もっと愛憎渦巻く展開を期待したのに。もっとも今後そうなるのかも知れないので様子見。

長い主人公の回想が終わったと思ったら、どこからか湧いてきた女子たちによる主人公の奪還作戦。エロゲ原作なのにエロもなく、何をどう評価して良いのか分からない。

原作は途中まで既読。ヒロインを始めとする女子キャラの魅力は損なわれずに移植できていると思う。連載は結構長かった気がするが、一クールに収まるとは相当削ったのかも知れない。

仕事を選ばないサンリオが、まさかの萌えの世界に。SD キャラの必然性が最後まで分からなかったが、これで音ゲーを出す未来までは見えた。今回は、稲川英里を覚えた。

最初はヒロインのオヤジっぽさにドン引きするが、見続けていると慣れる。それでも全体的に取って付けた感は拭えない。そもそも何故これをアニメ化しようと思ったのか。

前作は視聴したはずだが殆ど覚えてない。今作はこれといった敵も居らず、ひたすら内輪で馴れ合っているだけの印象。そもそも負かした相手に指南してもらうってどうなの。

悲しい結末を迎えることが分かりきっている設定は余り好きではない。予想したよりはずっと良い話に纏まったが、ともすると鬱になる危うい設定だと思う。

キャラクターはおっぱいの押し売り。正直これを書いてる今も、おっぱい大きかったなー、くらいしか思い出せなくて困る。

前作より視聴。相変わらずの鉄板クオリティ。何も言うことはないので、この調子で続きを頼む。

「例の紐」と聞いて。正直それのためだけの視聴だったが、なにこれ、SAO より余程おもしろい。やはり、主人公が全能なのは作品をつまらなくするのだと再認識。

ぼっち待望の続編。途中がグジるのと終わりが良く分からないのを除けば、全体としては満足。で、これ続くの? ていうか続かないと先が気になるんだけど。

最近やたらタイムリープ物が多いな。本作は前半の伏線を後半できっちり回収できている感じで、もう一回見ようと思えるくらいには優秀。でも OP にしょこたんは要らんかったわ。

2015-07-15

RHEL7: `firewalld' dies at `reload'

firewalld の reload が失敗する。正確には、reload は成功するが firewalld が死ぬ。しかも死ぬのは決まって 2 回目の reload で、初回は上手くいく。

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)

# systemctl restart firewalld ; echo $?
0

# systemctl status firewalld ; echo $?
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Wed 2015-07-15 18:12:16 JST; 5s ago
  Process: 4566 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 4597 (firewalld)
   CGroup: /system.slice/firewalld.service
           `-4597 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Jul 15 18:12:16 rhel7 systemd[1]: Starting firewalld - dynamic firewall dae.....
Jul 15 18:12:16 rhel7 systemd[1]: Started firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
0

# systemctl reload firewalld ; echo $?
0

# systemctl status firewalld ; echo $?
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Wed 2015-07-15 18:12:16 JST; 33s ago
  Process: 4924 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 4597 (firewalld)
   CGroup: /system.slice/firewalld.service
           `-4597 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Jul 15 18:12:16 rhel7 systemd[1]: Starting firewalld - dynamic firewall dae.....
Jul 15 18:12:16 rhel7 systemd[1]: Started firewalld - dynamic firewall daemon.
Jul 15 18:12:27 rhel7 systemd[1]: Reloading firewalld - dynamic firewall daemon.
Jul 15 18:12:27 rhel7 systemd[1]: Reloaded firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
0

# systemctl reload firewalld ; echo $?
0

# systemctl status firewalld ; echo $?
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: inactive (dead) since Wed 2015-07-15 18:12:53 JST; 3s ago
  Process: 5266 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 4597 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=killed, signal=HUP)
 Main PID: 4597 (code=killed, signal=HUP)

Jul 15 18:12:16 rhel7 systemd[1]: Starting firewalld - dynamic firewall dae.....
Jul 15 18:12:16 rhel7 systemd[1]: Started firewalld - dynamic firewall daemon.
Jul 15 18:12:27 rhel7 systemd[1]: Reloading firewalld - dynamic firewall daemon.
Jul 15 18:12:27 rhel7 systemd[1]: Reloaded firewalld - dynamic firewall daemon.
Jul 15 18:12:53 rhel7 systemd[1]: Reloading firewalld - dynamic firewall daemon.
Jul 15 18:12:53 rhel7 systemd[1]: Reloaded firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
3

systemd 経由ではなく、「firewall-cmd --reload」で reload すると問題は起こらない。

# systemctl restart firewalld ; echo $?
0

# systemctl status firewalld ; echo $?
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Wed 2015-07-15 18:13:22 JST; 2s ago
  Process: 5266 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 5271 (firewalld)
   CGroup: /system.slice/firewalld.service
           `-5271 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Jul 15 18:13:22 rhel7 systemd[1]: Starting firewalld - dynamic firewall dae.....
Jul 15 18:13:22 rhel7 systemd[1]: Started firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
0

# firewall-cmd --reload ; echo $?
success
0

# systemctl status firewalld ; echo $?
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Wed 2015-07-15 18:13:22 JST; 18s ago
  Process: 5266 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 5271 (firewalld)
   CGroup: /system.slice/firewalld.service
           `-5271 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Jul 15 18:13:22 rhel7 systemd[1]: Starting firewalld - dynamic firewall dae.....
Jul 15 18:13:22 rhel7 systemd[1]: Started firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
0

# firewall-cmd --reload ; echo $?
success
0

# systemctl status firewalld ; echo $?
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Wed 2015-07-15 18:13:22 JST; 39s ago
  Process: 5266 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 5271 (firewalld)
   CGroup: /system.slice/firewalld.service
           `-5271 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Jul 15 18:13:22 rhel7 systemd[1]: Starting firewalld - dynamic firewall dae.....
Jul 15 18:13:22 rhel7 systemd[1]: Started firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
0

どうやら firewalld の HUP 受信処理に問題がありそうだ。試しに firewalld プロセスに直接 HUP シグナルを送ってみると、現象が再現した。最初の HUP 処理後にシグナルハンドラーを再登録してないっぽい? (ソースコードは未確認)

以上より、

  • 「systemctl reload firewalld」ではなく、「firewall-cmd --reload」を使うべし。
  • もしくは「systemctl restart firewalld」を使う。(但し確立中の接続は切れるかも?)

今後これが修正されるとしても、firewalld のバージョンに依存しないように RHEL7 では上記を徹底するのが良いかも知れない。もちろん嫌なバッドノウハウであることは認める。:-(

ググってみると、Red Hat Bugzilla には見当たらなかったが、CentOS の方で報告されていた。本家の方でも待っていればそのうち直ると思われる。


2016-05-31 追記

Red Hat Bugzilla にも登録された模様。

2015-06-28

Makefile: Here document

Makefile にターゲットを色々詰め込んでいくと、ターゲットの一覧をヘルプで表示させたくなる。そのようなターゲット「help」を作るのは簡単だが、毎行 echo するとか毎行末 \ エスケープするとか面倒なことはやりたくない。そうなると、じゃあヒアドキュメントはできないの?ってなるが、Makefile 文法とヒアドキュメント文法の相性が悪すぎて正攻法ではどうにもならない。というか私には無理だった。

環境変数を使え、と。なるほど、make に文字列を展開させるのではなく、シェルに実行時展開させれば良いのか。そうすれば make による文法解析を回避できる。

Makefile:

export _help_msg
override define _help_msg
Targets:
  compile    Compile and build sources.
  install    Install into the PREFIX.
  uninstall  Uninstall the installed files.
  clean      Remove all generated files.
  help       This message.
Variables:
  PREFIX     The path to be installed.
endef

help:
	@echo "$$_help_msg"

compile:
install:
uninstall:
clean:
# make help
Targets:
  compile    Compile and build sources.
  install    Install into the PREFIX.
  uninstall  Uninstall the installed files.
  clean      Remove all generated files.
  help       This message.
Variables:
  PREFIX     The path to be installed.

ただし、この方法は環境変数を export するので子プロセスに影響を与える可能性が残るのが少し気持ち悪い。あとエディターによっては(Emacs とか)、行中に半端なクォート(「'」「"」)があると色付けが破綻する。まあ毎行 echo するよりはマシ、ということで妥協するしかないか。

2015-05-21

RHEL7: Set RTC to local time

ようやく RHEL7 を触り始めたので、その辺の話題を。

RHEL7 をインストールした日本人が最初に困るであろうことの 1 つが、OS 時刻がずれていること。これは RTC (要は BIOS 時刻)が UTC と扱われることが原因。RHEL6 まではインストール時に UTC にするかどうか選択できていたのに、RHEL7 では問答無用で UTC になる。

[rhel7]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)

[rhel7]# timedatectl status
      Local time: Fri 2015-05-22 02:04:00 JST
  Universal time: Thu 2015-05-21 17:04:00 UTC
        RTC time: Thu 2015-05-21 17:04:00
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

[rhel7]# cat /etc/adjtime
0.0 0 0.0
0
UTC

上記で RTC 時刻は日本時刻に合っているが、OS 時刻はそれより 9 時間進んでいる。

まあこれは FAQ なので、ググればすぐに「timedatectl set-local-rtc 1」すれば良いことは分かるし、公式ドキュメントにも記載がある。

[rhel7]# timedatectl set-local-rtc 1

[rhel7]# timedatectl status
      Local time: Fri 2015-05-22 02:04:49 JST
  Universal time: Thu 2015-05-21 17:04:49 UTC
        RTC time: Fri 2015-05-22 02:04:50
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: yes
      DST active: n/a

Warning: The RTC is configured to maintain time in the local timezone. This
         mode is not fully supported and will create various problems with time
         zone changes and daylight saving adjustments. If at all possible use
         RTC in UTC, by calling 'timedatectl set-local-rtc 0'.

[rhel7]# cat /etc/adjtime
0.0 0 0.0
0
LOCAL

これで確かに RTC は local time になる。しかし OS 時刻は進んだままだし、今度は RTC 時刻までもが進んでしまった。恐らくこれは皆が望む結果ではない。少なくとも私は望まない。これを私が望む結果にするには、set-local-rtc 時にオプション --adjust-system-clock を使う。(詳しくは、man timedatectl)

[rhel7]# timedatectl status
      Local time: Sat 2015-05-23 02:09:00 JST
  Universal time: Fri 2015-05-22 17:09:00 UTC
        RTC time: Fri 2015-05-22 17:09:00
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

[rhel7]# cat /etc/adjtime
0.0 0 0.0
0
UTC

[rhel7]# timedatectl set-local-rtc 1 --adjust-system-clock

[rhel7]# timedatectl status
      Local time: Fri 2015-05-22 17:11:04 JST
  Universal time: Fri 2015-05-22 08:11:04 UTC
        RTC time: Fri 2015-05-22 17:11:04
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: yes
      DST active: n/a

Warning: The RTC is configured to maintain time in the local timezone. This
         mode is not fully supported and will create various problems with time
         zone changes and daylight saving adjustments. If at all possible use
         RTC in UTC, by calling 'timedatectl set-local-rtc 0'.

[rhel7]# cat /etc/adjtime
0.0 0 0.0
0
LOCAL

これで私が望む結果になった。まあ普通の人は「set-local-rtc した後で時刻を合わせ直すから問題ない」で終了しそうだが。

ところで RTC を local time にすると、上記のようにいちいち Warning が出るようになる。言っていることは分かるが、UTC にすると BIOS 時刻がずれてしまうのが気持ち悪い。

例えばインターネットに繋がっている環境では自動的に時刻同期するので、何も意識せずに RHEL7 を使っている人も多いと思う。そういうシステムでは多分このようになっている。

[rhel7]# timedatectl status
      Local time: Thu 2015-05-21 17:17:31 JST
  Universal time: Thu 2015-05-21 08:17:31 UTC
        RTC time: Thu 2015-05-21 08:17:31
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

OS 時刻は日本時間に合っているが、RTC 時刻は(UTC なので) 9 時間遅れている。システム管理者とは別の SE がハードウェア保守をやっている場合、「毎回 BIOS 時刻を直しているのにまた狂った。このサーバーは変だ!」と騒ぎ出すかも知れない。それ以前、大抵は RHEL7 を使っている当人でさえ、BIOS 時刻を見る度に「?」ってなるだろう。

ちなみに RHEL5 / RHEL6 では、UTC を local time にするのに下記を使っていた。昔のことなのであまり覚えていないが、当時も私が望む結果にするため、色々と調べた記憶はある。

if grep '^UTC$' /etc/adjtime ; then
    hwclock --hctosys --local && hwclock --adjust --local
fi

これはそのまま RHEL7 でも動くが、変更結果を timedatectl コマンドの方に反映させるには、systemd-timedated を再起動する必要がある。


2015-08-13 追記

ということで、私としては一件落着したつもりだった。ところが!

RTC を local time にすると、OS 起動時に ログのタイムスタンプがずれる ことに気が付いた。

次のように local time になっている状態で、OS を再起動してみる。

[rhel7]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)

[rhel7]# timedatectl
      Local time: Thu 2015-08-13 11:47:46 JST
  Universal time: Thu 2015-08-13 02:47:46 UTC
        RTC time: Thu 2015-08-13 11:47:46
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: yes
      DST active: n/a

Warning: The RTC is configured to maintain time in the local timezone. This
         mode is not fully supported and will create various problems with time
         zone changes and daylight saving adjustments. If at all possible use
         RTC in UTC, by calling 'timedatectl set-local-rtc 0'.

[rhel7]# reboot

その時の /var/log/messages の抜粋。

Aug 13 11:48:25 rhel7 systemd: Stopping user-0.slice.
Aug 13 11:48:25 rhel7 systemd: Removed slice user-0.slice.
Aug 13 11:48:25 rhel7 systemd: Stopping Dump dmesg to /var/log/dmesg...
Aug 13 11:48:25 rhel7 rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="486" x-info="http://www.rsyslog.com"] exiting on signal 15.
Aug 13 11:48:42 rhel7 rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="486" x-info="http://www.rsyslog.com"] start
Aug 13 20:48:34 rhel7 journal: Runtime journal is using 4.6M (max 37.0M, leaving 55.6M of free 366.1M, current limit 37.0M).
Aug 13 20:48:34 rhel7 kernel: Initializing cgroup subsys cpuset
Aug 13 20:48:34 rhel7 kernel: Initializing cgroup subsys cpu
Aug 13 20:48:34 rhel7 kernel: Initializing cgroup subsys cpuacct
Aug 13 20:48:34 rhel7 kernel: Linux version 3.10.0-229.el7.x86_64 (mockbuild@x86-035.build.eng.bos.redhat.com) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC) ) #1 SMP Thu Jan 29 18:37:38 EST 2015
Aug 13 20:48:34 rhel7 kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-229.el7.x86_64 root=UUID=7aa3d286-206c-4938-82ce-cfbc6635c417 ro crashkernel=auto rhgb quiet LANG=ja_JP.UTF-8
<...snip...>
Aug 13 20:48:36 rhel7 systemd: Starting Switch Root.
Aug 13 20:48:36 rhel7 systemd: Reached target Switch Root.
Aug 13 20:48:36 rhel7 systemd: Started Plymouth switch root service.
Aug 13 20:48:36 rhel7 systemd: Starting Switch Root...
Aug 13 20:48:36 rhel7 systemd: Switching root.
Aug 13 20:48:36 rhel7 journal: Journal stopped
Aug 13 11:48:38 rhel7 journal: Runtime journal is using 4.6M (max 37.0M, leaving 55.6M of free 366.0M, current limit 37.0M).
Aug 13 11:48:38 rhel7 journal: Runtime journal is using 4.6M (max 37.0M, leaving 55.6M of free 366.0M, current limit 37.0M).
Aug 13 11:48:38 rhel7 systemd-journald[90]: Received SIGTERM
Aug 13 11:48:38 rhel7 kernel: type=1404 audit(1439466516.972:2): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295
Aug 13 11:48:38 rhel7 kernel: type=1403 audit(1439466517.276:3): policy loaded auid=4294967295 ses=4294967295
Aug 13 11:48:38 rhel7 systemd[1]: Successfully loaded SELinux policy in 322.882ms.
Aug 13 11:48:38 rhel7 systemd[1]: RTC configured in localtime, applying delta of 540 minutes to system time.
Aug 13 11:48:38 rhel7 systemd[1]: Relabelled /dev and /run in 39.287ms.
Aug 13 11:48:38 rhel7 journal: Journal started
Aug 13 11:48:38 rhel7 systemd: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)

ある期間だけ、タイムスタンプがずれている。前後関係から、rsyslogd が落ちている間に journald が溜め込んだログのように見える。9 時間戻る(UTC 時刻になる)のならともかく、9 時間進むというのは良く分からない。

一方、RTC が UTC の場合、

[rhel7]# timedatectl
      Local time: Thu 2015-08-13 11:51:56 JST
  Universal time: Thu 2015-08-13 02:51:56 UTC
        RTC time: Thu 2015-08-13 02:51:57
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

[rhel7]# reboot

今度はタイムスタンプはずれない。(正確には、ちょっとずれるけど大きくはずれない)

Aug 13 11:52:14 rhel7 systemd: Stopping user-0.slice.
Aug 13 11:52:14 rhel7 systemd: Removed slice user-0.slice.
Aug 13 11:52:14 rhel7 systemd: Stopping Dump dmesg to /var/log/dmesg...
Aug 13 11:52:14 rhel7 systemd: Stopped Dump dmesg to /var/log/dmesg.
Aug 13 11:52:14 rhel7 systemd: Stopping Multi-User System.
Aug 13 11:52:14 rhel7 systemd: Stopped target Multi-User System.
Aug 13 11:52:14 rhel7 systemd: Stopping Command Scheduler...
Aug 13 11:52:14 rhel7 rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="486" x-info="http://www.rsyslog.com"] exiting on signal 15.
Aug 13 11:52:30 rhel7 rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="487" x-info="http://www.rsyslog.com"] start
Aug 13 11:52:23 rhel7 journal: Runtime journal is using 4.6M (max 37.0M, leaving 55.6M of free 366.1M, current limit 37.0M).
Aug 13 11:52:23 rhel7 kernel: Initializing cgroup subsys cpuset
Aug 13 11:52:23 rhel7 kernel: Initializing cgroup subsys cpu
Aug 13 11:52:23 rhel7 kernel: Initializing cgroup subsys cpuacct
Aug 13 11:52:23 rhel7 kernel: Linux version 3.10.0-229.el7.x86_64 (mockbuild@x86-035.build.eng.bos.redhat.com) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC) ) #1 SMP Thu Jan 29 18:37:38 EST 2015
Aug 13 11:52:23 rhel7 kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-229.el7.x86_64 root=UUID=7aa3d286-206c-4938-82ce-cfbc6635c417 ro crashkernel=auto rhgb quiet LANG=ja_JP.UTF-8
<...snip...>
Aug 13 11:52:25 rhel7 systemd: Starting Switch Root.
Aug 13 11:52:25 rhel7 systemd: Reached target Switch Root.
Aug 13 11:52:25 rhel7 systemd: Started Plymouth switch root service.
Aug 13 11:52:25 rhel7 systemd: Starting Switch Root...
Aug 13 11:52:25 rhel7 systemd: Switching root.
Aug 13 11:52:25 rhel7 journal: Journal stopped
Aug 13 11:52:27 rhel7 journal: Runtime journal is using 4.6M (max 37.0M, leaving 55.6M of free 366.0M, current limit 37.0M).
Aug 13 11:52:27 rhel7 journal: Runtime journal is using 4.6M (max 37.0M, leaving 55.6M of free 366.0M, current limit 37.0M).
Aug 13 11:52:27 rhel7 systemd-journald[90]: Received SIGTERM
Aug 13 11:52:27 rhel7 kernel: type=1404 audit(1439434345.778:2): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295
Aug 13 11:52:27 rhel7 kernel: type=1403 audit(1439434346.070:3): policy loaded auid=4294967295 ses=4294967295
Aug 13 11:52:27 rhel7 systemd[1]: Successfully loaded SELinux policy in 307.437ms.
Aug 13 11:52:27 rhel7 systemd[1]: Relabelled /dev and /run in 39.670ms.
Aug 13 11:52:27 rhel7 journal: Journal started
Aug 13 11:52:27 rhel7 systemd: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)

OS 起動時だけとはいえ、ログのタイムスタンプがずれることを許容したくない場合はあるだろう。その場合、RTC は UTC にしておく必要がある。

実際 RHEL7 を触っていると、今回みたく酷いものでなくても、RTC が UTC であることを前提としている印象を受けることがある。今までは私も「そうは言ってもねえ、」とそれに抗っていたが、今回の件でスッパリと諦めた。正直、他にどういう副作用があるか知れない。なので現時点での結論は、

RHEL7 で余計な面倒に遭いたくないなら、RTC は UTC にしとけ。

後は、BIOS 時刻(9 時間遅れている)を見た人が、時刻を直して くれない ことを祈るのみ。