apt-mirror脚本分析

来源:互联网 发布:制作背景音乐的软件 编辑:程序博客网 时间:2024/06/06 23:55

 

该文档记录用apt-mirror建立mint17镜像源的步骤和问题,出现问题后,查看apt-mirror的源码所对apt-mirror工具脚本源码的简要分析,难免疏漏,敬请指出。

环境:mint版本17apt-mirror版本5.18.2

镜像源的地址:mint17官方地址

deb http://packages.linuxmint.com qiana main upstream import
deb http://extra.linuxmint.com qiana main

deb http://archive.ubuntu.com/ubuntu trusty mainrestricted universe multiverse
deb http://archive.ubuntu.com/ubuntutrusty-updates main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ trusty-securitymain restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ trustypartner

 tips:

      apt-mirror脚本在低版本中不能下载i18n下的文件,或者下载i18n下的文件出错,没有去查看具体在什么版本修正,新版本5.18.2发布于2014年4月12,测试过程中没有出现问题。

1初步准备

建源的系统和被建源的系统没有联系,即可以用debian机器建立一个ubuntu/mint源,或者利用ubuntu机器建立一个debian/mint源。

apt-mirror配置很简单,在apt-mirror安装过程中会自动创建默认目录/var/spool/apt-mirror/和默认配置文件/etc/apt/mirror.list,只需要修改需要镜像的目的源的地址即可,可以使用deb,deb-src,如果需要同时下载多种架构的源,可以利用deb-i386,deb-amd64...

下文对apt-mirror的脚本进行简要分析,了解apt-mirror的工作原理以便出现问题时查找原因,排除错误。

2脚本分析

整个apt-mirror的脚本可以分为四个部分:

l  获取配置参数,创建必要的文件夹

l  下载源结构信息和Translation Index,存入skel文件夹中

l  下载数据

l  将skel里的结构文件拷贝至mirror中,并删除需要clean的文件

2.1获取配置参数,创建必要的文件夹

apt-mirror的配置文件默认为/etc/apt/mirror.list,可以直接更改mirror.list,也可以通过-c选项制定配置文件。

几个常用的配置参数:

defaultarch:需要下载的镜像源的架构,也可以在制定镜像地址时通过deb-i386或者deb-amd64指定。

base_path:默认是/var/spool/apt-mirror,该目录在软件安装时就会自动生成,里面有mirror,skel,var三个子目录,在var里有clean.sh,postmirror.sh,如果在配置文件里修改了base_path,必须手动建立该文件夹,其中的三个子目录软件会自动生成。

测试中发现镜像源行尾不能加注释,如:

debhttp://packages.linuxmint.com qiana main upstream import #id:linuxmint_main

查看源码第282行:

281  while(<CONFIG>)

282         next if /^\s*#/;

可知配置文件中,每行首字母为#才会被解析为注释而跳过

 

2.2整个源SkelTranslationIndex的下载

该部分主要依据配置文件中debdeb-src条目中的镜像源的地址、distribution以及components的相关信息,组装urls,以供wget下载整个镜像源的骨架结构。

组装方式如下:

2.2.1如果是deb-src

如果没有指定components

        $url./$distribution/Release

        $url./$distribution/Release.gpg

 

        $url./$distribution/Sources.gz

        $url./$distribution/Sources.bz2

        $url./$distribution/Sources.xz

如果指定了components

        $url./dists/$distribution/Release

        $url./dists/$distribution/Release.gpg

        $url./dists/$distribution/InRelease

 

        $url./dists/$distribution/$component/source/Release

        $url./dists/$distribution/$component/Sources.gz

        $url./dists/$distribution/$component/Sources.bz2

        $url./dists/$distribution/$component/Sources.xz

 

2.2.2如果是deb[-arch]

如果没有指定components

        $url./$distribution/Release

        $url./$distribution/Release.gpg

 

        $url./$distribution/Packages.gz

        $url./$distribution/Packages.bz2

        $url./$distribution/Packages.xz

如果指定了components

        $url./dists/$distribution/Release

        $url./dists/$distribution/Release.gpg

        $url./dists/$distribution/InRelease

