Red Hat Training

A Red Hat training course is available for Red Hat Satellite

第 3 章 构​​​建​​​自​​​定​​​义​​​软​​​件​​​包​​​

在​​​构​​​建​​​软​​​件​​​包​​​的​​​时​​​候​​​通​​​常​​​会​​​出​​​现​​​一​​​些​​​错​​​误​​​,特​​​别​​​是​​​在​​​必​​​须​​​通​​​过​​​ Red Hat Network 发​​​布​​​和​​​安​​​装​​​这​​​些​​​软​​​件​​​包​​​时​​​尤​​​为​​​常​​​见​​​。​​​本​​​章​​​介​​​绍​​​了​​​如​​​何​​​成​​​功​​​地​​​构​​​建​​​使​​​用​​​ Red Hat Network 发​​​布​​​的​​​软​​​件​​​包​​​,其​​​中​​​包​​​括​​​了​​​为​​​什​​​么​​​要​​​使​​​用​​​ RPM,如​​​何​​​为​​​ RHN 构​​​建​​​软​​​件​​​包​​​以​​​及​​​如​​​果​​​正​​​确​​​地​​​签​​​注​​​软​​​件​​​包​​​。​​​

3.1. 为​​​ Red Hat Network 构​​​建​​​软​​​件​​​包​​​

Red Hat Network 使​​​用​​​RPM 软​​​件​​​包​​​管​​​理​​​程​​​序​​​(RPM Package Manager)RPM)技​​​术​​​来​​​决​​​定​​​每​​​个​​​客​​​户​​​端​​​系​​​统​​​可​​​应​​​用​​​的​​​软​​​件​​​附​​​加​​​和​​​更​​​新​​​。​​​在​​​ Red Hat Network 搜​​​索​​​到​​​的​​​软​​​件​​​包​​​通​​​常​​​是​​​ RPM 格​​​式​​​,而​​​在​​​ Red Hat Network 网​​​站​​​的​​​「​​​软​​​件​​​」​​​标​​​签​​​页​​​中​​​提​​​供​​​完​​​整​​​的​​​ ISO 映​​​像​​​,但​​​在​​​ RHN Satellite Server 安​​​装​​​中​​​无​​​效​​​。​​​如​​​果​​​您​​​的​​​ Satellite 启​​​用​​​了​​​对​​​ Solaris 的​​​支​​​持​​​,您​​​可​​​以​​​使​​​用​​​ RHN Push 将​​​ Solaris 软​​​件​​​包​​​上​​​传​​​到​​​ Solaris 客​​​户​​​端​​​使​​​用​​​的​​​自​​​定​​​义​​​频​​​道​​​中​​​。​​​
RPM 是​​​一​​​个​​​为​​​用​​​户​​​提​​​供​​​简​​​单​​​安​​​装​​​、​​​卸​​​载​​​、​​​升​​​级​​​和​​​验​​​证​​​软​​​件​​​包​​​的​​​工​​​具​​​。​​​它​​​还​​​允​​​许​​​软​​​件​​​开​​​发​​​者​​​为​​​最​​​终​​​用​​​户​​​和​​​开​​​发​​​者​​​提​​​供​​​源​​​码​​​和​​​编​​​译​​​版​​​本​​​打​​​包​​​文​​​件​​​。​​​

3.1.1. RPM 的​​​优​​​点​​​

