ハードディスクがCドライブとRecoveryパーティションしかない環境で、満タンになったCドライブに空きをつくる方法を紹介します。

OSはWindows7 Home Premiumです。なお、PCはCドライブに、空きがない以外は、正常に動作していることが前提です。Windowsディレクトリ内のディレクトリを移動させるので、リスクは大きいことをご理解ください。

今回は、Windowsディレクトリ内のinstallerディレクトリをUSBフラッシュメモリへ移動します。installerディレクトリには、インストールしたプログラムの情報が格納されているようです。アンインストールするときや修正、変更をするときに利用されるようです。

[概要]

  1. C:\Windows\installerを外付けのUSB-HDDかUSBフラッシュメモリに移動。
  2. C:\Windowsディレクトリから、別ドライブへ移動したinstallerへシンボルリンクを貼る。

【前提条件】

  1. ディスクのクリーンアップですべてを削除済み。
  2. Userディレクトリ内の不要ファイルも削除または、USBフラッシュメモリに退避している。
  3. Cドライブに空きはない。
  4. 調べると\Windows\winsxsと\Windows\installerが10GB以上の容量になっていた。
  5. ハードディスクには不良セクタやメモリのエラーなど不安定な動作につながる原因は存在しない。
  6. 「chkdsk c: /f」 と 「sfc /scannow」を実行し、異常がなく完了する。
  7. データを退避するUSB-HDDを最低2台用意する。(システムファイルバックアップ用、installer用)
  8. 本操作の危険性の告知。

<操作>

  1. HDDに不良セクタが無いことを確認。
  2. 「chkdsk c: /f」「sfc /scannow」が完了する。
  3. PCのHDDの内容(システムファイルも含む)を丸ごとバックアップ。
  4. junction.exeを準備する。
  5. C:\Windows\installerを移動。
  6. C:\Windows内に移動したinstallerへのシンボルリンクを貼る。(junction.exeを利用。)

1.HDDに不良セクタが無いことを確認。

フリーのHDD-SCANなどを利用して、不良クラスタがないかチェックします。

私は、通常、UbuntuのLive DVD(現在は16.04)を使い、SMARTで簡易チェックをします。

本当は、メモリテストも必要ですが、もしメモリにエラーが発生していれば、まず、普通に動作することは考えにくいです。とくに、10GBものデータをコピーしたり移動したりはまず無理です。すぐにエラーが発生します。

実は不良クラスタにもいくつか種類があって、数個発見されても、たまたまそのときだけは読み書きができたりして、運用に支障が感じられない場合もあります。メモリほど顕著に影響が見られない場合が多々あります。だから、かえって厄介です。気づかないまま運用していて、あるとき突然、クラッシュしたりします。

安全のために、不良クラスタが数個でもあれば、これからの作業は諦めて、新しいHDDを購入して、リカバリするしかないです。(工場出荷状態へ戻す。)

2.「chkdsk c: /f」「sfc /scannow」が完了する。

chkdskは、ディスク上のファイルシステムの整合性をチェックし、壊れたファイルシステムがあれば修復します。

cmdを管理者権限で開きます。
スタートボタン>「プログラムとファイルの検索」ウィンドウ内で、cmdと入力>上の方(プログラム)に「cmd」が表示されるので、「cmd」を右クリック>「管理者として実行(A)…」をクリック>実行の許可を求めてくるので、「はい」をクリック>コマンドプロンプト(コマンドが入力できる状態)が表示されます。(具体的な操作は、6.を参照してください。)

chkdsk c: /f と入力し、次回の起動時に実行するので、それで良いかどうか確認のために「Yes/No」を聞かれます。次回の起動時に実行するので、「Yes」を押下。そのあと、PC本体を再起動します。

再起動が始まって、Windowsのロゴが表示されたあと、黒い画面に変わり、chkdskが実行されます。しばらく時間がかかります。正常に完了すれば、勝手にWindowsのログイン画面が表示されます。(Windowsが起動する。)

もし、異常があれば下図のような修復作業が自動で進みます。無事に完了すればログイン画面が表示されます。

3.システムファイルをバックアップ。

もし、作業に失敗した場合、Windowsは起動しなくなる可能性大です。それでも、リカバリディスクがあれば工場出荷状態へ戻せますが、MS Officeなど重要なアプリケーションは個別にインストールしなおすことになります。もし、インストールDVD、プロダクトキー等がない場合は、購入しなければなりません。

このような煩わしさを防ぐために、HDDまるごとイメージ化してバックアップしておきます。もちろん、自分で作成したデータ類(ExcelやWord等のファイル)もバックアップしておきます。データファイルは、コピペで大丈夫ですが、システムファイルはコピーはできません

今回は、オープンソースソフトウェアのSystemrescuecdを利用します。

(1) Systemresucuecdでブート。

Systemrescuecdをダウンロードして、CDかDVDに焼き、そのCD(DVD)で、バックアップしたいPCをブートさせます。

図3:6)を選択し、Enterキーを押下する。(GUIで起動する。)
図4:22を入力し、Enterキーを押下する。(日本語キーボードが利用できる。)
図5:端末が開いたGUIが起動する。

(2) ddrescueコマンドでバックアップ。

バックアップするHDDのイメージを保存する外付けのUSB-HDDを接続します。もちろん、バックアップ元のHDDの容量以上のものが必要です。今回は、約60GBありました。USB-HDDの容量は1TBでした。

図5で、開いた端末に次のコマンドを入力します。

接続したUSB-HDDのパーティションを確認します。「fdisk -l」 と入力し、Enterを押下。

root@sysresccd /root % fdisk -l
Disk /dev/loop0: 405.6 MiB, 425336832 bytes, 830736 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

Disk /dev/sda: 59.6 GiB, 64023257088 bytes, 125045424 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: dos
Disk identifier: 0xbe0b1ea2

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 108267519 108265472 51.6G 7 HPFS/NTFS/exFAT
/dev/sda2 108267520 125044735 16777216 8G 1c Hidden W95 FAT32 (LBA)

Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 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: dos
Disk identifier: 0x6ea2d77f

Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 1953520064 1953518017 931.5G 7 HPFS/NTFS/exFAT

コマンド実行の結果、最終行に、「/dev/sdb1」とあるのを確認します。普通、PCに最初から装着されているHDDのパーティションは/dev/sda1や/dev/sda2とディバイス名「/dev/sda」のあとに数字付きで表示されます。

次に接続した外付けのディスクなどは、/dev/sdbのようなディバイス名で表示され、パーティションは「/dev/sdb1」となります。

外付けのUSB-HDDのパーティション(/dev/sdb1)を/mnt/windowsにマウントします。コマンドは、ntfs-3gを使います。

root@sysresccd /root % ntfs-3g /dev/sdb1 /mnt/windows

つまり、/mnt/windowsが、外付けのUSB-HDDとして認識されています。/mnt/windowsを外付けのUSB-HDDと思って操作(コピーや貼り付けなど)できます。ちなみに、コマンドlsを使い、「ls -la /mnt/windows」と入力すると、外付けのUSB-HDDの内容がすべて表示されます。

それでは、さっそく、/mnt/windows内に、バックアップ用のディレクトリを新規作成します。コマンドは、mkdirを使います。

root@sysresccd /root % mkdir /mnt/windows/backup20170812

ここで、「ls -la /mnt/windows」とコマンドを入力してみると、「backup20170812」というディレクトリが作成されています。

さて、いよいよ、PCのHDDの内容をすべてバックアップします。コマンドは、「ddresucue」を使います。

オプションとして、「-n:読み込めない時は0で読み取る。」「-v:状態を表示する。」を設定します。引数は、3つあります。第1引数が、バックアップ元のパーティション(path)。今回は、/dev/sda1です。第2引数が、バックアップ先のpath。今回は、/mnt/windows/backup20170812/sda1.img。
sda1.imgは、ファイル名ですが、これが実際にバックアップで作成されるファイルとなります。サイズはHDDの容量だけなので、かなり大きくなります。だから、外付けのUSB-HDDのサイズは元のHDDのサイズより大きくする必要があります。
第3引数は、/mnt/windows/backup20170812/resucue.log。読み取りエラーの状況を記録するログです。もし、読み取りにエラーが発生すれば、その場所(セクターの番号)が記録され、リトライしたい場合に、最初から読み直さず、エラーが記録された場所から再読み込みができます。リトライしたいときは、「-r」オプションを利用します。「-r 3」とすれば、3回読み込みを試みます。

