2

Мне нужна помощь, чтобы получить командную строку dd, которая перемещает мой раздел вправо.

Я наткнулся на ошибку при использовании инструментов для создания изображения некоторых элементов, и теперь мне нужно перераспределить эти машины без потери данных. Это работает очень хорошо с gparted 0.18.0. Там я перемещаю свой второй раздел вправо со смещением 79 МБ. Тогда я вырасту мой первый раздел 79MB. Все работает без нареканий. Но так как есть около 35 машин, я хотел создать скрипт, который делает это.

Изменение размера и все довольно легко. То, что я не получаю в моей голове, - это перемещение перегородки вправо. В основном мне нужна командная строка dd, которая делает это. Я думаю, что мне нужно начинать сзади и идти вперед. Вот я и подумал:

  • if и of - это один и тот же раздел (помните, что он уже увеличен для соответствия данным смещения) /dev /sda2
  • bs может быть 16MiB, так как это то, что gparted сравнил
  • какие параметры будут выполнять копирование справа налево, чтобы данные не перезаписывались

Я говорил с сопровождающим gparted, и он сказал, что для достижения этой цели используется dd. Но я не могу понять, как.

2 ответа2

2
  • какие параметры будут архивировать при копировании справа налево, чтобы данные не перезаписывались

Не существует, нет в одной команде дд решения

Также я предупреждаю вас об использовании 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

размер блока dd по умолчанию составляет 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 chunk на chunk

dd if=/div/sda bs=1M count=100 skip=PosToRead seek=PosToWrite
PosToRead -= dd_count
PosToWrite -= dd_count
repeat if not done

также там dd движется в противоположном направлении, интересно в обработке команды dd и определении смещений

0

У dd_rescue есть опция -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

После этого не забудьте обновить таблицу разделов. Не обновляйте его раньше!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .