ubuntu old release(Ubuntu 20.04)

如何在Ubuntu 15.10上为单个网卡设置多个IP地址

有时候你可能想在你的网卡上使用多个 IP地址。遇到这种情况你会怎么办呢?买一个新的网卡并分配一个新的 IP?不,没有这个必要(至少在小型网络中)。现在我们可以在 Ubuntu系统中为一个网卡分配多个 IP地址。想知道怎么做到的?跟着我往下看,其实并不难。

这个方法也适用于 Debian以及它的衍生版本。

临时添加 IP地址

首先,让我们找到网卡的 IP地址。在我的 Ubuntu 15.10服务器版中,我只使用了一个网卡。

运行下面的命令找到 IP地址:

sudoip addr

样例输出:

1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6::1/128 scope host

valid_lft forever preferred_lft forever

2: enp0s3:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP groupdefault qlen 1000

link/ether 08:00:27:2a:03:4b brd ff:ff:ff:ff:ff:ff

inet 192.168.1.103/24 brd 192.168.1.255 scope global enp0s3

valid_lft forever preferred_lft forever

inet6 fe80::a00:27ff:fe2a:34e/64 scope link

valid_lft forever preferred_lft forever

sudoifconfig

样例输出:

enp0s3 Link encap:EthernetHWaddr08:00:27:2a:03:4b

inet addr:192.168.1.103Bcast:192.168.1.255Mask:255.255.255.0

inet6 addr: fe80::a00:27ff:fe2a:34e/64Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500Metric:1

RX packets:186 errors:0 dropped:0 overruns:0 frame:0

TX packets:70 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:21872(21.8 KB) TX bytes:9666(9.6 KB)

lo Link encap:LocalLoopback

inet addr:127.0.0.1Mask:255.0.0.0

inet6 addr:::1/128Scope:Host

UP LOOPBACK RUNNING MTU:65536Metric:1

RX packets:217 errors:0 dropped:0 overruns:0 frame:0

TX packets:217 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:38793(38.7 KB) TX bytes:38793(38.7 KB)

正如你在上面输出中看到的,我的网卡名称是 enp0s3,它的 IP地址是 192.168.1.103。

现在让我们来为网卡添加一个新的 IP地址,例如说 192.168.1.104。

打开你的终端并运行下面的命令添加额外的 IP。

sudoip addr add 192.168.1.104/24 dev enp0s3

用命令检查是否启用了新的 IP:

sudoip address show enp0s3

样例输出:

2: enp0s3:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP groupdefault qlen 1000

link/ether 08:00:27:2a:03:4e brd ff:ff:ff:ff:ff:ff

inet 192.168.1.103/24 brd 192.168.1.255 scope global enp0s3

valid_lft forever preferred_lft forever

inet 192.168.1.104/24 scope global secondary enp0s3

valid_lft forever preferred_lft forever

inet6 fe80::a00:27ff:fe2a:34e/64 scope link

valid_lft forever preferred_lft forever

类似地,你可以添加任意数量的 IP地址,只要你想要。

让我们 ping一下这个 IP地址验证一下。

sudoping192.168.1.104

样例输出

PING 192.168.1.104(192.168.1.104)56(84) bytes of data.

64 bytes from192.168.1.104: icmp_seq=1 ttl=64time=0.901 ms

64 bytes from192.168.1.104: icmp_seq=2 ttl=64time=0.571 ms

64 bytes from192.168.1.104: icmp_seq=3 ttl=64time=0.521 ms

64 bytes from192.168.1.104: icmp_seq=4 ttl=64time=0.524 ms

好极了,它能工作!

要删除 IP,只需要运行:

sudoip addr del192.168.1.104/24 dev enp0s3

再检查一下是否删除了 IP。

sudoip address show enp0s3

样例输出:

2: enp0s3:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP groupdefault qlen 1000

link/ether 08:00:27:2a:03:4e brd ff:ff:ff:ff:ff:ff

inet 192.168.1.103/24 brd 192.168.1.255 scope global enp0s3

valid_lft forever preferred_lft forever

inet6 fe80::a00:27ff:fe2a:34e/64 scope link

valid_lft forever preferred_lft forever

可以看到已经没有了!!

