現在位置: ホーム Documents 起動イメージの変更・Aboot

起動イメージの変更・Aboot

起動イメージの変更・イメージの修正・Aboot によるレスキュー操作 / Change boot image, Modify image, rescue operation by Aboot

(verified 2010 Aug. / EOS 4.4.0 / DCS-7120T-4S 03.01)

起動イメージ

Arista の起動イメージは本体に内蔵されたフラッシュメモリ中にあり、 内容を CLI から dir コマンドで確認できる。EOS-4.4.0.swi などといった名前のファイルが起動イメージである。

localhost#dir flash:
Directory of flash:/

-rwx 161174379 Jan 26 08:20 EOS-4.3.0.swi
-rwx 188621783 Aug 12 11:29 EOS-4.4.0.swi
-rwx 25 Aug 24 17:17 boot-config
-rwx 16 Jul 22 01:23 boot-extensions
drwx 4096 Aug 24 19:56 persist
-rwx 1510 Aug 17 18:29 startup-config

1864572928 bytes total (1137016832 bytes free)
localhost#

このフラッシュメモリの内容は /mnt/flash/ ディレクトリ以下にマウントされているので、bash を起動して ls /mnt/flash/ するなりしても良い。

起動イメージの変更

バージョンアップを含めて、異なるEOSのイメージで起動させたい場合があるだろう。下記のように configure モードで boot system コマンドを用いて行う。この boot コマンドは次に起動するための起動イメージをセットするだけで、実際に再起動をするわけではない。

localhost>enable
localhost#configure
localhost(config)#boot system flash:EOS-?
flash:EOS-4.3.0.swi flash:EOS-4.4.0.swi

localhost(config)#boot system flash:EOS-4.4.0.swi
localhost(config)#

確認

show boot-config コマンドによって、次回に使われてるイメージの名前を調べることができる。

localhost#show boot-config 
Software image: flash:/EOS-4.4.0.swi
Console speed: (not set)
Aboot password (encrypted): (not set)
localhost#

実際には /mnt/flash/boot-config ファイルを表示している。つまり boot system コマンドは具体的にはこのファイルの内容を更新する。

localhost#bash

Arista Networks EOS shell

[admin@localhost ~]$ cat /mnt/flash/boot-config
SWI=flash:/EOS-4.4.0.swi
[admin@localhost ~]$

 

イメージの修正・再作成

イメージは SWI フォーマットでパッケージされており、これを展開して内容を変更し、再度パッケージすればオリジナルの修正されたイメージでシステムを起動することができる。

 

(現在実験中です。なぜかうまくいきません。)

 

RPM による追加インストールをシステムの他の部分との衝突なしに行えるような場合は Extension による機能拡張が適しているが、システムの多くの部分を変更するような場合はイメージを更新してしまう方が良い場合があり得る。ただ、ユーザが加工した独 自のシステムを用いている場合の動作上の不具合いなどはそれが Arista 本来のシステム由来のものなのか、あるいは修正した部分と関連するものなのか切り分けるのは困難であり、Arista や代理店、インテグレータからのサポートが得られなくなる可能性がある点に注意されたい。

rc.eos による簡易なシステム変更

幾つかのファイルを置き換えるだけ、といった小規模な変更であれば、rc.eos スクリプトファイルによる方法が便利かも知れない。以下にその方法を示す。

EOS のセットアップ経路

システムの起動は通常の Linux システムをベースにしており、EOS の起動(セットアップ)は下記の経路で行われる。

  1. Extension が展開・インストールされる
  2. runlevel が 5 に上がり、/etc/rc.d/init.d のスクリプト群が起動されていく。
  3. /etc/rc.d/rc5.d/S07EosStage1 (/etc/rc.d/init.d/EosStage1 へのリンク)が起動され、
  4. そこで /usr/bin/EosInit --stage 1 が実行される。
  5. /usr/bin/EosInit は一連の処理のあとに /mnt/flash/rc.eos があればそれを実行する。
  6. 続いて /etc/rc.d/rc5.d の各ファイルを実行し、そのうちに S51EosStage2 を実行する。
  7. S51EosStage2 は /etc/rc.d/init.d/EosStage2 へのリンクであり、
  8. そこで /usr/bin/EosInit --stage 2 が実行される。

そのため、/mnt/flash/rc.eos シェルスクリプトファイルに必要な処理を追加し、手軽にシステムに機能を追加することが可能である。機能追加の実験などに有用であろう。

