おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

OpenSolarisでデータのお引越し

メモもろくに取らずにやったのでなぐり書きだけど、なんかの役(例えばボロクソにツッコンでストレス解消するとか)に立てば。


あ、ZFS については私の日記の OpenSolaris 勉強会びぎなーずの参加記録とか、Solaris ZFS管理ガイドとかを見ると参考になるでしょう。

背景

年末に安かったんで ML115 G5 を買ってみた。
OpenSolaris 入れて ZFS で遊ぶ&仮想マシンサーバにしようという作戦。

メモリもとりあえず 4GB 増設して総計 5GB。
でも標準で付いてくるディスクが100GBちょいと、そりゃちょっと冗談だろうというサイズ。
別に今すぐ大容量が欲しいわけじゃないけど、ぱっつんぱっつんになってからデータ引っ越すのめんどうだしねえ、ということで WD の 1TB のディスク二個買ってきた。正月に(笑)

で、取り付けて認識されたので満足して。
めんどうなので、今までほっといたというのがこれまでのあらすじ。

どんなふうにしようか?

ZFS のちょっとうれしいところは、物理的な「場所」と論理的な「ディレクトリ」の結合が緩いから、パーティション分割とかまったく考えなくていいところ。まあ、すべてを ZFS で管理するなら、という前提になるけど。

つことで、

  • プールは一個 (extank)。二個のHDDをミラーにして 1TB の領域を確保。
  • 考えるのめんどくさいんでとりあえず export より下をまるごと引っ越してしまおうと。

なんかさ、私運用系の人じゃないので、そもそも「プールにどういう名前をつけるか」とかがわからんのよね。で、今回は安易に「extra につけたdata tank だから extank」ってことで。

プールの作成とファイルシステムの作成

その下に rpool/export の下を全部引っ越すってことなんだから、

$ pfexec zpool create extank mirror c10t0d0 c10t0d1
$ pfexec zfs create extank/export -o dedup=on
$ pfexec zfs create extank/export/home -o dedup=on
$ pfexec zfs create extank/export/home/naruhiko -o dedup=on

としました。dedup を on にしたのは単なる洒落です。ある機能は使わないともったいない。あといちいち全部に指定しなくても inherit するんじゃーねーかとか思ったけど、まあ指定して悪いってことはないでしょう。

あとから考えると zfs create 要らなかったんじゃね? と思うけど、ま、キニシナイ。

データのお引越し

これはちょっと悩んだ。
というのはログイン中には当然 rpool/export 以下はマウントされてるわけで、それを引っ越すというのはちょっとおっかない。うっかり書き込みとかされたらアレだしね。
Live CDで起動するとか別ブート環境 (BE) でやるとか考えたけど、まあ一番安易な方法で、シングルユーザーモードでやることにしました。

シングルユーザーモードでログイン

GRUB の画面で "e" でエディットモードにして Kernel の行に -s をつける。
スプラッシュ止めるの忘れてたのでいつまでもスプラッシュが止まらなくて、あれ〜と思ってたけど、エスケープ押したらログインプロンプトが出てた。あほやん。
ということで、無事に root でログインした。
/export/ 以下もちゃんとアンマウントされてることを確認。
さて、どうやってコピーするべ。

お引越ししなきゃ!

まあ引越し前と引越し後をどっかにマウントして cp してもいいけど、もうちょっとカッコいい方法はないもんか。
ということで、zfs send / recv でやってみることにした。

zfs send / recv によるお引越し〜その1:コピー元にスナップショット作成〜

解説を読むと zfs send するときにはまずはスナップショットを取って、そのスナップショットを send するってことになるらしい。まあねー、send してる間に書き変わっちゃったら困るしねー。
ということで、まずはスナップショットを取りましょうそうしましょう。

# zfs snapshot rpool/export@snap1

んで、send / recv しましょう。

# zfs send rpool/export@snap1 | zfs recv extank/export

