linuxwindows

USBに作成した回復メディアをファイルとして管理する

Windows10もダウンロード提供されるようになったことで,
そろそろWindows7や8からアップデートしてみようという人も居るんじゃないかと思います。
今回はUSBメモリに作成した回復メディアをファイル化する方法をメモっておきます。

まえがき

Windows10のアップデートは,Windows7や8からのアップデートの場合は
一定期間であればアップデート後に元の環境に戻すことができるのですが,
そもそもアップデートに失敗した場合は回復メディアがないと回復しようがなくなってしまうので,
先に作成しておくのがオススメです。

で,この回復ディスク,その昔はDVDを作成したりできたのですが,
最近は8GB以上の容量を持つUSBドライブに作成するようになっています。

最近のマシンはほとんどUSBブート対応してますし,
DVDより読み込みも早いのでUSBドライブに作成できるのは理にかなっているとは思うんですが,
一つだけ問題があるとすると,作成後にそのUSBドライブを他の用途に使えないというのがあります。

DVDなら1枚高々数十円で,再利用できないのでそんなものかと思いますが,
USBドライブは安くなったとはいえ,
結構手元にあるとデータの移動だとか細々した用途に使いたくなってしまい,
その都度フォーマットしてたりして間違って作成しておいた回復ドライブを消しかねないとも限りません。

そこで,今回はUSBドライブに作成した回復ドライブをイメージファイルにして,
NASなどに置いておく方法を考えたいと思います。

今回は試しに,Windows8(8.1)の回復ディスクでやってみたいと思います。

# ちなみに Windows8の回復ディスクの作り方は割愛します。。
#(普通にコンパネからRecovery→Create recovery media)とかでUSBドライブに作れる。

Windowsで保存する場合はUSB Image Tool とかで
デバイスごとイメージ化して保存するのが良さそうです。

ただこの方法だと例えば16GBのUSBドライブで作った回復ディスクは
16GB使ってなくても16GBのイメージファイル
になってしまいますし,
イメージ化したファイルを焼き戻すにしても16GB以上の
USBドライブが必要になってしまいます。

そこで,この記事ではddでサイズを最適化したバックアップ用の
イメージファイルを作りたいと思います。

追記:以下の方法でイメージを作成するとなぜか
USBメモリに書き戻した時にイメージが破損します。
もし実際にバックアップする場合は,
対策を一番下に書いているのでそっちを参考にしてください。

 

1. イメージファイルを作る

USBドライブに作成した回復ディスクをddでイメージ化します。
これは至極簡単で,ddで吸い出すだけです。

$ sudo dd if=/dev/sdb of=miix2_8_windows8.1_recovery_usb.img bs=512

 

2. パーティションサイズを調整する

ddでUSBドライブの中身を吸い出したら,
パーティションサイズを調整するためにマウントします。
今回のイメージファイルはUSBドライブまるごとコピーしているので,
loopbackとしてマッピングします。

$:~/Desktop$ sudo losetup /dev/loop0 lenovo_miix2_8_windows8.1_recovery_usb.img 
$:~/Desktop$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 298.1G  0 disk 
├─sda1   8:1    0   1.2G  0 part 
├─sda2   8:2    0  59.6G  0 part 
├─sda3   8:3    0   9.8G  0 part 
├─sda4   8:4    0     1K  0 part 
├─sda5   8:5    0   7.8G  0 part [SWAP]
├─sda6   8:6    0  59.6G  0 part /
└─sda7   8:7    0 160.2G  0 part /export
loop0    7:0    0  14.9G  0 loop 

 

loopbackとしてマッピングしたので,partprobeを使ってパーティションを探します。

$:~/Desktop$ sudo partprobe /dev/loop0 
$:~/Desktop$ lsblk
NAME      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda         8:0    0 298.1G  0 disk 
├─sda1      8:1    0   1.2G  0 part 
├─sda2      8:2    0  59.6G  0 part 
├─sda3      8:3    0   9.8G  0 part 
├─sda4      8:4    0     1K  0 part 
├─sda5      8:5    0   7.8G  0 part [SWAP]
├─sda6      8:6    0  59.6G  0 part /
└─sda7      8:7    0 160.2G  0 part /export
loop0       7:0    0  14.9G  0 loop 
└─loop0p1 259:0    0  14.9G  0 loop

こうすると /dev 以下にloop0p1が見えるはずです。

# kpartxでマッピングする手もあるのですが,
# kpartxでマッピングしてしまうとパーティションが/dev/mapper以下にマッピングされてしまい,
# partedで上手くパーティションを認識できないのであえてこうしています。

次にパーティションのサイズを調整するため,partedとかgpartedでパーティションサイズを調整します。
# 今回は分かりやすさ優先でgpartedを利用。

evilmaster@baraquiel:~/Desktop$ sudo gparted /dev/loop0

Screenshot--dev-loop0 - GParted

これでパーティションの使用容量が分かるので,
パーティションサイズをイメージサイズに縮小します。
コツは,FAT32の場合NewSizeでスライダーで縮小できる最小サイズよりも
20MBほど余裕をとっておきます。そうしないとFAT32が壊れる場合があるようです。

Screenshot-Resize-Move -dev-loop0p1  Screenshot--dev-loop0 - GParted-1

