找回密码
 注册
关于网站域名变更的通知
查看: 296|回复: 1
打印 上一主题 下一主题

移植mysql到嵌入式ARM平台

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-1-27 19:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
移植MySQL到嵌入式ARM平台

$ a# U/ c# ^, ]8 }/ M
2 V/ S5 R" r8 s6 s2 |MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植:
9 x1 K7 o! N' G- H1 S% S. S6 f4 w$ |8 c# V. T" ~
1) 下载mysql5.1.51# h. i0 D) o# |3 A( T/ p
: j# B: R/ L: ?3 j9 c
2) 安装编译器:用的是4.3.2的交叉编译器。gcc之类的都是ubuntu10.10自带的。
5 t( u8 e2 @. s8 W, j- Y) v/ ?. s- ?3 \( ?
3) 编译PC版本的mysql备用
* r, G9 m! n* w, g9 n8 e2 G+ n, L! z    a) 解压mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz + u; S" y3 _5 U+ e" f

& x, A( U2 I" q    b) cd mysql-5.1.51 5 e5 {) _$ N& g4 Y
    c) ./configure -prefix=/usr/local/mysql
: \! A' h0 R* _" b; y$ D0 A, l! e* c+ E$ j& C/ _& n% r
    d) make 注意,这里无需运行make install,以为主要是为了用pc版本里的gen_lex_hash库。(注意一定要先make后,再去修改文件夹名称)
+ y) d5 C% q0 M2 \& m0 o0 {( w2 H* a% ?- X# [6 u
    e) 将文件夹mysql-5.1.51改名为mysql-5.1.51-pc备用。(将gen_lex_hash单独备份保存一下)
5 o9 l0 ]& T. Z" r1 V4 p    f) 文档上说这里会出错,但我在编译的过程中没有碰到,唯一的问题是编译了arm版本的,重新通过改文件夹的名字回头编译pc版本的时候会报错。 0 Q: ]& Q- P. [* i5 l3 H
" d/ K8 Q, q: }. R( J# R  ?

7 z7 n8 i  A! {' P4) 编译arm版本的ncurses
* z5 I! i+ Q5 S7 e9 p: k    a) 下载ncurses-5.9.tar.gz
3 i% {  w6 ^  |& [( u0 {# H% B1 ?
" R- d( M( e# a. I( v    b) 解压到/opt/中:tar zxvf ncurses-5.9.tar.gz 8 M; ?) r$ [+ o( F9 N7 R: j

- q- Z) O; y' F# l" ~2 w/ d    c) cd ncurses-5.6
7 t9 v- s1 S+ s+ z    d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static , U- L! u* y: B

/ Z" t: t# V- J- Q    e) make 2 X% b% `% `+ k0 f1 g$ J. v
    f) make install之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持
, ~9 ^; g' {. j" l. e4 }) t! T2 |1 j+ K/ u) r
      (此步在用sudo make install时出错,原因是环境变量和原来不同了,解决办法:sudo -i;make install) 3 V, l3 L  s, I' \9 [, b% I
" G0 o4 C, [( B" k8 l; A5 \! h# ]
# E3 ^  W! p' W  _, h7 z

* z+ @! i5 Y" q3 n( P8 Z5) 编译arm版本的mysql " G" X9 P. m- @
    a) tar zxvf mysql-5.1.51.tar.gz 5 ]/ v7 Q. o9 ?& {: e
# j% t+ G9 }! A/ e0 a
    b) cd mysql-5.1.51
