|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 O: s# C* l' f0 p" ^% ?. Z
5 s, F: A) P6 p6 f6 p; u& E- }) DMySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植:3 B4 X( C( e. g* |
$ x! m. [; ^8 I; a
1) 下载mysql5.1.51
) B1 o" W$ b4 L. f$ E/ h
! H& i+ |, T k1 E8 L: l2) 安装编译器:用的是4.3.2的交叉编译器。gcc之类的都是ubuntu10.10自带的。
+ v+ g1 q( T: ?0 l$ F ]. {# }2 Q x( a4 k& @
3) 编译PC版本的mysql备用 . w8 ~2 F" \3 \! n6 m
a) 解压mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz
* M0 F/ J* ]- p
+ y# `; T' P( g( P; j b) cd mysql-5.1.51 - D- H: p: k h$ b/ V! P
c) ./configure -prefix=/usr/local/mysql . r) B, O3 q6 y" d" x0 c5 E9 P" t
0 Y+ K6 x0 M8 ]6 Q d) make 注意,这里无需运行make install,以为主要是为了用pc版本里的gen_lex_hash库。(注意一定要先make后,再去修改文件夹名称)
* k$ y9 ~9 L0 c
: E; y4 v! [3 h# A9 N' |" H e) 将文件夹mysql-5.1.51改名为mysql-5.1.51-pc备用。(将gen_lex_hash单独备份保存一下)
, U% y, c; h+ O3 a+ { f) 文档上说这里会出错,但我在编译的过程中没有碰到,唯一的问题是编译了arm版本的,重新通过改文件夹的名字回头编译pc版本的时候会报错。 4 Y; ^# g* v# o5 Y# M
( j. w+ e9 s/ h$ E1 R9 I' u5 P
6 _& ~7 [/ ^( C0 c. C6 ~4) 编译arm版本的ncurses ! d$ D! q0 z2 d& g- w, E
a) 下载ncurses-5.9.tar.gz' g% y7 B: ~7 p( Q& t8 H1 i
( U6 R" t2 H" I7 v
b) 解压到/opt/中:tar zxvf ncurses-5.9.tar.gz * w5 V v- f5 |& X: W) N7 ^5 M
7 M$ y9 D- t# ^ c) cd ncurses-5.6 9 M# H! r/ r0 }$ u( o3 h8 G
d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static
2 a" p! y5 L3 r! N
0 V) W4 u, |! o/ x! Q9 N e) make
$ T+ N6 i7 d1 m, h f) make install之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持
/ Q* W0 `) @, _3 h! h1 n( h# W0 m
# p/ [$ e5 h: [. W6 z" h, \1 S6 ~ (此步在用sudo make install时出错,原因是环境变量和原来不同了,解决办法:sudo -i;make install)
( f- X( V& C) r: I6 L u0 H
3 |5 w S/ C9 b9 k/ i
5 h3 v8 [! \4 U0 \8 Z
4 s" w$ o* r ^6 R8 G( c5) 编译arm版本的mysql ) w0 U- j; y" x. N! |* X
a) tar zxvf mysql-5.1.51.tar.gz p6 l `, Z" S1 G( ?. w5 w2 U
+ O3 I* M1 [- o+ }3 @$ I4 \ b) cd mysql-5.1.51 " w0 I% {2 ^. m0 j6 E' w. G7 g+ [
c) 修改配置文件:打开configure,可以使用gedit configure 分别在第26453行、 48175行、 48282行、 48485行附近有类似代码:
@" ~1 {5 v+ I if test "$cross_compiling" = yes; then
& z$ D% t$ j" x' t { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} 1 N/ N# B% W* F; E
{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross . O; f0 B" b M6 @( G6 o
* {: |' o& c2 ], e
compiling See \`config.log' for more details." >&5
$ [/ H, T& a3 E7 O# E% r) c4 j/ }/ w b5 m
$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} ; W# }1 S- j* J8 b3 z3 B/ L
{ (exit 1); exit 1; }; }; }
( S( Z6 D. I7 J
+ ]& j/ R Y; h$ A Else
$ v) I' U1 _2 B5 W$ M& |6 R6 N$ G' g) `
/ q/ Y! D2 k5 z( ]# H 将这些代码改为: & l. F1 g$ [# d6 u
if test "$cross_compiling" = yes; then $ @" }, {! O. _, ^; h' ?9 G
5 d) Z- R8 d8 U0 L( P5 Q$ U7 }
echo “skip …..!”
5 ~+ e) I, ]* n1 E# w5 _' _5 F6 _: q4 A! m" k( M
#{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 #$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} 1 L0 ^* V) u0 d, \3 X# M: S( v& d
#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 : u/ z& O# q9 f
#$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} , E; t/ q) }5 L( s" ?0 p
#{ (exit 1); exit 1; }; }; } 5 u G9 C0 X! ]! |) A) {
" w1 ?$ x% {2 {" N% E& K" f% H Else : z; \: l4 U; J; P" n! q5 e
- L& M3 a, j+ A) Y% d Q4 }& k 一定注意,这样的代码有4部分,要全部改掉。 ! r& t) G* S) K* D
d) 配置,直接套用了人家的配置方式:
9 c7 I- C. j3 m
' C1 v/ P% H; f5 B0 } ./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,utf82 @6 I' u1 d) S2 q8 l
/ d/ B5 @' @5 a6 t7 U
e) 修改opt/mysql-5.1.51/sql/sql_parse.cc:在5646行之前添加#define STACK_DIRECTION 1
/ Y: f# e% O% r 如果不修改该语句,则会出现如下错误:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏变量STACK_DIRECTION没有定义初值,arm中定义STACK_DIRECTION为1。
. Y- O% \: K+ r" b$ `9 R 注意:这里的“#define STACK_DIRECTION 1”一句,不能随便加在sql_parse.cc的开头处,而应该根据出错信息的提示添加在相应的行上,我所遇到的行号和别人文档上所遇到的行号并不相同。
[3 G& Z+ B3 q3 z* ~* T f) 复制PC版本的gen_lex_hash文件到当前文件夹:
* R7 M1 M8 |4 N. }* M: h# ^4 y3 U" G8 N
cp /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/
6 ~! v& b2 l* `, O1 m. s& |5 p9 t( w" l: M/ u3 b
touch –m sql/gen_lex_hash # [, Z( o5 E$ b5 _3 z
cp /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/ 5 o' |* _; X, W% K/ v, G
* S$ v$ ^$ s7 @
touch –m sql/ lex_hash.h
9 E: k! e' P! d! k. Z' x$ P8 @7 @ 否则会出现错误: ; \& W/ B4 \( w9 l5 f9 z
make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t + K5 H8 l% `! x6 n& q
/bin/sh: ./gen_lex_hash: cannot execute binary file 因为arm版的无法在pc上运行。. P. e' @" u, v' Y) \
, k, k9 B4 W X" C/ X 注意:别人的文档上说只要拷贝gen_lex_hash即可,但我试了好多次,都仍然会出现上面的报错信息,把lex_hash.h也拷贝过来后,就不再报错了。另外,touch一定要做,原因就是让编译器不要再编译覆盖拷贝过来的文件了。
! y/ G4 ]1 Y, x5 E9 ~+ o) m: p/ b* y# D$ K
g) Make ; r6 e' ~( U8 k$ J
e& u" D4 M$ y8 K
h) Make install % y, R' k& N2 f9 j! h; U3 d
$ }/ w7 M7 e2 Z) w# ?
* a7 Q3 g2 q* M" s: H
6) 移植相应文件到ARM平台 ( `& t% X7 [# d3 D. \4 }( j' x4 K
a) 拷贝pc的/usr/local/mysql到开发板的相同目录
2 q+ @' }( i9 j# ^ 我使用了nfs调试,所以需要使用如下指令:
0 j: s" I7 t) h9 k( U; Y/ A cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql - j- D- u$ u- V+ E
b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里: * Y: c* @" n+ B% m6 [
tar –zcvf mysql-arm-5.1.51.tar.gz mysql
# D1 W) e9 T) Y h' B c) 到源码中拷贝配置文件模版 Copies files from one location to another. 配置文件模版) $ }9 K; T; P# g, q" E
5 ^9 ]6 `- _2 b0 U" u8 Q N. e 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节中的叙述。
# `& J; d8 f& R* E' w/ ?( G
) \& q% L6 p. {3 \2 s8 @: X 数据目录是在:/var/lib/mysql (默认)
, d1 ^6 f: D y! v3 @2 f
1 F8 x# C3 k: ]1 J& ^2 d5 F0 V% Q 安装目录是在:/usr/local/mysql (默认)
5 r x4 |! B8 h( a$ k 试图反注释了关于InnoDB的一些配置,其它没有动。但是修改了这些设置后,报错,于是又改了回来。
+ D, a- j; G+ ^9 n% L' a0 P4 t) y d) 运行mysql_install_db(参见手册的2.13. Post-Installation Setup and Testing) $ j/ v3 ^7 p- F5 }, x. Y2 n
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 v0 t% h) X/ W, C 第一种,运行hostname fedora14,就是欺骗一下hostname;
2 x0 @: @; @' v4 f0 z5 h4 `& ^) D) F7 ?* i5 V+ m6 P5 o
第二种,运行mysql_install_db -u root –force ; u9 E" G% d. @: o/ D4 ^
6 `6 U" N# j; `/ W
我使用了第二种方式: bin/mysql_install_db --user=root --force --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var/lib/mysql (我修改了datadir的路径) 6 |' D8 [4 u) v' C
中间出现过一次错误:150713 21:06:39 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'innodb_data_home_dir=/usr/local/mysql/var/',查明原因是my.cnf中反注释了和InnoDB相关的配置。 q8 V! y8 O$ e+ f6 Z# U
e) 手动建立mysqld/mysqld.pid,手工建立: (这一步不需要,制定到/tmp/mysqld.pid就行)3 x8 g# q2 L+ a% H
mkdir /usr/local/mysql/var/run/mysqld
9 i8 u- Z; }! Z$ K& f, _ touch /usr/local/mysql/var/run/mysqld/mysqld.pid
! Y# i1 c0 q* D, _ 这一步不知道是不是必须的。但我这样做了。(不需要)
% I8 F3 l' Z# j+ V
- G8 K0 c0 m' C* ~0 { f) 到源码中拷贝启动文件 6 F' O) M1 ]3 F$ P
cp /opt/mysql-5.1.51/support-files/mysql.server /opt/EmbedSky/root_nfs/etc/init.d/mysqld # P' D$ }/ Y/ x T
: L3 ]1 [$ b, C 修改该mysqld 0 s4 s& Z3 \! p% L7 s: M$ q
$ U6 ?. I8 q* G$ R$ G
详见手册中4.3.1. mysqld — The MySQL Server的叙述
3 R3 a) |6 e3 i, A" M+ i 加上了basedir和datadir,* `* h7 n0 Y0 ^/ E- v8 `: q" f
7 O' N$ M7 D$ s! z( w8 b! q& b
还有pid-file=/tmp/mysqld.pid
, W6 a2 y4 l. B+ B+ d d5 V' f- p4 s# O* H. [) H' j z4 Y$ G
还有service-pid-file=/tmp/mysqld.pid $ ~* j% S b8 I
, w) y6 L0 Y0 L7 X1 ~: m) K
修改完后,要给新的mysqld附以足够的权限: Chmod +x mysqld 1 [0 n* Z9 f1 a) s7 g4 o8 T* q
g) 在开发板开启MySQL服务
4 K( g7 r0 Y3 g Q( h0 E 开发板不支持service指令,所以service mysql start无效。 Q# a! v0 W2 b8 v, N' s# y& Z% A
) Z$ j7 y# x7 d
采用的方法是运行./etc/init.d/mysqld start
/ D& W4 f) O5 U 但最初运行该指令后出现下面的错误: 0 N, }9 b z& o/ ?
Starting MySQL... ERROR! Manager of pid-file quit without updating file.
/ u# Q! l- W$ N 困扰我好久,到开发板目录/var/lib/mysql下查阅错误日志文件[hostname].err,在我的系统中该错误日志文件为EmbedSky.err,从中看到下面的记录:
7 K' D6 b2 u( U0 Z: e6 g+ ^4 D 150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ; Please check that the user exists!
, K2 [$ ]8 N+ A; Q6 k 可能的原因是:在arm的linux上无法执行groupadd mysql,因此需要采用如下方法解决该问题: cd /usr/local/mysql/var/lib/mysql ; x- j' I* j9 L1 d, X: t
ls –la可以看到里面的属性中没有mysql,于是使用下面的命令: adduser mysql ! E% {6 T1 {* X0 h7 t: i* b, `
chown mysql:mysql -R /var/lib/mysql
! @7 \1 ^( _( W 然后开启mysql服务,还是出现了ERROR! Manager of pid-file quit without updating file.又查看EmbedSky.err日志,其中多了一条:
6 H t" n& r; m9 o Q 150714 2:48:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use % D) |: t; p8 N( f9 y1 c% u) M4 ]
150714 2:48:04 [ERROR] Do you already have another mysqld server running on port: 3306 ? ) E' ?0 ^( S) b% u
很显然是因为已经有mysql的进程尝试打开3306端口,因此就被占用了,需要杀进程,索性重启开发板,然后运行./etc/init.d/mysqld start,可以完美打开。
. h, N7 L% T3 G. v: j
( h9 j+ j. [$ h$ \/ A: J2 L4 f (我使用的时候,还有另外的一个问题,由于客户端和服务器都要访问/tmp目录,所以每次开机都要chmod 777 /tmp ,以便于都能访问)
2 w% G. U: Y9 f$ ]! V* z h) 设置软连接使mysql, mysqldump, mysqladmin这三个命令能在开发板的shell中直接运行
) p; T7 d2 J/ ^; _# t# D ln -s /usr/local/mysql/bin/mysql /usr/bin
5 L0 g n6 u4 ?& u ln -s /usr/local/mysql/bin/mysqldump /usr/bin Q- u% q+ v2 z! P- p
+ B' U. E c7 ~/ _# o, r: s ln -s /usr/local/mysql/bin/mysqladmin /usr/bin5 k$ ]7 ]* V" U
, m8 @# j0 n$ B, f9 ^% n u
其他的还有:链接库文件
* w) Z& D# l* S/ t
/ Q1 s% G$ z0 N ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /lib
. u( L1 \3 c8 `7 d/ L" F
2 |: ]! i* k% |+ l6 J7) 测试ARM平台下的MySQL
) g/ u/ b/ U" g* s1 f# {6 M8 V a) mysqladmin -u root password hahaha 最后一项为我的密码 (设置密码) 1 Q' H8 ]3 l- ~4 ]
7 O# B" V( k. l8 G b) mysql -h 127.0.0.1 -u root -p 或mysql -h localhost -u root -p 这样便可以进入mysql环境。
6 `" y- P/ f/ e9 R2 o' B! A+ E9 v# \/ ?# {7 a E" W3 A
c) mysql>show databases;
1 r* Y- x/ I l( b
9 f6 f$ T0 M: H$ C- U mysql>create databases at91;# r! Q3 J1 ~( a9 p
- @3 w/ F+ q) s) y, S
mysql>use at91;) C d! [5 g8 w6 i7 n, Z& A
* P) b" ^ s( A" `( M4 p
mysql>create table node (id int(5) auto_increment not null primary key, node_ID char (40), param_ID_values varchar(900));# q9 ^4 g& ]# D
+ W" a; B8 R" Y0 B |
|