CentOS 6のMariaDBのrpmが出来るまで

タックス

今回の出来るまでシリーズは、MySQLの代わりにさまざまなディストリビューションのデフォルトでインストールされることが決まったMariaDBのrpmが出来るまでをご紹介致します。
MariaDBのrpm化にあたっては、今までのSamba4やOpenLDAPほど苦労したわけでもなく、逆に簡単に出来てしまいましたが、どういう流れで作ったかをご覧いただければと思います。

■ MariaDBとは?

MariaDBの開発は、MySQLのオリジナルコードの作者でMySQL ABの創設者でもあるMichael "Monty" Wideniusにより、現在オラクルによって所有されているMySQLをフォークして立ち上げられたプロジェクトにより行われている。配布ライセンスは、GNU General Public Licenseのバージョン2。(Wikipediaより)

とのことなので、MySQLのソースを元にしているため、現在のGAであるMySQL 5,5,5.6とMariaDB 5.5の互換性は非常に高いと言えるでしょう。
このことから、MySQLのspecファイルを元にすれば、簡単にrpmが出来ることくらいは想像できると思います。


■ MariaDBのspecファイルを持ってくる

前述のとおり、次期Fedora 19からはデフォルトのDBがMySQLからMariaDBへスイッチすることになりましたが、既に開発版としてFedora 19に入る予定のMariaDB 5.5.29のsrc.rpmがありましたので、これをベースにすることとしました。
しかし、このままリビルドしても動くはずがありませんので、元々wingリポジトリで公開していますCentOS 6用のMySQL 5.5.30のspecファイルも参考にし修正することとしました。


■ 苦労した点は?

たまにあるのですが、rpm化にあたり元のspecファイルの出来が良い場合や互換性が高い場合は、非常に少ない修正でrpm化することが出来ます。
またMariaDBの場合、既に公式でrpmが存在している(なぜかsrc.rpmは無い)ということで、環境整備にもそれほど苦労が要らないことがわかります。
現にMariaDBをビルドする際には、MySQLがビルドできる環境さえ整っていればビルドできることはspecファイルを見た段階で分かりましたので、前準備も特に苦労することがありませんでした。


■ ビルド

早速、specファイルを修正してMariaDB 5.5.29をビルドしてみたところ、あっさりと出来てしまいました。

次にMariaDBの公式サイトには最新版である5.5.30がありましたので、5.5.29のsrc.rpmを元に5.5.30をビルドすることにしました。


■ 問題発生!

先に原因を書いてしまいますが、「Disk Full」でした。

wingリポジトリの開発はKVM上で行っているのですが、ビルドするだけなのでそれほど大きなディスク容量を取っているわけではありませんでした。
実際は10GBの仮想ディスク上でビルドしているのですが、ほとんどの場合は気にならないほどしか使われず、今までずっと10GBで問題無く作業出来ていました。

ところが、MariaDBをビルドしてみると思いもよらないところでエラーになってしまい、エラーで止まってしまったソースの5.5.29と5.5.30のdiffまで取って調べましたが、差分も無く…。
結局原因が分からず、無意識にdfコマンドを叩いた時に気づきました。


■ 要らないものを全部削除

/tmp
/var/tmp
/root/rpmbuild/BUILD
/root/rpmbuild/BUILDROOT
/root/rpmbuild/RPMS/i686
/root/rpmbuild/SOURCES
/root/rpmbuild/SPECS
/root/rpmbuild/SRPMS

これらの中のものを全て削除しました。
また、以前作成してインストールされていたSmaba4もアンインストール。
これで、元のサイズに戻り十分な空き容量を確保することが出来ました。

どうも簡単にとは言え、試行錯誤しながらやっていたため、たくさんの作業ファイルが貯まっていたようでした。


■ ビルド、そして完成

順調に32/64bit両環境でリビルドし、起動するところまで無事に完了。
mysqlコマンドでログインし、いろいろごにょごにょとやってみましたが、一通り問題無く動作することを確認できました。


■ specファイルの差分

あまりに簡単に出来上がったので、この場を借りてFedora 19の5.5.29と、完成したCentOS 6の5.5.30のspecファイルの差分(diff)をご紹介します。
(実際には公開しているsrc.rpmの中を展開すればspecファイルを見ることができます。)

# diff -up mariadb-fedora/mariadb.spec mariadb/mariadb.spec
--- mariadb-fedora/mariadb.spec	2013-03-26 16:42:07.751691346 +0900
+++ mariadb/mariadb.spec 2013-03-26 16:20:58.909662175 +0900
@@ -1,6 +1,8 @@
+# rpmbuild -ba (--target i686) --define 'dist .el6_1.wing' --define 'runselftest 0' mariadb.spec
+
Name: mariadb
-Version: 5.5.29
-Release: 7%{?dist}
+Version: 5.5.30
+Release: 2%{?dist}

Summary: A community developed branch of MySQL
Group: Applications/Databases
@@ -15,22 +17,20 @@ License: GPLv2 with exceptions and LGPLv
%global obsoleted_mysql_evr 5.6-0

# Should mariadb obsolete mysql?
-%{!?obsoletemysql:%global obsoletemysql 1}
+%{!?obsoletemysql:%global obsoletemysql 0}

# Regression tests take a long time, you can skip 'em with this
%{!?runselftest:%global runselftest 1}

Source0: http://ftp.osuosl.org/pub/mariadb/mariadb-%{version}/kvm-tarbake-jaunty-x86/mariadb-%{version}.tar.gz
+Source1: mysql.sysconfig
+Source2: mysql.init
Source3: my.cnf
Source5: my_config.h
Source6: README.mysql-docs
Source7: README.mysql-license
Source8: libmysql.version
Source9: mysql-embedded-check.c
-Source10: mariadb.tmpfiles.d
-Source11: mysqld.service
-Source12: mysqld-prepare-db-dir
-Source13: mysqld-wait-ready
Source14: rh-skipped-tests-base.list
Source15: rh-skipped-tests-arm.list
# mysql_plugin is missing in mariadb tar ball
@@ -52,18 +52,17 @@ Patch10: mariadb-file-contents.patch
Patch11: mariadb-string-overflow.patch
Patch12: mariadb-dh1024.patch
Patch13: mariadb-man-plugin.patch
-Patch14: mariadb-buffer.patch
Patch15: mariadb-sortbuffer.patch
Patch16: mariadb-basedir.patch

BuildRequires: perl, readline-devel, openssl-devel
BuildRequires: cmake, ncurses-devel, zlib-devel, libaio-devel
-BuildRequires: systemd-units, systemtap-sdt-devel
+#BuildRequires: systemd-units, systemtap-sdt-devel
# make test requires time and ps
BuildRequires: time procps
# perl modules needed to run regression tests
BuildRequires: perl(Socket), perl(Time::HiRes)
-BuildRequires: perl(Data::Dumper), perl(Test::More)
+#BuildRequires: perl(Data::Dumper), perl(Test::More)

Requires: real-%{name}-libs%{?_isa} = %{version}-%{release}
Requires: grep, fileutils, bash
@@ -80,7 +79,7 @@ Provides: real-%{name}%{?_isa} = %{versi
%if 0%obsoletemysql
Obsoletes: mysql < %{obsoleted_mysql_evr}
%else
-Conflicts: real-mysql
+Conflicts: mysql
%endif
# mysql-cluster used to be built from this SRPM, but no more
Obsoletes: mysql-cluster < 5.1.44
@@ -109,11 +108,6 @@ Provides: mysql-libs = %{version}-%{rele
Provides: mysql-libs%{?_isa} = %{version}-%{release}
Provides: real-%{name}-libs = %{version}-%{release}
Provides: real-%{name}-libs%{?_isa} = %{version}-%{release}
-%if 0%obsoletemysql
-Obsoletes: mysql-libs < %{obsoleted_mysql_evr}
-%else
-Conflicts: real-mysql-libs
-%endif

%description libs
The mariadb-libs package provides the essential shared libraries for any
@@ -129,18 +123,13 @@ Requires: real-%{name}%{?_isa} = %{versi
Requires: real-%{name}-libs%{?_isa} = %{version}-%{release}
Requires: sh-utils
Requires(pre): /usr/sbin/useradd
-# We require this to be present for %%{_prefix}/lib/tmpfiles.d
-Requires: systemd-units
-# Make sure it's there when scriptlets run, too
-Requires(post): systemd-units
-Requires(preun): systemd-units
-Requires(postun): systemd-units
-# This is actually needed for the %%triggerun script but Requires(triggerun)
-# is not valid. We can use %%post because this particular %%triggerun script
-# should fire just after this package is installed.
-Requires(post): systemd-sysv
+Requires(post): chkconfig
+Requires(preun): chkconfig
+# This is for /sbin/service
+Requires(preun): initscripts
+Requires(postun): initscripts
# mysqlhotcopy needs DBI/DBD support
-Requires: perl-DBI, perl-DBD-MySQL
+Requires: perl-DBI, perl-DBD-MySQL, mysqlclient16
Conflicts: MySQL-server
Provides: mysql-server = %{version}-%{release}
Provides: mysql-server%{?_isa} = %{version}-%{release}
@@ -149,7 +138,7 @@ Provides: real-%{name}-server%{?_isa} =
%if 0%obsoletemysql
Obsoletes: mysql-server < %{obsoleted_mysql_evr}
%else
-Conflicts: real-mysql-server
+Conflicts: mysql-server
%endif

%description server
@@ -174,7 +163,7 @@ Provides: real-%{name}-devel%{?_isa} = %
%if 0%obsoletemysql
Obsoletes: mysql-devel < %{obsoleted_mysql_evr}
%else
-Conflicts: real-mysql-devel
+Conflicts: mysql-devel
%endif

%description devel
@@ -195,7 +184,7 @@ Provides: real-%{name}-embedded%{?_isa}
%if 0%obsoletemysql
Obsoletes: mysql-embedded < %{obsoleted_mysql_evr}
%else
-Conflicts: real-mysql-embedded
+Conflicts: mysql-embedded
%endif

%description embedded
@@ -217,7 +206,7 @@ Provides: real-%{name}-embedded-devel%{?
%if 0%obsoletemysql
Obsoletes: mysql-embedded-devel < %{obsoleted_mysql_evr}
%else
-Conflicts: real-mysql-embedded-devel
+Conflicts: mysql-embedded-devel
%endif

%description embedded-devel
@@ -239,7 +228,7 @@ Provides: real-%{name}-bench%{?_isa} = %
%if 0%obsoletemysql
Obsoletes: mysql-bench < %{obsoleted_mysql_evr}
%else
-Conflicts: real-mysql-bench
+Conflicts: mysql-bench
%endif

%description bench
@@ -263,7 +252,7 @@ Provides: real-%{name}-test%{?_isa} = %{
%if 0%obsoletemysql
Obsoletes: mysql-test < %{obsoleted_mysql_evr}
%else
-Conflicts: real-mysql-test
+Conflicts: mysql-test
%endif

%description test
@@ -288,7 +277,6 @@ MariaDB is a community developed branch
%patch11 -p1
%patch12 -p1
%patch13 -p1
-%patch14 -p1
%patch15 -p1
%patch16 -p1

@@ -359,7 +347,7 @@ cmake . -DBUILD_CONFIG=mysql_release \
-DMYSQL_DATADIR="/var/lib/mysql" \
-DMYSQL_UNIX_ADDR="/var/lib/mysql/mysql.sock" \
-DENABLED_LOCAL_INFILE=ON \
- -DENABLE_DTRACE=ON \
+ -DENABLE_DTRACE=OFF \
-DWITH_EMBEDDED_SERVER=ON \
-DWITH_READLINE=ON \
-DWITH_SSL=system \
@@ -448,21 +436,14 @@ install -m 644 Docs/INFO_BIN ${RPM_BUILD
mkdir -p $RPM_BUILD_ROOT/var/log
touch $RPM_BUILD_ROOT/var/log/mysqld.log

+mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d
mkdir -p $RPM_BUILD_ROOT/var/run/mysqld
+mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
install -m 0755 -d $RPM_BUILD_ROOT/var/lib/mysql
-
-mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}
+install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/mysqld
+install -m 0755 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/mysqld
install -m 0644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/my.cnf

-# install systemd unit files and scripts for handling server startup
-mkdir -p ${RPM_BUILD_ROOT}%{_unitdir}
-install -m 644 %{SOURCE11} ${RPM_BUILD_ROOT}%{_unitdir}/
-install -m 755 %{SOURCE12} ${RPM_BUILD_ROOT}%{_libexecdir}/
-install -m 755 %{SOURCE13} ${RPM_BUILD_ROOT}%{_libexecdir}/
-
-mkdir -p $RPM_BUILD_ROOT%{_prefix}/lib/tmpfiles.d
-install -m 0644 %{SOURCE10} $RPM_BUILD_ROOT%{_prefix}/lib/tmpfiles.d/%{name}.conf
-
# Fix funny permissions that cmake build scripts apply to config files
chmod 644 ${RPM_BUILD_ROOT}%{_datadir}/mysql/config.*.ini

@@ -490,20 +471,16 @@ ln -s ../../../../../bin/my_safe_process

# should move this to /etc/ ?
rm -f ${RPM_BUILD_ROOT}%{_bindir}/mysql_embedded
-rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql/*.a
+#rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql/*.a
rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/binary-configure
rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/magic
rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/ndb-config-2-node.ini
rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql.server
rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysqld_multi.server
+rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql-log-rotate
rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/mysql-stress-test.pl.1*
rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/mysql-test-run.pl.1*

-# put logrotate script where it needs to be
-mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
-mv ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql-log-rotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/mysqld
-chmod 644 $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/mysqld
-
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/ld.so.conf.d
echo "%{_libdir}/mysql" > $RPM_BUILD_ROOT%{_sysconfdir}/ld.so.conf.d/%{name}-%{_arch}.conf

@@ -531,62 +508,26 @@ rm -f ${RPM_BUILD_ROOT}%{_sysconfdir}/lo
%post libs -p /sbin/ldconfig

%post server
-# As soon as Fedora 17, which doesn't know %%systemd_post macro,
-# is retired, we can remove the check for availability of the macro
-# and the alternative code.
-# Let's keep it there now for anyone trying to build the package
-# for F17 on his own.
-%if 0%{?systemd_post:1}
-%systemd_post mysqld.service
-%else
if [ $1 = 1 ]; then
- # Initial installation
- /bin/systemctl daemon-reload >/dev/null 2>&1 || :
+ /sbin/chkconfig --add mysqld
fi
-%endif
/bin/chmod 0755 /var/lib/mysql
/bin/touch /var/log/mysqld.log

-# Handle upgrading from SysV initscript to native systemd unit.
-# We can tell if a SysV version of mysql was previously installed by
-# checking to see if the initscript is present.
-%triggerun server -- mysql-server
-if [ -f /etc/rc.d/init.d/mysqld ]; then
- # Save the current service runlevel info
- # User must manually run systemd-sysv-convert --apply mysqld
- # to migrate them to systemd targets
- /usr/bin/systemd-sysv-convert --save mysqld >/dev/null 2>&1 || :
-
- # Run these because the SysV package being removed won't do them
- /sbin/chkconfig --del mysqld >/dev/null 2>&1 || :
- /bin/systemctl try-restart mysqld.service >/dev/null 2>&1 || :
-fi
-
%post embedded -p /sbin/ldconfig

%preun server
-%if 0%{?systemd_preun:1}
-%systemd_preun mysqld.service
-%else
if [ $1 = 0 ]; then
- # Package removal, not upgrade
- /bin/systemctl --no-reload disable mysqld.service >/dev/null 2>&1 || :
- /bin/systemctl stop mysqld.service >/dev/null 2>&1 || :
+ /sbin/service mysqld stop >/dev/null 2>&1
+ /sbin/chkconfig --del mysqld
fi
-%endif

%postun libs -p /sbin/ldconfig

%postun server
-%if 0%{?systemd_postun_with_restart:1}
-%systemd_postun_with_restart mysqld.service
-%else
-/bin/systemctl daemon-reload >/dev/null 2>&1 || :
if [ $1 -ge 1 ]; then
- # Package upgrade, not uninstall
- /bin/systemctl try-restart mysqld.service >/dev/null 2>&1 || :
+ /sbin/service mysqld condrestart >/dev/null 2>&1 || :
fi
-%endif

%postun embedded -p /sbin/ldconfig

@@ -750,21 +691,18 @@ fi
%{_datadir}/mysql/my-*.cnf
%{_datadir}/mysql/config.*.ini

-%{_unitdir}/mysqld.service
-%{_libexecdir}/mysqld-prepare-db-dir
-%{_libexecdir}/mysqld-wait-ready
-
-%{_prefix}/lib/tmpfiles.d/%{name}.conf
+/etc/rc.d/init.d/mysqld
%attr(0755,mysql,mysql) %dir /var/run/mysqld
%attr(0755,mysql,mysql) %dir /var/lib/mysql
%attr(0640,mysql,mysql) %config(noreplace) %verify(not md5 size mtime) /var/log/mysqld.log
-%config(noreplace) %{_sysconfdir}/logrotate.d/mysqld
+%config(noreplace) /etc/sysconfig/mysqld

%files devel
/usr/include/mysql
/usr/share/aclocal/mysql.m4
%{_libdir}/mysql/libmysqlclient.so
%{_libdir}/mysql/libmysqlclient_r.so
+%{_libdir}/mysql/*.a

%files embedded
%doc README COPYING COPYING.LESSER README.mysql-license

ポイントは以下のとおりです。

・依存関係にmysqlclient16を追加した。
・Patch14が5.5.30で取り込まれていたので削除した。
・Patch15がソース変更のために使えなかったので、自分で作りなおした。
・MySQLとMariaDBの関連性をObsoleteするのではなくConflictするようにした。
・systemdをchkconfig+serviceにした。
・起動スクリプトをwingリポジトリのmysql55のものにした。
・最新のmroongaをビルドするために*.aファイルを消さないようにした。


■ 実際に動かしてみた。

CentOS 6.4 x86_64でMySQLからMariaDBへ移行

この記事にもあるとおりですが、自宅サーバではPostfix+DovecotとZabbixにMySQLを使用していましたので、手順通りにMySQLからMariaDBへ移行し、それぞれ正常に動作することを確認しました。
また、phpMyAdminもそのまま利用できるため、簡単ではありますがデータの閲覧が出来ることも確認しました。
その他、mroongaについてもMariaDB版のrpmを作ってみましたが、これもほぼ修正無しでビルド出来ましたし、show engines;でmroongaが表示されるところまで確認することが出来ました。


■ 総評

Disk Full問題はさておき、基本的にはMySQLのバージョンがもう一つ加わったような感覚であり、それほど苦労することはありませんでした。
動作も問題ありませんし、元々MySQLの開発者が作ったものであるという安心感もあり、恐らく今までで一番簡単なものの一つだったかもしれません。
今後はMariaDB 10にも着手してみたいと考えています。

ちなみに今回は、RHEL/CentOS 6用のみ作りましたが、ちょっとした修正でRHEL/CentOS 5にも対応出来ます。
もう需要は無いだろうと思いwingリポジトリでは作成しませんでしたが、興味のある方はwingリポジトリのsrc.rpmを利用してビルドしてみると良いかもしれません。

以上がMariaDBのrpmが出来るまでです。
いろいろと感想などもらえるとありがたいです!


■ 次回予告

PHPかApache 2.4あたりになると思います。


以下、参考リンクです。

Wikipedia(Linux)
Wikipedia(CentOS)
Wikipedia(MariaDB)
Wikipedia(MySQL)
MariaDB
MySQL


関連記事


FC2Blog Rankingblogram投票ボタンとれまが人気ブログランキングブログランキング・にほんブログ村へ
くる天 人気ブログランキングにほんブログ村 IT技術ブログ CentOSへ

テーマ : Linux
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

WING☆

Author:WING☆


カレンダー
05 | 2017/06 | 07
- - - - 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 -
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
お問い合わせ

名前:
メール:
件名:
本文:

WING☆からのお知らせ
  • CentOS 7設定集
  •    └wingリポジトリ(el7)

  • CentOS 6 x64設定集
  •    └wingリポジトリ(el6)

  • CentOS 5 x64設定集
  •    └wingリポジトリ(el5)



    My Yahoo!に追加

    FC2ブログランキング



    リンク
    ブロとも一覧
    Virtualization & Sever Maniax
    RSSリンクの表示
    QRコード
    QRコード
    ブロとも申請フォーム

    この人とブロともになる