4/24/2014

glusterd を再起動したら失敗するようになった問題→とりあえず復旧させてみた

OpenSSLの脆弱性がでたので、Webサーバ、メールサーバ、ほかSSH開けてるとこなんぞにパッチ当てる→サービス再起動なんていうのをしばらくやっていくうちに、だんだん面倒になってきて、OSごと再起動したものがありました。
そしたら、なぜかglusterdがあがらなくなるという問題に遭遇したので、メモしておきます。ちなみに、OpenSSLのパッチとは無関係です。

●ログ

[ec2-user@ip-10-152-253-193 ~]$ sudo less /var/log/glusterfs/etc-glusterfs-glusterd.vol.log

[2014-04-11 01:04:49.486482] I [glusterfsd.c:1910:main] 0-/usr/sbin/glusterd: Started running /usr/sbin/glusterd version 3.4.2 (/usr/sbin/glusterd --pid-file=/var/run/glusterd.pid)
[2014-04-11 01:04:49.494405] I [glusterd.c:961:init] 0-management: Using /var/lib/glusterd as working directory
[2014-04-11 01:04:49.497892] I [socket.c:3480:socket_init] 0-socket.management: SSL support is NOT enabled
[2014-04-11 01:04:49.497918] I [socket.c:3495:socket_init] 0-socket.management: using system polling thread
[2014-04-11 01:04:49.498045] E [rpc-transport.c:253:rpc_transport_load] 0-rpc-transport: /usr/lib64/glusterfs/3.4.2/rpc-transport/rdma.so: cannot open shared object file: No such file or directory
[2014-04-11 01:04:49.498071] W [rpc-transport.c:257:rpc_transport_load] 0-rpc-transport: volume 'rdma.management': transport-type 'rdma' is not valid or not found on this machine
[2014-04-11 01:04:49.498084] W [rpcsvc.c:1389:rpcsvc_transport_create] 0-rpc-service: cannot create listener, initing the transport failed
[2014-04-11 01:04:51.021829] I [glusterd-store.c:1339:glusterd_restore_op_version] 0-glusterd: retrieved op-version: 2
[2014-04-11 01:04:51.029440] E [glusterd-store.c:1858:glusterd_store_retrieve_volume] 0-: Unknown key: brick-0
[2014-04-11 01:04:51.029475] E [glusterd-store.c:1858:glusterd_store_retrieve_volume] 0-: Unknown key: brick-1
[2014-04-11 01:04:51.594617] I [glusterd-handler.c:2818:glusterd_friend_add] 0-management: connect returned 0
[2014-04-11 01:04:51.594755] I [rpc-clnt.c:962:rpc_clnt_connection_init] 0-management: setting frame-timeout to 600
[2014-04-11 01:04:51.594834] I [socket.c:3480:socket_init] 0-management: SSL support is NOT enabled
[2014-04-11 01:04:51.594851] I [socket.c:3495:socket_init] 0-management: using system polling thread
[2014-04-11 01:04:51.603866] I [glusterd.c:125:glusterd_uuid_init] 0-management: retrieved UUID: 553eb388-83e6-43bd-86b5-0b70cd1ac716
[2014-04-11 01:04:51.607534] E [glusterd-store.c:2487:glusterd_resolve_all_bricks] 0-glusterd: resolve brick failed in restore
[2014-04-11 01:04:51.607567] E [xlator.c:390:xlator_init] 0-management: Initialization of volume 'management' failed, review your volfile again
[2014-04-11 01:04:51.607588] E [graph.c:292:glusterfs_graph_init] 0-management: initializing translator failed
[2014-04-11 01:04:51.607601] E [graph.c:479:glusterfs_graph_activate] 0-graph: init failed
[2014-04-11 01:04:51.607768] W [glusterfsd.c:1002:cleanup_and_exit] (-->/usr/sbin/glusterd(main+0x5d2) [0x406802] (-->/usr/sbin/glusterd(glusterfs_volumes_init+0xb7) [0x4051b7] (-->/usr/sbin/glusterd(glusterfs_process_volfp+0x103) [0x4050c3]))) 0-: received signum (0), shutting down

●まずは、[2014-04-11 01:04:49.498045] E [rpc-transport.c:253:rpc_transport_load] 0-rpc-transport: /usr/lib64/glusterfs/3.4.2/rpc-transport/rdma.so: cannot open shared object file: No such file or directory に対処。

