isoを書き込んだUSBメモリのリセット

ウインドウズのインストーラーをUSBで作ったり、balena Etcher等、.isoイメージをUSBメモリに展開すると、USBディスク内のパーテーションができてしまい、フォーマットをしても本来の容量分使えなくなってしまうことがあります。

その状態をリセットして、元の容量分使えるようにする戻す方法を紹介します。

注意点としては、ディスク内に入っているデータはすべて消えてしまいます。また、この後の操作では、ディスクを指定を間違えると致命的なデータ損傷にもなりえます。くれぐれも慎重にかつ自己責任でお願いします。

Windowsでのリセット

WindowsでUSBメモリを復旧させるには管理者権限のあるPowerShellかコマンドプロンプトから diskpart コマンドを実行します。

DISKPART専用のプロンプト(ウインドウ)がで出るので、そこから操作します。

ウインドウに、DISKPART>と表示されている事を確認してください。ユーザー権限でも実行できますが、その場合ディスク操作はできないので注意が必要です。

  1. list diskと打ち込んでディスク一覧を出します。
  2. サイズで判断してディスクの番号を確認し、select disk で選択します。
  3. 再度 list diskを実行し、選択したものが間違えていないか確認します。
  4. clean コマンドで消去を実行します。
  5. create partition primary でパーテーションを作成します。
  6. exit コマンドで DISKPARTを終了します。
  7. USBメモリを一度抜き差しして、Windowsの機能でフォーマットします。
  8. ;ディスクの一覧を表示させます
    DISKPART> list disk
    
    ディスク      状態           サイズ
    ------------  -------------  -------
    ディスク 0    オンライン      465 GB
    ディスク 1    オンライン     7728 MB
    
    ; サイズで判断してディスクを選択します
    ; 選択間違えると致命的な事になるので注意が必要です
    DISKPART> select disk 1
    
    ; 選択したディスクに*がつきます
    ; 必ず確認しましょう
    DISKPART> list disk
    
    ディスク      状態           サイズ
    ------------  -------------  -------
     ディスク 0    オンライン      465 GB
    * ディスク 1    オンライン     7728 MB
    
    ; 選択中のディスクのパーテーションを初期化
    DISKPART> clean
    
    DiskPart はディスクを正常にクリーンな状態にしました。
    
    ; パーテーションを再作成
    DISKPART> create partition primary
    
    DiskPart は指定したパーティションの作成に成功しました。
    
    ; 終了
    DISKPART> exit
    

    このあとUSBメモリをフォーマットすると元通りに使えます。

    フォーマットの形式(参考)

    Windowsのエクスプローラー等からフォーマットを選択するとでてくるUIでは「ファイルシステム」と「アロケーションユニットサイズ」が選択できるようになっています。前者は[規定]、後者は[標準]でいいのですがこれらの値についてもう少し掘り下げてみます。

    まずファイルシステムは、FAT(FAT32)、exFAT、NTFSとあります。FATはWindowsに限らない広い互換性をもつファイルシステムです。FATでは保存できるファイルの最大値が4Gという制限があります。クラスタ数(ディスクの容量÷アロケーションユニットサイズ)の上限にも気をつける必要があります。

    それらの制限を改善したのがexFATです。exFATでは現在のところ、ファイルやクラスタのサイズを気にする必要はありません。

    もともとFATはFile Allocation Tableの略で、32はアロケーションテーブルのビット数です。古くからPCに触れている人はFAT16だったりFAT12という表記を見たことがあるかもしれません。これらもすべてビット数を表しています。ただ、32bitでいえばこの中の有効幅は28bitで、この28bitで表すことのできる範囲がクラスタサイズの上限となります。ちなみに残りの4ビットは予約域で使われていないようです。

    NTFSはいったん保留にしておき、先にアロケーションユニットサイズの説明に移ります。

    アロケーションユニットはファイルシステム上の最小の割り当て単位です。この下位の概念にディスク書き込み時の最小単位を示すセクタがあります。

    たとえばアロケーションユニットが16KBの場合は、512バイトのセクタが32個集まって構成されていることになります。

    アロケーションユニットはクラスタともいわれるファイルシステムの最小単位ですので、サイズが大きい方がアドレスの指定回数が減り省力化できますが、小さいファイルが多いとディスクの無駄が多くなります。

    本来はアロケーションユニットサイズは自身で調整のできるものですが、FATだと32KB、exFATだと128KBあたりが標準となっています。またFAT、exFATの仕様で選択できる値が定められています。

    特に古い世代の機器と互換性を持たせたいならFAT32の32KBにするのが最適です。

    今度は一旦保留にしたNTFSの話をします。これはNew Technology File Systemの略で、Microsoftが設計したファイルシステムです。連続した空き領域を確保するというロジックがありフラグメントがおきづらくなっていますが、その分クラスタを管理するテーブルも複雑になります。NTFSでは、MFT(Master File Table)にそれらを保存します。

    NTFSでもアロケーションユニットサイズを指定できますが、4096バイト(4KB)が標準で、これにしておくのがいいです。ファイルシステム全体で最適化されているのでこの値を調整することはあまり意味を持ちません。

    NTFSはジャーナリングを行うので停電や急な抜き差しには強いですが、互換性はFATに比べて低いです。USBメモリとしての用途なら、特に意図がなければexFAT、古いものと互換したければFAT、読み書きが多くなるOSの起動ディスクにしたり、大容量ディスクを固定的に使うならNTFSにしておくのがいいと思います。

    Linux機での復旧

    Linuxでの復旧は、筆者が利用しているDebian12を例に紹介しします。すべて管理者権限で行います。

    標準ではFATやextFATのフォーマットができないので、ツールをインストールします。

    現在フォーマットができるか不明な場合は、管理者権限で mkfs. と入力したあと入力補完の TABキーを押せば一覧が出てきますので、それに載っていないならツールが必要です。FAT32は mkfs.fat 、exFATは mkfs.exfatが表示されれば利用可能です。

    FAT32だったら dosfstools、exFATだったら exfatprogsパッケージを使います。

    ここでは両方設定してみますので、どちらもインストールしてしまいますが、実際には必要な方だけでいいです。

    #apt update
    ...
    # apt install dosfstools exfatprogs

    次にUSBメモリを差し込んで、対象のブロックデバイスを探します。dmesgを実行すると直近に認識したブロックデバイス名が出てきますのでそれを参考にします。

    # dmesg
    ...
    [11304476.147908] sd 6:0:0:0: [sdc] 15633408 512-byte logical blocks: (8.00 GB/7.45 GiB)
    ...
    

    ここからfdiskでパーテーションを操作します。fdiskでは、パーテーションテーブルをMBRかGPTか選べますが、多くはMBR構成だと思います。2Tを超えるディスクの場合はGPTです。

    1. fdiskで ブロックデバイス名を指定します。(間違いが致命的になりますので注意)
    2. d(削除)で既存のすべてのパーテーションを削除します。
    3. 削除が終わったらoで、MBRを指定します。GPTにしたい場合はgとします。
    4. nでパーテーションをつくります。

      パーテーションタイプはp(primary)を選択します。デフォルト値でENTERをおせば最初から最後までのひとつのパーテーションとなります。

    5. 中身のタイプの指定

      t を打ち込んで領域の中身を指定します。同じ呼び方で紛らわしいですが、こちらもパーテーションタイプと呼ぶようです。このパーテーションタイプは、MBRの時とGPTの時と値が違います。

      MBRの場合は、FAT32はCHSである[0b]とLBAである[0c]がありますが、現在の環境ではでは[0c]にしておけば間違いないと思います。

      WindowsのOSディスクの先頭に存在するESP(GPT+FAT32)の場合は[ef](EFI)となります。

      exFATやNTFSの場合は[07]となります。

      GPTの場合は、ESPの時が[1](EFI)、他は[11](Microsoft Basic Data)となります。GPT時は厳密に区分分けをしないようです。

    6. wで書き込みを行います。

      書き込みを行うと前の状態には戻せなくなります。

    # fdisk /dev/sdc
    Comamnd: d
    ...
    Command: o
    ...
    Command: n
    Partition type
    Select (default p): p
    ...
    Command: t
    Selected partition 1
    Hex code or alias (type L to list all): 07
    ...
    Command: w

    次のメッセージがでることがあります。isoをUSBメモリに展開した都合で設定されている署名を消してもいいかとの事なので今回の場合は問題ありません。

    The device contains 'iso9660' signature and it will be removed by a write command. See fdisk(8) man page and --wipe option for more details.

    最後にフォーマットをします。FAT32の時は、mkfs.fat(またはmkfs.vfat) -F 32 /dev/sdc1 とします。

    ここでもブロックデバイスを間違えると致命的な損傷になりますので注意してください。パーテーション番号はここではひとつしか作りませんでしたので常に1となると思います。

    アロケーションユニットサイズを指定したい場合は -s を使ってセクタ数で指定します。Sが大文字だと別オプションになるので注意が必要です。USBやSSDのセクタサイズは物理サイズに関係なく512バイトとみなすと思いますので、単純にここで指定サイズの半分KBという計算式で算出すれば良いと思います。

    # mkfs.fat -F 32 -s 64 /dev/sdc1

    exfatを生成する時アロケーションユニットサイズは -cオプションで指定します。cはクラスタの略なので、サイズはそのまま指定できます。KとMのサフィックスが使えます。

    # mkfs.exfat -c 128K /dev/sdc1

    フォーマット後Windows機に差し込んで、認識できれば成功です。フォーマットされていません、という表記になった場合は何か指定し忘れの可能性がありますが、パーテーションの削除と作り直しだけちゃんとしてあれば、あとはWindowsからのフォーマットで処理が可能です。

人気の投稿