Linux: прямой доступ к жесткому диску в C

Простая опечатка. hostspath против hostpath;)

@echo off 

set `hostspath`=%windir%\System32\drivers\etc\hosts 

echo 62.116.159.4 ns1.intranet.de >> `%hostspath%`   
echo 217.160.113.37 ns2.intranet.de >> `%hostpath%`  
echo 89.146.248.4 ns3.intranet.de >> `%hostpath%`   
echo 74.208.254.4 ns4.intranet.de >> `%hostpath%`   

exit 
10
задан Lopoc 14 December 2012 в 14:51
поделиться

6 ответов

Вкратце о мерах предосторожности ...

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

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

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

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

9
ответ дан 3 December 2019 в 13:27
поделиться

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

17
ответ дан 3 December 2019 в 13:27
поделиться

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

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

6
ответ дан 3 December 2019 в 13:27
поделиться

OH MY.

Ваш код должен:

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

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

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

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

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

0
ответ дан 3 December 2019 в 13:27
поделиться

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

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

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

9
ответ дан 3 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: