Làm thế nào để tạo một kho lưu trữ APT cục bộ?


103

Tôi muốn xây dựng kho lưu trữ cục bộ của riêng mình trên mạng LAN của mình để các máy trên mạng LAN có thể cập nhật và nâng cấp từ nó. Tôi muốn tải xuống các gói và lưu trữ chúng trên máy chủ cục bộ của tôi để tôi có thể cập nhật, nâng cấp, cài đặt, v.v., từ đó mà không cần sử dụng internet.


2
Có thể trùng lặp: askubuntu.com/questions/974/...
stephenmyall

3
Tôi không nghĩ đó là một bản sao. Những gì maythux muốn thực hiện là tạo máy chủ kho lưu trữ của riêng mình để sử dụng với khả năng. Những gì Keryx làm là thay thế năng khiếu như người quản lý gói và tạo nguồn bên ngoài cho các gói.
con-f-use

Câu trả lời:


80

Từ wiki Trợ giúp Ubuntu :

Có 4 bước để thiết lập một kho lưu trữ đơn giản cho chính bạn

1.Install dpkg-dev
2.Put các gói trong thư mục
3. Tạo một tập lệnh sẽ quét các gói và tạo một tập tin apt-get update có thể đọc
4. Thêm một dòng vào nguồn của bạn.list trỏ vào kho lưu trữ của bạn

Cài đặt dpkg-dev

Nhập vào một thiết bị đầu cuối

sudo apt-get install dpkg-dev

Cac thu mục

Tạo một thư mục nơi bạn sẽ giữ các gói của bạn. Trong ví dụ này, chúng tôi sẽ sử dụng/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Bây giờ di chuyển các gói của bạn vào thư mục bạn vừa tạo.

Các gói đã tải xuống trước đây thường được lưu trữ trên hệ thống của bạn trong /var/cache/apt/archivesthư mục. Nếu bạn đã cài đặt apt-cacher, bạn sẽ có các gói bổ sung được lưu trong thư mục / gói của nó.

Tập lệnh cập nhật tập lệnh

Đó là một ba lót đơn giản:

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

Cắt và dán phần trên vào gedit và lưu dưới dạng update-mydebs trong ~ / bin. (dấu ngã '~' có nghĩa là thư mục chính của bạn. Nếu ~ / bin không tồn tại, hãy tạo nó: Ubuntu sẽ đặt thư mục đó vào PATH của bạn. Đây là một nơi tốt để đặt các tập lệnh cá nhân). Tiếp theo, làm cho tập lệnh thực thi:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages xem xét tất cả các gói trong mydebs, và đầu ra được nén và ghi vào một tệp (Gói.gz) mà bản cập nhật apt-get có thể đọc (xem bên dưới để biết tài liệu tham khảo giải thích chi tiết này). / dev / null là một tệp trống; nó thay thế cho một tập tin ghi đè chứa một số thông tin bổ sung về các gói, trong trường hợp này là không thực sự cần thiết. Xem ghi đè gỡ lỗi (5) nếu bạn muốn biết về nó.

Nguồn.list

thêm dòng

deb file:/usr/local/mydebs ./

vào /etc/apt/source.list và bạn đã hoàn thành.

Tùy chọn CD

Bạn có thể ghi thư mục chứa các bản sửa lỗi vào đĩa CD và sử dụng nó làm kho lưu trữ (tốt cho việc chia sẻ giữa các máy tính). Để sử dụng CD làm kho lưu trữ, chỉ cần chạy

sudo apt-cdrom add

Sử dụng Kho lưu trữ

Bất cứ khi nào bạn đặt một cuộc tranh luận mới trong thư mục mydebs, hãy chạy

sudo update-mydebs
sudo apt-get update

Bây giờ các gói cục bộ của bạn có thể được thao tác bằng Synaptic, aptitude và các lệnh apt: apt-get, apt-cache, v.v. Khi bạn cố gắng cài đặt apt-get, mọi phụ thuộc sẽ được giải quyết cho bạn, miễn là chúng có thể được đáp ứng .

Các gói được làm xấu có thể sẽ thất bại, nhưng bạn sẽ không phải chịu đựng địa ngục dpkg.


