コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2009年4月10日 >>> 2009年4月1日
link もっと後

2009年4月8日

同じはずの環境

サーバでプログラムをmakeすると、挙動が違うことに気づきました。

例えばsed-4.1.5ですと、デスクトップのVM上でコンパイルすると何事もなく成功するのに、サーバでコンパイルするとsed-4.1.5/po以下の *.poファイルを更新しようとして失敗し、コンパイルがコケてしまいます。

デスクトップ、サーバともにDebian GNU/Linux 5.0(Lenny)ですから、コンパイラを始めとしたツールの差はなく、環境変数も同じですし、全く同じソースを利用しています。にも関わらずコンパイルに成功したり、しなかったりするのはなんなのでしょうか?

違いを追え

どうやら使っているツールや環境変数、ソースコードまで同じなのに動作が異なるという現象が起きうるようです。

まずはオーソドックスな手順(※)でコンパイルを進めてみて、違いが出る場所を調べました。configureのログは違いなしですが、makeのログは一行目から既に違っています。

make実行結果(デスクトップ)
make  all-recursive
make[1]: Entering directory `/home/katsuhiro/build/sed-4.1.5'
Making all in intl
make[2]: Entering directory `/home/katsuhiro/build/sed-4.1.5/intl'
(... 以下、略 ...)

デスクトップではビルド用のディレクトリ(build/sed-4.1.5)に入って、コンパイルが始まります。

make実行結果(サーバ)
cd /home/katsuhiro/src/sed-4.1.5 && /bin/sh /home/katsuhiro/src/sed-4.1.5/config/missing --run aclocal-1.9 -I config
 cd /home/katsuhiro/src/sed-4.1.5 && /bin/sh /home/katsuhiro/src/sed-4.1.5/config/missing --run automake-1.9 --gnits
doc/Makefile.am:29: docdir was already defined in condition TRUE, which includes
 condition BUILD_HTML ...
(... 以下、略 ...)

対するサーバではソース用のディレクトリ(src/sed-4.1.5)に入って、configureやMakefileの更新が始まります。

なぜこんな違いが出るかというと、ビルドディレクトリのMakefile(build/sed-4.1.5/Makefile)にある、ACLOCAL_M4ターゲットが適用されるか、されないかが異なるためです。

ACLOCAL_M4ターゲット

(... 関係ない部分なので略 ...)

48: ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
49: am__aclocal_m4_deps = $(top_srcdir)/config/codeset.m4 \r(... 中略 ...)
60: 	$(top_srcdir)/config/strverscmp.m4 $(top_srcdir)/configure.ac

(... 関係ない部分なので略 ...)

92: ACLOCAL = ${SHELL} /home/katsuhiro/src/sed-4.1.5/config/missing --run aclocal-1.9

(... 関係ない部分なので略 ...)

260: $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
261: 	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)

(... 関係ない部分なので略 ...)

一応補足しておくと260行目の定義は「ソースディレクトリのaclocal.m4がconfig/*.m4より古かったら、missing --run aclocal-1.9を実行してね。」という意味です。

つまりデスクトップではaclocal.m4が古いとみなされないのに、サーバではaclocal.m4が古いとみなされるという違いがあるのです。

(※)sedに限らずGNU autotoolsを使ったソースコードをコンパイルする際は、ソースを展開したディレクトリ(例: ~/src/sed-4.1.5)の他に、ビルド用のディレクトリ(例: ~/build/sed-4.1.5)を作成し、ビルド用のディレクトリでコンフィグおよびコンパイル(例: cd ~/build/sed-4.1.5 && ~/src/sed-4.1.5/configure && make && make install)ができます。

更新時刻が違う

どうやらデスクトップとサーバではファイルの新旧が異なるようです。

ではmakeがファイルの新旧をどう判断しているかというと、実はファイルの更新時刻を比較しているだけです。ですからデスクトップではaclocal.m4とconfig/*.m4が同じ更新時刻になっているが、サーバでは更新時刻が異なっていてなおかつaclocal.m4の方が古い時刻になっている、と考えられます。

ファイルの更新時刻はlsコマンドでわかりますが、より詳しい更新時刻を見るためにls --full-timeオプションをつけて調べます。

更新時刻(デスクトップ)
$ ls --full-time aclocal.m4 config/*.m4
-rw-r--r-- 1 katsuhiro katsuhiro 31965 2009-04-08 21:59:07.000000000 +0900 aclocal.m4
-rw-r--r-- 1 katsuhiro katsuhiro   894 2009-04-08 21:59:07.000000000 +0900 config/codeset.m4
-rw-r--r-- 1 katsuhiro katsuhiro  1394 2009-04-08 21:59:07.000000000 +0900 config/getline.m4
(... 中略 ...)
-rw-r--r-- 1 katsuhiro katsuhiro   733 2009-04-08 21:59:07.000000000 +0900 config/strverscmp.m4

デスクトップではナノ秒の部分は全て0に設定されており、どのファイルも同じ更新時間です。

更新時刻(サーバ)
$ ls --full-time aclocal.m4 config/*.m4
-rw-r--r-- 1 katsuhiro katsuhiro 31965 2009-04-08 22:00:53.953952850 +0900 aclocal.m4
-rw-r--r-- 1 katsuhiro katsuhiro   894 2009-04-08 21:59:33.965953865 +0900 config/codeset.m4
-rw-r--r-- 1 katsuhiro katsuhiro  1394 2009-04-08 21:59:33.977953882 +0900 config/getline.m4
(... 中略 ...)
-rw-r--r-- 1 katsuhiro katsuhiro   733 2009-04-08 21:59:34.005955390 +0900 config/strverscmp.m4

一方、サーバではナノ秒の部分にも数値が設定されており、どのファイルも異なる更新時間です。

ファイルシステムが違う

どうやらデスクトップとサーバではファイルの更新時刻が違うらしいことがわかりました。何が原因かというと、実はファイルシステムが違っていたのです。

デスクトップで使用しているReiserFSやext3では、更新時間のナノ秒部分に常に0を代入します。対してサーバで使用しているXFSでは、更新時間のナノ秒部分まできっちり時間を設定します。

結果、ReiserFSやext3上では同時刻と判断されmakeに無視されるようなファイルも、XFS上では更新時刻が異なると判断され、makeがあちこちのファイルを更新して回る現象が起きてしまうわけです。

おそらくtarなどはアーカイブの展開時にutimeで更新時刻を秒単位で上書きしているはずです。XFSに対して更新時刻を秒単位でいじると、同じ時刻に設定したつもりでも、ナノ秒部分が残ってしまって異なる時刻と判断される、なんてことが起きている可能性がありますね。これは追々調べたいと思います。

そもそも悪いのは

デスクトップとサーバではファイルシステムが違うせいでmakeの動作が変わることがわかりました。が、問題はそこではなくて、きちんとコンパイルできないのはsedが悪いのであって、ファイルシステムのせいではありません。本来、ReiserFSでもXFSでもコンパイルできないといけないはずです。

しかしコンパイルで問題が出るのは大抵GNU autotoolsやGNU gettextですから、100%sedが悪いとも言えません。こやつらはバージョン間で仕様がメチャクチャに変わりまくるので、ちょっとバージョンが違うとトラブルが起きます(※2)。

結局、悪いのは誰なのか良くわかりません。長々書いたわりに歯切れが悪い…。

(※2)バージョン間の差を理解してさっと直せれば良いのですが、GNU autotoolsやGNU gettextの激変する仕様について行くのは至難の業です。

編集者:すずき(2010/07/23 23:32)

コメント一覧

  • すずきさん(2010/07/23 10:56)
    1つ目の「更新時刻(サーバ)」は間違い。
    「更新時刻(デスクトップ)」です。
    あとで訂正します。
  • すずきさん(2010/07/23 23:33)
    訂正完了。
open/close この記事にコメントする



2009年4月6日

適当な投資=投棄

昨今の投資ブーム(リーマンショック前ですね)に乗っかって投資したは良いものの、金融危機や日本経済のかつてない凋落に直面、今はもう涙が出るばかり…という方はたくさんいるんじゃないでしょうか。

私もその一人でして、調子に乗ってFXに挑戦してみたものの、失敗して15万くらい損を出しました。ここでやめておけば良かったのですが…。

リーマンショック後に「円高の今こそ外貨買いだ!!」と再挑戦したのが運の尽き。買った後も円高が進み(=外貨が下がる)損は増えるばかり。50万以上の含み損をかかえました。

しかもロスカットを嫌って保証金を積み増したため、投資額が雪だるま式に増え、泥沼です。もう損切りする勇気も沸きません。

いい加減な投資は、金を捨てるに等しいですね。

昨今

そんなこんなで放置してたFXのポジションですが、株価が徐々に回復し為替も異常な円高から脱出したことで、やや風向きが変わってきました。

あれだけ真っ赤っかに大損こいてたFXのポジションも、なんとか見るに堪える金額になってきました。そろそろ処分すべきだろうなあ。いやはや高い勉強代であった。

編集者:すずき(2009/04/06 22:05)

コメント一覧

  • hdkさん(2009/04/07 06:35)
    あるあるw いやさすがに 50 万はないけど、10 万くらいのところで「これは向いてないな」と考えてさっさと引き上げました。
  • すずきさん(2009/04/08 02:14)
    >hdk さん
    自分も 10万負けで手じまいすれば良かったのですが、くやしくて続けてしまったのが良くなかったようです。
    何事も引き際は大事ですね。
open/close この記事にコメントする



2009年4月5日

ババロア

ホワイトデーにハンドミキサーを大下さんにプレゼントしたわけですが「普段はハンドミキサーが必要になる料理はしないんですが…。」なんて悲しいことを言われてしまいました。

そんなこと言わないで、せっかく買ったんだし使ってよってことで、ハンドミキサーを使うお菓子をリクエストしました。ババロアです。

私もお菓子作りを手伝いましたが、難しいことはできないので、私は主にハンドミキサー係に。やっぱり大下さんはハンドミキサーをあまり使わないまま、ババロアを作り終わってしまいました。

まあ、いいか。いつか役に立つだろう。うん。

できあがったババロアは冷やしが足りなくて若干ユルユルでしたが、おいしかったです。あと、どのお菓子にも言えるけど、調子に乗ってたくさん作ってはイカン。食いきれないから。

編集者:すずき(2009/05/13 23:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2009年4月3日

HDD増設

以前サーバとともに(2009年1月14日の日記参照)購入したHDDが5台入るケースですが、2台空きがあったので今回HDDを買い足して埋めました。

今までは1TB HDDが3台入っていました。
真面目にRAID-5を作成すると2TBの容量(HDD 1台1TB * (HDD 3台 - パリティ用HDD 1台) = 2TB)となりますが、私は4台構成(1TB * (4台 - 1台) = 3TB)のRAID-5を作成し、縮退モード(アレイからHDDが1台欠けた状態)で運用していました。

こうすると手持ちのHDDの容量がフルに使えます(1TB HDD 3台で3TBの容量)が、HDDが1台でも故障するとデータが飛んでしまう、耐故障性の低い状態になります。耐故障性のないRAID-5なんて意味がないので、今回2台買い足すに当たって5台構成(1TB * (5台 - 1台) = 4TB)に変更することにしました。

予想外の遅さ

買ってきたHDDを増設したはいいものの、RAIDの再構築には非常に時間がかかります。

縮退モードからRAIDを拡張するには「縮退モードの解消」と「アレイの拡張」の2つの作業が必要です。

まず縮退モードの解消をするため、4台目のHDDをアレイに加えます。すぐにアレイのrebuildが始まります。rebuildが終わると縮退モードが解消されて、4台構成のRAID-5となります。rebuildは20MB/sくらいで進みます(約14時間)。

次に5台目のHDDをアレイに加えます。その後、アレイの拡張を行います。すぐにアレイのreshapeが始まります。reshapeが終わると5台構成のRAID-5が完成します。reshapeは6MB/sくらいしか出ないようです(約48時間)。

以上の手順を踏めばrebuildとreshape 1回ずつで5台構成のRAID-5が完成するはずです。が、私はうまくないことに作業手順を間違え、5台目のHDDをアレイに追加せずにHDD 4台のままアレイを5台構成に変更してしまいました。そのせいで5台構成の縮退モードが構成されてしまいました。

そうすると何が悲しいかっていうと、5台目のHDDを追加するときに再びrebuildが必要になってしまうのです。やり直したくてもreshapeは途中で止められないし、もう待つしかない。む…無念なり。

編集者:すずき(2009/04/08 02:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2009年4月10日 >>> 2009年4月1日
link もっと後

管理用メニュー

link 記事を新規作成

<2009>
<<<04>>>
---1234
567891011
12131415161718
19202122232425
2627282930--

最近のコメント5件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/26 03:20