正如你所知,重启系统后这些设置会失效。那么怎么设置才能永久有效呢?这也很简单。

添加永久 IP地址

Ubuntu系统的网卡配置文件是/etc/network/interfaces。

让我们来看看上面文件的具体内容。

sudocat/etc/network/interfaces

输出样例:

#Thisfile describes the network interfaces available on your system

#and how to activate them.Formore information, see interfaces(5).

source/etc/network/interfaces.d/*

# The loopback network interface

auto lo

iface lo inet loopback

# The primary network interface

auto enp0s3

iface enp0s3 inet dhcp

正如你在上面输出中看到的,网卡启用了 DHCP。

现在,让我们来分配一个额外的地址,例如 192.168.1.104/24。

编辑/etc/network/interfaces:

sudonano/etc/network/interfaces

如下添加额外的 IP地址。

#Thisfile describes the network interfaces available on your system

#and how to activate them.Formore information, see interfaces(5).

source/etc/network/interfaces.d/*

# The loopback network interface

auto lo

iface lo inet loopback

# The primary network interface

auto enp0s3

iface enp0s3 inet dhcp

iface enp0s3 inet static

address 192.168.1.104/24

保存并关闭文件。

运行下面的命令使更改无需重启即生效。

sudo ifdown enp0s3&&sudo ifup enp0s3

样例输出:

Killed old client process

InternetSystemsConsortium DHCP Client4.3.1

Copyright2004-2014InternetSystemsConsortium.

All rights reserved.

Forinfo, please visit

Listening on LPF/enp0s3/08:00:27:2a:03:4e

Sending on LPF/enp0s3/08:00:27:2a:03:4e

Sending on Socket/fallback

DHCPRELEASE on enp0s3 to 192.168.1.1 port 67(xid=0x225f35)

InternetSystemsConsortium DHCP Client4.3.1

Copyright2004-2014InternetSystemsConsortium.

All rights reserved.

Forinfo, please visit

Listening on LPF/enp0s3/08:00:27:2a:03:4e

Sending on LPF/enp0s3/08:00:27:2a:03:4e

Sending on Socket/fallback

DHCPDISCOVER on enp0s3 to 255.255.255.255 port 67 interval 3(xid=0xdfb94764)

DHCPREQUEST of 192.168.1.103 on enp0s3 to 255.255.255.255 port 67(xid=0x6447b9df)

DHCPOFFER of 192.168.1.103from192.168.1.1

DHCPACK of 192.168.1.103from192.168.1.1

bound to 192.168.1.103-- renewal in35146 seconds.

注意:如果你从远程连接到服务器,把上面的两个命令放到一行中非常重要,因为第一个命令会断掉你的连接。而采用这种方式可以保留你的 ssh会话。

现在,让我们用下面的命令来检查一下是否添加了新的 IP:

sudoip address show enp0s3

输出样例:

2: enp0s3:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP groupdefault qlen 1000

link/ether 08:00:27:2a:03:4e brd ff:ff:ff:ff:ff:ff

inet 192.168.1.103/24 brd 192.168.1.255 scope global enp0s3

valid_lft forever preferred_lft forever

inet 192.168.1.104/24 brd 192.168.1.255 scope global secondary enp0s3

valid_lft forever preferred_lft forever

inet6 fe80::a00:27ff:fe2a:34e/64 scope link

valid_lft forever preferred_lft forever

很好!我们已经添加了额外的 IP。

再次 ping IP地址进行验证。

sudoping192.168.1.104

样例输出:

PING 192.168.1.104(192.168.1.104)56(84) bytes of data.

64 bytes from192.168.1.104: icmp_seq=1 ttl=64time=0.137 ms

64 bytes from192.168.1.104: icmp_seq=2 ttl=64time=0.050 ms

64 bytes from192.168.1.104: icmp_seq=3 ttl=64time=0.054 ms

64 bytes from192.168.1.104: icmp_seq=4 ttl=64time=0.067 ms

好极了!它能正常工作。就是这样。

math processing error 怎么解决

Ubuntu下要用一下traceroute命令,

root@wangguan-ubuntu:~# traceroute 192.168.5.13

程序'traceroute'已包含在下列软件包中:

* inetutils-traceroute

* traceroute

请尝试:apt-get install<选定的软件包>

于是我

root@wangguan-ubuntu:~# apt-get install inetutils-traceroute traceroute

却返回如下错误信息

dpkg: error processing install-info(--configure):

子进程已安装 post-installation脚本返回了错误号 1

在处理时有错误发生:

install-info

E: Sub-process/usr/bin/dpkg returned an error code(1)

解决方法如下:

方法/步骤

1

将info文件夹更名

命令如下:

root@wangguan-ubuntu:~# mv/var/lib/dpkg/info//var/lib/dpkg/info_old/

2

再新建一个新的info文件夹

命令如下:

root@wangguan-ubuntu:~# mkdir/var/lib/dpkg/info/

3

apt-get update

命令如下:

root@wangguan-ubuntu:~# apt-get update

信息如下:

忽略 stable InRelease

命中 stable Release.gpg

命中 stable Release

命中 stable/main amd64 Packages

命中 stable/main i386 Packages

忽略 saucy InRelease

忽略 saucy-updates InRelease

忽略 saucy-backports InRelease

...

忽略 saucy-security/universe Translation-zh_CN

忽略 saucy-security/universe Translation-zh

正在读取软件包列表...完成

4

重新安装

命令如下:

root@wangguan-ubuntu:~# apt-get-f install

信息如下:

正在读取软件包列表...完成

正在分析软件包的依赖关系树

正在读取状态信息...完成

升级了 0个软件包,新安装了 0个软件包,要卸载 0个软件包,有 296个软件包未被升级。

有 1个软件包没有被完全安装或卸载。

解压缩后会消耗掉 0 B的额外空间。

正在设置 install-info(5.1.dfsg.1-4ubuntu1)...

5

执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下

命令如下:

root@wangguan-ubuntu:~# mv/var/lib/dpkg/info/*/var/lib/dpkg/info_old/