RPM 有​​​以​​​下​​​的​​​优​​​点​​​:
容​​​易​​​升​​​级​​​
使​​​用​​​ RPM,您​​​可​​​以​​​单​​​独​​​升​​​级​​​系​​​统​​​的​​​组​​​件​​​而​​​不​​​用​​​完​​​全​​​重​​​新​​​安​​​装​​​。​​​当​​​ Red Hat 发​​​布​​​ Red Hat Enterprise Linux 的​​​新​​​版​​​本​​​时​​​,用​​​户​​​不​​​需​​​要​​​重​​​新​​​安​​​装​​​就​​​可​​​以​​​进​​​行​​​升​​​级​​​。​​​RPM 允​​​许​​​智​​​能​​​、​​​全​​​自​​​动​​​、​​​本​​​地​​​升​​​级​​​您​​​的​​​系​​​统​​​。​​​在​​​升​​​级​​​的​​​过​​​程​​​中​​​可​​​保​​​留​​​软​​​件​​​包​​​中​​​的​​​配​​​置​​​文​​​件​​​,因​​​此​​​用​​​户​​​不​​​会​​​丢​​​失​​​他​​​们​​​特​​​定​​​的​​​配​​​置​​​。​​​安​​​装​​​和​​​升​​​级​​​软​​​件​​​包​​​的​​​时​​​候​​​使​​​用​​​同​​​一​​​个​​​ RPM 文​​​件​​​,因​​​此​​​更​​​新​​​软​​​件​​​包​​​时​​​不​​​需​​​要​​​特​​​殊​​​的​​​升​​​级​​​文​​​件​​​。​​​
软​​​件​​​包​​​查​​​询​​​
RPM 提​​​供​​​的​​​查​​​询​​​选​​​项​​​允​​​许​​​您​​​在​​​整​​​个​​​ RPM 数​​​据​​​库​​​中​​​查​​​询​​​所​​​有​​​软​​​件​​​包​​​或​​​只​​​查​​​询​​​特​​​定​​​的​​​文​​​件​​​。​​​您​​​还​​​可​​​以​​​轻​​​松​​​地​​​找​​​到​​​文​​​件​​​所​​​属​​​软​​​件​​​包​​​以​​​及​​​该​​​软​​​件​​​包​​​的​​​来​​​源​​​。​​​软​​​件​​​包​​​中​​​的​​​文​​​件​​​位​​​于​​​一​​​个​​​压​​​缩​​​归​​​档​​​中​​​,这​​​个​​​文​​​件​​​有​​​一​​​个​​​包​​​括​​​这​​​个​​​软​​​件​​​包​​​信​​​息​​​及​​​其​​​内​​​容​​​的​​​自​​​定​​​义​​​二​​​进​​​制​​​标​​​头​​​。​​​RPM 可​​​以​​​快​​​速​​​、​​​方​​​便​​​地​​​查​​​询​​​软​​​件​​​包​​​的​​​标​​​头​​​信​​​息​​​。​​​
系​​​统​​​验​​​证​​​
RPM 的​​​另​​​一​​​个​​​功​​​能​​​是​​​可​​​以​​​进​​​行​​​软​​​件​​​包​​​验​​​证​​​。​​​如​​​果​​​您​​​怀​​​疑​​​与​​​一​​​个​​​软​​​件​​​包​​​关​​​联​​​的​​​文​​​件​​​已​​​经​​​被​​​删​​​除​​​,您​​​可​​​以​​​通​​​过​​​检​​​查​​​这​​​个​​​软​​​件​​​包​​​来​​​确​​​定​​​这​​​个​​​文​​​件​​​的​​​状​​​态​​​。​​​这​​​个​​​验​​​证​​​的​​​过​​​程​​​会​​​提​​​示​​​您​​​所​​​有​​​异​​​常​​​情​​​况​​​。​​​如​​​果​​​存​​​在​​​错​​​误​​​,您​​​可​​​以​​​轻​​​松​​​地​​​重​​​新​​​安​​​装​​​这​​​个​​​文​​​件​​​。​​​在​​​重​​​新​​​安​​​装​​​的​​​过​​​程​​​中​​​将​​​保​​​留​​​配​​​置​​​文​​​件​​​。​​​
原​​​始​​​源​​​码​​​
RPM 的​​​一​​​个​​​重​​​要​​​的​​​功​​​能​​​就​​​是​​​允​​​许​​​使​​​用​​​原​​​始​​​软​​​件​​​源​​​码​​​,原​​​始​​​源​​​码​​​是​​​由​​​这​​​个​​​软​​​件​​​的​​​原​​​始​​​开​​​发​​​者​​​提​​​供​​​的​​​。​​​使​​​用​​​ RPM 可​​​将​​​原​​​始​​​源​​​码​​​及​​​其​​​使​​​用​​​的​​​补​​​丁​​​程​​​序​​​以​​​及​​​完​​​整​​​构​​​建​​​说​​​明​​​打​​​包​​​。​​​这​​​个​​​功​​​能​​​是​​​非​​​常​​​重​​​要​​​的​​​。​​​例​​​如​​​,当​​​发​​​行​​​一​​​个​​​新​​​版​​​本​​​时​​​,您​​​不​​​需​​​要​​​从​​​头​​​开​​​始​​​来​​​编​​​译​​​它​​​。​​​您​​​可​​​以​​​查​​​看​​​补​​​丁​​​来​​​决​​​定​​​您​​​可​​​能​​​需​​​要​​​做​​​什​​​么​​​。​​​使​​​用​​​此​​​项​​​技​​​术​​​,您​​​可​​​以​​​方​​​便​​​地​​​查​​​看​​​正​​​确​​​构​​​建​​​软​​​件​​​所​​​需​​​的​​​所​​​有​​​编​​​译​​​的​​​默​​​认​​​设​​​置​​​和​​​修​​​改​​​。​​​
保​​​留​​​原​​​始​​​源​​​码​​​看​​​起​​​来​​​可​​​能​​​只​​​对​​​开​​​发​​​人​​​员​​​有​​​用​​​,但​​​实​​​际​​​上​​​它​​​也​​​可​​​以​​​为​​​最​​​终​​​用​​​户​​​提​​​供​​​高​​​质​​​量​​​的​​​软​​​件​​​。​​​

3.1.2. RHN RPM 指​​​南​​​

RPM 的​​​优​​​势​​​在​​​于​​​可​​​以​​​准​​​确​​​定​​​义​​​依​​​赖​​​关​​​系​​​并​​​发​​​现​​​冲​​​突​​​。​​​Red Hat Network 使​​​用​​​ RPM 的​​​这​​​个​​​功​​​能​​​来​​​处​​​理​​​软​​​件​​​的​​​依​​​赖​​​关​​​系​​​。​​​Red Hat Network 提​​​供​​​了​​​一​​​个​​​自​​​动​​​环​​​境​​​,这​​​意​​​味​​​着​​​在​​​安​​​装​​​一​​​个​​​软​​​件​​​包​​​的​​​过​​​程​​​中​​​不​​​需​​​要​​​人​​​工​​​参​​​与​​​。​​​因​​​此​​​,当​​​为​​​那​​​些​​​需​​​要​​​通​​​过​​​ Red Hat Network 发​​​布​​​的​​​软​​​件​​​包​​​构​​​建​​​ RPM 时​​​,以​​​下​​​的​​​原​​​则​​​非​​​常​​​重​​​要​​​:
  1. 了​​​解​​​ RPM。​​​要​​​正​​​确​​​地​​​构​​​建​​​软​​​件​​​包​​​,了​​​解​​​ RPM 的​​​基​​​本​​​功​​​能​​​是​​​非​​​常​​​重​​​要​​​的​​​。​​​有​​​关​​​ RPM 的​​​信​​​息​​​请​​​参​​​考​​​以​​​下​​​资​​​源​​​:
  2. 当​​​为​​​一​​​个​​​子​​​频​​​道​​​构​​​建​​​ RPM 时​​​, 请​​​在​​​新​​​安​​​装​​​的​​​、​​​与​​​子​​​频​​​道​​​的​​​基​​​本​​​频​​​道​​​使​​​用​​​同​​​一​​​版​​​本​​​的​​​ Red Hat Enterprise Linux 中​​​构​​​建​​​软​​​件​​​包​​​。​​​请​​​确​​​定​​​首​​​先​​​从​​​ Red Hat Network 中​​​应​​​用​​​所​​​有​​​更​​​新​​​。​​​
  3. 在​​​安​​​装​​​ RPM 软​​​件​​​包​​​时​​​一​​​定​​​不​​​能​​​使​​​用​​​ --force 或​​​ --nodeps 选​​​项​​​。​​​如​​​果​​​您​​​无​​​法​​​在​​​您​​​构​​​建​​​的​​​系​​​统​​​中​​​“​​​干​​​净​​​”​​​地​​​安​​​装​​​ RPM,Red Hat Network 将​​​不​​​能​​​在​​​系​​​统​​​中​​​自​​​动​​​安​​​装​​​它​​​。​​​
  4. RPM 软​​​件​​​包​​​的​​​文​​​件​​​名​​​必​​​须​​​是​​​ NVR(name(名​​​称​​​)、​​​version(版​​​本​​​)、​​​release(发​​​行​​​))格​​​式​​​且​​​必​​​须​​​包​​​括​​​这​​​个​​​软​​​件​​​包​​​的​​​体​​​系​​​结​​​构​​​。​​​正​​​确​​​的​​​格​​​式​​​应​​​该​​​是​​​ name-version-release.arch.rpm。​​​例​​​如​​​,一​​​个​​​有​​​效​​​的​​​ RPM 软​​​件​​​包​​​文​​​件​​​名​​​是​​​ pkgname-0.84-1.i386.rpm,它​​​的​​​名​​​称​​​是​​​ pkgname,版​​​本​​​是​​​ 0.84,发​​​行​​​是​​​ 1,体​​​系​​​结​​​构​​​是​​​ i386。​​​
  5. RPM 软​​​件​​​包​​​应​​​该​​​由​​​其​​​维​​​护​​​者​​​签​​​注​​​。​​​虽​​​然​​​未​​​签​​​注​​​的​​​软​​​件​​​包​​​也​​​可​​​以​​​通​​​过​​​ Red Hat Network 发​​​布​​​,但​​​必​​​须​​​将​​​ Red Hat Update Agentup2date)配​​​置​​​为​​​强​​​制​​​接​​​受​​​它​​​们​​​。​​​我​​​们​​​强​​​烈​​​推​​​荐​​​使​​​用​​​经​​​过​​​签​​​注​​​的​​​软​​​件​​​包​​​,相​​​关​​​的​​​内​​​容​​​可​​​以​​​在​​​ 第 3.2 节 “RHN 软​​​件​​​包​​​的​​​数​​​字​​​签​​​名​​​” 中​​​找​​​到​​​。​​​
  6. 如​​​果​​​软​​​件​​​包​​​被​​​修​​​改​​​(包​​​括​​​修​​​改​​​了​​​签​​​名​​​或​​​重​​​新​​​被​​​编​​​译​​​),就​​​必​​​须​​​相​​​应​​​增​​​大​​​版​​​本​​​或​​​发​​​行​​​号​​​。​​​换​​​句​​​话​​​说​​​,通​​​过​​​ RHN 发​​​布​​​的​​​每​​​个​​​ RPM 的​​​ NVRA(包​​​括​​​体​​​系​​​结​​​构​​​)必​​​须​​​与​​​其​​​唯​​​一​​​构​​​建​​​对​​​应​​​以​​​避​​​免​​​混​​​淆​​​。​​​
  7. RPM 软​​​件​​​包​​​不​​​能​​​自​​​己​​​作​​​废​​​。​​​
  8. 如​​​果​​​一​​​个​​​软​​​件​​​包​​​被​​​分​​​成​​​多​​​个​​​单​​​独​​​的​​​软​​​件​​​包​​​,需​​​要​​​格​​​外​​​小​​​心​​​其​​​相​​​依​​​性​​​。​​​除​​​非​​​由​​​于​​​编​​​译​​​的​​​问​​​题​​​,否​​​则​​​请​​​不​​​要​​​分​​​割​​​现​​​有​​​软​​​件​​​包​​​。​​​
  9. 软​​​件​​​包​​​不​​​能​​​接​​​受​​​交​​​互​​​式​​​的​​​预​​​安​​​装​​​(pre-install)、​​​安​​​装​​​后​​​(post-install)、​​​预​​​卸​​​载​​​(pre-uninstall)和​​​卸​​​载​​​后​​​(post-uninstall)脚​​​本​​​。​​​如​​​果​​​软​​​件​​​包​​​需​​​要​​​用​​​户​​​的​​​直​​​接​​​参​​​与​​​,这​​​个​​​软​​​件​​​包​​​将​​​无​​​法​​​在​​​ Red Hat Network 中​​​工​​​作​​​。​​​
  10. 在​​​预​​​安​​​装​​​、​​​安​​​装​​​后​​​、​​​预​​​卸​​​载​​​和​​​卸​​​载​​​后​​​脚​​​本​​​中​​​不​​​要​​​写​​​入​​​任​​​何​​​ stderr 或​​​ stdout 内​​​容​​​。​​​如​​​果​​​不​​​必​​​要​​​,请​​​将​​​信​​​息​​​重​​​新​​​输​​​出​​​到​​​ /dev/null,否​​​则​​​请​​​将​​​它​​​们​​​写​​​入​​​一​​​个​​​文​​​件​​​中​​​。​​​
  11. 创​​​建​​​ spec 文​​​件​​​时​​​,使​​​用​​​ /usr/share/doc/rpm-<version>/GROUPS 中​​​的​​​组​​​定​​​义​​​。​​​如​​​果​​​没​​​有​​​完​​​全​​​匹​​​配​​​的​​​项​​​,选​​​择​​​最​​​接​​​近​​​的​​​一​​​个​​​。​​​
  12. 使​​​用​​​ RPM 的​​​相​​​依​​​性​​​性​​​能​​​确​​​定​​​此​​​程​​​序​​​在​​​安​​​装​​​后​​​可​​​正​​​常​​​运​​​行​​​。​​​

重要

请​​​不​​​要​​​通​​​过​​​归​​​档​​​来​​​创​​​建​​​一​​​个​​​ RPM,然​​​后​​​再​​​在​​​安​​​装​​​后​​​脚​​​本​​​中​​​恢​​​复​​​它​​​们​​​。​​​这​​​将​​​违​​​背​​​ RPM 的​​​初​​​衷​​​。​​​
如​​​果​​​文​​​件​​​列​​​表​​​中​​​不​​​包​​​含​​​归​​​档​​​中​​​的​​​文​​​件​​​,您​​​将​​​无​​​法​​​验​​​证​​​或​​​检​​​查​​​它​​​们​​​之​​​间​​​的​​​冲​​​突​​​。​​​在​​​大​​​多​​​数​​​情​​​况​​​下​​​,RPM 本​​​身​​​可​​​以​​​有​​​效​​​地​​​将​​​文​​​件​​​打​​​包​​​或​​​解​​​压​​​缩​​​。​​​例​​​如​​​,如​​​果​​​您​​​没​​​有​​​在​​​ %postun 项​​​中​​​进​​​行​​​清​​​除​​​,请​​​不​​​要​​​在​​​ %post 中​​​创​​​建​​​文​​​件​​​。​​​