Bagaimana cara membuat repositori APT lokal?


103

Saya ingin membangun repositori lokal saya sendiri di LAN saya, sehingga mesin-mesin di LAN dapat memperbarui dan meningkatkannya. Saya ingin mengunduh paket dan menyimpannya di server lokal saya sehingga saya dapat memperbarui, memutakhirkan, menginstal, dll, dari sana tanpa menggunakan internet.



3
Saya rasa ini bukan duplikat. Apa yang ingin dicapai oleh maythux adalah membuat server repositori sendiri untuk digunakan dengan aptitude. Apa yang dilakukan Keryx adalah mengganti aptitude sebagai manajer paket dan membuat sumber eksternal untuk paket.
con-f-use

Jawaban:


80

Dari wiki Bantuan Ubuntu :

Ada 4 langkah untuk menyiapkan repositori sederhana untuk Anda sendiri

1. Instal 2. dpkg-dev
Masukkan paket dalam direktori 3.
Buat skrip yang akan memindai paket dan buat file pembaruan apt-get yang bisa dibaca
4. Tambahkan baris ke sumber Anda. Daftar menunjuk ke repositori Anda

Instal dpkg-dev

Ketikkan terminal

sudo apt-get install dpkg-dev

Direktori

Buat direktori tempat Anda menyimpan paket-paket Anda. Untuk contoh ini, kami akan gunakan/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Sekarang pindahkan paket Anda ke direktori yang baru saja Anda buat.

Paket yang diunduh sebelumnya biasanya disimpan di sistem Anda di /var/cache/apt/archivesdirektori. Jika Anda telah menginstal apt-cacher, Anda akan memiliki paket tambahan yang disimpan di direktori / paketnya.

Pembaruan Script-mydebs

Ini adalah tiga liner sederhana:

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

Potong dan rekatkan di atas ke gedit, dan simpan sebagai pembaruan-mydebs di ~ / bin. (tilde '~' berarti direktori home Anda. Jika ~ / bin tidak ada, buatlah: Ubuntu akan meletakkan direktori itu di PATH Anda. Ini adalah tempat yang baik untuk meletakkan skrip pribadi). Selanjutnya, buat skrip dapat dieksekusi:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages melihat semua paket di mydebs, dan hasilnya dikompresi dan ditulis ke file (Packages.gz) yang dapat dibaca oleh pembaruan apt-get (lihat di bawah untuk referensi yang menjelaskan hal ini dengan sangat mendetail). / dev / null adalah file kosong; itu adalah pengganti untuk file override yang menyimpan beberapa informasi tambahan tentang paket, yang dalam hal ini tidak benar-benar diperlukan. Lihat deb-override (5) jika Anda ingin mengetahuinya.

Sources.list

tambahkan baris

deb file:/usr/local/mydebs ./

ke /etc/apt/sources.list Anda, dan Anda selesai.

Opsi CD

Anda dapat membakar direktori yang berisi deb ke CD dan menggunakannya sebagai repositori juga (bagus untuk berbagi antar komputer). Untuk menggunakan CD sebagai repositori, jalankan saja

sudo apt-cdrom add

Menggunakan Repositori

Setiap kali Anda meletakkan deb baru di direktori mydebs, jalankan

sudo update-mydebs
sudo apt-get update

Sekarang paket lokal Anda dapat dimanipulasi dengan perintah Synaptic, aptitude dan apt: apt-get, apt-cache, dll. Ketika Anda mencoba untuk menginstal apt-get, dependensi apa pun akan diselesaikan untuk Anda, selama mereka dapat dipenuhi .

Paket-paket yang dibuat dengan buruk mungkin akan gagal, tetapi Anda tidak akan pernah mengalami dpkg.


3
Bisakah Anda menjelaskan sintaks di telepon dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Apa yang sedang /dev/nulldilakukan di sana. Saya membaca halaman manual juga, tetapi itu tidak begitu jelas.
sayantankhan

@ blade19899 Saya butuh sedikit klarifikasi. Saya ingin repositori dengan hanya beberapa paket pilih di dalamnya, tidak setiap paket yang pernah saya sentuh. Apakah saya benar bahwa teknik ini akan memberi saya kemampuan itu? Tujuannya di sini adalah untuk memiliki repositori yang dapat digunakan oleh grup instalasi perangkat lunak pada LAN yang terisolasi, jauh dari godaan untuk mendapatkan yang tidak dibutuhkan.
Wes Miller

@WesMiller Saya pikir Anda perlu saya baru saja mengedit postingnya!
blade19899

@ blade19899 Maaf, saya tidak mengerti jawaban Anda.
Wes Miller

@WesMiller u butuh BigSack Saya baru saja mengedit posnya untuk masalah tata bahasa (saya pikir bin nya sementara) ini bukan jawaban saya, tapi BigSack
blade19899

41

* Untuk membuat Repositori offline Melalui LAN *

Instal Webserver Apache Lokal

# apt-get install apache2

Secara default, paket Apache Debian akan membuat situs web di bawah /var/wwwpada sistem Anda. Untuk tujuan kita, itu baik-baik saja, jadi tidak ada alasan untuk melakukan apa pun lagi. Anda dapat dengan mudah mengujinya dengan mengarahkan browser favorit http://localhostAnda ke. Anda akan melihat halaman web pasca-instalasi default yang sebenarnya disimpan di /var/www/index.html


Buat Direktori Debian Paket Repositori

memilih untuk membuat direktori/var/www/debsuntuk ini. Di bawahnya, Anda harus membuat direktori "arsitektur", satu untuk setiap arsitektur yang perlu Anda dukung. Jika Anda hanya menggunakan satu komputer (atau jenis komputer), maka Anda hanya perlu satu komputer - biasanya "i386" untuk sistem 32-bit atau "amd64" untuk 64 bit. Jika Anda menggunakan beberapa arsitektur lain, saya akan menganggap Anda mungkin sudah tahu tentang ini. Sekarang cukup salin file paket ".deb" untuk arsitektur yang diberikan ke direktori yang sesuai. Jika sekarang Anda mengarahkan browser web favorit Anda ke http://localhost/debs/amd64(misalnya) Anda akan melihat daftar paket untuk sistem 64 bit.


Buat file Packages.gz

Sekarang kita perlu membuat file katalog untuk digunakan APT. Ini dilakukan dengan utilitas yang disebut "dpkg-scanpackages". Sini'

# cd /var/www/debs/

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




Buat repositori diketahui oleh APT

Sekarang satu-satunya yang tersisa untuk dilakukan adalah memberi tahu APT tentang repositori Anda. Anda melakukan ini dengan memperbarui file /etc/apt/sources.list Anda. Anda akan membutuhkan entri seperti ini:

deb http://localhost/debs/ amd64/

Saya menggunakan nama host sebenarnya dari sistem saya alih-alih localhost - dengan cara ini kodenya sama untuk semua komputer di LAN saya, tetapi localhost akan baik-baik saja jika Anda hanya menjalankan satu komputer.
Sekarang, perbarui APT:

# apt-get update

2
Menambahkan baris itu ke /etc/apt/sources.list akan memecah pembaruan ketika tidak di LAN, bukan?
Felix

2
Untuk Ubuntu 16.04, Anda mungkin perlu mengganti /var/www/debsjawaban ini dengan /var/www/html/debs. Atau Anda akan memerlukan langkah-langkah tambahan untuk mengedit konfigurasi apache secara manual di/etc/apache2
Erik

18

Membuat Repositori yang Diotentikasi

Saya sudah melihat jawaban di sini dan di situs lain dan sebagian besar memiliki kelemahan (IMHO besar) bahwa Anda sedang menyiapkan repositori yang tidak diautentikasi. Ini berarti Anda harus menjalankan apt-getdengan --allow-unauthenticateduntuk menginstal paket dari itu. Ini bisa menjadi risiko keamanan, terutama dalam skrip di mana paket yang Anda instal mungkin tidak semuanya berasal dari repositori lokal Anda.

Perhatikan bahwa saya belum membahas di sini cara membuatnya tersedia melalui LAN, tapi itu konfigurasi yang cukup umum menggunakan Apache atau nginx (lihat jawaban lain di sini).

Atur direktori repo

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

Kemudian tambahkan baris seperti ini ke sources.list:

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

Menambah dan Menghapus Paket

hapus paket

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

tambahkan paket

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

sekarang jalankan skrip berikut yang menghasilkan file Paket, Rilis dan InRelease dan tandatangani dengan kunci pribadi gpg Anda:

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

Contoh Isi file conf / distribusi

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

Tautan

https://wiki.debian.org/RepositoryFormat

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

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


@Phillip hasil edit Anda digunakan date -Rc, saya memperbaikinya dengan date -Ruasumsi itulah yang Anda maksud dari deskripsi edit
muru

Terima kasih, saya baru saja mulai mendapat peringatan dari apt tentang ini karena tanggal yang dihasilkan berada di TZ lokal dan bukan UTC. Saya memperbaikinya dalam skrip saya sendiri tetapi lupa mengeditnya di sini
happyskeptic

1
@KevinJohnson Saya telah memperbarui jawaban utama sekarang dengan contoh file itu dari repo apt lokal saya
happyskeptic

8

Anda juga dapat mengatur server sumber lokal dengan nginx dan reprepro:

  1. Instal paket debian

    sudo apt-get install reprepro nginx 
    
  2. buat direktori untuk reprepro dan edit

    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 / distro

    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. Sertakan dalam reprepro, bangunlah

    $ 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. Konfigurasi 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. Optimalkan ukuran bucket:

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

    server_names_hash_bucket_size 64;
    

Referensi untuk Memasang Tautan Panduan


4
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
gertvdijk

@elprup: Anda pasti lupa memperbarui jawaban itu :)
0xC0000022L

reprepor tidak mendukung banyak versi dari paket yang sama. Kedengarannya aneh, tapi ini cara reprepro bekerja
maxadamo

6

Anda mungkin ingin melihat apt-mirrordan apt-cacher.

Berikut ini adalah panduan tentang cara menginstal dan menggunakannya.


Jawaban Anda 5 tahun sudah ditandai sebagai LQ. Jika itu akan dihapus, buka meta dan minta batal dihapus. Saya memilih untuk tetap terbuka , tetapi perlu diedit! ;-)
Fabby

5

Petunjuk dalam jawaban @ BigSack dan pos wiki resmi Ubuntu tidak berfungsi untuk saya di Ubuntu 18.04, sampai saya membuat dua perubahan ini:

  1. Hasilkan file polos dan tidak terkompresi Packages(saat menjalankan ini, direktori kerja harus berada di tempat semua paket berada)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Tambahkan entri berikut di /etc/apt/sources.list

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

4

Ada beberapa alasan Anda mungkin ingin membuat repositori lokal. Yang pertama adalah Anda ingin menghemat bandwidth jika Anda memiliki beberapa mesin Ubuntu untuk diperbarui. Sebagai contoh jika Anda memiliki 25 mesin Ubuntu yang semuanya perlu diperbarui setidaknya sekali seminggu, Anda akan secara signifikan menghemat bandwidth karena Anda bisa melakukan semua kecuali repositori secara lokal.

Sebagian besar organisasi memiliki bandwidth yang layak untuk gateway jaringan mereka tetapi bandwidth ini adalah komoditas berharga yang perlu digunakan secara bijak.

Banyak organisasi masih memiliki router dengan batas 10MB atau 100MB di gateway tetapi koneksi jaringan 1 GB secara internal sehingga bandwidth dapat lebih baik digunakan secara internal. Alasan kedua untuk membuat repositori Anda sendiri adalah Anda dapat mengontrol aplikasi apa yang dimuat pada mesin Ubuntu internal Anda.

Anda dapat menghapus aplikasi apa pun yang tidak ingin digunakan organisasi Anda di jaringan lokal dari repositori yang memperbarui mesin. Bahkan lebih baik, Anda dapat membuat kotak uji dan menguji aplikasi dan versi sebelum Anda mengizinkannya untuk diluncurkan ke jaringan Anda untuk memastikan keamanan dan stabilitas.

Pertama-tama Anda harus mengatur mirror, untuk melakukan itu Anda perlu Cukup tekan Ctrl+ Alt+ Tpada keyboard Anda untuk membuka Terminal. Ketika terbuka, jalankan perintah di bawah ini.

apt-get install apt-mirror 

Setelah menyiapkan apt-mirror, Anda dapat mulai mengunduh repositori dengan perintah ini.

apt-mirror /etc/apt/mirror.list 1

Baca terus

1 Sumber: Buat Repositori Ubuntu


maaf, tautannya sudah mati
xamiro

3

Untuk membuat Repositori lokal offline
1. buat direktori dapat diakses (minimal oleh root)

sudo mkdir / var / my-local-repo

  1. salin semua file deb ke direktori ini.
  2. memindai direktori

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Paket

  1. tambahkan repositori lokal ke sumber

echo "file 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 pembaruan


Hal yang kurang lebih sama juga ada pada wiki resmi: Repositori / Pribadi - Bantuan Komunitas Wiki
sdaau

1

Saya mencoba menggunakan apt-rdependsseperti pada jawaban yang dipilih, tetapi ketika saya mencoba menginstal paket dari repositori lokal saya, ia mengeluh tentang tidak adanya dependensi.

apt-rdependstidak mencantumkan beberapa dependensi untuk paket saya. Saya menduga itu ada hubungannya dengan fakta, yang apt-cache showmenunjukkan banyak catatan untuk itu.

Sebaliknya saya menggunakan apt-cache depends, dan itu berhasil:

Mendapatkan daftar dependensi secara rekursif

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

-i: dependensi penting saja --recurse: rekursif

Ubah itu menjadi daftar yang dapat dicerna

  • Menghapus simbol & spasi: | tr -d "|,<,>, "
  • Menghapus Tergantung: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Menyortir daftar: | sort
  • Hanya nilai unik: | uniq > list.txt

Perintah lengkap:

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

Unduh paketnya

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

Pindai paket-paket itu dan ubah menjadi Packages.gz

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

1
Mungkin ide yang baik untuk referensi yang menjawab Anda sedang berbicara tentang ...
anonymous2

-1

Saya telah selesai menggunakan apt-mirror.

Ini bagus tetapi Anda harus memiliki lebih banyak ruang hard drive karena akan disinkronkan dengan server repos.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.