rc.eos の使用例

以下に hello コマンドを実現する HelloCli.py ファイルを CLI プラグインディレクトリに追加する例を示す。(HelloCli.py の詳細、mount -o rw の意味については「コマンドの追加」を参照)

bash-3.2# cat /mnt/flash/rc.eos 
#!/bin/sh
mount -o rw,remount /
cp /mnt/flash/HelloCli.py /usr/lib/python2.5/site-packages/CliPlugin/
mount -o ro,remount /
echo "rc.eos was executed."
bash-3.2#
起動すると、/var/log/EosInit にログが出力される。
bash-3.2# pwd
/var/log
bash-3.2# cat EosInit
rc.eos was executed.
Starting stage 1 EOS initialization
Starting stage 2 EOS initialization
bash-3.2#
(ここで rc.eos was executed. 行が Starting stage1 ... より前方にある理由は良く分からない)

/persist ディレクトリ

rc.eos などから利用しやすいディレクトリとして /persist ディレクトリが用意されている。/persist ディレクトリ以下には local と sys の二つのディレクトリがあり、それぞれのディレクトリ以下に特権ユーザ(あるいは eosadmin グループ権限のあるユーザ)から直接書き込める。書き込んだファイルの内容は次回の reboot でも維持され、rc.eos が読み込まれる時点ではアクセス可能な状態で用意される。

つまりAristaでは /usr 以下など通常のディレクトリは一般に read only mount されているのに対して、/persist は read write モードでマウントされており、また通常のディレクトリは reboot によって初期状態に戻されるのに対して、/persist はその内容が保持され、復元されるのである。

mount コマンドを実行すれば、その最後の行に /persist ディレクトリが tmpfs として read write モードでマウントされていることを確認できる。

bash-3.2# mount
....
tmpfs on /persist type tmpfs (rw,size=411116k)
bash-3.2#

さて、初期状態では /persist/local 以下は空、/persist/sys 以下には SSH のキーが見えるだろう。

bash-3.2# pwd
/persist
bash-3.2# ls -l
total 0
drwxrwxrwx 2 root root 40 Jan 8 2010 local
drwxrwxrwx 2 root root 160 Jan 8 2010 sys
bash-3.2# ls -l local
total 0
bash-3.2# ls -l sys
total 24
-rw------- 1 root root 672 Jan 8 2010 ssh_host_dsa_key
-rw-r--r-- 1 root root 590 Jan 8 2010 ssh_host_dsa_key.pub
-rw------- 1 root root 963 Jan 8 2010 ssh_host_key
-rw-r--r-- 1 root root 627 Jan 8 2010 ssh_host_key.pub
-rw------- 1 root root 1675 Jan 8 2010 ssh_host_rsa_key
-rw-r--r-- 1 root root 382 Jan 8 2010 ssh_host_rsa_key.pub
bash-3.2#

sys ディレクトリはシステムが何かに使う可能性があるため、一般には local ディレクトリ以下を使うことになる。/usr/local と同様に、local ディレクトリ以下にプロダクトごとのディレクトリを一段作成しておくのが良いだろう。

例えば上に示した HelloCli.py は /persist/local/Hello 以下に保存し、rc.eos の当該行を以下のようにしておく、といった格好である。

cp /persist/local/Hello/HelloCli.py /usr/lib/python2.5/site-packages/CliPlugin/

この方が見た目がすっきりして良い。

/persist ディレクトリの実体

ところで /persist ディレクトリの内容は /mnt/flash/persist 以下に保存される。ただし /mnt/flash/persist 以下の local, sys ファイルは共にディレクトリではなく単一のファイルである。その実体は cpio ファイルであり、/persist ディレクトリは起動時にこれを展開して作成される。またシステム稼働中は inotifyrun デーモン(Pythonプログラム)によって、更新が反映されるようになっている。(ps -efw | grep inotifyrun などして確認できる)

bash-3.2# pwd
/persist
bash-3.2# ls -l /mnt/flash/persist/
total 20
-rwxrwx--- 1 root eosadmin 5120 Aug 24 19:56 local
-rwxrwx--- 1 root eosadmin 10240 Aug 24 19:56 sys
bash-3.2#

以下に /persist/local 以下にファイルを一つ作成(touch)した場合を示す。/mnt/flash/persist/local ファイルの更新日付が変更されている点に注目。

