로컬 APT 저장소를 작성하는 방법은 무엇입니까?


103

LAN에있는 시스템이 LAN에서 시스템을 업데이트하고 업그레이드 할 수 있도록 LAN에 자체 로컬 저장소를 빌드하고 싶습니다. 인터넷을 사용하지 않고 패키지에서 업데이트, 업그레이드, 설치 등을 수행 할 수 있도록 패키지를 다운로드하여 로컬 서버에 저장하려고합니다.



3
나는 그것이 중복이라고 생각하지 않습니다. maythux가 원하는 것은 적성과 함께 사용할 자체 저장소 서버를 만드는 것입니다. Keryx는 패키지 관리자로서 적성을 대체하고 패키지의 외부 소스를 작성합니다.
con-f-use

답변:


80

로부터 우분투 도움말 위키 :

간단한 저장소를 설정하는 4 단계가 있습니다

1. dpkg-dev
디렉토리에 패키지를 설치 하십시오.
3. 패키지를 스캔하고 apt-get update가 읽을 수있는 파일을 작성하는 스크립트를 작성
하십시오.

dpkg-dev 설치

터미널에 입력

sudo apt-get install dpkg-dev

디렉토리

패키지를 보관할 디렉토리를 만듭니다. 이 예에서는/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

이제 패키지를 방금 만든 디렉토리로 옮깁니다.

이전에 다운로드 한 패키지는 일반적으로 시스템의 /var/cache/apt/archives디렉토리 에 저장됩니다 . apt-cacher를 설치 한 경우 / packages 디렉토리에 추가 패키지가 저장됩니다.

스크립트 업데이트 mydebs

간단한 세 가지 라이너입니다.

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

위의 내용을 잘라서 gedit에 붙여넣고 ~ / bin에 update-mydebs로 저장하십시오. 물결표 '~'는 홈 디렉토리를 의미합니다. ~ / bin이 존재하지 않으면 디렉토리를 만드십시오. 우분투는 해당 디렉토리를 PATH에 넣습니다. 개인 스크립트를 넣을 수있는 좋은 장소입니다. 다음으로 스크립트를 실행 가능하게 만드십시오.

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackagesmydebs의 모든 패키지를보고 출력은 압축되어 apt-get update에서 읽을 수있는 파일 (Packages.gz)에 기록됩니다 (자세한 내용은 이에 대한 설명은 아래 참조). / dev / null은 빈 파일입니다. 패키지에 대한 추가 정보를 보유하는 대체 파일을 대체하며,이 경우에는 실제로 필요하지 않습니다. 알고 싶다면 deb-override (5)를 참조하십시오.

Sources.list

라인을 추가

deb file:/usr/local/mydebs ./

/etc/apt/sources.list로 이동하면 완료됩니다.

CD 옵션

debs가 포함 된 디렉토리를 CD에 굽고이를 저장소로도 사용할 수 있습니다 (컴퓨터 간 공유에 적합 함). CD를 리포지토리로 사용하려면 다음을 실행하십시오.

sudo apt-cdrom add

리포지토리 사용

mydebs 디렉토리에 새로운 deb를 넣을 때마다

sudo update-mydebs
sudo apt-get update

이제 Synaptic, aptitude 및 apt 명령 (apt-get, apt-cache 등)을 사용하여 로컬 패키지를 조작 할 수 있습니다. apt-get 설치를 시도하면 모든 종속성이 충족되는 한 모든 종속성이 해결됩니다. .

잘못 만들어진 패키지는 아마 실패하지만, dpkg 지옥을 견뎌 내지 못했을 것입니다.


3
라인의 구문을 설명해 주시겠습니까 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz? 무슨 일이있어 /dev/null도하고. 맨 페이지도 읽었지만 명확하지 않았습니다.
sayantankhan

@ blade19899 약간의 설명이 필요합니다. 필자가 만진 모든 패키지가 아닌 몇 가지 선택 패키지가있는 저장소를 원합니다. 이 기술이 저에게 그 능력을 줄 것이라는 것이 맞습니까? 여기서 목표는 소프트웨어 설치 그룹이 불필요한 LAN에 대한 유혹에서 멀리 떨어진 격리 된 LAN에서 사용할 수있는 저장소를 만드는 것입니다.
Wes Miller

