トップ 追記

TPRG: 迷走メモ書き

[Donate to CCjp]
2000|12|
2001|01|02|03|04|05|06|07|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|07|08|11|12|
2009|01|02|
2010|04|06|09|

2010-09-21 btr-backup: btrfs で差分バックアップを取ろう

_ btr-backup: btrfs でインクリメンタルバックアップを取ろう

btrfs は Linux 2.6.29 で メインラインに取り込まれ、汎用ファイルシステムとしては一番先進的なものになっている。 CopyOnWrite ベースで作られており、スナップショット、サブボリューム、透過圧縮、 ファイルシステム側での RAID サポート、オンラインデフラグなどなど、 他には無い機能が満載。

しかし、今すぐ手元の ext* を置き換えられるかというと、 japan.internet.com の記事でも触れられているように、まだ 壊れた時にちゃんと直す手段がない など、 いきなりメインのファイルシステムを置き換えるには結構不安な面もあったり。

でも、バックアップ目的なら、今すぐ試せてしかも非常に快適。 バックアップなら最悪ファイルシステムが壊れても、本体と同時でなければもう一度とり直せば良いだけだしね。 ただもちろん、ちゃんとバックアップされているよう見えて、 実は読もうとするとデータが壊れている……なんてのは困るわけだけど…… 今回はそれは考えない!

メリットとデメリット

btrfs + rsync を使って今回やってみる file to file 形式のバックアップは、 faubackup, pdumpfs, rsync --link-dest といったような、 ハードリンクを使う増分バックアップツールに近い。 でも、比較するとかなりのメリットがある。

  • 透過圧縮が効くのでたくさん保存できる
  • 途中でハードリンクが切れて容量が爆発したりしない
  • スナップショット単位での削除が一瞬でできる
  • 拡張属性、ACL の完全なサポート

ただし、デメリットもある。

  • ファイルシステムを用意しないといけない
    • 新しいカーネル、ディスク(もしくはループバック用イメージファイル)が必要
  • btrfs 自体が壊れるかも
  • rsync でコピーするので、ファイルを mv した時にはサイズが増加する (pdumpfs は inode 番号で管理しているので、mv してもバックアップサイズは増加しない)

まあでも、比較すれば十分じゃないかな。

準備するもの

まず、必要なものリスト。

  • btrfs v2.6.32 以降 (スナップショットの削除のため。後述の理由により、できれば 2.6.34)
  • btrfsctl ではなく、新しい統合コマンド "btrfs" (btrfs-progs-unstable の git で 2010-01-24 から入ってます。 Debian sid ならパッケージにバックポートされている。)
  • rsync

仕組みと手順の説明

サブボリュームとスナップショット

増分バックアップの為にこれを使うので、 とにかく簡単にサブボリューム機能について説明してみる。

btrfs は「サブボリューム」と呼ばれる、ファイルシステムの内部に 更にルートディレクトリと見なされるものを作成できる。 これは、(マスターボリュームをマウントしている場合)見かけ上は単に中にある ディレクトリに見えるが、ただのディレクトリとは大きな違いがある。

  • btrfs subvolume create で作成する
  • ディレクトリに見えるが、rmdir では消えない。消すには btrfs subvolume delete を使う
  • サブボリュームだけをマウントすることも可能
  • サブボリューム単位でスナップショットが取れる
  • トップレベルのマスターボリュームも一つのサブボリュームと同じ

そして、スナップショットは内部的にはサブボリュームと同じです。 いったん作ってしまえば両者の区別はありません。マウントしたり書き込みも可能

スナップショットとサブボリュームの違いは単に作成時だけで、以下のような感じ。

  • サブボリュームは空の状態で作られる
  • スナップショットは、あるサブボリュームの現在の状態をポイントしたものが作られる

なので、「スナップショットのスナップショットのスナップショット」なども取れます。

実際の手順

まあ、サブボリューム/スナップショット機能を解説したら、 もう何をすればいいか分かってもらえてるでしょう! レシピはかんたん。

  1. (準備) バックアップ対象に対して1つサブボリュームを作る
  2. サブボリュームに対して rsync でコピー
  3. btrfs filesystem sync (注意!)
  4. 現在の日付などで rsync したスナップショットを取る

これだけ。

ちょっと注意しないといけないのは sync 。これをやらないと、2.6.34以前では フラッシュされていないデータを含まないスナップショットが出来てしまう。 2.6.34以前のカーネルを使っている場合は忘れずにやっておく必要がある。 それ以降のものなら省略できる。 btrfs には 1 ファイルシステムだけ sync する機能があるので、これを使ってsyncする。

実際の例

別に詰まる事はないと思うのだけど、 一応コマンド書いてみよう。

まずファイルシステムを作る。

mkfs.btrfs /dev/sdi1

/etc/fstab に追記。compress,noatime はお好みで。

/dev/sdi1	/backup	btrfs	defaults,compress,noatime	0	0

