Raspberry Pi 2でサーバ作ってみる(16) 〜MySQLの初期設定〜

インストール後は初期設定。
まずはユーザを作ります。

groupadd mysql
useradd -r -g mysql mysql -d /usr/local/mysql

ちゃんと公式を見ながらやります。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.10.1 Unix 類似システムでのインストール後の手順
ソースからインストールしたため、mysql_install_dbが必要らしい。

#MySQLのインストールディレクトリに移動
cd /usr/local/mysql
#rootでインストールしたので、所有権をmysqlに変更
chown -R mysql .
chgrp -R mysql .
#mysqlユーザで、データディレクトリを指定。さらにrandom-passwordオプションを付けて実行
scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --random-password
    • random-passwordってのは、セキュアに実行するためのオプションで、MySQL5.6.8で追加されたらしい。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.4.3 mysql_install_db — MySQL データディレクトリの初期化
rootパスワードをランダム生成し、匿名ユーザが作成されないそうな。
homeディレクトリに.mysql_secret というファイルができるようなので、

cat ~/.mysql_secret 
# The random password set for the root user at Sun Sep 27 22:33:56 2015 (local time): xxxx

xxxxはパスワード(文字数ももっと長いですよ)
公式ではデータディレクトリ以外のインストールディレクトリ権限をrootに戻しているみたい。

#所有権をrootに戻す
chown -R root .
#データディレクトリのみmysql所有に
chown -R mysql data

公式では設定ファイルを/etcにコピーしてます。
あれ?確かmysql_install_dbでmy.cnfが作成されたような…
/usr/local/mysql/my.cnfで確かにあるので、中を覗いてみると、
ほとんどコメントアウトされてました...
ということで改めてコピー。

cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
bin/mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysql.sock' exists!
bin/mysqld_safe --user=mysql &

#ソケット関連のエラー?所有権が問題かもしれないので、MySQL用のディレクトリを作成して、mysqlユーザに所有権を与える。
nano /etc/my.cnf
#mysql.sockの場所を変更したら、該当するディレクトリを作って所有権を与えておく
mkdir /tmp/mysql/
chown -R mysql /tmp/mysql/

でもダメ。調べると、
MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.4.3 mysql_install_db — MySQL データディレクトリの初期化
こちらになるほど、ということが書いてある。
さっそくmy.cnfの[client]の記述を加えて再起動。
なんかうまく行ったっぽい?

別の端末から接続してみる。

/usr/local/mysql/bin/mysqladmin version
/usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)

そういえばmysql_install_dbでrootのパスワードを変更していた...
ということでパスワードを変更する。
ユーザーのパスワードを変更する - MySQL 逆引きリファレンス
こつこつ綴る: mysqlのパスワードを再設定する for Mac
ここらあたりを参考に。
公式と同じようにDBやテーブルが見えた!
うまくいったっぽい。

Raspberry Pi 2でサーバ作ってみる(15) 〜MySQLのビルド〜

MySQLです。こちらもビルドしてみます。
今までのとは異なり、cmakeを使うそうな。
ってことでcmakeのインストール

apt-get -y install cmake

まずはソースの取得。Jaistのミラーサーバを使ってます。バージョンが変わったら適宜ディレクトリを変更する。

wget ftp://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/mysql-5.6.25.tar.gz
tar -xzvf mysql-5.6.25.tar.gz
cd mysql-5.6.25/

ビルドオプションは公式を参照。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.9.4 MySQL ソース構成オプション
文字セットはutf8を使うので、照合順序とともに変更しよう。
あと、-Dの後ろにオプションをつなげるらしい。

cmake . \
 -DDEFAULT_CHARSET=utf8 \
 -DDEFAULT_COLLATION=utf8_general_ci

で、恒例のエラーが出ました。

CMake Error at cmake/readline.cmake:85 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.

あ、詳しく書いてある。すごい親切。

apt-get -y install libncurses5-dev

もう一回cmake…と、すぐに同じエラーが発生?
エラーをよく見ると、CMakeCache.txtを消せとかあるので削除してみる。

rm CMakeCache.txt

で、再びcmake…

cmakeが終わったら、make

make; make install

とりあえず今日はここまで。

Raspberry Pi 2でサーバ作ってみる(14) 〜PostgreSQLの初期設定〜

インストールができのでとりあえず実行してみる。

#rootで実行してみる。
/usr/local/pgsql/bin/pg_ctl start

するとエラーが。

pg_ctl: no database directory specified and environment variable PGDATA unset
Try "pg_ctl --help" for more information.

