在系統外解壓核心源 rpm (OpenSuse)?
我正在使用 LiveUSB USB 快閃記憶體/記憶棒中的 OpenSuse 11.2,可以說它沒有太多位置。我需要為這個版本的 OpenSuse 獲取 Linux 原始碼,因為需要它們來為我正在使用的應用程序建構驅動程序。我在附加的硬碟驅動器上有足夠的磁碟空間,所以我想在那裡“安裝”源(請注意,在 11.2 上,
zypper --download-only
預設情況下會下載到 /var/cache/zypp/packages,這會使我的 LiveUSB 設置崩潰)。因此,我執行以下操作:
> cd /media/myhdrive/ > wget http://download.opensuse.org/update/11.2/rpm/src/kernel-source-2.6.31.14-0.8.1.src.rpm > mkdir kernel-source-2.6.31.14 > cd kernel-source-2.6.31.14/ > rpm2cpio ../kernel-source-2.6.31.14-0.8.1.src.rpm | cpio -idmv --no-absolute-filenames > ls arch-symbols kernel-source.rpmlintrc patches.kabi.tar.bz2 built-in-where kernel-source.spec patches.kernel.org.tar.bz2 check-for-config-changes kernel-source.spec.in patches.rpmify.tar.bz2 check-supported-list kernel-spec-macros patches.rt.tar.bz2 compute-PATCHVERSION.sh kernel-syms.spec.in patches.staging.tar.bz2 ....
…並且有一堆
*.tar.gz
文件(更新檔) - 而不是任何類似於 C 源文件的東西。我猜我現在應該應用一個腳本/命令來解壓縮原始碼樹,但我不知道它是什麼——我在rpmbuild -bb ...
這裡看到過,但我想這會建構另一個.rpm
——而我想要解壓實際的原始碼(並且在我指定的位置 - 不在/usr/src
根文件系統中或任何地方)。有什麼想法我現在應該做什麼?
非常感謝您的任何答案,
乾杯!
編輯:通過建構自定義核心 - FedoraProject,嘗試
rpmbuild -bp
,但失敗:# man rpmbuild: # -bp Executes the "%prep" stage from the spec file. Normally this involves unpacking the sources and applying any patches. > mkdir src > rpmbuild --buildroot=$(pwd)/src/ -bp --target=$(uname -m) kernel-source.spec Building target platforms: i686 Building for target i686 error: Unable to open /usr/src/packages/SOURCES/kernel-spec-macros: No such file or directory
編輯:使用
-bc
開關rpmbuild
:-bc 從規範文件執行“%build”階段(在執行 %prep 階段之後)。
這通常涉及“製作”的等價物。
…因為
-bp
只會解壓縮與 .rpm 相關的“源”,但不會“製作”它們 - 這涉及應用特定的 SUSE 更新檔……我的使用嘗試rpmbuild -bp
留在下面以供參考 - 不是那個,關於它自己的,甚至不提取 linux 原始碼。下面是 using 的日誌rpmbuild -bc
,它既解壓原版原始碼並對其應用更新檔(*可以從終端日誌中看到,此處已省略;另請注意,已修補的原始碼將在 "BUILDROOT
"*中):> mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} > echo "%_topdir $(pwd)/rpmbuild" > ~/.rpmmacros > rpm -i ../kernel-source-2.6.31.14-0.8.1.src.rpm > ls rpmbuild/* rpmbuild/BUILD: rpmbuild/RPMS: rpmbuild/SOURCES: arch-symbols kernel-source.rpmlintrc patches.kernel.org.tar.bz2 built-in-where kernel-source.spec.in patches.rpmify.tar.bz2 ... > cd rpmbuild/SPECS > rm -rf ../BUILD/* > rpmbuild -bc --target=`uname -m` kernel-source.spec 2>&1 > ls ../BUILDROOT/ kernel-source-2.6.31.14-0.8.1.i386 > ls ../BUILD kernel-source-2.6.31.14 > ls -la ../BUILDROOT/kernel-source-2.6.31.14-0.8.1.i386/usr/src/ total 16 drwxr-xr-x 4 linux users 4096 2011-11-11 20:55 . drwxr-xr-x 3 linux users 4096 2011-11-11 20:54 .. lrwxrwxrwx 1 linux users 5 2011-11-11 20:54 linux -> linux drwxr-xr-x 24 linux users 4096 2011-11-11 20:56 linux-2.6.31.14-0.8.1 drwxr-xr-x 23 linux users 4096 2011-11-11 20:55 linux-2.6.31.14-0.8.1-vanilla > ls ../BUILDROOT/kernel-source-2.6.31.14-0.8.1.i386/usr/src/linux-2.6.31.14-0.8.1 arch crypto fs Kbuild MAINTAINERS README security virt block Documentation include kdb Makefile REPORTING-BUGS sound ....
好的,結果很複雜(考慮到我仍然不知道正確的方法),但是如何在 Centos/Xen 上編譯自定義核心或優化 CS:S 伺服器一文給出了答案。在那篇文章之後,我這樣做了(仍然在
kernel-source-2.6.31.14/
OP 中的目錄中):> mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} > echo "%_topdir $(pwd)/rpmbuild" > ~/.rpmmacros > rpm -i ../kernel-source-2.6.31.14-0.8.1.src.rpm > ls rpmbuild/* rpmbuild/BUILD: rpmbuild/RPMS: rpmbuild/SOURCES: arch-symbols kernel-source.rpmlintrc patches.kernel.org.tar.bz2 built-in-where kernel-source.spec.in patches.rpmify.tar.bz2 ... > cd rpmbuild/SPECS > rpmbuild -bp --target=`uname -m` kernel-source.spec Building target platforms: i686 Building for target i686 error: Failed build dependencies: fdupes is needed by kernel-source-2.6.31.14-0.8.1.src > sudo zypper install fdupes > rpmbuild -bp --target=`uname -m` kernel-source.spec Building target platforms: i686 Building for target i686 Executing(%prep): /bin/bash -e /var/tmp/rpm-tmp.4uWZo1 + umask 022 + cd /path/to/kernel-source-2.6.31.14/rpmbuild/BUILD + '[' -e /path/to/kernel-source-2.6.31.14/rpmbuild/SOURCES/linux-2.6.31.tar.bz2 ']' + echo 'Symbol(s): ' Symbol(s): + cd /path/to/kernel-source-2.6.31.14/rpmbuild/BUILD + rm -rf kernel-source-2.6.31.14 + /bin/mkdir -p kernel-source-2.6.31.14 + cd kernel-source-2.6.31.14 + /usr/bin/bzip2 -dc /path/to/kernel-source-2.6.31.14/rpmbuild/SOURCES/config.tar.bz2 + /bin/tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + /usr/bin/bzip2 -dc /path/to/kernel-source-2.6.31.14/rpmbuild/SOURCES/patches.arch.tar.bz2 + /bin/tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + /usr/bin/bzip2 -dc /path/to/kernel-source-2.6.31.14/rpmbuild/SOURCES/patches.drivers.tar.bz2 + /bin/tar -xf - + STATUS=0 ... [snip] ... + STATUS=0 + '[' 0 -ne 0 ']' + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + exit 0 > ls ../BUILD/kernel-source-2.6.31.14/ config patches.arch patches.kabi patches.rt patches.trace patches.addon patches.drivers patches.kernel.org patches.staging patches.xen patches.apparmor patches.fixes patches.rpmify patches.suse .... # ?? no linux sources?
…而且,令人驚訝的是,在這一切之後,我仍然看不到任何 linux 原始碼?
-e /path/to/kernel-source-2.6.31.14/rpmbuild/SOURCES/linux-2.6.31.tar.bz2
但是,我確實在上面的腳本中註意到了這一點;並猜測 linux*.tar.bz2 可能沒有被解壓(Symbol(s):
上面程式碼段的原始輸出中的行之後沒有任何內容);我基本上重複了rpmbuild
tmp 腳本所做的事情:# done previously > # cd ./rpmbuild/SPECS/ > # rpmbuild -bp --target=`uname -m` kernel-source.spec 2>&1 > cd ../.. > cd ./rpmbuild/BUILD/kernel-source-2.6.31.14/ > /usr/bin/bzip2 -dc ../../../rpmbuild/SOURCES/linux-2.6.31.tar.bz2 | /bin/tar -xf - > ls # linux-2.6.31 directory gets created > ls linux-2.6.31/ arch crypto fs Kbuild Makefile REPORTING-BUGS sound block Documentation include kernel mm samples tools ...
好吧..最後,這些是我能辨識的 linux 源文件:)
然而,那些似乎仍然是“香草”“未修補”的來源——我想有一個命令可以在修補的同時完成所有這些工作,但我不知道它是什麼……無論如何,希望這可能也幫助別人一點 - 乾杯!