これっておそらく今回の問題に当たる前から出てたんだと思う。rdma使ってないので、設定を修正。

[ec2-user@ip-10-152-253-193 ~]$ diff -Nru /etc/glusterfs/glusterd.vol{.back,}
--- /etc/glusterfs/glusterd.vol.back 2014-01-03 12:38:22.000000000 +0000
+++ /etc/glusterfs/glusterd.vol 2014-04-11 01:07:15.819054736 +0000
@@ -1,7 +1,7 @@
 volume management
     type mgmt/glusterd
     option working-directory /var/lib/glusterd
-    option transport-type socket,rdma
+    option transport-type socket
     option transport.socket.keepalive-time 10
     option transport.socket.keepalive-interval 2
     option transport.socket.read-fail-log off

そしてもっかい起動してみる。
[ec2-user@ip-10-152-253-193 ~]$ sudo /etc/init.d/glusterd start
                                         [FAILED]

ほう。ログ見ると、rdmaのエラーは消えたけど、、、

[2014-04-11 01:08:05.016191] I [glusterfsd.c:1910:main] 0-/usr/sbin/glusterd: Started running /usr/sbin/glusterd version 3.4.2 (/usr/sbin/glusterd --pid-file=/var/run/glusterd.pid)
[2014-04-11 01:08:05.024142] I [glusterd.c:961:init] 0-management: Using /var/lib/glusterd as working directory
[2014-04-11 01:08:05.027698] I [socket.c:3480:socket_init] 0-socket.management: SSL support is NOT enabled
[2014-04-11 01:08:05.027726] I [socket.c:3495:socket_init] 0-socket.management: using system polling thread
[2014-04-11 01:08:06.544738] I [glusterd-store.c:1339:glusterd_restore_op_version] 0-glusterd: retrieved op-version: 2
[2014-04-11 01:08:06.548780] E [glusterd-store.c:1858:glusterd_store_retrieve_volume] 0-: Unknown key: brick-0
[2014-04-11 01:08:06.548823] E [glusterd-store.c:1858:glusterd_store_retrieve_volume] 0-: Unknown key: brick-1
[2014-04-11 01:08:07.119147] I [glusterd-handler.c:2818:glusterd_friend_add] 0-management: connect returned 0
[2014-04-11 01:08:07.119290] I [rpc-clnt.c:962:rpc_clnt_connection_init] 0-management: setting frame-timeout to 600
[2014-04-11 01:08:07.119375] I [socket.c:3480:socket_init] 0-management: SSL support is NOT enabled
[2014-04-11 01:08:07.119391] I [socket.c:3495:socket_init] 0-management: using system polling thread
[2014-04-11 01:08:07.128143] I [glusterd.c:125:glusterd_uuid_init] 0-management: retrieved UUID: 553eb388-83e6-43bd-86b5-0b70cd1ac716
[2014-04-11 01:08:07.130647] E [glusterd-store.c:2487:glusterd_resolve_all_bricks] 0-glusterd: resolve brick failed in restore
[2014-04-11 01:08:07.130679] E [xlator.c:390:xlator_init] 0-management: Initialization of volume 'management' failed, review your volfile again
[2014-04-11 01:08:07.130695] E [graph.c:292:glusterfs_graph_init] 0-management: initializing translator failed
[2014-04-11 01:08:07.130706] E [graph.c:479:glusterfs_graph_activate] 0-graph: init failed
[2014-04-11 01:08:07.130880] W [glusterfsd.c:1002:cleanup_and_exit] (-->/usr/sbin/glusterd(main+0x5d2) [0x406802] (-->/usr/sbin/glusterd(glusterfs_volumes_init+0xb7) [0x4051b7] (-->/usr/sbin/glusterd(glusterfs_process_volfp+0x103) [0x4050c3]))) 0-: received signum (0), shutting down


●なんぞこれ?
[2014-04-11 01:08:06.548780] E [glusterd-store.c:1858:glusterd_store_retrieve_volume] 0-: Unknown key: brick-0
[2014-04-11 01:08:06.548823] E [glusterd-store.c:1858:glusterd_store_retrieve_volume] 0-: Unknown key: brick-1

MLアーカイブでいくつかヒットするんだけど、どうもハズしてそうなのと、未解決なまま残っているのと・・・。
http://www.gluster.org/pipermail/gluster-users/2013-August/036984.html
http://www.gluster.org/pipermail/gluster-users/2013-January/035249.html
http://gluster.org/pipermail/gluster-users/2012-August/011189.html


原因究明のためにAWSでスナップショットとっといて、とりあえず復旧優先で進めます。

●ボリュームを再作成する
[ec2-user@ip-10-152-253-193 ~]$ sudo cp -rp /var/lib/glusterd{,.back}
[ec2-user@ip-10-152-253-193 ~]$ sudo diff -Nru /var/lib/glusterd{.back,}
[ec2-user@ip-10-152-253-193 ~]$ sudo gluster peer probe ec2-****

$ sudo gluster volume heal vol01 info
→ あかん
$ sudo /etc/init.d/nginx stop
$ sudo umount /var/www
$ sudo /etc/init.d/glusterfsd stop
$ sudo gluster volume stop vol01
$ sudo gluster volume delete vol01
$ sudo gluster volume create vol01 replica 2 transport tcp ec2-54-238-57-107.ap-northeast-1.compute.amazonaws.com:/data/brick01 ec2-176-34-56-112.ap-northeast-1.compute.amazonaws.com:/data/brick01
volume create: vol01: failed: /data/brick01 or a prefix of it is already part of a volume
→怒られた

$ sudo rm -rf /data/brick01.glusterfs
$ sudo setfattr -x trusted.glusterfs.volume-id /data/brick01
$ sudo setfattr -x trusted.gfid /data/brick01

[ec2-user@ip-10-152-253-193 ~]$ sudo rm -rf /data/brick01.glusterfs
[ec2-user@ip-10-152-253-193 ~]$ sudo setfattr -x trusted.glusterfs.volume-id /data/brick01
[ec2-user@ip-10-152-253-193 ~]$ sudo setfattr -x trusted.gfid /data/brick01

$ sudo gluster volume create vol01 replica 2 transport tcp ec2-54-238-57-107.ap-northeast-1.compute.amazonaws.com:/data/brick01 ec2-176-34-56-112.ap-northeast-1.compute.amazonaws.com:/data/brick01
volume create: vol01: success: please start the volume to access data
→ 成功

[ec2-user@ip-10-126-5-43 ~]$ sudo gluster volume start vol01
volume start: vol01: success
[ec2-user@ip-10-126-5-43 ~]$ sudo gluster volume status
Status of volume: vol01
Gluster process Port Online Pid
------------------------------------------------------------------------------
Brick ec2-54-238-57-107.ap-northeast-1.compute.amazonaw
s.com:/data/brick01 49152 Y 3379
Brick ec2-176-34-56-112.ap-northeast-1.compute.amazonaw
s.com:/data/brick01 49153 Y 3370
NFS Server on localhost 2049 Y 3387
Self-heal Daemon on localhost N/A Y 3382
NFS Server on ec2-54-238-57-107.ap-northeast-1.compute.
amazonaws.com 2049 Y 3395
Self-heal Daemon on ec2-54-238-57-107.ap-northeast-1.co
mpute.amazonaws.com N/A Y 3391

There are no active volume tasks
[ec2-user@ip-10-126-5-43 ~]$ sudo /etc/init.d/glusterfsd start
[ec2-user@ip-10-126-5-43 ~]$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/xvda1       8256952 1164492   7008576  15% /
tmpfs             304144       0    304144   0% /dev/shm
/dev/xvdb1      20308020  203844  19055940   2% /data
[ec2-user@ip-10-126-5-43 ~]$ sudo /etc/init.d/glusterfsd status
glusterfsd (pid 3370) is running...
[ec2-user@ip-10-126-5-43 ~]$ sudo mount /var/www
[ec2-user@ip-10-126-5-43 ~]$ df
Filesystem                                                    1K-blocks    Used Available Use% Mounted on
/dev/xvda1                                                      8256952 1164516   7008552  15% /
tmpfs                                                            304144       0    304144   0% /dev/shm
/dev/xvdb1                                                     20308020  203844  19055940   2% /data
ec2-176-34-56-112.ap-northeast-1.compute.amazonaws.com:/vol01  20307968  203904  19055872   2% /var/www
[ec2-user@ip-10-126-5-43 ~]$ sudo /etc/init.d/nginx start
Starting nginx:                                            [  OK  ]


