logo logo
关于我们

技术分享

技术分享 linux 备份sd卡 制作img文件

linux 备份sd卡 制作img文件

2017-10-25

我想把我的v3s中的系统做备份,在网上各种寻找,开始了制作img。

1.安装工具

sudo apt-get install dosfstoolssudo apt-get install dumpsudo apt-get install partedsudo 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: 0x78e2e610Device     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 67583ssudo 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.2Using /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.imgsudo kpartx -av /dev/loop0

格式化虚拟磁盘分区

zqh@linux:~/lichee/MyImage$ sudo mkfs.msdos /dev/mapper/loop0p1zqh@linux:~/lichee/MyImage$ sudo mkfs.ext4 /dev/mapper/loop0p2mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: doneCreating 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, 221185Allocating group tables: doneWriting inode tables: doneCreating journal (8192 blocks): doneWriting superblocks and filesystem accounting information: done

5.开始备份

备份uboot

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1024 seek=8sync

因为我是在我的电脑上复制内存卡中的内容,所以我还要挂载我的内存卡

当然这里可能会出错。最后我直接把我的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  #恢复系统
cdsudo umount /mnt

6.卸载虚拟磁盘

sudo kpartx -d licheebackup.img

 7.dd烧录系统

sudo umount /dev/sdbsudo dd if=licheebackup.img of=/dev/sdb bs=1M

接下来就成功了。烧录到sd卡中去。

如果插入一张空卡,接下来

sudo umount /dev/sdbsudo parted /dev/sdb --script -- mklabel msdossudo parted /dev/sdb --script -- mkpart primary fat16 2048s 67583ssudo parted /dev/sdb --script -- mkpart primary ext4 67584s -1zqh@linux:~$ sudo parted /dev/sdb  #查看一下
GNU Parted 3.2Using /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) qsudo mkfs.msdos /dev/sdb1sudo mkfs.ext4 /dev/sdb2sudo dd if=licheebackup.img of=/dev/sdb bs=1M

 我写的打包脚本:

使用时把这些文件放在一个文件夹即可

# lsbuild_img.sh            rootfs.dump                       u-boot-sunxi-with-spl.bin
lichee_zero_backup.img  sun8i-v3s-licheepi-zero-dock.dtb  zImage

 

#!/bin/bashfunction 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!"fiecho_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_SIZEfiif [ $? -ne 0 ]   then echo_error "getting error in creating dd img!"
   exitfiecho_log "creating partitions..."sudo parted $_NAME --script -- mklabel msdos #制作一个msdos分区sudo parted $_NAME --script -- mkpart primary fat16 2048s 67583ssyncsudo parted $_NAME --script -- mkpart primary ext4 67584s -1syncecho_log "losetup dev..."_LOOP_DEV=$(losetup -f)if [ -z $_LOOP_DEV ]    then echo_error "can not find a loop device!"
    exitfisudo losetup $_LOOP_DEV ./$_NAMEif [ $? -ne 0 ]     then echo_error "dd img --> $_LOOP_DEV error!"
    sudo losetup -d $_LOOP_DEV >/dev/null 2>&1 && exitfi_MAP=$(sudo kpartx -av $_LOOP_DEV | sed -n '1p;1q' | cut -c 9-13)sync_MNT_DEV="/dev/mapper/${_MAP}"sleep 20sudo mkfs.msdos ${_MNT_DEV}p1 ||exitsudo mkfs.ext4 ${_MNT_DEV}p2 ||exitif [ $? -ne 0 ]    then echo_error "error in creating partitions"
    sudo kpartx -d $_NAME && exit 
fiecho_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=8if [ $? -ne 0 ]    then echo_error "writing u-boot error!"
    sudo kpartx -d $_NAME && exitfisudo syncsudo 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
    exitfisudo syncecho_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
    exitfisudo mount  ${_MNT_DEV}p2 /mnt  #挂载 
echo_log "restore rootfs..."cd /mnt/sudo restore rf ${_PWD}/rootfs.dumpsudo syncecho_log "rootfs restore successfull!"sleep 10sudo umount /mntif [ $? -ne 0 ]    then echo_error "umount or losetup -d error!!"
    sudo kpartx -dv $_LOOP_DEV
    exitfisudo kpartx -d $_NAME 
sudo losetup -d $_LOOP_DEV

echo_log "${_NAME} has been created successfully!"cd $_PWD
exit

 

云祺备份软件,云祺容灾备份系统,虚拟机备份,数据库备份,文件备份,实时备份,勒索软件,美国,图书馆
  • 标签:
  • 容灾备份

您可能感兴趣的新闻 换一批

现在下载,可享30天免费试用

立即下载

请添加好友为您提供支持
jia7jia_7

请拨打电话
为您提供支持

400-9955-698