‘Linux’ カテゴリーのアーカイブ

仮想マシンのdebianをHyper-VからVirtualBoxに移行したら起動しなかった話

ゲストの環境は32ビットでjessie/sidです。
ホストはWindows 8.1 x64。

Windows 7でVirtual PCを使って動かしていたイメージですが、Windows 8.1に乗り換えるにあたって、Hyper-Vに移行していました。
こっちはそんなに問題なかったのですが、Hyper-Vのネットワーク設定がやりたかったことをすべて満たせない&なぜかゲストでhg pushするとホストのインターフェースが死ぬという現象に見舞われたので、VirtualBoxに移行することにしました。

ちなみに移行はVHDファイルを持ちまわるだけです。

色々問題噴出だったのですが、最終的にはVirtualBoxの設定でどうにかなりました。

エラー内容覚えていないので、検索履歴から箇条書きで。

・VERR_REM_VIRTUAL_CPU_ERROR
・VBOX_E_INVALID_VM_STATE
・fatal error in recompiler cpu 中略 VERR_DEADLOCKのエラーでVirtual Boxが落ちる
・VirtualBox自体は落ちなくなったものの、loading please waitで止まる
・smbus base address uninitialized upgrade bios or use

やったこと。
・設定→システム→マザーボードの「メインメモリー」を512MBから1024MBにした
・設定→システム→マザーボードの「チップセット」をICH9にした
・設定→システム→マザーボードの「I/O APICを有効化」にチェック
・設定→システム→プロセッサーの「PAE/NXを有効化」にチェック
・GRUB2起動時にeを押して編集モードに入り、linuxから始まる行の末尾にsingleを追加してシングルユーザーモードで起動できるか確認
・起動時に画面に表示されない何かの処理が裏で動いているらしいのを、10分以上待った

カーソルが点滅しているなら、気長に待ってみるのも良いかと。

squeezeのときのイメージが残っていたので、そっちも試したのですが、そっちは大丈夫でした。
Hyper-V上でkernelとディストリビューションをアップデートして、686-paeになったのが問題だったかも。

とりあえず復旧できたので良かったです。


他のパッケージのaptitude install後にMySQLが起動しない問題

他の環境では多分あまり発生しないかと思いますが、自分の環境では毎回のように発生する上、対処方法をいつも忘れるのでメモ。

環境はdebian squeeze。

# /etc/init.d/mysql start
[FAIL] Starting MySQL database server: mysqld . . . . . . . . . . . . . . failed!

ログも一切出ないので困っていましたが、ファイルのパーミッションの問題でした。

# cd /var/lib/mysql/
(省略)
-rw-rw---- 1 mysql mysql      126 2014-02-27 07:45 mysql-bin.000022
-rw-rw---- 1 mysql root     26620 2014-02-27 07:45 mysql-bin.000023
-rw-rw---- 1 mysql root   1061358 2014-02-27 07:45 mysql-bin.000024
-rw-rw---- 1 root  root     26620 2014-02-27 07:45 mysql-bin.000025
-rw-rw---- 1 root  root   1061358 2014-02-27 07:45 mysql-bin.000026
-rw-rw---- 1 mysql mysql      494 2014-02-27 07:45 mysql-bin.index

mysql-binファイルがroot権限で作られていました。

片っ端からchownして解決です。

# chown mysql:mysql mysql-bin.000023
# chown mysql:mysql mysql-bin.000024
# chown mysql:mysql mysql-bin.000025
# chown mysql:mysql mysql-bin.000026
# /etc/init.d/mysql start
[ ok ] Starting MySQL database server: mysqld ..

根本的な原因は何なんだろうなぁ。


redmineのメール送信エラー

CentOS 5.10にredmine 2.4.2をインストールしていて、Gmail経由でメールが送れない問題があったのでメモ。

wrong argument (NilClass)! (Expected kind of OpenSSL::SSL::SSLContext)

どうやらmailのバージョンが新しくなったところで問題が出たようです。

redmine 2.3.1 / 2.3.2でメール送信時エラーが出た: situの戯れ言

redmineをインストールしたディレクトリに作成されたGemfile.lockファイルのmailのバージョン指定を

    json (1.8.1)
    mail (2.5.4)
      mime-types (~> 1.16)
      treetop (~> 1.4.8)
    metaclass (0.0.2)

    json (1.8.1)
    mail (2.5.3)
      mime-types (~> 1.16)
      treetop (~> 1.4.8)
    metaclass (0.0.2)

と書き換えて、Apacheを再起動したら(Passengerなので)無事にメールが送れるようになりました。

2.5.3が入っていない場合は先にインストールしておく必要があります。