おおっと待った! /dev/sd* ではなく、UUID で書く事をお勧めしときます。 調べるには btrfs filesystem show で。

UUID=7e727a57-cb18-4869-8b50-5127a9cfb8ac	/backup	btrfs	defaults,compress,noatime	0	0

マウント。

mkdir -p /backup
mount /backup

サブボリュームを作ろう。

mkdir -p /backup/myhost/etc
btrfs subvolume create /backup/myhost/etc/cur

Do rsync! (必要なら ionice とか付けてね)

rsync -avcHSX --del /etc/ /backup/myhost/etc/cur/

これで全部ファイルがコピーされたので、あとはスナップショット取るだけ。

btrfs filesystem sync /backup/myhost/etc/cur
btrfs subvolume snapshot /backup/myhost/etc/cur /backup/myhost/etc/$(date +%Y-%m-%dT%H:%M:%S)

btr-backup スクリプト作りました

ようやく本題にたどり着いた!  上記の様に手でもできるのだけど、面倒なので スクリプトを作っておきましたぜ。 使い方は単純に

btr-backup /etc

など。後ろに rsync のオプションが渡せるので、

btr-backup /var/htdocs -C --exclude="/cache/*"
btr-backup /home --exclude="/old"

と言うような事も出来ます。

リモートバックアップも対応。rsync に渡しているだけなので通常は ssh でログインします。パス無しのキーを設定しておくと good。 こんな感じ。

btr-backup remote:/etc -z

(何か rsync の説明になっているけど) ssh キーを変えたければ RSYNC_RSH を設定するか -e で。

btr-backup remote:/etc -z -e "ssh -i  ~/.ssh/id_backup"

もしくは

export RSYNC_RSH="ssh -i ~/.ssh/id_backup" 
btr-backup remote:/etc 

rsync 起動しているだけなので、rsync プロトコルも使えます(多分使わないと思うけど)。

btr-backup rsync://remote/etc/

という感じ。ぜひ試してみて下さい。詳しくは README を読んでね。 ……というか、単純なので多分スクリプトを読んだ方が早いけど。

自動クリーンアップ用に btr-backup-clean と言うのもあります(based on pdumpfs-clean/hlbackup-clean)。

と。

これを書きたかっただけなのに、解説をしていたら疲れて段々訳の分からない 文章になってきた。よろしければツッコミお願いします。あ、パッチもぜひ。

ChangeLog

  • 2010-09-28: 2.6.34 で sync が必要なくなっていたのでその旨を追加

2010-09-19 b-mobile Wifi 使用レポート

_ b-mobile Wifi 使用レポート

b-mobile wifi

b-mobile Wifi をしばらく使ってみたのでそのレポートでも。

似た製品では PocketWifi が有名だけど、携帯電話の インターネット接続を Wifi に変換(?)してくれる機器。 小型のバッテリー内蔵 3Gルータ。

b-mobile (日本通信) から販売されているけど、中身は ZTE の MF30 の OEM 版のようだ。 一応 b-mobile が用意したマニュアルはついてくるが、本当に最低限の事しか書いていない。

PocketWiki と違ってロックフリーなので、好きな SIM をさして使うことができる。 ……といっても、国内で売られている単体 SIM は b-mobile U300 くらいなので、一般的にはそれをさして使うことになるのだけど。

価格は同様の PocketWifi よりも安い。が、光ポータブルと比べれば高いかな。

設定画面

http://192.168.0.1/ に繋いで web で設定するタイプ。 あまり高度な事はできないが、とりあえず必要な物は揃っている。 3G ネットワーク周りの設定、WEPとクライアント制御、ダイアル制御など。 モバイルルータとしてはこれで十分だろう。

ただ、この設定画面、困った事に HTC desire のブラウザからだと物凄く使いにくい。 一応使えなくはないのだが、たまに横幅がどんどん伸びてゆく現象が起きる。 iPhone の Safari は一応使えるが、これもちゃんと画面遷移しない事がまれにある。

接続情報やアンテナ感度のアイコンを Ajax (? いや、ただのフレームか?)で更新しているようなのだけど、 どうもその辺りの問題の様だ。

起動までの時間

LED の状態を見ると 3G の初期化は早そうだけど、 Wifi の AP として見えるようになるまでは1分強はかかる。 これは他の類似製品でも大体同じようだ。 頻繁に電源を切らないなら問題ないけど、決して早くはないね。

バッテリー

公称4時間だけど、まあそんなもんだろうか。 使ってみた感じ大きく下回るということはない。

このサイズで4時間は凄いとは思うのだけど、実際旅行などで 1日使い倒すには全然足らない。 そういう用途ではモバイルブースターなど外部のバッテリーに頼るしかないかな。

逆にカフェや電車などで時々使うくらいなら、4時間もあれば十分すぎ。

b-mobile U300 との組み合わせはとにかくラク

