阿里雲64位centos6.3系統上編譯安裝redis


環境

系統:阿里雲64位centos 6.3

[rao@AY~]$ cat /etc/issue
CentOS release 6.3 (Final)
Kernel \r on an \m

[rao@AY~]$ uname -a
Linux AY1404062027584053a1Z 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

 

下載最新版redis:

[rao@~Packages]$ wget http://download.redis.io/releases/redis-2.8.9.tar.gz
[rao@~Packages]$ tar zxvf redis-2.8.9.tar.gz

 

編譯redis:

[rao@~ Packages]$ tar zxvf redis-2.8.9.tar.gz
[rao@~ Packages]$ cd redis-2.8.9
[rao@~ redis-2.8.9]$ make

 

報錯:

cd src && make all
make[1]: Entering directory `/home/rao/Packages/redis-2.8.9/src'
    CC adlist.o
在包含自 /usr/include/features.h:385 的文件中,
                 從 /usr/include/stdlib.h:25,
                 從 adlist.c:32:
/usr/include/gnu/stubs.h:7:27: 錯誤:gnu/stubs-32.h:沒有那個文件或目錄
make[1]: *** [adlist.o] 錯誤 1
make[1]: Leaving directory `/home/rao/Packages/redis-2.8.9/src'
make: *** [all] 錯誤 2

 

redis的README中有說明:

In case of build errors when trying to build a 32 bit binary of Redis, try
the following steps:

* Install the packages libc6-dev-i386 (also try g++-multilib).

但是centos中並沒有libc6-dev-i386這個包,查了一下需要的頭文件在glibc-devel這個包中。

 

安裝glibc-devel:

[rao@~ Packages]$ sudo yum install glibc-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package glibc-devel.x86_64 0:2.12-1.107.el6_4.2 will be updated
---> Package glibc-devel.x86_64 0:2.12-1.132.el6 will be an update
--> Processing Dependency: glibc-headers = 2.12-1.132.el6 for package: glibc-devel-2.12-1.132.el6.x86_64
--> Processing Dependency: glibc = 2.12-1.132.el6 for package: glibc-devel-2.12-1.132.el6.x86_64
--> Running transaction check
---> Package glibc.x86_64 0:2.12-1.107.el6_4.2 will be updated
--> Processing Dependency: glibc = 2.12-1.107.el6_4.2 for package: nscd-2.12-1.107.el6_4.2.x86_64
--> Processing Dependency: glibc = 2.12-1.107.el6_4.2 for package: glibc-common-2.12-1.107.el6_4.2.x86_64
---> Package glibc.x86_64 0:2.12-1.132.el6 will be an update
---> Package glibc-headers.x86_64 0:2.12-1.107.el6_4.2 will be updated
---> Package glibc-headers.x86_64 0:2.12-1.132.el6 will be an update
--> Running transaction check
---> Package glibc-common.x86_64 0:2.12-1.107.el6_4.2 will be updated
---> Package glibc-common.x86_64 0:2.12-1.132.el6 will be an update
---> Package nscd.x86_64 0:2.12-1.107.el6_4.2 will be updated
---> Package nscd.x86_64 0:2.12-1.132.el6 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================
 Package                        Arch                    Version                           Repository             Size
======================================================================================================================
Updating:
 glibc-devel                    x86_64                  2.12-1.132.el6                    base                  978 k
Updating for dependencies:
 glibc                          x86_64                  2.12-1.132.el6                    base                  3.8 M
 glibc-common                   x86_64                  2.12-1.132.el6                    base                   14 M
 glibc-headers                  x86_64                  2.12-1.132.el6                    base                  608 k
 nscd                           x86_64                  2.12-1.132.el6                    base                  219 k

Transaction Summary
======================================================================================================================
Upgrade       5 Package(s)

Total download size: 20 M
Is this ok [y/N]: y
Downloading Packages:
(1/5): glibc-2.12-1.132.el6.x86_64.rpm                                                         | 3.8 MB     00:00     
(2/5): glibc-common-2.12-1.132.el6.x86_64.rpm                                                  |  14 MB     00:02     
(3/5): glibc-devel-2.12-1.132.el6.x86_64.rpm                                                   | 978 kB     00:00     
(4/5): glibc-headers-2.12-1.132.el6.x86_64.rpm                                                 | 608 kB     00:00     
(5/5): nscd-2.12-1.132.el6.x86_64.rpm                                                          | 219 kB     00:00     
----------------------------------------------------------------------------------------------------------------------
Total                                                                                 5.7 MB/s |  20 MB     00:03     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Updating   : glibc-common-2.12-1.132.el6.x86_64                                                                1/10 
  Updating   : glibc-2.12-1.132.el6.x86_64                                                                       2/10 
  Updating   : glibc-headers-2.12-1.132.el6.x86_64                                                               3/10 
  Updating   : glibc-devel-2.12-1.132.el6.x86_64                                                                 4/10 
  Updating   : nscd-2.12-1.132.el6.x86_64                                                                        5/10 
warning: /etc/nscd.conf created as /etc/nscd.conf.rpmnew
  Cleanup    : glibc-devel-2.12-1.107.el6_4.2.x86_64                                                             6/10 
  Cleanup    : glibc-headers-2.12-1.107.el6_4.2.x86_64                                                           7/10 
  Cleanup    : nscd-2.12-1.107.el6_4.2.x86_64                                                                    8/10 
  Cleanup    : glibc-common-2.12-1.107.el6_4.2.x86_64                                                            9/10 
  Cleanup    : glibc-2.12-1.107.el6_4.2.x86_64                                                                  10/10 
  Verifying  : glibc-2.12-1.132.el6.x86_64                                                                       1/10 
  Verifying  : glibc-devel-2.12-1.132.el6.x86_64                                                                 2/10 
  Verifying  : glibc-common-2.12-1.132.el6.x86_64                                                                3/10 
  Verifying  : nscd-2.12-1.132.el6.x86_64                                                                        4/10 
  Verifying  : glibc-headers-2.12-1.132.el6.x86_64                                                               5/10 
  Verifying  : glibc-common-2.12-1.107.el6_4.2.x86_64                                                            6/10 
  Verifying  : glibc-2.12-1.107.el6_4.2.x86_64                                                                   7/10 
  Verifying  : glibc-devel-2.12-1.107.el6_4.2.x86_64                                                             8/10 
  Verifying  : glibc-headers-2.12-1.107.el6_4.2.x86_64                                                           9/10 
  Verifying  : nscd-2.12-1.107.el6_4.2.x86_64                                                                   10/10 

Updated:
  glibc-devel.x86_64 0:2.12-1.132.el6                                                                                 

Dependency Updated:
  glibc.x86_64 0:2.12-1.132.el6     glibc-common.x86_64 0:2.12-1.132.el6     glibc-headers.x86_64 0:2.12-1.132.el6    
  nscd.x86_64 0:2.12-1.132.el6     

Complete!

 

繼續make,還是報同樣的錯誤。但是明明已經安裝了glibc-devel包啊?

[rao@~ redis-2.8.9]$ ls /usr/include/gnu/
libc-version.h  lib-names.h     stubs-64.h      stubs.h  

確實沒有所需要的頭文件“gnu/stubs-32.h”。

 

