Memo/Linux/rsync

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/rsync
 

rsync


変数内のinclude/excludeオプションが効かない場合

  • シングルコーテンションを削除するとうまく動作するようだ
    export RSYNC_RSH="ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no"
    
    # include/excludeが効かない場合
    #RSYNC_COMMAND="nice rsync -vauz --copy-links --bwlimit=8192 --timeout=600 --include='*/' --include='*.gz' --include='*.log'  --exclude='*'  /src /dest"
    
    # うまく効く場合
    RSYNC_COMMAND="nice rsync -vauz --copy-links --bwlimit=8192 --timeout=600 --include=*/ --include=*.gz --include=*.log  --exclude=*  /src /dest"
    
    $RSYNC_COMMAND

途中から再開する/i-nodeを変えたくない

  • 「-avz」オプションでは、転送先に一時ファイルを作成し、転送完了後に置き換えるため、i-nodeが変わる。
  • 「--inplace」オプションでは一時ファイルを作成せずに、直接上書きするため、i-nodeは変わらない。zabbix等でログを監視する時に良い。
  • 「--partial --append」オプションを使うと途中から転送され、i-nodeは変わらない。しかし、logのように行末に追記するだけの場合は正しいが、行頭や途中が変わった場合、内容が正しく無い。また、logrotateのようにファイルサイズが0になる場合も正しく転送されない。
    touch src/test.log
    rsync -avz src/ dest/
    
    stat src/test.log 
      File: `src/test.log'
      Size: 679             Blocks: 8          IO Block: 4096   通常ファイル
    Device: fd00h/64768d    Inode: 412733      Links: 1
    Access: (0644/-rw-r--r--)  Uid: (  501/user01)   Gid: (  501/user01)
    Access: 2016-06-28 12:42:46.000000000 +0900
    Modify: 2016-06-28 12:42:39.000000000 +0900
    Change: 2016-06-28 12:42:46.458377859 +0900
    
    echo "add: $(date)" >> 0/test.log
    
    rsync -avz --partial --append src/ dest/
    
    stat src/test.log 
      File: `src/test.log'
      Size: 727             Blocks: 8          IO Block: 4096   通常ファイル
    Device: fd00h/64768d    Inode: 412733      Links: 1
    Access: (0644/-rw-r--r--)  Uid: (  501/user01)   Gid: (  501/user01)
    Access: 2016-06-28 12:44:06.000000000 +0900
    Modify: 2016-06-28 12:43:15.000000000 +0900
    Change: 2016-06-28 12:44:06.435473384 +0900

空ディレクトリをコピーしない

  • -m, --prune-empty-dirs

シンボリックリンクをたどってコピー

  • よく使う "-avz" だとシンボリックリンクはコピーしない
  • --copy-links: 全てのシンボリックリンクを辿る
  • --safe-links: 自ディレクトリの配下へのリンクを辿る
  • --copy-unsafe-links: 自ディレクトリ配下以外のリンクを辿る

--include, --exclude : 指定したファイルだけをコピーする

  • 注意点
    • --include, --exclude の指定順序には意味がある
  • 例: /var/log/*.gz ファイルだけをコピーする。予め user01@src-hostからuser01@dest-hostへSSH公開鍵認証でログインできるようにしておく。
    sudo rsync -vauz --bwlimit=8192 --timeout=600 --include '*/' --include '*.gz' --exclude '*' -e 'ssh -i /home/user01/.ssh/id_rsa -o StrictHostKeyChecking=no' /var/log/ user01@dest-host:/opt/log/$(hostname -s)/
  • 例:--include '*/' だとディレクトリはコピーされる
  • 例:指定ディレクトリのみをコピー。
    cat include.txt
    
    # for home
    + user01/***
    + user02/***
    
    # all exclude
    - *
    
    rsync -avz --include-from include.txt /home/ /backup/
  • 例:ディレクトリと拡張子指定
    rsync -avz --include 'user01' --include '*.gz' --exclude '*'

rsyncが停止する場合

あまり巨大なファイルを転送しようとすると停止する場合がある。
また、cronで実行する場合、rsyncのデフォルトは「--timeout=0」なので永遠に待つ場合があるので必ず付ける。

--bwlimit=8192 --timeout=600

rsync+公開鍵認証

  • 初回の「Are you sure you want to continue connecting (yes/no)?」を出さないようにする
    rsync -avz -e "ssh -i 秘密鍵.pem -o StrictHostKeyChecking=no" 111.222.333.444:/home/hoge/test ./test
  • シェルスクリプト等に組み込む場合で、エラー「Missing trailing-’ in remote-shell command.」の場合。変数展開がうまくいかないので以下のようにする
    readonly SSH_OPTION="-o StrictHostKeyChecking=no -i 秘密鍵.pem"
    readonly RSYNC_RSH="ssh $SSH_OPTION"
    export RSYNC_RSH
    
    rsync -avz 111.222.333.444:/home/hoge/test ./test
  • sudoしてrsyncを実行する場合は、環境変数 $RSYNC_RSH が引き継がれない。「-E」で引き継ぐ。
    sudo -E -u user rsync ...

rsyncで差分バックアップ


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (9d)