何も考えずに SIM をさせば使える。 一番最初に U300 自体を activate するのに電話はしないといけないが、 それさえ終わって入ればあとは SIM スロットにさすだけ。 この b-mobile の APN だけは最初から設定されている。

ただ、ルータのせいじゃないのだけど、U300 の(と言うかドコモの) 帯域制限は結構面倒くさい。ssh や scp がとてつもなく遅くなるので、 あまり Unix 使いとしては嬉しくないね。 (一応 port 443(HTTPS) を通してどこかに VPN を張れば制限を回避出来るけど、ちと面倒。)

SIM Lock Free を生かす

香港で使ってみた

3 の SIM

香港のキャリアの一つ、3(Three) のプリペイド SIM を刺してみた。 U300 の諸々の制限もないし、softbank よりよっぽど高速。 日本で使うよりずっと快適で泣ける。

APN の設定

U300 以外設定は入っていないので、手動で設定してやらないといけない。 3G の設定で、追加ボタンを押すと新たに APN を追加できる。

APN: ipc.three.com.hk
ID: (なし)
PASS: (なし)
DIAL#: *99#

電話番号のところに注意。 説明などには電話番号は要らないと書いてあるのだけど、この wifi ルータは何か電話番号を入れないと設定が保存できない。 仕方ないので U300 と同じように *99# を入れておく。

設定後は「ディフォルトに設定」を押しておく。切り替わるまで多少かかるので、何度か接続失敗のダイアログが出る。 あと、一旦ディフォルトにすると編集できなくなるので、入力を間違えた場合は別のものをディフォルトに してから再編集する必要あり。ちょっと面倒くさい。

GSM の地域に注意

GSMの設定

標準ではデータ通信方式が WCDMA しか有効になっていないので、 3G の電波が飛んでいない地域に行く場合は、設定を 「自動」 に切り替える必要がある点に注意。GSM で通信している場合は、 携帯ネットワークのインジケータ(右のやつ)が赤色に点灯する。

両方有効にすると、もしかしたら電池使用量の増加とか ハンドシェイクの低速化などがあるのかもしれないけど、 少なくとも気になるレベルでは起きなかった。

GSM を使う可能性がある場合は、忘れずに設定を切り替えておこう。

ソフトバンクの SIM を使う

日本で HTC desire の SIM をさして使ってみた。

APN 設定
APN: smile.world
ID: dna1trop
PASS: so2t3k3m2a
DIAL#: *99#

SoftBankのAPN

正式には公開されていないので、ちまたに流れる iPhone の APN 情報を入れてみた。これで問題なく繋がり、ちゃんと パケット定額の中に入っている様だ。 ただ、もしかしたら定額を外れる可能性があるので、その辺の リスクは考えた上で使う必要がある点に注意。

USB コネクタ経由でモデムに見える……が

ここからはおまけ……というか、ほぼ役に立たない情報。

Windows で接続すると不明なデバイスが見える。 モデムとして動く様なのだが、残念ながらドライバが提供されていない。

VendorID は 0x19d2, ProductID は 0x0117。インターフェースは3つ 見えるが、class は全部 vender specific (0xff) になっている。

もし Linux kernel 2.6.35 以降を使っているのであれば、 USBコネクタを繋いで暫く待っていると usb-wwan がアタッチされる。

3つの tty デバイスとして見え、最初の一つがコントロール用、 次の二つがモデムに見える。何で2つ見えるのかは謎。機能が違うのか?

で、とにかくモデムに見える2のデバイスは、とりあえず AT コマンドに応答するまでにはなるんだけど……。

状態を取ることはできるものの、今のところ接続には成功しなかった。

NetworkManager + modem-manager では、ZTE のプラグインを 読む様に設定を変えても、エラーで繋がらない。

検索して適当に以下の設定を作り、wvdial も試してみたけど繋がらない。

[Dialer Defaults]
Modem = /dev/ttyUSB2
ISDN = off
Modem Type = USB Modem
Baud = 460800
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2
Init3 = AT+CGDCONT=16,"IP","ipc.three.com.hk"
Phone = *99#
Password = *
Username = *
Stupid Mode = on
Auto DNS = on
Dial Command = ATD
Check Def Route = on
Compuserve = off

このようにエラーになる。

sugi@shine:~% wvdial -C three.conf
--> WvDial: Internet dialer version 1.60
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2
ATQ0 V1 E1 S0=0 &C1 &D2
OK
--> Sending: AT+CGDCONT=1,"IP","ipc.three.com.hk"
AT+CGDCONT=1,"IP","ipc.three.com.hk"
OK
--> Modem initialized.
--> Sending: ATD*99#
--> Waiting for carrier.
ATD*99#
ERROR
--> Invalid dial command.
--> Disconnecting at Mon Sep 20 00:11:26 2010

AT+CEER を試すと "Missing or unknown APN" と言われるので、何か初期化設定が足りないのか……?



Tatsuki Sugiura <sugi@nemui.org>