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

移植mysql到嵌入式ARM平台

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
移植MySQL到嵌入式ARM平台

( C- j# {. E/ X* M7 J( `8 j
! s2 e$ d- G1 M' g. KMySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植:7 B: ?: ]2 _% |. r
% o; `7 o; P- W: R: a
1) 下载mysql5.1.51
2 j  O; f) e% G- f) [1 q6 K% h
( _- G: q- v" D, E2) 安装编译器:用的是4.3.2的交叉编译器。gcc之类的都是ubuntu10.10自带的。! H& H7 M) C+ w. y2 W

8 t8 @, ?( f; p- ~3) 编译PC版本的mysql备用 # I" z) K9 Q  D% K$ ]; g
    a) 解压mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz
' e* A3 ~' Q6 \+ B2 ]; L" L" v8 t- p, Z. R9 _
    b) cd mysql-5.1.51 # ]0 m6 `+ m/ |2 o; t& E
    c) ./configure -prefix=/usr/local/mysql
4 s0 ^" O# R1 W/ E2 [, y) J5 X3 F0 p, _
    d) make 注意,这里无需运行make install,以为主要是为了用pc版本里的gen_lex_hash库。(注意一定要先make后,再去修改文件夹名称)
$ G% N  U8 C5 a! x( S$ Z6 X1 g# S( o0 t
2 ~$ B. A- N7 x2 ~1 G    e) 将文件夹mysql-5.1.51改名为mysql-5.1.51-pc备用。(将gen_lex_hash单独备份保存一下)
4 h8 K* P( a7 x5 a" B    f) 文档上说这里会出错,但我在编译的过程中没有碰到,唯一的问题是编译了arm版本的,重新通过改文件夹的名字回头编译pc版本的时候会报错。 1 C4 H3 ]( Y! y5 d3 i& f

* ^- J6 d; J9 ^0 I
0 Y' j1 e! W0 \% g4) 编译arm版本的ncurses
+ F# l8 N) ?$ V9 P9 D    a) 下载ncurses-5.9.tar.gz
$ b% C1 `, j3 l1 a3 |9 w
/ N$ [' ]; Z* F: D. O& \8 Y    b) 解压到/opt/中:tar zxvf ncurses-5.9.tar.gz ! }2 x9 u- E0 [' v
5 Q4 R, T' z" d" t/ X" e; D# F: F" ?
    c) cd ncurses-5.6 & w$ U: q. p9 \: b3 m& i7 X
    d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static % Q/ J7 }' i  H: \" i2 l/ x0 u, u' S

3 g9 N( P, e+ f9 \    e) make 8 m+ L2 d( y. V  {' o. S
    f) make install之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持; f" }5 Q6 M5 k  u# h

' b; l9 W7 P$ k% q, g9 Y# B9 S      (此步在用sudo make install时出错,原因是环境变量和原来不同了,解决办法:sudo -i;make install)
6 `& X! _; t1 G4 U! ]6 _, P( ^  C% k" o
" c% D) p5 G; n% J$ t! a. N6 }
% c8 E- w; R$ D7 g, R  e8 O
, {5 o; ^. m3 V  _* b5) 编译arm版本的mysql 2 H9 v4 V+ W$ u
    a) tar zxvf mysql-5.1.51.tar.gz
+ d; V1 j. b/ Z* E9 W* w  J2 Y# i" {# R, M
    b) cd mysql-5.1.51
# S" P- C6 m8 j7 x1 I9 c    c) 修改配置文件:打开configure,可以使用gedit configure 分别在第26453行、 48175行、 48282行、 48485行附近有类似代码: / p  w0 }+ d+ j9 m+ L& r: {
        if test "$cross_compiling" = yes; then 9 S( D! ]1 M4 H4 i
        { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ l9 Y) E- Y0 e        { { $as_echo "$as_me:$LINENO: error: cannot run test program while cross % F3 |9 @8 k: I7 l( I3 u
: [& E! S4 k( d( {# v9 k! R' |; H) A
        compiling See \`config.log' for more details." >&5
) s: M, ?7 c6 p3 u& i; P+ V# ]  n# |% N) }1 X4 A* M0 Z9 r7 r
        $as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;}
: ~4 m- ]! V; z- I        { (exit 1); exit 1; }; }; } ( T* o$ r; d/ ]
9 M4 c( f: E. r! _" G5 c0 \' l6 g
        Else " s) L7 ]# G, D9 P2 e3 E4 [. s! p* U

0 B) u2 C5 p) A, ?  h2 n& {( s        将这些代码改为: ; Z+ S$ p) B4 m- g
        if test "$cross_compiling" = yes;  then
# Q" |& m, v5 Z" {, V: s
6 Z  k1 ]% X( @0 X" T  @/ }        echo “skip …..!”
2 q; @/ C+ i& X  }
+ y* ]4 ]3 K+ o: ?        #{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 #$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
1 ^2 `6 z/ u8 H% j( L4 s        #{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5
# D3 S. R% {  J( P        #$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} - V* \. b7 D+ Z3 {/ B  ?
        #{ (exit 1); exit 1; }; }; } + h$ j# ]- Y$ c! ]8 Z
5 V  V" F& ^0 M9 D
        Else . m& _7 ]9 F' w: A- ]
' q  E0 i- |! y& G( W* O9 {
        一定注意,这样的代码有4部分,要全部改掉。
5 P4 d- c- p% ?8 Z) v0 J    d) 配置,直接套用了人家的配置方式:
* q" I) y% c0 \( r  P4 a4 V
; F& y  N5 P* a% V9 W      ./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
# {  j, F6 ?' j( g
' v3 w$ J8 M9 z# C' ?% ?    e) 修改opt/mysql-5.1.51/sql/sql_parse.cc:在5646行之前添加#define STACK_DIRECTION 1
8 N6 u( Z, z  n) e; J% b        如果不修改该语句,则会出现如下错误:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏变量STACK_DIRECTION没有定义初值,arm中定义STACK_DIRECTION为1。
/ v, T/ b$ |% `- h% y        注意:这里的“#define STACK_DIRECTION 1”一句,不能随便加在sql_parse.cc的开头处,而应该根据出错信息的提示添加在相应的行上,我所遇到的行号和别人文档上所遇到的行号并不相同。
; y8 `9 S, P# v8 Y    f) 复制PC版本的gen_lex_hash文件到当前文件夹:
- C0 D: D' g/ e5 b7 q0 k3 @" C) @$ }' G6 l: E6 c3 a2 [; n" R, i
       cp  /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/ - Z% U' _! q% @  f* H0 A4 M
! h# U$ f; C% [& V
       touch –m sql/gen_lex_hash  
; ^# a8 U, L; R       cp  /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/ % ^0 n# g2 ]1 G  O% D
! u! r- x, l- X9 H. A7 P* [
       touch –m sql/ lex_hash.h / k8 ^5 ~& l0 t; ^
       否则会出现错误:
& ?+ H% |% i- f! d       make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t % r8 X$ D, O; G0 d: r
       /bin/sh: ./gen_lex_hash: cannot execute binary file 因为arm版的无法在pc上运行。0 a6 q1 W0 O' m

' U/ Q. ?- D5 P6 [$ l. R' ~       注意:别人的文档上说只要拷贝gen_lex_hash即可,但我试了好多次,都仍然会出现上面的报错信息,把lex_hash.h也拷贝过来后,就不再报错了。另外,touch一定要做,原因就是让编译器不要再编译覆盖拷贝过来的文件了。: w: {) T+ F1 n  C# I" b$ ?% n

+ P% t. c& N: |' \/ W) T   g) Make $ M, Z2 \# P! ^) \

' S. b+ n& d* \9 ~5 X, y   h) Make install
1 H/ s% S' R( {  T' ?" I4 g; y5 }7 f( i4 h+ o  O& K
, I  ~: m1 M0 Y( B% O9 Q  Q
6) 移植相应文件到ARM平台 6 ?' J* R" `' \4 X3 {- `
   a) 拷贝pc的/usr/local/mysql到开发板的相同目录 1 I6 k7 F: `$ ]9 A! ^
       我使用了nfs调试,所以需要使用如下指令:
9 j8 R; i- C9 Q5 m       cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql  
7 i, n$ w! F- ~& T! @. o2 U   b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里: 6 D. i* B8 g' i; M- a" x# W
       tar –zcvf mysql-arm-5.1.51.tar.gz mysql
4 T% c* ]6 F4 f" D! @   c) 到源码中拷贝配置文件模版  Copies files from one location to another. 配置文件模版)
/ s: w- x; W( e  s' I; A3 [* X0 l
( m# L! E  E" s) k: o( e3 _: l0 c       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 ?# T+ {+ d7 D6 u) w5 k8 ?) V

* A8 [, u; B( [' I8 t+ q7 O       数据目录是在:/var/lib/mysql (默认)$ \4 S8 v3 V. Y6 ]/ c% `
; s) X' X- C$ f$ Y
       安装目录是在:/usr/local/mysql (默认)4 v3 o+ O$ c$ ]' A( W. n7 o
       试图反注释了关于InnoDB的一些配置,其它没有动。但是修改了这些设置后,报错,于是又改了回来。 7 M; n. J/ R- V- m% n& o
    d) 运行mysql_install_db(参见手册的2.13. Post-Installation Setup and Testing)
' J  Y: P7 a' L7 g7 T+ \& W       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自动认为可能在该操作系统中的运行会不兼容,有两种办法解决:
& h. c1 h- c7 g/ b         第一种,运行hostname fedora14,就是欺骗一下hostname;
+ j3 H: V# t4 ~( [, m4 u  n5 Z4 d9 A2 i+ I, g
         第二种,运行mysql_install_db -u root –force 4 j4 H2 f( V. J; C
# _5 e2 _; c! G0 c& f5 L
         我使用了第二种方式: bin/mysql_install_db --user=root --force --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var/lib/mysql (我修改了datadir的路径) 1 n& v/ Q; J# g. e  I4 ^
         中间出现过一次错误:150713 21:06:39 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'innodb_data_home_dir=/usr/local/mysql/var/',查明原因是my.cnf中反注释了和InnoDB相关的配置。
- {1 }: ^2 C" U( r# H4 M. o" L    e) 手动建立mysqld/mysqld.pid,手工建立: (这一步不需要,制定到/tmp/mysqld.pid就行)
* Z& N% Y1 |! m8 ~- _        mkdir /usr/local/mysql/var/run/mysqld ' L3 m4 O. u3 W
        touch /usr/local/mysql/var/run/mysqld/mysqld.pid
2 t. n& k  _) t* [/ A1 K# n        这一步不知道是不是必须的。但我这样做了。(不需要)3 q; {' r1 _+ k, J: \+ N
+ Q* V. ?3 k; p5 G) m1 `/ W9 u: t
    f) 到源码中拷贝启动文件
& I! l& I! N9 b$ v$ P6 R! V        cp /opt/mysql-5.1.51/support-files/mysql.server /opt/EmbedSky/root_nfs/etc/init.d/mysqld 5 |3 l: ]2 S0 M2 U) z8 A

# S: A! X# T% }" D& s- W: M       修改该mysqld ) f4 {$ c6 `5 [# ?; v; X$ k
" x$ e- e; c' t2 D( v  w
       详见手册中4.3.1. mysqld — The MySQL Server的叙述 7 e" S- [7 F5 d' I8 V
       加上了basedir和datadir,2 Z! Y2 e7 L1 i# C
/ Q" ]7 f1 g. l+ ^8 k0 q( Y5 g
       还有pid-file=/tmp/mysqld.pid 7 [/ G1 G9 j3 C3 ]
+ Q# @$ P8 m2 P/ J- j
       还有service-pid-file=/tmp/mysqld.pid 5 x) |6 ?8 c% u

8 `& R# c# g. e2 J* c* u       修改完后,要给新的mysqld附以足够的权限: Chmod +x mysqld
) F$ u) f; c9 f% F: p' |8 `    g) 在开发板开启MySQL服务
5 ?  n; @1 j  J- H% W% S       开发板不支持service指令,所以service mysql start无效。
' t# J: C! f: V, D  @) V! h5 k2 A6 y* Z$ k0 {7 Q/ t
       采用的方法是运行./etc/init.d/mysqld start
1 N& l! i/ F0 l       但最初运行该指令后出现下面的错误:
4 j/ j9 Z/ F/ x+ V: E$ a2 ~/ F       Starting MySQL... ERROR! Manager of pid-file quit without updating file.
7 p% K3 @* l: y$ L5 {3 V. h       困扰我好久,到开发板目录/var/lib/mysql下查阅错误日志文件[hostname].err,在我的系统中该错误日志文件为EmbedSky.err,从中看到下面的记录:
& B+ ?2 p7 a7 ]6 P, E6 t      150713 21:04:49 [ERROR] Fatal error: Can't change to run as user 'mysql' ;  Please check that the user exists!
3 v8 ^" U6 n# n& E      可能的原因是:在arm的linux上无法执行groupadd mysql,因此需要采用如下方法解决该问题: cd /usr/local/mysql/var/lib/mysql
" l; {' w) C) a' J      ls –la可以看到里面的属性中没有mysql,于是使用下面的命令: adduser mysql
4 l1 U1 z  O& T! f4 v+ i! e. I/ L4 N      chown mysql:mysql -R /var/lib/mysql ! m3 {8 s& A$ }, `
      然后开启mysql服务,还是出现了ERROR! Manager of pid-file quit without updating file.又查看EmbedSky.err日志,其中多了一条: $ f4 i2 t$ `+ s
      150714  2:48:04 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
  j% @$ z# c# C2 u  V      150714  2:48:04 [ERROR] Do you already have another mysqld server running on port: 3306 ?
9 p' `! B/ P6 p5 \% k. z8 U; [      很显然是因为已经有mysql的进程尝试打开3306端口,因此就被占用了,需要杀进程,索性重启开发板,然后运行./etc/init.d/mysqld start,可以完美打开。
7 N5 e6 W) V$ ~* k
- J/ g0 \5 @, o6 M) G, G1 F: `* T, k& O  (我使用的时候,还有另外的一个问题,由于客户端和服务器都要访问/tmp目录,所以每次开机都要chmod 777 /tmp  ,以便于都能访问). K7 t9 a0 U0 f/ j
    h) 设置软连接使mysql,  mysqldump,  mysqladmin这三个命令能在开发板的shell中直接运行 ' e1 B- G% Q9 `- w' q2 [" d3 f
       ln -s /usr/local/mysql/bin/mysql /usr/bin
7 g" P3 ]0 _0 u! u$ S       ln -s /usr/local/mysql/bin/mysqldump /usr/bin 7 x; u2 f1 I* l1 o( H

4 g% h$ Q& K6 [# @+ I2 l       ln -s /usr/local/mysql/bin/mysqladmin /usr/bin7 E, ~4 I" y! i/ s. T# [

* O( t8 N* i" i$ s, @       其他的还有:链接库文件/ Q6 v0 _& D# ]1 u) H

& \; ~+ g8 Y& C! P" V& i       ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /lib1 Z0 }" _& s$ L$ Q3 y
& f- \  v5 J( L
7) 测试ARM平台下的MySQL
$ ^: ^# H+ g3 Z    a) mysqladmin -u  root   password   hahaha 最后一项为我的密码   (设置密码)
) K% g3 l" T4 L0 Y% g9 z; y; ^' A- n: _4 G' G8 u3 P) \' A1 r
    b) mysql -h  127.0.0.1  -u root  -p 或mysql -h  localhost  -u root  -p 这样便可以进入mysql环境。 * k) y. s' _0 g( z

6 C# F, k8 g% `: s    c) mysql>show databases;
5 O9 a: }3 [. a- ^9 z
& r1 e7 T! @$ s: a$ R        mysql>create databases at91;0 {# _7 Y; ?/ u0 i8 k& r3 w2 A' F) u

/ D5 `/ Y/ I+ W' z& P        mysql>use at91;
/ R* N1 D! h0 P3 ?3 v+ [  G( ~- |5 R
        mysql>create table node (id int(5) auto_increment not null primary key, node_ID char (40), param_ID_values varchar(900));! ]0 I/ W4 U$ w9 F7 H- ^7 ?0 a+ [" L
! ~) _- R3 b, d) k- P4 J
  • 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 21:00 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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