2016/03/07

Coleman 285A Dual Fuel Lantern

こちらはコールマンの代名詞とも言えるランタン (コールマンのマークもランタンだしね)。
2マントルタイプなのでとても明るくテントサイトを照らしてくれるので、 主にサイトのメインの明かりとして大活躍している。

このランタンもジェネレータ交換なしでホワイトガソリン以外に無鉛ガソリンも利用できるタイプ。 とは言ってもやはりジェネレータ詰まり等発生するそうなので無鉛ガソリンはあくまで緊急避難的使い方になると思う。

ランタンはマントルと呼ばれる部分を発光させているのだが、マントルは布製の袋の様になっていて、 使用する前にあらかじめ燃やしておく必要がある (これを「カラ焼き」と呼ぶらしい)。 カラ焼きされたマントルは言ってみれば灰の様な物なので非常に脆くなっている。 ちょっとした衝撃でも崩れてしまうので扱いは要注意。 キャンプの時はマントルだけは必ず予備を持って行った方が良いと思う。

バルブを全開にすると新聞も読める程に明るくなるが、その状態でも7時間程度は燃料がもつので2泊程度のキャンプなら燃料の補給は不要で便利。 明るすぎて他のサイトに迷惑をかけない様に注意する必要があるので、最近はコールマン純正のリフレクター (日本未発売品 2000008533) を利用している。

Image: IMG_3246.JPG

明るさの調整も簡単
Image: IMG_3247.JPG

2マントルタイプ
Image: RIMG0048.JPG

リフレクターを装着

ポンプキャップは新型の樹脂製。
ポンプカップは標準は新型のネオプレーンタイプなのだが、純正の革製ポンプカップに変更する事でポンピングの感触が随分と改善される。

交換部品

マントル 21A102J (21A型が利用可能)
ジェネレータ 285-5891
ポンプ 242J5201 → 3000000455(220A6201)
グローブ R690B048J (#4)
R288-046J (フロステッドタイプ)
R285-043J (フロステッドタイプ スペシャルバージョン)
チェックバルブ 200-6381 (118mm)

2016/03/05

Primus Omni Lite Ti

今回はコールマンではなく Primus 社の Omni Lite シリーズのチタンモデル Omni Lite Ti。
この製品は付属のジェットを交換する事でホワイトガソリン、無鉛ガソリン、ケロシン (灯油)、軽油をはじめとして OD 缶のガスまで利用できてしまう。 一般的に入手可能な燃料であれば何でも使えるので緊急時にはとても頼りになるストーブだ。
しかも本体はチタン製で折りたたみ可能なので、丈夫でかつ軽量コンパクトなストーブとなっていて普段から車に搭載して携行しても良い。

燃料側に燃料用バルブ、本体側に火力調整用のバルブがあるので火力調整も簡単に可能で炊飯も楽にできる (やはり美味しいご飯が炊けるのは大切)。
ガスで利用する場合は OD 缶をコネクタに接続して燃料側のバルブを開くだけですぐ着火するので、その後は本体側のバルブで火力調整を行う。
液体の燃料を利用する場合はコールマンと違って余熱が必要になるが、 それほど面倒ではないので「一種の儀式」と割り切って手間を愉しむのも良いと思う。
ただし燃焼音は非常に大きく轟音と言っても過言ではないレベルなので夜遅い時間のキャンプ場では使用をためらってしまう。

ジェットは

  1. ガス用
  2. ホワイトガソリン用
  3. ケロシン用
と3種類付属しているが、今の所ガスとホワイトガソリンではジェットを交換せずに利用できている。

Image: RIMG0829.JPG

液体燃料用のタンクを接続
Image: RIMG0831.JPG

チタン製の本体
Image: RIMG0832.JPG

OD 缶を接続

液体燃料での使用方法

点火
  1. タンクに燃料を入れてホースと連結する
  2. 20回程度ポンピングする
  3. タンクの ON の文字を上にして水平にする
  4. 燃料側のバルブを全開にする
  5. 本体側のバルブを半回転ほど回して数秒待ちバーナー下部のカップに燃料を補給する
  6. 点火する
  7. 40秒程度燃焼させると炎が弱くなるので本体側のバルブを開く
  8. 青い炎で燃焼すれば OK
  9. 赤や黄色い炎の場合は余熱が不足しているので本体側のバルブを閉じで余熱を続ける
消火
  1. タンクの OFF の文字を上にして水平にする
  2. 1分程度で自動で消火する
  3. 燃料側のバルブを全閉にする
  4. 本体側のバルブも全閉にする

2016/03/04

Coleman 533 Dual Fuel Stove

508 と基本的な構造は同じだけど燃料としてホワイトガソリンと無鉛ガソリンが利用できるタイプ。
何故か日本国内では正規品として販売されていないので平行輸入品を購入した。
ジェネレータの交換なしでホワイトガソリンと無鉛ガソリンが利用できるらしいが、 無鉛ガソリンを使うとジェネレータが詰まったりするので使用は推奨されておらずあくまでも緊急時用らしい。
実際に無鉛ガソリンで燃焼させた事がないのでいつか燃焼させてみたい。

最近の製品だから当然1レバーなので火力調整はすこしだけ難しい (できない事はないけど)。
以前は 508 と2台でキャンプに行っていたが 400A を入手して以来出番がなく家で待機している (ディーゼル車に乗り換えた事で無鉛ガソリンが手元になくなってしまった事も出番が減った理由の一つ)。 たまには使おうとは思うのだが2レバーの便利さを知ってしまうと1レバーの出番は少ない。

Image: RIMG0802.JPG

Dual Fuel モデルは本体がシルバー
Image: RIMG0804.JPG

2011年07月製造
Image: RIMG0811.JPG

純正のスクリーンを装着

キャンプ場などアウトドアでストーブを利用する場合は基本的にスクリーンを装着して利用している。
コールマン純正のスクリーンはスポーツスター系の 508 や 533 だけではなく 400A にも対応しているので1個持っていると便利。

ポンプキャップは新型の樹脂製。
ポンプカップも新型のネオプレーンタイプ。
コールマンの純正ポンプはアルミと樹脂のキャップがどちらも付属しているので 508 や 400A と同じものが利用できる。
1レバーなのでバルブはクリーナーフックのあるタイプとなっている。

交換部品

ジェネレータ 533-5891
ポンプ 242J5201 → 3000000455(220A6201)
バルブ 508A5571
チェックバルブ 200-6381 (118mm)

2016/03/03

Coleman PEAK1 400A Stove 2 Lever

バーナー部分は 508 と共通でタンク部分がより小型化されたのがこちらの 400A ストーブ。
小型のタンクに加えて折りたたみタイプの脚が採用されていてスポーツスターよりも随分とコンパクトで携行性に優れている。
一時期は車のトランクに常時携帯していて適切な場所があればパーコレータで珈琲を淹れて飲んだりしていた。
この 400A はアメリカのオークションサイト eBay で落札したのだが、鍋にも利用できる (使いたくないけどね) アルミケース、 鍋として使う時のためのアルミ製ハンドルなどが付属していた。
前述の通りタンク以外の部品は2レバーの 508 と殆ど共通なのでメンテも楽だし、 使い勝手や火力は 508 と同じなのでこちらも普段からとても重宝している。
現行機種のフェザーストーブと殆ど同じデザインなのだが、有鉛ガソリンには対応しておらず、 折りたたみの脚に穴が開いていないなど細かな差がある。
こちらも2レバータイプなので火力調整が容易にできるのが嬉しい。
508 と比較するとコンパクトな分だけ燃焼時間が若干短いがキャンプでは 508 と並べて併用しているのであまり気にならない。

Image: RIMG0792.JPG

コンパクトな本体
Image: RIMG0793.JPG

付属のアルミケースとハンドル
Image: RIMG0038.JPG

1988年8月製造

ポンプキャップは旧式のアルミ製。
ポンプカップはこちらも純正の革製ポンプカップに変更している。

交換部品

ジェネレータ 400-5891 → 508-5891
ポンプ 400E5211
バルブ 400-5571 → 400B5571
チェックバルブ 400-6381 (96mm)

バーナー周りの交換部品は 508 と共通な部品も多いのでメンテナンス性は非常に高いが、 チェックバルブとポンプはタンクが小型のために 508 に比べて短いタイプとなる。

Image: 508-5891.jpg

508 / 400A で共用の2レバー式ジェネレータ

Image: 508-5571.jpg

フック無しで真鍮製フードチューブのバルブは偶然入手したので大切に保管している。

Image: 200-6381.jpg

ゴム製の O リングを装着したチェックバルブ

2016/03/02

Coleman 508 Stove 2 Lever

最近当ブログの更新が滞っていたのでキャンプ道具の自慢紹介など…

コールマンと言えばまず思い浮かぶのがシングルストーブの 508。
その 508 の中でもこれは火力調整の可能な2レバータイプなので非常に重宝している。

このタイプのシングルバーナーはスポーツスターII (508A) として今でも新品が製造販売されているが、 現行のタイプは燃料開閉用のレバーだけなので特に弱火の火力調整が困難で炊飯時などに結構困る。 ところが旧式の2レバータイプは火力調整専用のレバーがあるので強火からとろ火まで調整が非常に容易である。
コールマンの代名詞とも言えるポンピングのおかげで余熱が不要だし火力調整も思いのままなので、 今の所シングルバーナーのストーブでは最高の1台だと思う。

Image: RIMG0823.JPG

ラベルデザインも旧式
Image: RIMG0824.JPG

燃料調整用レバー
Image: RIMG0825.JPG

1987年12月製造

ポンプキャップは旧式のアルミ製。
ポンプカップは標準は新型のネオプレーンタイプなのだが、純正の革製ポンプカップに変更する事でポンピングの感触が随分と改善される。
2レバータイプはクリーナーがジェネレータにつくのでバルブにはフックを掛けるためのエキセントリックロックがないらしい。 フック無しのバルブ (508-5571) は廃盤で入手できないが1レバータイプのバルブも流用可能らしい。

交換部品

ジェネレータ 400-5891 → 508-5891
ポンプ 242J5201 → 3000000455(220A6201)
バルブ 508-5571 (フック無し) → 508A5571
チェックバルブ 200-6381 (118mm)

2レバーの操作方法

点火
  1. 燃料を入れる
  2. ポンピングする
  3. 黒い火力調整レバーを LIGHT/HI の位置にセットする
  4. 赤い燃料レバーを ON と OFF の中間 (下向き) 位置にセットする
  5. 点火する
  6. 着火したらポンピングを追加し十分な圧力を保持する
  7. 青い炎になり火力が安定したら赤い燃料レバー ON の位置にセットする
  8. 黒い燃料調節レバーで火力を調整する
消火
  1. 黒い火力調整レバーを LIGHT / HI の位置にセットする
  2. 赤い燃料レバーを ON と OFF の中間 (下向き) 位置にセットする
  3. そのまま30秒程度燃焼させる
  4. 赤い燃料レバーを OFF の位置にセットして消火するまで待つ
  5. 完全に消化して数分後に黒い火力調整レバーを CLEAN の位置にセットする

2015/10/30

Happy birthday for my dearest.


Dear Princess, may you have a great and happy life ahead. We are always with you. I wish you a very Happy Birthday. Enjoy.

2015/10/01

Shuca (朱夏) - 日本語対応のサマライザ

MOONGIFTで紹介されていた Shuca という日本語に対応したサマライザを試してみた。
サマライザとは文章を解析し重要な部分だけを抜き出してくれる要約エンジンの事で、 この処理が自動で実施できると非常に便利になりそうなので 早速 CentOS 6.6 に Shucha を導入してみる。

Shuca は予め分かち書きや構文解析された文章を入力ソースとして受け付ける。 そのため、別途、形態素解析システムの JUMAN や 日本語構文・格・照応解析システムの KNP が必要となるので それらのツールも同時にインストールする。

Shuca のインストール
Shuca 本体は Python で記述されており GitHub でソースが公開されている。 基本的にインストール作業は不要で GitHub からダウンロードしたファイルを任意のディレクトリに展開すれば良い。
今回は /usr/local 以下に全てのファイルを展開し、 実行可能ファイルは /usr/local/bin 以下に設置した。
$ wget https://github.com/hitoshin/shuca/archive/master.zip
$ unzip master.zip
$ sudo mkdir -p /usr/local/{bin,libexec,dic}
$ sudo cp -p shuca-master/lib/* /usr/local/bin/.
$ sudo cp -p shuca-master/dic/* /usr/local/dic/.
$ sudo cp -p shuca-master/libexec/* /usr/local/libexec/.
            
インストールが終了したら同梱されているサンプルデータで動作を確認する。
$ Shuca.py < shuca-master/dat/sample.knp.txt 
JR東海は4月16日、山梨リニア実験線で同日に行ったL0系の高速有人走行試験において、590キロメートル毎時を記録したと発表した。
2003年12月2日に同社のMLX01形が記録した鉄道の世界最高速度、581キロメートル毎時を11年4ヶ月ぶりに9キロメートル毎時更新する形となった。
JR東海は、「今後も開業に向けさまざまな試験を行っていく」とコメントしている。
            
JUMAN のインストール
JUMAN は京都大学 大学院情報学研究科の黒崎・河原研究室が開発した日本語形態素解析システムで、 日本語の文章を形態素ごとに分かち書きし品詞などの情報を付加している。
$ wget http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2
$ tar xvf juman-7.01.tar.bz2
$ cd juman-7.01
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
            
KNP のインストール。
KNP も京都大学 大学院情報学研究科の黒崎・河原研究室が開発した日本語構文・格・照応解析システムで、 JUMAN で解析された結果から文節および基本句間の係り受け関係、格関係、照応関係を出力する。
KNP は zlib を利用しているので、予め zlib のインクルードファイル、ライブラリ等をインストールしておく。
$ sudo yum -y install zlib-devel
$ wget http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.14.tar.bz2
$ tar xvf knp-4.14.tar.bz2
$ cd knp-4.14
$ ./configure --prefix=/usr/local --with-juman-prefix=/usr/local
$ make
$ sudo make install
            
動作の確認
これらがインストールできたら Shuca に同梱されているデータで動作の検証を実施する。
$ juman < shuca-master/dat/sample.snt.txt | knp 
# S-ID:1 KNP:4.14-CF1.1 DATE:2016/03/04 SCORE:-63.73058
                                JR──┐     
                                      東海は──┐ 
                  4──┐           │ 
                          月──┐       │ 
                                16──┐   │ 
                                        日、──┤ 
        山梨──┐               │ 
              リニア──┐           │ 
                        実験──┐       │ 
                                線で──┐   │ 
      同日に──┐           │   │ 
              行った──┐       │   │ 
        L0──┐   │       │   │ 
                系の──┤       │   │ 
高速──┐       │       │   │ 
        有人──┐   │       │   │ 
                走行──┤       │   │ 
                      試験に──┐   │   │ 
                            おいて、──┤   │ 
                      590──┐   │   │ 
                キロメートル──┤   │   │ 
                              毎時を──┤   │ 
                                  記録したと──┤ 
                                          発表した。
EOS
    :
    :
    :
            
これで必要なツール類のインストールは完了した。

ここまで動作が確認できたら php を利用して簡単な動作検証環境を作成する。
Shcha に附属されていたサンプルデータから KNP の実行時オプションは "-simple -normal" だと推察してみた。
この php スクリプトは入力された URL からコンテンツを取得して jUMAN で形態素解析を実施してKNP で構文解析を実施した上で Shcha を実行して要約を取得する。
下準備として改行コードの統一、HTML タグの除去、空行や空白のサプレス、 更に KNP の制限により半角文字を全角文字に変換している。
あくまでも動作サンプルのためのスクリプトなので、 エラー処理や html entity の処理など実施していない。

  1<html>
  2    <head>
  3        <title>
  4            shuca 要約
  5        </title>
  6    </head>
  7    <body>
  8        <center>
  9<?php
 10    mb_internal_encoding("UTF-8");
 11
 12    define("juman",     "/usr/local/bin/juman");
 13    define("knp",       "/usr/local/bin/knp -simple -normal -cf-cache");
 14    define("shuca",     "/usr/local/bin/Shuca.py -l 500 ");
 15
 16    if(strlen(($url = $_REQUEST["url"]))){
 17        print "$url<br><br>";
 18
 19        $start = gettime();
 20
 21        $content =
 22            mb_convert_kana(                                                            /* 半角文字を全角に変換 */
 23                preg_replace("/ +/", " ",                                               /* 複数のスペースを1個に置換 */
 24                    preg_replace("/^ *\n/m", "",                                        /* 空行を削除 */
 25                        strip_tags(                                                     /* html タグを削除 */
 26                            preg_replace('!<style.*?>.*?</style.*?>!is', '',            /* <style> タグとその内容を削除 */
 27                                preg_replace('!<script.*?>.*?</script.*?>!is', '',      /* <script> タグとその内容を削除 */
 28                                    str_replace("\r", "",                               /* CR を削除 */
 29                                        file_get_contents($url))))))), "ASKV");
 30
 31        $buf = "";
 32        $desc = array(
 33            0 => array("pipe", "rb"),                   /* stdin: pipe */
 34            1 => array("pipe", "wb"),                   /* stdout: pipe */
 35            2 => array("file", "/dev/null", "w"),       /* stderr: /dev/null */
 36        );
 37
 38        if($pp = proc_open(sprintf("%s | %s | %s", juman, knp, shuca), $desc, $pipe)){
 39            fwrite($pipe[0], $content);
 40            fclose($pipe[0]);
 41
 42            while(!feof($pipe[1]))
 43                $buf .= nl2br(fread($pipe[1], 1024));
 44            fclose($pipe[1]);
 45
 46            proc_close($pp);
 47
 48            print <<< EOF
 49                {$buf}
 50EOF
 51            ;
 52            printf("処理時間: %f 秒", gettime() - $start);
 53        }
 54    }
 55    else{
 56        print <<< EOF
 57                <form>
 58                    <input type='text' name='url' size='50'>
 59                    <input type='submit' value='要約'>
 60                </form>
 61EOF
 62        ;
 63    }
 64
 65function    gettime()
 66{
 67
 68    $t = gettimeofday();
 69    return((float)($t["sec"] + $t["usec"] / 1000000.0));
 70
 71}
 72
 73    
 74?>
 75        </center>
 76    </body>
 77</html>
    

Image: img_20151001.png

実行結果
KNP の実行に結構時間がかかっている様だが、 入力ソースを適切に編集する事で実用的な要約が取得できる様だ。

2015/09/03

国別フィルタの自動生成ツール (CentOS 版)

以前 FreeBSD 版の 国別フィルタの自動生成ツール を紹介したのだが、 最近 CentOS でもサーバを運用しているので CentOS 版を作成したので公開する事にした。 機能は FreeBSD 版同様 APNIC から IPアドレスの割当リストを取得して、 IPアドレスを CIDR 型式に修正した上で iptables (8) のコマンドラインパラメタを自動生成している。
今回は /etc/init.d/iptables を実行してフィルタを初期化した上で、 state RELATED,ESTABLISHED が含まれる行の次の行にルールの追加までを実行する。

  1#!/usr/bin/perl
  2# KRフィルタ
  3use Socket;
  4
  5# 拒否する国コード
  6@country = ('KR', 'CN');
  7# IPアドレス一覧取得URL
  8$url = "http://ftp.apnic.net/stats/apnic/delegated-apnic-latest";
  9
 10# iptables 初期化
 11system("/etc/init.d/iptables restart");
 12
 13# 挿入位置を取得 (接続済みパケットは許可する設定の次に挿入)
 14if(open(IN, "iptables -L INPUT --line-number|")){
 15    while(<IN>){
 16        if(/^(\d+).*RELATED,ESTABLISHED.*/){
 17            $rule = $1 + 1;
 18            last;
 19        }
 20    }
 21    close(IN);
 22}
 23
 24# 初期処理
 25foreach $i (@country){
 26    $country{$i} = 1;
 27}
 28
 29if(open(IN, "wget -q -O - $url|")){
 30    while(<IN>){
 31        if(/^apnic\|(..)\|ipv4\|(\d+.\d+.\d+.\d)\|(\d+)/){
 32            if($country{$1}){
 33                $table{inet_aton($2)} = $3;
 34            }
 35        }
 36    }
 37    close(IN);
 38
 39    # IPアドレス一覧を CIDR 型式に変換
 40    foreach $net (sort keys %table){
 41        $addr = unpack('N', $net);
 42        $num = $table{$net};
 43        while($num == $num[0] && ($addr ^ $addr[0]) == $num){
 44            shift @addr;
 45            shift @num;
 46            $addr &= ~$num;
 47            $num <<= 1;
 48        }
 49        unshift(@addr, $addr);
 50        unshift(@num, $num);
 51    }
 52
 53    # iptables 実行
 54    while (@addr){
 55        for($num = pop(@num), $mask = 32; $num > 1; $num >>= 1, $mask--){}
 56        $filt = inet_ntoa(pack('N', pop(@addr))) . "/$mask";
 57        system("iptables -I INPUT $rule -s $filt -j DROP");
 58        $rule++;
 59    }
 60}
 61
 620;
    

2015/08/27

Coleman Exponent Fyrestorm Ti Stove

eBay で Coleman Exponent Fyrestorm Ti Stove を落札。

Image: fyrestorm1.jpg

Fyrestorm Ti Stove
日本では発売されなかったマルチフューエルタイプのストーブで、 一般的なホワイトガソリンは勿論、自動車用の無鉛ガソリン、 更にはアウトドアカートリッジのガス缶も燃料として利用できる優れもの。

10年ほど前に既に製造中止されてしまった製品なのだが、 今回 eBay に「新品未使用、付属品もほぼ完備」という、 いわゆるミントコンディションで出品されていたので迷わず落札。
現在 eBay ではキャンプ用のストーブなどは日本に発送していないとの事なので、 既に何度かお世話になっている スピアネット の転送サービスを利用して取り寄せ。

Image: fyrestorm2.jpg

Fyrestorm Ti Stove
米国内の送料は無料だったので日本への転送費用のみが落札代金に加算されてしまうが、 それでも当時の定価 ($199.99) よりも格安にて入手できた。

自宅に届いた商品を早速開梱してみると説明通りに新品未使用のストーブでした。
この製品は名前の通りバーナーや五徳にチタンを利用しているので、 一度でも着火するとチタン特有の青系の色に焼けてしまうのだが、 本当に未使用・未着火の状態で届いて大満足。
この辺はアメリカ人は大げさに表現する傾向なので実はあまり信頼していなかった…
サービスパーツとして附属されていたOリングやチェックバルブ用のゴムボール、 風よけやヒートシールドなど付属品も殆ど全て揃っていて大満足。