@WesMiller 난 그냥 그의 게시물을 편집해야한다고 생각합니다!
blade19899

죄송합니다. 답변이 이해가되지 않습니다.
웨스 밀러

유 BigSack 필요 @WesMiller 난 그냥 문법 문제에 대한 자신의 게시물 (나는 잠시 그 빈을 생각)이 BigSack의 내 대답이 아니라 편집
blade19899

41

* LAN을 통해 오프라인 리포지토리를 만들려면 *

로컬 Apache 웹 서버 설치

# apt-get install apache2

기본적으로 데비안의 Apache 패키지는 /var/www시스템 아래 에 웹 사이트를 설정합니다 . 우리의 목적으로는 괜찮습니다. 따라서 더 이상 할 일이 없습니다. 즐겨 찾는 브라우저를 가리켜 서 쉽게 테스트 할 수 있습니다 . 데비안 패키지 리포지토리 디렉토리 생성에http://localhost 실제로 저장된 기본 사후 설치 웹 페이지가 나타납니다 . 디렉토리 생성을 선택했습니다/var/www/index.html




/var/www/debs이를 위해. 그 아래에는 지원해야 할 각 아키텍처마다 하나씩 "아키텍처"디렉토리를 작성해야합니다. 하나의 컴퓨터 (또는 컴퓨터 유형) 만 사용하는 경우 일반적으로 32 비트 시스템의 경우 "i386", 64 비트의 경우 "amd64"만 필요합니다. 다른 아키텍처를 사용하는 경우 아마도 이것에 대해 이미 알고 있다고 가정합니다. 이제 주어진 아키텍처에 대한 ".deb"패키지 파일을 적절한 디렉토리에 복사하십시오. http://localhost/debs/amd64예를 들어 즐겨 찾는 웹 브라우저를 가리키면 64 비트 시스템 용 패키지 목록이 표시됩니다.


Packages.gz 파일 만들기

이제 APT가 사용할 카탈로그 파일을 만들어야합니다. 이것은 "dpkg-scanpackages"라는 유틸리티로 수행됩니다. 이리'

# cd /var/www/debs/

# dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz




저장소를 APT

에 알리십시오. 이제 남은 유일한 일은 APT에게 저장소에 대해 알리는 것입니다. /etc/apt/sources.list 파일을 업데이트하면됩니다. 다음과 같은 항목이 필요합니다.

deb http://localhost/debs/ amd64/

로컬 호스트 대신 내 시스템의 실제 호스트 이름을 사용했습니다.이 방법으로 코드는 LAN의 모든 컴퓨터에서 동일하지만 로컬 호스트는 한 대의 컴퓨터 만 실행하면 정상적으로 작동합니다.
이제 APT를 업데이트하십시오.

# apt-get update

2
LAN에 있지 않을 때 /etc/apt/sources.list에 해당 줄을 추가하면 업데이트가 중단되지 않습니까?
Felix

2
우분투 16.04의 /var/www/debs경우이 답변 을로 바꿔야 할 수도 있습니다 /var/www/html/debs. 또는/etc/apache2
Erik

18

인증 된 리포지토리 생성

나는 여기와 다른 사이트에서 답변을 보았으며 대부분 인증되지 않은 저장소를 설정한다는 (IMHO 큰) 단점이 있습니다. 즉, 패키지를 설치하려면 apt-get함께 실행해야 --allow-unauthenticated합니다. 특히 설치하려는 패키지가 모두 로컬 리포지토리의 스크립트가 아닌 스크립트에서 보안 위험이 발생할 수 있습니다.

LAN을 통해 사용 가능하게 만드는 방법은 여기에서 다루지 않았지만 Apache 또는 nginx를 사용하는 상당히 일반적인 구성입니다 (여기의 다른 답변 참조).

repo 디렉토리 설정

mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial

그런 다음 다음과 같은 줄을 추가하십시오 sources.list.

deb file:/home/srv/packages/local-xenial/ ./

패키지 추가 및 제거

패키지 제거

rm /home/srv/packages/local-xenial/some_package_idont_like

패키지 추가

cp /some/dir/apackage.deb /home/srv/packages/local-xenial

이제 패키지, 릴리스 및 InRelease 파일을 생성하고 gpg 개인 키로 서명하는 다음 스크립트를 실행하십시오.

#!/bin/bash

if [ -z "$1" ]; then
       echo -e "usage: `basename $0` DISTRO
where DISTRO is the Ubuntu version codename (e.g. 14.04 is trusty)\n
The way to use this script is to do the changes to the repo first, i.e. delete or copy in the .deb file to /srv/packages/local-DISTRO, and then run this script\n
This script can be run as an unprivileged user - root is not needed so long as your user can write to the local repository directory"
else
    cd /srv/packages/local-"$1"

    # Generate the Packages file
    dpkg-scanpackages . /dev/null > Packages
    gzip --keep --force -9 Packages

    # Generate the Release file
    cat conf/distributions > Release
    # The Date: field has the same format as the Debian package changelog entries,
    # that is, RFC 2822 with time zone +0000
    echo -e "Date: `LANG=C date -Ru`" >> Release
    # Release must contain MD5 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    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
    # Release must contain SHA256 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    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

    # Clearsign the Release file (that is, sign it without encrypting it)
    gpg --clearsign --digest-algo SHA512 --local-user $USER -o InRelease Release
    # Release.gpg only need for older apt versions
    # gpg -abs --digest-algo SHA512 --local-user $USER -o Release.gpg Release

    # Get apt to see the changes
    sudo apt-get update
fi

conf / distributions 파일의 내용 예

Origin: My_Local_Repo Label: My_Local_Repo Codename: xenial Architectures: i386 amd64 Components: main Description: My local APT repository SignWith: 12345ABC

연결

https://wiki.debian.org/RepositoryFormat

http://ubuntuforums.org/showthread.php?t=1090731

https://help.ubuntu.com/community/CreateAuthenticatedRepository


@ 필립 편집을 사용 date -Rc했습니다 date -Ru. 편집 설명의 의미 인 것으로 가정 하여 수정했습니다
muru

감사합니다. 최근에 UTC가 아닌 로컬 TZ에 생성 된 날짜로 인해 이에 대해 경고를 받기 시작했습니다. 난 내 자신의 스크립트에서 해결하지만, 여기에서 수정하는 것을 잊지
happyskeptic

1
@KevinJohnson 내 지역 APT의 repo에서 해당 파일의 예와 이제 메인 대답을 업데이 트했습니다
happyskeptic

8

nginx 및 reprepro를 통해 로컬 소스 서버를 설정할 수도 있습니다.

  1. 데비안 패키지 설치

    sudo apt-get install reprepro nginx 
    
  2. reprepro에 대한 디렉토리를 만들고 편집

    sudo mkdir -p /srv/reprepro/ubuntu/{conf,dists,incoming,indices,logs,pool,project,tmp}
    
    $ cd /srv/reprepro/ubuntu/
    $ sudo chown -R `whoami` . # changes the repository owner to the current user
    

    / srv / reprepro / ubuntu / conf / 배포

    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에 포함시키고 빌드하십시오.

    $ reprepro includedeb karmic /path/to/my-package_0.1-1.deb \
    # change /path/to/my-package_0.1-1.deb to the path to your package
    
  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;
    

설치 안내서 링크 참조


4
이것이 이론적으로 질문에 대답 할 수 있지만 여기에 답의 핵심 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 바람직 합니다.
gertvdijk

@elprup : 당신은 대답을 :) 업데이트 잊어 버린해야한다
0xC0000022L

reprepor는 동일한 패키지의 여러 버전을 지원하지 않습니다. 이상하게 들리지만 이것이 reprepro가 작동하는 방식입니다
maxadamo

6

당신은보고 싶을 수도 apt-mirrorapt-cacher.

다음은 설치 및 사용 방법에 대한 안내서입니다 .


5 년 전의 답변이 LQ로 표시됩니다. 삭제 된 경우 메타로 이동하여 삭제 취소를 요청하십시오. 공개적으로 투표 했지만 수정이 필요합니다! ;-)
Fabby

