1. 程式人生 > >第8章 包管理

第8章 包管理

重新 裝包 自己的 align love ocs 重定向 客戶端程序 target


本文目錄:

8.1 Linux上構建C程序的過程

8.2 包基礎知識

8.3 rpm管理包

8.4 yum管理包

8.5 補丁工具diff和patch

8.6 源碼編譯安裝程序


8.1 Linux上構建C程序的過程

在說明包相關的內容之前,我覺得有必要說一下在Linux上構建一個C程序的過程。我個人並沒有學習過C,內容總結自網上,所以可能顯得很小白,而且也並非一定正確,只希望對和我一樣菜鳥的同學有所幫助。

(1).拿到源程序。C的源程序包中包括一堆的c文件和h文件。

(2).編譯。使用編譯器(如gcc)將源程序文件(c和h文件)編譯成為目標文件o文件。

在編譯過程中,使用makefile文件中的配置選項進行編譯。makefile文件可以使用configure工具生成,有了makefile文件,就可以使用make命令根據makefile文件進行編譯,再使用make install安裝。

但是有些源程序中並沒有提供configure或config這樣的文件,這時很可能應該直接使用make(或其他工具)帶上相關編譯參數進行編譯,參數如何給定以及給定參數的規則,見下文。

(3).鏈接。在Linux上使用ld工具,將o文件和所需的庫文件鏈接起來組成一個可正常工作的可執行程序。鏈接了庫文件之後就可以發起一些系統調用。

在make編譯時,可能會需要提供頭文件和庫文件的路徑,如果不提供,則搜索默認路徑。當搜索的路徑下都找不到所需文件時,將報錯提示庫文件(lib.xxxx)或頭文件(*.h)不存在。一般來說,缺少某頭文件,只需安裝其對應的devel包即可,缺少庫文件則可能需要安裝主包,也可能需要devel包,還可能是需要單獨的libs包。

其中gcc編譯器的頭文件默認搜索路徑為:(使用cpp -v命令可以查看)

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include # 此項在不同系統上,具體路徑不一樣

/usr/include

而庫文件的默認搜索路徑及順序為:

(1).編譯目標代碼時指定的動態庫搜索路徑;

(2).環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;

(3).配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;

(4).默認的動態庫搜索路徑/lib;

(5).默認的動態庫搜索路徑/usr/lib

在make編譯時,如果要指定參數,參數的給定方式一般遵循一些規則。如下圖。

技術分享

(1).使用CCARGS編譯選項表示提供頭文件路徑,在該選項的參數中,-I表示搜索路徑,-DHAS_MYSQL表示使用定義的宏HAS_MYSQL。

(2).使用AUXLIBS鏈接選項表示提供庫文件搜索路徑和庫文件名,其中-L指定搜索路徑,-l指定庫文件名。有時候提示提供動態鏈接庫路徑給鏈接器,則可能需要使用-rpath 指定一個搜索路徑給鏈接器。

關於更多可能用到的編譯選項,可以參考每個源程序包中的README或INSTALL文件。

在指定庫名的時候,可能和想象中的指定方法不一樣,它不是指定庫的全名,而是指定庫名。關於庫文件的全名,它遵循一定規律:

(1).前面必須是lib,中間是庫名,後面是後綴,例如libutil.so,其庫名為util。

(2).庫文件的後綴有幾種:".a"為靜態庫,".so"或者".sl"為動態庫文件。

(3).很多庫的".so"後綴後面還會帶上數字,如libutil.so.1。這些數字和庫版本有關,帶有數字版本的庫文件是不帶數字庫文件的鏈接,例如libutil.so.1它會指向libutil.so。這樣就可以實現多版本共存,如果有多個庫版本,只要找到libutil.so就可以找到最新版本的庫文件。當然,如果想要使用特定版本的庫,只需修改下它的軟鏈接指向即可。

例如上面的圖中,要鏈接/usr/local/mysql中的libmysqlclient.a,則指定方式為:AUXLIBS=-L/usr/lib/mysql -lmysqlclient。

而‘AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto‘則表示查找/usr/lib/mysql目錄下的libmysqlclient.xxxx以及libz.xxxx以及libm.xxxx的庫文件還查找/usr/lib/sasl2目錄下的libsasl2.xxxx以及SSL的兩個庫文件libssl.xxxx以及libcrypto.xxxx。

以下是編譯安裝postfix時的一個示例。

# make makefiles CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS  AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2  -lssl -lcrypto

