<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1579763590730009376</id><updated>2012-02-17T03:06:31.723+09:00</updated><category term='Jetico'/><category term='make'/><category term='GRUB'/><category term='SSH'/><category term='udev'/><category term='iptables'/><category term='mt-daapd'/><category term='Thinkpad T60'/><category term='bash'/><category term='Debian'/><category term='kernel'/><category term='開発ツール'/><title type='text'>ＹＯチェックス</title><subtitle type='html'>OS設定、プログラム、開発ツールなどのTipsを書き綴ります。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-6428182968277629787</id><published>2007-05-10T09:33:00.000+09:00</published><updated>2007-05-10T10:07:36.555+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>iptables起動設定</title><content type='html'>&lt;p&gt;
　Debianにてiptablesを起動時に復元するための設定方法を調査した。どうやら、きちんと決められた方法はなく、自分でシェルスクリプトを書く必要があるらしい。
/etc/network/interfacesのpre-upに書くという方法が一番簡単そうだったが、現在のiptablesの設定はインターフェース単位ではないのでその方法はとらず、/etc/init.dにスクリプトを置くという方法をとることにした。
&lt;/p&gt;
&lt;p&gt;
　/etc/init.d配下のシェルスクリプトには決められた様式があり、ひな型としては、/etc/init.d/skeletonがあるが、これはデーモン用のものであるため、とりあえず、/etc/init.d/ifupdownを参考にして、前に作成したSSHのフィルタリングを行うルール(この&lt;a href="http://yochecks.blogspot.com/2007/05/sshbrute-force.html"&gt;記事&lt;/a&gt;を参照)を設定するように以下のスクリプトmyfirewallを作成した。
&lt;div class="display"&gt;
#!/bin/sh&lt;br /&gt;
###&amp;nbsp;BEGIN&amp;nbsp;INIT&amp;nbsp;INFO&lt;br /&gt;
#&amp;nbsp;Provides:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myfirewall&lt;br /&gt;
#&amp;nbsp;Required-Start:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
#&amp;nbsp;Required-Stop:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$local_fs&lt;br /&gt;
#&amp;nbsp;Default-Start:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S&lt;br /&gt;
#&amp;nbsp;Default-Stop:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;6&lt;br /&gt;
#&amp;nbsp;Short-Description:&amp;nbsp;Set&amp;nbsp;firewall.&lt;br /&gt;
###&amp;nbsp;END&amp;nbsp;INIT&amp;nbsp;INFO&lt;br /&gt;
&lt;br /&gt;
[&amp;nbsp;-x&amp;nbsp;/sbin/iptables&amp;nbsp;]&amp;nbsp;||&amp;nbsp;exit&amp;nbsp;0&lt;br /&gt;
&lt;br /&gt;
.&amp;nbsp;/lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
MYNAME="${0##*/}"&lt;br /&gt;
report()&amp;nbsp;{&amp;nbsp;echo&amp;nbsp;"${MYNAME}:&amp;nbsp;$*"&amp;nbsp;;&amp;nbsp;}&lt;br /&gt;
report_err()&amp;nbsp;{&amp;nbsp;log_failure_msg&amp;nbsp;"$*"&amp;nbsp;;&amp;nbsp;}&lt;br /&gt;
[&amp;nbsp;-r&amp;nbsp;/etc/default/$MYNAME&amp;nbsp;]&amp;nbsp;&amp;&amp;&amp;nbsp;.&amp;nbsp;/etc/default/$MYNAME&lt;br /&gt;
&lt;br /&gt;
start_firewall&amp;nbsp;()&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-N&amp;nbsp;SSHEvil&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-N&amp;nbsp;SSH&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-j&amp;nbsp;SSH&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;22&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSHEvil&amp;nbsp;-m&amp;nbsp;recent&amp;nbsp;--name&amp;nbsp;badSSH&amp;nbsp;--set&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSHEvil&amp;nbsp;-j&amp;nbsp;LOG&amp;nbsp;--log-level&amp;nbsp;DEBUG&amp;nbsp;--log-prefix&amp;nbsp;"evil&amp;nbsp;SSH&amp;nbsp;user:"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSHEvil&amp;nbsp;-j&amp;nbsp;DROP&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSH&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;-s&amp;nbsp;192.168.0.0/24&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSH&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;!&amp;nbsp;--syn&amp;nbsp;-m&amp;nbsp;state&amp;nbsp;--state&amp;nbsp;ESTABLISHED,RELATED&amp;nbsp;-j&amp;nbsp;ACCEPT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSH&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--syn&amp;nbsp;-m&amp;nbsp;recent&amp;nbsp;--name&amp;nbsp;badSSH&amp;nbsp;--update&amp;nbsp;--seconds&amp;nbsp;600&amp;nbsp;-j&amp;nbsp;REJECT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSH&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--syn&amp;nbsp;-m&amp;nbsp;recent&amp;nbsp;--name&amp;nbsp;conSSH&amp;nbsp;--rcheck&amp;nbsp;--seconds&amp;nbsp;60&amp;nbsp;--hitcount&amp;nbsp;5&amp;nbsp;-j&amp;nbsp;SSHEvil&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSH&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--syn&amp;nbsp;-m&amp;nbsp;recent&amp;nbsp;--name&amp;nbsp;conSSH&amp;nbsp;--set&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-A&amp;nbsp;SSH&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--syn&amp;nbsp;-j&amp;nbsp;ACCEPT&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop_firewall&amp;nbsp;()&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-F&amp;nbsp;SSHEvil&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-F&amp;nbsp;SSH&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-F&amp;nbsp;INPUT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;iptables&amp;nbsp;-X&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case&amp;nbsp;"$1"&amp;nbsp;in&lt;br /&gt;
&amp;nbsp;&amp;nbsp;start)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_begin_msg&amp;nbsp;"Setting&amp;nbsp;up&amp;nbsp;firewall..."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_firewall&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_end_msg&amp;nbsp;0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;stop)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_begin_msg&amp;nbsp;"Stopping&amp;nbsp;firewall..."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop_firewall&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_end_msg&amp;nbsp;0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;restart|force-reload)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_begin_msg&amp;nbsp;"Restarting&amp;nbsp;firewall..."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop_firewall&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_firewall&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_end_msg&amp;nbsp;0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;*)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;"Usage:&amp;nbsp;$0&amp;nbsp;{start|stop|restart|force-reload}"&amp;nbsp;&gt;&amp;2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;3&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
exit&amp;nbsp;0
&lt;/div&gt;
&lt;p&gt;
　次に実際に起動時にinitに起動してもらうため、必要なランレベルのディレクトリィにリンクを張る必要がある。Debianの/etc/inittabは以下のようになっている。
&lt;div class="display"&gt;
#&amp;nbsp;The&amp;nbsp;default&amp;nbsp;runlevel.&lt;br /&gt;
id:2:initdefault:&lt;br /&gt;
&lt;br /&gt;
#&amp;nbsp;Boot-time&amp;nbsp;system&amp;nbsp;configuration/initialization&amp;nbsp;script.&lt;br /&gt;
#&amp;nbsp;This&amp;nbsp;is&amp;nbsp;run&amp;nbsp;first&amp;nbsp;except&amp;nbsp;when&amp;nbsp;booting&amp;nbsp;in&amp;nbsp;emergency&amp;nbsp;(-b)&amp;nbsp;mode.&lt;br /&gt;
si::sysinit:/etc/init.d/rcS&lt;br /&gt;
&lt;br /&gt;
#&amp;nbsp;What&amp;nbsp;to&amp;nbsp;do&amp;nbsp;in&amp;nbsp;single-user&amp;nbsp;mode.&lt;br /&gt;
~~:S:wait:/sbin/sulogin&lt;br /&gt;
&lt;br /&gt;
#&amp;nbsp;/etc/init.d&amp;nbsp;executes&amp;nbsp;the&amp;nbsp;S&amp;nbsp;and&amp;nbsp;K&amp;nbsp;scripts&amp;nbsp;upon&amp;nbsp;change&lt;br /&gt;
#&amp;nbsp;of&amp;nbsp;runlevel.&lt;br /&gt;
#&lt;br /&gt;
#&amp;nbsp;Runlevel&amp;nbsp;0&amp;nbsp;is&amp;nbsp;halt.&lt;br /&gt;
#&amp;nbsp;Runlevel&amp;nbsp;1&amp;nbsp;is&amp;nbsp;single-user.&lt;br /&gt;
#&amp;nbsp;Runlevels&amp;nbsp;2-5&amp;nbsp;are&amp;nbsp;multi-user.&lt;br /&gt;
#&amp;nbsp;Runlevel&amp;nbsp;6&amp;nbsp;is&amp;nbsp;reboot.&lt;br /&gt;
&lt;br /&gt;
l0:0:wait:/etc/init.d/rc&amp;nbsp;0&lt;br /&gt;
l1:1:wait:/etc/init.d/rc&amp;nbsp;1&lt;br /&gt;
l2:2:wait:/etc/init.d/rc&amp;nbsp;2&lt;br /&gt;
l3:3:wait:/etc/init.d/rc&amp;nbsp;3&lt;br /&gt;
l4:4:wait:/etc/init.d/rc&amp;nbsp;4&lt;br /&gt;
l5:5:wait:/etc/init.d/rc&amp;nbsp;5&lt;br /&gt;
l6:6:wait:/etc/init.d/rc&amp;nbsp;6
&lt;/div&gt;
Debianではランレベル0がhalt, 6がrebootとなりそれぞれ/etc/rc{0,6}.d/の下のスクリプトが実行される。そして、/etc/rcS.dの下はsysinit、つまりランレベルに関わらず最初に実行されるディレクトリィとなっている。
&lt;/p&gt;
&lt;p&gt;
　基本的にネットワーク起動前にiptablesを設定する必要があるのだが、Debianの場合は起動は以前に調査した結果、/etc/init.d/udev startでeth0が起動し、/etc/init.d/networking stopでeth0が停止することがわかっている(詳細はこの&lt;a href="http://yochecks.blogspot.com/2007/04/debian.html"&gt;記事&lt;/a&gt;参照)。/etc/init.d/udevは/etc/rcS.d/S03udevで開始され、/etc/init.d/networkingは/etc/rc{0,6}.d/S35networkingで停止される。続くS36ifupdownもネットワークに関連するスクリプトであり、状態ファイルの削除を行っているものである。
&lt;/p&gt;
&lt;p&gt;
　通常Sから始まるスクリプトは起動スクリプトであるが、initよりランレベルを引数として実際に起動されている/etc/rcスクリプトを見てみると、以下のようになっている。
&lt;div class="display"&gt;
(省略)&lt;br /&gt;
case&amp;nbsp;"$runlevel"&amp;nbsp;in&lt;br /&gt;
&amp;nbsp;&amp;nbsp;0|6)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ACTION=stop&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Count&amp;nbsp;down&amp;nbsp;from&amp;nbsp;0&amp;nbsp;to&amp;nbsp;-100&amp;nbsp;and&amp;nbsp;use&amp;nbsp;the&amp;nbsp;entire&amp;nbsp;bar&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;first_step=0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;progress_size=100&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;step_change=-1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
(省略)&lt;br /&gt;
#&amp;nbsp;First,&amp;nbsp;run&amp;nbsp;the&amp;nbsp;KILL&amp;nbsp;scripts.&lt;br /&gt;
if&amp;nbsp;[&amp;nbsp;"$previous"&amp;nbsp;!=&amp;nbsp;N&amp;nbsp;]&lt;br /&gt;
then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;#&amp;nbsp;Run&amp;nbsp;all&amp;nbsp;scripts&amp;nbsp;with&amp;nbsp;the&amp;nbsp;same&amp;nbsp;level&amp;nbsp;in&amp;nbsp;parallel&lt;br /&gt;
&amp;nbsp;&amp;nbsp;CURLEVEL=""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;for&amp;nbsp;s&amp;nbsp;in&amp;nbsp;/etc/rc$runlevel.d/K*&lt;br /&gt;
&amp;nbsp;&amp;nbsp;do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;level=$(echo&amp;nbsp;$s&amp;nbsp;|&amp;nbsp;sed&amp;nbsp;'s/.*\/K\([0-9][0-9]\).*/\1/')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;"$level"&amp;nbsp;=&amp;nbsp;"$CURLEVEL"&amp;nbsp;]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CURLEVEL=$level&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SCRIPTS=""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;/etc/rc$runlevel.d/K$level*&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(省略)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SCRIPTS="$SCRIPTS&amp;nbsp;$i"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;done&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startup&amp;nbsp;stop&amp;nbsp;$SCRIPTS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;done&lt;br /&gt;
fi&lt;br /&gt;
#&amp;nbsp;Now&amp;nbsp;run&amp;nbsp;the&amp;nbsp;START&amp;nbsp;scripts&amp;nbsp;for&amp;nbsp;this&amp;nbsp;runlevel.&lt;br /&gt;
#&amp;nbsp;Run&amp;nbsp;all&amp;nbsp;scripts&amp;nbsp;with&amp;nbsp;the&amp;nbsp;same&amp;nbsp;level&amp;nbsp;in&amp;nbsp;parallel&lt;br /&gt;
CURLEVEL=""&lt;br /&gt;
for&amp;nbsp;s&amp;nbsp;in&amp;nbsp;/etc/rc$runlevel.d/S*&lt;br /&gt;
&amp;nbsp;&amp;nbsp;do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;level=$(echo&amp;nbsp;$s&amp;nbsp;|&amp;nbsp;sed&amp;nbsp;'s/.*\/S\([0-9][0-9]\).*/\1/')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;"$level"&amp;nbsp;=&amp;nbsp;"$CURLEVEL"&amp;nbsp;]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CURLEVEL=$level&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SCRIPTS=""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;/etc/rc$runlevel.d/S$level*&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;nbsp;!&amp;nbsp;-f&amp;nbsp;$i&amp;nbsp;]&amp;nbsp;&amp;&amp;&amp;nbsp;continue&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(省略)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SCRIPTS="$SCRIPTS&amp;nbsp;$i"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;done&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startup&amp;nbsp;$ACTION&amp;nbsp;$SCRIPTS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;done&lt;br /&gt;
fi&lt;br /&gt;
&lt;/div&gt;
ランレベル0,6のときは、先頭文字がS,Kに関わらずstopが引数として渡されている。そして、スクリプトの実行順番は、K,Sの順序である。これらの結果より、/etc/rcS.dにS03udevよりも早く/etc/rc{0,6}.dにS36ifupdownより遅くなるように、/etc/rcS.d/S03myfirewallと/etc/rc{0,6}.d/S37myfirewallというリンクを作成すればよいことがわかる。
&lt;/p&gt;
&lt;p&gt;
　Debianではinitスクリプトのリンクを作成するコマンドupdate-rc.dがある。事前に/etc/init.d/配下にスクリプトが存在する必要があるので、上記のmyfirewallを/etc/init.d/へコピーする。update-rc.dコマンドの書式は以下となる。
&lt;div&gt;
&lt;strong&gt;update-rc.d {スクリプト名} {start | stop} {2桁連番} {runlevel} {.} ...&lt;/strong&gt;
&lt;/div&gt;&lt;br /&gt;
{start | stop}から{.}までは複数個記述することができる。よって、以下のコマンドを実行すればよい。
&lt;div class="display"&gt;
$&amp;nbsp;update-rc.d&amp;nbsp;-n&amp;nbsp;myfirewall&amp;nbsp;start&amp;nbsp;03&amp;nbsp;S&amp;nbsp;.&amp;nbsp;start&amp;nbsp;37&amp;nbsp;0&amp;nbsp;6&amp;nbsp;.&lt;br /&gt;
&amp;nbsp;Adding&amp;nbsp;system&amp;nbsp;startup&amp;nbsp;for&amp;nbsp;/etc/init.d/myfirewall&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;/etc/rc0.d/S37myfirewall&amp;nbsp;-&gt;&amp;nbsp;../init.d/myfirewall&lt;br /&gt;
&amp;nbsp;&amp;nbsp;/etc/rc6.d/S37myfirewall&amp;nbsp;-&gt;&amp;nbsp;../init.d/myfirewall&lt;br /&gt;
&amp;nbsp;&amp;nbsp;/etc/rcS.d/S03myfirewall&amp;nbsp;-&gt;&amp;nbsp;../init.d/myfirewall
&lt;/div&gt;

&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://debian.fam.cx/index.php?Software%2Fiptables' target='_blank'&gt;Software/iptables - Debian GNU/Linux スレッドテンプレ&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JM/html/iptables/man8/iptables.8.html' target='_blank'&gt;Manpage of IPTABLES&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html' target='_blank'&gt;Manpage of BASH&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-6428182968277629787?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/6428182968277629787/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=6428182968277629787' title='8 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/6428182968277629787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/6428182968277629787'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/05/iptables.html' title='iptables起動設定'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-2068332493799617429</id><published>2007-05-07T23:08:00.000+09:00</published><updated>2007-05-07T23:15:59.056+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>getopt</title><content type='html'>&lt;h4 class="subtitle"&gt;概要&lt;/h4&gt;
&lt;p&gt;
　getoptは主にシェルスクリプトでコマンドオプションを使いやすい形に変形するために使う。いくつか書式があるが、伝統的なgetoptでは以下のように使う。
&lt;div class="display"&gt;
$getopt optstring parameters
&lt;/div&gt;
引数はoptstringとparamtersに分かれる。optstringにはオプションと認識する一文字を連続して書く。その文字の最後に:をつけた場合は、そのオプションはパラメータをとるという意味になる。parametersは、解析する引数を書く。
&lt;/p&gt;

&lt;h4 class="subtitle"&gt;伝統的なコマンド使用例&lt;/h4&gt;
&lt;p&gt;
　例えば ab:cとした場合は、-a -b -cをオプションとして認識し、-bオプションはパラメータをとることになる。出力の順番はオプションと必要があればそのパラメータがすべて出力され、'--'を出力後にどれでもないものが出力される。

&lt;div class="display"&gt;
$ getopt ab:c -a&lt;br /&gt;
 -a --
&lt;/div&gt;
上の例では、parametersが-aオプションのみなので-aと'--'が出力される。

&lt;div class="display"&gt;
$getopt ab:c -b&lt;br /&gt;
getopt: オプションには引数が必要です -- b&lt;br /&gt;
 --
&lt;/div&gt;
今度は-bオプションを指定したが、-bオプションには引数が必要となるためエラーとなる。

&lt;div class="display"&gt;
$ getopt ab:c -b aaa&lt;br /&gt;
 -b aaa --
&lt;/div&gt;
上記のように書くと、aaaが-bオプションの引数になるので正常に出力される。

&lt;div class="display"&gt;
$ getopt ab:c -b aaa -a bbb -c&lt;br /&gt;
 -b aaa -a -c -- bbb
&lt;/div&gt;
-aの後にbbbを書くと、-aは引数をとらないのでbbbはオプションでもオプションの引数でもないことになり、--の後ろに出力され、順番が入れ替わる。

&lt;div class="display"&gt;
$ getopt ab:c -b aaa -a -c -d&lt;br /&gt;
getopt: オプションが違います -- d&lt;br /&gt;
 -b aaa -a -c --
&lt;/div&gt;
-dはoptstringに定義されていないため、エラーとなる。
&lt;/p&gt;
&lt;p&gt;
　このようにgetoptでオプション文字並びにオプションの引数チェックとオプション文字でもオプションの引数でもないものを後ろに並べかえてくれる。
&lt;/p&gt;

&lt;h4 class="subtitle"&gt;拡張コマンド使用例&lt;/h4&gt;
&lt;p&gt;
　GNUのgetoptの場合は以下のような書き方ができる。（他にもいくつか書き方があるが詳細は&lt;a href="http://www.linux.or.jp/JM/html/util-linux/man1/getopt.1.html" target="_blank"&gt;getop(1)&lt;/a&gt;を参照のこと)
&lt;div class="display"&gt;
$getopt  -o optstring -l longoptstring -- parameters 
&lt;/div&gt;
-oは短いオプションを上記と同じ形式で記述する。-lには、長いオプション名を','で区切りながら記述できる。また、短いオプションと同様に最後に':'をつけるとそのオプションは引数を取ることになる。paramtersで長いオプションは'--'で始まる。
&lt;div class="display"&gt;
$getopt -o ab:c -l dfg,hij: -- -a --dfg abc --hij aaa&lt;br /&gt;
 -a --dfg --hij 'aaa' -- 'abc'
&lt;/div&gt;
--dfgと--hijがオプションとして認識され、aaaは--hijの引数となる。また、この書式を使うとシェルでのメタ文字の展開を避けるため、オプションの引数とオプション文字でもオプションの引数でもないものはシングルクォートされて出力される。

&lt;h4 class="subtitle"&gt;シェルスクリプト利用例&lt;/h4&gt;
&lt;p&gt;
　シェルスクリプトで使う場合は以下のようにして使う。

&lt;div class="display"&gt;
OPTIONS=`getopt&amp;nbsp;-o&amp;nbsp;ab:c&amp;nbsp;--long&amp;nbsp;dfg,hij:&amp;nbsp;--&amp;nbsp;"$@"`&lt;br /&gt;
if&amp;nbsp;[&amp;nbsp;$?&amp;nbsp;!=&amp;nbsp;0&amp;nbsp;]&amp;nbsp;;&amp;nbsp;then&lt;br /&gt;
&amp;nbsp;exit&amp;nbsp;1&lt;br /&gt;
fi&lt;br /&gt;
eval&amp;nbsp;set&amp;nbsp;--&amp;nbsp;"$OPTIONS"&lt;br /&gt;
while&amp;nbsp;true;&amp;nbsp;do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;"$1"&amp;nbsp;in&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-a)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;-aのときの処理&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shift&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-b)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;-bのときの処理&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shift&amp;nbsp;2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-c)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;-cのときの処理&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shift&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--dfg)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;--dfgのときの処理&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shift&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--hij)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;--hijのときの処理&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shift&amp;nbsp;2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shift&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;"Internal&amp;nbsp;error!"&amp;nbsp;&gt;&amp;2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esac&lt;br /&gt;
done&lt;br /&gt;
#&amp;nbsp;オプションでもオプションの引数でもないものの処理
&lt;/div&gt;
$@はシェルスクリプトの位置パラメータ($1,$2,...)に展開されるので、それをgetoptにかけ、オプションとそのパラメータが先になるように並べ変える。その際、認識できないオプションがあったり、オプションのパラメータが存在しない場合はエラーとなる。その出力結果をもう一度「set -- 」で位置パラメータに入れ直す。ただし、シェルの特別な文字を展開しないように、$OPTIONSをダブルクォート("$OPTIONS")としてパラメータ展開を行っているため、evalとして実行する。(そうしないと、setのパラメータとして展開されるので、ひとつの単語とみなされ$1にまとめて設定されてしまう。evalをつけるとevalのパラメータとして展開された後、「set --」が実行されるため、スペース区切りでそれぞれ位置パラメータに設定される。)
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;a href="http://www.linux.or.jp/JM/html/util-linux/man1/getopt.1.html" target="_blank"&gt;Manpage of GETOPT&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html" target="_blank"&gt;Manpage of BASH&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-2068332493799617429?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/2068332493799617429/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=2068332493799617429' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/2068332493799617429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/2068332493799617429'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/05/getopt.html' title='getopt'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-2721449376028489038</id><published>2007-05-05T08:20:00.000+09:00</published><updated>2007-05-10T10:11:57.662+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSH'/><category scheme='http://www.blogger.com/atom/ns#' term='iptables'/><title type='text'>SSHのbrute forceアタック対応</title><content type='html'>&lt;p&gt;
　自宅サーバーのログをチェックしていると、/var/log/auth.logにSSHに対してユーザを変えながら何度もアクセスしているログが大量に残っていた。どうもbrute forceアタックをされているようだ。brute forceアタックというのはユーザ、パスワードを総当りで破ろうとする力ずくの攻撃のこと。
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;● 主な対策方法&lt;/h4&gt;
&lt;p&gt;
　SSHのbruteforceアタック対しての対策方法は主に以下があるようだった。&lt;br /&gt;
1.ポート番号を1024番以降(well-knownポート以外)に変える。&lt;br /&gt;
2.TCPWrapperやiptablesで特定のIPアドレスのみ接続を受け付ける。&lt;br /&gt;
3.iptablesのipt_recentを使って一定時間にアクセスがあったホストをはじく。&lt;br /&gt;
2は、今後自分が外からSSH経由でログインする場合は、IPアドレスを固定できないので使えない。1が、もっとも簡単なのだが、勉強がてら3の方法に挑戦してみた。
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;● iptables概要&lt;/h4&gt;
&lt;p&gt;
 iptablesの最小単位はパケットをどう扱うかというルールで、それをチェインというルールをひとまとめにしたものに追加していく。チェインは組み込み済みのもの以外にユーザが自分で定義することができる。そして、チェインはテーブルに属しており、テーブルには、用途に応じてfilter,nat,mangleという3種類がある。filterは通常のパケットの送受信に使うもので、INPUT,OUTPUT,FORWARDの組み込みチェインがある。他にNAT変換時に使うnatと、何に使うのかよくわからないがmangleというテーブルがある。今回はfilterテーブルに設定を行う。
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;● iptablesの設定&lt;/h4&gt;

