zoukankan      html  css  js  c++  java
  • linux 备份sd卡 制作img文件

    我想把我的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 "33[32m ------------------------------------------ 33[0m"
            echo $1
            echo -e "33[32m ------------------------------------------
     33[0m"
    }
    
    function echo_error()
    {
            echo -e "33[33m ------------------------------------------ 33[0m"
            echo $1
            echo -e "33[33m ------------------------------------------
     33[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
  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/ZQQH/p/8453763.html
Copyright © 2011-2022 走看看