Может ли dd перезаписать соседние разделы


15

Было бы

dd if=/dev/zero of=somepartition bs=512

также стереть разделы после somepartitionили остановить в конце somepartition?


5
Блочные устройства, представляющие разделы, например /dev/sda1, создаются ядром таким образом, что через них невозможно получить доступ к соседнему хранилищу (при условии, что таблица разделов не была изменена после того, как ядро ​​прочитало ее в последний раз). Если бы вы могли получить доступ к соседнему хранилищу таким образом, это было бы большой ошибкой.
Дэвид Фёрстер,

Ответы:


18

Перезаписать раздел dd

ddэто очень мощный, но и опасный инструмент. Он делает то, что вы говорите, чтобы сделать это без вопросов. Так что, если вы скажете, чтобы вытерли семейные фотографии, ... и это небольшая ошибка при печати.

Но если вы проверите и перепроверьте, вы можете использовать его.

dd if=/dev/zero of=somepartition bs=512

или я бы предложил

dd if=/dev/zero of=/dev/sdxn bs=4096

где x- буква диска, nномер раздела и размер блока 4096 байт, что ускоряет процесс записи.

В этом случае важно написать в раздел . Если вы запишете весь диск (конец головки диска), /dev/sdxвесь диск будет перезаписан. Но запись в раздел будет прервана в конце раздела и разделы за ним будут сохранены. (Я тестировал сейчас на USB Pendrive в Lubuntu 16.04 LTS, так что я знаю, что это работает так.)

Исключение для расширенного раздела

Существует исключение для расширенного раздела (который является контейнером для логических разделов, чтобы иметь более четырех разделов в таблице разделов MSDOS). Это описано в следующей ссылке,

Могу ли я сделать образ «расширенного» раздела, используя dd?

Но есть и другая проблема. Я протестировал вашу команду в тестовой среде, и dd прочитал только один кибибайт (1024 байта), когда я хотел, чтобы он создал образ расширенного раздела.

Я также проверил это сейчас на USB-pendrive в Lubuntu 16.04 LTS, и это относится и к записи (и к чтению). Только первый кибибайт перезаписывается.

Таким образом, чтобы подвести итог, перезапись основных разделов и логических разделов работают в соответствии с основным описанием в этом ответе. Но не используйте этот метод для перезаписи расширенного раздела, потому что будет перезаписан только первый кибибайт. Логические разделы расширенного раздела больше не будут найдены через таблицу разделов, но данные, хранящиеся в них, все еще там.


Я уже принял, но если это так, то это должен быть правильный ответ.
LogicBreaker

3
@LogicBreaker, Может быть, вы можете перенести принятие. Но это не важно. Более важно, чтобы вы понимали, как использовать ddи что это рискованно, чтобы вы были очень осторожны при его использовании. Удачи :-) В общем, вы всегда должны иметь резервную копию всех файлов, которые вы не можете позволить себе потерять.
sudodus

1
При записи на пустые разделы у вас не так много альтернатив. Я переехал, иначе это могло бы ввести в заблуждение других.
LogicBreaker

1
Вот почему пользователи обычно не могут получить доступ к / dev / * "файлам".
Торбьерн Равн Андерсен

1
Если это единственная копия ваших семейных фотографий без резервной копии, то вы можете потерять их в любое время из-за кражи, пожара, несчастного случая или простого сбоя оборудования :-)
user334639

4

Записывает на устройство раздела, не записывает вне этого раздела, с помощью dd или чего-либо еще. Вам потребуется использовать устройство wholedisk, чтобы иметь какой-либо эффект вне одного раздела.

(Предостережение: если на вашем диске нет таблицы разделов с перекрывающимися разделами, что никогда не должно происходить.)


3
Еще одна оговорка: если вы используете что-то вроде LVM, запись на физический том может, конечно, повлиять на многие логические тома.
Maxpm

4

Я думаю, что ваш вопрос основан на фундаментальном недоразумении о том, как dd(и на самом деле Unix-подобные операционные системы в целом) работают:

ddне может перезаписать соседние разделы, просто потому что ddне может перезаписать разделы, точка .

ddпросто пишет в файлы . Вот и все.

Теперь, если вы передадите ddфайл, представляющий несколько разделов, то этот файлdd будет перезаписан . Но в этом случае он не пишет после конца раздела. все равно будет писать до конца файла и только до конца файла.dddd

Но если вы передадите ddфайл, который представляет только один раздел, то ddзапись не будет завершена после его окончания. Опять же, это не имеет ничего общего с dd. ddпросто пишет в файл, который вы говорите, чтобы написать. Тот факт, что этот файл представляет один раздел, (в данном случае) обеспечивается драйвером блочного устройства в ядре. ddне имеет к этому никакого отношения.

