저는 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
답변1
편집: -bc
다음 스위치를 사용하십시오 rpmbuild
.
-bc 사양 파일에서 "%build" 단계를 실행합니다(%prep 단계 실행 후).
이는 일반적으로 "make"와 동등한 의미를 갖습니다.
.... -bp
rpm과 관련된 "소스"만 압축이 풀리고 특정 SUSE 패치를 적용하는 "만들기"는 풀리지 않기 때문입니다. 내 시도는 rpmbuild -bp
참조를 위해 아래에 남겨두었습니다. 그게 아닙니다. 자체적인 것입니다. Linux 소스 코드를 추출하지 않고도 말이죠. 다음은 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
...
알았어..드디어, 그거예내가 인식할 수 있는 리눅스 소스 파일 :)
그러나 이것들은 여전히 "바닐라" "패치되지 않은" 소스인 것 같습니다. 패치뿐만 아니라 이 모든 작업을 수행하는 명령이 있다고 가정하지만 그것이 무엇인지는 모르겠습니다... 어쨌든, 이것도 작동하기를 바랍니다. 도움말 다른 사람들은 조금 – 건배!