最近需要在pxa270的嵌入式平台上資料庫進行通信信息管理,在網上一查才知道mysql 根本很少用於嵌入式環境!搜索有沒有mysql在arm平台移植的相關文章,幾乎找不到相關資料。沒辦法,只能硬著頭皮自己動手了。幸好經過一番努力,終於克服了所有障礙,讓mysql在270板子上跑了起來!而且簡單的測試也都收到了預期的效果。

現在將mysql 的arm+linux移植經驗出來,希望對以後做相關方面工作的人有所幫助.首先是要從網上獲取mysql的源碼包


以下分幾個階段來介紹:
一: configure
解開包以後得到文件夾mysql-5.0.22我將其改名為mysql-pc,進入目錄後,首先要做configure 來生成交叉編譯的Makefile文件,編譯的時候一般configure是都能通過的但我用./configure --host=arm-none-linux-gnueabi來生成Makefile時卻出現了多個錯誤,如下:
1)  return type of sprintf : error: cannot run test program while cross compiling
檢查configure腳本,發現腳本在檢測到在做cross-compile時就提示以上錯誤並退出,說明至少是這個版本的mysql並不支持交叉編譯,但我用了最新的版本試了也還是有同樣的錯誤,基本可以肯定mysql還沒有支持交叉編譯的版本出現.但為了讓編譯繼續,我在configure腳本中將多處這樣的命令全都註釋掉以讓configure通過.

2)  error: Your compiler cannot convert a longlong value to a float!
這個問題在較低版本的mysql中是一個bug,但5.0的版本已經修復了這個問題,有可能是交叉編譯器的問題,找不到解決的方法,這裡我也將它註釋屏蔽了.

3) error: No curses/termcap library found
缺少curses和termcap的庫,反覆安裝了各種相關的軟件包,還是解決不了這個問題,最後是在configure的參數里直接指定了安裝的ncurses-5.6下的libncurses.a庫根據我的路徑參數設置如下:
--with-named-curses-libs=/home/huaming/mysql/ncurses-arm-d501/lib/libncurses.a
(這裡要注意的是ncurses的安裝也要採用交叉編譯的方式在pc上裝好,否則後面做make的時候編譯器會指出libncurses.a的格式不對)


經過反覆嘗試最後使用的參數如下:
./configure --host=arm-none-linux-gnueabi --with-named-curses-libs=/home/huaming/mysql/ncurses-arm-270/lib/libncurses.a --prefix=/home/huaming/mysql/mysql_arm_270 --without-debug --without-docs --without-man --without-bench --with-extra-charset=big5


二: make
這一步遇到的問題最難解決:
1)  ../extra/comp_err: ../extra/comp_err: cannot execute binary file
編譯過程中要運行comp_err命令,但這個命令是arm格式的在pc機上運行不起來,解決方法是要編譯好一個在pc上運行的mysql,從相應的目錄下拷出comp_err命令覆蓋extra下的這個arm格式的comp_err命令(這裡要注意的是這個pc機上運行的mysql編譯路徑要和現在這個arm上運行的mysql路徑完全相同,否則後面同樣的問題中執行命令時涉及到路徑問題,解決辦法是先把現在編譯的mysql-pc目錄改為其他名稱,再解一個mysql包改名為mysql-pc將其編譯成pc上運行的版本,只要簡單的用./configure |make就行了,再把現在這個mysql-pc改為別的名稱,將原來的那個名稱改回mysql-pc)

2) /home/huaming/mysql/mysql-pc/sql 目錄下出現:
./gen_lex_hash: cannot execute binary file
原因和解決方法基本和上面遇到的問題相同,但這裡還要加一命令:
touch –m sql/gen_lex_hash
上面的命令是改變gen_lex_hash的最後修改時間,這樣做的目的是告訴編譯器gen_lex_hash已經是最新的了,不要重新生成它,否則編譯器檢查gen_lex_hash和它的依賴文件的最後修改時間會發現gen_lex_hash比它的依賴文件更舊,就會重新交叉編譯生成它,這樣不管我們做幾次覆蓋的工作錯誤都還會再現.

3)還是在sql這個目錄下出現了類似如下的錯誤:
gen_lex_hash.o: could not read symbols: File in wrong format或
./gen_lex_hash > lex_hash.h
g++: ../zlib/.libs/libz.so: No such file or directory
經過對Makefile文件的觀察,發現這些錯誤都是在生成lex_hash.h文件的時候產生的,所以直接從pc上運行的版本中拷貝這個文件到此目錄下,同樣要執行touch –m lex_hash.h
否則會陷入一個循環的需要arm上運行的文件和pc上運行的文件的錯誤中出不來.
Make 的過程總結起來主要就是以上幾個錯誤,但我的configure參數中已經去掉了幾個模塊的編譯,如果不去掉這幾個模塊還會有更多錯誤出現.


三: make install
這一步很順利,在指定的目錄下生成了可以移植的文件,但進入這個目錄的bin目錄下可以看到這裡有一個comp_err命令,用file命令可以看出這個命令就是前面拷進來的在pc上運行的命令,移植到arm的板子上還要把arm版的comp_err命令重新拷回來覆蓋它,如果前面沒有備份arm版的這個命令,可以進入extra目錄,運行make clean | make 出現上面提到的錯誤停止的時候就可以把裡面的arm版的comp_err命令拷出來了.


四:移植
將install產生的文件夾整個拷貝到板子上,這一步要注意的是,板子上放置mysql的路徑和pc上安裝的路徑要完全相同,比如我在pc上的安裝路徑是:/home/huaming/mysql/mysql_arm_270 則在板子上也要是同樣的目錄,此路徑上沒有的目錄可以用mkdir來建立.


在板子上啟動數據庫服務遇到的與移植有關的問題如下:
1)    使用命令:  ./mysql_install_db --user=root 執行數據庫安裝的時候出現如下警告:
WARNING: The host 'master_card' could not be looked up with resolveip.This probably means that your libc libraries are not 100 % compatible with this binary MySQL version. The MySQL daemon, mysqld, should work normally with the exception that host name resolving will not work.This means that you should use IP addresses instead of hostnames when specifying MySQL privileges !
mysql啟動的時候會檢查/etc下的hosts文件,從中查看檢測到的處理器名稱是否登記過,未登記的則有可能運行的版本與處理器不兼容,將hosts文件拷到板子上,並在裡面加入 master_card(要根據以上的出錯信息來定),這樣啟動時警告沒了,是否100%的兼容那就要看測試的結果了.

2)    還有一個與移植有關的是/etc/my.cnf文件,這個文件設置了mysql的相關文件的存放路徑,可以修改它來方便系統的管理,將這個文件也拷貝到/etc目錄下.


在板子上運行的過程中還遇到了許多其他的問題,但個人認為這些問題已經基本與移植無關,而是使用mysql數據庫的問題,問題的解決辦法可以參考pc上運行遇到同樣問題的解決辦法,這裡就不贅述了.


中文官方網址如下:
http://www.mysql.cn/
最後按照mysql中文官方網站上的參考手冊運行了一些測試命令,都收到了預期的效果,感覺很不錯!

創作者介紹

傑克鼠的下午茶

傑克鼠 發表在 痞客邦 PIXNET 留言(0) 人氣()