3
Bạn có thể giải thích cú pháp trên dòng dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Làm gì /dev/nullở đó vậy Tôi cũng đọc trang người đàn ông, nhưng nó không rõ ràng lắm.
sayantankhan

@ blade19899 Tôi cần một chút làm rõ. Tôi muốn có một kho lưu trữ chỉ với một vài gói chọn trong đó, không phải mọi gói tôi từng chạm vào. Tôi có đúng rằng kỹ thuật này sẽ cho tôi khả năng đó không? Mục tiêu ở đây là có một kho lưu trữ mà một nhóm cài đặt phần mềm có thể sử dụng trên một mạng LAN bị cô lập, cách xa các cám dỗ để apt-get không cần thiết.
Wes Miller

@WesMiller Tôi nghĩ bạn cần tôi chỉ cần chỉnh sửa bài viết của mình!
lưỡi19899

@ blade19899 Tôi xin lỗi, tôi không hiểu câu trả lời của bạn.
Wes Miller

@WesMiller u cần BigSack Tôi vừa mới chỉnh sửa bài viết của mình về các vấn đề ngữ pháp (tôi nghĩ bin của nó một lúc) đây không phải là câu trả lời của tôi, nhưng BigSack của
blade19899

41

* Để tạo một Kho lưu trữ ngoại tuyến qua mạng LAN *

Cài đặt Máy chủ web Apache cục bộ

# apt-get install apache2

Theo mặc định, gói Apache của Debian sẽ thiết lập một trang web /var/wwwtrên hệ thống của bạn. Đối với mục đích của chúng tôi, điều đó tốt, vì vậy không có lý do gì để làm gì thêm. Bạn có thể dễ dàng kiểm tra nó bằng cách trỏ trình duyệt yêu thích của mình vào http://localhostBạn sẽ thấy trang web sau khi cài đặt mặc định thực sự được lưu trữ trong /var/www/index.html


Tạo Thư mục Kho lưu trữ Gói Debian

đã chọn để tạo thư mục/var/www/debscho điều này Theo đó, bạn nên tạo các thư mục "architecture", một thư mục cho mỗi kiến ​​trúc bạn cần hỗ trợ. Nếu bạn chỉ sử dụng một máy tính (hoặc loại máy tính), thì bạn sẽ chỉ cần một - thường là "i386" cho các hệ thống 32 bit hoặc "amd64" cho 64 bit. Nếu bạn đang sử dụng một số kiến ​​trúc khác, tôi sẽ cho rằng bạn có thể đã biết về điều này. Bây giờ chỉ cần sao chép các tệp gói ".deb" cho một kiến ​​trúc nhất định vào các thư mục thích hợp. Nếu bây giờ bạn trỏ trình duyệt web yêu thích của mình vào http://localhost/debs/amd64(ví dụ), bạn sẽ thấy danh sách các gói cho hệ thống 64 bit.


Tạo tệp Gói.gz

Bây giờ chúng ta cần tạo tệp danh mục để APT sử dụng. Điều này được thực hiện với một tiện ích gọi là "dpkg-scanpackages". Đây'

# cd /var/www/debs/

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




Làm cho kho lưu trữ được biết đến với APT

Bây giờ, điều duy nhất còn lại phải làm là cho APT biết về kho lưu trữ của bạn. Bạn làm điều này bằng cách cập nhật tệp /etc/apt/source.list của bạn. Bạn sẽ cần một mục như thế này:

deb http://localhost/debs/ amd64/

Tôi đã sử dụng tên máy chủ thực tế của hệ thống của mình thay vì localhost - theo cách này, mã này giống với tất cả các máy tính trong mạng LAN của tôi, nhưng localhost sẽ hoạt động tốt nếu bạn chỉ chạy một máy tính.
Bây giờ, cập nhật APT:

# apt-get update

2
Thêm dòng đó vào /etc/apt/source.list sẽ phá vỡ các cập nhật khi không có trong mạng LAN, phải không?
Felix

2
Đối với Ubuntu 16.04, bạn có thể cần phải thay thế /var/www/debstrong câu trả lời này bằng /var/www/html/debs. Hoặc bạn sẽ cần các bước bổ sung để chỉnh sửa thủ công cấu hình apache của mình trong/etc/apache2
Erik

