玩式草子─ソフトウェアとたわむれる日々

第92回 xorrisoとUEFIブート再び[その2]

この記事を読むのに必要な時間:およそ 6 分

-mapオプション

"-add"オプションのiso_rr_path=disk_pathと同様の機能を実現するためのオプションが-mapです。このオプションのmanページの記述も参照しましょう。

-map disk_path iso_rr_path

Insert file object disk_path into the ISO image as iso_rr_path.
If disk_path is a directory then its whole sub tree is inserted into the ISO image.

disk_pathで指定したファイルオブジェクトを,ISOイメージ上のiso_rr_pathとして書き出す。もしdisk_pathがディレクトリだった場合,そのディレクトリ以下にある全てのファイルやサブディレクトリがISOイメージに書き出される。

-addオプションの場合は"iso_rr_path=disk_path"という形式だったのに対し,-mapオプションでは"disk_path iso_rr_path"と,順番が逆になるのが注意点でしょうか。

たいてい"-map"で間に合うので使う機会は少ないものの,単独のファイルやディレクトリのみを書き出すための-map_sigleというオプションもあります。このオプションもmanページを引いておきましょう。

-map_single disk_path iso_rr_path

Like -map, but if disk_path is a directory then its sub tree is not
inserted.

-map と似た動作だが,disk_path がディレクトリだった場合,そのディレクトリ以下は書き出さない。

先に紹介したファイル名を変更して書き出す例は,"-map"オプションを使うとこのようになります。

$ xorriso -dev disc03.iso \
      -map NHK/ラジオ英会話_2017_04_001.m4a episode01.m4a \
      -map NHK/ラジオ英会話_2017_04_002.m4a episode02.m4a \
      -map NHK/ラジオ英会話_2017_04_003.m4a episode03.m4a

"-map"オプションの場合,ファイルシステム上のファイルやディレクトリとISOイメージ上のファイルやディレクトリは一対一になるので,複数のファイルを名前を替えつつ書きこむ,といった処理は面倒です。そのため,"-map"に反復機能を持たせた-map_lというオプションもあります。

-map_l disk_prefix iso_rr_prefix disk_path 

Perform -map with each of the disk_path parameters.  iso_rr_path
will be composed from disk_path by replacing disk_prefix by
iso_rr_prefix.

-mapをdisk_pathで指定したそれぞれの対象に実行する。iso_rr_pathはdisk_pathのうちdisk_prefixの部分をiso_rr_prefixに変更する形で生成される。

このオプションを使って,ラジオ英会話の4月分の番組をそれぞれepisode_XXという名前に変更して書き出すにはこういう指定になります。

$ xorriso -dev disc03.iso -disk_pattern on \
     -map_l NHK/ラジオ英会話_2017_04_0 episode_ NHK/ラジオ英会話_2017_04*.m4a --
...
Drive current: -dev 'disc03.iso'
Media current: stdio file, overwriteable
Added to ISO image: file '/episode_01.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_001.m4a'
Added to ISO image: file '/episode_02.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_002.m4a'
Added to ISO image: file '/episode_03.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_003.m4a'
...

この例では,disk_path(ファイルシステム上のパス)のうち "NHK/ラジオ英会話_2017_04_0" の部分を"episode_"に置き換えた形でiso_rr_path(ISOイメージ上のパス)を生成しています。"-disk_pattern on"は"*"(ワイルドカード)のパターンマッチを可能にする指定,最後の"--"は可変長引数の終りの指定です。

この例のように可変長引数が最後に来ている場合は引数の終りを示す"--"は不要なものの,次に示すように,可変長引数の後に別のオプションを指定するような場合,"--"で可変長引数の終りを明示しないと,次のオプション指定も可変長引数の続きと解釈されてエラーになります。

-map_lオプションを使うと,NHKディレクトリにある各ファイルを,名前を変更した上で月ごとのディレクトリにまとめて整理する,という指定も可能です。

$ xorriso -dev disc03.iso -disk_pattern on \
     -map_l NHK/ラジオ英会話_2017_04_0 2017_04/episode_ NHK/ラジオ英会話_2017_04*.m4a -- \
     -map_l NHK/ラジオ英会話_2017_05_0 2017_05/episode_ NHK/ラジオ英会話_2017_05*.m4a --

...
xorriso : UPDATE : 20 nodes read in 1 seconds
Drive current: -dev 'disc03.iso'
Added to ISO image: file '/2017_04/episode_01.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_001.m4a'
Added to ISO image: file '/2017_04/episode_02.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_002.m4a'
...
Added to ISO image: file '/2017_05/episode_01.m4a'='/home/kojima/NHK/ラジオ英会話_2017_05_001.m4a'
Added to ISO image: file '/2017_05/episode_02.m4a'='/home/kojima/NHK/ラジオ英会話_2017_05_002.m4a'
...

ISOイメージ内のファイルを操作するオプション

xorrisoでは,前節に紹介したような方法で作ったISOイメージ内のファイルやディレクトリを,通常のファイルやディレクトリと同じように操作するためのオプションも用意されています。

ファイルやディレクトリを削除する-rm-rm_r-rmdir移動させる-move-mvUIDを変更する-chown-chown_rGIDを変更する-chgrp-chgrp_rファイルのパーミッションを変更する-chmod-chmod_rなどがそれで,末尾に"_r"が付いているオプションは,指定したディレクトリ以下に再帰的に適用されることを意味します。

ここに示したオプションは,シェルから使うコマンドとほぼ同じ機能になっているので,使用方法は類推できるでしょう。なお,-move-mvは,"-mv file dir"した場合,fileはdirの下に移動する(mvコマンドと同じ動作)のに対し,"-move file dir"の場合,fileがdirを置き換える,という違いがあるそうです。

注意しなければいけないのは,これらのオプションを使ってISOイメージを編集する際,編集したいISOイメージを"-dev"で指定すると,加えた修正はそのISOイメージに新しいセッションとして記録されるという点です。そのため,-rm_r等でISOイメージ内のファイルを削除しても,ISOイメージのサイズは減少しません。

前回紹介したように,一見ISOイメージからファイルが削除されたように見えるものの,実際は後のセッションで見えなくしているだけなので,削除したファイルそのものはISOイメージの中に残っています。

ネット経由でISOイメージを配布する際のように,不要なファイルを除いたISOイメージが必要な場合,複数のセッションをマージしたISOイメージを作り直す必要があります。

その際は-indevに古いISOイメージ,-outdevに新たに作成したいISOイメージのファイル名を指定します。ただし,"-indev"と"-outdev"を指定する場合,"-indev"の内容に何らかの変更が加わらないと,"-outdev"にデータは書き出されません。

xorrisoのドキュメントによると,このような書き出しは"modifying(修正)"と呼ばれ,読み込んだイメージに何らかの変更が加わらない限り,書き出す価値が無いと判断されるそうです。

この問題を回避するためには,"-alter_date a +0 / -- "という処理を追加して,ルートディレクトリのアクセス時刻を形式的に変更する(0秒を加えるだけなので実際は変わらない⁠⁠,という方法があります。

$ xorriso -indev old_disc.iso -outdev new_disc.iso -alter_date a +0 / --

この処理は作成済みのISOイメージを光学メディアに書き出す際にも必要で,筆者がxorrisoを使い始めたころにはずいぶん首を捻った点です。xorrisoをこれから使おうという方はぜひご注意ください。

一方,"-dev"でISOイメージを指定するのではなく古いISOイメージを"-indev"に,新しいISOイメージのファイル名を"-outdev"に指定して編集作業を実行すれば,修正結果は新しいISOイメージに直接反映されます。あれこれ試行錯誤する必要がない編集作業の場合,こちらの方法が簡単かも知れません。


今回,その一端を紹介できたかと思いますが,xorrisoはISOイメージの作成と書き出しだけでなく,ISOイメージを操作するためにシェルやfileutils的な機能まで取り込んだ多機能ツールになっています。

本連載が紹介するのはそのうちのごく一部の機能だけなので,興味をもたれた方は,ぜひマニュアルやドキュメントを繙(ひもと)いて,xorrisoの広大な世界を探検してみてください。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html