Image: fyrestorm3.jpg

Fyrestorm Ti Stove

今年のキャンプの強力な武器になりそう…と思っていたのですが、 あまりにも綺麗な状態だったので使うのが勿体ないという…困った(笑

Image: fyrestorm4.jpg

Fyrestorm Ti Stove

2015/08/26

CentOS 6 に rssh を導入する

rsshssh (1) を利用したアクセスのうち scp (1) や sftp (1) といった 特定のコマンドのみの実行を許可したり chroot 環境を提供するログインシェルで、 セキュアなファイル転送は提供したいがシェルアカウントへの ログインを拒否したい場合などに非常に有効なログインシェルだ。
scp (1) や sftp (1) のみの実行を許可する場合は アカウントのログインシェルを rssh に変更して 設定ファイルで実行を許可するコマンドを指定するだけで設定は完了する。
しかし chroot 環境を提供する場合はそのための環境設定が必要である。

rssh のインストール
CentOS 6 では yum (1) から導入可能
$ sudo yum -y install rssh
    :
    :
    :
インストール:
  rssh.x86_64 0:2.3.4-1.el6

完了しました!
            
設定ファイルの編集
ssp (1)、sftp (1) のアクセスを許可し、 chroot するディレクトリを指定する。
# This is the default rssh config file

# set the log facility.  "LOG_USER" and "user" are equivalent.
logfacility = LOG_USER

# Leave these all commented out to make the default action for rssh to lock
# users out completely...

allowscp                                # scpを許可
allowsftp                               # sftpを許可
#allowcvs
#allowrdist
#allowrsync

# set the default umask
umask = 022

# If you want to chroot users, use this to set the directory where the root of
# the chroot jail will be located.
#
# if you DO NOT want to chroot users, LEAVE THIS COMMENTED OUT.
chrootpath = /opt/chroot                 # chroot先ディレクトリ

# You can quote anywhere, but quotes not required unless the path contains a
# space... as in this example.
#chrootpath = "/usr/local/my chroot"

##########################################
# EXAMPLES of configuring per-user options
    :
    :
    :
            
chroot 環境の初期設定
rssh に附属のスクリプトで chrrot 環境の初期構築を行う。
いくつかエラーが表示されるがここでは気にしなくても大丈夫
$ sudo sh /usr/share/doc/rssh-2.3.4/mkchroot.sh /opt/chroot
NOT changing owner of root jail. 
NOT changing perms of root jail. 
setting up /opt/chroot/usr/bin
setting up /opt/chroot/usr/libexec/openssh
setting up /opt/chroot/usr/libexec
Copying libraries for /usr/bin/scp.
    (0x00007fff541ff000)
cp: cannot stat `(0x00007fff541ff000)': そのようなファイルやディレクトリはありません
    /usr/lib64/libcrypto.so.10
    /lib64/libutil.so.1
    /lib64/libz.so.1
    /lib64/libnsl.so.1
    /lib64/libcrypt.so.1
    /lib64/libresolv.so.2
    /lib64/libgssapi_krb5.so.2
    /lib64/libkrb5.so.3
    /lib64/libk5crypto.so.3
    /lib64/libcom_err.so.2
    /usr/lib64/libnss3.so
    /lib64/libc.so.6
    /lib64/libdl.so.2
    /lib64/libfreebl3.so
    /lib64/libkrb5support.so.0
    /lib64/libkeyutils.so.1
    /lib64/libpthread.so.0
    /usr/lib64/libnssutil3.so
    /lib64/libplc4.so
    /lib64/libplds4.so
    /lib64/libnspr4.so
    /lib64/libselinux.so.1
    /lib64/librt.so.1
Copying libraries for /usr/libexec/openssh/sftp-server.
    (0x00007fff577f1000)
cp: cannot stat `(0x00007fff577f1000)': そのようなファイルやディレクトリはありません
    /usr/lib64/libcrypto.so.10
    /lib64/libutil.so.1
    /lib64/libz.so.1
    /lib64/libnsl.so.1
    /lib64/libcrypt.so.1
    /lib64/libresolv.so.2
    /lib64/libgssapi_krb5.so.2
    /lib64/libkrb5.so.3
    /lib64/libk5crypto.so.3
    /lib64/libcom_err.so.2
    /usr/lib64/libnss3.so
    /lib64/libc.so.6
    /lib64/libdl.so.2
    /lib64/libfreebl3.so
    /lib64/libkrb5support.so.0
    /lib64/libkeyutils.so.1
    /lib64/libpthread.so.0
    /usr/lib64/libnssutil3.so
    /lib64/libplc4.so
    /lib64/libplds4.so
    /lib64/libnspr4.so
    /lib64/libselinux.so.1
    /lib64/librt.so.1
Copying libraries for /usr/bin/rssh.
    (0x00007fff00bff000)
cp: cannot stat `(0x00007fff00bff000)': そのようなファイルやディレクトリはありません
    /lib64/libc.so.6
Copying libraries for /usr/libexec/rssh_chroot_helper.
    (0x00007fff3e152000)
cp: cannot stat `(0x00007fff3e152000)': そのようなファイルやディレクトリはありません
    /lib64/libc.so.6
copying name service resolution libraries...
tar: メンバ名から先頭の `/' を取り除きます
tar: /lib/libnss_files*: stat 不能: そのようなファイルやディレクトリはありません
tar: /lib/libnss1_files*: stat 不能: そのようなファイルやディレクトリはありません
tar: 前のエラーにより失敗ステータスで終了します
Setting up /etc in the chroot jail
cp: omitting directory `/etc/ld.so.conf.d'
Chroot jail configuration completed.

NOTE: if you are not using the passwd file for authentication,
you may need to copy some of the /lib/libnss_* files into the jail.

NOTE: you must MANUALLY edit your syslog rc script to start syslogd
with appropriate options to log to /opt/chroot/dev/log.  In most cases,
you will need to start syslog as:

   /sbin/syslogd -a /opt/chroot/dev/log

NOTE: we make no guarantee that ANY of this will work for you... if it
doesn't, you're on your own.  Sorry!
            
/dev/null の作成
附属のスクリプトでメッセージに表示されている処理、 エラーで完結できなかった処理などを実行して環境を構築する。
まず chroot 環境に /dev/null を作成する。
$ ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3  8月 26 10:58 2015 /dev/null
$ sudo mknod /opt/chroot/dev/null c 1 3
$ sudo chmod 666 /opt/chroot/dev/null
$ ls -l /opt/chroot/dev/null
crw-rw-rw-. 1 root root 1, 3  8月 26 11:59 2015 /opt/chroot/dev/null
            
ライブラリのコピー
次に エラーメッセージから ldd (1) で参照されたライブラリのうち いくつかがコピーできていない事が確認できる。
chroot 環境にコピーされるのは以下のコマンドなので、 それぞれのコマンドの ldd の結果を参照して 不足しているライブラリをコピーする。
  • /usr/bin/scp
  • /usr/libexec/openssh/sftp-server
  • /usr/bin/rssh
  • /usr/libexec/rssh_chroot_helper
ldd の出力結果からコピーが必要なライブラリを決定しているのだが linux-vdso.so.1ld-linux-x86-64.so.2 は 表示形式が通常と異なっているためにコピーできていない様。
$ ldd /usr/bin/scp
        linux-vdso.so.1 =>  (0x00007ffef53f0000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007fbd8e06a000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007fbd8de67000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fbd8dc50000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fbd8da37000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbd8d800000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbd8d5e5000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbd8d3a1000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fbd8d0ba000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fbd8ce8d000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fbd8cc89000)
        libnss3.so => /usr/lib64/libnss3.so (0x00007fbd8c94a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fbd8c5b5000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fbd8c3b1000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fbd8c1ae000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fbd8bfa2000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fbd8bd9f000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbd8bb82000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fbd8e662000)
        libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007fbd8b955000)
        libplc4.so => /lib64/libplc4.so (0x00007fbd8b750000)
        libplds4.so => /lib64/libplds4.so (0x00007fbd8b54c000)
        libnspr4.so => /lib64/libnspr4.so (0x00007fbd8b30d000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbd8b0ee000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fbd8aee5000)