18

Tạo một kho lưu trữ xác thực

Tôi đã xem xét các câu trả lời ở đây và trên các trang web khác và hầu hết đều có nhược điểm (IMHO lớn) là bạn đang thiết lập một kho lưu trữ không được xác thực. Điều này có nghĩa là bạn cần chạy apt-getvới --allow-unauthenticatedđể cài đặt các gói từ nó. Đây có thể là một rủi ro bảo mật, đặc biệt là trong các tập lệnh nơi các gói bạn cài đặt có thể không phải là tất cả từ kho lưu trữ cục bộ của bạn.

Lưu ý rằng tôi chưa trình bày ở đây cách làm cho nó khả dụng trên mạng LAN, nhưng đó là cấu hình khá chung chung khi sử dụng Apache hoặc nginx (xem các câu trả lời khác tại đây).

Thiết lập thư mục repo

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

Sau đó thêm một dòng như thế này vào sources.list:

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

Thêm và xóa gói

loại bỏ các gói

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

thêm gói

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

bây giờ chạy tập lệnh sau đây tạo các tệp Gói, Phát hành và InRelease và ký chúng với khóa riêng gpg của bạn:

#!/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

Ví dụ Nội dung của tệp conf / phân phối

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

Liên kết

https://wiki.debian.org/Rep repositoryFormat

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

https://help.ubfox.com/community/CreateAuthenticatedRep repository


@Phillip chỉnh sửa của bạn được sử dụng date -Rc, tôi đã sửa nó thành date -Rugiả sử đó là những gì bạn muốn nói từ mô tả chỉnh sửa
muru

Cảm ơn, gần đây tôi mới bắt đầu nhận được cảnh báo từ apt về điều này do ngày được tạo trong TZ địa phương chứ không phải UTC. Tôi đã sửa nó trong kịch bản của riêng mình nhưng quên chỉnh sửa nó ở đây
happyskeptic

1
@KevinJohnson Tôi đã cập nhật câu trả lời chính ngay bây giờ với một ví dụ về tệp đó từ repo apt cục bộ của tôi
happyskeptic

8

Bạn cũng có thể thiết lập máy chủ nguồn cục bộ bằng nginx và reprepro:

  1. Cài đặt gói debian

    sudo apt-get install reprepro nginx 
    
  2. tạo thư mục cho reprepro và chỉnh sửa nó

    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 / ubfox / conf / bản phân phối

    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 / ubfox / conf / tùy chọn

    ask-passphrase
    basedir .
    
  3. Bao gồm nó trong reprepro, xây dựng nó

    $ 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. Cấu hình nginx:

    /etc/nginx/sites-av 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. Tối ưu hóa kích thước thùng:

    /etc/nginx/conf.d/server_names_hash_bucket_size.conf

    server_names_hash_bucket_size 64;
    

Tham khảo Liên kết hướng dẫn cài đặt


4
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
gertvdijk

@elprup: bạn phải quên cập nhật câu trả lời đó :)
0xC0000022L

reprepor không hỗ trợ nhiều phiên bản của cùng một gói. Nghe có vẻ lạ, nhưng đây là cách reprepro hoạt động
maxadamo

6

Bạn có thể muốn xem apt-mirrorapt-cacher.

Đây là một hướng dẫn về cách cài đặt và sử dụng nó.


Câu trả lời 5 năm của bạn đang được gắn cờ là LQ. Nếu nó sẽ bị xóa, hãy vào meta và yêu cầu hủy bỏ. Tôi đã bỏ phiếu để tiếp tục mở , nhưng nó cần chỉnh sửa! ;-)
Fabby

5

Các hướng dẫn trong câu trả lời của @ BigSackbài đăng wiki chính thức của Ubuntu không hoạt động với tôi trên Ubuntu 18.04, cho đến khi tôi thực hiện hai thay đổi sau:

  1. Tạo một Packagestệp đơn giản, không nén (khi thực hiện điều này, thư mục làm việc phải là nơi chứa tất cả các gói)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Thêm mục sau vào /etc/apt/sources.list

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

4

Có một số lý do bạn có thể muốn tạo một kho lưu trữ cục bộ. Đầu tiên là bạn muốn tiết kiệm băng thông nếu bạn có nhiều máy Ubuntu để cập nhật. Ví dụ: nếu bạn có 25 máy Ubuntu cần cập nhật ít nhất một lần một tuần, bạn sẽ tiết kiệm đáng kể băng thông vì bạn có thể làm tất cả trừ kho lưu trữ cục bộ.

Hầu hết các tổ chức có băng thông tốt cho các cổng mạng của họ nhưng băng thông này là một hàng hóa quý giá cần được sử dụng một cách khôn ngoan.

Nhiều tổ chức vẫn có bộ định tuyến với giới hạn 10MB hoặc 100MB tại cổng nhưng kết nối mạng 1 GB bên trong để băng thông có thể được sử dụng tốt hơn trong nội bộ. Lý do thứ hai để tạo kho lưu trữ của riêng bạn là bạn có thể kiểm soát những ứng dụng nào được tải trên các máy Ubuntu nội bộ của mình.

Bạn có thể xóa bất kỳ ứng dụng nào mà tổ chức của bạn không muốn sử dụng trên mạng cục bộ khỏi kho lưu trữ cập nhật các máy. Thậm chí tốt hơn, bạn có thể tạo một hộp kiểm tra và kiểm tra các ứng dụng và phiên bản trước khi bạn cho phép chúng tung ra mạng của bạn để đảm bảo an ninh và ổn định.

Trước tiên bạn phải thiết lập một máy nhân bản, để làm điều đó bạn chỉ cần nhấn Ctrl+ Alt+ Ttrên bàn phím để mở Terminal. Khi nó mở ra, chạy lệnh bên dưới.

apt-get install apt-mirror 

Khi bạn đã thiết lập apt-mirror, bạn có thể bắt đầu tải xuống kho lưu trữ bằng lệnh này.

gương apt /etc/apt/mirror.list 1

Đọc tiếp

1 Nguồn: Tạo Kho lưu trữ Ubuntu


xin lỗi, liên kết đã chết
xamiro

3

Để tạo một Kho lưu trữ cục bộ ngoại tuyến
1. tạo một thư mục có thể truy cập (ít nhất là bằng root)

sudo mkdir / var / my-local-repo

  1. sao chép tất cả các tập tin deb vào thư mục này.
  2. quét thư mục

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Gói

  1. thêm kho lưu trữ cục bộ vào nguồn

echo "tệp deb: / var / my-local-repo ./"> /tmp/my-local.list

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

sudo apt-get cập nhật


Điều tương tự ít nhiều cũng có trên wiki chính thức: Kho lưu trữ / Cá nhân - Wiki Trợ giúp cộng đồng
sdaau

1

Tôi đã cố gắng sử dụng apt-rdependsnhư trong câu trả lời đã chọn, nhưng khi tôi cố gắng cài đặt gói từ kho lưu trữ cục bộ của mình, nó đã phàn nàn về việc thiếu phụ thuộc.

apt-rdependsđã không liệt kê một số phụ thuộc cho gói của tôi. Tôi nghi ngờ nó có một cái gì đó để làm với thực tế, điều đó apt-cache showcho thấy nhiều hồ sơ cho nó.

Thay vào đó tôi đã sử dụng apt-cache depends, và điều đó đã tạo ra mánh khóe:

Lấy một danh sách đệ quy của các phụ thuộc

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

-i: chỉ phụ thuộc quan trọng --recurse: đệ quy

Biến nó thành một danh sách tiêu hóa

  • Xóa biểu tượng & dấu cách: | tr -d "|,<,>, "
  • Xóa phụ thuộc: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Sắp xếp danh sách: | sort
  • Chỉ các giá trị duy nhất: | uniq > list.txt

Hoàn thành lệnh:

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

Tải xuống các gói

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

Quét các gói và biến nó thành Gói.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

1
Có thể là một ý tưởng tốt để tham khảo câu trả lời mà bạn đang nói về ...
nặc

-1

Tôi đã thực hiện bằng cách sử dụng apt-gương.

Nó tốt nhưng bạn cần phải có nhiều dung lượng ổ cứng hơn vì nó sẽ được đồng bộ hóa với máy chủ repos.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.