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

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

前回のxorrisoの簡単な使い方に続き、今回はxorrisoのマニュアルを参照しつつ、もう少し体系的にオプション類の指定方法を紹介しましょう。

メディアを指定するオプション

xorrisoでは-devオプションで操作するメディアを指定します。このオプションでは"-dev /dev/sr0"のように書き出したい光学ドライブを指定することも、"-dev discimage.iso"のように通常ファイルを指定して、ファイルシステム上にISOイメージを作成することも可能です。

"-dev"オプションに存在しないファイルを指定した場合は、その名前の新規ISOイメージを作成し、既存のISOイメージを指定した場合は、そのISOイメージを対象に処理を行うことになります。

複数の光学ドライブ間で内容をコピーしたり、ファイルシステム上に作成したISOイメージを光学ドライブに書き出す場合のように、読み込み元と書き出し先を区別したい場合は、読み込み用に-indev書き出し用に-outdevを指定します。

たとえば、後述するような方法で作成したISOイメージをDVD-R等に書き出す際は、"-indev discimage.iso -outdev /dev/sr0"のような指定になります。また、"-indev"と"-outdev"の双方にファイル名を指定すれば、元のISOイメージは保持したまま、ファイルを追加、削除した新しいISOイメージを作ることもできます。

ISOイメージへファイルを追加するオプション

前回簡単に触れたように、xorrisoはファイルシステム上の任意の場所にあるファイルやディレクトリを、光学ドライブやISOイメージに書き出すことが可能です。

ISOイメージに書き出すファイルやディレクトリを指定するために、-add-cpr-mapの3種のオプションが用意されています。

以下、これらオプションをmanページの記述を参照しながら紹介してみます。

-addオプション

-addオプションに関するmanページの記述は以下の通りです。参考のために私訳を付けておきます。

-add pathspec [...] | disk_path [***]

Insert the given files or directory trees from filesystem into the ISO image.
If -pathspecs is set to "on" or "as_mkisofs" then pattern expansion is always
disabled and character '=' has a special meaning.
It separates the ISO image path from the disk path:  iso_rr_path=disk_path

指定されたファイルやディレクトリツリーをファイルシステムからISOイメージに書き出す。-pathspecsオプションに"on"か"as_mkisofs"を指定すると、ファイル名の展開機能は無効になる。合わせて'='(イコール)がファイルシステム上のパスとISOイメージ上のパスを結び付ける特別な文字になり、iso_rr_path=disk_pathの形式で指定できるようになる。

-addオプションは、mkisofsとの互換性のため設けられたオプションで、mkisofsが用いているのと同じ、"iso_rr_path=disk_path"の形式で、書き出すファイルやディレクトリを指定します。以下、実例を示しながら説明しましょう。

手元のNHKフォルダに「ラジオ英会話」を録音したファイルがあるとします。

$ ls -l NHK
合計 251,658,240
-rw-r--r--+ 1 kojima users 5,485,197  6月 12日  11:10 ラジオ英会話_2017_04_001.m4a
-rw-r--r--+ 1 kojima users 5,485,197  6月 12日  11:10 ラジオ英会話_2017_04_002.m4a
-rw-r--r--+ 1 kojima users 5,485,449  6月 12日  11:10 ラジオ英会話_2017_04_003.m4a
...

これらのファイルをISOイメージ上の"ラジオ英会話"ディレクトリに書き出したい場合、-addオプションを使うとこのような指定になります。

$ xorriso -dev disc01.iso -pathspecs on -add ラジオ英会話=NHK 
GNU xorriso 1.4.6 : RockRidge filesystem manipulator, libburnia project.

Drive current: -dev 'disc01.iso'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data,  122g free
Added to ISO image: directory '/ラジオ英会話'='/home/kojima/NHK'
xorriso : UPDATE : 21 files added in 1 seconds
xorriso : UPDATE : Writing:       5488s   10.2%   fifo   0%  buf  50%
...

"iso_rr_path=disk_path"の組み合わせは複数回指定でき、ファイルを直接指定することも可能です。たとえば、番組ファイルの3つをそれぞれepisode01から03という名前に変更して追加する場合、以下のような指定になります。

