FreeBSD Daily Topics

2012年7月27日GEOMの状態をグラフ化する方法

tips

How to make your own GEOM graph

第9回 FreeBSD勉強会においてGEOMの状態をグラフ化する方法の紹介がありました。実際のどのようなGEOMクラスの組み合わせでシステムが構成されているのかを知る上で有用な機能ですので、FreeBSD Daily Topicsでも取り上げようとおもいます。

FreeBSDでは「物理デバイス」から「/dev/の下にデバイスファイルを生成」するまでの段階にGEOMと呼ばれるモジュール化されたフレームワークを導入しています。GEOMクラスと呼ばれるモジュールを組み合わせてさまざまな機能を追加することができます。たとえば、ディスクのデータを丸ごと暗号化したり、複数のディスクを統合して扱ったりといったことができます。

ユーザは意識していなくても、デフォルトの状態でもすでにGEOMが利用されています。カーネルがデバイスを認識した段階で生成される仕組みになっており、ハードディスクなどが1つでも接続され認識されているなら、最低でも2つのGEOMクラスが使われていることになります。どういった組み合わせでGEOMが使われているかはkern.geom.conftxtのsysctl値で確認することができます。次の出力結果はデフォルトのままセットアップされたFreeBSD 9.0-RELEASEでの出力です。

$ sysctl -n kern.geom.conftxt
0 DISK cd0 0 2048 hd 0 sc 0
0 DISK ada0 137438953472 512 hd 16 sc 63
1 PART ada0p3 4294932480 512 i 3 o 133144003584 ty freebsd-swap xs GPT xt 516e7cb5-6ecf-11d6-8ff8-00022d09712b
1 PART ada0p2 133143920640 512 i 2 o 82944 ty freebsd-ufs xs GPT xt 516e7cb6-6ecf-11d6-8ff8-00022d09712b
1 PART ada0p1 65536 512 i 1 o 17408 ty freebsd-boot xs GPT xt 83bd6b9d-7f41-11dc-be0b-001560b84f0f
2 LABEL gptid/45c825a1-6f70-11e1-96a9-0800279baabd 65536 512 i 0 o 0

$

このデータはXML形式でも提供されています。kern.geom.confxmlで確認できます。

