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


17

如何将分区稍微移到磁盘的开头?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.   

您是否在使用没有FS的分区?您可以仅将FS设置为与之共享的任何人,fdisk然后将其移动。
彼得

因此实际上是LUKS容器。但是我不认为分区移动器应该在文件系统内部进行查看。
六。

gparted在类似情况下对我来说做得很好。
palacsint

也许最终他们已经实施了这个?
六。

1
Parted vesion 3.2没有“移动”选项。
Lenne

Answers:


4

sfdisk旨在成为可编写脚本的fdisk,自某个版本开始提供了该--move-data选项。他们的手册页中的示例:

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

15

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

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

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

暂停中:

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

# kill -9 907

remember 586921398272/512 = 1146330856

恢复:

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

2
救命!是否有人尝试使用更大的bs值(出于速度原因)?
大卫·巴拉西奇(DavidBalažic)2013年

确保在其他bs大小的情况下适当地重新计算了值。
六。

3
为什么不dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb skip=73402368 seek=0 of=/dev/sdb3呢?这样,即使在旧sdb3的启动中也应在新sdb3的内部工作
solsTiCe 2015年

@solsTiCe,您的命令和我的命令有什么区别?
六。

3
较大的bs本身并不能帮助我,但是bs=1M iflag=direct oflag=direct确实可以。在我的SSD上从40 MB / s变为400 MB / s。此外,使用status=progress
亚历山大·杜宾斯基

3

您可以随时使用dd

  • 从liveCD引导(或确保分区未安装的任何其他方式)
  • dd if=/dev/sdc2 of=somefile bs=1M 在文件上创建分区的副本。
  • fdisk(或您喜欢的任何文件)删除分区
  • fdisk(或您喜欢的任何文件)在所需位置创建分区。
  • dd of=/dev/sdc2 if=somefile bs=1M 从文件还原内容。

如何就地进行?这个分区几乎和我家中所有其他硬盘一起使用时一样大。
六。

我可以做类似的事情dd if=/dev/sdb of=/dev/sdb bs=512 skip=N seek=M吗?
六。

也许可以汤姆,但先测试一下。Esp。如果您没有分区上数据的备份。(还请注意,如果您有备份,那么可以使用更简单的解决方案)。
Hennes

3
@Vi。答案的正确,正确的第一答案不应该让人失望,因为在问题中不存在这种“就地执行”的要求。
zero2cx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.