Tech:ser:move
出典: Tariki
目次 |
おうちサーバの移転
この項は自分メモに近い。なおかつ、FreeBSD限定。
ブートディスク移転に関する考察 (およびWindowsディスクの移転)
基本的にブートディスクの移転というのは、ディスクのパーティション(IDEに4つまであるパーティションのこと)の中身をコピーして、ブートブロックをコピーないし作成すれば終わりである。実際FreeBSDではいまでもそうしているし、Windows系でもこれができたような気がする。
ブートディスクといっても特別なものではなく、ディスクのブートブロックにあるブートローダが読み込まれ、そこがファイルシステムを識別して特定のディレクトリから特定のファイル名のファイルをロードして、それがOSのカーネルとなるわけである。昔のしょぼいOSならいざ知らず、カーネルの位置がディスク上で固定とかそういうことはないはずだ。
最近みたディスク移転のページに
- NTFSでは、旧ディスクをそのままコピーしただけでは立ち上がらない (専用ツールなどを使う)
なる記述があった。私はMSDOS系からはじまり、NTFS系にしてからも上記のコピー技で(確か)ディスクを何度回転させた覚えがあるので、この記述は
ブートディスクのパーティションをコピーしてもブートブロックは コピーされない
ことを指しているのだと思う。いずれにしても私もコピーで移転したとしても、ブートブロックの作成は『Windowsの修復インストール』で行なっているので、もしかしてNT系ではただのコピーでコピーされないディスクの構造依存の何かが必要で、それがコピーではコピーされなくて『修復』のときに再作成されているとしてもよくわからない。っていうか知ったこっちゃない。
以下はFreeBSDの話になっちゃうので、ここでDOS/NTFS系移転のまとめ
- 新ディスクをUSB大容量外部記憶装置などとして接続、フォーマット、パーティションを切る
- 必要パーティションをコピー。
- ただしこのとき『C:\WINDOWS』ディレクトリ内のスワップファイルだけは除く。スワップファイルをコピーしようとするとロック違反でコピーがそこで止まってしまう。
- 新ディスクに入れ替える
- Windowsを修復インストール
- ブートブロックの作成
移転: 強制移転編
最初の方法は、ddでまるごとディスクの中身のコピーをとる技である。
これは論理構造のコピーではなく物理構造のコピーなので、とにかく速い。なおかつ、ディスク内に他のOSのパーティションがあろうとブートブロックがあろうと、丸ごとコピーできる。
○ ディスク丸ごとコピー # dd if=/dev/古いディスク of=/dev/新しいディスク bs=適当
- 『bs=適当』のところは適当な数字(メモリ量より小さく)。1回のコピーあたりのブロックサイズなので、デフォルトの512バイトずつとかちまちまやっていると効率悪いです。最近は100m (100MB) とかを指定
- 『古いディスク』『新しいディスク』は、ad0 (ATAの場合)とかda0 (USB接続擬似SCSIディスクの場合)とか。後述のように1パーティション単位の場合はパーティション名が入る。確かUNIXではcパーティションがディスク全体だったと思うのだが、この場合は『ad0c』とかにはならない。昔(たしかFBSD4以前?)はこれは、『rad0』とかいう名前だった、いわゆるraw disk deviceです。
ただし容量が異なると使えないし(使ってもいいが元のディスクより小さい場合はエラーで停止し、最後のパーティションは不完全状態になるし)、大きい場合は単に大きくなった分のディスクが使われない。Windows上のツール『PowerX Partition Manager』などでは、上記で大きなディスクに移転しておいて、使われないケツの方を後から拡張してやるという技が使えるようだが、このツールはFFS (BSD fast file system) が扱えない。PowerX自体でもこのddに類することはできるようだし (ハードディスクのコピー)、そもそもこのツールってLinuxのアプリじゃないのか? (笑) (もっともWin上で使えるアプリバージョンは違うと思う)
この方法のよくない点は、たとえばディスクにbad sectorなどがあってもそれがそのままコピーされちゃうという点である。とよくいわれているが、最近のHDDではbad sectorの代替はハードで自動に行なうし、bad sectorはtarなどで論理的にコピーしてもbad sectorだし (まあリトライがあるからいつかは正しく読めるのかもしれないが、それも程度問題)、逆にbad sectorがあるからといって読み出しが停止するようでは困るので論理的コピーより優れている面もあると思う。
また、元のディスク構造そのままをコピーしちゃうので(FBSDが知らないfsでも暗号化fsでも自由自在)、フラグメントなどもそのまま引き継がれる。
移転: 話し合いによる和解移転編
タイトルに特に意味はありません。
次は、古いディスクからファイルとして読み出したファイルを(なぞ)、新しいディスクにファイルとして書き出す方法である。ディスクを新しくしたらこの方法でコピーしましょう、とよく推奨されているので、細かい理屈は略。
ディスクが壊れて移転するのではない場合、たいていは大きなディスクにお引越しするはずである。上記ddでは大きくなった分が使われないので、たいていこの方法で移転する。
まずは新しいディスクの準備である。古いディスクのdfなどをみながら (SWAPの大きさはsysinstallなどで確認。まあ他のパーティションサイズから逆算すればたいてい分かるけど)、新しいディスクのパーティション割りを決める。
○ パーティショニング
1. 後述の新しいディスクがマウントされるポイントを全部作っておく
# mkdir /root.new /usr.new /home.new
とか。
2. # /usr/sbin/sysinstall ※ 古いOSでは /stand/sysinstall
3. custom→labelでディスクのスライス(IDEのパーティション)を割る。
type 165 (FFS)を付けたらwして書き込む。boot loaderは適当に選ぶ。
※ sysinstallはインストーラなので、基本的に操作をためておいて
後で実行する。ディスク再配置だけのために使うなら、その都度
明示的に書き込まないいけない。
4. partitionで適当にパーティションを分ける。
a. このとき、新しいa (/) パーティションは、いったんfile systemを
指定してmount pointを『/』にする。
b. 全部の配置が終わってから、mコマンドでaパーティションのマウント
ポイントを『/root.new』とかにずらす。現在使っているのと同じ
パーティションにマウントする予定のところ(『/usr』とか)もすべて、
新しいディスクのマウントポイントにしておく(『/usr.new』とか)
c. wで書き込んで抜ける。
5. そのままの新しいパーティションのマウントポイントに古いパーティション
からコピーしてもよし、いったんumountしてからコピー作業をしてもよし。
root file systemの補足すると、sysinstallコマンドはmount pointが『/』でないとaパーティションにならない仕様な模様。だから4-a.でaパーティションを作成するために『/』と名前をつけておく。ただしこのままだと、4-c. でwしたときnewfs→mountを発行されてしまうので、ルートファイルシステムが新しいディスクの方(空)にいってしまって動作中のOSが死んでしまう。同様にたとえば/usr/ も新しいディスクのほうに再マウントされるのを防ぐため、mコマンドで/usr.newとかにずらしておく。また、旧ディスクのルートファイルシステムにこのmount pointができていないとエラーになるため、1.の準備が必要なのである。
○ パーティション (ルート以外) をコピー 1. dfなどで、古いディスクのパーティションごとのマウントポイントを確認 (これを/hoge/ とする) 2. # cd /hoge して 3. 新しいディスクのコピー先パーティションをマウントする (/mnt/ に マウントしたとする) 4. # tar cvf - . | (cd /mnt; tar xf -)
他にもdump | restoreを使う技などもある (ってかGNU tar以前はそっちが普通だった)。最近はcpも-pオプションなんてのがあるので、別にcpしてもよいかもしれない。
ただし問題はルートファイルシステムのコピーである。
まず、ルートファイルシステムは特殊ファイルがあるということ。これはdump/restore、GNU tarでは特殊ファイルのノードはそのままコピーできるので、問題ない。
次にルートファイルシステムにはたいてい、他のパーティションがマウントされていること。これを無視してコピーしないと、移転先のルートにすべてのパーティションの中身がコピーされてしまう。通常ルートはそんな容量はないし、何より移転先のパーティションもここにマウントされている(笑)。
○ ルートパーティションをコピー 1. /usr/ 以外は外せるものなら外しておく (/usr/ はtarコマンドがある)。 1. dfで古いディスクのパーティションごとのマウントポイントを確認。 たとえば『/usr/』が別パーティションだったとする。 2. # cd / して 3. 新しいディスクのコピー先パーティションをマウントする (/mnt/ に マウントしたとする) 4. # tar -cvf - --exclude /usr --exclude /mnt . | (cd /mnt; tar xf -)
(2008年 6月29日追記) これではまっちまったのだが(笑)、FreeBSDのルートには移転されなかったマウントポイントが必要だ。上記 /usr/、/mnt/ といったディレクトリも作っておく必要がある (今回の移転では、もともと別ディスクに一日一回バックアップを取るスクリプトを運用していたのでそれを使って移転したが、上記のほか /proc/、/dev/ なども除外するスクリプトだった)。
