最近在做考勤機(jī)系統(tǒng),硬件采用的cortex-A8,哈哈,其實(shí)是有點(diǎn)浪費(fèi)的,2410就可以的。所以就要考慮到考勤數(shù)據(jù)的存儲(chǔ)問(wèn)題,本來(lái)是打算用sqlite數(shù)據(jù)庫(kù)存儲(chǔ)的,可是后來(lái)發(fā)現(xiàn),這個(gè)數(shù)據(jù)庫(kù)只是一個(gè)本地?cái)?shù)據(jù)庫(kù),無(wú)法進(jìn)行聯(lián)網(wǎng)訪問(wèn),這樣的話,服務(wù)器上的數(shù)據(jù)客戶端是不能通過(guò)遠(yuǎn)程連接數(shù)據(jù)庫(kù)的方法連接訪問(wèn)的,但是還可以通過(guò)其他方法,比如socket的方法,服務(wù)器把客戶端請(qǐng)求的數(shù)據(jù)發(fā)送給客戶端,不過(guò)感覺(jué)這樣比較麻煩,所有后面采樣MySql數(shù)據(jù)庫(kù),這樣就涉及到MySql數(shù)據(jù)庫(kù)的移植了。
在網(wǎng)上搜索了下,找到一篇文章,我就是按照該方法一步步的成功移植了MySql-5.1.51版本,以下是原文
MySQL沒(méi)有專門針對(duì)ARM的版本,移植到ARM沒(méi)有官方文檔可參考,因此,暫時(shí)參考這樣一篇文檔:
http://blog.chinaunix.net/space.php?uid=9701860&do=blog&id=285428,因?yàn)镸ySQL5.5之后,編譯是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本來(lái)用,這里使用了文檔上的5.1.51版本。
進(jìn)行如下步驟完成移植:
1) 下載mysql5.1.51:
http://www.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.1/mysql-5.1.51.tar.gz
2) 安裝編譯器:用的是EmbedSky提供的4.3.3的編譯器。gcc之類的都是Fedora14自帶的。
3) 編譯PC版本的mysql備用
a) 解壓mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz
b) cd mysql-5.1.51
c) ./configure -prefix=/usr/local/mysql
d) make 注意,這里無(wú)需運(yùn)行make install,以為主要是為了用pc版本里的gen_lex_hash庫(kù)。
e) 將文件夾mysql-5.1.51改名為mysql-5.1.51-pc備用。(將gen_lex_hash單獨(dú)備份保存一下)
f) 文檔上說(shuō)這里會(huì)出錯(cuò),但我在編譯的過(guò)程中沒(méi)有碰到,唯一的問(wèn)題是編譯了arm版本的,重新通過(guò)改文件夾的名字回頭編譯pc版本的時(shí)候會(huì)報(bào)錯(cuò)。
4) 編譯arm版本的ncurses
a) 下載ncurses-5.9.tar.gz:ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz
b) 解壓到/opt/中:tar zxvf ncurses-5.9.tar.gz c) cd ncurses-5.6
d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static e) make
f) make install
之所以安裝這個(gè),是因?yàn)閷?duì)mysql的交叉編譯過(guò)程需要該庫(kù)的支持
5) 編譯arm版本的mysql
a) tar zxvf mysql-5.1.51.tar.gz
b) cd mysql-5.1.51
c) 修改配置文件:打開configure,可以使用gedit configure
分別在第26453行、 48175行、 48282行、 48485行附近有類似代碼:
if test "$cross_compiling" = yes; then
{ { $as_echo "$as_me:$LINENO: error: in `$ac_pwd':" >&5 $as_echo "$as_me: error: in `$ac_pwd':" >&2;}
{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross
compiling See `config.log' for more details." >&5
$as_echo "$as_me: error: cannot run test program while cross compiling See `config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }; } Else 將這些代碼改為:
if test "$cross_compiling" = yes; then echo “skip …..!”
#{ { $as_echo "$as_me:$LINENO: error: in `$ac_pwd':" >&5 #$as_echo "$as_me: error: in `$ac_pwd':" >&2;}
#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See `config.log' for more details." >&5
#$as_echo "$as_me: error: cannot run test program while cross compiling See `config.log' for more details." >&2;}
#{ (exit 1); exit 1; }; }; } Else 一定注意,這樣的代碼有4部分,要全部改掉。
d) 配置,直接套用了人家的配置方式:
configure ./configure --host=arm-linux –-enable-static --with-named-curses-libs=/usr/local/ncurse/lib/libncurses.a --prefix=/usr/local/mysql --without-debug --without-docs --without-man --without-bench --with-charset=gb2312 --with-extra-charsets=ascii,latin1,utf8
e) 修改opt/mysql-5.1.51/sql/sql_parse.cc:在5646行之前添加#define STACK_DIRECTION 1
如果修改該語(yǔ)句,則會(huì)出現(xiàn)如下錯(cuò)誤:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏變量STACK_DIRECTION沒(méi)有定義初值,arm中定義STACK_DIRECTION為1。
注意:這里的“#define STACK_DIRECTION 1”一句,不能隨便加在sql_parse.cc的開頭處,而應(yīng)該根據(jù)出錯(cuò)信息的提示添加在相應(yīng)的行上,我所遇到的行號(hào)和別人文檔上所遇到的行號(hào)并不相同。
f) 復(fù)制PC版本的gen_lex_hash文件到當(dāng)前文件夾: cp /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/ touch –m sql/gen_lex_hash
cp /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/ touch –m sql/ lex_hash.h
否則會(huì)出現(xiàn)錯(cuò)誤:
make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t
/bin/sh: ./gen_lex_hash: cannot execute binary file 因?yàn)閍rm版的無(wú)法在pc上運(yùn)行。
注意:別人的文檔上說(shuō)只要拷貝gen_lex_hash即可,但我試了好多次,都仍然會(huì)出現(xiàn)上面的報(bào)錯(cuò)信息,把lex_hash.h也拷貝過(guò)來(lái)后,就不再報(bào)錯(cuò)了。另外,touch一定要做,原因就是讓編譯器不要再編譯覆蓋拷貝過(guò)來(lái)的文件了。
g) Make
h) Make install
6) 移植相應(yīng)文件到ARM平臺(tái)
a) 拷貝pc的/usr/local/mysql到開發(fā)板的相同目錄 我使用了nfs調(diào)試,所以需要使用如下指令:
cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql
b) 把編譯出的arm的mysql庫(kù)打包備份一下,考到主機(jī)的目錄里:
tar –zcvf mysql-arm-5.1.51.tar.gz mysql
c) 到源碼中拷貝配置文件模版 Copies files from one location to another. 配置文件模版)
cp /opt/mysql-5.1.51/support-files/my-medium.cnf /opt/EmbedSky/root_nfs/etc/my.cnf
(這里的目錄指的是nfs調(diào)試的路徑設(shè)置),這里的my.cnf存放的路徑是按照手冊(cè)上的建議,前面編譯pc版本的MySQL中所述的路徑并非全局配置。該文檔的注釋中說(shuō):“# You can copy this file to /etc/my.cnf to set global options, mysql-data-dir/my.cnf to set server-specific options (in this installation this directory is /usr/local/mysql/var) or ~/.my.cnf to set user-specific options.”該配置文件的修改詳見mysql5.1的英文手冊(cè)的4.2.3.3. Using Option Files節(jié)中的敘述。 數(shù)據(jù)目錄是在:/var/lib/mysql 安裝目錄是在:/usr/local/mysql
試圖反注釋了關(guān)于InnoDB的一些配置,其它沒(méi)有動(dòng)。但是修改了這些設(shè)置后,報(bào)錯(cuò),于是又改了回來(lái)。
d) 運(yùn)行mysql_install_db(參見手冊(cè)的2.13. Post-Installation Setup and Testing)
cd /usr/local/mysql/bin(開發(fā)板路徑),運(yùn)行mysql_install_db -u root 結(jié)果出現(xiàn)了如下錯(cuò)誤:Neither host 'EmbedSky' nor 'localhost' could be looked up with /usr/local/mysql/bin/resolveip Please configure the 'hostname' command to return a correct hostname.
If you want to solve this at a later stage, restart this script with the --force option 這主要的原因是開發(fā)板環(huán)境中的hostname是EmbedSky,而不是通常的Federa14等,所以mysql自動(dòng)認(rèn)為可能在該操作系統(tǒng)中的運(yùn)行會(huì)不兼容,有兩種辦法解決:
第一種,運(yùn)行hostname fedora14,就是欺騙一下hostname; 第二種,運(yùn)行mysql_install_db -u root –force 我使用了第二種方式: bin/mysql_install_db --user=root --force --basedir=/usr/local/mysql -- datadir=/var/lib/mysql
中間出現(xiàn)過(guò)一次錯(cuò)誤:150713 21:06:39 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'innodb_data_home_dir=/usr/local/mysql/var/',查明原因是my.cnf中反注釋了和InnoDB相關(guān)的配置。
e) 手動(dòng)建立mysqld/mysqld.pid,手工建立:
mkdir /var/run/mysqld
touch /var/run/mysqld/mysqld.pid
這一步不知道是不是必須的。但我這樣做了。
f) 到源碼中拷貝啟動(dòng)文件
cp /opt/mysql-5.1.51/support-files/mysql.server /opt/EmbedSky/root_nfs/etc/init.d/mysqld 修改該mysqld
詳見手冊(cè)中4.3.1. mysqld — The MySQL Server的敘述
加上了basedir和datadir,還有pid-file=/var/run/mysqld/mysqld.pid 修改完后,要給新的mysqld附以足夠的權(quán)限: Chmod +x mysqld
g) 在開發(fā)板開啟MySQL服務(wù)
開發(fā)板不支持service指令,所以service mysql start無(wú)效。采用的方法是運(yùn)行./etc/init.d/mysqld start
但最初運(yùn)行該指令后出現(xiàn)下面的錯(cuò)誤:
Starting MySQL... ERROR! Manager of pid-file quit without updating file.
困擾我好久,到開發(fā)板目錄/var/lib/mysql下查閱錯(cuò)誤日志文件[hostname].err,在我的系統(tǒng)中該錯(cuò)誤日志文件為EmbedSky.err,從中看到下面的記錄:
150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ; Please check that the user exists!
可能的原因是:在arm的linux上無(wú)法執(zhí)行g(shù)roupadd mysql,因此需要采用如下方法解決該問(wèn)題: cd /var/lib/mysql
ls –la可以看到里面的屬性中沒(méi)有mysql,于是使用下面的命令: adduser mysql
chown mysql:mysql -R /var/lib/mysql
然后開啟mysql服務(wù),還是出現(xiàn)了ERROR! Manager of pid-file quit without updating file.又查看EmbedSky.err日志,其中多了一條:
150714 2:48:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
150714 2:48:04 [ERROR] Do you already have another mysqld server running on port: 3306 ?
很顯然是因?yàn)橐呀?jīng)有mysql的進(jìn)程嘗試打開3306端口,因此就被占用了,需要?dú)⑦M(jìn)程,索性重啟開發(fā)板,然后運(yùn)行./etc/init.d/mysqld start,可以完美打開。
h) 設(shè)置軟連接使mysql, mysqldump, mysqladmin這三個(gè)命令能在開發(fā)板的shell中直
接運(yùn)行
ln -s /usr/local/mysql/bin/mysql /usr/bin
ln -s /usr/local/mysql/bin/mysqldump /usr/bin ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
7) 測(cè)試ARM平臺(tái)下的MySQL
a) mysqladmin -u root password hahaha 最后一項(xiàng)為我的密碼 (設(shè)置密碼)
b) mysql -h 127.0.0.1 -u root -p 或mysql -h localhost -u root -p 這樣便可以
進(jìn)入mysql環(huán)境。
c) mysql>show databases
按照上面的方法基本可以完成交叉編譯,但是在后面運(yùn)行的時(shí)候,可能會(huì)有些問(wèn)題,提示Permission denied,造成這個(gè)錯(cuò)誤的主要原因就是開發(fā)部啟動(dòng)后默認(rèn)是root賬戶,但是你添加的mysql賬戶是不具備root賬戶權(quán)限的,所以沒(méi)有權(quán)限執(zhí)行,解決辦法就是給你的賬戶加入到root用戶組,修改用戶組時(shí)要注意usermod命令可能文件系統(tǒng)中沒(méi)有提供,這個(gè)時(shí)候你需要用vi打開開發(fā)板文件系統(tǒng)下面的/etc/passwd文件,把你創(chuàng)建的mysql賬戶修改為root用戶組,這樣就可以運(yùn)行了,再次運(yùn)行提示mysql sucess...
恭喜你mysql終于移植成功了,但是如果你在開發(fā)板上面想用Qt開發(fā)時(shí)還需要移植嵌入式的mysql Qt驅(qū)動(dòng),即交叉編譯生成libqsqlmysql.so文件。
bitsCN.com聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:0731-84117792 E-MAIL:11247931@qq.com