Desempacotando rpm do kernel-source fora do sistema (OpenSuse)?

3

Estou usando o OpenSuse 11.2 a partir de um flash USB / LiveUSB, que provavelmente não tem muito espaço nele. Eu preciso obter os fontes do Linux para esta versão do OpenSuse, pois eles são necessários para construir um driver para um aplicativo que estou usando. Eu tenho muito espaço em disco em um disco rígido anexado, então eu gostaria de "instalar" as fontes lá ( note que em 11.2, zypper --download-only será por padrão faça o download para / var / cache / zypp / packages , que trava a configuração do LiveUSB ).

Então, faço o seguinte:

> 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
....

... e há um monte de arquivos *.tar.gz (patches) - e nada que se pareça com arquivos de código-fonte C. Eu estou supondo que há um script / comando que eu deveria aplicar agora para descompactar a árvore fonte, mas eu não tenho idéia do que - eu vi rpmbuild -bb ... aqui , mas eu acho que irá construir ainda outro .rpm - enquanto eu quero que as fontes reais sejam descompactadas (e que em um local eu especifique - não em /usr/src ou em qualquer lugar no sistema de arquivos raiz).

Alguma idéia do que devo fazer agora?

Muito obrigado antecipadamente por qualquer resposta,
Felicidades!

EDIT: via Criando um kernel personalizado - FedoraProject , tentando rpmbuild -bp , mas ele falha:

# 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
    
por sdaau 11.11.2011 / 19:21

1 resposta

1

EDIT: Use a opção -bc de rpmbuild :

-bc   Do the "%build" stage from the spec file (after doing the %prep stage).
    This generally involves the equivalent of a "make".

... uma vez que -bp apenas descompactará as "fontes" relacionadas ao .rpm, mas não as "tornará" - o que envolve a aplicação de patches específicos do SUSE ... Minha tentativa de usar rpmbuild -bp é deixada abaixo para referência - não que, por si só, nem mesmo extraia as fontes do Linux. Abaixo está o log de usar rpmbuild -bc , que descompacta fontes baunilha e aplica correções a elas (, que pode ser visto no log do terminal, que foi deixado de fora aqui; observe também que as fontes patched estarão em " 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
....
Ok, isso acabou sendo bastante confuso (dado que ainda não sei a maneira correta de fazer isso), mas o post Como compilar o kernel personalizado no Centos / Xen ou otimizar o servidor CS: S mostrou o caminho. Depois desse post, eu fiz isso ( ainda no kernel-source-2.6.31.14/  diretório como no 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?

... e, surpreendentemente, depois de tudo isso, ainda não consegui ver nenhuma fonte do Linux? No entanto, notei que -e /path/to/kernel-source-2.6.31.14/rpmbuild/SOURCES/linux-2.6.31.tar.bz2 no script acima; e adivinhando que o linux * .tar.bz2 provavelmente não foi descompactado (não havia nada após a linha Symbol(s): na saída original para o fragmento acima); Basicamente, repeti o que o script rpmbuild tmp fez:

# 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
...

Bem .. finalmente, esses são arquivos de código fonte do Linux que eu posso reconhecer :)

No entanto, essas ainda são, aparentemente, fontes "sem correção" - não corrigidas - acho que há um comando que faz tudo isso junto com patch, mas estou perdendo o que é ... De qualquer forma, Espero que isso também possa ajudar os outros um pouco - felicidades!

    
por 11.11.2011 / 20:44