web-dev-qa-db-ja.com

FAT32を含むパーティションの `file`コマンドの出力にある「隠しセクター」とは何ですか?

GPartedを使用して外付けUSBハードドライブを2つのパーティションに分割しました。どちらもFAT32としてフォーマットされたプライマリパーティションであり、同じサイズ(500 GB)です。これはfile -sの出力です。

/dev/sdb1: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 64, reserved sectors 64, Media descriptor 0xf8, sectors/track 63, heads 255, hidden sectors 2048, sectors 976760832 (volumes > 32 MB), FAT (32 bit), sectors/FAT 119232, reserved 0x3, serial number 0x99034dfb, label: "Toshiba1   "

/dev/sdb2: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 64, reserved sectors 64, Media descriptor 0xf8, sectors/track 63, heads 255, hidden sectors 976762880, sectors 976760832 (volumes > 32 MB), FAT (32 bit), sectors/FAT 119232, reserved 0x1, serial number 0x96cbe274, label: "Toshiba2   "

/dev/sdb2で、hidden sectorsとは何ですか?なぜそれがsectorsよりも大きいのですか?違いは2048で、これはたまたまhidden sectors/dev/sdb1の値です。これは偶然ですか? GPartedまたはfileコマンドのエラー?さらに重要なのは、それが心配なことですか?

2
rs028

tl; dr

心配することはありません。


ウィキペディアの記事 FATファイルシステムの設計 「隠しセクター」について数回言及しており、関連するメタデータエントリの一般的な説明は次のとおりです。

このFATボリュームを含むパーティションの前にある非表示セクターの数。パーティション化されていないメディアでは、このフィールドは常にゼロである必要があります。

(いくつかの癖があります)。この説明は、特定のケースで観察する値に適合しているようです。


Linuxツールがデフォルトでこの値を使用することはないと思います。あなたの場合、それぞれの値2048976762880/dev/sdbのコンテキストで有効ですが、それぞれ/dev/sdb1/dev/sdb2を考慮すると、これらのデバイスは無効です。パーティション化されているため、コンテキストでは「非表示セクター」は0である必要があります。

mount /dev/sdb1 /some/mountpointのようにマウントするのが一般的ですが、パーティションが512バイトの2048セクターのオフセットで始まる場合は、次のコマンドでも同じことができます。

mount -o offset=$((2048*512)) /dev/sdb /some/mountpoint

したがって、Linuxに関する限り、どのコンテキストが「正しい」コンテキストであるかを明確に示すことはできません。 「隠しセクター」の値が重要ではないというもう1つのヒントは、パーティションテーブルに属する情報がファイルシステムのメタデータ構造に埋め込まれているという事実です。最近では、このような抽象化レイヤーを混在させない傾向があります。 2つの情報を「非同期化」するのは比較的簡単です。また、OSは最初にファイルシステムを見つけるためにパーティションテーブルを読み取る必要があるため、オフセットに関する冗長な情報は、オフセットをすでに知っている場合にのみ利用できますが、ほとんど役に立ちません。

別の冗長な情報があることに注意してください。パーティションテーブルには、パーティション内の実際のファイルシステムに対応する必要がある パーティションID (MBR)または パーティションタイプGUID (GPT)が含まれますが、そうでない場合もあります。 。ただし、この情報が一貫している場合は、パーティションテーブルだけを調べることで、何を期待するか(どのOS、可能なマルチブート、スワップパーティション)を知ることができるため、非常に役立ちます。実際には、これは人間にとっても機械にとっても役立つ場合があります。特にUEFIは、どのパーティションが EFIシステムパーティション であるかを知る必要があります。ただし、Linuxにmount /dev/sdb1 …を指示すると、/dev/sdbを調べるのではなく、実際のファイルシステムを検出しようとし、パーティションテーブルを読み取り、パーティションID/GUIDを使用します。

「隠されたセクター」の背後にある論理的根拠が何であったかはわかりません。それにもかかわらず、何らかの形でこの値に依存するデバイスがいくつかあったようです。比較 man 8 mkfs.fat

-h number-of-hidden-sectors
ボリューム内の非表示セクターの数を選択します。どうやらいくつかのデジタルカメラは、そのような隠されたセクターのないCFカードを与えると消化不良になりますが、このオプションを使用すると、それらを満足させることができます。コマンドラインに値が指定されていない場合は、0を想定します。

GPartedは先に進んで、「一部のデジタルカメラ」などでも満足させようとしたようです。つまり、これは良いことです。別のツールでやり直す必要はまったくありません。

1