查找 USB/SOLID STATE DRIVE fdisk & stat 的物理扇区大小

sof*_*gin 5 linux ssd hard-drive usb-flash-drive

目前正在尝试找到一种防弹方法来查找基于闪存的设备的扇区大小(使用 USB 拇指驱动器进行测试),但在其他地方没有得到令人信服的答复

使用 stat 给我大小 = 4096 字节

struct stat info;
const char* device = "/dev/sdc";
if (stat(device, &info))
{
    std::cout << "stat() error" << strerror(errno) << "\r\n";
    exit(1);
}

std::cout << "Prefered block size for '" << device << "' is " << info.st_blksize << " byte" << std::endl;
Run Code Online (Sandbox Code Playgroud)

但 fdisk 说 512 字节

Disk /dev/sdc: 3.8 GiB, 4047503360 bytes, 7905280 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Run Code Online (Sandbox Code Playgroud)

还有其他我可以信任的方式吗?

小智 6

stat()正在报告文件系统的首选块大小,而不是底层设备的首选块大小。

出于兼容性原因,大多数 USB 海量存储设备(尤其是便宜的设备,如闪存驱动器)将报告 512 字节扇区。底层闪存的实际块大小可能要大得多,但设备不会公开,因此无法从软件中检测到它。


har*_*ymc 2

大多数现代磁盘都使用 高级格式

高级格式磁盘将每个 4,096 字节物理扇区转换为八个 512 字节逻辑扇区。对于固件、操作系统和所有磁盘实用程序来说,磁盘似乎有 512 字节扇区,即使底层物理扇区大小为 4,096 字节。

最新 Linux 版本中的 Fdisk 现在报告逻辑扇区大小,而不是物理扇区大小,这就是您注意到的不一致的原因。