5

@BigSack의 답변Ubuntu의 공식 위키 게시물 의 지침은 Ubuntu 18.04에서 작동하지 않았습니다.이 두 가지 변경 사항이 있습니다.

  1. 압축되지 않은 일반 Packages파일 생성 (이 파일을 실행할 때 작업 디렉토리 모든 패키지가있는 위치에 있어야 함)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. 다음 항목을 추가하십시오 /etc/apt/sources.list

    deb [trusted=yes] file:/usr/local/mydebs ./
    

4

로컬 저장소를 작성해야하는 몇 가지 이유가 있습니다. 첫 번째는 업데이트 할 Ubuntu 시스템이 여러 개인 경우 대역폭을 절약하려는 것입니다. 예를 들어 적어도 일주일에 한 번 업데이트해야하는 25 개의 Ubuntu 시스템이있는 경우 리포지토리를 로컬로 제외한 모든 작업을 수행 할 수 있으므로 대역폭을 크게 절약 할 수 있습니다.

대부분의 조직에는 네트워크 게이트웨이에 알맞은 대역폭이 있지만이 대역폭은 현명하게 사용해야하는 소중한 상품입니다.

많은 조직에는 여전히 게이트웨이에 10MB 또는 100MB 제한을 가진 라우터가 있지만 내부적으로 1GB 네트워크 연결이 있으므로 내부적으로 대역폭을 더 잘 사용할 수 있습니다. 자체 저장소를 생성하는 두 번째 이유는 내부 Ubuntu 시스템에로드되는 응용 프로그램을 제어 할 수 있기 때문입니다.

머신을 업데이트하는 리포지토리에서 조직이 로컬 네트워크에서 사용하지 않으려는 응용 프로그램을 제거 할 수 있습니다. 또한 보안 및 안정성을 보장하기 위해 테스트 상자를 만들고 응용 프로그램 및 버전을 네트워크에 배포하기 전에 테스트 할 수 있습니다.

먼저 미러를 설정해야 키보드에서 Ctrl+ Alt+ T를 눌러 터미널을 열어야합니다. 열리면 아래 명령을 실행하십시오.

apt-get install apt-mirror 

apt-mirror를 설정했으면이 명령으로 저장소 다운로드를 시작할 수 있습니다.

아파트 거울 /etc/apt/mirror.list 1

읽어

1 출처 : 우분투 리포지토리 생성


죄송합니다, 링크가 죽었
xamiro는

3

오프라인 로컬 리포지토리를 만들려면
1. dir에 액세스 가능하게 만들기 (루트별로)

sudo mkdir / var / my-local-repo

  1. 모든 deb 파일을이 디렉토리에 복사하십시오.
  2. 디렉토리를 스캔

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / 패키지

  1. 소스에 로컬 저장소를 추가하십시오.

echo "deb 파일 : / 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 업데이트


공식 위키에도 비슷한 내용이 있습니다 : 저장소 / 개인-커뮤니티 도움말 Wiki
sdaau

1

apt-rdepends선택한 답변과 같이 사용 하려고했지만 로컬 리포지토리에서 패키지를 설치하려고 할 때 종속성 누락에 대해 불평했습니다.

apt-rdepends내 패키지에 대한 일부 종속성을 나열하지 않았습니다. 나는 그것이 사실과 관련이 있다고 생각 apt-cache show합니다.

대신 나는을 사용 apt-cache depends했고 그 트릭을 수행했습니다.

재귀 종속성 목록 가져 오기

apt-cache depends <packagename> -i --recurse

-i: 중요한 종속성 만 --recurse: 재귀

그것을 소화 가능한 목록으로 바꾸십시오

  • 기호 및 공백 제거 | tr -d "|,<,>, "
  • 다음에 따라 제거 : & 사전 의존 : | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • 목록 정렬 : | sort
  • 고유 한 값만 : | uniq > list.txt

완전한 명령 :

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

1
당신이 말하는 대답을 참조하는 것이 좋습니다.
anonymous2

-1

apt-mirror를 사용했습니다.

좋지만 repos 서버와 동기화되므로 더 많은 하드 드라이브 공간이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.