Може 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-матриці в Lubuntu 16.04 LTS, тому знаю, що він працює так.)

Виняток для розширеного розділу

Існує виняток для розширеного розділу (який є контейнером для логічних розділів, щоб мати більше чотирьох розділів у таблиці розділів MSDOS). Це описано в наступному посиланні,

Чи можу я зробити зображення "розширеного" розділу за допомогою dd?

Але є й інша проблема. Я перевірив вашу команду в тестовому середовищі, і dd прочитав лише один кібібайт (1024 байти), коли хотів, щоб він створив зображення розширеного розділу.

Я перевірив це також зараз на USB-матриці в Lubuntu 16.04 LTS, і це стосується написання (а також читання). Перезаписується лише перший кібібайт.

Отже, підсумовуючи, перезапис первинних розділів та логічних розділів працює відповідно до основного опису цієї відповіді. Але не використовуйте цей метод для перезапису розширеного розділу, оскільки буде замінено лише перший кібібайт. Логічні розділи розширеного розділу більше не будуть знаходитись через таблицю розділів, але дані, що зберігаються в них, все ще є.


Я вже прийняв, але якщо це так, це має бути правильною відповіддю.
LogicBreaker

3
@LogicBreaker, можливо, ви можете перемістити акцепт. Але це не важливо. Важливіше, щоб ви розуміли, як користуватися ddі що це ризиковано, так що ви дуже обережні при його використанні. Удачі :-) Загалом, у вас завжди має бути резервна копія всіх файлів, яку ви не можете дозволити собі втратити.
sudodus

1
Коли ви пишете на голі розділи, у вас немає багато альтернатив. Я рушив, інакше це буде вводити в оману інших.
LogicBreaker

1
Ось чому користувачі зазвичай не можуть отримати доступ до файлів / dev / * ".
Thorbjørn Ravn Andersen

1
Якщо це єдина копія ваших сімейних фотографій без резервної копії, ви можете втратити їх у будь-який момент через крадіжку, пожежу, аварію чи просту
технічну

4

Записи на пристрій розділів не записуватимуть за межами цього розділу, з dd або чим-небудь іншим. Для будь-якого ефекту поза одним розділом вам потрібно буде використовувати пристрій з великим доступом.

(Caveat: якщо на вашому диску немає таблиці розділів із перекриттями розділів, що ніколи не повинно відбуватися.)


3
Ще одне застереження: якщо ви використовуєте щось на зразок LVM, запис у фізичний об'єм може, звичайно, вплинути на багато логічних обсягів.
Maxpm

4

Я думаю, що ваше запитання базується на принциповому непорозумінні щодо того, як dd(і насправді Unix-подібні операційні системи взагалі працюють):

ddне може перезаписати сусідні розділи, просто тому, що ddне можна перезаписати розділи, періодично .

ddпросто записує у файли . Це воно.

Тепер, якщо ви передати ddфайл , який представляє кілька розділів, то ddбуде перезаписувати цей файл . Але в цьому випадку це не ddнаписання минулого кінця розділу. ddзаписуватиметься до кінця файлу і лише до кінця файлу.

Але, якщо ви передасте ddфайл, який представляє лише один розділ, він ddне запише минулого кінця цього розділу. Знову ж таки, це не має нічого спільного dd. ddпросто записує у файл, до якого ви скажете його написати. Те, що цей файл являє собою єдиний розділ, (у цьому випадку) забезпечується драйвером блокового пристрою в ядрі. ddне має нічого спільного з цим.

Отже, коротше: ddзаписує у файли. Те, що представляють ці файли, не викликає жодних ddпроблем. ddнічого не знає про перегородки.


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

1
Правильно. Ви не можете використовувати ddдля запису в необроблені розділи. Можна писати лише у файли. Звичайно, ви можете записати у файл блокового пристрою, який представляє розділ (наприклад /dev/sda1), але ви не можете записати на необроблений розділ. А оскільки ви можете записувати лише у файл, який представляє розділ, ви не можете записати минулий кінець розділу, оскільки файл представляє лише розділ, а не розділ і трохи минулий кінець.
Йорг W Міттаг

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

1

Існує небезпечний, але рідкісний спеціальний сценарій, за якого це може статися навіть із драйверами блокових пристроїв, що не мають помилок:

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

0

Ви повинні бути обережними з dd, як якщо ви помилитесь, ви можете перезаписати більше, ніж ви торгувались, і це залежить від того, для чого ви використовуєте dd (ОП було розпливчастим у його використанні dd та точному синтаксисі dd команда).

Якщо ви вкажете розділ, він запише до цього розділу, поки розділ не буде заповнений.

Якщо ви помилитесь і помістите весь диск, наприклад = / dev / sda, 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 і встигнути записати через межу розділу, не буде ігнорувати таблицю розділів - це буде драйвер блокового пристрою в ядрі, який баггі і ігнорує таблицю розділів.
rackandboneman

1
@sudodus dd- це не такий низький рівень. Насправді більшість речей, якими користуються люди, ddможна було б зробити те саме cat. Насправді catце трохи швидше, оскільки він використовує більші блоки, ніж ddза замовчуванням. Весь код низького рівня знаходиться в ядрі. І водію не дуже важливо, чи ви користуєтесь, ddабо cat.
kasperd

1
@sudodus - вибачте за плутанину, мені було не так зрозуміло, як я мав намір. dd, звичайно, може продовжувати писати, залежить від того, що ви скажете робити. 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він не вийде за межі розділу. Сортування залежить від того, що ви хочете зробити з dd.
Пантера

1
@Panther Питання конкретно говорить of=somepartition, тому випадок, коли ви пишете на весь дисковий пристрій, не застосовується. ddне може обійти обмеження драйвера пристрою.
Бармар

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