この記事では、デュアルブート環境を維持したまま、SSDを拡張する方法をまとめたものです。Windows 11 向けのSSD換装によるストレージ拡張操作、もしくは、Ubuntu のそれはネット上にいろいろな記事などでまとめられているのですが、 デュアルブート だとその情報がなさそうだったので、まとめます。
なぜこの環境を作ったのか、その構築に関しての概要は以下の記事にも書いています。
https://zenn.dev/takajun/articles/0a3f487decab01

デュアルブート自体は、以下のサイトの手順を参考に行っていました。Windows のパーティションツールで、未使用領域(unallocated)を作成して、そこにUbuntuをデュアルブートでインストールするという一般的な方法で、OSをインストールしています。

ローカルLLM(Ollama)のモデルファイルやDockerイメージを大量に保存していたところ、ディスク使用率が 97% に達してしまいました。残り容量はわずか4.5GB。これはシステムの安定性に影響を与えるレベルです。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p5 144G 132G 4.5G 97% /
実際に新しいファイルのダウンロードなどができなくなったり、普通に Ubuntu のデスクトップがフリーズして操作できないみたいな不具合が多発していました。
まず、Ubuntu のターミナルで現在のパーティション構成を確認します。
私の環境では以下のような構成でした。
$ sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: NVME SSD
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: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 206847 204800 100M EFI System
/dev/nvme0n1p2 206848 239615 32768 16M Microsoft reserved
/dev/nvme0n1p3 239616 690966527 690726912 329.4G Microsoft basic data
/dev/nvme0n1p4 998166528 1000214527 2048000 1000M Windows recovery environment
/dev/nvme0n1p5 690966528 998166527 307200000 146.5G Linux filesystem
Windows側で、でも同様に確認してみました。

デュアルブート環境では、EFIパーティション、Windows本体、Windows回復環境、そしてUbuntu本体という複数のパーティションが存在します。これらすべてを新SSDに移行する必要があります。
Ubuntu 用パーティションとして、 146GB を割り当てていましたが、デスクトップOSとして日常使いするにはやっぱり容量が少なすぎました。
ディスククローンには Clonezilla を使用しました。Clonezillaはオープンソースのディスクイメージング/クローニングツールで、デュアルブート環境のクローンに実績があります。

パーティションの拡張には GParted を使用しました。GUIで直感的にパーティション操作ができます。
作業は大きく3つのフェーズに分かれます。
通常、ClonezillaはUSBメモリから起動しますが、今回は 新SSDの先頭にClonezillaを直接インストールする方式 を採用しました。この方法のメリットは以下の通りです。
新SSD(1TB)を NVMe SSDエンクロージャー などで接続し、先頭に10GBのパーティションを作成します。
# 新SSDのデバイス名を確認
$ lsblk
# 私の環境では /dev/sda として認識されました
# fdiskでパーティション作成
$ sudo fdisk /dev/sda
# fdiskの対話モードで以下を実行
Command: g # GPTパーティションテーブルを作成
Command: n # 新規パーティション
Partition number: 1 # デフォルト
First sector: 2048 # デフォルト
Last sector: +10G # 10GBを指定
Command: t # パーティションタイプを変更
Partition type: 11 # Microsoft basic data(FAT32用)
Command: w # 書き込んで終了
$ sudo mkfs.vfat -F32 /dev/sda1
# Clonezillaをダウンロード
$ cd ~/Downloads
$ mkdir clonezilla && cd clonezilla
$ wget https://sourceforge.net/projects/clonezilla/files/clonezilla_live_stable/3.3.0-33/clonezilla-live-3.3.0-33-amd64.zip
# マウントポイントを作成してマウント
$ sudo mkdir -p /mnt/clonezilla
$ sudo mount /dev/sda1 /mnt/clonezilla
# ZIPファイルを展開
$ sudo unzip clonezilla-live-3.3.0-33-amd64.zip -d /mnt/clonezilla/
# 確認
$ ls /mnt/clonezilla/
# EFI, live, syslinux などのディレクトリが見えればOK
Ubuntuから直接Clonezillaを起動できるように、GRUBの設定を追加します。
$ sudo vim /etc/grub.d/40_custom
以下の内容を追加します。
menuentry "Clonezilla Live (ToRAM)" {
insmod part_gpt
insmod fat
set root='hd1,gpt1'
linux /live/vmlinuz boot=live union=overlay username=user config components noswap edd=on nomodeset locales=ja_JP.UTF-8 keyboard-layouts=jp ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_batch="no" vga=788 ip= net.ifnames=0 toram=live,syslinux,EFI nosplash noprompt
initrd /live/initrd.img
}
重要なポイント:
GRUBを更新します。
$ sudo update-grub

Clonezillaのウィザードで以下を選択します。