$ ldd /usr/libexec/openssh/sftp-server
        linux-vdso.so.1 =>  (0x00007ffe2abcf000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007fbca7520000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007fbca731d000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fbca7106000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fbca6eed000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbca6cb6000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbca6a9b000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbca6857000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fbca6570000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fbca6343000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fbca613f000)
        libnss3.so => /usr/lib64/libnss3.so (0x00007fbca5e00000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fbca5a6b000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fbca5867000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fbca5664000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fbca5458000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fbca5255000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbca5038000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fbca7b18000)
        libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007fbca4e0b000)
        libplc4.so => /lib64/libplc4.so (0x00007fbca4c06000)
        libplds4.so => /lib64/libplds4.so (0x00007fbca4a02000)
        libnspr4.so => /lib64/libnspr4.so (0x00007fbca47c3000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbca45a4000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fbca439b000)
$ ldd /usr/bin/rssh
        linux-vdso.so.1 =>  (0x00007ffffe781000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f823c297000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f823c630000)
$ ldd /usr/libexec/rssh_chroot_helper
        linux-vdso.so.1 =>  (0x00007fffb99e9000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fde8f0ff000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fde8f498000)
$ ls -1 /opt/chroot/lib64
libc.so.6
libcom_err.so.2
libcrypt.so.1
libdl.so.2
libfreebl3.so
libgssapi_krb5.so.2
libk5crypto.so.3
libkeyutils.so.1
libkrb5.so.3
libkrb5support.so.0
libnsl.so.1
libnspr4.so
libplc4.so
libplds4.so
libpthread.so.0
libresolv.so.2
librt.so.1
libselinux.so.1
libutil.so.1
libz.so.1
            
