tar / gzを使用してディレクトリを複数の場所に保存し、追加のコピーを省略します。

tar / gzを使用してディレクトリを複数の場所に保存し、追加のコピーを省略します。

外部USBデバイスにローカルデータのtar / gzipアーカイブを作成し、そのアーカイブを2番目のUSBデバイスにコピーする簡単なバックアップスクリプトがあります。

たとえば、

usb1="/mnt/usbone"
usb2="/mnt/usbtwo"
source="/home/user"

tar cfz ${usb1}/source.tar.gz ${source}
cp -ar ${usb1}/source.tar.gz ${usb2}

tarこれは、アーカイブの作成後にコピーするのではなく、両方のドライブにコピーを作成するように最適化されているようです。結果アーカイブは非常に小さい(<1GB)。私はこれが安全なバックアップ方法ではないことを知っています。


編集:Archemarのソリューションをすばやくテストし、方法を比較しました。良い測定のために元の方法もテストしましたrsync。結果time(bash時間ではなく/usr/bin/time)とテストに使用したスクリプトを確認してください。

ソースはで作成されますdd if=/dev/urandom bs=1M count=1024 of=/tmp/random.blob。ホストはmicroSDカードを介して動作するRaspberry Pi 3Bで、インストール先はUSB 2.0フラッシュドライブ(${a}およびUSB 2.0フラッシュドライブ${b})です。

a.sh(tar および cp):

tar cfz ${a}/r1.tar.gz ${s}
cp -ar ${a}/r1.tar.gz ${b}/r1.tar.gz

b.sh(タールとティー):

tar cfz - ${s} | tee ${a}/r2.tar.gz > ${b}/r2.tar.gz

c.sh(tar および rsync):

tar cfz ${a}/r3.tar.gz ${s}
rsync -aW ${a}/r3.tar.gz ${b}/r3.tar.gz

結果:

# /usr/bin/time -v bash a.sh 
        Command being timed: "bash a.sh"
        User time (seconds): 218.71
        System time (seconds): 28.33
        Percent of CPU this job got: 68%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 6:03.13
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 2480
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 41
        Minor (reclaiming a frame) page faults: 1250
        Voluntary context switches: 45519
        Involuntary context switches: 25576
        Swaps: 0
        File system inputs: 3668157
        File system outputs: 4197336
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

        
# /usr/bin/time -v bash b.sh 
        Command being timed: "bash b.sh"
        User time (seconds): 221.64
        System time (seconds): 28.62
        Percent of CPU this job got: 85%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 4:53.98
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 2536
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 31
        Minor (reclaiming a frame) page faults: 1162
        Voluntary context switches: 68310
        Involuntary context switches: 35582
        Swaps: 0
        File system inputs: 2101321
        File system outputs: 4197832
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

        
# /usr/bin/time -v bash c.sh 
        Command being timed: "bash c.sh"
        User time (seconds): 235.24
        System time (seconds): 35.01
        Percent of CPU this job got: 74%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 6:04.03
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 2652
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 40
        Minor (reclaiming a frame) page faults: 2310
        Voluntary context switches: 65402
        Involuntary context switches: 45179
        Swaps: 0
        File system inputs: 4200957
        File system outputs: 4197496
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

驚いたことに、結果はあまり明確ではありませんでした。File system inputs: 2101321しかし、tar / tee方式を使用する方がはるかに安いので、SDカードの寿命の間に良いと予想されます。

ベストアンサー1

tee次のコマンドを使用できます。

usb1="/mnt/usbone"
usb2="/mnt/usbtwo"
source="/home/user"

tar -cz -f - "${source}" | tee "${usb2}/source.tar.gz" > "${usb1}/source.tar.gz"

どこ

  • -f -tarstdoutをバックアップファイルとして使用するように指示します。
  • tee "${usb2}/source.tar.gz" 標準入力を指定されたファイルと標準出力にコピーします。
  • > "${usb1}/source.tar.gz"標準出力をteeファイルにリダイレクトします。

おすすめ記事