あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

drutilコマンドのEject

MacにはEjectコマンドがありません。代わりにdrutilというディスク用コマンドが用意されています。

MacでEjectを実行するには次のように実行します。

$ drutil list
   Vendor   Product           Rev   Bus       SupportLevel
1  OPTIARC  DVD RW AD-5970H   3APE  ATAPI     Apple Shipping
2  HL-DT-ST DVDRAM GSA-H44N   RB00  USB       Unsupported

$ drutil -drive 2 tray eject
$

drutilコマンドのtrayオプションには、「open」「close」「eject」の、3つのサブオプションが存在します。toggleはないようです。不便極まりない。

さて、「open」と「eject」では意味が重複しそうなものだと前から思っていたのですが、たぶん意味がわかったのでかいておきます。

open/closeとejectの違い

openもしくはcloseと、ejectの違いは、「トレイにコマンドを送って終わる」か「トレイが開いてからコマンドが終わる」かの違いになります。

今までLinuxのEejectコマンドでは、どのモードで実行しても「トレイが開いてからコマンドが終わる」タイプの挙動を示していました。このため、初期のエアコンリモート操作では、エアコンの電源ボタンを押したあとに、ボタンにくっついているバネの力でちょうどよくトレイが押し返される位置を調整する必要がありでした。

これに対して、Macのdrutilコマンドのtray open/closeオプションでは、トレイが開ききる前にコマンドが完了するため、先述のエアコンリモート操作で厳密な位置調整は不要となり、代わりにsleepコマンドで秒数を指定することで折り返し位置を定めることができるようになります。

試す

open/closeオプションを組み合わせて、Ejectの途中でトレイを折り返す動作が可能か確認するために、次のようなスクリプトを用意しました。

drutil -drive 1 tray open;sleep 1.8;drutil -drive 1 tray close;sleep 5
drutil -drive 1 tray open;sleep 1.9;drutil -drive 1 tray close;sleep 5
drutil -drive 1 tray open;sleep 2.0;drutil -drive 1 tray close;sleep 5
drutil -drive 1 tray open;sleep 2.1;drutil -drive 1 tray close;sleep 5
drutil -drive 1 tray open;sleep 2.2;drutil -drive 1 tray close

実行した結果はこちらの動画を確認して下さい。sleepコマンドで指定する秒数が長くなるに連れて、トレイが折り返す位置も変化します。

このオプションがあれば、先のエアコンリモート操作は初期バージョンののまま進化せず、Raspberry Piにも興味を示さなかった可能性があることを想像すると、ぞっとします。

また、この動作を利用することで、新たなEject工作の可能性も出てきそうです。ただし、Macが必要になりますが(みんな、古いMacの1台や2台余しているでしょう?)。

Linuxではできないのか

これはまだ調べきれていませんが、ejectコマンドのソースをサッと読んだ限りでは、ioctl関数でLinuxに定数を投げているだけのようなので、ejectコマンドが何かをしているわけではなさそうです。CD-ROMドライブのトレイを開く関数を、Ejectコマンドのサイト( http://eject.sourceforge.net/ )で配布されている最新のejectソース(eject.c)から抜粋します。

static int EjectCdrom(int fd)
{
int status;

status = ioctl(fd, CDROMEJECT);
return (status == 0);
}

私にとってLinuxプログラミングは未知の領域なので、Linuxカーネルに手を入れなければいけないのか、それともejectのソースに手を入れてtray open/closeを再現できるのかは不明です。誰か詳しい人もとむ。ユーザー会としては、この手の事に突っ込んでくれる人ももちろん募集していますので、ついでに入会していただけるととても心強く思います。

ていうか、

Ejectコマンドについてなにアツく語っとんじゃ、というか、久しぶりにユーザー会名にあった内容を書いてる?というか。なんなのこれ。

ちなみに、今月の第3週の週末に開催され(そして日曜日はコミティアと被って)るOSC2013 Tokyo/Fallでは、先日入手した車掌スイッチと組み合わせたEjectをできたらいいなと目論んでいます。が、スイッチ重すぎるし、立てかけるものが無いし、無理かもしれないですね。

あと、EjecTは20着ほど追加発注しました。

追記

しまださんからコメントを頂いて、Linuxでは以下のコマンドで実行できました。ソースを追っかけてもらったり、コマンドを探してくれたりして、感謝です……!!

トレイ開
$ sg_start --eject -i /dev/sr0
トレイ閉
$ sg_start --load -i /dev/sr0

sg_startコマンドは、sg3-utilsというパッケージに含まれています。また、先の動画のような動きをさせる時は、sleepを0.1以上で指定するとよさそうでした。