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 "\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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM