Проблема с чтением блочного устройства напрямую заключается в том, что нет гарантии, что блоки любого данного файла являются смежными. Это означает, что даже если вы найдете ваши магические маркеры байтов 0xFFD8 в блоке 13, скажем, нет гарантии, что блок 14 принадлежит одному и тому же файлу, независимо от того, содержит ли он маркер конца 0xFFD9 или нет. (Большинство файлов начинается с границы блока; конец файла может находиться где угодно, возможно, даже за границами блока.)
Какой лучший способ справиться с этим? Ну, это зависит от того, что вы ищете - но если вы смотрите только на выделенные в данный момент блоки, то просканируйте файловую систему, используя Python-аналог функции POSIX C ftw (nftw), и прочитайте каждый файл по очереди. Это не найдет доказательств удаленных файлов JPEG в бесплатном списке - если это то, что вам нужно, то вам нужно будет делать то, что вы делаете, более или менее, но соотносить эту информацию с тем, что вы найдете в файловой системе. собственно. Отображение этих блоков будет (в лучшем случае) трудным.