2013年11月アーカイブ

遅まきながら、「艦隊これくしょん~艦これ~ - オンラインゲーム - DMM.com」と言うゲームを始めました。
このゲーム、flash が必須になっているのでiPhoneでやることができません。でも、運営がdmmと言うこともあって、職場からはアクセスしずらい・・・。
そして、私が持っているMacBook Proは蓋が閉じているとリモートアクセスできないと言う謎仕様なので、リモートでやることができません。
うちで常時起動しているのはFreeBSD8のサーバだけ。
ならば、こいつで艦これが動けばいいのです。
まずは、FreeBSD上のfirefoxでflashが使えるようにする必要があります。この手順は、FreeBSDハンドブックの7.2. Web ブラウザを見ればそのままで行けます。
これで、firefox上で艦これができるようになるのですが、それだけではつまりません。
艦メモ ~艦娘メモリーズ~(艦これ専用ブラウザ) - 理ろぐと言うQtで書かれた艦これ専用ブラウザアプリがあるので、これをFreeBSDで動かすことにします。
Qtは、マルチプラットフォームが売りのGUIライブラリなので、FreeBSDでもそのまま動くはず。
が、portsにあるのはQt 4.8だけ。5系はまだportsで対応していないようです。
しょうがないので、Download Qt, the cross-platform application framework | Qt Project からソースを持ってきてビルドすることにします。
持ってくるのは、The source code is also available as a single zip (280 MB) (Info) file for Windows users or as tar.gz (226 MB) (Info) file for Linux/Mac users.って書いてある「tar.gz」のリンク先から、qt-everywhere-opensource-src-5.1.1.tar.gz。
こいつを展開して、以下のようなシェルスクリプトを作成して実行します。(別にシェルスクリプトにしなくても良いんだけど、何度もやり直すので)
#!/bin/bash

./configure -opensource -confirm-license -no-compile-examples |& tee configure.log
configure.logの最後の方だけ引用しておくと、
Build options:
  Configuration .......... accessibility accessibility-atspi-bridge alsa audio-backend clock-gettime clock-monotonic concurrent cups dbus evdev fontconfig full-config getaddrinfo getifaddrs glib gnu-libiconv gstreamer gtk2 gtkstyle icu ipv6ifname large-config largefile medium-config minimal-config nis opengl openssl png precompile_header qpa qpa reduce_exports release rpath shared small-config sse2 sse3 ssse3 system-freetype system-jpeg system-png system-zlib v8 v8snapshot xcb xcb-glx xcb-render xcb-xlib xinput2 xlib xrender 
  Build parts ............ libs tools examples
  Mode ................... release
  Using C++11 ............ no
  Using PCH .............. yes
  Target compiler supports:
    SSE2/SSE3/SSSE3 ...... yes/yes/yes
    SSE4.1/SSE4.2 ........ no/no
    AVX/AVX2 ............. no/no

Qt modules and options:
  Qt D-Bus ............... yes (loading dbus-1 at runtime)
  Qt Concurrent .......... yes
  Qt GUI ................. yes
  Qt Widgets ............. yes
  JavaScriptCore JIT ..... yes (To be decided by JavaScriptCore)
  QML debugging .......... yes
  Use system proxies ..... no

