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

第91回xorrisoとUEFIブート再びその1]

ここ数ヵ月ほど、地区自治会などの年度代りな事務作業に忙殺されているうちに、桜は花から葉に代わり、ゴールデンウィークも立夏もすぎてしまいました。

月1ペースで書いてきた本連載も、そのような事情で2ヵ月ほど休載させていただいたので、ちょっと久しぶりの掲載となります。決して人気が無いから打ち切られたわけではないので(苦笑⁠⁠、今後とものんびりとお付き合いいただければ幸いです。

さて、今回から数回かけてxorrisoというISO9660ファイルシステムの操作ツールを紹介しようと思います。

以前、この連載でPlamo LinuxをBIOSに代わる新しい起動システムであるUEFIに対応させた話をしました。

その際、UEFI環境にインストールするためにはDVDやUSBメモリといったインストールメディアがUEFIに対応している必要があること、そのためにはどのような設定やツールが必要なのかも紹介しました

この回に紹介した方法で、DVDとUSBメモリそれぞれが、BIOSからでもUEFIからでも起動できるようにはなったものの、最後に触れたように、USBメモリからUEFI起動するためには、DVDイメージ(ISOファイル)をループバックでマウントし、収められているファイルやディレクトリ一式をUSBメモリのファイルシステム上にコピーする、という一手間をかける必要がありました。

実用上この手間はさほど問題にはならないものの、UEFI対応のお手本にしていたArch Linuxのインストーラでは、DVDイメージをUSBメモリにベタ書きするだけでUEFI起動ができていたので、Plamoの環境でそれができないことはちょっと気になっていました。

そこで、手が空いた時にArch Linuxの各種ドキュメントを読み直してみたところ、DVDイメージを作成するためにxorrisoというツールを使っていることに気づきました。"xorriso"という不思議な名前のツールは見たことも聞いたこともなかったので、⁠これは一体何だろう?」と調べてみたところ、予想外に高機能なツールに出会うことになりました。

GNU xorriso

xorrisoはGNUプロジェクトの1つとして公開されているソフトウェアで、CD-ROMやDVD用に広く利用されているISO9660ファイルシステムを操作するためのツールです。

ドキュメントによると、xorrisoは「POSIX互換なファイルシステム上のファイルオブジェクトを、Rock Ridge対応のISO9660ファイルシステムにコピーするためのツール」だそうです。

従来、Plamo Linuxの環境ではCD/DVDイメージの作成や書き込みはcdrtools由来のmkisofscdrecordを使ってきました。mkisofsで作ったISOファイルをcdrecordでCDやDVDに書き込む、そういうスタイルに慣れきっている人間にとって、xorrisoは一種のパラダイムシフトをもたらすツールでした。

cdrtoolsの始まりはSunのSolaris用に開発された汎用SCSIライブラリで、そのライブラリを利用して当時普及し始めていたSCSI接続のCD-Rドライブを操作するツールとしてcdrecordが開発されたそうです。そういう由来のため、Linuxからcdrecordを使う場合も汎用SCSIドライバ(sg.o)が必要で、書き込み先の指定も/dev/sr0のようなデバイス名ではなく、SCSIバスやターゲットIDを指定するdev=1,0,0のような特殊な形式になっています。また、cdrecordはISOファイルの書き込み専門で、ISOファイルを作成するのは別コマンドのmkisofsという分業体制を取っています。

一方、xorrisoは、ISO9660ファイルシステムを操作するためのlibisofsCDやDVD等の光学ドライブを操作するためのlibburnといったライブラリが先行して開発され、それらライブラリの機能を利用するためのツールとして開発されたコマンドです。その結果、ISOファイルの作成から光ディスクへの書き込みまでをサポートすると共に、書き込み先のデバイスの指定も-dev /dev/sr0のように最近の慣例に従い、ISOファイルを作らずHDD上のファイルやディレクトリを直接光ディスクに書き込むことも可能です。

その反面、manページが5000行近くあるくらい機能が豊富で、どのオプションをどう指定すればやりたいことが実現できるのか、ドキュメントを斜め読みしただけではなかなかわかりません。そのせいか、Google等で調べてもまとまった使い方を紹介しているページはあまり無いようです。そこで今回から数回に渡ってxorrisoの機能と簡単な使い方を紹介してみようと思います。

xorrisoの使用例

執筆時点でのxorrisoの最新版は1.4.6で、上記xorrisoのホームページからソースコードがダウンロードできます。前述のようにxorrisoはlibisofsやlibburn等、複数のライブラリから構成されているものの、それらライブラリのソースコードも同梱されているので、ビルドは簡単です。

SCSIコマンドを送る際にroot権限を必要とするcdrecordとは異なり、xorrisoは一般ユーザー権限で動作するように設計されています。しかしながら、光学ドライブに書き込むためには該当するデバイスファイル(通常は/dev/sr0)に書き込み権限が必要です。

最近の一人一台環境では/dev/sr0をo+rwに設定しても構わない気はするものの、筆者が使っているPlamo Linux環境では/dev/sr0はcdrom グループに属し、cdromグループに登録したユーザーのみが書き込めるようにしています。

$ ls -l /dev/sr0
brw-rw----+ 1 root cdrom 11, 0  5月  5日  09:41 /dev/sr0
$ grep cdrom /etc/group
cdrom::32:kojima

xorrisoから利用可能な光学ドライブを調べるには-devicesオプションを指定します。

$ xorriso -devices
GNU xorriso 1.4.6 : RockRidge filesystem manipulator, libburnia project.

Beginning to scan for devices ...
Full drive scan done
-----------------------------------------------------------------------------
0  -dev '/dev/sr0' rwrw-- :  'HL-DT-ST' 'DVDRAM GH24NSB0' 
-----------------------------------------------------------------------------

ドライブに挿入されているメディアの情報を調べるには-tocオプションを指定します。未使用のDVD-Rに対してこのオプションを使用すると以下のような結果になりました。

$ xorriso -dev /dev/sr0 -toc
GNU xorriso 1.4.6 : RockRidge filesystem manipulator, libburnia project.

Drive current: -dev '/dev/sr0'
Media current: DVD-R sequential recording
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 4489m free
Drive current: -dev '/dev/sr0'
Drive type   : vendor 'HL-DT-ST' product 'DVDRAM GH24NSB0' revision 'UN00'
Drive id     : 'KL9E8M95241     '
Media current: DVD-R sequential recording
Media product: TYG03 , Taiyo Yuden Company Limited
Media status : is blank
Media blocks : 0 readable , 2298496 writable , 2298496 overall
Media summary: 0 sessions, 0 data blocks, 0 data, 4489m free

cdrecord/mkisofsを使ってこのDVDにファイルを書き込むには、書き込みたいファイルを作業用のディレクトリにコピーし、サブディレクトリ等を調整した上でmkisofsでISOファイル化し、作成したISOファイルをcdrecordで書き込む、という手順が必要でした。

それに対し、xorrisoではファイルシステム上の任意の場所にあるファイルやディレクトリを直接DVDに書き込むことが可能です。

たとえば、⁠らじる★らじる」経由で録音した4月分の「ラジオ英会話」のファイルが"~/NHK"ディレクトリに収められているとします。

$ ls  ~/NHK
2016-04-04-06-45_ラジオ英会話_2016_04_001.m4a
2016-04-05-06-45_ラジオ英会話_2016_04_002.m4a
...
2016-04-29-06-45_ラジオ英会話_2016_04_020.m4a

これらのファイルをDVDに書き込む場合、xorrisoでは以下のように指定します。"-map ~/NHK /ラジオ英会話"のオプションは、ファイルシステム上の"~/NHK"ディレクトリをISOファイル上では"/ラジオ英会話"ディレクトリに対応づける指示です。

$ xorriso -dev /dev/sr0 -map ~/NHK /ラジオ英会話
GNU xorriso 1.4.6 : RockRidge filesystem manipulator, libburnia project.

Drive current: -dev '/dev/sr0'
Media current: DVD-R sequential recording
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 4489m free
xorriso : UPDATE : 21 files added in 1 seconds
Added to ISO image: directory '/ラジオ英会話'='/home/kojima/NHK'
xorriso : UPDATE : Thank you for being patient. Working since 0 seconds.
xorriso : UPDATE : Writing:         16s    0.0%   fifo 100%  buf 100%    0.0xD 
xorriso : UPDATE : Writing:         16s    0.0%   fifo 100%  buf 100%    0.0xD 
...
xorriso : UPDATE : Closing track/session. Working since 64 seconds
ISO image produced: 53612 sectors
Written to medium : 53776 sectors at LBA 0
Writing to '/dev/sr0' completed successfully.

書き込めたかをDVDをマウントして確認します。書き替えたDVDをマウントする際は、一度光学ドライブをオープン/クローズしてカーネル内部のキャッシュをクリアしてやる必要があります。

$ eject /dev/sr0 && eject -t /dev/sr0
$ mount /cdrom
$ ls -R /cdrom
/cdrom/ラジオ英会話/:
2016-04-04-06-45_ラジオ英会話_2016_04_001.m4a  2016-04-19-06-45_ラジオ英会話_2016_04_012.m4a
2016-04-05-06-45_ラジオ英会話_2016_04_002.m4a  2016-04-20-06-45_ラジオ英会話_2016_04_013.m4a
...

さて、翌月になり、5月分の録音ファイルが溜ってきました。

$ ls ~/NHK
2016-04-04-06-45_ラジオ英会話_2016_04_001.m4a
2016-04-05-06-45_ラジオ英会話_2016_04_002.m4a
...
2016-05-30-06-45_ラジオ英会話_2016_05_016.m4a
2016-05-31-06-45_ラジオ英会話_2016_05_017.m4a

先に書き込んだDVDにはまだまだ余裕があるので5月分のファイルを追加してみます。xorrisoでは-update_rオプションを指定すると、DVDに書き込まれたファイルとHDD上のファイルをチェックして、書き込まれていないファイルのみを追記することができます。

$ xorriso -dev /dev/sr0 -update_r NHK ラジオ英会話
...
Updating '/home/kojima/NHK' to '/ラジオ英会話'
xorriso : UPDATE : Adjusted attributes of '/ラジオ英会話'
xorriso : UPDATE : 5373952 content bytes read in 5 seconds , 0.8xD
xorriso : UPDATE :  22867k content bytes read in 10 seconds , 2.6xD
...
xorriso : UPDATE : Added/overwrote '/ラジオ英会話/2016-05-09-06-45_ラジオ英会話_2016_05_001.m4a'
xorriso : UPDATE : Added/overwrote '/ラジオ英会話/2016-05-10-06-45_ラジオ英会話_2016_05_002.m4a'
Differences detected and updated. (runtime 22.1 s)
xorriso : UPDATE : Writing:         16s    0.0%   fifo 100%  buf 100%
xorriso : UPDATE : Writing:         16s    0.0%   fifo 100%  buf 100%    0.0xD
...
ISO image produced: 45570 sectors
Written to medium : 45728 sectors at LBA 93952
Writing to '/dev/sr0' completed successfully.

追記したDVDの中身を確認すると5月分の番組もちゃんと書き込まれています。

$ ls -l /cdrom/ラジオ英会話/
合計 202,962,432
-rw-r--r-- 1 kojima users 5,484,940  4月  4日 2016年 2016-04-04-06-45_ラジオ英会話_2016_04_001.m4a
-rw-r--r-- 1 kojima users 5,485,484  4月  5日 2016年 2016-04-05-06-45_ラジオ英会話_2016_04_002.m4a
...
-rw-r--r-- 1 kojima users 5,485,196  5月 27日 2016年 2016-05-27-06-45_ラジオ英会話_2016_05_015.m4a
-rw-r--r-- 1 kojima users 5,485,470  5月 30日 2016年 2016-05-30-06-45_ラジオ英会話_2016_05_016.m4a
-rw-r--r-- 1 kojima users 5,485,474  5月 31日 2016年 2016-05-31-06-45_ラジオ英会話_2016_05_017.m4a

2ヵ月分を書き込んでもDVDにはまだまだ余裕があるようなので、複数年分を整理できるようにディレクトリ名に年数を入れておきましょう。今回は最後に"-commit -eject all"を指定して、書き込み終了後、自動的にトレーをイジェクトさせました。

$ xorriso -dev /dev/sr0 -mv ラジオ英会話 2016_ラジオ英会話 -- -commit -eject all
...
Renamed in ISO image: '/ラジオ英会話' to '/2016_ラジオ英会話'
xorriso : UPDATE : Thank you for being patient. Working since 0 seconds.
xorriso : UPDATE : Writing:         16s    9.0%   fifo   0%  buf 100%    0.0xD 
...
Media current: DVD-R sequential recording
Media status : is written , is appendable
Media summary: 3 sessions, 111184 data blocks,  217m data, 4191m free
Volume id    : 'ISOIMAGE'

再度DVDの中身を確認するとディレクトリ名がちゃんと変っています。

$ mount /cdrom
$ ls -R /cdrom/
/cdrom/:
2016_ラジオ英会話/

/cdrom/2016_ラジオ英会話:
2016-04-04-06-45_ラジオ英会話_2016_04_001.m4a  2016-04-28-06-45_ラジオ英会話_2016_04_019.m4a
2016-04-05-06-45_ラジオ英会話_2016_04_002.m4a  2016-04-29-06-45_ラジオ英会話_2016_04_020.m4a
....
2016-04-27-06-45_ラジオ英会話_2016_04_018.m4a  2016-05-31-06-45_ラジオ英会話_2016_05_017.m4a

今回利用しているのは再書き込み可能なDVD-RWではなく、一度書き込むと消去できないはずのDVD-Rメディアです。

それではなぜDVD-Rが自由に書き替えられるのか、というと、xorrisoはDVDのマルチセッション機能を利用して、過去のセッションの内容を上書きして書き替えたように見せているのです。

今まで書き込んできたDVDを-tocオプションで調べると、3つのセッションが登録されたマルチセッションDVDになっています。最初のセッションが4月分のファイルを書き込んだ状態、2番目のセッションが5月分のファイルを追記した状態、最後のセッションがディレクトリ名を変更した状態です。

$ xorriso -dev /dev/sr0 -toc
...
Media status : is written , is appendable
Media blocks : 146032 readable , 2145696 writable , 2297888 overall
TOC layout   : Idx ,  sbsector ,       Size , Volume Id
ISO session  :   1 ,         0 ,     53612s , ISOIMAGE
ISO session  :   2 ,     93952 ,     45570s , ISOIMAGE
ISO session  :   3 ,    145840 ,        27s , ISOIMAGE
Media summary: 3 sessions, 111184 data blocks,  217m data, 4191m free
Media nwa    : 152192s

マルチセッションDVDをマウントするとデフォルトでは最後のセッションがマウントされ、書き替えていった最新の内容が表示されることになります。

一方、マウント時のオプション指定で過去のセッションをマウントすることも可能で、たとえばsbsector=0を指定すると最初のセッションがマウントされ、4月分の番組のみを書き込んだ状態に戻ったかのように見えます。

$ sudo mount /cdrom -o ro,sbsector=0
$ ls -R /cdrom
/cdrom:
ラジオ英会話/

/cdrom/ラジオ英会話:
2016-04-04-06-45_ラジオ英会話_2016_04_001.m4a  2016-04-19-06-45_ラジオ英会話_2016_04_012.m4a
2016-04-05-06-45_ラジオ英会話_2016_04_002.m4a  2016-04-20-06-45_ラジオ英会話_2016_04_013.m4a
...
2016-04-15-06-45_ラジオ英会話_2016_04_010.m4a  2016-04-29-06-45_ラジオ英会話_2016_04_020.m4a
2016-04-18-06-45_ラジオ英会話_2016_04_011.m4a
$

xorrisoには他にもさまざまな機能があるものの、だいぶ長くなってきたので、より詳しい使い方は次回に紹介することにしましょう。


DVDのマルチセッション機能はmkisofs/cdrecordでも利用できたものの、オプション指定やセッションごとのISOファイルを用意するのが面倒で使ったことがなく、長い間、CDやDVDは「一度に全領域を書き込む」ためのメディアとしてしか使っていませんでした。

それに対しxorrisoは、今回紹介したようにDVDのマルチセッション機能を柔軟かつ簡単に扱え、DVDを「ログ構造化FS」風に利用できるので、目からウロコが落ちたような気分です。

xorrisoはこのように強力なツールなものの、指定可能なオプションが多すぎてわかりづらく、それらを解説しているドキュメントも長大で読み解くのが大変なため、広く普及しているとは言いづらいようです。今回の紹介記事が少しでもxorriso普及の手助けになればいいな、と思っています。

おすすめ記事

記事・ニュース一覧