ubuntu在局域网内的安装建立自己的DEB源服务器

因为要在公司里多台机子上装UBUNTU,又不想每次都把同样要安装的包从外网下载一遍,所以就像利用已经装好的一台PC上存下来的包做个简单的局域网用的库,这样以后每重新装一台都可以从这个库里来更新了,而且这些新的PC都不需要连接外网了。

今天把deb服务器大概研究了下,这里我只谈HTTP访问方式的服务器,它其实就是标准的HTTP服务,用一些特殊的目录名把所有的包进行分类,比如我用的ubuntu是7.04的版本,它运行在i386的平台上,这样对于main的包就是在dists/feisty/main/binary-i386/下面,不过不是把deb包直接扔到这个目录就可以了,这样的话apt-get是不知道的,apt-get每次只会去读这个目录下的一个Packages.gz文件,这个文件里包含了所有包的信息,apt-get就可以通过它找到所有的包并且自动下载安装了。

下面的问题就是如何生成这个Packages.gz文件,我看了网上一些非UBUNTU镜像的库,找到一个sh文件,我稍微作了一些修改,如下(update.sh)

#!/bin/bash

# Quick Package Updater

# John Dong (Fixed by Vinx)


#Licensed under the GPL.

DISTS="feisty"

SECTIONS="main"
BINARY_ARCH="binary-i386"

for a in $DISTS; do

        for b in $SECTIONS; do

        for c in $BINARY_ARCH; do

                if [ -d dists/$a/$b/$c ]; then
                echo "Updating dists/$a/$b/$c/Packages"
                dpkg-scanpackages /var/cache/apt/archives /dev/null | gzip -9 > dists/$a/$b/$c/Packages.gz
                fi
        done
        done

done

其中dpkg-scanpackages 就是搜索指定目录下的deb包并且把包的信息写入Packages.gz,这里我搜索当前系统安装过的包,并且把所有包都归入了i386的main中,比较方便,呵呵。

有了脚本我们就可以开始建立局域网的库了,首先安装一个apache2

sudo apt-get install apache2

在浏览器里输入localhost看apache是否正常启动了。

进入/var/www,分别建立 dists/feisty/main/binary-i386/目录,注意目录的owner要改成www-data

然后执行这个脚本:
sudo sh update.sh

就能自动生成package文件了,以后如果有什么新的包加入,只要重新执行一下这个脚本就可以了。

找到另外一台PC,在/etc/apt/sources.list里加入 deb http://yourip/ feisty main
sudo apt-get update

你能看到从你的库里下到正确的package就OK了。

然后你就可以install所有的包了,不需要从外面服务器下载了,呵呵。

到这里,一个简单的DEB库就建立好了,不过我有些包不是在官方的源上下的,所以不会在archives里面有储存,我是把他们按照软件类别放到/home/download/下的不同目录下的,为了其他PC也能安装这部分包,我在脚本里加入了一个更新拷贝命令:

sudo find /home/vinx/download/ -name "*.deb" -exec cp {} -u /var/cache/apt/archives/ \;

它每次都会从download目录下寻找所有的deb包并且更新到本地的包缓存目录中,这样,所有的包都能被其他PC访问到了。