2019/12/03

로컬 PPA deb 저장소 서버 인증 및 전체적 정리

로컬 환경 deb 패키지 다운로드 구성 방법

방법1)
가단한 설정 방법

sudo apt-get insall dpkg-dev

로컬 패키지 저장소
sudo mkdir -p /usr/local/fairdeb

저장소 이동
cd /usr/local/fairdeb

외부의 프로그램을 가지고 오기 위해서는 의존성 관련 패키지까지 다운로드 할 수 있도록 스크립트를 만든다.
sudo apt-get install apt-rdepends

#!/bin/sh

if [ $# -ne 1 ]; then
  prog=`basename ${0}`
  echo "usage: ${prog} <package>"
  exit 1
fi

TMP=`mktemp -t a.sh.XXXXXX`
trap "rm $TMP* 2>/dev/null" 0

check_virtual_package()
{
  apt show $1 2> /dev/null | grep "not a real package" > /dev/null
  return $?
}

get_provide_package()
{
  apt install -s $1 > ${TMP} 2> /dev/null

  local state=0
  local pkgs=""
  while read line; do
    if [ "${line}x" = "Package $1 is a virtual package provided by:x" ]; then
      state=1
    elif [ ${state} -eq 1 -a -n "${line}" ]; then
      pkg=`echo ${line} | awk '{ print $1 }'`
      echo ${pkg} | grep -v ':i386' > /dev/null && pkgs="${pkg} ${pkgs}"
    fi
  done < ${TMP}

  echo "${pkgs}"
}

get_depend_package()
{
  local pkgs=""
  local pkg=""

  for pkg in `apt-rdepends $1 2> /dev/null | grep -v "^  "`; do
    check_virtual_package ${pkg}
    if [ $? -eq 0 ]; then
      pkg=`get_provide_package ${pkg}`
    fi
    pkgs="${pkgs} ${pkg}"
  done

  echo "${pkgs}"
}

download_deb_package()
{
  local pkgs=""
  pkgs=`get_depend_package $1`
  apt download ${pkgs}
}

download_deb_package $1

./download-deb-package.sh ubuntu-desktop

이방식을 사용해 fair 기반의 의존성 패키지를 만든다.

기존 외부 환경 패키지 다운로드 경로 위치.
/var/cache/apt/archives

sudo apt-get install apt-cacher
apt-cacher를 설치 하면 /var/cache/Packages 추가 패키지가 저장된다.
현 보안장비의 경우 apt-cacher-ng를 설치 한다.
apt-cacher 은 서버에서 설치
apt-cacher-ng는 클라이언트 쪽에서 설치.
자세한건 테스트 결과를 적는다.

#! /bin/bash
 cd /usr/local/fairdeb
 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

~/bin 을 만들어 환경 변수 추가 후, 실행 권한 설정

chmod u+x ~/bin/update-mydebs

Packages.gz 파일이 apt-get 이 읽을 수 있는 파일.

파일 추사
vi /etc/apt/source.list

현재는 /etc/apt/source.d/fair.list
deb file:/usr/local/mydebs ./

추가 완료 후 패키지 적용
CD 에 패키지를 만들고 추가 하는 방법.
sudo apt-cdrom add

sudo update-mydebs
sudo apt-get update

=================================
웹 서버와 연동할 경우
===================


/var/www/debshttp://localhost/debs/amd64

cd /var/www/debs
dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz

저장소 등록
vi /etc/apt/sources.list
deb http://localhost/debs/ amd64/

apt-get update


==================
인증된 저장소 생성
==================

인증되지 않은 저장소를 사용할 경우
sudo apt-get -y --allow-unauthenticated

저장소 디렉토리 설정
mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial

sources.list 추가
deb file:/home/srv/packages/local-xenial/ ./

패키지 추가 및 제거

패키지 제거
rm -rf /home/srv/packages/local-xenial/some_package_idont_like

패키지 추가
cp /some/dir/apackage.deb /home/srv/packages/local-xenial

Packages, Releasw 및 InRlelase 파일을 생성하고 gpg 개인크로 서명하는 스크립트 실행.
#!/bin/bash

if [ -z "$1" ]; then
       echo -e "usage: `basename $0` DISTRO
DISTRO 우부툰 배포판 이름이다.(14.04 trusty 배포판 이름을 사용)\n
배포판 저장소 변경이 이루어 질때 이 스크립트를 사용한다, /srv/packages/local-DISTRO 로칼 저장소 .deb 파일 복사및 삭제 하면 스크립트가 동작\n
본 스크립트는 사용자 공간의 로컬 저장소 디렉토리에서  사용자 권한으로 실행한다."
else
    cd /srv/packages/local-"$1"

    # 패키지 파일 생성
    dpkg-scanpackages . /dev/null > Packages
    gzip --keep --force -9 Packages

    # 릴리즈 파일 생성
    cat conf/distributions > Release
    # date: 필드는 데비안 패키지 변경 로그 항목과 같은 형식이다.
    # 즉, 표준 시간대가 RFC 2822 time zone +0000 여기서 옵션 중 R 만 입력 하면 시스템 시간 설정과 동기화 된다.(하지만 보통 Ru UTC 시간을 사용)
    echo -e "Date: `LANG=C date -Ru`" >> Release
    # 리리즈 모든 저장소에 MD5 포함된다.
    echo -e 'MD5Sum:' >> Release
    printf ' '$(md5sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(md5sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release
    # 리리즈 모든 저장소 파일에 SHA256 포함된다.
    echo -e '\nSHA256:' >> Release
    printf ' '$(sha256sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(sha256sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release

    # 릴리즈 파일 삭제. 즉, 암호와 없이 서명
    gpg --clearsign --digest-algo SHA512 --local-user $USER -o InRelease Release
    # apt는 이전 버전의 Release.gpg 버전만 필요.
    # gpg -abs --digest-algo SHA512 --local-user $USER -o Release.gpg Release

    # 변경 사항 업데이트
    sudo apt-get update
fi

=========================================================================
인증 관련 정리
==============


=========================================================================
nginx 저장소 로컬 서버 설정
1. sudo apt-get install reprepro nginx

2. 저장소 디렉토리 설정
sudo mkdir -p /srv/reprepro/ubuntu/{conf,dists,incoming,indices,logs,pool,project,tmp}

$ cd /srv/reprepro/ubuntu/
$ sudo chown -R `whoami` . # 저장소 소유자를 현재 사용자로 변경

/srv/reprepro/ubuntu/conf/distributions(배포판)
Origin: Your Name
Label: Your repository name
Codename: karmic
Architectures: i386 amd64 source
Components: main
Description: Description of repository you are creating
SignWith: YOUR-KEY-ID

/srv/reprepro/ubuntu/conf/options
ask-passphrase
basedir .

3. 저장소 추가
$ reprepro includedeb karmic /path/to/my-package_0.1-1.deb \
# /path/to/my-package_0.1-1.deb 정의된 저장소 경로 지정

4. nginx 설정
/etc/nginx/sites-available/vhost-packages.conf
server {
  listen 80;
  server_name packages.internal;

  access_log /var/log/nginx/packages-access.log;
  error_log /var/log/nginx/packages-error.log;

  location / {
    root /srv/reprepro;
    index index.html;
  }

  location ~ /(.*)/conf {
    deny all;
  }

  location ~ /(.*)/db {
    deny all;
  }
}


5. 버커 사이즈 설정
/etc/nginx/conf.d/server_names_hash_bucket_size.conf
server_names_hash_bucket_size 64;

설정 가이드 링크
http://davehall.com.au/blog/dave/2010/02/06/howto-setup-private-package-repository-reprepro-nginx

==========================================================================

디렉토리 접근 가능하게 만든다.
sudo mkdir /var/my-local-repo

모든 deb 파일을 생성된 디렉토리에 복사한다.
디렉토리 스캔한다.
sudo dpkg-scanpackages /var/my-local-repo /dev/null > /var/my-local-repo/Packages

로컬 저장소를 추가한다.
echo "deb file:/var/my-local-repo ./" > /tmp/my-local.list

sudo mv /tmp/my-local.list /etc/apt/sources.list.d/my-local.list

sudo apt-get update

의존성 패키지 관련 정의
======================
로컬 저장소에서 패키지를 설치하려고 할 때 누락된 패키지가 있을 경우.

apt-cache depends <packagename> -i --recurse | tr -d "|,<,>, " | sed -e \
's/^Depends://g' | sed -e 's/^PreDepends://g' | sort | uniq > list.txt

다운로드
for i in $( cat list.txt ); do apt-get download $i; done;

패키지 스캔후 packages.gz 변경.
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz




댓글 없음:

댓글 쓰기