彷徨えるフジワラ

年がら年中さまよってます

Solaris で cp932 なファイル名を CD-ROM に焼く

Solaris 環境でデータ CD/DVD を焼く場合、GUI 経由なら GNOME デスクトップの "CD/DVD Creator"(「場所」(Places)⇒「CD/DVD」で起動)を使用して、CUI ベースなら「CD/DVD の作成方法」を参考にコマンドをあれやこれやすれば、特に問題無く作業は完了する筈。

但し、CUI 経由で焼く場合は注意が必要で、cdrw(1) のマニュアル上は:

If cdrw finds a single such device, it uses that device as the default CD or DVD writer for the command.

When more than one CD or DVD writer is connected to the system, use the -d option to indicate which device is desired.

と書かれているけど、実際には1台しかデバイスが繋がっていない場合でも、"-d" オプションによる指定は必須。

単にビルド/リビジョンの問題なのかもしれないけど、"cdrw -l" で1台しかデバイスが表示されない状況で、ウェブページ等の実行例で紹介されているようにデバイスを省略すると、見事に core dump してしまう一方で、"-d" でデバイスを明示すると問題なく処理が進む。
まぁ、これ以外は至って順調。MS-Windows 環境での CD 焼きが普及する過程で「書き込み中はマウスも動かすな!」とか言っていた頃が嘘のような簡単さだなぁ。

で、これだけではアレなので、普通の手順では上手く行かない場合の話を。

例えば日本語 MS-Windows 上で日本語ファイルを使用する場合、ファイル名符号化には問答無用で cp932(Shift-JIS の方が通りが良いかな?)が使用される。

CVS を始めとする幾つかの構成管理ツールは、ファイル名符号化中立(e.g.: リポジトリ内部では UTF-8 等で保持しつつ、環境に応じた符号化で取り出す)な仕組みにはなっていないので、日本語 MS-Windows 上でリポジトリにコミットされた日本語ファイル名を持つファイルは、Solaris 環境下で取り出してもファイル名符号化方式は cp932 のまま(Mercurial の場合も)。

この辺の方針/哲学的な話は議論百出なので今回はパスするけど、(Open)Solaris の標準ファイル名符号化方式は UTF-8 なので、こういったファイルを含む領域を CD/DVD に焼きたい場合、普通に考えたら通常の手順では上手く行く筈が無い。

で、mkisofs の man ページをつらつらと眺めていると:

     -input-charset charset
          Set up the input charset that  defines  the  characters
          used in local file names.  To get a list of valid char-
          set names, call mkisofs -input-charset help. To  get  a
          1:1  mapping,  you  may use default as charset name. If
          the input charset has not been set up from  the  locale
          in  the  environment,  the  default  initial values are
          cp437 on DOS based systems and iso8859-1 on  all  other
          systems.   See  CHARACTER  SETS  section below for more
          details.

          If -input-charset has not been specified,  it  will  be
          set  up from the locale in the environment. If you like
          to disable this automatic setup, use the  empty  string
          as locale name.

よしよし。これを設定すれば、ローカルファイルシステム上のファイル名符号化方式を指定値で処理してくれる筈なので、非標準な cp932 で符号化したものでも大丈夫な筈。

mkisofs \
    -ldots \
    -allow-lowercase \
    -allow-multidot \
    -input-charset cp932 \
    -J \
    -r \
    -o 書き出し先イメージファイル \
    -V "ボリューム名" \
    書き出し対象ディレクトリルート

"-J" で Joliet 形式を指定しているのは、日本語ファイル名を使うような状況なら、ISO-9660 標準のファイル名長に収まらないファイルぐらいあっても不思議ではないから。ま、保険ってことで。

出来上がった ISO イメージファイルを、VirtualBox 上の MS-Windows から光学ドライブとして参照してみると、無事日本語ファイル名でアクセスできる。CD に焼いたものを(VirtualBox 側から)参照しても大丈夫なので問題無い感じ。

"-input-charset" オプションを指定しない場合の挙動は面倒なので確認してないけど、Joliet 形式がファイル名を UTF-16 で固定的に扱うことを考えると:

cp932 のファイル名を UTF-8(ロケール設定でのデフォルトの文字コード)だと思って UTF-16 に変換する過程で文字化け

という事態になることは明白。

IE の HTML 解釈におけるお節介具合を考えると、ひょっとしたら「これは誤変換された cp932 符号化ファイル名かも?」と気を利かせて推測してくれるのかもしれないけど、流石にその可能性は薄いよね? > MS-Windows

ちなみに、「CD および DVD への書き込み (手順)」において、データ CD またはデータ DVD 用の ISO 9660 ファイルシステムを作成する方法として、以下の手順が書かれているけど:

  1. 空の CD または DVD をドライブに挿入します。
  2. その新しい CD または DVD 上に ISO 9660 ファイルシステムを作成します。
  3. ファイルシステムを CD または DVD にコピーします。

上記手順の2番目は、この時点ではまだ CD/DVD には書き込んでないことから、どちらかというと:

その新しい CD または DVD 上に作成する ISO 9660 ファイルシステムのイメージを作成します。

の方が正しい気が。

英語版の記述だと、予想通りというか:

Create the ISO 9660 file system on the new CD or DVD

となっているけど、この "on" は、"create" ではなく "file system" に掛かっているんじゃないかな?