Linux下模块的自动加载

在配置MPX项目结束时,发现每次开机后iscsi-scst.ko模块都没有自动加载,这样总是需要手动加载。我希望模块能够在开机时能够自动加载,所以查阅了一些资料。通过一些博客发现:雷同率极高,并且亲测不通过。

目前modprobe.conf和modprobe.d/ 没有解决问题,已尝试好多种配置方式,仍然无效。(将来如果是通过配置以上两项实现的模块开机加载,一定回来更改)

还有一点要提的是:最好不要将加载模块的命令写在rc.local前面。下面看看整个开机过程你就明白了。

(1) 载入BIOS的硬件信息,并取得第一个开机装置的代号
(2)读取第一个开机装置的MBR的boot Loader (grub)的开机信息
(3)载入OS Kernel信息,解压Kernel,尝试驱动硬件
(4) Kernel执行init程序并获得run-lebel信息(如3或5)
(5) init执行
/etc/rc.d/rc.sysinit
(6)启动内核外挂模块
(/etc/modprobe.conf)
(7) init执行run-level的各种Scripts,启动服务
(8) init执行
/etc/rc.d/rc.local
(9)执行
/bin/login,等待用户Login
(10)Login后进入Shell

如果在(8)处才加载模块,那么(8)以前的程序将无法调用该模块的功能。所以模块加载最好发生在(5)、(6)处。由于(6)处一直没有测试成功,所以考虑放在rc.sysinit中加载所需模块。

我们可以在文本的最后添加 modprobe iscsi-scst,如此重启后将发现模块已加载。但是我想尽量写的可扩展性强一些,以便以后可以简单的添加需要开机启动的模块。因此我在/etc 下创建了modules.conf文件,在该文件中只需每行写入一个模块的名字即可,‘#’和‘;’开头的为注释文字。然后在rc.sysinit最后写入如下代码:

if [ -f /etc/modules.conf ]; then