bash-3.2# touch local/test1
bash-3.2# date
Tue Aug 25 18:37:01 UTC 2009
bash-3.2# ls -l /mnt/flash/persist/
total 20
-rwxrwx--- 1 root eosadmin 5120 Aug 25 18:36 local
-rwxrwx--- 1 root eosadmin 10240 Aug 24 19:56 sys
bash-3.2#

試みに sys ファイルに含まれるファイルの一覧を cpio コマンドで確認する。

bash-3.2# cpio -itv < /mnt/flash/persist/sys 
drwxrwxrwx 2 root root 0 Jan 8 2010 .
-rw-r--r-- 1 root root 590 Jan 8 2010 ./ssh_host_dsa_key.pub
-rw------- 1 root root 672 Jan 8 2010 ./ssh_host_dsa_key
-rw-r--r-- 1 root root 382 Jan 8 2010 ./ssh_host_rsa_key.pub
-rw------- 1 root root 1675 Jan 8 2010 ./ssh_host_rsa_key
-rw-r--r-- 1 root root 627 Jan 8 2010 ./ssh_host_key.pub
-rw------- 1 root root 963 Jan 8 2010 ./ssh_host_key
12 blocks
bash-3.2#  

ユーザがインストールした各種デーモンプログラムの設定ファイルなどはこの /persist ディレクトリを利用すると良いだろう。

 

Aboot

システムの起動は Aboot によって行われる。いわゆるブートローダの役割を果たしているが、Aboot はそれ自体が小さな Linux システムであり、そこで通常のシステムメンテナンスのためのコマンドが利用できる。

これを利用して(実験的なシステム修正の結果) EOS が正しく起動できなかった場合でも元のオリジナルの OS イメージに戻すといったレスキュー作業が可能である。

Aboot プロンプトの呼び出し

シリアルコンソールに端末を接続し、システムを起動すると以下のような画面表示になるだろう。

(シリアルポートは 9600bps, 8bit, no-parity で設定する)

Aboot 1.9.7-196993.EOS430Beta

Press Control-C now to enter Aboot shell

このとき、Control-C を押せば以下のように表示され、Aboot# プロンプトから各種のコマンドが実行できる。

^CWelcome to Aboot.
Aboot#

この状態でフラッシュメモリ領域がやはり /mnt/flash/ にマウントされており、ここで内容を変更することができる。vi エディタも用意されている。ifconfig, udhcpc (dhcp クライアント)もあり、レスキュー用に削られているとは言え、かなり普通の作業環境である。

なお Aboot 時点ではスイッチポートは初期化されていないため、ifconfig に現れるのは(つまり復旧作業に使えるのは)mgmt1, mgmt2 (マネージメントポート 1, 2)だけである。Arista が完全に普通の PC と同じハードウェア構造で NIC チップまで別に載せてマネージメントポートを用意した理由がわかる。

他に recover あるいは fullrecover コマンドなども用意されているが、機能や使い方についてはそれぞれドキュメントを参照のこと。

作業例:起動イメージの変更(復旧)

実際に自分で加工したイメージを使って実験していたが、正しくシステムが起動できなくなり、起動イメージを元に戻すケースについて紹介する。

まずシステムを再起動し、Aboot プロンプトを呼び出す。(すぐ上参照)

次に /mnt/flash の内容を確認し、vi エディタで boot-config ファイルの中身を動作するであろうオリジナルの swi イメージに書き換える。

Aboot# cd /mnt/flash
Aboot# ls -l EOS-*.swi
-rwxrwx--- 1 0 88 161174379 Jan 26 2009 EOS-4.3.0.swi
-rwxrwx--- 1 0 88 188621783 Aug 12 11:29 EOS-4.3.1.swi
Aboot# cat boot-config
SWI=flash:/EOS-4.3.1.swi
Aboot#
Aboot# vi boot-config
......

vi を終了し、Aboot から exit すれば、指定したシステムイメージから起動するのが確認できるだろう。

Aboot# exit 
Restarting system.

Aboot 1.9.7-196993.EOS430Beta

Press Control-C now to enter Aboot shell
Booting flash:/EOS-4.3.0.swi
Starting new kernel
Switching to Welcome to Arista Networks EOS 4.3.0
......

なお通常の CLI からのシステムの再起動は reload で行う。bash からは reboot コマンドで良いだろう。

タグ: