Linux-Kernel

在系統外解壓核心源 rpm (OpenSuse)?

  • November 12, 2011

我正在使用 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):上面程式碼段的原始輸出中的行之後沒有任何內容);我基本上重複了rpmbuildtmp 腳本所做的事情:

# 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 源文件:)

然而,那些似乎仍然是“香草”“未修補”的來源——我想有一個命令可以在修補的同時完成所有這些工作,但我不知道它是什麼……無論如何,希望這可能也幫助別人一點 - 乾杯!

引用自:https://unix.stackexchange.com/questions/24448