第8章 包管理
本文目錄:
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章 包管理