Yerel bir APT deposu nasıl oluşturulur?


103

Yerel ağımın yerel ağını yerel ağımda oluşturmak istiyorum, böylece yerel ağdaki makineler ondan güncelleme ve yükseltme yapabilir. Paketleri indirmek ve yerel sunucumda depolamak istiyorum; böylece internet kullanmadan güncelleme, yükseltme, yükleme vb. İşlemleri yapabilirim.



3
Bunun bir kopya olduğunu sanmıyorum. Maythux'un başarmak istediği, yetenek ile kullanmak için kendi depo sunucusunu oluşturmaktır. Keryx'in yaptığı şey paket yöneticisi olarak yeteneğin yerini almak ve paketler için dış kaynaklar oluşturmaktır.
con-f-use

Yanıtlar:


80

Gönderen Ubuntu Yardım wiki :

Kendiniz için basit bir depo oluşturmak için 4 adım var

1.Install dpkg-dev
2.Paketleri bir dizine yerleştirin
3.Paketleri tarayacak bir komut dosyası oluşturun ve apt-get update dosyası oluşturabilecek bir komut dosyası hazırlayın 4. Kaynaklarınıza
bir satır ekleyin.

Dpkg-dev yükle

Bir terminal yazın

sudo apt-get install dpkg-dev

Rehber

Paketlerinizi tutacağınız bir dizin oluşturun. Bu örnek için kullanacağız/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Şimdi paketlerinizi yeni oluşturduğunuz dizine taşıyın.

Daha önce indirilen paketler genellikle sisteminizde /var/cache/apt/archivesdizinde bulunur. Apt-cacher yüklediyseniz, / paket dizininde depolanmış ilave paketleriniz olacaktır.

Script güncelleme-mydebs

Basit bir üç astar:

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

Yukarıdakileri keserek gedit'e yapıştırın ve ~ / bin içindeki update-mydebs olarak kaydedin. (tilde '~', ana dizininiz anlamına gelir. ~ / bin yoksa, onu oluşturun: Ubuntu bu dizini PATH'inize koyacaktır. Kişisel komut dosyaları koymak için iyi bir yer). Ardından, komut dosyasını çalıştırılabilir duruma getirin:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages , mydebs'teki tüm paketlere bakar ve çıktı sıkıştırılır ve apt-get güncellemesinin okuyabileceği bir dosyaya (Packages.gz) yazılır (bunu, ayrıntılı bir şekilde açıklayan bir referans için aşağıya bakın). / dev / null boş bir dosyadır; bu durumda gerçekten gerekmeyen paketler hakkında bazı ek bilgiler içeren geçersiz kılma dosyasının yerine geçer. Eğer bilmek istiyorsanız deb-override (5) bakınız.

sources.list

satırı ekle

deb file:/usr/local/mydebs ./

/etc/apt/sources.list'inize ve işleminiz bitti.

CD Seçeneği

Debs içeren dizini bir CD'ye yazabilir ve bunu bir depo olarak da kullanabilirsiniz (bilgisayarlar arasında paylaşım için iyi). CD'yi depo olarak kullanmak için, sadece çalıştır

sudo apt-cdrom add

Havuzu Kullanma

Mydebs dizinine ne zaman yeni bir deb koyduysan, kaç

sudo update-mydebs
sudo apt-get update

Artık yerel paketleriniz Synaptic, yetenek ve apt komutları ile manipüle edilebilir: apt-get, apt-cache, vb. Apt-get install işlemini denediğinizde, karşılanabilecekleri sürece tüm bağımlılıklar sizin için çözülecektir. .

Kötü yapılmış paketler muhtemelen başarısız olacak, ancak dpkg cehenneme katlanmayacaksınız.


3
Satırdaki sözdizimini açıklar mısınız dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz? /dev/nullOrada ne var? Adam sayfasını da okudum, ama net değildi.
sayantankhan

@ blade19899 Lütfen biraz açıklığa ihtiyacım var. İçinde sadece birkaç seçme paket olan bir depo istiyorum, dokunduğum her paket değil. Bu tekniğin bana bu yeteneği vereceğini düzeltir miyim? Buradaki amaç, bir yazılım kurulum grubunun yalıtılmış bir LAN üzerinde, gereksiz olanları bulmak için cazip olmaktan uzak bir şekilde kullanabileceği bir havuza sahip olmaktır.
Wes Miller

@WesMiller Ben sadece onun yazı düzenledi ihtiyacım var sanırım!
blade19899

@ blade19899 Üzgünüm, cevabınızı anlamıyorum.
Wes Miller,

@WesMiller u BigSack'e ihtiyacım var Ben sadece dilbilgisi sorunları için yazısını düzenledim (sanırım çöp kutusu bir süredir) bu benim cevabım değil, ama BigSack's
blade19899

41

* LAN Üzerinden çevrimdışı bir Depo oluşturmak için *

Yerel bir Apache Web Sunucusu kurun

# apt-get install apache2

