Linuxを使ってWindowsのCドライブを大容量SSDに引っ越しする

WindowsのCドライブが一杯になると通常は不要なデータ削除する位しか手立てが無く、インストール状態をキープしたままCドライブの容量upをすることは難しい。どうしてもという場合には、専用ソフトなどが必要になる。

しかし今回、Linuxの標準ツールだけでWindowsのCドライブの内容を大容量SSDにコピーし元のWindowsを起動する事に成功した。次に同じ事をやりたくなった時に備えてメモ書きを残しておく。

スポンサーリンク

必要な物

まず大前提として、容量up対象のPCがUEFIブートに対応している事が必須。旧式のMBRブートのシステムでは、本記事の方法は使えない(と思う)。

そのうえで、外部ドライブからLinuxとWindowsの両方を起動出来るように予め準備してから取り掛かる必要がある。SSDのスロットが2つ存在する場合でない限り、データを一旦退避するための外部ドライブも必要だ。

以下が、本記事の方法を実行するために必要な物のリスト。

  • 現在よりも大容量なSSDドライブ
  • 現在のSSDよりも大きな空き容量がある外部ドライブ
  • 外部ドライブから起動可能なLinux(UbuntuインストールメディアでOK)
  • Windowsのインストールメディア

その他、UEFIブートの設定変更やLinuxの基本操作などの心得などが必要。(というわけで、PC初心者向きの方法ではないかもしれない)

LinuxとWindowsの外部ドライブ起動環境を準備

SSD換装作業を行う前に、LinuxとWindowsそれぞれのOSを外部ドライブから起動出来るようにしておく。外部ドライブから起動出来る環境が既にあればそれを使えば良く、無い場合でも標準的なコマンドしか使わないのでインストールメディアで十分だ。

Linux

今回は、たまたま他のLinuxマシンで使っていた内蔵HDDを外付けケースに入れら普通にUSBブート出来てしまったので、それを使った。

そういう環境が無い場合は、下記Ubuntuダウンロードサイトからisoファイルをダウンロードし、エクスプローラでisoファイルを右クリックして出てくるメニューから「ディスクイメージの書き込み」を選べば、光ディスクにインストーラが作成出来る。

https://jp.ubuntu.com/download

ただ光ディスクからだと起動するまでかなりの時間が掛かるため、USBメモリに焼いた方がストレスは少ない筈。起動可能なUSBメモリを作るなら、Ubuntu標準ツールのusb-creator-gtkを使うのが簡単で確実じゃないかと思う。

Windows10

Windows10上でUSBメモリにインストールメディアを作成する方法は以下。

  1. 下記ページにアクセスして「今すぐダウンロード」を押し、MediaCreationToolをダウンロードする。
    https://www.microsoft.com/ja-jp/software-download/windows10
  2. MediaCreationTool実行し「別のインストールメディアを作成する」を選んで「次へ」を押す
  3. 「USBフラッシュドライブ」を選んで「次へ」を押す(USBメモリはFAT32でフォーマットしておく必要あり)

換装元(オリジナル)のドライブ情報を保存

SSD換装前の状態でWindowsではなく外部ドライブからLinuxを起動し、Linux上でWindowsOSのデータなど中身をパーティション毎に外部ドライブへと吸い出しておく。

GPT情報の保存

lsblkなどで換装したい対象ドライブのパーティション情報を確認する。

nvme0n1     259:0    0 238.5G  0 disk 
├─nvme0n1p1 259:5    0   260M  0 part 
├─nvme0n1p2 259:6    0    16M  0 part 
├─nvme0n1p3 259:7    0 237.2G  0 part
└─nvme0n1p4 259:8    0  1000M  0 part 

対象ドライブのデバイスはnvme0n1と分かったので、GPTの詳細をgdiskで確認する。

sudo gdisk -l /dev/nvme0n1

GPT fdisk (gdisk) version 1.0.5

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

