我想把我的v3s中的系統做備份,在網上各種尋找,開始了制作img。
1.安裝工具
sudo apt-get install dosfstools sudo apt-get install dump sudo apt-get install parted sudo apt-get install kpartx
2.生成新的img文件
先df -h查看下實際使用空間然后在決定生成文件大小
zqh@linux:~/lichee/MyImage$ df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 787M 9.4M 778M 2% /run /dev/sda1 451G 21G 408G 5% / tmpfs 3.9G 184K 3.9G 1% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup tmpfs 787M 68K 787M 1% /run/user/1000 /dev/sdb2 15G 371M 14G 3% /media/zqh/rootfs /dev/sdb1 32M 12M 21M 37% /media/zqh/BOOT
可以看到我一共用了371+32=403M的空間,所以我弄個400M多的大小的img
sudo dd if=/dev/zero of=licheebackup.img bs=1M count=420
sync
這里要寫1M,1MiB也就是1024kb,這樣大小不會錯,如果寫kb可能太小就會出錯。
還有/dev/zero這個文件的輸出全是0,所以我現在只是有個了一個空img文件而已。
3.分割虛擬磁盤
利用parted將剛才生成的虛擬盤分割成兩個分區
zqh@linux:~/lichee/MyImage$ sudo fdisk -l Disk /dev/sdb: 15 GiB, 16106127360 bytes, 31457280 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: 0x78e2e610 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 67583 65536 32M 6 FAT16 /dev/sdb2 67584 31457279 31389696 15G 83 Linux
先看一下內存卡的扇區分布,然后就開始了
sudo parted licheebackup.img --script -- mklabel msdos #制作一個msdos分區 sudo parted licheebackup.img --script -- mkpart primary fat16 2048s 67583s sudo parted licheebackup.img --script -- mkpart primary ext4 67584s -1
這里可以查看一下。這里的size指的是MB 我分區的時候是要 32M 這里就是33.6MB。
zqh@linux:~/lichee/MyImage$ sudo parted licheebackup.img GNU Parted 3.2 Using /home/zqh/lichee/MyImage/licheebackup.img Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: (file) Disk /home/zqh/lichee/MyImage/licheebackup.img: 419MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 34.6MB 33.6MB primary lba 2 34.6MB 418MB 384MB primary
4.掛載虛擬磁盤並格式化
首先建立虛擬磁盤並分區
sudo losetup /dev/loop0 licheebackup.img sudo kpartx -av /dev/loop0
格式化虛擬磁盤分區
zqh@linux:~/lichee/MyImage$ sudo mkfs.msdos /dev/mapper/loop0p1 zqh@linux:~/lichee/MyImage$ sudo mkfs.ext4 /dev/mapper/loop0p2 mke2fs 1.42.13 (17-May-2015) Discarding device blocks: done Creating filesystem with 374784 1k blocks and 93840 inodes Filesystem UUID: b4f3a95e-ffe2-417e-843c-f4c40daf9ad5 Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729, 204801, 221185 Allocating group tables: done Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done
5.開始備份
備份uboot
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1024 seek=8 sync
因為我是在我的電腦上復制內存卡中的內容,所以我還要掛載我的內存卡
當然這里可能會出錯。最后我直接把我的dtb 和 zimage拉進去了
sudo mount /dev/mapper/loop0p1 /media/ #掛載 sudo mount /dev/sdb1 /mnt/ #把sd卡的boot目錄也掛載起來 sudo cp -rf /mnt/* /media/ #內容拷貝 sudo umount /media /mnt #卸載
ext4 linux虛擬磁盤分區用dump & restore 備份
sudo mount -t ext4 /dev/mapper/loop0p2 /mnt/ #掛載虛擬磁盤 sudo dump -0au -f ~/lichee/MyImage/roofts.dump /dev/sdb2 #從插着的sd卡中dump數據 #-0uaf 優先級0 u成功后記錄到文件中 a自動寫到磁盤末尾 f備份寫入文件 cd /mnt/ sudo restore rf ~/lichee/MyImage/roofts.dump #恢復系統 cd sudo umount /mnt
6.卸載虛擬磁盤
sudo kpartx -d licheebackup.img
7.dd燒錄系統
sudo umount /dev/sdb sudo dd if=licheebackup.img of=/dev/sdb bs=1M
接下來就成功了。燒錄到sd卡中去。
如果插入一張空卡,接下來
sudo umount /dev/sdb sudo parted /dev/sdb --script -- mklabel msdos sudo parted /dev/sdb --script -- mkpart primary fat16 2048s 67583s sudo parted /dev/sdb --script -- mkpart primary ext4 67584s -1 zqh@linux:~$ sudo parted /dev/sdb #查看一下 GNU Parted 3.2 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: Mass Storage Device (scsi) Disk /dev/sdb: 16.1GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 34.6MB 33.6MB primary lba 2 34.6MB 16.1GB 16.1GB primary ext4 (parted) q sudo mkfs.msdos /dev/sdb1 sudo mkfs.ext4 /dev/sdb2 sudo dd if=licheebackup.img of=/dev/sdb bs=1M
我寫的打包腳本:
使用時把這些文件放在一個文件夾即可
# ls build_img.sh rootfs.dump u-boot-sunxi-with-spl.bin lichee_zero_backup.img sun8i-v3s-licheepi-zero-dock.dtb zImage
#!/bin/bash function echo_log() { echo -e "\033[32m ------------------------------------------ \033[0m" echo $1 echo -e "\033[32m ------------------------------------------\n \033[0m" } function echo_error() { echo -e "\033[33m ------------------------------------------ \033[0m" echo $1 echo -e "\033[33m ------------------------------------------\n \033[0m" } set -e _PWD=$(pwd) if [ -s ./sun8i-v3s-licheepi-zero-dock.dtb -a -s ./u-boot-sunxi-with-spl.bin -a -s ./zImage -a -s ./rootfs.d ump ] then echo_log "Checking the files ok!" else echo_error "Can not find boot.scr, zImage, uboot or the modules file!" fi echo_log "Calculating the files's total size..." _SIZE_ROOTFS=$(du -s -BM rootfs.dump | cut -d 'M' -f -1) _IMG_SIZE=$(($_SIZE_ROOTFS+200)) echo_log "Creating dd img file... size is $_IMG_SIZE" _NAME="lichee_zero_backup.img" if [ ! -e ./$_NAME ] then dd if=/dev/zero of=./$_NAME bs=1M count=$_IMG_SIZE fi if [ $? -ne 0 ] then echo_error "getting error in creating dd img!" exit fi echo_log "creating partitions..." sudo parted $_NAME --script -- mklabel msdos #制作一個msdos分區 sudo parted $_NAME --script -- mkpart primary fat16 2048s 67583s sync sudo parted $_NAME --script -- mkpart primary ext4 67584s -1 sync echo_log "losetup dev..." _LOOP_DEV=$(losetup -f) if [ -z $_LOOP_DEV ] then echo_error "can not find a loop device!" exit fi sudo losetup $_LOOP_DEV ./$_NAME if [ $? -ne 0 ] then echo_error "dd img --> $_LOOP_DEV error!" sudo losetup -d $_LOOP_DEV >/dev/null 2>&1 && exit fi _MAP=$(sudo kpartx -av $_LOOP_DEV | sed -n '1p;1q' | cut -c 9-13) sync _MNT_DEV="/dev/mapper/${_MAP}" sleep 20 sudo mkfs.msdos ${_MNT_DEV}p1 ||exit sudo mkfs.ext4 ${_MNT_DEV}p2 ||exit if [ $? -ne 0 ] then echo_error "error in creating partitions" sudo kpartx -d $_NAME && exit fi echo_log "writing u-boot-sunxi-with-spl to $_LOOP_DEV" sudo dd if=./u-boot-sunxi-with-spl.bin of=$_LOOP_DEV bs=1024 seek=8 if [ $? -ne 0 ] then echo_error "writing u-boot error!" sudo kpartx -d $_NAME && exit fi sudo sync sudo mount ${_MNT_DEV}p1 /mnt #掛載 echo_log "copy dtb and zImage files..." sudo cp ./sun8i-v3s-licheepi-zero-dock.dtb /mnt #內容拷貝 sudo cp ./zImage /mnt #內容拷貝 if [ $? -ne 0 ] then echo_error "copy files error! " sudo losetup -d $_LOOP_DEV >/dev/null 2>&1 sudo umount ${_MNT_DEV}p1 >/dev/null 2>&1 exit fi sudo sync echo_log "dtb and zImage install successful!" sudo umount /mnt #卸載 if [ $? -ne 0 ] then echo_error "umount fialed!" sudo losetup -d $_LOOP_DEV >/dev/null 2>&1 sudo umount ${_MNT_DEV}p1 >/dev/null 2>&1 exit fi sudo mount ${_MNT_DEV}p2 /mnt #掛載 echo_log "restore rootfs..." cd /mnt/ sudo restore rf ${_PWD}/rootfs.dump sudo sync echo_log "rootfs restore successfull!" sleep 10 sudo umount /mnt if [ $? -ne 0 ] then echo_error "umount or losetup -d error!!" sudo kpartx -dv $_LOOP_DEV exit fi sudo kpartx -d $_NAME sudo losetup -d $_LOOP_DEV echo_log "${_NAME} has been created successfully!" cd $_PWD exit
