我需要一些帮助来获得日命令行正在将我的分区按块向右移动。
在使用工具对某些 PC 进行映像处理时,我偶然发现了一个错误,现在我需要重新对这些机器进行分区,而不会丢失任何数据。这在 gparted 0.18.0 中运行良好。在那里,我将第二个分区向右移动,偏移量为 79MB。然后我将第一个分区扩大到 79MB。一切都运行正常。但由于有大约 35 台机器,我想构建一个脚本来执行此操作。
调整大小和其他一切都很简单。我不明白的是将分区向右移动。基本上我需要一个日命令行可以做到这一点。我的想法是,我需要从后面开始,然后向前推进。所以我想:
- 如果和是同一个分区(记住已经增长到适合偏移数据)/dev/sda2
- bs 可能是 16MiB,因为这是 gparted 的基准测试结果
- 实现从右到左复制的参数是什么,这样数据就不会被覆盖
我和 gparted 的维护者交流过,他说可以用 dd 来实现这个功能。但我不知道该怎么做。
答案1
- 哪些参数可以存档从右到左的复制,以便数据不会被覆盖
不存在,没有在一个命令中dd 解决方案
我也警告你不要使用日移动分区,因为如果出现故障,您没有机会恢复数据,除非您在操作之前备份。但是如果您有备份,那么操作就很简单了。所以那是免责声明。
现在来谈谈有趣的方法(我觉得你的问题很有趣)。我没有以这种方式移动分区,但它可能有效,因此在测试文件上进行概念验证:
perl -e 'foreach $i (0..1023) { printf "%0.7i\n", $i; }' >test.dat
仅制作测试文件,用于实验
我们还需要pv 命令,它可以充当我们数据的缓冲区,形式如下:pv -B buffer_size_in_bytes
dd if=test.dat | pv -B 1024 | dd of=test.dat seek=2
默认日块大小为 512 字节 - 我们将数据移动 2 个 dd 块,因此 1024 字节的缓冲区就足够了。
dd if=/div/sda bs=512*device block size* skip=111111*much blocks until sda2 begins*
| pv -B 90000000 *have_to_fit_shift size+*
| dd of=/div/sda seek=(blocks until sda2 begins + amount of blocks we shift that for)
此后,如果一切顺利,则需要修复分区表。
但可能更常见的方式是使用 dd 逐块移动数据
dd if=/div/sda bs=1M count=100 skip=PosToRead seek=PosToWrite
PosToRead -= dd_count
PosToWrite -= dd_count
repeat if not done
还那里dd 朝相反方向移动,处理 dd 命令并确定偏移量时很有趣
答案2
dd_救援-r
有改变方向的选项。
使用示例:
partition=/dev/vdc1
disk=/dev/vdc
sector_size=512
new_start_sector=4096
# opos is right after the new partition and given in bytes
opos=$(($new_start_sector * $sector_size + `blockdev --getsize64 $partition`))
dd_rescue -v -r -S $opos $partition $disk
之后不要忘记更新分区表。之前不要更新!