2013年10月1日火曜日

Mac OS X Mountain Lion で RaspberryPi とシリアル接続する

前回の記事、FreeBSD on RaspberryPi でシリアルコンソールを使用するでは、FreeBSD box と FreeBSD on RaspberryPi とのシリアル接続でしたが、この記事では、Mac OS X Mountain Lion と FreeBSD on RaspberryPi とのシリアル接続を扱います。

RaspberryPi の設定などは全く同じですが、記事の読みやすさを考慮して、こちらにも手順を再掲します。

RaspberryPi でシリアル接続をするのに、今回使用しているのは、GPIO に直接差して使うタイプの、3線式 USB シリアル変換ケーブルです。ケーブルの色などはお持ちのものに適宜読み替えてください。


1: RaspberryPi にシリアルコンソールの設定をする

  1. /boot/loader.rc の先頭に以下の設定を追加します。
    \ use serial console
    set boot_multicons="YES"
    set boot_serial="YES"
    set comconsole_speed="115200"
    set console="comconsole,vidconsole"
    
  2. /etc/ttys に以下の設定を追加します。crochet でイメージを作ると恐らくこのエントリーは入っているはずなので、その場合は、デフォルトでは dialup になっている部分を vt100 に修正します。
    ttyu0   "/usr/libexec/getty 3wire.115200"       vt100   on secure
    

2: RaspberryPi にケーブルを差す

RaspberryPi の GPIO に間違えないように注意しながらケーブルを差します。

PaspberryPi は一旦シャットダウンして電源を切っておくことを強くお勧めします。

GPIO が RaspberryPi の右上にくるように見た場合、左側の列の一番上がピン番号 1、右側の列の一番上がピン番号 2 なので、右側の上から 3 番目が 6:GND, 4 番目が 8:TX, 5番目が 10:RX です。

OLIMEX のケーブルは、GNDは青、RX(INPUT)はグリーン、TX(OUTPUT)は赤、とリンク先に書いてありますので、青 (GND) を 3 番目、グリーン (RX) を 4 番目、赤 (TX) を 5 番目に差します。RX、TX をクロスにするのがポイントです。尚、上から 1,2 番目は 5V ですので、うっかり間違えないように注意しましょう。

3: Mac OS X に USB シリアル用デバイスドライバを追加する

Mac OS X 用の Prolific PL2303 のデバイスドライバは、Prolific のサイトからダウンロードすることができます。

PL2303 Mac OS X Driver Download http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41

今回は、md_PL2303_MacOSX-10.6up_v1.5.1.zip をクリックしてダウンロードします。

ダウンロードしたファイルはダブルクリックして解凍し、PL2303_MacOSX_v1.5.1.pkg をクリックしてインストールします。

この時点で USB ケーブルを差してみて、RaspberryPi に電源を投入し、双方でシリアル USB がきちんと認識されるかどうかと、作成されるデバイスファイル名を確認します。デバイスファイルは、/dev の下に、 Max OS X 側には cu.usbserial と tty.usbserial、RaspberryPi 側には cuau0 と ttyu0 ができているはずです。

また、以下のコマンドを RaspberryPi 側で実行することで、シリアル出力のプロセスが正しく動作しているかどうかを確認することができます。

% ps -axww | grep getty
1275 u0  Is+  0:00.03 /usr/libexec/getty 3wire.115200 ttyu0
1271 v0  Is+  0:00.03 /usr/libexec/getty Pc ttyv0
1272 v1  Is+  0:00.03 /usr/libexec/getty Pc ttyv1
1273 v2  Is+  0:00.03 /usr/libexec/getty Pc ttyv2
1274 v3  Is+  0:00.03 /usr/libexec/getty Pc ttyv3

4: Mac OS X に minicom をインストールする

Mac OS X ではデフォルトで screen が使えるので、別にこれでもいいや、という人は特にインストールする必要はありません。
screen でシリアル接続をするのであれば、

% screen /dev/tty.usbserial 115200

で RaspberryPi とシリアル接続することができます。

しかし、わたしは、screen でシリアル接続して RaspberryPi にビルドさせている時に、ビルド中にエラーが発生すると、なぜかその時画面に出力されていたビルドログだけが画面表示から消えてしまうが、シリアル接続は切れていない、という謎現象に悩まされたため、結局 Mac OS X でも minicom を入れることにしました・・。

まず、ソースコードをダウンロードします。

minicom http://alioth.debian.org/projects/minicom/

ページの中ほどにある「最新ファイルリリース」の download のアイコンをクリックすると、ファイルリストのページに飛びますので、Latest version と表示されているバージョンの tar.gz ファイルをクリックしてダウンロードします。今回は、minicom-2.6.2.tar.gz をダウンロードしました。

ダウンロードしたら、クリックして解凍します。Mac って便利ですよね。

解凍したら、以下を実行します。
尚、Mac OS X Mountain Lion では、以下のコマンドの実行には、Xcode 及び、Command Line Tools ( Xcode の Preferences からインストール) が必要となります。

% cd Downloads/minicom-2.6.2
% ./configure
% sudo make
% sudo make install

デフォルトでは、/usr/local/binにインストールされますので、/usr/local/bin へのパスは通しておきましょう。

5: minicom の設定をする

ここで minicom の設定をします‥。いきなり起動しようとすると、おそらくエラーになりますので注意です。

% sudo minicom -s
            +-----[configuration]------+
            | Filenames and paths       |
            | File transfer protocols     |
            | Serial port setup             |
            | Modem and dialing          |
            | Screen and keyboard      |
            | Save setup as dfl            |
            | Save setup as..               |
            | Exit                                 |
            | Exit from Minicom           |
            +------------------------------+

こんな画面が表示されて、カーソルキーでメニュー選択ができます。英語な分表示が崩れないので、まだ、いろんな意味でだいぶんましです。

その中の、「Serial port setup」を、それぞれ、以下の内容に修正する必要があります。頭のアルファベットを選ぶと該当の部分にカーソルが飛びますので、なんとか目的の内容になるように入力してください。
尚、シリアルデバイスのパスはご自分の環境にあわせてください。多分このままで大丈夫だとは思いますが。

A - Serial Device
/dev/tty.usbserial
E - Bps/Par/Bits
115200 8N1
F - Hardware Flow Control
No
G - Software Flow Control
Yes

全ての設定を終えたら、「Save setup as dfl」して終了します。もしくは、「Save setup as..」で任意の設定ファイルを指定して終了することもできますが、その場合は起動するときに設定ファイルを指定して起動する必要があります。

6: minicom を起動する

設定が全て完了したら、後はただ起動するだけです。

% minicom

自分で設定ファイルを指定した場合は

% minicom -o 設定ファイル名

特に問題なければ以下のようなメッセージが画面に表示されます。

Welcome to minicom 2.6.2

OPTIONS:                                                                     
Compiled on Oct  1 2013, 12:24:06.                                           
Port /dev/tty.usbserial, 14:39:02                                            
                                                                             
Press CTRL-A Z for help on special keys 

こんな感じに表示されたら、あとはシリアルコンソールを使うだけです。

RaspberryPi が起動済みであれば、このあとエンターキーを押したりすれば、ログインプロンプトが表示されるはずなので、無事にログインできれば ok です。

念のため RaspberryPi を再起動してみて、無事に起動メッセージが表示されるかどうか確認してみるといいでしょう。

2013年9月12日木曜日

FreeBSD on RaspberryPi でシリアルコンソールを使用する

RaspberryPi だと、通常の作業では ssh でログインして作業するので大体間に合ってはいるのですが、どうも最近無線が不安定なのか、何かをやっている最中によく ssh が落ちてしまっていろいろ面倒だったので、シリアルコンソールが使えるように設定してみました。やっぱり、これはこれで便利ですよね。いざというときにいちいちディスプレイつながなくてもいいし。

RaspberryPi でシリアル接続をするのに、多分一番お手軽に使えるのが、GPIO に直接差して使うタイプの、3線式 USB シリアル変換ケーブルです。

わたしは、ここで買いました。送料を含めても多分一番お安いのではないかと思います。

ただ、よく売ってる RaspberryiPi 用のケースって GPIO のところに穴が開いてないんですよね。

なので、とりあえず、こんな感じに穴を開けてみました。適当にやったわりにはそれっぽく見えるので、ま、いいか~。

それでは実際の設定方法です。ここで想定しているのは FreeBSD の入った RaspberryPi と FreeBSD box とのシリアル通信です。


1: RaspberryPi にシリアルコンソールの設定をする

  1. /boot/loader.rc の先頭に以下の設定を追加します。
    \ use serial console
    set boot_multicons="YES"
    set boot_serial="YES"
    set comconsole_speed="115200"
    set console="comconsole,vidconsole"
    
  2. /etc/ttys に以下の設定を追加します。crochet でイメージを作ると恐らくこのエントリーは入っているはずなので、その場合は、デフォルトでは dialup になっている部分を vt100 に修正します。
    ttyu0   "/usr/libexec/getty 3wire.115200"       vt100   on secure
    

2: RaspberryPi にケーブルを差す

RaspberryPi の GPIO に間違えないように注意しながらケーブルを差します。

PaspberryPi は一旦シャットダウンして電源を切っておくことを強くお勧めします。

GPIO が RaspberryPi の右上にくるように見た場合、左側の列の一番上がピン番号 1、右側の列の一番上がピン番号 2 なので、右側の上から 3 番目が 6:GND, 4 番目が 8:TX, 5番目が 10:RX です。

OLIMEX のケーブルは、GNDは青、RX(INPUT)はグリーン、TX(OUTPUT)は赤、とリンク先に書いてありますので、青を 3 番目、グリーンを 4 番目、赤を 5 番目に差します。尚、上から 1,2 番目は 5V ですので、うっかり間違えないように注意しましょう。

3: FreeBSD box に USB シリアル用デバイスドライバを追加する

今回使用している USB シリアル変換ケーブルは、Prolific PL2303 を使用している、とのことなので、以下の設定を /boot/loader.conf に追加します。

uplcom_load="YES"
ucom_load="YES"

ここで一旦再起動するか、再起動するのが面倒な場合は、以下のコマンドを実行して手動でカーネルモジュールを読み込みます。

# kldload uplcom
# kldload ucom

ちなみに、dmesg の出力は以下の通りです。

ugen2.3: <Prolific Technology Inc.> at usbus2
uplcom0: <Prolific Technology Inc. USB-Serial Controller, class 0/0, rev 1.10/3.00, addr 3> on usbus2

この時点で USB ケーブルを差してみて、RaspberryPi に電源を投入し、双方でシリアル USB がきちんと認識されるかどうかと、作成されるデバイスファイル名を確認します。デバイスファイルは、/dev の下に、FreeBSD box 側には cuaU0 と ttyU0、RaspberryPi 側には cuau0 と ttyu0 ができているはずです。

また、以下のコマンドを RaspberryPi 側で実行することで、シリアル出力のプロセスが正しく動作しているかどうかを確認することができます。

% ps -axww | grep getty
1275 u0  Is+  0:00.03 /usr/libexec/getty 3wire.115200 ttyu0
1271 v0  Is+  0:00.03 /usr/libexec/getty Pc ttyv0
1272 v1  Is+  0:00.03 /usr/libexec/getty Pc ttyv1
1273 v2  Is+  0:00.03 /usr/libexec/getty Pc ttyv2
1274 v3  Is+  0:00.03 /usr/libexec/getty Pc ttyv3

4: FreeBSD box に minicom をインストールする

シリアルコンソールを使うのに、一番無難‥ならしいので、ports から minicom をインストールします。

# cd /usr/ports/comms/minicom/
# make config-recursive
# make install clean

このままの状態で、minicom を起動してデバイスにアクセスしようとすると permission deny になるため、以下を実行します。

# chmod -s /usr/local/bin/minicom

5: minicom の設定をする

minicom の設定は面倒臭いです。なんか、古くてあまり思い出したくないようなユーザインターフェースを思いっきり見せつけられちゃいます‥。

でも、仕方ないので、基本設定を行います。

# minicom -s
            +-----[設定]------+
            | ファイル名とパス名     |
            | ファイル転送プロトコル   |
            | シリアルポート       |
            | モデムとダイヤル      |
            | 画面とキーボード      |
            | "dfl" に設定を保存  |
            | 新規に設定を保存      |
            | 終了            |
            | Minicom を終了   |
            +---------------+

こんな画面が表示されて、カーソルキーでメニュー選択ができます。冗談抜きで、こんな感じに表示されます。

その中の、シリアルポートの設定を、それぞれ、以下の内容に修正する必要があります。頭のアルファベットを選ぶと該当の部分にカーソルが飛びますので、なんとか目的の内容になるように入力してください。
尚、シリアルデバイスのパスはご自分の環境にあわせてください。多分このままで大丈夫だとは思いますが。

A - シリアルデバイス
/dev/ttyU0
E - 速度/パリティ/ビット
115200 8N1
F - ハードウェア流れ制御
いいえ
G - ソフトウェア流れ制御
はい

全ての設定を終えたら、「"dfl" に設定を保存」して終了します。もしくは、任意の設定ファイルを指定して終了することもできますが、その場合は起動するときに設定ファイルを指定して起動する必要があります。

6: minicom を起動する

設定が全て完了したら、後はただ起動すればおkです。

# minicom

自分で設定ファイルを指定した場合は

# minicom -o 設定ファイル名

特に問題なければ以下のようなメッセージが画面に表示されます。

minicom へようこそ 2.6.2

オプション: I18n 
コンパイルされた日時は:  Sep 10 2013, 23:10:21.
ポート /dev/ttyU0, 18:02:51

CTRL-A Z を押すと、説明画面になります。

こんな感じに表示されたらシリアルコンソールを使用する準備が無事完了したということです。

RaspberryPi が起動済みであれば、このあとエンターキーを押したりすれば、ログインプロンプトが表示されるはずなので、無事にログインできれば ok です。

念のため RaspberryPi を再起動してみて、無事に起動メッセージが表示されるかどうか確認してみるといいでしょう。

8: なんかうまくいかないときは・・

結構いくつかはめられどころがあったので、一応ここに書いておきます・・。

A: ちゃんとデバイスドライバを入れてるのに、USB シリアルがうまく認識されないで、変なエラーがでます

usbd_setup_device_desc: getting device descriptor at addr 2 failed, USB_ERR_STALLED
usbd_setup_device_desc: getting device descriptor at addr 2 failed, USB_ERR_STALLED
usbd_setup_device_desc: getting device descriptor at addr 2 failed, USB_ERR_STALLED
usbd_setup_device_desc: getting device descriptor at addr 2 failed, USB_ERR_STALLED
usbd_setup_device_desc: getting device descriptor at addr 2 failed, USB_ERR_STALLED
ugen1.3:  at usbus1 (disconnected)
uhub_reattach_port: could not allocate new device

複数 USB のポートがある時に、うまく認識されるポートと認識されないポートがありました。なので、とりあえず、USB のポートを全て試してみると解決するかもしれません。

B: 設定はうまくいってるはずなのに、minicom にログインプロンプトが表示されません

RaspberryPi の GPIO の接続を間違えてないか確認しましょう。特に赤と緑を逆に接続しがちです・・。

C: ログインプロンプトはでたのに、キー入力ができません

minicom の「F - ハードウェア流れ制御」と「G - ソフトウェア流れ制御」の値が正しく設定されているかどうか確認してみましょう。

2013年8月22日木曜日

inline assembler コードをdisable した clang と inline assembler コードを enable した gcc4.2 のベンチマークテスト

freebsd-arm の ml で、security/libgcrypt をinline assembler コードをdisable した clang と inline assembler コードをenable した gcc4.2 ではどちらが速いのか、という話が出ていたのですが、どうも誰も実験してみないようなので、試しに実験してみました♪

security/libgcrypt は、make install した後の work の中に、なんとびっくり、テスト用のアプリがいろいろ入っているのです。しかも、そのものずばり、benchmark というアプリがあるので、これを使って実行結果を見てみることにしました。テストアプリの基本的な使い方は、好きなアプリを選んでファイルを実行するだけという、お手軽仕様。便利な世の中になったものですね〜。

ちなみに、うっかり clean しちゃうと work がなくなっちゃいますので、要注意です。

# cd /usr/ports/security/libgcrypt/work/libgcrypt-1.5.3/tests 
# ./benchmark > /path/to/home/benchmark.txt

ちなみに、テストに使用した RPI の uname -a は次の通りです。

FreeBSD raspberry-pi 10.0-CURRENT FreeBSD 10.0-CURRENT #0: Tue Aug 13 03:22:23 JST 2013 user@PC:/usr/home/user/crochet-freebsd/work/obj/arm.armv6/usr/src.arm/sys/RPI-B-ELY arm

clang の最適化機能は下手なアセンブラよりも上という噂も聞かないではないので、真面目な話どっちがどのくらい速いのかというのは非常に興味深いですよね。
さてさて、結果はいかに !?


USE_GCC=4.2 longling.h inline assmbler enable

MD5          234375ms 625000ms 3984375ms 546875ms 156250ms
SHA1         546875ms 781250ms 4218750ms 859375ms 468750ms
RIPEMD160    468750ms 859375ms 4140625ms 859375ms 468750ms
TIGER192     1093750ms 1484375ms 5156250ms 1328125ms 1171875ms
SHA256       781250ms 1484375ms 5000000ms 1171875ms 781250ms
SHA384       1953125ms 3046875ms 6250000ms 2265625ms 1875000ms
SHA512       1953125ms 3046875ms 6250000ms 2265625ms 1953125ms
SHA224       781250ms 1562500ms 5000000ms 1093750ms 937500ms
MD4          78125ms 468750ms 3750000ms 546875ms 234375ms
CRC32        234375ms 234375ms 4375000ms 468750ms 312500ms
CRC32RFC1510 234375ms 156250ms 4375000ms 468750ms 390625ms
CRC24RFC2440 1171875ms 1171875ms 5625000ms 1484375ms 1250000ms
WHIRLPOOL    6484375ms 6953125ms 14843750ms 6875000ms 6562500ms
TIGER        1093750ms 1562500ms 5156250ms 1328125ms 1015625ms
TIGER2       1015625ms 1484375ms 5156250ms 1406250ms 1171875ms

                ECB/Stream         CBC             CFB             OFB             CTR      
             --------------- --------------- --------------- --------------- ---------------
IDEA         3437500ms 3359375ms 3671875ms 3750000ms 3515625ms 3593750ms 3593750ms 3593750ms 5468750ms 5468750ms
3DES         7343750ms 7343750ms 7734375ms 7812500ms 7578125ms 7656250ms 7734375ms 7656250ms 9609375ms 9609375ms
CAST5        1796875ms 1875000ms 2031250ms 2109375ms 1953125ms 1953125ms 2031250ms 2031250ms 3906250ms 3828125ms
BLOWFISH     2187500ms 2109375ms 2421875ms 2421875ms 2343750ms 2265625ms 2421875ms 2343750ms 4218750ms 4296875ms
AES          1953125ms 1796875ms 1875000ms 1796875ms 1718750ms 1718750ms 2265625ms 2109375ms 1718750ms 1796875ms
AES192       2187500ms 2109375ms 2187500ms 2031250ms 2031250ms 2031250ms 2421875ms 2421875ms 2031250ms 2031250ms
AES256       2421875ms 2421875ms 2421875ms 2343750ms 2265625ms 2343750ms 2734375ms 2656250ms 2265625ms 2265625ms
TWOFISH      1562500ms 1640625ms 1718750ms 1875000ms 1718750ms 1640625ms 1796875ms 1718750ms 3515625ms 3515625ms
ARCFOUR      390625ms 468750ms
DES          2968750ms 3046875ms 3359375ms 3437500ms 3281250ms 3203125ms 3281250ms 3359375ms 5156250ms 5234375ms
TWOFISH128   1562500ms 1640625ms 1796875ms 1796875ms 1718750ms 1640625ms 1640625ms 1718750ms 3515625ms 3515625ms
SERPENT128   1875000ms 1796875ms 2109375ms 2109375ms 2031250ms 2031250ms 1953125ms 2109375ms 3828125ms 3828125ms
SERPENT192   1875000ms 1796875ms 2109375ms 2031250ms 2031250ms 2031250ms 2109375ms 2031250ms 3828125ms 3828125ms
SERPENT256   1875000ms 1796875ms 2109375ms 2031250ms 1953125ms 2031250ms 2031250ms 2109375ms 3828125ms 3828125ms
RFC2268_40   2578125ms 2031250ms 2812500ms 2421875ms 2656250ms 2734375ms 2656250ms 2734375ms 4609375ms 4609375ms
SEED         1875000ms 1875000ms 1953125ms 2187500ms 1953125ms 1953125ms 1953125ms 2109375ms 3828125ms 3828125ms
CAMELLIA128  3359375ms 3359375ms 3593750ms 3671875ms 3515625ms 3437500ms 3515625ms 3593750ms 5312500ms 5390625ms
CAMELLIA192  3828125ms 3828125ms 4062500ms 4140625ms 3984375ms 3984375ms 4062500ms 3984375ms 5859375ms 5703125ms
CAMELLIA256  3828125ms 3828125ms 4062500ms 4140625ms 3984375ms 3984375ms 4062500ms 4062500ms 5703125ms 5781250ms

Algorithm         generate  100*sign  100*verify
------------------------------------------------
RSA 1024 bit       8593750ms   78359375ms     2187500ms
RSA 2048 bit       45546875ms   418671875ms     5625000ms
RSA 3072 bit       1337109375ms   1147109375ms     10234375ms
RSA 4096 bit       881875000ms   2457812500ms     16640625ms
DSA 1024/160             -   37343750ms     40156250ms
DSA 2048/224             -   139531250ms     132343750ms
DSA 3072/256             -   299609375ms     275390625ms
ECDSA 192 bit      3437500ms   87734375ms     157812500ms
ECDSA 224 bit      4218750ms   107187500ms     192500000ms
ECDSA 256 bit      5078125ms   126328125ms     236875000ms
ECDSA 384 bit      10078125ms   253593750ms     478984375ms
ECDSA 521 bit      24062500ms   596796875ms     1134765625ms

powm       2890625ms 7812500ms 21250000ms

random     390625ms 468750ms

clang longling.h inline assmbler disable

MD5          234375ms 468750ms 3046875ms 468750ms 390625ms
SHA1         468750ms 703125ms 3359375ms 703125ms 390625ms
RIPEMD160    468750ms 703125ms 3281250ms 625000ms 390625ms
TIGER192     703125ms 1171875ms 3828125ms 1015625ms 625000ms
SHA256       781250ms 1328125ms 4062500ms 1015625ms 781250ms
SHA384       1328125ms 2187500ms 4687500ms 1562500ms 1328125ms
SHA512       1250000ms 2187500ms 4687500ms 1562500ms 1328125ms
SHA224       703125ms 1328125ms 4062500ms 937500ms 859375ms
MD4          156250ms 468750ms 2968750ms 468750ms 234375ms
CRC32        78125ms 156250ms 2578125ms 390625ms 234375ms
CRC32RFC1510 156250ms 156250ms 2500000ms 390625ms 312500ms
CRC24RFC2440 546875ms 546875ms 2890625ms 781250ms 703125ms
WHIRLPOOL    6015625ms 6406250ms 9296875ms 6328125ms 6093750ms
TIGER        781250ms 1093750ms 3906250ms 937500ms 859375ms
TIGER2       703125ms 1171875ms 3828125ms 937500ms 859375ms

                ECB/Stream         CBC             CFB             OFB             CTR      
             --------------- --------------- --------------- --------------- ---------------
IDEA         2187500ms 2109375ms 2421875ms 2500000ms 2343750ms 2187500ms 2265625ms 2343750ms 4062500ms 3984375ms
3DES         5000000ms 5000000ms 5234375ms 5312500ms 5156250ms 5156250ms 5234375ms 5234375ms 6875000ms 6953125ms
CAST5        1562500ms 1562500ms 1875000ms 2031250ms 1640625ms 1718750ms 1718750ms 1718750ms 3515625ms 3515625ms
BLOWFISH     1640625ms 1796875ms 2109375ms 2109375ms 1953125ms 1796875ms 1953125ms 1953125ms 3671875ms 3671875ms
AES          1406250ms 1406250ms 1250000ms 1250000ms 1250000ms 1250000ms 1562500ms 1640625ms 1250000ms 1250000ms
AES192       1640625ms 1484375ms 1484375ms 1406250ms 1406250ms 1406250ms 1796875ms 1875000ms 1406250ms 1484375ms
AES256       1796875ms 1718750ms 1718750ms 1562500ms 1640625ms 1640625ms 2031250ms 2031250ms 1640625ms 1640625ms
TWOFISH      1406250ms 1328125ms 1640625ms 1640625ms 1484375ms 1484375ms 1562500ms 1484375ms 3203125ms 3125000ms
ARCFOUR      468750ms 390625ms
DES          2265625ms 2265625ms 2500000ms 2656250ms 2343750ms 2421875ms 2421875ms 2500000ms 4140625ms 4140625ms
TWOFISH128   1328125ms 1406250ms 1562500ms 1640625ms 1484375ms 1562500ms 1484375ms 1640625ms 3125000ms 3125000ms
SERPENT128   1718750ms 1640625ms 1875000ms 1875000ms 1796875ms 1796875ms 1796875ms 1875000ms 3437500ms 3437500ms
SERPENT192   1562500ms 1562500ms 1875000ms 1875000ms 1796875ms 1796875ms 1796875ms 1953125ms 3437500ms 3437500ms
SERPENT256   1718750ms 1562500ms 1953125ms 1875000ms 1718750ms 1718750ms 1796875ms 1875000ms 3437500ms 3359375ms
RFC2268_40   1718750ms 2187500ms 2031250ms 2500000ms 1796875ms 1875000ms 1953125ms 1875000ms 3593750ms 3593750ms
SEED         1406250ms 1406250ms 1640625ms 1640625ms 1562500ms 1484375ms 1562500ms 1562500ms 3125000ms 3125000ms
CAMELLIA128  2812500ms 2734375ms 3125000ms 3125000ms 2890625ms 2890625ms 2890625ms 2890625ms 4531250ms 4609375ms
CAMELLIA192  3046875ms 3046875ms 3281250ms 3359375ms 3203125ms 3125000ms 3203125ms 3203125ms 4843750ms 4843750ms
CAMELLIA256  3125000ms 3046875ms 3359375ms 3359375ms 3046875ms 3203125ms 3203125ms 3281250ms 4843750ms 4765625ms

Algorithm         generate  100*sign  100*verify
------------------------------------------------
RSA 1024 bit       10000000ms   103359375ms     3125000ms
RSA 2048 bit       230468750ms   602031250ms     8437500ms
RSA 3072 bit       1168750000ms   1783750000ms     16640625ms
RSA 4096 bit       1171875000ms   3805000000ms     27109375ms
DSA 1024/160             -   50703125ms     53046875ms
DSA 2048/224             -   211640625ms     197968750ms
DSA 3072/256             -   489843750ms     439531250ms
ECDSA 192 bit      3515625ms   90390625ms     162968750ms
ECDSA 224 bit      4453125ms   111093750ms     207421875ms
ECDSA 256 bit      5468750ms   134062500ms     254296875ms
ECDSA 384 bit      11484375ms   281718750ms     528203125ms
ECDSA 521 bit      26640625ms   667500000ms     1300156250ms

powm       3671875ms 11015625ms 32031250ms

random     390625ms 234375ms

ちょっと、数値がいっぱい過ぎて、細かい検証はしてません。(爆

結局、longlong.h の使われ方にも左右されるのでしょうが、やっぱり、全体的に inline assembler enable な gcc の方が速いことが多い・・ように見えますね。これで、clang の方が速い!とかだったら、面白かったのにな〜。今はどうしても、asm コードが原因でビルドが通らないことが多いので、やっぱり、なんとか asm コードが通るようになってほしいものですね・・。

2013年8月21日水曜日

FreeBSD on RaspberryPi で Xorg を WITH_NEW_XORG を有効にしてビルドする

前の記事では、WITH_NEW_XORG を有効にしないで、ビルドする方法の解説でしたが、 ようやくWITH_NEW_XORG を有効にして、Xorg をビルドすることができました。

もっとも、ビルドできただけなので、どこまできちんと動作するのかは正直まだ未知数ではありますが・・。

せっかくなので、とりあえず、fvwm2 も追加で入れて写真をとってみました。たまに落ちたりもしますが、動くことは動くみたいです。

詳しいビルド方法については、現在 github に必要なパッチを適用した ports を入れたリポジトリと一緒に、ドキュメントを公開しています。

freebsd-ports-xorg-raspberrypi

同じドキュメントの日本語版は以下になります。


FreeBSD on RaspberryPi での Xorg のビルド方法

1: 事前準備

このビルドで使用する FreeBSD RaspberryPi のイメージは、"MALLOC_PRODUCTION=yes" オプションを有効にしてビルドしてください。このオプションが設定されていないと、jemalloc 問題 (Failed assertion) で glib20 がビルドに失敗する原因になります。イメージをビルドするのに crochet-freebsd を使用している場合は、"__MAKE_CONF"オプションを指定することで、ビルドに使用する "make.conf" の指定ができます。

"WITH_NEW_XORG=yes" を指定したビルドも可能ですので、その場合は、このオプションを "make.conf" に設定してください。

2: ports tree の取得

イメージ作成時に、crochet-freebsd では "UsrPorts" オプションを指定することで、ports tree をあらかじめインストールすることができます。もしくは、RPI 上で以下のコマンドを使用して、手動で ports tree を取得することもできます。

    # portsnap fetch
    # portsnap extract
    # cd /usr/ports
    # make fetchindex

3: 修正版の適用

ビルドを無事に完了させるために、事前に ports tree に修正を適用する必要があります。

(1) x11/xorg-server

Aleksandr Rybalko 氏が作成された FreeBSD ARM でxorg-server がビルドできない問題の修正版

    # fetch --no-verify-peer https://github.com/rayddteam/x11-servers-xorg-server/archive/master.zip
    # unzip master.zip
    # rm master.zip
    # cd x11-servers-xorg-server-master
    # cp -rf * /usr/ports/x11-servers/xorg-server/
    # cd ../

(2) x11-drivers/xf86-video-scfb

Aleksandr Rybalko 氏による xf86-video-scfb の移植版

    # fetch --no-verify-peer https://github.com/rayddteam/xf86-video-scfb/archive/master.zip
    # unzip master.zip
    # rm master.zip
    # cp -rf xf86-video-scfb-master /usr/ports/x11-drivers/xf86-video-scfb/

(3) x11-font/fontconfig, x11/pixman

デフォルトビルドで、x11-fonts/fontconfig の fc-cache が ARM で Segmentation fault (core dumped) する問題 (ports/181372)、 及び、ARM で x11/pixman がビルドできない問題 (ports/181372)、の修正版

    # fetch --no-verify-peer https://github.com/taguchi-ch/freebsd-ports-xorg-raspberrypi/archive/master.zip
    # unzip master.zip
    # rm master.zip
    # cd freebsd-ports-xorg-raspberrypi-master/x11-fonts/fontconfig/
    # cp -rf * /usr/ports/x11-fonts/fontconfig/
    # cd ../../x11/pixman/
    # cp -rf * /usr/ports/x11/pixman/

(4) graphics/libGL, graphics/dri

ARM で "WITH_NEW_XORG=yes" オプションを有効にしてビルドした場合に、graphics/libGL や graphics/dri で 発生するエラーを修正する Olivier Cochard-Labbe 氏によるパッチ(ports/176703・ports/176705) の適用版。 いずれも graphics/libGL の修正のみで問題が解決します。

    # cd ../../graphics/libGL/
    # cp -rf * /usr/ports/graphics/libGL/

(5) security/libgcrypt

security/libgcrypt のARM ビルド問題 (ports/181365・Rui Paulo 氏) は PR が採用されたため、現時点では解決済みです。

4: Xorg のビルド

    # cd /usr/ports/x11/xorg/
    # make config-recursive
注意: オプション設定では、ビデオドライバは一切必要はありません。RPI で使用するビデオドライバは後ほどインストールする xf86-video-scfb です。
    # make install clean

5: xf86-video-scfb のビルド

    # cd /usr/ports/x11-drivers/xf86-video-scfb/
    # ./configure
    # make install clean

6: xorg.conf の作成

'Xorg -configure' は現時点ではまだ RPI では機能しません。そのため、自分で "/etc/X11/xorg.conf" を作成する必要があります。 しかし、Aleksandr Rybalko 氏が作成された "xorg.conf" の設定が公開されているので、その設定を "xorg.conf" にコピーするだけで済みます。

設定内容:

Section "Files"
EndSection

Section "Module"
    Load        "dbe"
    Disable    "dri"
    Disable    "dri2"
    Disable    "glx"
    SubSection  "extmod"
        Option  "omit xfree86-dga"
    EndSubSection
EndSection

Section "ServerFlags"
    Option    "AIGLX"        "false"
    Option    "NoAccel"    "True"
    Option    "NoDRI"        "True"
    Option    "DRI"        "False"
    Option    "DRI2"        "False"
EndSection

Section "InputDevice"
    Identifier  "Keyboard1"
    Driver      "kbd"
EndSection

Section "InputDevice"
    Identifier  "Mouse1"
    Driver      "mouse"
    Option      "Protocol"      "auto"
    Option      "Device"        "/dev/sysmouse"
EndSection

Section "Monitor"
    Identifier  "Monitor"
    Mode "1024x600"
        DotClock        25.175
        HTimings        1024 1048 1148 1200
        VTimings        600 610 620 700
    EndMode
EndSection

Section "Device"
    Identifier  "Generic FB"
    Driver      "scfb"
    Option    "NoAccel"    "True"
EndSection

Section "Screen"
    Identifier  "Screen"
    Device      "Generic FB"
    Monitor     "Monitor"
    DefaultDepth 16
    SubSection "Display"
        Depth           16
        Modes           "1024x600"
    EndSubsection
EndSection

Section "ServerLayout"
    Identifier  "layout"
    Screen      0 "Screen" 0 0
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

7: rc.conf への設定追加

    # echo 'dbus_enable="YES"' >> /etc/rc.conf
    # echo 'hald_enable="YES"' >> /etc/rc.conf

8: dbus・hald の起動

    # /usr/local/etc/rc.d/dbus start
    # /usr/local/etc/rc.d/hald start

9: xorg の起動

    % startx

2013年8月19日月曜日

FreeBSD で pkg 以外の ports 全てを削除する

FreeBSD on RaspberryPi で、何かをいろいろやり直したくなったときのための、 pkg 以外の ports 全てを削除するコマンド。

別に全消しでいいじゃん、と思われるでしょうが、 RaspberryPi では pkg のビルドに思いのほか時間がかかって面倒なので、これを使えば、ちょっとした時間短縮ができます。

# pkg info | awk '{print $1}' | grep -v ^pkg | xargs pkg delete -f -y

ちなみに、単に全部削除する場合は、

# pkg delete -af

これだけでおしまいです。
レッツバルス♪

2013年8月18日日曜日

FreeBSD で修正したコンポーネントのみをビルドインストールする

FreeBSD で、特定のコンポーネントにパッチを当てたり、ソースコードを修正した場合に、 buildworld しないで、該当のコンポーネントだけ、コンパイルインストールする方法のメモ

# cd /path/to/the/component
# make obj
# make depend
# make
# make install
# rehash

意外とうっかりやるのを忘れたりして、修正がなぜシステムに反映されないのか、10 分くらい惑ったりしちゃいます・・。

2013年8月15日木曜日

FreeBSD on RaspberryPi で Xorg をビルドする

何かと結構時間かかりましたが、ようやくFreeBSD on RaspberryPi で Xorg が動作しました。やっぱりなんだかんだいっても、グラフィカルな表示をみるとうれしくなりますよね。もっとも、派手なウインドウマネジャが入ってるわけじゃないので、ひたすら地味ですが・・。

xorg のビルドに当たってのハマりどころは、前回の記事の webcamd のビルド でのハマりどころに、更にいくつか追加されるような感じになります。

まずは、手順から。

1: Xorg のビルドインストール

# cd /usr/ports/x11/xorg
# make config-recursive

オプション設定の注意ですが、RPI で使用するビデオドライバは別途入れることになりますので、xorg-drivers のビデオドライバは全部チェックを外すことをおすすめします。多分チェックすると新たなハマりどころが増えるだけかと思います。
あと、libiconv の patches オプションはオンにしておいた方がいいでしょう。
それ以外は基本的になるべく必要ではない設定は組み込まない、もしくはデフォルトで、を心がければそれほどハマらないですむのではないかと思います。

オプション設定が完了したら、次のコマンドを実行することで、xorg 及び依存関係にある ports 全てが自動的にビルドインストールされます。
尚、現時点でデフォルトでビルドされる xorg-server のバージョンは 1.7.7 ですが、WITH_NEW_XORG=yes を make.conf に指定することで xorg-server のバージョンが 1.10.6 になり、それに伴い関連するドライバーなどもバージョンアップした状態でビルドをすることができます。しかし、現時点ではこのオプションを指定した状態ではコンパイルが通らないため、使用は避けた方がよいでしょう。

# make install clean

もし、問題が発生したら、2: の回避方法を試してみて、問題の発生した ports が無事にインストール完了したら、

# cd /usr/ports/x11/xorg
# make install clean

で xorg のビルドを再開してください。

2: 問題が起きた場合の解決方法

多分、しばらくすると、エラーで落ちます。というか、落ちましたよね ?

x11/pixman や devel/glib20 のエラーについては、webcamd のビルドに書いてありますので、そちらを参照してください。ここでは残りのエラーの回避方法を書きます。

(1) x11-fonts/fontconfig

これは結構いやらしくて、デフォルトで make すると、make 自体は問題なく終了するのですが、インストール時に fc-cache が実行されると Segmentation fault (core dumped) を起こすというものです。そして、実際にエラーで止まるのは fontconfig ではなく、font 系の他の ports です。わたしの場合は font-misc-misc でした。そのため発生したら、一旦 fontconfig を deinstall して、入れ直す必要があります。

回避方法: 一旦インストール済みの fontconfig を deinstall し、make 時に、USE_GCC=4.2 を指定して再インストールします

# cd /usr/ports/x11-fonts/fontconfig
# make deinstall
# rm -rf work
# make USE_GCC=4.2 install clean

(2) x11-servers/xorg-server

これが恐らく、一番の山で、デフォルトの状態では決してビルドが通りません。なぜかというと、対応するビデオドライバがないからです・・。

エラーメッセージ:

Making all in fb
gmake[3]: Entering directory `/usr/ports/x11-servers/xorg-server/work/xorg-server-1.7.7/fb'
  CC    fb24_32.o
In file included from fb24_32.c:30:
./fb.h:102:2: error: "GLYPHPADBYTES must be 4"
#error "GLYPHPADBYTES must be 4"
 ^
1 error generated.
gmake[3]: *** [libfb_la-fb24_32.lo] Error 1
gmake[3]: Leaving directory `/usr/ports/x11-servers/xorg-server/work/xorg-server-1.7.7/fb'
gmake[2]: *** [all-recursive] Error 1
gmake[2]: Leaving directory `/usr/ports/x11-servers/xorg-server/work/xorg-server-1.7.7'
*** Error code 1

Stop.
make[1]: stopped in /usr/ports/x11-servers/xorg-server
*** Error code 1

Stop.
make: stopped in /usr/ports/x11-servers/xorg-server

回避方法: しかし、実は、この問題は Ray 氏によって既に解決されていてxorg-server の patch 及び、RPI 向けの移植版ビデオドライバが公開されています。そのため、それを使用すれば問題なく xorg-server をビルドして動作させることができます。

まず、準備として、x11-servers-xorg-server-master.zipx11-drivers-xf86-video-scfb-master.zip を任意の場所にダウンロードします。以下のコマンドはファイルをダウンロードしてビルドインストールするまでになります。

# fetch --no-verify-peer https://github.com/rayddteam/x11-servers-xorg-server/archive/master.zip
# unzip master.zip
# cd x11-servers-xorg-server-master
# cp -rf * /usr/ports/x11-servers/xorg-server/
# rm master.zip

# fetch --no-verify-peer https://github.com/rayddteam/xf86-video-scfb/archive/master.zip
# unzip master.zip
# cd x11-drivers-xf86-video-scfb-master
# cp -rf x11-drivers-xf86-video-scfb-master /usr/ports/x11-drivers/xf86-video-scfb/
# rm master.zip

# cd /usr/ports/x11-servers/xorg-server/
# make install clean

# cd /usr/ports/x11-drivers/xf86-video-scfb/
# make install clean

3: xorg.conf について

xorg が無事最後までインストールできたら、いよいよ xorg の起動の準備になります。
通常であれば、Xorg -configure で設定ファイルを作成するのですが、なんと、RPI ではこれがうまく動作しません・・。困ったものです。
しかし、xorg-server の patch を書かれた Ray 氏が、記事に設定例も書いてくれていますので、これをそのまま使わせていただくことにします。

以下の設定を全て、/etc/X11/xorg.conf にコピペして保存します。


Section "Files"
EndSection

Section "Module"
    Load        "dbe"
    Disable    "dri"
    Disable    "dri2"
    Disable    "glx"
    SubSection  "extmod"
        Option  "omit xfree86-dga"
    EndSubSection
EndSection

Section "ServerFlags"
    Option    "AIGLX"        "false"
    Option    "NoAccel"    "True"
    Option    "NoDRI"        "True"
    Option    "DRI"        "False"
    Option    "DRI2"        "False"
EndSection

Section "InputDevice"
    Identifier  "Keyboard1"
    Driver      "kbd"
EndSection

Section "InputDevice"
    Identifier  "Mouse1"
    Driver      "mouse"
    Option      "Protocol"      "auto"
    Option      "Device"        "/dev/sysmouse"
EndSection

Section "Monitor"
    Identifier  "Monitor"
    Mode "1024x600"
        DotClock        25.175
        HTimings        1024 1048 1148 1200
        VTimings        600 610 620 700
    EndMode
EndSection

Section "Device"
    Identifier  "Generic FB"
    Driver      "scfb"
    Option    "NoAccel"    "True"
EndSection

Section "Screen"
    Identifier  "Screen"
    Device      "Generic FB"
    Monitor     "Monitor"
    DefaultDepth 16
    SubSection "Display"
        Depth           16
        Modes           "1024x600"
    EndSubsection
EndSection

Section "ServerLayout"
    Identifier  "layout"
    Screen      0 "Screen" 0 0
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

わくわく、startx する前に、/etc/rc.conf に 設定を追加するのを忘れないようにしましょう。

# echo 'dbus_enable="YES"' >> /etc/rc.conf
# echo 'hald_enable="YES"' >> /etc/rc.conf

dbus と hald を手動で起動します。

# /usr/local/etc/rc.d/dbus start
# /usr/local/etc/rc.d/hald start

ようやく、準備が整いました。うまく動くといいですね~!

% startx

2013年8月14日水曜日

FreeBSD CURRENT on RapsberryPi で webcamd をビルドする

RapsberryPi 用 camera board のテストをするために、とりあえず webcamd を ports から入れてみたときの作業メモです。

個人的な感触ですが、RapsberryPi で ports をビルドしたい場合、RapsberryPi では ports tree の取得にかなり時間がかかるので、イメージを作る段階で併せて入れておく方が何かと便利です。

イメージ作成時に入れなかった場合は、svn で ports tree を取得するよりも、portsnap を使用する方が、ファイルが壊れるなどのトラブルが発生しにくい気がします。

portsnap を使用して、ports tree を取得する初回の手順は、以下の通りです。

# portsnap fetch
# portsnap extract
# cd /usr/ports
# make fetchindex

2回目以降は、こちらになります。

# cd /usr/ports
# portsnap fetch
# portsnap update
# make fetchindex

ここから、webcamd のビルドに移ります。

# cd /usr/ports/multimedia/webcamd/
# make config-recursive
# make install clean

これで何もエラーも起きずに最後までたどり着ければいいのですが、わたしは以下の3つの ports でエラー等が発生しましたので、わたしの行った回避方法を書きます。

(1) security/libgcrypt

エラーメッセージ:

===>  Building for libgcrypt-1.5.2
make  all-recursive
Making all in compat
Making all in mpi
/bin/sh /usr/local/bin/libtool --tag=CC    --mode=compile cc -DHAVE_CONFIG_H -I. -I..   -I../src -I../src  -I/usr/local/include -O -pipe -std=gnu89 -fvisibility=hidden -Wall -MT mpih-div.lo -MD -MP -MF .deps/mpih-div.Tpo -c -o mpih-div.lo mpih-div.c
libtool: compile:  cc -DHAVE_CONFIG_H -I. -I.. -I../src -I../src -I/usr/local/include -O -pipe -std=gnu89 -fvisibility=hidden -Wall -MT mpih-div.lo -MD -MP -MF .deps/mpih-div.Tpo -c mpih-div.c  -fPIC -DPIC -o .libs/mpih-div.o
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:150:13: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_q, _ql, (nh), (di));                            
        ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
./longlong.h:230:25: note: expanded from macro 'umul_ppmm'
                   : "=&r" ((USItype)(xh)),                             
                                      ^
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:150:17: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_q, _ql, (nh), (di));                            
        ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
./longlong.h:231:24: note: expanded from macro 'umul_ppmm'
                     "=r" ((USItype)(xl))                               
                                     ^
mpih-div.c:98:3: error: invalid % escape in inline assembly string
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:150:2: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_q, _ql, (nh), (di));                            
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:228:14: note: expanded from macro 'umul_ppmm'
  __asm__ ("%@ Inlined umul_ppmm\n"                                     
           ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:152:13: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_xh, _xl, _q, (d));                              
        ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
./longlong.h:230:25: note: expanded from macro 'umul_ppmm'
                   : "=&r" ((USItype)(xh)),                             
                                      ^
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:152:18: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_xh, _xl, _q, (d));                              
        ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
./longlong.h:231:24: note: expanded from macro 'umul_ppmm'
                     "=r" ((USItype)(xl))                               
                                     ^
mpih-div.c:98:3: error: invalid % escape in inline assembly string
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:152:2: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_xh, _xl, _q, (d));                              
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:228:14: note: expanded from macro 'umul_ppmm'
  __asm__ ("%@ Inlined umul_ppmm\n"                                     
           ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:153:14: note: expanded from macro 'UDIV_QRNND_PREINV'
        sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl);                 
        ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:200:23: note: expanded from macro 'sub_ddmmss'
           : "=r" ((USItype)(sh)),                                      
                             ^
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:153:19: note: expanded from macro 'UDIV_QRNND_PREINV'
        sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl);                 
        ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:201:24: note: expanded from macro 'sub_ddmmss'
             "=&r" ((USItype)(sl))                                      
                              ^
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:155:18: note: expanded from macro 'UDIV_QRNND_PREINV'
            sub_ddmmss (_xh, _r, _xh, _r, 0, (d));                  
            ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:200:23: note: expanded from macro 'sub_ddmmss'
           : "=r" ((USItype)(sh)),                                      
                             ^
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:155:23: note: expanded from macro 'UDIV_QRNND_PREINV'
            sub_ddmmss (_xh, _r, _xh, _r, 0, (d));                  
            ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
./longlong.h:201:24: note: expanded from macro 'sub_ddmmss'
             "=&r" ((USItype)(sl))                                      
                              ^
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:158:15: note: expanded from macro 'UDIV_QRNND_PREINV'
                sub_ddmmss (_xh, _r, _xh, _r, 0, (d));              
                ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:200:23: note: expanded from macro 'sub_ddmmss'
           : "=r" ((USItype)(sh)),                                      
                             ^
mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
                UDIV_QRNND_PREINV(dummy, r, r,
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:158:20: note: expanded from macro 'UDIV_QRNND_PREINV'
                sub_ddmmss (_xh, _r, _xh, _r, 0, (d));              
                ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
./longlong.h:201:24: note: expanded from macro 'sub_ddmmss'
             "=&r" ((USItype)(sl))                                      
                              ^
mpih-div.c:104:6: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
            UDIV_QRNND_PREINV(dummy, r, r,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:150:13: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_q, _ql, (nh), (di));                            
        ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
./longlong.h:230:25: note: expanded from macro 'umul_ppmm'
                   : "=&r" ((USItype)(xh)),                             
                                      ^
mpih-div.c:104:6: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
            UDIV_QRNND_PREINV(dummy, r, r,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:150:17: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_q, _ql, (nh), (di));                            
        ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
./longlong.h:231:24: note: expanded from macro 'umul_ppmm'
                     "=r" ((USItype)(xl))                               
                                     ^
mpih-div.c:104:6: error: invalid % escape in inline assembly string
            UDIV_QRNND_PREINV(dummy, r, r,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:150:2: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_q, _ql, (nh), (di));                            
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:228:14: note: expanded from macro 'umul_ppmm'
  __asm__ ("%@ Inlined umul_ppmm\n"                                     
           ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mpih-div.c:104:6: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
            UDIV_QRNND_PREINV(dummy, r, r,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:152:13: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_xh, _xl, _q, (d));                              
        ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
./longlong.h:230:25: note: expanded from macro 'umul_ppmm'
                   : "=&r" ((USItype)(xh)),                             
                                      ^
mpih-div.c:104:6: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
            UDIV_QRNND_PREINV(dummy, r, r,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:152:18: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_xh, _xl, _q, (d));                              
        ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
./longlong.h:231:24: note: expanded from macro 'umul_ppmm'
                     "=r" ((USItype)(xl))                               
                                     ^
mpih-div.c:104:6: error: invalid % escape in inline assembly string
            UDIV_QRNND_PREINV(dummy, r, r,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:152:2: note: expanded from macro 'UDIV_QRNND_PREINV'
        umul_ppmm (_xh, _xl, _q, (d));                              
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:228:14: note: expanded from macro 'umul_ppmm'
  __asm__ ("%@ Inlined umul_ppmm\n"                                     
           ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mpih-div.c:104:6: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
            UDIV_QRNND_PREINV(dummy, r, r,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./mpi-internal.h:153:14: note: expanded from macro 'UDIV_QRNND_PREINV'
        sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl);                 
        ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./longlong.h:200:23: note: expanded from macro 'sub_ddmmss'
           : "=r" ((USItype)(sh)),                                      
                             ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
*** [mpih-div.lo] Error code 1

make: stopped in /usr/ports/security/libgcrypt/work/libgcrypt-1.5.2/mpi
1 error

make: stopped in /usr/ports/security/libgcrypt/work/libgcrypt-1.5.2/mpi
*** [all-recursive] Error code 1

make: stopped in /usr/ports/security/libgcrypt/work/libgcrypt-1.5.2
1 error

make: stopped in /usr/ports/security/libgcrypt/work/libgcrypt-1.5.2
*** [all] Error code 2

make: stopped in /usr/ports/security/libgcrypt/work/libgcrypt-1.5.2
1 error

make: stopped in /usr/ports/security/libgcrypt/work/libgcrypt-1.5.2
===> Compilation failed unexpectedly.
Try to set MAKE_JOBS_UNSAFE=yes and rebuild before reporting the failure to
the maintainer.
*** Error code 1

Stop.
make: stopped in /usr/ports/security/libgcrypt
*** Error code 1

回避方法: オプション USE_GCC=4.2 を使用して、再度 make します

# cd /usr/ports/security/libgcrypt
# rm -rf work
# make USE_GCC=4.2 install clean

(2) x11/pixman

エラーメッセージ:

CPPAS pixman-arm-neon-asm.lo
/usr/include/float.h: Assembler messages:
/usr/include/float.h:43: Error: bad instruction `extern int __flt_rounds(void)'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_r'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_r'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_r'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_r'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_r'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_r'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'orig_w'
./pixman-arm-neon-asm.h:708: Warning: ignoring redefinition of register alias 'dummy'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'dst_w'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'src'
./pixman-arm-neon-asm.h:947: Warning: ignoring redefinition of register alias 'mask'
pixman-arm-neon-asm.S:3623: Warning: ignoring redefinition of register alias 'tmp1'
pixman-arm-neon-asm.S:3623: Warning: ignoring redefinition of register alias 'tmp2'
pixman-arm-neon-asm.S:3627: Warning: ignoring redefinition of register alias 'tmp1'
pixman-arm-neon-asm.S:3627: Warning: ignoring redefinition of register alias 'tmp2'
pixman-arm-neon-asm.S:3631: Warning: ignoring redefinition of register alias 'tmp1'
pixman-arm-neon-asm.S:3631: Warning: ignoring redefinition of register alias 'tmp2'
pixman-arm-neon-asm.S:3635: Warning: ignoring redefinition of register alias 'tmp1'
pixman-arm-neon-asm.S:3635: Warning: ignoring redefinition of register alias 'tmp2'
cc: error: assembler command failed with exit code 1 (use -v to see invocation)
*** Error code 1

Stop.
make: stopped in /usr/ports/x11/pixman/work/pixman-0.30.0/pixman
*** Error code 1

Stop.
make: stopped in /usr/ports/x11/pixman/work/pixman-0.30.0
*** Error code 1

Stop.
make: stopped in /usr/ports/x11/pixman/work/pixman-0.30.0
*** Error code 1

Stop.
make: stopped in /usr/ports/x11/pixman
*** Error code 1

Stop.
make: stopped in /usr/ports/x11/pixman

回避方法: 回避方法は send-pr しましたので、ports/181140 の patch を Makefile に適用してください。

# cd /usr/ports/x11/pixman
# rm -rf work
# patch < patch-Makefile.txt
# make install clean

(3) devel/glib20

エラーメッセージ:

/bin/sh /usr/ports/devel/glib20/work/glib-2.36.3/install-sh -d /usr/local/lib/gio/modules
 /bin/mkdir -p '/usr/local/share/glib-2.0/schemas'を
 install  -o root -g wheel -m 444 gschema.dtd '/usr/local/share/glib-2.0/schemas'
 /bin/mkdir -p '/usr/local/include/glib-2.0/gio/'
: jemalloc_arena.c:380: Failed assertion: "p[i] == 0"
Abort trap (core dumped)

回避方法: make.conf に MALLOC_PRODUCTION=yes が設定されていれば回避出来るエラーなのですが、問題は、このオプションが RaspberryPi のイメージ作成時に反映されていなければいけない、ということです。ですので、このエラーが発生した場合は、イメージ作成時の設定などを見直して、MALLOC_PRODUCTION=yes が有効になっているイメージを再作成し、かつ、RaspberryPi の make.conf にもオプション設定した上で glib20 を再コンパイルする必要があります。
(まあ、イメージを作りなおしたということは、そもそもの最初からやり直し、ではありますが・・。)
あと、この問題でビルドが止まるのは、このエラーが直接原因ではなく、他の ports で、必要なヘッダファイル(gio/gio.h 等)が入っていないという形で現れるので、注意が必要です。

コンパイルが完了したら、webcamd を動作させるために追加の設定が必要になります。

# echo 'cuse4bsd_load="YES"' >> /boot/loader.conf
# echo 'webcamd_enable="YES"' >> /etc/rc.conf

しかし、実は、xorg のコンパイルがまだ終わっていないので、動作確認ができていません。ほんとに動くんでしょうかね、これ・・。

FreeBSD CURRENT on RaspberryPI でports をビルドする際に発生する問題の回避策

/usr/ports/x11-fonts/fontconfig

デフォルトでmakeすると、makeは問題なく終了するが、インストール時に fc-cache が Segmentation fault (core dumped) を起こす。
回避策 make 時に、USE_GCC=4.2 を指定する

2013年8月6日火曜日

Mac OS X Mountain Lion で smb ファイルサーバのマウントをする

Mac OS X Mountain Lion で smb ファイルサーバのマウントをするやり方のメモです。

ここでは、仮に以下の内容で接続するものとします。

ホスト名 : hoge
IP アドレス : 10.0.0.2
ディレクトリ名 : hoe
ユーザ名 : user

一番簡単なやり方では、finder を使用します。
finder の メニュー、「移動」の一番下にある「サーバに接続...」を選択し、サーバアドレスの欄に、
smb://サーバのホスト名、もしくは ip アドレス
を指定します。

ですので、この場合は、
smb://hoge
もしくは
smb://10.0.0.2
となります

マウントしたいディレクトリを直接指定したい場合は、
smb://サーバのホスト名、もしくは ip アドレス / ディレクトリ名
でディレクトリをマウントすることができます。

この場合は、以下の通りになります。
smb://hoge/hoe
もしくは、
smb://10.0.0.2/hoe

あとは finder が、必要なユーザ名やパスワードの入力を求めてきますので、 それに従って入力することで、GUI で smb ファイルサーバに接続することができます。

接続の切断は、finder メニューの「ファイル」か、表示されているアイコンを右クリックして「"hoe" を取り出す」を選択します。

でも、finder じゃなくて、直接コンソールでマウントしたいこともありますね。
ファイルの権限変更したい時とか。

その場合は、mount_smbfs というコマンドを使用します。

まず、あらかじめ、マウントポイントを用意する必要がありますので、 適当なディレクトリを用意します。
ここでは、ホームディレクトリに mnt というディレクトリを用意します。

% cd
% mkdir mnt

そうしたら、おもむろに、

% mount_smbfs //user@hoge/hoe ./mnt
もしくは、
% mount_smbfs //user@10.0.0.2/hoe ./mnt
( 必要であればここでパスワードの入力が求められます )

特に何も表示されなければ、問題なくマウントされたはずなので、df コマンドで確認します。

% df
Filesystem       512-blocks      Used  Available Capacity  iused      ifree %iused  Mounted on
/dev/disk0s2     1951845952 191396920 1759937032    10% 23988613  219992129   10%   /
devfs                   368       368          0   100%      638          0  100%   /dev
map -hosts                0         0          0   100%        0          0  100%   /net
map auto_home             0         0          0   100%        0          0  100%   /home
//user@hoge/hoe  578166916  85595336  492571580    15%        0 18446744073709551615    0%   /Users/user/mnt

のような感じで表示されたら mount に成功です。

% cd mnt
% ls

で内容がきちんと表示されれば、あとは、通常のファイルシステムと同様に利用することができます。

もし、マウントコマンド実行時に、

mount_smbfs: mount error: /Users/user/mnt: Input/output error

のようなエラーメッセージが出力されたら、対象のサーバを既にマウントしていないかどうか確認してみてください。

% df

で確認できます

さて、必要な作業が完了したら、アンマウントしましょう。
アンマウントは

% umount ./mnt

で実行できます。

umount(/Users/user/mnt): Resource busy -- try 'diskutil unmount'

のようなエラーメッセージが出力されたら、自分が今いるパスがマウントしたパスの中なら、ホームディレクトリに戻るなどしてから再度実行してください。

ちなみに、finder も結局のところマウントを実行しているわけなので、一体どこにマウントしているのかというと、

% df
Filesystem       512-blocks      Used  Available Capacity  iused      ifree %iused  Mounted on
/dev/disk0s2     1951845952 191397960 1759935992    10% 23988743  219991999   10%   /
devfs                   368       368          0   100%      638          0  100%   /dev
map -hosts                0         0          0   100%        0          0  100%   /net
map auto_home             0         0          0   100%        0          0  100%   /home
//user@hoge/hoe  578167248  85595338  492571910    15%        0 18446744073709551615    0%   /Volumes/hoe

なので、実は、"/Volumes/ マウント先のディレクトリ名" に直接 cd すれば、いちいち手動でマウントしなくても、ちゃんとターミナルから操作できるという、しょうもない落ちなのでした・・。

2013年8月2日金曜日

Bad file descriptor の修復に失敗した話

先日、FreeBSD をインストールした古いノート PC で chronium をビルドしていたら、気がついたら、別に電源コードが抜けたとかバッテリーが切れたとかもないのに、ビルド途中に電源まで完全に落ちてしまっていました。
仕方ないので、一回 make clean して、続きをやろうとしたところ、恐らく落ちた時点でコンパイル中だったと思われるディレクトリが clean に失敗している様子。

改めて、該当ディレクトリに移動して、rm -rf work で work ディレクトリを手動削除しようとしたら、

ファイル名 : Bad file descriptor
...
ディレクトリが空じゃないので削除できません

のようなエラーメッセージが・・。

調べてみたら、この Bad file descriptor というのは、あまり例のないエラーのようで、関連する情報がほとんどなかったのですが、ファイルが壊れてしまった時に出るエラーメッセージのようです。

そこで、壊れてしまっているファイルを全部消そうと、該当ディレクトリで rm * しても、その一つ上で rm -rf ディレクトリ名 にしても、全く消すことができません。

マルチユーザモードで fsck -y しても、なぜか修復されず、シングルユーザモードで fsck -y / では、一旦修復しました!といわれるのに、ls -l するとやっぱり、ファイル名 : Bad file descriptor と表示されてしまいます。

これはもうクリーンインストールするしかないとは思ったのですが、調べた情報の中で、clri(8) を使ったら壊れた部分を消して修復可能なのではないか、という話があり、実行例もないようなので、ダメ元で、clri(8) を試して見ることにしました。

ちなみに、clri(8) は、man の情報によれば、fsck で適切に処理されないファイルを削除する、ものだそうです。

壊れたファイルが /path/to/hoge/hoe/hoehoe.txt の場合は、こんな感じになります。

% ls /path/to/hoge/hoe
hoehoe.txt : Bad file descriptor

本来であれば壊れたファイルの i ノード番号を取得して該当ファイルだけを削除したいところですが、Bad file descriptor なファイルの場合、既に i ノード番号すら取得できない状況のため、壊れたファイルの入っているディレクトリを削除してみることにします。

clri(8) は、マルチユーザモードでは実行できなかったため、シングルユーザモードで、

# df
Filesystem  1K-blocks     Used   Avail Capacity  Mounted on
/dev/ada0p2  23352220 12784608 8699436    60%    /
devfs               1        1       0   100%    /dev
# cd /path/to/hoge 
# ls -i
2899285 hoe <-壊れてないディレクトリ(中身のファイルは壊れてる)
# clri /dev/ada0p2 2899285
# fsck -y /

実行自体は、とりあえず、正常に終了しました。

それで、結果的にどうなったかというと・・

# ls
hoe : Bad file descriptor

なんということでしょう。
さっきまで、一応壊れていなかった hoe までもが壊れてしまったのです。
試しに、この一つ上の hoge でも試してみたら、hoge も壊れました・・。

そのため、結局このあと必要なファイルのみバックアップして、クリーンインストールしました。

単にわたしがうまくいかなかっただけで、うまくいくことも、もしかしたらあるのかもしれませんが、 crli(8) では Bad file descriptor は修復できない、と思ってたほうがいいのかもしれません。
やるなら、被害が拡大することを前提に、どうしようもないときだけ試してみるほうがよさそうです。

2013年7月26日金曜日

FreeBSD で RaspberryPi (その2) FreeBSD で RaspberryPi のイメージをビルドする(作業メモ)

出来合いのイメージよりも、やっぱり、どうせなら最新機能使いたいし〜、という、そこのアナタ。
楽しいギャンブル道にようこそ。
この記事は、FreeBSD で RaspberryPi のイメージを自分でビルドする際の作業メモです。

といっても、だいぶ最近は博打率が減ってきたような気がしなくもないので、そんなに苦労しないでいけるかもしれません。運が良ければ。
特に、ちゃんと動く、当たりのリビジョン(!)を引けるかどうかというのが、結構重要ですので、動くイメージがビルド出来たら、すぐに次のイメージで上書きせず、ある程度の期間は大事に保存しておきましょう。

1: FreeBSD CURRENT 環境を構築する

FreeBSD で RaspberryPi のイメージをビルドするには、 現時点では、CURRENT を導入する必要があります。 もちろん、仮想環境でも、実機でも構いません。ただし、SD カードの読み書きが出来る必要はあります。
ここでは、イメージ作成に必要な、FreeBSD CURRENT 環境の最低限の構築法について簡単に説明します。

(1) FreeBSD CURRENT をインストールする

まず、FreeBSD CURRENT snapshots のダウンロードサイトから適当なファイルをダウンロードして、メディアに焼くなりして、インストールします。 尚、インストールする際に、src や ports は、インストール後に最新に更新するため、特に 展開する必要はありません。

64bit版
ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/ISO-IMAGES/11.0/
32bit版
ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/i386/i386/ISO-IMAGES/11.0/

(2) FreeBSD CURRENT のソースコードを最新にする

インストールが完了したら、 最新のソースツリーを取得します。 現在の CURRENT には svn がデフォルトで入っています。ただ、ports にも svn が存在するため、 衝突を避けるため、システムの svn を利用する場合は svnlite として使用します。

# cd /usr

src にソースを既に展開済みの場合は src を一旦削除します。 src ディレクトリが空の場合は削除する必要はありません。

# rm -rf src

初回のソースツリーの取得の場合は checkout します。

# svnlite checkout svn://svn.freebsd.org/base/head/ src

一旦 checkout したあとは、

# cd /usr/src
# svnlite update

で更新出来ます。 尚、取得したソースツリーのリビジョン番号を後から確認したくなることがよくありますが、そのときは、それぞれのソースツリーのルートで、

# svnlite info

を実行するとよいでしょう。

次に、最新の ports ツリーを取得します。 ports に ports ツリーを既に展開済みの場合は ports を一旦削除します。 ports ディレクトリが空の場合は削除する必要はありません。

# rm -rf ports

初回の ports ツリーの取得の場合は checkout します。

# svnlite checkout svn://svn.freebsd.org/ports/head/ ports

次回以降は、

# cd /usr/ports
# svnlite update

で ok です。

(3) /etc/make.conf 及び /etc/src.conf を修正する

これから、大量のビルドをするにあたって、/etc/make.conf 及び /etc/src.conf を設定しておくと多少幸せになれるかもしれません。

# cp /usr/share/examples/etc/make.conf /etc/
# vi /etc/make.conf

src.conf はテンプレートに当たるものはないので、使用する場合は新規作成します。

# vi /etc/src.conf

最低限のおすすめ設定をいくつか挙げます。

  1. make.conf の以下の行のコメントを外して最適化オプションを有効化する
    COPTFLAGS= -O -pipe
    
  2. src.conf に、以下の行を新規で追加し、malloc デバッグ機能を無効化する
    #disable malloc_debug function
    MALLOC_PRODUCTION=YES
    
  3. src.conf に、以下の行を新規で追加し、gcc を有効にする。特に arm は gcc をports から入れることが現時点ではできないので、ここは要注意です。もっとも、有効にしても、gcc の標準ライブラリが入るわけではないので、gcc 依存のアプリはビルドできないことが多々出てきます。
    WITH_GCC=yes
    WITH_GNUCXX=yes
    

(4) カーネルコンフィグレーションファイルをカスタマイズする

カーネルコンフィグレーションファイルはアーキテクチャ毎に場所が分かれているため、
64bit版なら

# cd /usr/src/sys/amd64/conf

32bit版なら

# cd /usr/src/sys/i386/conf

に移動して、 デフォルトの GENERIC カーネルコンフィグレーションファイルをコピーして、カスタマイズします。

# cp GENERIC MYKERNEL
# vi MYKERNEL

MYKERNEL の部分は任意の名前に修正してください。ここでは例として MYKERNEL をカスタムカーネルファイル名として作成します。

カーネルファイルの主な修正箇所は以下の通りです。

以下の行の GENERIC の部分を MYKERNEL に書き換えます。
ident MYKERNEL

その他の最低限のおすすめは、各種デバッグオプションの無効化です。
以下の行が主なデバッグオプションですので、それぞれ先頭に#をつけてコメントにするとよいでしょう。
#makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols



# Debugging support. Always need this:
# KDB # Enable kernel debugger support.
# For minimum debugger support (stable branch) use:
#options KDB_TRACE # Print a stack trace for a panic.
# For full debugger support use this instead:
# DDB # Support DDB.
# GDB # Support remote GDB.
# DEADLKRES # Enable the deadlock resolver
# INVARIANTS # Enable calls of extra sanity checking
# INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS
# WITNESS # Enable checks to detect deadlocks and cycles
# WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed
# MALLOC_DEBUG_MAXZONES=8 # Separate malloc(9) zones

これ以外のオプションについては必要に応じて追加修正してください。
ここではあえて触れません。

(5) 最新のソースコードをベースにシステムを再構築する

簡単に手順のみを書きます。
CURRENT は build に失敗することが時々あります。
そのため、script コマンドなどでログをとっておくと失敗した場合に役に立ちます。
例)

# script hoge.log(ログを保存する任意のファイル名)
# (ログを取りたい作業を実行)
# exit(ログの取得を終了)

ユーザランドとカーネルのビルドについては、基本的に決まった手順がありますので、それに則って行います。以下がその手順で、(a)-(b)、もしくは(a)-(c)の順番で実行します。

make installworld はシングルユーザモードで実行することが一般的には推奨されていますが、 自分一人しか使わない環境であればそこまで気にする必要はありません。ですので、マルチユーザモードで構わない場合は、(a)-(b)で、 シングルユーザモードでやる場合は、installkernel 後の再起動時に、 シングルユーザモードを選択して起動後、(b)の手順の代わりに(c)を実行します。

(a) ユーザランドのビルドと、カスタムカーネルのビルド・インストール(共通)

# cd /usr/src
# make buildworld
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
# reboot

(b) make installworld をマルチユーザモードで実行する場合

# cd /usr/src
# mergemaster -p
# make installworld
# mergemaster
# reboot

(c) make installworld をシングルユーザモードで実行する場合

# mount -u /
# mount -a -t ufs
# swapon -a
# adjkerntz -i
# mergemaster -p
# cd /usr/src
# make installworld
# mergemaster
# reboot

CURRENT のインストールについては、こちらのブログのFreeBSD-CURRENT を導入してみた (3) 最新状態に更新してみたに詳しい説明や失敗した場合の復帰方法などが書いてあるため、併せて読まれるといいかもしれません。

