Total Pageviews

Wednesday, 8 February 2012

架设自己的Ubuntu/DEBIAN软件源

嫌软件源太慢?
集中安装多台机器,每次都要重复下载很浪费时间?
无妨访问外网?
闲着没事想折腾?
那就开始吧,下面教你动手将软件仓库搬到本地来。
首先介绍一下过程和原理:
  首先把官方的仓库中的文件全部或者有选择的搬到你的本地来
  然后在本地配置web服务器,使apt-get可以访问到你本地的仓库
  最后更改你ubuntu/debian上的源配置
这样你访问本地或者局域网主机和访问官方服务器不就一样了么。
你需要定时更新的你仓库,和官方的同步起来。
下面就一步一步来(以ubuntu lucid 10.04为例):
1. 安装debmirror
1
sudo apt-get install debmirror -y
2. 选择好一个目录用来放你的仓库文件
  我这里选择 /data/Mirrors/ubuntu作为ubuntu仓库的根目录,我计划是将来如果要把debian或者其他的也放过来,就直接放在/data /Mirrors/xxx就好了,便于web访问和管理。目录所在分区要足够大哦,我这里下了42GB呢。
  需要注意的是这个目录的访问权限,等下再说。
3. (可选)设置钥匙环(keyring)用于发布签名的校验
1
2
sudo mkdir /data/Mirrors/keyring
gpg --no-default-keyring --keyring /data/Mirrors/keyring/trustedkeys.gpg --import /usr/share/keyrings/ubuntu-archive-keyring.gpg
  目录可以自己随便选,我就随便放的。这个生成keyring的命令是用于>=8.04的版本,官方的说明只提到了8.04是这样,没有提 到更新的版本,我这次是在10.04上实践的,所以至少在8.04 <= Your Version <= 10.04之间应该没问题。这里Your Version只的是你当前操作的这台镜像服务器的ubuntu版本。如果是debian我尝试过,没成功,总是找不到公钥。
  其实这一步可以省去,结果是一样的,下一步中加个参数就可以了。
4. 编写同步镜像脚本:
  如果你加了keyring的话是这样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
export GNUPGHOME=/data/Mirrors/keyring
arch=amd64
section=main,restricted,universe,multiverse
release=lucid,lucid-security,lucid-updates
server=cn.archive.ubuntu.com
inPath=/ubuntu
proto=rsync
outPath=/data/Mirrors/ubuntu
debmirror -a $arch \
          --no-source \
          --progress \
          -s $section \
          -h $server \
          -d $release \
          -r $inPath \
          -e $proto \
          $outPath
  如果没有keyring,也就加个–ignore-release-gpg 参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
arch=amd64
section=main,restricted,universe,multiverse
release=lucid,lucid-security,lucid-updates
server=cn.archive.ubuntu.com
inPath=/ubuntu
proto=rsync
outPath=/data/Mirrors/ubuntu
debmirror -a $arch \
          --no-source \
          --progress \
          --ignore-release-gpg \
          -s $section \
          -h $server \
          -d $release \
          -r $inPath \
          -e $proto \
          $outPath
debmirror的参数在man手册里讲的很明白,我这里挑重点说一下
  –arch=foo,[,bar,...] -a foo
    指定架构,可多选,ubuntu有amd64/i386可选,debian多一些,你需要哪些自己填进去,不过填多了会增加下载量,用不到的就别填了吧。
  –section=foo[,bar,...] -s foo
    可以理解为不同的类别,因为软件的发布协议不同以及其他的原因,ubuntu把不同的软件分了下类,你可以有选择的加进去,可以多选,加的多下载 的就多。因为ubuntu的apt的软件源列表中是都配置并使用了的,所以我这里都加进去了,至于你要怎么做就自己看情况吧。
  –host=remotehost -h
    你从哪个服务器下数据就填上那台服务器的主机名,域名或者ip都行,选靠谱且速度快的源,我这里用的是cn.archive.ubuntu.com,中国的主服务器,搜狐出品。
  –dist=foo[,bar,...] -d foo
    这个最重要了,要选你要的发行版,我这里是ubuntu 10.04相关的几个,因为这里填的是别名不是编号,所以其他发行版的话得自己去官方或者wiki上去查一下才知道了,也可以到软件源上看看dists下面有那些目录
  –root=directory -r directory
    这个用来指定在服务器的那个目录上,ubuntu自然就是/ubuntu,debian自然就是/debian,一般镜像服务器没有瞎取目录名的
  –method=ftp|hftp|http|rsync -e
    制定同步方法,支持上面四种,我用的是rsync,其实差不多。
  –no-source
    deb虽然是编译后的软件包,但有极少的软件包是只有源代码发布的,或者是有人装软件的时候就是要自己拿到本地编译一下,如果你用不到这些软件并且不需要在本地编译的话加这个参数可以省去很多的下载数据量。
  –progress
    同步时显示全局进度,不过好像对http有效,对rsync无效,ftp和hftp我没试过。
好了,保存到/data/Mirrors/mirror_update.sh,然后增加可执行权限
1
chmod +x mirror_update.sh
5. 开始同步
  因为这一步可能需要很久,我这里下了42GB的文件,所以建议放在后台执行,如果你是远程登录上去的,最好别用&,否则你一登出进程就停下来了
1
setsid ./mirror_update.sh >> mirror.log
  需要看输出的话,就
1
tail mirror.log
  如果发现什么不对的,可以随时kill,重新来过不会重复下载的。
6. (可选)发布到web服务器
  如果你只是本地使用,那么用文件协议就行了,如果要在网络中使用,那就必须要发布到服务器上,ftp也可以,我这里用的http。
  随便用什么服务器了,我用的nginx,也随便你怎么配置,只要保证可以正确访问到就行。
  在/etc/sites-enabled/下面加一个配置文件mirror
1
2
3
4
5
6
7
8
server {
 listen  8001 default;
 server_name  localhost;
 location / {
  root /data/Mirrors;
  index index.html index.htm;
 }
}
  然后reload nginx
1
sudo service nginx reload
没报错就行。现在用浏览器访问下你的主机的8001端口,我这里因为没有允许目录访问所以就在目录里找个文件看看能不能访问的到,比如 http://myhostname:8001/ubuntu/dists/lucid-security/restricted/binary- amd64/Packages.gz。
没有问题的话就下一步吧。
7. 修改你client机器的source.list文件
  把里面的主机名替换成新搭的服务器,我修改后的文件
  本地访问:
1
2
3
deb file:///data/Mirrors/ubuntu lucid main restricted universe multiverse
deb file:///data/Mirrors/ubuntu lucid-updates main restricted universe multiverse
deb file:///data/Mirrors/ubuntu lucid-security main restricted universe multiverse
  http访问:
1
2
3
deb http://localhost:8001/ubuntu lucid main restricted universe multiverse
deb http://localhost:8001/ubuntu lucid-updates main restricted universe multiverse
deb http://localhost:8001/ubuntu lucid-security main restricted universe multiverse
  保存后,apt-get update; apt-get dist-upgrade试试看。
8. 配置crontab
  保持镜像数据的同步需要crontab的帮忙了
1
sudo crontab -e
  加入下面的
1
2 6 * * * /data/Mirrors/mirror_update.sh >> /data/Mirrors/mirror.log
  我这里是每天6点钟更新一下。
  然后重启cron服务
1
sudo service cron restart
完。

No comments:

Post a Comment