Прямой доступ к жесткому диску без ФС из программы C в Linux

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

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

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

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

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


person Angel C    schedule 19.08.2010    source источник


Ответы (3)


Как упоминалось в другом месте, в системах *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 будет вести себя как блочное устройство, но вся записываемая информация будет храниться в файле.

person Dummy00001    schedule 19.08.2010
comment
Спасибо всем за быстрый ответ. Сначала попробую с петлевыми устройствами. - person Angel C; 19.08.2010

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

person Delan Azabani    schedule 19.08.2010

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

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

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

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

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

person MarkR    schedule 19.08.2010
comment
Большое спасибо @MarkR. Я приму это во внимание, но, поскольку я почти новичок в программировании Linux, может быть, слишком сложно начать с... - person Angel C; 20.08.2010
comment
Программирование для Linux почти точно такое же, как программирование для Windows, так что это не должно быть проблемой... вы ищете API, пишете тестовую программу, чтобы опробовать ее, а затем используете ее в своем приложении. Так же, как Windows. - person MarkR; 20.08.2010