(6) 一般ユーザを作成する

ここまでで、まだ一般ユーザをシステムに追加していない場合は、 ユーザを追加します。

# adduser

管理者ユーザであれば、所属する group に wheel に追加するのを忘れないようにしましょう。

2: RaspberryPi のビルド環境を作成する

(1) arm のクロスコンパイル環境を作成する

次に、arm のクロスコンパイル環境を作成します。これは、できれば、ソースコードを更新した場合はこちらも併せてビルドし直すようにしたほうがよいでしょう。ビルドし直すときは、同じオプションで make コマンドを実行するだけです。

# cd /usr/src
# make XDEV=arm XDEV_ARCH=armv6 xdev

尚、2回目以降のビルドの場合は、余計な不具合を避けるために、一旦 /usr/obj を全削除してから実行することをお勧めします。

# rm -rf /usr/obj

(2) ports から git をインストールする

必要なファイルの修得に git が必要になりますので、devel/git をインストールします。

# cd /usr/ports/devel/git
# make config-recursive
# make install clean

(3) arm ビルド用のソースツリーを取得する

arm ビルド用のソースツリーは、頻繁にリビジョン変更が必要になるため、管理の都合上、/usr/src とは別に用意したほうが安全です。そのため、/usr/src とは別の場所にもうひとつ CURRENT のソースツリーを取得します。
ここでは、/usr/src.arm とします。