Support enabled for:
  Accessibility .......... yes
  ALSA ................... yes
  CUPS ................... yes
  FontConfig ............. yes
  Iconv .................. gnu
  ICU .................... yes
  Image formats: 
    GIF .................. yes (plugin, using system library)
    JPEG ................. yes (plugin, using system library)
    PNG .................. yes (in QtGui, using system library)
  Glib ................... yes
  GStreamer .............. yes
  GTK theme .............. yes
  Large File ............. yes
  libudev ................ no
  Networking: 
    getaddrinfo .......... yes
    getifaddrs ........... yes
    IPv6 ifname .......... yes
    OpenSSL .............. yes (loading libraries at run-time)
  NIS .................... yes
  OpenGL ................. desktop
  OpenVG ................. no
  PCRE ................... system
  pkg-config ............. yes 
  PulseAudio ............. no
  QPA backends: 
    DirectFB ............. no
    EGLFS ................ no
    KMS .................. no
    LinuxFB .............. no
    XCB .................. yes (system library)
      MIT-SHM ............ yes
      Xcursor ............ yes (loaded at runtime)
      Xfixes ............. yes (loaded at runtime)
      Xi ................. no
      Xi2 ................ yes
      Xinerama ........... yes (loaded at runtime)
      Xrandr ............. yes (loaded at runtime)
      Xrender ............ yes
      XKB ................ no
      XShape ............. yes
      XSync .............. yes
      XVideo ............. yes
  Session management ..... yes
  SQL drivers: 
    DB2 .................. no
    InterBase ............ no
    MySQL ................ yes (plugin)
    OCI .................. no
    ODBC ................. yes (plugin)
    PostgreSQL ........... yes (plugin)
    SQLite 2 ............. yes (plugin)
    SQLite ............... yes (plugin, using bundled copy)
    TDS .................. no
  udev ................... no
  xkbcommon .............. yes
  zlib ................... yes (system library)


Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into /usr/local/Qt-5.1.1

みたいな感じ。実際には、ここまで来るのが長くて、必要なライブラリをいろいろ入れて上げないとこの状態になりません。元から入っているものがあるので、全て列挙できませんが、私が追加したライブラリ(ports)を以下に列挙しておきます。
  • graphics/svgalib
  • x11/libxcb
  • x11/libxkbcommon
  • x11/xcb
  • x11/xcb-proto
  • x11/xcb-util
  • x11/xcb-util-image
  • x11/xcb-util-keysyms
  • x11/xcb-util-renderutil
  • x11/xcb-util-wm
configureに成功したら、ビルドします。必ず、make ではなく gmake を使うこと。configureの出力に書いてあるのですが、気が付かずに make を使っていてずっとはまっていました。
ビルドしていくと、以下のエラーで止まります。
/usr/bin/ld: cannot find -ldl
gmake[6]: *** [../../../../plugins/platforms/libqxcb.so] エラー 1
gmake[6]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/platforms/xcb' から出ます
libdlがないと言うエラーですが、FreeBSDの場合はlibcに含まれています。
mkspecsにはないみたいだし、なんでかな〜と思ってソースを眺めていると、qtbase/src/plugins/platforms/xcb/xcb-plugin.pro に LIBS += -ldl なんて書いてあります。
今回は、とりあえずFreeBSDでビルドできればいいので、この行を消してしまいましょう。
diff --git a/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro b/qtbase/src/plugins/pl
atforms/xcb/xcb-plugin.pro
index 8299528..4559081 100644
--- a/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro
+++ b/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro
@@ -40,7 +40,7 @@ HEADERS = \
         qxcbimage.h \
         qxcbxsettings.h
 
-LIBS += -ldl
+#LIBS += -ldl
 
 # needed by GLX, Xcursor ...
 contains(QT_CONFIG, xcb-xlib) {
先に進むと、今度はsqlite3のビルドでエラーになります。
../../../3rdparty/sqlite/sqlite3.c:23531: error: 'fchmod' undeclared here (not in a function)


(中略)


gmake[5]: *** [.obj/release-shared/sqlite3.o] エラー 1
gmake[5]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/sqldrivers/sqlite' から出ます
fchmod は sys/stat.h にプロトタイプ宣言があるはずで、/usr/include/sys/stat.h を見ると #if __POSIX_VISIBLE >= 200112 であれば宣言されるように見えますが、__POSIX_VISIBLEがなんなのかわかりません。追うのも面倒なので、sqlite3.c に直接プロトタイプ宣言を追加してしまいます。
diff --git a/qtbase/src/3rdparty/sqlite/sqlite3.c b/qtbase/src/3rdparty/sqlite/sqlit
e3.c
index 03fa649..2675d25 100644
--- a/qtbase/src/3rdparty/sqlite/sqlite3.c
+++ b/qtbase/src/3rdparty/sqlite/sqlite3.c
@@ -23019,6 +23019,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
 #include <sys/mman.h>
 #endif
 
+int fchmod(int, mode_t);
 
 #if SQLITE_ENABLE_LOCKING_STYLE
 # include <sys/ioctl.h>
さらに進むと、リンク時にundefined referenceが出ます。
g++ -Wl,--no-undefined -Wl,-O1 -pthread -Wl,-rpath,/usr/local/Qt-5.1.1/lib -Wl,-rpath-link,/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib -shared -o libqevdevmouseplugin.so .obj/release-shared/main.o  -L/usr/local/lib -L/usr/X11R6/lib -L/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib -lQt5PlatformSupport -lfontconfig -lfreetype -lgthread-2.0 -pthread -lglib-2.0 -lintl -lXext -lX11 -lm -lXrender -lQt5DBus -lQt5Gui -lQt5Core -lGL  
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x994): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::create(QFlags<QDeviceDiscovery::QDeviceType>, QObject*)'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x9b4): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::scanConnectedDevices()'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x16f4): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::create(QFlags<QDeviceDiscovery::QDeviceType>, QObject*)'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x1714): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::scanConnectedDevices()'
gmake[5]: *** [../../../../plugins/generic/libqevdevmouseplugin.so] エラー 1
gmake[5]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/generic/evdevmouse' から出ます
createとscanConnectedDevicesはQDeviceDiscoveryにあるはずですが、なんでビルドされないんだろーと思って見ていたところ、qtbase/src/platformsupport/devicediscovery/devicediscovery.pri の中で、linux のときしかビルドされないようになっていました。evdev があるならlinuxじゃなくてもビルドして良いだろうと、限定を外します。
diff --git a/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri b/qtbase
/src/platformsupport/devicediscovery/devicediscovery.pri
index 9a58eee..f5176dc 100644
--- a/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri
+++ b/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri
@@ -1,4 +1,4 @@
-linux:contains(QT_CONFIG, evdev) {
+contains(QT_CONFIG, evdev) {
     HEADERS += $$PWD/qdevicediscovery_p.h
 
     contains(QT_CONFIG, libudev) {
さらに先に進むと、flexのオプションが違うとエラーに。
( test -e Makefile.ANGLE.DerivedSources || /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/bin/qmake /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/ThirdParty/ANGLE/DerivedSources.pri -o Makefile.ANGLE.DerivedSources ) && make -f Makefile.ANGLE.DerivedSources
flex --noline --nounistd --outfile=generated/glslang_lex.cpp src/compiler/glslang.l
flex: unknown flag '-'.  For usage, try
        flex --help
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/ThirdParty/ANGLE.
調べてみると、システムに標準で入っているflex 2.5.4 だとlong形式のオプションはなくて、portsから入れた2.5.37だと解釈できるらしい。私の場合、portsのflexはインストールされていたんだけど、PATHが/usr/local/bin/よりも/usr/bin/を優先していたのでエラーになっていた。
これは、/usr/local/bin/を優先することで先に進んだ。
qtbaseが終わって先に進んで行くと、webkitで以下のエラー
enerated/SettingsMacros.h:31:11: error: missing binary operator before token "("
generated/SettingsMacros.h:54:11: error: missing binary operator before token "("
generated/SettingsMacros.h:77:11: error: missing binary operator before token "("
generated/SettingsMacros.h:108:11: error: missing binary operator before token "("
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/WebCore.
なんだべーと思って調べた所、Building Qt 5.0.0 fails on Windows 8 with MinGW 4.7.2 | Qt Project forums | Qt Projectと言う記事を発見。
SettingsMacros.hはヘッダなのに、これをビルドして.oを作ろうとしてるのが問題らしい。
記事の通りに、qtwebkit/Source/WebCore/Makefile.WebCore.Target から SettingsMacros.h を削除してあげたら先に進んだ。
このファイル自体が生成されるファイルなので、git diff の出力はなし。
次は、またundefined reference。
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/lib/libQt5WebKit.so: undefined reference to `void WTF::freeOwnedGPtr<_GError>(_GError*)'
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/WebKit2.
undefined referenceが出たら*.proか*.priを疑え、と言うことでqtwebkit/Source/WTF/WTF.pri が犯人。
diff --git a/qtwebkit/Source/WTF/WTF.pri b/qtwebkit/Source/WTF/WTF.pri
index 2b4e8bc..f88b3fd 100644
--- a/qtwebkit/Source/WTF/WTF.pri
+++ b/qtwebkit/Source/WTF/WTF.pri
@@ -20,7 +20,7 @@ mac {
     }
 }
 
-linux-*:use?(GSTREAMER) {
+use?(GSTREAMER) {
     DEFINES += ENABLE_GLIB_SUPPORT=1
     PKGCONFIG += glib-2.0 gio-2.0
 }
これで、無事にQtのビルドが成功。後は、rootになってgmake installしてあげれば、/usr/local/Qt-5.1.1にインストールされる。

後は、艦メモのビルド方法(Ubuntu編) - 理ろぐを見ながら艦メモをビルド。
はまりポイントは2つ。
Twitter4QMLのビルド時に使うsyncqt.plとqmakeの位置が、/usr/local/Qt-5.1.1/binであること(ハマるところではないか)
後は、KanmusuMemoryは CONFIG += c++11 しているので、OS標準のg++ 4.2.1 ではビルドできない。
portsから g++ 4.6.3 を入れたら、ビルドできた。(指定方法を調べるのが面倒だったので、qmakeでできたMakefileの、CC, CXX, LINKをgcc46/g++46に書き換え)
後は、初めてtwitterのコンシューマーキーとコンシューマーシークレットを取得したりした。

後は、こいつをiPhoneから使うために、vncを試してみたんだけど、なかなかうまくいかず。長くなるので詳細は書かないけど、通常のvncだとQtにキー入力ができず、OpenGLも使えないため艦メモのスクリーンショット機能が使えない。
コンソールでXを立ちあげて、x0vncserverを使うと、うまく行きそうな雰囲気だ。(あまり検証できていない)
redmineをportupgradeしようとしたら、redmineはruby 1.9を要求していて、今インストールされているruby 1.8と競合していた。
さらに、portsディレクトリや、/usr/ports/UPDATINGを見たところ、FreeBSDはシステムのrubyを1.8から1.9に変更して、さらにportsは1.8をもうサポートしないらしい。
今うちでrubyを使っているのは何かと調べたところ、fastladder と tiarra、wig.rbくらい。(ってwassrはサービス終了しているから、wig.rbは動いている意味がないな)
問題はfastladderで、随分古いrails(2.0.2)を使っているし、少し自分で手を入れたりしているので、動かない可能性が高い。
んで、ruby 1.9 で誰か動かしていないかな〜と思って探したところ、github にfastladder/fastladderを発見。
Gemfileを見ると、rails 4.0.0に対応しているらしい。
これが使えれば、ruby 1.9に移行できると思い、早速 git clone。
と、その前に、ruby 1.9をインストール。

README.md の通りに、bundle installして、config/database.yml.sqlite3をconfig/database.yml にコピーして、bundle exec rake db:create db:migrate してみた。
そして、bin/rails server とやると、mongrel?がポート3000で立ち上がるので、ブラウザから:3000にアクセスすると、普通に動くっぽい。
これなら行ける!と思ってdb/schema.rb を古いものと比較してみても、書き方が変わっているだけでDBのテーブル構造自体は変わっていないように見える。
そこで、試しに今のDBの内容をテスト用のDBに流し込んで、そのまま使えるか見てみる。
% pg_dump -f db.dump fastladder_production
% createdb fastladder_development
% psql fastladder_development -f db.dump
こんな感じでDBをコピーして、config/database.ymlをpostgres用に直して、fastladder_developmentを指定してみる。
起動しようとしたら、pgがないよ的なことを言われたので、Gemfile に require 'pg' を追加。
これでmongrelを起動して、アクセスしてみると、PendingMigrationError とか言われてしまう。
schema.rbに書いてあるversionが悪いのかな〜と思って、古いのと同じ8にしてみても状況変わらず。
しょうがないので、sqlite3 db/development.sqlite3 して、.schema でスキーマを見比べてみると、古いものはschame_infoと言うテーブルがあるのに対し、新しいものは schema_migrations と言うテーブルがある。両方共カラムはversionだけだが、古いものはintで新しいものはvarchar(255)だ。
それ以外は同じように見えるので、コピーしたデータベースにschema_migrationsテーブルだけ足してみることにする。
とりあえず、postgresにダミーのDBを作って、DBを作りなおして、ダンプしてschema_migrationsテーブルの情報を取り出すことにする。
% createdb hoge
% vi config/database.yml (データベースの接続先をhogeにする)
% bundle exec rake db:create db:migrate
% pg_dump -f hoge.dump hoge
% vi hoge.dump (schema_migrationsテーブル関連だけ残して他を消す)
% psql fastladder_development -f hoge.dump (schema_migrationsを入れる)
vi config/database.yml (データベースの接続先をfastladder_developmentに戻す)
これで起動して試してみると、見事に読めることを確認。
後は、ruby 1.9 用に passenger を入れなおして、apacheの設定を新しい passenger 用に変更すれば行けるはず。
# gem install passenger
# passenger-install-apache2-module
# vi /usr/local/etc/apache22/httpd.conf (Passengerの設定変更)
# /usr/local/etc/rc.d/apache22 stop
# /usr/local/etc/rc.d/apache22 start
httpd.confの変更は以下の様な感じ
diff --git a/apache22/httpd.conf b/apache22/httpd.conf
index 69044b1..292c143 100644
--- a/apache22/httpd.conf
+++ b/apache22/httpd.conf
@@ -288,19 +288,24 @@
-LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.5/ext/apache2/mod_passenger.so
+LoadModule passenger_module /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
 
-# Passenger
-PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.5
-PassengerRuby /usr/local/bin/ruby18
+# Passenger 1.9
+PassengerRoot /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.23
+PassengerDefaultRuby /usr/local/bin/ruby19
基本はpathが変わってるだけだけど、PassengerRubyディレクティブがPassengerDefaultRubyに変わってる
あ、設定に合わせて、古いfastladderの置いてあった場所に新しいfastladderを置く。
これで行ける〜!と思ってアクセスしてみたら、gemが足りないからbundle installしろと言われる。
bundle installしても変わらず。
しばらく悩んだ後で、--deploymentオプションをつけてみたら、vender/bundle にインストールされてうまくいったっぽい。(Passenger is preventing Bundler from seeing my git gems - nginx, deployment, phusion-passenger, rvm, bundler - TechQues.com)
# bundle install --deployment
今度こそ!と思ってアクセスしても、やっぱりうまくいかない。fastladderのlog/production.logを見ると、reader.jsにアクセスが来てるけど、reader.jsなんて知らないと言うエラーが出ている。
reader.jsってなんだろーと思って調べてみると、app/assets/javascripts/ にあり、public/javascriptsにはない。そして、config/environments/production.rb では、config.assets.precompile に出てくるが、development.rb には出てこない。
なんだろなーと調べていると、Rails3.1のAsset Pipelineと仲良くなる -と言うサイトを発見。
ここを見習って、以下のようにしたら今度こそうまくアクセスできるようになった。(最初、precompileについてだけ調べていて、RAILS_ENVを指定しないで実行して、うまくいかなくて悩んだ)
# bundle exec rake assets:precompile RAILS_ENV=production
あ、本来は script/crawler とかを動かさないとクロールしてくれないけど、うちの環境はplaggerでfastladderのDBに入れているので、fastladder自身のクローラーは動かさない。

これで、ruby 1.9 環境に移行することができたのでした。github の fastladderのcontrobutorの方々に感謝。
えーっと、もう何度目になるでしょうか。
自宅サーバがお亡くなりになりました。
ことの起こりは、PPTPはセキュリティ的にいまいちだと言うのを読んだので、L2TP/IPSecにしてみようと思ってカーネルのコンフィグを変えてリビルドしたことでした。
いつものようにbuildkernel/installkernelして、再起動したところ、マシンがリブートループを繰り返すようになりました。
さらに、HDDのエラーも出ているようで、途中で制御も効かなくなったので、電源ボタンでマシンを落としました。
そして、再度電源ボタンを押すと・・・、電源が入らない!
主電源をいじったり、コンセントを抜いたりしてみても駄目。ご臨終です。
自宅サーバが逝ってしまうと、このblogも読めないし、自分宛てのメールも読めなくなります。
サーバが死んだのが11/20日。最後のdumpが11/1です。
もっとも、dumpがあっても復元するマシンがないと復活のしようがありません。
そろそろ自宅サーバも限界かな、と思ってさくらのVPSの一番安いプランを申し込んでみたりもしました。(こちらは別エントリで)
結局、マシンを購入することにして、近所のPCデポへ。
省電力と言う意味で、HaswellのCore i3あたりのマシンが欲しかったのですが、i3は取り寄せしかなかったし、マザーとかケースとか選ぶとどうしても割高になるので、Acer | Aspire M/T | Aspire M3985-F74D | 概要 と言うマシンが店頭品処分で6万円台だったので、購入しました。
後でよく見たら、HaswellじゃなくてIvy Bridgeでしたが・・・。
スペックは、Core i7 (3770 3.4 GHz, 8 MB) - 4 GB DDR3 SDRAM - 500 GB HDD と言う感じ。
Windows8がついていましたが、立ち上げることなく古いマシンのHDDに繋ぎ換え、起動してみると、
Reboot and Select proper Boot device
or Insert Boot Media in selected Boot device and press a key 
の文字。キーを押しても同じ。
試しに、ついてきたHDDに戻すと、ちゃんとWindows8が起動します。
BIOSの設定画面の出し方がわからなくて価格.comの掲示板を見たりすると、Ctrl + Alt + Esc を押しながら電源を入れて、画面が黒くなったら DEL みたいな記述を見つけたのですがうまくいかず、いろいろ試していたら結局起動時のロゴ表示中にDELで行けました。
BIOSの設定を眺めていても良くわからなかったのですが、最終的に辿り着いたのが「Launch CSM」と言う設定。デフォルトはNeverになっているのを、Alwaysに変えたら古いHDDから起動しました。説明には、UEFI OPROMとLegacy OPROMと書いてあります。
Unified Extensible Firmware Interface - Wikipedia2013年3月8日 FreeBSD,UEFIブート対応へ:FreeBSD Daily Topics|gihyo.jp ... 技術評論社 だそうです。i386のFreeBSD8はUEFIブートに対応していないと言うことですね
なんとか起動するようになりましたが、相変わらずリブートループしてしまうし、HDDのエラーも出ているようです。
HDDが生きていたら、サービスをVPSに逃がしながらamd64版のFreeBSD9にリプレースするつもりでしたが、HDDが死にかけだと悠長なことは言っていられません。
ブートメニューからコマンドに降りて、kernel.old で起動します。
なんとか起動したので、/etc/fstabを書き換えて今の状態に合わせます。
さらに、ネットワークインターフェイスがsk0からem0に変わったので、その辺も修正して、なんとか起動まで行けるようになりました。
その状態で一度シャットダウンし、前回と同じくKNOPPIXのCDで起動して、古いディスクから新しいディスクにdd_rescueでコピーしました。
で、再起動して、なんとか新しいディスクで以前と同じように動くようになりました。
結局、カーネルのコンフィグを元に戻してもやっぱりリブートループになるので、/usr/srcを新しくして、再度ユーザランドとカーネルを作りなおしたところ、リブートループから抜け出すことができました。
(/usr/src で svn upすると、Connection Refusedで何故か失敗していたのですが、~root/.subversion/serversにproxyの設定を書いて、無理矢理同じマシンで動いているsquidを通したら成功しました。)

とりあえずこんな感じで復旧したので、VPSの話とL2TPの話は別のエントリに書きます。
自宅サーバが死んで、いい加減自宅運用も厳しいかな〜と思ったので、VPS(仮想専用サーバ)のさくらインターネットの一番安いプランに申し込んでみた。クレカで登録すると最初の2週間お試しで無料。
ちょっと前から、IPv6アドレスが付いてくるので気になってはいたので。
んで、ここはカスタムOSにFreeBSDが選べるのも特徴。さっそくFreeBSD9.2を選んでインストールを始めたが、説明をまったく読まずにやったら失敗の連続。
んで、ヘルプの左のメニューが階層構造になっていなくてなかなかたどり着けないんだけど、FreeBSD 9.2-RELEASE|カスタムOSインストールガイド|さくらのVPS|さくらインターネット公式サポートサイトと言うページを発見。
最初からちゃんとここを読めって話ですが、ポイントは以下。
  • インストールを選んだ後に出るIPアドレスとか、DNSサーバの情報をメモっておく
  • IPv4の設定は、DHCPではなく手で入れる
  • IPv6の設定は、インストール時はしない
後は適当にIPv4のミラーサイトを選んでインストールを進めれば良い。
インストールには、Java Applet版のVNCクライアントを使うので、ブラウザでJavaが有効になっている必要がある。
インストールが終わったら、一度シャットダウンしてVPSのページから起動しなおす必要がある。FreeBSD上からリブートしてしまうと、再度インストーラが起動してしまう。
あと、一般ユーザは作っておくことをオススメ。rootしかいないと、sshで外から繋げないから。
一般ユーザを作ったら、~/.ssh/authorized_keysに、外のマシンのsshの公開鍵を置く。んで、sshで接続できることを確認したら、/etc/ssh/sshd_configに
ChallengeResponseAuthentication no
を追加しておく。(これで、パスワードでのログインはできなくなる)
そうそう、追加した一般ユーザはwheelグループに追加しておかないと su で rootになれない。
あとは、VPSコンソールのデフォルトパスワードもあまり強そうではないので、変えておいた方が良いかも。

IPv6を有効にするには、メンテナンス・障害情報・機能追加|さくらインターネット公式サポートサイトを見ろとのこと。
・IPv6 アドレス
 コントロールパネルに表示されたIPアドレスを設定してください。

・ネットマスク
 /64

・ゲートウェイ(全リージョン/プラン共通)
 fe80::1

・ネームサーバー
 ご利用頂くネームサーバーはリージョン毎に異なります。

 東京リージョン
 2001:e42::1

 石狩リージョン
 2401:2500::1
と、言うことなので、FreeBSDでの設定を。
/etc/rc.conf に以下を追加。
ifconfig_vtnet0_ipv6=" inet6 VPSコンソールに表示されたv6アドレス prefixlen 64"
ipv6_defaultrouter="fe80::1%vtnet0"
/etc/resolv.confに以下を追加(東京リージョンの場合)
nameserver 2001:e42::1
最初わからなくてはまったのがデフォルトルータの設定で、fe80::1 だけ書いてもうまくいかない。
当たり前の話で、fe80::1 は lo0 にも vtnet0 にもあるので、区別がつかないから。
設定がうまくいっていれば、ping6 www.kame.net とかで応答があるはず。
後は、portsからいろいろ入れたりしたんだけど、その話は割愛。

当初は自宅サーバからVPSへの移転を考えていたので、どうやってファイルをコピーするか考える。
普通には、tarで固めてscpで送ってtarで展開する、とかなんだけど、それだと手間も多いし、大きなファイルの転送の間ぼーっと待ってるのもつまらない。
また、VPSとは言えなにかの事故があったときのことを考えると、自宅マシンと同期を取って置いたほうが、どちらかが死んだ時に対応しやすい。(特に、さくらのVPSはスナップショット機能がないので、ちょっとしたミスで起動やログインができなくなってしまうと、OSの再インストールからやり直しになってしまう)
同期をとるならrsyncでしょ、と言うことでrsyncの利用を考えるが、root同士ではsshの接続ができない。
どうしたもんかと思って調べてみると、root 権限の必要なディレクトリに対してrsync する - ´・ω・)<ときどき書くよ と言うページを発見。
sudoとrsyncの--rsync-pathの組み合わせで、root権限で動くrsyncが作れるらしい。
早速VPS側にbackupと言う名前のユーザを作り、自宅側のrootのsshの公開鍵を~backup/.ssh/authorized_keysに入れる。
んで、/usr/local/bin/rrsync と言う名前で以下のファイルを作り、chmod +x する。
#!/bin/sh

/usr/local/bin/sudo /usr/local/bin/rsync $*
後は、自宅サーバ側のrootから
# rsync -avzh --progress -e ssh --rsync-path=/usr/local/bin/rrsync /var/www backup@VPSのサーバ名:/var/
みたいにしてやると、コピーできる。
これは、初回の実行で人が見ていて経過がわかるようにしているので、定期的に実行する場合は -h オプションと --progress オプションはない方が良いだろう。
ちなみに、2週間の無料お試し期間中は、2Mbit/secの帯域制限がかかっているので注意。
iPhoneから自宅の家庭内LANに繋ぐのに、sshトンネルかPPTPを使っているが、PPTPはセキュリティがいまいちみたいな記述を見たので、L2TPを試してみることに。(おかげでサーバが死んだけど)
参考にしたのは、FreeBSD 9.1をIPsec対応L2TP VPNサーバにする: プラスα空間
まずは、カーネルコンフィグの修正。
参考サイトだと、IPSEC系の設定と、IPFIREWALLの設定があるんだけど、うちはipfwじゃなくてipfilterを使っているので、IPFIREWALL系の設定は不要と判断。
なので、カーネルコンフィグに追加する必要があるのは以下。(options IPSECとdevice cryptoは元々あったけど)
options         IPSEC
options         IPSEC_NAT_T 
device          crypto
racoonとmpdのインストールと設定は基本参考サイトの通り。
racoonのpatchは、参考サイトからコピペするとタブ文字が空白になってしまって失敗するので、参考サイトの元サイトのwikiからコピーした方が良い。
手順9のrc.confの設定で、ipsec_program="/usr/local/sbin/setkey" の行はうちの環境では不要。と言うか、/usr/local/sbin/setkeyは存在せず、/sbin/setkeyが存在する。
この状態で、家庭内LANからiPhoneでL2TPでのVPN接続は成功する。
で、外からつなごうと思ってRT-S300SEの設定でUDP/500とUDP/4500をFreeBSDに飛ばすようにしたが、接続に成功しない。
racoonのログを見ていると、iPhoneからサーバのポート500にパケットが届いていて、その後サーバのポート500からiPhoneのポート500にパケットを送っているが、それが届かないか何からしい。パケットフィルタでは特に禁止しているようには見えないのだが。
UDPだけじゃなく、プロトコル番号51, 50(ESP)をフォワードしてあげないといけないらしいのだが、RT-S300SEの設定にはそう言う選択肢がない。
PPTPもGRE(プロトコル番号47)を通さないといけないらしいのだが、成功しているが不思議。

と言うわけで、当面はPPTPで行くしかなさそう。(iSSHのVNCがsshトンネルで安定して動けばPPTPもいらないんだけど)
2013年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

このアーカイブについて

このページには、2013年11月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2013年8月です。

次のアーカイブは2013年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1