読者です 読者をやめる 読者になる 読者になる

Rich Lab. Blog

「まつらリッチ研究所」の研究の一環で、はてなブログ上にブログを公開。でもなぜか買い物カゴが……。はてブはそんな機能あったっけ?

「大岡裁き」ならぬ「POSIX裁き」

UNIX POSIX

この記事はPOSIX原理主義 Advent Calendar 2016の9日目の記事です。

今日のテーマは、POSIXという規格で起こった一つの事件とその裁きを、大岡政談(大岡裁き)になぞらえて紹介します。

大岡政談とは何か

f:id:richmikan:20161209042852j:plain

そもそも大岡政談とは何でしょう?それはあの水戸黄門と共に時代劇の定番となった大岡越前をモデルにした(ほぼ創作上の)事件簿です。

実際の水戸黄門も諸国漫遊をしておらず、あれは創作物語だったのと同様に、大岡越前の名裁きとされる逸話も史実だと確認できているものは今のところ一つだけ*1で、あとは落語の囃と言われています。

創作であろうものの、その中でも特に有名なのが「三方一両損

昔、大工の吉五郎という男が小判三両を無くした。それを左官の金太郎が拾い、幸い財布に吉五郎の名が入っていたことから善意で届けたところ、恥に感じた吉五郎は受け取りを拒否。やがて喧嘩になり、町奉行大岡様の白洲(法廷)にて決着をつけることに。

白洲でも相変わらず互いに主張を譲らぬ二人であったが、そんな二人を大岡は謙虚であると、たいそう褒めた。そして大岡は吉五郎が頑なに受け取らぬ三両を代わりに受け取り、そこに懐から取り出した自分の一両を加えてこう言った。

「その方らは謙虚ゆえ、褒美を出す。この手元にある四両を二両ずつ受け取るがよい。吉五郎、その方は届けられた時点で受け取っていれば三両が戻っていたもをその謙虚さから二両しか戻らず一両の損。金太郎、その方は拾った時点でそのまま受け取っておれば三両得したものをその謙遜さゆえ二両しか褒美を貰えず一両の損。この大岡忠相も、その方らに褒美を授けるために一両出し、一両の損。三方一両損。これにて一件落着」

さらにこの話には「三方一両得」という続きがあり、「なるほど同じ騒ぎを起こせば大岡様から一両貰えるのか」と悪巧みした二人組をこれまた巧妙な裁きで懲らしめるというものなのですが、いずれにしてもウィットに富んだ名裁きとして語り継がれています。

アーカイバー一命令損」事件

さて、POSIX規格にも過去、二つのコマンド(命令)が削除されるという一大事が起こりました。過去との互換性を何よりも尊重するはずのPOSIXという規格が、なんとコマンドを削除したのです。しかし、そこはPOSIX。単に削除したわけではなく、ウィットに富んだ名裁きを行って決着を図ったのです。

この事件を、三方一両損になぞらえ、アーカイバー一命令損」と呼ぶことにしますが、その経緯を見ていきましょう。

tarコマンドとcpioコマンド

今を遡ること28年前の1988年。UNIX系OSのあるべき仕様を定めた「POSIXの御触書」が公布されました。その正式名称はIEEE Std 1003.1-1988というものでしたが、そこには当時メジャーだったアーカイバーコマンドであるtarcpioも記載されていました。つまり、tarとcpioはUNIX系を名乗るOSが持つべきコマンドとされていました。これは、それまでの各種UNIX系OSで双方のコマンドが普及していたことを物語っています。

しかし、両者の仲(互換性)は最悪。それぞれで生成したアーカイブファイルには全く互換性がありません。アーカイブファイルを作るという目的を達成するために、異なるベンダーがそれぞれ独自に開発し、二大勢力になっていたというだけだったのです。各種UNIX系OSの仕様の最大公約数的存在を目指していたPOSIXにおいて、この二大勢力のどちらかを切り捨てるというこは当時できなかったのでしょう。だからこそ両方ともPOSIXに採用されたのだと思います。*2

フォーマットの陳腐化と独自拡張

しかし、時代と共にコンピューターが扱うデータサイズが大きくなると、それぞれアーカイブファイルフォーマットが陳腐化していきました。一つは大きなデータに見合わぬ小ささのブロックサイズ。ブロックサイズが不適切に小さいと効率が悪化してしまいます。もう一つは8GBの壁。当初の規格ではどちらも8GB以上のサイズを持つアーカイブファイルが生成できませんでした。特にファイルサイズの上限問題は致命的です。

これでは使い物にならないということもあり、各ベンダーは勝手に独自拡張を施すようになりました。こうして、細かな派生が生まれ、POSIXの御触書によって維持されていたtar&cpio二大勢力という治安が崩れようとしていまいた。

POSIXが両コマンドに下した裁き

最初の御触書が交付されてから5年後の1993年、庶民(ユーザー)達からの陳情にPOSIX守(ポジックスのかみ)はついに裁きを下すことになりました。

下した裁きはなんと、tarコマンドとcpioコマンドの双方の所払(ところばらい)!ベンダー間で統一性の無い拡張をした以上市中(POSIX環境)には置けぬということで、御触書から削除を命じたのです。

しかしそこは名裁きで有名なPOSIX守、単なる所払ではありませんでした。このままではアーカイバーコマンドが無くなってしまいますから、新たなコマンドをアーカイバーの役に就かせることとしたのです。しかしここでかつての二大勢力と異なる第三のフォーマットを策定しては、今まで作成されたアーカイブファイルが開封できなくなってしまい、庶民達が混乱してしまいます。そこで、新たなコマンドにはtar、cpio双方の形式を踏襲させつつ、ブロックサイズやデータサイズの上限問題を克服できるよう仕様を拡張させたのです。

そして、アーカイバーコマンドに与えた屋号(名前)はpax。ラテン語で「平和」を意味します。POSIX上でアーカイバ―コマンドが二つ減って一つ増えて……、これぞまさしく「アーカイバ―一命令損」。めでたしめでたし。

今のPOSIX文書に、裁きの跡が残されていた

この裁きがあったことを物語る記述が、「POSIXのお触書」2008年版(IEEE Std 1003.1-2008)のpaxコマンドのページに残されています。

RATIONALE

The pax utility was new for the ISO POSIX-2:1993 standard. It represents a peaceful compromise between advocates of the historical tar and cpio utilities.
(paxユーティリティーは、POSIX.2-1993で登場しました。これは、過去にtarとcpioユーティリティーをそれぞれ提唱した人達に対する平和的妥協を促す象徴的なユーティリティーです。)

"pax"という名には、packs(「梱包する」という動詞の三人称単数現在)の意味と同時に、アーカイバーコマンドの覇権争いを終わらせて平和を築こうという願いが込められていたのです。何という名裁きなのでしょうか。

paxコマンドを試しに使ってみる。

そもそもpaxって皆さんご存知ですか?POSIX守の願いがいまいち届かずあまり有名ではありませんが、POSIXの御触書にありますのでお使いのUNIX系OSにはまず間違いなく入っていると思います。そして、実際にtarやcpioとファイルの互換性があります。

さすがに、「paxでアーカイブファイルを作ればtarでもcpioでも開ける」ということはありませんが。どちらの方式のアーカイブファイルも作成できますし読めます。そして、現在の大抵のtarコマンドは(たぶんcpioコマンドも)paxコマンドが作成する上位互換アーカイブフォーマットを読めます。

というわけで、試しにpaxコマンドでtar形式の上位互換であるustar形式アーカイブファイルを作成し*3、それをtarコマンドで開いてみようと思います。

# 1)テスト用のディレクトリーを作って入る
$ mkdir ~/test
$ cd ~/test

# 2)paxでアーカイブ作成
#   ・-wオプション + 対象ファイル名...
#   ・結果は標準出力に出るのでリダイレクト
$ pax -w /usr/share/man > man.tar

# 3)tarでアーカイブ展開
#   ・paxは絶対パスを取らずにアーカイブを作るので警告が出る
$ tar -xf man.tar
tar: Removing leading '/' from member names
tar: Removing leading '/' from hard link targets

# 4)生成ファイルを確認
$ ls
total 33944
-rw-rw-r-- 1 rich rich 34713600 Dec  9 03:14 man.tar
drwxrwxr-x 3 rich rich     4096 Dec  9 03:14 usr
$ 

ちゃんとできました(古めのCentOS 5で確認)。

というわけで、これからはtarに代えてpaxコマンドを使いましょう。POSIX守に感謝しながら。

*1:夫の計画殺人未遂の罪で裁かれた「白子屋事件」

*2:一方、trコマンドにはSystem V系の書式とBSD系の書式という相反する二大勢力があったものの、こちらのケースでは涙を飲んでBSD系が採用されました。

*3:paxコマンドのデフォルトアーカイブ形式はustarである。