Ubuntu 12.04 LTS で zfs その2

前回のzfs環境構築に続いてzpoolへのディスクの追加について
いくつか注意点があったのでまとめてみた。

以下のコマンドで基本的な操作が行える。

  • ディスク構成の確認

# zpool status

  • プールの作成# zpool create  [zpool name] [device name]
  • ディスクの追加

# zpool add  [zpool name] [device name]

  • プールの削除

# zpool destroy  [zpool name] [device name]

とてもシンプルで分かりやすい。
洗練されていますね。

ということで、自分のMicroServerにもディスクを追加してみた。

[email protected]:/# zpool create  storage0 sda sdb

あっけなく終了。簡単過ぎる。
だが、ここに罠があった。

今回zpoolに追加したHDDはWesternDigital製のWD30EZRX(3TB)でした。
最近のHDDは大容量化のオフセットとして1ブロックあたりのサイズを大きくしているので、
それに合わせてフォーマットしてあげないと著しくパフォーマンスが落ちます。

AFT(Advanced Format Technology) ってやつですね。

なので、AFTなディスクをzpoolする際には以下のような引数を加えてあげるとフワフワっと
ブロックの開始位置とブロックサイズをしてくれます。

  • プールの作成(AFTなディスクの時)

[email protected]:/# zpool create -o ashift=12 storage0 sda sdb

引数の有無でどれだけパフォーマンスの差が出るのか、試しに dd コマンドでベンチマークしてみました。

  • 引数なし(ブロックサイズ512Byte)
[email protected]:~# zdb -C storage0 | grep ashift
                ashift: 9
                ashift: 9 ※ ashift: 9はブロックサイズ512Byte
[email protected]:~#
[email protected]:~# dd if=/dev/zero of=hogehoge bs=1M count=10000
10000+0 records in
10000+0 records out
10485760000 bytes (10 GB) copied, 220.772 s, 47.5 MB/s
  • 引数あり
[email protected]:~# zdb -C storage0 | grep ashift
                ashift: 12
                ashift: 12 ※ ashift: 12はブロックサイズ4KByte
[email protected]:~# dd if=/dev/zero of=hogehoge bs=1M count=10000
10000+0 records in
10000+0 records out
10485760000 bytes (10 GB) copied, 61.0622 s, 172 MB/s
開始位置とブロックサイズ適切にするだけで3倍速くなりました。
せっかく良いハードウェアを買ってもソフトウェア側の処理で最大限のパフォーマンスを
発揮できないと言う可哀想な自体は避けたいですね。

Ubuntu 12.04 LTS で zfs その1

自宅で使っているHP Proliant MicroServerが一台余ったので、(二台ある)
zfs使ってNASにすることにしました。

構成はこんな感じ。

  • Server : HP Proliant MicroServer (N36L)
  • OS : Ubuntu 12.04 LTS
  • System Disk (ext4) : CFD CSSD-SM64NJ2
  • Storage Disk (zfs)  : WesternDigital WD30EZRX *2

今回はrootからzfsにするnativeな構成ではなく、
OSを余り物のSSDに入れてハードディスクはストレージ用の
パーテーションとして別途分ける感じの構成にしてみた。

手順は至って簡単。ゆとり世代の私でも問題ない。

1. python-software-propertiesをインストール

[email protected]:~# apt-get install python-software-properties

2. リポジトリを追加

[email protected]:~# add-apt-repository ppa:zfs-native/stable

3. aptリストの更新

[email protected]:~# apt-get update

4. zfsのモジュールをインストール

apt-get install ubuntu-zfs

これで準備は完了。
以下のコマンドで応答があればインストールは終わっているはずだ。

[email protected]:~# zfs
[email protected]:~# zpool status

ほらね?僕達ゆとり世代にもやさしい。

続いて zpool にディスクを追加してみよう。

(その2へつづく)

resolvconfd と dnsmasq と libvirt と unbound と私

※忘れそうなのでメモです。

私が会社で使っている作業用サーバはUbuntuのKVM上で動いているFreeBSDです。(ホストのUbuntuも使ってるけど)
気が向いたときにホストのapt-get update/upgradeをするのですが、たまにKernelのアップデートがくると
再起動をしなくてはいけないので、仕方なく再起動をしています。

