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

移植mysql到嵌入式ARM平台

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
移植MySQL到嵌入式ARM平台
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
  • 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:30 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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