&lt;p&gt;
　以下のようにiptablesの設定を行う。

&lt;div class="display"&gt;
iptables -N SSHEvil&lt;br /&gt;
iptables -N SSH&lt;br /&gt;
iptables -A INPUT -j SSH -p tcp --dport 22&lt;br /&gt;
&lt;br /&gt;
iptables -F SSHEvil&lt;br /&gt;
iptables -A SSHEvil -m recent --name badSSH --set&lt;br /&gt;
iptables -A SSHEvil -j LOG --log-level DEBUG --log-prefix "evil SSH user:"&lt;br /&gt;
iptables -A SSHEvil -j DROP&lt;br /&gt;
&lt;br /&gt;
iptables -F SSH&lt;br /&gt;
iptables -A SSH -j ACCEPT -s 192.168.0.0/24&lt;br /&gt;
iptables -A SSH -p tcp ! --syn -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
# SSHルール1&lt;br /&gt;
iptables -A SSH -p tcp --syn -m recent --name badSSH --update --seconds 600 -j REJECT&lt;br /&gt;
# SSHルール2&lt;br /&gt;
iptables -A SSH -p tcp --syn -m recent --name conSSH --rcheck --seconds 60 --hitcount 5 -j SSHEvil&lt;br /&gt;
# SSHルール3&lt;br /&gt;
iptables -A SSH -p tcp --syn -m recent --name conSSH --set&lt;br /&gt;
iptables -A SSH -p tcp --syn -j ACCEPT&lt;br /&gt;
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;
　まず、filterテーブルに新規にSSHEvilとSSHというチェインを作成。3行目でINPUTチェインに対して22番ポート(SSHのポート)を受信した場合は、SSHチェインへ渡すように設定。filterテーブルには組み込みでINPUT,OUTPUT,FORWARDの3つのチェインが組み込まれている。INPUTは受信したパケットにFORWARDは他のインターフェースへ流すパケットに、OUTPUTは送信するパケットに対して適用される。
&lt;/p&gt;
&lt;p&gt;
　4行目からはSSHEvliチェインに対してルールを設定する。
まず、-Fで全てのルールを削除。次にipt_recentモジュールのルール設定でbadSSHというリスト(-name)に送信元IPアドレスを記憶し(--set)、ログを出力してパケットを捨てるというルールを記述して、SSHEvliチェインは終了。
このように、SSHEvilチェインは一本道の単純なものでパケットは最終的に全て捨てられることになる。
&lt;/p&gt;
&lt;p&gt;
　続いてSSHチェインのルール設定を行う。8行目で-Fで全てのルールを削除。ローカルアドレスは無条件で受信を許可する。続いてSYNフラグなし(!--syn)、TCP状態がESTABLISHEDならびにRELATED(--state)を指定することでTCPでの接続確立後のデータパケットは許可する。以降のルールは接続確立要求のパケット(--syn)を対象に設定する。送信元IPアドレスがbadSSHリストで(-name)600秒以内にアクセスがあるか(--seconds)チェックし、あった場合は受信時間を更新し(--updates)パケットを拒否する。
　次のルールでは、送信元IPアドレスがconSSHリスト(-name)で60秒以内のアクセスが(--seconds)、5回以上ある(--hitcount)かチェックしあった場合は(--rcheck)SSHEvilチェインへ渡す設定をし、さらにconSSHというリスト(-name)に送信元IPアドレスを記憶し(--set)、最後にパケットを受け入れる。
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;● パケットフィルタの動作&lt;/h4&gt;
&lt;p&gt;
 SSH接続を要求してきたホストは、SSHルール3によりconSSHリストに登録された後要求を受け付ける。しかし、60秒に5回を超えてSSH接続をする場合は、その前にあるSSHルール2に該当することになりSSHEvilチェインへと移動し、badSSHリストに登録されてパケットは捨てられることになる。さらに接続しようとすると今度はSSHルール1に引っかかり、パケットは拒否されることになる。SSHルール1に引っかかった場合は、その都度時間が更新されるため、このルールから抜け出すためには600秒間アクセスを行わない必要がある。
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;● 問題点&lt;/h4&gt;
&lt;p&gt;
　ただし、ここでいう接続はTCPレベルのものであり、SSHの接続が成功したかどうかを見ているわけではない。SSH接続が成功したとしても1回にカウントされてしまうので、正しいホストも1分間に5接続以上はできないことになる。
&lt;/p&gt;
&lt;p&gt;
　また、IPアドレスで見ているため、NAT下からの複数ユーザの接続の場合は同じIPアドレスとみなされてしまうため接続できなくなる可能性がある。
&lt;/p&gt;
&lt;p&gt;
 とりあえず、自分の運用ではどららも問題になりそうもないので、この設定を使うことにする。
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;● 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www2s.biglobe.ne.jp/~nuts/labo/inti/ipt_recent.html' target='_blank'&gt;iptables の ipt_recent で ssh の brute force attack 対策&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-2721449376028489038?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/2721449376028489038/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=2721449376028489038' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/2721449376028489038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/2721449376028489038'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/05/sshbrute-force.html' title='SSHのbrute forceアタック対応'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-8129827222526376226</id><published>2007-04-28T01:19:00.000+09:00</published><updated>2007-04-28T01:24:23.070+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='udev'/><title type='text'>udevd init_uevent_netlink_sock</title><content type='html'>udevdのinit_uevent_netlink_sock関数の解析メモ&lt;br /&gt;

&lt;div class="display"&gt;
static&amp;nbsp;int&amp;nbsp;init_uevent_netlink_sock(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;sockaddr_nl&amp;nbsp;snl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;int&amp;nbsp;buffersize&amp;nbsp;=&amp;nbsp;16&amp;nbsp;*&amp;nbsp;1024&amp;nbsp;*&amp;nbsp;1024;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;retval;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;snl,&amp;nbsp;0x00,&amp;nbsp;sizeof(struct&amp;nbsp;sockaddr_nl));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;netlinkソケットはカーネルとユーザ空間の通信の通信に使用。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;アドレスはstruct&amp;nbsp;sockaddr_nlを使う。&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snl.nl_family&amp;nbsp;=&amp;nbsp;AF_NETLINK;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snl.nl_pid&amp;nbsp;=&amp;nbsp;getpid();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snl.nl_groups&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;netlinkソケットを作成する&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uevent_netlink_sock&amp;nbsp;=&amp;nbsp;socket(PF_NETLINK,&amp;nbsp;SOCK_DGRAM,&amp;nbsp;NETLINK_KOBJECT_UEVENT);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uevent_netlink_sock&amp;nbsp;==&amp;nbsp;-1)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;getting&amp;nbsp;socket:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;SO_RCVBUFFORCEは、特権プロセスがカーネルパラメータであるrmem_maxを&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;上書きして受信バッファの最大サイズを設定することができる。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rmem_maxは、/proc/sys/net/coreに存在する。&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;set&amp;nbsp;receive&amp;nbsp;buffersize&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setsockopt(uevent_netlink_sock,&amp;nbsp;SOL_SOCKET,&amp;nbsp;SO_RCVBUFFORCE,&amp;nbsp;&amp;buffersize,&amp;nbsp;sizeof(buffersize));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval&amp;nbsp;=&amp;nbsp;bind(uevent_netlink_sock,&amp;nbsp;(struct&amp;nbsp;sockaddr&amp;nbsp;*)&amp;nbsp;&amp;snl,&amp;nbsp;sizeof(struct&amp;nbsp;sockaddr_nl));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(retval&amp;nbsp;&lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("bind&amp;nbsp;failed:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(uevent_netlink_sock);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uevent_netlink_sock&amp;nbsp;=&amp;nbsp;-1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;
}
&lt;/div&gt;

&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man7/netlink.7.html' target='_blank'&gt;JM Manpage of NETLINK&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-8129827222526376226?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/8129827222526376226/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=8129827222526376226' title='92 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/8129827222526376226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/8129827222526376226'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/udevd-initueventnetlinksock.html' title='udevd init_uevent_netlink_sock'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>92</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-907869267811358873</id><published>2007-04-26T17:37:00.000+09:00</published><updated>2007-04-26T17:56:34.863+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='udev'/><title type='text'>OOM Killer</title><content type='html'>&lt;h4 class='subtitle'&gt;● 概要&lt;/h4&gt;
&lt;p&gt;
　Out Of Memory Killerのこと。Linuxのデフォルトの動作では、プロセスがメモリを要求した場合、総メモリ使用量が実メモリ+swap以上であっても、ある程度許可するようになっている。これは、各プロセスが要求したメモリをすべて使うわけではないという経験的な法則により、できるだけ多くのプロセスを起動するためにそのように動作になっているようである。そのため、あるプロセスが確保できたはずのメモリを使おうとし、実際にメモリが足りない場合カーネルが適当なプロセスを選択し、そのプロセスをkillしてしまうことをOut Of Memory Killerという。
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● 特定プロセス除外&lt;/h4&gt;
&lt;p&gt;
 このOOM Killerで重要なプロセスを除外するためには、/proc/(プロセスID)/oom_adjに-17を書き込む。
&lt;/p&gt;
&lt;div class="display"&gt;
$ echo -17 &gt; /proc/(プロセスID)/oom_adj
&lt;/div&gt;


&lt;h4 class='subtitle'&gt;● OOM Killer停止&lt;/h4&gt;
&lt;p&gt;
　また、/proc/sys/vm/overcommit_memoryの値でLinuxの動作そのものを変更することもできる。
&lt;/p&gt;
&lt;table class="border"&gt;
&lt;tr&gt;
&lt;th class="border"&gt;値&lt;/th&gt;&lt;th class="border"&gt;説　明&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="border"&gt;0&lt;/td&gt;&lt;td class="border"&gt;メモリ確保要求があった場合、カーネルが現在未使用のメモリ量から経験的手法で判断する。(デフォルト)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="border"&gt;1&lt;/td&gt;&lt;td class="border"&gt;メモリ確保要求は全て許可する。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="border"&gt;2&lt;/td&gt;&lt;td class="border"&gt;メモリ確保要急がswapメモリ + (物理メモリ * /proc/sys/vm/overcommit_ratio / 100)まで許可する。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
　2に設定することで実メモリ以上のメモリ確保要求は失敗するため、OOM Killerは動作しない。
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● 参考 カーネルソース&lt;/h4&gt;
&lt;p&gt;
overcommit_memory定義値&lt;br /&gt;
&lt;div class="display"&gt;
(include/linux/mman.h )&lt;br /&gt;
#define OVERCOMMIT_GUESS                0&lt;br /&gt;
#define OVERCOMMIT_ALWAYS               1&lt;br /&gt;
#define OVERCOMMIT_NEVER                2&lt;br /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;strong&gt;int __vm_enough_memory(long pages, int cap_sys_admin)&lt;/strong&gt;&lt;br /&gt;
mm/mmap.c&lt;br /&gt;
OOM Killerを実行するか判定を行う。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;unsigned long badness(struct task_struct *p, unsigned long uptime)&lt;/strong&gt;&lt;br /&gt;
mm/oom_kill.c&lt;br /&gt;
OOM Killerの対象プロセスを判定する &lt;br /&gt;
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://itpro.nikkeibp.co.jp/article/Keyword/20070207/260459/' target='_blank'&gt;OOM Killer とは:IPpro&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://blog.miraclelinux.com/uraura/2006/06/number_17.html' target='_blank'&gt;路地裏 ソース解読研究所: Number -17&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.iwahrt.com/iwahrt/ListProblemSolution.do;jsessionid=2ECB97330E5F86A3802928204ACD22B5?problemNo=134&amp;categoryNo=14' target='_blank'&gt;OOM Killer によるプロセスの強制終了を防ぐ&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/sysctl/vm.txt.html' target='_blank'&gt;JF: Linux Kernel 2.6 Documentation: vm.txt&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://d.hatena.ne.jp/yupo5656/20040624/p1' target='_blank'&gt;memologue Linux Memory Overcommit&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-907869267811358873?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/907869267811358873/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=907869267811358873' title='260 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/907869267811358873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/907869267811358873'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/oom-killer.html' title='OOM Killer'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>260</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-903511575112614807</id><published>2007-04-26T01:32:00.000+09:00</published><updated>2007-04-26T01:39:54.662+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='udev'/><title type='text'>udevd init_udevd_socket</title><content type='html'>udevdのinit_udevd_socket関数の解析メモ

&lt;div class="display"&gt;
static&amp;nbsp;int&amp;nbsp;init_udevd_socket(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;sockaddr_un&amp;nbsp;saddr;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socklen_t&amp;nbsp;addrlen;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;int&amp;nbsp;feature_on&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;retval;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;saddr,&amp;nbsp;0x00,&amp;nbsp;sizeof(saddr));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;AF_LOCALはAF_UNIXと同じ&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Windowsでも使うため一般的な名前としてAF_LOCALを使う&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saddr.sun_family&amp;nbsp;=&amp;nbsp;AF_LOCAL;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;先頭をNULL文字にすると抽象名前空間となる。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AF_UNIX(AF_LOCAL)ソケットでのみ使用できる。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;抽象名前空間の実装はLinux2.2以降から。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man7/unix.7.html" target="_blank"&gt;JM Manpage&amp;nbsp;of&amp;nbsp;UNIX&lt;/a&gt;を参照のこと&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;use&amp;nbsp;abstract&amp;nbsp;namespace&amp;nbsp;for&amp;nbsp;socket&amp;nbsp;path&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(&amp;saddr.sun_path[1],&amp;nbsp;UDEVD_CTRL_SOCK_PATH);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addrlen&amp;nbsp;=&amp;nbsp;offsetof(struct&amp;nbsp;sockaddr_un,&amp;nbsp;sun_path)&amp;nbsp;+&amp;nbsp;strlen(saddr.sun_path+1)&amp;nbsp;+&amp;nbsp;1;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udevd_sock&amp;nbsp;=&amp;nbsp;socket(AF_LOCAL,&amp;nbsp;SOCK_DGRAM,&amp;nbsp;0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(udevd_sock&amp;nbsp;==&amp;nbsp;-1)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;getting&amp;nbsp;socket:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;the&amp;nbsp;bind&amp;nbsp;takes&amp;nbsp;care&amp;nbsp;of&amp;nbsp;ensuring&amp;nbsp;only&amp;nbsp;one&amp;nbsp;copy&amp;nbsp;running&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval&amp;nbsp;=&amp;nbsp;bind(udevd_sock,&amp;nbsp;(struct&amp;nbsp;sockaddr&amp;nbsp;*)&amp;nbsp;&amp;saddr,&amp;nbsp;addrlen);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(retval&amp;nbsp;&lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("bind&amp;nbsp;failed:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(udevd_sock);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udevd_sock&amp;nbsp;=&amp;nbsp;-1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;SO_PASSCREDはmsgの補助メッセージとして信任状を受信できるようにする。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;信任状は以下の型&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;ucred&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pid_t&amp;nbsp;&amp;nbsp;pid;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;process&amp;nbsp;id&amp;nbsp;of&amp;nbsp;the&amp;nbsp;sending&amp;nbsp;process&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uid_t&amp;nbsp;&amp;nbsp;uid;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;user&amp;nbsp;id&amp;nbsp;of&amp;nbsp;the&amp;nbsp;sending&amp;nbsp;process&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gid_t&amp;nbsp;&amp;nbsp;gid;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;group&amp;nbsp;id&amp;nbsp;of&amp;nbsp;the&amp;nbsp;sending&amp;nbsp;process&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;補助メッセージは&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/sendmsg.2.html" target="_blank"&gt;sendmsg()&lt;/a&gt;と&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/recvmsg.2.html" target="_blank"&gt;recvmsg()&lt;/a&gt;で送受信する。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man7/unix.7.html" target="_blank"&gt;JM Manpage&amp;nbsp;of&amp;nbsp;UNIX&lt;/a&gt;を参照のこと&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;enable&amp;nbsp;receiving&amp;nbsp;of&amp;nbsp;the&amp;nbsp;sender&amp;nbsp;credentials&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setsockopt(udevd_sock,&amp;nbsp;SOL_SOCKET,&amp;nbsp;SO_PASSCRED,&amp;nbsp;&amp;feature_on,&amp;nbsp;sizeof(feature_on));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;&lt;br /&gt;
}
&lt;/div&gt;

&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man7/unix.7.html' target='_blank'&gt;JM Manpage of UNIX&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man2/sendmsg.2.html' target='_blank'&gt;JM Manpage of SEND&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man2/recvmsg.2.html' target='_blank'&gt;JM Manpage of RECV&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-903511575112614807?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/903511575112614807/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=903511575112614807' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/903511575112614807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/903511575112614807'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/udevd-initudevdsocket.html' title='udevd init_udevd_socket'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-7198785224798366180</id><published>2007-04-24T09:21:00.000+09:00</published><updated>2007-04-28T01:33:48.700+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='udev'/><title type='text'>udevd main</title><content type='html'>udevdのmain関数の解析メモ&lt;br /&gt;
&lt;div class="display"&gt;
int&amp;nbsp;main(int&amp;nbsp;argc,&amp;nbsp;char&amp;nbsp;*argv[],&amp;nbsp;char&amp;nbsp;*envp[])&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;retval;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;fd;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;sigaction&amp;nbsp;act;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd_set&amp;nbsp;readfds;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;char&amp;nbsp;*value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;daemonize&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;option;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;const&amp;nbsp;struct&amp;nbsp;option&amp;nbsp;options[]&amp;nbsp;=&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;"daemon",&amp;nbsp;0,&amp;nbsp;NULL,&amp;nbsp;'d'&amp;nbsp;},&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;"debug-trace",&amp;nbsp;0,&amp;nbsp;NULL,&amp;nbsp;'t'&amp;nbsp;},&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;"verbose",&amp;nbsp;0,&amp;nbsp;NULL,&amp;nbsp;'v'&amp;nbsp;},&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;"help",&amp;nbsp;0,&amp;nbsp;NULL,&amp;nbsp;'h'&amp;nbsp;},&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;maxfd;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logging_init("udevd");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udev_config_init();&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;環境変数からconfig&amp;nbsp;file名などを取得。&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;selinux_init();&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;何もしない&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbg("version&amp;nbsp;%s",&amp;nbsp;UDEV_VERSION);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;parse&amp;nbsp;commandline&amp;nbsp;options&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(1)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp&lt;span style="color: #FF0000;"&gt;コマンドオプションの解析(省略)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;rootで実行されているかチェック&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(getuid()&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;"root&amp;nbsp;privileges&amp;nbsp;required\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("root&amp;nbsp;privileges&amp;nbsp;required");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;init&amp;nbsp;sockets&amp;nbsp;to&amp;nbsp;receive&amp;nbsp;events&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;制御用のUNIXドメインソケットを作成&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;a href="http://yochecks.blogspot.com/2007/04/udevd-initudevdsocket.html"&gt;init_udevd_socket()&lt;/a&gt;&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(errno&amp;nbsp;==&amp;nbsp;EADDRINUSE)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;"another&amp;nbsp;udev&amp;nbsp;daemon&amp;nbsp;already&amp;nbsp;running\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("another&amp;nbsp;udev&amp;nbsp;daemon&amp;nbsp;already&amp;nbsp;running");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;"error&amp;nbsp;initializing&amp;nbsp;udevd&amp;nbsp;socket\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;initializing&amp;nbsp;udevd&amp;nbsp;socket");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;2;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;カーネルイベント用のソケット作成&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;a href="http://yochecks.blogspot.com/2007/04/udevd-initueventnetlinksock.html"&gt;init_uevent_netlink_sock()&lt;/a&gt;&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;"error&amp;nbsp;initializing&amp;nbsp;netlink&amp;nbsp;socket\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;initializing&amp;nbsp;netlink&amp;nbsp;socket");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;3;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;setup&amp;nbsp;signal&amp;nbsp;handler&amp;nbsp;pipe&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;シグナルハンドラーからの通知に使用するパイプを作成&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval&amp;nbsp;=&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/pipe.2.html" target="_blank"&gt;pipe&lt;/a&gt;(signal_pipe);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(retval&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;getting&amp;nbsp;pipes:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;作成したpipeに対してfcntlが可能かどうかチェックしNONBLOCKに設定する&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval&amp;nbsp;=&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html" target="_blank"&gt;fcntl&lt;/a&gt;(signal_pipe[READ_END],&amp;nbsp;F_GETFL,&amp;nbsp;0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(retval&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;fcntl&amp;nbsp;on&amp;nbsp;read&amp;nbsp;pipe:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval&amp;nbsp;=&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html" target="_blank"&gt;fcntl&lt;/a&gt;(signal_pipe[READ_END],&amp;nbsp;F_SETFL,&amp;nbsp;retval&amp;nbsp;|&amp;nbsp;O_NONBLOCK);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(retval&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;fcntl&amp;nbsp;on&amp;nbsp;read&amp;nbsp;pipe:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval&amp;nbsp;=&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html" target="_blank"&gt;fcntl&lt;/a&gt;(signal_pipe[WRITE_END],&amp;nbsp;F_GETFL,&amp;nbsp;0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(retval&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;fcntl&amp;nbsp;on&amp;nbsp;write&amp;nbsp;pipe:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval&amp;nbsp;=&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html" target="_blank"&gt;fcntl&lt;/a&gt;(signal_pipe[WRITE_END],&amp;nbsp;F_SETFL,&amp;nbsp;retval&amp;nbsp;|&amp;nbsp;O_NONBLOCK);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(retval&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;fcntl&amp;nbsp;on&amp;nbsp;write&amp;nbsp;pipe:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;ルールファイルをパースしてメモリに展開する。&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;parse&amp;nbsp;the&amp;nbsp;rules&amp;nbsp;and&amp;nbsp;keep&amp;nbsp;them&amp;nbsp;in&amp;nbsp;memory&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sysfs_init();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udev_rules_init(&amp;rules,&amp;nbsp;1);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;export_initial_seqnum();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;デーモン化するために子プロセスを作成し親は終了する&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(daemonize)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pid_t&amp;nbsp;pid;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pid&amp;nbsp;=&amp;nbsp;fork();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(pid)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbg("daemonized&amp;nbsp;fork&amp;nbsp;running");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;-1:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("fork&amp;nbsp;of&amp;nbsp;daemon&amp;nbsp;failed:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;4;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbg("child&amp;nbsp;[%u]&amp;nbsp;running,&amp;nbsp;parent&amp;nbsp;exits",&amp;nbsp;pid);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto&amp;nbsp;exit;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;/dev/nullを標準入力と標準出力に設定&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;redirect&amp;nbsp;std&amp;nbsp;fd's&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd&amp;nbsp;=&amp;nbsp;open("/dev/null",&amp;nbsp;O_RDWR);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fd&amp;nbsp;&gt;=&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dup2(fd,&amp;nbsp;STDIN_FILENO);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!verbose)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dup2(fd,&amp;nbsp;STDOUT_FILENO);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dup2(fd,&amp;nbsp;STDERR_FILENO);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fd&amp;nbsp;&amp;gt;&amp;nbsp;STDERR_FILENO)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(fd);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;opening&amp;nbsp;/dev/null:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;set&amp;nbsp;scheduling&amp;nbsp;priority&amp;nbsp;for&amp;nbsp;the&amp;nbsp;daemon&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setpriority(PRIO_PROCESS,&amp;nbsp;0,&amp;nbsp;UDEVD_PRIORITY);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chdir("/");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;umask(022);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;become&amp;nbsp;session&amp;nbsp;leader&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;セッションリーダーになる&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sid&amp;nbsp;=&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/setsid.2.html" target="_blank"&gt;setsid()&lt;/a&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbg("our&amp;nbsp;session&amp;nbsp;is&amp;nbsp;%d",&amp;nbsp;sid);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;OOM_DISABLE&amp;nbsp;==&amp;nbsp;-17&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;Out&amp;nbsp;Of&amp;nbsp;Memory&amp;nbsp;Killerを無効にするために/proc/self/oom_adに-17を書く&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OOM Killerについては&lt;a href="http://yochecks.blogspot.com/2007/04/oom-killer.html"&gt;詳細記事&lt;/a&gt;を参照のこと&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd&amp;nbsp;=&amp;nbsp;open("/proc/self/oom_adj",&amp;nbsp;O_RDWR);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fd&amp;nbsp;&amp;lt;&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;disabling&amp;nbsp;OOM:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write(fd,&amp;nbsp;"-17",&amp;nbsp;3);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(fd);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;シグナルハンドラーを設定する&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;set&amp;nbsp;signal&amp;nbsp;handlers&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;act,&amp;nbsp;0x00,&amp;nbsp;sizeof(struct&amp;nbsp;sigaction));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;act.sa_handler&amp;nbsp;=&amp;nbsp;(void&amp;nbsp;(*)(int))&amp;nbsp;sig_handler;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sigemptyset(&amp;act.sa_mask);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;act.sa_flags&amp;nbsp;=&amp;nbsp;SA_RESTART;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/sigaction.2.html" target="_blank"&gt;sigaction&lt;/a&gt;(SIGINT,&amp;nbsp;&amp;act,&amp;nbsp;NULL);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/sigaction.2.html" target="_blank"&gt;sigaction&lt;/a&gt;(SIGTERM,&amp;nbsp;&amp;act,&amp;nbsp;NULL);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/sigaction.2.html" target="_blank"&gt;sigaction&lt;/a&gt;(SIGCHLD,&amp;nbsp;&amp;act,&amp;nbsp;NULL);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/sigaction.2.html" target="_blank"&gt;sigaction&lt;/a&gt;(SIGHUP,&amp;nbsp;&amp;act,&amp;nbsp;NULL);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;watch&amp;nbsp;rules&amp;nbsp;directory&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;ルールディレクトリィの監視を行う。glibc経由ではなくsyscallで直接呼ぶ。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;syscall(__NR_inotify_init),syscall(__NR_inotify_add_watch,・・・など&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inotify_fd&amp;nbsp;=&amp;nbsp;inotify_init();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(inotify_fd&amp;nbsp;&gt;=&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inotify_add_watch(inotify_fd,&amp;nbsp;udev_rules_dir,&amp;nbsp;IN_CREATE&amp;nbsp;|&amp;nbsp;IN_DELETE&amp;nbsp;|&amp;nbsp;IN_MOVE&amp;nbsp;|&amp;nbsp;IN_CLOSE_WRITE);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(errno&amp;nbsp;==&amp;nbsp;ENOSYS)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("the&amp;nbsp;kernel&amp;nbsp;does&amp;nbsp;not&amp;nbsp;support&amp;nbsp;inotify,&amp;nbsp;udevd&amp;nbsp;can't&amp;nbsp;monitor&amp;nbsp;configuration&amp;nbsp;file&amp;nbsp;changes");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("inotify_init&amp;nbsp;failed:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;maximum&amp;nbsp;limit&amp;nbsp;of&amp;nbsp;forked&amp;nbsp;childs&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;子プロセス数の設定値を取得(省略)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;export&amp;nbsp;log_priority&amp;nbsp;,&amp;nbsp;as&amp;nbsp;called&amp;nbsp;programs&amp;nbsp;may&amp;nbsp;want&amp;nbsp;to&amp;nbsp;follow&amp;nbsp;that&amp;nbsp;setting&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(udev_log,&amp;nbsp;"UDEV_LOG=%i",&amp;nbsp;udev_log_priority);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;putenv(udev_log);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(debug_trace)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;putenv("DEBUG=1");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;select用ファイルディスクリプタの最大値を取得&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxfd&amp;nbsp;=&amp;nbsp;udevd_sock;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxfd&amp;nbsp;=&amp;nbsp;UDEV_MAX(maxfd,&amp;nbsp;uevent_netlink_sock);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxfd&amp;nbsp;=&amp;nbsp;UDEV_MAX(maxfd,&amp;nbsp;signal_pipe[READ_END]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxfd&amp;nbsp;=&amp;nbsp;UDEV_MAX(maxfd,&amp;nbsp;inotify_fd);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;selectでイベント受信待ち&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(!udev_exit)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;udevd_uevent_msg&amp;nbsp;*msg;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;fdcount;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_ZERO(&amp;readfds);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_SET(signal_pipe[READ_END],&amp;nbsp;&amp;readfds);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_SET(udevd_sock,&amp;nbsp;&amp;readfds);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_SET(uevent_netlink_sock,&amp;nbsp;&amp;readfds);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(inotify_fd&amp;nbsp;&gt;=&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_SET(inotify_fd,&amp;nbsp;&amp;readfds);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fdcount&amp;nbsp;=&amp;nbsp;select(maxfd+1,&amp;nbsp;&amp;readfds,&amp;nbsp;NULL,&amp;nbsp;NULL,&amp;nbsp;NULL);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fdcount&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(errno&amp;nbsp;!=&amp;nbsp;EINTR)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err("error&amp;nbsp;in&amp;nbsp;select:&amp;nbsp;%s",&amp;nbsp;strerror(errno));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;イベントごとの処理を行う。(省略)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;後始末を行う&lt;/span&gt;&lt;br /&gt;
exit:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;udev_rules_cleanup(&amp;rules);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sysfs_cleanup();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(signal_pipe[READ_END]&amp;nbsp;&gt;=&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(signal_pipe[READ_END]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(signal_pipe[WRITE_END]&amp;nbsp;&gt;=&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(signal_pipe[WRITE_END]);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(udevd_sock&amp;nbsp;&gt;=&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(udevd_sock);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(inotify_fd&amp;nbsp;&gt;=&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(inotify_fd);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uevent_netlink_sock&amp;nbsp;&gt;=&amp;nbsp;0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(uevent_netlink_sock);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logging_close();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;

&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man2/pipe.2.html' target='_blank'&gt;JM Manpage of PIPE&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html' target='_blank'&gt;JM Manpage of FCNTL&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man2/setsid.2.html' target='_blank'&gt;JM Manpage of SETSID&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.linux.or.jp/JM/html/LDP_man-pages/man2/sigaction.2.html' target='_blank'&gt;JM Manpage of SIGACTION&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-7198785224798366180?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/7198785224798366180/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=7198785224798366180' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/7198785224798366180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/7198785224798366180'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/udevd-main.html' title='udevd main'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-1856386435369647142</id><published>2007-04-23T18:40:00.000+09:00</published><updated>2007-04-24T01:44:28.860+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='udev'/><title type='text'>Debian ネットワーク起動</title><content type='html'>&lt;p&gt;
　Debian(etch)のネットワーク起動について調査した。Debianの起動スクリプトは/etc/init.d/にあり、ネットワーク関係は/etc/init.d/networkになる。
&lt;/p&gt;
&lt;div class="display"&gt;
start)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process_options&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log_action_begin_msg "Configuring network interfaces"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #FF0000;"&gt;if ifup -v -a; then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log_action_end_msg $?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log_action_end_msg $?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&lt;/div&gt;
&lt;p&gt;
　'ifup -v -a'を実行し、ネットワークインターフェースを起動している。ifupはDebian独自のユーティリティのようで、manページによると'-a'オプションは、/etc/network/interfacesの中でautoに指定されいているものを起動する。/etc/network/interfacesは以下のようになっていた。&lt;br /&gt;
&lt;/p&gt;
&lt;div class="display"&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
&lt;span style="color: #FF0000;"&gt;auto lo&lt;/span&gt;&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# This is a list of hotpluggable network interfaces.&lt;br /&gt;
# They will be activated automatically by the hotplug subsystem.&lt;br /&gt;
mapping eth0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script grep&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; map eth0&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
allow-hotplug eth0&lt;br /&gt;
iface eth0 inet dhcp&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;
　autoになっているのはループバックデバイスloのみ。試しに、/etc/init.d/networking stopを実行すると、eth0, loともに停止する。しかし、/etc/init.d/networking startを実行しても、loしか起動しない。いろいろ試したところ、/etc/init.d/udev startを実行すると、eth0が起動した。これは、udevdを起動するスクリプトである。
&lt;/p&gt;
&lt;p&gt;
　udevdが何かを調べてみたらSUSE Linuxのマニュアルにいろいろ書いてあった。&lt;a href="http://www.novell.com/ja-jp/documentation/sles10/pdfdoc/sles_admin/sles_admin.pdf" target="_blank"&gt;SUSE Linux Enterprise Server Manual (PDF)&lt;/a&gt;の25章udevを使用した動的カーネルデバイス管理によると、udevdは動的にデバイスを管理するためのものであり、それまでのhotplugを置き換えるもののようだ。
udevdは、/etc/udev/rules.d/*.rulesディレクトリィに記述されルールに従って処理を行う。この場所にz55_hotplug.rulesがありここにnetwork関連の記述があった。
&lt;/p&gt;
&lt;div class="display"&gt;
SUBSYSTEM=="net",&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RUN+="net.agent"
&lt;/div&gt;
&lt;p&gt;
　net.agentを実行するようになっており、/lib/udev/net.agentがそれに相当するようだ。これはシェルスクリプトであり、net_ifup()関数でifupを実行している。&lt;br /&gt;
&lt;/p&gt;
&lt;div class="display"&gt;
net_ifup()&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; check_program /sbin/ifup&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if grep -q '^auto[[:space:]].*\&lt;'"$INTERFACE"'\&gt;'&amp;nbsp;\&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/network/interfaces; then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# this $INTERFACE is marked as "auto"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IFUPARG='\('$INTERFACE'\|-a\|--all\)'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IFUPARG=$INTERFACE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ps -C ifup ho args | grep -q "$IFUPARG"; then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; debug_mesg "Already ifup-ing interface $INTERFACE"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; wait_for_interface lo&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #FF0000"&gt;exec ifup --allow=hotplug $INTERFACE&lt;/span&gt;&lt;br /&gt;
}
&lt;/div&gt;
&lt;p&gt;
　ついでに上記ででてくるwait_for_interfaceは、sysファイルシステムを使ってネットワークインターフェースの状態を判定している。
&lt;/p&gt;
&lt;div class="display"&gt;
wait_for_interface()&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;local&amp;nbsp;interface=$1&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;:;&amp;nbsp;do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;local&amp;nbsp;state="$(cat&amp;nbsp;/sys/class/net/$interface/operstate&amp;nbsp;2&gt;/dev/null&amp;nbsp;||&amp;nbsp;true)"&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;"$state"&amp;nbsp;!=&amp;nbsp;down&amp;nbsp;];&amp;nbsp;then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep&amp;nbsp;1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;done&lt;br /&gt;
}
&lt;/div&gt;
&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www.novell.com/ja-jp/documentation/sles10/pdfdoc/sles_admin/sles_admin.pdf' target='_blank'&gt;SUSE Linux Enterprise Serverマニュアル(PDF)&lt;/a&gt;&lt;br /&gt;
ifupのmanページ&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-1856386435369647142?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/1856386435369647142/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=1856386435369647142' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/1856386435369647142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/1856386435369647142'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/debian.html' title='Debian ネットワーク起動'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-5618131448539063229</id><published>2007-04-21T07:51:00.000+09:00</published><updated>2007-04-21T08:02:53.256+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>bashの%パラメータ展開方法</title><content type='html'>bashの%と%%のパラメータ展開方法を調べる。&lt;br /&gt;
manには以下のようにある。&lt;br /&gt;
&lt;div class="display"&gt;
${parameter%word}&lt;br /&gt;
${parameter%%word}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; word が展開され、パス名展開の場合と同じようなパターンを作ります。このパタ&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ーンが parameter を展開した値の末尾の部分とマッチする場合、展&amp;nbsp;開&amp;nbsp;結&amp;nbsp;果&amp;nbsp;は&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameter &amp;nbsp;を展開した値から最短一致パターン&amp;nbsp;(‘‘%’’&amp;nbsp;の場合)&amp;nbsp;または最長一&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;パターン&amp;nbsp;(‘‘%%’’&amp;nbsp;の場合)&amp;nbsp;を取り除いたものになります。 parameter が&amp;nbsp;@&amp;nbsp;ま&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;は&amp;nbsp;*&amp;nbsp;である場合、パターンを削除する操作は全ての位置パラメータに順番に適用&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;され、展開結果はリストとして得られます。 parameter が&amp;nbsp;@&amp;nbsp;または&amp;nbsp;*&amp;nbsp;が添字に&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;な&amp;nbsp;っている配列変数である場合、パターンを削除する操作は配列の全ての要素に&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;順番に適用され、展開結果はリストとして得られます。
&lt;/div&gt;
この記述だと、何をいっているのかよくわからないので簡単なシェルスクリプトを書いて試してみた。&lt;br /&gt;

&lt;div class="display"&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
dest="$1"&lt;br /&gt;
echo $dest&lt;br /&gt;
dest="${dest%/}"   #末尾/を削除&lt;br /&gt;
echo $dest&lt;br /&gt;
dest="${dest%/*}"  #末尾の/*を削除（最小一致）&lt;br /&gt;
echo $dest&lt;br /&gt;
dest="${dest%%/*}"  #末尾の/*を削除（最大一致）&lt;br /&gt;
echo $dest&lt;br /&gt;
&lt;/div&gt;

これを実行すると以下のようになる。&lt;br /&gt;

&lt;div class="display"&gt;
$ ./test.sh /aaa/bbb/ccc/&lt;br /&gt;
/aaa/bbb/ccc/&lt;br /&gt;
/aaa/bbb/ccc&lt;br /&gt;
/aaa/bbb&lt;br /&gt;
&lt;br /&gt;
$ ./test.sh aaa/bbb/ccc/&lt;br /&gt;
aaa/bbb/ccc/&lt;br /&gt;
aaa/bbb/ccc&lt;br /&gt;
aaa/bbb&lt;br /&gt;
aaa&lt;br /&gt;
&lt;/div&gt;

 @や*は試していないが、なんとなく使い方はわかった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-5618131448539063229?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/5618131448539063229/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=5618131448539063229' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/5618131448539063229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/5618131448539063229'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/bash_21.html' title='bashの%パラメータ展開方法'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-1296366353571046613</id><published>2007-04-20T09:05:00.000+09:00</published><updated>2007-04-20T09:43:47.195+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>bashコマンドオプション</title><content type='html'>シェルスクリプトを見ていたら、bash -eという記述があった。manで調べてもオプションには見つからない。試しにhelpオプションを実行してみたら、その中にも存在しないが、別のhelpがあるようだ。&lt;br /&gt;
&lt;div class="display"&gt;
$ bash --help&lt;br /&gt;
GNU bash, version 3.1.17(1)-release-(i486-pc-linux-gnu)&lt;br /&gt;
(省略)&lt;br /&gt;
&lt;span style="color: #FF0000;"&gt;Type `bash -c "help set"' for more information about shell options.&lt;/span&gt;&lt;br /&gt;
Type `bash -c help' for more information about shell builtin commands.&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
で、bash -c "helpset"を実行してみた。&lt;br /&gt;
&lt;div class="display"&gt;
set: set [--abefhkmnptuvxBCHP]&amp;nbsp;[-o option]&amp;nbsp;[arg ...]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-a  Mark variables which are modified or created for export.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-b  Notify of job termination immediately.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF0000;"&gt;-e  Exit immediately if a command exits with a non-zero status.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-f  Disable file name generation (globbing).&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-h  Remember the location of commands as they are looked up.
(省略)
&lt;/div&gt;
これによると、-eはコマンドが失敗した場合はすぐ終了するというオプションであった。&lt;br /&gt;
先頭の行をみると、bashのsetという組み込みコマンドのオプションの説明であるようだ。もう一回manをみてみると、確かにオプションのところに書いてあった。&lt;br /&gt;

&lt;div class="display"&gt;
bash は以下のオプションを起動時に解釈します (組み込みコマンド set の説明で述べられている 1 文字のシェルオプションも使えます): 
&lt;/div&gt;
&lt;br /&gt;
ということで、bashの起動オプションを調べるには、setの項も見る必要がある。ちなみにsetはbashのめちゃめちゃ長いmanの中でもかなり下の方にある。なので、JM Projectを活用してブラウザで見るか、先の「bash -c "help set"」を使用したほうが見やすい。
&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html' target='_blank'&gt;Manpage of BASH&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-1296366353571046613?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/1296366353571046613/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=1296366353571046613' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/1296366353571046613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/1296366353571046613'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/bash.html' title='bashコマンドオプション'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-1711148212050554681</id><published>2007-04-17T08:43:00.000+09:00</published><updated>2007-04-17T20:02:13.540+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mt-daapd'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>mt-daapdが起動できない</title><content type='html'>&lt;p&gt;
　Debian(etch)をdist-upgradeしたら、mt-daapdを起動できなくなった。
&lt;/p&gt;
&lt;p&gt;
　まず、&lt;a href="APT HOWTO 第 6 章 - ソースパッケージでの作業" target="_blank"&gt;APT HOWTO 第 6 章 - ソースパッケージでの作業&lt;/a&gt;を参考にパッケージを再コンパイルしてみる。&lt;br /&gt;
fakerootツールをインストールする。&lt;br /&gt;
&lt;div class='display'&gt;
# apt-get install fakeroot
&lt;/div&gt;
mt-daapdのソースとコンパイルに必要なパッケージをインストールする。&lt;br /&gt;
&lt;div class='display'&gt;
# apt-get source mt-daapd&lt;br /&gt;
# apt-get build-dep mt-daapd&lt;br /&gt;
&lt;/div&gt;
mt-daapd_0.2.4+r1376.orig.tar.gz, mt-daapd_0.2.4+r1376-1.dsc, mt-daapd_0.2.4+r1376-1.diff.gzの3つがダウンロードされ展開されてコンパイル用のディレクトリィができる。そのディレクトリィに移動して以下のコマンドでパッケージを作成する。
&lt;div class='display'&gt;
# dpkg-buildpackage -rfakeroot -uc -b
&lt;/div&gt;
パッケージは最初にソースをダウンロードしたディレクトリィ(1つ上)にできる。&lt;br /&gt;
aptでできたパッケージをインストールしてみたが、結果は変わらない。&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
　ログに何か出力されていないかどうか/var/log下のファイルを調べてみた。messages.logに関係ありそうなログがあった。&lt;br /&gt;
&lt;div class='display'&gt;
Mar 18 20:26:13 gold mt-daapd[4524]: *** WARNING *** The programme 'mt-daapd' uses the HOWL compatiblity layer of Avahi.&lt;br /&gt;
Mar 18 20:26:13 gold mt-daapd[4524]: *** WARNING *** Please fix your application to use the native API of Avahi!&lt;br /&gt;
Mar 18 20:26:13 gold mt-daapd[4524]: *** WARNING *** For more information see &amp;lt;http://0pointer.de/avahi-compat?s=howl&amp;e=mt-daapd&amp;gt;&lt;br /&gt;
&lt;/div&gt;
上記のURLを見てみると、AvahiはDNS Service Discoveryと Multicast DNSのライブラリ。他にもhowlという同じ機能を提供する別のライブラリもあり、Avahiは完全ではないがその互換APIを提供している。mt-daapdはAvahiのhowl互換APIを使っているのでAvahiネイティブのAPIを使うように警告を出しているということのようだ。これで起動できなくなる問題というわけではなさそう。
&lt;/p&gt;
&lt;p&gt;
　さらにログを調べてみると、daemon.logにmt-daapdが出力しているエラーを見つけた。&lt;br /&gt;
&lt;div class='display'&gt;
Error opening db: No backend database support for type: sqlite
&lt;/div&gt;
上記メッセージでmt-daapdのソース内をgrepをかけたところ、main.c内でエラーメッセージを出力しているところを見つけた。&lt;br /&gt;
&lt;div class='display'&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/* this will require that the db be readable by the runas user */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; db_type = conf_alloc_string("general","db_type","sqlite");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; db_parms = conf_alloc_string("general","db_parms","/var/cache/mt-daapd");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; err=db_open(&amp;perr,db_type,db_parms);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(err)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DPRINTF(E_LOG,L_MAIN|L_DB,"Error opening db:&amp;nbsp;%s\n",perr);&lt;br /&gt;
#ifndef WITHOUT_MDNS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(config.use_mdns)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rend_stop();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os_deinit();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(EXIT_FAILURE);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;/div&gt;

エラーメッセージは、db_open関数が失敗したときに出力されている。db_open関数はdb-generic.cにあった。&lt;br /&gt;

&lt;div class='display'&gt;
/**&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;* Open the database.&amp;nbsp; This is done before we drop privs, that
&amp;nbsp;* way if the database only has root perms, then it can still
&amp;nbsp;* be opened.&lt;br /&gt;
&amp;nbsp;*&lt;br /&gt;
&amp;nbsp;*&amp;nbsp;\param parameters This is backend-specific (mysql, sqlite, etc)&lt;br /&gt;
&amp;nbsp;*/&lt;br /&gt;
int db_open(char **pe, char *type, char *parameters)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int result;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DPRINTF(E_DBG,L_DB,"Opening database\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pthread_once(&amp;db_initlock,db_init_once))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; db_current =&amp;nbsp;&amp;db_functions[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(type)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while((db_current-&gt;name)&amp;nbsp;&amp;&amp;&amp;nbsp;(strcasecmp(db_current-&gt;name,type)))&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_current++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!db_current-&gt;name)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* end of list -- no match */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_get_error(pe,DB_E_BADPROVIDER,type);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return DB_E_BADPROVIDER;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; result=db_current-&gt;dbs_open(pe, parameters);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DPRINTF(E_DBG,L_DB,"Results:&amp;nbsp;%d\n",result);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br /&gt;
}
&lt;/div&gt;

db_functions配列から第2引数のtypeと名前が一致するものを検索し、db_functionsのdbs_open関数を呼んでいる。db_functionsの型はDB_FUNCTIONSで、構造体は以下のようになっている。&lt;br /&gt;

&lt;div class='display'&gt;
/** pointers to database-specific functions */&lt;br /&gt;
typedef struct tag_db_functions {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char *name;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_open)(char **, char *);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_init)(int*);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_deinit)(void);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_add)(char **, MP3FILE*, int*);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_add_playlist)(char **, char *, int, char *,char *, int, int *);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_add_playlist_item)(char **, int, int);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_delete_playlist)(char **, int);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_delete_playlist_item)(char **, int, int);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_edit_playlist)(char **, int, char*, char*);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_playcount_increment)(char **, int);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_enum_start)(char **, DBQUERYINFO *);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_enum_size)(char **, DBQUERYINFO *, int *, int *);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_enum_fetch)(char **, DBQUERYINFO *, int *, unsigned char **);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_enum_fetch_row)(char **, PACKED_MP3FILE *, DBQUERYINFO *);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_enum_reset)(char **, DBQUERYINFO *);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_enum_end)(char **);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_force_rescan)(char **);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_start_scan)(void);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_end_song_scan)(void);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_end_scan)(void);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int(*dbs_get_count)(char **, int *, CountType_t);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; MP3FILE*(*dbs_fetch_item)(char **, int);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; MP3FILE*(*dbs_fetch_path)(char **, char *,int);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; M3UFILE*(*dbs_fetch_playlist)(char **, char *, int);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void(*dbs_dispose_item)(MP3FILE*);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void(*dbs_dispose_playlist)(M3UFILE*);&lt;br /&gt;
}DB_FUNCTIONS;
&lt;/div&gt;
データベースごとのルーチンを格納している関数テーブルのようだ。&lt;br /&gt;
main.cに戻り、db_typeがどのように指定されているか確認してみる。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt; db_type = conf_alloc_string("general","db_type","sqlite");&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
でdb_typeが代入されている。&lt;br /&gt;
conf_alloc_stringはconf.cにあった。&lt;br /&gt;

&lt;div class='display'&gt;
/**&lt;br /&gt;
&amp;nbsp;* return the value from the CURRENT config tree as an allocated string
&amp;nbsp;*&lt;br /&gt;
&amp;nbsp;*&amp;nbsp;@param section section name to search in
&amp;nbsp;*&amp;nbsp;@param key key to search for
&amp;nbsp;*&amp;nbsp;@param dflt default value to return if key not found
&amp;nbsp;*&amp;nbsp;@returns a pointer to an allocated string containing the required
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; configuration key
&amp;nbsp;*/&lt;br /&gt;
char *conf_alloc_string(char *section, char *key, char *dflt)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LL_ITEM *pitem;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char *result;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char *retval;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; _conf_lock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pitem = _conf_fetch_item(conf_main,section,key);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if((!pitem)&amp;nbsp;||&amp;nbsp;(pitem-&gt;type != LL_TYPE_STRING))&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = dflt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = pitem-&gt;value.as_string;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(result == NULL)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _conf_unlock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return NULL;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; retval = strdup(result);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!retval)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DPRINTF(E_FATAL,L_CONF,"Malloc error in conf_alloc_string\n");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; _conf_unlock();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return retval;&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;

コンフィグファイルからkeyの値を持ってくるが、keyが存在しない場合はdfltを値としている。コンフィグファイルである/etc/mt-daapd.confにはdb_typeというkeyは存在しないので、dlftであるsqliteがdb_typeとなる。(daemon.logに書いてあるとおり)&lt;br /&gt;
db_functionsの中身は以下のようになっている。&lt;br /&gt;

&lt;div class='display'&gt;
DB_FUNCTIONS db_functions[]&amp;nbsp;=&amp;nbsp;{&lt;br /&gt;
#ifdef HAVE_LIBSQLITE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"sqlite",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_sql_open_sqlite2,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_sql_init,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(省略)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;
#endif
#ifdef HAVE_LIBSQLITE3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"sqlite3",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_sql_open_sqlite3,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_sql_init,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(省略)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;

sqliteの場合はDBのオープンにdb_sql_open_sqlitesqlite2という関数を使うようになっている。関数名から推測するに、おそらくsqlite2に含まれる関数だと思われる。&lt;br /&gt;
で、現在システムにインストールされているsqliteを調べてみた。&lt;br /&gt;

&lt;div class='display'&gt;
# dpkg -l "*sqlite*"&lt;br /&gt;
&lt;br /&gt;
+++-================-================-================================================&lt;br /&gt;
un  gda2-sqlite &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;なし&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(説明&amp;nbsp;(description)&amp;nbsp;がありません)&lt;br /&gt;
ii  libsqlite0 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.8.17-2 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQLite shared library&lt;br /&gt;
ii  libsqlite3-0 &amp;nbsp;&amp;nbsp;&amp;nbsp; 3.3.8-1.1 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQLite 3 shared library&lt;br /&gt;
ii  libsqlite3-dev &amp;nbsp; 3.3.8-1.1 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQLite 3 development files&lt;br /&gt;
un  sqlite3-doc &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;なし&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(説明&amp;nbsp;(description)&amp;nbsp;がありません)&lt;br /&gt;
&lt;/div&gt;

バイナリはlibsqlite0とlibsqlite3がインストールされているが、sqlite2はインストールされていない。db_functionsからdb_typeをsqlite3にすればsqlite3のライブラリを使うようになることがわかる。また、今までの解析からdb_typeをsqlite3にするためには、mt-daapd.confに以下の行を追加すればよいこともわかる。

&lt;div class='display'&gt;
(/etc/mt-daapd.confの適当な場所に追加)&lt;br /&gt;
&lt;br /&gt;
db_type  sqlite3&lt;br /&gt;
&lt;/div&gt;
これでmt-daapdを起動してみたところ、正常に動作した。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-1711148212050554681?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/1711148212050554681/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=1711148212050554681' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/1711148212050554681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/1711148212050554681'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/mt-daapd.html' title='mt-daapdが起動できない'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-5071676272587308407</id><published>2007-04-15T23:22:00.000+09:00</published><updated>2007-04-15T23:51:57.308+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='開発ツール'/><category scheme='http://www.blogger.com/atom/ns#' term='make'/><title type='text'>make if関数</title><content type='html'>&lt;p&gt;
　makeのマニュアルとしては&lt;a href="http://www.ecoop.net/coop/translated/GNUMake3.77/make_toc.jp.html" target='_blank'&gt;GNU make 日本語訳(Coop編)&lt;/a&gt;をいつも使っているのだが、Linux2.6のカーネルのmakeファイルを覗いていたらそこに書いていない構文があった。&lt;br /&gt;
&lt;/p&gt;
&lt;div class='display'&gt;
KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) &amp;&amp; /bin/pwd)
$(if $(KBUILD_OUTPUT),, \
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(error output directory "$(saved-output)" does not exist))
&lt;/div&gt;
&lt;p&gt;
　2行目の$(if ～, ～,)が書いていなかった。上記の日本語訳は1998年5月のGNU Make Version 3.77のものでかなり古いので、&lt;a href="http://www.gnu.org/software/make/manual/html_node/Conditional-Functions.html#Conditional-Functions" target='_blank'&gt;英語の方のマニュアル&lt;/a&gt;を見てみた。構文は下記のようになって特に難しいことはない。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;$(if condition,then-part[,else-part])&lt;/strong&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
　makeにはもうひとつifeq構文もあって（ifeqは3.77のマニュアルにも書いてある)、そっちはmakefile conditionalsを、一方ifは functional contextを判定するものという違いがあるということらしい。この記述だけだとよくわからないが、実行してみないとわからないもの(先のカーネルでは、shellでの実行結果)は、ifの方を使わなければならないということなのだろう。とりあえず、違いがあるということは覚えておこうと思う。
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www.gnu.org/software/make/manual/html_node/index.html' target='_blank'&gt;GNU `make' Manual（英語）&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://www.ecoop.net/coop/translated/GNUMake3.77/make_toc.jp.html' target='_blank'&gt;GNU make 日本語訳(Coop編)&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-5071676272587308407?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/5071676272587308407/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=5071676272587308407' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/5071676272587308407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/5071676272587308407'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/make-if.html' title='make if関数'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-8715385012880185317</id><published>2007-04-12T23:52:00.000+09:00</published><updated>2007-04-13T12:50:05.517+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thinkpad T60'/><category scheme='http://www.blogger.com/atom/ns#' term='Jetico'/><title type='text'>Thinkpad Jetico Firewall設定</title><content type='html'>&lt;p&gt;
FirewallソフトしてフリーのJetico Personal Firewall 1.0を使っている。このソフトはファイアウォールだけでなくシステムフックやネットワークの使用まで制御することができる。&lt;br /&gt;
(Jeticoの柔軟な設定が可能だがその分複雑である。概念や操作の詳細は下記の参考資料を参照のこと)&lt;br /&gt;
そのJeticoをThinkpad T60へインストールするとサスペンド状態から復帰できなくなってしまう問題が発生した。&lt;br /&gt;
具体的には指紋認証を行った後のパスフレーズ入力画面が表示されず、固まってしまう。Jeticoを止めると正常に動作するので、おそらく、復帰時にJeticoがアプリケーションのask userルールに入ってしまい、そこで止まってしまうのだと思われる。&lt;br /&gt;
以下の方法で問題を解決した。&lt;br /&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● 全許可ルールの作成&lt;/h4&gt;
&lt;p&gt;
まず、アプリケーションルールにすべてのイベントを許可するルールを追加し、ログを残すようにする。&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://bp3.blogger.com/_3cpM81id54E/Rh5I54yEdDI/AAAAAAAAAAM/3mGpGLQMTMs/s1600-h/Jetico_setting.JPG" target="_blank"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_3cpM81id54E/Rh5I54yEdDI/AAAAAAAAAAM/3mGpGLQMTMs/s400/Jetico_setting.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5052555991288411186" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● ログの確認&lt;/h4&gt;
&lt;p&gt;
液晶を閉じてサスペンドしすぐに開いて復帰する。そしてすぐにJeticoを起動し、ログを確認して必要なルールを確認する。
自分の場合は、以下のアプリケーションのaccess networkイベントが発生していた。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;C:\WINDOWS\system32\acs.exe&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;C:\Program Files\Lenovo\PkgMgr\HOTKEY\tpfnf2.exe&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
acs.exeはAtheros Configuration ServiceでAtherosの無線LANの認証にかかわるもので、tpfnf2.exeは名前からするとFn + F2キー用のプログラムだと思う。Thinkpad T60は、Fn + F2にはデフォルトでコンピュータのロック機能が割り当てられている。&lt;br /&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● ルールの追加&lt;/h4&gt;
&lt;p&gt;
上記アプリケーションは許可しても問題ないと思われるので、access networkイベントを許可するルールをアプリケーションルール内に作成する。そして、全許可したルールの左側のチェックをはずし(画像の状態)無効化しておく。この状態で一度サスペンド・復帰が問題なく動くことを確認すればOK。&lt;br /&gt;
Jeticoではまったら、全許可ルールを有効化しログを見て必要なアプリケーションを許可すればよい。&lt;br /&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://dobry-den.sakura.ne.jp/JPF/html/index.htm' target='_blank'&gt;Jetico Personal Firewall 非公式ヘルプドキュメント&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-8715385012880185317?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/8715385012880185317/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=8715385012880185317' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/8715385012880185317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/8715385012880185317'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/thinkpad-jetico-firewall.html' title='Thinkpad Jetico Firewall設定'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_3cpM81id54E/Rh5I54yEdDI/AAAAAAAAAAM/3mGpGLQMTMs/s72-c/Jetico_setting.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-6848529234997346686</id><published>2007-04-09T02:40:00.000+09:00</published><updated>2007-04-10T11:44:02.271+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GRUB'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>フロッピードライブなしでのGRUBブートフロッピーの作成</title><content type='html'>&lt;p&gt;
stage1, stage2を生書きするやり方しか見つからなかったのでファイルシステム上に作成する方法をソースを解析しながら試してみた。&lt;br /&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● フロッピーディスクイメージの作成&lt;/h4&gt;
&lt;p&gt;
Debianの場合はまず、DOSツールをインストールする。
&lt;div class='display'&gt;
# apt-get install dosfstools
&lt;/div&gt;
ddコマンドでイメージファイルを作成する。
&lt;div class='display'&gt;
# dd if=/dev/zero of=floppy.img bs=1k count=1440
&lt;/div&gt;
作成したイメージファイルをFATでフォーマットする。
&lt;div class='display'&gt;
# mkdosfs floppy.img
&lt;/div&gt;
floppy.imgをループバックデバイスとして適当なディレクトリィにマウントする。
&lt;div class='display'&gt;
# mount -t vfat floppy.img mnt/fd -o loop
&lt;/div&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● GRUB設定ファイルの作成&lt;/h4&gt;
マウントディレクトリィを通じてイメージファイルへFATとしてアクセスできるようになったので、必要なファイルをコピーする。
&lt;div class='display'&gt;
# cd mnt/fd/boot/grub&lt;br /&gt;
# cp /usr/lib/grub/i386-pc/stage1 .&lt;br /&gt;
# cp /usr/lib/grub/i386-pc/stage2 .&lt;br /&gt;
#cp /boot/grub/device.map .
&lt;/div&gt;
stage1,stage2は/boot/grubにあるものではなく、/usr/lib/grub/i386-pcより持ってくる。&lt;br /&gt;
Debianの場合は、/boot/grubにdevice.mapがあるが、ない場合は以下のようにして作成する。&lt;br /&gt;
&lt;div class='display'&gt;
# grub --device-map=device.map&lt;br /&gt;
&lt;br /&gt;
grub&gt; quit
&lt;/div&gt;
grubを--device-mapオプションを指定して立ち上げ、すぐに終了する。&lt;br /&gt;
これでカレントディレクトリィに、device.mapが作成される。&lt;br /&gt;
続いてgrubが自動作成したdevice.mapを修正する。&lt;br /&gt;
&lt;div class='display'&gt;
&lt;span style='color: #FF0000'&gt;(fd0) /home/floppy.img&lt;/span&gt;&lt;br /&gt;
(hd0) /dev/hda
&lt;/div&gt;
fd0のデバイスファイル名としてフロッピーイメージファイルを記述する&lt;br /&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● GRUBインストール&lt;/h4&gt;
&lt;p&gt;
device.mapを指定してgrubを起動して、fd0へインストールする。
&lt;div class='display'&gt;
# grub --device-map=device.map&lt;br /&gt;
&lt;br /&gt;
grub&gt; root (fd0)&lt;br /&gt;
grub&gt; setup (fd0)&lt;br /&gt;
&lt;/div&gt;
これで、floppy.imgにgrubがインストールできた。&lt;br /&gt;
menu.lstをおけばメニューも出せるはず。
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://www.gnu.org/software/grub/manual/' target='_blank'&gt;GNU GRUB Manual(英語)&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-6848529234997346686?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/6848529234997346686/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=6848529234997346686' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/6848529234997346686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/6848529234997346686'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/grub.html' title='フロッピードライブなしでのGRUBブートフロッピーの作成'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-3984532201393173730</id><published>2007-04-07T08:42:00.000+09:00</published><updated>2007-04-07T09:40:06.159+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='開発ツール'/><title type='text'>M4 括弧つきマクロ</title><content type='html'>&lt;p&gt;
autoconfのm4ライブラリをちょっとのぞいていたら、よくわからないところがあった。&lt;br /&gt;
以下は/usr/share/autoconf/m4sugar/m4sugar.m4よりの抜粋。&lt;br /&gt;
&lt;br /&gt;
&lt;div class='display'&gt;
# m4_include_unique(FILE)&lt;br /&gt;
# -----------------------&lt;br /&gt;
# Declare that the FILE was loading; and warn if it has already&lt;br /&gt;
# been included.&lt;br /&gt;
m4_define([m4_include_unique],&lt;br /&gt;
[m4_ifdef([m4_include($1)],&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[m4_warn([syntax], [file `$1' included several times])])dnl&lt;br /&gt;
m4_define([m4_include($1)])])&lt;br /&gt;
&lt;br /&gt;
# m4_include(FILE)&lt;br /&gt;
# ----------------&lt;br /&gt;
# As the builtin include, but warns against multiple inclusions.&lt;br /&gt;
m4_define([m4_include],&lt;br /&gt;
[m4_include_unique([$1])dnl&lt;br /&gt;
m4_builtin([include], [$1])])&lt;br /&gt;
&lt;/div&gt;

m4_include_uniqueとm4_includeという二つのマクロを定義している。m4_include_uniqueは複数回includeされているかチェックを行い、m4_includeはm4_include_uniqueで複数includeのチェックしてからincludeを行う。&lt;br /&gt;
m4_include_unique内の2行目と4行目に[m4_include($1)]という記述がある。[]はリテラル文字であり、これら2行は要はm4_include($1)という名前のマクロの存在チェックと定義を行っている。&lt;br /&gt;
&lt;a href='http://homepage1.nifty.com/bmonkey/doc/m4-1.4/html/m4-ja_2.html#SEC7' target='_brank' &gt;m4のマニュアル&lt;/a&gt;によるとマクロ名に使えるのは、アルファベット、数字、_(アンダースコア) を自由に並べたもののうち、先頭の文字が数字でないものとなっており、"()"は許されていない。普通"("以下は引数とみなされる。
&lt;/p&gt;
どんな動作なのかその部分だけ抜き出して、テストしてみた。
&lt;div class='display'&gt;
user@local:~/m4test$ less test2.m4&lt;br /&gt;
define(`m4_include_unique', `ifdef(`m4_include($1)', `already defined',&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`not defined&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;define(`m4_include($1)', `include $1')')')&lt;br /&gt;
m4_include_unique(`aaa')&lt;br /&gt;
m4_include(aaa)&lt;br /&gt;
m4_include_unique(`aaa')&lt;br /&gt;
ifdef(`m4_include(aaa)', `already defined', `not defined')
&lt;/div&gt;
このマクロの実行結果は以下のようになる。
&lt;div class='display'&gt;
user@local:~/m4test$ m4 test2.m4&lt;br /&gt;
&lt;br /&gt;
not defined&lt;br /&gt;
&lt;br /&gt;
m4_include(aaa)&lt;br /&gt;
already defined&lt;br /&gt;
already defined&lt;br /&gt;
&lt;/div&gt;
結果からするとdefineやif_defの引数内ではクォートすれば、"()"つきのマクロ名の定義は可能であるようだ。&lt;br /&gt;
しかし、定義した後でもm4_include(aaa)がそのまま出力されていることから、マクロとして展開できていない。通常通りm4_includeがマクロ名、aaaが引数と解釈されている。&lt;br /&gt;
フラグとしてのみ使うので、展開できないマクロ名を使っているのだと思われる。
&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://homepage1.nifty.com/bmonkey/doc/m4-1.4/html/m4-ja.html' target='_blank'&gt;GNU macro processor: GNU macro processor&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-3984532201393173730?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/3984532201393173730/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=3984532201393173730' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/3984532201393173730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/3984532201393173730'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/m4.html' title='M4 括弧つきマクロ'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1579763590730009376.post-5207750988577789826</id><published>2007-04-03T19:57:00.000+09:00</published><updated>2007-04-07T03:02:45.034+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>Debian apt設定</title><content type='html'>&lt;h4 class='subtitle'&gt;● 最寄のミラーサーバーを検索&lt;/h4&gt;
&lt;p&gt;
netselectコマンドで探す。&lt;br /&gt;
インストールされていなければaptでインストールする。&lt;br /&gt;
&lt;div class='display'&gt;
# apt-get install netselect
&lt;/div&gt;
ミラーサーバのリストを渡す。&lt;br /&gt;
&lt;div class='display'&gt;
# netselect -vv \&lt;br /&gt;
ring.so-net.ne.jp \&lt;br /&gt;
ring.ocn.ad.jp \&lt;br /&gt;
ring.tains.tohoku.ac.jp \&lt;br /&gt;
ring.toyama-ix.net \&lt;br /&gt;
ring.u-toyama.ac.jp \&lt;br /&gt;
ring.nihon-u.ac.jp \&lt;br /&gt;
ring.airnet.ne.jp \&lt;br /&gt;
ring.maffin.ad.jp \&lt;br /&gt;
ring.sakura.ad.jp&lt;br /&gt;
&lt;/div&gt;
実行結果は下記のようになる。&lt;br /&gt;
&lt;div class='display'&gt;
Running&amp;nbsp;netselect&amp;nbsp;to&amp;nbsp;choose&amp;nbsp;1&amp;nbsp;out&amp;nbsp;of&amp;nbsp;9&amp;nbsp;addresses.&lt;br /&gt;
................................................................................&lt;br /&gt;
ring.nihon-u.ac.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&amp;nbsp;ms&amp;nbsp;&amp;nbsp;15&amp;nbsp;hops&amp;nbsp;&amp;nbsp;&amp;nbsp;75%&amp;nbsp;ok&amp;nbsp;(&amp;nbsp;6/&amp;nbsp;8)&amp;nbsp;[&amp;nbsp;&amp;nbsp;107]&lt;br /&gt;
ring.so-net.ne.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&amp;nbsp;ms&amp;nbsp;&amp;nbsp;11&amp;nbsp;hops&amp;nbsp;&amp;nbsp;100%&amp;nbsp;ok&amp;nbsp;(10/10)&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;46]&lt;br /&gt;
ring.ocn.ad.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&amp;nbsp;ms&amp;nbsp;&amp;nbsp;12&amp;nbsp;hops&amp;nbsp;&amp;nbsp;&amp;nbsp;90%&amp;nbsp;ok&amp;nbsp;(&amp;nbsp;9/10)&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;52]&lt;br /&gt;
ring.airnet.ne.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&amp;nbsp;ms&amp;nbsp;&amp;nbsp;&amp;nbsp;8&amp;nbsp;hops&amp;nbsp;&amp;nbsp;100%&amp;nbsp;ok&amp;nbsp;(10/10)&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;39]&lt;br /&gt;
ring.maffin.ad.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&amp;nbsp;ms&amp;nbsp;&amp;nbsp;11&amp;nbsp;hops&amp;nbsp;&amp;nbsp;&amp;nbsp;90%&amp;nbsp;ok&amp;nbsp;(&amp;nbsp;9/10)&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;56]&lt;br /&gt;
ring.sakura.ad.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&amp;nbsp;ms&amp;nbsp;&amp;nbsp;11&amp;nbsp;hops&amp;nbsp;&amp;nbsp;100%&amp;nbsp;ok&amp;nbsp;(10/10)&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;67]&lt;br /&gt;
ring.u-toyama.ac.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&amp;nbsp;ms&amp;nbsp;&amp;nbsp;12&amp;nbsp;hops&amp;nbsp;&amp;nbsp;&amp;nbsp;85%&amp;nbsp;ok&amp;nbsp;(&amp;nbsp;6/&amp;nbsp;7)&amp;nbsp;[&amp;nbsp;&amp;nbsp;114]&lt;br /&gt;
ring.tains.tohoku.ac.jp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&amp;nbsp;ms&amp;nbsp;&amp;nbsp;13&amp;nbsp;hops&amp;nbsp;&amp;nbsp;100%&amp;nbsp;ok&amp;nbsp;(10/10)&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;73]&lt;br /&gt;
ring.toyama-ix.net&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&amp;nbsp;ms&amp;nbsp;&amp;nbsp;12&amp;nbsp;hops&amp;nbsp;&amp;nbsp;100%&amp;nbsp;ok&amp;nbsp;(10/10)&amp;nbsp;[&amp;nbsp;&amp;nbsp;&amp;nbsp;66]&lt;br /&gt;
&lt;/div&gt;
一番最後の行に最寄のミラーサーバが表示される。&lt;br /&gt;
この場合は、ring.airnet.ne.jp。&lt;br /&gt;
&lt;/p&gt;
&lt;h4 class='subtitle'&gt;● aptの設定変更&lt;/h4&gt;
&lt;p&gt;
aptがパッケージを取得するサーバは/etc/apt/sources.listに書かれている。&lt;br /&gt;
上で見つけた最寄のミラーサーバを追加する。&lt;br /&gt;
&lt;div class="display"&gt;
deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20060314)]/etch main&lt;br /&gt;
&lt;span style='color: #FF0000'&gt;deb http://ring.airnet.ne.jp/pub/linux/debian/debian/ etch main contrib non-free&lt;/span&gt;&lt;br /&gt;
deb http://ftp2.jp.debian.org/debian/ etch main contrib non-free&lt;br /&gt;
&lt;span style='color: #FF0000'&gt;deb-src http://ring.airnet.ne.jp/pub/linux/debian/debian/ etch main contrib non-free&lt;/span&gt;&lt;br /&gt;
deb-src http://ftp2.jp.debian.org/debian/ etch main contrib non-free&lt;br /&gt;
&lt;br /&gt;
deb http://security.debian.org/ etch/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ etch/updates main contrib non-free&lt;br /&gt;
&lt;/div&gt;
sources.listの書式は、以下のようになっている。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;type uri distribution [component1] [component2] [...]&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table class='border'&gt;
&lt;tr&gt;
&lt;td class='border'&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;/td&gt;&lt;td class='border'&gt;パッケージの種別。debはバイナリ、dec-srcはソースパッケージ。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class='border'&gt;&lt;strong&gt;uri&lt;/strong&gt;&lt;/td&gt;&lt;td class='border'&gt;取得する場所を指定。HTTP,FTP,CDROMなどが指定できる。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class='border'&gt;&lt;strong&gt;distribution&lt;/strong&gt;&lt;/td&gt;&lt;td class='border'&gt;ディストリビューション名。sarge,etchなどの名前以外にstable,unstable,testingなど状態でも指定できる。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class='border'&gt;&lt;strong&gt;component&lt;/strong&gt;&lt;/td&gt;&lt;td class='border'&gt;main, contrib, no-freeのどれかを指定。全て指定しておけばいい。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;

