Я успешно нахожу файл в файловой системе ext4. Например, начальный блок 4k файла "cyclic.txt" - 105441. Но когда он считывает его с карты emmc напрямую, первого блока emmc там нет, а он изменяется на 5168904. Я просто просматриваю всю память emmc, чтобы получить его, но это очень медленно. Как напрямую получить реальное местоположение? Могу ли я просто использовать его для последней операции безопасного стирания? Большое спасибо!!!
решение1
Номера блоков, используемые ext4, которые можно узнать с помощью команды debugfs "stat" или с помощью "filefrag -v", являются логическими номерами блоков размером 4k. То есть, они указаны в единицах по 4k относительно начала раздела.
Если вы используете такую программу, как fdisk или gdisk, она выдаст вам начало раздела в секторах по 512 байт.
Итак, вот пример. Предположим, вы хотите найти местоположение /boot/vmlinuz-4.19.0-2-amd64. (Которое, используя команду "df /boot/vmlinuz-4.19.0-2-amd64", мы находим расположенным на /dev/nvme0n1p4 как файловая система /boot.) Вы можете узнать номера логических блоков, которые используются, несколькими способами:
- файлфрагмент -v /boot/vmlinuz-4.19.0-2-amd64
- debugfs -R "экстенты vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4
- debugfs -R "stat vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4
При использовании любого из этих механизмов мы обнаружим, что файл использует номера блоков 60416-61680.
Чтобы узнать, где они находятся относительно начала /dev/nvme0n1p4, умножьте эти номера блоков на 4096, если вам нужны смещения в байтах, или на 8, если вам нужны блоки по 512 байт в секторах.
Если вы хотите узнать, где они находятся относительно начала устройства (например, /dev/nvme0n1 в данном случае), вы можете узнать это с помощью команды:
- кошка /sys/block/nvme0n1/nvme0n1p4/start
Или вы можете использовать команду gdisk и распечатать таблицу разделов. В обоих случаях это даст вам начальное местоположение раздела "p4" в единицах секторов по 512 байт.
Последнее замечание: Иногда люди говорят о числах LBA, когда говорят о 512 номерах секторов, используемых ядром Linux, но вам нужно быть немного осторожнее. С точки зрения устройства хранения LBA означает Logical Block Addresses и указывается в единицах того, что устройство хранения считает своим логическим размером блока. Для большинства устройств исторически размер логического блока почти всех устройств хранения составлял 512 байт. Были исключения, такие как IBM Mainframe DASD, которые имели размер сектора 2048 байт, но 512 было эффективным стандартом. В современных устройствах хранения есть некоторые "расширенные форматы HDD", например, которые используют размер логического блока 4 КБ, и если вы подключите анализатор SATA между ЦП и жестким диском, вы увидите, что запросы ввода-вывода отправляются в единицах чисел LBA по 4 КБ. Однако ядро Linux предполагает на уровне блочного устройства, что все числа указываются в единицах секторов по 512 байт, хотя это может быть не так на уровне драйвера устройства. У большинства из нас не будет SCSI или SATA-анализаторов шин, висящих на вашем рабочем столе, так что это различие, вероятно, не будет иметь большого значения, если вы не отлаживаете или не пишете драйвер устройства для адаптера шины хоста. Так что нет никакого реального вреда от использования терминологии "LBA" применительно к секторам размером 512 байт. Это очень распространенная практика, и если вы беспокоитесь только о вещах с точки зрения ядра Linux и его утилит пользовательского пространства, то вреда не будет. Однако есть люди, которые любят придираться к таким вещам, и если вы из тех людей, которые любят верить в свое моральное превосходство, указывая, когда люди должны использовать KiB вместо KB, теперь вы знаете еще один способ, которым вы можете быть раздражающими придирами. :-)