一个rpm包的艰难诞生

喜夏-厌秋 提交于 2019-11-30 09:05:35

问题背景

环境:CentOS 7.5
本打算使用checkinstall来打包spice-server,奈何CentOS7.5下没法yum install checkinstall
遂去网上找rpm包安装,然后总是报error:

/xx/xx/libxxx.so is not a directory

怀疑是版本问题,然后去 git clone http://checkinstall.izto.org/checkinstall.git
手动装最新版本,结果还是报error:

Building file list… FAILED!
cat: /var/tmp/tmp.wHtVtWP0YZ/newfiles: No such file or directory

自带的log显示:

error: line 11: Unknown tag: Recommends:

查了半天也没解决,没办法了只能想别的办法
rpmbuild 和 dpkg-buildpackage的操作太麻烦,暂不考虑
查到个新玩意儿,FPM
看起来很好吃很好用的样子,哈哈


安装FPM

#安装rugy、gem:
yum -y install ruby rubygems ruby-devel
gem source -l
#添加国内aliyun的源:
gem sources -a http://mirrors.aliyun.com/rubygems/
#移除原生官方源:
gem sources --remove https://rubygems.org/
#更新源:
gem source -u
#安装fpm:
gem install fpm

编译spice-server并打包

获取、修改源码

wget https://www.spice-space.org/download/releases/spice-server/spice-0.14.1.tar.bz2

install deps && config && make,缺啥包你们自己补吧

yum install spice-protocol
yum install glib2 glib2-devel
yum install pixman pixman-devel
yum install celt051 celt051-devel
yum install openssl openssl-devel
yum install libjpeg-turbo libjpeg-turbo-devel
yum install opus opus-devel
yum install cyrus-sasl cyrus-sasl-devel lz4 lz4-devel usbredir*
./configure --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 --enable-gtk-doc-pdf=no --enable-gtk-doc-html=no --enable-celt051 --enable-manual=no --enable-gstreamer=no
make -j8

打包
先让它安装到某个临时目录:

make install DESTDIR=/root/tmpdir

然后用fpm打包:

fpm -s dir -t rpm -n spice-server -v 0.14.1 -C /root/tmpdir

这时候有个spice-0.14.1-1.x86_64.rpm的rpm包出来了


安装测试与debug

yum install spice-0.14.1-1.x86_64.rpm
yum install centos-release-qemu-ev

上面这两步都没啥问题

yum install qemu-kvm-ev

这时候会提示:

–> Processing Dependency: libspice-server.so.1()(64bit) for package: 10:qemu-kvm-ev-2.12.0-33.1.el7.x86_64
–> Finished Dependency Resolution
Error: Package: 10:qemu-kvm-ev-2.12.0-33.1.el7.x86_64 (centos-qemu-ev)
Requires: libspice-server.so.1(SPICE_SERVER_0.6.0)(64bit)
Available: spice-server-0.14.0-7.el7.x86_64 (base)
libspice-server.so.1(SPICE_SERVER_0.6.0)(64bit)
Installed: spice-server-0.14.1-1.x86_64 (@/spice-server-0.14.1-1.x86_64)
Not found
Error: Package: 10:qemu-kvm-ev-2.12.0-33.1.el7.x86_64 (centos-qemu-ev)
Requires: libspice-server.so.1(SPICE_SERVER_0.8.3)(64bit)
Available: spice-server-0.14.0-7.el7.x86_64 (base)
libspice-server.so.1(SPICE_SERVER_0.8.3)(64bit)
Installed: spice-server-0.14.1-1.x86_64(@/spice-server-0.14.1-1.x86_64)
Not found

提示了一堆东西,从libspice-server.so的0.6一直到0.13版本全部都要。
但是这个时候用qemu跑spice协议虚拟机还是能跑的,这说明什么?
说明打出来的包没配置好,或者qemu-kvm-ev对版本有要求。
yum deplist qemu-kvm-ev
里面有一段:

  • dependency: libspice-server.so.1()(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.10.0)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.10.1)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.10.2)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.10.3)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.10.4)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.11.2)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.12.2)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.12.3)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.12.4)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.12.5)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.12.6)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.13.1)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.6.0)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.8.1)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.8.2)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7
  • dependency: libspice-server.so.1(SPICE_SERVER_0.8.3)(64bit)
  • provider: spice-server.x86_64 0.14.0-7.el7

尼玛一个spice-server.x86_64 0.14.0-7.el7怎么就能提供这么多版本的lib?


问题发现与解决

  • 先用yumdownloader把这货下载下来看看,然后用rpmdev-diff和自己用FPM打的包对比半天,也没发现有啥问题,更没有发现上面说的这么多的lib.so文件。
  • 那问题可能出现在哪儿?
    大概率就是安装rpm的时候,配置文件不一样
    顺着这个思路,我们去看看rpm包里面的打包的spec文件:

yum install rpm-build rpmrebuild rpm cpio
rpmrebuild -e -p --notest-install spice-server-0.14.0-7.el7.x86_64.rpm

  • 这时候自动打开一个vim窗口,把里面文件保存下来, official.spec
  • 再去打开自己打包的rpm包,把里面文件保存下来, mine.spec

两相对比,发现最大的区别就是官方的rpm包内容详尽、关键是多了这么几行:

  • Provides: libspice-server.so.1()(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.10.0)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.10.1)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.10.2)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.10.3)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.10.4)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.11.2)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.11.4)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.12.2)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.12.3)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.12.4)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.12.5)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.12.6)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.13.1)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.13.2)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.6.0)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.6.1)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.8.0)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.8.1)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.8.2)(64bit)
  • Provides: libspice-server.so.1(SPICE_SERVER_0.8.3)(64bit)

copy下来,加到mine.spec里面

下面咋办呢,rpm拆包再打包。
1, 先用rpmbuild帮咱建立打包所需的目录结构:

cd
rpmbuild …/

2, 再解开自己的rpm包,用修改后的mine.spec重新打:

解包到临时目录:

mkdir tmp-unzip-rpm
cd tmp-unzip-rpm/
rpm2cpio spice-server-0.14.1-1.x86_64.rpm | cpio -div

3, 再到rpmbuild的目录结构下折腾:

cd /root/rpmbuild/BUILDROOT/
mkdir spice-server-0.14.1-1.x86_64
cd spice-server-0.14.1-1.x86_64
cp -r /root/tmp-unzip-rpm/usr ./

  • 开搞:
  • cd
    rpmbuild -bb mine.spec
    ls /root/rpmbuild/RPMS/x86_64/
  • 于是有了spice-server-0.14.1-1.x86_64.rpm
  • 安装测试一下:

yum install /root/rpmbuild/RPMS/x86_64/spice-server-0.14.1-1.x86_64.rpm
yum install qemu-kvm-ev

  • 这个时候提示信息就比较正常了:

[root@ip12163 ~]# yum install qemu-kvm-ev
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

  • base: ftp.sjtu.edu.cn
  • centos-qemu-ev: ftp.sjtu.edu.cn
  • epel: mirrors.aliyun.com
  • extras: mirrors.huaweicloud.com
  • nux-dextop: mirror.li.nux.ro
  • rpmfusion-free-updates: mirrors.ustc.edu.cn
  • rpmfusion-nonfree-updates: mirrors.ustc.edu.cn
  • updates: mirrors.cn99.com
    Resolving Dependencies
    –> Running transaction check
    —> Package qemu-kvm-ev.x86_64 10:2.12.0-33.1.el7 will be installed
    –> Finished Dependency Resolution

Dependencies Resolved

=====================================================================
Package Arch Version Repository Size

Installing:
qemu-kvm-ev x86_64 10:2.12.0-33.1.el centos-qemu-ev 3.5 M

Transaction Summary

==========================
Install 1 Package

Total download size: 3.5 M
Installed size: 15 M
Is this ok [y/d/N]:

ok,that’s all !

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!