Found valid GPT with protective MBR; using GPT.
Disk /dev/nvme0n1: 500118192 sectors, 238.5 GiB
Model: RPFTJ256PDD2MWX                         
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 1F5002F3-C09A-4A9F-B240-7A28831DE9FF
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 500118158
Partitions will be aligned on 2048-sector boundaries
Total free space is 2669 sectors (1.3 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          534527   260.0 MiB   EF00  EFI system partition
   2          534528          567295   16.0 MiB    0C01  Microsoft reserved ...
   3          567296       498069503   237.2 GiB   0700  Basic data partition
   4       498069504       500117503   1000.0 MiB  2700  Basic data partition

特に、最後の方のパーティションごとの開始セクタ/終了セクタや属性コードの情報は重要。ファイルに保存しておく。

sudo gdisk -l /dev/nvme0n1 > gdisk.txt

ddでパーティションの中身を吸い出す

ddコマンドを使って換装元ドライブにある各パーティションの中身を、外付けドライブにファイルとして保存する。以下のような感じで。

dd if=/dev/nvme0n1p1 of=nvme0n1p1_260m.dd
dd if=/dev/nvme0n1p2 of=nvme0n1p2_16m.dd
dd if=/dev/nvme0n1p3 of=nvme0n1p3_237g.dd
dd if=/dev/nvme0n1p4 of=nvme0n1p4_1g.dd

ここまでで一旦終了。Linuxをシャットダウンする。

物理ドライブを換装しデータをリストアする

データを吸い出した後は元々のSSDは取り外し、容量の大きいSSDに付け替える(今回は256GB→512GBの容量up)。そしてSSDを付け替えた後、再度外部ドライブからLinuxを起動する。

以下は、新しいSSDへのパーティション作成とデータのリストア手順。

容量upのための作戦を立てる

換装元ドライブである256GB SSDのGPTテーブルをもう一度見てみよう。

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          534527   260.0 MiB   EF00  EFI system partition
   2          534528          567295   16.0 MiB    0C01  Microsoft reserved ...
   3          567296       498069503   237.2 GiB   0700  Basic data partition
   4       498069504       500117503   1000.0 MiB  2700  Basic data partition

パーティション番号3がWindowsのパーティションで、ここの拡張を狙いたい。パーティション拡張を行える条件はパーティションの後ろに空き容量があることなので、パーティション番号4を最終セクタ側に持っていってパーティション3と4の間を空るようにすればOKだ。

新しいドライブのGPTテーブルを編集

gdiskを実行。

sudo gdisk /dev/nvme0n1

gdiskのコマンドラインでoコマンドを実行し、新規でGPTを作成する。

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): 
Your option? (Y/N): y

パーティション1〜3については、元ドライブのGPTテーブルとセクタ番号や属性コードが全く同じになるよう、GPTテーブルを編集する。例えばパーティション番号1(EFIブートパーティション)の場合は、

  • 開始セクタ: 2048
  • 終了セクタ: 534527
  • 属性コード: EF00

なので、以下のような感じでnコマンドを実行すればOK。

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-976773134, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-976773134, default = 976773134) or {+-}size{KMGTP}: 534527
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI system partition'

ここまで実行後のpコマンドの結果は以下。元のSSDの時のGPTテーブルと全く同じになっている筈。

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          534527   260.0 MiB   EF00  EFI system partition
   2          534528          567295   16.0 MiB    0C01  Microsoft reserved
   3          567296       498069503   237.2 GiB   0700  Microsoft basic data

さて、パーティション4については最終セクタ側に持って行きパーティション3との間に空き容量を作りたいので、以下のような手順で作成する。

  1. nコマンドで残り容量を全部パーティション4に割り当てる
  2. pコマンドで最終セクタを控える
  3. dコマンドでパーティション4を削除
  4. 元ドライブのパーティション4が専有するセクタ数から逆算して、新ドライブのパーティション4の開始セクタを決定する
  5. 再度nコマンドを実行し、4.で割り出した開始セクタと2.で控えた最終セクタを指定してパーティション4を作成する

これで基本的にはOKだが、折角なのでパーティション4の直前に別用途のパーティションを追加しても良いだろう。

最終的なpコマンドの出力は以下。(パーティション4の手前に、Linuxインストール用の32GBをパーティション5に割り当てている)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          534527   260.0 MiB   EF00  EFI system partition
   2          534528          567295   16.0 MiB    0C01  Microsoft reserved
   3          567296       498069503   237.2 GiB   0700  Microsoft basic data
   4       974725120       976773134   1000.0 MiB  2700  Windows RE
   5       907616256       974725119   32.0 GiB    8300  Linux filesystem

以上でgdiskの作業は完了。wコマンドを実行してパーティションテーブルに書き込み、gdiskを終了させる。

ddコマンドでデータのリストア

あとは元のドライブから吸い出したデータをddコマンドを使って新しいパーティションに書き出すだけでOK。

sudo dd if=nvme0n1p1_260m.dd of=/dev/nvme0n1p1
sudo dd if=nvme0n1p2_16m.dd of=/dev/nvme0n1p2
sudo dd if=nvme0n1p3_237g.dd of=/dev/nvme0n1p3
sudo dd if=nvme0n1p4_1g.dd of=/dev/nvme0n1p4

UEFIブートローダーの修復

さて、上記でデータ移動などの基本作業は完了なのだが、UEFIのブートローダーの設定が壊れてしまい(原因はよくわからない)、そのままではWindowsが起動してくれないためコマンドプロンプトから修復作業が必要。コマンドプロンプトは、WindowsインストールメディアでPCを立ち上げてから以下の手順で起動する。(こちらの記事を参考にした)

  • Windowsインストーラが起動したら「今すぐインストール」の代わりに左下の「コンピュータを修復する」を選ぶ
  • 「トラブルシューティング」を選んで、詳細オプションから「コマンドプロンプト」を選択

diskpartでEFIパーティションにドライブレター割り当て

コマンドプロンプトが起動したら”diskpart”を実行し、EFIシステムパーティションにドライブレターを割り当てる作業を行う。

  1. 以下を実行すると「ディスク0が選択されました」のメッセージが表示される
sel disk 0
  1. 以下を実行して、ボリューム一覧を表示する
list vol
  1. ボリューム一覧からEFIパーティションを探し(FAT32のパーティション)、その番号を指定する
sel vol <ボリューム番号>
  1. 未割り当てのドライブレターを指定し、EFIパーティションをマウントする(下の例では、Fを指定)
assign letter=F:
  1. exitでdiskpartを終了する

以降、EFIパーティションをドライブF:としてコマンドプロンプトからアクセス出来るようになる。

bcdbootでブートローダー修復実行

コマンドプロンプトから以下を実行し、Windowsのインストールの存在を確認しておく(一応念の為。やらなくても良い)。リストにC:\Windowsが出てくればOK。

bootrec /scanos

コマンドプロンプトから以下を実行して、F:にマウントしたEFIパーティションにあるUEFIブートローダーを修復する。

bcdboot C:\Windows /s F: /f UEFI

あとはexitでコマンドプロンプトを終了し、PCをシャットダウンする。

Windows回復環境の復活

上記作業完了後、めでたく新しいSSDで元のWindows環境が起動するようになる筈。しかし、Windows回復環境の起動が駄目なままだ。

Windows回復環境を復活させるためには、Windows通常起動状態で管理者権限のコマンドプロンプトを起動し、以下の一連のコマンドを実行すればOK。(こちらの記事を参考にさせて頂いた)

reagentc /info
reagentc /enable
reagentc /info

パーティションサイズの拡大

そして最後の仕上げに、Cドライブのパーティションサイズ拡大を行う。

  1. スタートメニュー右クリックで出てくる一覧から「ディスクの管理」を選択し、起動
  2. 下のキャプチャのようにCドライブのパーティションを右クリックで出てくるメニューから「ボリュームの拡張」を選択
    Extension
  3. 「ボリュームの選択ウィザード」ダイアログが開く。デフォルトで拡張可能な最大容量が表示されているので、そのまま「次へ」ボタンを押せば良い。
    Extension
  4. ウィザード完了後の画面。Cドライブのパーティション横にあった「未割り当て領域」が結合され、サイズがちゃんと増えている。
    Extension

まとめ

これまではCドライブが一杯になってしまった時、容量の大きいドライブを買ってきてWindows再インストールするかPC買い替えで解決することが多かった。いずれの場合も元のCドライブからのデータ移動やアプリの再インストールが必要で面倒くさいのだが、今回の方法なら比較的簡単な作業でCドライブの容量upが出来る。特殊なツールは何も要らないので、今後も同じ手法が使えそうな所もポイント高いかなと思う。

記事中では触れなかったが、ついでに作成したパーティションにUbuntuをインストールして、LinuxとWindowsのデュアルブート環境に出来たのも個人的には収穫だった。

コメント