Windows な「ISO のマウント、コマンドラインから」

「outdated な話題」とも言い切れない、絶妙にニッチな話。

エロから始まった「mpplgem.py」は、いまではかなりのことが出来るようになっていて、ふと Disk Burning 系のソフトウェアと連携したら嬉しいかもなと、BurnAware の MekeISO とともに使えるようにしてみたりしている:

ワタシの mpplgen.py は shebang が「#! py -3」にしてあって、パスが通った場所に置いてある。
1 $ mpplgen.py --from_patte='*.mp3' baprj.bafl
2 $ "c:/Program Files (x86)/BurnAware Free/MakeISO" udf baprj.bafl "`pwd -W`/mycd.iso"

まぁ簡単に ISO を作れて嬉しいかもね、てことではあるんだけれど、色々考えてみるも、今どきちょっとこれの需要があんまし思いつかなくてな。むろんほんとに CD に焼きたいなら別よ、そうしない場合に、「ISO を仮想マウント出来るものを使ってウハウハしたい」なんてのはね、そんなにはないんだよなぁと。

ただ一応、「色んなプレイリストのフォーマットがあって、それのどれがワタシのお気に入りのプレイヤーでサポートされるのか?」なんてのを考えるよりは、システムによって「オーディオCD」と認識される「仮想マウント」なら多くのプレイヤーが素直に扱える、てのは、あるにはある。つまり「h:/」にマウントしたら「"c:/Program Files (x86)/AIMP/AIMP" h:」は、AIMP はオーディオCD再生のモードに入ってくれる。この「仮想マウント」を楽にやる方法、の話。

そもそも「OS として DOS を選択する」という、歴史的にはサイアクの決断がもたらしたのは、「DOS」の名が示す「Floppy Disk Tools」の通り、「ユーザが毎秒毎秒デバイスを意識し続けることを是とする」ということである。

何言ってるかわからんて? Unix がね、既に DOS の発明前にはあったわけだよ、Unix は「物理デバイスを設置して構成設定する人」(管理者)と「Unix を利用する普通の人」(一般ユーザ)をはっきり区別し、そして後者の人々は「/usr はマシンルームBに置かれている高さ3mの巨大ドラム型ハードディスクPの中である」ことを、「必要もないのに意識することはない」。マウントの作業を管理者が一度行ってしまえば、一般ユーザは /usr が物理的にどこにあるのかを意識しなくていい。この「抽象化」された美しい世界が既にあったのに、DOS はこれを無視し、先祖返りして「お前がアクセスしてるのは巨大ドラムPだ、Pを使いたきゃ P: でアクセスするんだぜべいべー」と、まぁ要するに抽象化をサボり、そしてこの30年以上前のこの間違った決断が、今でも Windows ユーザに影響を与え続けている、てわけである。

ちぅわけで、Unix では「ISO を仮想的にマウントする」という考え方そのものが、Unix が誕生したその日から理論的には可能だったのに対し、Windows はそれは、特殊なソフトウェアを使って行う特別なこと、であり続けていた。この状況が変化したのは、たぶん Windows 7 から、だったかな。芽は NTFS5 の誕生で既にあったのだけれど、ユーザがはっきり自覚できる形でサポートされたのは、記憶では 7 からだと思う。少なくとも、Windows 10 では、iso ファイルを「エクスプローラで開く」と、かつては DAEMON Tools や PowerISO が行ってきたのと同じこと、つまり仮想マウントしてくれるようになった。

でね。この「エクスプローラが仮想マウントを担ってくれる」のは大変ありがてーんだけれどもな。「エクスプローラ」なのが絶妙に鬱陶しい側面もあって。マウント、はいいのよ、開くだけでいいんだから。けれども、アンマウントがなかなかに不愉快なんだな、これが。やってみればわかるんだけど、「取り出し」(つまりアンマウント)すると、エクスプローラごと閉じちゃうんでやんの。エクスプローラが使いやすくて死にそうだ、なんて人はいなかろうけれど、だからといって、それでも「腐ってもシェル」であって、勝手に閉じられると作業に支障が出ることもある。たとえばお気に入りで常に開いときたいフォルダ、なんてのは、一つくらいはあるもんであろう。

というわけで、「エクスプローラの外でアンマウント操作出来たらいいのになぁ」て話。

「かつては特殊だった」ことがはっきり理解できる証拠が今でもちゃんと残っていて、面白いので「mountvol」で失敗してみるといいと思う。ワタシが言ってる意味が少しはわかるかなと思う。大事なのでもう一度強調しておくけれど、Unix における「マウント」とは、今の Windows でいう「仮想マウント」そのものだということね。Windows は、この「mountvol」がいうマウントと「仮想マウント」は全く別のことをし、前提となるインターフェイスも違う、てことよ。それが癇癪の種なわけだ。

正解は Mount-DiskImageDismount-DiskImage ね。ただこれね、「-ImagePath」経由以外がちょっとウザいのよね。以下では不満なケースも多々あるわけよ:

1 $ # マウント
2 $ PowerShell -Command Mount-DiskImage -ImagePath "`pwd -W`/mycd.iso"
3 $ # アンマウント
4 $ PowerShell -Command Dismount-DiskImage -ImagePath "`pwd -W`/mycd.iso"

マウントしたあとしばらく使ってるとするなら、元の ISO がどこにあったのか失念するなんかよくあることだろう。無論「エクスプローラ」でアンマウント出来るのだからまぁいいのだが、場所を失念したとしてもコマンドラインからアンマウント出来る方法があったほうが、そりゃぁありがたい。DevicePath が判明しているならこう:

1 $ # アンマウント (例によってスラッシュとバックスラッシュは同義なので、スラッシュが楽よ)
2 $ PowerShell -Command Dismount-DiskImage -DevicePath "//./CDROM1"

この「//./CDROM1」がわかるのかどうか、てことね。これがまぁ…いちぱつではいかんでね。答えはここに。h: というドライブレターにマウントされてることを知っている場合はたとえば:

1 $ PowerShell -Command '$r = Get-Volume -DriveLetter h | % { Get-DiskImage -DevicePath $($_.Path -replace "\\$")} ; $r.DevicePath'
2 \\.\CDROM1

この結果をさきほどの Dismount-DiskImage に渡せる、てこった。

なんつーか「エクスプローラが閉じないでいてくれたなら」てだけのことなのよね、本質的には。ただまぁ、そうでないとしてもコマンドライン操作で出来れば便利な局面は、ないことはないだろう、てこと。だとするならば、この「答え」はワタシにはかなり不満だ。うっとうしいよこれ。

あるいは「エクスプローラが閉じるくらいは我慢すればええやん」が精神衛生上は良いのかもしらんね…。