|||||||||||||||||||||

なんぶ電子

- 更新: 

HDDからSSDへ容量縮小クローン

ディスク縮小クローン

筆者の周りではWindows11のPCが増えつつありますが、メンテナンス案件はまだWindows10がほとんどです。今回は、無料OSのDebianを使って、そのようなWindows10のHDDドライブのサイズを縮小してSSDに移転させた案件の話をします。その詳細は次の通りです。

  • HDDからSSD化

    何をするにも処理が遅いというので状況をみたらディスクアクセスが常に高いようでした。ディスクがHDDなのでSSDにすれば改善できそうです。

  • クローン

    MS Office Personalのライセンスキーが書かれているカードを無くしたという事で、クリーインストールができませんので、ディスクコピー(クローン)します。

  • ディスクサイズの縮小

    Windows11にはアップグレードできないPCなので、現在のHDDと同じ容量のSSDを用意するのももったいないという事で、OSパーテーションを縮小してクローンすることにしました。

元のOSはWindows10、クローンを作成する環境として、Debian(Linux)OSが入ったPCが別途用意されていて、そこへ新旧のハードディスクがつなげられるようになっていることを前提としています。

すべてのケースでうまくいく保証はありませんので、もし同じ作業をされる方がいましたら、あらかじめその点をご承知おきください。

新旧のディスクを同サイズで行えば、後半のgdiskコマンドでの作業は不要で、成功確率も上がると思います。そちらのケースでの説明も併せて紹介していきたいと思います。

事前の確認

交換用のSSDを買う(容量を決める)前に確認が必要でああろう項目は次の通りです。

  • ディスクの暗号化解除

    おそらくデフォルトでディスクの暗号化がされていることは少ないと思いますが、暗号化されているようなら解除します。Windows10のProから上のバージョンでは、BitLockerというディスク暗号化ツールがあります。この暗号化ツールを利用している場合は、スタートメニュー内の設定(歯車アイコン)の検索画面からBitLockerとキーワードを入力すると、設定画面がでてきます。これが無効になっていればクローンに支障がありません。

    また、Veracryptに代表されるように、BitLocker以外の暗号化ツールも使われている可能性もありますので、自身所有のPCではない場合は念のため所有者に確認しておきましょう。

    ちなみに、BitLockerの使い方や、フリーのディスク暗号化ツールであるVeracriptでの暗号化や復元の方法は別記事がありますので、興味とお時間がありましたら読んでいただけると幸いです。

  • パーテーションスタイルの確認

    「コントロールパネル」→「管理ツール」→「コンピューターの管理」→「ディスクの管理」と進めて表示させたディスクのプロパティを右クリックから表示させます。ボリュームのタブでパーテーションタイプが確認できます。

    パーテーションスタイルの確認

    使用しているハードウェアが64bitに対応しているのにパーテーションスタイルがMBR形式(32bitオペレーティングシステムx64 ベース プロセッサの状態)だったら、64ビット環境にしてGPTでクリーンインストールすることをお勧めします。MBRは古い形式のスタイルです。事情がありMBRのままクローンする場合は後でgdiskを使うところをfdiskで処理すれば可能だと思いますが、こちらの方法では試していませんのでもしかしたらエラーを解消できないかもしれません。

    スタイルがGPTだったら問題ありません。また、GPTの場合はディスクの先頭にEFIシステムパーテーションという領域が存在していると思います。

    MBRとGPTの違いについてはBIOSとUEFIの話をからめた記事の中で説明していますので、合わせてお読みいただけると幸いです。

  • OSのパーテーションが縮小可能か

    後で説明するディスクの管理から状況が確認できますが、新しいディスクのサイズ以上のデータがOSのパーテーション(通常Cドライブ)にあった場合は、データを退避する必要があります。

    ドキュメントや、写真、動画等のシンプルなファイルがディスク容量を占有しているようなら別のメディアに退避します。

    不要なアプリ等をアンインストールしてもそれらの領域が確保できないようなら、移植をあきらめるかSSDのサイズの変更が必要です。

    クローンする際はディスクの先頭(EFIシステムパーテーション)からOS(C)ドライブまでの容量が新しいディスクのサイズに収まるようにしないといけません。またGPTではディスクの最後にバックアップデータを持ちますので追加の余裕が必要です(1G程度あればいいと思います)。

    また、容量的に充分な空きがあっても、ディスクの途中に移動できないファイルがあると縮小可能なサイズが減りますので、一度ツールを起動してみて確かめる必要があります。空き領域があっても縮小できない場合は後述する方法で解消できることがありますので試してみてください。

  • OSドライブ以外のパーテーション

    今回は、ディスクの先頭からOSパーテーションまでをクローンの対象とします。OSパーテーションをリサイズしますが縮小した分が切り詰められるわけではないので、そこより後ろのパーテーションもクローンしたい場合は、ブランクとなった部分をスキップして、該当の部分を新しいディスクの最後に追加する必要がああります。また、パーテーションの位置がかわりますのでテーブルの書き換えも必要になります。デュアルブートなどをしているとそういうわけにもいかないのかもしれませんが、データだけのパーテーションならクローンはあきらめ、一旦外付けディスク等に退避させた方が楽です。

    同様の理由で、先頭からOSパーテーションの間に不要な領域があった場合でも、それはそのまま含めてしまった方が作業が簡単です。

    また、Windowsの回復パーテーションや、メーカー独自のリカバリ領域はそれをクローンできても工場出荷時とディスクのサイズが違うとリカバリできないことがあります。それらの機能が必要なら、元のサイズと同じディスクを用意した方がいいと思います。

  • バックアップ

    失敗したら、SSDでいちからインストールをするつもりで必要なデータのバックアップやソフトウェアのキーを取っておいてください。

    今回のようにキーがないような場合は、作業をする前に元のディスクのクローンを作成しファイル化して保存しておきます。

