qq78707 发表于 2015-10-12 07:15:20

xen 3.2.0 在cent os 5上的安装日志

  
经过这几天来的磕磕碰碰,总算成功安装上了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,出现了下列问题:
cp: cannot stat `build-linux-2.6.18-xen_x86_32/arch/i386/boot/vmlinuz': No such file or directory
make: *** Error 1
make: *** Error 2
make: *** Error 1
make: *** 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 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部分:
# buildxen, the tools, and a domain 0 plus unprivileged linux-xenimages,
# andplace them in the install directory. 'makeinstall' should then
# copy them to the normal system directories
.PHONY: world
world:
      $(MAKE) clean
      $(MAKE) kdelete
      $(MAKE) dist
make world实际上先做清除工作然后make dist,再找make dist部分:
# buildand install everything into local dist directory
.PHONY: dist
dist: DESTDIR=$(DISTDIR)/install
dist: dist-xendist-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/chktools/check/check_* $(DISTDIR)/check
dist-%: DESTDIR=$(DISTDIR)/install
dist-%: install-%
      @: # donothing
这部分中有个%,这是make文件的一种规则,自己不是太懂,猜测意思就是前后一样,比如dist-xen的意思就是install-xen,dist-kernels的意思也就是install-kernels,即make dist时会检查dist-xen, dist-kernel等,而dist-xen等同于install-xen,可能就是这个意思。
那么,现在看看install-xen, install-kernels等部分:
.PHONY: install-xen
install-xen:
      $(MAKE) -C xeninstall

.PHONY: install-tools
install-tools:
      $(MAKE) -C tools install

.PHONY: install-kernels
install-kernels:
      foriin $(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 xeninstall意思就是先进入xen目录,然后执行make install了。
我们已经知道了make dist是分这几个步骤来的,那么我们分开执行,看看到底错误在哪里。
先执行make install-xen:
# makeinstall-xen
结果正确无误。现在执行make install-tools:
# make install-tools 2>make_install_tools_err.log
发现了一些warning,还有两个看起来比较重要的如下:
Makefile:352: *** pciutils-devlpackage not found - missing /usr/include/pci
Makefile:353: *** PCI passthroughcapability has been disabled
但是make install-tools仍然成功执行。现在执行make intall-kernels:
# make install-kernels 2>make_install_kernels_err.log
并且趁机记录下来make install-kernels时执行的makefile中的语句在变量扩展后的形式:
for iinlinux-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:
      foriin $(XKERNELS) ; do $(MAKE) $$i-install || exit 1; done
做这些仅是为了好玩,同时也能加深理解。因为这一步执行的很慢,再多看些东西:
make: Entering directory `/usr/local/Xen-3.2.0/xen-3.2.0'
make -f buildconfigs/mk.linux-2.6-xen build
make: 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: 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退出了,看看错误输出日志文件的内容:
# tailmake_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: *** Error 1
make: *** Error 2
make: *** Error 1
现在能得出的结论就是在make kernels上出了重大问题。接下来呢?继续分析Makefile定位错误吗?从刚才的make install-kernels说起,这条命令导致以下三条命令被执行:
make linux-2.6-xen-install
make linux-2.6-xen0-install
make linux-2.6-xenU-install
同样,现在把这三条命令拆开执行:
# 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部分弄出来看看:
# Thereal 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 ; /
                exit1 ; /
      fi
endif
      ifgrep"^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参数能帮这个忙。于是:
# make-n linux-2.6-xen-install > make_process.log
-n命令指示make不要去做实际的build,而仅仅是把要执行的命令输出出来。现在得到了这份make执行的流程文件,定位到cp */vmlinuz的那一部分是很简单的了,但是知道了又怎么样呢?看到vmlinuz就应该知道错误是在哪里了。
改Makefile,风险太大,那就换一种方式,先编译好内核,等有了vmlinuz文件后再执行xen的安装。
# makeprep-kernels
这条命令成功执行。在xen-3.2.0目录下多出了三个内核的目录。根据安装文档上说的,可以复制一份现成的内核配置文件,然后执行make oldconfig来编译内核。所以:
# cp/boot/config-2.6.18-128.el5 build-linux-2.6.18-xen_x86_32/.config
把以前的.config文件覆盖掉。
# emacsbuild-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文件中的语句是:
         ifgrep"^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 /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: Nothing to be done for `vmlinuz'.
make: 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 kernelreleasemake -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/
/Makefilekernelreleaseecho 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=mptspiinitrd-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=mptspiinitrd-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 roroot=/dev/VolGroup00/LogVol00 rhgbquiet
      initrd/initrd-2.6.18-128.el5.img
title Xen3.2.0 / XenLinux2.6.18.8
      kernel/xen-3.2.0.gz
      module/vmlinuz-2.6.18.8-xen0 roconsole=tty0
      module/initrd-2.6.18.8-xen0.img
重启后,进入xen0内核成功。那个xenU内核暂时就不管它了,现在对xen也不熟。至于内核xen,为什么要有三个内核,这个真不知道,也是照着文档依葫芦画瓢的。


  (另外,用make -n还是不可能确定很多Makefile中变量的运行时内容的,上面用make -n生成的那个make_process.log中的内容与make时实际输出不符。)
             版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: xen 3.2.0 在cent os 5上的安装日志