Прямой доступ к жесткому диску без FS из программы на C в Linux - PullRequest
23 голосов
/ 19 августа 2010

Я хочу получить доступ ко всему жесткому диску напрямую из программы на Си.Там нет ФС и никогда не будет.

Я просто хочу открыть / dev / sda (например) и выполнить ввод / вывод на уровне блоков / секторов диска.

Я планирую написать несколько программ для изучения программирования на C в среде Linux (я знаю язык C, Python, Perl и Java), но не уверен в среде Linux.

Для моегоВ целях обучения я думаю поиграть с kyoto-cabinet и сохранить значение, соответствующее вычисленному хешу, непосредственно в «блок / сектор» жесткого диска, записав пару: «хэш, ссылка на блок / сектор» в kyoto-Файл базы данных хеш-памяти.

Я не знаю, возможно ли это с использованием стандартных функций CI / O, иначе мне пришлось бы написать «драйвер устройства» или что-то вроде ...

Ответы [ 3 ]

24 голосов
/ 19 августа 2010

Как уже упоминалось, в * NIX-системах блочные устройства, такие как /dev/sda, могут быть доступны в виде простых файлов. Обратите внимание, что если файловая система смонтирована с устройства, открыть ее как файл для записи не удастся.

Если вы хотите поиграть с блочными устройствами, я бы посоветовал сначала использовать loop device, который представляет простой файл как блочное устройство. Например:

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K
losetup /dev/loop0 $PWD/loop_file_10MB

После этого /dev/loop0 будет вести себя так, как если бы это было блочное устройство, но вся записанная информация будет храниться в файле.

9 голосов
/ 19 августа 2010

Поскольку файлы устройств для накопителей (например, /dev/sda) являются блочными устройствами, это означает, что вы можете открывать, искать и использовать файл почти как обычный файл.

6 голосов
/ 19 августа 2010

Да, как уже отмечали другие, вы можете просто открыть блочное устройство.

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

Существует множество ioctl, которые можно использовать, смотрите "man sd" для получения дополнительной информации. Кажется, что они не все документированы в одном и том же месте.

В linux / fs.h определены BLKROSET и куча других ioctl, вам нужно посмотреть вокруг, чтобы узнать, как их использовать. Вы можете сделать полезные вещи, такие как узнать, насколько велико устройство, и каков размер блока.

Исходный код пакета util-linux-ng - ваш друг, он содержит примеры.

...