6 w0 Z2 [- }+ V( \    c) 修改配置文件:打开configure,可以使用gedit configure 分别在第26453行、 48175行、 48282行、 48485行附近有类似代码: ) J- s. Q: ]* S8 g+ x: g4 \
        if test "$cross_compiling" = yes; then ! B8 j7 {1 J/ P2 b, [# Q2 U
        { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} 5 u4 i- G" J6 D' @- B6 c" F4 l: C
        { { $as_echo "$as_me:$LINENO: error: cannot run test program while cross * @. t2 D& s6 z: i1 `2 Z9 q- w
/ \5 E& N6 P) N) A
        compiling See \`config.log' for more details." >&5 , U: v- L& _; o3 m$ t7 r# O

) m. o' W4 c  V" {        $as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;}
) C. b7 {6 f: r1 A8 p        { (exit 1); exit 1; }; }; }
  a; z! Y  X  i- A$ z1 y0 l
; o/ ^7 G* q2 |$ h        Else 8 d% `: q2 D) j( K/ u8 A+ b/ v

1 J* o" }; y9 L5 I( C9 V        将这些代码改为:
* s. Z( m5 ]/ G        if test "$cross_compiling" = yes;  then
2 k! ~& u9 r' K! q9 z
; S8 S+ o, A; |; Z' x. b        echo “skip …..!”
9 {& x) K" k$ U& V* ~
; f& L! s8 i8 Y, E        #{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 #$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} & s7 f! I; R( B0 S0 f! ~" H
        #{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5
3 p) p& u7 S5 _6 H) _        #$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} ! P9 A/ g2 R+ o
        #{ (exit 1); exit 1; }; }; }
, u- t! r$ v) h' g: ^
, Y& E5 j5 b0 Y; ?# b7 g. f- J6 G        Else * t: P2 E5 a- n( F+ E; U! F
* R: }$ h& x3 y, F+ w5 f2 _2 }
        一定注意,这样的代码有4部分,要全部改掉。 $ s: t+ e7 l5 ^$ Q
    d) 配置,直接套用了人家的配置方式:
' @* t" B; `9 V6 b/ z
: m8 y  r5 p0 o) b% k- ^; S      ./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
: Z8 P7 @) D+ r; f& A# d5 ?. ]4 }  a+ F" H. D% N$ r( F
    e) 修改opt/mysql-5.1.51/sql/sql_parse.cc:在5646行之前添加#define STACK_DIRECTION 1
: g$ q3 Z5 @( v! z# |+ R        如果不修改该语句,则会出现如下错误:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏变量STACK_DIRECTION没有定义初值,arm中定义STACK_DIRECTION为1。 % D2 X1 G7 s6 H; n" U$ m4 v$ A
        注意:这里的“#define STACK_DIRECTION 1”一句,不能随便加在sql_parse.cc的开头处,而应该根据出错信息的提示添加在相应的行上,我所遇到的行号和别人文档上所遇到的行号并不相同。 ) d' @1 q6 H# v! V; u" S; U; P& r. D! U
    f) 复制PC版本的gen_lex_hash文件到当前文件夹:' q4 m; u2 w* G/ H

- |5 Y, H, e$ G4 e3 J: e       cp  /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/
0 {# i* I% {" ~7 R; k2 F" Z: ^& m  ?1 Y6 c0 Q2 F% h5 `9 v' O
       touch –m sql/gen_lex_hash  
/ I$ q3 c5 \/ g' S# A: ~       cp  /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/
: e4 K, L! w( `7 Q
" U4 f/ l; H2 f* H, g# S# j       touch –m sql/ lex_hash.h
2 W* u4 m: E; `0 c7 ~4 J) _0 z       否则会出现错误:
/ ^/ ]! f( q  g9 Y* @2 D: Q       make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t
  m2 y% u3 S2 |+ l, C       /bin/sh: ./gen_lex_hash: cannot execute binary file 因为arm版的无法在pc上运行。5 G# |" G/ F/ ^5 A3 u0 i. {3 i
8 `2 w2 N) M) ]2 W* S% n
       注意:别人的文档上说只要拷贝gen_lex_hash即可,但我试了好多次,都仍然会出现上面的报错信息,把lex_hash.h也拷贝过来后,就不再报错了。另外,touch一定要做,原因就是让编译器不要再编译覆盖拷贝过来的文件了。
. K8 h" C0 W2 C; O- y3 M- ^6 k! T
   g) Make
4 S1 C5 p: y2 @" w# z+ D& G( V0 k% o" K7 D
   h) Make install 9 n! N7 ^$ B5 s  ]5 i4 j0 D

; N/ \$ L3 T9 m( z1 ?+ }9 l5 \/ A9 r( p2 N( R; d9 f; Z
6) 移植相应文件到ARM平台 ' ^/ r4 n; ^3 N& @& d
   a) 拷贝pc的/usr/local/mysql到开发板的相同目录 ) }3 H7 U7 U2 h! H) V- \
       我使用了nfs调试,所以需要使用如下指令: 6 Y  _- M5 t% C
       cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql  5 L9 ^0 W/ r) h+ ]+ d5 Y2 @" _
   b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里:
; J. ?  [8 @  ?& m; ]5 A% O. O6 D       tar –zcvf mysql-arm-5.1.51.tar.gz mysql
( m7 M8 D: X- X. I- `7 O   c) 到源码中拷贝配置文件模版  Copies files from one location to another. 配置文件模版)
, B; q, x/ g% g0 h$ c5 ]' H
+ B/ ]' E4 s+ h0 r4 E3 r       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节中的叙述。
0 V  |) }/ ^5 ~1 B7 `5 f2 o3 w7 t+ H; \; e
       数据目录是在:/var/lib/mysql (默认)
9 H- X5 H! I0 o/ x( ?8 D( |6 a
3 }+ I6 X8 Z9 s& r       安装目录是在:/usr/local/mysql (默认)
5 R  O; x) D0 ^7 E$ Q       试图反注释了关于InnoDB的一些配置,其它没有动。但是修改了这些设置后,报错,于是又改了回来。
8 o" V$ j$ q8 h) q7 M1 w    d) 运行mysql_install_db(参见手册的2.13. Post-Installation Setup and Testing) ( `2 S- X" U" A
       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自动认为可能在该操作系统中的运行会不兼容,有两种办法解决: # T2 _7 y; _  q* R- e' f
         第一种,运行hostname fedora14,就是欺骗一下hostname;
8 r& \! y! E; X6 g0 A4 H2 u0 w/ ?7 E/ P4 |# M1 L
         第二种,运行mysql_install_db -u root –force
" d- H9 \) P% Z. }
+ v% I3 m: T; R7 M6 t/ Q& c+ o4 h7 }         我使用了第二种方式: bin/mysql_install_db --user=root --force --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var/lib/mysql (我修改了datadir的路径) 7 ^+ C7 _% \$ V: Q& U# N' _
         中间出现过一次错误:150713 21:06:39 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'innodb_data_home_dir=/usr/local/mysql/var/',查明原因是my.cnf中反注释了和InnoDB相关的配置。 : K$ G4 w; q1 P
    e) 手动建立mysqld/mysqld.pid,手工建立: (这一步不需要,制定到/tmp/mysqld.pid就行)1 q9 i: t: i% X; H
        mkdir /usr/local/mysql/var/run/mysqld
  h4 o, j& Z3 P        touch /usr/local/mysql/var/run/mysqld/mysqld.pid
2 q6 t3 @; K8 F' f* m% M        这一步不知道是不是必须的。但我这样做了。(不需要)8 L  q4 F1 [  i
2 ~2 E3 _4 c2 [# I) x
    f) 到源码中拷贝启动文件
' P8 ?* s6 R; U* x/ W        cp /opt/mysql-5.1.51/support-files/mysql.server /opt/EmbedSky/root_nfs/etc/init.d/mysqld
( g2 q- k- k+ O( j/ F, h# d
. w7 \$ A+ v$ J       修改该mysqld 1 G: g# Y0 E% n. q

# a# o. x$ T/ H4 ^! R9 Q       详见手册中4.3.1. mysqld — The MySQL Server的叙述 6 u* A- I; v9 b& D
       加上了basedir和datadir,
8 ^0 g  o  n, r/ o5 F: R
" x4 k1 d, K( ~0 H+ U       还有pid-file=/tmp/mysqld.pid
+ j. x: V9 \3 P4 X
/ Q$ [. g6 y, z  D) T       还有service-pid-file=/tmp/mysqld.pid % W4 h2 Z8 i* O9 X& w1 q, H  Y

! m- ?! d& i) h* z* H3 c! X3 G  ^       修改完后,要给新的mysqld附以足够的权限: Chmod +x mysqld
/ b: i/ X1 I: R; C/ V& Q    g) 在开发板开启MySQL服务
) ?: p/ W$ s+ J       开发板不支持service指令,所以service mysql start无效。% K: _5 J& p, {; c* y3 P! v

6 }6 ^+ I) T. `       采用的方法是运行./etc/init.d/mysqld start 5 q% l; T& C" |1 ]9 u* {6 V
       但最初运行该指令后出现下面的错误:
5 t! w* H7 a" G  w- ~       Starting MySQL... ERROR! Manager of pid-file quit without updating file.
* F% \2 t) f% V* P3 e       困扰我好久,到开发板目录/var/lib/mysql下查阅错误日志文件[hostname].err,在我的系统中该错误日志文件为EmbedSky.err,从中看到下面的记录: % V  U$ D8 p/ J* U: E& u
      150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ;  Please check that the user exists! . q) `9 V7 Q' t2 g( i' `4 i3 ]5 F
      可能的原因是:在arm的linux上无法执行groupadd mysql,因此需要采用如下方法解决该问题: cd /usr/local/mysql/var/lib/mysql 9 n, v) |: r: r* Q0 ?! f
      ls –la可以看到里面的属性中没有mysql,于是使用下面的命令: adduser mysql
+ \/ k* N, c0 u2 c: a      chown mysql:mysql -R /var/lib/mysql # o' p9 Z( p: j3 ?
      然后开启mysql服务,还是出现了ERROR! Manager of pid-file quit without updating file.又查看EmbedSky.err日志,其中多了一条:
# \! h% K( Q7 W' {1 ~( l      150714  2:48:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
& X8 o! Q$ B) h  c& |8 Y3 `      150714  2:48:04 [ERROR] Do you already have another mysqld server running on port: 3306 ?
0 U' B( L. b7 |* r2 l      很显然是因为已经有mysql的进程尝试打开3306端口,因此就被占用了,需要杀进程,索性重启开发板,然后运行./etc/init.d/mysqld start,可以完美打开。 . U3 L  g% E2 Y, v* W3 S1 U  x; E5 J

5 V" X; D/ m3 f  (我使用的时候,还有另外的一个问题,由于客户端和服务器都要访问/tmp目录,所以每次开机都要chmod 777 /tmp  ,以便于都能访问)
+ l7 {+ |0 M* {! d/ K    h) 设置软连接使mysql,  mysqldump,  mysqladmin这三个命令能在开发板的shell中直接运行 : Y' g/ P  B( t' L% U! o" s) _
       ln -s /usr/local/mysql/bin/mysql /usr/bin
9 H+ a* p9 C$ Z7 I       ln -s /usr/local/mysql/bin/mysqldump /usr/bin 5 k4 Y# Q& Q' Q0 m1 N

+ T& d# k  b7 V! B6 n       ln -s /usr/local/mysql/bin/mysqladmin /usr/bin2 K- B3 d* j4 Z7 W

- t* X# l! A0 `/ ~8 s: `6 J5 u5 W/ ]/ ]       其他的还有:链接库文件
) T" U  A* A* P- o9 d4 u, i3 K2 Q3 j# O8 f% K, U9 i+ N- o3 X
       ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /lib0 Z: q1 Y: F! f
: s) Y* m9 k. h3 k
7) 测试ARM平台下的MySQL
$ X7 \: A) s. D    a) mysqladmin -u  root   password   hahaha 最后一项为我的密码   (设置密码) 9 t. H1 i' c' X4 U0 ]

+ N# j1 ]+ V3 C+ V& W    b) mysql -h  127.0.0.1  -u root  -p 或mysql -h  localhost  -u root  -p 这样便可以进入mysql环境。
+ ]: v( F/ d) k: l( X( y: S8 r% Y) W- o4 y- v$ h2 P
    c) mysql>show databases;. c- e5 d& B8 L4 m5 u

: a: U: J* \; M, W        mysql>create databases at91;+ i% L  M4 y" I2 X4 ^7 e% U& U. t
8 ?$ v' r% _# w5 \( ]0 B8 e
        mysql>use at91;  B7 M5 a% l# ~! ~* r

  D6 @. y5 e2 i, c) N        mysql>create table node (id int(5) auto_increment not null primary key, node_ID char (40), param_ID_values varchar(900));
5 ?. C9 [5 ]; N/ w8 q
7 K" T5 T" @/ a
  • TA的每日心情
    慵懒
    2020-6-13 15:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-1-27 20:12 | 只看该作者
    移植mysql到嵌入式ARM平台
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 19:51 , Processed in 0.187500 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表