再檢查安裝glibc-devel包的過程,其安裝的包名稱是“glibc-devel-2.12-1.132.el6.x86_64.rpm”,從yum的源(http://mirrors.163.com/centos/6/os/x86_64/Packages/)中下載該rpm包,解壓察看發現:該rpm包中確實沒有頭文件“gnu/stubs-32.h”。

也就是說:通過“sudo yum install glibc-devel”命令安裝的“glibc-devel-2.12-1.132.el6.x86_64.rpm”中並不是我們需要的rpm包?

 

那么到底需要安裝哪個rpm包呢?

剛才在yum的源中,注意到存在兩個版本號相同的glibc-devel:

glibc-devel-2.12-1.132.el6.i686.rpm 25-Nov-2013 03:29 1001468
glibc-devel-2.12-1.132.el6.x86_64.rpm 25-Nov-2013 03:31 1001012

第二個就是剛才通過“sudo yum install glibc-devel”命令安裝的包,從名字看是64位系統的,那么第一個就應該是32位的。

 

下載第一個包“glibc-devel-2.12-1.132.el6.i686.rpm”,解壓看看里面有什么文件:

[rao@~ Packages]$ rpm2cpio glibc-devel-2.12-1.132.el6.i686.rpm | cpio -div
./usr/include/gnu/stubs-32.h
./usr/lib/Mcrt1.o
./usr/lib/Scrt1.o
./usr/lib/crt1.o
./usr/lib/crti.o
./usr/lib/crtn.o
./usr/lib/gcrt1.o
./usr/lib/libBrokenLocale.so
./usr/lib/libanl.so
./usr/lib/libbsd-compat.a
./usr/lib/libbsd.a
./usr/lib/libc.so
./usr/lib/libc_nonshared.a
./usr/lib/libcidn.so
./usr/lib/libcrypt.so
./usr/lib/libdl.so
./usr/lib/libg.a
./usr/lib/libieee.a
./usr/lib/libm.so
./usr/lib/libmcheck.a
./usr/lib/libnsl.so
./usr/lib/libnss_compat.so
./usr/lib/libnss_dns.so
./usr/lib/libnss_files.so
./usr/lib/libnss_hesiod.so
./usr/lib/libnss_nis.so
./usr/lib/libnss_nisplus.so
./usr/lib/libpthread.so
./usr/lib/libpthread_nonshared.a
./usr/lib/libresolv.so
./usr/lib/librpcsvc.a
./usr/lib/librt.so
./usr/lib/libthread_db.so
./usr/lib/libutil.so
./usr/share/info/libc.info-1.gz
./usr/share/info/libc.info-10.gz
./usr/share/info/libc.info-11.gz
./usr/share/info/libc.info-2.gz
./usr/share/info/libc.info-3.gz
./usr/share/info/libc.info-4.gz
./usr/share/info/libc.info-5.gz
./usr/share/info/libc.info-6.gz
./usr/share/info/libc.info-7.gz
./usr/share/info/libc.info-8.gz
./usr/share/info/libc.info-9.gz
./usr/share/info/libc.info.gz
1920

可以看到里面剛好有我們需要的頭文件“gnu/stubs-32.h”。

 

那么執行“sudo yum install glibc-devel”命令為什么安裝的是“glibc-devel-2.12-1.132.el6.x86_64.rpm”而不是我們需要的“glibc-devel-2.12-1.132.el6.i686.rpm”包呢?

 

我猜是在64位系統中,yum在安裝時發現同一個包存在兩個版本時,默認優先安裝64位的rpm包。

那該怎么讓yum安裝“glibc-devel-2.12-1.132.el6.i686.rpm”呢?

 

既然我已經下載了該包,就用rpm命令手動安裝試試看:

[rao@~ redis-2.8.9]$ sudo rpm -ivh glibc-devel-2.12-1.132.el6.i686.rpm 
error: Failed dependencies:
    libBrokenLocale.so.1 is needed by glibc-devel-2.12-1.132.el6.i686
    libanl.so.1 is needed by glibc-devel-2.12-1.132.el6.i686
    libcidn.so.1 is needed by glibc-devel-2.12-1.132.el6.i686
    libcrypt.so.1 is needed by glibc-devel-2.12-1.132.el6.i686
    libdl.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    libm.so.6 is needed by glibc-devel-2.12-1.132.el6.i686
    libnsl.so.1 is needed by glibc-devel-2.12-1.132.el6.i686
    libnss_compat.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    libnss_dns.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    libnss_files.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    libnss_hesiod.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    libnss_nis.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    libnss_nisplus.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    libresolv.so.2 is needed by glibc-devel-2.12-1.132.el6.i686
    librt.so.1 is needed by glibc-devel-2.12-1.132.el6.i686
    libthread_db.so.1 is needed by glibc-devel-2.12-1.132.el6.i686
    libutil.so.1 is needed by glibc-devel-2.12-1.132.el6.i686

看來不行,缺少一堆依賴文件。

 

網上查到可以通過"yum install glibc-devel.i686"命令安裝32位的glibc-devel:

[rao@~ redis-2.8.9]$ sudo yum install glibc-devel.i686
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
Setting up Install Process
No package glibc-devel.i686 available.
Error: Nothing to do

找不到?明明有這個包啊。。。。

 

[rao@~ redis-2.8.9]$ yum list|grep libc
glibc.x86_64                              2.12-1.132.el6                @base   
glibc-common.x86_64                       2.12-1.132.el6                @base   
glibc-devel.x86_64                        2.12-1.132.el6 @base   
glibc-headers.x86_64                      2.12-1.132.el6                @base   
libcap.x86_64                             2.16-5.5.el6                  @anaconda-CentOS-201207061011.x86_64/6.3
libcap-ng.x86_64                          0.6.4-3.el6_0.1               @anaconda-CentOS-201207061011.x86_64/6.3
libcom_err.x86_64                         1.41.12-18.el6                @base   
libcom_err-devel.x86_64                   1.41.12-18.el6                @base   
libcurl.x86_64                            7.19.7-26.el6_2.4             @anaconda-CentOS-201207061011.x86_64/6.3
compat-glibc.x86_64                       1:2.5-46.2                    base    
compat-glibc-headers.x86_64               1:2.5-46.2                    base    
compat-libcap1.x86_64                     1.10-1                        base    
glibc-static.x86_64                       2.12-1.132.el6                base    
glibc-utils.x86_64                        2.12-1.132.el6                base    
libc-client.x86_64                        2007e-11.el6                  base    
libc-client-devel.x86_64                  2007e-11.el6                  base    
libcacard.x86_64                          0.15.0-2.el6                  base    
libcacard-devel.x86_64                    0.15.0-2.el6                  base    
libcacard-tools.x86_64                    0.15.0-2.el6                  base    
libcanberra.x86_64                        0.22-1.el6.centos             base    
libcanberra-devel.x86_64                  0.22-1.el6.centos             base    
libcanberra-gtk2.x86_64                   0.22-1.el6.centos             base    
libcap-devel.x86_64                       2.16-5.5.el6                  base    
libcap-ng-devel.x86_64                    0.6.4-3.el6_0.1               base    
libcap-ng-python.x86_64                   0.6.4-3.el6_0.1               base    
libcap-ng-utils.x86_64                    0.6.4-3.el6_0.1               base    
libcdio.x86_64                            0.81-3.1.el6                  base    
libcdio-devel.x86_64                      0.81-3.1.el6                  base    
libcgroup.x86_64                          0.40.rc1-5.el6_5.1            updates 
libcgroup-devel.x86_64                    0.40.rc1-5.el6_5.1            updates 
libcgroup-pam.x86_64                      0.40.rc1-5.el6_5.1            updates 
libchewing.x86_64                         0.3.2-27.el6                  base    
libchewing-devel.x86_64                   0.3.2-27.el6                  base    
libchewing-python.x86_64                  0.3.2-27.el6                  base    
libcmpiCppImpl0.x86_64                    2.0.1-5.el6                   base    
libcmpiutil.x86_64                        0.5.6-1.el6                   base    
libcmpiutil-devel.x86_64                  0.5.6-1.el6                   base    
libcollection.x86_64                      0.6.0-9.el6                   base    
libcollection-devel.x86_64                0.6.0-9.el6                   base    
libconfig.x86_64                          1.3.2-1.1.el6                 base    
libconfig-devel.x86_64                    1.3.2-1.1.el6                 base    
libcroco.x86_64                           0.6.2-5.el6                   base    
libcroco-devel.x86_64                     0.6.2-5.el6                   base    
libcurl.x86_64                            7.19.7-37.el6_4               base    
libcurl-devel.x86_64                      7.19.7-37.el6_4               base    
libcxgb3.x86_64                           1.3.1-1.el6                   base    
libcxgb3-static.x86_64                    1.3.1-1.el6                   base    
libcxgb4.x86_64                           1.2.0-1.el6                   base    
libcxgb4-static.x86_64                    1.2.0-1.el6                   base    

可以看到yum命令確實只能找到64位的rpm包,但yum的源中又確實有32位的rpm包啊。。。問題處在哪呢?

 

打開yum的配置文件/etc/yum.conf看看,發現一行可疑的配置:

exclude=*.i?86 kernel kernel-xen kernel-debug

從內容看,似乎yum刻意忽略了32位的rpm包?

 

不管三七二十一,去掉試試看,修改成如下:

exclude= kernel kernel-xen kernel-debug

 

[rao@AY1404062027584053a1Z etc]$ yum list |grep glibc
glibc.x86_64                           2.12-1.132.el6                    @base  
glibc-common.x86_64                    2.12-1.132.el6                    @base  
glibc-devel.x86_64                     2.12-1.132.el6 @base glibc-headers.x86_64                   2.12-1.132.el6                    @base  
compat-glibc.x86_64                    1:2.5-46.2                        base   
compat-glibc-headers.x86_64            1:2.5-46.2                        base   
glibc.i686                             2.12-1.132.el6                    base   
glibc-devel.i686                       2.12-1.132.el6 base glibc-static.i686                      2.12-1.132.el6                    base   
glibc-static.x86_64                    2.12-1.132.el6                    base   
glibc-utils.x86_64                     2.12-1.132.el6                    base   

果然多了一個32位的rpm包,看來有戲。

 

再執行命令”sudo yum install glibc-devel.i686",終於安裝成功了。

再繼續編譯redis,很快就搞定了。

 

 

總結:

原因:阿里雲64位centos6.3上,默認的yum配置不安裝32位的rpm包,導致編譯redis需要的“glibc-devel.i686”無法被安裝。

解決辦法:修改yum的配置文件/etc/yum.conf,將”exclude=*.i?86 kernel kernel-xen kernel-debug“改成”exclude= kernel kernel-xen kernel-debug“即可。

不確定這個配置是centos的默認配置,還是阿里雲的修改,總之很坑爹,浪費了我一個美好的周末。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM