我想在我的LAN上建立自己的本地存储库,以便LAN上的计算机可以对其进行更新和升级。我想下载软件包并将其存储在我的本地服务器上,这样我就可以在不使用互联网的情况下从中进行更新,升级,安装等。
我想在我的LAN上建立自己的本地存储库,以便LAN上的计算机可以对其进行更新和升级。我想下载软件包并将其存储在我的本地服务器上,这样我就可以在不使用互联网的情况下从中进行更新,升级,安装等。
Answers:
有4个步骤为您自己建立一个简单的存储库
1.安装
dpkg-dev
2.将软件包放在目录中3.
创建将扫描软件包的脚本并创建一个文件apt-get update可以读取
4.在您的sources.list中添加一行,指向存储库安装dpkg-dev
输入终端
sudo apt-get install dpkg-dev
目录
创建一个目录,您将在其中保留软件包。在此示例中,我们将使用
/usr/local/mydebs.
sudo mkdir -p /usr/local/mydebs
现在,将您的软件包移到您刚刚创建的目录中。
以前下载的软件包通常存储在系统中的
/var/cache/apt/archives
目录中。如果已安装apt-cacher,则将在其/ packages目录中存储其他软件包。脚本update-mydebs
这是一个简单的三班轮:
#! /bin/bash cd /usr/local/mydebs dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
将以上内容剪切并粘贴到gedit中,并将其另存为〜/ bin中的update-mydebs。(波浪号“〜”表示您的主目录。如果〜/ bin不存在,请创建它:Ubuntu将把该目录放在您的PATH中。这是放置个人脚本的好地方)。接下来,使脚本可执行:
chmod u+x ~/bin/update-mydebs How the script works:
dpkg-scanpackages会查看mydebs中的所有软件包,并将输出压缩并写入apt-get update可以读取的文件(Packages.gz)(请参阅以下参考资料,以详尽的方式对此进行解释)。/ dev / null是一个空文件;它替代了覆盖文件,其中包含有关软件包的一些其他信息,在这种情况下,实际上并不需要该信息。如果您想了解它,请参阅deb-override(5)。
资料清单
添加线
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 Web服务器
# apt-get install apache2
默认情况下,Debian的Apache软件包将/var/www
在您的系统上建立一个网站。就我们的目的而言,这很好,因此没有理由做更多的事情。您可以通过将自己喜欢的浏览器指向来轻松地对其进行测试。http://localhost
您应该看到默认的安装后网页,该网页实际上存储在“ /var/www/index.html
创建Debian软件包系统信息库目录”中
,该目录选择了创建目录。/var/www/debs
为了这。在其下,您应该创建“体系结构”目录,每个目录都需要一个支持的目录。如果仅使用一台计算机(或计算机类型),则只需要一台计算机-对于32位系统,通常为“ i386”,对于64位系统,通常为“ amd64”。如果您使用的是其他体系结构,我假设您可能已经对此有所了解。现在,只需将给定体系结构的“ .deb”软件包文件复制到适当的目录中。如果现在将您喜欢的Web浏览器指向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/
我使用的是系统的实际主机名,而不是localhost-这样,LAN上所有计算机的代码都是相同的,但是如果您仅运行一台计算机,则localhost可以正常工作。
现在,更新APT:
# apt-get update
/var/www/debs
将此答案替换为/var/www/html/debs
。或者,你将需要额外的步骤来手动编辑你的Apache配置/etc/apache2
创建经过身份验证的存储库
我已经在这里和其他站点上查看了答案,大多数都存在(恕我直言)大的缺点,即您正在建立未经身份验证的存储库。这意味着您需要运行apt-get
以--allow-unauthenticated
从中安装软件包。这可能会带来安全风险,尤其是在脚本中,其中要安装的软件包可能并非全部来自本地存储库。
请注意,这里我没有介绍如何通过局域网使它可用,但这是使用Apache或nginx的相当通用的配置(请参见此处的其他答案)。
设置仓库目录
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
现在运行以下脚本,生成Packages,Release和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设置本地源服务器:
安装Debian软件包
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 / distributions
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的官方的wiki后并没有为我工作在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限制的路由器,但是内部具有1 GB的网络连接,因此可以在内部更好地使用带宽。创建自己的存储库的第二个原因是,您可以控制内部Ubuntu机器上加载了哪些应用程序。
您可以从更新计算机的存储库中删除组织不希望在本地网络上使用的任何应用程序。更好的是,您可以创建一个测试箱并测试应用程序和版本,然后再将它们推广到网络中,以确保安全性和稳定性。
首先,您需要设置一个镜像,您只需按 键盘上的Ctrl+ Alt+ T打开终端即可。打开时,运行以下命令。
apt-get install apt-mirror
设置apt-mirror后,您可以使用此命令开始下载存储库。
apt-mirror /etc/apt/mirror.list 1
1资料来源:创建一个Ubuntu存储库
制作离线本地存储库
1.使目录可访问(至少由root用户访问)
须藤mkdir / var / my-local-repo
sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Packages
echo“ deb文件:/ var / my-local-repo ./”> /tmp/my-local.list
须藤MV /tmp/my-local.list /etc/apt/sources.list.d/my-local.list
sudo apt-get更新
我尝试apt-rdepends
在选择的答案中使用like,但是当我尝试从本地存储库安装软件包时,它抱怨缺少依赖项。
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