精华内容
下载资源
问答
  • /********************************************************************************** * raspi-config Expand root partition to fill SD card ... * 想知道树莓派是如何完成SD卡扩展的,记录相关文档。 * ...
    /**********************************************************************************
     *          raspi-config Expand root partition to fill SD card 原理
     * 说明:
     *     想知道树莓派是如何完成SD卡扩展的,记录相关文档。
     *                              
     *                                              2017-2-20 深圳 南山平山村 曾剑锋
     ********************************************************************************/
    
    一、参考文档:
        1. Raspbian: how to resize the root partition to fill SD card
            https://coderwall.com/p/mhj8jw/raspbian-how-to-resize-the-root-partition-to-fill-sd-card
        2. raspi-config
            https://github.com/asb/raspi-config/blob/master/raspi-config
        3. Making a bootable .img image file
            http://www.orangepi.org/Docs/Makingabootable.html
        4. Setting up the Linux distribution root file system
            http://www.orangepi.org/Docs/SettinguptheLinux.html
        5. Bootable SD card
            http://sunxi.org/Bootable_SD_card#Cleaning
    
    二、raspi-config主要源代码有关SD卡扩展函数分析:
    
        do_expand_rootfs() {
          # -h : FILE exists and is a symbolic link (same as -L)
          if ! [ -h /dev/root ]; then
            whiptail --msgbox "/dev/root does not exist or is not a symlink. Don't know how to expand" 20 60 2
            return 0
          fi
        
          # readlink用来找出符号链接所指向的位置。 
          ROOT_PART=$(readlink /dev/root)
          # 从变量$string的开头, 删除最短匹配$substring的子串
          PART_NUM=${ROOT_PART#mmcblk0p}
          if [ "$PART_NUM" = "$ROOT_PART" ]; then
            whiptail --msgbox "/dev/root is not an SD card. Don't know how to expand" 20 60 2
            return 0
          fi
        
          # NOTE: the NOOBS partition layout confuses parted. For now, let's only 
          # agree to work with a sufficiently simple partition layout
          if [ "$PART_NUM" -ne 2 ]; then
            whiptail --msgbox "Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway." 20 60 2
            return 0
          fi
    
          # 再次确认分区表和设备节点提取的数值是否一致
          # 
          # shell script:
          #   root@zengjf:/home/zengjf/hacking# parted /dev/sdb -ms unit s p 
          #   BYT;
          #   /dev/sdb:1953525168s:scsi:512:4096:gpt:ATA ST1000LM035-1RK1:;
          #   1:2048s:943720448s:943718401s:ntfs:Basic data partition:msftdata;
          #   2:943722496s:1953523711s:1009801216s:ntfs:Basic data partition:msftdata;
          LAST_PART_NUM=$(parted /dev/mmcblk0 -ms unit s p | tail -n 1 | cut -f 1 -d:)
          if [ "$LAST_PART_NUM" != "$PART_NUM" ]; then
            whiptail --msgbox "/dev/root is not the last partition. Don't know how to expand" 20 60 2
            return 0
          fi
        
          # Get the starting offset of the root partition
          # 获取文件系统分区起始位置
          PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d:)
          [ "$PART_START" ] || return 1
          # Return value will likely be error for fdisk as it fails to reload the
          # partition table because the root fs is mounted
          fdisk /dev/mmcblk0 <<EOF
        p
        d
        $PART_NUM
        n
        p
        $PART_NUM
        $PART_START
    
        p
        w
        EOF
          ASK_TO_REBOOT=1
        
          # now set up an init.d script
        cat <<\EOF > /etc/init.d/resize2fs_once &&
        #!/bin/sh
        ### BEGIN INIT INFO
        # Provides:          resize2fs_once
        # Required-Start:
        # Required-Stop:
        # Default-Start: 2 3 4 5 S
        # Default-Stop:
        # Short-Description: Resize the root filesystem to fill partition
        # Description:
        ### END INIT INFO
        . /lib/lsb/init-functions
        case "$1" in
          start)
            log_daemon_msg "Starting resize2fs_once" &&
            resize2fs /dev/root &&                       # 真正调整大小的地方
            rm /etc/init.d/resize2fs_once &&             # 删除文件,表明该文件只能被运行一次
            update-rc.d resize2fs_once remove &&
            log_end_msg $?
            ;;
          *)
            echo "Usage: $0 start" >&2
            exit 3
            ;;
        esac
        EOF
          chmod +x /etc/init.d/resize2fs_once &&         # 给出下次运行的权限
          update-rc.d resize2fs_once defaults &&         # 默认运行
          if [ "$INTERACTIVE" = True ]; then
            whiptail --msgbox "Root partition has been resized.\nThe filesystem will be enlarged upon the next reboot" 20 60 2
          fi
        }
    
    三、获取磁盘编号、起始偏移地址、结束偏移地址、分区格式:
        zengjf@zengjf:~/zengjf/mksdImageFile$ sudo parted /dev/sdc -ms unit s p
        BYT;
        /dev/sdc:3887104s:scsi:512:512:msdos:NORELSYS 1081:;
        1:2048s:43007s:40960s:fat16::;
        2:43008s:204799s:161792s:ext4::;
    
    四、resizefs重新调整分区大小:
        zengjf@zengjf:/media/zengjf/e09b9d90-3b63-43fa-9b31-485e153c3ccb$ sudo resize2fs /dev/sdc2 
        resize2fs 1.43.3 (04-Sep-2016)
        /dev/sdc2 上的文件系统已被挂载于 /media/zengjf/e09b9d90-3b63-43fa-9b31-485e153c3ccb;需要进行在线调整大小
        old_desc_blocks = 1, new_desc_blocks = 15
        /dev/sdc2 上的文件系统现在为 1922048 个块(每块 1k)。

     

    展开全文
  • 之前复制或者备份树莓派的SD卡,都是用dd命令...于是,需要有一个可以解决上述问题的制作树莓派SD卡img映像文件的方法。 在网上搜索了一些,做了些研究,发现还是有办法的。 如下列网址所述:(感谢作者) http:...

    之前复制或者备份树莓派的SD卡,都是用dd命令全盘复制,可以用,但是这样有两大缺点:
    1. 慢
    2. 一个大的SD卡,比如64G,即使只用了2G,经过dd命令生成的img文件也会生成一个和整个SD卡容量一样大小的文件,即64G
     

    于是,需要有一个可以解决上述问题的制作树莓派SD卡img映像文件的方法。

    在网上搜索了一些,做了些研究,发现还是有办法的。 如下列网址所述:(感谢作者)
    http://www.cnblogs.com/haochuang/p/6066532.html

    但是里面的脚本我用起来有问题,也懒得研究为什么有问题,于是参照脚本里的方法,手动一步一步命令来。

     

    【准备】
    准备一个树莓派Raspberry Pi和另外的Raspbian系统,并启动,用来作为备份操作的环境。要保证这个系统所在的SD卡的空间够大(我用了64G的卡,虽然没有必要这么大),足够用来保存img备份文件。

    用PC上的其他Linux系统也可以,比如Debian 9.3。 而且用PC会快一些。

    准备好要备份的SD卡,和USB读卡器。
    将插好源SD卡的读卡器插入树莓派(或PC)。

    首先安装必需的工具软件:

     

    pi@raspberrypi:~ $ sudo apt-get install dosfstools dump parted kpartx


    建立工作目录

     

     

     

     

    pi@raspberrypi:~ $ mkdir ~/backupimg
    pi@raspberrypi:~ $ cd ~/backupimg
    pi@raspberrypi:~/backupimg $ 


    【生成空白img文件】
    插入装有源SD卡的读卡器到USB口后,确定源SD卡对应的设备名

     

     

     

     

    pi@raspberrypi:~/backupimg $ ls /dev/sd*
    /dev/sda  /dev/sda1  /dev/sda2


    如上所示 /dev/sda 为源SD卡, /dev/sda1 为 /boot, /dev/sda2 为 / (根)。

    不同的系统会有所不同,可能会是sdb… 或其他,例如:

     

     

     

     

    yang@debian:~/backupimg$ ls /dev/sd*
    /dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb  /dev/sdb1  /dev/sdb2


    挂载源SD卡

     

     

     

     

    pi@raspberrypi:~/backupimg $ mkdir src_boot src_Root
    pi@raspberrypi:~/backupimg $ sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/sda1 ./src_boot/
    pi@raspberrypi:~/backupimg $ sudo mount -t ext4 /dev/sda2 ./src_Root/


    请注意,我用的是另一个raspberry系统做备份操作的,如果是用其他linux系统,例如PC上的Debian,请注意uid和gid的设置,上述第2,3条命令可能会是:

     

     

     

     

    yang@debian:~/backupimg$ sudo mount -t vfat -o uid=yang,gid=yang,umask=0000 /dev/sdb1 ./src_boot/
    yang@debian:~/backupimg$ sudo mount -t ext4 /dev/sdb2 ./src_Root/


    查看源SD卡已用空间大小

     

     

     

     

    pi@raspberrypi:~/backupimg $ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        59G  6.1G   51G  11% /
    devtmpfs        460M     0  460M   0% /dev
    tmpfs           464M     0  464M   0% /dev/shm
    tmpfs           464M   13M  452M   3% /run
    tmpfs           5.0M  4.0K  5.0M   1% /run/lock
    tmpfs           464M     0  464M   0% /sys/fs/cgroup
    /dev/mmcblk0p1   42M   21M   21M  51% /boot
    tmpfs            93M     0   93M   0% /run/user/1000
    /dev/sda1        56M   21M   36M  37% /home/pi/backupimg/src_boot
    /dev/sda2        15G  4.0G  9.9G  29% /home/pi/backupimg/src_Root


    如上可以看出/dev/sda已用空间大约4G

    建立一个空白的img文件,因为源SD卡已用空间大约4G,那么建立一个4600M的空白img文件应该够了。(安全起见,设定5000会更好)

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo dd if=/dev/zero of=raspberrypi.img bs=1M count=4600
    4600+0 records in
    4600+0 records out
    4823449600 bytes (4.8 GB, 4.5 GiB) copied, 283.248 s, 17.0 MB/s


    特别注意这里 bs=1M,千万不要写成1MB
    1M是1024*1024 Bytes, 而1MB是1000*1000 Bytes,会造成img文件的大小不是512 bytes的整数倍,后面会报错。

    这个过程大约几分钟完成。 如果比较着急,可以另开一个终端,运行如下命令,可以观察到img文件大小的变化。

     

     

     

     

    pi@raspberrypi:~ $ watch -d -n 5 ls -lh ~/backupimg


    完成后,确认一下img文件已经生成,且文件大小正确

     

     

     

     

    pi@raspberrypi:~/backupimg $ ls -l raspberrypi.img
    -rw-r--r-- 1 root root 4823449600 Dec 15 22:00 raspberrypi.img


    然后给img文件分区

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mklabel msdos
    pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122479s
    pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1


    分区的起始扇区数都是 8192 的倍数【20180716更新】,以保证4k对齐

    检查分区是否成功

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo parted raspberrypi.img
    GNU Parted 3.2
    Using /home/pi/backupimg/raspberrypi.img
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) print free                                                       
    Model:  (file)
    Disk /home/pi/backupimg/raspberrypi.img: 4823MB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start   End     Size    Type     File system  Flags
            16.4kB  4194kB  4178kB           Free Space
     1      4194kB  62.7MB  58.5MB  primary               lba
            62.7MB  62.9MB  205kB            Free Space
     2      62.9MB  4822MB  4759MB  primary
            4822MB  4823MB  1049kB           Free Space
    
    (parted) quit     


    在parted程序中,输入print free命令可以显示分区内容,输入quit退出

    【挂载img文件到系统】
    img文件对应的Loop device的设置

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo losetup -f --show raspberrypi.img
    /dev/loop0


    下面的命令中相应输入/dev/loop0,如果不是 loop0 请做相应调整(以及以后的各个步骤里的loop0都要改变)

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo kpartx -va /dev/loop0
    add map loop0p1 (254:0): 0 114288 linear 7:0 8192
    add map loop0p2 (254:1): 0 9295872 linear 7:0 122880
    
    pi@raspberrypi:~/backupimg $ ls /dev/mapper/loop0p*
    /dev/mapper/loop0p1  /dev/mapper/loop0p2


    此时loop device就设置好了,loop0p1对应的是img文件分区上的 /boot,loop0p2对应的是 /(根)


    接着给img文件中的两个分区格式化

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo mkfs.vfat -n boot /dev/mapper/loop0p1
    mkfs.fat 4.1 (2017-01-24)
    mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows
    pi@raspberrypi:~/backupimg $ sudo mkfs.ext4 /dev/mapper/loop0p2
    mke2fs 1.43.4 (31-Jan-2017)
    Discarding device blocks: done                            
    Creating filesystem with 1161984 4k blocks and 290880 inodes
    Filesystem UUID: d3e5d272-7752-48b2-a10e-e0e6d217ca7e
    Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (16384 blocks): done
    Writing superblocks and filesystem accounting information: done 


    挂载目标img文件loop device

     

     

     

     

    pi@raspberrypi:~/backupimg $ mkdir tgt_boot tgt_Root
    pi@raspberrypi:~/backupimg $ sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/
    pi@raspberrypi:~/backupimg $ sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_Root/


    请注意,我用的是另一个raspberry系统做备份操作的,如果是用其他linux系统,请注意uid和gid的设置,上述第2,3条命令可能会是:

     

     

     

     

    yang@debian:~/backupimg$ sudo mount -t vfat -o uid=yang,gid=yang,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/
    yang@debian:~/backupimg$ sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_Root/


    【备份/boot】
    首先备份/boot,直接拷贝即可

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo cp -rfp ./src_boot/* ./tgt_boot/


    【备份“/”】
    备份根文件系统稍微复杂些,可以用两种方法

    (方法一),dump/restore方法

    首先对目标挂载点设置合适的权限,并清空

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo chmod 777 tgt_Root
    pi@raspberrypi:~/backupimg $ sudo chown pi.pi tgt_Root
    pi@raspberrypi:~/backupimg $ sudo rm -rf ./tgt_Root/*
    pi@raspberrypi:~/backupimg $ cd tgt_Root/


    请注意,我用的是另一个raspberry系统做备份操作的,如果是用其他linux系统,请注意uid和gid的设置,上述第2条命令可能会是:

     

     

     

     

    yang@debian:~/backupimg$ sudo chown yang.yang tgt_Root


    然后开始备份

     

     

     

     

    pi@raspberrypi:~/backupimg/tgt_Root $ sudo dump -0uaf - ../src_Root/ | sudo restore -rf -
      DUMP: Date of this level 0 dump: Fri Dec 15 22:22:34 2017
      DUMP: Dumping /dev/sda2 (/home/pi/backupimg/src_Root) to standard output
      DUMP: Label: none
      DUMP: Writing 10 Kilobyte records
      DUMP: mapping (Pass I) [regular files]
      DUMP: mapping (Pass II) [directories]
      DUMP: estimated 4241064 blocks.
      DUMP: Volume 1 started with block 1 at: Fri Dec 15 22:22:35 2017
      DUMP: dumping (Pass III) [directories]
      DUMP: dumping (Pass IV) [regular files]
      DUMP: 62.53% done at 8780 kB/s, finished in 0:03
      DUMP: Volume 1 completed at: Fri Dec 15 22:30:36 2017
      DUMP: Volume 1 4242680 blocks (4143.24MB)
      DUMP: Volume 1 took 0:08:01
      DUMP: Volume 1 transfer rate: 8820 kB/s
      DUMP: 4242680 blocks (4143.24MB)
      DUMP: finished in 481 seconds, throughput 8820 kBytes/sec
      DUMP: Date of this level 0 dump: Fri Dec 15 22:22:34 2017
      DUMP: Date this dump completed:  Fri Dec 15 22:30:36 2017
      DUMP: Average transfer rate: 8820 kB/s
      DUMP: DUMP IS DONE


    整个dump/restore过程需要几分钟时间,看到 DUMP IS DONE 就说明备份成功了

    然后返回上层目录

     

     

     

     

    pi@raspberrypi:~/backupimg/tgt_Root $ cd ..
    pi@raspberrypi:~/backupimg $ 


    (方法二),tar方法
    如果上述方法一的 sudo dump … 那一步出现 Broken pipe、 Illegal instruction等错误而失败的话,可以使用方法二。
    这个方法会使用tar把源SD卡的根文件系统打包,所以在本机系统空间里需要额外的和源SD卡的根文件系统已用空间大小一样的可用空间。

    首先,和方法一里面一样,对目标挂载点设置合适的权限,并清空

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo chmod 777 tgt_Root
    pi@raspberrypi:~/backupimg $ sudo chown pi.pi tgt_Root
    pi@raspberrypi:~/backupimg $ sudo rm -rf ./tgt_Root/*


    请注意,我用的是另一个raspberry系统做备份操作的,如果是用其他linux系统,请注意uid和gid的设置,上述第2条命令可能会是:

     

     

     

     

    yang@debian:~/backupimg$ sudo chown yang.yang tgt_Root


    然后用tar把源SD卡的根文件系统打包

     

     

     

     

    pi@raspberrypi:~/backupimg $ cd src_Root/
    pi@raspberrypi:~/backupimg/src_Root $ sudo tar pcf ../backup.tar .


    tar的过程中可能会出现一些 socket ignored 错误,可以忽略。

    此过程可能需要比较长的时间,可另外开一个终端,运行如下命令,用来观察backup.tar文件大小的变化。

     

     

     

     

    pi@raspberrypi:~ $ watch -d -n 5 ls -lh ~/backupimg


    上述打包过程结束后,接着将tar包解开到目标img文件的根文件系统

     

     

     

     

    pi@raspberrypi:~/backupimg $ cd ../tgt_Root/
    pi@raspberrypi:~/backupimg/tgt_Root $ sudo tar pxf ../backup.tar


    此过程可能需要比较长的时间,可另外开一个终端,运行如下命令,用来观察目标img文件的根文件系统的已用空间大小变化

     

     

     

     

    pi@raspberrypi:~ $ watch -d -n 5 df -h


    解包过程结束后,回到上层目录,并删除backup.tar文件

     

     

     

     

    pi@raspberrypi:~/backupimg/tgt_Root $ cd ..
    pi@raspberrypi:~/backupimg $ sudo rm backup.tar 
    pi@raspberrypi:~/backupimg $ 


    【相应修改PARTUUID设定】
    这时候整个备份就已经完成了。不过此时的img文件即使写入到空白SD卡里面也是无法启动的,因为Raspbian启动要对应分区的PARTUUID,所以我们还要修改目标img文件里的如下两个文件:

     

     

     

     

    ./tgt_boot/cmdline.txt 
    ./tgt_Root/etc/fstab 

     

     

     

    首先查看img文件对应的loop device的两个分区的PARTUUID

     

    pi@raspberrypi:~/backupimg $ sudo blkid
    /dev/mmcblk0p1: LABEL="boot" UUID="E5B7-FEA1" TYPE="vfat" PARTUUID="ddffe93a-01"
    /dev/mmcblk0p2: UUID="b4ea8e46-fe87-4ddd-9e94-506c37005ac5" TYPE="ext4" PARTUUID="ddffe93a-02"
    /dev/sda2: UUID="9a7608bd-5bff-4dfc-ac1d-63a956744162" TYPE="ext4" PARTUUID="ec04fe79-02"
    /dev/loop0: PTUUID="af2f8761" PTTYPE="dos"
    /dev/mmcblk0: PTUUID="ddffe93a" PTTYPE="dos"
    /dev/sda1: LABEL="boot" UUID="B60A-B262" TYPE="vfat" PARTUUID="ec04fe79-01"
    /dev/mapper/loop0p1: SEC_TYPE="msdos" LABEL="boot" UUID="755C-C29C" TYPE="vfat" PARTUUID="af2f8761-01"
    /dev/mapper/loop0p2: UUID="a174c97e-049f-4fbd-abb7-0b9098dae24a" TYPE="ext4" PARTUUID="af2f8761-02"


    这里可以看到/boot对应的是af2f8761-01 , / 对应的是af2f8761-02

    修改 cmdline.txt 文件

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo vi ./tgt_boot/cmdline.txt 
    pi@raspberrypi:~/backupimg $ cat ./tgt_boot/cmdline.txt 
    dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=af2f8761-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait


    修改 fstab 文件

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo vi ./tgt_Root/etc/fstab 
    pi@raspberrypi:~/backupimg $ cat ./tgt_Root/etc/fstab 
    proc            /proc           proc    defaults          0       0
    PARTUUID=af2f8761-01  /boot           vfat    defaults          0       2
    PARTUUID=af2f8761-02  /               ext4    defaults,noatime  0       1
    # a swapfile is not a swap partition, no line here
    #   use  dphys-swapfile swap[on|off]  for that


    卸载各个挂载的分区

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo umount src_boot src_Root tgt_boot tgt_Root


    删除loop device

     

     

     

     

    pi@raspberrypi:~/backupimg $ sudo kpartx -d /dev/loop0
    pi@raspberrypi:~/backupimg $ sudo losetup -d /dev/loop0


    删除挂载点目录

     

     

     

     

    pi@raspberrypi:~/backupimg $ rmdir src_boot src_Root tgt_boot tgt_Root

     

    最后剩下img文件

     

    pi@raspberrypi:~/backupimg $ ls -l
    total 4469676
    -rw-r--r-- 1 root root 4823449600 Dec 15 23:10 raspberrypi.img


    【大功告成】
    完成之后可以用dd或者Etcher烧写img文件到其他SD卡中,注意烧写到新卡中在树莓派中运行后,要先用raspi-config先把分区空间expand一下,否则可用空间会很小。

     

     

     

    虽然步骤比较多,但是赤手空拳的一步一步命令来的更清晰明了,也能了解其中的技术细节。

     

    欢迎交流

    展开全文
  • 我想把我的v3s中的系统做备份,在网上各种寻找,开始了制作img。 1.安装工具 sudo apt-get install dosfstools sudo apt-get install dump sudo apt-get install parted sudo apt-get install kpartx 2....

    我想把我的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

     

    转载于:https://www.cnblogs.com/ZQQH/p/8453763.html

    展开全文
  • 制作SD卡系统镜像img文件

    千次阅读 2019-08-09 17:18:01
    img为一种镜像文件格式,它包含整个系统的所需要的文件。 #!/bin/bash _ersze=10 # 进入脚本所在目录 _DIR=$( cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd ) cd $_DIR sdcard="bbb.img" # 设置boot...

    img为一种镜像文件格式,它包含整个系统的所需要的文件。

    #!/bin/bash
    
    _ersze=10
    
    # 进入脚本所在目录
    _DIR=$( cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd )
    cd $_DIR
    
    sdcard="bbb.img"
    
    # 设置boot分区大小为40MB,根文件系统为1G
    fatsize=40
    linuxsize=512
    
    # 创建普通文件,并用0填充
    dd if=/dev/zero of=${sdcard}1 bs=1M count=$fatsize > /dev/null 2>&1
    dd if=/dev/zero of=${sdcard}2 bs=1M count=$linuxsize > /dev/null 2>&1
    _ersz=$(expr $fatsize + $linuxsize + 30)
    dd if=/dev/zero of=${sdcard} bs=1M count=$_ersz > /dev/null 2>&1
    
    # 创建msdos分区表
    echo ""
    echo "Creating new partition table"
    echo -e "o\nw" | fdisk ${sdcard} > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    	echo "ERROR"
    	exit 0
    fi
    sync
    echo "New filesystem created on $sdcard"
    sleep 1
    partprobe -s ${sdcard} > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    	echo "ERROR"
    	exit 1
    fi
    sleep 1
    
    echo ""
    echo "Partitioning $sdcard..."
    
    # 创建分区
    sfat=40960
    efat=$(expr $fatsize \* 1024 \* 1024 / 512 + $sfat - 1)
    echo "  Creating boot & linux partitions"
    sext4=$(expr $efat + 1)
    if [ $linuxsize == 0 ]; then
    	eext4=""
    else
    	eext4=$(expr $linuxsize \* 1024 \* 1024 / 512 + $sext4)
    fi
    echo -e "n\np\n1\n$sfat\n$efat\na\nn\np\n2\n$sext4\n$eext4\nt\n1\nb\nt\n2\n83\nw" | fdisk ${sdcard} > /dev/null 2>&1
    sync
    sleep 2
    partprobe -s ${sdcard} > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    	echo "ERROR."
    	exit 0
    fi
    
    # 格式化分区
    echo "Formating fat partition ..."
    mkfs -t vfat -F 32 -n BOOT ${sdcard}1 > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    	echo "ERROR formating fat partition."
    	exit 0
    fi
    vfatuuid=`blkid -s UUID -o value ${sdcard}1`
    echo "  fat partition formated."
    
    echo "Formating linux partition (ext4), please wait ..."
    mkfs -F -t ext4 -L linux ${sdcard}2 > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    	echo "ERROR formating ext4 partition."
    	exit 1
    fi
    ext4uuid=`blkid -s UUID -o value ${sdcard}2`
    echo "  ext4 partition formated."
    
    # 备份镜像的分区信息
    dd if=${sdcard} of=${sdcard}u bs=512 count=40960 > /dev/null 2>&1
    rm -f ${sdcard}
    
    # 挂载镜像的各个分区
    bootdir="boot"
    rootfsdir="linux"
    
    if [ ! -d $bootdir ]; then
    	mkdir $bootdir
    fi
    if [! -d $rootfsdir ]; then
    	mkdir $rootfsdir
    fi
    
    echo ""
    echo "Mounting SD Card partitions..."
    
    if ! mount ${sdcard}1 $bootdir; then
    	echo "ERROR mounting fat partitions..."
    	exit 1
    fi
    echo "FAT partitions mounted to $bootdir"
    
    if ! mount ${sdcard}2 $rootfsdir; then
    	echo "ERROR mounting linux partitions..."
    	umount $bootdir
    	exit 1
    fi
    echo "linux partition mounted to $rootfsdir"
    
    
    # 复制镜像到各个分区
    #-----------------------------------------------------------------------------------------------
    echo ""
    echo "Copying file system to image ..."
    echo ""
    
    cp u-boot/* $bootdir
    sync 
    
    #-------------------------------------------------------------------------------
    rsync -r -t -p -o -g -x --delete -l -H -D --numeric-ids -s --stats rootfs/ $rootfsdir/
    #-------------------------------------------------------------------------------
    sync
    
    # 取消挂载的分区
    if ! umount $bootdir; then
    	echo "ERROR unmounting fat partition."
    fi
    rm -rf $bootdir/* > /dev/null 2>&1
    rmdir $bootdir > /dev/null 2>&1
    
    if ! umount $rootfsdir; then
        echo "ERROR unmounting linux partitions."
    fi
    rmdir linux > /dev/null 2>&1
    
    # 将各分区合并到最后的镜像
    echo "Creating SDCard image..."
    dd if=${sdcard}u of=${sdcard} > /dev/null 2>&1
    
    if [ -f ${sdcard}1 ]; then
    	dd if=${sdcard}1 of=${sdcard} bs=1M conv=notrunc oflag=append > /dev/null 2>&1
    fi
    
    if [ -f ${sdcard}2 ]; then
    	dd if=${sdcard}2 of=${sdcard} bs=1M conv=notrunc oflag=append > /dev/null 2>&1
    fi
    
    exit 0

     

    展开全文
  • sd卡写入官方镜像,在windows上要用Win32 Disk Image,因为我用的是Mac系统切来切去有点麻烦,要是直接在Mac上写就方便多了。 对于要写入的SD卡,我们通常需要对它进行格式化,可以用格式化工具SD Card Formatter,...
  • 谢谢博主的分享...在原分区的起始点上新建分区,使用默认大小(SD卡剩余大小) 保存分区修改,格式化新分区 恢复数据 对应的脚本如下 #! /bin/sh
  • tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img cat rkxx_miniloader_vx.xx.bin >> idbloader.img 2、新的打包方式 cd uboot # 打包官方提供的ddr与miniloader的bin文件 ./make.sh --...
  • 目录制作备份Raspberry Pi树莓派SD卡img映像文件(使用传统的dd命令,但是不会产生很大的镜像文件)准备调整要备份的树莓派raspbian系统的分区大小用dd备份sd卡开始备份检查成果 制作备份Raspberry Pi树莓派SD卡的...
  • HTC G12recover下载的PG888IMG放到sd卡中 手机不识别怎么办?
  • 当我们使用fastboot烧写system.img的时候 fastboot flash system system.img 由于fastboot对刷入的img文件大小有限制,所以可能存在因为system....1. 在格式化sd卡的时候用 fdisk -c 0 1024 806 518 其中1024是syst
  • 树莓派一个最方便的地方就是可拆卸的存储设备(SD卡)和无BIOS的那种纯粹SD卡系统引导,这样我们可以配置多种功能的SD卡,需要哪种功能直接把相应的SD卡插入即可,有点商业头脑的兴许还可以把自己专有的软件固化到SD卡...
  • 说明:将树莓派Zero SD卡中的系统在树莓派3 B+上做成img镜像,并使用dd命令将生成的img镜像烧写到新的sd卡中,经测试可以正常使用。 注意: (1)之前使用CentOS7的PC机按照原作者的方法测试未成功,使用树莓派3 B...
  • 打开cmd,输入如下命令:mksdcard 100M sdcard.img该命令会在当前目录下生成一个sdcard.img文件,该文件就是Android模拟器的SD卡镜像文件。100M表示100兆,即该SD卡有1个G的容量,也可用K做单位(1M=1...
  • 新旧SD卡换装方法探讨:本文引用地址:http://www.eepw.com.cn/article/201610/305616.htm许多用户在Android手机买来使用一段时间后,往往发现无论是手机的外部存储空间(SD卡上的FAT32分区)还是手机的自身存储(ROM)...
  • 1.sb.append("<img src=\"file:///sdcard/Test/zuzong.jpg\"/>"); 2.webview.loadDataWithBaseURL(null, sb.toString(), "text/html", "utf-8", null); 转载于:...
  • SD卡,TF卡文件

    2018-01-05 10:55:23
    SD卡,TF卡的PCBLIB格式的封装,Micro SD卡座自弹式封装
  • 注:一定要认认真真的选择磁盘(根据其大小选择)删错了, 就废了!...使用工具win32DiskImager将官网下载的2018-06-27-raspbian-stretch.img写入树莓派的内存中 然后...... 由于假装无事, So我就不列举我...
  • sd卡量产工具

    2015-02-04 15:10:02
    PhoenixCard是一款将待量产的固件通过SD卡读卡器写入SD卡中的量产工具,用户可以选择不同的模式将SD卡烧写成量产模式或者是启动模式,烧写完成后可以用烧写好的SD卡来进行设备量产或者启动。 PhoenixCard使用方法:...
  • 于是,需要有一个可以解决上述问题的制作树莓派SD卡img映像文件的方法。 在网上搜索了一些,做了些研究,发现还是有办法的。 如下列网址所述:(感谢作者) http://www.cnblogs.com/haochuang/p/6066532.html ...
  • android 存储SD卡失败

    2016-07-05 09:35:55
    ![图片说明](https://img-ask.csdn.net/upload/201607/05/1467711294_415162.jpg) ![图片说明](https://img-ask.csdn.net/upload/201607/05/1467711343_683751.jpg)
  • adb+push上载文件到SD存储卡

    千次阅读 2011-12-28 13:35:36
     mksdcard指令仿真出1 GB的存储卡:mksdcard 1024M /home/yinjk/sdcard.img  经过一小段的硬盘读取时间后,就会在Android SDK tools/ 目录下生成一个文件大小为1GB的sdcard.img文件,也可以依照自己的需要...
  • 1.创建一个SD卡镜像文件 命令窗口进入sdk的tool目录下,创建sd卡镜像。 输入如下命令:mksdcard 1024M E:\Mysdcard\sdcard.img mksdcard是命令,1024M是指定sd卡大小,最后面是要创建的sd卡的路径,不能有中文...
  • SharedPreferences存储+SD卡存储+三级缓存存储介绍内部存储 SharedPreferences外部存储 SD卡存储三级缓存效果图 存储介绍 存储分为内部存储和外部存储 内部存储特点:随着App的卸载而消失 外部存储特点:私有路径,...
  • 烧写系统到sd卡 硬件:用的是友善之臂的NanoPC-T4工业级开发板 步骤: 1、准备好一个sd卡(class10以上高速SDHC卡)和一个读卡器,大小最好16g以上,保证空间充裕 2、准备好烧录软件,如 3、准备好系统镜像 镜像...
  • 1. 进入Android SDK目录下的tools子目录,运行 mksdcard -l sdcard 512M /your_path_for_img/sdcard.img 这样就创建了一个512M的SD卡镜像文件2.进入MOTODEV Studio for Android 1.3,打开device属性,设置SDimg 路径...
  • 树莓派把SD卡数据移动到新的SD卡

    千次阅读 2018-03-09 15:14:57
    工具:1.SD卡1(完成开发的系统)2.SD卡2 (格式化的新卡)3.Ubuntu系统(可以在windows虚拟机)4.SD卡读卡器步骤:1.在Ubuntu系统中检测SD卡1命令:df -h上图可以看到/dev/sdb1和/dev/sdb2已...
  • OpenWrt自动挂载sd卡

    万次阅读 2016-05-06 16:26:43
    openwrt自动挂载sd卡
  • 本文实例讲述了Android模拟器实现手机添加文件到sd卡的方法。分享给大家供大家参考,具体如下: 在DDMS中直接添加文件到模拟器sd卡如果出现错误类似:Failed to push XXXXX.txt on emulator- : Read-only file ...
  • 篇章一:SD卡的创建: 一 SDCard介绍 1.SDCard可以把他看看做是移动硬盘或U盘,也就是手机的内存卡 2.SDCard的创建是在eclipse创建模拟器时随同创建,也可以使用dos命令创建 二 SDCard的使用 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,249
精华内容 14,099
关键字:

sd卡img