Итак, вкратце: ddпишет в файлы. То, что представляют эти файлы, не имеет ddзначения. ddничего не знает о разделах.


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

1
Верный. Вы не можете использовать ddдля записи в сырые разделы. Вы можете писать только в файлы. Конечно, вы можете записать в файл блочного устройства, который представляет раздел (например /dev/sda1), но вы не можете записать в необработанный раздел. А поскольку вы можете записывать только в файл, представляющий раздел, вы не можете записывать после конца раздела, потому что файл представляет только раздел, а не раздел и чуть позже конца.
Йорг Миттаг

3
Йорг ссылается на одну из основных идей философии Unix - «все это файл». Таким образом, ядро ​​представляет патенты, устройства, порты и т. Д. В виде файлов. В результате каждая программа, которая может записывать в файл, может использоваться для записи в раздел или устройство. Задача ядра заключается в обеспечении границы раздела. Вы можете открыть /dev/sdaв своем текстовом редакторе и изменить данные, ddне отличающиеся от любой другой программы в плане возможности доступа к разделам. Очень хороший ответ!
Сергей

1

Существует опасный, но редкий специальный сценарий, в котором это может произойти даже с драйверами блочных устройств без ошибок:

  • Таблица разделов на диске изменяется таким образом, что размер раздела x изменяется так, чтобы он заканчивался на более низкой границе, чем раньше. Либо раздел y за ним изменяется с самого начала на нижней границе, либо в пространство добавляется новый раздел y.
  • Раздел y заполняется соответствующими данными с помощью средств, которые не зависят от таблицы разделов, например, используя dd с опциями пропуска / подсчета на блочном устройстве всего диска (например, / dev / sda)
  • Ioctl, который говорит ядру перечитать таблицу разделов, не выдается или дает сбой из-за занятых устройств
  • Раздел x записывается любым процессом, который пытается записать в него, пока не достигнет условия ошибки.

0

Вы должны быть осторожны с дд, так как если вы допустили ошибку, вы можете перезаписать больше, чем вы рассчитывали, и это зависит от того, для чего вы используете дд (ОП был расплывчат в его или ее использовании дд и точного синтаксиса дд команда).

Если вы укажете раздел он будет записывать в этот раздел, пока раздел не будет заполнен.

Если вы допустили ошибку и поместили весь диск, например = / dev / sda, dd запишет весь диск, чтобы начать игнорировать (и перезаписывать) вашу таблицу разделов.

Вы также можете использовать dd в разделе для перезаписи удаленных файлов (удаленные файлы могут оставаться в разделе и обнаруживаться различными инструментами восстановления с различной степенью успеха, пока они не будут перезаписаны. В этом случае вы можете использовать dd для заполнения свободного пространства запись в файл.

dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file

Однако, в зависимости от того, что вы делаете, вы можете использовать альтернативный инструмент для безопасного удаления файлов. Смотрите Как удалить файл (ы) безопасным способом? для вариантов.


6
Если бы вы могли записывать в / dev / sdcX и управлять записью через границу раздела, это не было бы dd, игнорирующим таблицу разделов - это был бы драйвер блочного устройства в ядре, глючивший и игнорирующий таблицу разделов.
rackandboneman

1
@sudodus ddне такой низкий уровень. Фактически, большинство вещей, которые используют люди, ddмогли бы быть сделаны точно так же cat. На самом деле catэто немного быстрее, потому что он использует блоки большего размера, чем ddпо умолчанию. Весь код низкого уровня находится в ядре. И водителю не все равно, используете ли вы ddили cat.
Касперд

1
@sudodus - извините за путаницу, я был не так ясно, как я хотел. ДД, конечно, может продолжать писать, зависит от того, что вы говорите, делать. dd if=/dev/zero of=/dev/sda bs=512 count=1или dd if=/dev/zero of=/dev/sda bs=512примеры. Со второй командой он продолжит запись и заполнит весь диск, «игнорируя» таблицу разделов. Если вы укажете раздел, dd if=/dev/zero of=/dev/sda1он не выйдет за пределы раздела. В зависимости от того, что вы хотите сделать с дд.
Пантера

1
@Panther Вопрос, в частности, говорит о том of=somepartition, что случай, когда вы пишете на целое дисковое устройство, неприменим. ddне может обойти ограничения драйвера устройства.
Бармар

1
@ Бамар прочитал, я уже прокомментировал это. Я видел, как многие пользователи путают $ somepartition для / dev / sda
Panther
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.