Да, как уже отмечали другие, вы можете просто открыть блочное устройство.
Тем не менее, это действительно хорошая идея сделать IO (запись в любом случае) на границах блоков и целых блоках. Вы можете использовать что-то вроде pread () и pwrite () для выполнения этих операций ввода-вывода или mmap для некоторых или всех устройств.
Существует множество ioctl, которые можно использовать, смотрите "man sd" для получения дополнительной информации. Кажется, что они не все документированы в одном и том же месте.
В linux / fs.h определены BLKROSET и куча других ioctl, вам нужно посмотреть вокруг, чтобы узнать, как их использовать. Вы можете сделать полезные вещи, такие как узнать, насколько велико устройство, и каков размер блока.
Исходный код пакета util-linux-ng - ваш друг, он содержит примеры.