ruby のmail がTLSエラーを吐くので調べたらバージョンだった。 – それマグで!

Ruby 1.8系使ってるとダメみたいです。抜本的な解決のためには1.9以降が必要のようです。


Apacheでリバースプロキシを使う際のホスト名を引き継ぐ方法

GAEの開発中に、Apache経由のリバースプロキシ環境でdev_appserver.pyを起動させていると、認証関係やself.request.host_urlなどでホスト名を取ろうとした場合にlocalhost:8080などのホスト名を返されます。

ProxyPreserveHost ディレクティブを使えば解決です。ポート番号も消えるみたいです。

mod_proxy – Apache HTTP サーバ
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypreservehost

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost On


UbuntuでApache 2.4.6(Event MPM)+PHP 5.4(FastCGI)を使う

環境はAmazon EC2のUbuntu 12.10です。Apache 2.4.6を使ってみます。Apache 2.4系列を使うからには、やっぱりEvent MPMを使いたいところです。

ところがPHPのマニュアルにはPreforkを使えと書いてあります。

PHP: インストール – Manual
http://www.php.net/manual/ja/faq.installation.php#faq.installation.apache2

マルチスレッドMPMを使いたい場合はFastCGIを使うようにも書いてあるので、PHPをFastCGIで動かすようにします。

(さらに…)


PHP-FPMの起動時にエラーになる&終了できない問題

PHP-FPMを起動するときに、時間がかかった挙句、failedになる現象が発生しました。

# /etc/init.d/php-fpm start
Starting php-fpm ................................... failed

また、終了時にpidが見つからないというメッセージが表示されます。

# /etc/init.d/php-fpm stop
Gracefully shutting down php-fpm warning, no pid file found - php-fpm is not running ?

実際、stopしてもプロセスが残っている状態です。

# ps aux |grep php
root     16260  0.0  0.9 161928  5820 ?        Ss   08:40   0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
webadmin 16261  0.0  4.9 175012 29700 ?        S    08:40   0:00 php-fpm: pool www
webadmin 16262  0.0  3.6 167872 21884 ?        S    08:40   0:00 php-fpm: pool www

最初、/usr/local/etc/php-fpm.confで、pidの位置を/var/run直下に置こうとして絶対パスにしていたのですが、これが問題だったようです。

[global]
; Pid file
; Note: the default prefix is /usr/local/var
; Default Value: none
pid = /var/run/php-fpm.pid

pidファイル自体は作成されていたので、問題ないように思っていました。
以下のように、相対パスで/usr/local/var/run以下に置くようにしたら解決しました。

[global]
; Pid file
; Note: the default prefix is /usr/local/var
; Default Value: none
pid = run/php-fpm.pid

起動も一瞬でした。

# /etc/init.d/php-fpm start
Starting php-fpm  done

もちろん、終了も問題なくできます。


debianにRockMongoを入れる

MongoDBをブラウザのGUIで扱いたかったのですが、何やら管理ツールはたくさんあるみたいで、どれが良いのか正直わかりませんでした。

Admin UIs – MongoDB

とりあえず、コメント欄で盛り上がっていたRockMongoを試してみることにしました。

http://code.google.com/p/rock-php/wiki/rock_mongo_jp#ダウンロード

開発環境のdebian squeezeにRockMongoをインストールしてみました。aptで入るphpMyAdminと同じような構成にしてみることにします。どこのVirtualHostからでも/rockmongoでアクセスできる環境です。

MongoDBはあらかじめインストールしておいてください。

まずはRockMongoを/usr/shareに展開します。

# mkdir /usr/share/rockmongo
# cd /usr/share/rockmongo
# wget http://rockmongo.com/downloads/go?id=6 -O rockmongo-v1.1.2.zip
# unzip ./rockmongo-v1.1.2.zip
# rm ./rockmongo-v1.1.2.zip
# mv ./rockmongo/* .
# rm -R ./rockmongo/

Apache用の設定ファイルを作成します。

# vi /etc/apache2/conf.d/rockmongo.conf

phpMyAdminを参考に以下のようにしておきます。

Alias /rockmongo /usr/share/rockmongo

<Directory /usr/share/rockmongo>
        Options FollowSymLinks
        DirectoryIndex index.php

        <IfModule mod_php5.c>
                AddType application/x-httpd-php .php

                php_flag magic_quotes_gpc Off
                php_flag track_vars On
                php_flag register_globals Off
                php_value include_path .
        </IfModule>
#        <IfModule mod_authn_file.c>
#                AuthType Basic
#                AuthName "RockMongo"
#                AuthUserFile /path/to/.htpasswd
#                Require valid-user
#        </IfModule>

        php_value session.gc_maxlifetime 86400
