専用ソフト無しでSSDのクローン作製とパーティション拡張

 OS等のシステムを含んだHDDやSSDの換装時に、使用中のDISKから新たなDISKへと全データをコピーする、いわゆるDISKクローニング用のソフトは一昔前までは無料のものがいくつかありました。しかし現在では無料のものは無くなってしまったようです。いくつかのSSD/HDDメーカーでは自社製品で使えるクローニング用ソフトが提供されているようですが、そうではないメーカーの製品の場合は自力でどうにかするしかありません。

 ところで、円安傾向が戻り切っていないにもかかわらず、2022年末辺りからSSDの市場価格が大きく下がっています。

 そこで、現在使用中のノートPCの約500GBのSSDの空き容量が逼迫していることもあり、換装用に1TBの製品を購入しました。ノートPC自体を新調したいという思いもあるので、特に換装用SSDの製造元にはこだわらず単に価格だけで選定しましたが、クローニング用ソフト(のライセンス)は付属していないため、自力でどうにかした手法を記載します。

警告
コマンドを間違えるとシステムやデータがいとも簡単に破壊されます。意味を理解せず(お使いの環境に適したパラメータに変更せず)、記載のコマンドをそのままコピペして実行した場合も破壊される可能性があります。如何なる損害が生じても著者は一切責任を負いません。

 


前提

BIOS/MBR ベースのハード ドライブ パーティション | Microsoft Learn

  • Bitlockerなどのストレージ暗号化機能は未使用
  • 良く知らない開発元のソフトウェアは使用しない*2
    • Linuxで一般的なddコマンドと、Windows標準機能のみを使用

 

作業方針

 基本的には以下の考え方で作業を実施しました。

  1. 移行元SSDの内容をそのまま移行先SSDに複製
  2. 移行先SSDパーティションを拡張(複製しただけでは移行先SSDの記憶容量が移行元SSDと同じ容量までしか使用できない)
    1. いわゆるCドライブとして認識されるのは2つ目に存在するWindowsパーティションだが、これを拡張するには後ろに存在する(3つ目に存在する)Recovery用パーティション(回復パーティション)が邪魔なため、Recovery用パーティションを一時的に削除
    2. WindowsパーティションSSD容量一杯まで拡張し、作り直すRecovery用パーティションの分だけ縮小
  3. Recovery用パーティションを再作成

 

作業内容

SSD複製

 移行先SSDをUSB接続の適当な外付け用ケース経由でPCに接続し、適当なUSBフラッシュメモリからLinuxを起動します。今回はUbuntu20.04のインストール用イメージ*3を使用しました。
 UbuntuGUIからターミナルを起動し、lsblkコマンドで移行元/移行先のデバイスを特定します。

$ lsblk
lsblk実行例

 今回は移行元SSDがsda、移行先SSDがsdc、Ubuntuを起動したUSBフラッシュメモリがsdbとして認識されていることが解ります。sdaは容量とパーティションが3つ存在すること、sdcは容量とパーティションが存在しないことからそれと特定できます。容量とパーティションの数だけでは特定できないような似たような構成のDISKが複数繋がっているPCの場合、パーティションを実際にマウントしてみて、移行元SSDに格納されているいつものCドライブのファイルが存在するか確認してみても良いでしょう。どのdiskがどんな名前で認識されるかは環境によって異なりますので、意味を理解せずに後続のコマンドをコピペするとシステムを破壊する可能性があります。
 後は普通にddコマンドでデバイス全体を複製します。入力元(if)/出力先(of)の指定は間違えると二度と復旧できなくなりますので注意してください。前述の通り、環境によって何がsd*なのかは異なりますので、意味を理解せずにコピペするとシステムを破壊する可能性があります。今回はブロックサイズに1Mを指定していますが、値の根拠としてはNANDフラッシュメモリの多くは16KB/pageで64page/blockらしいので、16KB*64=1Mとなります。定番の64Kなど異なる値でも構いませんが、複製の所要時間に影響します。

$ sudo dd if=/dev/sda of=/dev/sdc bs=1M status=progress
dd実行例

 今回は480GBの複製で40分程度で完了しましたので、平均約190MB/sと低パフォーマンスです。
 蛇足ながら、開始直後から総容量の前半3/4程度は380MB/s前後出ていたのですが、最後の方になるに連れパフォーマンスが顕著に低下していました。移行元SSDは空き容量の最後の数GB程度を書込み/消去を繰り返して使用していたので、LBAの後半に位置するNANDの劣化が進んでいた*4 *5のか、単に長時間連続で書き込みを続けたために発熱等でパフォーマンスが劣化したのかは判りません。

 閑話休題、移行元SSDはもう不要なのでシャットダウンした後にマザーボードから取り外し、移行先SSDに入れ替えます。
 Linuxブート用のUSBフラッシュメモリももう不要で、ここまでの作業に問題が無ければ移行先SSDから移行元SSDと同じ環境のWindowsが起動するはずです。
 

