gzip圧縮を使用したSSH経由のRaspberry Piのバックアップ

gzip圧縮を使用したSSH経由のRaspberry Piのバックアップ

私はgzip圧縮を使用してSSHを介して他のLinuxシステムからRaspberry Pi "ライブ"をバックアップしています。私は次のスクリプトを使用します。

#!/bin/bash
dt=`date +%y%m%d`
ssh [email protected] "sudo dd if=/dev/mmcblk0 bs=1M | gzip -" | dd of=./pibackup-$dt.gz

それはうまくいきますが、結果ファイルは26GBと多すぎるようです。アイドルクラスタではなくシステムの内容だけをバックアップしたいと思います。私はddがアイドルクラスタを含むエントリ全体をバックアップしていることを知っていますが、gzipを使用すると結果ファイルのサイズを減らすことができると思いました。

したがって、 df -h と入力したら、私のシステムを見てください。

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  3.1G   24G  12% /
devtmpfs        459M     0  459M   0% /dev
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           464M   49M  415M  11% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   52M  201M  21% /boot
tmpfs            93M     0   93M   0% /run/user/1000
/dev/sda1       932G  184G  749G  20% /media/HDD

答え1

「コールド」バックアップは、「ライブ」バックアップよりはるかに安全です。

実行中のPIで次のコマンドを実行します。

cd $HOME; dd if=/dev/zero of=zero bs=8M; rm zero

利用可能なすべてのスペースにゼロを記録して、高い圧縮率を提供します。次に、Raspberry PiのmicroSDをUbuntuを実行しているデスクトップなどの他のシステムに置き、次を実行します.

fdisk -l

microSD を /dev/sdb として処理し、次のコマンドは以下を使用して SD 全体を圧縮します。

gzip -c /dev/sdb > /backup/raspberry-pi.gz

復元するには、次のコマンドを実行します。

gzip -cd /backup/raspberry-pi.gz > /dev/sdb

上記の手順を試す前に、フルバックアップを取ることをお勧めします。

答え2

コメントで提案されているように、Piバックアップのためのさまざまなファイルシステムレベルのオプションがあります。これにより、仮想ファイルシステム/proc/sys

  1. あなたはそれを使用することができますrsync。これにより、単一のイメージファイルではなくバックアップメディアにファイルシステムのコピーが提供されます。

    rsync -avzHP --exclude '/proc/' --exclude '/sys/' root@pi:/ /backup/pi.$(date +'%Y%m%d')
    

    --fake-superローカルアカウントがルートでない場合は、バックアップと復元のオプションを含める必要があります。 (リモート所有権の詳細を保存しますが、実際にはローカルバックアップには適用できません。)

    このパスを選択することにした場合は、余分なrsnapshotディスク容量をあまり使用せずにGFSバックアップを検討することをお勧めします。

  2. tarまたはpax他のアーカイブツールを使用できます。これにより、圧縮された画像が提供されます。

    ssh root@pi 'cd / && tar --exclude '/proc/' --exclude '/sys/' -czvf - .' > /path/to/backup.pi.$(date +'%Y%m%d').tgz
    
  3. 利用可能な他のオプションもあります。たとえば、duplicity真剣に使用していないので、使用方法の例を提示する資格がないと思います。


ファイルシステムのバックアップがある場合は、最小ブートイメージを復元することもできます。

私のPiには次の構造があります(パーティション3は無視されます。パーティションがあるかもしれませんが、おそらくファイルシステムの一部としてバックアップされたでしょう)。

fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x42913321

Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1         8192   137215   129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2       137216  8388607  8251392    4G 83 Linux

/bootディスクの始まりからパーティション1()の始まりまで、すべてが必要です。この特定のディスプレイでは、セクタは512バイトブロックですが、4KiBブロック(SSDブロックサイズ)で読み取る必要があるため、すべての数字を8で割ります。

# Copy the boot segment from the beginning of the disk
dd bs=4k count=$((8192/8)) if=/dev/mmcblk0 | gzip >img0.gz

/dev/mmbclk0次のコマンドを使用して、保存したセグメントをSSDカードに復元できます。対象デバイスを恒久的に上書きするので、使用する前に何度も確認してください。この例を盲目的にコピーしないでください:

zcat img0.gz | dd bs=4k iflag=fullblock of=/dev/mmcblk0
partprobe /dev/mmcblk0

答え3

以下は、(簡単な)ddベースのRaspberry Pi SDカードイメージバックアップスクリプトです(他のコンピュータで実行)。

#!/bin/sh

in=$1
out=$2

echo "Copying . . ."
time -p dd if=$in of=$out bs=4M status=progress

echo "Checking Source . . ."
set $(md5sum $in)
sum_in=$1
echo $sum_in

echo "Checking Destination . . ."
set $(md5sum $out)
sum_out=$1
echo $sum_out

if [ $sum_in = $sum_out ]
then
    echo "Compressing . . . "
    xz -6 --threads=2 --verbose $out && echo "DONE"
else
    echo "Checksum mismatch!"
fi

たとえば、sd-verify-compressとして保存します。

実行可能にする:

$ chmod +x sd-verify-compress

実行してみてください(例:)。

$ ./sd-verify-compress /dev/sdx bookworm64

lsblkを使用して、/dev/sdxの代わりに使用する方法を学びます。

$ lsblk -fmp

生成されるファイルは次のとおりです。

-rw-r--r-- 1 pi pi 2.8G Nov 13 12:38 bookworm64.xz

私のSDカードは32GBです。

関連情報