labunix's blog

labunixのラボUnix

debtreeとdotコマンドでvmnetのイメージ図を作る




■debtreeとdotコマンド
 依存関係を見るのも面白いけど、dotコマンドはちょっと使えそう。

 参考:debtree でDebianのパッケージの依存関係を出力
 http://d.hatena.ne.jp/iww/20120503/debtree

$ sudo apt-get install -y debtree
$ debtree bash | dot -T png -o bash.png

 

f:id:labunix:20120504154616p:plain

 

■テキストに落とす

$ debtree bash > bash.txt
$ cat bash.txt
digraph "bash" {
        rankdir=LR;
        node [shape=box];
        "bash" -> "base-files" [color=blue,label="(>= 2.1.12)"];
        "base-files" -> "awk" [color=purple,style=bold];
        "awk" -> "Pr_awk" [label="-3-",dir=back,arrowtail=inv,color=green];
        "Pr_awk" [label="...",style=rounded];
        "awk" [shape=octagon];
        "bash" -> "debianutils" [color=blue,label="(>= 2.15)"];
        "debianutils" -> "sensible-utils" [color=blue];
        "bash" -> "dash" [color=purple,style=bold,label="(>= 0.5.5.1-2.2)"];
        "dash" -> "debianutils" [color=blue,label="(>= 2.15)"];
        "dash" -> "dpkg" [color=blue,label="(>= 1.15.0)"];
        "bash" -> "libncurses5" [color=purple,style=bold,label="(>= 5.7+20100313)"];
        "libncurses5" -> "libgpm2";
        "bash" -> "bash-completion" [label="(>= 20060301-0)"];
        "bash-completion" -> "bash" [color=blue,label="(>= 3.2)"];
        "bash" [style="setlinewidth(2)"]
        "dpkg" [shape=diamond];
}
// Excluded dependencies:
// libc6

■上記を元に以下を作成
 ※もうdebtreeは関係なかったりもするけど。。。
  参考にしたということで。。。

$ cat sample.txt
digraph "real squeeze" {
        rankdir=TD;
        node [shape=box];
        "real squeeze" -> "eth0" [color=blue,label="real 1xx.xxx.xxx/24"];
        "eth0" -> "promiscuous mode" [color=purple,style=bold];
        "promiscuous mode" -> "vmnet1" [color=blue,label="host only 1xx.xxx.xxx/24"];
        "vmnet1" -> "vmlenny-i386-1" [color=blue,label="IP:1xx.xxx.xx1/32"];
        "vmnet1" -> "vmlenny-i386-2" [color=blue,label="IP:1xx.xxx.xx1/32"];
        "promiscuous mode" -> "vmnet8" [color=purple,style=bold,label="NAT 1xx.xxx.xxx/24"];
        "vmnet8" -> "vmsqueeze1-amd64-1" [color=blue,label="IP:1xx.xxx.xx1/32"];
        "vmnet8" -> "vmsqueeze2-amd64-2" [color=blue,label="IP:1xx.xxx.xx2/32"];
        "vmnet8" -> "vmsqueeze3-kfreebsd-amd64" [color=blue,label="IP:1xx.xxx.xx3/32"];
        "vmnet8" -> "vmsqueeze4-kfreebsd-i386" [color=blue,label="IP:1xx.xxx.xx4/32"];
}

■グラフ化

$ cat sample.txt | dot -T png -o vmsqueeze.png
    
    
    

f:id:labunix:20120504155001p:plain

仮想マシンを追加、変更、削除をしたら少しの変更で、再度コマンドを実行するだけ。
 簡単ですね。
 詳しくはマニュアルを。

$ man dot
    
$ dot -V
dot - graphviz version 2.26.3 (20100126.1600)

■色々余計な修正をしているうちに、サブグラフの前に力尽きたw。。。
 外部と内部の通信の違いをもう少しちゃんと視覚化しようとした。
 また時間があったら、この説明もグラフに組み込もうと思う。。。

$ cat sample.txt
digraph "VMNIC" {
  graph [ranksep=0.5];
  rankdir=LR;
  node [shape=box,sizefixed=true,width=3.2,height=0.8];
  "Router" -> "Bridge Share" \
    [arrowsize=3,dir=both,color=purple,label="",label="Other LAN Network"];
  "Router" -> "vmnet8 FW" [arrowsize=3,dir=back,color=blue,labeldistance=3];
  "Bridge Share" -> "eth0" [arrowsize=2,dir=both,color=purple,label="Host Share"];
  "vmnet1 FW" -> "eth0" [arrowsize=2,dir=both,color=orange,label="FW1"];
  "vmnet8 FW" -> "eth0" [arrowsize=2,dir=both,color=blue,label="FW8"];
  "eth0" -> "bridge" \
    [arrowsize=2,dir=both,color=purple,style=bold,label="Bridge :1xx.xxx."];
  "eth0" -> "vmnet1" \
    [arrowsize=2,dir=both,color=orange,style=bold,label="Host Only 1xx.xxx."];
  "eth0" -> "vmnet8" [arrowsize=2,dir=both,color=blue,style=bold,label="NAT 1xx.xxx."];
  "vmnet1" -> "vmlenny-i386-1" [dir=both,color=orange,label="xx1"];
  "vmnet1" -> "vmlenny-i386-2" [dir=both,color=orange,label="xx2"];
  "vmnet8" -> "vmsqueeze1-amd64-1" [dir=both,color=blue,label="xx1"];
  "vmnet8" -> "vmsqueeze2-amd64-2" [dir=both,color=blue,label="xx2"];
  "vmnet8" -> "vmsqueeze3-kfreebsd-amd64" [dir=both,color=blue,label="xx3"];
  "vmnet8" -> "vmsqueeze4-kfreebsd-i386" [dir=both,color=blue,label="xx4"];
  "bridge" -> "vmsqueeze-router-test" [dir=both,color=purple,label="xx1"];
};


$ cat sample.txt | dot -T png -o sample.png


f:id:labunix:20120504211326p:plain