1. 程式人生 > >(轉)xen make file

(轉)xen make file

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 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 部分:
# 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 ,可能就是這個意思。
那麼,現在看看 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 了。
我們已經知道了 make dist 是分這幾個步驟來的,那麼我們分開執行,看看到底錯誤在哪裡。
先執行 make install-xen
[[email protected] xen-3.2.0]# make install-xen
結果正確無誤。現在執行 make install-tools:
[[email protected] 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
[[email protected] 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
做這些僅是為了好玩,同時也能加深理解。因為這一步執行的很慢,再多看些東西:
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 退出了,看看錯誤輸出日誌檔案的內容:
[[email protected] 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 說起,這條命令導致以下三條命令被執行:
make linux-2.6-xen-install
make linux-2.6-xen0-install
make linux-2.6-xenU-install
同樣,現在把這三條命令拆開執行:
[[email protected] 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 引數能幫這個忙。於是:
[[email protected] xen-3.2.0]# make -n linux-2.6-xen-install > make_process.log
-n 命令指示 make 不要去做實際的 build ,而僅僅是把要執行的命令輸出出來。現在得到了這份 make 執行的流程檔案,定位到 cp */vmlinuz 的那一部分是很簡單的了,但是知道了又怎麼樣呢?看到 vmlinuz 就應該知道錯誤是在哪裡了。
Makefile ,風險太大,那就換一種方式,先編譯好核心,等有了 vmlinuz 檔案後再執行 xen 的安裝。
[[email protected] xen-3.2.0]# make prep-kernels
這條命令成功執行。在 xen-3.2.0 目錄下多出了三個核心的目錄。根據安裝文件上說的,可以複製一份現成的核心配置檔案,然後執行 make oldconfig 來編譯核心。所以:
[[email protected] xen-3.2.0]# cp /boot/config-2.6.18-128.el5 build-linux-2.6.18-xen_x86_32/.config
把以前的 .config 檔案覆蓋掉。
[[email protected] 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 /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
看到其實問題不止一個。
在網上查這個問題,只有一個人問,而且也是 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 ,為什麼要有三個核心,這個真不知道,也是照著文件依葫蘆畫瓢的。


相關推薦

()xen make file

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

make file 和 GCC標誌學習

tomat 所有 相等 ria 程序 pac depend extra gdb GCC: -Wall : 打開警告標誌 -std=standard : -ansi 相等 -std=c89 -ansi : 指定代碼應該符合什麽標準。 -c : Compile and asse

[]html之file標簽 --- 圖片上傳前預覽 -- FileReader

disabled scrip ade java undefine 內容 .com 知識 nim 記得以前做網站時,曾經需要實現一個圖片上傳到服務器前,先預覽的功能。當時用html的<input type="file"/>標簽一直實現不了,最後舍棄了這個標簽,使用

MAKE FILE 相關

CFLAGS 表示用於C編譯器的選項  CXXFLAGS 表示用於C++編譯器的選項  這兩個變數實際上涵蓋了編譯和彙編的兩個步驟 CFLAGS:指定標頭檔案(.h)的路徑,如:CFLAGS=-I/usr/include -I/path/include 。 相同地,安裝一

Make file 函式

Makefile中有很多函式,這裡逐步歸類: 1. if函式  函式原型: $(if <condition>,<then part>,<else part>)  函式說明:condition是判斷條件,如果condition返回非空字串

怎樣寫make file 檔案

二、一個示例正如前面所說的,如果一個工程有3個頭檔案,和8個C檔案,我們為了完成前面所述的那三個規則,我們的Makefile應該是下面的這個樣子的。edit : main.o kbd.o command.o display.o /insert.o search.o files.o utils.occ -o e

make file中ifneq含義

ifneq是比較兩個引數是否相同。 ifneq ($(BOARD_HAVE_BLUETOOTH_BCM),) 第二個引數空就是NULL 意思是$(BOARD_HAVE_BLUETOOTH_BCM)的值不是NULL就可以進行下面的編譯處理 $(BOARD_HAVE_BLU

解決跳出現 No input file specified.

yml follow options rule input ces 跳轉 file engine 項目根目錄中.htaccess文件修改為: <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEn

【Visual Studio】解決錯誤 fatal error C1010: unexpected end of file while looking for precompiled head(

set while err sin 結束 art fat 出現 using 原文轉自 http://blog.csdn.net/liuqiyao_01/article/details/38867145 在編譯VS時候,出現fatal error C1010: unexp

】HTML5的 input:file上傳類型控制

ati err format spa asi 拖拽 pdf 按鈕 shee 一、input:file屬性 屬性值有以下幾個比較常用: accept:表示可以選擇的文件MIME類型,多個MIME類型用英文逗號分開,常用的MIME類型見下表。 multiple:是否可以選擇多個

】shell腳本執行時報"bad interpreter: Text file busy"的解決方法

and files hat scrip proc nbsp comm this rep 1)問題現象: 在ubuntu下執行以下腳本( while_count),報錯: -bash: ./while_count: /bin/bash: bad interpreter: T

:/bin/bash^M: bad interpreter: No such file or directory

nbsp unix bash 執行 bin vim dir file 文本 執行一個腳本full_build.sh 時, 一直是提示我: -bash: ./full_build.sh: /bin/bash^M: bad interpreter: No such file o

make: Warning: File `Makefile' has modification time 1.8e+06 s in the future

通過 系統 -m time war rom 我想 warning mes 通過這個錯誤提示信息我們可以知道,Makefile的修改時間點是Linux當前的一個未來時間點。可以通過修改Linux的當前時間來解決這個問題: $sudo date -s ‘hh:mm:ss yy

[]Linux下is not in the sudoers file解決方法

出現 aud 名稱 vim file brief order mage ima 來源: http://jingyan.baidu.com/article/2a1383284bb3e8074a134f2d.html 當我們使用sudo命令切換用戶的時候可能會遇到提示以

spring MVC 的MultipartFileFile讀取

log [] res bsp 四種 transfer 失敗 字節數組 tran 第一種方法:    MultipartFile file = xxx; CommonsMultipartFile cf= (CommonsMultipartFile)file

is not in the sudoers file 解決()

col sudo命令 app root sudo 註意 保存文件 su - 當前 解決方案:首需要切換到root身份$su -(註意有- ,這和su是不同的,在用命令"su"的時候只是切換到root,但沒有把root的環境變量傳過去,還是當前用戶的環境變量,用"su -"命

[]從multifile獲取file式的inputstream

csdn 本地 input 一些事 tails -c ces ons class 轉載地址:http://blog.csdn.net/a975261294/article/details/75477374 從springmvc獲取到的文件是MultipartFile類型的,

將input type="file" 類型的圖片文件成base64

數據 gtest eve 保存圖片 文件 ron htm sim 鼠標 帶有圖片的form表單上傳數據是很麻煩的,因為圖片通常都是和文字分開上傳,這是很麻煩的,所有吧圖片轉成base64就可以和當成文字上傳了。話不多少,看代碼: 首先定義一個類型為file的input標簽還

()Linux命令詳解-file

版本信息 ref 獲取文件 linux命令 過程 嘗試 file img 文件類型 Linux命令詳解-file 原文:https://www.cnblogs.com/Dodge/p/4278306.html file命令用來識別文件類型,也可用來辨別一些文件的編碼格

解決plink報錯:.bim file has a split chromosome. Use --make-bed by itself to remedy this.

命令行 rem 兩個 報錯 class lin controls new some 由於plink1.9和1.07這兩個版本互掐,經常出現各種不兼容問題,“.bim file has a split chromosome. Use --make-bed by