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 パーティション縮小
コピーする前にコピー量を削減するために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以外もあるかもしれませんが、どれでも大丈夫です。多分こんな感じです。
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の頃から使ってたので、これで積もり積もった不具合ともおさらばです。
入れ直すときもパーティション構成いじったお陰で、すごくキリが良い感じのパーティション構成になりました。
OS入れ直したお陰でスッキリした pic.twitter.com/WdmFQsfcOz
— u-haru ͨ ͦ ͫ (@8shkei) December 10, 2022
今まで色々EFIとかシステムとか吹っ飛ばして遊んでた経験が活きた気がします。
また書くネタがあったら適当に書いていこうと思います(n年後)
それでは