2014年9月3日水曜日

「CuBox-i2」にArchLinuxをインストールしてAsteriskを稼働する

CuBox-iにArchLinuxをインストールする方法は、公式サイトに全て書かれています。
http://www.solid-run.com/wiki/ArchLinux

しかし、暗号のような英語の羅列が意味不明で、既に戦意喪失しました。




このまま、戦わずして負けるわけにはいきません。
どうすれば、この文字列に勝利できるのか・・・。

そうだっ! まずは柔らかい言葉に置き換えてみよう!!



【 Installation(インストール) 】

This installation method produces a SD card with the official ArchLinuxARM installation. The only difference is the use of a script to prepare the SD card. It simply performs all the steps described on the ArchLinuxARM pages for you.

<柔訳>
このインストール方法はね、手順どおり進めていくだけで、ArchLinuxがインストールされたSDカードが出来ちゃうんだよ!
それじゃあ、これから簡単に手順を説明するね。


1.Download the official ArchLinux rootfs [1]

<柔訳>
まずはCuBox-iに対応したArchLinuxをダウンロードしてね。
DL先は[1]に用意しといたよ。


2.Download the installation script (a slightly modified GeexBox script) [2]

<柔訳>
インストール用のスクリプトをダウンロードしてね。(これは、他OS用のスクリプトなんだけど、Arch用にちょっとだけ変更してみたよ。)


3.Insert your SD card in your linux box, check (using dmesg) the name of the device (something like /dev/sdX) and run the following as root

<柔訳>
SDカードをLinuxマシンに挿してね。あ、まだCuBoxには挿しちゃダメだよ。
SDカードを認識したら、sdXの部分の名前を確認してあげて。(例えば「/dev/sdb」とかになってるんじゃないかな。)
(「dmesg」とタイプすればなんとなくわかると思うよ。)
その後は管理者権限(root)で、これからのコマンドを実行してね。

まずは上の1と2をダウンロードしたファイルがあるディレクトリに進んで・・・
それで、次のコマンドを実行だよ。
chmod +x make-sdcard
./make-sdcard /dev/sdX ArchLinuxARM-imx6-cubox-latest.tar.gz


たったこれだけでArchLinuxのインストールが完了しちゃったよ♪


だめだ・・・。この口調は「暗号のような英語の羅列」以下に思えてきた・・・。
と言うより、これを私(おっさん)が書いていると思うと、後で読み返してからが非常に辛い。私の心が泣いている。心が痛い・・・。

しかし、案外ニュアンスが伝わってわかりやすそうな気がするので、精神を病みつつももう少し強行してみます。



【 Post Installation(インストール後) 】

Now you should have a SD card with a (very) basic ArchLinux. Insert it into your Cubox-i (connected to wired ethernet) and boot into ArchLinux, then login as root (password root) and run.

<柔訳>
ArchLinuxをインストールしたSDカードをCuBox-iに挿してみて。
いよいよ、CuBox-iを起動するよ。
あ、そうだ、LANケーブルは最初からつなげておいてね。

起動したらユーザ名(root)とパスワード(root)を入力してログインしてね。
そうしたら、次のコマンドを入力だよ。
pacman -Sy
pacman -Su
(※公式サイトにはlxdeやWiFiをインストールする手順が記載されていますが、今回はインストールしません。)



【 Upgrading to 3.10.30 Kernel(カーネルのアップデート) 】

The official ArchLinux installation comes with the the new 3.10.30 kernel, so you do not need to upgrade on the fresh installation. However, it you are still running an old installation with the 3.0.35 kernel, it is recommended that you upgrade to the 3.10.30 kernel. Before you perform this upgrade make sure that you resent uboot defaults. Reboot your Cubox-i and hit a key when you get to the uboot console, then run the following commands.

<柔訳>
Archをインストールした直後はカーネルが3.0.35というバージョンで、ちょっと古いんだ。
これが古いままだと、動かないソフトがあったり、たまーに不具合が発生するよ。
だからこの際、最新カーネルにアップグレードしちゃおう!
そうだ、アップグレード前には再起動を忘れないでね。
そういうのも含めて、これからの説明どおりに進めていけばOKだよ。


Reboot again and log in as root. Install the new u-boot.

<柔訳>
一度再起動して、rootでログインし直してね。
reboot

新しい「u-boot」をインストールするよ。
pacman -Sy --force uboot-cubox-i

and follow the instructions to flash SPL and u-boot.img on the SD card. The command installs the new uboot overwriting the old SPL and u-boot.img files in /boot. Finally, install the new kernel

