zoukankan      html  css  js  c++  java
  • 使用sgdisk、e2fsck和resize2fs对分区进行扩容

    邮箱:pengdonglin137@163.com

    参考:

    man sgdisk

    使用 sgdisk 管理分区

    sgdisk基本用法

    考虑下面一种场景:

    编译刷机包时,是按照2GB的eMMC制作gpt分区格式的镜像,但是最终使用的eMMC的大小是4GB,如何让最后一个分区占满后面的2GB空间,并且保证分区文件系统原有的内容不丢失呢?

     

    下面在本地模拟一下:

      先创建两个大小都为100MB的空文件origin.disk和empty.disk,其中origin.disk所模拟的就是上面2GB的eMMC,然后对其进行分区,并且创建文件系统,在最后一个分区里新建一个文件,用于验证内容是否会丢失。接着将origin.disk和empty.disk进行拼接得到new.disk,此时这个new.disk所模拟的就是上面的4GB大小的eMMC。然后对这个new.disk进行处理,使最后一个分区占满新增加的空间,最后会输出扩展后的分区中的文件的内容,看是否跟原有文件相同。

     

    下面是测试脚本:

    #!/bin/bash
    
    # clear
    rm -rf origin.disk
    rm -rf new.disk
    
    ###########################################################################################################
    # Create origin.disk: 100MB
    dd if=/dev/zero of=./origin.disk bs=1024 count=102400
    dd if=/dev/zero of=./empty.disk bs=1024 count=102400
    
    # Create GPT and partition
    sgdisk -n 0:0:+30M -c 1:"1st" ./origin.disk
    sgdisk -n 0:0:+20M -c 2:"2nd" ./origin.disk
    sgdisk -n 0:0:0 -c 3:"3rd" ./origin.disk
    
    # losetup
    sudo losetup /dev/loop1 ./origin.disk
    sudo partprobe /dev/loop1
    
    # Create fs
    echo "Create file system ..."
    sudo mkfs.ext4 /dev/loop1p1
    sudo mkfs.ext4 /dev/loop1p2
    sudo mkfs.ext4 /dev/loop1p3
    
    # Create a file
    mkdir -p p3
    sudo mount -t ext4 /dev/loop1p3 ./p3
    sudo chmod 777 p3
    sudo echo "Hello world" > ./p3/demo.txt
    sync
    df -h | tail -n 1
    sudo umount ./p3
    
    # Show Partition
    sudo sgdisk -p ./origin.disk
    # or
    sudo sgdisk -p /dev/loop1
    
    # losetup deattach
    sudo losetup -d /dev/loop1
    
    ###########################################################################################################
    # Create New disk
    echo "Create new disk ..."
    cat origin.disk empty.disk > new.disk
    
    # losetup
    echo "losetup ..."
    sudo losetup /dev/loop1 ./new.disk
    sudo partprobe /dev/loop1
    
    # Move backup gpt to the end
    echo "Move back up gpt partition ..."
    sudo sgdisk -e /dev/loop1
    
    # Delete last part
    echo "Delete last part ..."
    sudo sgdisk -d 3 /dev/loop1
    
    # Recreate last part
    echo "Recreate last part ..."
    sudo sgdisk -n 0:0:0 -c 3:"New 3rd" /dev/loop1
    sudo partprobe /dev/loop1
    
    # Check
    echo "e2fsck -f /dev/loop1p3 ..."
    sudo e2fsck -f /dev/loop1p3
    
    # Resize
    echo "resize2fs /dev/loop1p3 ..."
    sudo resize2fs /dev/loop1p3
    
    # mount
    echo "mount -t ext4 /dev/loop1p3 ./p3 ..."
    sudo mount -t ext4 /dev/loop1p3 ./p3
    df -h | tail -n 1
    cat ./p3/demo.txt
    
    # umount
    echo "umount ..."
    sudo umount ./p3
    echo "losetup detach ..."
    sudo losetup -d /dev/loop1
    
    # end
    sudo sgdisk -p ./new.disk
    echo "End"

    下面是输出log:

      1 102400+0 records in
      2 102400+0 records out
      3 104857600 bytes (105 MB, 100 MiB) copied, 0.299038 s, 351 MB/s
      4 102400+0 records in
      5 102400+0 records out
      6 104857600 bytes (105 MB, 100 MiB) copied, 0.304469 s, 344 MB/s
      7 Creating new GPT entries.
      8 Setting name!
      9 partNum is 0
     10 REALLY setting name!
     11 Warning: The kernel is still using the old partition table.
     12 The new table will be used at the next reboot or after you
     13 run partprobe(8) or kpartx(8)
     14 The operation has completed successfully.
     15 Setting name!
     16 partNum is 1
     17 REALLY setting name!
     18 Warning: The kernel is still using the old partition table.
     19 The new table will be used at the next reboot or after you
     20 run partprobe(8) or kpartx(8)
     21 The operation has completed successfully.
     22 Setting name!
     23 partNum is 2
     24 REALLY setting name!
     25 Warning: The kernel is still using the old partition table.
     26 The new table will be used at the next reboot or after you
     27 run partprobe(8) or kpartx(8)
     28 The operation has completed successfully.
     29 Create file system ...
     30 mke2fs 1.42.13 (17-May-2015)
     31 Discarding device blocks: done                            
     32 Creating filesystem with 30720 1k blocks and 7680 inodes
     33 Filesystem UUID: b71db7b0-1b0b-4b54-a3b3-4d642d8db8c6
     34 Superblock backups stored on blocks: 
     35         8193, 24577
     36 
     37 Allocating group tables: done                            
     38 Writing inode tables: done                            
     39 Creating journal (1024 blocks): done
     40 Writing superblocks and filesystem accounting information: done
     41 
     42 mke2fs 1.42.13 (17-May-2015)
     43 Discarding device blocks: done                            
     44 Creating filesystem with 20480 1k blocks and 5136 inodes
     45 Filesystem UUID: da901017-8edc-4509-a535-3ce31bbf3af4
     46 Superblock backups stored on blocks: 
     47         8193
     48 
     49 Allocating group tables: done                            
     50 Writing inode tables: done                            
     51 Creating journal (1024 blocks): done
     52 Writing superblocks and filesystem accounting information: done
     53 
     54 mke2fs 1.42.13 (17-May-2015)
     55 Discarding device blocks: done                            
     56 Creating filesystem with 50156 1k blocks and 12544 inodes
     57 Filesystem UUID: 149c00b8-8f2d-49ac-8307-a341e541d738
     58 Superblock backups stored on blocks: 
     59         8193, 24577, 40961
     60 
     61 Allocating group tables: done                            
     62 Writing inode tables: done                            
     63 Creating journal (4096 blocks): done
     64 Writing superblocks and filesystem accounting information: done
     65 
     66 /dev/loop1p3     44M  795K   40M   2% /home/peng_dl/work/A15/resize/p3
     67 Disk ./origin.disk: 204800 sectors, 100.0 MiB
     68 Logical sector size: 512 bytes
     69 Disk identifier (GUID): 20C58E58-BC5D-4432-9BB8-B007981C614D
     70 Partition table holds up to 128 entries
     71 First usable sector is 34, last usable sector is 204766
     72 Partitions will be aligned on 2048-sector boundaries
     73 Total free space is 2014 sectors (1007.0 KiB)
     74 
     75 Number  Start (sector)    End (sector)  Size       Code  Name
     76    1            2048           63487   30.0 MiB    8300  1st
     77    2           63488          104447   20.0 MiB    8300  2nd
     78    3          104448          204766   49.0 MiB    8300  3rd
     79 Disk /dev/loop1: 204800 sectors, 100.0 MiB
     80 Logical sector size: 512 bytes
     81 Disk identifier (GUID): 20C58E58-BC5D-4432-9BB8-B007981C614D
     82 Partition table holds up to 128 entries
     83 First usable sector is 34, last usable sector is 204766
     84 Partitions will be aligned on 2048-sector boundaries
     85 Total free space is 2014 sectors (1007.0 KiB)
     86 
     87 Number  Start (sector)    End (sector)  Size       Code  Name
     88    1            2048           63487   30.0 MiB    8300  1st
     89    2           63488          104447   20.0 MiB    8300  2nd
     90    3          104448          204766   49.0 MiB    8300  3rd
     91 Create new disk ...
     92 losetup ...
     93 Warning: Not all of the space available to /dev/loop1 appears to be used, you can fix the GPT to use all of the space (an extra 204800 blocks) or continue with the current setting? 
     94 Move back up gpt partition ...
     95 Warning: The kernel is still using the old partition table.
     96 The new table will be used at the next reboot or after you
     97 run partprobe(8) or kpartx(8)
     98 The operation has completed successfully.
     99 Delete last part ...
    100 Warning: The kernel is still using the old partition table.
    101 The new table will be used at the next reboot or after you
    102 run partprobe(8) or kpartx(8)
    103 The operation has completed successfully.
    104 Recreate last part ...
    105 Setting name!
    106 partNum is 2
    107 REALLY setting name!
    108 Warning: The kernel is still using the old partition table.
    109 The new table will be used at the next reboot or after you
    110 run partprobe(8) or kpartx(8)
    111 The operation has completed successfully.
    112 e2fsck -f /dev/loop1p3 ...
    113 e2fsck 1.42.13 (17-May-2015)
    114 Pass 1: Checking inodes, blocks, and sizes
    115 Pass 2: Checking directory structure
    116 Pass 3: Checking directory connectivity
    117 Pass 4: Checking reference counts
    118 Pass 5: Checking group summary information
    119 /dev/loop1p3: 12/12544 files (0.0% non-contiguous), 6482/50156 blocks
    120 resize2fs /dev/loop1p3 ...
    121 resize2fs 1.42.13 (17-May-2015)
    122 Resizing the filesystem on /dev/loop1p3 to 152556 (1k) blocks.
    123 The filesystem on /dev/loop1p3 is now 152556 (1k) blocks long.
    124 
    125 mount -t ext4 /dev/loop1p3 ./p3 ...
    126 /dev/loop1p3    141M  1.2M  130M   1% /home/peng_dl/work/A15/resize/p3
    127 Hello world
    128 umount ...
    129 losetup detach ...
    130 Disk ./new.disk: 409600 sectors, 200.0 MiB
    131 Logical sector size: 512 bytes
    132 Disk identifier (GUID): 20C58E58-BC5D-4432-9BB8-B007981C614D
    133 Partition table holds up to 128 entries
    134 First usable sector is 34, last usable sector is 409566
    135 Partitions will be aligned on 2048-sector boundaries
    136 Total free space is 2014 sectors (1007.0 KiB)
    137 
    138 Number  Start (sector)    End (sector)  Size       Code  Name
    139    1            2048           63487   30.0 MiB    8300  1st
    140    2           63488          104447   20.0 MiB    8300  2nd
    141    3          104448          409566   149.0 MiB   8300  New 3rd
    142 End

    完。

  • 相关阅读:
    PHP返回XML与JSON数据
    Canvas学习-1
    PHP与cURL
    PHP调用SOAP Webservice
    Ubuntu查找文件是否安装
    API Centeric Web Application论文
    Git学习2
    An invalid character [32] was present in the Cookie value
    关于eclipse项目的x号报错的一些问题
    关于eclipse的项目前有感叹号和errors exist in required project相关问题
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/12096857.html
Copyright © 2011-2022 走看看