8.2 包基礎知識

8.2.1 包名稱

在rhel/centos/fedora上,包的名稱以rpm結尾,分為二進制包和源碼包。源碼包以".src.rpm"結尾,它是未編譯過的包,可以自行進行編譯或者用其制作自己的二進制rpm包,非".src.rpm"結尾的包都是二進制包,都是已經編譯完成的,安裝rpm包的過程實際上就是將包中的文件復制到Linux上,有可能還會在復制文件的前後執行一些命令,如創建一個必要的用戶,刪除非必要文件等。關於rpm包的制作,可能是件很煩人的事,但學習它還是非常有必要的,至少也得能制作簡單的包吧?官網:

(1)https://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/Packagers_Guide/index.html

(2)https://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html

註意區分源碼包和源碼的概念,源碼一般是打包壓縮後的文件(如.tar.gz結尾的文件)。源碼包中包含了源碼,還包含了一些有助於制作二進制rpm的文件。最有力的說明就是源碼編譯安裝的程序都沒有服務啟動腳本(/etc/init.d/下對應的啟動腳本),而二進制rpm包安裝的就有,因為二進制rpm包都是通過源碼包".src.rpm"定制而來,在源碼包中提供了必要的文件(如服務啟動腳本),並在安裝rpm的時候復制到指定路徑下。

回歸正題,一個rpm包的名稱分為包全名和包名,包全名如httpd-2.2.15-39.el6.centos.x86_64.rpm,包全名中各部分的意義如下:

httpd       包名
2.2.15      版本號,版本號格式[ 主版本號.[ 次版本號.[ 修正號 ] ] ]
39          軟件發布次數
el6.centos  適合的操作系統平臺以及適合的操作系統版本
x86_64      適合的硬件平臺,硬件平臺根據cpu來決定,有i386、i586、i686、x86_64、noarch或者省略,noarch或省略表示不區分硬件平臺
rpm         軟件包後綴擴展名

使用rpm工具管理包時,如果要操作未安裝的包,則使用包全名,如安裝包,查看未安裝包的信息等;如果要操作已安裝的rpm包,則只需要給定其包名即可,如查詢已裝包生成了哪些文件,查看已裝包的信息等。

而對於yum工具來說,只需給定其包名即可,若有需要,再指定版本號,如明確指明要安裝1.6.10版本的tree工具,yum install tree-1.6.10。

8.2.2 主包和子包

對於一個程序而言,在制作rpm包時,很多時候都將其按功能分割成多個子包,如客戶端程序包、服務端程序包等。

以mysql這個程序來說,它分有以下幾個包。

  • mysql-server.x86_64
  • mysql.x86_64
  • mysql-bench.x86_64
  • mysql-libs.x86_64
  • mysql-devel.x86_64

其中mysql-server.x86_64是提供服務的主包,mysql.x86_64是客戶端主包,mysql-bench是用於對MySQL進行壓力測試的包,mysql-libs和mysql-devel分別是庫文件包和頭文件包。後兩者是提供給其他需要聯合mysql的程序使用的,僅就實現mysql服務而言,只需安裝mysql-server即可。

而源碼編譯安裝的包會包含所有功能包,也就是說編譯安裝一個程序後,它的客戶端工具、服務提供程序、庫文件、頭文件等等都已經安裝了。

8.3 rpm管理包

rpm包被安裝後,會在/var/lib/rpm下會建立已裝rpm數據庫,以後有任何rpm的升級、查詢、版本比較等包的操作都是從這個目錄下獲取信息並完成相應操作的。

[[email protected] ~]# ls /var/lib/rpm/ 
Basenames     __db.003     Group         Packages        Requirename     Triggername
Conflictname  __db.004     Installtid    Providename     Requireversion
__db.001      Dirnames     Name          Provideversion  Sha1header
__db.002      Filedigests  Obsoletename  Pubkeys         Sigmd5

8.3.1 安裝包後的文件分布

rpm安裝完成後,相關的文件會復制到多個目錄下(具體復制的路徑是在制作rpm包時指定的)。一般來說,分布形式差不多如下表。

/etc

放置配置文件的目錄

/bin、/sbin、/usr/bin或/usr/sbin

一些可執行文件

/lib、/lib64、/usr/lib(/usr/lib64)

一些庫文件

/usr/include

一些頭文件

/usr/share/doc

一些基本的軟件使用手冊與幫助文件

