Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2006-02-28 (Tue)

続・ext3でnano second

id:hirose31:20060221の続編。

パッチのキーワード(big inode、EXT[23]_GOOD_OLD_INODE_SIZE、inode_sizeあたり)でe2fsprogsのソースを探索して、mke2fsのアンドキュメントなオプション-Iを発見。-Iはinodeのサイズを指定するもので、デフォルトで128、最大で1024を指定可能。

ためしに-I 256でmke2fsしてみる。

# mke2fs -j -I 256 /dev/sdb1
(snip)
# tune2fs -l /dev/sdb1 | grep 'Inode size'
Inode size:               256

ほんでもってmountしてファイルを作ってみる。

# mount -t ext3 /dev/sdb1 /nano
# ls --full-time /nano/foo
-rw-r--r--  1 root root 0 2006-02-28 13:05:26.615535176 +0900 /nano/foo
# stat /nano/foo
  File: `/nano/foo'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 812h/2066d      Inode: 12          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2006-02-28 13:05:26.615535176 +0900
Modify: 2006-02-28 13:05:26.615535176 +0900
Change: 2006-02-28 13:05:26.615535176 +0900

nano secondキター!

ちなみに、XFSはなんもしなくてもnano sec。ReiserFSはv4でもnano secではないようです。

んで、なんでnano secondにこだわるかというとこういうことです。

NFSで、

  • 同じファイルに対して
  • ある一秒の間に
  • 複数の異なるNFSクライアントホストから
  • 同じサイズのデータを
  • 書き込んだ

な場合に、正しいデータが読み出せないからです。

具体的にはこうです。

NFSクライアントホストC1とC2があるとして、時系列に次の処理が行われました。

  • ある一秒の間に
    1. C1があるファイルからreadしたら「abc」を得ました。
    2. C1があるファイルに「abc」をwriteしました。
    3. C2があるファイルからreadしたら「abc」を得ました。
    4. C2があるファイルに「xyz」をwriteしました。

この後、数秒後に、C1があるファイルをreadすると、「xyz」が得られるのが正しいのですが、「abc」が得られてしまいます。(C2は正しく「xyz」が得られます)

原因はlinux/fs/nfs/inode.cのnfs_refresh_inodeにあります。ここでは、NFSサーバのファイルが変更されているかどうかを、

  • mtime
  • ファイルサイズ

で確認しています。

つまり、この2つの条件が同じであれば、ファイルは更新されていないとみなされて、NFSクライアントに保持されているキャッシュが使われます。これがC1で「xyz」ではなく「abc」がreadされる理由です。

ファイルサイズが同一になるのは場合によってはまぁしかたないとして、mtimeが同じになってしまうのは、NFSサーバ側のファイルシステムのmtimeの分解能が秒であることがその原因です。少なくともLinuxNFSサーバ/クライアントの実装ではNFS的に秒以下のmtimeを扱えるようになっているので、NFSサーバ側のファイルシステムを秒より小さいmtimeを扱えるものにしてあげればこの問題は発生しなくなります。

ほんじゃ、nano secondサポートしているXFSでいいじゃんとなるわけですが、ちょっとした事情でXFSだと不都合があるので、他のファイルシステムでnano secondサポートできないか調べていたわけです。

参考までに、nano second以外のとりあえず的なほかの対応方法は以下の通り。

  • ダミーデータをつけたりして、writeするごとにファイルサイズが異なるようにする。
  • writeするときにrename(2)してinodeを変える。
  • ロックしたりして、書き込み間隔を一秒以上あけるようにする。

minipc.jp - ミニピーシードットジェイピー

小さいPC屋さん。

NICが2つあるんで、おうちルータ+サーバなんかでよさげ。

2006-02-27 (Mon)

TrueZIP

Read/Write ZIP files using File/FileInputStream/FileOutputStream

2006-02-26 (Sun)

2006-02-24 (Fri)

iptables tutorial

「チュートリアル」と題していますが、iptablesの内部処理までよぉくわかります。

LDP, JFのドキュメントを一通り読んだ人向け。

2006-02-23 (Thu)

ログがエスケープされる

mod_log_config - Apache HTTP Serverによれば、2.0.46からアクセスログとエラーログに出力される文字のうち、印字不可能文字が「\xHH」とエスケープされるようになったらしい。

日本語処理のデバッグ時に多バイト文字をエラーログに出力するとエスケープされちゃうのでちびっつ不便。

処理しているのはこんな箇所。

modules/loggers/mod_log_config.c
ap_escape_logitemで処理したものを返している。
server/util.c
ap_escape_logitemが定義されている。
ap_escape_logitem
TEST_CHAR(*s, T_ESCAPE_LOGITEM)でエスケープするかどうかの判断をしている。
TEST_CHAR
server/util.cで定義されていて、test_char_table[]を使っている。
test_char_table
server/test_char.hで定義されている。このファイルは生成される。

なので、ソースをいじらないとエスケープしないようにはできなさげ。

とりあえず、

tail -f error_log | while read -r l; do echo -e $l; done

でおちゃをにごす。

ただし、エスケープしているのはセキュリティ上の要請からなので、無闇にエスケープを戻すことの危険性を認識した上でご実行ください。

2006-02-21 (Tue)

ext3でnano second

このへん

のパッチをあててみたんだけど、nano secondにならない…

むぅ。big inodeがキーの気がするんだけどなんじゃろ、これ…

id:hirose31:20060228に続編あり。

SATAでSMARTを使う

2.6.15-rc4あたりから、SATAなディスクでもsmartctlに-d ataオプションを指定すればSMARTが使えるす。

# smartctl -a -d ata /dev/sda

InnoDBでのページ内のレコード最大長は8KB

InnoDBで8KB以上のレコードが格納できない、というわけではないので注意。詳しくは以下のリンクを。

adjtimex のみによる(力技な?)方法

どーしても時計がずれる場合はadjtimexで調整してみましょ。

GnuPG 鍵輪の維持管理

trustで 5 (I trust ultimately)じゃなくて、4 (I trust fully) にしてsignすればいいのか。

2006-02-20 (Mon)

Comparison: Web-based Tracker

Webベースのissue tracking systemの比較。

Mantis、Scrabが高得点。

2006-02-18 (Sat)

PEAR :: Package :: Services_OpenSearch

ようやくリリースできました〜

ノンノノンノ 2006/02/22 16:32 あさのゆうきうざ-むかつく-@

2006-02-17 (Fri)

2006-02-16 (Thu)

kernel 2.6 の I/O scheduler

そういえば、

  • 今のところdeadlineとno-opは性能差がほとんどない。
  • anticipatoryは性能が出るようになるまでちょっと学習時間が必要。
  • linux/Documentation/block/*

というのをLinux Kernel Cnference 2005できいた気がしたのを思いだしたのでメモ。

2006-02-15 (Wed)

2006-02-14 (Tue)

2006-02-13 (Mon)

2006-02-11 (Sat)

msgcab

msgcab は手軽で柔軟なメーリングリストアーカイバです。

まるでメールソフトみたいな画面。使い勝手もよさそうです。

2006-02-08 (Wed)

VNCん中でVMware

LinuxVMware Workstationを使っています。LinuxVMwareはXなアプリケーションなのでXが動いていることが必須です(多分)。

でもホストOSのXは帰るときに落としたい(exec ssh-agent startxしているため不在の間放置したくない)ので、必然的にVMwareも落とさないとだめです。

しかし、VMwareのゲストOSに遠隔から入りたかったりするので落としたくなかったりします。

んで、今までは安直に

$ xinit .Xclient-twm -- :1

とかして別なXを上げて、そこでVMwareを起動してxscreensaverでロックをかけてました。

まぁこれでもいいんですが、

  • わざわざXを上げるのはなんかもったない(根拠レス)。
  • 遠隔からVMwareのボタンをぽちぽちしたいことがある。

なので、VNCの中でVMwareを動かしてみました。

これならSSHのport forwardingで遠隔のvncserverにvncviewerでつなげられます。

で、やり方はこうです。

まずはVNCのインストール。Debian Sargeなので、以下のdebをaptitude install。

  • tightvncserver
  • vnc-common
  • xtightvncviewer

んで、VNCのパスワードを設定。

$ vncpasswd
Password:

次にvncserverを起動。画面の大きさは大きくなくていいので800x600で、色数は8bitだとVMwareがすんなり動かないので16bitで。

$ vncserver -name VMware -depth 16 -geometry 800x600 :1
New 'X' desktop is XXX:1

ほんでvncviewerで接続。さっき設定したパスワードを聞かれるので入力。

$ vncviewer :1
VNC server supports protocol version 3.3 (viewer 3.3)
Password:

繋がったらvncviewerの中でVMwareを起動。

これでホストOSのXを落としても、vncviewerで繋げればVNCがつかんでいる:1なディスプレイの中でVMwareは元気に動いています。

ちなみにvncviewerを終了するときはF8でメニューが出てくるのでそれでQuit、vncserverを終了するときは

$ vncserver -kill :1

で。

VMwareのゲストOSからフォーカスを外すときは、通常ならCtrl+Altなんですがvncviewerの中だと左Ctrl+左Altではダメで、左Ctrl+右Altならちゃんとフォーカス外れました。環境依存が気がしますが…

がんばれば、OS起動時にVMwareのゲストOSの自動起動なんかもできるかも。

2006-02-07 (Tue)

2006-02-06 (Mon)

2006-02-02 (Thu)

2006-02-01 (Wed)

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |
2018 | 05 |