2015-01-24
12:08 AM
- 最終編集日:
2018-04-13
11:26 AM
、編集者:
JapanTAC_CSC
leaf, spine switch を工場出荷時の状態に戻すには /bin/prepare-mfg.sh という スクリプトを用います。 今回はスクリプトの内容を確認し、実際にどのような処理を しているのかを確認してみます。
まず最初にスクリプトの場所と実行権限を確認します。
leaf1# which prepare-mfg.sh /bin/prepare-mfg.sh leaf1# leaf1# ls -l /bin/prepare-mfg.sh -rwsr-xr-x 1 root root 1409 Jan 17 01:41 /bin/prepare-mfg.sh
全ユーザに実行権限があることが確認できます。
次に、このスクリプトを開いて中身を確認してみることにします。
leaf1# cat -n /bin/prepare-mfg.sh 1 #!/bin/bash 2 3 . /etc/isim_include 4 5 if [ -z $1 ]; then 6 echo "No image?" 7 echo "Usage: prepare-mfg.sh" 8 echo "image should be in bootflash, do not give /bootflash/
" 9 exit 10 else 11 if [ ! -f /bootflash/$1 ]; then 12 echo "Cant find image" 13 exit 14 fi 15 fi 16 17 usr=`id -un ` 18 19 if [ $usr == "root" ]; then 20 21 echo "Preparing to erase all config" 22 rm -rf /bootflash/isim.conf 23 touch /mnt/pss/.clean 24 touch /mnt/cfg/0/clean-config 25 touch /mnt/cfg/1/clean-config 26 27 #rm -rf /mnt/ifc/cfg/db/* 28 echo "Cleanup cores" 29 rm -rf /logflash/core/* 30 rm -rf /logflash/log/* 31 rm -rf /mnt/pss/logs/* 32 rm -rf /mnt/ifc/log/* 33 rm -rf /recovery/* 34 35 echo "Setting up recovery image wait 30 seconds" 36 cp /bootflash/$1 /recovery 37 38 sync 39 sleep 30 40 sync 41 42 rm -rf /bootflash/* 43 cp /recovery/$1 /bootflash 44 45 sync 46 sleep 30 47 sync 48 49 echo "Setting up boot variables" 50 touch /mnt/cfg/0/boot/grub/menu.lst.local 51 touch /mnt/cfg/1/boot/grub/menu.lst.local 52 echo "boot $1" > /mnt/cfg/0/boot/grub/menu.lst.local 53 echo "boot $1" > /mnt/cfg/1/boot/grub/menu.lst.local 54 55 touch /mnt/cfg/0/boot/grub/menu.lst.recovery 56 touch /mnt/cfg/1/boot/grub/menu.lst.recovery 57 echo "boot $1" > /mnt/cfg/0/boot/grub/menu.lst.recovery 58 echo "boot $1" > /mnt/cfg/1/boot/grub/menu.lst.recovery 59 else 60 bg_action /tmp/prepare-mfg $1 61 fi
60 行程度のスクリプトになります。
5 - 15 行目でスクリプト実行時の引数を確認しエラーを出力させています。
21 - 33 行目で初期化処理を行っています。
35 - 43 行目で起動用イメージ以外の bootflash ディレクトリにあるファイルを消去しています。
49 - 58 行目で起動イメージの設定を行っています。
starup-config を削除し、bootvar を編集するだけの IOS と異なり、複数のファイルを 削除する必要があるので、こういったスクリプトが用意されています。
ただ、よく見ると 19 行目に if 文があり、初期化処理は root しか実行できないように見えます。
先ほど、全ユーザに実行権限があることを確認しましたが、一般ユーザがこのスクリプトを実行した 場合にはどのようになるのでしょう?
ということで、もう少しこのスクリプトを調べてみることにします。
59 else 60 bg_action /tmp/prepare-mfg $1 61 fi
else 文に書いてある通り、root 以外のユーザは、bg_action /tmp/prepare-mfg $1 というコマンドを 実行しています。 $1 は /bin/prepare-mfg を実行した際の引数なので、aci-n9000-dk9.11.0.2m.bin のような起動用イメージファイル名が指定されているはずです。 (わかりやすくするため、今後 $1 は aci-n9000-dk9.11.0.2m.bin を入れたとして話を進めます。)
leaf1# bg[tab][tab] bg bg-action.sh
bg の後に tab を 2 回押しても、bg_action が出てきません。 そこで、スクリプトをもう 1 度よく見ると、3 行目に . /etc/isim_include という行があります。
早速実行してみると、bg_action が出てきました。
leaf1# . /etc/isim_include leaf1# bg[tab][tab] bg bg-action.sh bg_action leaf1# bg
どうやら、bg_action は /etc/isim_include に定義されているようです。
このスクリプトは長いので、bg_action() のみ抜き出してみます。
leaf1# cat -n /etc/isim_include | grep -A 15 bg_action 10 bg_action() { 11 touch $1 12 echo $2 > $1 13 14 while true 15 do 16 echo "In progress" 17 if [ -f $1 ]; then 18 sleep 5; 19 else 20 break 21 fi 22 done 23 24 echo "Done" 25 } leaf1#
$1 は /tmp/prepare-mfg で $2 は aci-n9000-dk9.11.0.2m.bin なので、 11, 12 行目は /tmp/prepare-mfg という名前のファイルを作成し、そのファイルに aci-n9000-dk9.11.0.2m.bin という文字を書き込んでいるだけになります。
14 行目からの while ループでは、そのファイルがあるかどうかを確認し、ある場合 5 秒待ち、ない場合 Done と表示しこの関数は終了します。
では、誰がこのファイルを消しているのでしょうか?
先ほど、bg[tab][tab] と打った時に出てきた bg-action.sh が名前からしてどうも 怪しい気がしますが、このスクリプトも誰かから呼び出されないと動きません。
裏側で定期的に呼び出すもので最も怪しいのは cron なので、とりあえず crontab -l で調べてみると、何も出てきません。。
leaf1# crontab -l /var/spool/cron: No such file or directory /var/spool/cron: mkdir: No such file or directory
手詰まりっぽくなってしまいましたが、先ほどの /bin/prepare-mfg.bin はわざわざ root かどうかをチェックしていたのを思い出し root で crontab -l を実行してみる ことにします。
注) root access するためには、TAC SR を open し、password を発行してもらう 必要があるので、(中の人を除き) 気軽に login できるものではありません。
leaf1# exit logout Connection to leaf1 closed. admin@apic1:~> ssh -l root leaf1 Password: Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Copyright (c) 2002-2014, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained in this software are owned by other third parties and used and distributed under license. Certain components of this software are licensed under the GNU General Public License (GPL) version 2.0 or the GNU Lesser General Public License (LGPL) Version 2.1. A copy of each such license is available at http://www.opensource.org/licenses/gpl-2.0.php and http://www.opensource.org/licenses/lgpl-2.1.php leaf1# leaf1# leaf1# crontab -l | grep bg -*/1 * * * * /bin/bg-action.sh leaf1# leaf1# ls -l /bin/bg-action.sh -rwxr-xr-x 1 root root 1585 Jan 17 01:41 /bin/bg-action.sh
admin ユーザから root ユーザへ ssh でログインしなおし、crontab -l を実行すると、 見つかりました。
やはり、bg-action.sh を定期的に実行しているようです。
leaf1# cat -n /bin/bg-action.sh | head -20 1 #!/bin/bash 2 3 for cmd in /tmp/disable-klogs \ 4 /tmp/clear-bootvars \ 5 /tmp/setup-bootvars \ 6 /tmp/prepare-mfg \ 7 /tmp/clear-core \ 8 /tmp/setup-clean-config \ 9 /tmp/setup-admin-ssh 10 do 11 if [ -f $cmd ]; then 12 date >> /tmp/bg_action.out 13 echo "Running command $cmd" >> /tmp/bg_action.out 14 new_cmd=$(basename $cmd) 15 echo "/bin/$new_cmd.sh" >> /tmp/bg_action.out 16 /bin/$new_cmd.sh `cat $cmd` >> /tmp/bg_action.out 17 rm -rf $cmd 18 fi 19 done 20
3 - 9 行目のファイルを順番に読み込み、10 行目以降で処理しているようです。 11 行目で /tmp/hoge というファイルを確認し、存在する場合、/bin/hoge.sh [file の中身] というコマンドを実行しています。
先ほどまでの処理で、/tmp/prepare-mfg というファイルに aci-n9000-dk9.11.0.2m.bin という内容が 書き込まれているので、16 行目で /bin/prepare-mfg.sh aci-n9000-dk9.11.0.2m.bin が実行されること になります。
prepare-mfg.sh は /bin/prepare-mfg.sh aci-n9000-dk9.11.0.2m.bin のように使用するので、 振出しに戻ってしまいました。
ただ、bg-action.sh は cron を使用し、root が実行しているので、今度は if 文にマッチし、 初期化処理を行うことができます。
また、17 行目で /tmp/prepare-mfg を削除しているので、先ほどの bg_action も終了します。
まわりくどい処理を行ってきましたが、結局 prepare-mfg.sh を実行すると、誰が実行しても root が処理したのと同じ結果になります。
ちなみに、上記を見ると prepare-mfg と同様のスクリプトが合計で 7 つ存在することが確認できます。
ファイル名から setup-bootvars は、grub を書き換えてくれるだけのスクリプトで、setup-clean-config は設定だけを削除してくれるようなスクリプトだということが想像できるかと思います。
興味があれば実際にスクリプトの中身を読んでみてください。
ACI には、面倒な作業を一括で行ってくれるスクリプトが複数用意されているので、たまに 探してみると知らないスクリプトに出会うかもしれません。
ちなみに、setup-bootvars と setup-clean-config は既に下記でも紹介されています。
https://supportforums.cisco.com/document/12325246/tip-day-how-erase-leaf-spine-configuration-and-restore-factory-defaults
Leaf/Spine は /bin/prepare-mfg.sh を用いましたが、APIC を初期化するコマンドは eraseconfig setup になります。
setup オプションを使用することで、初期出荷時のように、セットアップダイアログ画面が表示され、APIC の初期設定 画面まで戻すことができます。
このコマンド自体は python で書かれています。
admin@apic1:~> eraseconfig Carriage Return setup Erases the setup data admin@apic1:~> which eraseconfig /controller/bin/eraseconfig admin@apic1:~> cat /controller/bin/eraseconfig #!/usr/bin/python2.7 try: from insieme.cli.executor import main main() except KeyboardInterrupt: pass admin@apic1:~>
最終的には、下記ファイルが呼び出されています。
eraseconfig setup を実行し、Y と入力した場合、30 行目の cat /.aci/.system/setup を 実行しているのと同じです。
/.aci/.system は基本的にユーザが直接アクセスすることは想定していないので、 用意されているコマンドを使用することが一般的ですがスクリプトをたどっていくと 知らなかったコマンドが用意されてることがあるので興味があれば調べてみてください。
admin@apic1:~> cat -n /controller/ishell/cmds/systemcmd/pydefs/eraseconfig.py | grep -A 20 "class eraseconfig" 20 class eraseconfig(Command): 21 22 @classmethod 23 @kbdinterruptsafe 24 def execute(cls, cmdContext, args, matchedPath): 25 if args.setup: 26 c = raw_input("Do you want to cleanup the initial setup data? The system will be REBOOTED. (Y/n): ") 27 if c != "Y": 28 return False 29 30 os.system("cat /.aci/.system/setup") 31 return True 32 33 c = raw_input("Do you want to restore this APIC to factory settings? The system will be REBOOTED. (Y/n): ") 34 if c != "Y": 35 return False 36 37 os.system("cat /.aci/.system/clean") 38 return True 39 40 @classmethod admin@apic1:~>
検索バーにキーワード、フレーズ、または質問を入力し、お探しのものを見つけましょう
シスコ コミュニティをいち早く使いこなしていただけるよう役立つリンクをまとめました。みなさんのジャーニーがより良いものとなるようお手伝いします
下記より関連するコンテンツにアクセスできます