Como criar um pacote RPM a partir dos arquivos instalados?

8

Existem duas máquinas, versão / arco idêntico do SLES.

Na máquina # A, existe um software "foo" instalado que podemos ver usando rpm -qa.

Na máquina #B, o software "foo" precisa ser instalado.

O foo.rpmnão está disponível em nenhuma fonte, na internet etc.

Questão

Como o pacote foo.rpmfoi instalado na máquina # A, podemos criar um foo.rpmarquivo a partir dos arquivos já instalados?

Também existem scripts pré / pós nas rpm, eu acho. Portanto, o foo.rpm( com dependências? ) Pode ser instalado.

evacristina
fonte
Você pode encontrar quase todos os pacotes rpm daqui. rpmfind.net/linux/RPM
Ramesh

Respostas:

11

É possível, mas altamente difícil, fazer isso para que seja feito corretamente. Se você estiver desesperado, poderá criar um novo .specarquivo RPM e construir um arquivo RPM de origem "falso" (SRPM), que poderá ser usado para construir um arquivo RPM resultante usando rpmbuild --rebuild.

Em vez disso, continuaria pesquisando o RPM real. Você não indica qual é a sua pergunta, mas, de acordo com a minha experiência, você pode encontrar qualquer coisa na internet se souber como procurá-la. Eu encontrei versões antigas de RPMs para distribuições da Red Hat que não são usadas há mais de 10 anos, por isso acho difícil acreditar que não haja nenhum remanescente desse RPM em nenhum lugar.

Além disso, muitas vezes você pode voltar à origem do aplicativo contido no RPM e usá-lo para reconstruir o RPM também. Muitas vezes, os aplicativos de origem incluem um .specarquivo necessário que é usado para reconstruir o RPM.

Por fim, você pode obter a fonte e o .specarquivo de um serviço de compilação, como o Koji para distribuições baseadas no Red Hat. O SuSE também mantém serviços de construção semelhantes, para que você possa pesquisar através deles para obter artefatos de construção antigos.

Tomando os binários como estão

Você pode usar esse método para elevar os executáveis ​​reais de um sistema e tará-los para implantação em outro sistema.

máquina A

$ rpm -ql <packageNameHere> | xargs tar -zcvf /tmp/program.tgz

máquina B

$ tar -zxvf /path/to/your/program.tgz

Versão do RPM do SLES

De acordo com um dos posts deste tópico: Re: Como criar pacotes RPM a partir de pacotes instalados rpm no SLES, é suposto ter o switch --repackage. Isso não existe na versão Red Hat (no Fedora ou CentOS). Mas de acordo com o post, você pode usá-lo assim:

$ rpm -e --repackage <somepackage>

Após a conclusão, você encontrará seu RPM acessível aqui:

/var/spool/repackage

Usando rpmerizor

O Rpmerizor é uma ferramenta / script de terceiros que você pode instalar, que irá empacotar novamente os arquivos de origem no RPM correspondente. O uso desse script pode ser acessado aqui, intitulado: man page de rpmerizor .

excerto

Rpmerizor é um script que permite criar um pacote RPM a partir dos arquivos instalados. Você simplesmente precisa especificar arquivos na linha de comando e responder a algumas perguntas interativas para preencher os metadados do rpm (nome do pacote, versão ...). Você também pode usá-lo no modo de lote com opções de linha de comando para metadados.

Usando rpmrebuild

Não deve ser confundido com a ferramenta de construção rpmbuild, rpmrebuildé outro script de terceiros que você pode usar para fazer uma nova embalagem de um RPM já instalado.

excerto

O rpmrebuild é uma ferramenta para construir um arquivo RPM a partir de um pacote que já foi instalado em um uso básico, o uso do rpmrebuild não requer nenhum conhecimento de construção do rpm. (No debian, o produto equivalente é dpkg-repack).

Exemplo

Digamos que queremos reembalar o openssh-server.

$ rpm -aq | grep openssh-server
openssh-server-6.2p2-8.fc19.x86_64

Agora empacote:

$ rpmrebuild openssh-server-6.2p2-8.fc19.x86_64
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
..?......  c /etc/ssh/sshd_config
..?......  c /etc/sysconfig/sshd
Do you want to continue ? (y/N) y
Do you want to change release number ? (y/N) n
result: /root/rpmbuild/RPMS/x86_64/openssh-server-6.2p2-8.fc19.x86_64.rpm

Referências

slm
fonte
de qualquer maneira, é: jdk-1.6.0_02-fcs.rpm :) Não é sobre a "internet"
evachristine
Você pode obter RPMs oficiais para qualquer versão do JDK aqui: oracle.com/technetwork/java/javase/downloads/… . Isso levará você ao 1.6u2, que é a mesma versão.
Slm
como você pode saber que "jdk-1.6.0_02-fcs.rpm" é "1.6u2"? : O
evachristine
1
Eu encontrei!! OBRIGADO! foi nomeado: jdk-6u2-linux-i586.rpm OBRIGADO!
Evachristine
1
@evachristine - sim, é isso mesmo, feliz por resolvê-lo.
Slm
0

Como regra geral não.

Com um pouco de sorte rpm -qie rpm -q --changelogforneça informações sobre a origem do pacote.

Se ele foi construído no sistema em que está sendo executado, você ainda pode ter o arquivo de especificações usado para fazer a rpm real, se não os dois.

Como regra geral, eu não recomendo copiar arquivos / binários, mas a maioria das informações meta está no banco de dados RPM e você possui os arquivos reais.

rpm -q --list <pkg_name> mostra todos os arquivos que um pacote implementa.

rpm -q --scripts <pkg_name> mostrar todos os scripts que são executados instalando (ou removendo) o pacote pode fornecer pelo menos tanto conhecimento sobre sua finalidade quanto os arquivos implantados.

E todas as dependências que precisam ser instaladas podem ser encontradas com rpm -q --requires <pkg_name>.

HBruijn
fonte