FreeBSD サーバーを 10.3 に更新するために、今まで調べることが面倒で使わなかったコマンドと、発生する度毎回オンラインマニュアルを参照して時間を無駄にしていたコマンドの操作方法を、忘れないようにメモすることにします。
rsync
簡単に書くとDropbox や OneDrive のように、別マシンのハードディスクの状態を、ターゲットマシン上に同期するための仕組みです。
Dropbox/OneDrive のように離れたマシンの同期だけではなく、ローカルドライブのコンテンツを、別の場所にコピーする場合(find | cpio のようなもの)にも使えるようです。
rsync を使う前に必要なこと
- オリジナルコンテンツを含むマシン(A)の sshd に root ログインする許可を与えること
/etc/ssh/sshd_config を編集#PermitRootLogin no
を
-
PermitRootLogin yes
に変更。その後、sshd を再起動させる。
- (Aで) rsyncd を動かして、かつ、コピー先(B)から、rsync, ssh でアクセス可能な状態にしておくこと。
両方のマシンに、pkg install rsync
で rsyncd をインストール。(A) はサーバーとして、(B) はクライアントとして。
- (Aの) /usr/local/etc/rsync/rsyncd.conf を編集して、バックアップ対象のディレクトリに対して読み込み可能状態にしておくこと。
例えば、次のように書いておけば、引っ越しに必要なファイルには全部アクセスできるはず。[home] path = /home comment = user home directories auth users = root, moveman read only = yes [var] path = /var comment = variable data directories auth users = root, moveman read only = yes [etc] path = /etc comment = host etc directories auth users = root, moveman read only = yes [local] path = /usr/local comment = host local directories auth users = root, moveman read only = yes
編集できたら、
service rsyncd onestart
で、デーモンを起動。onestart を使うのは、rsync を常時起動させないため。オンデマンドで使うため。
- データのコピー
rsyncd は必ずAで起動する必要はなく、新マシンBで起動しても問題はありません。今回のケースでは、オリジナルコンテンツが重要であるため、rsyncd をマシンA側で起動し、間違った操作をしてデータが消えることがないように備えただけです。
/home のデータを新マシンBに同期したい場合、B にて、rsync -av --delete root@src_server:/home /
というコマンドで、データを同期できます。上記コマンドの後、root パスワードを尋ねられます。データのコピーは ssh チャンネルで行われます。初回は転送先ディスクは空っぽなので、 –delete オプションは不要ですが、オリジナル側のデータが更新された場合は –delete オプションを付けて、データが完全に一致するようにします。
データ同期が不要になった場合(サーバー移設作業が終了したら、)sshd_config を元に戻し、 rsyncd を停止させておく方が安全です。 - 上記手順は、サーバー移設時に使用するための rsync の使い方でしたが、rsync は同一コンピューター上で使用できますので、例えば、バックアップパーティションを準備して、夜間定期的にバックアップを取るような使い方が出来るそうです。
消せないファイル、ディレクトリ(chflags, schg)
システム管理を行っていると、時々 root ユーザーでも消せないファイルやディレクトリに出会うことがあります。
一般的にファイルやディレクトリを消せない場合の原因は、
- 消す権限がない。パーミッションの問題 の他、
- ファイルが使用中であったり(←使用中だったら消えてもらっちゃ困る)
- chflags でプロテクトされている
- ディスクが壊れている
場合です。
今回、rsync でシステム設定ファイルなどをたくさんコピーしました。一つ一つコピーなんてやっていられませんから、ディレクトリごとコピーします。システムの設定が終わって、参照したファイルを「rm -rf」で消そうとしたものの、root でも消せないわけです。
# rmdir empty/ rmdir: empty/: Operation not permitted
今回の場合、chflags でプロテクトされたディレクトリでした。chflags コマンドを調べてみると、ls の -o オプションで、内容を確認できるとのこと。
# ls -lo
total 4
dr-xr-xr-x 2 root wheel schg 512 Feb 18 2011 empty
schg というフラグが付いていることを確認できました。
この schg フラグを消すためには、schg の頭にno を付けた chflags コマンドを発行すればよいとオンラインマニュアルに書いてあります。
# chflags noschg empty
これで、フラグが消えたので、rmdir コマンドでディレクトリを消せるようになりました。
# ll -o total 4 dr-xr-xr-x 2 root wheel - 512 Feb 18 2011 empty
実際に消去。
# rmdir empty/ # ll total 0
この手順は、過去に何度か使ってはいるのですけど、一年に1回必要になるかどうかなので、すぐに忘れてしまいます。よくやるのが、消す方法を調べるのが面倒だから、HDD初期化するというもの。または放置。
今回は、自分に印象づける目的でメモに残し、コマンドを忘れたとしてもすぐに検索できるようにこのページを作成しました。書いたことを将来も覚えていればいいのですが。