OS領域の縮小

OS領域(Cドライブ)の縮小をします。筆者の場合は全体の容量を512Gから256Gへ縮小しました。

今回筆者は作業しませんでしたが、エクスプローラーからドライブを選択した右クリックメニューでディスクのクリーンアップをしたり、デフラグをしたりすると縮小可能なサイズが大きくなるかもしれません。またディスクのエラーを警戒するならチェックディスクも実行するのもいいかもしれません。

OS領域を縮小するには、「コントロールパネル」→「管理ツール」→「コンピューターの管理」→「ディスクの管理」と進めます。

ディスクのCドライブのパーテーションを右クリックして、ボリュームの縮小を選択します。先ほども書きましたが、先頭のEFIシステムパーテーションと、GPTのバックアップ分を含めてサイズが収まるように縮小します。新しいディスクで起動した後にこのメニューから再度拡張できるので、少し多めに縮小しておきましょう。ちなみにこの作業は、ディスクコピーなどほかの書き込み作業中は避けた方が無難です。

ボリュームの縮小

移動できないファイル

空き容量があるのに縮小できない場合は、途中に移動できないファイルがあることが原因です。移動できないファイルの主なものに「仮想メモリ用の領域」と「休止時に使用する領域」があります。ボリュームの縮小を選択した時にも案内されるメッセージが表示されるように、「設定」の検索から「イベントビューア」を検索し立ち上げ、「Windowsログ」、「Application」を選択するとでてくるログの中から、ソースが「Defrag」となっているメッセージの中に縮小の分析を表示するメッセージがあります(おそらく時刻的に2番目に新しいものです)。

ここに「診断の詳細:最後に移動できなかったと思われるファイル」として示されるファイルが、容量があるのに縮小できない原因です。

これが次の場合は、回避することが可能です。

  • ¥pagefile.sys::$DATA

    pagefile.sysはページファイル、つまり仮想メモリ用の領域です。このファイルは一時的に削除することができます。ただメモリが少ない状態で削除するとWindowsの動作が不安定になるので、そのような場合は一旦ボリュームを縮小して別のドライブを作成して、そこに配置するなどといった工夫が必要です。

    ページファイルを使用しないようにしたり、保存ドライブを変更するには「設定」から「システムの詳細設定」で検索し、立ち上がったウインドウの「パフォーマンス:設定」から、「詳細設定タブ」、「仮想メモリ」、「変更」、「すべてのドライブのページングファイルサイズを自動的に管理する」のチェックを外し、「ページングファイルなし」を選択するか、変更先のドライブを選択します。

    設定後再起動が必要ですが、おそらく次に紹介するhiberfil.sysも存在すると思いますのでそちらも設定してからやると手間が省けます。

    ページングファイルの設定画像クリックで拡大します

    ボリュームを縮小させることができたら、仮想メモリ用のファイルの設定を戻します。保存先をCドライブ以外にした場合は特にこの作業が重要です。今回のクローンはCドライブ以外を対象としないのでそのままクローンを作成すると存在しないドライブを参照してしまいます。

  • ¥hiberfil.sys::$DATA

    hiberfil.sysは休止時に状態を保存しておくためのファイルです。こちらは管理者モードのPowerShellから設定をOFFにすることによりファイルが削除されます。

    こちらも再起動後にファイルが消えます。

    設定OFF

    PS> POWERCFG /H off

    元に戻すには、ONにします。

    設定ON

    PS> POWERCFG /H on