パーティションサイズを縮小したら,loopbackのマッピングを解除します。

$:~/Desktop$ sudo losetup -d /dev/loop0 
$:~/Desktop$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 298.1G  0 disk 
├─sda1   8:1    0   1.2G  0 part 
├─sda2   8:2    0  59.6G  0 part 
├─sda3   8:3    0   9.8G  0 part 
├─sda4   8:4    0     1K  0 part 
├─sda5   8:5    0   7.8G  0 part [SWAP]
├─sda6   8:6    0  59.6G  0 part /
└─sda7   8:7    0 160.2G  0 part /export

これでパーティションサイズが調整されたイメージファイルが出来上がります。

 

3. イメージファイルのサイズを調整する

パーティションサイズの調整だけではファイルサイズは縮小されないので,
今度はファイル自体を切り詰めて小さくします。
そのためには,まずイメージファイルの正しい終端を見つける必要があります。

そこで,partedでサイズ変更後のパーティション終端セクタを調べます。

$:~/Desktop$ sudo parted lenovo_miix2_8_windows8.1_recovery_usb.img 
GNU Parted 3.2
Using /home/xxxxxxxxx/Desktop/lenovo_miix2_8_windows8.1_recovery_usb.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s (設定しないとKB表示になるはず)                                                           
(parted) p
Model:  (file)
Disk /home/xxxxxxxxxx/Desktop/lenovo_miix2_8_windows8.1_recovery_usb.img: 31291392s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End        Size       Type     File system  Flags
 1      2048s  12378111s  12376064s  primary  fat32        boot, lba

(parted)

終端が12376064セクタで終わってるのがわかります。

1セクタ=512Bで,セクタ番号は0 originなので
ファイルの終端は 12376065 * 512 Bとなります。

ファイルの終端がわかったので,truncateコマンドでイメージファイルを切り詰めます。

$:~/Desktop$ truncate -s $[12376065*512] lenovo_miix2_8_windows8.1_recovery_usb.img 
$:~/Desktop$ ll
total 6188140
-rw-r--r-- 1 evilmaster evilmaster 6336545280 Aug  2 18:55 lenovo_miix2_8_windows8.1_recovery_usb.img
...

これで16GBのイメージファイルが約6GBになりました。

4. テストする

はい。必ずテストしてください。
ひょっとするとなんかのミスでイメージファイルが壊れていて,
起動不可だと目も当てられないので。

$:~/Desktop$ sudo dd if=lenovo_miix2_8_windows8.1_recovery_usb.img of=/dev/sdb


5. 後記(むしろこっちが重要)

実は上の方法で作るとイメージファイルがどういうわけか壊れます。(苦笑
色々と試行錯誤して調べた結果partedのfat32の扱いがバグっているようです。
ですので,現時点では上の方法はオススメしません。

# やると何故かWindows側でフォーマットされてませんとかになってしまう。

とりあえず安全な方法として,Partition Wizard Homeなどを使いWindows上で
USBメモリのパーティションサイズをリサイズします。

次に,このリサイズしたパーティションをddでイメージ化します。
その時に,必要なのはUSBドライブ全体のイメージではなく,
あくまでパーティションの末尾までをddすれば十分なはずです。
そこで,以下の例は16GBのmicroSDにバックアップした例です。

$:~$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 298.1G  0 disk 
├─sda1        8:1    0   1.2G  0 part 
├─sda2        8:2    0  59.6G  0 part 
├─sda3        8:3    0   9.8G  0 part 
├─sda4        8:4    0     1K  0 part 
├─sda5        8:5    0   7.8G  0 part [SWAP]
├─sda6        8:6    0  59.6G  0 part /
└─sda7        8:7    0 160.2G  0 part /export
mmcblk0     179:0    0  14.9G  0 disk <- 16GBのmicroSD全体
└─mmcblk0p1 179:1    0   5.9G  0 part <- Windows上でパーティションを縮小

 

次に,fdiskでパーティションの状態を調べます。

$:~$ sudo fdisk /dev/mmcblk0 
[sudo] password for xxxxxxxx: 

Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/mmcblk0: 14.9 GiB, 16021192704 bytes, 31291392 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: 0x00000000

Device         Boot Start      End  Sectors  Size Id Type
/dev/mmcblk0p1 *     2048 12386303 12384256  5.9G  b W95 FAT32


Command (m for help): 

パーティションの終端が12386303セクタなので,ddで切り出すサイズは (12386303+1)*512B となります。
なので,このサイズでddで切り出します。

$ sudo dd if=/dev/mmcblk0 of=recovery.img bs=512 count=12386304

 

これで正常にバックアップできているかをもう一度USBメモリにddで焼き戻してみて,正しく焼けていれば完璧です。

# まさかpartedがバグってるとは思わなんだ。。

$:~/Desktop$ dpkg -al|grep parted
ii  gparted                                           0.19.0-2                             amd64        GNOME partition editor
ii  libparted-fs-resize0:amd64                        3.2-7                                amd64        disk partition manipulator - shared FS resizing library
ii  libparted2:amd64                                  3.2-7                                amd64        disk partition manipulator - shared library
ii  parted                                            3.2-7                                amd64        disk partition manipulator

 

Leave a Reply

Your email address will not be published. Required fields are marked *