Linux: прямой доступ к жесткому диску в C - PullRequest
10 голосов
/ 10 июня 2009

Как я могу получить необработанный доступ к HD и узнать, используется ли это место или это свободное место? Просто пример, я могу получить прямой доступ, просто открыв и прочитав на диске, цель - узнать, используется ли, например, 10.000 байт или нет.

Ответы [ 7 ]

17 голосов
/ 11 июня 2009

Вы можете просто open заблокировать устройство (например, /dev/sda) и читать сектора вручную. Тем не менее, это не скажет вам, если он пуст или нет напрямую. Быть пустым или нет - это нечто определенное на уровне абстракции файловой системы. Структуры данных файловой системы хранят такие данные, и вы должны глубоко понимать конкретную файловую систему, чтобы сделать это из необработанных блоков (без использования какой-либо функции, предоставляемой файловой системой).

9 голосов
/ 11 июня 2009

Собирать с осторожностью ...

Не забывайте, что вы должны сотрудничать с собственными правилами безопасности потоков существующего драйвера и внутренним кэшированием. Многие потоки в системе могут (и будут) постоянно записывать на диск. Чтобы стереть свободный сектор, вы должны знать, чтобы он был свободным и оставался свободным, пока вы с ним справляетесь. Было бы плохо, если бы вы стерли сектор, который файловая система уже решила использовать, но еще не сбросила доказательства этого решения на диск, чтобы у вас не было возможности узнать, используется ли он. Это может привести к потере данных, что может вызвать возмущение пользователей.

Если вы можете гарантировать, что файловая система в настоящий момент не смонтирована, вы можете, по крайней мере, в принципе открыть /dev/sda (вероятно, , а не нужную вам!) И проанализировать на диске структуры данных, чтобы сделать все, что вам нужно сделать. Так на самом деле реализуются такие утилиты, как fsck и mkfs.

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

Мой совет - использовать саму файловую систему, чтобы получить необходимые гарантии. Откройте большие файлы и заполните их шаблонами стирания. Заполните диск до отказа. Обратите внимание, что если это может серьезно повлиять на любые работающие демоны, которые предполагают, что некоторое дисковое пространство доступно, то, возможно, это все еще нужно сделать в системе с большинством демонов и таких убитых. Если вы стремитесь к безопасному стиранию, вам все равно придется беспокоиться о фактической записи записанных блоков на диск между проходами, потому что все в обычной файловой системе попытается оптимизировать несколько записей одного блока.

9 голосов
/ 11 июня 2009

Скорее всего, вы не хотите получать доступ к блочному устройству через / dev / sd * или / dev / hd * напрямую. Как уже говорили другие, вам нужно будет понять исходную файловую систему, и это будет очень сложно.

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

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

6 голосов
/ 11 июня 2009

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

Существует утилита zerofree для обнуления свободных блоков в файловых системах ext, предназначенная для образов виртуальных машин. Помните, что это не то, что вы должны делать со смонтированной файловой системой. На этой странице также есть несколько старых патчей для ядра, которые могут оказаться интересной отправной точкой для этого на живых файловых системах.

5 голосов
/ 11 июня 2009

ОН МОЙ.

Ваш код должен будет:

  1. Пройдите по таблице разделов, чтобы увидеть, в какой раздел она попадает.
  2. Определите, что это за файловая система.
  3. Для каждой поддерживаемой вами файловой системы предоставьте такую ​​подпрограмму, чтобы увидеть, используется ли этот байт
  4. Проверьте, смонтирована ли файловая система
  5. Если это так, просмотрите записи ядра, чтобы узнать, есть ли что-то, что еще не записано на диск.
  6. О, и если вы используете EXT4 или REISER, вы не можете знать ответ на предыдущий вопрос, так что вы можете сдаться.

На вашем месте я бы пересмотрел то, что вы пытаетесь сделать.

РЕДАКТИРОВАТЬ: видя его комментарий о том, что он на самом деле пытается сделать,

  • Принять раздел, а не сырой диск
  • Требуется демонтировано
  • Позвоните в e3fsck, чтобы свернуть журнал
  • Обходить каждый индекс, находить последний блок и стирать все свободное место в этом блоке (размер файла должен указывать, где заканчиваются данные в блоке)
  • Пройдите по растровым изображениям выделения, найдите все нераспределенные блоки и сотрите их
  • Теперь самое сложное, протрите дневник.
  • Удачи
  • Да, и ПРОЧИТАЙТЕ ДОКУМЕНТАЦИЮ ФИЛЬСИСТЕМЫ
2 голосов
/ 25 марта 2012

Очень зависит от множества факторов, таких как

  • тип файловой системы
  • тип операционной системы
  • средний тип

Решения:

0 голосов
/ 11 июня 2009

Возможно, вы сможете использовать те же функции, что и файловая система и / или дисковые инструменты, чтобы проверить, свободна ли папка или нет.

...