内存卡IMG镜像瘦身

    本文地址:http://tongxinmao.com/Article/Detail/id/307

    解决了最小镜像的制作问题以后,就发现手里已经积攒了不少用Win32DiskImager制作的完整sd卡镜像。虽然压缩过了以后很小,但是在恢复镜像时32G大小的写入速度简直慢到龟速,所以我通过Ubuntu来裁剪一下完整的sd卡镜像。

    首先,准备镜像与系统。我用的是Ubuntu 14。 
    然后安装必要的软件

    sudo apt-get install dosfstools dump parted kpartx1

    一、挂载img 
    在系统中将镜像挂载到loop设备中

    sudo losetup /dev/loop0 shumeipai.img1

    二、挂载boot分区与root分区 
    创建img_temp文件夹将镜像文件挂载到该文件夹

    mkdir -p img_temp/boot/mkdir -p img_temp/root/sudo kpartx -av /dev/loop0 123

    这里写图片描述 
    这时候可以看到镜像的分区这时候我们需要将boot与root加载到临时文件夹中。 
    boot分区的结尾为12880,root分区为磁盘结尾。

    #loop0p6、loop0p7根据实际情况修改boot="/dev/mapper/loop0p6"root="/dev/mapper/loop0p7"sudo mount $boot img_temp/boot/sudo mount $root img_temp/root/12345

    三、初始化空白img 
    boot分区固定大小为57344KB 
    root分区大小可以通过du命令来查看 
    这里注意:boot 【size】+linux【Used】+分区损耗【因为格式转换,所以会损耗5%~10%】=镜像实际大小

    #df为镜像实际大小
    df=`sudo du -shk img_temp/root/|awk '{print $1}'`
    df=`echo $df |awk '{print int($1*1.1+57344)}'`
    sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df1234

    四、格式化空白img

    首先建立虚拟磁盘并分区

    sudo parted raspberrypi.img --script -- mklabel msdossudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879ssudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1123

    第一个分区为boot分区,采用FAT32格式,由sector 8192开始到sector 12879 
    第二个分割区采用EXT4,由sector 122880开始到空白img结尾。

    然后格式化虚拟磁盘分区

    loopdevice:执行 losetup 连接 img 文件的 loop device 
    device:执行完 kpartx 后,虚拟磁盘代号。 
    partBoot:由 device 加上 p1 组合而成的 FAT32 虚拟磁盘分区。 
    partRoot:由 device 加上 p2 组合而成的 EXT4 虚拟磁盘分区。

    loopdevice=`sudo losetup -f --show raspberrypi.img`
    device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[1-9])p.*/\1/g' | head -1`
    device="/dev/mapper/${device}"partBoot="${device}p1"partRoot="${device}p2"sudo mkfs.vfat $partBootsudo mkfs.ext4 $partRoot1234567

    五、开始备份 
    boot分区为fat32格式,可以直接利用cp命令直接拷贝

    sudo mount -t vfat $partBoot /mediasudo cp -rfp img_temp/boot/* /media/sudo umount /media123

    linux分区为ext4格式,需要利用dump & restore备份

    sudo mount -t ext4 $partRoot /media/cd /mediasudo dump -h 0 -0uaf - $root | sudo restore -rf -cdsudo umount /media12345

    六、备份完毕,卸载所有虚拟磁盘

    sudo kpartx -d $loopdevicesudo losetup -d $loopdevicesudo umount img_temp/bootsudo umount img_temp/rootsudo rm -rf img_tempsudo kpartx -d /dev/loop0sudo losetup -d /dev/loop01234567

    裁剪前 
    这里写图片描述 
    裁剪后 
    这里写图片描述 
    裁剪完之后只剩3G左右 
    此时,镜像已经裁剪完毕,可以通过dd或者Win32DiskImager将裁剪后生成的raspberrypi.img写入sd卡。 
    另外贴出在树莓派内部生成镜像的方法


    上一篇:Gprinter-GP58MB 佳博热敏打印机USB描述符(U盘+打印机)
    下一篇:树莓派系统内备份成IMG镜像