移行先SSDパーティションの拡張

 以降の作業は、以下の投稿にまとまっており、参考にさせていただきました。
Windows10のCドライブを拡張するために回復パーティションを再作成する - 雑木林

 前提知識として、ReAgentc.exeコマンドを使用すると、Recovery用パーティション(回復パーティション)のWindows回復環境 (Windows RE)の操作が可能です。
REAgentC のコマンド ライン オプション | Microsoft Learn
 また、diskpartコマンドを使用するとパーティションの操作が可能です(fdiskのようなツールです)。
diskpart | Microsoft Learn

 以降のコマンドは管理者権限で起動したコマンドプロンプトから実行します。
 

WindowsREの無効化

 Recovery用パーティション(回復パーティション)に存在する実体はWindowsREです。Recovery用パーティションを削除するため、まずWindowsREを無効化します。
 disableオプションを指定してReAgentcを実行することで、WindowsREを無効化できます。

C:\WINDOWS\system32>ReAgentc.exe /disable
REAGENTC.EXE: 操作は成功しました。

 

Recovery用パーティション(回復パーティション)の削除

 Recovery用パーティション(回復パーティション)のパーティションを特定し(partition 3)、削除します(delete partition override)。この時、誤操作を防ぐため回復パーティションのような保護されたパーティションに対する、delete partitionはoverrideオプションを指定しないと失敗するようになっているようです(下記参照)。なお、回復パーティションとして633MBが使用されていたことをメモしておきます(後に再作成する際に同等の容量を確保するため)。

C:\WINDOWS\system32>diskpart

Microsoft DiskPart バージョン 10.0.19041.964

Copyright (C) Microsoft Corporation.
コンピューター: ****

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           953 GB   506 GB

DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
  Partition 2    プライマリ              445 GB   550 MB
  Partition 3    回復                 633 MB   446 GB

DISKPART> select partition 3

パーティション 3 が選択されました。

DISKPART> delete partition

仮想ディスク サービス エラー:
force protected パラメーターを設定しないと、保護されたパーティションは削除できません。


DISKPART> help delete partition

    フォーカスされているパーティションを削除します。

構文:  DELETE PARTITION [NOERR] [OVERRIDE]

    NOERR       スクリプト専用です。エラーが発生しても、DiskPart は
                エラーが発生しなかった場合と同様にコマンドの処理を続けます。
                NOERR パラメーターがない場合は、DiskPart はエラー コードを
                生成して終了します。

    OVERRIDE    DiskPart で、種類に関係なく任意のパーティションを削除
                できます。通常、DiskPart では、既知のデータ パーティション
                の削除のみが許可されます。

    システム パーティション、ブート パーティション、あるいはアクティブな
    ページング ファイルまたはクラッシュ ダンプ (メモリ ダンプ) ファイルを含む
    パーティションは、削除できません。

    この操作を完了するには、パーティションを選択する必要があります。

    パーティションは、ダイナミック ディスクから削除することも、ダイナミック
    ディスク上に作成することもできません。

例:

    DELETE PARTITION

DISKPART> delete partition override

DiskPart は選択されたパーティションを正常に削除しました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
  Partition 2    プライマリ              445 GB   550 MB

DISKPART> exit

DiskPart を終了しています...
Windowsパーティション(いわゆるCドライブ)の拡張

 Windowsパーティション(partiton 2)を拡張(extend)します。extendのsizeオプションで拡張する容量を指定できますが、指定しなければ空き領域全てを指定したのと同じことになります。ここでは(狙った容量を計算するのが面倒だったので)、一旦空き領域全てを使用して拡張した後、作り直す回復パーティションの所要量だけ削り(shrink)ます(前述の通り元々は633MBだったため、それを満たしつつキリのいい640MBをここでは指定しましたが、大きくしすぎるとデータ保存用に使える容量が減ります)。

C:\WINDOWS\system32>diskpart

Microsoft DiskPart バージョン 10.0.19041.964

Copyright (C) Microsoft Corporation.
コンピューター: ****

DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
  Partition 2    プライマリ              445 GB   550 MB

DISKPART> select partition 2

パーティション 2 が選択されました。

DISKPART> help extend

    フォーカスされたボリュームまたはパーティションとそのファイル システムを
    ディスクの空き (未割り当て) 領域に拡張します。