<柔訳>
SPLとu-bootを書き換えたら、新しいカーネルをインストールするよ。
pacman -S linux-imx6-cubox-dt

これで新しいカーネルへアップデートかんりょ~♪

(柔モードを終了。心が悲鳴をあげつつも、ヘンな満足感でいっぱいです。)


以上で、CuBox-i2にArchLinuxのインストールが完了です。
これ以降は環境(やりたいこと)によってかなり異なってくるでしょうから、私の備忘録としてだけ記しておきます。



【 Asteriskのインストール 】


Asteriskに何らかの形でキャリアを収容して、MVNOから利用するためのメモです。
私の場合はY!mobileを収容しています。

まずはAsteriskをインストールします。
pacman -S asterisk

すごいです。
単純にpacmanでインストールするだけで、AsteriskはVer12が入り、以下のパッケージが自動的に導入されます。
これだけで、相当数の音声・動画コーデックに対応したIP-PBXが完成します。


Packages (82): alsa-lib-1.0.28-1 damageproto-1.2.1-3 elfutils-0.159-1
enca-1.15-1 ffmpeg-1:2.3.3-1 fixesproto-5.0-3 flac-1.3.0-3
fontconfig-2.11.1-1 freetype2-2.5.3-2 fribidi-0.19.6-1
gnutls-3.3.7-1 graphite-1:1.2.4-1 gsm-1.0.13-8
harfbuzz-0.9.35-1 inputproto-2.3.1-1 jack-0.124.1-1
jansson-2.6-1 json-c-0.12-2 kbproto-1.0.6-2 lame-3.99.5-2
libass-0.11.2-1 libasyncns-0.8-5 libbluray-0.5.0-1
libdrm-2.4.56-1 libice-1.0.9-1 libjpeg-turbo-1.3.1-1
libmodplug-0.8.8.5-1 libogg-1.3.1-2 libpciaccess-0.13.2-2
libpng-1.6.12-1 libpulse-5.0-1 libsamplerate-0.1.8-3
libsm-1.2.2-2 libsndfile-1.0.25-2 libsrtp-15.1c9bd90-3
libtasn1-4.1-1 libtheora-1.1.1-3 libva-1.3.1-2 libvdpau-0.8-1
libvorbis-1.3.4-1 libvpx-1.3.0-1 libx11-1.6.2-2
libx264-1:142.20140311-6 libxau-1.0.8-2 libxcb-1.11-1
libxdamage-1.1.4-2 libxdmcp-1.1.1-2 libxext-1.3.3-1
libxfixes-5.0.1-1 libxi-1.7.4-1 libxml2-2.9.1-5
libxrender-0.9.8-1 libxshmfence-1.1-1 libxslt-1.1.28-3.1
libxtst-1.2.2-1 libxxf86vm-1.1.3-1 llvm-libs-3.4.2-1.1
mesa-10.2.6-1 mesa-libgl-10.2.6-1 nettle-2.7.1-1
opencore-amr-0.1.3-2 openjpeg-1.5.2-1 opus-1.1-1.1
orc-0.4.19-1 p11-kit-0.20.2-1 pjproject-2.2.1-3
portaudio-19_20140130-1 recode-3.6-8 recordproto-1.14.2-2
renderproto-0.11.1-3 rtmpdump-20131205-1 schroedinger-1.0.11-2
sdl-1.2.15-6 speex-1.2rc1-4 v4l-utils-1.2.1-1 wayland-1.5.0-1
xcb-proto-1.11-1 xextproto-7.3.0-1 xf86vidmodeproto-2.3.1-3
xproto-7.0.26-1 xvidcore-1.3.3-1 asterisk-12.4.0-1


これでAsteriskのインストールは完了ですが、CLIを起動する上で1つだけ足りないモジュールがあります。
それをインストールしないままCLIを起動すると、こんなメッセージが出ます。 

error while Loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory

他サイトによれば、これはDSOモジュールとしてSQLiteが読み込めてないと言うことらしいです。「libsqlite3.so.0(本体 libsqlite3.so.0.8.6)」のシンボリックリンクを「/usr/lib」に置くことで解決するとのことですが・・・。

今回インストールしたArchLinuxには、そもそもSQLiteが入っていないのではないかと考え、普通にパッケージをインストールしました。(結果、当たりでした。)
pacman -S sqlite

ポートの開放に関しては非常に悩みました。
どうがんばっても、AsteriskのUDPポート5060にパケットが到達しないのです。
ルータのポートマッピング、iptablesによるファイヤーウォール等々、ここには書ききれないほど色々なことを試しました。
しかし、どうしてもパケットが遮断されます。
試しにプロトコルをUDPからTCPに変更したところ、AsteriskでListen中のポート5060に反応がありました。