6

把自己新建的info文件夹删掉

命令如下:

root@wangguan-ubuntu:~# rm-rf/var/lib/dpkg/info

7

把info_old文件夹重新改回info

命令如下:

root@wangguan-ubuntu:~# mv/var/lib/dpkg/info_old//var/lib/dpkg/info/

8

至此 apt-get重新安装完毕。

再一次安装 traceroute

命令如下:

root@wangguan-ubuntu:~# apt-get install inetutils-traceroute traceroute

信息如下:

正在读取软件包列表...完成

正在分析软件包的依赖关系树

正在读取状态信息...完成

下列【新】软件包将被安装:

inetutils-traceroute traceroute

升级了 0个软件包,新安装了 2个软件包,要卸载 0个软件包,有 296个软件包未被升级。

需要下载 0 B/87.1 kB的软件包。

解压缩后会消耗掉 434 kB的额外空间。

Selecting previously unselected package traceroute.

(正在读取数据库...系统当前共安装有 187398个文件和目录。)

正在解压缩 traceroute(从.../traceroute_1%3a2.0.19-3_amd64.deb)...

Selecting previously unselected package inetutils-traceroute.

正在解压缩 inetutils-traceroute(从.../inetutils-traceroute_2%3a1.9.1.306-0a482-1_amd64.deb)...

正在处理用于 man-db的触发器...

正在设置 traceroute(1:2.0.19-3)...

update-alternatives: using/usr/bin/traceroute.db to provide/usr/bin/traceroute(traceroute) in自动模式

update-alternatives: using/usr/bin/lft.db to provide/usr/bin/lft(lft) in自动模式

update-alternatives: using/usr/bin/traceproto.db to provide/usr/bin/traceproto(traceproto) in自动模式

update-alternatives: using/usr/sbin/tcptraceroute.db to provide/usr/sbin/tcptraceroute(tcptraceroute) in自动模式

正在设置 inetutils-traceroute(2:1.9.1.306-0a482-1)...

root@wangguan-ubuntu:~#

9

试一下 traceroute

root@wangguan-ubuntu:~# traceroute 192.168.5.13

traceroute to 192.168.5.13(192.168.5.13), 30 hops max, 60 byte packets

1 wangguan-ubuntu.local(192.168.5.101) 2997.264 ms!H 2997.184 ms!H 2997.163 ms!H

安装成功,搞定!

END

注意事项

要以root用户执行命令

Linux系统下软件包的制作方法和过程

总的情况下Linux下软件安装主要有三种方式:

一种是源码安装,需要用户自己手动编译

另一种是RPM包(RedHat Linux Packet Manager),通过RPM命令就可以实现安装

还有一种为*.bin文件,安装方法与Windows下的安装过程类似

通常情况下Linux安装软件主要通过以下两种方式

①文件名形如xxx.i386.rpm,软件包以二进制形式发布.

②文件名形如xxx.tar.gz,软件包多以源码的形式发布.

Linux软件包管理可以分为三类:二进制包的管理,源代码包的管理,脚本安装

另外值得注意的是目前存在各种Linux的发行版获取和安装软件的方式也有很多例如

【】redhat/centos的yum安装(有专门的镜像源)

【】Ubuntu/Fedora/Debian的sudo apt-get适用于deb包进行管理安装

【】也有的软件是通过刻盘加密的形式然后进行安装的(例如cnyunwei)

【】在系统运维管理人员方面也有通过ssh、C/C++语言或者py执行的一些软件命令进行自动化管理的应用,这里就不做详细介绍了。

下面有一张图可以清晰地表示linux软件应用的架构关系:

   在Linux启动的时候。首先会启动内核(kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。我们可以看到,Linux利用kernel实现软硬件的对话。通过系统调用的这个重要的接口,Linux将上层的应用与下层的kernel完全分离开,为程序员隐藏了底层的复杂性(相应的,也提高了上层应用的可移植性)。当我们在升级kernel的时候,也可以保持系统调用的语句不变,从而让上层应用不感受到下层的改变。库函数利用系统调用创造出模块化的功能,而shell则提供了一个用户界面,并让我们可以利用shell的语法编写脚本,以整合程序。有了这些思想我们可以快速地了解linux的软件应用的安装和工作原理,也因此为了方便和获取更多企业应用我们需要在linux系统上开发并且通过源码编译的方式制作各种软件包从而为信息化时代服务。

本文主要介绍源码安装与RPM包的安装

源码包和商业软件包根据各个公司或作者的实际情况出发(可以是tar等格式的压缩包,也可以是bin的源程序,可以是已经编译好了的直接拿来运行的文件,也可以是光盘虚拟化文件等其他介质来制作发布的iso文件等)封装成一种特定的格式发布从而进行相应的软件服务。其实通过yum或者make install命令安装的软件在系统都会自动生成rpm包(只是参数和功能模块差异和严谨的)

简介:

RPM(RedHat Package Manager,红帽子软件包管理器)用于软件包的安装、查询、升级、校验、卸载,以及生成.rpm格式的软件包 RPM的使用前

挂载linux系统(centos4为例)的安装光盘,当然也可在网上下载免费的RPM包.

# mount/dev/cdrom---挂载光盘

# cd/media/cdrom/CentOS/RPMS---进入光盘中RPM包的目录(可以通过#mount命令来查看光盘的挂载点一般会在最后一行显示)

# ls

一、源码包安装

1、*.src.rpm形式的源代码软件包

用法:

安装: rpm–rebuild*.src.rpm

cd/usr/src/dist/RPMS

Rpm–ivh*.rpm

卸载: rpm–e packagename

2、.tar.gz,*.tgz,*.bz2形式软件包的安装

首先进行解压,命令如下

tar zxvf*.tar.gz

tar xvfz*.tgz

tar xvfj*.tar.bz2

解压之后进入解压目录,然后进行以下操作(一般情况,具体看软件包的文件名)

配置:./configure

编译:make

安装:make install

卸载:make uninstall

源码安装有一定的难度,不同的软件可能有不同的安装,一般在解压之后应该先阅读说明文档,按照说明进行安装,上面说的只是一般情况。

二、RPM包安装

RPM安装包格式是由Redhat公司提出的,大大的简化了Linux下软件的安装,首先介绍一下通用选项。

-v:显示附加信息

-vv:显示调试信息

--root directory:让RPM以directory作为根目录,这样预安装程序和后安装程序都会安装到这个目录下。

1、安装:rpm–i file.rpm

Options:

h:安装时输出hash记号

test:只对安装进行测试,不真正安装

--persent:以百分比形式显示安装进度

--excludedocs:不安装软件包中的文档

--replacepkgs:强制重新安装

--replacefiles:替换属于其它软件包的文件

--force:忽略软件包及文档冲突

--ignorearch:不校验软件包结构

--ignoreos:不检查软件包运行的操作系统

--nodeps:不检查依赖性关系

--noscripts:不运行预安装和后安装脚本程序

2、删除rpm–e pkgname

Option:

--test:只做删除测试,不真正删除

--noscripts:不运行预安装和后安装脚本程序

--nodeps:不检查依赖性

注意:pkgname是软件包的名字,不是rpm包名字,而是安装后软件包的名字,可以用查询命令来查询软件包名。

3、升级rpm–U(或者—upgrade)file.rpm

Option:

基本与安装时的option一样,有几个特殊的:

--oldpackage:允许一个旧版本

4、查询rpm–q(或者--query)

Option:

-p PACKAGE_FILE:查询软件包的文件

-f FIEL:查询FILE属于哪个软件包

-a:查询所有安装的软件包

-ggroup:查询属于group组的软件包

--whatproVidesCAPABILITY:查询提供了CAPABILITY功能的软件包

--whatrequiresCAPABILITY:查询所有需要CAPABILITY功能的软件包

-i:显示软件包的概要信息

-l:显示软件包中的文件列表

-c:显示配置文件列表

-s:显示文件列表

-scripts:显示安装、卸载,校验脚本

--qf:以用户指定的方式查询

--dump:显示每个文件的校验信息

--proVides:显示软件包提供的功能

-R:显示软件包需要的功能

5、校验已经安装的软件包 rpm–V(or–verify,or–y)

Option选项与其它命令的类似

6、校验软件包中的文件 rpm–K(or–checksig) file.rpm

Option:

-v:显示版本信息

-vv:显示调试信息

--rcfileFILELIST:设置rpmrc文件为FILELIST

7、其它RPM选项

--rebuilddb:重建RPM资料库

--initdb:创建一个新的RPM资料库

--quiet:尽可能地减少输出

--help:显示帮助文件

--version:显示RPM当前版本

上面只是对常用选项的总结,具体还有什么问题,可以用man rpm命令进行查看,官方文件永远最好的老师。

三、*.bin格式安装文件的安装

只需双击或单击*.bin文件就可以根据提示安装了,不再敷述。

要想制作一个RPM格式的软件包,需要编写软件包描述文件。其标准命名格式为:软件名-版本号-释出号.spec(现在大多情况下都是直接用:软件名.spec),这个文件,详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。有了这个文件,RPM就可以制作出相应的包裹文件来。当然现在也有例如Source rpm这样开源的包制作辅助工具只要一个程序源即可通过向导下一步即可制作。

简单的一个制作例子:

其实最好的办法是做个软件包。我记得 rpm和 debian都有快速打包的开源软件可以直接拿来使用即可。

eg将nginx的tar包制作为RPM包

1.下载nginx的源码包

2.将文件放到/usr/src/redhat/SOURCES/目录下

3.编写SPEC文件

[root@mail SPECS]# vinginx-0.8.35.spec

Summary:the first rpmpackage

Name:nginx

Version:0.8

Release:35

Vendor:chenwei01@corp.the9.com

License:Share

Group:Applications/Text

Source0:nginx-0.8.35.tar.gz

%description

my test nginx

%prep

tar-zxvf$RPM_SOURCES_DIR/nginx-0.8.35.tar.gz

%build

cd$RPM_BUILD_DIR/nginx-0.8.35

./configure

make

%install

cd$RPM_BUILD_DIR/nginx-0.8.35

make install

%clean

rm-rf$RPM_BUILD_DIR/nginx-0.8.35

%files

%defattr(-,root,root)

/usr/local/nginx/sbin/nginx

%doc$RPM_BUILD_DIR/nginx-0.8.35/README

4.制作RPM包

[root@mail SPECS]#rpmbuild-ba nginx-0.8.35.spec

若运行没有错误,则产生/usr/src/redhat/RPMS/i386/nginx-0.8-35.i386.rpm和/usr/src/redhat/SRPMS/nginx-0.8-35.src.rpm两个文件。

总结:rpm包如何制作之个人经验

一 RPM介绍

RPM前是RedHat Package Manager的缩写,本意是Red Hat软件包管理,顾名思义是Red Hat贡献出来的软件包管理;现在应为RPM Package Manager的缩写。在Fedora、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用; RPM包中除了包括程序运行时所需要的文件,也有其它的文件;一个RPM包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系。

RPM可以让用户直接以binary方式安装软件包,并且可替用户查询是否已经安装了有关的库文件;在用RPM删除程序时,它又会聪明地询问用户是否要删除有关的程序。如果使用RPM来升级软件,RPM会保留原先的配置文件,这样用户就不用重新配置新的软件了。RPM保留一个数据库,这个数据库中包含了所有的软件包的资料,通过这个数据库,用户可以进行软件包的查询。RPM虽然是为Linux而设计的,但是它已经移值到SunOS、Solaris、AIX、Irix等其它UNIX系统上了。RPM遵循GPL版权协议,用户可以在符合GPL协议的条件下自由使用及传播RPM。

二 RPM包分类

我个人认为rpm分为两大类,

1二进制类包,包括rpm安装包(一般分为i386和x86等几种)和调式信息包等。

2源码类包,源码包和开发包应该归位此类。

它们之间的关系是,最先我们按rpm打包要求改造软件项目源码,当符合要求之后就可以使用rpmbuild命令来生成不同的rpm包,同时生成的包之间版本是直接对应的,比如相同的源码包将生成完全相同的二进制rpm包。当你在网上查找rpm包时,一般你可以在RPMS目录中找到预编译的二进制包,而源码包则会在SRPMS目录内。

我们这里提到的RPM制作就是指改造软件源代码使之符合RPM打包要求的过程,这也可以等价为RPM源码包的制作过程,因为当你有了源码包就可以直接编译得到二进制安装包和其他任意包。

三 RPM包制作介绍

RPM包的制作,即是RPM源码包的制作。

这里我想说说RPM包工作的原理,这将有助于全面的了解RPM包管理系统的知识。

RPM是为解决源码包不易安装(需要编译)和软件包相互之间依赖(是RPM包管理器可以一定程度解决依赖问题)问题,它通过在探测源码包在build和install阶段的动作获得最终生成的需要安装的系统里的文件,并记录下一些必要的操作(比如安装完成后执行某项操作),然后把此组成为一个整体,当在用户安装此包时把前面获得的所有问题和记录的所有操作原原本本的作用的实际系统上。

为一个普通的源码打RPM包,需要下面一些操作,首先需要对项目的Makefile作必要的改造以支持RPM打包操作(实际上此操作不是绝对的,SPEC文档和Makefile的是协调统一工作的,只要他们之间配合好了其他都无所谓,我们一般只是推荐大家尽量按行业标准规范操作而已);其次是针对当前项目撰写SPEC文档,SPEC文档包括了RPM打包过程的操作内容和新生成的RPM包的基本信息等,它的作用对象是打包程序rpmbuild。

四 RPM包制作过程

1准备打包环境

fedora系统下使用如下命令安装rpmbuild

#yum install rpmbuild

rpmbuild的工作目录如下,

~/rpmbuild

~/rpmbuild/SOURCES

~/rpmbuild/SPECS

~/rpmbuild/BUILD

~/rpmbuild/RPMS

~/rpmbuild/RPMS/i386

~/rpmbuild/SRPMS

如果你的用户目录主目录下没有类似目录结构,你可以通过一个工具软件来自动配置和生成,如下。

#yum installrpmdevtools

下了运行自动配置命令自动生成如上目录,并配置一些必要操作。

#rpmdev-setuptree

rpmdev-setuptree命令默认将再当前用户主目录下创建一个RPM构建根目录结构,

如果需要改变次默认位置,可以修改配置文件:~/.rpmmacros中变量_topdir对应的值即可。

一般rpmbuild会在当前用户的主目录下自动建立如上目录结构,如果在你对应用户的构建目录中没有自动建立如上目录,你可以通过手动方式建立。上面目录的使用是这样分配的,SOURCES放置打包资源,包括源码打包文件和补丁文件等;SPECS目录放置SPEC文档;BUILD打包过程中的工作目录;RPMS目录存放生成的二进制包,RPM包根据硬件平台不同分类,i386表示生成i386结构的包将存放在该目录下;SRPMS目录存放生成的源码包。

2撰写SPEC文档

SPEC撰写是打包RPM的核心,也算是最难的一步,好在我们可以从参照一个简单的模板文件开始,在可以实现基本功能的基础上再一步一步的扩充文档内容,直至完全达到要求。下面是一个简单的SPEC文档,其中包括了一些说明信息(注:#后面的内容为说明信息),该SPEC文档是对一个测试的软件项目hellorpm写的,hellorpm软件包编译后仅有一个执行文件、一个手册文件和一个项目说文件。

hellorpm.spec文档的内容如下:

-----------------------------------------------------------------------------

#软件包简要介绍

Summary: hellorpm is atest program。

#软件包的名字

Name: hellorpm

#软件包的主版本号

Version:2.2.6

#软件包的次版本号

Release: 1

#源代码包,默认将在上面提到的SOURCES目录中寻找

Source0:%{name}-%{version}.tar.gz

#授权协议

License: GPL

#定义临时构建目录,这个地址将作为临时安装目录在后面引用

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

#软件分类

Group:Development/Tools

#软件包的内容介绍

%description

The hellorpm programis a test.

#表示预操作字段,后面的命令将在源码代码BUILD前执行

%prep

#构建BUILD环境,将解压源码压缩包到BUILD目录

%setup-q

#BUILD字段,将通过直接调用源码目录中自动构建工具完成源码编译操作

%build

#调用源码目录中的configure命令

./configure

#在源码目录中执行自动构建命令make

make

#安装字段

%install

#调用源码中安装执行脚本

makeDESTDIR=$RPM_BUILD_ROOT install

#文件说明字段,声明多余或者缺少都将可能出错

%files

#设置文件权限属性

%defattr(-,root,root)

#声明/usr/local/bin/hellorpm将出现在软件包中

/usr/local/bin/hellorpm

#声明并设置文件属性

%doc%attr(0444,root,root)/usr/local/man/man1/hellorpm.1

#同上,声明文档文件

%docREADME

-------------------------------------------------------------------------------

这个文档需要说明的一点:

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

上面BuildRoot变量表示的是源码的临时按照目录,rpmbuild就是通过次目录获得将要按照到系统中的所有文件,而在SPEC文档后面make install命令中的参数DESTDIR=$RPM_BUILD_ROOT即是对该参数的引用,这个参数将传给Makefile文件一告诉自动构建工具应该安装文件那里(实际上我再前文提到过的Makefile需要作一些改造以适应RPM的构建就包括此操作,你的Makefile文件中至少要知道在RPM构建过程中引用此参数的值去控制安装操作的目标)。

如上一个简单的SPEC文档撰写完成,下面把一个名为hellorpm-2.2.6.tar.gz的源码压缩文件放到

rpmbuild根目录下的SOURCES目录下(注,确保此归档文件解压后的目录为hellorpm-2.2.6,否则会有问题)。

到此一个完整的rpm打包环境已经构建完成,下面我们就可以开始构建二进制和源代码RPM包。

3构建RPM包

构建RPM包是有命令rpmbuild在SPEC的指导下完成。

开始构建操作,首先进入到当前用户的rpmbuild根目录(即上面提到的目录环境)。

#cd~/rpmbuild/

执行如何命令,-ba表示build all,即生成包括二进制包和源代码包的所有RPM包,下来如果正常的话,rpmbuild将正常退出,同时在RPMS目录和SRPMS目录中将生成对应的RPM包。

#rpmbuild-baSPECS/hellorpm.spec

这里仅仅介绍了一个最简单软件的最简单的RPM的打包操作过程,诸如带有共享文件的需要进行复杂配置的具有复杂依赖关系的等等的项目的打包以及后期的维护,包括补丁的制作我将在下来的时间完成补充更新,今天时间不早了,该休息了!

注:费了大半夜的功夫,搞出这么个令人不满意的文档,我思考着,这样做有多少意义呢?不敢重复发明轮子的,站到巨人的肩膀你才能看得更远,是这样吗?是不是下周开始立个计划,每周至少翻译三篇fedora官网的文档给自己练练手。

阅读剩余
THE END