<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[てくにかるむ]]></title><description><![CDATA[「エラーをなくすことは非常に有益で時には新しい真実や事実を作り上げるよりも勝る」
ー チャールズ・ダーウィン]]></description><link>http://multix.jp/</link><generator>Ghost 0.6</generator><lastBuildDate>Thu, 16 Jul 2026 01:59:57 GMT</lastBuildDate><atom:link href="http://multix.jp/tag/memorandom/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[SOAP::Transport::HTTP がおかしい]]></title><description><![CDATA[<p>Perl 5.20.3 + SOAP::Lite ver1.20 で XQuery 投げるとなぜか落ちる。調査すると STDIN に対して Bareward エラーが。それでこういう場当たり的なパッチが必要になった。おいおい？</p>

<pre><code class="language-brush:perl gutter:true">--- C:\Perl64\site\lib\SOAP\Transport\HTTP.pm    2016-12-17 10:45:40.000000000 +0900
+++ D:\Perl64\site\lib\SOAP\Transport\HTTP.pm    2017-01-23 12:42:33.000000000 +0900
@@ -586,6 +586,</code></pre>]]></description><link>http://multix.jp/soap-lite-failed/</link><guid isPermaLink="false">59c25a8e-8ac7-4a28-bce5-3b3bf7ed3827</guid><category><![CDATA[めもらんだむ]]></category><category><![CDATA[Web]]></category><dc:creator><![CDATA[朝日薫]]></dc:creator><pubDate>Fri, 24 Feb 2017 01:24:43 GMT</pubDate><content:encoded><![CDATA[<p>Perl 5.20.3 + SOAP::Lite ver1.20 で XQuery 投げるとなぜか落ちる。調査すると STDIN に対して Bareward エラーが。それでこういう場当たり的なパッチが必要になった。おいおい？</p>

