# System Backup
### 從image裡面擷取資料
#### - 秀出sdcard.img分割區資訊(記得使用root權限)
$ sudo fdisk -lu sdcard.img
會跑出下列結果
Disk sdcard.img: 152 MiB, 159384064 bytes, 311297 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: 0x00000000
Device Boot Start End Sectors Size Id Type
sdcard.img1 * 1 65536 65536 32M c W95 FAT32 (LBA)
sdcard.img2 65537 311296 245760 120M 83 Linux
這裡可以看到總共有兩個分區,且Sector Size為512,可以得知第一區起始位置為1\*512,第二區為65537\*512
#### - 掛載兩個分區
$ mkdir -p ~/mmn1
$ mkdir -p ~/mmn2
$ sudo mount -o loop,offset=$((1\*512)) sdcard.img ~/mmn1
$ sudo mount -o loop,offset=$((65537\*512)) sdcard.img ~/mmn2
如果跳出以下錯誤:
mount:bad usage
Try 'mount --help' for more information.
請檢查''-''是否為半形,且逗號後面不能有空格
mount: /home/student/mmn2: overlapping loop device exists for /home/student/buildroot-2022.02/output/images/sdcard.img.
上述錯誤則表示掛載有部份重疊,可以選擇在掛第一分區的時候加上空間限制
$ sudo mount -o loop,offset=$((1*512)),sizelimit=$((65536*512)) sdcard.img ~/mmn1
$ sudo mount -o loop,offset=$((65537*512)) sdcard.img ~/mmn2
\
\
### 備份系統
#### -備份整個SDcard
先確定device file,這裡使用的位置在/dev/sde
$ sudo dd if=/dev/sde of=backup.img
這樣就會產生一個backup.img的檔案。
#### -個別備份SDcard裡面的partition
$ sudo dd if=/dev/sde1 of=boot_part.img
$ sudo dd if=/dev/sde2 of=filesys_part.img
#### -使用rsync備份系統
先印出SDcard內部分區狀態
$ sudo fdisk -ul /dev/sde
會顯示
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sde: 14.86 GiB, 15931539456 bytes, 31116288 sectors
Disk model: STORAGE DEVICE
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: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/sde1 * 1 65536 65536 32M c W95 FAT32 (LBA)
/dev/sde2 65537 311296 245760 120M 83 Linux
Command (m for help): q
先掛載第二區,之後rsync的時候會用到
$ sudo mount /dev/sde2 ~/mmn2
先產一個大小與我們要備份的資料一樣的image file,
bs=block size=1024(固定),
count=數量=Sector*512/1024=245760/2=122880
$ dd if=/dev/zero of=filesystem.img bs=1024 count=122880
印出資料如下
122880+0 records in
122880+0 records out
125829120 bytes (126 MB, 120 MiB) copied, 0.291326 s, 432 MB/s
在image裡面先做分區
$ sudo fdisk filesystem.img
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x07b41cde.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-245759, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-245759, default 245759):
Created a new partition 1 of type 'Linux' and of size 119 MiB.
Command (m for help): w
The partition table has been altered.
Syncing disks.
印出看一下結果
$ sudo fdisk filesystem.img
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk filesystem.img: 120 MiB, 125829120 bytes, 245760 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: 0x07b41cde
Device Boot Start End Sectors Size Id Type
filesystem.img1 2048 245759 243712 119M 83 Linux
Command (m for help): q
接著要透過losetup去連結image file(建立一個pesudo device),首先要先確定有哪些可以用的loop(如下可使用的就是loop13)
$df -h
Filesystem 1K-blocks Used Available Use% Mounted on
udev 8053132 0 8053132 0% /dev
tmpfs 1617324 1960 1615364 1% /run
/dev/sda5 859554832 50692908 765129188 7% /
tmpfs 8086604 359908 7726696 5% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 8086604 0 8086604 0% /sys/fs/cgroup
/dev/loop0 56832 56832 0 100% /snap/core18/2128
/dev/loop4 56960 56960 0 100% /snap/core18/2344
/dev/loop7 55552 55552 0 100% /snap/snap-store/558
/dev/loop5 63488 63488 0 100% /snap/core20/1405
/dev/loop6 66816 66816 0 100% /snap/gtk-common-themes/1519
/dev/loop8 44800 44800 0 100% /snap/snapd/15177
/dev/loop3 66688 66688 0 100% /snap/gtk-common-themes/1515
/dev/loop9 52224 52224 0 100% /snap/snap-store/547
/dev/loop1 224256 224256 0 100% /snap/gnome-3-34-1804/72
/dev/loop10 224256 224256 0 100% /snap/gnome-3-34-1804/77
/dev/loop2 254848 254848 0 100% /snap/gnome-3-38-2004/99
/dev/loop11 128 128 0 100% /snap/bare/5
/dev/sda1 32686 28640 4046 88% /boot/efi
tmpfs 1617320 52 1617268 1% /run/user/1000
/dev/loop12 32686 9994 22692 31% /home/student/mmn1
/dev/sde2 109525 60513 40411 60% /home/student/mmn2
/dev/sde1 32686 9994 22692 31% /media/student/6C28-739B
然後就可以開始連結,sizelimit = (End-Start+1) = (245759-2048+1) = 243712
$ sudo losetup --offset $((2048*512)) --sizelimit=$((243712*512)) /dev/loop13 filesystem.img
之後做格式化成ext4
$ sudo mkfs.ext4 /dev/loop15
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 30464 4k blocks and 30464 inodes
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
然後就可以把設置好的image file掛載到某個資料夾路徑上
$ sudo mount /dev/loop15 ~/mmn1
最後就可以開始做備份了,這裡再重新提及一下,
~/mmn1這個路徑掛載的是剛剛做的image file
~/mmn2這個路徑上掛載的是SD卡上的partition2 (filesystem部份)
$ sudo rsync -axvH --delete ~/mmn2 ~/mmn1
之後會開始跑一大段東西,輸出的最後兩行會是以下結果,這樣就代表備份成功
sent 60,934,828 bytes received 36,544 bytes 40,647,581.33 bytes/sec
total size is 60,806,410 speedup is 1.00
結束之後不要忘記要移除pesudo device以及掛載的東西
$ sudo losetup -d /dev/loop15
$ sudo umount /dev/sde1
$ sudo umount /dev/sde2
### 測試
將BOOT或filesystem裡面的檔案刪除,在將備份的檔案dd進去看是否能正常開機。
$ sudo dcfldd bs=1024 if=backup.img of=/dev/sdc //可以秀出備份進度
或是
$ sudo dd if=backup.img of=/dev/sdc