Linuxを使ってWindowsを小さいディスクに引っ越す

久々の更新になってしまいましたが、備忘録も兼ねて自分のWin環境でやったことをまとめようとおもって書き始めました。

別にディスクの引っ越しとかに限らず、EFIとか回復環境の再構築もある程度書いてるつもりなので、そういう人も見ていただければと思います( 手順7あたり)。

ただ、Linuxを使った経験がある人向けになってます(Windowsなのに)。

あと、この記事ではddでパーティションのコピーとかやるので、間違えるとデータが消し飛びます。私が書いているコマンドが間違っているかもしれないので、typeする前に一度考えてください。データが飛んでも私は責任を負いません。怖かったらバックアップをとっておくか、大人しく再インストールしてください。

はじめに

長いことWindowsを使ってると、ディスクの交換とかすることもあると思います。大きいサイズのディスクへの引っ越しならそのへんのパーティションコピーツール(AOMEIとかEaseUSとか)を使えばいいですが、小さい環境に移すのは結構面倒だったりします。

こういう場合、基本的にはWindowsを入れ直してやるのが楽なのかもしれませんが、どうしてもCドライブを移したいとかいう場合もあると思います。あと、パーティション構成が気に食わないって人もいると思います(自分)。そういう場合、Linuxでパーティション作成→ddという方法が意外とうまく行けたので、適当ですが記事にした次第です。結構危ないので、あくまで参考程度にしていただければ…

どうでもいいですが、パーティションコピーツールは前に使ったときにパーティション名が文字化けしたりしたので個人的にはあまりおすすめしません。

必要な環境

  • Windows(引っ越し元)
  • Linux(USBブートのインストーラーでOK)
  • Windowsインストーラー
  • 引越し先のドライブ

WindowsのISOは MediaCreationToolで手に入れてください。

インストーラーが2つ要るので、 Ventoyとかを使うのをオススメします(めっちゃ便利なので)。使い方は省きます。

ちなみにですがI use Arch btwなので、私はArchLinuxのISOを使いました。ddとcfdiskが使えればインストーラーじゃなくても何でもいいです。

作業

始める前に注意ですが、以降の作業はUEFI&GPT環境を想定しています。MBR環境でも動くかもしれませんが、検証していないので動作は保証できません。(めんどくさかったので)

目次

  1. パーティション縮小
  2. Linuxブート
  3. ディスクの確認
  4. パーティションの用意
  5. コピー
  6. Windowsインストーラの起動
  7. DiskPart
  8. BCDBoot
  9. 回復環境の設定

手順1 パーティション縮小

コピーする前にコピー量を削減するためにWin上でCドライブを縮小しておきます。Winメニュー右クリック→ディスクの管理 でCドライブのサイズを可能な限り小さくします。

なお、ページファイルとかシャドウコピーとかがあるとあまり縮小できなかったりするので、可能であればそれらを無効化してからやるといいと思います(特に小さい環境にコピーする場合)。

手順2 Linuxブート

用意したLinux環境をブートします。Shiftキー押しながら再起動→メディアを使用ってやるのが楽だと思います。

手順3 ディスクの確認

まずコピー元とコピー先のディスクの情報を確認します。fdisk -l /dev/sd~みたいな感じでどのデバイスがコピー元orコピー先なのかを確認しましょう。

ここからはコピー元をsdX、コピー先をsdYとして進めていきます。XとYは自身の環境に合わせて読み替えてください。

コピー元は例えばこんな感じです。

# fdisk -l /dev/sdX
Disk /dev/sdX: 465.78 GiB, 500107862016 bytes, 976773168 sectors
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: B8243056-BE4E-4935-9FA3-886D58AB4708

Device       Start       End   Sectors   Size Type
/dev/sdX1     2048    526335    524288   256M EFI System
/dev/sdX2   526336   2623487   2097152     1G Windows recovery environment
/dev/sdX3  2623488 976773119 974149632 464.5G Microsoft basic data

この場合、/dev/sdX3がCドライブですね。sdX2は回復環境、sdX1はEFIです。実際はこんな感じではないと思いますが、とりあえずCドライブが分かれば何でもいいです。

コピー先は何でもいいですが、コピー元のCドライブが入るサイズにしましょう(縮小してるので大丈夫だとは思いますが)。

なんか入ってれば、wipefs -af /dev/sdYで消し飛ばせばいいと思います。

手順4 パーティションの用意

