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/

imagem

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:

imagem

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:

imagem

imagem

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.

imagem

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.

imagem

imagem

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.

imagem

Aqui vive os metadados para os pacotes. O arquivo Pacotes é legível por humanos (mas muito longo).

imagem

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.

imagem

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

cat < /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:

imagem

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:

imagem

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

imagem

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

imagem

Esta captura de tela mostra que o apt também está lendo o novo repositório.

imagem

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?

Fazemos todas as coisas do Raspberry Pi para viver. Entre em contato, se você precisar de suporte profissional com a sua configuração.

Actualmente cobramos uma taxa fixa de 1500 euros diários (+ impostos). Teremos o maior prazer em ajudá-lo 🙂

Leitura adicional

Sobre os pacotes: