web-dev-qa-db-ja.com

USBの物理セクターサイズを見つける/ SOLID STATE DRIVE fdisk&stat

現在、FLASHベースのデバイスのセクターサイズを見つけるための防弾方法を見つけようとしています(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;

しかし、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

他に信頼できる方法はありますか?

3
softyengin

最近のほとんどのディスクは Advanced Format を使用しています。

Advanced Formatディスクは、4,096バイトの各物理セクターを8つの512バイトの論理セクターに変換します。ファームウェア、オペレーティングシステム、およびすべてのディスクユーティリティからは、基になる物理セクターサイズが4,096バイトであっても、ディスクには512バイトのセクターがあるように見えます。

最新のLinuxバージョンのFdiskは、物理セクターサイズではなく、論理セクターサイズを報告するようになりました。これが、不整合の理由です。

0
harrymc

stat()は、基盤となるデバイスではなく、ファイルシステムの優先ブロックサイズを報告しています。

ほとんどのUSB大容量記憶装置(特にフラッシュドライブなどの安価なデバイス)は、互換性の理由から512バイトのセクターを報告します。基盤となるフラッシュメモリの実際のブロックサイズははるかに大きい可能性がありますが、デバイスによって公開されていないため、ソフトウェアからそれを検出する方法はありません。

1