Rsync増分バックアップはまだすべてのファイルをコピーします。

Rsync増分バックアップはまだすべてのファイルをコピーします。

現在、rsync用のbashスクリプトを作成しています。私は何か間違っていると確信しています。しかし、私はそれが何であるかを言うことはできません。私はすべてを詳細に説明し、誰かが私を助けることができることを願っています。

スクリプトの目的は、フルバックアップと増分バックアップにrsyncを使用することです。 1つの重要な点を除いて、すべてがうまくいくようです。その--link-destパラメータを使用しても、すべてのファイルをコピーしているようです。ファイルサイズを確認してみましたdu -chs

まず、これは私のスクリプトです。

#!/bin/sh
while getopts m:p: flags
do
  case "$flags" in
    m) mode=${OPTARG};;
    p) prev=${OPTARG};;
    *) echo "usage: $0 [-m] [-p]" >&2
       exit 1 ;;
  esac
done

date="$(date '+%Y-%m-%d')";


#Create Folders If They Do Not Exist (-p paramter)
mkdir -p /Backups/Full && mkdir -p /Backups/Inc

FullBackup() {
  #Backup Content Of Website
  mkdir -p /Backups/Full/$date/Web/html
  rsync -av user@IP:/var/www/html/ /Backups/Full/$date/Web/html/

  #Backup All Config Files NEEDED. Saving Storage Is Key ;)
  mkdir -p /Backups/Full/$date/Web/etc
  rsync -av user@IP:/etc/apache2/ /Backups/Full/$date/Web/etc/

  #Backup Fileserver
  mkdir -p /Backups/Full/$date/Fileserver
  rsync -av user@IP:/srv/samba/private/ /Backups/Full/$date/Fileserver/

  #Backup MongoDB
  ssh user@IP /usr/bin/mongodump --out /home/DB
  rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
  ssh user@IP rm -rf /home/DB
}

IncrementalBackup(){
  Method="";
  if [ "$prev" == "full" ]
  then
    Method="Full";
  elif [ "$prev" == "inc" ]
  then
    Method="Inc";
  fi

  if [ -z "$prev" ]
  then
  echo "-p Parameter Empty";
  else
  #Get Latest Folder - Ignore the hacky method, it works.
  cd /Backups/$Method
  NewestBackup=$(find . ! -path . -type d | sort -nr | head -1 | sed s@^./@@)
  IFS='/'
  read -a strarr <<< "$NewestBackup"
  Latest_Backup="${strarr[0]}";
  cd /Backups/

  #Incremental-Backup Content Of Website
  mkdir -p /Backups/Inc/$date/Web/html
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/html/ user@IP:/var/www/html/ /Backups/Inc/$date/Web/html/

  #Incremental-Backup All Config Files NEEDED
  mkdir -p /Backups/Inc/$date/Web/etc
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/etc/ user@IP:/etc/apache2/ /Backups/Inc/$date/Web/etc/

  #Incremental-Backup Fileserver
  mkdir -p /Backups/Inc/$date/Fileserver
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Fileserver/ user@IP:/srv/samba/private/ /Backups/Inc/$date/Fileserver/

  #Backup MongoDB
  ssh user@IP /usr/bin/mongodump --out /home/DB
  rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
  ssh user@IP rm -rf /home/DB
  fi
}

if [ "$mode" == "full" ]
then
  FullBackup;
elif [ "$mode" == "inc" ]
then
  IncrementalBackup;
fi

私が使用したコマンド:フルバックアップ bash script.sh -m full

増加 bash script.sh -m inc -p full

スクリプトを実行すると、まったくエラーは発生しません。上記のように、まだすべてのファイルをコピーしているようです。私が行ったいくつかのテストは次のとおりです。

du -chsの出力

root@Backup:/Backups# du -chs /Backups/Full/2021-11-20/*
36K     /Backups/Full/2021-11-20/DB
6.5M    /Backups/Full/2021-11-20/Fileserver
696K    /Backups/Full/2021-11-20/Web
7.2M    total
root@Backup:/Backups# du -chs /Backups/Inc/2021-11-20/*
36K     /Backups/Inc/2021-11-20/DB
6.5M    /Backups/Inc/2021-11-20/Fileserver
696K    /Backups/Inc/2021-11-20/Web
7.2M    total

