WindowsXPをクローンしたかった話
## 4GBなWindowsXP
みょんなことからWindowsXPマシンを手に入れたのだが、内蔵ドライブが4GBにXPがギチギチに入っていてすごく使いづらい。何やらドライバーが足りずサウンドが鳴らないのだが、ドライバーのインストールですら不安である。
このマシン、SATA端子はついておらず、miniPCIeがストレージなようだ。mSATAならまだ入手性もよかったのだがminiPCIeなんて持ってない
よく見るとSDカードスロットがあるではないか。余ってるSDカードにOSをクローンして(ddコマンド)、パーティションを拡張(GParted)すれば良いのでは?と思いつく
## いざクローン
32ビットなCPUだったもんで、Puppy linuxを起動。内蔵ドライブがsdc、クローン先のSDカードがsdbだったので
```sh
# dd if=/dev/sdc of=/dev/sdb bs=150M
```
などとし、別のterminalで
```sh
# watch -n 10 pkill -USR1 dd
```
で進捗を監視してみた。
↓参考文献
## 1回目:いきなりパーティション拡張して失敗
クローンが終わったのでGPartedを起動してディスクいっぱいまで拡張した。再起動してBIOS設定からブートオーダーでSDカードを1番目にして起動。ブルースクリーンが一瞬見えて即強制再起動してしまった。なるほど無理やりはダメなのか。
## 2回目:パット見はよさげだが…
このままではダメなので再度クローンを実行。それにしても、sdcとsdbを書き間違えた瞬間WindowsXPが終わるので怖すぎる。XPのインストールディスクなんて持ってないので貴重なXPというわけだ。
今度は余計な事せずクローンだけして再起動。クローンしたWindowsXPからディスクの管理で拡張すればいいだろうという考えだ。これなら安心安全だろう。
今度はブルースクリーンなどなく普通にデスクトップへ。おぉ、なんと簡単なのだろうと思ったのもつかの間、ディスクの管理を見てみるとCドライブとして内蔵ドライブから起動しているではないか。え?なんで??
たぶんマスターブートレコード(MBR)に、内蔵ドライブのアドレスが書いてあったのではないかと予想。だから、1回目はパーティションの大きさを書き換えて、MBRは書き換えなかったからエラー落ち、2回目は、MBRをパスするも結局MBRが内蔵ドライブを読むように書かれているためSDカードから起動できなかったと思われる。
## 次回予告(というか記事の追記をする予定なのだ)
ちょうど同世代くらいのマシン(「別マシン」と呼称)がもう1台あり、こちらはHDDが簡単に取り外せるので取り外して、SDカードのみの状態にして、
```
bootsect /nt52 sys /mbr
```
を試してみたいのだ。
ちなみに別マシンからSDカードブートしたらもちろん一瞬ブルースクリーンからの強制再起動なのだ。
RPGツクールメモ
ただのメモだよ。ネット上に転がってる怪しいpythonスクリプトを実行しちゃぁ、いけないよ…ヒッヒッヒ……
(なんか知らんけどmarkdown使えないよ。まあただのメモだからどうでもいいね。)
```py
import glob
filelist=glob.glob("*") #同フォルダ内の全ファイルリストを取得
for g in filelist:
if not g[-6:]=="rpgmvp": #ファイル名に.rpgmvpがあるか確認
#print("no")
continue
file=open(g,"rb")
bytestr=file.read().hex() #bytes型で読ん(.read())でhexなstr型(.hex())にする。'5250474D560000...'となる
file.close() #忘れないうちにcloseする
pnghead="89504e470d0a1a0a0000000d49484452" #pngの先頭16バイト分
png=bytes.fromhex(pnghead+bytestr[64:]) #rpgmvpの先頭32バイトを書き換えてbytes型にする
pngfilename=g[0:-6]+"png" #hoge.rpgvmpをhoge.pngに変換。先頭(0)から末尾-6まで+"png"
savefile=open(pngfilename,"wb") #bytes型で書き込む準備
savefile.write(png) #書き込み
savefile.close() #忘れぬうちにcloseする!特にwriteは気をつけろ!!
```
追記
別のバージョンのRPGツクールで、".png_"とかいう拡張子を使ってるやつがあったけど、中身は同じだったのでそっちにも対応した。
```py
import glob
filelist=glob.glob("*") #同フォルダ内の全ファイルリストを取得
for g in filelist:
type="none"
if g[-6:]=="rpgmvp": #ファイル名に.rpgmvpがあるか確認
type="rpgmvp"
elif g[-4:]=="png_":
type="png_"
if type=="none":
continue
file=open(g,"rb")
bytestr=file.read().hex() #bytes型で読ん(.read())でhexなstr型(.hex())にする。'5250474D560000...'となる
file.close() #忘れないうちにcloseする
pnghead="89504e470d0a1a0a0000000d49484452" #pngの先頭16バイト分
png=bytes.fromhex(pnghead+bytestr[64:]) #rpgmvpの先頭32バイトを書き換えてbytes型にする
if type=="rpgmvp":
pngfilename=g[0:-6]+"png" #hoge.rpgvmpをhoge.pngに変換。先頭(0)から末尾-6まで+"png"
elif type=="png_":
pngfilename=g[0:-4]+"png"
savefile=open(pngfilename,"wb") #bytes型で書き込む準備
savefile.write(png) #書き込み
savefile.close() #忘れぬうちにcloseする!特にwriteは気をつけろ!!
```
RAW化したSSDを直せなかった話
最初に注意。この記事はタイトルにもある通り「直せなかった」ので読むだけ時間の無駄かもしれません。直せなかったとはいえある程度のデータ(動画ファイル、ISOファイルのでかいファイル、ソースコード等の小さいファイル)を復元しているので、そこに興味がある人は読む価値があるかもしれません。
僕はADATA LEGEND 800の1TB版をm.2 USBケースに入れてUSBメモリ代わりとして使っている。3.0対応のCtoCケーブルと2.0のAtoCケーブルしか持ってないので、ThunderBolt端子があればそっちにつないで運用している。
普段使ってないパソコンのThunderBolt端子にSSDを接続したところ、「ドライブのスキャンをせよ」といったメッセージが表示され、スキャン、「エラーが見つかったので修復しろ」と言われた(このときにはまだ拒否権はある)
その時なんとなく「修復する」を選んでしまった。これが運の尽きであった。

エラー修復の進捗バーが9割くらいのところで止まって動かない。通常はエラー修復はたいして時間のかからないもののはず(かつてUSBメモリやSDカードでも行ったことが何度かある)。待ち続けていると「エラーは修復できませんでした」との表示が。詳しい理由はもはや不明であるが、パソコン側のUSB-C端子が弱かったのではないかと予想。普段使っていないパソコンなのでそこまで気が回らなかったのだ。つまりエラー修正というセンシティブな作業中にノイズまたは電力の喪失が起こったからクリティカルダメージを負ったのではないかという予測だ。これによりSSDの全領域がRAWになり読みだせなくなった。
こういうのは古明地フランさんの動画でよく見るから、通例通り「TestDisk」を使えば簡単に直せるだろうと思っていた。僕のパーティションはNTFSの1つだけで(たぶん)GPTだからEFI GPTを選ぶ。Analyze→Stop→20時間くらいかけてdeeper searchし、ドライブ名を発見し「P」キーでファイルリストを表示すると、
Can’t open file system. Filesystem seems damaged
と表示されてダメそう。えぇ……
仕方がないのでEaseUS Data Recovory Wizard Free版を試す(こういう商用ソフトは使いたくないのだが)。普通にファイル一覧が出てきた。free版では合計500MBまでという制限付きで復元できる。よって動画データなどはこのソフトで復元すべきではない。他にバックアップを取っていなかったVisualStudioのソースコードのデータを復元した(合計3MBくらい)
次にTestDiskに付属したQPhotoRecを使って動画とISOを取り出す。Ab○ma TVから保存したアニメとかゲームディスクのISOとかのでかいものを復元したい。これらはディレクトリ構造がわからなくても中身を見れば何とかなる。QPhotoRecを起動して保存先ディレクトリ(近くの店で256GBのSDカードが激安販売してたのでこれを買ってきた)を指定し、ファイルフォーマットを「mov」と「iso」にチェックする。ちなみに画像ファイルはどうした?と問われるかもしれないが、僕にとって画像ファイルは超重要なので他にバックアップがあるので大丈夫なのだ(画像ファイルをphotorecしたら仕分けに骨が折れるのは間違いない)。1~2時間くらいで無事救出できた。
これで欲しいデータは粗方救出できた。再度EaseUSでファイル一覧を確認し、500MBの範囲(500MBとはさっきのと合計)内でさらに欲しいのを救出し、
わかったこと
EaseUS Data Recovory Wizard Free版は、写真などはプレビュー表示が可能なうえ、プレビューだけなら復元可能サイズ500MBを消費しないので他に回せる
SDカードは書き込みが10MB/sなので救出先のドライブとしては向かない…
TestDiskはくっそ時間がかかるうえに万能ではない。僕は不器用で、何度か中止したり間違ってウィンドウを消したりしてるのでTestDiskに丸2日は捧げている。もっとかも
QPhotoRecはGUIなのでいくぶんわかりやすい
EaseUS製以外の復元ソフトも試したが結果は以下:
・MiniTool:公式サイトでは1024MB分は無料で復元できると言っているのに復元させてくれなかった
・AOMEI MyRecover:そもそもディレクトリ構造が出てこなかった
EaseUS製はしっかり500MB分を数えていて、アプリを閉じようと「あと○○MB復元できるよ」と教えてくれる。流石である。(ステマじゃない。そもそも商用ソフトは使いたくない。さっさとオープンソースで万能復元ツールでてこないかな、といつも思っている)