i386からamd64への FreeBSDの引越
職場に設置して、職場でも家からも常用していたサーバ (FreeBSD i386) が再起不能 (と思われる) になった。そこで、本当は家で使うつもりで購入して職場に放置してあった別の PC (Opteron) に環境を移行することにした。以下、何となくその時のメモ。
素直な方法
普通に考えれば、最新リリースの amd64版のインストール CDを使って新ハードウェアに OSをインストールして、古い環境のハードディスクをマウントして /home以下など、必要なファイルをコピーすれば良いのだが、これは誰かにそれなりの時間モニタを見てもらわないとできないので、この方法は今回は不採用。
教訓: ある程度 Unixが分かる若者をちゃんと育成しましょう。
じゃぁその代わりにどうするの?
まず、古い環境のハードディスクを1台目のドライブとして認識されるように新ハードウェアに接続してブートする。そうすると以前同様に sshでログインして普通に作業ができるので、後はネットワーク経由でやりたい放題。
ところが、なんと言っても旧ハードウェアのトラブルで引越を余儀なくされた関係で、旧環境のハードディスクが激しく壊れている模様。ブートしないので見てもらうと、マニュアルで ffsckしなさいというメッセージとともにシングル・ユーザ・モードに落ちてしまっていた。それではそこから fsck -a -y としようと思ったが、キーボードからの入力が受け付けられない。
そう言えば、以前 USBキーボードでシングル・ユーザ・モードを使う時に何かおまじないが必要だったのを思い出して調べてみると、どうやら loader.confか device.hintsに hint.atkbd.0.flags="0x1" と書けばいいらしいことが分かった。が、当然ファイルの書き換えはできないので、ブート・ローダのプロンプトで
set hint.atkbd.0.flags="0x1"
などと入れてみたのだがこれでもだめだった。そこでこの日はあきらめて、旧環境のハードディスクを自宅へ持ち帰って、自宅の FreeBSDの PCに接続して fsckすることにした。
教訓: 持つべきものは ATA/SATAを USBに変換するアダプタである。
気を取り直して
無事にfsckした旧環境のハードディスク (fsckには予想外に長い時間を要した) を、新 PCの起動ドライブとなるように接続して起動。見事に旧環境が新ハードウェア上で復活。これだけでも良いと言えば良いのだが、新環境は Opteronということで、どうせなら amd64のバイナリで動くようにしたい。その場合、各種ソフトウェアのリコンパイルも必要なので、それなりに時間が必要な作業となる。
新ハードディスクを設定
ということで、まずは amd64環境を構築するためのハードディスク領域を作る。幸い新ハードウェアには大量のディスクが載せてあるので、その内の一つについて fdiskと disklabelで設定することになるのだが、この部分は sysinstallの post configurationからやる方が楽ちん (だと思う) なのでそうした。
その際の失敗は、 disklabelのマウント・ポイントの設定で、 /だの /usrだのと書いてしまったために、いざラベルを書き込む時に、新しい、空っぽの領域が既存環境の /にマウントされてしまい、その先何もできなくなってしまったことだった。ということで、既存環境で sysinstallを使う時は、マウントポイントの設定に注意すべし。
amd64環境のビルド
新しく確保したハードディスク領域を適当なマウント・ポイントにマウントする。仮に /aにマウントしたとしよう。そうしたら以下を実行:
# make TARGET_ARCH=amd64 DESTDIR=/a world # make TARGET_ARCH=amd64 DESTDIR=/a kernel # make TARGET_ARCH=amd64 DESTDIR=/a distribution
これが全てうまく行けば、ビルドは終了。
ビルドを待つ間に
現在の /homeをまるごと新環境の /homeになる領域にコピーする作業を平行してやると良いだろう。もちろん旧ハードディスクをそのまま使う場合は不要だが、それでも再起動した時に ~/.sshがちゃんと見えるようになっていないと sshでのログインができないから何らかの作業をしておく必要はあるだろう。コピーに当たっては、 cpに -pRをつけるなり、 tar に -pをつけるなり、 rsync -aするなりして、ファイルのモードなどが変わらないようにするのが肝要。
電源を落とす前に
ファイルのコピー
少なくとも以下のファイルを新環境の /etc (つまり /a/etc) にコピーしておくと良いだろう。
- rc.conf -- ホスト名とか IPアドレスが書いてあるので必要
- /etcの passwd, master.passwd, pwd.db, spwd.db, group -- ユーザとグループ情報
- /etc/ssh/ssh_host* -- sshのホスト鍵 (なくてもいいけど、引き継いだ方が良いでしょう。)
他にも、 resolv.conf, ntp.confあたりはコピーしておくと良いけれど、しなくても困らない。もちろん、いろいろなサービスが上がっているホストの場合はもっといろいろとコピーする必要があるが、そういうホストの場合は、そもそもこんなネットワークにつながった状態での引越はしないだろう。
ログイン・シェルの確認
もう一つ重要なのは、自分のアカウントのログイン・シェルを、 shとか cshとか、元々システムにあるものにしておくこと。そうでないと、仮に再起動後に sshdがちゃんと上がってログインできるような状態になっても、シェルが不正で、 Illegal userがどうこうというログ・メッセージとともに、 sshによるログインが拒絶されてしまう。 (実際僕はログイン・シェルが zshになっていたためにしばらく悩んだ。)
ただし、 /a/etcにコピーした後のファイルをいじってログイン・シェルを変更するのは面倒なので、現在起動中のシステムで vipwを使って変更してからファイルをコピーする方が無難だろう。
fstabの編集
忘れてならないのが新環境の fstab (/a/etc/fstab) の編集である。これをちゃんとしておかないと、起動してもファイルシステムのマウントが正しくされず、全く使い物にならない。注意点は、次に起動する時には、このドライブが起動ドライブになるように接続し直すので、このドライブのディバイス名が変わる、という点。
便利かもしれない設定
新環境の sshd_configで、 PermitRootLoginを yesにしておくと、上述のようなログインできないとかいうトラブルの際に便利だと思うが、 noに戻すのを忘れないことが大切である。
新環境で起動
ここまですれば、後は一度 shutdown -p してから、新環境を構築したディスクが起動ドライブになるように接続し直して電源を入れればよい。うまくログインできたら、後は常用している各種ソフトウェアをひたすらインストールしたり、旧環境のハードディスクをどこかにマウントしてファイルをコピーしたりすれば良い。
ATA/SATA -> USB変換アダプタは偉大だ
一つ手元に持っておいて損はないと思った。アダプタを使わず電源だけでもかなり重宝した。特に旧ハードディスクを一時的に接続している時は、ケースの中のケーブルをがんばって取り回さなくても電源を確保できるので大変便利。そういう意味では、同様の機能を持つハードディスク・ケースよりも、コネクタが向きだしのアダプタの方が使い道が多そうだ。たとえばこんなの:
感想
いやぁ、何とかなるもんですね。
Opteron (たぶん 2ghz) は早い。
おまけ
ATA/SATA -> USB変換アダプタで接続してあった旧ハードディスクへのアクセスができなくなったので、 camcontrol rescan 0 とかしたら、それっきりうんともすんとも言わなくなりました。ということで、引越はまだ終わっていない。