ラベル 運用管理 の投稿を表示しています。 すべての投稿を表示
ラベル 運用管理 の投稿を表示しています。 すべての投稿を表示

2009年12月25日金曜日

CactiからWindowsの情報を、ありものだけでグラフ化してみる

cacti のグラフが美しいので、普段やらないWindowsのSNMPから情報をグラフ化してみた。
 
 


なんかcactiはネットワーク機器とLinuxを見るような印象だったが、有りものだけでWindowsの情報を結構取れる。
実際どのくらいとれるのか紹介しとこう。
 



Windows側で仕込み


Cactiたっぷり情報取るには、標準のSNMPに加えてサードパーティ製のSNMPプロバイダを入れるといい。


 

有料版・無料版とあって、無料版ではCPU,メモリと論理HDDなどのパフォーマンスカウンタの情報を取ってくれる。
 

mibで見るとこんな感じ、これは頼もしそうな項目。。
 
[caption id="attachment_1625" align="alignnone" width="515" caption="画像:mibブラウザより"]画像:mibブラウザより[/caption]
 

有料のはほとんどのパフォーマンスカウンタオブジェクトに対応している、開発しんどいし買ってもいいくらい。
 
インストール要件は簡単、Windows標準のSNMPさえ入れておけばOK。
サーバ側の準備はこれでOK。
 
 



CactiにWindows用のテンプレートを追加


まあ色々あるけど、とりあえず良い感じなのを2つ。
 

さっきの「SNMP Informant」で追加されたMIBをゴリゴリ取ってくるテンプレート。

※最後の方の発言からZIPをダウンロードしよう。
 

特定プロセスのCPU・メモリ使用量をグラフ化する、まあおまけで。

 


これらを添付の手順に沿ってサーバにUP&インストール。
データクエリはサーバの "(cactiパス)/resource/snmp_queries" に、テンプレートはCactiの管理画面から入れよう。
Cactiの準備もこれでOK。
 
 


じゃあWindowsの状態をグラフにする


ここまでの準備を元にホストテンプレート、デバイス追加してデータクエリを軸に「Create New graph」するという作業になるけど割愛。
ではありものをぺたぺた貼って、このくらいグラフ化出来るよというSSをどうぞ。
 

でっかいので注意してくださいねー
 
[caption id="attachment_1626" align="alignnone" width="150" caption="画像:大きさ注意グラフ(627 × 9067)"]画像:大きさ注意グラフ(627 × 9067)[/caption]
 

結構とれてるでしょ?今回SSの相手は『WindowsServer2008R2 x64』だったが、2003(確認済)や2000(らしい)もOKだ。
 
 


Cactiでカスタマイズは結構ややこしいのだが、手軽にこれだけの情報がとれるといいね。
 

2009年10月27日火曜日

MBRと"/boot"をバックアップして障害に備える、CentOSでiSCSI活用(後編)

前編からの続き
"/boot"だけバックアップした場合の戻し方。
 
 


"boot"だけ残せばよい理由と残す理由


前回記事の起動シーケンスから分かる通り、grubはstage2まで起動してしまえばファイルシステムをバッチリ理解できる。
逆に言うと、stage1.5まではHDDのセクタがそろってない環境にはそのまま戻せない、ということにもなる。
 

grubのstage2は"/boot"にあるので、そこになんとか繋ぐように配置すれば起動までこぎ着けそうな気もするが、そんな心配もいらないので諦めよう。
 

そう、MBRからstage2まで辿るのが難しくなった場合、素直にCDブートのgrubを使えばいい、
>> grub公式のgrub bootableCD作成方法
これはファイルシステムを大概理解できるナイスツール、必携だ。
 

grubさえ立ち上げれば、ext3の領域を読んでくれる = initrdやカーネルを指定してOSを起動することができ、ゆっくりgrub-install実施で元通りとできる。
 
 



ローカルをまっさらなHDDと交換してみる


前回作成したiSCSIを"/"領域にした環境で、ローカルディスクが爆破されたと仮定して"/boot"だけある環境から復旧してみよう。
 

まず適当なLiveCDを用意する。
CentOS5の奴なんかいいんじゃないだろうか、nfsマウント出来るしyumで少々のツールなら追加できる。
実は初期状態では重要なdump&restoreがないが、『yum install dump』で追加OKだ。
 

ではCD起動してからやること。。

  1. fdiskでhddを編集開始、まあ大体 "/dev/sda" だろう
    わからなかったら"fdisk -l"

  2.  
  3. nコマンドで"/boot"用に100Mくらい、SWAPように適当に2048MBくらい確保

  4.  
  5. tコマンドでSWAPスペースのタイプを82に変更

  6.  
  7. aコマンドで"/boot"予定スペースの起動フラグON

  8.  
  9. wコマンドでパーティションテーブル書き込み、fdiskおわり

  10.  
  11. "/boot"のところにファイルシステム作成
    # mkfs.ext3 -L /boot /dev/sda1

  12.  
  13. ついでにSWAPも
    # mkswap -L SWAP-sda2 /dev/sdb2


 


と、ここまでやったら"/mnt" あたりに "/dev/sda1"をマウントして、tarでもrestoreでも好きな方法で旧環境の"/boot"を戻そう。
もってくる方法は特に問わない、なんでもいい。
 
 

以上で ローカルディスクの"/boot"は復活した。
ちなみにfdiskはこんな感じに仕上がった。
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda2 33 282 2008125 82 Linux swap / Solaris

 
 


CDからgrubで起動しよう


"/boot"が使えるようになったので、CD起動にしたgrubを使ってみよう。
 

起動したらとりあえずこれだ、
grub>
 

どうしろと言うのか迷うかも知れないが、とりあえずファイルシステムのルートになるパーティションを指定しよう。
途中まで入れたらTABで補完OK。
grub> root (
Possible disks are: fd0 hd0 cd


使えそうなデバイスを見せてくれる、もちろんhd0を選びさらにTAB

grub> root (hd0,
Possible partitions are:
Partition num: 0, Filesystem type is ext2fs, partition type 0x83
Partition num: 1, Filesystem type is unknown, partition type 0x82


パーティションを教えてくれる、さっき自分で作ったのだからどちらかなんて自明。


grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83


選択した領域に"/boot"があったらマウントしてくれる。
 

さああとはinitrd とカーネルを指定するだけだ...って
これがハードル高いと思う日もあるかもしれない。
 

でもそんなことはないんだ、"/boot"はマウントされてるんだよね?
 
 

コンフィグ見りゃいいじゃん。
 

grub> cat /grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda3
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/
initrd /initrd-2.6.18-128.el5.img

 

grubはcat出来る、これは死ぬほど助かる。
 
さあさっさと下記を入力して、bootコマンドを叩くのだ。
"kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/"
"initrd /initrd-2.6.18-128.el5.img"
 
 

さすれば起動する、破壊前の環境そのままだ。
あとは起動後に"grub-install" をしてあげるだけ。
# grub-install --root-directory=/ /dev/sdb
色々理由があって上記になる。
 
 


おまけ、initrdのinit抜いてみた


と、言うことで今回環境のバックアップはおしまい。
結局、/bootのdumpとddと両方採ってるけどね。
 

今度はHDDの代わりにUSBメモリを使ってみようっと。
 
 

さて、"/"からiSCSIってinitrdは何しとるんだと思うじゃない、
なので展開してみた、なるほどねー。
 
長いのでトップでは切っちゃうが。

2009年8月20日木曜日

稼動実績からハードディスクドライブ(HDD)の環境別MTBFを割り出す

ハードディスクドライブ(HDD)を沢山並べて運用していると実際よく壊れる。
在庫を適正に管理しないといけないが、見積りに役立つはずのMTBFがメーカのカタログだとどうも・・・
結論から言うと実際のMTBFは大体6万時間くらいだ、環境がよければ10万とかだろうか。
 
 


メーカのカタログも嘘じゃないけど・・・


先日下の記事を見てちょっと考えた。
 



// 平均故障間隔100万時間のHDDは「114年故障しない」?
http://itpro.nikkeibp.co.jp/article/COLUMN/20050829/220247/
 
HDDのMTBFが100万時間の場合,MTBFのとらえ方は?

例えば100台のHDDを使っているとして,100台のHDDの延べ稼働時間が100万時間になったとき1台のHDDが故障する。





なるほど。
某メーカのHDD、MTBFカタログ値"120万時間" だと...
100台稼動している状況では、12,000時間に1台=500日に1台故障?
 
もっと多い!多いよ実際?
 
 

なんでこんなに実際におきるHDD障害とのずれを感じるのかというと、下記のようにからくりがある為だ。
 





 

つまるところ、HDDのMTBFは自分の環境にて計測しましょうという事に他ならない。
じゃあ割り出しましょう。
 
 


自分の環境で有効な、真のMTBFを計測しておく


一定期間のサンプルが必要だけど、非常に簡単な計算でOKだ。
 

x 台の運用HDDがあるとして、 y 日間稼動させたら z 台壊れて交換しました。
x,y,zが用意できたら、下記表に当てはめて計算しよう。
 




稼働台数稼働日数故障・交換台数MTBF(時間)
(x)(y)(z)式1

 



    式1: x * ( y * 24 ) / z


※ 延べ時間を故障回数で割るだけ。24は単位を日から時間に変換。
※ x に予備HDDの台数は含まない
 
 

一応計算例を、
240台のHDDが稼動しているシステムで、30日間に4台壊れました
240 * (30 * 24) / 4 = 43200
この環境ではHDDのMTBFが 43200 時間になる。
 


というわけで、カタログの実に1/30だがどうだろう。実際このくらい壊れるよね?
あとはこのMTBFを元に故障率やら信頼性を出すなり、環境にあった適正在庫を算出するとよい。
 

2009年6月25日木曜日

Nagiosプラグイン、check_snmp で閾値に下限を設定する

メモエントリ。
Nagiosプラグインの check_snmp について。
 

check_snmp を使って性能監視をしたいと思ったが、警告(WARNING) オプションで閾値を指定すると、取得した値が閾値を上回ったらWARNING で返ってくる。
下回った時はどうやって設定するんだろう。
 

とりあえずヘルプを見る。

# ./check_snmp --help
check_snmp v2021 (nagios-plugins 1.4.13)
Copyright (c) 1999-2007 Nagios Plugin Development Team

 
Check status of remote machines and obtain sustem information via SNMP
 
 
Usage:check_snmp -H -o [-w warn_range] [-c crit_range]
[-C community] [-s string] [-r regex] [-R regexi] [-t timeout] [-e retries]
[-l label] [-u units] [-p port-number] [-d delimiter] [-D output-delimiter]
[-m miblist] [-P snmp version] [-L seclevel] [-U secname] [-a authproto]
[-A authpasswd] [-X privpasswd]
 
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
-H, --hostname=ADDRESS
Host name, IP Address, or unix socket (must be an absolute path)
-p, --port=INTEGER
Port number (default: 161)
-n, --next
Use SNMP GETNEXT instead of SNMP GET
-P, --protocol=[1|2c|3]
SNMP protocol version
-L, --seclevel=[noAuthNoPriv|authNoPriv|authPriv]
SNMPv3 securityLevel
-a, --authproto=[MD5|SHA]
SNMPv3 auth proto
-C, --community=STRING
Optional community string for SNMP communication (default is "public")
-U, --secname=USERNAME
SNMPv3 username
-A, --authpassword=PASSWORD
SNMPv3 authentication password
-X, --privpasswd=PASSWORD
SNMPv3 privacy password
-o, --oid=OID(s)
Object identifier(s) or SNMP variables whose value you wish to query
-m, --miblist=STRING
List of MIBS to be loaded (default = none if using numeric oids or 'ALL'
for symbolic oids.)
-d, --delimiter=STRING
Delimiter to use when parsing returned data. Default is "=" Any data on the right hand side of the delimiter is considered
to be the data that should be used in the evaluation.
-w, --warning=INTEGER_RANGE(s)
Range(s) which will not result in a WARNING status

-c, --critical=INTEGER_RANGE(s)
Range(s) which will not result in a CRITICAL status
-s, --string=STRING
Return OK state (for that OID) if STRING is an exact match
-r, --ereg=REGEX
Return OK state (for that OID) if extended regular expression REGEX matches
-R, --eregi=REGEX
Return OK state (for that OID) if case-insensitive extended REGEX matches
-l, --label=STRING
Prefix label for output from plugin (default -s 'SNMP')
-u, --units=STRING
Units label(s) for output data (e.g., 'sec.').
-D, --output-delimiter=STRING
Separates output on multiple OID requests
-t, --timeout=INTEGER
Seconds before connection times out (default: 10)
-v, --verbose
Show details for command-line debugging (Nagios may truncate output)
 
This plugin uses the 'snmpget' command included with the NET-SNMP package.
if you don't have the package installed, you will need to download it from
http://net-snmp.sourceforge.net before you can use this plugin.
 
Notes:
- Multiple OIDs may be indicated by a comma- or space-delimited list (lists with
internal spaces must be quoted) [max 8 OIDs]
- Ranges are inclusive and are indicated with colons. When specified as
'min:max' a STATE_OK will be returned if the result is within the indicated
range or is equal to the upper or lower bound. A non-OK state will be
returned if the result is outside the specified range.
- If specified in the order 'max:min' a non-OK state will be returned if the
result is within the (inclusive) range.
- Upper or lower bounds may be omitted to skip checking the respective limit.
- Bare integers are interpreted as upper limits.
- When checking multiple OIDs, separate ranges by commas like '-w 1:10,1:,:20'
- Note that only one string and one regex may be checked at present
- All evaluation methods other than PR, STR, and SUBSTR expect that the value
returned from the SNMP query is an unsigned integer.
 
Send email to nagios-users@lists.sourceforge.net if you have questions
regarding use of this software. To submit patches or suggest improvements,
send email to nagiosplug-devel@lists.sourceforge.net

 

閾値はレンジだそうで、Note部分に色々書いてあるな、ちょっと試してみた。値はコロンで仕切ろう。
    設定例
  1. "-w 100" ⇒ 100を超えたら警告

  2. "-w :100" ⇒ 100を超えたら警告

  3. "-w 100:500" ⇒ 100から500の範囲からはみ出したら警告

  4. "-w 100:" ⇒ 100未満なら警告


 

という感じになる模様。

2009年6月20日土曜日

Windows コマンドラインから 「パスワードを無期限にする」を有効にする

何を言わんか、判る人にはわかるだろう。 net user コマンドにはこの機能がないのだ。
 

先日とある切欠で wmic の存在を思い出し、記事タイトルのことが出来るのかやってみた。
WMICodeCreator でWMIの中身をチェック、Win32_UserAccount の PasswordExpires を更新すればよい ことはわかっているので、WSHからは既にやっていたんだが、wmic を使えばコマンド1行でOKなのがいい。
 

wmic では Win32_UserAccount のエイリアスは useraccount だ。
なのでコマンドはこうなる。
 

wmic useraccount where (Name = "hogehoge") set PasswordExpires=False
 
 


では、コンピュータ名 "TESTPC" で ユーザー "hogehoge" のアカウントプロパティ「パスワードを無期限にする」にチェックを入れてみよう。
 

C:\>wmic useraccount where (Name = "hogehoge") set PasswordExpires=False
'\\TESTPC\ROOT\CIMV2:Win32_UserAccount.Domain="TESTPC",Name="hogehoge"' のプロパティを更新しています
プロパティは正しく更新されました。

 

C:\>wmic useraccount where (Name = "hogehoge") get PasswordExpires
PasswordExpires
FALSE

 

はいオッケィ。
これで、ユーザ管理画面を開かずにユーザ作成、グループに追加、パスワード無期限 をコマンドラインだけで出来て、あの面倒な「コンピュータの管理」を開かないで済むのだ。
 

2009年6月12日金曜日

Windows PowerShell でイベントログをリアルタイム監視

The PowerShell Guy が教えてくれた、WindowsServerでイベントログをリアルタイムで監視する方法。
 
 


.Net FrameWorkで最新のイベントログをキャッチ


.Net FrameWork を使えるPowerShellなら、色々楽勝...といっても結局はWMIに問い合わせるみたい、某所で使っているイベントログ監視スクリプトはVBSで作ってあるけど、あれもWMIだったな。
 

ただ、system.management.ManagementEventWatcher クラスをいきなり使えるということでだいぶ違うように見える。
実はクラスとかあまり理解してないが、なんとも便利になったと思う。
 
 

PowerShellプロンプトでやってみる


イベントを待つには3行ですっきりOK、表示用にもう一行。
手っ取り早く効果を試せるので、下記をPSのプロンプトに張り付けてみる。

[sourcecode language='sh']$ew = new-object system.management.ManagementEventWatcher
$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"
$e = $ew.WaitForNextEvent()
$e[/sourcecode]

ManagementEventWatcher パブリック メソッド の WaitForNextEvent() を使っている、張り付けたスクリプトはいったんここで止まる。
 

PS C:\>$ew = new-object system.management.ManagementEventWatcher
PS C:\>$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"
PS C:\>$e = $ew.WaitForNextEvent()
PS C:\>$e
_←点滅カーソル


何かイベントが発生するまで待機するので、他のシェルからテスト用に eventcreate コマンドでイベントログを書き込み。
 

C:\>EVENTCREATE /T ERROR /ID 1000 /L APPLICATION /D "wait test"
 
成功: 種類が 'ERROR' のイベントが、'APPLICATION' ログ内に、'EventCreate' をソースとして作成されました。

 
すると、 $e に発生したイベントのオブジェクトが代入され、 直後で指定しているので $e が表示される
 

はい出た。
__GENUS : 2
__CLASS : __InstanceCreationEvent
__SUPERCLASS : __InstanceOperationEvent
__DYNASTY : __SystemClass
__RELPATH :
__PROPERTY_COUNT : 3
__DERIVATION : {__InstanceOperationEvent, __Event, __IndicationRelated, __SystemClass}
__SERVER :
__NAMESPACE :
__PATH :
SECURITY_DESCRIPTOR : {1, 0, 20, 128...}
TargetInstance : System.Management.ManagementBaseObject
TIME_CREATED : 128892011594751253

 

が、えらくメタな情報だな。
 
 

今回目的のイベントログは TargetInstance ってプロパティに格納されているので表示する、この辺はWMI。
PS C:\> $e.targetinstance
 
 
__GENUS : 2
__CLASS : Win32_NTLogEvent
__SUPERCLASS :
__DYNASTY : Win32_NTLogEvent
__RELPATH : Win32_NTLogEvent.Logfile="Application",RecordNumber=13539
__PROPERTY_COUNT : 16
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Category : 0
CategoryString :
ComputerName : ********
Data :
EventCode : 1000
EventIdentifier : 1000
EventType : 1
InsertionStrings : {wait test}
Logfile : Application
Message : wait test
RecordNumber : 13539
SourceName : EventCreate
TimeGenerated : 20090********.000000-000
TimeWritten : 20090********.000000-000
Type : エラー
User : ********\sawano

 
OK、イベントソース、コードなど、おなじみのものが表示されている。
 
 



監視をループさせる


それではイベントログをリアルタイムで監視させる。
特に芸も無く、ループで回すだけだ。
[sourcecode language='sh']$a = 0

$ew = new-object system.management.ManagementEventWatcher
$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"

do
{
$e = $ew.WaitForNextEvent()
$e.TargetInstance
}
while ($a -ne 1)
[/sourcecode]

While にずっと達成できない条件を指定して、ずっと回ってもらう。
 
これをPSプロンプトに流すと、Whlieの後で、カーソル点滅。 最後はDoの>>が消えるまでEnterの入力が必要。
 

--snip--
>> $e.TargetInstance
>> }
>> while ($a -ne 1)
>>
_←点滅カーソル

 

さて、この状況でほっといてみよう、EventCreateで試してもいい。
Vistaでやっていたら、意外と色々ログが上がって来て面白かった。
 
 

おわりに


さて、これをやってどうするか。
イベントをキャッチして、mixi や wassr に投稿するBotも捨てがたいが、通常は警告(Warning)、エラー(Error)もしくは特定のイベント発生を管理者に通知したい。
手段として妥当なところでは、メールだろうか。
 

今度はメール通知部分をくっつけてみよう、起動はタスクマネージャからだな。
 

2009年6月9日火曜日

cron で サービス監視ワンライナー

linuxやUNIXサーバで、取り合えず起動していて欲しいサービスがある場合。
堅くやりたければ daemontools や monitやらを使い、nagiosなどで外部から監視させたい。
 
そこまで不要だけどとりあえず、って時は cron にやらせるのも手軽でアリ。
nagios プラグインと組み合わせることで意外と柔軟な設定もできる。
 
 

では linux版、pidofを使ってみる。
*/10 * * * * root /sbin/pidof hoge > /dev/null || /sbin/service hoge start
 

たとえばこんなの。10分おきにpidof を叩いて、正常終了しなかったら実行の "||" を使って エラーがあれば通知(デフォルトならroot宛)もしてくれる。
 
 


ちょっと応用して、Nagios の check_procs プラグインを使ってプロセスの状態による動作設定をしてみる。

# /usr/local/nagios/libexec/check_procs -w 1:10 -a 'httpd'
PROCS OK: 9 processes with args 'httpd'


check_procs の結果コードは 正常終了が0・Warningが1を返すので、そのまま "&&" や "||" に渡せばOK。
例ではhttpd のプロセス数が 1から10 の間に入ってないとWarning だ。
 
 

ほかにも、check_http で応答が悪かったら、再起動するなり止めるなりするという使い方もできそうだ。
(止める場合は、適当にsleep コマンドをはさんで再開なども)
 

Solarisでも使える、(check_procはコンフィグオプションがややこしいが動作はする)、その場合は service を svcadmに変えればよい。
 
 

で、用があるので IRCプロキシの tiarra を監視した。
*/15 * * * * root /usr/local/nagios/libexec/check_procs -w 1:5 -a 'tiarra' >/dev/null || /usr/bin/screen -d -m /usr/l
ocal/tiarra/tiarra --config=/usr/local/tiarra/tiarra.conf

 

tiarra は daemon で動かしたかったんだけど、制御端末からうまく切り離せなかったので断念。 daemon 関数で普通に呼ぶだけじゃ無理なんかな?
 
ってことで、15分おきに tiarra 関連プロセス数が 1-5 の間にあるかチェック、無かったらscreen のデタッチ退却モードで tiarra を動作させるという仕組みで作成。
 

軽くテストはしたので多分動くと思うが、、まだ事故でtiarraが止まってないのでどうなるか。
 
 

プラグインでなくても、「ps -eo 'comm args」の出力辺りから何とかできないかなあ。
 

2009年4月21日火曜日

find で古いファイルを消す

メモエントリ
 

linux サーバ運用で、古いログやファイルをfindで洗い出す時、 mtime, mmin などのオプションを使う。
あとは exec に渡して消すなり tar で固めるなりと、好きに料理すると良い。
 

#!/bin/bash
del_oldlog(){
# $1 directory path
# $2 days
find $1 -type f -name \* -mtime +$2 -exec rm -f {} \;
}
del_oldlog $1 $2

mtime で指定する値は、狙い通りにするのはちょっとややこしい、man を見るとよい。
(追記:daystart オプションで扱いやすくなる)
 
 


ちなみにfindだけでやるより、exec の代わりに パイプで xargs に投げた方が処理的に軽いみたい。
#!/bin/bash
del_oldlog(){
# $1 directory path
# $2 days
find $1 -type f -name \* -mtime +$2 | xargs rm -f
}
del_oldlog $1 $2


量が多いと思ったらこちらを優先したい。
 
 




4.26追記:(はてブにツッコミがあったので)
findコマンドのうち、IEEE Std 1003.2(POSIX.2) の仕様にそっているものでは
"-delete" オプションというのが使えるらしい。
他、"-exec" では ;(セミコロン) でなく +(プラス) で閉じると xargs のようにまとめてコマンド実行してくれる模様。
例としては FreeBSD でつかえる find とか。

2009年4月13日月曜日

WindowsServer2003R2 のFSRMで、クォータの残り容量をコマンドラインから取得 する

メモエントリ
 

WindowsServer2003R2 のファイルサーバリソースマネージャ(FSRM) で、クォータの情報をコマンドラインで取得する。
 
 

"D:\Users/UserA/" にクォータをかけている場合、 dirquota コマンドから残りの使用量を表示することが出来る。
>dirquota quota freespace /Path:D:\Users/UserA/
利用可能: 895.07 MB

 
 
 

dirquota コマンドは 2003R2 のFSRMを入れたら使えるようになる、FSRM管理専用のコマンドだ。
この記事に関連したヘルプを並べてみる。
>dirquota
このコマンドの構文は次のとおりです:
 
Dirquota {Quota | Autoquota | Template | Admin}
 
Quota クォータの一覧表示、追加、変更、削除
Autoquota 自動適用クォータの一覧表示、追加、変更、削除
Template クォータ テンプレートの一覧表示、追加、変更、削除
Admin 設定の構成および管理操作の実行
 
スイッチを一意に識別する最小シーケンスを省略文字として使用できます。
例: "Dirquota q l /list-n" は "Dirquota quota list /list-notifications"
と同じです。

 
 

>dirquota quota
このコマンドの構文は次のとおりです:
 
Dirquota Quota {List | Add | Modify | Delete | Scan | Freespace}
 
List 現在構成されたクォータを一覧表示する。
Add 新しいクォータを追加する。
Modify 既存のクォータを変更する。
Delete 既存のクォータの削除する。
Scan クォータ使用率を更新するためスキャンを開始する。
Freespace 空き領域を照会する。
 
スイッチまたはスイッチの値を一意に識別する最小シーケンスを省略文字として
使用できます。例: "Dirquota q l /list-n" は
"Dirquota quota list /list-notifications" と同じです。

 
 

>dirquota quota freespace
空き領域を照会する。
 
このコマンドの構文は次のとおりです:
 
Dirquota Quota Freespace /Path:PATH [/Remote:REMOTE]
 
/Path:PATH PATH 上の空き領域を照会する。パスの最も
厳しい制限のあるクォータの空き領域が返されます。
 
/Remote:MACHINE コンピュータ MACHINE の操作を実行します。
 
例:
Dirquota Quota Freespace /Path:D:\scratch

 

それなりに色々可能だが、結果が標準出力に限っちゃうのが玉にキズ。
 

WMIから取る方法も少し探したけど、分からなかった。
R2関連は軒並みないWMIで管理できない気がする。。
 

2009年4月9日木曜日

sendmail の .forward で、メールの任意の行をログに出力

以前のネタ、sendmail で リレーするメールの DATA 部分をログに記録する の局地限定仕様版。
全アカウントの全メールをログに書き出しているとさすがに大変なので、ピンポイントで調査する時になど向け。
 

要点だけ言うと、 .forward にコマンドなりスクリプトなりを書いて、必要なものだけログに出力してしまおうという話。
 
 


例えば 特定のメールアドレスに送られてくるメールの Subject だけを記録したいという場合。
 

該当アカウントのホームディレクトリにある ".forward" ファイルを編集する、なければ作る。
"|grep '^Subject\:'>>/tmp/testlog.txt"
\{バックスラッシュ+元のアドレスという行}


と記述しておけば "Subject:" で始まる行だけログに記録できる、記録先はパーミッションのあるところなら何でもOK。
ちなみに2行目がないとメール消えちゃうので注意。
 
 

結局、標準出力を処理するだけなので単純だ、他の情報も grep のところで簡単な正規表現で出来るはず。
貰ったメールの内容を条件に、ログ記録以外で色々やりたいなら シェル やら perl やらでスクリプト書けばOK。
 

もし出来ない場合は smrsh などが原因ちゃうかな、ログを見たら良いと思う。
さらにSendmailに限った話でもないけど、試したのがSendmailだったからで、大体のMTAで似たようなこと出来るはず。
 

2009年4月8日水曜日

tarで差分

メモエントリ
 

tar単体で差分取れるとは知らなかった。
 

Manpage of TAR より。
-N, --after-date DATE, --newer DATE
DATEより新しいファイルだけを格納する

 

へぇ、使いどころ次第で地味に便利かも。
 

日時の書式はこんな感じ、"2008-04-07 00:00:00" 日付だけでもOK。
date でいうと 'date "+%F %T"' での出力になるかな。

2009年3月4日水曜日

コマンドプロンプトはタイトルつけとくといいよ

Windows使っているならコマンドプロンプト使うよね?
OKわかった、"title" コマンドを使うべきだ。
 
 

要はいくつか開いたコマンドプロンプトのウインドウを区別つくようにしておこうという趣旨。
"title" コマンドはタイトルバーの文字を変えてくれる、例えばL2スイッチに telnet する前に "title L2" としてみよう。

[caption id="attachment_1261" align="alignnone" width="677" caption="画像:titleコマンド結果"]画像:titleコマンド結果[/caption]
 

タイトルバーが変わったのが分かるはず。Vistaだと、「管理者:」 ってのが固定だから少々じゃまだが、XPだとすっきりしているはずだ。
 

これはタスクバーにコマンドプロンプトを並べたとき特に威力を発揮する。

[caption id="attachment_1262" align="alignnone" width="148" caption="画像:タスクバー"]画像:タスクバー[/caption]
※ 追記:タスクバーを右にして使っています。
 

それぞれのウインドウでやってることがわかる、これは作業効率に地味に効いてくるので癖をつけたほうがいいと思う。
「Windows+Rキー → cmd → title hogehoge」 という流れを意識しよう。
 

2009年2月28日土曜日

任意のディレクトリ以下のファイル全部でメッセージダイジェスト(ハッシュ) を取得

メモエントリ
 
 

find でフルパスを貰って、xargs に投げるというだけだがメモ。
 

# find /etc -type f -exec ls -1d {} \; | xargs openssl dgst -sha1
 
"/etc" 以下で 属性がファイルのものをフルパス表示させて片っ端から openssl に投げてハッシュを出力する。
(これは sha1 でやってるけど、デフォルトの md5 のほうがはるかに早いです)
 

"/etc" 出力例
SHA1(/etc/logrotate.conf)= 7b323754d7a2235d2af27d033d0d9f4bc04d702d
SHA1(/etc/pcmcia/config.opts)= 0a5c34714920af23596fbf8b7e88ae8b1a32e9d3
SHA1(/etc/scsi_id.config)= fa2ed8a92d90c965842f2e5ca763fc02a89672f3
-- snip --
SHA1(/etc/modprobe.d/modprobe.conf.dist)= 950ba44077e82aaf2a17d11f2900e94cab208f8b
SHA1(/etc/modprobe.d/blacklist-firewire)= de82c03c535e9deb16aed94153883280891da2d7
SHA1(/etc/mail.rc)= 9197e3c08646d0be585103d88d041182460ca0e5

 

ディレクトリをコピーや移動して、心配な時に diff に食わせる。

2009年2月14日土曜日

Linux の シャドウパスワードを移行する

Linux のユーザ管理、"/etc/passwd","/etc/shadow" ついでに "/etc/group""/etc/gshadow" とあります。
これを他のサーバに移行したい場合、そのまま持っていけばOKというお話。
 
 


shadow にはハッシュが書いているだけなので、ハッシュの求め方が同じシステムでも動作するのは当然ということで、折角なのでLinux同士で試してみた。
(※FreeBSDに移動するのもOKらしいね、ファイル名は違うけど)
FreeBSDに関して情報追記:
フィールドの並びも違うよ。あと、BSD はパスワードデータベースファイルを作るのでファイルをコピーした場合、pwd_mkdb(8)なりvipw(8)なりでデータベースも更新する必要があります
by umq さん
なるほどー

 
 


編集用コマンドが用意されてるので一応それ使いましょう


"/etc/passwd","/etc/shadow" を直接 vi で編集すると何かしら事故った時に困るので、専用の編集コマンドがあります。
 

vipw, vigr というのがそれ、使い方は vi と同じなんですけど、同時読み込みとか保存とか気を使ってくれるらしい。デリケートゾーンのお手入れ用?という感覚だろうか。
 

ちょっとその 'man vipw' を。
VIPW(8) BSD System Manager’s Manual VIPW(8)
 
NAME
vipw, vigr - edit the password or group files
 
SYNOPSIS
vipw [-V] [--version]
vigr [-V] [--version]
 
DESCRIPTION
Vipw edits the password file after setting the appropriate locks, and does any necessary processing
after the password file is unlocked. If the password file is already locked for editing by another
user, vipw will ask you to try again later. The default editor for vipw is vi(1).
Vigr edits the group file in the same manner as vipw.
 
ENVIRONMENT
If the following environment variable exists it will be utilized by vipw:
 
EDITOR The editor specified by the string EDITOR will be invoked instead of the default editor
vi(1).
--snip--

適切ロックでヨロシクやってくれる ということだろうか、よかね。
 
"-s" でシャドウ編集となってるのもあるけど、Linux (CentOS5.2で試した) のはオプション不要、 passwd を編集した後に shadow も編集するか聞かれる。
 
 

wassr突っ込み追記
sudoers を編集する visudo(8) もあるんですよ
こちらも umq さん


貼り付けてみよう


まあちょっとやってみよう。
# vipw


とすると、 "/etc/passwd" が開くので、よそから持ってきたユーザ、
sawano, sawano64 の情報をファイル末尾にくっつける、ラストは改行しちゃ(多分)ダメ。

--snip-
sawano:x:635:635::/home/sawano/:/bin/bash
sawano64:x:636:636::/home/sawano64/:/bin/bash

 

さて、"passwd" を編集し終わって保存すると、

You are using shadow passwords on this system.
Would you like to edit /etc/shadow now [y/n]?

と聞かれる、特に編集してない場合は聞かれないので、お試しのときは注意。
 

y を押すと "/etc/shadow" の編集に入るので移行元の shadow を貼り付ける。
sawano:$1${パスワードのハッシュ}.:13872:0:99999:7:::
sawano64:$1${パスワードのハッシュ}.:13872:0:99999:7:::

 

ホームディレクトリは作ってあげないといけないので、mkdir で作って skel を持ってきてあげよう。
と書いて思ったが useradd で作って shadow だけ編集でも十分だったりするがちょっと趣旨と外れるのでやめとこう。
 


ほな移行したユーザでログインしてみよか。
# ssh sawano@localhost
sawano@localhost's password: *******
Last login: ----
-bash-3.2$

 

OKOK。
 
 

ついでに "/etc/shadow" に書かれているものをチェック


shadow ってそのままペタっとしちゃって大丈夫なの?ってちょっと心配だったので、'man shadow' で そもそも shadow に何が書かれているのかを確認した。



--snip--
DESCRIPTION
shadow manipulates the contents of the shadow password file, /etc/shadow. The structure in the
#include file is:
 
struct spwd {
char *sp_namp; /* user login name */
char *sp_pwdp; /* encrypted password */
long int sp_lstchg; /* last password change */
long int sp_min; /* days until change allowed. */
long int sp_max; /* days before change required */
long int sp_warn; /* days warning for expiration */
long int sp_inact; /* days before account inactive */
long int sp_expire; /* date when account expires */
unsigned long int sp_flag; /* reserved for future use */
}
 
The meanings of each field are:
・ sp_namp - pointer to null-terminated user name
・ sp_pwdp - pointer to null-terminated password
・ sp_lstchg - days since Jan 1, 1970 password was last changed
・ sp_min - days before which password may not be changed
・ sp_max - days after which password must be changed
・ sp_warn - days before password is to expire that user is warned of pending password expiration
・ sp_inact - days after password expires that account is considered inactive and disabled
・ sp_expire - days since Jan 1, 1970 when account will be disabled
・ sp_flag - reserved for future use
--snip--


特に保持しなきゃいけない重要な情報はないね、完全にパスワード周りの管理用ファイル。
パスワードのハッシュ以外は特に気にしなくてよいことが確認できた。
 
 

tar でうまく固めて、UID・GID を引き継いだファイルを持ってくればホームディレクトリの再現も簡単かしら。
また今度色々試してみたい。

rpmforgre の cacti (とRRDtool) を yum で入れたらグラフの文字が出てこなか った

yum で rpmforge(DAG) から Cactiを 入れたら、グラフに文字が全く出てこなかった。
 

こんな感じ → http://forums.cacti.net/about28677.html
(って、画像探しのため cacti font でググったページだけど、解決策書いてあるやん...まあいい)
 
 

結局、RRDtool 1.2系の バージョン 1.2.30 を配布元からダウンロードしてソースから入れて使ったら治った。
 

yum で入れた RRDtoolは v1.2.28 で、v1.2.30 をソースから入れてもデフォルトではパスが通ったところに入らない。
yum のは "/usr/bin/rrdtool" だったかな? ソースのは "/ur/local/rrdtool1.2.30/bin/rrdtool" となるので Cacti 専用にしちゃっても問題ない。
 
 

Cactiha 0.8.7b だったかな? たぶん 0.8.7 以上では共通っぽい。

2009年2月8日日曜日

ブレーカー落ちるのは心臓に悪いがPCにもよろしくないので対策したい

一昔前のJPOP某レーベルが出しそうなタイトルになってしまったが、心情察してもらえると。
 

冬場の風呂上りにヒーターで部屋を暖めながら、ポットでお湯を沸かしつつレンジで熱燗の出来上がりを待つ間にドライヤーで髪を乾かせばブレーカーも落ちよう。
 
そうそう、PCではOfficeのインストールを仕掛けてから風呂に入ったなぁ。
 
 

と、いうわけで。
不意のブレーカー落ちを含む停電、落雷とかからPCは保護しておきたい、会社の監視センター向けに買ったAPCのバッテリ付きタップを家にも買うべきだな。これは立派なセキュリティ事故だ。
 
 


APC SurgeArrest 雷ガードタップ+電源バックアップ BACK-UPS ブラックBE325-JP

 

結構安いな、自宅で使うPC1-2台ならこれで充分。
ダッシュでブレーカーをあげるなり、高速でシャットダウンするなりという間は確保できる。
 

ほな交換用バッテリもついでに。3年ごとくらいで交換したほうがよさげ。

 
 

ついでに、サーバ用途ならこっちがいい
APC ES500 BACK-UPS ブラック BE500JP

「PowerChute Personal Edition」やUSB接続ケーブル付きでこのお値段は安いよね?容量も前出のタップより多そうだしね。
 
 


そういえば昔、落雷でISDNのTAがやられたな。当時は知らなかったが、家財の火災保険が適用できるみたいね。

2009年1月20日火曜日

bash の for でワンライナー、Postgres統計情報の連続書き出し

メモエントリ
 

postgresの統計テーブルを調査したかったのだが、現状しか分からんので、一定期間ログに吐き出させることにした。
 

毎回DBに挿入するのが正しい解析の仕方なんだろうけど、今回そこまでいらないので 5秒おきに120回、10分間にわたり状態をテキストに書き出す。
 

とりあえず全体のステータスとロック状況を取る。
[sourcecode language='bash']for i in $(seq 1 120) ;do psql -U root template1 -c "select * from pg_stat_database">>pg_stats ; sleep 5 ;done;
for i in $(seq 1 120) ;do psql -U root template1 -c "select * from pg_locks">>pg_lock ; sleep 5 ;done;
# ※統計情報の採集は有効にしておく[/sourcecode]
 

シェルスクリプトでやるのも面倒なので、for を一行に書いて対応。使いまわすためにエントリ。
(ワンライナーというほど大げさでもなかった)
 

リアルタイムで何かしらを監視する時には watch コマンドもよく使うけど、実行回数指定のやり方がない模様なのでログ取得むきでないんだよね。

2009年1月18日日曜日

第17回まっちゃ139勉強会に行ってきました

今日は黒七味を買いに京都へ行きました、お子様向けに生八つ橋いちごチョコレートもね。
 


[caption id="attachment_1180" align="alignnone" width="240" caption="写真:黒七味と八つ橋"]写真:黒七味と八つ橋[/caption]
[caption id="attachment_1181" align="alignnone" width="240" caption="写真:東本願寺前から京都タワー"]写真:東本願寺前から京都タワー[/caption]

 
 

早速の脱線から閑話休題、と言うわけで「第17回まっちゃ139勉強会」行ってきたのでちょいレポ、あえて味については書かない。
スタッフの皆さん、講師・LTそして参加者の皆さんお疲れ様でしたー
 

基本的に勉強会の内容については、詳細は口外無用というポリシーがあるので当たり障りがなさそうな話で感じた内容をメモっておこう、自分のメモなので内容については保証できないです。
(当たり障りのある話があったか?と聞かれても困るけど)
 
 

008年セキュリティインシデント総まとめ(仮題)(小野寺匠さん)


この辺→「日本のセキュリティチーム (Japan Security Team)」のお方。
 

●悪さをする人の狙いの変遷。99年-01年くらいはWEB改ざん、それ以降はクライアントの脆弱性をつくように。組織的に行われ、手段が洗練化してきてたちが悪く。
●(だいぶ丸めて)WindowsUpdateはやろう。リリース版の無印WIndows、SP1はマズイ。SP2からはマシ。
●日本はセキュリティ的にレベル高め、
●Windowsを直接WEBにつなぐと危ないの当たり前なので、ISPはモデム貸すのは完全にやめて、ルータだけにしてほしい。
(これについては日系NETWORKにもあったが、WinXPのSP2未満はインターネット直接接続すると 4分でなにかしら感染するらしい。。)
●昨年の"MS08-067"はブラスターみたいに流行ってもおかしくなかった、当時に比べ個人のPCのパッチ適用率が上がってたりと拡散しにくい状況になったのかな。
●USBメモリによる感染増加、USBの自動再生いやならGPでとめたり。
●MD5の証明書やめようねー
 

まあその他もろもろ、引き出しの多さには非常に驚き…
 
 

LTは省略しておく、この辺は参加したほうがよさそうだから。
ちなみにテーマはこんなだった。

「アイデンティティ管理入門」ヴァルカンさん


セキュリティ規格色々紹介(題名うろ覚え)F.koryuさん


「その後の龍谷大学理工学部メール環境」セキュメモの小島先生


「UltraVNC SCを使った遠隔サポート」よーいちさん


 

皆さん勉強量がハンパないなぁと感じる、普段の私の仕事は結構「動けばいいや」的なところがあるので、仕様とか規格・ましてその背景など説明されると関心せざるを得ないですね。
モノ作るにあたってはやはり納得いくまで調べないと、または定型化しておかないと結局あとで困るんだよなあと思う。
 

さて、省略してはイカンところとしては宣伝?
セキュリティホールmemo 小島先生のサイト、連日かなりお世話になっている身としては初の生・小島先生に少々感動。
関東の方はまっちゃ445 よろしく?
admintech.jp も要チェック、というか次の「AD×LDAP」とか大好物だ、さすがに東京まで行けないので資料だけでも欲しい…
 

ほか、PCI-DSSは具体的な部分について個人的にまとめサイト作ろうとしてるので(要件に対応するOSの機能・設定をまとめる。)もっと話を聞きたいなあ。
 

「UltraVNC SC」、何気に一番面白かったカモ。。実用向け特化の内容はウチの保守部隊iSTAFFに通ずるものが。

 
 
 

懇親会も行った、まっちゃ139御用達、定番のお店だったらしい。お料理美味しかったです。
色々お名刺の交換させて頂きましたが、普通に取引先の方がいて噴いた、エー。セキュメロにも来られるそう、よしちょっと行ってみよう。
せっかくなのでまっちゃさんに抱きついておいた、「アッー!」
 
 

今回驚いたのは私の所属するアイクラフト社員の女の子がいきなりいたこと、事前情報なし。確かにこないだ誘ったが、くるなら教えてくれよ(笑) 新手のツンデレかと。
ついでに言うと、小野寺さんの発表で彼女はマイクロソフトのイメージが変わったらしい。「仕様ですから」とつっけんどんに御高くとまっている印象が払拭された模様。確かにそういうのはあるかも。
 

ほか Wassr購読中の方々 と話す機会を結構もてた。この辺は結構貴重なんじゃなかろうか。
 

あとは帰りに一緒だった勉強会@徳島 の子。
話を聞くにプログラミングにどえらい情熱を持っていることがよくわかった、素直ないい子だった。「オリジナル言語をつくるぜ」と言ってたので是非がんばって欲しい。
 
 

…こういった高い情熱を持ったエンジニアをを雇用して食わせながら遊ばせたい(もちろん利益はアリで)とする、一部ベンチャー企業の経営者さんの気持ちがわかる気がした。
 

彼らの情熱を業績につなげ、なおかつ市場の活性化と雇用の確保をやっていくという事はITに携る者として目指す姿の一つなのかもしれない。美化しすぎかな?
 
 

とりとめないがこんなもんで。

2009年1月9日金曜日

Windowsのオブジェクトアクセス監査でアクセス権の変更を記録する

ちょっと質問を貰った事でまとめたので、こちらに転載。
 

WindowsServer2003のファイル共有を使っていたら、共有フォルダのアクセス権が知らん間に変わっていたので、監査ログを残しておきたいという話。
 
 

監査を有効にするには下記のように設定。
【解説】重要なファイルに対するアクセスを監査するには? - ITPro
 

今回の目的だと、フルコントロールでなくて、「アクセス許可の変更」を成功・失敗ともつければいいや。
 
 

ファイル監査全体については下記がすごく分かりやすい。
ファイルサーバー監査(ファイル) - 株式会社エスディーケー
http://www.sdk-ltd.com/misc/el107.asp
 

で、実際今回理解しておけばいいことだけまとめ。
 

  • ファイル操作イベントは ID 560 から 562 ではさまれます

  • 一連の動作は、オープン後のファイルハンドル番号が共通なので同時にアクセスがあっても分かる

  • イベントID 560 と 562 の間にある イベント ID 567 にユーザがやろうとした動作の情報がある



 



で、567のやろうとした動作は アクセスマスク として書いてあります。
 

アクセス権の変更なら、
「アクセス マスク: WRITE_DAC 」
 

となっているので抽出できる。というわけです。
 
[caption id="attachment_1168" align="alignnone" width="469" caption="画像:アクセス権変更した時のイベント"]画像:アクセス権変更した時のイベント[/caption]
 

どのファイルをいじったかは直前のイベントID560のログを見て、ハンドルIDから引きましょう、イメージファイル名はファイル操作に使ったアプリなので間違えないように。
 

ちなみにここではファイルだけど、Windowsはフォルダを「入れ物属性持ったファイル」として扱うのでフォルダの場合も大体同じです。

2009年1月6日火曜日

procファイルシステムの下のfdディレクトリ

Linuxのprocファイルシステム、まあ大概 "/proc" にあるやつ。以前に「プロセス毎の環境変数を参照する」という記事を作ったが、またproc関連の話。
 

"/proc" 以下にはシステムで動作中の各プロセスID名でディレクトリが作られ、それらの情報が保管されているが、その中に"fd" というディレクトリがある。
その中にはプロセスが使用中のファイルへのシンボリックリンクが作らてれる。
 



実際の例を見るために apache の開いているファイル情報を見てみる。
 
 


まず psid をチェックしよか。
# pstree -p
init(1)─┬─agetty(2109)
--- snip ---
├─httpd(1848)─┬─httpd(12453)
│ ├─httpd(12454)
│ ├─httpd(12455)
│ ├─httpd(12456)
│ ├─httpd(12457)
│ ├─httpd(12458)
│ ├─httpd(12459)
│ ├─httpd(12461)
│ └─httpd(13484)
--- snip ---

 

大元の1848を調査しよう、"/proc/{プロセスID}/fd"を見てみよう。
# ls /proc/1848/fd
0 1 10 11 12 13 2 3 4 5 6 7 8 9


数字ばっかり? それはディスクリプタ番号だからだ。
少し細かく言うとプロセスが入出力先として持つディスクリプタの番号を名前にしたリンク 、"File Descriptor" だから "fd" ということらしい。
 

詳細を表示しよう。
# ls -l
total 0
lr-x------ 1 root root 64 Jan 5 19:31 0 -> /dev/null
l-wx------ 1 root root 64 Jan 5 19:31 1 -> /dev/null
l-wx------ 1 root root 64 Jan 5 19:31 10 -> /var/log/httpd/ssl_error_log
l-wx------ 1 root root 64 Jan 5 19:31 11 -> /var/log/httpd/access_log
l-wx------ 1 root root 64 Jan 5 19:31 12 -> /var/log/httpd/ssl_access_log
l-wx------ 1 root root 64 Jan 5 19:31 13 -> /var/log/httpd/ssl_request_log
l-wx------ 1 root root 64 Jan 5 19:31 2 -> /var/log/httpd/error_log
lrwx------ 1 root root 64 Jan 5 19:31 3 -> socket:[4625]
lrwx------ 1 root root 64 Jan 5 19:31 4 -> socket:[4626]
lrwx------ 1 root root 64 Jan 5 19:31 5 -> socket:[4630]
lrwx------ 1 root root 64 Jan 5 19:31 6 -> socket:[4631]
lr-x------ 1 root root 64 Jan 5 19:31 7 -> pipe:[35186]
l-wx------ 1 root root 64 Jan 5 19:31 8 -> pipe:[35186]
l-wx------ 1 root root 64 Jan 5 19:31 9 -> /var/log/httpd/error_log


apache が現在開いているファイルへのリンクだとわかる、ソケットやパイプもあるな。
 
 


これを応用すると結構アクロバティックな真似ができる。
削除したファイルをlsofで復元する - ITmedia (linux.com原文の日本語訳)
 

この辺の話は面白いな。確かにapache 動作中にログファイル消しても平気だし、同名のファイルを作ってもそこにログが書き込まれない、あれはそういうわけかと。