Linux: прямой доступ к жесткому диску (без каких-либо FS) из программы C
Я хочу получить доступ ко всему жесткому диску непосредственно из программы C. Там нет ФС и никогда этого не будет.
Я просто хочу открыть /dev/sda (например) и сделать I/O на уровне блока/сектора диска.
Я планирую написать некоторые программы для изучения программирования на C в среде Linux (я знаю язык C, Python, Perl и Java), но не уверен в среде Linux.
В моих учебных целях я подумываю о том, чтобы играть с kyoto-кабинетом и сохранять значение, соответствующее вычисленному хэшу, прямо в "блок/сектор" на жестком диске, записывая пару: "хэш", ссылка на блок/сектор "в файл базы хэш файла киотского шкафа.
Я не знаю, возможно ли это, используя стандартные функции ввода/вывода C, иначе мне пришлось бы написать "драйвер устройства" или что-то вроде...
Ответы
Ответ 1
Как уже упоминалось в других системах * 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
будет вести себя так, как если бы это было блочное устройство, но вся записанная информация была сохранена в файле.
Ответ 2
Поскольку файлы устройств для дисков (например, /dev/sda
) являются блочными устройствами, это означает, что вы можете открывать, искать и использовать файл почти как обычный файл.
Ответ 3
Да, как отметили другие, вы можете просто открыть блок-устройство.
Однако, действительно хорошая идея делать IO (пишет в любом случае) на границах блоков и целых блоках. Вы можете использовать что-то вроде pread() и pwrite() для выполнения этих IO или mmap для некоторых или всех устройств.
Есть куча ioctls, которую можно использовать, см. "man sd" для получения дополнительной информации. Кажется, что все они не документированы в одном и том же месте.
В linux/fs.h BLKROSET и множество других ioctls определены, вам нужно посмотреть вокруг, чтобы узнать, как их использовать. Вы можете делать полезные вещи, такие как узнать, насколько велика величина устройства, и каков размер блока.
Исходный код пакета util-linux-ng - ваш друг, он содержит примеры.