ブログトップ 記事一覧 ログイン 無料ブログ開設

IT 東京 楽しいと思うこと

2009-04-25

rsyncでバックアップ

| 01:10 |

LinuxMac間で相互に必要なファイルのバックアップを取ることにしました。

バックアップツールは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'

パスワードでのsshログインを禁止します。

[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は同じもの

| 10:19 |

Linuxだと

shはbashへのシンボリックリンクだったりします。cshtcshも同じ関係ですね。

[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

cshtcshはハードリンクです。

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


ちなみにOSカーネルのバージョン

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の挙動がおかしい

| 14:56 |

strptime関数を使って「20081122」のように区切りのない日付文字列を「%Y%m%d」というフォーマット文字列で解析したところ以下のような結果に。

Linux

  • 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マウント

| 23:04 |

起動時に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";
  };
}

再起動・・・


でけた。設定ファイルの細かいところはまた調べます。