うん、やっぱり環境設定が必要。
インストール後の設定作業
ここを元に、postgresユーザの作成を行う。

#postgresユーザ追加
useradd -r -g postgres postgres

あれ?インストール後に作ってpermissionとか大丈夫かな?

初期設定として、initdbでデータベースクラスタというのを作成するらしい。

#initdb(rootで実行)
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

とりあえずrootのまま実行してみると、

initdb: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.

こんなエラーが。rootでは実行できないらしい。
さっき作ったpostgresユーザで実行。

#initdb(postgresユーザで実行)
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

で、またエラー。

creating directory /usr/local/pgsql/data ... initdb: could not create directory "/usr/local/pgsql/data": Permission denied

あ、rootでディレクトリ作ってた。ので、postgresに所有権を与える

#initdb(rootで実行)
chown -P postgres /usr/local/pgsql/data

実行すると、できたっぽい。
ロケールや言語が英語って大丈夫かな。

なんかWARNINGが出てる。

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success出てるし、この辺はいずれ確認しよう。
postgresを起動してみる。

#データディレクトリを指定して起動。
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data/ start

環境変数PGDATAを定義しておけば-Dオプションは不要。

LOG:  could not create IPv6 socket: Address family not supported by protocol
LOG:  database system was shut down at 2015-09-27 16:55:41 JST
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

みたいなのが出て止まった…じゃなくてバックグラウンドに移行したのか。
IPv6の設定はどこかで要確認です。
っていうことで別のターミナルから接続して、接続テスト。

#ユーザpostgresで接続
/usr/local/pgsql/bin/psql --username=postgres

つながった!

Raspberry Pi 2でサーバ作ってみる(13) 〜PostgreSQLのビルド〜

PostgreSQLをインストールします。
ここもソースからビルドしていきます。


まずはビルドオプションを調べるところから。
インストール手順
多いのはディレクトリやブロック容量を変更、floatの取り扱いを変更する場合
後はコンパイラを変更するとかもあるっぽい。
インストール場所はデフォルトのまま、OpenSSLとXML関連は使うことにします。
なんかGitリポジトリがあるみたいなので、また試してみようかな。
ソースの解凍方法とかも載っている。gz2だそうな。

cd /src
wget https://ftp.postgresql.org/pub/source/v9.4.4/postgresql-9.4.4.tar.bz2
tar -jxvf postgresql-9.4.4.tar.bz2

で、とりあえずビルド。

cd postgresql-9.4.4/
./configure \
  --with-openssl \
  --with-libxml \
  --with-libxslt

readline関連のエラーが出た!

configure: error: readline library not found
If you have readline already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable readline support.

apt - How to solve configure: error: readline library not found? - Ask Ubuntu
ここを参考に、ライブラリを探してみる。

apt-cache search libreadline

libreadline-devか、ということでインストール。

apt-get -y install libreadline-dev

再びconfigure。するとまたエラー。

checking for CRYPTO_new_ex_data in -lcrypto... no
configure: error: library 'crypto' is required for OpenSSL

cryptoというライブラリが必要そう。探してみると、
Installing PostgreSQL from source on Ubuntu 10.10 (Maverick Meerkat) | the gabriellephant
ちょっと古いけど、ここかな?
3つのライブラリがいりそう。

apt-get -y install libssl-dev libxml2-dev libperl-dev

みたびconfigure。またまたエラー。

configure: error: library 'xslt' is required for XSLT support

うーん、libxsltあたりで調べるとlibxslt1-devっぽい。

apt-get -y install libxslt1-dev

でconfigure…通った!
ってことで、make&make install

make
make install

インストールできたので、今日はここまで。

Googleカレンダーに勝手に予定が登録された

GMailを見ていると、ふと
GMailからgoogleカレンダーに予定を追加しました」
なるメッセージが届いていました。
まったく見に覚えがなく、恐る恐るカレンダーを見ると京都の名前も知らないホテルの予約が...
しかも12月26日とかそんなリア充な予定など組んだ覚えはない!
まさか乗っ取り?とか思っていろいろ見てみると、
どうやらExpressカードがやっている京都ツアーのメールから自動で予定を登録したそうな...
まあ乗っ取りのようなものでなくてよかったのですが、
冷静に考えるとメール本文見られてるのか...なんかやだなー、でもたいしたメールは無いしなー
などと思いつつも突然カレンダーに予定が入るのはちょっと心臓に悪いので、
設定を変えることにしました。

