经过这几天来的磕磕碰碰,总算成功安装上了
Xen
3.2.0
。
对于像 globus , linux 内核, xen 这样的大型系统的安装和部署,准备工作一定要做足。安装前一定要详细阅读附带的安装文档,而不是从网上找一大堆别人的安装文档然后挑一篇出来作为自己的指导文档,一定要详细看安装包中附带的文档,一篇也不放过。在安装时, make 会 持续很长时间(一般都是一个小时以上,安装内核花费的时间最少,十来分钟左右),所以,一定要记得把错误输出重定向到日志文件中。在安装过程中出了错误再 把错误信息贴到网上去找解决方法。附带文档中要求的预先必须有的安装包一定要按照要求去做。出了错误不要轻易地把一切删除了重来,在出现错误时一定要保持 冷静,想尽办法去解决它,删除文件前一定要三思。不要轻易地说“我们重来吧”,最好是能在最少改动当前局面的情况下把问题给解决了。要勇敢地解决问题,不 要遇到问题就放弃或者重来。
现在是把所有东西都又重新来过。之前安装了 N 次,每次都遇到很多问题。现在把所有的 dependencies 都安装好了,然后按照 xen3.2.0 的文档上说的,直接 make world 。
( 注意,其中 xorg-x11-devel 在 cent os 上已经被另一个似乎是 mesa 的取代了,但 xen 只认 xorg-x11-devel ,通过查看 Makefile ,找到检查 xorg-x11-devel 是否安装的 shell 脚本,这个脚本是: xen-3.2.0/tools/check/check_x11_devel ,它在 /usr/include/X11 和 /usr/X11R6/include/X11 这两个目录下检查是否任何一个目录下存在 keysymdef.h 这个文件,如果两个目录下都没有这个文件,就表示 xorg-x11-devel 没有安装,报错,这个无所谓,在网上能找到这个文件的内容,大约有 2000 多行,把网上找到的这个文件放到任任意一个目录下面就可以解决这个问题 ) 。
现在 make world ,出现了下列问题:
现在又遇到这个问题,感觉在整体没有把握的情况下去猜如何解决,实在是很没有方向。于是打算先了解这个错误发生前 make world 做过的事情。这里的错误信息看起来就是一个递归过程: make world 调用 make install-kernels ,后者又调用 make linux-2.6-xen-install ,然后在 make linux-2.6-xen-install 里面又是 make build ,然后 build 出错,于是形成了这样一个错误信息输出。那么,现在看看这几个 make 都做了些什么。在网上初步查了一下 makefile 的语法,找到 Makefile 中的 make world 部分:
那么,现在看看 install-xen , install-kernels 等部分:
我们已经知道了 make dist 是分这几个步骤来的,那么我们分开执行,看看到底错误在哪里。
先执行 make install-xen :
[root@jcwkyl xen-3.2.0]# make install-xen
结果正确无误。现在执行 make install-tools:
[root@jcwkyl xen-3.2.0]# make install-tools 2>make_install_tools_err.log
发现了一些 warning ,还有两个看起来比较重要的如下:
Makefile:352 : *** pciutils-devl package not found - missing /usr/include/pci
Makefile:353 : *** PCI passthrough capability has been disabled
但是 make install-tools 仍然成功执行。现在执行 make intall -kernels :
[root@jcwkyl xen-3.2.0]# make install-kernels 2>make_install_kernels_err.log
并且趁机记录下来 make install-kernels 时执行的 makefile 中的语句在变量扩展后的形式:
[root@jcwkyl xen-3.2.0]# tail make_install_kernels_err.log
make linux-2.6-xen-install
make linux-2.6-xen0-install
make linux-2.6-xenU-install
同样,现在把这三条命令拆开执行:
[root@jcwkyl xen-3.2.0]# make linux-2.6-xen-install 2>err.log
make –f buildconfigs/mk.linux-2.6-comman build
把这个文件中的 build 部分弄出来看看:
[root@jcwkyl xen-3.2.0]# make -n linux-2.6-xen-install > make_process.log
-n 命令指示 make 不要去做实际的 build ,而仅仅是把要执行的命令输出出来。现在得到了这份 make 执行的流程文件,定位到 cp */vmlinuz 的那一部分是很简单的了,但是知道了又怎么样呢?看到 vmlinuz 就应该知道错误是在哪里了。
改 Makefile ,风险太大,那就换一种方式,先编译好内核,等有了 vmlinuz 文件后再执行 xen 的安装。
[root@jcwkyl xen-3.2.0]# make prep-kernels
这条命令成功执行。在 xen-3.2.0 目录下多出了三个内核的目录。根据安装文档上说的,可以复制一份现成的内核配置文件,然后执行 make oldconfig 来编译内核。所以:
[root@jcwkyl xen-3.2.0]# cp /boot/config-2.6.18-128.el5 build-linux-2.6.18-xen_x86_32/.config
把以前的 .config 文件覆盖掉。
[root@jcwkyl xen-3.2.0]# emacs build-linux-2.6.18-xen_x86_32/.config
找到其中和 ext2 以及 ext3 有关的部分,确认它们全部是 y ,这是因为前两天在 vmware 上编译 linux 内核时的经验。
但是有一个问题,如果仅仅是这样编译内核, make 的参数无法确定,即这个单独编译的内核并不知道有个 xen 在这里,因为它并不是从 xen 的安装过程中引发出来的编译过程,所以这个单独的内核编译过程必然对 xen 的安装是没有什么帮助的。现在尝试最有希望的解决方法,那就是稍微修改一下 Makefile 。
通过对照:在 make –n 执行后的 make_process.log 中寻找 mkdir –p( 因为错误信息是紧接着 mkdir –p 然后 cp 错误的 ) ,幸运的是只找到了一处。比对一下,看它是哪个 Makefile 里面的,如前面的分析,它其实就肯定是 buildconfigs/mk.linux-2.6-common 文件里的了,和这个文件进行对比, buildconfigs/mk.linux-2.6-common 文件中的语句是:
在网上查这个问题,只有一个人问,而且也是 xen3.2.0 版本,很有可能是 xen3.2.0 版本的一个 bug ,回头安装一次 xen3.3.0 或者其它版本试试看。
对这种安装过程感到厌倦,一个 make 过程动辄半个小时以上的时间,尽管以前被执行过,再执行一次检查也得花很长时间,而安装系统时,出现这样那样的错误,不断地想出更正的方法,然后运行 make , 等上半个小时以上的时间来看看自己想出来的更正方法是否有效,这个过程让人崩溃!有没有更有效的方法来做这样的事情?我想最好的方法就是做足准备工作,安 装过程中的每一步都必须走得异常小心,走每一步之前做好充分的准备和预见,而不是遇到问题再兵来将挡。尽量不要返工。最明显的路不是最快的路。一定要小 心。尽可能并行地工作。
再说那个 cp 的问题,最后自己的方法是在 mk.linux-2.6-common 文件中把 make 的那个 ${IMAGE_TARGET} 去掉,然后执行 make kernels ,到这里就能由 xen 的 make 过程引发出 linux-2.6-xen 的 make ,这个 make 生成的是 bzImage ,然后把 bzImage 改名为 vmlinuz ,然后重新运行 make ,然后就一路顺利了。奇怪的是,另外两个内核都 make 良好,观察了另外两个内核的 make 时候的输出,它们都确实是生成的 arch/i386/boot/vmlinuz ,只有第一个内核不是的。
现在配置 grub ,看看是不是确实成功了。首先要用 mkinitrd 命令生成对应的文件,中间可能会说什么 uhci , mptspi 什么的找不到,把所有的参数用上还有万能的 —builtin =XXX ,总之随机应变,硬凑出来一个也可以的。我用的命令是:
#mkinitrd --omit-scsi -modules --omit-raid-modules --omit-lvm -modules --without-usb --without-dmraid --builtin =mptspi initrd-2.6.18.8-xen0.img 2.6.18.8-xen0
#mkinitrd --omit-scsi -modules --omit-raid-modules --omit-lvm -modules --without-usb --without-dmraid --builtin =mptspi initrd-2.6.18.8-xenU.img 2.6.18.8-xenU
我的 grub 文件最后的形式是:
对于像 globus , linux 内核, xen 这样的大型系统的安装和部署,准备工作一定要做足。安装前一定要详细阅读附带的安装文档,而不是从网上找一大堆别人的安装文档然后挑一篇出来作为自己的指导文档,一定要详细看安装包中附带的文档,一篇也不放过。在安装时, make 会 持续很长时间(一般都是一个小时以上,安装内核花费的时间最少,十来分钟左右),所以,一定要记得把错误输出重定向到日志文件中。在安装过程中出了错误再 把错误信息贴到网上去找解决方法。附带文档中要求的预先必须有的安装包一定要按照要求去做。出了错误不要轻易地把一切删除了重来,在出现错误时一定要保持 冷静,想尽办法去解决它,删除文件前一定要三思。不要轻易地说“我们重来吧”,最好是能在最少改动当前局面的情况下把问题给解决了。要勇敢地解决问题,不 要遇到问题就放弃或者重来。
现在是把所有东西都又重新来过。之前安装了 N 次,每次都遇到很多问题。现在把所有的 dependencies 都安装好了,然后按照 xen3.2.0 的文档上说的,直接 make world 。
( 注意,其中 xorg-x11-devel 在 cent os 上已经被另一个似乎是 mesa 的取代了,但 xen 只认 xorg-x11-devel ,通过查看 Makefile ,找到检查 xorg-x11-devel 是否安装的 shell 脚本,这个脚本是: xen-3.2.0/tools/check/check_x11_devel ,它在 /usr/include/X11 和 /usr/X11R6/include/X11 这两个目录下检查是否任何一个目录下存在 keysymdef.h 这个文件,如果两个目录下都没有这个文件,就表示 xorg-x11-devel 没有安装,报错,这个无所谓,在网上能找到这个文件的内容,大约有 2000 多行,把网上找到的这个文件放到任任意一个目录下面就可以解决这个问题 ) 。
现在 make world ,出现了下列问题:
cp
: cannot stat `build-linux-2.6.18-xen_x86_32/arch/i386/boot/vmlinuz': No such file or directory
make[ 3]: *** [build] Error 1
make[ 2]: *** [linux-2.6-xen-install] Error 2
make[ 1]: *** [install-kernels] Error 1
make : *** [world] Error 2
是说
cp
在指定的目录下找不到
vmlinuz
这个文件,显然是在编译内核时遇到的错误。查看,发现在
build-linux-2.6.18-xen_x86_32/arch/i386
下面没有
boot
这个目录。以前安装时也遇到过这个问题,当时自己的解决方法是进入
build-linux-2.6.18-xen_x86_32
,用
make menuconfig , make
先编译好这个内核,但是发现编译好的内核是
vmlinux
而不是
vmlinuz
,于是把它改名后复制到
build-linux-2.6.18-xen_x86_32/arch/i386/boot
目录下,后来
xen
make
完全成功但是重启进入系统失败,不知道和那种解决方法有没有关系。
make[ 3]: *** [build] Error 1
make[ 2]: *** [linux-2.6-xen-install] Error 2
make[ 1]: *** [install-kernels] Error 1
make : *** [world] Error 2
现在又遇到这个问题,感觉在整体没有把握的情况下去猜如何解决,实在是很没有方向。于是打算先了解这个错误发生前 make world 做过的事情。这里的错误信息看起来就是一个递归过程: make world 调用 make install-kernels ,后者又调用 make linux-2.6-xen-install ,然后在 make linux-2.6-xen-install 里面又是 make build ,然后 build 出错,于是形成了这样一个错误信息输出。那么,现在看看这几个 make 都做了些什么。在网上初步查了一下 makefile 的语法,找到 Makefile 中的 make world 部分:
# build xen , the tools, and a domain 0 plus unprivileged linux-xen images,
# and place them in the install directory. 'make install' should then
# copy them to the normal system directories
.PHONY: world
world :
$(MAKE) clean
$(MAKE) kdelete
$(MAKE) dist
make world
实际上先做清除工作然后
make dist
,再找
make dist
部分:
# and place them in the install directory. 'make install' should then
# copy them to the normal system directories
.PHONY: world
world :
$(MAKE) clean
$(MAKE) kdelete
$(MAKE) dist
# build and install everything into local dist directory
.PHONY: dist
dist : DESTDIR=$(DISTDIR)/install
dist : dist-xen dist-kernels dist-tools dist-docs
$(INSTALL_DIR) $(DISTDIR)/check
$(INSTALL_DATA) . /COPYING $(DISTDIR)
$(INSTALL_DATA) . /README $(DISTDIR)
$(INSTALL_PROG) ./install.sh $(DISTDIR)
$(INSTALL_PROG) tools/check/chk tools/check/check_* $(DISTDIR)/check
dist- %: DESTDIR=$(DISTDIR)/install
dist- %: install-%
@: # do nothing
这部分中有个
%
,这是
make
文件的一种规则,自己不是太懂,猜测意思就是前后一样,比如
dist-xen
的意思就是
install-xen
,
dist-kernels
的意思也就是
install-kernels
,即
make dist
时会检查
dist-xen , dist-kernel
等,而
dist-xen
等同于
install-xen
,可能就是这个意思。
.PHONY: dist
dist : DESTDIR=$(DISTDIR)/install
dist : dist-xen dist-kernels dist-tools dist-docs
$(INSTALL_DIR) $(DISTDIR)/check
$(INSTALL_DATA) . /COPYING $(DISTDIR)
$(INSTALL_DATA) . /README $(DISTDIR)
$(INSTALL_PROG) ./install.sh $(DISTDIR)
$(INSTALL_PROG) tools/check/chk tools/check/check_* $(DISTDIR)/check
dist- %: DESTDIR=$(DISTDIR)/install
dist- %: install-%
@: # do nothing
那么,现在看看 install-xen , install-kernels 等部分:
.PHONY: install-xen
install-xen :
$(MAKE) -C xen install
.PHONY: install-tools
install-tools :
$(MAKE) -C tools install
.PHONY: install-kernels
install-kernels :
for i in $(XKERNELS) ; do $(MAKE) $$i -install || exit 1; done
.PHONY: install-docs
install-docs :
sh ./docs/check_pkgs && $(MAKE) -C docs install || true
make –C
参数指定了一个目录,表示在执行操作前先进入
-C
后面的目录。所以,
make –C xen install
意思就是先进入
xen
目录,然后执行
make install
了。
install-xen :
$(MAKE) -C xen install
.PHONY: install-tools
install-tools :
$(MAKE) -C tools install
.PHONY: install-kernels
install-kernels :
for i in $(XKERNELS) ; do $(MAKE) $$i -install || exit 1; done
.PHONY: install-docs
install-docs :
sh ./docs/check_pkgs && $(MAKE) -C docs install || true
我们已经知道了 make dist 是分这几个步骤来的,那么我们分开执行,看看到底错误在哪里。
先执行 make install-xen :
[root@jcwkyl xen-3.2.0]# make install-xen
结果正确无误。现在执行 make install-tools:
[root@jcwkyl xen-3.2.0]# make install-tools 2>make_install_tools_err.log
发现了一些 warning ,还有两个看起来比较重要的如下:
Makefile:352 : *** pciutils-devl package not found - missing /usr/include/pci
Makefile:353 : *** PCI passthrough capability has been disabled
但是 make install-tools 仍然成功执行。现在执行 make intall -kernels :
[root@jcwkyl xen-3.2.0]# make install-kernels 2>make_install_kernels_err.log
并且趁机记录下来 make install-kernels 时执行的 makefile 中的语句在变量扩展后的形式:
for
i in linux-2.6-xen linux-2.6-xen0 linux-2.6-xenU ; do make $i -install || exit 1; done
再看看
Makefile
文件中对
install-kernels
的定义操作:
.PHONY: install-kernels
install-kernels :
for i in $(XKERNELS) ; do $(MAKE) $$i -install || exit 1; done
做这些仅是为了好玩,同时也能加深理解。因为这一步执行的很慢,再多看些东西:
install-kernels :
for i in $(XKERNELS) ; do $(MAKE) $$i -install || exit 1; done
make[
1]: Entering directory `/usr/local/Xen-3.2.0/xen-3.2.0'
make -f buildconfigs/mk.linux-2.6-xen build
make[ 2]: Entering directory `/usr/local/Xen-3.2.0/xen-3.2.0'
if grep "^CONFIG_MODULES=" build-linux-2.6.18-xen_x86_32/.config ; then /
make -C build-linux-2.6.18-xen_x86_32 ARCH=i386 modules || exit 1 ; /
make -C build-linux-2.6.18-xen_x86_32 ARCH=i386 INSTALL_MOD_PATH=/ modules_install ; /
fi
CONFIG_MODULES=y
make[ 3]: Entering directory `/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32'
make -C /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg O=/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32 modules
Using /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg as source for kernel
好了,现在
make install-kernels
退出了,看看错误输出日志文件的内容:
make -f buildconfigs/mk.linux-2.6-xen build
make[ 2]: Entering directory `/usr/local/Xen-3.2.0/xen-3.2.0'
if grep "^CONFIG_MODULES=" build-linux-2.6.18-xen_x86_32/.config ; then /
make -C build-linux-2.6.18-xen_x86_32 ARCH=i386 modules || exit 1 ; /
make -C build-linux-2.6.18-xen_x86_32 ARCH=i386 INSTALL_MOD_PATH=/ modules_install ; /
fi
CONFIG_MODULES=y
make[ 3]: Entering directory `/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32'
make -C /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg O=/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32 modules
Using /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg as source for kernel
[root@jcwkyl xen-3.2.0]# tail make_install_kernels_err.log
WARNING: drivers/atm/he.o - Section mismatch: reference to .init.text : from .text between 'he_start ' (at offset 0x20c5) and 'he_service_tbrq '
cp : cannot stat `build-linux-2.6.18-xen_x86_32/arch/i386/boot/vmlinuz': No such file or directory
make[ 2]: *** [build] Error 1
make[ 1]: *** [linux-2.6-xen-install] Error 2
make : *** [install-kernels] Error 1
现在能得出的结论就是在
make kernels
上出了重大问题。接下来呢?继续分析
Makefile
定位错误吗?从刚才的
make install-kernels
说起,这条命令导致以下三条命令被执行:
cp : cannot stat `build-linux-2.6.18-xen_x86_32/arch/i386/boot/vmlinuz': No such file or directory
make[ 2]: *** [build] Error 1
make[ 1]: *** [linux-2.6-xen-install] Error 2
make : *** [install-kernels] Error 1
make linux-2.6-xen-install
make linux-2.6-xen0-install
make linux-2.6-xenU-install
同样,现在把这三条命令拆开执行:
[root@jcwkyl xen-3.2.0]# make linux-2.6-xen-install 2>err.log
make
-f buildconfigs/mk.linux-2.6-xen build
…
执行结束了,查看
err.log
,果然出错了,错误就是上面反复提到的
cp
的那个错误。感觉,总共是编译三个内核,这是第一个内核,后面两个和这个应该也差不了多少,只要这个解决了,后面应该就不会出问题了。同时也看到了,执行
make
时用的是
buildconfig/mk.linux-2.6-xen
这个
makefile
,一路追踪下去,会发现这个
makefile
中仅有两三行变量定义,接着
include
了
buildconfig
目录下的
mk.linux-2.6-common
这个
makefile
,即,等于最终执行的是:
…
make –f buildconfigs/mk.linux-2.6-comman build
把这个文件中的 build 部分弄出来看看:
# The real action starts here!
.PHONY: build
build : $(LINUX_DIR)/include/linux/autoconf.h
ifneq ($(XEN_LINUX_ALLOW_INTERFACE_MISMATCH),y)
@if ! diff -urN -X buildconfigs/interface.exclude /
$(LINUX_SRCDIR)/include/xen /interface xen /include/public ; then /
echo "" 1>&2 ; /
echo " *** $(LINUX_SRCDIR)/include/xen /interface is out of date " 1>&2 ; /
echo " *** relative to $(XEN_ROOT)/xen /include/public." 1>&2 ; /
echo "" 1>&2 ; /
exit 1 ; /
fi
endif
if grep "^CONFIG_MODULES=" $(LINUX_DIR)/.config ; then /
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) modules || exit 1 ; /
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_MOD_PATH=$(DESTDIR) modules_instal /
l ; /
fi
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(DESTDIR) $(IMAGE_TARGET)
mkdir -p $(INSTALL_BOOT_PATH)
cp $(LINUX_DIR)/$(IMAGE_PATH) $(INSTALL_BOOT_PATH)/vmlinuz -$(KERNELRELEASE)
cp $(LINUX_DIR)/.config $(INSTALL_BOOT_PATH)/config -$(KERNELRELEASE)
cp $(LINUX_DIR)/System.map $(INSTALL_BOOT_PATH)/System.map -$(KERNELRELEASE)
……
为了把整个的
make
流程看个清楚,仔细看看
make –help
,发现
-n
参数能帮这个忙。于是:
.PHONY: build
build : $(LINUX_DIR)/include/linux/autoconf.h
ifneq ($(XEN_LINUX_ALLOW_INTERFACE_MISMATCH),y)
@if ! diff -urN -X buildconfigs/interface.exclude /
$(LINUX_SRCDIR)/include/xen /interface xen /include/public ; then /
echo "" 1>&2 ; /
echo " *** $(LINUX_SRCDIR)/include/xen /interface is out of date " 1>&2 ; /
echo " *** relative to $(XEN_ROOT)/xen /include/public." 1>&2 ; /
echo "" 1>&2 ; /
exit 1 ; /
fi
endif
if grep "^CONFIG_MODULES=" $(LINUX_DIR)/.config ; then /
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) modules || exit 1 ; /
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_MOD_PATH=$(DESTDIR) modules_instal /
l ; /
fi
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(DESTDIR) $(IMAGE_TARGET)
mkdir -p $(INSTALL_BOOT_PATH)
cp $(LINUX_DIR)/$(IMAGE_PATH) $(INSTALL_BOOT_PATH)/vmlinuz -$(KERNELRELEASE)
cp $(LINUX_DIR)/.config $(INSTALL_BOOT_PATH)/config -$(KERNELRELEASE)
cp $(LINUX_DIR)/System.map $(INSTALL_BOOT_PATH)/System.map -$(KERNELRELEASE)
……
[root@jcwkyl xen-3.2.0]# make -n linux-2.6-xen-install > make_process.log
-n 命令指示 make 不要去做实际的 build ,而仅仅是把要执行的命令输出出来。现在得到了这份 make 执行的流程文件,定位到 cp */vmlinuz 的那一部分是很简单的了,但是知道了又怎么样呢?看到 vmlinuz 就应该知道错误是在哪里了。
改 Makefile ,风险太大,那就换一种方式,先编译好内核,等有了 vmlinuz 文件后再执行 xen 的安装。
[root@jcwkyl xen-3.2.0]# make prep-kernels
这条命令成功执行。在 xen-3.2.0 目录下多出了三个内核的目录。根据安装文档上说的,可以复制一份现成的内核配置文件,然后执行 make oldconfig 来编译内核。所以:
[root@jcwkyl xen-3.2.0]# cp /boot/config-2.6.18-128.el5 build-linux-2.6.18-xen_x86_32/.config
把以前的 .config 文件覆盖掉。
[root@jcwkyl xen-3.2.0]# emacs build-linux-2.6.18-xen_x86_32/.config
找到其中和 ext2 以及 ext3 有关的部分,确认它们全部是 y ,这是因为前两天在 vmware 上编译 linux 内核时的经验。
但是有一个问题,如果仅仅是这样编译内核, make 的参数无法确定,即这个单独编译的内核并不知道有个 xen 在这里,因为它并不是从 xen 的安装过程中引发出来的编译过程,所以这个单独的内核编译过程必然对 xen 的安装是没有什么帮助的。现在尝试最有希望的解决方法,那就是稍微修改一下 Makefile 。
通过对照:在 make –n 执行后的 make_process.log 中寻找 mkdir –p( 因为错误信息是紧接着 mkdir –p 然后 cp 错误的 ) ,幸运的是只找到了一处。比对一下,看它是哪个 Makefile 里面的,如前面的分析,它其实就肯定是 buildconfigs/mk.linux-2.6-common 文件里的了,和这个文件进行对比, buildconfigs/mk.linux-2.6-common 文件中的语句是:
if grep "^CONFIG_MODULES=" $(LINUX_DIR)/.config ; then /
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) modules || exit 1 ; /
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_MOD_PATH=$(DESTDIR) modules_instal /
l ; /
fi
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(DESTDIR) $(IMAGE_TARGET)
mkdir -p $(INSTALL_BOOT_PATH)
cp $(LINUX_DIR)/$(IMAGE_PATH) $(INSTALL_BOOT_PATH)/vmlinuz -$(KERNELRELEASE)
cp $(LINUX_DIR)/.config $(INSTALL_BOOT_PATH)/config -$(KERNELRELEASE)
cp $(LINUX_DIR)/System.map $(INSTALL_BOOT_PATH)/System.map -$(KERNELRELEASE)
而
make –n
执行的文件中对应地方的语句是:
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) modules || exit 1 ; /
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_MOD_PATH=$(DESTDIR) modules_instal /
l ; /
fi
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(DESTDIR) $(IMAGE_TARGET)
mkdir -p $(INSTALL_BOOT_PATH)
cp $(LINUX_DIR)/$(IMAGE_PATH) $(INSTALL_BOOT_PATH)/vmlinuz -$(KERNELRELEASE)
cp $(LINUX_DIR)/.config $(INSTALL_BOOT_PATH)/config -$(KERNELRELEASE)
cp $(LINUX_DIR)/System.map $(INSTALL_BOOT_PATH)/System.map -$(KERNELRELEASE)
make
-C /usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32 /
KBUILD_SRC=/usr/local/Xen-3.2.0/linux-2.6.18-xen.hg /
KBUILD_EXTMOD="" -f /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg/Makefile vmlinuz
make[ 4]: Nothing to be done for `vmlinuz '.
make[ 2]: Leaving directory `/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32'
mkdir -p //boot
cp build-linux-2.6.18-xen_x86_32/arch/i386/boot/vmlinuz //boot/vmlinuz - make -C /usr/local/Xen-3.2/
.0/linux-2.6.18-xen.hg O=/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32 kernelrelease make -C /usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32 / KBUILD_SRC=/usr /loc/
al/Xen-3.2.0/linux-2.6.18-xen.hg / KBUILD_EXTMOD="" -f /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg/
/Makefile kernelrelease echo 2.6.18.8-xen
看到其实问题不止一个。
KBUILD_SRC=/usr/local/Xen-3.2.0/linux-2.6.18-xen.hg /
KBUILD_EXTMOD="" -f /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg/Makefile vmlinuz
make[ 4]: Nothing to be done for `vmlinuz '.
make[ 2]: Leaving directory `/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32'
mkdir -p //boot
cp build-linux-2.6.18-xen_x86_32/arch/i386/boot/vmlinuz //boot/vmlinuz - make -C /usr/local/Xen-3.2/
.0/linux-2.6.18-xen.hg O=/usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32 kernelrelease make -C /usr/local/Xen-3.2.0/xen-3.2.0/build-linux-2.6.18-xen_x86_32 / KBUILD_SRC=/usr /loc/
al/Xen-3.2.0/linux-2.6.18-xen.hg / KBUILD_EXTMOD="" -f /usr/local/Xen-3.2.0/linux-2.6.18-xen.hg/
/Makefile kernelrelease echo 2.6.18.8-xen
在网上查这个问题,只有一个人问,而且也是 xen3.2.0 版本,很有可能是 xen3.2.0 版本的一个 bug ,回头安装一次 xen3.3.0 或者其它版本试试看。
对这种安装过程感到厌倦,一个 make 过程动辄半个小时以上的时间,尽管以前被执行过,再执行一次检查也得花很长时间,而安装系统时,出现这样那样的错误,不断地想出更正的方法,然后运行 make , 等上半个小时以上的时间来看看自己想出来的更正方法是否有效,这个过程让人崩溃!有没有更有效的方法来做这样的事情?我想最好的方法就是做足准备工作,安 装过程中的每一步都必须走得异常小心,走每一步之前做好充分的准备和预见,而不是遇到问题再兵来将挡。尽量不要返工。最明显的路不是最快的路。一定要小 心。尽可能并行地工作。
再说那个 cp 的问题,最后自己的方法是在 mk.linux-2.6-common 文件中把 make 的那个 ${IMAGE_TARGET} 去掉,然后执行 make kernels ,到这里就能由 xen 的 make 过程引发出 linux-2.6-xen 的 make ,这个 make 生成的是 bzImage ,然后把 bzImage 改名为 vmlinuz ,然后重新运行 make ,然后就一路顺利了。奇怪的是,另外两个内核都 make 良好,观察了另外两个内核的 make 时候的输出,它们都确实是生成的 arch/i386/boot/vmlinuz ,只有第一个内核不是的。
现在配置 grub ,看看是不是确实成功了。首先要用 mkinitrd 命令生成对应的文件,中间可能会说什么 uhci , mptspi 什么的找不到,把所有的参数用上还有万能的 —builtin =XXX ,总之随机应变,硬凑出来一个也可以的。我用的命令是:
#mkinitrd --omit-scsi -modules --omit-raid-modules --omit-lvm -modules --without-usb --without-dmraid --builtin =mptspi initrd-2.6.18.8-xen0.img 2.6.18.8-xen0
#mkinitrd --omit-scsi -modules --omit-raid-modules --omit-lvm -modules --without-usb --without-dmraid --builtin =mptspi initrd-2.6.18.8-xenU.img 2.6.18.8-xenU
我的 grub 文件最后的形式是:
default=
0
timeout= 5
splashimage =(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.18-128.el5.img
title Xen 3.2.0 / XenLinux 2.6.18.8
kernel /xen-3.2.0.gz
module /vmlinuz-2.6.18.8-xen0 ro console=tty0
module /initrd-2.6.18.8-xen0.img
重启后,进入
xen0
内核成功。那个
xenU
内核暂时就不管它了,现在对
xen
也不熟。至于内核
xen
,为什么要有三个内核,这个真不知道,也是照着文档依葫芦画瓢的。
timeout= 5
splashimage =(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.18-128.el5.img
title Xen 3.2.0 / XenLinux 2.6.18.8
kernel /xen-3.2.0.gz
module /vmlinuz-2.6.18.8-xen0 ro console=tty0
module /initrd-2.6.18.8-xen0.img
(另外,用make -n还是不可能确定很多Makefile中变量的运行时内容的,上面用make -n生成的那个make_process.log中的内容与make时实际输出不符。)