[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Apt-get autoremove 与 aptitude remove 两者行为是否有区别?



On 06/22/2010 04:49 PM, Huang, Tao wrote:
2010/6/22 chenwqin@gmail.com <chenwqin@gmail.com>
  
>
> 以下图中,
> 绿色圆是为了满足依赖关系而apt-get或aptitude自动安装上的 包
> 蓝色圆是管理员使用apt-get install 或 aptitude install指定安装的包,简称为手动安装的 包
    
其实你没必要搞这么复杂 而且邮件列表的指导原则是采用纯文本格式撰写
这些图片对后续的讨论和邮件的存档 (包括 usenet 和 google groups 中的阅读) 非常不友好

  
    单单文字很难描诉清楚那些关系,所以迫不得已用图

  
> 例子 1:
    
[snip]

  
> 例子3:
> 1. 在例子2的基础上, 有个手动安装的包E推荐D(既E Recommends D,手动安装E时,也会把D装上)
>
> apt-get remove C : 将删除C, 同时提示你用apt-get autoremove去清除B,D
> apt-get autoremove C : 将删除B, C, D
> aptitude remove C : 将删除B, C, D
    
我前面的疑惑就是针对你的最后一句话 也就是这个情况

从 /var/lib/apt/extended_states 可以看出 只有自动安装状态是被记录的 具体的依赖与推荐关系并不被记录
(可以通过 aptitude why $pkg 来查找指定包的可能安装原因)

依照你此例中说明的情况 执行

$ apt-get autoremove

会卸载所有只被某些包推荐而不被任何包依赖的包 而这明显与事实不符

我希望你给出具体的例子 也就是具体的 package names 而不是这些的并没有让问题变得更明了的示意图 这些图片中的依赖与推荐关系用文字也可以表述的很清楚

  
    由于包依赖的复杂,我很难在短时间内找有这几个例子所提到的依赖关系的包
    apt-get aptitude如何知道一个包的依赖关系? 它们都调用了dpkg的数据(/var/lib/dpkg/status),这里记录了安装的或者安装过的包的各种信息
    我测试时, B 包 是rdesktop, C 是 lftp,  D 是 w3m, E是nano, 它们之间是没有任何依赖关系的
    就是修改了/var/lib/dpkg/status来欺骗apt-get和aptitude ,让它们具有“依赖”关系
    你可以自己找两个简单的包,然后修改depends on, 让 A depends on B,然后用aptitude remove  B,你就能明白了

  
> 我的理解: 删除C, 那么B,D 这两个包既是自动安装的,且没有其他手动安装的包依赖于它们,
> 则可以判定B,D也是没必要的
> 虽然D被E Recommend, 但为啥是这么设计的, 我没猜出开发人员的想法
    
因为本身并不成立
你说的这种卸载方式 以 apt 对包依赖的记录 是无法实现的

  
> 例子4:
    
[snip]

  
> 例子5:
> 1. 在例子4的基础上, D变成推荐B, E依然依赖于D
>
> apt-get remove C : 将删除C, 同时提示你用apt-get autoremove去清除B
> apt-get autoremove C : 将删除B, C
> aptitude remove C :将删除B, C
>
> 我的理解: 删除C, 而B没有被其他手动安装的包直接依赖或者间接依赖(我指那些一层层depend on的关系), D被E依赖
> 所以B不是必要的,可以删除, 而D不能删除
    
这个例子里也有同样的问题

一个比较合理的判断一个包是否会被自动卸载的方法是用 aptitude why $pkg

只要 aptitude why $pkg 能够找到任何一条路径使得 $pkg 是被某些包依赖或推荐的 则 apt-get
autoremove 和 aptitude remove 就不会卸载 $pkg

如果你不同意的话 希望能举出真实反例

  
    aptitude why 也是根据 /var/lib/dpkg/status来判断的,一时间我很难到出有这样关系的5个包
    如果某天找到了,我会发出来


Reply to: