最近想了一个可以跑在树莓派上的新坑,其实也可以跑在别的地方啦,不过既然都买了新的 Raspberry Pi 4 的话,就拿着折腾一下吧(◐‿◑)。
然后这个新坑我计划需要用到 NoSQL 数据库,最后决定选择 MongoDB。 Raspbian 上虽然有自带的 MongoDB,但是已经相当久远了,还停留在 MongoDB 2.4 版本。
emmmmm,为了确保这个项目以后不会经常因为 MongoDB 的版本更新做改动,那就尽量用最新的 MongoDB 版本吧。于是就要在 Raspberry Pi 上开始漫长的编译啦( ;´Д`)
在写这篇 post 时,我的 Raspbian 系统版本如下
$ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 10 (buster)" NAME="Raspbian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
前期准备工作的时间并不算长,但是编译的时间大概就得好几个小时了∑(゚Д゚)不过编译的时候正好摸鱼hhhhhhh
简单来说就是以上 4 步啦~
1. apt 安装依赖
sudo apt-get install -y scons libssl-dev python3 python3-pip libffi-dev libcurl4-openssl-dev cmake wget
scons
是 MongoDB 构建时使用的工具,可以自动分析源代码间的依赖,而且支持多种语言。还有很多不错的特性,可以参考它的官网~https://scons.org
2. pip3 安装依赖
这里直接参考了 MongoDB 在 GitHub 上的 compile-requirements.txt
,https://github.com/mongodb/mongo/blob/r4.3.0/etc/pip/compile-requirements.txt
不过这个 compile-requirements.txt
里面是引用了别的几个 requirements.txt
,于是这里就综合了一下
Cheetah3 # src/mongo/base/generate_error_codes.py psutil pymongo >= 3.0, != 3.6.0 # See PYTHON-1434, SERVER-34820 PyYAML >= 3.0.0 regex requests >= 2.0.0 typing >= 3.6.4
可以将上面的内容复制粘贴到 build-requirements.txt
里,随后用 pip3 安装即可
sudo pip3 install -r ./build-requirements.txt
在国内的话,可以指定使用清华大学 TUNA 镜像源
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r ./build-requirements.txt
3. 编译安装 Mongo C Driver
Mongo C Driver 的一个可选依赖是 snappy,Google 家的一个压缩库,编译安装 snappy 大概只要几分钟,于是就加上吧
3.1 编译安装 snappy
snappy 的源代码在其 GitHub Release 页面下载,https://github.com/google/snappy/releases
在写本文的时候,snappy 最新的 release 是在 17 年 8 月 25 号发布的 1.1.7,于是下载地址就是 https://github.com/google/snappy/archive/1.1.7.tar.gz
SSH 到树莓派上执行如下命令即可~
export SNAPPY_VER=1.1.7 wget https://github.com/google/snappy/archive/\${SNAPPY_VER}.tar.gz -O snappy-\${SNAPPY_VER}.tar.gz tar xzf snappy-\${SNAPPY_VER}.tar.gz cd snappy-\${SNAPPY_VER} mkdir build && cd build cmake -DBUILD_SHARED_LIBS=ON .. && make -j`nproc` && sudo make install
这里 cmake 的参数里定义了 BUILD_SHARED_LIBS
,因为 Mongo C Driver 是动态链接到 libsnappy 的,只编译 snappy 的静态库的话,则会出现报错
3.2 编译安装 Mongo C Driver
Mongo C Driver 的源代码也是在它的 GitHub Release 页面上,https://github.com/mongodb/mongo-c-driver/releases
在写这篇 post 的时候最新版本是 19 年 11 月 7 号发布的 1.15.2,下载链接则是 https://github.com/mongodb/mongo-c-driver/releases/download/1.15.2/mongo-c-driver-1.15.2.tar.gz
编译安装 Mongo C Driver 也很简单,还是老套路
export MONGO_C_VER=1.15.2 wget https://github.com/mongodb/mongo-c-driver/releases/download/\${MONGO_C_VER}/mongo-c-driver-\${MONGO_C_VER}.tar.gz -O mongo-c-driver-\${MONGO_C_VER}.tar.gz tar xzf mongo-c-driver-\${MONGO_C_VER}.tar.gz cd mongo-c-driver-\${MONGO_C_VER} mkdir release && cd release cmake .. && make -j`nproc` && sudo make install
4. 编译安装 MongoDB Embedded
MongoDB 的源代码则是在它的官网上下载,https://www.mongodb.com/download-center/community。在页面右侧会有一个 Download Source (tgz)
,下载到 Raspberry Pi 上即可~
截止这篇 post 写作的时候,MongoDB 在其官网上最新的版本是 4.2.1~于是
export MONGODB_VER=4.2.1 wget https://fastdl.mongodb.org/src/mongodb-src-r\${MONGODB_VER}.tar.gz -O mongodb-src-r${MONGODB_VER}.tar.gz tar xzf mongodb-src-r\${MONGODB_VER}.tar.gz cd mongodb-src-r\${MONGODB_VER}
不过 r4.2.1
似乎有一处类型转换的问题,因为我在使用 GCC 8.3.0 编译时会有一处报错
所以需要在开始编译前,先修改一下对应文件 src/mongo/util/net/ssl_manager.cpp
在这个文件的 941 行,加上强制转换(高亮部分)即可解决
if (mongoUnsignedAddOverflow64(tagAndLengthByteCount, derLength, (long unsigned int*)outLength)) || *outLength > cdr.length()) { return Status(ErrorCodes::InvalidSSLConfiguration, "Invalid DER length"); }
修改好文件之后就可以正常编译啦♪(´ε` )
./buildscripts/scons.py --link-model=dynamic \ --install-mode=hygienic \ --disable-warnings-as-errors \ --enable-free-mon=off \ --js-engine=none \ --dbg=off \ --wiredtiger=off \ --use-system-mongo-c=on \ --allocator=system \ --release=RELEASE \ CPPPATH="/usr/local/include/libbson-1.0 /usr/local/include/libmongoc-1.0" \ LIBPATH="/usr/local/lib" \ CCFLAGS="-mabi=aapcs-linux -march=armv8-a+crc+simd" \ install-embedded-{dev,test} -j`nproc`
编译成功之后,接下来就是安装 MongoDB Embedded
cd build/install sudo cp -R * /usr/local
最后就可以使用 MongoDB Embedded 了~
mkdir -p \${HOME}/mongodb mongoed --dbpath=\${HOME}/mongodb
感谢分享~
只是按照你的步骤做下来,最后提示“scons: done building targets”
也复制到 /usr/local/bin 里面了
但是在 bin 里面只有 cheetah cheetah-analyze cheetah-compile mongoc_embedded_test mongoc-stat mongo_embedded_test
没有 mongoed.. 提示 -bash: mongoed:未找到命令 (ㆁ_ㆁ)