LAN에있는 시스템이 LAN에서 시스템을 업데이트하고 업그레이드 할 수 있도록 LAN에 자체 로컬 저장소를 빌드하고 싶습니다. 인터넷을 사용하지 않고 패키지에서 업데이트, 업그레이드, 설치 등을 수행 할 수 있도록 패키지를 다운로드하여 로컬 서버에 저장하려고합니다.
LAN에있는 시스템이 LAN에서 시스템을 업데이트하고 업그레이드 할 수 있도록 LAN에 자체 로컬 저장소를 빌드하고 싶습니다. 인터넷을 사용하지 않고 패키지에서 업데이트, 업그레이드, 설치 등을 수행 할 수 있도록 패키지를 다운로드하여 로컬 서버에 저장하려고합니다.
답변:
로부터 우분투 도움말 위키 :
간단한 저장소를 설정하는 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-scanpackages 는 mydebs의 모든 패키지를보고 출력은 압축되어 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 지옥을 견뎌 내지 못했을 것입니다.
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
? 무슨 일이있어 /dev/null
도하고. 맨 페이지도 읽었지만 명확하지 않았습니다.
* 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
/var/www/debs
경우이 답변 을로 바꿔야 할 수도 있습니다 /var/www/html/debs
. 또는/etc/apache2
인증 된 리포지토리 생성
나는 여기와 다른 사이트에서 답변을 보았으며 대부분 인증되지 않은 저장소를 설정한다는 (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
. 편집 설명의 의미 인 것으로 가정 하여 수정했습니다
nginx 및 reprepro를 통해 로컬 소스 서버를 설정할 수도 있습니다.
데비안 패키지 설치
sudo apt-get install reprepro nginx
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 .
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
구성 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;
}
}
버킷 크기 최적화 :
/etc/nginx/conf.d/server_names_hash_bucket_size.conf
server_names_hash_bucket_size 64;
설치 안내서 링크 참조
@BigSack의 답변 과 Ubuntu의 공식 위키 게시물 의 지침은 Ubuntu 18.04에서 작동하지 않았습니다.이 두 가지 변경 사항이 있습니다.
압축되지 않은 일반 Packages
파일 생성 (이 파일을 실행할 때 작업 디렉토리 는 모든 패키지가있는 위치에 있어야 함)
cd /usr/local/mydebs
dpkg-scanpackages -m . > Packages
다음 항목을 추가하십시오 /etc/apt/sources.list
deb [trusted=yes] file:/usr/local/mydebs ./
로컬 저장소를 작성해야하는 몇 가지 이유가 있습니다. 첫 번째는 업데이트 할 Ubuntu 시스템이 여러 개인 경우 대역폭을 절약하려는 것입니다. 예를 들어 적어도 일주일에 한 번 업데이트해야하는 25 개의 Ubuntu 시스템이있는 경우 리포지토리를 로컬로 제외한 모든 작업을 수행 할 수 있으므로 대역폭을 크게 절약 할 수 있습니다.
대부분의 조직에는 네트워크 게이트웨이에 알맞은 대역폭이 있지만이 대역폭은 현명하게 사용해야하는 소중한 상품입니다.
많은 조직에는 여전히 게이트웨이에 10MB 또는 100MB 제한을 가진 라우터가 있지만 내부적으로 1GB 네트워크 연결이 있으므로 내부적으로 대역폭을 더 잘 사용할 수 있습니다. 자체 저장소를 생성하는 두 번째 이유는 내부 Ubuntu 시스템에로드되는 응용 프로그램을 제어 할 수 있기 때문입니다.
머신을 업데이트하는 리포지토리에서 조직이 로컬 네트워크에서 사용하지 않으려는 응용 프로그램을 제거 할 수 있습니다. 또한 보안 및 안정성을 보장하기 위해 테스트 상자를 만들고 응용 프로그램 및 버전을 네트워크에 배포하기 전에 테스트 할 수 있습니다.
먼저 미러를 설정해야 키보드에서 Ctrl+ Alt+ T를 눌러 터미널을 열어야합니다. 열리면 아래 명령을 실행하십시오.
apt-get install apt-mirror
apt-mirror를 설정했으면이 명령으로 저장소 다운로드를 시작할 수 있습니다.
아파트 거울 /etc/apt/mirror.list 1
1 출처 : 우분투 리포지토리 생성
오프라인 로컬 리포지토리를 만들려면
1. dir에 액세스 가능하게 만들기 (루트별로)
sudo mkdir / var / my-local-repo
sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / 패키지
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 업데이트
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