$ sysctl -n kern.geom.confxml
<mesh>
  <class id="0xffffffff8152b760">
    <name>ZFS::VDEV</name>
  </class>
  <class id="0xffffffff8152b560">
    <name>ZFS::ZVOL</name>
  </class>
  <class id="0xffffffff810b43e0">
    <name>FD</name>
  </class>
  <class id="0xffffffff8106f0c0">
    <name>PART</name>
    <geom id="0xfffffe0002c70100">
      <class ref="0xffffffff8106f0c0"/>
      <name>ada0</name>
      <rank>2</rank>
      <config>
	<scheme>GPT</scheme>
	<entries>128</entries>
	<first>34</first>
	<last>268435422</last>
	<fwsectors>63</fwsectors>
	<fwheads>16</fwheads>
	<state>OK</state>
	<modified>false</modified>
      </config>
	<consumer id="0xfffffe0002c20380">
	  <geom ref="0xfffffe0002c70100"/>
	  <provider ref="0xfffffe0002c26e00"/>
	  <mode>r2w2e3</mode>
	  <config>
	  </config>
	</consumer>
	<provider id="0xfffffe000291ed00">
	  <geom ref="0xfffffe0002c70100"/>
	  <mode>r1w1e0</mode>
	  <name>ada0p3</name>
	  <mediasize>4294932480</mediasize>
	  <sectorsize>512</sectorsize>
	  <stripesize>0</stripesize>
	  <stripeoffset>17408</stripeoffset>
	  <config>
	    <start>260046882</start>
	    <end>268435421</end>
	    <index>3</index>
	    <type>freebsd-swap</type>
	    <offset>133144003584</offset>
	    <length>4294932480</length>
	    <label></label>
	    <rawtype>516e7cb5-6ecf-11d6-8ff8-00022d09712b</rawtype>
	    <rawuuid>45c9a5bc-6f70-11e1-96a9-0800279baabd</rawuuid>
	  </config>
	</provider>
	<provider id="0xfffffe000291e700">
	  <geom ref="0xfffffe0002c70100"/>
	  <mode>r1w1e1</mode>
	  <name>ada0p2</name>
	  <mediasize>133143920640</mediasize>
	  <sectorsize>512</sectorsize>
	  <stripesize>0</stripesize>
	  <stripeoffset>82944</stripeoffset>
	  <config>
	    <start>162</start>
	    <end>260046881</end>
	    <index>2</index>
	    <type>freebsd-ufs</type>
	    <offset>82944</offset>
	    <length>133143920640</length>
	    <label></label>
	    <rawtype>516e7cb6-6ecf-11d6-8ff8-00022d09712b</rawtype>
	    <rawuuid>45c8b291-6f70-11e1-96a9-0800279baabd</rawuuid>
	  </config>
	</provider>
	<provider id="0xfffffe000291e400">
	  <geom ref="0xfffffe0002c70100"/>
	  <mode>r0w0e0</mode>
	  <name>ada0p1</name>
	  <mediasize>65536</mediasize>
	  <sectorsize>512</sectorsize>
	  <stripesize>0</stripesize>
	  <stripeoffset>17408</stripeoffset>
	  <config>
	    <start>34</start>
	    <end>161</end>
	    <index>1</index>
	    <type>freebsd-boot</type>
	    <offset>17408</offset>
	    <length>65536</length>
	    <label></label>
	    <rawtype>83bd6b9d-7f41-11dc-be0b-001560b84f0f</rawtype>
	    <rawuuid>45c825a1-6f70-11e1-96a9-0800279baabd</rawuuid>
	  </config>
	</provider>
    </geom>
  </class>
  <class id="0xffffffff8106e260">
    <name>LABEL</name>
    <geom id="0xfffffe0002c26800">
      <class ref="0xffffffff8106e260"/>
      <name>ada0p1</name>
      <rank>3</rank>
      <config>
      </config>
	<consumer id="0xfffffe0002c96880">
	  <geom ref="0xfffffe0002c26800"/>
	  <provider ref="0xfffffe000291e400"/>
	  <mode>r0w0e0</mode>
	  <config>
	  </config>
	</consumer>
	<provider id="0xfffffe0002922100">
	  <geom ref="0xfffffe0002c26800"/>
	  <mode>r0w0e0</mode>
	  <name>gptid/45c825a1-6f70-11e1-96a9-0800279baabd</name>
	  <mediasize>65536</mediasize>
	  <sectorsize>512</sectorsize>
	  <stripesize>0</stripesize>
	  <stripeoffset>17408</stripeoffset>
	  <config>
	    <index>0</index>
	    <length>65536</length>
	    <seclength>128</seclength>
	    <offset>0</offset>
	    <secoffset>0</secoffset>
	  </config>
	</provider>
    </geom>
  </class>
  <class id="0xffffffff8106e100">
    <name>VFS</name>
    <geom id="0xfffffe0002cc4300">
      <class ref="0xffffffff8106e100"/>
      <name>ffs.ada0p2</name>
      <rank>3</rank>
	<consumer id="0xfffffe0002c96280">
	  <geom ref="0xfffffe0002cc4300"/>
	  <provider ref="0xfffffe000291e700"/>
	  <mode>r1w1e1</mode>
	</consumer>
    </geom>
  </class>
  <class id="0xffffffff8106d9e0">
    <name>DISK</name>
    <geom id="0xfffffe0002c70e00">
      <class ref="0xffffffff8106d9e0"/>
      <name>cd0</name>
      <rank>1</rank>
      <config>
      </config>
	<provider id="0xfffffe0002c70d00">
	  <geom ref="0xfffffe0002c70e00"/>
	  <mode>r0w0e0</mode>
	  <name>cd0</name>
	  <mediasize>0</mediasize>
	  <sectorsize>2048</sectorsize>
	  <stripesize>0</stripesize>
	  <stripeoffset>0</stripeoffset>
	  <config>
	    <fwheads>0</fwheads>
	    <fwsectors>0</fwsectors>
	    <ident></ident>
	    <descr>VBOX CD-ROM</descr>
	  </config>
	</provider>
    </geom>
    <geom id="0xfffffe0002c26d00">
      <class ref="0xffffffff8106d9e0"/>
      <name>ada0</name>
      <rank>1</rank>
      <config>
      </config>
	<provider id="0xfffffe0002c26e00">
	  <geom ref="0xfffffe0002c26d00"/>
	  <mode>r2w2e3</mode>
	  <name>ada0</name>
	  <mediasize>137438953472</mediasize>
	  <sectorsize>512</sectorsize>
	  <stripesize>0</stripesize>
	  <stripeoffset>0</stripeoffset>
	  <config>
	    <fwheads>16</fwheads>
	    <fwsectors>63</fwsectors>
	    <ident></ident>
	    <descr>VBOX HARDDISK</descr>
	  </config>
	</provider>
    </geom>
  </class>
  <class id="0xffffffff8106d7e0">
    <name>DEV</name>
    <geom id="0xfffffe0002cb5b00">
      <class ref="0xffffffff8106d7e0"/>
      <name>cd0</name>
      <rank>2</rank>
	<consumer id="0xfffffe0002c97180">
	  <geom ref="0xfffffe0002cb5b00"/>
	  <provider ref="0xfffffe0002c70d00"/>
	  <mode>r0w0e0</mode>
	</consumer>
    </geom>
    <geom id="0xfffffe0002c70a00">
      <class ref="0xffffffff8106d7e0"/>
      <name>gptid/45c825a1-6f70-11e1-96a9-0800279baabd</name>
      <rank>4</rank>
	<consumer id="0xfffffe0002c20c80">
	  <geom ref="0xfffffe0002c70a00"/>
	  <provider ref="0xfffffe0002922100"/>
	  <mode>r0w0e0</mode>
	</consumer>
    </geom>
    <geom id="0xfffffe0002cb5000">
      <class ref="0xffffffff8106d7e0"/>
      <name>ada0p3</name>
      <rank>3</rank>
	<consumer id="0xfffffe0002c96180">
	  <geom ref="0xfffffe0002cb5000"/>
	  <provider ref="0xfffffe000291ed00"/>
	  <mode>r0w0e0</mode>
	</consumer>
    </geom>
    <geom id="0xfffffe0002cb5700">
      <class ref="0xffffffff8106d7e0"/>
      <name>ada0p2</name>
      <rank>3</rank>
	<consumer id="0xfffffe0002c96480">
	  <geom ref="0xfffffe0002cb5700"/>
	  <provider ref="0xfffffe000291e700"/>
	  <mode>r0w0e0</mode>
	</consumer>
    </geom>
    <geom id="0xfffffe0002cb6200">
      <class ref="0xffffffff8106d7e0"/>
      <name>ada0p1</name>
      <rank>3</rank>
	<consumer id="0xfffffe0002c96800">
	  <geom ref="0xfffffe0002cb6200"/>
	  <provider ref="0xfffffe000291e400"/>
	  <mode>r0w0e0</mode>
	</consumer>
    </geom>
    <geom id="0xfffffe0002922200">
      <class ref="0xffffffff8106d7e0"/>
      <name>ada0</name>
      <rank>2</rank>
	<consumer id="0xfffffe0002c96c00">
	  <geom ref="0xfffffe0002922200"/>
	  <provider ref="0xfffffe0002c26e00"/>
	  <mode>r0w0e0</mode>
	</consumer>
    </geom>
  </class>
  <class id="0xffffffff810a8600">
    <name>SWAP</name>
    <geom id="0xfffffe0002cc3b00">
      <class ref="0xffffffff810a8600"/>
      <name>swap</name>
      <rank>3</rank>
	<consumer id="0xfffffe0002d7d480">
	  <geom ref="0xfffffe0002cc3b00"/>
	  <provider ref="0xfffffe000291ed00"/>
	  <mode>r1w1e0</mode>
	</consumer>
    </geom>
  </class>
  <class id="0xffffffff81002060">
    <name>MD</name>
  </class>