<pre><code class="language-brush:perl gutter:true">--- C:\Perl64\site\lib\SOAP\Transport\HTTP.pm    2016-12-17 10:45:40.000000000 +0900
+++ D:\Perl64\site\lib\SOAP\Transport\HTTP.pm    2017-01-23 12:42:33.000000000 +0900
@@ -586,6 +586,7 @@
         #my $content = q{};
         if ( !$chunked ) {
             my $buffer;
+            no strict 'subs';
             binmode(STDIN);
             if ( defined $ENV{'MOD_PERL'} ) {
                 while ( read( STDIN, $buffer, $length ) ) {
</code></pre>

<p>直接原因はよくわからんがとにかくこうすれば正常動作はした。STDIN が <code>strict subs</code> に引っかかるって通常ではちょっと考えにくいところだが？</p>

<hr>]]></content:encoded></item><item><title><![CDATA[textareaでTAB入力]]></title><description><![CDATA[<p><code>&lt;textarea/&gt;</code> のフォーカス内でTABキーを押すと普通は次のform部品へフォーカスが移ってしまうが、これをTAB入力に変換する。フォーカス動作はキャンセルしなければならないので keydown イベントを使う。</p>

<hr>

<pre><code class="language-brush:javascript gutter:true">// textareaでのTABキー入力
$('textarea').on('keydown', function(e){
    if (e.keyCode === 9) {
        e.preventDefault();
        var elem = e.target;
        var val = elem.value;
        var pos = elem.selectionStart;
        elem.value = val.substr(0, pos) + '\t' + val.substr(pos, val.length);
        elem.setSelectionRange(pos + 1, pos</code></pre>]]></description><link>http://multix.jp/tab-input-textarea/</link><guid isPermaLink="false">f0beb3a4-5add-4f20-85b1-c2f21b70f871</guid><category><![CDATA[めもらんだむ]]></category><category><![CDATA[Web]]></category><dc:creator><![CDATA[朝日薫]]></dc:creator><pubDate>Mon, 20 Feb 2017 09:31:33 GMT</pubDate><content:encoded><![CDATA[<p><code>&lt;textarea/&gt;</code> のフォーカス内でTABキーを押すと普通は次のform部品へフォーカスが移ってしまうが、これをTAB入力に変換する。フォーカス動作はキャンセルしなければならないので keydown イベントを使う。</p>

<hr>

<pre><code class="language-brush:javascript gutter:true">// textareaでのTABキー入力
$('textarea').on('keydown', function(e){
    if (e.keyCode === 9) {
        e.preventDefault();
        var elem = e.target;
        var val = elem.value;
        var pos = elem.selectionStart;
        elem.value = val.substr(0, pos) + '\t' + val.substr(pos, val.length);
        elem.setSelectionRange(pos + 1, pos + 1);
    }
});
</code></pre>

<ul>
<li><code>e.keyCode === 9</code> <br>
TABキー押し下げを検知する。</li>
<li><code>e.preventDefault()</code> <br>
ブラウザのデフォルト動作を停止する。つまりフォーカス移動をキャンセルする。</li>
<li><code>e.target</code> <br>
イベント対象のDOMエレメントを取得する。すなわち <code>&lt;textarea/&gt;</code> 本体。jQueryの <code>$(this)[0]</code> におなじ。</li>
<li><code>elem.value</code> <br>
入力されている <code>&lt;textarea/&gt;</code> の内容。</li>
<li><code>elem.selectionStart</code> <br>
キャレットカーソルの位置。次の行でこの位置に<code>\t</code>を挿入して書き戻している。</li>
<li><code>elem.setSelectionRange(Start, End, [Direction])</code> <br>
キャレットを<code>\t</code>の後ろへ進める。選択範囲は無いので <em>Start</em> と <em>End</em> にはおなじ値を指定する。</li>
</ul>

<p>なお <em>selectionStart/selectionEnd</em> プロパティは直接書き換えることもできる。またキャレット選択範囲の後方は <em>elem.selectionEnd</em> で得られる。なので選択範囲があるなら丸ごとインデントするといったコードも書けなくはない。選択方向を指示する Direction はプラットフォームによって挙動が若干異なるので<a href="http://www.html5.jp/tag/elements/forms-textFieldSelection.html">こちら</a><sup id="fnref:1"><a href="http://multix.jp/tab-input-textarea/#fn:1" rel="footnote">1</a></sup>も参照のこと。</p>

<hr>

<div class="footnotes"><ol><li class="footnote" id="fn:1"><p><a href="http://www.html5.jp/tag/elements/forms-textFieldSelection.html">http://www.html5.jp/tag/elements/forms-textFieldSelection.html</a> <a href="http://multix.jp/tab-input-textarea/#fnref:1" title="return to article">↩</a></p></li></ol></div>]]></content:encoded></item><item><title><![CDATA[Allied Telesis CentreCOM の小技]]></title><description><![CDATA[<p>最近のアラテレは SDNへの注力もあって ATxシリーズへの世代移行が加速しており、昔ながらの CentreCOMシリーズは青息吐息な感があるけれども、かえってかつての高級機が手頃な値段でオークション等に出回るようになった。ここでは CentreCOM系では最後にして現役の AR5xxルータおよびそれと同族の 8xxxスイッチ関係の小技をいくつか取り上げる。<sup id="fnref:1"><a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fn:1" rel="footnote">1</a></sup></p>

<ul class="index"></ul>  

<hr>

<h4 id="">コンソールへのアラートを黙らせる</h4>

<p>AR系や87xx系でファイアウォールを有効にすると、デフォルトではルールにないパケットを受信する度にマネージャ権限以上でログインしているコンソール（async/telnet/ssh）にアラート通知が流れてしまう。</p>

<pre><code class="language-brush:plain">XXX.XXX.XXX.XXX attempting to use non-policy interface

Denial of service attack from XXX.XXX.XXX.XXX is finished  
</code></pre>

<p>設定作業中にこれらが次々に流れてゆくと作業の邪魔も甚だしい（電源を切りたくなる）ので、次のコマンドでコンソールへのアラートは止めてしまおう。</p>

<pre><code class="language-brush:plain">disable firewall notify=manager  
</code></pre>

<p>UnTagポートにTagパケットが入ってきた時も <code>attempting to use</code></p>]]></description><link>http://multix.jp/allied-telesis-centrecom-memorandom/</link><guid isPermaLink="false">ca593ede-78b8-4ffc-9364-73cbc0bf2005</guid><category><![CDATA[めもらんだむ]]></category><dc:creator><![CDATA[朝日薫]]></dc:creator><pubDate>Mon, 27 Jul 2015 08:39:00 GMT</pubDate><content:encoded><![CDATA[<p>最近のアラテレは SDNへの注力もあって ATxシリーズへの世代移行が加速しており、昔ながらの CentreCOMシリーズは青息吐息な感があるけれども、かえってかつての高級機が手頃な値段でオークション等に出回るようになった。ここでは CentreCOM系では最後にして現役の AR5xxルータおよびそれと同族の 8xxxスイッチ関係の小技をいくつか取り上げる。<sup id="fnref:1"><a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fn:1" rel="footnote">1</a></sup></p>

<ul class="index"></ul>  

<hr>

<h4 id="">コンソールへのアラートを黙らせる</h4>

<p>AR系や87xx系でファイアウォールを有効にすると、デフォルトではルールにないパケットを受信する度にマネージャ権限以上でログインしているコンソール（async/telnet/ssh）にアラート通知が流れてしまう。</p>

<pre><code class="language-brush:plain">XXX.XXX.XXX.XXX attempting to use non-policy interface

Denial of service attack from XXX.XXX.XXX.XXX is finished  
</code></pre>

<p>設定作業中にこれらが次々に流れてゆくと作業の邪魔も甚だしい（電源を切りたくなる）ので、次のコマンドでコンソールへのアラートは止めてしまおう。</p>

<pre><code class="language-brush:plain">disable firewall notify=manager  
</code></pre>

<p>UnTagポートにTagパケットが入ってきた時も <code>attempting to use non-policy</code>と怒られるので、VLAN変更をしている最中にも、これをしておくと結構助かる。</p>

<p>なお<code>notify=all</code>にするとすべてのアラートが止まるが、ログにも残らなくなる。ファイアウォール設定が充分固まって逆に <code>FIRE ATACK</code> 通知で <code>sh log</code> が埋まるようになったら、全部止めたほうがむしろ都合が良いだろう。</p>

<hr>

<h3 id="">時系列逆順ログ</h3>

<p>コマンドラインヘルプ（?キーのあれ）では表示されないので気づきにくいが <code>show log reverse (sh log rev)</code> でログを時系列の逆順に見ることが出来る。最新のログだけ確認して Quitで抜けるのに便利だ。</p>

<pre><code class="language-brush:plain">&gt; sh log rev

Date/Time   S Mod  Type  SType Message  
-------------------------------------------------------------------------------
27 17:58:21 3 IPG  IPFIL DUMP  Received invalid DA 8.240.213.66&gt;22.103.89.96  
                               Prot=17 Int=ppp5
27 17:57:57 3 IPG  IPFIL FRAG  DirBcast Fail 6.102.80.241&gt;22.103.89.103  
                               Prot=6 Int=vlan12
27 17:57:43 3 IPG  IPFIL FRAG  DirBcast Fail 19.6.240.45&gt;22.103.89.103 Prot=6  
                               Int=vlan12
</code></pre>

<p>もちろん moduleと組み合わせて特定カテゴリのログだけ表示するときにも使える。</p>

<pre><code class="language-brush:plain">&gt; sh log reverse module=ssh

Date/Time   S Mod  Type  SType Message  
-------------------------------------------------------------------------------
27 17:51:39 3 SSH  SSH   RJCT  Rejecting SSH connection from 43.29.53.43  
                               incompatible versions
27 17:43:23 3 SSH  SSH   RJCT  Rejecting SSH connection from 45.14.11.37  
                               incompatible versions
27 17:37:53 3 SSH  SSH   RJCT  Rejecting SSH connection from 43.29.53.51  
                               incompatible versions
</code></pre>

<p>この機能は AR5xxS系や8xxxXL系で使えるが、9424T/SP等では使えない。</p>

<hr>

<h4 id="securitymode">Security Mode の有効時間を伸ばす</h4>

<p>IPSec/PKI/SSH を有効化して SECURITYOFFICERユーザに切り替えると、デフォルトでは1分で再ログインを求められるようになる。いくらなんでもこれは短いと感じた時は、次のコマンドを打ち込む。</p>

<pre><code class="language-brush:plain">set user securedelay=3600  
</code></pre>

<p>設定可能な範囲は 10〜3600秒である。最短の10秒にすると相当の苦行を味わえるが、タイプ速度が上達する効能もある。</p>

<hr>

<h4 id="">非同期ポートのボーレートを変更する</h4>

<p>アラテレ製品では、管理用シリアルコンソールポートを<mark>非同期ポート</mark>と呼称する。初期値は baud=9600なのでこれを変更するには、次のようなコマンドを打ち込む。</p>

<pre><code class="language-brush:plain">set asyn=0 speed=115200

# 以下でも同じ（show conf dynの表示はこちら）
set asyn=asyn0 speed=115200  
</code></pre>

<p>打ち込んだ瞬間に設定が反映されるので、現在正に非同期ポートでログインしている場合は、対向端末側も設定を合わせるまで制御不能になることに注意しよう。</p>

<p>だがこの設定にかかわらず、機器ブート（起動時診断）メッセージは baud=9600固定である。従って動的にボーレートを変更できる端末ソフトを使っていないと思ったより難儀してしまう。結局できるだけ 9600固定で運用するほうがいざというとき慌てずに済むかもしれない。</p>

<p>なお設定内容は <code>show asyn=0</code> で確認できる。</p>

<hr>

<h4 id="ntp">NTPモジュール</h4>

<p>NTP時刻合わせのテンプレを以下に示す。ログ記録に関わるので、機器に IPを付したら真っ先に行う作業だ。</p>

<pre><code class="language-brush:plain"># NTPモジュールを活かして時差を指定する
enable ntp  
set ntp utc=+09:00:00

# peerアドレスは一つだけ書ける
# DNSモジュールを活かしていても FQDNでは指定できない。
add ntp peer=133.243.238.163

# 強制同期
# "ACTIVATE NTP" コマンドではない（そういうものはない）
reset ntp

# ステータス表示
show ntp

# peerアドレスの変更
# "SET NTP PEER"コマンドが存在しないので "DEL"して "ADD"する
# 当然DNSラウンドロビンも出来ないので機器毎にバラけた設定をしたりする
del ntp peer=133.243.238.163  
add ntp peer=133.243.238.164  
</code></pre>

<hr>

<h4 id="l3ppp">L3スイッチでの PPP接続</h4>

<p>L3スイッチでのLAN型PPP接続の例を挙げる。下記は 8948XL、8724SL/8748SLでの場合だ。<sup id="fnref:2"><a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fn:2" rel="footnote">2</a></sup></p>

<pre><code class="language-brush:plain"># Port1をアップリンクポートとして ONU接続に使う
create vlan="PPPoE-FLET" vid=4  
add vlan="4" port=1

# そのポートの中に PPPセッションを張って PPPインタフェースを作る
create ppp=4 over=vlan4-any  
set ppp=4 bap=off iprequest=on username="&lt;ISPアカウント&gt;" password="&lt;パスワード&gt;"  
set ppp=4 over=vlan4-any lqr=off echo=10 

# PPPインタフェースの IPは ISPから貰う
enable ip  
enable ip remote  
add ip int=ppp4 ip=0.0.0.0

# ・・・ことにしつつ、内側のVLANにそのIPを付けて NETMASKを切る
# これがL3スイッチ配下から見たゲートウェイIPになる
add ip int=vlan1 ip=&lt;付与されたグローバルIPのひとつ&gt; mask=255.255.255.248

# デフォルトルートは PPPインタフェースに丸投げする
add ip rou=0.0.0.0 mask=0.0.0.0 int=ppp4 next=0.0.0.0  
</code></pre>

<p>上位への接続は L3ルーティングとなる。設定のミソは本来 PPPインタフェースに付くべき IPを、内側の VLANにつけるところだ。</p>

<p>言うまでもなかろうが、IPが一つしか付与されない端末型接続の PPPでは、NATが使えなければおよそ意味が無い。L3スイッチ系では通常は NAT接続ができないので（ファイアウォールライセンスの購入が別途必須）、その場合はおとなしく ARシリーズを使おう。AR系と 89xx/87xx系の使い分けは、装備された物理ポートの数とNAT機能の有無で、PPPインタフェースの設定については概ね互換性がある。</p>

<hr>

<h4 id="">工場出荷時初期化</h4>

<p>Security Mode 状態から工場出荷時設定へ一気に戻すには次のようにする。AR550S v2.9.2 で確認した。</p>

<pre><code class="language-brush:plain"># 非同期ポート速度を初期値に変更
set asyn=0 speed=9600

# 設定ファイルを読み込まずにコールドスタート
restart router config=none

Warning: Config file MUST add a user with SECURITY OFFICER privilege.  
Do you wish to proceed with restart using specified config?(y/n)

INFO: Initialising Flash File System.  
INFO: Router startup complete

# 規定値ユーザの manager/friend でログイン
login: manager  
Password:

# SECURITY_MODE を切る
disable system security_mode

Warning: This command will disable security mode and delete all security files.  
Are you sure you wish to proceed?(y/n)  y

Info (1034003): Operation successful.

# 起動設定を消して、元の起動設定ファイルを rename あるいは delete fileする
set conf=none  
rename boot.cfg boot-old.cfg  
</code></pre>

<p>見れば解るが、デフォルトの managerユーザは Security Mode を切ることができる。起動設定ファイル（規定値では boot.cfg）を削除して再起動しても同じことだが、Security Mode 状態は設定ファイルと関係なく EEPROM内に保存されているため、これを切る方法を知らないと show confも create confも出来ない。</p>

<p>ところで起動診断時に以下のメッセージの途中で数秒間止まる。そこで "y" を押すと何が起きるだろう？</p>

<pre><code class="language-brush:plain">INFO: Self tests beginning.  
INFO: RAM test beginning.  
PASS: RAM test, 65536k bytes found.  
INFO: Self tests complete.  
INFO: Downloading router software.  
Force EPROM download (Y) ? 

INFO: Initialising Flash File System.  

INFO: Executing configuration script &lt;flash:boot-1.cfg&gt;  
INFO: Router startup complete

AR550S login:  
</code></pre>

<p>答えは「起動設定ファイルは読み込むが、すべてのEnableコマンドを無視する（組み込みモジュールを有効化しない）」である。このため Security Mode は切れて起動するものの、SET USERは通常通り実行されているために SECURITY OFFICERでログインすることが出来ず、かつ managerユーザが設定ファイルから削除もしくはパスワード変更されていたならば、結局は再ログイン手段が得られずに行き詰まる。</p>

<p>ところがここで "y" ではなく "s" を押すとどうなるだろう？<sup id="fnref:3"><a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fn:3" rel="footnote">3</a></sup></p>

<pre><code class="language-brush:plain">Force EPROM download (Y) ?  
INFO: Initial download successful.

INFO: Initialising Flash File System.  


INFO: Router startup complete

 login: 
</code></pre>

<p>ログインプロンプトに "SET SYS NAME" が反映されていなければ成功である。つまり起動設定ファイルを読み込まないで起動できる。こうなれば自動的に managerユーザが復活するので、それでログインして Security Modeを切り、工場出荷時状態に戻してしまえる。</p>

<p>この Undocumentedな挙動は、対応しているいくつかの機種・ファームウェアでのみ可能<sup id="fnref:4"><a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fn:4" rel="footnote">4</a></sup>ですべての機種で可能なわけではない。同じ機種でもファームウェアによっては（Undocumentedなのだから当然だが）そもそも対応していなかったり、GS916M/GS924M に至っては managerユーザは復活するもののパスワードはリセットされない<sup id="fnref:5"><a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fn:5" rel="footnote">5</a></sup>ので、パスワード忘れ事案には対応できない。</p>

<hr>

<div class="footnotes"><ol><li class="footnote" id="fn:1"><p>CentreCOMは開発担当部署によっていくつかの製品グループがある。AR5xxSルータと89xxXL/83xxXLは同族だが、87xxSLはそれより1世代古くて多少性格が異なり、94xxTSと GS9xxMはいずれも全く異なる出自と設計なので似て非なる挙動を示したりする。これらの見分け方というか個性の違いは、見たとおり型番ルールの類似性や（アンドキュメントな）隠し機能の有無、コンソールエラーメッセージの違いに強く現れる。 <a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fnref:1" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:2"><p>8948XLは正式には PPPに対応しておらず Undocumentedなのだが、実際には 8724SL/8748SLと同様の設定と運用ができる。両者の決定的な違いはファイアウォール（NAT機能）追加ライセンスが設定されているか否かだ。だが NAT設定が不要＝LAN型接続であれば、8948XLでも不都合なく設定して運用できる。 <a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fnref:2" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:3"><p>恐らく SKIP の頭文字だ。必ずしもすべてのファームウェアで対応している保証はない。別の一部機種では起動メッセージ中で明示的に "S"と表示しているものもあるが、AR5xxS系の場合はノーヒントである。 <a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fnref:3" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:4"><p>アラテレ製品の場合、パスワード忘れによる工場出荷時初期化は、有償修理対応が原則である。エンドユーザレベルでこれが出来るのは一部機種の隠し機能に限られる。 <a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fnref:4" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:5"><p>GS916M/GS924Mは、パスワードが EEPROMに独立して記録されるため設定ファイルを読み飛ばしても再ログイン可能にはならない。だがこの機種はブートローダー起動中に特定の操作をすると、ブートローダーシェルに入ることができる。そこで EEPROM内容のダンプ＆エディットが不可能でもない。 <a href="http://multix.jp/allied-telesis-centrecom-memorandom/#fnref:5" title="return to article">↩</a></p></li></ol></div>]]></content:encoded></item><item><title><![CDATA[LinuxヘッドレスLiveBoot（CentOS編）]]></title><description><![CDATA[<p>本稿は<a href="http://multix.jp/headless-liveboot-ubuntu/">前稿</a>の CentOS版だ。要件定義はおよそ同じだが、LiveBootの実現方法の違いにより、構築手順は大きく異なる。</p>

<ul class="index"></ul>

<hr>

<h4 id="">要件定義</h4>

<ol>
<li>対象機は x86_64（amd64）とする。  </li>
<li>VGAデバイスは物理的に搭載されていない。GUIも使用しない。よって起動する CentOSはコンソールベースとする。  </li>
<li>BIOSコンソールリダイレクト機能は対象機材でサポートされているものとする。  </li>
<li>シリアルコンソールは baud=115.2kで接続する。<sup id="fnref:1"><a href="http://multix.jp/headless-liveboot-centos/#fn:1" rel="footnote">1</a></sup>  </li>
<li>成果物は ISOイメージとし、CD-R/DVD-Rに焼いて USB-ODDブート（USB光学ドライブ起動）できるものとする。通常は、再起動毎にあらゆる設定や痕跡は完全に忘却される。  </li>
<li>他の Linuxマシンを必要とすることなく、一般的な Windowsマシンから既成の USBインストーラを用いて、USBフラッシュドライブに変換できるものとする。この際 persistent領域を設定できなければならない。  </li>
<li>yum一式を備えている。追加したパッケージや設定は、persistent有効時は維持される。  </li>
<li>既定のログインユーザ名は <em>liveuser</em> とし、パスワードも無しとする。ゆえにパスワード無しで sudoできるものとする。（一般的な</li></ol>]]></description><link>http://multix.jp/headless-liveboot-centos/</link><guid isPermaLink="false">cdc0b430-1ee4-4d3b-b6b8-e9407ad9c019</guid><category><![CDATA[てくにかるむ]]></category><category><![CDATA[Windows]]></category><category><![CDATA[Linux]]></category><category><![CDATA[めもらんだむ]]></category><dc:creator><![CDATA[朝日薫]]></dc:creator><pubDate>Wed, 24 Jun 2015 02:31:27 GMT</pubDate><content:encoded><![CDATA[<p>本稿は<a href="http://multix.jp/headless-liveboot-ubuntu/">前稿</a>の CentOS版だ。要件定義はおよそ同じだが、LiveBootの実現方法の違いにより、構築手順は大きく異なる。</p>

<ul class="index"></ul>

<hr>

<h4 id="">要件定義</h4>

<ol>
<li>対象機は x86_64（amd64）とする。  </li>
<li>VGAデバイスは物理的に搭載されていない。GUIも使用しない。よって起動する CentOSはコンソールベースとする。  </li>
<li>BIOSコンソールリダイレクト機能は対象機材でサポートされているものとする。  </li>
<li>シリアルコンソールは baud=115.2kで接続する。<sup id="fnref:1"><a href="http://multix.jp/headless-liveboot-centos/#fn:1" rel="footnote">1</a></sup>  </li>
<li>成果物は ISOイメージとし、CD-R/DVD-Rに焼いて USB-ODDブート（USB光学ドライブ起動）できるものとする。通常は、再起動毎にあらゆる設定や痕跡は完全に忘却される。  </li>
<li>他の Linuxマシンを必要とすることなく、一般的な Windowsマシンから既成の USBインストーラを用いて、USBフラッシュドライブに変換できるものとする。この際 persistent領域を設定できなければならない。  </li>
<li>yum一式を備えている。追加したパッケージや設定は、persistent有効時は維持される。  </li>
<li>既定のログインユーザ名は <em>liveuser</em> とし、パスワードも無しとする。ゆえにパスワード無しで sudoできるものとする。（一般的な LiveBootの流儀）  </li>
<li>既定のネットワーク設定・接続はオフとする。  </li>
<li>これらのパスワードやネットワーク設定は persistent有効時には自由に設定変更して永続化することができ、再起動しても設定内容が失われてはならない。</li>
</ol>

<p>以後は CentOS-7-x86_64-LiveCD-1503.iso をベースにして話を進める。32bit版や CentOS-6でも同様の手順で構築できる。<sup id="fnref:2"><a href="http://multix.jp/headless-liveboot-centos/#fn:2" rel="footnote">2</a></sup></p>

<p>Ubuntuでは最終的な rootfsを作るのにオンメモリ（2GiB程度）で作業できたが、CentOS用の rootfsを作成するには作業領域が足りないため、起動用 USBメモリの他に Ext4でフォーマットできるフラッシュドライブや HDDを別途用意しなければならない。なお最終的に出来上がるブータブルイメージは CD-Rに充分格納できるサイズ（640MiB以下）になる。</p>

<p>なお製作時のリファレンス機材には Riava RS670A を使用した。<sup id="fnref:3"><a href="http://multix.jp/headless-liveboot-centos/#fn:3" rel="footnote">3</a></sup></p>

<hr>

<h4 id="usb">シリアルコンソール対応のインストーラUSBメモリを作る</h4>

<p>まずヘッドレス環境で使用できる CentOSインストーラを LiveCD ISOイメージから作成する。Windows上でこれを行うには Fedora LiveUSB Creator<sup id="fnref:4"><a href="http://multix.jp/headless-liveboot-centos/#fn:4" rel="footnote">4</a></sup>を使用する。</p>

<p><img src="http://multix.jp/content/images/2015/06/2015-06-24-11-56-53.png" alt=""></p>

<p>次に起動メニューを書き換える。LiveUSB Creatorが作成したベースファイルからの相違点はシリアルコンソール設定の追加が主だ。</p>

<pre><code class="language-brush:plain gutter:true title:/syslinux/syslinux.cfg （フラッシュドライブ起動用）">#serial 0 115200
#console 0

default vesamenu.c32  
timeout 100  
menu background  
menu autoboot Starting CentOS Linux 7 in # second{,s}. Press any key to interrupt.

menu clear  
menu title CentOS Linux 7  
menu vshift 4  
menu rows 12  
menu margin 8  
menu helpmsgrow 15  
menu tabmsgrow 13

menu tabmsg Press Tab for full configuration options on menu items.  
menu separator  
menu separator  
label linux0  
  menu label ^Start CentOS Linux 7 Live
  kernel vmlinuz0
  append initrd=initrd0.img root=live:CDLABEL=LIVE rootfstype=vfat ro rd.live.image quiet rd.luks=0 rd.md=0 rd.dm=0 console=tty0 console=ttyS0,115200n8
  menu default
menu separator  
menu begin ^Troubleshooting  
  menu title Troubleshooting
label check0  
  menu label ^Test this media &amp; start CentOS Linux 7 Live
  kernel vmlinuz0
  append initrd=initrd0.img root=live:CDLABEL=LIVE rootfstype=vfat ro rd.live.image quiet rd.luks=0 rd.md=0 rd.dm=0 rd.live.check console=tty0 console=ttyS0,115200n8
menu separator  
label local  
  menu label Boot from ^local drive
  localboot 0xffff
menu separator  
label returntomain  
  menu label Return to ^main menu.
  menu exit
menu end  
</code></pre>

<p>このフラッシュドライブで、Troubleshootingサブメニュー内の <strong>Test this media &amp; start CentOS Linux 7 Live</strong> を選んで起動しよう。しばらく待っているとログインプロンプトが出現する。ここからは <code>root[ENTER]</code>で rootシェルに入ることが出来る。</p>

<hr>

<h4 id="rootfs">rootfsを作成する</h4>

<p>この時点で NetworkManager は起動しているので DHCPでのIP取得は既に済んでいるだろう。作業に必要なパッケージを yumで追加する。</p>

<pre><code class="language-brush:bash">LANG=C  
yum install -y squashfs-tools  
</code></pre>

<p>作業用の追加ドライブを接続してパーテションをフォーマットし、<code>/mnt</code>にマウントしてそこに移動する。ここでは <code>/dev/sdb1</code>とする。</p>

<pre><code class="language-brush:bash">mkfs.ext4 /dev/sdb1  
mount /dev/sdb1 /mnt  
cd /mnt  
</code></pre>

<p>起動時のフラッシュドライブは <code>/run/initramfs/live</code>に ReadOnlyでマウントされているので、これを rwオプションでリマウントして書き換え可能にする。</p>

<pre><code class="language-brush:bash">mount -o rw,remount /run/initramfs/live  
cd /run/initramfs/live  
</code></pre>

<p>現在起動している rootfsの実体は <code>/run/initramfs/live/LiveOS/squashfs.img</code>だ。このファイルを差し替えるのが最終目的だが、これは <code>LiveOS/ext3fs.img</code>という loopbackファイルを squashfsで圧縮した構造になっている。そこでこれを以下のようにして再現する。rootfs容量はここでは8GiBとするが、適宜任意のサイズに変えても良い。</p>

<pre><code class="language-brush:bash">mkdir -p squashfs-root/LiveOS  
truncate -s $((2**33)) squashfs-root/LiveOS/ext3fs.img  
mkfs.ext4 -L _CentOS-7-livecd squashfs-root/LiveOS/ext3fs.img  
</code></pre>

<p>このファイルを loopbackマウントして /mnt/chrootでアクセスできるようにする。</p>

<pre><code class="language-brush:bash">mkdir /mnt/chroot  
mount -o loop squashfs-root/LiveOS/ext3fs.img /mnt/chroot/  
</code></pre>

<p>後は yumのグループインストールコマンド一発で、任意の新しい rootfs環境が構築できる。</p>

<pre><code class="language-brush:bash">yum --installroot=/mnt/chroot --releasever=7 -y groupinstall Core  
</code></pre>

<p>releaseverオプションに指定する CentOSのバージョンは、<code>/etc/os-release</code>ファイルを参照すると良い。</p>

<hr>

<h4 id="rootfs">rootfsの環境設定</h4>

<p>まず各システム領域を chroot内に bindマウントする。そしてダミーの <code>/etc/fstab</code>（中身は空でも良い）を作成しておく。</p>

<pre><code class="language-brush:bash">mount -o bind /dev/ chroot/dev/  
mount -o bind /proc/ chroot/proc/  
mount -o bind /tmp/ chroot/tmp/  
mount -o bind /run/ chroot/run/  
touch chroot/etc/fstab  
</code></pre>

<p>initramfsの構築設定ファイルを追加する。これは LiveBoot可能な initramfsを作成するのに必須の設定だ。</p>

<pre><code class="language-brush:plain title:chroot/etc/dracut.conf.d/01-liveos.conf">hostonly="no"  
add_dracutmodules+="dmsquash-live"  
compress="xz"  
</code></pre>

<p>現在起動している LiveCDシステムの、livesysサービスファイルを chroot内にコピーしてサービス登録する。このサービスは初回起動時に <em>liveuser</em>アカウントの作成や rootパスワードの削除処理を行うようになっている。<sup id="fnref:5"><a href="http://multix.jp/headless-liveboot-centos/#fn:5" rel="footnote">5</a></sup></p>

<pre><code class="language-brush:bash">cp -p /etc/init.d/livesys* chroot/etc/init.d/  
chroot chroot/ chkconfig --add livesys  
chroot chroot/ chkconfig --add livesys-late  
</code></pre>

<p>タイムゾーンとロケール情報を設定し、NetworkManagerが初回起動時は起動しないように修正する。</p>

<pre><code class="language-brush:bash">ln -sf ../usr/share/zoneinfo/Asia/Tokyo chroot/etc/localtime

echo "LANG=en_US.utf8" &gt; chroot/etc/locale.conf

chroot chroot /usr/bin/systemctl disable NetworkManager  
</code></pre>

<hr>

<h4 id="linuxkernel">Linux kernelモジュールの組み込み</h4>

<p>kernelと、その他の追加パッケージをインストールする。</p>

<pre><code class="language-brush:bash">yum --installroot=/mnt/chroot -y install kernel squashfs-tools dump isomd5sum epel-release  
</code></pre>

<p>kernelと作成された initramfsを、フラッシュドライブに移動する。rescue関係のファイルは必要ないので削除する。</p>

<pre><code class="language-brush:bash">rm -f chroot/boot/*rescue*  
mv chroot/boot/vmlinuz-* /run/initramfs/live/syslinux/vmlinuz0.new  
mv chroot/boot/initramfs-* /run/initramfs/live/syslinux/initrd0.img.new  
</code></pre>

<p>最後にクリーンアップを行ってアンマウントする。rootfsの umount後は fsckで損傷がないかチェックする。</p>

<pre><code class="language-brush:bash highlight:[9]">yum --installroot=/mnt/chroot clean all  
find chroot/var/log -type f -exec /bin/truncate -s0 {} \;  
umount chroot/proc/  
umount chroot/dev/  
umount chroot/run/  
umount chroot/tmp/

du -sh chroot/  
720M    chroot/

umount chroot/  
fsck.ext4 squashfs-root/LiveOS/ext3fs.img  
</code></pre>

<hr>

<h4 id="squashfsimg">squashfs.img ファイルの作成</h4>

<p>こうして出来た rootfsを mksquashfsで圧縮すれば、LiveBoot可能な新しいシステムファイルになる。ただし Ext4フォーマットした loopbackファイルをそのまま圧縮するため、インストール過程で生じた削除ファイルの痕跡などもそのまま残っていて圧縮率が低下してしまう。</p>

<pre><code class="language-brush:bash highlight:[4]">mksquashfs squashfs-root squashfs.img.new

ls -lh squashfs.img.new  
-rw-r--r--. 1 root root 474M Jun 24 08:21 squashfs.img.new
</code></pre>

<p>これを可能な限り取り除いて圧縮するには、dump/restoreコマンドを経由してファイルシステムを完全に作り直すとよい。ただし dumpコマンドはブロックデバイスしか扱えないので、losetupコマンドを用いて /dev/loopX に loopbackファイルをバインドして指定する。手順は面倒だが、比較するとその効果は絶大だ。</p>

<pre><code class="language-brush:bash highlight:[11,26,27]">mv squashfs.img.new squashfs.img.nev

yum install -y dump

loopdev=$(losetup -f)  
losetup $loopdev squashfs-root/LiveOS/ext3fs.img  
dump -0z9 -f rootdump $loopdev  
losetup -d $loopdev

ls -lh rootdump  
-rw-r--r--. 1 root root 277M Jun 24 08:30 rootdump

rm -f squashfs-root/LiveOS/ext3fs.img  
truncate -s $((2**33)) squashfs-root/LiveOS/ext3fs.img  
mkfs.ext4 -L _CentOS-7-livecd squashfs-root/LiveOS/ext3fs.img

mount -o loop squashfs-root/LiveOS/ext3fs.img chroot  
(cd chroot/; restore -r -f ../rootdump)
rm -fr chroot/lost+found restoresymtable  
umount chroot

fsck.ext4 squashfs-root/LiveOS/ext3fs.img  
mksquashfs squashfs-root squashfs.img.new

ls -lh squashfs.img.ne?  
-rw-r--r--. 1 root root 474M Jun 24 08:21 squashfs.img.nev
-rw-r--r--. 1 root root 250M Jun 24 08:38 squashfs.img.new

cp squashfs.img.new /run/initramfs/live/LiveOS/  
</code></pre>

<hr>

<h4 id="rootfs">新 rootfsでの起動テスト</h4>

<p>こうして作成した rootfsファイルをブートUSBメモリにコピーして shutdownし、Windows（あるいは他のLinux機）で以下の起動用ファイルを差し替える。</p>

<ul>
<li>vmlinuz0.new を syslinux/vmlinuz0 へ</li>
<li>initrd0.img.new を syslinux/initrd0.img へ</li>
<li>squashfs.img.new を LiveOS/squashfs.img へ</li>
</ul>

<p>syslinux/syslinux.cfg は前述のそのままでよいが、今度の起動は通常の <strong>Start CentOS Linux</strong>ラベルを選択する。ログイン・プロンプトは <em>root</em>で直接、あるいは <em>liveuser</em>（いずれもパスワード無し）でシェルに入れる。<em>liveuser</em>アカウントは sudoで <em>root</em>アカウントになれる。</p>

<p><img src="http://multix.jp/content/images/2015/06/2015-06-24-16-47-35.png" alt=""></p>

<p>NetworkManagerは停止状態なので、ネットワークに接続するには dhclientで Link Upするか、nmcli/nmtuiでインタフェース設定を行って NetworkManagerを起動する。</p>

<pre><code class="language-brush:bash">sudo -s

systemctl enable NetworkManager  
systemctl start NetworkManager

nmcli connection modify enp2s0 ipv4.method manual ipv4.addresses 192.168.240.101/24 ipv4.gateway 192.168.240.1 ipv4.dns 8.8.8.8

systemctl restart network.service

# cat /etc/sysconfig/network-scripts/ifcfg-enp2s0
</code></pre>

<hr>

<h4 id="iso">ISOイメージを作成する</h4>

<p>元の ISOの squashfs.img等を差し替えた、新しいISOイメージを作成する。まず作業に必要なパッケージをインストールし、作業領域に ISO内のファイルを展開して ReadOnlyを外す。</p>

<pre><code class="language-brush:bash">mount /dev/sdb1 /mnt  
cd /mnt

# install mkisofs tools
yum install -y mkisofs isomd5sum

# mount image: CentOS-7-x86_64-LiveCD-1503.iso
mkdir loop  
mount /dev/cdrom loop

# copy iso files and modify attributes
cp -rf loop files  
chmod -R +w files/  
umount loop  
</code></pre>

<p>フラッシュドライブから先に作成した新しいシステムファイルをコピーする。このときフラッシュドライブ上では <code>/syslinux</code>に vmlinuz0と initrd0.img ファイルが置かれているが、ISOイメージでは <code>/isolinux</code>ディレクトリになる。<sup id="fnref:6"><a href="http://multix.jp/headless-liveboot-centos/#fn:6" rel="footnote">6</a></sup></p>

<pre><code class="language-brush:bash"># copy kernel and filesystem
cp -f /run/initramfs/live/syslinux/vmlinuz0 files/isolinux/  
cp -f /run/initramfs/live/syslinux/initrd0.img files/isolinux/  
cp -f /run/initramfs/live/LiveOS/squashfs.img files/LiveOS/  
</code></pre>

<p>files/isolinux/isolinux.cfg をシリアルコンソール対応に修正する。最初のシリアルポート設定は BIOSコンソールリダイレクトの有無による。また先に作成した rootfsは SELinuxをサポートするように構築してはいないので、これを無効にする。<code>isolinux/mt86plus</code>については標準では存在しないが、これについては<a href="http://multix.jp/buildup-memtest-headless/">別稿を参照</a>されたい。</p>

<pre><code class="language-brush:plain gutter:true title:isolinux/isolinux.cfg （ODD起動用）">#serial 0 115200
#console 0

default vesamenu.c32  
timeout 100  
menu background  
menu autoboot Starting CentOS Linux 7 in # second{,s}. Press any key to interrupt.

menu clear  
menu title CentOS Linux 7  
menu vshift 4  
menu rows 12  
menu margin 8  
#menu hidden
menu helpmsgrow 15  
menu tabmsgrow 13

menu tabmsg Press Tab for full configuration options on menu items.  
menu separator  
menu separator  
label linux0  
  menu label ^Start CentOS Linux 7 Live
  kernel vmlinuz0
  append initrd=initrd0.img root=live:CDLABEL=CentOS7-liveboot rootfstype=auto ro rd.live.image quiet rd.luks=0 rd.md=0 rd.dm=0 selinux=0 console=tty0 console=ttyS0,115200n8
  menu default
menu separator  
menu begin ^Troubleshooting  
  menu title Troubleshooting
label check0  
  menu label ^Test this media &amp; start CentOS Linux 7 1503 Live
  kernel vmlinuz0
  append initrd=initrd0.img root=live:CDLABEL=CentOS7-liveboot rootfstype=auto ro rd.live.image quiet rd.luks=0 rd.md=0 rd.dm=0 rd.live.check selinux=0 console=tty0 console=ttyS0,115200n8 
label memtest  
  menu label Test ^memory
  kernel mt86plus
  append console=ttyS0,115200n8
menu separator  
label local  
  menu label Boot from ^local drive
  localboot 0xffff
menu separator  
label returntomain  
  menu label Return to ^main menu.
  menu exit
</code></pre>

<p>mkisofsコマンドで ISOイメージを作成する。ここではもっともシンプルなオプション構成として GRUB（gfxboot）や EFI対応、Macintosh対応は行ってはいない。注意が必要なのは -Vオプションに渡すCDラベルで、これは kernel起動オプションに記述したのと同じものでなければならない。またこのラベルは最大16文字なのでこれを超えないようにしよう。</p>

<pre><code class="language-brush:bash">find ./files -print | xargs touch -m {} \;  
LANG=C mkisofs -r -J -l \  
  -V CentOS7-liveboot \
  -cache-inodes \
  -b isolinux/isolinux.bin \n
  -c isolinux/boot.cat \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  -o CentOS7-liveboot.iso \
  ./files
</code></pre>

<p>こうして出来た ISOイメージに、それ自体の改竄検出 MD5チェックサムを implantisomd5コマンドで埋め込む。Ubuntuではファイル単位で MD5をチェックしていたが、CentOSではメディアそのものをチェックする。従ってフラッシュドライブではこの仕組は動かない。一方で CD-R等に焼いた際に Write Errorが有っても、メディアの完全性を確認することが出来る。<sup id="fnref:7"><a href="http://multix.jp/headless-liveboot-centos/#fn:7" rel="footnote">7</a></sup></p>

<pre><code class="language-brush:bash">LANG=C implantisomd5 CentOS7-liveboot.iso  
</code></pre>

<p>改竄チェックは checkisomd5コマンドで行える。引数には調べたい ISOファイルか、メディアを挿れた ODDのデバイスファイルを指定すればよい。なお implantisomd5と checkisomd5コマンドは、isomd5sumパッケージに含まれている。<sup id="fnref:8"><a href="http://multix.jp/headless-liveboot-centos/#fn:8" rel="footnote">8</a></sup></p>

<pre><code class="language-brush:bash">checkisomd5 CentOS7-liveboot.iso  
checkisomd5 /dev/cdrom  
</code></pre>

<hr>

<h4 id="cdrwdvdrwiso">CD-RW/DVD-RWに ISOイメージを焼く</h4>

<p>光学メディアへのライティングは、Ubuntuとおなじく wodimコマンドで行える。</p>

<pre><code class="language-brush:bash">yum install -y wodim

# erase CD/DVD-RW media
wodim dev=/dev/sr0 blank=fast

# writing image
wodim -sao -eject dev=/dev/sr0 CentOS7-liveboot.iso

# check image
checkisomd5 /dev/sr0  
</code></pre>

<p>こうして作成した光学メディアで ODDブートが正常に行えたら、<em>Test this media &amp; start CentOS</em>ラベルで起動してみよう。検査が正常に終了するとログイン・プロンプトに進み、失敗した場合は System Haltするはずだ。<sup id="fnref:9"><a href="http://multix.jp/headless-liveboot-centos/#fn:9" rel="footnote">9</a></sup></p>

<hr>

<h4 id="persistent">persistentモードを設定する</h4>

<p>前述の ISOイメージ/光学メディアで ODDブートが正常に行えたなら、次はその ISOイメージを Live USB Creatorでもって、今度は persistent領域を設定したフラッシュドライブを作成しよう。</p>

<p>persistentモードは kernelオプションの <code>rd.live.overlay=LABEL=LIVE</code>によって有効になる。initramfsは指定された LABELを blkidコマンドで探し、これを <code>/run/initramfs/live/</code>にマウントする。persistent領域ファイルは <code>LiveOS</code>ディレクトリ内の <code>overlay-${LABEL}-${UUID}</code>というファイル名で探して、Device Mapperによって snapshotとして <code>/</code>に結合される。これ自体は初期状態では（ファイルシステムではないので）単なる Zero Fillファイルである。</p>

<pre><code class="language-brush:bash highlight:[2,5,8,9,10,11]">blkid -L LIVE  
/dev/sda1

blkid /dev/sda1  
/dev/sda1: LABEL="LIVE" UUID="0621-6D9B" TYPE="vfat" 

ls -l /run/initramfs/live/LiveOS/  
total 1299100  
-rwxr-xr-x 1 root root      20480 Jun 26 05:26 osmin.img
-rwxr-xr-x 1 root root 1068498944 Jun 30 12:32 overlay-LIVE-0621-6D9B
-rwxr-xr-x 1 root root  261758976 Jun 30 08:26 squashfs.img
</code></pre>

<p>Ubuntuと異なり、Device Mapperを使用しているためもあって実際にあとどの程度データが書き込めるか（保存できるか）は dfコマンドでは判断することができない。dmsetupコマンドの statusサブコマンドで、live-rwボリュームの snapshot消費ブロック数（512byte単位）を知ることはできるから、これを利用するしかない。</p>

<pre><code class="language-brush:bash highlight:[2,5]">dmsetup status live-rw  
0 16777216 snapshot 14960/2086912 72

echo | awk '{print 14960/2086912}'  
0.00716849  
</code></pre>

<p>また Ubuntuの場合は、persistentファイルは overlayfsで重ねられた独立したファイルシステムであったから、非起動状態のフラッシュドライブから persistent領域内のファイルを抜き出すことは容易だったが、CentOSではこれは容易なことではない。</p>

<p>（現在起動しているのとは別の）フラッシュドライブ内の persistent領域にアクセスするには、以下のようにする。</p>

<pre><code class="language-brush:bash highlight:[15,23,28]">## 作業領域の準備

cd /mnt  
mkdir media squash rootfs

## フラッシュドライブを作業領域にマウントし、その中の squashfs.imgをマウントする

mount /dev/sdc1 media  
mount -o loop media/LiveOS/squashfs.img squash

## ext3fs.img（readonly）と overlayファイルに loopbackデバイスを割り当てる
## 空きデバイス名は losetup -fで得られる

losetup -f  
/dev/loop6

losetup /dev/loop6 squash/LiveOS/ext3fs.img -r  
losetup /dev/loop7 edia/LiveOS/overlay-LIVE-0621-6D9B

## ふたつのデバイスを束ねて rootfsを再生する

blockdev -q --getsz /dev/loop6  
16777216

dmsetup create live-rootfs --table "0 16777216 snapshot /dev/loop6 /dev/loop7 P 8"

dmsetup status live-rootfs  
0 16777216 snapshot 17312/2086912 80

## あとはfsckしたり・・・

fsck -f -y /dev/mapper/live-rootfs

## dumpしたり・・・
## （squashfs.img作成以後分だけを抜き出すのに /etc/dumpdatesを利用する例）

echo "/dev/mapper/live-rootfs 0 $(LANG=C \  
  date +"%a %b %d %X %z" \
    -r media/syslinux/ldlinux.sys)" &gt;&gt; /etc/dumpdates
dump -u1z9 /dev/mapper/live-rootfs -f rootfsdump

## mountしたり・・・

mount /dev/mapper/live-rootfs rootfs  
ls -a rootfs/home/liveuser

## 作業を終えたら後始末してフラッシュドライブを切り離す

umount rootfs  
dmsetup remove live-rootfs  
losetup -d /dev/loop6  
losetup -d /dev/loop7  
umount squash  
umount media  
rmdir media squash rootfs  
</code></pre>

<hr>

<h4 id="homeswap">/homeや swapパーテションを設定する</h4>

<p><code>/etc/init.d/livesys</code>を覗いてみると解る<sup id="fnref:10"><a href="http://multix.jp/headless-liveboot-centos/#fn:10" rel="footnote">10</a></sup>が、フラッシュドライブの <code>/LiveOS</code>ディレクトリに、<code>home.img</code>ファイルがあれば <code>/home</code>に、swap.imgファイルが有れば <code>swap</code>に、それぞれ自動的にマウントするようになっている。これらのボリュームファイルは以下のようにセットアップする。</p>

<pre><code class="language-brush:bash highlight:[22,23,24,25,26,27,28,32,33,34]">## persistentオフの場合はフラッシュドライブを rwリマウントする 
mount -o rw,remount /run/initramfs/live

## 保存領域へcd
cd /run/initramfs/live/LiveOS

## home.img ボリュームの作成（サイズは適宜）
truncate -s $((2**31)) home.img  
mkfs.ext4 -L "home-vol" home.img

## swap.img ボリュームの作成（サイズは適宜）
truncate -s $((2**31)) swap.img  
mkswap -L "swap-vol" swap.img

## あとは特に設定変更もなく再起動するだけ
sync;sync;sync  
reboot

## homeボリュームの有無は losetupで確認できる
## 容量は dfコマンドで把握可能
losetup  
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE  
/dev/loop0         0      0         0  1 /osmin.img (deleted)
/dev/loop1         0      0         0  1 /osmin
/dev/loop2         0      0         0  1 /run/initramfs/live/LiveOS/squashfs.img
/dev/loop3         0      0         0  1 /LiveOS/ext3fs.img
/dev/loop4         0      0         0  0 /LiveOS/overlay-LIVE-748B-70C6
/dev/loop5         0      0         0  0 /run/initramfs/live/LiveOS/home.img

## swapは freeコマンドで容量が確認できる
free  
              total        used        free      shared  buff/cache   available
Mem:        8162140      178452     7610852       16720      372836     7767880  
Swap:        262136           0      262136
</code></pre>

<hr>

<h4 id="">ダウンロード</h4>

<p><a href="https://secure.multix.jp/download/SerialLive/CentOS7-liveboot-20150703.iso">CentOS7-liveboot-20150703.iso</a> 313MiB (<a href="https://secure.multix.jp/download/SerialLive/CentOS7-liveboot-20150703.iso.md5">md5sum</a>)</p>

<hr>

<div class="footnotes"><ol><li class="footnote" id="fn:1"><p>USBシリアル変換は FTDI系を前提にしている。PL2303系（特にノーブランドのコピー品）は baud=115.2kではFIFOバッファが足りずに通信不具合が多発してトラブルのもとになる。 <a href="http://multix.jp/headless-liveboot-centos/#fnref:1" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:2"><p><a href="https://www.centos.org">centos.org</a> <a href="http://multix.jp/headless-liveboot-centos/#fnref:2" title="return to article">↩</a></p></li>

<li class="footnote" id="fn:3"><p><a href="http://store.shopping.yahoo.co.jp/riava/rs670-s16a.html">Riava RS670A</a> 基本スペックは Intel Gigabit NICx6を持つ Intel/Atom C2758 でメモリ8GiB。基本OSは CentOSまたはUbuntu。SSD内蔵だがこれはここでは使用しない（壊さない）。なおフロントパネルのシリアルコンソールポート（COM0）はCisco互換配線（<a href="http://yos