この時点で resolv.conf を手書きで書き換えていたりすると、楽しいことが起こったりします。

Ubuntu12.04では resolv.conf  の管理を resolvconfd で行っていて、デフォルトではローカルで起動している
リゾルバ(dnsmasq) を参照するように、起動のたびに 127.0.0.1 を参照するように resolv.conf を書き換えてくれるという仕様になっています。

とても親切ですね。

私が仕事で使っている環境は同ホストで unbound を起動してキャッシュリゾルバとしても使用しているので、
dnsmasq が起動されると bind しているアドレス・ポートがかぶって unbound が起動しなかったりで
一筋縄には行かないのです。(dnsmasqの存在を意識していなかった)

ということで、「dnsmasq が邪魔なら dnsmasq を起動しなければ良い!」 という安直な考えに至り、dnsmasq を stop

[email protected]:/# /etc/init.d/dnsmasq stop
* Stopping DNS forwarder and DHCP server dnsmasq
…done.
[email protected]:/#

これで、安心だろ。
と、おもって KVM の FreeBSD (ゲスト)にログインするとネットワークがつながらない・・・
libvirt で仮想マシンを管理しているので、dnsmasq を切ってしまうとどうやら外に出られなくなるみたいだ(詳しくは調べてません)

「そうしたら  dnsmasq と unbound を共存させればいいんだろ?」という安直な考えに至り、 conf を編集

[email protected]:/# vi /etc/unbound/unbound.conf

server:
interface: 192.168.10.70

(略)

 

[email protected]:/# vi /etc/dnsmasq.conf

listen-address=127.0.0.1
bind-interfaces

これでデーモンを再起動すれば dnsmasq/unbound が共存できます。

ちなみに、前置きが長くなりましたが、ここからが本編です。
resolvconfd の挙動が良く分からなかったので今回はじっくり観察してみました。

Googleなんかで “ubuntu 12.04 resolv.conf” などと検索すると、
大抵のBlog記事は /etc/resolvconf/resolv.conf.d/ 以下のファイルを編集しろと書かれています。

[email protected]:/etc/resolvconf/resolv.conf.d# ls
base  head  original

ここで引っかかりました。
いくら編集して、resolvconfd/networking/server再起動しても  resolv.conf が思ったように書き換わらないので、
Ubuntuのマニュアルをよく読んでみた。

http://manpages.ubuntu.com/manpages/precise/man8/resolvconf.8.html

/etc/network/interfaces を編集すればよいことが判明。(ちゃんと書いてあるじゃん)
オフィシャルなマニュアルをちゃんと読まないと遠回りしてしまうんですね。

ということで  /etc/network/interfaces を以下のようにしてみた

auto br0
iface br0 inet static
address 192.168.10.70
network 192.168.0.0
netmask 255.255.0.0
broadcast 192.168.255.255
gateway 192.168.0.1
dns-nameservers 192.168.10.70 192.168.0.20 8.8.8.8
dns-domain hoge.com
dns-search fuga.net foo.com
bridge_ports eth0
bridge_stp off

iface eth0 inet manual

どうやら “dns-*” な行を読み取って resolv.conf を読みよってくれるようなので、
これでネットワークをリスタートして resolv.conf を見てみましょう。

[email protected]:/# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND — YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
search choge.com fuga.net foo.com
[email protected]:/#

nameserver が 127.0.0.1 になっていますが、心配ありません。
dnsmasq がロードしている conf を参照すると以下のようになっています。

[email protected]:/# cat /var/run/dnsmasq/resolv.conf
nameserver 192.168.10.70
nameserver 192.168.0.20
nameserver 8.8.8.8

コレに気づかず30分ぐらい時間を無駄にしました。

ちなみに、 dnsmasq や unbound などのデーモンが起動していない(起動しない)環境では /etc/resolv.conf の
nameserver  は 127.0.0.1 ではなく、 /etc/networl/interfaces に書かれている dns-nameservers の値が明示的に入るようです。

親切というか、なんと言うか、今までの掟的なものが頭から離れないとハマること間違いなしですね。