root@sysresccd /root % ddrescue -n -v /dev/sda /mnt/windows/backup20170812/asus.img /mnt/windows/backup20170812/rescue.log
GNU ddrescue 1.21
About to copy 64023 MBytes from /dev/sda to /mnt/windows/backup20170812/asus.img.
Starting positions: infile = 0 B, outfile = 0 B
Copy block size: 128 sectors Initial skip size: 128 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
ipos: 64023 MB, non-trimmed: 0 B, current rate: 20865 kB/s
opos: 64023 MB, non-scraped: 0 B, average rate: 77603 kB/s
non-tried: 0 B, errsize: 0 B, run time: 13m 45s
rescued: 64023 MB, errors: 0, remaining time: n/a
percent rescued: 100.00% time since last successful read: 0s
Finished

errors: 0 となっています。/mnt/windows/backup20170812に、無事に、sda1.imgが作成されました。これを使って、ddコマンドを実行すれば、いつでも元の状態に戻せませます。もちろん、元に戻ったとしても、Cドライブの空きは0のままですが。

4.junction.exeを準備する。

マイクロソフトでは、システムファイル等の削除や移動はしないように警告しています。したがって、別ドライブへリンクを貼ることにします。mklinkコマンドがwindows7では使えますが、今回は、次のマイクロソフトのサイトからjunction.exeをダウンロードして利用します。もちろん、mklinkでも同様のことができます。

下記のリンク先内に、「Junctionのダウンロード」という語句があるので、それをクリックします。

https://technet.microsoft.com/ja-jp/sysinternals/bb896768.aspx

junction.exeは、開発がストップしているようなので、できればmklinkをこれからは使うべきでしょう。

Junction.zipがダウンロードされます。ファイルはzipで圧縮されているので、解凍します。Windows7なので、Junction.zipを右クリックし、「すべて展開」をクリックします。Junctionフォルダができるので、それを、Cドライブ直下に移動させます。

5.C:\Windows\installerを移動。

installerディレクトリの容量よりおおきいサイズのUSBフラッシュメモリを準備します。
そのUSBフラッシュメモリ内に新しくWindowsディレクトリを作成する。
新規に作成したWindowsディレクトリにinstallerディレクトリをコピーします。コピーが終わると、CドライブのWindowsディレクトリ内のinstallerディレクトリを削除します。ゴミ箱も空にします。そのままだと容量は空きません。

つまり、USBフラッシュメモリがDドライブの場合、

D:\Windows\installer

というディレクトリ構成になります。

6.C:\Windows内に移動したinstallerへのリンクを貼る。

(1) 管理者権限でcmdを起動します。

① Windowsスタートメニューの「プログラムとファイルの検索」に、「cmd」と入力し、Enterを押下。
② 「cmd」を右クリック、「管理者として実行」をクリック。
③ 「ユーザアカウント制御」が開くので、「はい」をクリック。

(2) junction.exeを実行。

Junctionフォルダ内には、junction32.exeとjunction64.exeが入っています。実行する環境に合わせて使い分けるので、各自のOSの種類に合わせてください。今回のOSは64bitなのでjunction64.exeを利用します。

① Junctionディレクトリ(フォルダ)へ移動。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\Windows\system32>cd c:\Junction\

② Junction64.exeの実行。リンクを貼る。移動先のUSBフラッシュメモリはDドライブの場合。

c:\Junction>junction64.exe c:\Windows\Installer d:\Windows\Installer

Junction v1.07 – Creates and lists directory links
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals – www.sysinternals.com

Created: c:\Windows\Installer
Targetted at: d:\Windows\Installer

このとき、CドライブのWindowsディレクトリ内にinstallerディレクトリは作成しないでおきます。Dドライブのinstallerディレクトリへのリンクが自動的に貼られます。

念の為に、システムファイルの整合性をチェックしておきます。

c:\Junction>sfc /scannow

システム スキャンを開始しています。これにはしばらく時間がかかります。

システム スキャンの検証フェーズを開始しています。
検証 100% が完了しました。

Windows リソース保護は、整合性違反を検出しませんでした。

作業完了。

実際に運用するときは、USBフラッシュメモリはPC本体にさしたまま利用します。

<<危険性の告知>>

C:\Windows\Installerをジャンクションにしてはいけないらしい

上記のサイトでは、出所元が明記されていないので、真偽が確認できません。警告というれべるですね。

Can you move the windows installer folder using junctions?

上記、海外のサイトでは、WindowsXPでは、不具合が報告されているようです。2件。どちらも、プログラムをインストールすると移動先(リンク元)のinstallerが削除され、Cドライブのinstallerも消え、あらたにinstallerが作成され、それはjunction(リンク)ではない。というものです。