/bin/awk ‘$1~/^[^#;]/ { system(“/sbin/modprobe ” $1) }’ /etc/modules.conf
fi

Could not find module vmware_balloon

在vmware虚拟机中升级内核时,最后make install出现如下错误:

ERROR: modinfo: could not find module vmware_balloon

可以从两个方面排错:

1、使用 make menuconfig 进去内核编译菜单,选中 Device Drivers -> MISC devices -> VMware Balloon Driver 为 M 或者 *。

2、Vmware在后来的版本中,已经更名为 vmw_balloon,所以出现找不到的问题。此时应当到vmw_balloon.ko目录下创建一个软连接,命令如下:

ln -s vmw_balloon.ko vmware_balloon.ko

安装STUNTMAN偶遇Clang++与LLVM

LLVM,命名最早源自于底层虚拟机(Low Level Virtual Machine)。它是一个编译器的基础建设,以C++写成。它是为了任意一种编程语言写成的程序,利用虚拟技术,创造出编译时期,链结时期,运行时期以及“闲置时期”的优化。LLVM本身并不是编译器,只是一套用于开发编译器、解释器等程序语言相关工具的库,主要聚焦于编译器后端功能,如代码生成、代码优化、JIT等。

下面介绍一下Clang,通过Clang我们可以更好的理解LLVM。Clang是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端,目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。然后采用LLVM作为后端,使用LLVM编译成机器语言。目标是提供一个GCC的替代品。作者是克里斯·拉特纳,在苹果公司的赞助支持下进行开发。

Clang 的特性:

1、从代码上说,clang结构更简单。因为clang只需要完成词法和语法分析,代码优化和机器代码的生成工作由llvm完成。所以和全部由自己包下的gcc比起来,clang可以更专注地做好一件事。

2、更快的编译速度,并且内存占用小。

3、诊断信息可读性强,友好的出错提示,相比之下GCC的提示很天书。

4、GCC 兼容性。

5、设计清晰简单,容易理解,易于扩展增强。

6、基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段。

GCC 的优势:

1、GCC 支持更多平台。

2、GCC 更流行,广泛使用,支持完备。

上面提了这些主要是为解决我的问题做铺垫。下载的开源软件STUNTMAN的Tarball,在CentOS上安装时并没有像README文件中提到的“安装好openssl和boost后make即可成功”。一步步走来make失败,查看common.inc文件,首先发现下面两行:

BOOST_INCLUDE := -I/home/jselbie/boost_1_51_0

OPENSSL_INCLUDE := -I/home/jselbie/lib/openssl

显然上面两行所写的路径不是我的openssl和boost头文件的路径。此处更改后成功make。仔细阅读common.inc后,发现下面两句:

# CLANG compiler works fine

# CXX := /usr/bin/clang++

发现这两句后,查阅了一些资料,在兴趣的引导下安装了clang++。下面是参考的CodeMood中的一篇文章——《CentOS6.4 编译安装LLVM3.3、Clang和Libc++》。

LLVM3.3提供了非常丰富的Pre-built Binaries:包括Ubuntu13.04,Ubuntu12.04和Ubuntu10.04,还有Debian6、FreeBSD9和Fedora18,当然还有Apple自己的Mac OS X。然而没有包括CentOS,只能使用Tarball。

安装过程主要参考这几篇文章:

http://clang.llvm.org/get_started.html

http://www.cnblogs.com/Frandy/archive/2012/10/20/llvm_clang_libcxx_cxx11.html

http://www.cnblogs.com/ralphjzhang/archive/2011/12/02/2272671.html

下面开始:

1、从http://llvm.org/releases/download.html#3.3下载文件。目前3.3是个稳定版本,推荐下载3.3版代码包,需要下载5个文件:

LLVM source code、Clang source code、Clang Tools Extra source code、Compiler RT source code、LibC++ source code。

2、下载完成后,将压缩包都解压出来,得到五个目录:

llvm-3.3.src、cfe-3.3.src、clang-tools-extra-3.3.src、compiler-rt-3.3.src、libcxx-3.3.src。

3、按下面的步骤组织目录:

mv cfe-3.3.src clang

mv clang/ llvm-3.3.src/tools/

mv clang-tools-extra-3.3.src extra

mv extra/ llvm-3.3.src/tools/clang/

mv compiler-rt-3.3.src compiler-rt

mv compiler-rt llvm-3.3.src/projects/

这样clang,clang-tools-extra和compiler-rt就可以和llvm一起编译了。

4、在llvm-3.3.src同一层目录上新建个目录build-3.3并进入:

mkdir build-3.3

cd build-3.3

5、configure:

../llvm-3.3.src/configure –enable-optimized –enable-targets=host-only

作者说:“推荐大家加上这两个选项,否则会产生巨大的文件,我第一次编译的时候,没有加上这两个选项,编译出来的结果多大9.4G(够吓人的吧?把我的磁盘都耗尽了,还报错,google了好久才发现是磁盘空间不够),加上以后编译出来的结果不到1G,i5四核20分钟多一点就编译完成。”

6、make && make install

7、用clang++ -v查看下:

clang version 3.3 (tags/RELEASE_33/final)

Target: x86_64-unknown-linux-gnu

Thread model: posix

此时clang就可以正常使用了,clang默认用的是C++库gcc的libstdc++。clang用法和gcc类似,如果要使用C++11的话:

clang++ -std=c++11 [input]

如果想用LLVM自己的libc++,就需要下面几步。

1、进入之前解压出来的libcxx-3.3.src:

cd libcxx-3.3.src/lib

./buildit

在libcxx-3.3.src/lib下面可以看到libc++.so.1.0文件,这就是libc++的动态库。

2、把libc++.so.1.0放到/usr/lib下,并创建几个链接:

cp ./libc++.so.1.0 /usr/lib

cd /usr/lib

ln -sf /usr/lib/libc++.so.1.0 libc++.so

ln -sf /usr/lib/libc++.so.1.0 libc++.so.1

3、把libcxx-3.3.src/include目录拷贝到/usr/include/c++/v1(这个地址是clang默认查找的目录,如果目录不存在则自己创建):

cp -r libcxx-3.3.src/include/ /usr/include/c++/v1

按理说,这样以后,就可以了,使用libc++的方式如下:

clang++ -stdlib=libc++ -std=c++11 [input]

但是我这边编译的时候,提示找不到头文件,需要手动加上-I/usr/include/c++/v1/:

clang++ -stdlib=libc++ -std=c++11 -I/usr/include/c++/v1/ [input]

运行的时候,也会提示链接错误:“error while loading shared libraries: libc++.so.1: cannot open shared object file: No such file or directory。”

解决办法是在~/.basrch中加入下面的环境变量:

export LD_LIBRARY_PATH=/usr/lib:/usr/local/lib

重启个shell就可以了正常运行了,上面这些找不到头文件和链接错误都是因为使用libc++的原因,如果使用默认的libstdc++就没有这些问题。