$ xorriso -dev disc01.iso -pathspecs on \
  -add episode01.m4a=NHK/ラジオ英会話_2017_04_001.m4a \
       episode02.m4a=NHK/ラジオ英会話_2017_04_002.m4a \
       episode03.m4a=NHK/ラジオ英会話_2017_04_003.m4a

GNU xorriso 1.4.6 : RockRidge filesystem manipulator, libburnia project.

xorriso : NOTE : Loading ISO image tree from LBA 0
xorriso : UPDATE : 41 nodes read in 1 seconds
Drive current: -dev 'disc01.iso'
Media current: stdio file, overwriteable
Media status : is written , is appendable
Media summary: 1 session, 107186 data blocks,  209m data,  122g free
Volume id    : 'ISOIMAGE'
Added to ISO image: file '/episode01.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_001.m4a'
Added to ISO image: file '/episode02.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_002.m4a'
...

書き出したISOイメージの内容を確認するには、xorrisoの-findオプションを使うと、ループバックマウントする手間が省けて便利です。

$ xorriso -dev disc01.iso -find
GNU xorriso 1.4.6 : RockRidge filesystem manipulator, libburnia project.

xorriso : NOTE : Loading ISO image tree from LBA 0
...
'.'
'./episode01.m4a'
'./episode02.m4a'
'./episode03.m4a'
'./ラジオ英会話'
'./ラジオ英会話/ラジオ英会話_2017_04_001.m4a'
'./ラジオ英会話/ラジオ英会話_2017_04_002.m4a'
...

-cprオプション

-cprはシェルから使える"cp -r"と同様の機能を持ったオプションです。このオプションのmanページの記述は以下の通りです。

-cpr disk_path [***] iso_rr_path
     Insert the given files or directory trees from filesystem into the
     ISO image.
     The rules for generating the ISO addresses are similar as with
     shell command cp -r.  Nevertheless, directories of the iso_rr_path
     are created if necessary.  Especially a not yet existing
     iso_rr_path will be handled as directory if multiple disk_paths are
     present.  The leafnames of the multiple disk_paths will be grafted
     under that directory as would be done with an existing directory.
     If a single disk_path is present then a non-existing iso_rr_path
     will get the same type as the disk_path.

ファイルシステム上にある指定したファイルやディレクトリツリーをISOイメージに書き出す。ISOイメージ上のファイル名生成ルールはシェルコマンドのcp -rと同様だが、必要に応じてiso_rr_pathのディレクトリは作成される。特に、複数のdisk_pathの書き出し先として指定された存在しないiso_rr_pathはディレクトリとして生成され、既存のディレクトリに書き出す場合と同様、指定された(複数の)disk_pathはそのディレクトリ以下にサブツリー構造を保持する。disk_pathが単独のファイルやディレクトリの場合、生成されるiso_rr_pathは指定されたdisk_pathと同じ種類になる。

-cprオプションを使えば、シェルから実行する"cp -r"コマンド同様、disk_pathに指定した複数のファイルやサブディレクトリを含むディレクトリを、ISOイメージのiso_rr_pathに指定したディレクトリに書き出すことができます。

このオプションを使えば、NHKディレクトリ以下にまとめて保存している番組ファイルを、パターンマッチを使ってISOイメージ上では月ごとに分けて書き出す、という処理も可能です。この場合、-disk_pattern onオプションを合わせて指定し、ファイルシステム上のファイル名展開機能を有効にします。

$ xorisso -dev disc02.iso -disk_pattern on \
    -cpr NHK/ラジオ英会話_2017_04* 2017_04 -- \
    -cpr NHK/ラジオ英会話_2017_05* 2017_05 -- \
...
Added to ISO image: file '/2017_04/ラジオ英会話_2017_04_001.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_001.m4a'
Added to ISO image: file '/2017_04/ラジオ英会話_2017_04_002.m4a'='/home/kojima/NHK/ラジオ英会話_2017_04_002.m4a'
...
Added to ISO image: file '/2017_05/ラジオ英会話_2017_05_001.m4a'='/home/kojima/NHK/ラジオ英会話_2017_05_001.m4a'
Added to ISO image: file '/2017_05/ラジオ英会話_2017_05_002.m4a'='/home/kojima/NHK/ラジオ英会話_2017_05_002.m4a'
...

-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イメージを作り直す必要があります。

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

この問題を回避するためには、"-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の広大な世界を探検してみてください。

おすすめ記事

記事・ニュース一覧