非管理员用户安装 mongodb

  1. 背景

    需求是在服务器上安装mongodb,但是没有sudo权限,只能在自己的用户目录下安装,碰到了很多坑,记录一下。

  2. 下载

    直接在官网选择tar包下载后解压,此时如果直接运行,报错为找不到相关 .so 包,如

     ./mongodb-linux-x86_64-ubuntu1804-4.2.2/bin/mongos: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
    
  3. 安装相关依赖

    此时服务器上缺少相关依赖,如果是sudo用户,可以直接用 apt-get 安装 libxxx 即可,但现在没有sudo权限,怎么办呢?

  4. glibc

    所有东西都装完了,这时候运行发现如下问题

     ./mongodb-linux-x86_64-ubuntu1804-4.2.2/bin/mongos: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/xxx/libcrypto.so.1.1)
    

    机器上的GLIBC版本太老,只能重新下载编译一个 在https://ftp.gnu.org/gnu/glibc/下载新版本,编译安装之后,把新的libc.so.6所在目录加入LD_LIBRARY_PATH中,又发现新的问题,此时不管运行哪个程序,都会有如下错误

     $ ls
     Segmentation fault (core dumped)
    

    别慌,先把LD_LIBRARY_PATH路径改回之前路径,让普通程序恢复正常

  5. 修改程序使用的 ld-linux

    程序使用的li-linux.so在编译是路径被写死,与新编译的glibc不匹配,如何修改呢?我们可以使用patchelf,安装在此 使用方法在此

    那么我们直接修改mongodb的二进制文件

     ./patchelf-0.10/src/patchelf --set-interpreter lib/ld-linux-x86-64.so.2 ./mongodb-linux-x86_64-ubuntu1804-4.2.2/bin/mongod
    

    修改后,再把LD_LIBRARY_PATH的值改为加入新的glibc的路径,发现终于可以正常运行

    但我们其他程序没法运行了怎么办呢?

    先把LD_LIBRARY_PATH改为空,新写一个mongo的启动脚本,内容为:

     LD_LIBRARY_PATH='/home/xxx/.linuxbrew/lib:/home/xxx/uploadlib:/home/xxx/glibc/lib:/lib/x86_64-linux-gnu/:/usr/lib/x86_64-linux-gnu' ./mongodb-linux-x86_64-ubuntu1804-4.2.2/bin/mongod --dbpath=xxx
    

    此时,运行该脚本,程序正常启动