虎之助の徒然記

Dynabook AZ77のSSDへの換装 (4) NTFSには完全シャットダウンが必須

【概要】1TBのHDDの内容を500GBのSSDに縮小して入れようと思っています。そこで、まずはWindowsのシステムディスクをLinuxのgpartedコマンドを用いて、パーティションのリサイズを試みました。しかし、LinuxでWindowsのディスクをリサイズするためには、ハイバネーションの関係で、Windowsマシンを完全シャットダウンする必要があることが分かりました。

1. はじめに

 dynabookから取り出した1TBの内蔵ハードディスクの内容を500GBのSSDへコピーします。但し、1TBのハードディスクの内容を500GBに収めようとするのですから、使用するパーティションを縮小し、全体で500GB以下にする必要があります。

 この記事では、Linuxのgpartedを用いて、パーティション領域を縮小しようとして、つまずいたことについてまとめています。

2. 完全シャットダウンなしにLinuxでのリサイズは不可

 当然のことですが、1TBのハードディスクの使用領域は500GB以下でないと、パーティションを500GB以下に収めることはできません。今回のディスクの使用量は、400GB程度なので、うまくリサイズできれば、500GBのSSDに収まるはずです。

 Linuxのgpartedコマンドを使うと、パーティションの縮小・拡大・移動ができます。

 しかし、結論を先に言うと、Linuxのgpartedでは、少なくともWindowsでのシャットダウン時に完全シャットダウンしていないと、パーティションのリサイズはできません。

 まずは、完全シャットダウンを行うこと*1が必要でした。

3. gpartedでパーティションのリサイズ

3.1 gpartedを起動

 Linuxの場合、gpartedを使うとパーティションのリサイズを行うことができます。但し、今回、対象とするディスクは、ddでダンプしたファイルをloopデバイスを用いて認識させたものです(詳しくは、前の記事)。

 gpartedを起動すると、Windowsシステムの入っているパーティション(loop0p3)にオレンジ色の警告マークが示されます。また、詳細情報で操作ができない場合があると指摘され、実際、リサイズ・移動はできません。

$ gparted /dev/loop0
f:id:toranosuke_blog:20180909115759p:plain
Windowsのシステム領域(loop0p3)に警告マーク。

f:id:toranosuke_blog:20180905184804p:plain:w400
/dev/loop0p3 のパーティション情報。ntfs-3gはインストール済。

 そこで、対象のloop0p3をマウントしてみます。

$ mount -t ntfs /dev/loop0p3 /mnt/tmp1
$ gparted /dev/loop0

 すると、オレンジ色の警告マークが鍵マークに変わりました。この状態でもパーティションのリサイズ・移動はできません。

f:id:toranosuke_blog:20180905184615p:plain
mountした場合。/dev/loop0p3にはロックがかかり、リサイズ・移動できない。
ディスクの使用容量を黄色で表示。

3.2 読取専用マウントしかできない

 gparted の起動の前に、縮小対象となるパーティション /dev/loop0p3 をマウントしていますが、次の警告メッセージがでて、リードオンリー(読込専用)でマウントされます。

$ mount -t ntfs /dev/loop0p3 /mnt/tmp1/
The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
Falling back to read-only mount because the NTFS partition is in an
unsafe state. Please resume and shutdown Windows fully (no hibernation
or fast restarting.)

 読込専用でマウントされるので、gpartedでリサイズできないのも、もっともな話です。mountの警告メッセージからすると、対象ディスクは、予め完全シャットダウンをしておく必要があったようです。

 mount.ntfsのremove_hiberfileオプションを使って、hibernationのためのファイルを強制的に削除して、マウントすることを試みましたが、拒否されてできませんでした。

$ mount -t ntfs -o remove_hiberfile /dev/loop0p3 /mnt/tmp1/
The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
Failed to mount '/dev/loop0p3': 許可されていない操作です
The NTFS partition is in an unsafe state. Please resume and shutdown
Windows fully (no hibernation or fast restarting), or mount the volume
read-only with the 'ro' mount option.
  • remove_hiberfile オプションの説明
$ man mount.ntfs
NAME
     ntfs-3g - Third Generation Read/Write NTFS Driver

SYNOPSIS
     mount -t ntfs-3g [-o option[,...]]  volume mount_point
  
 OPTIONS
     remove_hiberfile
         When the NTFS volume is hibernated, a read-write mount is denied
         and a read-only mount is forced. One needs either to resume Win‐
         dows  and  shutdown  it  properly, or use this option which will
         remove the Windows hibernation file.  Please  note,  this  means
         that the saved Windows session will be completely lost. Use this
         option under your own responsibility.

