QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2575|回复: 3

rpmdeptool 例子

[复制链接]
发表于 2010-8-19 09:46:19 | 显示全部楼层 |阅读模式
下载地址
http://code.google.com/p/rpmdeptool/

先与MI同步一下脚本(因为这个工具中需要使用 MI 中的一些脚本, 辅助调节嘛)
python rpm_dep_tool.py sync -p <MI path>

然后将 spec/packages 指向待分析的包(与 MI 中配置方法相同)

执行命令生成包依赖关系
python rpm_dep_tool.py step1 step2
当然两步你可以分开执行(step1 step2)

下面我以提升 coreutils 位置的例子来说明使用方法
  1. [sunshine@MagicLinux rpmdeptool]$ python rpm_dep_tool.py query -p coreutils --color
  2. In the 0 CD 88 position
  3. PkgName:
  4. coreutils-7.0-7mgc25.i686.rpm                                                                                                         
  5. Length:                                                                                                                                
  6. 1355102                                                                                                                                
  7. Groups:                                                                                                                                
  8. System Environment                                                                                                                     
  9. Base
  10. Dependency:
  11. (0, 80) : util-linux-ng-2.17.2-2mgc25.i686.rpm                                                                                         
  12. (0, 82) : libcap-2.16-1mgc25.i686.rpm
  13. (0, 83) : gmp-4.2.4-2mgc25.i686.rpm
  14. (0, 2) : bash-4.0-1mgc25.i686.rpm
  15. (0, 84) : ncurses-5.7-2.20090207mgc25.i686.rpm
  16. (0, 86) : grep-2.5.3-2mgc25.i686.rpm
  17. (0, 77) : pam-1.1.0-2mgc25.i686.rpm
  18. (0, 87) : libacl-2.2.47-2mgc25.i686.rpm
  19. Include Pkg:
  20. ('spec/packages/coreutils-7.0-7mgc25.i686.rpm', 'i686', 1355102L)
复制代码
这里可以看到依赖关系Dependency:,我们需要去掉除bash以外所有的依赖
在spec/specinfo.py中添加
  1. remove_deps = {
  2.     'coreutils-7.0-7mgc25.i686.rpm':
  3.         ['util-linux-ng-2.17.2-2mgc25.i686.rpm',
  4.          'libcap-2.16-1mgc25.i686.rpm',
  5.          'gmp-4.2.4-2mgc25.i686.rpm',
  6.          'ncurses-5.7-2.20090207mgc25.i686.rpm',
  7.          'grep-2.5.3-2mgc25.i686.rpm',
  8.          'pam-1.1.0-2mgc25.i686.rpm',
  9.          'libacl-2.2.47-2mgc25.i686.rpm',
  10.         ]
  11. }

  12. 然后在 basepkg_list 中也添加包 coreutils (可以只为包名)
  13. basepkg_list = ['binutils',
  14.                 'glibc',
  15.                 #'glibc-common',
  16.                 #'glibc-static',
  17.                 #'glibc-utils',
  18.                 'ncurses-libs',
  19.                 'ncurses',
  20.                 'bash',
  21.                 #'bash-completion',
  22.                 'coreutils-libs',
  23.                 'coreutils',
  24.              ]
复制代码
运行命令重新生成依赖
  1. [sunshine@MagicLinux rpmdeptool]$ python rpm_dep_tool.py step2
  2. /usr/bin/python scripts/PkgArrange.py -o result/pkgarr.py -l                 tmp/pkgarr.log
复制代码
重新查看包的序列以及依赖关系
  1. [sunshine@MagicLinux rpmdeptool]$ python rpm_dep_tool.py query -p coreutils --color
  2. In the 0 CD 38 position
  3. PkgName:
  4. coreutils-7.0-7mgc25.i686.rpm                                                                                                         
  5. Length:                                                                                                                                
  6. 1355102                                                                                                                                
  7. Groups:                                                                                                                                
  8. System Environment                                                                                                                     
  9. Base
  10. Dependency:
  11. (0, 2) : bash-4.0-1mgc25.i686.rpm                                                                                                      
  12. (0, 12) : info-4.13-3mgc25.i686.rpm
  13. (0, 37) : libattr-2.4.43-2mgc25.i686.rpm
  14. Include Pkg:
  15. ('spec/packages/coreutils-7.0-7mgc25.i686.rpm', 'i686', 1355102L)
复制代码
我们看到已经从88位置提升到了38位置。

看到这里又出现了两个包依赖
(0, 12) : info-4.13-3mgc25.i686.rpm
(0, 37) : libattr-2.4.43-2mgc25.i686.rpm
,这是因为这两个包依赖在第一步中已经被包含(依赖的子依赖中已经包含),所以在第一步中没有显示这些依赖包。当解除了一些直接依赖后,那些被忽略的依赖包的子依赖就出现喽。

如果不满足现在的序列,继续添加 remove_deps

现在我们查看从第一个包到 coreutils 的序列
  1. [sunshine@MagicLinux rpmdeptool]$ python rpm_dep_tool.py query deps -t coreutils --color
  2. 0 :  ncurses-base-5.7-2.20090207mgc25.i686.rpm
  3. 1 :  ncurses-libs-5.7-2.20090207mgc25.i686.rpm
  4. 2 :  bash-4.0-1mgc25.i686.rpm
  5. 3 :  tzdata-2009f-2mgc25.noarch.rpm
  6. 4 :  glibc-common-2.10.1-2mgc25.i686.rpm
  7. 5 :  setup-2.8.1-1mgc25.noarch.rpm
  8. 6 :  filesystem-2.4.5-1mgc25.i686.rpm
  9. 7 :  basesystem-25-1mgc25.noarch.rpm
  10. 8 :  libgcc-4.4.0-5.i686.rpm
  11. 9 :  nss-softokn-freebl-3.12.4-1mgc25.i686.rpm
  12. 10 :  glibc-2.10.1-2mgc25.i686.rpm
  13. 11 :  zlib-1.2.3-19mgc25.i686.rpm
  14. 12 :  info-4.13-3mgc25.i686.rpm
  15. 13 :  binutils-2.19.51.0.2-1mgc25.i686.rpm
  16. 14 :  kernel-headers-2.6.30.10-5mgc25.i686.rpm
  17. 15 :  libattr-2.4.43-2mgc25.i686.rpm
  18. 16 :  coreutils-7.0-7mgc25.i686.rpm