</Directory>

認証とかIP制限とか付けたければ適当にやってください。

Apacheを再起動します。

# /etc/init.d/apache2 restart

で、ブラウザからサーバの/rockmongoにアクセスすればOKです。

image


ローカルで作成していたリポジトリをリモートサーバーに設置する方法

個人でローカルのMercurialを使って開発していたけど、リモートサーバーに置きたくなった場合の作業です。

基本的には、ローカルのリポジトリファイル一式をリモートサーバーに持って行ってhg cloneするだけでOKです。
とりあえず最終状態をコミットしておきます。

$ cd test_local
$ hg commit -m "move to remote"
$ tar cvzf test_local.tar.gz ./test_local

で、test_local.tar.gzをリモートサーバーに転送します。

リモートサーバーでは、適当に/home以下にでも配置して展開します。今回はApacheを動かしているwwwユーザのhomeディレクトリで展開します。

$ cd /home/www
$ tar xvzf test_local.tar.gz
$ chmod www:www -R ./test_local

他のリポジトリが置いてある場所と同じ場所(今回は/var/lib/hg)に移動します。

$ cd /var/lib/hg
$ mkdir test_local
$ cd test_local
$ hg clone /home/www/test_local .

.hg/hgrcは新しいパスに上書きされます。ここからはpushしないので、消してしまっても大丈夫だと思います。

で、hgweb.configのpathsを追加します。

[paths]
test_local = /var/lib/hg/test_local

サーバ側はこれだけです。

ローカル側は、hg pullにソースパスを指定すればそこから差分を取得できます。

が、面倒なので.hg/hgrcを編集して、hg pullコマンドだけでpullできるようにします。

[paths]
default = https://user1:password@repository.sample.com/hg/test_local

ユーザ名とパスワードもURLに含めることによって認証の手間も解決できます。


httpでアクセスできるMercurialサーバを作る

サーバはCentOS 5.8です。Mercurialは2.2.2を使います。

まずは下準備で、Mercurialをインストールします。yum install mercurialでインストールできるバージョンは古いので、easy_installを使います。

# yum install gcc python python-devel python-setuptools
# easy_install mercurial

PythonとMercurialがインストールされているか確認します。以下のコマンドで何もエラーがでなければOKです。

# python
>>> import mercurial
>>> [Crtl+D]

Mercurialのリポジトリからhgweb.cgiを探します。自分の環境ではMercurialをeasy_installでインストールしたのでhgweb.cgiが入っていませんでした。

なので、リポジトリから落としてきます。

http://selenic.com/hg/file/85a358df5bbb/hgweb.cgi

以前は複数のリポジトリを公開するためには、hgwebdir.cgiというファイルを使うことになっていましたが、統合されたようで、hgweb.cgiでどちらもできるようになっています。

下記の日本語訳のページは、情報が古いので注意してください。

JapaneseCGI_Install – Mercurial

英語ページを参照するのが正しいです。

PublishingRepositories – Mercurial

Apache用にwwwユーザを作ってあるので、/home/www/hgweb.cgiに設置しました。hgweb.cgiを開いて、configの行を変更します。

config = "/home/www/hgweb.config"

hgweb.cgiには実行権限を付けておきます。

# chmod u+x /home/www/hgweb.cgi

同じディレクトリにhgweb.configを作成します。

[web]
encoding = UTF-8

[paths]
test = /var/lib/hg/test

リポジトリのパスは/var/lib/hg以下に設置することにしました。ドキュメントでは/home/user/hgの下に置くことになっています。

# mkdir /var/lib/hg
# chown www:www /var/lib/hg
# su www
$ cd /var/lib/hg
$ mkdir test
$ cd ./test
$ hg init

wwwユーザがhgを使えるようにしておきます。/home/www/に.hgrcを作成してユーザ情報を書き込みます。

$ vi ~/.hgrc
[ui]
username = webadmin <webadmin@sample.com>

で、/var/lib/hg/testに適当にファイルを作ってコミットします。コミットがひとつもないと、Webからアクセスできません。

$ touch index.html
$ hg add index.html
$ hg commit -m "first commit"

次にApacheの設定です。ScriptAliasをVirtualHostの中にでも書いておきます。

ScriptAlias /hg "/home/www/hgweb.cgi"

ここまでできたら、Apacheを再起動します。

# apachectl restart

これで、http://repository.sample.com/hg/testのようにアクセスできます。ブラウザでも、hg cloneコマンドでも可能です。

