Nexenta (OpenSolaris) で ZFS を (1)

一瞬でのバックアップを実現するSolaris ZFS (1/4):OpenSolarisで始めるブログサーバ構築(4) - @IT を読んで ZFS を試したくなったので Nexenta Core という OpenSolaris カーネルベースの distribution でいじってみました。

ZFS って?

詳しくは前掲の記事や ZFS - Wikipedia を参照してください。

  • Logical Volume Management
  • Journaling File System
  • RAID
  • Snapshot

が All in One な file system です。

さいしょ,それ LVM でできるよと思ったのですが,http://www.unixconsult.org/zfs_vs_lvm.html を読んだところ Linux LVM に比べいくつか抜きん出たところがあります。

  • 独立したパーティションを必要としない(ファイル上にファイルシステムを構築することもできる)
  • online snapshot が可
  • online rollback, clone が可
  • 圧縮ボリューム可
  • 全データに checksum かけてる

ZFS を利用するには

ZFSOpenSolaris の一部としてオープンソースになっています。なので他の OS (FreeBSD 7 など) に導入されたりしてます。

Linux ではどうかというと,ライセンス上の問題からカーネルに組み込むわけにいかず FUSE としての実装になってます。このため,また,こなれていないこともあってかパフォーマンスや安定性はよくないようです(⇒ zfs-fuseを調べる - 夜更かし日記 (2008-01-03))。

ということで安定した ZFS を使いたいのであれば,

が選択肢になります*1

Solaris 10 はいまや無料で入手・運用できるのでこれを使ってもよかったのですが,今回は Nexenta Core を利用してみました。

Nexenta (Core) って?

OpenSolarisソースコードの公開自体が目的であり,OS の名称ではありません。実際には(先にあげたように)それを元にした数種類のディストリビューションがあります。

Nexenta はそのような普通の OpenSolaris リリースとは異なり,ユーザランドのプログラム・環境として Debian GNU/Linux*2を利用しています。なので apt も使えます。

つまり

  • OpenSolaris ベースの kernel
  • OpenSolaris ベースの user land programs(おもに OS の根幹に関わるもの)
  • Ubuntu ベースの user land programs (GNU softwares 等)

を組み合わせたものが Nexenta なのです。おもしろそうですね。

Nexenta Core は,この Nexenta の minimum な core 部分です。といってもサーバとして動かすのに必要なものは apt も含めあらかた入っているので,デスクトップ環境として使うのならこれをベースに apt-get install でいろいろインストールしていけばよいのでしょう(試してないですが)。今回は ZFS を使いたいのでこの Core System だけで遊んでみます。

Nexenta のインストール

Nexenta のページ から Nexenta Core の ISO イメージをダウンロードしてインストールするだけです。Debian-installer とも anaconda とも違う独特のインタフェースです。ま,根幹部分だけなのでインストールの際に設定しなければいけない項目もそう多くありません。


ただし。

どうもインストーラがおかしいのか,/ (Root) と Swap 以外のスライス*3を設定しても再起動時にうまく mount してくれません。なので,ZFS で遊ぶ用の容量を差し引いて Root 用のスライスのサイズを設定し,残りはインストーラでは放置しておきました。

ZFS 用スライスの準備

無事インストールして再起動できたら,ディスクの空き領域を ZFS 用に確保します。

Solaris でディスクのスライス等をいじるには format コマンドを利用します。

dayflower@myhost:~$ sudo format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c0d0 <DEFAULT cyl 4092 alt 2 hd 128 sec 32>
          /pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0

Specify disk (enter its number): 0
selecting c0d0
Controller working list found
[disk formatted, defect list found]
/dev/dsk/c0d0s0 is part of active ZFS pool syspool. Please see zpool(1M).
/dev/dsk/c0d0s7 is currently used by swap. Please see swap(1M).

FORMAT MENU:
...... snip snip snip ......

format> verify

Primary label contents:

Volume name = <        >
ascii name  = <DEFAULT cyl 4092 alt 2 hd 128 sec 32>
pcyl        = 4094
ncyl        = 4092
acyl        =    2
bcyl        =    0
nhead       =  128
nsect       =   32
Part      Tag    Flag     Cylinders        Size            Blocks
  0       root    wm       3 - 2045        3.99GB    (2043/0/0)  8368128
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 4091        7.99GB    (4092/0/0) 16760832
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm    2047 - 2300      508.00MB    (254/0/0)   1040384
  8       boot    wu       0 -    0        2.00MB    (1/0/0)        4096
  9 alternates    wm       1 -    2        4.00MB    (2/0/0)        8192

verify で現在のパーティション情報を表示させます。Partition#2 はディスク全体を示すものであり 8GB 近くあることがわかります。ざっと眺めると,先頭に Root,その次に Swap が確保されており,シリンダ番号 2301 以降が使われていないようです。

partition で Partition#3 として ZFS 用のスライスを確保します。

format> partition

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
...... snip snip snip ......

partition> 3
Part      Tag    Flag     Cylinders        Size            Blocks
  3 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]: 
Enter partition permission flags[wm]: 
Enter new starting cyl[0]: 2301
Enter partition size[0b, 0c, 2301e, 0.00mb, 0.00gb]: 1gb

partition id tag というのはある限られた id tag しか設定できないので,今回のような汎用な用途であれば unassigned のままにしておきます。先頭シリンダとして 2301 を指定し,サイズとして 1GB を指定しました(例示されているように,ブロック数やシリンダ数,終了シリンダ番号等でも指定できます)。

新しいパーティション情報を print で確認します。

partition> print

Current partition table (unnamed):
Total disk cylinders available: 4092 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0       root    wm       3 - 2045        3.99GB    (2043/0/0)  8368128
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 4091        7.99GB    (4092/0/0) 16760832
  3 unassigned    wm    2301 - 2812     1024.00MB    (512/0/0)   2097152
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm    2047 - 2300      508.00MB    (254/0/0)   1040384
  8       boot    wu       0 -    0        2.00MB    (1/0/0)        4096
  9 alternates    wm       1 -    2        4.00MB    (2/0/0)        8192

オーバーラップもなく 1GB の領域が確保されそうです。

まだディスクに書き込んでいないので label でこのパーティション情報を書き込みます。

partition> label
Ready to label disk, continue? y

partition> quit

...... snip snip snip ......

format> quit

これで c0d0s3 として 1GB のスライスを確保しました。

ここまででずいぶん長くなったので続きます。

おまけ(Nexenta の感想)

多くのコマンドが使い慣れた Ubuntu のものなので使い勝手はそう悪くないのですが,システムの根っこに関わるコマンド(ps とか top とか df とか)が Solaris ベースなのでイラっときます。しかも該当するマニュアルの引き方がいまいちわかんない。

でも逆に /usr/ucb とかテラ懐カシス!

*1:Linux zfs-fuse の場合,try to use zfs-fuse - I should be so lucky. が参考になります

*2:具体的には based on Ubuntu Dapper

*3:Linux でいうパーティションのようなものです