/usr/share/man

一些 man page 檔案

8.3.2 rpm安裝、升級、卸載(install、update、uninstall)

rpm工具安裝、升級和卸載的功能都很少使用。對於安裝來說,它需要人為解決包的依賴關系,這是極其令人惡心的事對於升級來說,基本上都會使用yum工具進行安裝和升級,而卸載行為在Linux上很少出現,大不了直接覆蓋重裝。

rpm -ivhUe --nodeps --test --force --prefix
選項說明:
-i 表示安裝,install的意思
-v 顯示安裝信息,還可以"-vv""-vvv",v提供的越多顯示信息越多
-h 顯示安裝進度,以#顯示安裝的進度
-U 升級或升級包
-F 只升級已安裝的包
-e 卸載包,卸載也有依賴性,"--erase"
--nodeps 忽略依賴性強制安裝或卸載(no dependencies)
--test 測試是否能夠成功安裝指定的rpm包
--prefix 新路徑 自行指定安裝路徑而不是使用默認路徑,基本上都不支持該功能,功能極其簡單的軟件估計才支持重定位安裝路徑
--force 強制動作
--replacepkgs 替換安裝,即重新覆蓋安裝。

有時誤刪文件可以不用卸載再裝,直接使用--replacepkgs選項再次安裝即可。

rpm包另一個缺陷是只能安裝本地或給定url路徑的rpm包。

註意:不要對內核進行升級;多版本的內核可以並存,因此可以執行安裝操作。

8.3.3 rpm查詢功能

rpm工具的安裝功能很少使用,畢竟解決依賴關系是不是件容易的事。但是rpm的查詢功能則非常實用。

-q[p] -q查詢已安裝的包,-qp查詢未安裝的包。它們都可接下面的參數
    -a 查詢所有已安裝的包,也可以指定通配符名稱進行查詢
    -i 查詢指定包的信息(版本、開發商、安裝時間等)。從這裏面可以查看到軟件包屬於哪個包組。
    -l 查詢包的文件列表和目錄(包在生產的時候就指定了文件路徑,因此可查未裝包)
    -R 查詢包的依賴性(Required)
    -c 查詢安裝後包生成的配置文件
    -d 查詢安裝後包生成的幫助文檔
-f 查詢系統文件屬於哪個已安裝的包(接的是文件而不是包)
--scripts 查詢包相關的腳本文檔。腳本文檔分四類:安裝前運行、安裝後運行、卸載前運行、卸載後運行

例如:

(1).查詢文件/etc/yum.conf是通過哪個包安裝的。

[[email protected] cdrom]# rpm -qf /etc/yum.conf
yum-3.2.29-60.el6.centos.noarch

(2).查詢安裝httpd時生成了哪些目錄和文件,還可以過濾出提供了哪些命令行工具。

rpm -ql httpd
rpm -ql httpd | grep bin/

(3).查詢某個未安裝包的依賴性如zip-3.0-1.el6.x86_64.rpm的依賴性。

[[email protected] cdrom]# rpm -qRp zip-3.0-1.el6.x86_64.rpm
libc.so.6()(64bit) 
libc.so.6(GLIBC_2.2.5)(64bit) 
libc.so.6(GLIBC_2.3)(64bit) 
libc.so.6(GLIBC_2.3.4)(64bit) 
libc.so.6(GLIBC_2.4)(64bit) 
libc.so.6(GLIBC_2.7)(64bit) 
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH) 
rpmlib(PayloadIsXz) <= 5.2-1

實際上,查看包的依賴性時,使用yum-utils包中的repoquery工具更好,"repoquery -R pkg_name"會更簡潔。yum-utils中包含了好幾個非常實用的包管理工具,可以大致都了解下。

8.3.4 提取rpm包中文件

安裝rpm包會安裝rpm中所有文件,如果將某個文件刪除了,除了重裝rpm,還可以通過從rpm包提取缺失文件的方式來修復。在win上安裝個萬能壓縮工具"好壓",可以直接打開rpm包,然後從中解壓需要的文件出來。但是在Linux上,過程還是有點小復雜的,其中涉及了cpio這個古來的歸檔工具。

方法:使用rpm2cpio命令組合cpio -idv命令的方式來提取。cpio具體用法參見http://www.cnblogs.com/f-ck-need-u/p/7008380.html

rpm2cpio是將rpm轉換為cpio格式歸檔文件的命令,有了cpio文件,就可以使用cpio命令對其進行相關的操作。