复制代码
调节依赖关系的过程比较复杂
并不一定添加依赖就会使包推后到精确位置
并不一定移除依赖 并指定basepkg_list 就能使包提前精确位置
它只能将包尽量的向前和向后移动,因为过程中会考虑到依赖关系。
如果想要了解更多,推荐直接查看源码。

basepkg_list 是我新添加的一个元素, 目的是要控制最前面几个包的序列.
我推荐在发行制作 iso 时将
  1. basepkg_list = ['binutils',
  2.                 'glibc',
  3.                 #'glibc-common',
  4.                 #'glibc-static',
  5.                 #'glibc-utils',
  6.                 'ncurses-libs',
  7.                 'ncurses',
  8.                 'bash',
  9.                 #'bash-completion',
  10.                 'coreutils-libs',
  11.                 'coreutils',
  12.              ]
复制代码
这几个包序列按照这个顺序提到最前面, 以满足后面安装rpm时执行 preinstall 脚本.
若要提前这些包的位置, 可以将他们所有依赖去掉 (即在 remove_deps 中添加)

-----------------------------------------
下面是 rpmdeptool 参数的简单介绍.
  1. [sunshine@MagicLinux rpmdeptool]$ python rpm_dep_tool.py --help --color
  2. You can use --color to print the information in color format
  3. ***step1***
  4.                                           
  5. ..............................

复制代码
任何时候我们都可以加 --help 来查看各个参数的用法, 因此并不需要记住什么. 任何时候都可以加上 --color 参数来查看高亮显示.
我对应着翻译一下上面的help...
[sunshine@MagicLinux rpmdeptool]$ python rpm_dep_tool.py --help --color
You can use --color to print the information in color format
***step1***
rpm_dep_tool.py step1
        生成如下两个文件                                                                             
                tmp/pkginfor.py(这个文件储存着最基本的包信息)                                                         
                tmp/rpm.log(生成 pkginfor.py 过程中出现的警告和错误记录)                                             
               
                                                                                                      
***step2***
rpm_dep_tool.py step2
        生成如下两个文件                                                                             
                result/pkgarr.py(调整后的包信息, 主要是破除一些循环依赖, 并根据 spec/specinfo.py 中的配置调整)                                                     
                tmp/pkgarr.log(生成 pkgarr.py 过程中出现的警告和错误记录)                                          
                                                                                                      
***query***
rpm_dep_tool.py query -p <PkgName>
         打印某一个包的全部信息 -p 后面接 包名称 或 包的文件名
rpm_dep_tool.py query deps [-p PkgName or PkgNum]
         -p 后面可以接包名 或者 包的序列号 来指定那个包, rpmdeptool 会从第一个包开始打印直到指定的包.
                                                                                                      
rpm_dep_tool.py query nodep
         打印那些没有任何依赖的包名                                       
                                                                                                      
***sync***
rpm_dep_tool.py sync -p <MI path>
         将<MI path> 指定的 MI 中提取必要文件, 拷贝到 rpmdeptool 中, 更新包处理脚本.
         注意, 这是必要的,在 MI 版本更新后, 必须要对这些文件更新, 才能保证 rpmdeptool 的分析过程和当前 MI 相同
                                                                                                      
***install***
rpm_dep_tool.py install -t <target system path> [mount | umount]
         根据生成的包序列 pkgarr.py 模拟 MI 安装操作系统时的操作
         如果使用 mount 或者 umount 参数, 则不执行安装操作, 只是执行挂载和卸载目标系统目录的虚拟目录(sys proc 等)

[ 本帖最后由 zy_sunshine 于 2011-2-6 09:49 编辑 ]
 楼主| 发表于 2010-8-19 09:59:37 | 显示全部楼层
调节后,如果你感觉很满意当前的包序列,我们可以模拟MI安装一下试试,看看在安装过程中会不会出现不能运行的 pre post 脚本

先找一个目录(磁盘空间要足够哦,大概3G+ , 也可以直接挂接一个空白盘符)
比如是/mnt/tgtsys_root

执行命令
python rpm_dep_tool.py install -t /mnt/tgtsys_root

OK 之后就是漫长的等待... 注意 上面那个命令需要附加root权限
完成后可以查看result下的install.stderr.log  install.stdout.log两个过程记录文件,看是否出现问题,格式同MI中的 magic.actions.server.log longop.log
回复

使用道具 举报

 楼主| 发表于 2010-8-19 10:01:28 | 显示全部楼层
在生成依赖关系的过程中
(命令 python rpm_dep_tool.py step1 step2)
会产生两个过程log文件
tmp/pkgarr.log  tmp/rpm.log
,通过查看可以了解整体包是否有loop依赖出现,是否有重复提供某一文件出现。格式同MI
回复

使用道具 举报

发表于 2010-8-19 23:58:12 | 显示全部楼层
coreutils 的位置越高,组件安装脚本运行失败的次数就越低,再配合上basepkg_list,那么MI的安装应该趋于合理了,对之前高调说要重写 MI 实在感到汗顔。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-29 03:44 , Processed in 0.080626 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表