Varsayılan olarak, Debian'ın Apache paketi /var/wwwsisteminizin altında bir web sitesi kuracaktır . Amaçlarımız için, sorun değil, bu yüzden daha fazla bir şey yapmak için hiçbir sebep yoktur. En sevdiğiniz tarayıcıyı işaret ederek kolayca test edebilirsiniz. Dizin oluşturmayı seçen bir Debian Paketi Deposu Dizini Oluştur seçeneğindehttp://localhost depolanan varsayılan yükleme sonrası web sayfasını görmelisiniz./var/www/index.html




/var/www/debsbunun için. Altında, desteklemeniz gereken her mimari için bir tane "mimari" dizin oluşturmalısınız. Yalnızca bir bilgisayar kullanıyorsanız (veya bir bilgisayar türü), o zaman yalnızca bir taneye ihtiyacınız olur - tipik olarak 32 bit sistemler için "i386" veya 64 bit için "amd64". Başka bir mimari kullanıyorsanız, muhtemelen bunu zaten bildiğinizi varsayacağım. Şimdi, belirli bir mimari için ".deb" paket dosyalarını uygun dizinlere kopyalayın. Şimdi favori web tarayıcınızı http://localhost/debs/amd64(örneğin) işaret ederseniz, 64 bit sistemler için paketlerin bir listesini görürsünüz.


Packages.gz dosyası oluşturun

Şimdi APT'nin kullanması için bir katalog dosyası oluşturmamız gerekiyor. Bu "dpkg-scanpackages" adlı bir yardımcı programla yapılır. İşte'

# cd /var/www/debs/

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




Depoyu APT'ye bildirme

Artık yapılacak tek şey APT'ye deponuzu bildirmektir. Bunu /etc/apt/sources.list dosyanızı güncelleyerek yaparsınız. Bunun gibi bir girişe ihtiyacınız olacak:

deb http://localhost/debs/ amd64/

Sistemimin asıl ana bilgisayar adını localhost yerine kullandım - bu şekilde kod, LAN'ımdaki tüm bilgisayarlar için aynıdır, ancak eğer yalnızca bir bilgisayarı kullanıyorsanız localhost çok işe yarayacaktır.
Şimdi, APT’yi güncelleyin:

# apt-get update

2
Bu satırı /etc/apt/sources.list listesine eklemek, LAN’da olmadığı zaman güncellemeleri bozacak, değil mi?
Felix

2
Ubuntu 16.04 için, /var/www/debsbu cevabın yerini değiştirmen gerekebilir /var/www/html/debs. Veya içinde apache yapılandırmanızı el ile düzenlemek için ek adımlara ihtiyacınız olacak/etc/apache2
Erik

18

Kimliği doğrulanmış bir havuz oluşturma

Buradaki ve diğer sitelerdeki cevaplara baktım ve çoğu kimliği doğrulanmamış bir depo oluşturduğunuz (IMHO büyük) dezavantajına sahip. Bu çalıştırmak gerektiği anlamına gelir apt-getile --allow-unauthenticatedondan paketleri yükleme. Bu, özellikle yüklediğiniz paketlerin tümünün yerel deponuzdan gelmeyeceği betiklerde güvenlik riski oluşturabilir.

LAN üzerinden nasıl kullanılacağını burada kullanmadığımı, ancak Apache veya nginx kullanarak oldukça genel bir yapılandırma olduğunu unutmayın (buradaki diğer cevaplara bakınız).

Repo dizinini ayarla

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

Ardından şuna benzer bir satır ekleyin sources.list:

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

Paket Ekleme ve Çıkarma

paketleri kaldır

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

paket ekle

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

Şimdi Paketler, Sürüm ve InRelease dosyalarını oluşturan ve gpg özel anahtarınızla imzalayan aşağıdaki betiği çalıştırı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

Conf / distribution dosyasının örnek içeriği

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

Bağlantılar

https://wiki.debian.org/RepositoryFormat

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

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


Kullanılan düzenlemenizi @Phillip , düzenleme açıklamasından kastettiğinizi varsaymak date -Rciçin düzelttimdate -Ru
muru

Teşekkürler, yakın zamanda yerel TZ’de bulunan ve UTC’nin olmadığı yerel tarih nedeniyle bu konuda uyarılar almaya başladım. Ben kendi senaryomda düzelttim ama burada düzenlemeyi unutma
happyskeptic

1
@KevinJohnson benim yerel apt repo o dosyanın bir örnekle şimdi ana cevap güncelledik
happyskeptic

8

Yerel kaynak sunucuyu nginx ve reprepro ile de ayarlayabilirsiniz:

  1. Debian paketlerini yükle

    sudo apt-get install reprepro nginx 
    
  2. reprepro için dizinler oluşturun ve düzenleyin

    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 / dağılımlar

    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 / seçenekler

    ask-passphrase
    basedir .
    
  3. Repreproya ekle, oluştur

    $ 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. Yapılandırma 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. Kova boyutunu optimize edin:

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

    server_names_hash_bucket_size 64;
    

Kılavuz Bağlantı Kurma Referansı


4
Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak tercih edilir.
gertvdijk

@elprup: Eğer bunun cevabını :) güncellemek unutmuş olmalı
0xC0000022L

Reprepor, aynı paketin birden fazla sürümünü desteklemiyor. Garip sesler, ama reprepro'nun çalışma şekli bu
maxadamo

6

Sen bir göz atmak isteyebilirsiniz apt-mirrorve apt-cacher.

İşte nasıl kurulacağı ve kullanılacağı hakkında bir rehber .


5 yıllık bir cevabınız LQ olarak işaretleniyor. Siliniyorsa, meta gidin ve bir geri alma isteyin. Açık kalmaya oy verdim , ama düzenlemeye ihtiyacı var! ;-)
Fabby

5

@ BigSack'in cevabındaki ve Ubuntu'nun resmi wiki yayınındaki talimatlar, bu iki değişikliği yapana kadar benim için Ubuntu 18.04'te işe yaramadı:

  1. Düz, sıkıştırılmamış bir Packagesdosya oluşturun (bunu çalıştırırken, çalışma dizini tüm paketlerin bulunduğu yerde olmalıdır )

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. İçine aşağıdaki girişi ekleyin /etc/apt/sources.list

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

4

Yerel bir depo oluşturmak isteyebileceğiniz birkaç neden var. İlki, güncellenecek birden fazla Ubuntu makineniz varsa, bant genişliğinden tasarruf etmek istediğinizdir. Örneğin, haftada en az bir kez güncellenmesi gereken 25 Ubuntu makineniz varsa, yerel olarak depo dışındaki her şeyi yapabildiğiniz için bant genişliğini önemli ölçüde azaltırsınız.

Çoğu kuruluş ağ geçitleri için uygun bant genişliğine sahiptir, ancak bu bant genişliği akıllıca kullanılması gereken değerli bir üründür.

Birçok kuruluşun ağ geçidinde hala 10 MB veya 100 MB limitli yönlendiricileri var, ancak dahili olarak 1 GB ağ bağlantısı var, böylece bant genişliği dahili olarak daha iyi kullanılabiliyordu. Kendi havuzunuzu oluşturmanın ikinci nedeni, dahili Ubuntu makinelerinize hangi uygulamaların yüklendiğini kontrol edebilmenizdir.

Kuruluşunuzun yerel ağda kullanmak istemediği uygulamaları makineleri güncelleyen depodan kaldırabilirsiniz. Daha da iyisi, bir test kutusu oluşturabilir ve güvenlik ve istikrarı sağlamak için ağınıza yayılmalarına izin vermeden önce uygulamaları ve sürümleri test edebilirsiniz.

İlk önce bir ayna kurmanız gerekir , bunun için Terminal'i açmak için klavyenizdeki Ctrl+ Alt+ tuşlarına basmanız yeterlidir T. Açıldığında, aşağıdaki komutu çalıştırın.

apt-get install apt-mirror 

Apt-mirror kurulumunuzu yaptıktan sonra, bu komutu kullanarak depo indirme işlemine başlayabilirsiniz.

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

Okumaya devam etmek

1 Kaynak: Bir Ubuntu Havuzu oluşturun


üzgünüm, bağlantı öldü
xamiro

3

Çevrimdışı bir yerel Depo oluşturmak için
1. bir direk erişilebilir hale getirin (kökünden en az)

sudo mkdir / var / yerel-repo

  1. tüm deb dosyalarını bu dizine kopyalayın.
  2. dizini tara

sudo dpkg-scanpackages / var / yerel ağrım repo / dev / null> / var / yerel ağrım repo / Paketler

  1. yerel depoyu kaynaklara ekleyin

echo "deb dosyası: / var / yerel-repo. /"> /tmp/my-local.list

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

sudo apt-get update



1

apt-rdependsSeçtiğim cevapta olduğu gibi kullanmaya çalıştım , ancak paketi yerel depodan yüklemeye çalıştığımda, eksik bağımlılıklar hakkında şikayette bulundum.

apt-rdependsPaketimin bazı bağımlılıklarını listelemek değildi. Bunun için yapabileceği bir şey olduğundan şüpheleniyorum, bunun apt-cache showiçin birden fazla kayıt gösteriliyor.

Bunun yerine kullandım apt-cache dependsve hile yaptım:

Özyinelemeli bir bağımlılık listesi alma

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

-i: sadece önemli bağımlılıklar --recurse: özyinelemeli

Sindirilebilir bir listeye dönüştürün

  • Sembolleri ve boşlukları kaldırma: | tr -d "|,<,>, "
  • Bağımlılıkları Kaldırma: & Ön Bağımlılar: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Listeyi sıralamak: | sort
  • Sadece benzersiz değerler: | uniq > list.txt

Komple komut:

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

Paketleri indir

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

Paketleri tarayın ve Packages.gz'ye dönüştürün

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

1
Bahsettiğiniz cevabı referans olarak kullanmak iyi bir fikir olabilir ...
anonymous2 14

-1

Apt-mirror kullanarak yaptım.

Bu iyi fakat repos sunucusu ile senkronize olacağı için daha fazla sabit disk alanına sahip olmanız gerekiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.