ls -liの出力

root@Backup:/Backups# ls -li /Backups/Full/2021-11-20/
total 12
1290476 drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
1290445 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290246 drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web
root@Backup:/Backups# ls -li /Backups/Inc/2021-11-20/
total 12
1290506 drwxr-xr-x 4 root root 4096 Nov 20 19:28 DB
1290496 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290486 drwxr-xr-x 4 root root 4096 Nov 20 19:28 Web

増分バックアップを実行してファイルを変更/追加するときのRsync出力

receiving incremental file list
./
lol.html

sent 53 bytes  received 194 bytes  164.67 bytes/sec
total size is 606  speedup is 2.45
receiving incremental file list
./

sent 33 bytes  received 5,468 bytes  11,002.00 bytes/sec
total size is 93,851  speedup is 17.06
receiving incremental file list
./

sent 36 bytes  received 1,105 bytes  760.67 bytes/sec
total size is 6,688,227  speedup is 5,861.72
*Irrelevant MongoDB Dump Text*

sent 146 bytes  received 2,671 bytes  1,878.00 bytes/sec
total size is 2,163  speedup is 0.77

私はこれが./それに関連していると思う。私は間違っているかもしれませんが、疑わしいようです。同じコマンドを再実行すると./ログには残りませんが、同じ日に実行したせいか/Backup/Inc/2021-11-20フォルダに上書きされました。

ls -lの出力

root@Backup:/Backups# ls -l /Backups/Inc/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:49 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:49 Web
root@Backup:/Backups# ls -l /Backups/Full/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web

編集者のコメント:

root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Full/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 19:49:31.701680076 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:17.586745740 +0000 ..
-rw-r--r-- 2 root root  158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root   34 2021-11-20 19:49:31.701680076 +0000 lol.html
-rw-r--r-- 2 root root  414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css
root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Inc/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 23:16:47.673977833 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:54.903294115 +0000 ..
-rw-r--r-- 2 root root  158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root   44 2021-11-20 23:16:47.673977833 +0000 lol.html
-rw-r--r-- 2 root root  414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css

詳しくはお知らせください。長い間頑張ってきました。たぶんリンクを作成し、ディスクスペースを節約するのは間違っているかもしれません。

答え1

リンクされたファイルがファイルシステムの2つの場所にあるため、混乱が発生します。使用されているディスクビューを使用すると、ファイルduは両方のツリーに配置されるため、各呼び出しですべてのduファイルが検索されます。上の結果を合計し、ファイルが望むよりも2倍のスペースを占めるという結論を下しました。つまり、ハードリンクは機能しません。

エラーは、最高ディスク使用量の結果を合計することです。代わりに、du両方のバックアップツリーを含む単一のツリーを実行してみてください。duファイルは検索回数に関係なく一度だけカウントされるため、ディスクの節約効果が表示され始めます。

以下は実際の例です。

mkdir /tmp/a                       # Working directories
cp -a /etc/* /tmp/a 2>/dev/null    # Generate some data in /tmp/a
cp -al /tmp/a /tmp/b               # Link it into /tmp/b

次に、各ツリーで使用されるディスクの量を測定しましょう。すべてのファイルがリンクされているので、同じでなければなりません。 (ls -lすべてのファイルのリンク数を見るとこれを確認できます。)

du -ms /tmp/a                      # Disk usage summary
8       /tmp/a                     # Result

du -ms /tmp/b                      # Disk usage summary
8       /tmp/b                     # Result

ここでは、両方のディレクトリツリーが約8MBを使用しているようです。それでは、これら2つのツリーを一緒に見てみましょう。

du -ms /tmp/a /tmp/b               # Disk usage summaries
8       /tmp/a
1       /tmp/b

/tmp/aそれでも8MB程度が使用されていることがわかりますが、/tmp/b今では8MBではなく1MBしか追加されません。これは、他のファイルがすでに考慮されているため、追加のディスク領域を占有しないためです。 (ディレクトリ構造は追加スペースを占有します。)

データセットが大きいほど、比率は良くなります。以下は、私の小さなシステムの1つからのバックアップの断片でrsnapshot、これらのバックアップ間の24時間で1 GB未満のバックアップが発生することを示しています。

du -ms daily.{0,1}
30752   daily.0
782     daily.1

関連情報