はじめに
SONiCの設定は/etc/sonic/config_db.json
に保存されます。config
コマンドで動作変更したものをsudo config save
などで上書き保存することもできますし、直接エディタで編集して再起動させることで動作に反映させることもできます。
では、設定を元に戻すにはどうすればいいでしょう?
なお、下記は2021年11月30日のmaster
ブランチをベースにして手元で一部不具合修正しビルドした仮想マシン版での挙動になります。202106
ブランチなど過去の安定版では存在しないコマンドもありますことをご承知おきください。
保存されてる設定に戻す
config load
あるいは config reload
を使って、設定を起動時のものに戻せます。正確には /etc/sonic/config_db.json
の内容のとおりに内部DBを書き換えます。
load
とreload
の違いですが、前者は単にDBの内容を書き換えるだけ。後者は機能を一旦停止させ、新しいDB内容で各機能を再起動させるというものです。理屈としては、DBの書き換えはCLIの実行と同等なので、変更部分だけが動作に反映されるはずです。
どちらのコマンドも対話的に本当に実行するか尋ねられます。バッチ実行したい場合は -y
をつけるといいでしょう。
admin@sonic:~$ sudo config load
Load config from the default config file(s) ? [y/N]: y
Running command: /usr/local/bin/sonic-cfggen -j /etc/sonic/config_db.json --write-to-db
admin@sonic:~$
なお当然ですが、sudo config save
を実行すると、以降はその時点の設定に戻すことになります。
チェックポイントに戻す
config checkouint
と config rollback
というコマンドが新設されました。
config checkpoint
は、コマンド実行時点の設定に名前をつけて後で参照できるようにするコマンドになります。実行後、設定をいろいろ弄って、なんだかよくわからなくなってきたとき確実に動く設定に戻したいときはconfig rollback
を実行すると戻ります。
なお、チェックポイントの一覧は config list-checkpoints
で参照できます。
ではさっそくやってみましょう。
admin@sonic:~$ sudo config checkpoint ping-ok
Config Rollbacker: Config checkpoint starting.
Config Rollbacker: Checkpoint name: ping-ok.
Config Rollbacker: Getting current config db.
Config Rollbacker: Validating current config according to YANG models.
Note: Below table(s) have no YANG models:
KDUMP, SNMP, SNMP_COMMUNITY,
sonic_yang(3):All Keys are not parsed in FEATURE
dict_keys(['dhcp_relay'])
sonic_yang(3):exceptionList:["'set_owner'"]
sonic_yang(3):Data Loading Failed:All Keys are not parsed in FEATURE
dict_keys(['dhcp_relay'])
Failed to create a config checkpoint
Usage: config checkpoint [OPTIONS] CHECKPOINT_NAME
Try "config checkpoint -h" for help.
Error: Running configs on the device are not valid.
admin@sonic:~$
あれ?
現在SONiCはYANG modelですべての設定を表現できるような拡充の作業が進行中で、その影響なのかも知れません。デプロイしたばかりのVMなのになあ。おかしいなあ。まあ動かないものはしかたありません。
指定したファイルの内容に設定を変更する
config replace
コマンドが新設されました。これを用いると、指定したファイルのとおりに設定が書き換わります。なお、(下記のヘルプにも書かれていますが)動作の反映は差分のあったところだけ変更されるという挙動になります。
admin@sonic:~$ sudo config replace -h
Usage: config replace [OPTIONS] TARGET_FILE_PATH
Replace the whole config with the specified config. The config is replaced
with minimum disruption e.g. if ACL config is different between current
and target config only ACL config is updated, and other config/services
such as DHCP will not be affected.
**WARNING** The target config file should be the whole config, not just
the part intended to be updated.
<target-file-path>: Path to the target file on the file-system.
Options:
-f, --format [CONFIGDB|SONICYANG]
format of target config is either
ConfigDb(ABNF) or SonicYang
-d, --dry-run test out the command without affecting
config state
-v, --verbose print additional details of what the
operation is doing
-h, -?, --help Show this message and exit.
admin@sonic:~$
こちらもやってみましょう。
admin@sonic:~$ echo 'kore ha dame config desu' > dame_config
admin@sonic:~$ sudo config replace -f CONFIGDB -d dame_config
Failed to replace config
Usage: config replace [OPTIONS] TARGET_FILE_PATH
Try "config replace -h" for help.
Error: Expecting value: line 1 column 1 (char 0)
admin@sonic:~$
きちんとエラーが出ました。よしよし。
じゃあ次に、設定を追加したあと/etc/sonic/config_db.json
の内容に戻してみます。
admin@sonic:~$ sudo config interface ip add Ethernet0 10.138.25.5/26
admin@sonic:~$ show runningconfiguration all | grep 138
"Ethernet0|10.138.25.5/26": {}
admin@sonic:~$ sudo config replace -f CONFIGDB /etc/sonic/config_db.json
Config Replacer: Config replacement starting.
Config Replacer: Target config length: 5155.
Config Replacer: Validating target config according to YANG models.
sonic_yang(3):All Keys are not parsed in FLEX_COUNTER_TABLE
dict_keys(['POLL_INTERVAL'])
sonic_yang(3):exceptionList:[]
sonic_yang(3):Data Loading Failed:All Keys are not parsed in FLEX_COUNTER_TABLE
dict_keys(['POLL_INTERVAL'])
Failed to replace config
Usage: config replace [OPTIONS] TARGET_FILE_PATH
Try "config replace -h" for help.
Error: The given target config is not valid
admin@sonic:~$
あれ?
工場出荷状態に戻す
show
コマンドに initialconfiguration
みたいのがあればよかったのですが、ありませんでした。ここでは、工場出荷状態の設定をどうやって出力させるかを書きます。
sonic-cfggen
コマンドで工場出荷時設定を出力させることができます。使用するオプションは3つ。
-H
-k
--preset
admin@sonic:~$ sonic-cfggen -H -k Force-S6000 --preset t1less
{
"DEVICE_METADATA": {
"localhost": {
"hwsku": "Force-S6000",
"platform": "x86_64-kvm_x86_64-r0",
"mac": "52:54:00:12:04:00",
"hostname": "sonic",
"type": "LeafRouter",
"bgp_asn": "65100"
}
},
"PORT": {
"Ethernet0": {
"admin_status": "up",
"alias": "fortyGigE0/0",
"fec": "rs",
"index": "0",
"lanes": "25,26,27,28",
"mtu": "9100",
"speed": "40000"
},
"Ethernet100": {
"admin_status": "up",
:
おおよそこんなふうです。-k
にはHwSKUの値を書きます。show platform summary
で出てきます。別のいいかげんな値を書くとコンソールアクセス以外できない設定が吐き出されたりしますのでご注意を。
--preset
のところに指定可能なキーワードは sonic-cfggen -h
で確認できます。通常はdefault_sku
ファイルでほぼt1
が指定されていると思います。キーワードを変えるとそれなりに異なる設定が吐き出されますので、興味のある方は比較などしてみるといいかも知れません。
この出力内容をファイルに書き出してconfig replace
するなり(できるのだろうか?)、 /etc/sonic/config_db.json
に上書きしてconfig reload
するなり再起動するなり、お好きにやられるといいかと思います。
おわりに
config rollback
が生えたのは知っていましたが、起点を設定するconfig checkpoint
が動かないとは思いませんでした。いずれ動くようになると思いますが……。がんばれYANG modelといったところでしょうか。