最近开始学云计算,看了一些基本概念的书,发现以前的很多知识现在都用的上。只是有一些新的知识需要学习。
废话不多说,遇到的第一个问题就是如何用Cloud Foundry部署一个自己的集群,当然第一步就是做一个单节点的PaaS平台。
网上就有如何布置安装的帖子,我何必多说,我只说一些自己在弄的过程中遇到的一些问题,以及如何解决的。其实这些方法很具有通用性,在很多场合下都很适用的。
我争取以类型说明,因为每个人的电脑出现的问题都不一定一样,学会分析的方法反而更重要。
注意:因为我Cloud Foundry是在ubuntu上安装的,下面的具体解决方法中有是ubuntu上的方法,其他发行版其实方法一样,只是使用的命令不同而已。注意区分就行了。
问题1--缺少动态库
特点:如果学过编译链接原理的就知道,在链接过程中需要指定使用的链接库,使用的命令就是ld,所以注意下面的信息,观察到STDERR:一行,首先是ld命令引起,意味着链接过程出问题了,然后是说明: cannot find -lncurses。意思就是找不到名字为ncurses的动态库。这种错误还是很明显的。
- gcc -O2 -Wall -DLUA_USE_LINUX -c -o linit.o linit.c
- ar rcu liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o
- ranlib liblua.a
- gcc -O2 -Wall -DLUA_USE_LINUX -c -o lua.o lua.c
- gcc -o lua lua.o liblua.a -lm -Wl,-E -ldl -lreadline -lhistory -lncurses
- make[2]: Leaving directory `/tmp/lua-5.1.4/src'
- make[1]: Leaving directory `/tmp/lua-5.1.4/src'
- STDERR: /usr/bin/ld: cannot find -lncurses
- collect2: ld returned 1 exit status
- make[2]: *** [lua] Error 1
- make[1]: *** [linux] Error 2
- make: *** [linux] Error 2
- ---- End output of "bash" "/tmp/chef-script20120930-23056-vcj5jy-0" ----
- Ran "bash" "/tmp/chef-script20120930-23056-vcj5jy-0" returned 2
解决思路:既然找不到,一般是两种情况:
(1)链接脚本出问题了
(2)系统中没有安装这个动态库
一般情况下,我们不会去动这个脚本,所以第一反映就是没有装这个动态库,所以解决方法就是找到这个库并安装。要安装一般也有两种办法:
(1)下载源码自己编译,但是这种情况很少出现
(2)在软件源中搜索相应的动态库安装。一般都这种解决。
解决:知道问题所在了,那接下来要具体怎么做,其实也很简单,分两步走:
(1)搜索这个动态库的名字
(2)安装这个动态库
好了,整个过程就像上面说的解决,现在看看我们是怎么解决的吧。第一,在ubuntu下动态库的名字都是以“lib”开头;第二、确定动态库大概的名字,从上面的错误信息来看,动态库的名字叫做“ncurses”,中间的"-l"是“-link”的意思,是编译过程中的标准语法。所以我们确定我们需要的动态库名称可能叫做“libncurses”。OK,然后我们搜索一下,得到如下结果:
- ubuntu@cloudfoundry:~$ apt-cache search libncurses
- libncurses5 - shared libraries for terminal handling
- libncurses5-dbg - debugging/profiling libraries for ncurses
- libncurses5-dev - developer's libraries for ncurses
- libncursesw5 - shared libraries for terminal handling (wide character support)
- libncursesw5-dbg - debugging/profiling libraries for ncursesw
- libncursesw5-dev - developer's libraries for ncursesw
- centerim-utf8 - A text-mode multi-protocol instant messenger client
- libncurses-gst - Ncurses bindings for GNU Smalltalk
- libncurses-ruby - Transitional package for ruby-ncurses
- libncurses-ruby1.8 - Transitional package for ruby-ncurses
- libncurses-ruby1.9 - Transitional package for ruby-ncurses
- libncurses-ruby1.9.1 - Transitional package for ruby-ncurses
- libncursesada-dbg - Ada binding to the ncurses text interface library: debug symbols
- libncursesada-doc - Ada binding to the ncurses text interface library: documentation
- libncursesada2 - Ada binding to the ncurses text interface library: shared library
- libncursesada2-dev - Ada binding to the ncurses text interface library: development
- ruby-ncurses - ruby extension for the ncurses C library
注:命令 apt-cache search XXX是在软件原列表中搜索的意思。
问题2、configure过程出现错误
特点:这个错误我一开始认为是因为缺少这个叫odbc的错误引起的,但是装了odbc后还是出错,后来发现这里的信息应该这样看:STDERR: configure: WARNING: No odbc library found skipping odbc。出错的地方是configure,意思是配置文件在你初始化配置的时候出现错误。
注:当时还出现下面的错误信息,其实这部分信息不止一个错误,但是我们先关注第一个错。
- STDERR: configure: WARNING: No odbc library found skipping odbc
- configure: WARNING: "ODBC library - link check failed"
- configure: WARNING: No OpenGL headers found, wx will NOT be usable
- configure: WARNING:
- wxWidgets must be installed on your system.
- Please check that wx-config is in path, the directory
- where wxWidgets libraries are installed (returned by
- 'wx-config --libs' or 'wx-config --static --libs' command)
- is in LD_LIBRARY_PATH or equivalent variable and
- wxWidgets version is 2.8.4 or above.
- configure: WARNING: No 'xsltproc' command found: the documentation cannot be built
- configure: WARNING: No 'fop' command found: going to generate placeholder PDF files
- gcc: fatal error: no input files
- compilation terminated.
- make[3]: *** [../ebin/hipe_consttab.beam] Aborted
- make[2]: *** [opt] Error 2
- make[1]: *** [opt] Error 2
- make: *** [secondary_bootstrap_build] Error 2
- make[3]: *** [../ebin/hipe_consttab.beam] Aborted
- make[2]: *** [opt] Error 2
- make[1]: *** [opt] Error 2
- make: *** [secondary_bootstrap_build] Error 2
- ---- End output of "bash" "/tmp/chef-script20120930-18247-lp90nh-0" ----
- Ran "bash" "/tmp/chef-script20120930-18247-lp90nh-0" returned 2
那怎么解决这个问题呢?当然是去找这个configure文件,然后定位到出错这一行,看看它到底要做什么。
不过我当时比较懒,而且问了一下度娘一下子就找到答案了,所以也就没去看configure文件了。不过我们学学对方怎么分析的吧
浏览了一下configure的log,发县有"No odbc library found skipping odbc",将问题定位到了$src/lib/odbc/configure.in 178行
- if test -f "$dir/include/sql.h"; then
- is_odbc_std_location=yes
- ODBC_LIB=-L"$dir/lib"
- ODBC_INCLUDE="-I$dir/include"
- break
- fi
不过我现在也有疑问,作者是如何根据缺少sql.h就能判断缺少后面的两个东西的?
注:这种缺少头文件的情况下,会有大量的提示信息找不到XXX符号,这也是一种比较明显的提示信息了。
这种在configure中出现的问题要如何解决,我正在探索中,大家也不妨去找找相关的文章看看是怎么解决的,应该有一个解决方法的。
注:现在提供的很多源码包都会带有configure文件,我们在编译之前,都会执行这个configure文件,它会检测我们系统的情况生成相应的Makefile文件。
问题3、还是configure错误
特点:这个还是configure的错误,为什么我还讲呢?主要是这个错误很好,它在后面给出了提示。比起问题2中的没头没脑的去看configure文件外,这个提示对我们来说很宝贵,所以我们来分析分析。首先它提示说,找不到OpenGL的头文件,我一开始以为需要装OpenGL的动态库,后来装了以后还是有这个问题,说明我想法是错的。然后看后面的WARRING的提示,要求我们必须安装wxWidgets,而且还提示了,如果成功了,可以用wx-config命令进行检查。所以这些就是我们现在需要注意的信息了。
注:后面还有3个错误,这次我们不关注。
- STDERR: configure: WARNING: No OpenGL headers found, wx will NOT be usable
- configure: WARNING:
- wxWidgets must be installed on your system.
- Please check that wx-config is in path, the directory
- where wxWidgets libraries are installed (returned by
- 'wx-config --libs' or 'wx-config --static --libs' command)
- is in LD_LIBRARY_PATH or equivalent variable and
- wxWidgets version is 2.8.4 or above.
- configure: WARNING: No 'xsltproc' command found: the documentation cannot be built
- configure: WARNING: No 'fop' command found: going to generate placeholder PDF files
- gcc: fatal error: no input files
解决过程:首先搜索,列表如下,第一眼晕死,这里我弄了很久,基本很多都给试过去了,最后弄到libalien-wxwidgets-perl的时候成功了,我就有wx-config这个命令了。
- ubuntu@cloudfoundry:~$ apt-cache search wxwidgets
- codeblocks-contrib - contrib plugins for Code::Blocks IDE
- codeblocks-contrib-dbg - Debugging libraries for the Code::Blocks contrib plugins
- filezilla - Full-featured graphical FTP/FTPS/SFTP client
- filezilla-common - Architecture independent files for filezilla
- fontypython - Find, view and manage font files of all kinds
- jmdlx - jugglemaster deluxe using wxWidgets
- libalien-wxwidgets-perl - Perl module for locating wxWidgets binaries
- libmgl-wx5 - library for scientific graphs. (wxWidgets runtime library)
- libwx-perl - interface to wxWidgets cross-platform GUI toolkit
- libwxbase2.6-0 - wxBase library (runtime) - non-GUI support classes of wxWidgets toolkit
- ……………………………………………………
- wx2.8-doc - wxWidgets Cross-platform C++ GUI toolkit (documentation)
- wx2.8-examples - wxWidgets Cross-platform C++ GUI toolkit (examples)
- wx2.8-headers - wxWidgets Cross-platform C++ GUI toolkit (header files)
- wx2.8-i18n - wxWidgets Cross-platform C++ GUI toolkit (i18n support)
- wxformbuilder - WYSIWYG GUI Designer and Code Generator for wxWidgets
- wxsqlite3-2.8-dbg - Debugging symbols for wxSQLite3 2.8
- wxsqlite3-doc - Documentation files for wxSQLite3
问题4、还是configure错误
特点:是不是晕死,没错的,这次的错误提示就更诡异了,但是还是很好确定的,说白了就是我没有"wx driver"这东西。
- *********************************************************************
- ******************** APPLICATIONS INFORMATION *****************
- *********************************************************************
- wx : Can not link the wx driver, wx will NOT be useable
- *********************************************************************
- *********************************************************************
- ******************** DOCUMENTATION INFORMATION ****************
- *********************************************************************
- documentation :
- xsltproc is missing.
- fop is missing.
- The documentation can not be built.
- *********************************************************************
我忘记我当时怎么搜的了,反正后来搜到的结果是缺少: freeglut3-dev libwxgtk2.8-dev 。安装以后就没问题了。
问题5、缺少相应软件
特点:command就是命令,命令就是软件,那这种有什么好说的呢。找到安装就完了。这种错误最好解决,因为基本命令的名字就是软件的名字。
- *********************************************************************
- ******************** DOCUMENTATION INFORMATION ****************
- *********************************************************************
- documentation :
- xsltproc is missing.
- fop is missing.
- The documentation can not be built.
- *********************************************************************
- configure: WARNING: No 'xsltproc' command found: the documentation cannot be built
- configure: WARNING: No 'fop' command found: going to generate placeholder PDF files
问题6、编译工具链不对
特点:这个问题往往比较容易忽略,而且很多时候也不太好发现。这种错误其实很常见,Linux不像windows,兼容可以做的那么好,所以经常出现兼容的问题。“高帅富”告诉我一个简单的判断方法,查看源码的日期,太老的源码,那用新版本的工具链绝对要出问题,当然我这边这次遇到的不是这样的,先看出错时的情况:
- make[3]: Leaving directory `/tmp/otp_src_R14B01/lib/hipe/misc'
- make[2]: Leaving directory `/tmp/otp_src_R14B01/lib/hipe'
- make[1]: Leaving directory `/tmp/otp_src_R14B01/lib'
- STDERR: gcc: fatal error: no input files
- compilation terminated.
- make[3]: *** [../ebin/hipe_consttab.beam] Aborted
- make[2]: *** [opt] Error 2
- make[1]: *** [opt] Error 2
- make: *** [secondary_bootstrap_build] Error 2
- make[3]: *** [../ebin/hipe_consttab.beam] Aborted
- make[2]: *** [opt] Error 2
- make[1]: *** [opt] Error 2
- make: *** [secondary_bootstrap_build] Error 2
- ---- End output of "bash" "/tmp/chef-script20121001-23468-1f1aaz2-0" ----
- Ran "bash" "/tmp/chef-script20121001-23468-1f1aaz2-0" returned 2
但是我们暂时还不知道自己在编译哪个软件。所以,第一步我要找到自己的编译哪个软件,后面的才有的说。从STDERR这行往上看,可以看到现在是在/tmp/otp_src_R14B01这个目录下,那我就进入这个目录看看是怎么回事吧。
- ubuntu@cloudfoundry:/tmp/otp_src_R14B01$ ls
- AUTHORS INSTALL.md README.md bin configure lib prebuilt.files
- EPLICENCE Makefile README.md.txt bootstrap configure.in make system
- INSTALL-CROSS.md Makefile.in TAR.include config.log erl-build-tool-vars.sh otp_build xcomp
- INSTALL-WIN32.md README.bootstrap aclocal.m4 config.status erts plt
- make[1]: Entering directory `/tmp/otp_src_R14B01/lib'
- make[2]: Entering directory `/tmp/otp_src_R14B01/lib/hipe'
- #### Entering application hipe
- make[3]: Entering directory `/tmp/otp_src_R14B01/lib/hipe/misc'
- erlc -W +debug_info +warn_exported_vars +warn_missing_spec +warn_untyped_record -o../ebin hipe_consttab.erl
- * buffer overflow detected *: /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp terminated
- Backtrace:
- ==========
- /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2af0df5d2ee7]
- /lib/x86_64-linux-gnu/libc.so.6(+0x107de0)[0x2af0df5d1de0]
- /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x551dbf]
- /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp(erts_write_to_port+0x853)[0x47db13]
- /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x4f3cae]
- /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp(process_main+0x4ab9)[0x5202a9]
- /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x48930b]
- /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam.smp[0x584fa4]
- /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x2af0df0abe9a]
- /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x2af0df5bc39d]
现在我们可以确定两点:
(1)我们编译的是otp_src_R14B01这个软件
(2)我们现在的编译工具链版本不能编译这个源码包
解决方法一般两种:
(1)到这个软件的官网上下载适合我们编译工具链的源码包
(2)把编译工具链进行降级(或升级),以适应我们的源码包。
两种办法都是可取的,但是我们这边因为这个只是整个CF节点安装的一小部分,第一种方法估计没办法,所以我们采取第二种办法。
所以现在需要查我们需要弄哪个版本的编译工具链。这种东西当然是问度娘了:
- Same error here. If I redirect stdout and stderr, I get a buffer overflow report from gcc... that's why it aborts. The first line is:
- * buffer overflow detected *: /tmp/otp_src_R14B01/bin/x86_64-unknown-linux-gnu/beam terminated
- This appears to be a conflict between Erlang/OTP R14B01 and gcc-4.5+... basically there's some functionality enabled that attempts to detect buffer overflows, and it thinks the Erlang code has one. If you google around you should be able to find it. My (secondary!) research indicates someone concluded there is *not* a buffer overflow, but Erlang is behaving oddly and causing the check to fail.
- Anyway, it appears this was fixed shortly after R14B01, and should be fine in R14B02:
- http://www.erlang.org/download/otp_src_R14B02.readme (search for OTP-9025).
- CloudFoundry however is deliberately pinned to the old version: https://github.com/cloudfoundry/vcap/blob/master/dev_setup/cookbooks/erlang/attributes/default.rb.
- Note that R14B01 was released in December 2010... it's 3 service releases and 1 major version behind upstream.
- It would be really nice if Erlang/OTP could get bumped up a couple versions... I would guess that up to R14B04 would be minimal effort.
- An alternative option is to downgrade to gcc-4.4. This worked for me, and allowed me to get the DEA host installed. Here's how I did it:
- http://stackoverflow.com/questions/7832892/how-to-change-the-default-gcc-compiler-in-ubuntu
注:我这时的gcc版本是4.6.3
4.4版本的gcc可以直接在ubuntu的软件源中下载到。所以安装很简单,主要是如何修改使用的默认gcc版本,这个很好理解,我们电脑原来用的是IE浏览器,现在我们装了chrome,然后为了使用,我们需要把默认浏览器改成chrome是一个道理的。所以现在的事情就是怎么改过来。
很开心的是作者也给出了怎么修改。其实一行命令就可以完成了:
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 50
然后可以使用命令gcc -v查看一下自己的版本是否有问题
- ubuntu@cloudfoundry:~$ gcc -v
- Using built-in specs.
- Target: x86_64-linux-gnu
- Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.7-1ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
- Thread model: posix
- gcc version 4.4.7 (Ubuntu/Linaro 4.4.7-1ubuntu2)
注:更换了GCC版本,但是还是需要进入/tmp/otp_src_R14B01执行一次make clean否则还是会提示失败
===========================================补充 2012.10.15 补充==============================================
以下的问题其实是后来帮别人弄的时候出现的,所以说每个人的问题都不一定一样,其实他的也遇到了很多和我一样的问题。
问题7:下载失败
特点:或许会问:这也算问题?当然算问题,只要能看的出来是因为下载失败。在解决依赖关系的时候会经常下载安装一些特定的包,如果是国内的源都还好,基本不会失败。国外的源就不好说了,总是时不时的遇到。所以看到下面的情况的时候不要怕,解决起来其实很简单。
- ================================================================================
- Error executing action `create` on resource 'deployment_remote_file[/var/cache/dev_setup/ruby-1.9.2-p180.tar.gz]'
- ================================================================================
- HTTPClient::ReceiveTimeoutError
- -------------------------------
- execution expired
1、重新执行执行一边,指不定就成功了。
2、如果失败多次,那不妨去网上搜搜,下载下来安装就好了,比如可以使用wget命令获取:
wget http://mirrors.ibiblio.org/ruby/1.9/ruby-1.9.2-p180.tar.gz
3、我比较懒,我就去别人那直接把那个目录下的东西全部拷贝过来,传过去就完了。 注:如果你是用ssh连接到远端,可以使用scp命令进行远端和本地的复制动作。
其他:
中间我也出现了这个问题,是不是很熟悉,和问题1一样的,解决思路也是一样的,装一个 libssl0.9.8 就完了。是不是很简单
- Selecting previously unselected package libpq5.
- (Reading database ... 69001 files and directories currently installed.)
- Unpacking libpq5 (from .../cache/dev_setup/libpq5_9.2.deb) ...
- ================================================================================
- Error executing action `run` on resource 'bash[Install libpq]'
- ================================================================================
- Mixlib::ShellOut::ShellCommandFailed
- ------------------------------------
- Expected process to exit with [0], but received '1'
- ---- Begin output of "bash" "/tmp/chef-script20121013-16144-1c1ej7c-0" ----
- STDOUT: Selecting previously unselected package libpq5.
- (Reading database ... 69001 files and directories currently installed.)
- Unpacking libpq5 (from .../cache/dev_setup/libpq5_9.2.deb) ...
- STDERR: dpkg: dependency problems prevent configuration of libpq5:
- libpq5 depends on libssl0.9.8 (>= 0.9.8k-1); however:
- Package libssl0.9.8 is not installed.
- dpkg: error processing libpq5 (--install):
- dependency problems - leaving unconfigured
- Errors were encountered while processing:
- libpq5
- ---- End output of "bash" "/tmp/chef-script20121013-16144-1c1ej7c-0" ----
- Ran "bash" "/tmp/chef-script20121013-16144-1c1ej7c-0" returned 1
- Resource Declaration:
- ---------------------