参考:
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
完。