使用命令行工具将分区移动到右侧

使用命令行工具将分区移动到右侧

我有一个分区,比如说 190 GB,后面还有 100 GB 的未分区磁盘可用空间。

我想将此分区“向右”移动 100GB(朝向更高的扇区号),以便未分区的可用空间位于其左侧。

这个分区不能随便复制,因为:

  • 它包含必须保留的加密数据(在块级别),
  • 分区的新旧位置有重叠。

我知道 GParted 应该能够处理这个问题。不过我想用命令行工具自己完成。我知道sfdisk 有东西像这样将分区100M向右移动:

echo '+100M,' | sfdisk --move-data /dev/sdc -N 1

我想知道两件事:

  • 如果我要使用类似dd(或其他)的工具手动移动数据,我会怎么做?我相信分区的末尾必须在它的开始之前复制,就像向后读取和复制一样(当然,我还需要编辑 GPT 分区表)。
  • 如果我想使用sfdisk,我该如何使用它才能移动非常精确的扇区号,以便它正确地“接触”位于磁盘远端的分区? (这样它们就真的彼此相邻,中间没有间隙)

答案1

如果我想使用sfdisk,我该如何使用它,以便我移动一个非常精确的扇区号,以便它正确地“接触”位于磁盘远端的分区? (这样它们就真的彼此相邻,中间没有间隙)

您可以通过提供扇区数量作为输入来做到这一点sfdisk

echo '+NUM' | sfdisk --move-data /dev/sdc -N 1

会将第一个分区扇区移至NUM右侧。
正如手册中所解释的

数字参数默认解释为扇区数

仅当NUM后跟乘法后缀(如MKiB)时,才会将sfdisk其视为以字节为单位的大小(例如+50GiB)。


你怎么知道扇区的数量?很简单,sfdisk通过开关报告-F

-F, --list-free [device...]
列出所有或指定设备上的空闲未分区区域。

示例输出(我用粗体标记了可用区域的扇区数):

    起始结束扇区大小
114369428 324084628  209715200   100克

NUM因此使用第一个命令中的数字:

echo '+209715200' | sfdisk --move-data /dev/sdc -N 1

会将第一个分区移动到下一个分区旁边,中间没有间隙。


作为记录,这里是在 2GB sd 卡上运行的(删除了与输出无关的部分):
有 4 个分区,我删除了第三个分区,以便在第二个分区之后有可用空间,然后我将移动到最后一个分区的旁边。我首先列出现有分区:

sfdisk -l /dev/sdc  

[...]

Device    Boot   Start     End Sectors  Size Id Type
/dev/sdc1         2048 2099199 2097152    1G  c W95 FAT32 (LBA)
/dev/sdc2      2099200 2488319  389120  190M  c W95 FAT32 (LBA)
/dev/sdc4      2693120 3966975 1273856  622M  7 HPFS/NTFS/exFAT

sdc2我想要移动的分区以扇区结束2488319,因此可用空间从扇区开始2488320。然后我列出可用空间区域:

sfdisk -F /dev/sdc

Unpartitioned space /dev/sdc: 101,5 MiB, 106430464 bytes, 207872 sectors
[...]

  Start     End Sectors  Size
2488320 2693119  204800  100M
3966976 3970047    3072  1,5M

有两个可用空间区域 - 我需要第一个。从 ... 开始的扇区的扇区数2488320,然后我使用该数字 - 204800- 作为sfdisk移动分区 2 的输入:

回声“+204800”| sfdisk /dev/sdc -N 2 --移动数据
Checking that no-one is using this disk right now ... OK

[...]

Old situation:

Device    Boot   Start     End Sectors  Size Id Type
/dev/sdc1         2048 2099199 2097152    1G  c W95 FAT32 (LBA)
/dev/sdc2      2099200 2488319  389120  190M  c W95 FAT32 (LBA)
/dev/sdc4      2693120 3966975 1273856  622M  7 HPFS/NTFS/exFAT

New situation:

Device    Boot   Start     End Sectors  Size Id Type
/dev/sdc1         2048 2099199 2097152    1G  c W95 FAT32 (LBA)
/dev/sdc2      2304000 2693119  389120  190M  c W95 FAT32 (LBA)
/dev/sdc4      2693120 3966975 1273856  622M  7 HPFS/NTFS/exFAT

Data move:
  start sector: (from/to) 2099200 / 2304000
  sectors: 389120
  step size: 1048576 bytes

Moved 389120 from 389120 sectors (100%).

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

根据New situation:输出,分区2结束扇区现在为2693119,分区4开始扇区为2693120,即两者之间没有间隙。

相关内容