⚠️ ここが最も重要です。間違えるとデータが消えます!
ソースディスク(コピー元):
[✓] nvme0n1 476.9GB ← 既存のSSD
ターゲットディスク(コピー先):
[✓] sda 931.5GB ← 新しいSSD
実際の画面だと、以下のように選択肢が表示されます。
コピー元のソースとしてPCのマザーボードに接続された nvme0n1 のディスクを選択、コピー先として、sda を選択しました。

パーティションサイズの扱いについて選択を求められます。
私は -k0(元サイズ維持) を選択しました。理由は以下の通りです。
step 8 の後の画面がこちらです。
1TB Samsung 990 EVO Plus がコピー先であることを確認し、y を押して実行します。

クローンの実行には、私の環境では約1時間かかりました(データ量や接続方式によって変動します)。
クローン実行中は、以下のような画面で、パーティションごとにコピーする進捗状況が示されます。

クローン完了後、以下の手順でSSDを交換します。
クローン直後は、パーティションサイズが元のSSDと同じままです。新SSDの余った領域を活用するため、パーティションを拡張します。
まず、UbuntuとWindowsの両方が正常に起動することを確認します。
# Ubuntu起動後
$ lsblk
$ df -h
# 再起動してGRUBからWindowsを選択
# Windowsのデスクトップまで到達すればOK
windows も無事起動でき、再度パーティションツールでその内容を確認したら、無事交換されたSSDとパーティションを確認することができました。

クローン後の ssd の状況は問題なさそうなので、再起動してubuntu に戻り、パーティション拡張作業を続けます。
ディスク使用率が97%のため、まず空き容量を確保してからGPartedをインストールします。
# 空き容量を確保
$ sudo apt clean
$ sudo apt autoremove -y
$ sudo journalctl --vacuum-time=3d
# GPartedをインストール
$ sudo apt update
$ sudo apt install -y gparted
$ sudo gparted /dev/nvme0n1
上記のコマンドのあと、以下のウィンドウが開きます。SSDが交換されて、容量は増えていますが、unallocated の状態でUbuntuが使用している領域が交換前と同じいっぱいの状態なので、これを拡張していきます。

拡張は、GPartedのGUI上で以下の操作を行います。
操作1: 回復パーティション(p4)を右端に移動
デュアルブート環境では、Windows回復パーティション(p4)がUbuntuパーティション(p5)の後ろにあることが多いです。この場合、p5を拡張するためには、まずp4を右端に移動する必要があります。
上記の操作を実行すると free space preceding が、移動した分だけ増え、 free space following が0になり、一番最後尾に Windows回復パーティション(p4) が移動されたことが確認できます。
以下の画像は、その時のスクショです。

操作2: Ubuntuパーティション(p5)を拡張
スクショは無いですが、Windows回復パーティション(p4) を移動したのと同じ容量で操作します。
操作3: 変更を適用
以下のような表示になれば完了です。

SSD容量
Ubuntuパーティション
空き容量
使用率
$ sudo fdisk -l /dev/nvme0n1
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 206847 204800 100M EFI System
/dev/nvme0n1p2 206848 239615 32768 16M Microsoft reserved
/dev/nvme0n1p3 239616 690966527 690726912 329.4G Microsoft basic data
/dev/nvme0n1p5 690966528 1951475711 1260509184 601.1G Linux filesystem
/dev/nvme0n1p4 1951477760 1953523711 2045952 999M Windows recovery
パーティション番号(p4とp5)と物理的な配置順序が異なりますが、これは問題ありません。UUIDで管理されているため、正常に動作します。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p5 591G 131G 435G 24% /
SSD自体にClonezillaをインストールし、RAMに読み込んで実行することで、USBメモリなしでクローン作業が可能です。同じSSDをクローン先として使用できる点が便利でした。
物理的な配置順序(p5 → p4)と論理的なパーティション番号が異なっていても、システムは正常に動作します。LinuxはUUIDでパーティションを識別するため、順序の違いは問題になりません。
Windows回復パーティションがUbuntuパーティションの直後にある場合、拡張前に移動が必要です。GPartedなら GUI で簡単に操作できます。
デュアルブート環境でのSSD換装は、単一OS環境より複雑ですが、Clonezillaを使えば安全に実行できます。AIに確認しながら作業を進めたので、安全にできました。パーティションの確認とか操作は、ある程度もともと理解はしていたのですが、GRUB のところはぶっちゃけ、どういう仕組かはよくわからなかったです。このクローン作業する以前から、デュアルブートするときに、GRUB の起動ディスク選択画面?は出ていたので、もしかして、grub のファイルをいじらなくても自動で、clonezilla の選択肢が出てきて、clonezilla の起動ができたかもしれません。
なにはともあれ、作業の流れをまとめると以下の通りです。
この方法なら、Windows回復環境も含めてすべてのパーティションを維持したまま、新しいSSDに移行できます。作業後は、Ubuntuの稼働も安定し、Clonezilla を使って、1TBSSDに拡張して良かったです。
容量不足で悩んでいる方の参考になれば幸いです。