linux-vdso.so.1 は各プログラムのアドレス空間のみに常駐する Virtual Dynamic Shared Object なので実体は存在しなくて問題ない。 それ以外に不足しているライブラリ(今回はld-linux-x86-64.so.2) を chroot 環境にコピーする。
検証のための chroot 環境の構築
この後の作業は実際に chroot 環境で作業するとエラー内容が分かりやすいので chroot して解析作業ができる様最低限の環境を構築する。
なおここで設定したファイルは後に削除する事。
# 不足しているライブラリをコピー
$ sudo cp -p /lib64/ld-linux-x86-64.so.2 /opt/chroot/lib64
# /bin/bash の実行を可能に
$ sudo mkdir /opt/chroot/bin
$ sudo cp -p /bin/bash /opt/chroot/bin/
$ sudo cp -p /lib64/libtinfo.so.5 /opt/chroot/lib64
# /usr/bin/ldd の実行を可能に
$ sudo cp -p /usr/bin/ldd /opt/chroot/usr/bin
$ sudo cp -p /bin/cat /opt/chroot/bin
# /usr/bin/strace の実行を可能に
$ sudo cp -p /usr/bin/strace /opt/chroot/usr/bin
            
chroot 環境での動作確認
構築した chroot 環境で動作を確認する。
scp (1) でアカウント情報を正しく取得できていない事が確認できる。
strace (1) で動作を確認してみると /lib64/libnss_files.so.2open (2)エラーになっている事が判る。
# chroot /opt/chroot /bin/sh
# 必要なライブラリーを確認
# ldd /usr/bin/scp
        linux-vdso.so.1 =>  (0x00007fff00345000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f2b2ca5b000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f2b2c858000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f2b2c641000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f2b2c428000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f2b2c1f1000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f2b2bfd6000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f2b2bd92000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f2b2baab000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f2b2b87e000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f2b2b67a000)
        libnss3.so => /usr/lib64/libnss3.so (0x00007f2b2b33b000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f2b2afa6000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f2b2ada2000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f2b2ab9f000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f2b2a993000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f2b2a790000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2b2a573000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2b2d053000)
        libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007f2b2a346000)
        libplc4.so => /lib64/libplc4.so (0x00007f2b2a141000)
        libplds4.so => /lib64/libplds4.so (0x00007f2b29f3d000)
        libnspr4.so => /lib64/libnspr4.so (0x00007f2b29cfe000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2b29adf000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f2b298d6000)