cpio命令是從歸檔文件中提取文件或向歸檔文件中寫入文件的工具,一般都從標準輸入或輸出操作歸檔文件,所以都使用管道或重定向符號。

-i: 運行在copy-in模式,即從歸檔文件中將文件copy出來,即提取文件(提取)
-o: 運行在copy-out模式,將文件copy到歸檔文件中,即將文件拷貝到歸檔文件中(寫入)
-d: 需要目錄時自動建立目錄
-v: 顯示信息

提取rpm包文件的一般格式為以下格式:

rpm2cpio package_full_name|cpio -idv dir_name

例如,刪除/bin/ls文件,將導致ls命令不可用,使用文件提取的方式去修復。

[[email protected] cdrom]# which ls     # 查找需要刪除的ls文件位置
alias ls=ls --color=auto
        /bin/ls

[[email protected] cdrom]# rpm -qf /bin/ls   # 查找ls命令屬於哪個包
coreutils-8.4-37.el6.x86_64

[[email protected] cdrom]# rm -f /bin/ls      # 刪除ls命令
[[email protected] cdrom]# ls                           # ls命令已不可用
-bash: /bin/ls: No such file or directory

[[email protected] ~]# yumdownloader coreutils         # 下載所需的rpm包

[[email protected] ~]# rpm2cpio coreutils-8.4-37.el6.x86_64.rpm | cpio -id ./bin/ls   # 提取bin/ls到當前目錄下

[[email protected] ~]# dir ~/bin     # 使用dir命令查看已經提取成功,dir命令功能等價於ls
ls

[[email protected] tmp]# cp bin/ls /bin/      # 復制ls命令到/bin下
[[email protected] tmp]# ls                     # 測試,ls已經可用

8.4 yum管理包

yum工具通過倉庫的方式簡化rpm包的管理。它從倉庫中搜索相關的軟件包,並自動下載和解決軟件包的依賴性,非常方便。

8.4.1 /etc/yum.conf

/etc/yum.conf是yum的默認文件,裏面配置的也是全局默認項。

[[email protected] ~]# cat /etc/yum.conf

[main]
cachedir=/var/cache/yum/$basearch/$releasever   # 緩存目錄
keepcache=0          # 是否保留緩存,設置為1時,安裝包時所下載的包將不會被刪除
debuglevel=2         # 調試信息的級別
logfile=/var/log/yum.log   # 日誌文件位置
exactarch=1         # 設置為1將只會安裝和系統架構完全匹配的包
obsoletes=1         # 是否允許更新舊的包
gpgcheck=1          # 是否要進行gpg check
plugins=1           # 是否允許使用yum插件
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release    # 指定基準包,yum會根據這個包判斷發行版本

8.4.2 配置yum倉庫

首先配置yum倉庫,配置文件為/etc/yum.conf和/etc/yum.repos.d/中的".repo"文件,其中/etc/yum.conf配置的是倉庫的默認項,一般配置yum源都是在/etc/yum.repos.d/*.repo中配置。註意,該目錄中任意repo文件都會被讀取。

默認/etc/yum.repos.d/下會有以下幾個倉庫文件,除了CentOS-Base.repo,其他的都可以刪掉,基本沒用。

[[email protected] yum.repos.d]# ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo
CentOS-Debuginfo.repo  CentOS-Media.repo

repo文件的配置格式如下:

[[email protected] yum.repos.d]# vim CentOS-Base.repo

[base]      # 倉庫ID,ID必須保證唯一性
name        # 倉庫名稱,可隨意命名
mirrorlist  # 該地址下包含了倉庫地址列表,包含一個或多個鏡像站點,和baseurl使用一個就可以了
#baseurl    # 倉庫地址。網絡上的地址則寫網絡地址,本地地址則寫本地地址,格式為“file://”後接路徑,如file:///mnt/cdrom
gpgcheck=1  # 指定是否需要證書簽名,1表示需要,0表示不需要
gpgcheck=   # 簽名的證書路徑
enable      # 該倉庫是否生效,enable=1表示生效,enable=0表示不生效
cost=        # 開銷越高,優先級越低
【repo配置文件中可用的宏:】 $releasever:程序的版本,對Yum而言指的是redhat
-relrase版本。只替換為主版本號,如Redhat6.5 則替換為6 $arch:系統架構 $basharch:系統基本架構,如i686,i586等的基本架構為i386 $YUM0-9:在系統定義的環境變量,可以在yum中使用

8.4.3 repo配置示例:配置epel倉庫

系統發行商在系統中放置的rpm包一般版本都較老,可能有些包有較大的延後性。而epel是由fedora社區維護的高質量高可靠性的安裝源,有很多包是比系統包更新的,且多出很多系統沒有的包。總之,用到epel的機會很多很多,所以就拿來當配置示例了。

有兩種方式可以使用epel源。

方法一:安裝epel-release-noarch.rpm

shell> rpm -ivh epel-release-latest-6.noarch.rpm

安裝後會在/etc/yum.repo.d/目錄下生成兩個epel相關的repo文件,其中一個是epel.repo。此文件中epel的源設置在了fedora的鏡像站點上,這對國內網來說可能會較慢,可以修改它為下面的內容。

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://mirrors.sohu.com/fedora-epel/6Server/$basearch/
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

方法二:直接增加epel倉庫

在/etc/yum.repos.d/下任意一個repo文件中添加上epel的倉庫即可。

[epel]
name=epel
baseurl=http://mirrors.sohu.com/fedora-epel/6Server/$basearch/
enabled=1
gpgcheck=0

然後清除緩存再建立緩存即可。

shell> yum clean all ; yum makecache

8.4.4 yum命令

不同的版本,yum命令可能功能上有所不同,例如在CentOS 7上的yum有--downloadonly的功能,而在CentOS 6.6上就沒有(更新yum包後就有了)。此處介紹幾個yum命令。

Usage: yum [options] COMMAND

List of Commands:
help           命令的幫助信息,用法:yum help command,如yum help install則查看install命令的用法說明
clean          清除緩存數據,如yum clean all
makecache      生成元數據緩存數據,yum makecache
deplist        列出包的依賴關系
erase          卸載包
fs             為當前文件系統創建快照,或者列出或刪除當前已有快照。快照是非常有用的,升級或打補丁前拍個快照,就能放心地升級或打補丁了
fssnapshot     同fs一樣
groups         操作包組
history        查看yum事務信息,yum是獨占模式的進程,所以有時候查看事務信息還是有用的
info           輸出包或包組的信息,例如該包是誰制作的,大概是幹什麽用的,來源於哪個包組等信息
install        包安裝命令
list           列出包名,一般會結合grep來搜索包,如yum list all | grep -i zabbix
provides       搜索給定的內容是誰提供的,可用來搜索來源於個包,如CentOS 7上mysql被mariadb替代,搜索Mysql提供者時就能找出包mariadb
reinstall      重新安裝包
repolist       列出可用的倉庫列表
search         給定字符串搜索相關包,並給出相關包較為詳細的信息
update         更新包
 
Options:

  -R [minutes], --randomwait=[minutes]:最多等待時間
  -q, --quiet           安靜模式
  -v, --verbose         詳細模式
  -y, --assumeyes       對所有問題回答yes
  --assumeno            對所有問題回答no
  --enablerepo=[repo]   啟用一個或多個倉庫,可用通配符通配倉庫ID
  --disablerepo=[repo]  禁用一個或多個倉庫,可用通配符通配倉庫ID
  -x [package], --exclude=[package]  通配要排除的包
  --nogpgcheck          禁用gpgcheck
  --color=COLOR         帶顏色
  --downloadonly        僅下載包,不安裝或升級。默認下載在yum的緩存目錄中,默認為/var/cache/yum/$basearch/$releasever
  --downloaddir=DLDIR   指定下載目錄

很多時候,yum操作失敗的原因是repo的配置錯誤,或者緩存未更新。

8.4.5 yum操作包組

[[email protected] ~]# yum help groups
Loaded plugins: fastestmirror, langpacks
groups [list|info|summary|install|upgrade|remove|mark] [GROUP]

Display, or use, the groups information

aliases: group, grouplist, groupinfo, groupinstall, groupupdate, groupremove, grouperase

所以,可以使用別名group, grouplist, groupinfo, groupinstall, groupupdate, groupremove, grouperase替代相應的命令。

如安裝包組yum groups install pkg_groupname,也可以yum groupinstall pkg_groupname。

8.5 補丁工具diff和patch

補丁文件都是通過diff命令生成的,patch工具則是應用補丁,即將補丁打到舊文件中。絕對不能跨版本打補丁,只能一個版本一個版本按順序慢慢打。

生成補丁:

diff -[r]Nu old_file new_file > patch_file

該命令將對old_fiel和new_file做比較,然後生成補丁,將補丁內容保存到patch_file中。其中"-r"選項是遞歸比較,也就是說可以對整個目錄生成補丁。

應用補丁:

patch -p數字 [file_name] < patch_file

去除補丁:

patch -R -p數字 [file_name] < patch_file

對於-p選項後的數字,它表示從前向後要忽略的目錄層數,其實沒必要想的那麽復雜。首先,進入到待打補丁所在目錄,如果是對改目錄下單個文件打補丁,則使用-p0,對目錄打補丁,則使用-p1。

# 對文件而言
diff –uN from-file to-file > to-file.patch
patch –p0 < to-file.patch
patch –R –p0 < to-file.patch
# 對目錄而言
diff –uNr from-dir to-dir > to-dir.patch
cd from-dir
patch –p1 < to-dir.patch 
patch –R –p1 < to-dir.patch

其實基本用不上patch來打補丁,現在基本上都使用git了,使用git patch要方便太多了。

8.6 源碼編譯安裝程序

8.6.1 源碼編譯的幾個階段

拿到源碼的壓縮包後,首先就是解壓,這就不需說了。解壓後,進入解壓目錄,這是必須動作,之後就是源碼編譯的一般步驟。並非適用所有程序的編譯,但知道過程之後也可以舉一反三了。

1.閱讀解壓目錄中的INSTALL/README文件。如果不是對著官方手冊或文檔,那麽在安裝前務必讀一讀INSTALL文件或README文件,只需讀其中如何安裝的部分即可。

2.解壓後的目錄裏一般還有configure文件(也可能是config文件)。執行"./configure"或帶有編譯選項的"./configure",檢查系統環境是否符合滿足安裝要求,並將定義好的安裝配置寫入和系統環境信息寫入Makefile文件中。裏面包含了如何編譯、啟用哪些功能、安裝路徑等信息。

3.執行make命令進行編譯。make命令會根據Makefile文件進行編譯。編譯工作主要是調用編譯器(如gcc)將源碼編譯為可執行文件,通常需要一些函數庫才能產生一個完整的可執行文件。

4.make install將上一步所編譯的數據復制到指定的目錄下。

這就已經完成編譯程序的過程了。

8.6.2 configure腳本的通用功能

configure一般都會接受以下幾個編譯選項:

--prefix=          :指定安裝的路徑
--sysconfdir=      :指定配置文件目錄
--enable-feature   :啟用某個特性
--disable-fecture  :禁用特性
--with-function    :啟用某功能
--without-function :禁用某功能

不同的程序,其configure選項不盡相同,應使用"./configure --help"獲取具體的信息。

8.6.3 源碼編譯安裝須知

1.上面的每一個步驟都不能出錯,否則後一步都不能正常進行。

2.上面的步驟每一步如果出現警告或錯誤,如果步驟未停止而是繼續,則屬於可忽略錯誤或警告,不影響安裝。但是進行的步驟停止了出現警告或錯誤,則根據步驟考慮對策。可以使用“$?”命令查看上一個命令是否正確執行,如果是返回0則是正確,其他的則是錯誤。

3.卸載時,只需刪除安裝目錄即可。

因此,若要便於刪除,最好將源碼程序安裝在/usr/local/對應的目錄下。例如apache2安裝在/usr/local/apache2下。

4.通過源碼編譯的軟件,需要做一些後續操作,雖非必須,但是都是個性化定制,方便以後的操作。個性化定制大致包括以下幾項:

(1).將安裝路徑下的命令路徑加入到環境變量。

shell> echo "export PATH=/usr/local/apache/bin:$PATH" > /etc/profile.d/apache.sh
shell> chmod +x /etc/profile.d/apache.sh
shell> source /etc/profile.d/apache.sh

(2).按需求定制服務啟動腳本,並考慮是否加入開機啟動項。

(3).輸出頭文件和庫文件。

頭文件庫文件很多時候只是為其他程序提供的,所以可能不輸出它們的路徑也不會影響該程序的運行。

# 輸出頭文件
shell> ln -s /usr/local/apache/include /usr/include/apache

# 輸出庫文件
shell> echo "/usr/local/apache/lib" >/etc/ld.so.conf.d/apache.conf
shell> ldconfig

(4).導出man路徑

shell> echo  "MANPATH /usr/local/apache/man" >> /etc/man.conf

回到大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7049750.html

第8章 包管理