</mesh>

$

このままでは構成がよくわかりませんが、Graphviz形式でもデータが提供されていますので、ここからグラフを生成することができます。graphics/graphvizをインストールした上で、次のようなコマンドでグラフを生成できます。

$ sysctl -n kern.geom.confdot | dot -T jpg > graph.jpg

次のグラフがデフォルトのままセットアップしたFreeBSD 9.0-RELEASEのGEOMの構成です。/dev/以下にデバイスファイルを生やしたり、パーティション情報に対応するようにGEOMクラスが使われていることがわかります。四角がGEOMクラス、楕円がGEOMコンシューマ、六角形がGEOMプロバイダです。

FreeBSD 9.0-RELEASEのGEOMの構成
FreeBSD 9.0-RELEASEのGEOMの構成

ちょっと複雑な構成をとったりすると、たとえば次のようなグラフが得られます。ZFSが追加されていたり、より細かくパーティションが区切られていることなどがわかります。

複雑な構成の場合
複雑な構成の場合

第9回の勉強会はGEOMやUFSの技術について基礎的な部分の説明がありました。次の勉強会である第10回では実際にどのようにコマンドを使うのかという実践的な内容の紹介があります。すでに申込はじめていますので、興味がある方はご参加ください。さらに先の第11回についてもすでに参加申込の受付を開始しています。

おすすめ記事

記事・ニュース一覧