![使用命令行工具将分区移动到右侧](https://linux22.com/image/219611/%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7%E5%B0%86%E5%88%86%E5%8C%BA%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%8F%B3%E4%BE%A7.png)
我有一个分区,比如说 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
后跟乘法后缀(如M
等KiB
)时,才会将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
,即两者之间没有间隙。