リポジトリを追加するときは、/var/lib/hg以下にディレクトリを新規作成して、そのディレクトリでhg initを実行、/home/www/hgweb.configに追記の手順です。

次に認証を追加します。Apacheの設定ファイルの、先ほどのScriptAliasの下にLocationディレクティブを追加します。

<Location /hg>
    AuthType Basic
    AuthName "Mercurial repositories"
    AuthUserFile /home/www/hg/hgusers
    AuthGroupFile /home/www/hg/hggroups
    Require valid-user
</Location>

ユーザとグループで管理できるようにしました。(グループ作りましたけど意味はなかったです)

# su www
$ mkdir ~/hg
$ cd ~/hg
$ htpasswd -c ./hgusers user1

同じ場所にhggroupsファイルも作成してグループを定義します。svnのdavのようにここでリポジトリのアクセス権限を設定したりすることはできません。

testgroup:user1

グループの書き方はこちらを参照のこと。

ユーザー認証によるアクセス制限(ベーシック認証編)(2/2)

webからのpushができるようにします。/home/www/.hgrcにセクションを追加します。

[web]
allow_push = *

この設定は各リポジトリの.hg/hgrcに書いても大丈夫のようです。そうすれば、レポジトリごとに制御できます。

問題はグループごとにアクセスできるリポジトリを制御することなのですが、これは簡単にはできないようです。

ユーザごとには読み込み制御が可能です。allow_readを使います。

この場合は、/var/lib/hg/test/.hg/hgrc(なければ作成)にwebセクションを書きます。

[web]
allow_read = user1

これで大丈夫です。トップページのリストにも、allow_readに含まれていないユーザはリポジトリが表示されません。allow_readは書かなければallow_read=*としたことと同じになります。他にもdeny_readが使えます。

参考

configuration – Mercurial set per user rights – Server Fault

それと、httpsを使わない場合はpush_ssl = falseをhgweb.configのwebセクションに書いておく必要があります。httpsでアクセスさせる場合はそのままでOKです。


Node.jsはPowerPCで使えないという話

LinuxでPowerPCのアーキテクチャを選択する場合は注意が必要です。

わざわざWindows版もMac版も用意されているのだからアーキテクチャはほぼ不問なんだと思ってました…

OpenBlocks(debian squeeze)にNode.jsをnvmからインストールしようとしたところ、WAFがエラーを出しました。

root@squeeze:~# nvm install v0.6.18
######################################################################## 100.0%
Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok
Checking for program gcc or cc           : /usr/bin/gcc
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for gcc                         : ok
Checking for library dl                  : yes
Checking for openssl                     : not found
Checking for function SSL_library_init   : yes
Checking for header openssl/crypto.h     : yes
Checking for library util                : yes
Traceback (most recent call last):
  File "/root/nvm/src/node-v0.6.18/tools/waf-light", line 158, in <module>
    Scripting.prepare(t, cwd, VERSION, wafdir)
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 145, in prepare
    prepare_impl(t, cwd, ver, wafdir)
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 135, in prepare_impl
    main()
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 188, in main
    fun(ctx)
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Scripting.py", line 241, in configure
    conf.sub_config([''])
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Configure.py", line 221, in sub_config
    self.recurse(k, name='configure')
  File "/root/nvm/src/node-v0.6.18/tools/wafadmin/Utils.py", line 634, in recurse
    f(self)
  File "/root/nvm/src/node-v0.6.18/wscript", line 399, in configure
    conf.env['DEST_CPU'] = canonical_cpu_type(conf.env['DEST_CPU'])
  File "/root/nvm/src/node-v0.6.18/wscript", line 60, in canonical_cpu_type
    " but NOT '" + arch + "'.")
Exception: supported architectures are arm, ia32, x64 but NOT 'powerpc'.
nvm: install v0.6.18 failed!

nvmでしか試していませんが、恐らくnodeをmakeしても同じです。これはV8エンジンがPowerPCに非対応なのが原因です。http://code.google.com/p/v8/

あとはこの辺り参照。

Is it possible to make Node.js use Rhino as the Javascript engine? – Stack Overflow

Issue 692 – waf – cannot build nodejs (uses waf) on OS X ppc – The meta build system – Google Project Hosting

一応、V8をPowerPCで動くようにするプロジェクトはあるみたいですが…

https://github.com/ic/v8-powerpc

Long-term goal: Get Node.js and Google Chrome to PowerPC users.

らしいので気長に待つしか…

あとはSpiderMonkeyにV8のAPI実装してNodeに結合するspidernodeですね。

https://github.com/zpao/spidernode

ちょっと求めているものとは違うんですよね…動くのかわからないし。

あー、どうしよっかなー…