# cd /usr
# svnlite checkout svn://svn.freebsd.org/base/head/ src.arm

この後、取得したソースツリーに何らかの変更をする場合は、一旦ソースツリーに移動し、

# cd /usr/src.arm

ソースツリーを最新にしたい場合は

# svnlite update

現在のリビジョン番号等を確認したい場合は

# svnlite info

取得済みのソースツリーを指定したリビジョンに戻したい場合は

# svnlite -r <リビジョン番号> update

です。

(4) RaspberryPi 向けのカスタムカーネルファイルを作成する

ここは特に重要で、INVARIANTS が有効になっているとカーネルがパニックするという障害報告があります。 そのため、現時点では必ずカーネルはデフォルトではなく、カスタムにする必要があります。ただ、試して見たところ、少なくとも 2013 年 8 月末時点ではデバッグオプションを有効にした状態でもあまり問題なく動作しましたので、現時点では、少しでも速度を出したい場合はデバッグオプションを無効にする、という考え方でいいようです。
注意しなければいけないのは、修正するカーネルコンフィギュレーションファイルは、/usr/src ではなく、/usr/src.arm にあるものになります。また、デフォルトファイル名は GENERIC ではなく、RPI-B です。

# cd /usr/src.arm/sys/arm/conf
# cp RPI-B MYKERNEL

修正する必要があるのは以下の場所で、行頭に#をいれてコメントにします。
ident MYKERNEL

#makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols



#options KDB
#options DDB #Enable the kernel debugger
#options INVARIANTS #Enable calls of extra sanity checking
#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS

尚、この他、無線LANの設定等、使用したいデバイスを追加しておくと、非常に便利です。
if_runを使う場合は、こんな感じに設定しておくと良いでしょう。

# wlan support
device          ehci
device          uhci
device          ohci
device          run
device          runfw
device          firmware
device          wlan            # 802.11 support
options         IEEE80211_DEBUG
options         IEEE80211_AMPDU_AGE
options         IEEE80211_SUPPORT_MESH
device          wlan_amrr
device          wlan_wep
device          wlan_ccmp
device          wlan_tkip

その他、適宜使用したい環境に合わせてデバイスの設定などを修正します。

(5) crochet-freebsd を導入する

(a) crochet-freebsd のリポジトリを取得する

Tim Kientzle 氏が作成された、各種 arm 向けビルドを行う支援用スクリプト、crochet-freebsd が git-hub に公開されているので、それをローカルに取得します。
ここでは、一般ユーザのホームディレクトリに展開します。

% cd
% git clone git://github.com/kientzle/crochet-freebsd.git

このスクリプトはそれなりにアップデートされていますので、イメージを作る際には更新するようにしたほうがよいでしょう。
その場合は、

% cd /path/to/crochet-freebsd
% git pull

になります。

(b) config.sh をカスタマイズする

設定ファイルである config.shconfig.sh.sample をベースに編集します。

% cd crochet-freebsd
% cp config.sh.sample config.sh
% vi config.sh

最低限の設定は、ビルド対象となるボードの種類の指定で、 以下の行の先頭の#を外すだけで、基本的な RapsberryPi 向けの設定は終了します。

board_setup RaspberryPi

ここから下はやったほうが幸せかもしれない設定です。

次の行をの先頭の#を外すことで UFS パーティションサイズを メディアのサイズに合わせて自動調整することができます。ただし、メディアによってはうまくいかないこともあるようです。

option AutoSize

あらかじめ作成しておきたいユーザアカウントを指定することができます。パスワードは指定したユーザ名と同一になります。

option User username

RaspberryPi は結構遅いのですが、swapfile を有効にすると、多少幸せになれる気がします。オプションの後のファイルサイズは任意に指定できます。1gb 程度確保しておくと、セルフビルドもそれなりに通るようです。

option SwapFile "1gb"

デフォルトで用意されている RaspberryPi のカーネルコンフィグファイルでは現時点では動かないことが多いので、 先頭の#を削除して設定を有効にし、カスタマイズ後のカーネルコンフィグファイルを指定するのが吉です。

KERNCONF=MYKERNEL

また、以下の指定で、arm 専用のソースツリーの指定ができます。 イメージが動くかどうかは、ビルドしたリビジョンに非常に左右されるため、 頻繁にソースツリーの入れ替えを行う必要がありますので、システムのソースツリーとは分けたほうが良いでしょう。先頭の#を削除するとともに、/usr/srcを自分のソースツリーの場所に書き換えます。

FREEBSD_SRC=/usr/src.arm

make.confsrc.confはデフォルトでは make 用のコンフィグファイルとして設定されていないので、指定しておくことを激しく推奨します。なぜかというと、コンパイル時に MALLOC_PRODUCTION が指定されていないと、遅くなるとかそういう問題の他に、jemalloc のバグを踏んではめられる恐れがあるからです・・。

 SRCCONF="/etc/src.conf"
 __MAKE_CONF="/etc/make.conf"

(c) OVERLAY FILES について

~/crochet-freebsd/board/RaspberryPi/overlay/にデフォルトで設定したい設定ファイルなどを事前に作成して、置いておくと、インストール時に既存のファイルなどを上書きしてくれます。/etc/rc.confや/etc/wpa_supplicant.confなど、階層をあわせて入れておくだけで、イメージを作成するたびに設定ファイルを修正する必要がなくなるため、非常に便利な機能です。

(d) その他

crochet-freebsd には、その他にも、様々なオプションが用意されています。config.sh にコメントとして書かれている内容が、イメージをビルドする際の非常に重要なドキュメントになりますので、一度目を通されることをお勧めします。

(6) RapsberryPi の firmwere を取得する

RapsberryPi の 最新 firmwere がgit-hub に公開されているので、それをローカルに取得します。
ここでは、一般ユーザのホームディレクトリに展開します。

% cd
% git clone git://github.com/raspberrypi/firmware/

crochet-freebsd に同包されている firmwere は結構古いので、今回取得したものを crochet-freebsd にコピーします。

% cp ./firmware/boot/* ./crochet-freebsd/board/RaspberryPi/boot/

これで、基本的な事前準備は終了です。いよいよイメージのビルドに移ります。

3: crochet-freebsd を実行してイメージを作成する

crochet-freebsd は、基本的にイメージ作成に足りないものなどがあれば、./crochet.shが実行時にチェックをして、必要なもののダウンロードなどを促してくれるので、あとは、出力されるメッセージに従って作業を進めるだけです。

% su
# ./crochet.sh -c config.sh

問題なくイメージの作成が終了すると、デフォルトでは crochet-freebsd/work/FreeBSD-armv6-RPI-B.img というファイルが出来上がっているはずです。これを終了時に表示される dd コマンドで SD カードに書き込みます。

# dd if=/path/to/crochet-freebsd/work/FreeBSD-armv6-RPI-B.img of=/dev/da0 bs=1m

ファイル名やデバイスは環境に合わせて修正してください。
あとは、お祈りしながら、RaspberryPi に SD カードをいれ、ディスプレイやキーボードをつないでから、おもむろに電源ケーブルを挿します。
無事に起動したら、 root(パスワード無し)でログインすることができます。

FreeBSD で RaspberryPi (その1) FreeBSD RaspberryPi のイメージをダウンロードして使う

FreeBSD 10-CURRENT には2012年8月に RapsberryPi に対応するコードが追加されたことで、RapsberryPi も FreeBSD で動かせるようになりました。

現時点で、RaspberryPi を FreeBSD で利用する方法は2つあり、動作可能なイメージが既に公開されているので、それをダウンロードして 使用する方法と、自分でイメージを作成する方法があります。

お手軽さから言えば、イメージをダウンロードしたほうがはるかに楽ですが、 利用したい最新の修正を反映させたい場合は、イメージを作成することになります。

ここでは、公開されている、FreeBSD RaspberryPi のイメージをダウンロードして使う方法について書きます。

db.net downloads page に作成済みのイメージが複数公開されています。
ダウンロードして SD カードに焼くだけで、RaspberryPi があっという間に FreeBSD で動くようになります。
イメージ作成がうまくいかないときにも(実際うまくいかないことは多いです・・)、動く環境がひとつあるだけで、心の拠り所になるような気がしますので、自分でビルドしたい場合でも、一度試してみるのはいいかもしれません。

イメージに付いている番号は svn リビジョン番号ですので、番号が大きいほうが新しいです。

以下の手順は、このサイトから、 bsd-pi-252209M.img.xz を FreeBSD 上でダウンロードして SD カードに焼く場合の例です。 ファイル名や デバイス(/dev/da0) は環境に合わせて書き換えてください。

イメージファイルをダウンロードします。

% fetch http://www.db.net/downloads/bsd-pi-252209M.img.xz

ダウンロードしたファイルを解凍します。

% unxz bsd-pi-252209M.img.xz

解答したファイルを SD カードに焼きます。

# dd if=./bsd-pi-252209M.img of=/dev/da0 bs=1m

あとは、RaspberryPi に電源を入れてを立ち上げるだけです。 root(パスワードなし)でログインすることができます。 素晴らしいですね。

ビルド方法については長くなるので(その2)に続きます・・。

2013年7月24日水曜日

Mac OS X Mountain Lion で OpenSSH をビルド・インストールする ( 作業メモ )

先日 Mac OS X Mountain Lion から RaspberryPi(FreeBSD) に ssh 接続しようとすると、RaspberryPi 側から接続がはねられる(Connection colosed by host)という現象に悩まされました。

鍵交換アルゴリズムが hmac-sha1 だとダメで、hmac-md5-xx だと OK のようだ、という情報を得たので、

% ssh -m hmac-md5 host-ip-address
Connection closed by host-ip-address
% ssh -m hmac-md5-96 host-ip-address
Connection closed by host-ip-address

( 認証は公開鍵暗号方式で、ホストには公開鍵を登録済 )

とやっぱりダメです。 ターミナルで確認すると、デフォルトで Mountain Lion に入っている OpenSSH のバージョンがそもそも結構古いです。

% which ssh
/usr/bin/ssh
% ssh -V
OpenSSH_5.9p1, OpenSSL 0.9.8x 10 May 2012

ちなみにこの記事時点での最新は以下の通りで、FreeBSD 側はこれです。

raspberry-pi% ssh -V
OpenSSH_6.2p2, OpenSSL 1.0.1e-freebsd 11 Feb 2013

そこで、試しに Mac OS X の OpenSSH をソースコードからビルドインストールしてみることにしました。

尚、Mac OS X Mountain Lion でこの作業を行うには、Xcode 及び、Command Line Tools ( Xcode の Preferences からインストール) が必要となります。
現在は Command Line Tools はどうもターミナルから以下のコマンドを入力しないとインストールできないようです。

% xcode-select --install

1:OpenSSH のソースコードを取得する

まず、OpenSSH のミラーサイトからソースコードを取得します。
Portable OpenSSH のページの下の方にダウンロード用のミラーサイト一覧があるので適当なものを選択してダウンロードします。

今回は現時点の最新である openssh-6.2p2 をダウンロードしようとしたら、 最初に開いたミラーサイトにはなぜか存在しませんでした。こんなこともあるんですね。 次に開いたミラーサイトには存在したので、そちらからダウンロードしました。

ダウンロードした openssh-6.2p2.tar.gz をダブルクリックで解凍します。
本当はファイルの正真性を確認すべきなのでしょうが、ここでは省略します。
興味が有る方は入門OpenSSH 2.3.2. ダウンロードしたパッケージの正真性を確認する を参考にするとよいでしょう。

2:OpenSSL のソースコードを取得する

合わせて OpenSSL も更新するため、こちらも OpenSSL のソースコードダウンロードページから現時点での最新版 openssl-1.0.1e をダウンロードします。 最新版は[LATEST]と表示されています
ダウンロードした openssl-1.0.1e.tar.gz をダブルクリックで解凍します。

3:OpenSSL をコンパイル、インストールする

OpenSSH は ssl に依存していますので、 最初に OpenSSL を ビルド・インストールします。
ターミナルを立ち上げて、

% cd Downloads/openssl-1.0.1e

64bit 版 Mac の場合は、./Configure darwin64-x86_64-cc を使用して構成します。
32bit 版 Mac の場合は、通常通り ./config を使用します。
他の ssl とかぶらないインストール場所を --openssldir でオプション指定します。今回は /usr/local/openssl を指定しています。また、共有ライブラリオプション shared をつけています。

% ./Configure darwin64-x86_64-cc --openssldir=/usr/local/openssl shared
% make
% sudo make install

4:OpenSSH をコンパイル、インストールする

無事に終了したら、いよいよ本命の OpenSSH の ビルド・インストール です。

% cd ../openssh-6.2p2

今回は、/usr/local 以下にインストール、PAM サポート有効、MD5 形式パスワードサポート、 zlib のバージョンチェックなし、ssl は先ほどインストールした OpenSSL を使用、で build することにするため、 以下のオプションを付けて configure スクリプトを実行します。
インストール先はデフォルトで /usr/local になっているため、今回は特に指定しませんが、/usr/local 以外にインストールしたい場合は、別途 --prefix オプション等で指定します。
OpenSSL を今回のように新規でインストールしない場合でも、システム上に複数の ssl が存在していると Your OpenSSL headers do not match your library. のようなエラーを吐いて終了してしまうので、その場合は --with-ssl-dir で ssl のディレクトリを指定する必要があります。

% ./configure --with-pam --with-md5-passwords --without-zlib-version-check --with-ssl-dir=/usr/local/openssl
% make
% sudo make install
% rehash

5: 環境変数 PATH の修正をする

インストールが完了したら、今後 ssh クライアントを使用する際は、 /usr/local/bin のものを優先的に使用したいため、環境変数の設定をする必要があります。 要は PATH の先頭に、/usr/local/bin が入っていればいいわけなので、

% printenv

で表示される PATH の値を確認して、問題なければ修正をする必要はありません。 わたしの環境では以下の状態でした。

 
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Mountain Lion 以前では環境変数の修正をする場合は ~/.MacOSX/environment.plist に設定すれば良かったらしいのですが、Mountain Lion からはこのファイルが使えなくなった(!)そうなので、
今回は代わりに、 /etc/paths を修正します。

尚、OpenSSL も今回インストールするバージョンに切り替えるのであれば ( いろんな意味でそのほうが良いでしょう )、 /usr/local/openssl/binも合わせて追加する必要があります。

現在の内容を確認すると

% more /etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

これを、

% sudo vi /etc/paths

で以下のように修正し、保存して終了します。

/usr/local/openssl/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

一旦再起動します。
再びコンソールから環境変数の確認をします。

% printenv
PATH=/usr/local/openssl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

これで PATH が修正されました。

6:インストール後のバージョンを確認する

ここで、正しくインストールが実行されたか、ssh のバージョンを確認します。

% which ssh
/usr/local/bin/ssh
% ssh -V
OpenSSH_6.2p2, OpenSSL 1.0.1e 11 Feb 2013
% which openssl
/usr/local/openssl/bin/openssl
% openssl version
OpenSSL 1.0.1e 11 Feb 2013

上記のように表示されれば、無事 update に成功となります。

sshd を起動済みの場合は、システム環境設定のインターネットとワイヤレスの共有から、リモートログインのオンオフをすれば sshd が再起動します。

ちなみに、この update で、無事に Mac OS X Mountain Lion からも、 RaspberryPi(FreeBSD) に ssh 接続できるようになりました。