Gmail からの予定 - カレンダー ヘルプ
設定は、Googleカレンダーの画面右上にある歯車アイコンから設定を開き、
Gmail からの予定」のチェックを外すだけっぽいです。

便利そうな機能ではありますが、せめて登録するかどうかを確認する招待メールにしてくれればよかったのに。

Raspberry Pi 2でサーバ作ってみる(12) 〜OracleXEはインストールできるか〜

Oracle Database Express Editionという無償のOracleです。
仕事でOracleを使ってたため、CentOSサーバでは11gバージョンをインストールしてちょっといじってました。
これがRasPiでインストールできるのか?

結論からいうとNGのようです。
バイナリはrpmしかなくて、でもDebian系のUbuntuではalienを使ったインストール実績あるっぽいですが、あくまでX86_64の話。
JDKの時もあったけど、RasPiはSoCがARMでX86_64用のバイナリではインストールできないですね。
alienで変換した際に、こんなエラーが出ました。

dpkg: error processing ./oracle-xe_11.2.0-2_amd64.deb (--install):
 package architecture (amd64) does not match system (armhf)
Errors were encountered while processing:
 ./oracle-xe_11.2.0-2_amd64.deb

Oracle XE on ARM | Oracle Community
素直にMySQLPostgreSQL使えと。
あと、どこで見たか忘れたけど、「Oracleソースコード公開すれば自分でビルドできるよ!」みたいなことが書いてあって、
無理かなー、でもMicrosoftがいろいろオープンにしてるからOracleもつられないかなーとか。

ま、いずれにしてもUbuntuではいけるらしいので、いずれ母艦で試してみようと思います。

Raspberry Pi 2でサーバ作ってみる(11) 〜Apacheビルド その3〜

とりあえずhttpサイトは動いたのでSSLを使ったhttpsアクセスができるようにします。
ただ、ちゃんとした証明書を準備するのは大変なので(費用的な意味で)、
いわゆるオレオレ証明書を使うことにします。

#オレオレ証明書の作成
cd /usr/local/apache2/conf
/usr/local/ssl/bin/openssl genrsa -aes128 1024 > server.key
/usr/local/ssl/bin/openssl req -new -key server.key  > server.csr
/usr/local/ssl/bin/openssl x509 -in server.csr -days 36500 -req -signkey server.key > server.crt

後はhttpd.confでmod_ssl.soをロードし、httpd-ssl.infoをIncludeするようにして、Apacheを再起動、
としたところ、エラーが出てしまいました。

Invalid command 'SSLCipherSuite', perhaps misspelled or defined by a module not included in the server configuration

エラーを調べたところ、
Invalid command ‘SSLCipherSuite’, perhaps misspelled or defined by a module not included in the server configuration | Matty工房のWeb開発誌【PHP/HTML5/アプリ開発】
こちらのサイトに従い、LoadModuleに追加。すると今度は、

httpd: Syntax error on line 147 of /usr/local/apache2/conf/httpd.conf: Cannot load modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: SSL_CONF_CTX_free

こんなエラーが。
Apache2.0でSSL - Linux Square - @IT
を参考に、Apacheコンパイル時に--enable-ssl=sharedにする→ダメ
この時点で結構いろいろ試しました。ソースの中身を見たり。
それでも原因がわからず、SSLはダメかなーと思っていたところ、
ふと、CentOSでやっていた時はOpenSSLのバージョンが1.0.1だったのですが、最新版があったため1.0.2に変えていたことを思い出しました。
動作実績?のありそうな1.0.1にしてみてダメなら諦めよう、と思いバージョンを変えて再インストール。
→いけた!
…と思ったらエラー

SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).

でも、今までと違う。いつもどおりエラーをGoogle先生に聞いてみると、
Gentooの~amd64にApache 2.4.1が来たので試してみた
とあったので、次の記述をhttpd-ssl.confに追記

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

これでうまくいった!
あとは、httpsでアクセスしてみる。
オレオレ証明書なので、警告がでるけどそのまま読み込んでいくと…開いた!
ということで、なんとかSSLも使えるようになったっぽいです。

とりあえずApache関連はここまで。
とにかく奥が深いので、あまりハマり込まないように、この辺でいったん他のことを進めます。

;(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ if (pre.className.indexOf("gist") !== -1) { return } var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) || 0 ol.className = "preLine" ol.setAttribute("role", "presentation") // no lang, no line-number if( pre.className && ! /lang-./.test(pre.className) ){ br.length += 1 } for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)