そしたら、エラーが出る。
なになに、「もうそのファイルシステムは存在するから、上書きしたいなら -F オプションをつけろ」とな。
なーんだ、さっき作ったの意味ないじゃんか、と思いつつもう一回。
あれ? またエラーだ。なんで?
ファイルシステムがスナップショット持ってる場合は上書きできないよーん。スナップショットを削除してもっかいやってみ?」
えー、そんなの作った覚えな……あ! タイムスライダーだ!

zfs send / recv によるお引越し〜その2:タイムスライダーの罠〜

タイムスライダーというのは OpenSolaris をデスクトップ OS として使うときのウリの一つで、要は定期的に ZFS スナップショットをばんばこ取ってくれるので、「あーっ操作ミスって大事なファイル潰しちゃった!」というときでも、元に戻せるという機能です*1

んで、さっき zfs create したあといろいろ調べごとしてたから、その間にスナップショットが取られちゃったと。

ので、次のようにしてスナップショットを見てみると、

# zfs list -t snapshot -r extank

あるわあるわ、自動で取られたスナップショットが。
ので、これを地道に zfs destroy で削除しました。
いっそのこと zfs destroy extank/export とかやりたかったんだけど、スナップショットがあるファイルシステムには destroy できないんだってさ。うみゅー。

あれ、今考えたらプールごと消して再度つくればよかったのかな? まあいいや。

zfs send / recv によるお引越し〜その3:今度こそ send/recv〜

さて消えた。今度こそっ。あ、rpool/export/home と rpool/export/home/naruhiko にも snap1 は作ってあります。

# zfs send rpool/export@snap1 | zfs recv -F extank/export
# zfs send rpool/export/home@snap1 | zfs recv -F extank/export/home
# zfs send rpool/export/home/naruhiko@snap1 | zfs recv -F extank/export/home/naruhiko

もしかしたらリカーシブにやる方法があるかもしれないけど、たかだか三階層なのでコピペでいいやってことで。
さすがに最後のはちょっとだけ VirtualBox のイメージデータとかあって時間がかかったけど、待ってたら問題なく終了。

あ、そうそう、豆知識として、zfs send / recv ってパイプでつないでるところで察しがつくと思いますがファイルシステムのスナップショットをシリアライズした結果を標準出力で扱うんですよね。
だからファイルに落とせばバックアップもできるし、ssh 使ってパイプすればネットワーク先にもコピーできるという素敵なコマンドです。うーん便利。

zfs send / recv によるお引越し〜その4:mountpoint の変更〜

さてファイルの中身はコピーされたけど、マウントポイントを変えてあげないと、起動したときにコピーされた先を見てくれないので寂しさ一杯。
ので、ささっと変えましょう。

# zfs set mountpoint=none rpool/export
# zfs set mountpoint=none rpool/export/home
# zfs set mountpoint=none rpool/export/home/naruhiko
# zfs set mountpoint=/export extank/export
# zfs set mountpoint=/export/home extank/export/home
# zfs set mountpoint=/export/home/naruhiko extank/export/home/naruhiko

これも一気にやる方法あるのかもしれないけど、華麗にコピペ。

最初の三行はマウントポイントを none、つまりどこにもマウントしないとする指定。まああとはいいよね。

さてドキドキの再起動。

ドキドキしながらリブートすると……よし! 立ち上がった!
試しに大きなデータ(って、OS の ISO イメージだけど) をいくつかダウンロードして、zfs list すると、ちゃんと新しい方のディスク使用量が増えている。よっしゃよっしゃ。

おしまい。

ということで OpenSolaris 内部でデータお引越し作戦、無事終了。
多分もっと上手いやり方あるし、気軽にマネして痛い目見ても責任はとりませんが、まあ、こんな感じでできましたよというシンプルなご報告。

実はネットワーク周りのあれやこれやで、今このブログを執筆しているノートパソコンからサーバに ssh はおろか ping も通らないという激しくダサいことになっているので、それさえ解消したら DLNA のサーバにしたいとかあーとかこーとか妄想が膨らみますな。

*1:元に戻すことについて簡単なUIが存在しない(よね?)のが難点ですが。