ひとまず。


11/01/2012

AWSでGlusterを動かす


AWSでGlusterを動かしてみます。EBSだと高くつくので、Instance Storeで。まずは、Amazon Linux(ami-5a6cd35b)にInstance Store Volumesを2つくっつけて起動します。

●なにはともあれ、yumアップデート。
[ec2-user@ip-10-156-59-42 ~]$ sudo yum update

●Glusterのソースをダウンロード。

[ec2-user@ip-10-156-59-42 ~]$ wget
http://download.gluster.org/pub/gluster/glusterfs/3.3/3.3.1/glusterfs-3.3.1.tar.gz
--2012-10-29 03:05:13--
http://download.gluster.org/pub/gluster/glusterfs/3.3/3.3.1/glusterfs-3.3.1.tar.gz
Resolving download.gluster.org... 50.57.69.89
Connecting to download.gluster.org|50.57.69.89|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2636698 (2.5M) [application/x-gzip]
Saving to: “glusterfs-3.3.1.tar.gz”

100%[======================================>] 2,636,698   1.13M/s   in 2.2s

2012-10-29 03:05:16 (1.13 MB/s) - “glusterfs-3.3.1.tar.gz” saved
[2636698/2636698]

●Glusterのコンパイルに必要なパッケージをインストール。
[ec2-user@ip-10-156-59-42 ~]$ sudo yum install make gcc flex bison
openssl-static readline-static

●Glusterをコンパイルしてインストール
[ec2-user@ip-10-156-59-42 ~]$ tar zxvf glusterfs-3.3.1.tar.gz
[ec2-user@ip-10-156-59-42 ~]$ cd glusterfs-3.3.1
[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ ./configure
(略)
GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : no
epoll IO multiplex : yes
argp-standalone    : no
fusermount         : no
readline           : yes
georeplication     : yes
Linux-AIO          : no

[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ make
(略)
[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ sudo make install
(略)

●起動スクリプトをコピーして、使えるか確認。
[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ sudo cp
extras/init.d/glusterd-Redhat /etc/init.d/glusterd
[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ sudo chmod a+x
/etc/init.d/glusterd
[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ sudo /sbin/service glusterd
start
Starting glusterd:                                         [  OK  ]
[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ sudo /sbin/service glusterd
restart
Stopping glusterd:                                         [  OK  ]
Starting glusterd:                                         [  OK  ]
[ec2-user@ip-10-156-59-42 glusterfs-3.3.1]$ sudo /sbin/service glusterd stop
Stopping glusterd:                                         [  OK  ]

●ここまでで一旦、AMIを作る
※scpなどでX.509証明書と秘密鍵を転送する必要あり。

[ec2-user@ip-10-156-59-42 ~]$ sudo su -
[root@ip-10-156-59-42 ~]# ec2-bundle-vol -d /media/ephemeral0 --privatekey
~ec2-user/PrivateKey.pem --cert ~ec2-user/X509Certificate.pem --user
XXXX-XXXX-XXXX --fstab /etc/fstab
Please specify a value for arch [x86_64]:
(略)
[root@ip-10-156-59-42 ~]# ec2-upload-bundle -r ap-northeast-1 --bucket
My_Bucket/Gluster_Node_Base --manifest /media/ephemeral0/image.manifest.xml
--access-key XXXXXXXXXXXXXXXXXXXX --secret-key
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
(略)
[root@ip-10-156-59-42 ~]# ec2-register --region ap-northeast-1
--aws-access-key XXXXXXXXXXXXXXXXXXXX --aws-secret-key
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --name gluster_node_base
My_Bucket/Gluster_Node_Base/image.manifest.xml
IMAGE   ami-xxxxxxxx


●作成したAMIからインスタンスを作って3台起動。
1台目(ap-northeast-1a)
ec2-46-51-226-247.ap-northeast-1.compute.amazonaws.com

2台目(ap-northeast-1b)
ec2-176-32-64-146.ap-northeast-1.compute.amazonaws.com

3台目(ap-northeast-1c)
ec2-54-248-159-67.ap-northeast-1.compute.amazonaws.com

1台目と2台目のglusterのuuidを変えておく。
[ec2-user@ip-10-152-251-141 ~]$ cd /var/lib/glusterd/
[ec2-user@ip-10-152-251-141 glusterd]$ sudo cp -p glusterd.info
glusterd.info.back
[ec2-user@ip-10-152-251-141 glusterd]$ sudo vi glusterd.info
UUID=48a21eef-7789-45db-8f59-c5214297fbd2
[ec2-user@ip-10-152-251-141 ~]$ sudo /sbin/service glusterd restart
Stopping glusterd:                                         [  OK  ]
Starting glusterd:                                         [  OK  ]


この時点での各インスタンスのGlusterのUuidは、
1: UUID=48a21eef-7789-45db-8f59-c5214297fbd1
2: UUID=48a21eef-7789-45db-8f59-c5214297fbd2
3: UUID=48a21eef-7789-45db-8f59-c5214297fbd3

にしておいた。

●Glusterにノードを追加(Trusted Storage Poolを作る)
[ec2-user@ip-10-158-173-174 ~]$ sudo /usr/local/sbin/gluster
gluster> peer probe ec2-176-32-64-146.ap-northeast-1.compute.amazonaws.com
Probe successful
State: Peer in Cluster (Connected)
gluster> peer probe ec2-54-248-159-67.ap-northeast-1.compute.amazonaws.com
Probe successful
gluster> peer status
Number of Peers: 2

Hostname: ec2-176-32-64-146.ap-northeast-1.compute.amazonaws.com
Uuid: 48a21eef-7789-45db-8f59-c5214297fbd2
State: Peer in Cluster (Connected)

Hostname: ec2-54-248-159-67.ap-northeast-1.compute.amazonaws.com
Uuid: 48a21eef-7789-45db-8f59-c5214297fbd3
State: Peer in Cluster (Connected)


1台目のノードは、他のノードから追加してあげる。
[ec2-user@ip-10-152-251-141 ~]$ sudo /usr/local/sbin/gluster
gluster> peer probe ec2-46-51-226-247.ap-northeast-1.compute.amazonaws.com
Probe successful


●3つのレプリカを持つクラスタボリュームを作成して起動する。
gluster> volume create test-volume replica 3 transport tcp
ec2-46-51-226-247.ap-northeast-1.compute.amazonaws.com:/media/ephemeral0
ec2-176-32-64-146.ap-northeast-1.compute.amazonaws.com:/media/ephemeral0
ec2-54-248-159-67.ap-northeast-1.compute.amazonaws.com:/media/ephemeral0
Creation of volume test-volume has been successful. Please start the volume
to access data.
gluster> volume start test-volume
Starting volume test-volume has been successful


●マウントしてみる
[ec2-user@ip-10-158-173-174 ~]$ sudo mkdir /media/gluster0
[ec2-user@ip-10-158-173-174 ~]$ sudo mount -t glusterfs
ec2-46-51-226-247.ap-northeast-1.compute.amazonaws.com:/test-volume
/media/gluster0
[ec2-user@ip-10-158-173-174 ~]$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda1            10321208   1349420   8447500  14% /
tmpfs                   848480         0    848480   0% /dev/shm
/dev/xvdb            153899044    192084 145889336   1% /media/ephemeral0
ec2-46-51-226-247.ap-northeast-1.compute.amazonaws.com:/test-volume
                    153899008    192128 145889280   1% /media/gluster0


●テスト
[ec2-user@ip-10-158-173-174 ~]$ sudo cp -rp ./* /media/gluster0/
[ec2-user@ip-10-152-251-141 ~]$ sudo du -a /media/ephemeral0 | wc -l
2346

これで、東京にあるAWSの3つのリージョンをまたぐ分散ファイルシステムの完成。容量は140GB。

ひとまず。

10/10/2012

隠れた能力を見つけよう!

最近ハマったというか、面白かったと思うのはこれですね↓


去年やったハーマンモデルを思い出しました。ハーマンモデルは右脳 or 左脳と、大脳新皮質 or 辺縁皮質をマトリックスにして4象限で「利き脳」をわかるように分類するものです。一方、この本に載っている方法は、偉い人にインタビューをしつつアンケートを採った結果に基づいている、とのこと。これがですね、結構当たるんですよ。

本を買うと「ストレングスファインダー」というWebの強み発見ツールが使えるパスコードがくっついていて、それを使ってポチポチやるだけで180個の34個の資質の中から5つの強みを出してくれます。チームでこれをやって、お互いの特性を一目で認識できるようにしておいて合宿とかすると面白いかもしれませんね。

ちなみに僕は、活発性、学習欲、目標志向、着想、親密性、でした。一緒の順番の人いるのかな?33,390,720通りあるので、地球上に180人ぐらい一緒な人がいますね。

9/17/2012

NASにあるiPhotoライブラリが開けなくなった

嫁さんのMacのローカルドライブがカツカツだったので、特に大きな写真たちをTime Capsuleへ移動して、とりあえずの容量を稼ぐことにしました。その容量、なんと90GB以上。いやぁ、スマホってやっぱデータ生産装置なんですよね。 恒久的には、写真はAdobe Revelなんぞに移行しますが、この話はまた機会があれば。

で、しばらくTime CapsuleにあるiPhotoライブラリを使ってましたが、さきほど我が家のチビがMacの電源長押しする事故があって、iPhotoを開けなくなりました。iPhotoを開くとこんなメッセージが出ます。


警告
iPhoto ライブラリがロックされているか、ロックされたディスク上にあるか、変更する権限がユーザにありません。

なにやら楽しそうなメッセージですね。電源プッチンされたために、ロックファイルか何かが残っちゃったんでしょう。まずはiPhotoを閉じて、と。

$ cd /Volumes/Time\ Capsule/iPhoto\ Library/
$ ls -la | grep -E '(l|L)ock'
-rwxrwxrwx  1 user  staff          1 Sep 17 15:10 iPhotoLock.data


あったね。誰が開いてるのか、一応チェック。

$ lsof -f -- ./iPhotoLock.data
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
iPhoto  515 user   10u   REG   46,3        1 264951 ./iPhotoLock.data

ん。間違いない。ではさようなら。

$ mv ./iPhotoLock.data ./iPhotoLock.data.back

無事、起動できましたー。これを書き終わっても、まだサムネールキャッシュを再構築してますね。


7/21/2012

port upgrade に失敗する

とある機会があって、久々にmac portsを触ってみたら、なんかエラーがでるようになっていた。
$ sudo port upgrade installed
---> Fetching ncurses
---> Attempting to fetch ncurses-5.9.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/ncurses
---> Attempting to fetch ncurses-5.9.tar.gz from http://ykf.ca.distfiles.macports.org/MacPorts/mpdistfiles/ncurses
---> Verifying checksum(s) for ncurses
---> Extracting ncurses
---> Applying patches to ncurses
---> Configuring ncurses
Error: Target org.macports.configure returned: configure failure: shell command failed (see log for details)
Log for ncurses is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_ncurses/main.log
Error: Unable to upgrade port: 1
To report a bug, see <http://guide.macports.org/#project.tickets>
で、早速ログ(上のなかのmain.logね)を見てみると、
:info:configure checking for C compiler default output... configure: error: C compiler cannot create executables
なんでそんなことに・・・。
google先生に訊いてみると、ちゃんとXcodeがインストールされてるか確認せよ、とのこと。

https://trac.macports.org/wiki/FAQ#missingxcode

I get the error "C compiler cannot create executables" or "can't read "build.cmd": Failed to locate 'make' in path" when I try to install a port. Why?
You need to install Xcode. Ensure you include both System Tools and Unix Development. As of Xcode 4.3, you also need to install the separate Command Line Tools package.


なんかそういわれると自信なくなってきた。早速Xcodeを起動してみると、Version 3.2.4が入っていることが確認できた。古いなぁ・・・。とても昔にAppleのDeveloperサイトからダウンロードして入れた記憶があるんだけど、果たしてSystem ToolsやUnix Developmentを入れたかと言われると、とてつもなく自信がない。
よっさ、この際バージョンアップするべ。
ということで、App StoreへGo!

ところで、Command Line Toolsとやらはどこにあるのだろう?と探していたら、なんとPreferences > Downloads からインストールできるようになっていることを発見!あら簡単!
しかし、しばらく見ない間に、Xcodeのインタフェースが変わりましたね。なんかもう、何がどこにあるのやらよくわからんような状態。とかいってたら、Time Machineのバックアップが始まってしまった。ということで続きはまた後日。