我成功地在 ext4 文件系统上定位了一个文件。例如,文件“cyclic.txt”的起始 4k 块是 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 文件系统。)您可以通过多种方式找出正在使用的逻辑块号:
- filefrag -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;如果您想要以 512 字节扇区为单位,则将这些块号乘以 8。
如果您想知道它们相对于设备开头的位置(例如,在本例中为 /dev/nvme0n1),您可以通过以下命令查找:
- 猫/ sys /块/ nvme0n1 / nvme0n1p4 /启动
或者您可以使用 gdisk 命令并打印出分区表。在这两种情况下,这都会以 512 字节扇区为单位为您提供分区“p4”的起始位置。
最后说明:有时人们在谈论 Linux 内核使用的 512 个扇区号时会说 LBA 号,但您需要小心一点。从存储设备的角度来看,LBA 代表逻辑块地址,以存储设备认为是其逻辑块大小的任何单位为单位。对于大多数设备,历史上几乎所有存储设备的逻辑块设备大小都是 512 字节。也有例外,例如 IBM Mainframe DASD,其扇区大小为 2048 字节,但 512 是有效标准。对于现代存储设备,有一些“高级格式 HDD”,例如,它们使用 4k 逻辑块大小,如果您在 CPU 和 HDD 之间连接 SATA 分析器,您将看到以 4k LBA 号为单位发送的 I/O 请求。但是,Linux 内核在块设备层假设所有数字都是以 512 字节扇区为单位的,即使在设备驱动程序级别可能并非如此。我们大多数人的工作台上都不会有 SCSI 或 SATA 总线分析仪,因此除非您正在调试或编写主机总线适配器的设备驱动程序,否则这种区别可能不会太重要。因此,在指代 512 字节扇区时使用术语“LBA”不会造成任何实际危害。这是很常见的做法,如果您只从 Linux 内核及其用户空间实用程序的角度担心事情,那就没有坏处。然而,有些人喜欢对这类事情吹毛求疵,如果你是那种喜欢通过指出人们应该使用 KiB 而不是 KB 来相信自己道德优越的人,现在你知道了另一种令人讨厌的吹毛求疵的方式。:-)