# /usr/bin/scp -t .
unknown user 0
# strace  /usr/bin/scp -t .
    :
    :
    :
open("/lib64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/tls/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls/x86_64", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls", 0x7ffc3cabffb0)      = -1 ENOENT (No such file or directory)
open("/lib64/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/x86_64", 0x7ffc3cabffb0)   = -1 ENOENT (No such file or directory)
open("/lib64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/usr/lib64/tls/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls/x86_64", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls", 0x7ffc3cabffb0)  = -1 ENOENT (No such file or directory)
open("/usr/lib64/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/x86_64", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
munmap(0x7f86d27d9000, 13667)           = 0
write(2, "unknown user 0\r\n", 16unknown user 0
)      = 16
exit_group(255)                         = ?
+++ exited with 255 +++
            
附属のスクリプトでメッセージに表示されてる様に 必要な libnss_* をコピーする。
$ sudo cp -p /lib64/libnss_files.so.2 /opt/chroot/lib64
            

これで chroot された環境に scp (1)、sftp (1) での アクセスが可能となる。

正常な動作が確認できたら検証のためのコマンドを削除する。

$ sudo rm /opt/chroot/bin/bash
$ sudo rm /opt/chroot/lib64/libtinfo.so.5
$ sudo rm /opt/chroot/usr/bin/ldd
$ sudo rm /opt/chroot/bin/cat
$ sudo rm /opt/chroot/usr/bin/strace
    


Copyright © Mitzyuki IMAIZUMI 2008,2009. All rights reserved.