クローンの作成

LinuxPCに新旧のディスクを差し込み、OSを起動します。

古いディスクと新しいディスクがどう認識しているか確認します。確認は管理者権限からの「fdisk -l」の出力から判断できます。

Disc の項目でデバイスの名前(/dev/sda等)を判断します。

Disc model項目の文字列を参考に、新、旧、またはOS起動、どのディスクかを判断します。

# fdisk -l
...
Disk /dev/sdb: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: JAJS600M256C
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: ST500LT012-1DG14
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ...

Device         Start       End   Sectors   Size Type
/dev/sdc1       2048   1026047   1024000   500M EFI System
/dev/sdc2    1026048   1288191    262144   128M Microsoft reserved
/dev/sdc3    1288192496981657 495693466 236.4G Microsoft basic data
/dev/sdc4  906582016 908308479   1726464   843M Windows recovery environment
/dev/sdc5  908310528 949268479  40957952  19.5G Microsoft basic data
/dev/sdc6  949270528 950192127    921600   450M Windows recovery environment
/dev/sdc7  950192128 976773119  26580992  12.7G Windows recovery environment

ここでは古いディスクがsdc、新しいディスクがsdbとなっています。

先のfdisk -lの出力から、古い方のディスクのOSパーテーションの終了点(ディスクの先頭から何バイト目で終わるか)を確認しします。新旧同サイズのディスクを使う場合はこの作業は不要です。

各ディスク情報の終わりにパーテーションテーブルが出力されます。このテーブルの出力順は先に見たWindowsのディスク管理ツールで出力されたパーテーションの順番と同じになっていますので、それやディスクサイズを頼りに、OSパーテーションを見つけ、Endの部分に出力されている数値をメモします。ここでは496981657となります。

終了地点はセクタ単位となっています。必要なのはバイト数なので、セクタのサイズも確認する必要があります。各ディスクの表示でSector sizeとしてセクタサイズが表示されています。サイズにはlogicalとphysicalがありますが、logicalの方サイズです。念のため、テーブル上の「Sectors(セクタ数)」×セクタサイズがSizeの値と一致するか確認してください。割り算をして単位をMやGにする際の分母は1024です。

ここでは512×496981657=254454608384という値が得られました。

以前に使わなくなった古いハードディスクを完全消去する際にも使用したLinuxのddコマンドでクローンを作成します。

ifに入力(in)デバイス名、ofに出力(out)デバイス名を指定します。iflag=count_bytesはcountに渡す値をブロック数からバイト数に変換するオプションです、countには読み込む量を渡します。ここに先ほど計算したバイト数を入れます。また、bsに一度に書き込むサイズ(ブロックサイズ)を指定します。デフォルトは512バイトですが、値を大きくすれば作業効率はあがります。(ただし指定したサイズだけメモリの空きが必要です)

# dd if=/dev/sdc of=/dev/sdb count=254454608384 bs=256M iflag=count_bytes

新旧のディスクサイズが同じ場合か、または移動先の方が大きければは余計な計算をしなくてすみ、次のようなシンプルなコマンドでクローンが作成できます。

# dd if=/dev/sdc of=/dev/sdb bs=256M

途中で状況を確認したかったら、別ターミナルから「# pkill -USR1 dd」とコマンドを入力します。これはddプロセスに USR1シグナルを送信するものです。ddの仕様でUSR1シグナルを受け取ると現在のコピーの進捗情報を表示するようになっています。このメッセージはコピーしているプロンプトの方に表示されます。

もしくは、ddの引数に「 status=progress 」を加えると、オーバーヘッドにはなりますが、定期的に状況が表示されます。

パーテーションテーブルの修正

コピー終了後、fdiskでsdbを確認すると次のようになっていました。

#fdisk -l /dev/sdb
Disk /dev/sdb: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: JAJS600M256C
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
Disk identifier: 0x94d89ade

Device     Boot Start        End    Sectors Size Id Type
/dev/sdb1           1 4294967295 4294967295   2T ee GPT

パーテーションのサイズが2Tとなっており明らかにおかしいです。これを修正したいのですが、fdiskはGPTのパーテーションテーブルを修正できません。

MBRとGPTにも対応しているパーテーションツールにpartedがありますが、これはダメージのあるGPTテーブルを読むことができませんでした。

かわりにfdiskのGPT版であるgdiskを使ってみたところ読むことができました。

gdiskがインストールされていないようでしたら「apt install gdisk」としてインストールします。

gdiskのパーテーション操作はfdiskと似ています。まず-lオプションで状況を確認してみると、いろんなところにワーニングがでています。

# gdisk -l /dev/sdb
GPT fdisk (gdisk) version 1.0.6

Warning: Partition table header claims that the size of partition table
entries is 0 bytes, but this program  supports only 128-byte entries.
Adjusting accordingly, but partition table may be garbage.
Warning! Disk size is smaller than the main header indicates! Loading
secondary header from the last sector of the disk! You should use 'v' to
verify disk integrity, and perhaps options on the experts' menu to repair
the disk.
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.

Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: ERROR
Main partition table: OK
Backup partition table: ERROR

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: damaged

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
Disk /dev/sdb: 500118192 sectors, 238.5 GiB
Model: JAJS600M256C
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 3E5624B9-EA2A-4CCB-BCD4-6A5EFC5B888C
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 976773134
Partitions will be aligned on 2048-sector boundaries
Total free space is 409606483 sectors (195.3 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1026047   500.0 MiB   EF00  EFI system partition
   2         1026048         1288191   128.0 MiB   0C01  Microsoft reserved ...
   3         1288192       496981657   236.4 GiB   0700  Basic data partition
   4       906582016       908308479   843.0 MiB   2700
   5       908310528       949268479   19.5 GiB    0700  Basic data partition
   6       949270528       950192127   450.0 MiB   2700
   7       950192128       976773119   12.7 GiB    2700

gdiskでディスク容量を超える、OSが入ったパーテーション以降のエントリーを削除します。パーテーションのサイズや順位を参考に判断します。

gdiskでのパーテーションの削除はd、書き込みはwとこのあたりはfdiskと操作方法はまったく同じです。

# gdisk /dev/sdb
Command (? for help): d
Partition number (1-7): 7

同様に6,5,4を削除

Command (? for help): w
Caution! Secondary header was placed beyond the disk's limits! Moving the
header, but other problems may occur!

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N):Y
...

wで書き込む際、バックアップデータがもともとあった場所は存在しないポイントなので移動します、と言っています。この機能のおかげでGPTのバックアップ領域のリカバーができます。

再度gdisk -l /dev/sdbとすると、今まで出ていたワーニングがすべて消えました。

1            2048         1026047   500.0 MiB   EF00  EFI system partition
2         1026048         1288191   128.0 MiB   0C01  Microsoft reserved ...
3         1288192       496981657   236.4 GiB   0700  Basic data partition

パーテーション開始と終了の位置も元のディスクと同じです。

fdiskからの出力も正常になりました。

# fdisk -l
Disk /dev/sdb: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: JAJS600M256C
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: gpt
Disk identifier: ...

Device       Start       End   Sectors   Size Type
/dev/sdb1     2048   1026047   1024000   500M EFI System
/dev/sdb2  1026048   1288191    262144   128M Microsoft reserved
/dev/sdb3  1288192 496981657 495693466 236.4G Microsoft basic data

クローンの作成が終わったら再度新しいディスクをWindowsPCに装着して稼働を確認します。ライセンス等も確認して問題がなければ退避データの移動など復旧作業をします。

ボリュームの縮小時には少し余裕をもって実行した場合はディスクの後ろに未使用領域ができるので、今度はボリュームの拡張を指定してディスク領域いっぱいまで再設定します。

もともとのパーテーションテーブルに記載のあったパーテーションが無くなることと、ディスクの末尾にあるはずのGPTのバックアップ領域がなくなるのでどうなるかと思いましたがうまくいきました。

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告