Linux 系统中具有数量众多的软件包. 各个分发版都有自己的管理系统. ArchLinux 是最为简洁的 Linux 系统之一, 受到很多人的喜欢. 它采用 pacman 和 yaourt 等程序 来管理这些数量繁多的软件包. 本文将这些软件包的信息从 ArchLinux 的软件仓库中提取并转化为 MySQL 可以读取的格式, 导入到数据库中. 以利于使用数据库软件来分析各软件包之间的依赖关系. 在最后 §4 测试一节中发现有 431个软件包直接依赖 glibc, 可见 glibc 的重要性.
§1 提取软件包的文件名
§2 建立数据库
§3 提取软件包中所含的各字段信息并生成 SQL 文件
§4 测试
§1 提取软件包的文件名我们的目的是建立一个 Archlinux 软件包信息的数据库. core.db, extra.db, community.db, archlinuxfr.db 这几个文件位于 /var/lib/pacman/sync .
首先获取 core.db, extra.db, community.db, archlinuxfr.db 文件中打包文件的名称. 这可以通过 tar 命令来得到. 当然首先将它们加上后缀 .tar.gz (它们本身就是 .tar.gz 文件)
以 core.db.tar.gz 为例, 使用 tar tf 命令获得其中打包文件的目录.
- tar tf core.db.tar.gz > core.lst
这个 core.lst 文件形如
- core/
- core/pth-2.0.7-4/
- core/pth-2.0.7-4/desc
- core/pth-2.0.7-4/depends
- core/nfsidmap-0.25-1/
- core/nfsidmap-0.25-1/desc
- core/nfsidmap-0.25-1/depends
- core/mdadm-3.2.6-1/
- core/mdadm-3.2.6-1/desc
- core/mdadm-3.2.6-1/depends
- ...
我们只需要软件名称, 有些东西是不需要的, 如
- core/pth-2.0.7-4/desc
- core/pth-2.0.7-4/depends
因此我们需要删除含有 /desc 或 /depends 的行, 并且删除每行开头的 core, 以及斜杠 / 符号. 最后形如
- pth-2.0.7-4
- nfsidmap-0.25-1
- mdadm-3.2.6-1
- ...
我们用 perl 来实现我们的想法.
假设我们通过上面的 tar tf 命令得到了 core.lst, extra.lst, community.lst, archlinuxfr.lst 文件, 并保存在 lst/ 目录中. 将下面的文件保存为 lst/getfilelst.pl, 设定为可执行, 然后执行它即可.
- #!/usr/bin/env perl
- # remark: the first line of the script can also be
- # #!/usr/bin/perl
- #---------------------
- # FileName: getfilelist.pl
- # Author: haifeng
- # Date: 2012-11-14
- # Description: get the filename of the packages in Archlinux
- #---------------------
- use strict;
- use warnings;
- #setting the file to be dealed with.
- my %file=(
- "core" => "core.lst",
- "extra" => "extra.lst",
- "community" => "community.lst",
- "archlinuxfr" => "archlinuxfr.lst"
- );
- my $lst;
- foreach $lst (keys %file) {
- my $output="$lst-pkg.lst";
- print "将从文件 $file{$lst} 生成 $output !\n";
- open(OLD, "<", "$file{$lst}") or die "can't open $file{$lst}: $!";
- open(NEW, ">", "$output") or die "can't open $output: $!";
- while (<OLD>) {
- # change $_, then...
- if(/desc/ or /depends/){
- # 含有 desc 或 depends 的行我们不需要, 即不输出到文件 $output.
- }
- else{
- # 将 core 以及 / 删除, 仅保留有用的软件包名.
- # 但是要注意有的软件包名称中含有 core, 比如位于 community/中的
- # compiz-core-0.8.8-4
- s/core\///g; # 将 core/ 去除
- s/\///g; # 将剩余的 / 去除
- print NEW $_ ;
- }
- }
- close(OLD) or die "can't close $file{$lst}: $!";
- close(NEW) or die "can't close $output: $!";
- }
- # 由于上面的代码生成的 core-pkg.lst 中的第一行是空行, 因此要删除.
- # 需要执行下面的外部命令
- # perl -pi -e '$_ = "" if ( $. == 1 );' core-pkg.lst
执行下面的命令
- ./getfilelst.pl
- perl -pi -e '$_ = "" if ( $. == 1 );' core-pkg.lst
得到如下的 core-pkg.lst 文件.
- pth-2.0.7-4
- nfsidmap-0.25-1
- mdadm-3.2.6-1
- mlocate-0.26-1
- autoconf-2.69-1
- libcap-2.22-3
- gdbm-1.10-1
- curl-7.28.0-1
- librpcsecgss-0.19-7
- ...
§2 建立数据库现在在 MySQL 中建立数据库 packages, 并建立若干个表, 分别是 core, extra, community, archlinuxfr. 以及软件包之间的关系 depends, conflicts, provides. 这些表的结构都是一样的, 这是为了自动完成的需要, 因为各个软件包目录中的信息不完全一致. 可以将下面的文件直接导入到 MySQL 中.
- -- phpMyAdmin SQL Dump
- -- version 3.5.1
- -- http://www.phpmyadmin.net
- --
- -- 主机: localhost
- -- 生成日期: 2012 年 11 月 17 日 14:58
- -- 服务器版本: 5.5.28-log
- -- PHP 版本: 5.4.8
- SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
- SET time_zone = "+00:00";
- /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
- /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
- /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
- /*!40101 SET NAMES utf8 */;
- --
- -- 数据库: `packages`
- --
- -- --------------------------------------------------------
- --
- -- 表的结构 `archlinuxfr`
- --
- CREATE TABLE IF NOT EXISTS `archlinuxfr` (
- `FILENAME` varchar(255) NOT NULL,
- `NAME` varchar(32) NOT NULL,
- `VERSION` varchar(20) NOT NULL,
- `DESC` text NOT NULL,
- `CSIZE` varchar(10) NOT NULL,
- `ISIZE` varchar(10) NOT NULL,
- `MD5SUM` varchar(32) NOT NULL,
- `SHA256SUM` varchar(64) NOT NULL,
- `PGPSIG` text NOT NULL,
- `URL` varchar(255) NOT NULL,
- `ARCH` varchar(20) NOT NULL,
- `BUILDDATE` varchar(20) NOT NULL,
- `PACKAGER` varchar(255) NOT NULL,
- `LICENSE` varchar(32) NOT NULL,
- `REPLACES` varchar(32) NOT NULL,
- `GROUPS` varchar(32) NOT NULL,
- `BASE` varchar(32) NOT NULL
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- 表的结构 `community`
- --
- CREATE TABLE IF NOT EXISTS `community` (
- `FILENAME` varchar(255) NOT NULL,
- `NAME` varchar(32) NOT NULL,
- `VERSION` varchar(20) NOT NULL,
- `DESC` text NOT NULL,
- `CSIZE` varchar(10) NOT NULL,
- `ISIZE` varchar(10) NOT NULL,
- `MD5SUM` varchar(32) NOT NULL,
- `SHA256SUM` varchar(64) NOT NULL,
- `PGPSIG` text NOT NULL,
- `URL` varchar(255) NOT NULL,
- `ARCH` varchar(20) NOT NULL,
- `BUILDDATE` varchar(20) NOT NULL,
- `PACKAGER` varchar(255) NOT NULL,
- `LICENSE` varchar(32) NOT NULL,
- `REPLACES` varchar(32) NOT NULL,
- `GROUPS` varchar(32) NOT NULL,
- `BASE` varchar(32) NOT NULL
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- 表的结构 `conflicts`
- --
- CREATE TABLE IF NOT EXISTS `conflicts` (
- `who-conflicts` varchar(32) NOT NULL,
- `conflicts-who` varchar(32) NOT NULL,
- `remark` text NOT NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- 表的结构 `core`
- --
- CREATE TABLE IF NOT EXISTS `core` (
- `FILENAME` varchar(255) NOT NULL,
- `NAME` varchar(32) NOT NULL,
- `VERSION` varchar(20) NOT NULL,
- `DESC` text NOT NULL,
- `CSIZE` varchar(10) NOT NULL,
- `ISIZE` varchar(10) NOT NULL,
- `MD5SUM` varchar(32) NOT NULL,
- `SHA256SUM` varchar(64) NOT NULL,
- `PGPSIG` text NOT NULL,
- `URL` varchar(255) NOT NULL,
- `ARCH` varchar(20) NOT NULL,
- `BUILDDATE` varchar(20) NOT NULL,
- `PACKAGER` varchar(255) NOT NULL,
- `LICENSE` varchar(32) NOT NULL,
- `REPLACES` varchar(32) NOT NULL,
- `GROUPS` varchar(32) NOT NULL,
- `BASE` varchar(32) NOT NULL
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- 表的结构 `depends`
- --
- CREATE TABLE IF NOT EXISTS `depends` (
- `who-depends` varchar(32) NOT NULL,
- `depends-who` varchar(32) NOT NULL,
- `minimal_version` varchar(20) NOT NULL,
- `remark` text NOT NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- 表的结构 `extra`
- --
- CREATE TABLE IF NOT EXISTS `extra` (
- `FILENAME` varchar(255) NOT NULL,
- `NAME` varchar(32) NOT NULL,
- `VERSION` varchar(20) NOT NULL,
- `DESC` text NOT NULL,
- `CSIZE` varchar(10) NOT NULL,
- `ISIZE` varchar(10) NOT NULL,
- `MD5SUM` varchar(32) NOT NULL,
- `SHA256SUM` varchar(64) NOT NULL,
- `PGPSIG` text NOT NULL,
- `URL` varchar(255) NOT NULL,
- `ARCH` varchar(20) NOT NULL,
- `BUILDDATE` varchar(20) NOT NULL,
- `PACKAGER` varchar(255) NOT NULL,
- `LICENSE` varchar(32) NOT NULL,
- `REPLACES` varchar(32) NOT NULL,
- `GROUPS` varchar(32) NOT NULL,
- `BASE` varchar(32) NOT NULL
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- 表的结构 `optdepends`
- --
- CREATE TABLE IF NOT EXISTS `optdepends` (
- `who-optdepends` varchar(32) NOT NULL,
- `optdepends-who` varchar(32) NOT NULL,
- `description` varchar(255) NOT NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- 表的结构 `provides`
- --
- CREATE TABLE IF NOT EXISTS `provides` (
- `who-provides` varchar(32) NOT NULL,
- `provides-who` varchar(32) NOT NULL,
- `remark` text NOT NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
§3 提取软件包中所含的各字段信息并生成SQL文件下面要做的是如何将每个软件包目录下的 desc 文件中的内容, 以及 depends 文件中的内容自动转换为 MySQL 容易接受的数据形式. 然后导入到数据库中.
比如下面是 acl-2.2.51-2-x86_64/desc 中的内容, 我们可以设想, 每次读取一行, 查看读入的这行数据是否以 % 开始, 且以 % 结束. 如果是, 则两个百分号之间的就是我们所需要可以作为表的字段名(或属性名), 而紧接着第二行即为该属性的值, 我们可以将它们以 MySQL 要求的形式输出.
acl-2.2.51-2-x86_64/desc 文件中的内容
- %FILENAME%
- acl-2.2.51-2-x86_64.pkg.tar.xz
- %NAME%
- acl
- %VERSION%
- 2.2.51-2
- %DESC%
- Access control list utilities, libraries and headers
- %CSIZE%
- 127824
- %ISIZE%
- 548864
- %MD5SUM%
- d8c6015c615c644b3f682938f1fa9f91
- %SHA256SUM%
- f7b4a2b8530dec5ba104242ee5ce8a2c9fca1c02e1a240ee9a0ee779a1411886
- %PGPSIG%
- iQEcBAABAgAGBQJPnMj9AAoJEB6yY4/1bAxTGCwH/RkeLWcOnUjzNtwQm5tSY6E64hufh7OUiskIloaHiIPCksPifEAPHg2vhTtZFEtY3hjH0LtQ7jhQiZ+Dz/HADNOp/ch1sVxEsLYw22z57Q4mGSP3mq6nltNk5RySfw18er8hHyPmNuE/mRLb3MjRbOIk3IA5bkxU5CTbTBcm5u/K4EhikrHIg+DKk3x74qBdqodxgGX9jn1NLnn0wKE+5X7Z98nE6lbo3SImRHfZW+PeTJg+iCOVb5ttVVNoc6JxFey52MoGqeMw82k307mrQpP5Qyqf0axvmSMrLa5U2Fa5mpuiu0u+UB5pBfORc4oERvZgUzBwDIRiQ1ZhtQTdD84=
- %URL%
- %LICENSE%
- LGPL
- %ARCH%
- x86_64
- %BUILDDATE%
- 1335675021
- %PACKAGER%
- Dave Reisner
- %REPLACES%
- xfsacl
为了自动完成上面所需的操作, 我们假设将解压缩后的 core/ extra/ community/ archlinuxfr/ 文件夹放在 Test/ 目录下, 根据第一节中生成的文件列表也放在同一目录下(如下所示).
- archlinuxfr/ core/ extra/ community/
- archlinuxfr.lst core.lst extra.lst community.lst
- archlinuxfr-pkg.lst core-pkg.lst extra-pkg.lst community-pkg.lst
将下面的 generateSQL.pl 程序也放在 Test/ 目录下, 它将从这四个软件仓库中逐个将软件包的信息生成可以插入到数据库 packages 中的格式.
执行 ./generateSQL.pl 后将生成两个 .sql 文件, desc.sql 和 depends.sql. 最后使用 mysql 的 source 命令导入即可.
- mysql> source /tmp/desc.sql;
- mysql> source /tmp/depends.sql;
generateSQL.sql 的源程序如下.
- #!/usr/bin/env perl
- #
- #-------------------------------
- # FileName: generateSQL.pl
- # Author: Haifeng Xu
- # Mail: hfxu@yzu.edu.cn
- # Date: Nov 15, 2011
- # Version:
- # Copyright (C) 2012
- # Website: www.atzjg.net
- #-------------------------------
- # 功能描述
- #
- # 根据生成的 core-pkg.lst, extra-pkg.lst, community-pkg.lst, archlinuxfr-pkg.lst
- # 中的文件名(也是目录名), 将每个文件夹中的 desc,depends 中的内容转化为 MySQL
- # 可以自动读入的内容. 这里将生成两个 .sql 文件(desc.sql, depends.sql), 方便导入到 MySQL 中.
- # 由于各个软件包中 desc 文件中的项目不一定都是一致的, 故放弃使用
- # MySQL 中 LOAD DATA 这种格式, 而使用 INSERT INTO 这种格式.
- #
- # LICENSE
- # 本软件允许任何人编辑修改
- #-------------------------------
- # Requirement
- # 请先使用 getfilelist.pl 生成 core-pkg.lst, extra-pkg.lst, community.lst,
- # archlinuxfr.lst 文件
- #-------------------------------
- use strict;
- use warnings;
- #use diagnostics;
- #setting the attributes of the table.
- my %depository=(
- "core" => "core-pkg.lst",
- "extra" => "extra-pkg.lst",
- "community" => "community-pkg.lst",
- "archlinuxfr" => "archlinuxfr-pkg.lst"
- );
- open(DESC_SQL, ">", "desc.sql") or die "can't open desc.sql: $!";
- open(DEPENDS_SQL, ">", "depends.sql") or die "can't open depends.sql: $!";
- my $group;
- my $pkglistfile;
- foreach $group (keys %depository) {
- $pkglistfile=$depository{$group};
- # 读取 core-pkg.lst,
- open(PKGLIST, "<", $pkglistfile) or die "can't open $pkglistfile: $!";
- my $pkgname;
- while (<PKGLIST>) {
- $_=~s/\n//g;
- $pkgname=$_;
- #setting the attributes of the table.
- my %core = (
- "FILENAME" => "",
- "NAME" => "",
- "VERSION" => "",
- "DESC" => "",
- "CSIZE" => "",
- "ISIZE" => "",
- "MD5SUM" => "",
- "SHA256SUM" => "",
- "PGPSIG" => "",
- "URL" => "",
- "ARCH" => "",
- "BUILDDATE" => "",
- "PACKAGER" => "",
- "LICENSE" => "",
- "REPLACES" => "",
- "BASE" => "",
- "GROUPS" => ""
- );
- #---------------------------
- # 进入 $group 文件夹, 处理其中每个软件包中的 desc 文件.
- chdir $group or die "cannot chdir to $group: $!";
- chdir $pkgname or die "cannot chdir to $pkgname: $!";
- open(DESC, "<", "desc") or die "can't open desc: $!";
- my $key='';
- my $count=1;
- my $string="INSERT INTO ".$group." (";
- # $table=core,extra,community,archlinuxfr
-
- while (<DESC>) {
- if($count % 3 !=0){
- if(/%*%/){
- # /%*%/ 匹配如 %FILENAME% 等, 将其中的 * 与 %core 中的比较
- $_=~s/%//g; # 将当前行中的 %去掉
- $_=~s/\n//g;# chomp 也可以做到.
- $key=$_; # 并存入变量 $key 中.
- }else{
- $_=~s/\n//g;
- $core{$key}=$_;
- # 下一行的内容即为 $key 所对应的值, 将它保存到 $core{$key} 中.
- }
- }
- $count++;
- }
- foreach $key (keys %core) {
- $string=$string."`$key`,";
- }
- substr($string,-1,1,")");
- $string=$string."VALUES(";
- foreach $key (keys %core) {
- $string=$string."\"$core{$key}\",";
- }
- substr($string,-1,2,");\n");
- print DESC_SQL $string;
- close(DESC) or die "can't close desc: $!";
- #---------------------------
- # 处理 $pkgname 目录中 depends 文件中的内容
- open(DEPENDS, "<", "depends") or die "can't open depends: $!";
- $string='';
- my $category=0; # DEPENDS:1, CONFLICTS:2, PROVIDES:3, OPTDEPENDS:4
- my $flag=0; # 用于表征 DEPENDS 的项是否还有, 主要看下一行是否是空, 如果是则设置为 0.
-
- my ($optpkg,$pkgdesc);
- $optpkg="";
- $pkgdesc="";
-
- while (<DEPENDS>) {
- chomp;
- if($_ eq ""){
- $category=0;
- $flag=0;
- next;
- }elsif($_ eq "%DEPENDS%"){
- # /%DEPENDS%/ 匹配 %DEPENDS%
- $category=1;
- $flag=1;
- next;
- }elsif($_ eq "%CONFLICTS%"){
- # /%CONFLICTS%/ 匹配 %CONFLICTS%
- $category=2;
- $flag=1;
- next;
- }elsif($_ eq "%PROVIDES%"){
- # /%PROVIDES%/ 匹配 %PROVIDES%
- $category=3;
- $flag=1;
- next;
- }elsif($_ eq "%OPTDEPENDS%"){
- # /%OPTDEPENDS%/ 匹配 %OPTDEPENDS%
- $category=4;
- $flag=1;
- next;
- }
- elsif($category==1 and $flag==1){
- $string="\"$_\"";
- $string="INSERT INTO depends (`who-depends`,`depends-who`)
- VALUES(\"".$pkgname."\",".$string.");\n";
- print DEPENDS_SQL $string;
- next;
- }elsif($category==2 and $flag==1){
- $string="\"$_\"";
- $string="INSERT INTO conflicts (`who-conflicts`,`conflicts-who`)
- VALUES(\"".$pkgname."\",".$string.");\n";
- print DEPENDS_SQL $string;
- next;
- }elsif($category==3 and $flag==1){
- $string="\"$_\"";
- $string="INSERT INTO provides (`who-provides`,`provides-who`)
- VALUES(\"".$pkgname."\",".$string.");\n";
- print DEPENDS_SQL $string;
- next;
- }elsif($category==4 and $flag==1){
- # %OPTDEPENDS% 中的内容形如
- # curl: for URI support
- $string=$_;
- ($optpkg,$pkgdesc)=split /:/, $string;
- if(defined($optpkg) and defined($pkgdesc)){
- $string="INSERT INTO optdepends (`who-optdepends`,`optdepends-who`,`description`)
- VALUES(\"".$pkgname."\",\"".$optpkg."\",\"".$pkgdesc."\");\n";
- print DEPENDS_SQL $string;
- }
- next;
- }
- }
- close(DEPENDS) or die "can't close desc: $!";
- chdir "../.." ;
- }
- close(PKGLIST) or die "can't close $pkglistfile: $!";
- }
- close(DESC_SQL) or die "can't close desc.out: $!";
- close(DEPENDS_SQL) or die "can't close desc.out: $!";
- #
- # END OF FILE generateSQL.pl
- # ----------------------------------------------------
§4 测试测试一下有哪些软件包明确指出直接依赖 glibc 的.
- mysql> select * from depends where `depends-who`='glibc';
结果是总共有431个软件包直接依赖 glibc. 可见 glibc 的重要性.
- | netkit-bsd-finger-0.17-7 | glibc | | |
- | nspr-4.9.3-1 | glibc | | |
- | nss-mdns-0.10-5 | glibc | | |
- | ntfs-3g-2012.1.15-3 | glibc | | |
- | openal-1.14-1 | glibc | | |
- | opencore-amr-0.1.3-1 | glibc | | |
- | opus-1.0.1-2 | glibc | | |
- | orc-0.4.16-1 | glibc | | |
- | p11-kit-0.13-1 | glibc | | |
- | perl-term-readkey-2.30.02-2 | glibc | | |
- | pixman-0.26.2-1 | glibc | | |
- | procmail-3.22-5 | glibc | | |
- | psutils-1.17-3 | glibc | | |
- | recode-3.6-7 | glibc | | |
- | sbc-1.0-1 | glibc | | |
- | sbcl-1.1.0-1 | glibc | | |
- | sdl-1.2.15-3 | glibc | | |
- | serd-0.18.0-1 | glibc | | |
- | setserial-2.17-4 | glibc | | |
- | sg3_utils-1.33-1 | glibc | | |
- | sip-4.14-2 | glibc | | |
- | slang-2.2.4-2 | glibc | | |
- | snappy-1.0.5-2 | glibc | | |
- | srm-1.2.11-2 | glibc | | |
- | talloc-2.0.7-1 | glibc | | |
- | tidyhtml-1.46-2 | glibc | | |
- | time-1.7-6 | glibc | | |
- | tree-1.6.0-2 | glibc | | |
- | unison-2.40.65-1 | glibc | | |
- | v4l-utils-0.8.8-1 | glibc | | |
- | v86d-0.1.10-4 | glibc | | |
- | vte-common-0.34.1-1 | glibc | | |
- | watchdog-5.12-2 | glibc | | |
- | wavpack-4.60.1-2 | glibc | | |
- | x264-20120705-1 | glibc | | |
- | xf86-input-aiptek-1.4.1-5 | glibc | | |
- | xf86-input-elographics-1.4.1-2 | glibc | | |
- | xf86-input-evdev-2.7.3-2 | glibc | | |
- | xf86-input-joystick-1.6.1-2 | glibc | | |
- | xf86-input-keyboard-1.6.2-2 | glibc | | |
- | xf86-input-mouse-1.8.1-2 | glibc | | |
- | xf86-input-vmmouse-12.9.0-2 | glibc | | |
- | xf86-input-void-1.4.0-4 | glibc | | |
- | xf86-video-apm-1.2.5-2 | glibc | | |
- | xf86-video-ark-0.7.5-2 | glibc | | |
- | xf86-video-ast-0.97.0-2 | glibc | | |
- | xf86-video-chips-1.2.5-2 | glibc | | |
- | xf86-video-cirrus-1.5.1-2 | glibc | | |
- | xf86-video-dummy-0.3.6-2 | glibc | | |
- | xf86-video-fbdev-0.4.3-2 | glibc | | |
- | xf86-video-glint-1.2.8-2 | glibc | | |
- | xf86-video-i128-1.3.6-2 | glibc | | |
- | xf86-video-i740-1.3.4-2 | glibc | | |
- | xf86-video-mach64-6.9.3-2 | glibc | | |
- | xf86-video-mga-1.6.2-2 | glibc | | |
- | xf86-video-neomagic-1.2.7-3 | glibc | | |
- | xf86-video-nv-2.1.20-2 | glibc | | |
- | xf86-video-r128-6.9.1-2 | glibc | | |
- | xf86-video-rendition-4.2.5-2 | glibc | | |
- | xf86-video-s3-0.6.5-2 | glibc | | |
- | xf86-video-s3virge-1.10.6-2 | glibc | | |
- | xf86-video-savage-2.3.6-2 | glibc | | |
- | xf86-video-siliconmotion-1.7.7-2 | glibc | | |
- | xf86-video-sis-0.10.7-2 | glibc | | |
- | xf86-video-sisimedia-0.9.1-4 | glibc | | |
- | xf86-video-sisusb-0.9.6-2 | glibc | | |
- | xf86-video-tdfx-1.4.5-2 | glibc | | |
- | xf86-video-trident-1.3.6-3 | glibc | | |
- | xf86-video-tseng-1.2.5-2 | glibc | | |
- | xf86-video-unichrome-0.2.7-7 | glibc | | |
- | xf86-video-v4l-0.2.0-11 | glibc | | |
- | xf86-video-vesa-2.3.2-2 | glibc | | |
- | xf86-video-voodoo-1.2.5-2 | glibc | | |
- | xorg-sessreg-1.0.7-1 | glibc | | |
- | xvidcore-1.3.2-1 | glibc | | |
- | yasm-1.2.0-2 | glibc | | |
- +----------------------------------+-------------+-----------------+--------+
- 431 rows in set (0.39 sec)
下面查询的是 core 中属于 base 组的软件包, 共有 65 个.
- mysql> select NAME from core where GROUPS LIKE "%base%";
- +--------------------+
- | NAME |
- +--------------------+
- | mdadm |
- | autoconf |
- | licenses |
- | lvm2 |
- | less |
- | ppp |
- | patch |
- | iproute2 |
- | file |
- | findutils |
- | heirloom-mailx |
- | cryptsetup |
- | iputils |
- | pacman |
- | reiserfsprogs |
- | perl |
- | gawk |
- | usbutils |
- | glibc |
- | vi |
- | make |
- | shadow |
- | tar |
- | device-mapper |
- | grep |
- | man-pages |
- | bash |
- | fakeroot |
- | nss-myhostname |
- | inetutils |
- | automake |
- | pciutils |
- | binutils |
- | systemd-sysvcompat |
- | libtool |
- | util-linux |
- | e2fsprogs |
- | gcc |
- | gettext |
- | diffutils |
- | gcc-libs |
- | filesystem |
- | coreutils |
- | psmisc |
- | logrotate |
- | cronie |
- | sysfsutils |
- | procps-ng |
- | jfsutils |
- | pcmciautils |
- | nano |
- | texinfo |
- | m4 |
- | bzip2 |
- | linux |
- | sed |
- | flex |
- | netcfg |
- | which |
- | dhcpcd |
- | man-db |
- | pkg-config |
- | bison |
- | xfsprogs |
- | gzip |
- +--------------------+
- 65 rows in set (0.00 sec)
阅读(3606) | 评论(0) | 转发(0) |