4. 完全シャットダウンが必要だった

4.1 ハイバネーションが悪さする

 mountコマンドのエラーメッセージやコマンド説明にあるように、完全シャットダウンしない場合、LinuxではNTFSディスクへの処理は、mountもgpartedも読込処理に限定されていました。ハイバネーションの影響です。

 Linux上でもNTFSパーティションのリサイズはできますが、少なくとも、次を行わなければならないことが分かりました。

  • Windowsで完全シャットダウンをしなければならない

 ハイバネーションは、メモリ上に展開したファイルをディスク上へ退避する仕組み。完全シャットダウンしないとLinuxでは手に負えないため、処理は読取に限定しているということですね。

4.2 完全シャットダウンは外付けディスクで構わない

 後から気が付いたのですが、別のWindowsマシンに外付けディスクとして繋げて、そのマシンを完全シャットダウンしても、構いません。

 これならば、瀕死のHDDでWindowsを起動する必要はありません(瀕死のHDDはシャットダウンもできない状態だった)。

 実際、瀕死のHDDでも試しましたが、外付けディスクとしての完全シャットダウンは、ごく僅かなHDDへのアクセスだけで、短時間で終わります。mountコマンドによるマウントも読取専用ではなく、読み書き可能な状態でマウントができました。

5. 最後に

 完全シャットダウンを行えば、gpartedでも、パーティションの縮小はできそうです。

 しかし、瀕死のHDDを、再度、一週間近くかけて、ddダンプをする気にはなれなかったので、やり直しませんでした。今回は、アプリ丸ごと復旧させることは諦め、リカバリーディスクからクリアインストールすることにしました。

 ディスクイメージを縮小する試みは失敗しましたが、エクスプローラーでコピーしたバックアップやddダンプしたディスクイメージからデータを復旧できたので、一応はよしとしました。

 但し、クリアインストールしたディスクも、その後、いろいろやってお釈迦にして、2度目のクリアインストールをする羽目にはなったのですが...(付録参照)。

 Linuxで再挑戦したWIndowsの丸ごとコピー・リサイズについては次の記事でまとめます。

(2018/9/9)

関連記事

付録A:Windowsディスクの丸ごとddコピーで起動できるか?

A.1 セーフモードで起動できた!

 WindowsをクリアインストールしたディスクをddでHDDにコピーし、そのHDDから起動できるか確認しました。

 まずは、Ubuntu18.04のLiveUSBを作り、LiveUSBからdynabookを起動、内蔵ディスク(SSD)を外付けの2TBのHDDへddコピーしました。

$ dd if=/dev/sda of=/dev/sdc
   (内蔵SSD)→(外付けHDD)

 ddコピーした外付けディスクからWindowsを起動すると、、、正常起動できません。

 そうは言っても、セーフモードでは起動できました。

f:id:toranosuke_blog:20180906142939j:plain:w300f:id:toranosuke_blog:20180906142953j:plain:w300
f:id:toranosuke_blog:20180906143205j:plain:w300f:id:toranosuke_blog:20180906143236j:plain:w300
セーフモードなら、起動できた!

A.2 内蔵ディスクからWindowsが起動できなくなった!

 HDDから正常起動できるように、いろいろと設定を変えていたら、内蔵ディスクからの起動もできなくなってしまいました(冷汗)。

 Windowsのbcdbootコマンド(Microsoftの解説はここ)が原因ではないかと思います。

 Windowsの起動設定を破壊したようで、「回復」画面にしかなりません。セーブモードにさえ入れない状態となり、Windowsを再度クリアインストールする羽目になりました(涙)。

f:id:toranosuke_blog:20180906144525j:plain:w500
Windowsからのご臨終のお知らせ。
回復環境(F1キー)にもスタートアップ設定(F8キー)にも入れない。

A.3 Linuxでのハードルは高かった...

 外付けのHDD起動でもセーフモードでは起動できたので、ddコピーしたディスクを内蔵ディスクと入れ替えれば、起動できたのではないかと思います。

 そうは言っても、確実に起動できるか、分かりません。Windowsの場合には、専用のクローン化のツールがあるので、そちらを使うのが正しいのでしょう。例えば、EaseUS Todo BackupAOMEI Backupper などが人気があるようです。

 しかし、Linux freakな私としては、敗北感を感じます(笑)。

*1:「完全シャットダウン」は、Shiftキーを押しながら「シャットダウン」をクリックすればできます。また、"shutdown.exe /r /t 0"でも構いません。私は、いつもは、shutdownコマンドへのショートカットを作って、完全シャットダウンを行っています。