大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

家庭用ルータでもEjectしたい!

というわけで、今更ながら11月頭のOSC 2016 Tokyo/Fall行ってきた報告と、そこから着想を得て色々やってみた報告です。 ”手順だけ見たい”という方は、しばらくそこに至るまでの顛末なのですっ飛ばしてください。

OSC 2016 Tokyo/Fall

正式名を "OpenSouce Conference"、オープンソースソフトウェア(OSS)についての情報共有、活用事例の紹介などを目的として、全国各地で開催されるイベントです(公式サイト)。東京でも11月5日と6日に開催され、私も一般参加してきました(今更)。

OSCは今回で3回目くらいでしたが、1・2回目はほとんど何もわからないまま参加した感じだったので、中々知らない人に話しかけるのが苦手なのも影響してほとんど何も得られないまま帰宅する結果に。 しかし今回は、1日目に「WordPressをルータで動かす」ことについてWordPressユーザーグループの方に色々お聞きしたり、「OSC一日目の朝に突如お亡くなりになったOpenWrt (LEDE-Project) ビルド鯖(Xubuntu)の対処法」をUbuntu Japanese Teamの方に詳しくお聞きしたりしました。また、午後からの展示ツアーにも参加し、個人や企業ブースを偏りなく回り、色々知見を得ることができました。企画に感謝です...。

meets "Eject"

OSC 1日目にユーザーグループの展示関連を回っている中で一際異様な雰囲気を放っていたのが、”Ejectコマンドユーザー会(公式サイト)”。何やら床に動くものが... (他の参加者の方のツイート)

自走するCDドライブの破壊力。ユーザー会の方曰く”eject カー”というこれは、1方向のみに回転する車輪を使い、開閉するドライブによってしゃくとり虫に似た要領で進むとのこと。それだけならまだしも、バッテリーを搭載して完全にコードレスにした上、Webサイトから操作もできる(!)という、もはやハードとソフト両面で攻めまくる逸品。 操作用のサイトは公開されていて、来場者もスマホなどから操作して楽しめるようになっていました。

その他にも、Ejectによる金魚の餌やりシステムや鐘(っぽいもの)をつく装置なども紹介されていて、単純な動きでも発想次第で色んなことができるんだなぁ...と。そう思ったところで再度視線が下に向くと... 何かある!! ↓Ejectコマンドユーザー会あっきぃ氏のツイートの画像右下

”Ejectキット5セット配布”これは...

!! 気付いた時には、スマホに指を走らせ”BusyBox eject”と検索、そして手にはEjectキットの入った紙袋が...意識を失うと怖い。 こうして”Eject on 家庭用ルータ”に至りました。 記事長くなったけど、まあいいやこのまま書いてしまおう。

Eject on 家庭用ルータ

さて、このブログでも度々登場するルータ(など)向けLinuxディストリビューション”OpenWrt (LEDE-Project)”、Linux関連のコマンドやツール類がひとまとめになった"BusyBox"というモノを搭載しています。 OpenWrt側のコマンドとしてはEjectを見かけた記憶は無かったものの、もしやBusyBoxにあるのでは...ということで調べたらありました。

lede-busybox_eject

デフォルトではOpenWrtのBusyBoxはejectコマンドを含んでいないので、有効にしたうえで各ルータ用ファームウェアをビルドする必要があります。

用意するもの

  • USB Type-Aポートを搭載し、OpenWrt動作実績のあるルータ

    ドライブに対してEjectコマンドを投げます。当方では、以下のルータを使用しました。

    • BUFFALO WZR-900DHP
    • NEXX WT3020H(またはWT3020F。Flash 8MB版を推奨)
    • Planex VR500
  • CD(またはDVD)ドライブ

    ルータからのコマンドを受け取って開閉します。IDESATAのモノを使用。

  • USB - IDE(またはUSB - SATA)変換アダプタ

    ドライブをルータのUSBポートと接続するための変換アダプタで、センチュリーの「裸族の頭(CRAIU2)」など。当方で動作を確認したのはCRAIU2のみですが、それ以外もたぶん使えるはず... ドライブのインターフェース(IDE/SATA)に合わせます。

  • OpenWrt (LEDE-Project)ビルド用のLinux環境(またはWSL)

    前述の通り、デフォルトではOpenWrtのBusyBoxはEjectコマンドを含んでおらず、利用できないので自前でビルドします。 私自身は普段XubuntuにJenkinsを導入して定期的にビルドさせています。また、Windows 10のWSL (Windows Subsystem for Linux) でも、Anniversary Update以降であればビルドが可能です。ただ、WSLの制約からかビルドが少々遅めです。

ルータでEjectするために必要なものは以上です。なお、上記にある私が使用したルータ用にEjectコマンドを含めてビルドしたLEDE-Projectファームは、Jenkinsで公開しています。大体動作確認はしていますが、実機への投入は自己責任で。

ファームウェアのビルド

実際にファームウェアをビルドします。なお、当方ではOpenWrtからフォークした"LEDE-Project"をもとに作業しています。OpenWrtでもやり方はたぶん同じはず。 ビルド環境の構築については、記事が長くなりすぎるのでここでは書きません。OpenWrtのWikiを参考に、各自で構築してください。
  • make menuconfig ビルドするファームウェアに含めるパッケージと、Linuxカーネルに関する設定を行います。 ビルド環境の構築で "make defconfig" まで終わったら、 "make menuconfig" コマンドでこの設定画面を開きます。
  • Ejectを有効にする

    今回メインとなる、BusyBoxのEjectコマンドを有効化します。 "make menuconfig" の画面で並んでる項目の中から "Base system > busybox" と進みます。デフォルトで拡張設定が無効になっているので "Customize busybox options" にチェックを入れて拡張設定を表示させ、さらに "Miscellaneous Utilities" 以下に "eject" があるので、チェックを入れ有効化します。 "SCSI support" は必要かわからないけど有効にしておきました。

  • カーネルのサポートを追加する

    Ejectコマンドは有効化したので、今度はOpenWrtのLinuxカーネルにCDドライブとUSBのサポートを追加します。 menuconfigのトップに戻り、 "Kernel modules > Block Devices" の "kmod-scsi-cdrom" と "Kernel modules > USB Support" の "kmod-usb-storage", "kmod-usb2" にチェックを入れます。以上でCDドライブをOpenWrtのLinuxカーネルでサポートする設定は完了です。 あとは他に各自必要な設定を済ませてmenuconfigをExitします。デフォルトではWebUIのLuCIが有効になっていないので、入れておくといいかも。 終了時に変更を保存するか聞かれるので、忘れずに。

  • ビルド開始

    設定が終わったので、ビルドを開始します。 "make" コマンドのみでもビルドすることは可能ですが、CPUのコア数に合わせて並列ビルドを行うとそこそこ必要時間を短縮できます。 例:make -j4 ただ、初回のビルド時は ”ビルドに必要なツール類” も同時にビルドするため、時間が多くかかります。 ちなみに、デフォルトではビルド中のコンソールに最低限の情報しか出力されないので、何をしてるか眺めたいときは "V=s" オプションを含めると全部の情報を流せます。 例:make -j4 V=s

  • ビルド完了&ファーム取り出し ビルドが終わると、コンソールの流れが止まり、OpenWrtのディレクトリ内の bin ディレクトリのいくつか下に .bin や .trx 、その他拡張子の付いたファームウェアが生成されています。 ルータの機種名の後に "squashfs-sysupgrade" というモノや "initramfs-uImage" と付いたファームウェアがある(ルータの機種によって変化)ので、自分のルータへのOpenWrtの導入方法に合わせて適切なものを取り出します。 Windows 10のWSLを使用した場合、WSL側のファイルシステムに保存されているので、上記のディレクトリから "/mnt/c/Users/(Winユーザー名)/Downloads/" などにcpコマンドを使ってビルドしたファームウェアをコピーします。

    例:WZR-900DHP用LEDE-ProjectファームをWindows ユーザー "Tofu" のダウンロードフォルダにコピー

    [code language="bash"]cp ./bin/targets/bcm53xx/generic/lede-bcm53xx-buffalo-wzr-900dhp-squashfs.trx /mnt/c/Users/Tofu/Downloads/[/code]

ファームウェアの導入

ビルドしたファームウェアをルータに投入します。 投入方法は機種ごとに異なるので、ここでは省きます。OpenWrtのWikiForumDD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ2chのOpenWrt板などを参考にしてください。

注意事項

OpenWrtなどメーカー純正ではないファームウェアをルータに導入した場合、メーカーによる保証は無くなる他、意図しない動作や故障(所謂文鎮化)を引き起こすことがあります。必ず自己責任の下、導入してください。 また、日本国内では電波法などにより電波の取り扱いが厳しく制限されます。これについても自己責任の下、(本記事の主旨はEjectですが)無線LANルータ等は法に抵触しない様使用してください。

Ejectする

ルータにOpenWrt (LEDE-Project)を導入したら、いよいよEjectします。 ドライブの電源を入れた状態でUSB - IDE(またはUSB - SATA)変換アダプタをルータのUSBポートに接続すると、正常に認識されればOpenWrtの "/dev/" 以下に "sr0" というデバイスが現れます。これがCD (DVD)ドライブです。 この "sr0" に対してEjectコマンドを叩きます。 例:[code language="bash"]eject /dev/sr0[/code] すると、ドライブからトレイが開きます。 また、引数に "-t" を付けるとトレイが閉まり、"-T" では ”現在の状態と逆の状態”(トレイが開いているならば閉まり、トレイが閉まっているならば開く)にします。

↓NEXX WT3020にEjectさせた様子。動画内で実際にEjectするまでが長いのは後悔してる

以上で家庭用ルータでEjectは完了です。OpenWrt (LEDE-Project)はuhttpdやApachelighttpdなどのWebサーバを搭載することもできるので、WebサイトからのEjectも実現できます。 なので色々こねくり回してみると面白そうです。Ejectコマンドユーザー会のGitHubレポジトリで公開されている除夜のEject公式サイト)は動作しました。 また、OSCでEjectコマンドユーザー会の展示でEjectコマンドを発行していたのはRaspberryPiでしたが、ルータならNEXX WT3020など数千円程度で入手できるものでもEjectができます。 拡張性はさすがにRaspberryPiには劣るものの、ルータで色々遊んでみるのも良いのでは。

久しぶりに長い記事を書いたので眠いです。おやすみなさい。