- 软件的架构以及分区建议:
- 应用程序的组成部分:二进制程序,二进制程序依赖的所有库文件,配置文件文件,帮助文件;
/etc
,/bin
,/sbin
,/lib
,/usr/share/man
前面三个必须和根在一个分区,因为与操作系统的启动有关; /usr
里面包含bin
,sbin
,lib
,文件,可以单独分区,里面放置的是操作系统的核心功能;- 同时
/usr/local
bin
,sbin
,lib
,etc
,man
,表示第三方软件的安装位置,建议安装软件在这里; /sys /proc
:提供用户调用接口的伪文件系统,不能单独分区,里面没有任何件;/dev
:设备,不能单独分区;udev
机制,可以实现让内核在设别到硬件信息后,动态进行创建设备文件,2.4
内核之前是没有这个功能的,里面提供了所有的设备文件,2.6
内核之后引入udev
机制,管理员是没有家目录的;/var
:是一个相对外围的文件位置,多用于存放锁文件,日志文件,以及运行过程中的信息,应该单独分区,里面的文件需要按时进行处理;/boot
:内核和initrd
或者initranfs
;- 操作系统启动过程:
POST-->BIOS(HD)-->MBR
的bootloader
(需要识别基本文件系统结构,ext2, ext3, xfs
)-->
加载内核; 其中
bootloader
是需要识别基本的文件系统的,虽然不需要出现目录的上下级结构,但是需要找到内核所在的位置;BIOS
里面的ROM
里面的信息是需要被映射进内存的,建议进行单独分区;软件包管理器
- 软件包管理器通常提供打包软件的源程序,库文件,配置文件,以及帮助文件信息,并且将软件的信息生成数据库,用于追踪软件的详细信息;
- 软件包管理器还需要提供软件制作软件,并且需要执行安装,卸载,升级,查询,校验;
Redhat SUSE
使用RPM:Redhat Package Manger
来提供软件包管理;Debian
使用dpt
来提供软件包的软件管理;- 软件包之间的依赖关系的解决,
Redhat
使用的是YellowDog Update Modifier
也就是RPM
,dpt
解决使用的是apt-get
来解决依赖关系 - rpm命令
rpm
软件包管理器,是一个基于HASH
的数据库,数据库文件在/var/lib/rpm
,查询速度快,并且提供了rpmbuild
命令来制作软件包;rpm
软件包管理器支持软件的安装,查询,升级,校验,数据库的重建,验证软件包来源的合法性等;- 命名规则
- 命名规则:软件包在命名过程中为了避免软件包制作后太大,会拆解为好几个软件包进行制作,分为主包:
bind-9.7.1-1.el5.i586.rpm
,子包:bind-libs-9.7.1-1.e15.i586rpm
; - 命名格式:
name-version-release.arch.rpm,arch
,例如bind-major.minor.release-release.arch.rpm
- 主版本号: 有重大功能改进;
- 次版本号: 某个子功能发生重大改变;
- 发行版本号: 修正了部分
bug
,调整了部分功能;
-
rpm
软件包格式:- 二进制格式: 装上可以直接运行,对于平台的要求比较严格;
- 源码格式: 需要自己进行编译,更好发挥硬件性能,可以根据自己的需求更改编译的选项;
- 两个
release
分别表示软件开发者进行的改进,后面的release
表示rpm
包的制作者因为功能改进而进行重新编译时的改进; - 常见的平台:
i686
:表示32
为平台;x64
:表示x86
平台64
位系统,noarch
,表示和平台无关; el5
: 表示的是用在企业版5
上面的,同样的el6
表示的就是用在企业版6
上面的;
- rpm命令
- 安装
-i /PATH/TO/SOMEWHERE
:指定软件包路径和名称,用于安装软件;
-v
:用于显示软件安装的详细信息;
-vv
:显示更详细的信息;经常结合起来使用ivh
-h
:表示使用#
来显示安装进度,一个#
表示2
的进度;
--nodeps
:表示忽略依赖关系,软件安装可能无法正常使用;--force
:表示强行安装,可以实现重新安装或者降级安装--replacepkgs
:表示重新安装,替换原有安装;--oldpkgs
:表示降级安装;--test
:表示仅仅测试,但是不安装;
- 查询:
-qa name
:用于匹配已经安转的所有软件包;
-qi name
:查询指定安装包的说明信息;-ql name
:查询指定包安装后生成的文件列表;
-qf file
:用于查看某个文件是那个软件包生成的;-qc name
:查询指定软件包安装的配置文件;
-qd name
:查询指定软件包安装的帮助文件
-q --scripts name
:用于查询指定安装包在安装过程中执行的脚本,包括安装前,安装前, 安装后,卸载前,卸载后,这个和安全相关的,用于检测在软件安装时,是否会存在系统安全的脚本;
-qpi
:查询未安装的软件包的说明信息,安装以后生成的文件;- 升级
rpm -Uvh PATH_TO_NAME
:如果存在老版本的,则升级,否则安装;rpm -Fvh PATH_TO_NAME
:如果存在老版本的,则升级,否则退出;
- 降级安装:
rpm -ivh --oldpackage
- 卸载
-e
:用于卸载软件,由于存在依赖性关系,卸载时该软件包不能被其他软件
包依赖,否则不能卸载;
--nodeps
:可以使用这个命令来强行卸载;
校验:
-V
: 校验来源合法性以及软件完整性;- 如果被修改会有以下信息改变:
S
:表示文件大小改变;M
:表示文件权限改变;5
:表示文件校验码改变;D
:设备文件的主设备号,次设备号不匹配;L
:表示路径不匹配;U
:所有者不匹配;G
:表示所有组不匹配;T
:表示最近一次的修改时间发生改变;
对于软件包来说,首先需要导入秘钥信息.然后使用命令进行软件的校验
- 涉及软件的加解密操作:
- 文件在
/etc/pki/rpm-gpg/ RPM-GPG-KEY-redhat-release
文件,使用rpm –K PACKAGE_FILE
来检查安装包本身是否是合法的,这个是用来验证redhat
的软件包是否是合法的;
- 文件在
[root@server23 ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[root@server23 ~]# rpm -K the name of rpm package
- 软件来源的合法性,使用的算法包括:
DSA
,GPG
,如果需要忽略这个选项使用--nosignature
选项; - 软件包完整性:常用的算法包括
sha1 md5
,如果需要忽略这个选项使用--nodigest
; rpm
数据库的两种管理方式:- 数据库的初始化
--initdb
:数据库在不存在时,才需要进行初始化操作,数据库不存在时,会进行建立操作,否则是不会进行建立操作的 - 数据库的重建操作
--rebuild
:表示重新建立数据库,无论是否存在,是一定会重新建立数据库的;
- 数据库的初始化
Yum软件包管理器
Yum
是一种C/S
架构的应用,是用来解决依赖关系的前端工具,大致的工作流程如下:
- 1.首先
Client
连接Server (Yum Repository)
获得需要的软件包; - 2.使用类似的
Rpm
命令进行安装; - 3.在本地分析所安装的软件包的依赖关系,并结合已经安装的依赖,分析出还需要安装的软件包;
- 4.
Yum
再次查询软件仓库的到还需要安装的软件包,然后同时安装; - 5.
rpm
软件包提供某种能力,在Yum
仓库里面结合数据库整理所有软件包的能力形成一张表格,用于进行检索; - 6.这张表格可以下载到本地,进行依赖关系的分析,
Yum
的缓存目录就是用来存储这些元数据文件的; - 7.按需下载,并且清除不需要的软件包;
- 1.首先
Yum
软件仓库的文件:
- 可以将
Rhel/Centos ISO
镜像文件用来制作软件仓库,使用命令Createrepo
来生成元数据文件; yum
仓库里面的元数据文件:
primary.xml.gz
:
- 1.表示当前所有RPM软件包的列表;
- 2.依赖关系;
- 3.每个
RPM
安装生成的文件列表;
filelists.xml.gz
:
- 1.所有
RPM
软件包的所有文件列表;
- 1.所有
other.xml.gz
:
- 1.额外信息,
RPM
软件包的修改日志;
- 1.额外信息,
repomd.xml
:
- 上述三个文件的时间戳和校验和,为了防止安装包被修改或者时间过期;
comp*-core.xml
:
RPM
分组信息,三类,必须,建议,可选安装的;
- 可以将
yum
命令
install
:安装
--nogpgckeck
:不用于检查gpg
update
:用于升级软件包;update-to
:用于指定升级到某个版本check-update
:用于检测更新;remove
:用于移除软件包;list
:用于列出软件包;
all
:用于列出所有的软件包;available
:用于列出可用的软件包;install
:用于列出安装的软件包;updates
:用于列出可以升级的软件包;
info
:用于查询某个软件包的具体信息;provides
:查看指定文件或者特性是有哪个软件包提供的;clean
:用于清除缓存信息,
packages
:表示清理软件包;metadata
:表示清理元数据文件;headers
:用于清除头信息;all
:用于清除缓存的所有信息;
makecache
:用于生成缓存信息;groups
:用于查询某些组的软件包;groupinfo
:显示组信息;reinstall
:表示用于重新安装某些软件包;localinstall
:安装包在本地时,使用localinstall
可以自动解决依赖关系,如果安装的是来自互联网上的安装包时,可以使用—nogpgckeck
,来解决依赖关系;downgrade
:表示用于降级安装;repolist
:用于列出相关的软件包;
all
:列出所有文件;enabled
:表示默认的启用的软件仓库;disabled
:表示禁用的软件仓库;
将自己的软件包建立软件仓库:
- 将相关的软件移动到某个仓库里面;
- 执行命令
createrepo
创建生成相关的配置文件;
Yum提供的配置文件
/etc/yum.conf/
:
cachedir=/var/cache/yum
:表示软件安装过程中的,缓存目录;keepcache
:表示缓存是否进行保存;logfile=/var/log/yum.log
:表示日志文件的位置,里面记录的是软件的安装和卸载信息;tolerant=1
:表示安装软件包的过程中,对于已经安装的软件包在安装的过程中,不输出错误信息,并且也不进行安装exactarch=1
:表示Yum
仓库的软件安平台必须和当前系统平台的严格匹配;obsoretes=1
:表示过期的软件包是否进行废弃,1
表示进行废弃;gpgcheck=1
:检查来源合法性,检查需要提供密钥文件;debuglevel=
:表示的是调制级别;plugins=
:表示是否允许插件;- 对于自己定义的配置文件的命名格式
filename.repo
格式,否则不会被识别; - 关于自定义配置文件的说明
[base]
: 表示repo
的唯一标识符;name=basesoftware
::关于软件仓库的描述信息;baseurl=http://172.25.23.250/rhel6.5/
:用于指定repo
软件仓库所在的具体位置,支持的方式包括file http ftp
gpgcheck=0
:默认是1
,表示是否用于检测来源合法性;gpgkey=
:用于指定秘钥文件的位置,通常是一个路径值,Redhat
提供的路径通常在/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-released
,也有可能是由http
,或者ftp
服务器提供;enabled
:表示这部分软件仓库的定义信息是否生效;- 创建Yum仓库
- 首先需要创建一个软件目录
[root@server23 ~]# mkdir /yum/VT -pv
- 给这个目录里面一些
rpm
软件包
facter-1.6.13-1.el6.x86_64.rpm
facter-2.4.4-1.el6.x86_64.rpm
hiera-1.1.0-1.el6.noarch.rpm
hiera-1.3.4-1.el6.noarch.rpm
puppet-3.0.1-1.el6.noarch.rpm
puppet-3.8.1-1.el6.noarch.rpm
puppet-dashboard-1.2.12-1.el6.noarch.rpm
puppet-dashboard-1.2.23-1.el6.noarch.rpm
puppet-server-3.0.1-1.el6.noarch.rpm
puppet-server-3.8.1-1.el6.noarch.rpm
- 然后需要安装
createrepo
[root@server23 VT]# yum install createrepo -y
- 使用命令创建
[root@server23 ~]# createrepo /yum/VT/
Spawning worker 0 with 21 pkgs
Workers Finished
Gathering worker results
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
- 首先来查看软件仓库里面已经存在的信息
- 然后编辑配置文件,添加配置的一段信息
# Create repo by myself
[YumVT]
name=Yum VT Repository
baseurl=file:///yum/VT
gpgcheck=0
- 接下来查看多出来的 软件仓库
- 这里可以看到多出来的自定义
YumVT
的信息,一共包含21
个软件包; - 在这里目录里面其实多的是
yum
仓库的元数据信息
[root@server23 repodata]# pwd
/yum/VT/repodata
[root@server23 repodata]# ls
4af5be4583c6324a2159a122ebb78dbf1c1ee603235e8016ad20999fadd5d1c5-filelists.xml.gz
522c70b653e96bb4ab2c97fb44bf9eba8aac2768a65af269949b4e21cd40b049-other.sqlite.bz2
86370925536a7b1d8a57126d6f898ed72ee4b0a942460af74330ef94f119487a-primary.xml.gz
a95cbc179f2d540d01bd4ae63f618e815f018bb2f3a5302fc0b794068540744d-other.xml.gz
b0d6493c0375a09b9e3215049b16a86a7145188ab24e8ee466013eced055e245-filelists.sqlite.bz2
f7beed7dad2322922feca58e064fd6eb722c218b3c8094523ad3983e9df3c9c0-primary.sqlite.bz2
repomd.xml
- 关于软件编译安装的注意事项
- 源代码需要通过指定某些特性之后,可以生成二进制格式的文件,如果在编译时没有指定某些软件特性,那么这些特性是无法使用的,就需要重新进行软件的编译安装;
make
:是C
语言或者C++
的项目管理工具,makefile
文件定义了gcc
按照何种次序来管理这些源程序文件中的程序的;make
本身是调用gcc
,或者g++
编译器;
makefile
并不属于源程序文件,也不是开发者必须开发的软件;- 软件编译安装的三步骤:
./configure
:
- 用于指定安装软件的特性,这通常是一个可执行的脚本文件,根据指定的特性检查系统所必须的头文件,语言环境是否是正确的,并且根据这些信息生成
makefile
文件; --help
:用于获取使用帮助,可以用于得到软件编译安张的特性信息;--prefix=/path/to/something
:用于指定软件的编译安装路径;--sysconfdir=/path/to/config_path
:用于指定配置文件的路径;- 作用:
- 1.用户选择编译特性;
- 2.检查编译环境,需要配置环境;
- 3.需要解决依赖关系:
- a.不起用相关的功能,通常会有提示
- b.安装需要的模块 需要安装
libiary-devel
;
makefile.in
:需要结合生成./configure
生成makefile
;
- 用于指定安装软件的特性,这通常是一个可执行的脚本文件,根据指定的特性检查系统所必须的头文件,语言环境是否是正确的,并且根据这些信息生成
make
:
- 根据
makefile
根据当前系统的环境和配置属性,并且结合makefile
编译生成大量的库文件和配置文件等信息
- 根据
make install
:
- 将生成的文件放在系统上面合适的位置;
- 编译安装之后
- 1.修改环境变量,用于识别此生序的的二进制文件路径;
/etc/profile.d/
中建立一个以*.sh
为名称后缀的文件,在里面定义export PATH=$PATH:/path/to/something
的文件;
- 2.默认情况下,系统库搜索库文件是
/lib,/usr/lib,
如果需要增加额外的库文件,需要增加路径/etc/ld.so.conf.d/
,创建以*.conf
为后缀名的文件,把需要增加的路径写入这个文件里面;然后需要执行:ldconfig -v
:表示重新搜寻库文件的过程; - 大多数应用程序是提供头文件的,通过二次开发的程序,提供的配置文件,通过使用
#include
来包含着写头文件的,每一个输出了库文件的软件,系统默认的头文件的位置在/usr/local/
里面增添头文件输出路径,可以使用链接来进行:
通过将/usr/local/tengine/include/ 链接/usr/include/里面进行说明;
ln -s /usr/local/tengine/include/* /usr/include/
或者将:
ln -s /usr/local/tengine/include/ /usr/include/tengine
- 4.关于帮助文件的连接:
*man
文档安装在--prefix
指定的man
目录里面,系统指定的在/usr/share/man
里面,关于man
的配置文件在/etc/man.config
# MANDATORY_MANPATH manpath_element
# MANPATH_MAP path_element manpath_element
# MANDB_MAP global_manpath [relative_catpath]
- 如果需要指定
man
函数的连接,使用MANPATH
路径定义找到的man
,如果需要的化在里面添加一条MANPATH /usr/local/tenginx/man
;
man:
1.-M:指定路径 /PATH/TO/MAN_DIR COMMAND
2./etc/man.config中添加一条MANPATH