自制多线程Apt Get

说一些原理:

如果Ubuntu安装一个软件,大体过程应该是这样的:

1 、搜索软件源里面的软件名称。如果存在,解析这个软件需要的包。

2、查找所需的包是否已经安装。如果没有安装,下载到本地,位置在/var/cache/apt/archives目录下面。

3、开始安装。

从第2步可以看出:

推论1、如果cahche目录里面已经有了所有的包,就会自动开始安装。

推论2、如果我们把这些包下载到cache目录,就会免除网络下载的过程。

推论3、如果我们用多线程工具下载,就会大大节省下载时间。如果我们知道这些包的下载地址,哪怕到Windows下面用迅雷下载以后,再拷贝到cache目录也是可以的。

问题是,如何找到需要的软件包的下载地址?

其实问题的答案非常简单,apt-get的一个参数帮了大忙。

apt-get有一个参数print-uris就是我们需要的参数,他会告诉我们下载包的地址。

譬如寻找java5,可以使用:

apt-get --print-uris -y install sun-java5-jdk | grep http | awk '{print $1}' | sed "s/'//g"

这一行会自动打印出安装sun-java5-jdk需要的Package(包)。

那么问题就非常简单了。

问题解决:

1、用Linux下面的多线程下载工具axel来下载,命令行:

apt-get --print-uris -y install sun-java5-jdk | grep http | awk '{print $1}' | sed "s/'//g" | xargs -l1 axel -n5 -a

这样就可以多线程下载需要的软件包。

下载完成以后,把下载的软件包,拷贝到/var/cache/apt/archives目录,然后:

sudo cp *.deb /var/cache/apt/archives

sudo aptitude instal sun-java5-jdk.

2、生成一个包的列表文件:

apt-get --print-uris -y install sun-java5-jdk | grep http | awk '{print $1}' | sed "s/'//g" > jdk5.lst

然后到Windows下面用迅雷下载完成以后,在拷贝到cache目录也是一样的。

补充:这个方法的缺点:没有了包的MD5校验.

这种方法,甚至可以帮助没有网络连接的Ubuntu电脑安装软件。只要把从有网络连接的电脑上面下载完成的文件拷贝到U盘上,再拷贝到没有网络的电脑的cache目录下面就可以了,或者直接dpkg -i就可以了!