|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' F8 n: I6 Q! `7 _
; O8 s4 o, d" r$ z# U" N/ ], q2 t
MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植:: a6 K. D# k1 x8 r% X/ n
0 U. \. b: [ Y3 M9 L1) 下载mysql5.1.51: ?3 T- U, N1 q/ ^# e6 s' j
& b" e& L, W( v) I! j' K) X2) 安装编译器:用的是4.3.2的交叉编译器。gcc之类的都是ubuntu10.10自带的。* M( M. S- q ^* e$ `
1 ]; W( B& L, u
3) 编译PC版本的mysql备用
+ P! A! e+ y6 B* R2 _ a) 解压mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz ( x7 D5 _% ]. Q' w3 r. i
9 y) b' A7 N. Z1 A. ` b) cd mysql-5.1.51 * S0 J# V% n0 S
c) ./configure -prefix=/usr/local/mysql
2 F+ T) B! _! v7 U* q2 Y& f
6 ~( F1 G5 @* j d) make 注意,这里无需运行make install,以为主要是为了用pc版本里的gen_lex_hash库。(注意一定要先make后,再去修改文件夹名称) 7 a) R& F, ]3 b0 _* v- `; X
1 {4 c6 l0 j; ?: g* ]! a' V e) 将文件夹mysql-5.1.51改名为mysql-5.1.51-pc备用。(将gen_lex_hash单独备份保存一下)
}1 [4 X- B( s r f) 文档上说这里会出错,但我在编译的过程中没有碰到,唯一的问题是编译了arm版本的,重新通过改文件夹的名字回头编译pc版本的时候会报错。 / p3 |& k+ M K* z
; d6 x$ C! S( T: Z7 x
6 m# K7 y% Z' F- C k. K4) 编译arm版本的ncurses , X, l& w" Q* W% g, R7 L
a) 下载ncurses-5.9.tar.gz6 v+ L# @$ w' j- ~' h
0 ?- N' [$ A+ ]9 x& ~& [: L b) 解压到/opt/中:tar zxvf ncurses-5.9.tar.gz
5 }, G% O9 E/ m" \+ B8 I# L2 t/ a h* k; m
c) cd ncurses-5.6
" ]! [0 a3 V4 } d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static
J1 P7 v- }6 u6 U- h8 U2 i% d5 G
e) make " b3 P: Q, Z. O
f) make install之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持" Y- x9 \" N8 m9 L" S2 V/ }" f" A
; O. R2 U6 k; G1 A5 I4 Z (此步在用sudo make install时出错,原因是环境变量和原来不同了,解决办法:sudo -i;make install) - g; N8 i0 {% s, S* m
. o" H' V8 z2 N. r
% M. s; k. L1 n" D6 F% t# S/ k5 v. n$ X' t- E
5) 编译arm版本的mysql * I5 [$ G' \) w5 U! O L- R' {
a) tar zxvf mysql-5.1.51.tar.gz % k# u2 @! H: k4 y
6 D8 F; g% v! r1 K- u4 [+ E
b) cd mysql-5.1.51 / F" c0 H& k# ^
c) 修改配置文件:打开configure,可以使用gedit configure 分别在第26453行、 48175行、 48282行、 48485行附近有类似代码:
1 r2 z* M/ h* E+ } if test "$cross_compiling" = yes; then # R4 [) R% ~+ s( U) A
{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} 5 }! k; j" u* b8 \
{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross $ M1 t: Q0 b2 ]# g+ \% w
+ j' E: P! C4 B- t
compiling See \`config.log' for more details." >&5
' t& U0 [/ n( X) H6 e: l W/ `' ?5 x0 p1 L; ^
$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} 2 _2 k1 {) f/ R- Y& B* ^; E: m
{ (exit 1); exit 1; }; }; }
V! b% d$ Y5 Q
$ @' t* |, c0 L& ?' z4 k Else
! S7 |" S+ z+ A/ F8 L6 B$ r9 b8 n* I5 ]6 O/ @5 C
将这些代码改为: ' N; L3 {# j( ]+ F! }; F' V4 K
if test "$cross_compiling" = yes; then
9 Y6 Z, s$ I+ M( J) o" {) d' ~: q
1 G% ^' C4 W9 h0 m echo “skip …..!” % k' P w# k: j9 M
$ }. x. U0 n8 R2 n. C; p
#{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 #$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
5 c8 B" E9 l5 L6 v/ C* r/ Y$ } #{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5
, n- @. W% j, X8 Z #$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;}
! P% A7 _1 {) t# w, h #{ (exit 1); exit 1; }; }; } \& K+ \( A8 G5 Q# V1 r
v4 d: v. a& e' L/ N2 [$ `, L Else 1 J6 q0 B+ }# C3 r* N
2 U% B, b! `# D: {1 X Y
一定注意,这样的代码有4部分,要全部改掉。 . }, ~$ U: K+ R: u$ A; J/ A
d) 配置,直接套用了人家的配置方式:
1 |7 X( X6 Y, v& S# K z# @1 ?4 P1 v* y0 o; `+ U+ m4 a
./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
# k, D q9 v6 S+ G8 A; ? n% ^& P$ \5 L- M T) k/ V
e) 修改opt/mysql-5.1.51/sql/sql_parse.cc:在5646行之前添加#define STACK_DIRECTION 1
% V" `9 J& h' y* i" N 如果不修改该语句,则会出现如下错误:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏变量STACK_DIRECTION没有定义初值,arm中定义STACK_DIRECTION为1。 6 ~3 a$ ~7 d7 N; Q j- D: l
注意:这里的“#define STACK_DIRECTION 1”一句,不能随便加在sql_parse.cc的开头处,而应该根据出错信息的提示添加在相应的行上,我所遇到的行号和别人文档上所遇到的行号并不相同。 8 B9 o: p+ z8 E
f) 复制PC版本的gen_lex_hash文件到当前文件夹:# u8 o9 S6 ^8 u/ q" [
! } ] P& t, A+ ~
cp /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/
3 K' O7 P2 F7 y5 M- C4 D: u# u
& K( H" Q) R; X$ J( T7 k touch –m sql/gen_lex_hash
- T# N" ^' g* D$ Q- F! P cp /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/
- D8 j7 M; O" v& z
. v: n- w/ ?- X( q& Q touch –m sql/ lex_hash.h ' N8 a4 A- y L3 j6 p C% [2 _
否则会出现错误: . X- M. I' G! ^6 @( ]
make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t 6 M; {/ y, F( Q, k8 s3 T
/bin/sh: ./gen_lex_hash: cannot execute binary file 因为arm版的无法在pc上运行。9 a: f" C0 z$ ]3 q1 M$ ?0 J
" l. @9 J$ [, ^& t# q, o0 c0 U
注意:别人的文档上说只要拷贝gen_lex_hash即可,但我试了好多次,都仍然会出现上面的报错信息,把lex_hash.h也拷贝过来后,就不再报错了。另外,touch一定要做,原因就是让编译器不要再编译覆盖拷贝过来的文件了。5 d2 r/ c2 ]9 ~8 r5 _
; `& d* C$ [6 n& s% \
g) Make
5 F. G# W2 {7 J% c& q% I6 ~* ~$ }- q8 a0 A
h) Make install
, e v7 L1 I$ ?0 `4 L' F% M; H: z. d4 x& n9 u# D
( s; b2 [7 L& p6 T6 a& d
6) 移植相应文件到ARM平台 " S/ p k X' Z) \3 ]
a) 拷贝pc的/usr/local/mysql到开发板的相同目录
: ?8 E$ F4 R: @, Q! h+ f% Y 我使用了nfs调试,所以需要使用如下指令: ) g; n6 M$ t& q6 h$ R
cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql
' `. n! @% t3 P9 g6 j9 w3 E b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里: 4 I* |# u, s4 P! R* J5 _4 R
tar –zcvf mysql-arm-5.1.51.tar.gz mysql
5 @! W! v* i3 P) ?* z% B6 z% R c) 到源码中拷贝配置文件模版 Copies files from one location to another. 配置文件模版)
! }) y, W4 A; J5 w# `2 f
4 a5 u+ a- O. h' N: ^ cp /opt/mysql-5.1.51/support-files/my-medium.cnf /opt/EmbedSky/root_nfs/etc/my.cnf (这里的目录指的是nfs调试的路径设置),这里的my.cnf存放的路径是按照手册上的建议,前面编译pc版本的MySQL 中所述的路径并非全局配置。该文档的注释中说:“# 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的英文手册的4.2.3.3. Using Option Files节中的叙述。
8 v3 t# x2 a k3 k+ @6 b. Q$ \7 w3 ]+ J2 p1 P+ L
数据目录是在:/var/lib/mysql (默认)- ^1 E$ r! i1 a, A5 T1 D& E
6 N& L% y0 E2 }! W6 ^' v$ w9 ` 安装目录是在:/usr/local/mysql (默认)
; z2 U/ r* G& X! {) ^ 试图反注释了关于InnoDB的一些配置,其它没有动。但是修改了这些设置后,报错,于是又改了回来。
5 ^" e! e1 {: N; ^9 I/ x d) 运行mysql_install_db(参见手册的2.13. Post-Installation Setup and Testing) 8 d7 {- v- p* E5 Z0 |
cd /usr/local/mysql/bin(开发板路径),运行mysql_install_db -u root 结果出现了如下错误: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 这主要的原因是开发板环境中的hostname是EmbedSky,而不是通常的Federa14等,所以mysql自动认为可能在该操作系统中的运行会不兼容,有两种办法解决: 5 i0 E6 R% x5 a; c1 M% I
第一种,运行hostname fedora14,就是欺骗一下hostname;
4 t8 x8 v" C0 J* U5 |9 z5 D
0 q2 `. j) ~$ d 第二种,运行mysql_install_db -u root –force 1 N) R! {; [6 h
. `. ~! c3 P6 w- V
我使用了第二种方式: bin/mysql_install_db --user=root --force --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var/lib/mysql (我修改了datadir的路径) " C9 Y/ ~3 C, r( Q# m7 ~% C) ~
中间出现过一次错误:150713 21:06:39 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'innodb_data_home_dir=/usr/local/mysql/var/',查明原因是my.cnf中反注释了和InnoDB相关的配置。
" d9 k) R5 `/ [ e) 手动建立mysqld/mysqld.pid,手工建立: (这一步不需要,制定到/tmp/mysqld.pid就行)
4 s4 t+ Q; C; O. g9 H mkdir /usr/local/mysql/var/run/mysqld
0 d# K4 b1 Q0 Q2 @6 K" ^% k touch /usr/local/mysql/var/run/mysqld/mysqld.pid
- ]) F+ L: f' z 这一步不知道是不是必须的。但我这样做了。(不需要)
$ J# u/ j( K7 X. H* H( w
7 u( x# A: Q' Y, R2 `( C+ p$ c$ ? f) 到源码中拷贝启动文件 ; a1 O1 _; D$ S# k P
cp /opt/mysql-5.1.51/support-files/mysql.server /opt/EmbedSky/root_nfs/etc/init.d/mysqld 4 P: i! Y5 c; W$ R1 H4 q; a, b: E5 z
9 h! g1 H+ g' K% v/ j: Y4 A 修改该mysqld B! n# a6 \7 n( {8 E& B* ^+ K
' d. x8 Z: H& G* f' K% U* w 详见手册中4.3.1. mysqld — The MySQL Server的叙述 & t% e$ W# X, B& e) G. F( `, W) m+ x
加上了basedir和datadir,+ I" g2 }' F) e
- A0 y5 k, D( R6 Y, r- K: o 还有pid-file=/tmp/mysqld.pid 6 ?* k4 v4 i6 k: Q
$ J$ z, X# w' ?: E# g" O& H8 V 还有service-pid-file=/tmp/mysqld.pid . T' |$ h& f) t# B# p
# Z# q5 a9 {3 _ 修改完后,要给新的mysqld附以足够的权限: Chmod +x mysqld : b9 z2 V% Z+ C. Z
g) 在开发板开启MySQL服务 : |7 \3 B& ]2 j$ G( H( p2 k
开发板不支持service指令,所以service mysql start无效。, \, ~, M7 ]& E4 g' L D% U6 t7 ~
/ |4 }$ `3 G- g4 F$ |1 R: T
采用的方法是运行./etc/init.d/mysqld start
% N+ a" T' ]7 V! @ 但最初运行该指令后出现下面的错误:
2 v8 x$ r- S1 r* a% L" V5 m Starting MySQL... ERROR! Manager of pid-file quit without updating file.
- k9 B0 _3 J; @8 u2 K" v 困扰我好久,到开发板目录/var/lib/mysql下查阅错误日志文件[hostname].err,在我的系统中该错误日志文件为EmbedSky.err,从中看到下面的记录:
; ^+ Z% \" Y Y 150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ; Please check that the user exists! * \6 }1 L9 s+ U! l, ^
可能的原因是:在arm的linux上无法执行groupadd mysql,因此需要采用如下方法解决该问题: cd /usr/local/mysql/var/lib/mysql
7 A3 S+ w& H' Z: i" b6 C5 _ ls –la可以看到里面的属性中没有mysql,于是使用下面的命令: adduser mysql ; s8 t# f: {- p. u
chown mysql:mysql -R /var/lib/mysql . t$ B' \. ^8 O0 p4 C. b! H
然后开启mysql服务,还是出现了ERROR! Manager of pid-file quit without updating file.又查看EmbedSky.err日志,其中多了一条: 5 s' z6 D0 i, g5 [8 m+ M, v0 u) S
150714 2:48:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
; W }, }/ J- B9 v } 150714 2:48:04 [ERROR] Do you already have another mysqld server running on port: 3306 ? 9 b* J. [. x7 b C) l% Q7 R* u: K
很显然是因为已经有mysql的进程尝试打开3306端口,因此就被占用了,需要杀进程,索性重启开发板,然后运行./etc/init.d/mysqld start,可以完美打开。
+ |8 m; X' T) S* s+ p, w; D- Q4 f" e# @ l; A ^& ~! q! x6 c
(我使用的时候,还有另外的一个问题,由于客户端和服务器都要访问/tmp目录,所以每次开机都要chmod 777 /tmp ,以便于都能访问)
7 D1 ~, _/ F: Q# q. O h) 设置软连接使mysql, mysqldump, mysqladmin这三个命令能在开发板的shell中直接运行 8 Y ~. O; f; r1 j! F B
ln -s /usr/local/mysql/bin/mysql /usr/bin
( |% @9 Y9 ^& h9 U* X ln -s /usr/local/mysql/bin/mysqldump /usr/bin 6 f e% J% ]# G0 K4 q7 H
3 ]/ q6 f+ e/ T6 D9 y @0 Z ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
& J: K) u3 y9 y9 G' `9 l2 \$ c" B. ^. I, ~# b0 p; w
其他的还有:链接库文件6 }& J2 i' V7 n0 V" I& K
3 A2 G% z( e! t0 L2 M, ` ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /lib% Y' J& q! O, `2 U. x
% {2 t* e% Z a8 Y/ f$ u' p! X
7) 测试ARM平台下的MySQL 9 q$ l) L1 O# ]8 |% z
a) mysqladmin -u root password hahaha 最后一项为我的密码 (设置密码)
& W2 L. M" E: c; A6 N* b: \, j9 \4 o7 Q' v
b) mysql -h 127.0.0.1 -u root -p 或mysql -h localhost -u root -p 这样便可以进入mysql环境。
, ?$ O' V1 M1 o5 I$ H t( }8 Q* _9 a+ N7 @2 J
c) mysql>show databases;% W" \6 t; @- I1 i6 n
! `" L' E- S9 G( }! T mysql>create databases at91;, {4 c3 G8 j: ^/ A0 L- G3 B% [% u+ d/ R
; ^/ x! V# S6 q1 D
mysql>use at91;
t% B( F( I x& y0 R( p% ]
/ V* ]+ ]6 o0 W* Q' o" N* m mysql>create table node (id int(5) auto_increment not null primary key, node_ID char (40), param_ID_values varchar(900));1 [' A) \1 M% y! y* P
7 p& d0 B( W: \3 k8 S5 q |
|