2009-04-25
rsyncでバックアップ
Linux、Mac間で相互に必要なファイルのバックアップを取ることにしました。
バックアップツールはrsyncを使います。rsyncは変更のあったファイルだけコピーする、ネットワーク越しのバックアップに適したツールでLinux(CentOS 5.2)、Mac(OS X 10.5.6)とも、標準で入ってます。
作業としてはこんな感じです。
今回はrootユーザでバックアップを実行しますが、rootでのsshログインを許可するのはセキュリティ上好ましくありません。
簡単なアクセス制限をかけます。
アクセス制限の方法についてはPAMを使う、forced-commands-onlyで他のコマンドを実行できないようにする、専用の一般ユーザで実行する、など他にもいろいろ考えられます。要求されるセキュリティレベルに応じて判断、設定してください。
それでは実際の手順です。今回の環境ではLinuxのホスト名が「cent」、Macのホスト名が「mini」で相互にホスト名の解決ができるようにしています。
SSH設定
Linux側のほうだけのせます。Macでも同じことをやります。
設定をミスるとログインできなくなる恐れがありますので慎重に、動作確認とりつつ行ってください。
まずは鍵作って通信先のauthorized_keysに登録します。パスワードなしのsshログインができるようになります。
ログイン先に.sshがない場合はログイン先でもssh-keygenを実行するかmkdir、chmod 700で作ってください。
[root@cent ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: ... [root@cent ~]# cat .ssh/id_rsa.pub | ssh mini 'cat >> .ssh/authorized_keys'
[root@cent ~]# vi /etc/ssh/sshd_config ... PermitRootLogin without-password ... [root@cent ~]# /etc/init.d/sshd reload
ログイン先のauthorized_keysにfrom="ログインホスト"を追記してログインホストを限定します。IPアドレスでもかまいません。
[root@cent ~]# ssh mini mini:~ root# vi .ssh/authorized_keys from="cent" ssh-rsa AAA<略>UCQ== root@cent
バックアップ対象のパターンリスト
このへんを参考にバックアップ対象、除外対象をリストしたファイルを作りましょう。
Linux
[root@cent ~]# cat ~/rsync.list # tmpディレクトリ、tmpファイルは除外 - tmp/ - *.tmp # /etc,/root,/home,/var/www以下を全てバックアップ + /etc/ + /etc/** + /root/ + /root/** + /home/ + /home/** + /var/ + /var/www + /var/www/** # 上記以外は全て除外 - *
Mac
- tmp/ - *.tmp + /private/ + /private/var/ + /private/var/root/ + /private/var/root/** + /Users/ + /Users/** - *
cronで1日おきに実行する
保存ディレクトリは/var/rsync/<ホスト名>にします。
Linux
[root@cent ~]# crontab -e 30 3 * * * /usr/bin/rsync --archive --delete --ignore-errors --whole-file --exclude-from=~/rsync.list / mini:/var/rsync/cent
Mac
mini:~ root# crontab -e 0 4 * * * /usr/bin/rsync --archive --delete --ignore-errors --whole-file --exclude-from=~/rsync.list / cent:/var/rsync/mini
ちゃんと動いてるかどうかは明日確認します。おやすみなさい・・・
2009-03-21
/bin/shと/bin/bashは同じもの
Linuxだと
shはbashへのシンボリックリンクだったりします。cshとtcshも同じ関係ですね。
[mikeda@cent ~]$ ls -l /bin/*sh -rwxr-xr-x 1 root root 735004 5月 25 2008 /bin/bash lrwxrwxrwx 1 root root 4 11月 2 19:25 /bin/csh -> tcsh -rwxr-xr-x 1 root root 1002540 5月 25 2008 /bin/ksh lrwxrwxrwx 1 root root 4 11月 2 19:22 /bin/sh -> bash -rwxr-xr-x 1 root root 345348 3月 15 2007 /bin/tcsh
Macだと
shとbashは別物?でもサイズとか似過ぎです。実際のところどうなんでしょう。
(とある本には同じものと書いてました。OSバージョン違いますが。)
air:~ mikeda$ ls -l /bin/*sh -rwxr-xr-x 1 root wheel 1244928 3 5 2008 /bin/bash -rwxr-xr-x 2 root wheel 610864 11 25 2007 /bin/csh -r-xr-xr-x 1 root wheel 1955856 11 26 2007 /bin/ksh -r-xr-xr-x 1 root wheel 1244960 3 5 2008 /bin/sh -rwxr-xr-x 2 root wheel 610864 11 25 2007 /bin/tcsh -rwxr-xr-x 2 root wheel 982000 11 25 2007 /bin/zsh ←デフォルトでzshが
air:~ mikeda$ ls -i /bin/*sh | sort 21797 /bin/ksh 22452 /bin/csh 22452 /bin/tcsh 22796 /bin/zsh 1141577 /bin/bash 1141578 /bin/sh
Linux
$ cat /etc/issue CentOS release 5.2 (Final) $ uname -r 2.6.18-92.el5
Mac
$ system_profiler SPSoftwareDataType
Software:
System Software Overview:
System Version: Mac OS X 10.5.6 (9G55)
Kernel Version: Darwin 9.6.0
...
2009-01-12
macのPHPのstrptimeの挙動がおかしい
strptime関数を使って「20081122」のように区切りのない日付文字列を「%Y%m%d」というフォーマット文字列で解析したところ以下のような結果に。
- 2008年11月22日
・mac
- 20081122年・・・?
Linux
[mikeda@cent ~]$ php -v PHP 5.2.6 (cli) (built: Nov 16 2008 01:09:46) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
配列として取り出し。
[mikeda@cent ~]$ php -r 'print_r(strptime("20081122","%Y%m%d"));'
Array
(
[tm_sec] => 0
[tm_min] => 0
[tm_hour] => 0
[tm_mday] => 22
[tm_mon] => 10
[tm_year] => 108
[tm_wday] => 6
[tm_yday] => 326
[unparsed] =>
)
出力。
[mikeda@cent ~]$ php -r 'extract(strptime("20081122","%Y%m%d"));
printf("%4d.%02d.%02d\n",$tm_year+1900 ,$tm_mon+1,$tm_mday);'
2008.11.22
あぶれたものはunparsedに入る。
[mikeda@cent ~]$ php -r 'print_r(strptime("20081122","%Y"));'
Array
(
[tm_sec] => 0
[tm_min] => 0
[tm_hour] => 0
[tm_mday] => 0
[tm_mon] => 0
[tm_year] => 108
[tm_wday] => 1
[tm_yday] => -1
[unparsed] => 1122
)
mac
mini:~ mikeda$ php -v PHP 5.2.6 (cli) (built: Jul 17 2008 23:04:49) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
あれ、なにも表示されない。
mini:~ mikeda$ php -r 'print_r(strptime("20081122","%Y%m%d"));'
%Yが全部のみこんで年数が西暦20081122になってる・・・?
mini:~ mikeda$ php -r 'print_r(strptime("20081122","%Y"));'
Array
(
[tm_sec] => 0
[tm_min] => 0
[tm_hour] => 0
[tm_mday] => 0
[tm_mon] => 0
[tm_year] => 20079222
[tm_wday] => 0
[tm_yday] => 0
[unparsed] =>
)
どうもstrftime()やstrptime()の実装はCライブラリに丸投げされている模様。
Cで動作確認プログラムを書いてみる。
#include <time.h> #include <stdio.h> #include <stdlib.h> int main() { char* str="20081122"; struct tm* t; t = (struct tm*)malloc(sizeof(struct tm)); strptime(str, "%Y%m%d", t); printf("%d.%d.%d\n", t->tm_year+1900, t->tm_mon+1, t->tm_mday); return 0; }
Linuxで実行
[mikeda@cent c]$ ./a.out 2008.11.22
macで実行
mini:c mikeda$ ./a.out 20081122.1.0
はい、挙動が違う。ライブラリのバージョンの問題かな。
Windowsだと使用できるフォーマット指定子なんかも違うらしいし、
おとなしくgetdate()とdate()使うが吉。
(長々と書いたのにw)
[mikeda@cent ~]$ php -r 'echo date("Y.m.d\n", strtotime("20090101"));'
2009.01.01
[mikeda@cent ~]$ php -r 'print_r(getdate(strtotime("20090122")));'
Array
(
[seconds] => 0
[minutes] => 0
[hours] => 0
[mday] => 22
[wday] => 4
[mon] => 1
[year] => 2009
[yday] => 21
[weekday] => Thursday
[month] => January
[0] => 1232550000
)
2008-11-15
macで起動スクリプト使ったNFSマウント
mac | |
起動時にNFSサーバの公開領域をマウントしたい。
ちょっと調べてみるとGUIで簡単にできそうだ。
Applications→Utilities→Directory Utility
ロック外してMounts→「+」と選択。
そして上から
nfs://cent/home/mikeda/nfs /Users/mikeda/nfs -P nosuid
あれ・・・うまくいかない。なんかへんなディレクトリができてる・・・
めんどうになってきたのでやっぱり起動スクリプトの書き方を調べた。
/System/Library/StartupItemsの下に適当な名前のディレクトリを作る。
# mkdir /System/Library/StartupItems/nfs_mount
その中にディレクトリと同じ名前の/bin/shスクリプト作ってやりたいことを書く。
# cd !$
# vi nfs_mount
mount_nfs -P -o soft,nosuid cent:/home/mikeda/nfs /Users/mikeda/nfs
そしてStartupParameters.plistって名前の設定ファイルも作る。
# vi StartupParameters.plist
{
Description = "nfs mount";
Provides = ("nfs_mount");
Requires = ("Resolver");
OrderPreference = "None";
Messages =
{
start = "Starting nfs mount";
stop = "Stopping nfs mount";
};
}
再起動・・・
でけた。設定ファイルの細かいところはまた調べます。