コピー先のディスクにパーティションを作ります。個人的にはcfdiskで作るのが一番楽だと思うのでそれでやってます。cfdisk /dev/sdYでいい感じにパーティションを作ります。システムはGPTを選択してください。

                                    Disk: /dev/sdY
                Size: 465.78 GiB, 500107862016 bytes, 976773168 sectors
             Label: gpt, identifier: B8243056-BE4E-4935-9FA3-886D58AB4708

    Device           Start         End    Sectors    Size Type
>>  /dev/sdY1         2048      526335     524288    256M EFI System
    /dev/sdY2       526336     2623487    2097152      1G Windows recovery environment
    /dev/sdY3      2623488   976773119  974149632  464.5G Microsoft basic data

 ┌───────────────────────────────────────────────────────────────────────────────────┐
 │ Partition name: EFI system partition                                              │
 │ Partition UUID: 01D2E1E1-1475-41E8-97EF-D0E0303E9268                              │
 │ Partition type: EFI System (C12A7328-F81F-11D2-BA4B-00A0C93EC93B)                 │
 │     Attributes: GUID:63                                                           │
 │Filesystem UUID: E224-8F91                                                         │
 │     Filesystem: vfat                                                              │
 └───────────────────────────────────────────────────────────────────────────────────┘
  [ Delete ]  [ Resize ]  [  Quit  ]  [  Type  ]  [  Help  ]  [  Write ]  [  Dump  ]

必要なのは、256MBのEFI Systemと1GB程度の回復環境、それとCドライブ用のパーティションです。Newでサイズを指定してパーティションを作り、Typeからパーティションタイプを変更して例と同じような感じにしてください。少なくともEFI Systemがないとブートできないので、忘れずに変えるようにしてください。
回復環境は最悪無くてもいいですが、作っておいたほうがいいと思います。

Cドライブはコピー元より大きくすれば大丈夫です。サイズを合わせる必要はありません。

ちなみにですが、パーティションの順番は何でもいいです。Cドライブが最初でもEFIが最後でも問題ないです。ただ、大きいディスクへの引っ越しの可能性を考えるとCドライブは最後のほうがいいと思います。

作り終わったら、EFIはフォーマットしときましょう。

mkfs.vfat -F32 /dev/sdY#

#はEFIのパーティション番号です。私の場合は1となります。

手順5 コピー

ここからはデータの消失の危険があるので、慎重に作業してください。コピー前にマウントして、間違いがないか確認することをおすすめします。

ddコマンドでCドライブをコピーします。

dd if=/dev/sdX# of=/dev/sdY# bs=4M

#はCドライブのパーティション番号です。私の場合だとsdX3→sdY3ですね。これも自身の環境に合わせて読み替えてください。

次に回復環境をコピーします。どれかわからない場合や必要ない場合は飛ばしてください。

dd if=/dev/sdX# of=/dev/sdY# bs=4M

これも環境に合わせて読み替えてください。私の場合はsdX2→sdY2です。

EFIパーティションはコピーしなくて大丈夫です。

コピーが終わったら、Linuxでの作業は終了です。rebootで再起動してください。
なお、コピー元はもう必要ないので、デバイスから取り外しときましょう(紛らわしいので)。

手順6 Windowsインストーラーの起動

再起動してWindowsインストーラーを起動してください。
起動したら、コマンドプロンプトを使用します。回復からコマンドプロンプトを選択するか、Shift+F10で起動してください。

手順7 DiskPart

コマンドプロンプトでdiskpartと打ち、DiskPart環境に入ります。
そしたら、list volでボリューム一覧を出してください。

DISKPART> list vol
  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     F   Hard Disk    NTFS   Partition   1953 GB  Healthy
  Volume 1                      RAW    Partition   1772 GB  Healthy
  Volume 2     D                NTFS   Partition    464 GB  Healthy    Boot
  Volume 3                      FAT32  Partition    256 MB  Healthy    System
  Volume 4                      NTFS   Partition   1024 MB  Healthy    Hidden
  Volume 5     E                NTFS   Partition    465 GB  Healthy    Pagefile

多少違うかもしれませんが、多分こんな感じになると思います(InfoとかLtrの記述は参考にしないでください)。

WindowsとEFIのパーティションの番号を使うので覚えてください。SizeとFsで間違いないことを確認したほうがいいと思います。それか、notepadでメモ帳を立ち上げて保存→保存先を選ぶ画面で確認するといいと思います。

私の場合はWindowsが2、EFIが3ですね。

そしたらまずは、EFIパーティションをマウントします。

DISKPART> select vol 3
Volume 3 is the selected volume.

DISKPART> assign letter=S
DiskPart successfully assigned the drive letter or mount point.

数字は適時読み替えてください。これでS:\がEFIパーティションになります。

次に、Cドライブを選択してファイルシステムを拡張しておきましょう。これをしないとNTFSが小さいままになります。

DISKPART> select vol 2
Volume 2 is the selected volume.

DISKPART> extend FILESYSTEM
DiskPart successfully extended the file system on the volume.

これでDiskpartでの作業は終了です。exitでコマンドプロンプトへ戻りましょう。

手順8 BCDBoot

bcdbootを使ってEFIを初期化します。ドライブレターは環境に合わせてください。

bcdboot D:\Windows /s S:

これでEFIがセットされ、ブートできるようになります。これで最低限必要な作業は終わりですが、回復環境を初期化するので少し作業が必要になります。とりあえず再起動して、Windowsが正常に起動することを確認しましょう。

手順9 回復環境の設定

いらない人は飛ばしてください。

まず、管理者権限でコンソールを起動し、DiskPartを使います。先程と同様にlist volして回復パーティションの番号を覚えてください。私の場合4です。

そしたら、回復環境をマウントします。

DISKPART> select vol 4
Volume 4 is the selected volume.

DISKPART> assign letter=R
DiskPart successfully assigned the drive letter or mount point.

これでR:\にマウントされました。ここからは、回復環境をコピーした人はreagentcのとこまで飛ばして大丈夫です。

一旦DiskPartを抜けて、

mkdir "R:\Recovery\WindowsRE"

でリカバリ用のディレクトリを作っておきましょう。

次にWindowsのインストーラからWinre.wimを取り出します。DISMを使う方法が一般的ですが、コマンドが多すぎてめんどくさいので7-zipでやります。
コマンドでやりたい人はggってください。手順だけ書くと、ISOマウント→DISMでwimのindex取得→esdからwim変換→wimマウント→winre抽出です。

ISOファイルを7-zipで開きましょう。そしたらsources\install.esd\1\Windows\System32\Recovery\ とディレクトリを移動してください。番号は1以外もあるかもしれませんが、どれでも大丈夫です。多分こんな感じです。

7-zip

Winre.wimがあると思うので、これをR:\Recovery\WindowsRE\Winre.wimという感じで配置してください。

配置が終わったら、コマンドプロンプトで回復環境の設定をします。

reagentc /disable
reagentc /setreimage /path R:\Recovery\WindowsRE
reagentc /enable

これで設定は終わりです。reagentc /infoで問題ないことを確認しましょう。こうなってれば成功です。

Windows Recovery Environment (Windows RE) and system reset configuration
Information:

    Windows RE status:         Enabled
    Windows RE location:       \\?\GLOBALROOT\device\harddisk1\partition2\Recovery\WindowsRE
    Boot Configuration Data (BCD) identifier: 25a0d5e4-7831-11ed-9004-ff26ed5a3788

~~~

うまくいかない場合、再起動するといいかもしれません(BCD関係がセットされるので)

そしたらもう一度DiskPartして、マウントを解除します。

DISKPART> select vol 4
Volume 4 is the selected volume.

DISKPART> remove
DiskPart successfully removed the drive letter or mount point.

これをしないと再起動しても回復環境がR:\に居座ったりするので…

これにて作業は終了です。お疲れ様でした。

最後に

最後まで読んでいただき、ありがとうございます。

個人的にですが、UEFIがすごい便利だなぁ~と思いました。パーティション設定で全部解決するので、MBRみたいにややこしくならないのがすごい有り難いです(あんまりやったことないので分からんけど)。

結局Linux使うならメイン環境Linuxにすれば終わるのでは?って思ってる人多いと思いますが、自分でも思います。ただ、ゲームとか学校のレポートとかってなると、Linuxだとちょい不便なので… あと学校のアカウントだとタダでWindows Educationが使えたので

どうでもいいですが、この記事を書く前日にOSを再インストールしました。初期化するつもりだったのに、初期化すら通らないということで全部消し飛ばしました。ついでに私の1日も消し飛びました。Windows 7の頃から使ってたので、これで積もり積もった不具合ともおさらばです。
入れ直すときもパーティション構成いじったお陰で、すごくキリが良い感じのパーティション構成になりました。

今まで色々EFIとかシステムとか吹っ飛ばして遊んでた経験が活きた気がします。

また書くネタがあったら適当に書いていこうと思います(n年後)
それでは

U-haru
U-haru
Student at NITMC

ただの学生

関連項目