Criação de um repositório Raspbian
Se você quer hospedar seu próprio repositório Raspbian, este artigo é para você.
Um repositório Raspbian consiste em uma estrutura de diretório especial em um webserver. Os arquivos, incluindo os pacotes, são todos estáticos - portanto este repositório também poderia simplesmente ser hospedado em um Amazon S3, por exemplo.
A entrada sources.list em Raspbian
/etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ estiramento principal contrib não livre rpi
/etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ ui principal de estiramento
Estas são as entradas padrão para os repositórios de pacotes no Raspbian.
A estrutura é a seguinte:
- deb : fonte para pacotes binários
- http://raspbian.raspberrypi.org/raspbian/ : URL do repositório
- stretch : a "distribuição" / liberação / nome de código (em alguns casos também é possível especificar subdiretórios aninhados mais profundamente, por exemplo, stretch/updates)
- contrib principal rpi não livre : os componentes que lhe interessam a partir deste repositório, separados por um espaço
NB: apt a partir do Debian / Raspbian Stretch inclui suporte para https por padrão. Caso contrário você teria que instalar o pacote apt-transport-https;
Aqui está uma página web que explica porque o https não é necessário para a instalação de pacotes.
Uma estrutura de diretório de repositório
Dê uma olhada no http://raspbian.raspberrypi.org/ estrutura do diretório do repositório:
http://raspbian.raspberrypi.org/
Este diretório principal contém vários subdiretórios, e notadamente o raspbian.public.key
Alguns dos subdiretórios são para propósitos diversos, por exemplo, imagens - não necessárias para um repositório Debian / Raspbian Raspberry Pi normal.
De interesse aqui são os
- companheiro
- raspbian
subdiretórios, e os já mencionados raspbian.public.key.
A chave é um arquivo de texto, gerado pelo GnuPG. Aqui está como parece:
etc.
Esta chave é necessária para verificar se você está de fato comunicando com o repositório certo, que ele afirma ser. Se você confia no repositório, você adiciona a chave ao seu chaveiro apt (veja abaixo instruções de como adicionar sua própria chave e instalar pacotes a partir do seu novo repositório).
Depois pode ser usado pelo apt para verificar as assinaturas dos metadados do repositório APT. Os pacotes em si não são normalmente assinados pelo GPG / não estão sendo verificados. Consulte o artigo em embalagem para obter detalhes.
Repositórios como subpastas
mate e raspbian são dois repositórios diferentes (para o Raspberry Pi, neste caso).
Por favor note: aptly - a ferramenta para publicar seu próprio repositório explicada abaixo - será padrão para a webroot, e mostrará a pasta de discos na webroot, mas você também pode especificar um caminho para publicar abaixo.
Vamos olhar para a pasta raspbian, que para os nossos propósitos é um desses repositórios:
A pasta dists contém os lançamentos / distribuições do Raspbian - codinome em sincronia com os lançamentos do Debian. A estável atual - a partir de 2.4.2019 - sendo Esticar.
Eles têm o nome de personagens do Toy Story. O próximo lançamento é Buster.
“estábulo" é idêntico a "esticar" (actualmente). Ele apontará para o lançamento estável mais recente.
Este diretório contém vários arquivos necessários para o funcionamento das ferramentas apt. Notavelmente os arquivos InRelease, Release e Release.gpg.
- InRelease: assinado em linha
- Release - vai junto com Release.gpg (assinatura)
estes arquivos listam os arquivos de índice para a distribuição e seus hashes.
…
um ficheiro InRelease de exemplo, com a assinatura em linha na parte inferior.
É como uma espécie de mapa para o apt - onde os arquivos de listagem de pacotes podem ser encontrados, e em quais formatos (.gz e .xz sendo formatos compactados) eles podem ser baixados.
Aqui vive os metadados para os pacotes. O arquivo Pacotes é legível por humanos (mas muito longo).
nomeadamente este ficheiro contém um link para o "pool", para o pacote actual.
Nome do ficheiro: pool/rpi/g/gst-omx1.0/gstreamer1.0-omx_1.0.0.1-0+rpi12+jessiepmg_armhf.deb
rpi é o nome do componente, e os pacotes são ainda divididos pela primeira letra.
o piscina é usado para evitar a duplicação de pacotes.
Olhe para este site informativo para mais informações sobre o formato do Repositório Debian:
https://wiki.debian.org/DebianRepository/Format
Usando apropriadamente - publicando seu próprio repositório, com seus próprios pacotes
Aptly é uma ferramenta para configurar e publicar facilmente o seu próprio Repositório .deb - para o Debian e seus irmãos e primos.
Isto inclui o Ubuntu, mas é claro que também o Raspbian.
Então, se você quer publicar um repositório Raspbian, é assim que você o faz.
Preparar um contentor Docker
Eu criei um contentor Docker, baseado neste repositório de git:
https://github.com/urpylka/docker-aptly
mudanças que eu introduzi:
- DE ubuntu:bionico
- gnupg1
- gpgv1
- O comando gpg é executado explicitamente como gpg1 (caso contrário as chaves públicas e privadas serão salvas de forma diferente, e tudo não funcionará como esperado)
Portanto, haverá algumas explicações adicionais abaixo. Em todo o roteiro do urpylka é um ponto de partida muito conveniente, se você quiser correr no Docker.
Além disso, eu recomendo fortemente que você use o docker-compose, em vez de executar manualmente esses comandos longos de execução do docker run.
Aqui está o meu ficheiro portuário para a sua referência
# Copyright 2019 Maximilian Batz
# Copyright 2018 Artem B. Smirnov
# Copyright 2018 Jon Azpiazu
# Copyright 2016 Bryan J. Hong
#
# Licenciado sob a Licença Apache, Versão 2.0 (a "Licença");
# você não pode utilizar este arquivo, exceto em conformidade com a Licença.
# Você pode obter uma cópia da Licença em
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# A menos que exigido pela lei aplicável ou acordado por escrito, software
# distribuído sob a Licença é distribuído em uma base "COMO ESTÁ",
# SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam expressas ou implícitas.
# Veja a Licença para a língua específica que rege as permissões e
# limitações sob a Licença.DE ubuntu:bionico
LABEL maintainer=""
ENV DEBIAN_FRONTEND não-interativo
RUN apt-get -q update \
&& apt-get -y install \\
gnupg1 && apt-key adv -keyserver pool.sks-keyservers.net -recv-keys ED75B5A4483DA07C \
&& echo "deb http://repo.aptly.info/ squeeze main" >> /etc/apt/sources.list# Actualizar repositório APT & instalar pacotes
RUN apt-get -q update \
&& apt-get -y install \\
apropriadamente=1.3.0 {\i1}
bzip2 {\i1}
gpgv1 {\i1}
graphviz
supervisor \\i1
nginx
esquecer
xz-utils \\i1
aptos-utils \\
&& apt-get clean \\
&& rm -rf /var/lib/apt/lists/*# Instalar Configuração Aptly
COPY assetss/aptly.conf /etc/aptly.conf# Scripts de instalação
COPY assetss/*.sh /opt/# Instalar Nginx Config
RUN rm /etc/nginx/sites-enabled/*
COPY assets/supervisord.nginx.conf /etc/supervisor/conf.d/nginx.conf
CORRER eco "daemon off;" >> /etc/nginx/nginx.conf# Local de montagem Bind
VOLUME ["/opt/aptly" ]# Executar script de inicialização quando o contêiner é iniciado
ENTRYPOINT [ "/opt/startup.sh" ]
Note que, a partir de 2.4.2019, a versão 1.3.0 ainda é a mais recente.
Ligação ao recipiente adequado
execução portuária - apto /bin/bash
Neste caso, o seu contentor é adequadamente nomeado, abre um terminal interactivo com /bin/bash. Todos os outros comandos são executados dentro do contêiner.
Geração das chaves GPG
O script de encaixe mencionado acima cria automaticamente chaves GPG para você, passando em sua senha para um arquivo no contêiner. O script relevante é este:
#! /usr/bin/env bash
# Copyright 2016 Bryan J. Hong
# Licenciado sob a Licença Apache, Versão 2.0cat < /opt/gpg_batch
%echo Generating a GPG key, might take a while
Tipo de chave: RSA
Comprimento da chave: 4096
Subkey-Type: ELG-E
Sub-Comprimento: 1024
Nome-Real: ${FULL_NAME}
Nome-Comentário: Assinatura Aptly Repo
Nomee-Email: ${ENDEREÇO_DE_EMAIL}
Data de expiração: 0
Frase de passagem: ${GPG_PASSWORD}
%pubring /opt/aptly/aptly.pub
%secring /opt/aptly/aptly.seg
%compromisso
%echo done
EOF
Isto é executado se as chaves não existirem, a partir do ponto de entrada do recipiente:
# Se o par de chaves GPG do repositório não existe, crie-o.
se [[[ ! -f /opt/aptly/aptly.sec ]] || [[[ ! -f /opt/aptly/aptly.pub ]]; então
echo "Gerar novas chaves gpg"
cp -a /dev/urandom /dev/random
/opt/gpg_batch.sh
# Se o seu sistema não tem muita entropia, isto pode demorar muito tempo.
# Google como criar entropia "artificial" se esta ficar presa
gpg1 -batch -gen-key /opt/gpg_batch
além disso
echo "Não há necessidade de gerar novas chaves gpg"
fi
Note minha versão "melhorada" (gpg1 ao invés de apenas gpg sendo especificado) - isso parece ser necessário para o castor biônico Ubuntu, caso contrário você terá gpg 2 como padrão.
Nota: este arquivo conterá a sua senha! Portanto, recomendo que a remova após a configuração inicial ter sido concluída.
Infelizmente, o gpg1 NÃO parece suportar o controle %ask-passphrase. Portanto, se você quiser fazer a geração em lote das chaves, a senha da chave precisa estar no arquivo de lote.
Publicar / exportar a chave pública do GPG
mkdir -p /opt/aptly/público
gpg1 -export -armor > /opt/aptly/public/repository.picockpit.key
nomear a chave apropriadamente. -armor é usado para exportar a chave em formato ASCII (em oposição ao binário).
note que estes são dois traços, espero que o WordPress não os destrua. Além disso, aqui o gpg1 é usado em vez de apenas gpg
Criar um novo repositório
aptly repo create -comment="picockpit.com Repository" -component="main" -distribution="stretch" pcp-repository
Cria um novo repositório local, no qual você pode adicionar pacotes. Este repositório ainda não está publicado.
-comentário : texto para descrever o repositório local
-componente: componente padrão ao publicar
-distribuição: distribuição padrão (lançamento) ao publicar
pcp-repositório: este é um nome personalizado que eu dei a este repositório local, você pode usar o seu próprio aqui. Certifique-se de modificar os outros comandos de acordo e use o nome que você escolher aqui.
Adicionar pacotes .deb ao repositório
apropriadamente repo add pcp-repository /opt/aptly/testpackage/
Aqui eu estou adicionando uma pasta de pacotes ao repositório local que eu criei no passo anterior. aptly irá reconhecer os pacotes adicionados, como este:
Criar instantâneo
Embora seja possível publicar um reporte diretamente, é fortemente recomendado criar um instantâneo, e publicar o instantâneo.
criar fotografia de pcp-snapshot a partir do repo pcp-repositório
pcp-snapshot sendo um nome personalizado, e pcp-repositório o nome que você deu para o repositório mais acima.
Publicar instantâneo
Publicar adequadamente o instantâneo do pcp-snapshot
Durante a publicação do instantâneo, você será solicitado duas vezes para a sua senha de gpg:
aptly irá publicar no diretório /opt/aptly/público, do qual o Nginx ou outro webserver de sua escolha irá servir. Não há necessidade de
Consulte também esta documentação:
Mudar repositório publicado
Se você cometeu um erro, e gostaria de trocar o repositório publicado para um outro snapshot, você pode usar o switch de publicação adequado:
publicar corretamente o pcp-snapshot raspbian do switch
Isto irá mudar o trecho de distribuição, sob o caminho raspbian, com o novo snapshot pcp-snapshot.
Adicionando seu repositório a um sistema
Importar a chave
cacho -L http://192.168.1.2:3200/repository.picockpit.key | sudo apt-key add -
O comando vai buscar a chave usando a tecla curl, e depois canaliza-a para a tecla apt-key. Há também uma funcionalidade de busca de chaves apt-key, mas depende de um pacote que não está instalado no Raspbian por padrão.
Se você não fizer isso, o apt não será capaz de pegar os pacotes do novo repositório, e jogará erros!
Adicionar o repositório
echo "deb http://192.168.1.2:3200/raspbian stretch main" | sudo tee -append /etc/apt/sources.list.d/picockpit.list
O subdiretório em /etc/apt/sources.list.d só pode ser escrito pela raiz. o -append garante que o arquivo não seja sobrescrito, se ele já deveria existir.
Também seria possível criar o arquivo manualmente e, por exemplo, usando nano, adicionar a linha
deb http://192.168.1.2:3200/raspbian trecho principal
Instalar pacotes
sudo apt-get update
sudo apt-get install packagename
Esta captura de tela mostra que o apt também está lendo o novo repositório.
instalando um pacote de amostra.
Criação de um pacote
Eu o remeto para este excelente artigo sobre como criar um pacote Debian.
Certifique-se apenas de mudar a Arquitectura para armhf para a plataforma Raspberry Pi.
Precisa de apoio profissional?
Actualmente cobramos uma taxa fixa de 1500 euros diários (+ impostos). Teremos o maior prazer em ajudá-lo 🙂
Leitura adicional
- https://blog.packagecloud.io/eng/2014/10/28/howto-gpg-sign-verify-deb-packages-apt-repositories/
- https://wiki.debian.org/DebianRepository/Format
- https://github.com/urpylka/docker-aptly
Sobre os pacotes: