吐槽文: opensuse里zypper的proxy设置问题

因为工作需要,我要在办公电脑上用VirualBox装个OpenSuSE,但没想到在配置在线安装/更新的proxy上,耗费了我半天时间。这里记录一下,算是我的吐槽(这么用这个词对不?这个时髦的词我还真有点拿不准),也可以让其它网友少走点弯路。

背景:opensuse 11.3,系统已经安装上去了,KDE桌面(奇怪,SLED的缺省桌面是GNOME,opensuse上却是KDE)。我是个Debian老用户,RPM系以前用过一小段mandrank/mandriva。

——写得比较罗嗦,是为了突出一个不熟悉的人折腾得真是很费劲。没有耐心的,如果想了解opensuse zypper的proxy设置方法,直接看最后的结论吧。

 


 

我需要配置的是供系统Install Software /Software Repository使用的proxy,该proxy也简单,不需要用户名、密码什么的。首先是要让我能把系统自带的oss/non-oss两个repo给软件清单给更新一下,先还不着急第三方软件仓库。

 

1。因为不太熟悉,先从桌面开始找哪里可以设置proxy,先打开了YaST Control Center, 找哪里可以设置可供zypper使用的proxy,在Software Repositories和Software Management里面找了一圈,没找到(因为Debian/Ubuntu里面的synapics是在里面配置proxy的,以为SuSE的设计差不多)。

然后找到Configure Desktop里面有设置proxy的选项,但这个地方显然是供当前桌面用户使用的,不是供系统升级使用的。为以防万一,我还是试了一下,不好使。

 

2。又打开了YaST Control Center, 找哪里可以设置可供zypper使用的proxy,在Software Repositories和Software Management里面找了一圈,没找到(因为Debian/Ubuntu里面的synapics是在里面配置proxy的,以为SuSE的设计差不 多)。



3。找啊,找啊,最后发现YaST里Network Services分类下面的proxy是用作系统级proxy的。可TNND因为根据Network Services名字,以为这是对外提供proxy服务用的啊,何况旁边的选项是Mail Server, NFS Client, Samba Server...?! (后来在 /etc/sysconfig Editor里面也看到了设置proxy的地方,似乎跟这个是一回事)

 

4。将oss/non-oss两个repo的地址从http://download.opensuse.org/ 改为http://ftp.cn.debian.org/opensuse/ 后,点击确定,不成功。报告我说什么 repodata/repomd.xml 找不到。先排除了是镜像的问题,因为系统缺省配置的镜像地址 http://download.opensuse.org/distribusion/11.3/repo/oss/ 下上也没有那个repodata/repomd.xml。然后网上一通搜索,带着一些猜测,才意识到好像/可能/隐约是opensuse支持好几种repo type,那个repodata/repomd.xml好像是某种类型的repo需要的,但目前YaST2的界面上能显示出这两个repo的Type为None,不过界面上TMD的找不到修改Type的地方! 只好找到配置文件/etc/zypp/repos.d/*.repo,手工修改类型为YaST2,心想这下应该可以了——

 

5。再点Apply,又报告错误,说找不到media.1什么什么的,用浏览器一看,有这个目录啊,看来还是proxy没配对。又一翻网上搜索,说zypper底层是用aria2c来下载的,得改/root/.aria2/aria2.conf,在里面配置http-proxy=...就好了。

 

6。于是照改——还是不行! 这次是报告Failed to resolve the hostname %22http, cause: Name or service not known 琢磨半天,才发现aria2.conf 里面只能配成http-proxy=http://somehost:someport 不能配成 http-proxy="http://somehost:someport" 也就是说http:// 前不能加引号(可TNND问题是,直接在命令行上用 aria2c --http-proxy="http://somehost:someport" http://ftp.cn.debian.org 就好使,man aria2里面的例子也是有引号的!

 

7。oss/non-oss两个repo配置好了,然后我想再把 http://ftp.cn.debian.org/opensuse/update/11.3/ 也加进去,又出错了,说找不到什么media.1。这次我用浏览器打开该网址,看到有那个 repodata/repomd.xml,看来这的确是另外一种类型的repo,于是查zypper的manpage,看到类型名应该是叫rpm-md,于是 再修改一下,心里舒了一口气,再次zypper refresh



8。没想到再次失败,说connection failed, 还给我抛了一个IPv6的地址。
curl Download (curl) error for 'http://ftp.cn.debian.org/opensuse/update/11.3/content':
Error code: Connection failed
Error message: Failed to connect to 2001:da8:d800:95::110: Network is unreachable
好 在我眼神好,看到出错信息里面有个curl——咦,怎么又跟curl扯上关系了,难道aria2c底层使用了curl?用ldd /usr/bin/aria2c 查又看不出来啊。又上网搜,好像是rpm-md跟yast2类型的仓库不一样,它不用aria2下载,而是用curl来下载。curl配置http-proxy我知 道,改~/.curlrc就行了。修改完毕,用curl http://ftp.cn.debian.org 验证了一下,证明curl的proxy配好了。于是再次zypper refresh——

 

9。还TNND失败了!很抓狂地上网搜,最后查到OpenSuSE的问题库里面有这样一个问题: zypper doesn't respect some proxy settings, misunderstands others [ https://bugzilla.novell.com/show_bug.cgi?id=679322#c1 ] 下面的答复告诉我说: zypper只使用了libcurl,跟curl命令行不一样,它不使用~/.curlrc 里面的配置,而是直接使用/etc/sysconfig/proxy!

 

 

终于

终于

终于

配好了!!!

 

最后总结一下:

1. 根据它过程中的错误信息判断,opensuse本来的设计是让用户不用关心repo type, 所以初始都是设置为None的,网上很多zypper addrepo的例子里也没说-t type参数,因为它会自动连接到repo后“智能”检测——可TNND的问题是,没配proxy的话,它就连不上,也就判断不了;

2. zypper支持三种类型的repo,分别是yast2, rpm-md和plaindir,前两种在底层分别是用aria2和libcurl来下载文件的,可这tnnd两东西的proxy设置方式不一样,而且 libcurl(或者zypper?)跟curl命令行工具的proxy方式也不不一样(至于第三种 plaindir,还没玩过,说不定又有什么妖蛾子);

3. 网上关于zypper proxy配置的说明很少,比较多见的是各个mailing list/bugrepots站点上的问题报告单, SuSE官方网站上也没有说明。但你搜搜"apt-get proxy"看看,第一个就是清楚的说明:通过三种方法为apt-get设置http代理服务,而wiki.debian.org上也很容易找到: AptConf - Debian Wiki。相同的是两者的man page里都没提proxy的事情。

 

 

posted @ 2011-08-29 22:03  巴蛮子  阅读(12032)  评论(4编辑  收藏  举报