EDA365电子论坛网

标题: 移植mysql到嵌入式ARM平台 [打印本页]

作者: uqHZau    时间: 2021-1-27 19:05
标题: 移植mysql到嵌入式ARM平台
移植MySQL到嵌入式ARM平台
1 q5 b! ^, \! t9 u: P
% M8 g) p6 u  ^: \2 O. J/ N7 Q
MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植:
6 {# U7 D4 ]8 d; o7 o' j9 N" n# T) x( B- T# Q' G- _- }4 p
1) 下载mysql5.1.51
7 G4 z8 Y% ]3 x% {# a8 v& F2 b; a5 P! q2 W/ z$ p
2) 安装编译器:用的是4.3.2的交叉编译器。gcc之类的都是ubuntu10.10自带的。7 F9 ?4 y/ d8 O) d. _: z7 y9 m
8 p9 U: Q% G' C! i; t2 t* E$ ~# [
3) 编译PC版本的mysql备用 , a4 V+ |0 m7 L9 l0 |
    a) 解压mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz
. f$ r9 {# B& }  m* O
* O* B9 I0 p7 c5 f+ j    b) cd mysql-5.1.51 $ k* i2 J% a. W! z
    c) ./configure -prefix=/usr/local/mysql
- _  `1 C  c% P1 @
  ^  [0 P+ q/ `' B9 |    d) make 注意,这里无需运行make install,以为主要是为了用pc版本里的gen_lex_hash库。(注意一定要先make后,再去修改文件夹名称) 1 _& c  z; q3 m' f
; I# o9 P$ w# h3 u0 r8 Z: B
    e) 将文件夹mysql-5.1.51改名为mysql-5.1.51-pc备用。(将gen_lex_hash单独备份保存一下)
/ Q, q" Z( X6 b. _% F5 b: h: @4 I! B5 J    f) 文档上说这里会出错,但我在编译的过程中没有碰到,唯一的问题是编译了arm版本的,重新通过改文件夹的名字回头编译pc版本的时候会报错。 ; v+ C5 V2 O: S( y; X
" M& o) r8 m: B  d$ `4 z
2 h0 T  T( B* B0 h
4) 编译arm版本的ncurses
$ `3 a* Q. q9 h5 }( D, W& H/ A    a) 下载ncurses-5.9.tar.gz( ]- \4 d; }0 J8 x
' X' V  t1 `: q6 h7 G
    b) 解压到/opt/中:tar zxvf ncurses-5.9.tar.gz ! C$ J1 q- D1 }7 W
# j0 k1 p/ l; M3 F
    c) cd ncurses-5.6
) }, b" K" u, y" m- }    d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static % [$ g! e( S6 C; F

3 D* ]* J" m! r& S) T) e. I2 P    e) make 6 t# n+ V) Z  c, R" T7 j
    f) make install之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持2 @0 s& j& o- ~+ Z  f

5 i6 o+ Q0 U, q) e      (此步在用sudo make install时出错,原因是环境变量和原来不同了,解决办法:sudo -i;make install)
" S$ l7 J# h4 }* h# J' T
6 j$ N; r5 d3 h) ]! L5 E+ [ 9 j' }' v$ n. J7 e; G- P

2 _3 B- `) E) P2 u( z5) 编译arm版本的mysql   _! O8 W4 Y, `; h9 N1 W0 M
    a) tar zxvf mysql-5.1.51.tar.gz
9 X2 U, @) Q2 e2 K4 g7 l
5 |) \7 u" y# K. L  ]' c' W! O$ c* F    b) cd mysql-5.1.51 . }. M3 ~0 @/ {, I9 R
    c) 修改配置文件:打开configure,可以使用gedit configure 分别在第26453行、 48175行、 48282行、 48485行附近有类似代码:
( v! u7 n9 I. ^3 N' g4 }        if test "$cross_compiling" = yes; then
8 G+ r( [# U/ R1 o6 e        { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ; E' T1 @. D, ~) _
        { { $as_echo "$as_me:$LINENO: error: cannot run test program while cross
! |  f- O$ u( a$ v& ], b; r5 J( Y. F0 v$ J
        compiling See \`config.log' for more details." >&5
2 p9 j9 P- t. F6 i/ I( w) U+ D3 A
        $as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} & U$ }3 Y  r5 j6 u8 I& `. i9 J
        { (exit 1); exit 1; }; }; } 5 s- n( t4 A! s" k; ]
) e" L5 K( U2 f4 f; B9 v' U) z
        Else
& {/ E3 \7 o' B; ]. P6 u4 |  L# h8 @. K3 b% ?1 A1 p' f% |( c/ m
        将这些代码改为:
/ t7 T4 s' a. |7 U        if test "$cross_compiling" = yes;  then
" D5 G  _/ S( Q( M1 Z9 ]7 a4 N+ y. {! ~+ Q1 b) `! `4 }
        echo “skip …..!” & K2 s" I1 ?3 G; E7 }  [% M
4 o1 _3 E2 {1 w
        #{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 #$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} # D  Q8 P" m# \) B0 K+ u
        #{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 - w: e9 D9 Q. f" H* `+ }- v
        #$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} / g( z1 |6 _4 @6 E
        #{ (exit 1); exit 1; }; }; }
5 p3 n# S+ F9 s6 e1 X& n
0 ?5 n# `% L: m% b8 B6 O1 A        Else   F9 G, C: r0 o6 b- a" X
3 v7 m: H, X+ ^, ?  c, a& O8 `* F- R
        一定注意,这样的代码有4部分,要全部改掉。
2 H) o- x$ y3 @# f$ ~+ k8 Q    d) 配置,直接套用了人家的配置方式:$ S3 `0 q( p2 j  d' P

2 w4 R* m9 U& q6 @4 ^      ./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
8 h( a8 w2 V: Y# M/ R4 ^; k( o: [- r
, c' S; O7 F% L- Y    e) 修改opt/mysql-5.1.51/sql/sql_parse.cc:在5646行之前添加#define STACK_DIRECTION 1 ( f, S' }3 V5 O0 T$ s
        如果不修改该语句,则会出现如下错误:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏变量STACK_DIRECTION没有定义初值,arm中定义STACK_DIRECTION为1。
& x5 e$ X! n& M* y        注意:这里的“#define STACK_DIRECTION 1”一句,不能随便加在sql_parse.cc的开头处,而应该根据出错信息的提示添加在相应的行上,我所遇到的行号和别人文档上所遇到的行号并不相同。
: E3 i8 ?5 z( A# ?5 _7 t/ y    f) 复制PC版本的gen_lex_hash文件到当前文件夹:% ^0 O0 [; x3 O( h0 m: ^% S

# o% K. }1 c* ~       cp  /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/ / Q4 s7 L/ ^. N# i5 a9 i+ ~
6 X2 D5 W9 |+ |- i' L7 q" p; U) r
       touch –m sql/gen_lex_hash  7 @' S7 O0 h- U4 \9 v* d: F1 i* O
       cp  /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/
6 [5 }6 B+ I$ M( P
' k, M, X/ c  o1 P, v. @       touch –m sql/ lex_hash.h ; Q# C: @2 j4 q9 F/ d" m, N
       否则会出现错误: ( k* E1 r0 r5 [& |- i
       make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t * j$ N4 L; n! w3 y+ L5 N3 [* C" b
       /bin/sh: ./gen_lex_hash: cannot execute binary file 因为arm版的无法在pc上运行。
' P$ p8 B4 }0 X* R7 K7 [4 u. w0 z5 b8 v- D) g; _
       注意:别人的文档上说只要拷贝gen_lex_hash即可,但我试了好多次,都仍然会出现上面的报错信息,把lex_hash.h也拷贝过来后,就不再报错了。另外,touch一定要做,原因就是让编译器不要再编译覆盖拷贝过来的文件了。
2 e' r. N$ U0 R- G& ^4 c
) e! E# N* s7 I9 b9 G$ E   g) Make : L2 k4 V! X7 N+ j8 l* U; X. f" ?
, Y& {9 ~5 ?' @1 [2 g' J- ^
   h) Make install
' U  j6 H8 a& H. G+ K5 l; ?. @/ h% ]8 i6 o, L  Y4 h

& j7 R6 u6 a2 D( G8 n7 T! E6) 移植相应文件到ARM平台
5 K$ l% h, x( i   a) 拷贝pc的/usr/local/mysql到开发板的相同目录
* C: B: ]' h; E6 L       我使用了nfs调试,所以需要使用如下指令: 6 M6 z/ h, }3 M) g1 Z( }, p
       cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql  
' a! P9 u3 v, o% f# [9 C   b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里: ! j2 N9 K, m$ i
       tar –zcvf mysql-arm-5.1.51.tar.gz mysql % K/ f9 B1 V& ?0 U6 Y( {$ Q+ \
   c) 到源码中拷贝配置文件模版  Copies files from one location to another. 配置文件模版)
  e) I# W6 x+ W' S5 W! O6 {7 m8 i
       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节中的叙述。
1 F9 D9 X  Q8 o: m! ~) g
+ e9 G0 J2 E. w2 q7 T       数据目录是在:/var/lib/mysql (默认)" M- r" N# }; \* o- P+ j. [

2 N' M; J" S& H; `/ v' K       安装目录是在:/usr/local/mysql (默认)0 d7 a  [$ ?6 L* {
       试图反注释了关于InnoDB的一些配置,其它没有动。但是修改了这些设置后,报错,于是又改了回来。 ) l. v8 U& P& y5 B: a
    d) 运行mysql_install_db(参见手册的2.13. Post-Installation Setup and Testing)
! t- _7 [1 }# X6 j# L% y       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 c' @. G' i* B/ [
         第一种,运行hostname fedora14,就是欺骗一下hostname;) T( U5 I9 F: a' j1 r0 I1 j

" O: P. e4 P6 T- N3 Z# Z% f         第二种,运行mysql_install_db -u root –force 0 }2 U5 J5 k+ P( \$ W9 Q

# T& F' _; W; d$ e         我使用了第二种方式: bin/mysql_install_db --user=root --force --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var/lib/mysql (我修改了datadir的路径)
  z5 q2 Z& L) }# }         中间出现过一次错误:150713 21:06:39 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'innodb_data_home_dir=/usr/local/mysql/var/',查明原因是my.cnf中反注释了和InnoDB相关的配置。 + Y8 E5 b( f1 Z% q  Q; H1 y* u
    e) 手动建立mysqld/mysqld.pid,手工建立: (这一步不需要,制定到/tmp/mysqld.pid就行)" n; G( h* \9 O5 `# P3 k  K* g
        mkdir /usr/local/mysql/var/run/mysqld 3 ], O& n; n, J% [9 |
        touch /usr/local/mysql/var/run/mysqld/mysqld.pid
: ]( Y) O9 n% z# O        这一步不知道是不是必须的。但我这样做了。(不需要)- a) O' g. {; [% q' U7 U
# \0 R. e6 a( F
    f) 到源码中拷贝启动文件
$ B. C/ r& u$ c- Z! t- b/ P        cp /opt/mysql-5.1.51/support-files/mysql.server /opt/EmbedSky/root_nfs/etc/init.d/mysqld
" l+ D; o, T2 q/ w! J0 G, k, L( ?: N2 i* p6 x$ D
       修改该mysqld : R* F& ]: K' @' _. P* _$ H$ [

; o' F1 j% E8 R# M4 _, q0 x       详见手册中4.3.1. mysqld — The MySQL Server的叙述
% x. s1 k% J+ O7 O+ ~       加上了basedir和datadir,
$ u( n$ ?' m: E+ G5 X, {
( }# c5 U" v" b# M       还有pid-file=/tmp/mysqld.pid
0 u2 R/ f. [$ J  k  g- y/ @! d% `# C
, V9 b, J' M- \% o; ?) b% w       还有service-pid-file=/tmp/mysqld.pid - M* O5 o  f# l7 H  u  x
8 }9 v; I4 {2 X" h6 x. H- r
       修改完后,要给新的mysqld附以足够的权限: Chmod +x mysqld
. o4 o9 J+ d) A& c+ h( f( j    g) 在开发板开启MySQL服务 ' I$ B0 K4 w' u1 Q$ Z4 t( \9 `
       开发板不支持service指令,所以service mysql start无效。
( Q( G( y* `6 L2 ?2 Z
7 q$ U0 s' G' J8 I. I       采用的方法是运行./etc/init.d/mysqld start ! ~* Q9 @  ~- [- `  t
       但最初运行该指令后出现下面的错误:
+ b3 `2 s7 y1 u) g       Starting MySQL... ERROR! Manager of pid-file quit without updating file. ) i9 @" x; R7 f/ A+ \- K- m
       困扰我好久,到开发板目录/var/lib/mysql下查阅错误日志文件[hostname].err,在我的系统中该错误日志文件为EmbedSky.err,从中看到下面的记录: 5 H) ?) q# E( Q% L1 S! G: n
      150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ;  Please check that the user exists! 4 R, N. `6 {% L$ ]6 E0 J
      可能的原因是:在arm的linux上无法执行groupadd mysql,因此需要采用如下方法解决该问题: cd /usr/local/mysql/var/lib/mysql
3 a8 s5 {7 c' W3 h+ ?      ls –la可以看到里面的属性中没有mysql,于是使用下面的命令: adduser mysql 6 l) D/ v7 w6 M0 `/ }
      chown mysql:mysql -R /var/lib/mysql
2 F2 t: S0 c) @1 t. }/ h+ A# i9 o      然后开启mysql服务,还是出现了ERROR! Manager of pid-file quit without updating file.又查看EmbedSky.err日志,其中多了一条: 6 J$ |2 l/ \: D4 R9 y$ t0 l- [* V
      150714  2:48:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use % `1 E( `9 j6 A" i
      150714  2:48:04 [ERROR] Do you already have another mysqld server running on port: 3306 ? , q) i+ I/ P! \; H- v7 x
      很显然是因为已经有mysql的进程尝试打开3306端口,因此就被占用了,需要杀进程,索性重启开发板,然后运行./etc/init.d/mysqld start,可以完美打开。 9 z. y, ]! a; v3 }6 y
. S9 [. m) S& R. `# B$ `* l
  (我使用的时候,还有另外的一个问题,由于客户端和服务器都要访问/tmp目录,所以每次开机都要chmod 777 /tmp  ,以便于都能访问)* r( F( [/ q# N* A# t9 g0 n7 Q
    h) 设置软连接使mysql,  mysqldump,  mysqladmin这三个命令能在开发板的shell中直接运行   F% ]1 _( S% J  ]  f5 t
       ln -s /usr/local/mysql/bin/mysql /usr/bin
: }- ^' |& N! C. X( c6 Q       ln -s /usr/local/mysql/bin/mysqldump /usr/bin , F: G$ }, n" U" P3 r8 w

& E" u! P) ^* c       ln -s /usr/local/mysql/bin/mysqladmin /usr/bin- ^" E% t+ ~& W4 e/ g& B
- U  S2 a; L7 M/ A# M
       其他的还有:链接库文件
% M/ U" D( f2 s( o! E; g
2 d9 h" B. I: D) }+ g; I, V# c       ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /lib# p/ d# R" \$ B$ G/ B

* o( B8 E& D2 K( b7) 测试ARM平台下的MySQL
$ f3 K6 l1 |# F    a) mysqladmin -u  root   password   hahaha 最后一项为我的密码   (设置密码)
$ G& m# `- {/ v1 Q2 Z  y; l- z8 v6 z, I8 m
  Z& F" Z& J; m$ Q1 d$ x8 ]    b) mysql -h  127.0.0.1  -u root  -p 或mysql -h  localhost  -u root  -p 这样便可以进入mysql环境。
7 _3 M' a! J* \: z+ C! v3 ~( F
3 r$ U# C" f- X    c) mysql>show databases;
, J6 ]' ]! v; U8 d8 h5 h' ~  _2 X+ e, C" @6 a5 U9 K& i
        mysql>create databases at91;7 m4 }. V& C. K! s, i2 S2 Z
4 p: v9 Y# B& c2 V
        mysql>use at91;( T1 Y' `. O$ H7 F& Z$ j

: X+ ^' _+ O- @2 m2 H        mysql>create table node (id int(5) auto_increment not null primary key, node_ID char (40), param_ID_values varchar(900));0 k8 f8 Z; h# Q9 e% ^' O
5 x) V/ c% S' j* Q5 y

作者: younicp    时间: 2021-1-27 20:12
移植mysql到嵌入式ARM平台




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2