aarch64 arm上交叉编译mysql-2.7.35

本文详细介绍了如何在x86环境下交叉编译MySQL 5.7.35以适应ARM架构,包括编译ncurses、openssl以及MySQL本身。在编译过程中,对CMakeLists.txt和相关文件进行了必要的修改以适应交叉编译,并解决了编译过程中遇到的错误。最终,将编译结果移植到ARM设备上,并配置了my.cnf以供服务运行。
摘要由CSDN通过智能技术生成

1、准备相应源码

mysql-boost-5.7.35.tar.gz

openssl-1.1.1k.tar.gz

ncurses-6.1.tar.gz

2、编译curses-6.1和openssl-1.1.1k

(1)编译ncurses-6.1

tar xf ncurses-6.1.tar.gz
cd ncurses-6.1
mkdir _install
./configure --host=aarch64-ax630-linux-gnu --prefix=$(pwd)/_install --without-progs CC=aarch64-ax630-linux-gnu-gcc CXX=aarch64-ax630-linux-gnu-g++
make 
make install

(2)编译openssl-1.1.1k

tar xf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
mkdir _install
./config no-asm shared --prefix=$(pwd)/_install --openssldir=$(pwd)/_install
修改Makefile:
CROSS_COMPILE= aarch64-himix100-linux-
删除两处 -m64
make 
make install

3、编译mysql-boost-5.7.35.tar.gz

tar xf mysql-boost-5.7.35.tar.gz
cd mysql-boost-5.7.35

(1)编译PC版mysql


mkdir build_x86
cd build_x86
cmake ../ -DCMAKE_INSTALL_PREFIX=/mnt/database/mysql \
    -DMYSQL_DATADIR=/mnt/database/mysql/data \
    -DWITH_BOOST=/home/he_liangbin/gitlab-ax630/mysql/mysql-5.7.35/boost/boost_1_59_0 \
    -DSYSCONFDIR=/etc/ \
    -DEFAULT_CHARSET=utf8mb4 \
    -DDEFAULT_COLLATION=utf8mb4_general_ci \
    -DENABLED_LOCAL_INFILE=1
   

注:WITH_BOOST为解压后boost的路劲

编译PC版目的,为了产生:
extra/comp_err
scripts/comp_sql
sql/gen_lex_hash
sql/gen_lex_token
extra/protobuf/protoc
libmysql/libmysql_api_test
这6 个文件在编译 arm 版本时需要用到

(2)编译ARM版mysql
A. 修改根目录下的CMakeLists.txt,在文件开始处添加arm交叉编译信息:
 

IF(1)
    # this is required
    SET(CMAKE_SYSTEM_NAME Linux)
    SET(CMAKE_CROSSCOMPILING TRUE)
  
    # specify the cross compiler
    SET(CMAKE_C_COMPILER_WORKS 1)
    SET(CMAKE_CXX_COMPILER_WORKS 1)
    SET(CMAKE_C_COMPILER "aarch64-ax630-linux-gnu-gcc")
    SET(CMAKE_CXX_COMPILER "aarch64-ax630-linux-gnu-g++")

    # where is the target environment 
    SET(CMAKE_FIND_ROOT_PATH  "/opt/arm64/ax630-linaro-7.5.0-2019.12-aarch64-linux-gnu/aarch64-linux-gnu/libc")
    #SET(CMAKE_FIND_ROOT_PATH  "/opt/arm64/ax630-linaro-7.5.0-2019.12-aarch64-linux-gnu")

    # search for programs in the build host directories (not necessary)
    SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    # for libraries and headers in the target directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

    SET(STACK_DIRECTION 1)
    SET(CMAKE_SYSTEM_PROCESSOR arm)
    SET(CMAKE_SYSTEM_VERSION 1)
    SET(CMAKE_CROSSCOMPILING 1)
    
    # configure Boost
    SET(BOOST_INCLUDE_DIR /home/he_liangbin/gitlab-ax630/mysql/mysql-5.7.35/boost/boost_1_59_0)
    SET(LOCAL_BOOST_DIR /home/he_liangbin/gitlab-ax630/mysql/mysql-5.7.35/boost/boost_1_59_0)

    # openssl configuration
    SET(OPENSSL_INCLUDE_DIR /home/he_liangbin/gitlab-ax630/mysql/openssl-1.1.1k/_install/include)
    SET(OPENSSL_LIBRARY /home/he_liangbin/gitlab-ax630/mysql/openssl-1.1.1k/_install/lib/libssl.so)
    SET(CRYPTO_LIBRARY /home/he_liangbin/gitlab-ax630/mysql/openssl-1.1.1k/_install/lib/libcrypto.so)

    SET(CMAKE_CXX_LINK_FLAGS "-L/home/he_liangbin/gitlab-ax630/mysql/openssl-1.1.1k/_install/lib -lssl -lcrypto")

ENDIF()

B. 修改cmake目录下的libevent.cmake: 

MACRO(FIND_LIBEVENT_VERSION)
    IF(0)
        SET(TEST_SRC
            "#include <event.h>
            #include <stdio.h>
            int main()
            {
            fprintf(stdout, \"%s\", LIBEVENT_VERSION);
            }
            "
            )
        FILE(WRITE
            "${CMAKE_BINARY_DIR}/find_libevent_version.c"
            "${TEST_SRC}"
            )
        TRY_RUN(TEST_RUN_RESULT COMPILE_TEST_RESULT
            ${CMAKE_BINARY_DIR}
            "${CMAKE_BINARY_DIR}/find_libevent_version.c"
            CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${LIBEVENT_INCLUDE_DIRS}"
            COMPILE_OUTPUT_VARIABLE OUTPUT
            RUN_OUTPUT_VARIABLE RUN_OUTPUT
            )
    ELSE()
        SET(LIBEVENT_VERSION "2.1.11-stable")
        SET(COMPILE_TEST_RESULT TRUE)
        SET(RUN_OUTPUT "2.1.11-stable") 
    ENDIF()

  # MESSAGE(STATUS "TRY_EVENT TEST_RUN_RESULT is ${TEST_RUN_RESULT}")
  # MESSAGE(STATUS "TRY_EVENT COMPILE_TEST_RESULT is ${COMPILE_TEST_RESULT}")
  # MESSAGE(STATUS "TRY_EVENT COMPILE_OUTPUT_VARIABLE is ${OUTPUT}")
  # MESSAGE(STATUS "TRY_EVENT RUN_OUTPUT_VARIABLE is ${RUN_OUTPUT}")

 创建arm编译目录及编译:

mkdir build_arm
cd build_arm
cmake ../ -DCMAKE_INSTALL_PREFIX=/mnt/database/mysql \
    -DMYSQL_DATADIR=/mnt/database/mysql/data \
    -DWITH_BOOST=/home/he_liangbin/gitlab-ax630/mysql/mysql-5.7.35/boost/boost_1_59_0 \
    -DSYSCONFDIR=/etc/ \
    -DEFAULT_CHARSET=utf8mb4 \
    -DDEFAULT_COLLATION=utf8mb4_general_ci \
    -DENABLED_LOCAL_INFILE=1 \
    -DCURSES_INCLUDE_PATH=/home/he_liangbin/gitlab-ax630/mysql/ncurses-6.1/_install/include \
    -DCURSES_LIBRARY=/home/he_liangbin/gitlab-ax630/mysql/ncurses-6.1/_install/lib/libncurses.so \
    -DWITH_LIBEVENT="bundled"

make

make之后会产生一系列错误,解决方法如下:
错误一解决办法
/bin/sh: comp_err / gen_lex_hash / gen_lex_token / comp_sql: not found

cp ../build_x86/extra/comp_err ~/bin/
cp ../build_x86/sql/gen_lex_hash ~/bin/
cp ../build_x86/sql/gen_lex_token ~/bin/
cp ../build_x86/scripts/comp_sql ../scripts/
cp ../build_x86/scripts/comp_sql ~/bin/
cp ../build_x86/extra/protobuf/protoc ~/bin/

注:~/bin 已经添加到PATH目录,如果不是这个目录,需要导出坏境。

错误二解决办法:

/bin/sh: ./libmysql_api_test: cannot execute binary file: 
cp ../build_x86/libmysql/libmysql_api_test libmysql/

错误三解决方方法
mysql-5.7.35/storage/innobase/include/os0atomic.ic:230:2: error: #error "Unsupported platform"
修改storage/innobase/include/os0atomic.ic

line 198:

#elif defined(IB_STRONG_MEMORY_MODEL)
************ to ***************
#elif defined(IB_STRONG_MEMORY_MODEL) || defined (HAVE_ATOMIC_BUILTINS)

修改storage/innobase/include/os0atomic.h
line 64:

#if defined __i386__ || defined __x86_64__ || defined _M_IX86 \
    || defined _M_X64 || defined __WIN__

#define IB_STRONG_MEMORY_MODEL
#endif

************ to ***************

#if defined __i386__ || defined __x86_64__ || defined _M_IX86 \
    || defined _M_X64 || defined __WIN__

#define IB_STRONG_MEMORY_MODEL

#else

#define HAVE_ATOMIC_BUILTINS

#endif

line 265:

# ifdef HAVE_IB_ATOMIC_PTHREAD_T_GCC
#if defined(HAVE_GCC_SYNC_BUILTINS)
#  define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
    os_compare_and_swap(ptr, old_val, new_val)
#else

************ to ***************


# ifdef HAVE_ATOMIC_BUILTINS
#if defined(HAVE_ATOMIC_BUILTINS)
#  define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
    os_compare_and_swap(ptr, old_val, new_val)
#else

错我修改后一般可以编译过i,编译完成后:
make install
/mnt/database目录下有最终的目标文件

4、移植到板子上测试

由于只需要跑一个mysql服务,因此不需要所有的目标文件都拷贝到板子上
(1)建立目录mysql_lite
mkdir mysql_lite, mysql_lite/bin, mysql_lite/lib
(2)拷贝文件
bin目录:my_print_defaults  mysql  mysqladmin  mysqld  mysqld_safe 
lib目录:存放ncurses/openssl的库
拷贝启动脚本:mysql.server
(3)创建配置脚本my.cnf(修改为自己路径)

[client]
port = 3306
socket =/var/mysqld/mysqld.sock
[mysqld]
user = root
port = 3306
character-set-server = utf8
#collation-server = utf8_general_ci

skip-external-locking
skip-name-resolve

basedir   = /mnt/database/mysql/
datadir   = /mnt/database/mysql/data
#tmpdir    = /mnt/database/mysql/temp
log-error = /mnt/database/mysql/logs/mysql_error.log
pid-file  = /var/mysql.pid
socket    = /var/mysqld/mysqld.sock

performance_schema_max_table_instances=50
performance_schema = off
table_definition_cache=50
table_open_cache = 64
open_files_limit = 128

back_log = 60
max_connections=64
max_connect_errors =128
wait_timeout=60580

#open_tables = 600
#table_cache = 650
#opened_tables = 630
#max_allowed_packet = 128k

sort_buffer_size = 128k
join_buffer_size = 128k
thread_cache_size = 300

query_cache_type = 1
query_cache_size = 1M
query_cache_limit = 1M
#query_cache_min_res_unit = 16k

tmp_table_size = 128k
max_heap_table_size = 128k
key_buffer_size = 128k

#read_buffer_size = 128k
#read_rnd_buffer_size = 128k

#bulk_insert_buffer_size = 128k
#lower_case_table_names=1

default-storage-engine = INNODB
innodb_buffer_pool_size = 1M
innodb_log_buffer_size = 128k
innodb_log_file_size = 128k
#innodb_flush_method = O_DIRECT
#####################
#long_query_time= 2
#slow-query-log = off
#slow-query-log-file = /mnt/database/mysql/logs/mysql-slow.log

[mysqldump]
quick
max_allowed_packet = 1M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/mysqld.pid

(4)拷贝到板子上
板子创建目录:
mkdir /mnt/database/mysql
mkdir /mnt/database/mysql/data
mkdir /mnt/database/mysql/logs
运行时依赖目录
mkdir /var/log
mkdir /var/mysqld

拷贝mysql_lite目录下的内容到/mnt/database/mysql下
拷贝my.cnf到板子/etc目录下

(5)运行
直接用 root 用户运行,不进行创建用户组,直接初始化
/mnt/database/mysql/bin/mysqld --initialize-insecure --user=root --basedir=/mnt/database/mysql --datadir=/mnt/database/mysql/data
启动服务
/mnt/database/mysql/mysql.server start
此时 mysql 能跑起来,但是用可视化工具去连接发现不让连,可能还需要配置:
/mnt/database/mysql/bin/mysql,输入内容如下:
use mysql;
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;
这样远程即可连接

5、参考网站
主要: https://zhuanlan.zhihu.com/p/341840506
主要: https://blog.csdn.net/yangxiangzhan/article/details/105059380
https://www.dazhuanlan.com/alanzxy/topics/1316346
https://blog.csdn.net/fhyocean/article/details/74960005

    

Linux ARM架构通常指基于ARM处理器的系统,比如常见的嵌入式设备、移动设备或服务器。安装`mysql-8.4.0-1.el9.aarch64.rpm-bundle.tar`这样的RPM包(Red Hat Package Manager的二进制文件)需要遵循特定步骤: 1. **检查兼容性**:首先确保你的ARM设备支持MySQL 8.4,并且操作系统版本与提供的rpm包对应。对于EL9(Enterprise Linux 9),确认它与你的设备版本匹配。 2. **获取权限**:通过`su -` 或 `sudo` 登录到root用户,因为某些操作可能需要管理员权限。 3. **提取文件**:运行命令 `tar -xvf mysql-8.4.0-1.el9.aarch64.rpm-bundle.tar` 来解压下载的rpm包,这会创建一个目录,里面包含MySQL的安装文件。 4. **安装依赖**:在开始安装之前,可能需要先安装一些依赖项。你可以通过`yum` 或 `dnf`(针对RHEL/CentOS系列)来检查并安装缺失的依赖。例如: ``` sudo yum install -y libaio-devel readline-devel openssl-devel ``` 5. **安装MySQL**:进入刚刚解压的目录,找到`mysql-community-server`或类似命名的文件,然后使用`rpm -Uvh`命令安装,例如: ``` cd <解压后的目录> sudo rpm -Uvh mysql-community-server-8.4.0-1.el9.aarch64.rpm ``` 如果有其他组件包如`mysql-community-client`, `mysql-community-plugins`等,也按照同样的方法安装。 6. **配置和启动服务**:安装完成后,根据需求配置my.cnf文件,然后启动服务: ``` sudo mysql_secure_installation sudo systemctl start mysqld sudo systemctl enable mysqld ``` 7. **验证安装**:最后,可以使用`mysql -u root -p`登录数据库,查看是否成功安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值