ここでやっと気付きました。
プロバイダから提供されたHGW(ルータ)に原因があるのではないかと。

私が契約しているプロバイダ(auひかり)用HGW「BL900HW」の裏設定で、UDP5060がコンフリクトしているように思えます。

(以降、特に何も注意がない限り、「sip.conf」内の[general]の設定です。)

そこでUDPポートを5060から5062に変更しました。
bindport=5062

今までの苦労は何だったのか・・・?と言うほどあっさりパケット通過、レジスト完了。
(ポート5062はセキュリティ的にも好都合なので、このまま採用します。)

今回はローカルでの利用だけでなく、外からも常時利用するのでexternipを設定します。
なお、これを設定しないと外部からの接続でNATが解決できません。
externip=114.17.xxx.xxx  ;(WAN側IPアドレス)

さらに、これだけではまだNATの解決には至らず、以下を追加します。
(これは[general]ではなくユーザのところに記載しました。)
nat=yes

これでやっとNATをスムーズに乗り越えられるようになります。

また多様な環境に、より柔軟な対応ができるように、使用可能コーデックを多めにします。
disallow=all
allow=ulaw
allow=alaw
allow=gsm
allow=g729
allow=ilbc
allow=speex

さらに、接続が確立した後は、音声ストリームのやりとりは端末間でやってもらいたいため、Asteriskサーバをバイパスさせます。
canreinvite=yes

これで完成。
もちろん他にも細かいところはいじっていますが、わかりにくかったところはこのぐらいでした。


これですべて完成かと思っていたのですが、新たな不具合発生です。
同じAsteriskにぶら下がっているイエデン(ブラステル)の着信時の音声パケットのうち、送信側が通らなくなりました。

この対応として、HT702のRTPポートを5004から15004に変更しました。
しかしこれでも、まだ通りません。
NATの解決がうまくいかないようです。

そこで、発想を換え、ブラステルはスッパリ諦めます。
無理にAsteriskにレジストする必要はないため、HT702から直接ブラステルをレジストします。

どうせカケホーダイ回線を収容しているので、内線通話はなくてもいいかなと言う判断です。

最後に時刻合わせです。
ログを見ている時に世界標準時刻では見難いため、日本時刻に合わせます。
(これはAsteriskの設定ではなく、Linuxのコマンドです。)
timedatectl set-timezone Asia/Tokyo

以上で、Asteriskの設定は終了です。
後は適切なSIPクライアントに3G接続時とWi-Fi接続時の両方を設定して、開通完了。



【 感想 】

今回は難しすぎて、途中何度も投げ出したくなりました。

実はArchLinuxに至る前はUbuntuで同様のことをしていました。
ですが、どうしてもポート5060が開放できず、元来使いたかったArchに逃げてきた感じです。

今にして思えば、Ubuntuのせいではなく、auひかり(HGW)のせいだったことがわかります。

結果オーライと言えば聞こえは良いのですが、今回の件では自分の知識不足を痛感しました。
ですが、初めてLinuxに触れてから2ヶ月弱、ここまで来れれば上出来です。
ちょっと自分を褒めてあげたいぐらいです。

・・・と言うことを妻に話してみたところ、
『そんなことどうでもいいんだけどさ、トイレットペーパーが無いんだけど!』
と、会話がトイレの話に瞬時に切り替わりました。(TдT)

サーバ完成後、私の最初の任務はトイレットペーパーの調達でした。
トイレットペーパー片手に、自己満に満たされつつ家路につく私でした
    

2 件のコメント :

  1. 最近よく読ませて頂いてます。
    やっぱり面白い記事です。メインの話題は私にはちんぷんかんぷんでしたが、奥様とのやり取りに妙に共感を覚えます。いつまで経って一番身近な人にこの熱い思いを理解してもらえないもどかしさですかね。

    返信削除
  2. やおきんさん
    コメントありがとうございます。

    このブログ誕生の理由が妻です。
    この「自己満に満たされた私の心」の行き場としてブログに到達しました(笑)

    私が妻に対し熱く語ってると、我が奥様は・・・居眠りします。

    妻の首が「カクンッ」となってるのに、
    妻「あ、聞いてる、聞いてるよ?たぶん。」

    いや、絶対に聞いてないと思います。と言うか「たぶん」って何!?

    とまあ、そんな奥様ですが、私のワガママもいっぱい聞いてくれるのでよしとします♪

    今回のようなマニアックな記事もありますが、今後ともよろしくお願いしますm(__)m

    返信削除