zoukankan      html  css  js  c++  java
  • 【树莓派】制作树莓派最小镜像:img裁剪瘦身

    制作树莓派镜像,可以参考这篇文章:http://blog.csdn.net/talkxin/article/details/50456282

    摘录部分要点内容如下(如果作者不允许转载,请联系即删除):

    一、查看当前系统所占容量 
    用Win32DiskImager来制作镜像时是将sd卡正卡全部做成镜像,是因为无法读取到linux分区的原因,所以我们在制作镜像前,先要确定我们当前系统所占用了多少系统空间,即备份镜像的大小。

    #查看当前系统所占用的空间
    df -lh
     

    这里写图片描述 
    可以看到,树莓派是有两个分区,所以boot 【size】+linux【Used】+分区损耗【因为格式转换,所以会损耗5%~10%】=镜像实际大小,所以若used使用百分比超过50%那么就无法在sd中创建此镜像。

    二、安装需要的软件 
    dosfstools:fat32分区格式化工具 
    dump:dump & restore 备份工具 
    parted & kpartx:虚拟磁盘工具

    sudo apt-get install dosfstools dump parted kpartx

    三、生成空白img 
    根据一里面系统所占用的空间,生成空白的img。

    #df为磁盘占用空间
    sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df
     

    这也是错误比较多的地方,有人不理解原文中count=2500参数的意义,此参数是用dd命令创建一个大约2.5G的空白镜像,若不使用第一步来算出实际镜像大小的话,制作出来的镜像就会出错

    此处注意 
    dd命令中【1k=1024b;1KB=1000b;1M=1024kb;1MB=1000kb】

    四、分割虚拟磁盘 
    我们已将空白的img创建完毕,现在需要通过parted将磁盘分为boot与root区 
    通过sudo fdisk -l /dev/mmcblk0得知 
    这里写图片描述 
    第一个分区为boot分区,采用FAT32格式,由sector 8192开始到sector 12879 
    第二个分割区采用EXT4,由sector 122880开始到空白img结尾。

    sudo parted raspberrypi.img --script -- mklabel msdos
    sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879s
    sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1

    五、挂载虚拟磁盘并格式化

    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[0-9])p.*/1/g' | head -1`
    device="/dev/mapper/${device}"
    partBoot="${device}p1"
    partRoot="${device}p2"

    然后格式化虚拟磁盘分区

    #boot分区用fat32进行格式化
    sudo mkfs.vfat $partBoot
    sudo mkfs.ext4 $partRoot

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

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

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

    #跳过raspberrypi.img不备份
    sudo chattr +d raspberrypi.img
    sudo mount -t ext4 $partRoot /media/
    cd /media
    sudo dump -h 0 -0uaf - / | sudo restore -rf -
    cd
    sudo umount /media

    这里原文中也有一点bug,用dump进行磁盘备份时,会将之前创建的空白img一并备份进去,通过chattr跳过raspberrypi.img

    七、备份完毕,卸载虚拟磁盘 
    此时,已将所有数据备份至空白img,此时就可以卸载虚拟磁盘,将img拷贝出保存了。 
    然后利用Win32DiskImager或者df命令即可将该raspberrypi.img恢复至sd卡上。

    sudo kpartx -d $loopdevice
    sudo losetup -d $loopdevice

    这里是整理后的脚本,编辑sudo vi backup.sh,复制以下内容,sudo chmod 777 backup.sh,然后sudo ./backup.sh就可以在当前脚本目录中生成树莓派的SD卡镜像了。

    也可以参考如下shell脚本:

    #!/bin/sh
    sudo apt-get install -y dosfstools parted kpartx rsync
    df=`df -P | grep /dev/root | awk '{print $3}'`
    dr=`df -P | grep /dev/mmcblk0p1 | awk '{print $2}'`
    df=`echo $df $dr |awk '{print int(($1+$2)*1.2)}'`
    sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df
    sudo parted raspberrypi.img --script -- mklabel msdos
    start=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $2}'`
    start=`echo $start's'`
    end=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $3}'`
    end2=$[end+1]
    end=`echo $end's'`
    end2=`echo $end2's'`
    
    sudo parted raspberrypi.img --script -- mkpart primary fat32 $start $end
    sudo parted raspberrypi.img --script -- mkpart primary ext4 $end2 -1
    
    loopdevice=`sudo losetup -f --show raspberrypi.img`
    device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/1/g' | head -1`
    device="/dev/mapper/${device}"
    partBoot="${device}p1"
    partRoot="${device}p2"
    sudo mkfs.vfat $partBoot
    sudo mkfs.ext4 $partRoot
    sudo mount -t vfat $partBoot /media
    sudo cp -rfp /boot/* /media/
    sudo umount /media
    sudo mount -t ext4 $partRoot /media/
    cd /media
    sudo rsync -aP --exclude="raspberrypi.img" --exclude=/media/* --exclude=/sys/* --exclude=/proc/*  --exclude=/tmp/* / ./
    cd
    sudo umount /media
    sudo kpartx -d $loopdevice
    sudo losetup -d $loopdevice

    其余参考:

    【树莓派】制作树莓派所使用的img镜像(一):http://www.cnblogs.com/haochuang/p/6066532.html

  • 相关阅读:
    python基础十一之装饰器进阶
    python基础十之装饰器
    python基础九之函数
    python基础八之文件操作
    python基础七之copy
    python基础七之集合
    python基础数据类型汇总
    python基础六之编码
    synchronized关键字的内存语义
    对于this和当前线程的一些理解
  • 原文地址:https://www.cnblogs.com/haochuang/p/6380839.html
Copyright © 2011-2022 走看看