Подтвердить что ты не робот

Linux: прямой доступ к жесткому диску (без каких-либо FS) из программы C

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

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

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

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

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

4b9b3361

Ответ 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 - ваш друг, он содержит примеры.