&lt;h4 class='subtitle'&gt;● パッケージの更新&lt;/h4&gt;
&lt;p&gt;
最新のパッケージリストより更新すべきパッケージを取得する。&lt;br /&gt;
&lt;div class="display"&gt;
# apt-get update
&lt;/div&gt;
パッケージをダウンロードしアップデートを行う。&lt;br /&gt;
&lt;div class="display"&gt;
# apt-get upgrade
&lt;/div&gt;
実行時のメッセージに保留パッケージがある場合は、それらのパッケージは更新されない。&lt;br /&gt;
(下記の例では0なので保留パッケージは存在しない)&lt;br /&gt;
&lt;div class="display"&gt;
アップグレード: 9 個、新規インストール: 0 個、削除: 0 個、&lt;span style='color: #FF0000'&gt;保留: 0 個&lt;/span&gt;
&lt;/div&gt;
保留される理由は、アップグレートすることで他のパッケージが削除される場合、または意図的に保留にするようにマークされている場合がある。&lt;br /&gt;
カーネルとかgcc, glibcとかシステムのコア部分などは保留パッケージとなっている。&lt;br /&gt;
保留パッケージを更新したい場合は、以下のコマンドを実行する。&lt;br /&gt;
&lt;div class="display"&gt;
# apt-get dist-upgrade
&lt;/div&gt;
または、-sオプションをつけることで、シュミレーション動作(実際にはアップグレードを行わないがメッセージは表示させる)にし、アップグレードされるパッケージを確認したうえで個別にインストールを行う。
&lt;div class="display"&gt;
# apt-get -s dist-upgrade&lt;br /&gt;
&lt;br /&gt;
# apt-get install &lt;パッケージ名&gt;
&lt;/div&gt;

&lt;/p&gt;
&lt;h4 class='subtitle'&gt;■ 参考資料&lt;/h4&gt;
&lt;p&gt;
&lt;a href='http://debian.fam.cx/index.php?install#content_1_43' target='_blank'&gt;install - Debian GNU/Linux スレッドテンプレ&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://park15.wakwak.com/~unixlife/linux/de-pkg-5.html' target='_blank'&gt;Debian、APTによるパッケージのアップデート&lt;/a&gt;&lt;br /&gt;
&lt;a href='http://lists.debian.or.jp/debian-users/200508/msg00060.html' target='_blank'&gt;[debian-users:44343] Re:パッケージの保留に関して&lt;/a&gt;&lt;br /&gt;
apt-getのmanページ&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1579763590730009376-5207750988577789826?l=yochecks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yochecks.blogspot.com/feeds/5207750988577789826/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1579763590730009376&amp;postID=5207750988577789826' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/5207750988577789826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1579763590730009376/posts/default/5207750988577789826'/><link rel='alternate' type='text/html' href='http://yochecks.blogspot.com/2007/04/debian-apt.html' title='Debian apt設定'/><author><name>MZ10N</name><uri>http://www.blogger.com/profile/09416801575364077760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
