如何在 GNU/Linux 中移动分区?

Vi.*_*Vi. 21 linux partitioning

如何将分区移动到磁盘的开头一点?由于某种原因,Parted 想要一个文件系统(我不知道为什么),我只想将所有扇区左移......

r@l:15:32:45:~# parted /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model: HGST HTS 541010A9E680 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  32.2GB  32.2GB  primary  fat32
 2      32.2GB  37.6GB  5360MB  primary
 3      37.6GB  1000GB  963GB   primary

(parted) move 3                                                           
WARNING: you are attempting to use parted to operate on (move) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs.  We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Error: Could not detect file system.   
Run Code Online (Sandbox Code Playgroud)

Vi.*_*Vi. 17

使用 dd 和 fdisk 手动方式:

# fdisk -l /dev/sdb | grep sdb3
/dev/sdb3        73402368  1953525167   940061400   83  Linux

# fdisk /dev/sdb
Command (m for help): d
Partition number (1-4): 3
Command (m for help): n
Partition number (1-4, default 3): 3
First sector (73385984-1953525167, default 73385984): 
Using default value 73385984
Last sector, +sectors or +size{K,M,G} (73385984-1953525167, default 1953525167): 
Using default value 1953525167
Command (m for help): w
The partition table has been altered!

# fdisk -l /dev/sdb | grep sdb3
/dev/sdb3        73385984  1953525167   940069592   83  Linux

# dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3 count=100 skip=$((73402368-73385984)) seek=0 2> /dev/null | file -s -
/dev/stdin: LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: af1c47f0-4ca5-4ea7-a091-065bd263653f

# dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3  skip=$((73402368-73385984)) seek=0 of=/dev/sdb3

# file -s /dev/sdb3
/dev/sdb3: sticky LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: af1c47f0-4ca5-4ea7-a091-065bd263653f
Run Code Online (Sandbox Code Playgroud)

现在等待大约2小时。(更多看起来更像是 18 小时...)

注意:这只会将数据向后移动,而不是向前移动。

暂停:

# pidof dd
907
# kill -STOP 907
# cat /proc/907/fdinfo/1
pos:    586921398272
flags:  0100001

# kill -9 907

remember 586921398272/512 = 1146330856
Run Code Online (Sandbox Code Playgroud)

恢复:

dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3  skip=$((1146330856+73402368-73385984)) seek=1146330856 of=/dev/sdb3
Run Code Online (Sandbox Code Playgroud)

  • 为什么不`dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb skip=73402368 seek=0 of=/dev/sdb3`?这样一来,即使在新 sdb3 内,旧 sdb3 的启动也应该有效 (3认同)
  • 更大的 bs 本身并没有帮助我,但是 `bs=1M iflag=direct oflag=direct` 可以。我的 SSD 从 40 MB/s 到 400 MB/s。另外,使用`status=progress` (3认同)
  • 救命稻草!有没有人尝试使用更大的 bs 值(出于速度原因)? (2认同)

小智 9

sfdisk,它打算成为一个可编写脚本的 fdisk,从某个版本开始就有这个--move-data选项。来自他们手册页的示例:

echo '+100M,' | sfdisk --move-data /dev/sdc -N 1
Run Code Online (Sandbox Code Playgroud)


Hen*_*nes 5

您始终可以使用dd.

  • 从 liveCD 启动(或确保分区未安装的任何其他方式)
  • dd if=/dev/sdc2 of=somefile bs=1M 在文件上创建分区的副本。
  • fdisk(或您喜欢的任何东西)删除分区
  • fdisk(或任何你喜欢的)在你想要的地方创建分区。
  • dd of=/dev/sdc2 if=somefile bs=1M 从文件中恢复内容。

  • @维。这个正确的、第一个答案的回答不值得任何人反对,因为这个“就地做”的要求在问题中不存在。 (5认同)