構文:  EXTEND [SIZE=<N>] [DISK=<N>] [NOERR]
        EXTEND FILESYSTEM [NOERR]

    SIZE=<N>    現在のボリュームまたはパーティションに追加する領域の
                容量 (MB 単位) を指定します。サイズを指定しない場合、
                ディスク上で使用可能な隣接する空き領域がすべて使用されます。

    DISK=<N>    ボリュームまたはパーティションを拡張するディスクを
                指定します。ディスクを指定しない場合、ボリュームまたは
                パーティションは、現在のディスクに拡張されます。

    FILESYSTEM  フォーカスされたボリュームのファイル システムを、ボリューム
                全体をカバーするように拡張します。ファイル システムが
                ボリュームと共に拡張されなかったディスクにのみ使用します。

    NOERR       スクリプト専用です。エラーが発生しても、DiskPart は
                エラーが発生しなかった場合と同様にコマンドの処理を続けます。
                NOERR パラメーターがない場合は、DiskPart はエラー コードを
                生成して終了します。

    ベーシック ディスクでは、空き領域はフォーカスされたボリュームまたはパーティションと
    同じディスクにある必要があります。また、フォーカスされたボリュームまたは
    パーティションの直後にある (次のセクターのオフセットで開始される) 必要もあります。

    シンプルまたはスパン ボリュームのあるダイナミック ディスクでは、
    ボリュームを、任意のダイナミック ディスクの任意の空き領域に拡張できます。
    このコマンドを使用すると、シンプル ダイナミック ボリュームを
    スパン ダイナミック ボリュームに変換できます。ミラーされた RAID-5 および
    ストライプ ボリュームは拡張できません。

    パーティションが以前に NTFS ファイル システムでフォーマットされていた
    場合、ファイル システムが自動的に拡張されて、より大きなパーティションを
    占めます。データは失われません。パーティションが以前に NTFS 以外の
    ファイル システムでフォーマットされていた場合、コマンドの実行は失敗し、
    パーティションに変化は生じません。パーティションが以前にファイル システムで
    フォーマットされていなかった場合でも、パーティションは拡張されます。

    この操作を完了するには、ボリュームまたはパーティションを選択する必要があります。

例:

    EXTEND SIZE=500 DISK=3
    EXTEND FILESYSTEM

DISKPART> extend

DiskPart はボリュームを正常に拡張しました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
* Partition 2    プライマリ              953 GB   550 MB

DISKPART> shrink minimum=640

ボリュームは、次の方法で正常に縮小されました:  640 MB

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
* Partition 2    プライマリ              952 GB   550 MB

DISKPART> exit

DiskPart を終了しています...

 

Recovery用パーティション(回復パーティション)の作成

 空き領域に新規パーティションを作成(create partition)し、当該パーティションNTFSでクイックフォーマット(format quick fs=ntfs)した後、partition idを27(回復パーティション)に変更します(この操作だけでは作成した回復パーティションの中身は空なので、後続のWindowsREの再有効化手順が必要です)。

C:\WINDOWS\system32>diskpart

Microsoft DiskPart バージョン 10.0.19041.964

Copyright (C) Microsoft Corporation.
コンピューター: ****

DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
  Partition 2    プライマリ              952 GB   550 MB

DISKPART> create partition primary

DiskPart は指定したパーティションの作成に成功しました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
  Partition 2    プライマリ              952 GB   550 MB
* Partition 3    プライマリ              639 MB   953 GB

DISKPART> format quick fs=ntfs

  100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

DISKPART> set id=27

DiskPart は、パーティション ID を設定しました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ              549 MB  1024 KB
  Partition 2    プライマリ              952 GB   550 MB
* Partition 3    回復                 639 MB   953 GB

DISKPART> exit

DiskPart を終了しています...

 

WindowsREの有効化

 enableオプションを指定してReAgentcを実行することで、WindowsREを有効化できます。

C:\WINDOWS\system32>ReAgentc.exe /enable
REAGENTC.EXE: 操作は成功しました。

 

WindowsREの有効化確認
  • WindowsのスタートメニューからShiftキーを押しながら[電源]-[再起動]を選択
  • [オプションの選択]画面が現れるので、[トラブルシューティング]を選択
  • [トラブルシューティング]画面が現れるので、[詳細オプション]を選択
  • [詳細オプション]画面に[スタートアップ修復]など各種項目が表示されることを確認(表示されなければWindowsREが有効になっていない)

 [詳細オプション]画面の表示内容が確認が出来たら、[オプションの選択]画面まで戻って、[続行]を押して普通に再起動してください。

 あとは、今までのWindows環境がCドライブの空き容量が増えた状態で普通に使えるはずです。
 



以上。

*1:UEFI/GPTベースではない

*2:単に自分が知らないだけなのか、知名度が低いだけなのか、安定性や情報セキュリティ的に怪しいのか調べるのが面倒なため。

*3:インストールだけではなく、いわゆるLive USB的な用途でも使用できます。

*4:Windowsで使用時に読み書きが遅いと体感できる事象が比較的大きなファイルアクセス時に散発的に発生しており、その際はタスクマネージャーから確認できるDISKのアクティブな時間が100%に張り付いていたりした。

*5:特定のNAND素子に書き換えが集中しないよう、SSD内のコントローラが制御しているはずですが、空き容量が殆ど無い状況下ではあまり効果無さそうな。どんなロジックで実現してるのか開示されていないので実態は不明ですが。