<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bluegold &#187; OpenSolaris</title>
	<atom:link href="http://blog.bluegold.me/category/solaris/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bluegold.me</link>
	<description>OpenSolaris と MacBook で自宅ネットワークを構築するメモ</description>
	<lastBuildDate>Thu, 26 Aug 2010 14:38:53 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>nginx を SMF で管理する</title>
		<link>http://blog.bluegold.me/2010/08/management-nginx-with-smf/</link>
		<comments>http://blog.bluegold.me/2010/08/management-nginx-with-smf/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 16:36:59 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[opensolaris]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=500</guid>
		<description><![CDATA[nginx や PHP の fast-cgi のプロセスを OpenSolaris の SMF で管理するための manifest の紹介。]]></description>
			<content:encoded><![CDATA[<p>もう1年以上前に書いていた下書きをようやく公開。</p>
<p><a href="/2008/11/nginx-php-fastcgi/">前回（と言っても1年半前か）</a> までで nginx と PHP の fast-cgi のビルドと設定が終わったので、OS の起動時に自動的に起動するようにサービスとして登録を行います。</p>
<p>OpenSolaris ではサービスの管理に <a href="http://en.wikipedia.org/wiki/Service_Management_Facility">SMF</a> という仕組みを使用しています。SMF はサービスの依存関係を記述できたり、サービスの起動を監視して自動的に再起動してくれたりと、Linux などで使われている /etc/init.d の rc スクリプトに比べるとメリットがありますが、コマンドが独自だったり、自分で SMF にサービスを登録するには manifest と呼ばれる XML ファイルを書く必要があるので、慣れるまではハードルがあります。（この辺は Mac OS X の launchd と似ている。）</p>
<p><span id="more-500"></span></p>
<p> 以下が、私が nginx を管理するために作成した nginx.xml です。</p>
<pre class="brush: xml;">
&lt;?xml version='1.0'?&gt;
&lt;!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'&gt;
&lt;service_bundle type='manifest' name='export'&gt;
  &lt;service name='network/nginx' type='service' version='0'&gt;
    &lt;create_default_instance enabled='true'/&gt;
    &lt;single_instance/&gt;
    &lt;dependency name='fs' grouping='require_all' restart_on='none' type='service'&gt;
      &lt;service_fmri value='svc:/system/filesystem/local'/&gt;
    &lt;/dependency&gt;
    &lt;dependency name='net' grouping='require_all' restart_on='none' type='service'&gt;
      &lt;service_fmri value='svc:/network/loopback'/&gt;
    &lt;/dependency&gt;
    &lt;exec_method name='start' type='method' exec='/usr/local/sbin/nginx -c /usr/local/conf/nginx.conf' timeout_seconds='60'&gt;
      &lt;method_context working_directory='/usr/local/logs'&gt;
        &lt;method_credential user='root' group='root'/&gt;
        &lt;method_environment&gt;
          &lt;envvar name='PATH' value='/usr/bin:/bin:/usr/local/bin'/&gt;
        &lt;/method_environment&gt;
      &lt;/method_context&gt;
    &lt;/exec_method&gt;
    &lt;exec_method name='stop' type='method' exec=':kill' timeout_seconds='60'&gt;
      &lt;method_context/&gt;
    &lt;/exec_method&gt;
  &lt;/service&gt;
&lt;/service_bundle&gt;
</pre>
<p>このファイルを以下のように SMF に登録します。</p>
<pre class="bq">
# svccfg -v import nginx.xml
</pre>
<p>同様に PHP の FastCGI のプロセスも SMF に登録します。</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;!DOCTYPE service_bundle SYSTEM &quot;/usr/share/lib/xml/dtd/service_bundle.dtd.1&quot;&gt;
&lt;service_bundle type=&quot;manifest&quot; name=&quot;php-fcgi&quot;&gt;
 &lt;service name=&quot;network/php-fcgi&quot; type=&quot;service&quot; version=&quot;0&quot;&gt;
   &lt;create_default_instance enabled=&quot;true&quot;/&gt;
   &lt;single_instance/&gt;

   &lt;dependency name=&quot;net&quot; grouping=&quot;require_all&quot; restart_on=&quot;none&quot; type=&quot;service&quot;&gt;
     &lt;service_fmri value=&quot;svc:/network/loopback&quot;/&gt;
   &lt;/dependency&gt;

   &lt;exec_method name=&quot;start&quot; type=&quot;method&quot; exec=&quot;/usr/local/sbin/php-fcgi.sh&quot; timeout_seconds=&quot;60&quot;&gt;
     &lt;method_context working_directory=&quot;/usr/local/www&quot;&gt;
      &lt;method_credential user=&quot;php&quot; group=&quot;webservd&quot; privileges=&quot;basic,net_privaddr&quot;/&gt;
      &lt;!--method_credential user=&quot;root&quot; group=&quot;root&quot; /--&gt;
       &lt;method_environment&gt;
         &lt;envvar name=&quot;PATH&quot; value=&quot;/usr/php/5.2/bin:/usr/local/sbin:/usr/bin:/bin&quot; /&gt;
       &lt;/method_environment&gt;
     &lt;/method_context&gt;
   &lt;/exec_method&gt;

    &lt;exec_method name='stop' type='method' exec=':kill' timeout_seconds='60'&gt;
      &lt;method_context/&gt;
    &lt;/exec_method&gt;

 &lt;/service&gt;
&lt;/service_bundle&gt;
</pre>
<p>この xml も同じように svccfg コマンドで登録します。</p>
<p>起動用の shell スクリプトは<a href="http://drupal.org/node/110224">こちらのサイト</a>のものを、ほぼそのまま使っています。</p>
<pre class="brush: bash;">
#!/bin/bash

LC_ALL=ja_JP.UTF-8

#FastCGI Webserver path
FCGI_WEB_SERVER_ADDRS=&quot;127.0.0.1&quot;

## ABSOLUTE path to the PHP binary
PHPFCGI=&quot;/usr/php/bin/php-cgi&quot;

## tcp-port to bind on
FCGIPORT=&quot;9000&quot;

## IP to bind on
FCGIADDR=&quot;127.0.0.1&quot;

## number of PHP children to spawn
PHP_FCGI_CHILDREN=5

## number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=1000

# allowed environment variables sperated by spaces
ALLOWED_ENV=&quot;PATH&quot;

## if this script is run as root switch to the following user
USERID=webservd

################## no config below this line

ALLOWED_ENV=&quot;$ALLOWED_ENV PHP_FCGI_CHILDREN&quot;
ALLOWED_ENV=&quot;$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS&quot;
ALLOWED_ENV=&quot;$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS&quot;

if test x$UID = x0; then
  EX=&quot;/bin/su -m -c \&quot;$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\&quot; $USERID&quot;
else
  EX=&quot;$PHPFCGI -b $FCGIADDR:$FCGIPORT&quot;
fi

echo $EX

# copy the allowed environment variables
E=

for i in $ALLOWED_ENV; do
  E=&quot;$E $i=${!i}&quot;
done

# clean environment and set up a new one
nohup env - $E sh -c &quot;$EX&quot; &amp;
</pre>
<p>サービスが SMF に登録できれば、svcadm コマンドで起動停止を切り替える事ができます。</p>
<h4>起動</h4>
<pre class="bq">
# svcadm enable nginx
# svcadm enable php-fastcgi
</pre>
<h4>停止</h4>
<pre class="bq">
# svcadm disable nginx
# svcadm disable php-fastcgi
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/08/management-nginx-with-smf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snow Leopard で IP alias を設定する</title>
		<link>http://blog.bluegold.me/2010/06/configure-ip-alias-on-snow-leopard/</link>
		<comments>http://blog.bluegold.me/2010/06/configure-ip-alias-on-snow-leopard/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 01:57:32 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=450</guid>
		<description><![CDATA[Snow Leopard, Linux, OpenSolaris で NIC に IP alias を設定する方法。]]></description>
			<content:encoded><![CDATA[<div>
<h2 style="font-weight: normal;">Snow Leopard でNICにIP aliasを設定する方法のメモ。</h2>
<h3>IP alias の追加</h3>
<pre class="bq">
sudo ifconfig en0 alias 192.168.0.1 255.255.255.0
</pre>
<h3>IP alias の削除</h3>
<pre class="bq">
sudo ifconfig en0 -alias 192.168.0.1
</pre>
<p style="margin-top: 16px;">ついでに Linux と OpenSolari での設定方法もメモ。</p>
<p><span id="more-450"></span></p>
<h2 style="font-weight: normal;">Linux の場合</h2>
<h3>IP alias の追加</h3>
<pre class="bq">
# /sbin/ifconfig eth0:1 192.168.0.1/24
</pre>
<h3>IP alias の削除</h3>
<pre class="bq">
# /sbin/ifconfig eth0:1 down
</pre>
<h2 style="font-weight: normal;">OpenSolaris の場合</h2>
<h3>IP alias の追加</h3>
<pre class="bq">
pfexec ifconfig gbe0:1 plumb
pfexec ifconfig gbe0:1 192.168.0.5 netmask 255.255.255.0 up
</pre>
<h3>IP alias の削除</h3>
<pre class="bq">
pfexec ifconfig gbe0:1 down
pfexec ifconfig gbe0:1 unplumb
</pre>
<p>Snow Leopard のやり方のほうが、何個目のエイリアスなのかを考えなくてもいいので楽なのかなぁ。<br />
エイリアス単位でインターフェースの UP/DOWN はできなそうだけど。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/06/configure-ip-alias-on-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redmine を監視して再起動する</title>
		<link>http://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/</link>
		<comments>http://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 16:35:50 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[opensolaris]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=444</guid>
		<description><![CDATA[Redmine の頻繁に 500 Internal Error を返すようになったので、監視して再起動させるスクリプトを作りました。]]></description>
			<content:encoded><![CDATA[<div>
<p>正確には Redmine が原因なのかどうかは判明していませんが、OpenSolaris 上に構築した Redmine が起動後何時間かすると<b>500 Internal Error</b>を返すようになってしまいました。</p>
<p>Redmine は以下のような環境で動かしています。</p>
<ul>
<li>Redmine 0.9.3</li>
<li>OpenSolaris 2009.06</li>
<li>Ruby 1.8.7-p249</li>
<li>Rails 2.3.5</li>
<li>Unicorn 0.97.0</li>
<li>nginx 0.7.65</li>
</ul>
<p>Ruby は /opt/sunstudio12.1/bin/cc(Sun Studio Express 12)でビルドしています。</p>
</div>
<div>
<p>OpenSolaris に付属の /usr/bin/ruby を使っていた時には問題なく動作していたんですが、Redmine 0.9.3 にバージョナップした所、致命的な問題が発生したため、Ruby を自分でビルドするように変更していました。</p>
<p>落ちているの気がついたら手動で再起動をしていたのですが、さすがにメンドウになってきたのでスクリプトを書きました。</p>
<p><span id="more-444"></span></p>
<pre class="brush: bash;">
#!/bin/sh

while `/bin/true`
do
    http_code=`curl --insecure -w &quot;%{http_code}&quot; -s -o /dev/null https://redmine/login`
    ts=`date +&quot;%Y/%m/%d %H:%M:%S&quot;`

    if [ $http_code -eq 200 ]; then
        echo $ts OK
        sleep 300
        continue
    fi

    cd /var/www/redmine
    pid=`cat tmp/pids/unicorn.pid`

    kill -USR2 $pid
    sleep 5
    kill $pid

    echo $ts unicorn $pid reloaded.
done

exit 0
</pre>
<p>手順としては、5分おきに curl で HTTP のステータスコードのみを受け取り、<b>200 OK</b>が帰ってこない場合は再起動、という流れです。</p>
<p>Unicorn は SIGUSR2 を送ると自分自身を fork() してから終了するはずなのですが、終了せずに残るので子プロセスの起動を待ってから SIGTERM を送っています。</p>
</div>
<div>
<p>とりあえずは、これで気にはならなくなりましたが。。。</p>
<p>そのうち、God あたりに切り替えよう。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSolarisのftpdでファイル一覧の表示に問題</title>
		<link>http://blog.bluegold.me/2010/02/ffftp-cannot-list-files-with-opensolaris-ftpd/</link>
		<comments>http://blog.bluegold.me/2010/02/ffftp-cannot-list-files-with-opensolaris-ftpd/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 17:31:57 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=400</guid>
		<description><![CDATA[OpenSolarisのFTPサーバにWindowsのFTPソフト（FFFTP）から接続した際に、ファイル一覧が表示されない問題の解決方法。]]></description>
			<content:encoded><![CDATA[<p>外部のデザイナーさん（<a href="http://higash.net" target="_blank">HiGash.Net</a> の中の人だけど）と仕事をしたときの話です。</p>
<p>私の構築したステージング用のサーバにデザイナーさんの作ったコンテンツを置いてもらう必要があったので、「sftp でいいですか？」と聞いたら「ftpの方がいい」と言われたので、急遽 ftp サーバの用意をすることになりました。</p>
<p>軽く「いいよ」と答えたものの、自分で最後に ftpd をたてたのはもう１０年近く前のことで何も覚えてません。<br />
Solaris なのでSMFで管理されているftpdがあるだろうと思い、試してみると</p>
<pre class="bq">
$ pfexec svcadm enable ftp
$ svcs -l ftp
fmri         svc:/network/ftp:default
name         FTP server
有効         true
状態         online
next_state   none
state_time   Tue Feb 23 02:02:15 2010
リスタータ   svc:/network/inetd:default
contract_id
</pre>
<p>無事に起動できました。簡単簡単。
</p>
<p>念のため、ファイアウォール越しに ftp コマンドで接続テストを行い、passive mode が on でも off でも問題がなかったので、使ってもらいました。</p>
<p>しかし、しばらくすると<strong>「FTPサーバに接続は出来たけど、ファイルが何も表示されない」</strong>との報告が。。。</p>
<p><span id="more-400"></span></p>
<p>使っている ftp のクライアントソフトは<strong>FFFTP</strong>だという事なので、同じトラブルにあっている人がいるだろうと思いGoogleに聞いてみたところ、<a href="http://oshiete1.goo.ne.jp/qa2017913.html"  target="_blank">このページ</a>で原因と思われる記述を発見しました。</p>
<p><strong>「タイムスタンプに含まれる日本語文字列の処理の問題」</strong></p>
<p>ftpコマンドで接続して確認すると、ファイルの更新日付が確かに日本語で返ってきています。これなら in.ftpd のロケールを変えてあげれば問題は解決しそうです。</p>
<p>また、Googleに聞いてみると<a href="http://www.kichise.com/modules/pico/content0064.html"  target="_blank">このページ</a>に回答がそのまま書いてありました。</p>
<p>SMF なので svccfg を使うのかと思ったら、in.ftpd は inetd に管理されているので、inetadmというコマンドを使うんですね。初めて知った。</p>
<p>以下のコマンドで、FFFTPでも正常にファイル一覧が表示されるようになりました。</p>
<pre class="bq">
$ pfexec inetadm -m ftp inherit_env=FALSE
$ pfexec svcadm restart ftp
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/02/ffftp-cannot-list-files-with-opensolaris-ftpd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSolarisで64bitのnginxをビルドする</title>
		<link>http://blog.bluegold.me/2010/02/howto-build-64bit-nginx-with-ssl-support-on-opensolaris/</link>
		<comments>http://blog.bluegold.me/2010/02/howto-build-64bit-nginx-with-ssl-support-on-opensolaris/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 09:05:29 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[opensolaris]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=362</guid>
		<description><![CDATA[OpenSolaris 2009.06 で 64bit 版の nginx をビルドする手順]]></description>
			<content:encoded><![CDATA[<div class="content">
<p><a href="http://nginx.net/">nginx</a>の新しいバージョン(0.7.65)がリリースされていたので，バージョンアップしてみました。</p>
<p>しばらく前に見つかっていた<a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555">SSLの脆弱製</a>の実験をやろうと、久しぶりに SSL を有効にしたバイナリを作ろうとしたのですが，オプションの設定の仕方を忘れていて苦労しました。また、忘れても大丈夫なようにメモ。</p>
<p>OpenSolaris 2009.06 に含まれるOpenSSLは 0.9.8a と古いので、現時点での最新バージョンである<a href="http://www.openssl.org/source/openssl-0.9.8l.tar.gz">openssl-0.9.8l</a>をダウンロードしてきて使いました。今回は<a href="http://en.wikipedia.org/wiki/Server_Name_Indication">SNI(Server Name Indication)</a>を有効にしたいので<strong>enable-tlsext</strong>オプションを渡しています。
</p>
<pre class="brush: bash;">
./config --prefix=/usr/local no-shared enable-tlsext
make
pfexec make install
</pre>
<p>これだけでもビルドは出来るのですが，OpenSolaris 2009.06 のデフォルトの GCC 3.2.3 ではなく新しい /usr/bin/gcc-4.3.2 を使いたいので，少し手を入れています。</p>
<pre class="brush: bash;">
export CC=/usr/bin/gcc-4.3.2
export CFLAGS='-DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -march=native -O3 -Wall -DL_ENDIAN -DMD32_REG_T=int -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM'
./Configure --prefix=/usr/local no-shared enable-tlsext solaris64-x86_64-gcc
make
pfexec make install
</pre>
<p><span id="more-362"></span></p>
<p><strong>export CC=/usr/bin/gcc-4.3.2</strong>した後に<em>config</em>スクリプトを実行すると，solaris64-x86_64-gcc-4.3.2 みたいな os:compiler になってエラーになってしまうんですよね。回避方法を探すのに手間取ってしまいました。
</p>
<p>次に nginx のビルドですが，普通に configure を実行すると 32bit のバイナリが出来てしまいますので、gcc に渡すオプションも configure に渡します。</p>
<pre class="brush: bash;">
./configure --prefix=/usr/local --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-cc=/usr/bin/gcc-4.3.2 --with-cc-opt='-m64 -march=native -O3 -I/usr/local/include ' --with-cpu-opt=amd64 --with-ld-opt='-m64 -L/usr/local/lib -L/usr/lib/amd64'
make
pfexec make install
</pre>
<p>ビルドした内容を確認</p>
<pre class="brush: bash;">
$ file /usr/local/sbin/nginx
/usr/local/sbin/nginx:  ELF 64-bit LSB executable AMD64 Version 1, dynamically linked, stripped

$ /usr/local/sbin/nginx -V
nginx version: nginx/0.7.65
built by gcc 4.3.2 (GCC)
TLS SNI support enabled
configure arguments: --prefix=/opt/local --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-cc=/usr/bin/gcc-4.3.2 --with-cc-opt='-m64 -march=native -O3 -I/usr/local/include' --with-cpu-opt=amd64 --with-ld-opt='-m64 -L/usr/local/lib -L/usr/lib/amd64'
</pre>
<p>SNIも有効になっています</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/02/howto-build-64bit-nginx-with-ssl-support-on-opensolaris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>zfsとタイムスライダーでハマった事</title>
		<link>http://blog.bluegold.me/2009/09/zfs-cannot-delete-file-on-no-space-left-on-device/</link>
		<comments>http://blog.bluegold.me/2009/09/zfs-cannot-delete-file-on-no-space-left-on-device/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 10:09:41 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[opensolaris]]></category>
		<category><![CDATA[snapshot]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=305</guid>
		<description><![CDATA[OpenSolaris の新機能「タイムスライダー」は便利な自動スナップショット機能ですが、ディスクの残り容量に気をつけていないとトラブルが起こってしまいます。]]></description>
			<content:encoded><![CDATA[<div>
<p>今回の秋の連休は有休も使って9連休にしていました。<br />
休み明けのボケた頭では仕事にならないので、午前中は開発用サーバたちのパッケージのアップデートをしていたところ、その中の１つにログインできませんでした。</p>
<p>そのホストは OpenSolaris 2009.06 の中に立てた Linux Branded Zone（BrandZ と書いた方がいいのかな）にインストールした CentOS3 でした。Solaris の Zone なので、ホストOS の方からは自由に Linux のファイルシステムに入っていけます。中のファイルを調べたところ、ログファイルの１つが46GB以上に肥大化してしまってディスクの残り容量が無くなってしまっているのが原因のようでした。</p>
<p>これなら、巨大化したログファイルを削除すれば問題解決だな、と軽い気持ちで<strong>rm ログファイル </strong>を実行したところ、意外な結果が戻ってきました。
</p>
<pre class="bq">
cannot delete file: no space left on device.
</pre>
<p>ディスクに空き領域が無いからファイルを消したいのに、空き領域が無いからファイルを消せないと言われても。。。</p>
<p><span id="more-305"></span></p>
<p>ファイルシステムが壊れているのかと zpool scrub を実行してもエラーは無し。</p>
<p><a href="http://www.google.com/search?q=cannot+delete+%22no+space+left+on+device%22+zfs">Google 先生に質問</a>してみたところ、zfs の既知のバグのようでした。曰く、ディスクの残り容量が無くなるとスナップショットが存在するファイルは削除できない。スナップショットの無いファイルを消して空き領域を作るか、スナップショットを削除すればよいようです。
</p>
<p>が、zfs は使っているもののスナップショットなんて取ったことはありません。<br />
不思議に思い <strong>zfs list -t snapshot</strong>を実行したところ、以下のように大量のスナップショットが存在していました。</p>
<pre class="bq">
rpool/ROOT/OpenSolaris-200906-090928@2009-07-10-00:41:02                      17.4M      -  2.85G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-10-17:54     39.5K      -  6.93G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:weekly-2009-07-10-17:54      40K      -  6.93G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:monthly-2009-07-10-17:54   1.11M      -  6.93G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-11-00:00     3.67M      -  6.94G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-12-00:00     2.86M      -  7.14G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-13-00:00     5.29M      -  7.14G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-14-00:00     21.1M      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:weekly-2009-07-15-00:00    1.29M      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-16-00:00      528K      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-17-00:00     3.73M      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-18-00:00     1.67M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-19-00:00     1.05M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-20-00:00     1.08M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-21-00:00     1.22M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:weekly-2009-07-22-00:00    1.35M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-23-00:00     1.35M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-24-00:00     5.91M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-25-00:00     5.93M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-26-00:00     5.87M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-27-00:00     6.60M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-28-00:00     6.42M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-11:00    1.73M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-12:00    1.71M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-13:00    1.93M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-14:00    1.88M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-15:00    1.79M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-16:00    1.26M      -  7.40G  -
...
</pre>
<p>犯人（？）は zfs の自動スナップショット機能でした。たしかにインストール直後に試しにタイムスライダーを有効にしたことがありましたが、こんな事になるとは。
</p>
<p>大量のスナップショットを削除するようにシェルスクリプトを作成して問題は解決しました。ただ、ググっている時に「rpool の容量がなくなるとリブートもできなくなる」のような話もあったので、タイムスライダー（自動スナップショット）はちょっと恐くて使えないなぁ。
</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/09/zfs-cannot-delete-file-on-no-space-left-on-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