//配置文件中如果指定_contents1(配置的默认值)--START

$url./dists/$distribution/Contents-$arch.gz

$url./dists/$distribution/Contents-$arch.bz2

$url./dists/$distribution/Contents-$arch.xz

 

$url./dists/$distribution/$component/Contents-$arch.gz

$url./dists/$distribution/$component/Contents-$arch.bz2

$url./dists/$distribution/$component/Contents-$arch.xz

//配置文件中如果指定_contents1(默认值)--END

//配置文件中如果指定_contents0则不会生成以上的url

 

$url./dists/$distribution/$component/binary-$arch/Release

$url./dists/$distribution/$component/binary-$arch/Packages.gz

$url./dists/$distribution/$component/binary-$arch/Packages.bz2

$url./dists/$distribution/$component/binary-$arch/Packages.xz

$url./dists/$distribution/$component/i18n/Index

2.2.3Translation结构信息

较早的apt-mirror版本没有这一块,所以会造成不能下载i18n中相应的Translation文件,现在apt-mirror版本采取两种方式获取i18n下的Index文件,该文件里包含了i18n下的Translation文件的相关信息,包括MD5值,文件大小,和文件名字。如:

64a543af…  14 Translation-en.bz2

获取Index位置的两种方式:

1)       程序硬编码组装:

$url/dists/$distribution/$component/i18n/Index

2)       如果1方式没有找到,解析$url/dists/$distribution/Release文件,在该文件中匹配字符串“$component/i18n/Translation-”若找到则根据该信息组装相应的urls

2.2.4结构文件说明

访问前面组装得到的网址,获取得到整个镜像源的结构信息,通过这些信息镜像软件源。下文简要描述各个结构文件。

 

$ distribution/Release:以当前目录为基目录,存储了每个componentPackages,SourcesRelease的相对路径,如:

main/binary-i386/Packages

              main/binary-i386/Release

              main/binary-i386/Sources

             

 

$distribution/$component/source/Sources:该文件存储了该component中每个源文件的详细,如包名,文件的目录,版本号,md5值等,其中文件的目录以pool为相对路径的起始地址,并对该目录下的文件进行了描述,包含MD5值,文件大小,以及文件名如:

       Directory:pool/main/v/virtualbox-nonfree

       Files:

              9d832e41… 549 virtualbox-nonfree_4.3.dsc

              b9b6a0d8… 1591 virtualbox-nonfree_4.3.tar.gz

       Directory:pool/main/n/nemo

       …

apt-mirror通过提取该信息获得文件的路径,并组装成相应的url进行下载。

 

$distribution/$component/binary-arch/Packages:该文件中的信息类似于上文提到的Sources文件,但没有提到目录,只提到了deb的路径信息,如:

Filename:pool/main/v/virtualbox-nonfree/virtualbox-nonfree_4.3_all.deb

 

distribution 下的Release文件中以相对当前路径的方式,储存了所有文件的相对路径,为后面的下载提供基础。在各个$componentbinary-archsource中的Release文件中存储了该Component的一些信息(同reprepro建源工具的配置文件的信息类同),例如:

packages.linux.mint/dists/qiana/main/binary-i386/Release:

Archive: qiana

Version: 17

Component: main

Origin: linuxmint

Label: linuxmint

Architecture: i386

Description: Linux Mint 17official repository

 

2.3下载数据

通过解压分析上文得到结构数据(脚本中直接解压相应的.gz文件,所以2.2节中并未直接下载Packages,Sources等文件),获取其中每个文件的名字、大小以及MD5值等信息,将获得的文件名字组合地址(url)存入ALL中(/apt-mirror/var文件夹下),将MD5和文件地址(url)存入MD5中,将原有mirror中的数据与结构中数据进行比较数据大小,如果有变化,将地址写入NEW中。

下载所有的数据。

2.4整理文档

1、将skel中的结构信息文件拷贝进mirro对应目录下。

2、清理不需要的文件和目录(clean.sh)。

0 0
原创粉丝点击