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
  • 相关阅读:
    【安卓5】高级控件——ListActivity
    【安卓5】高级控件——滚动视图、列表视图[ListView、SimpleAdapter类]
    时序图(组成元素)
    【安卓5】高级控件——拖动条SeekBar
    【安卓5】高级控件——对话框操作事件
    【安卓5】高级控件——信息提示框、对话框
    【安卓4】事件处理——键盘事件、触摸事件
    小综合实例
    相对路径的问题
    什么时候修改class
  • 原文地址:https://www.cnblogs.com/ZQQH/p/8453763.html
Copyright © 2011-2022 走看看