1 lilnux 软件包管理
- 软件运行的环境 就如windows程序不能再linux系统上运行
# ABI: Application Bianary Interface 应用程序的运行环境
linux ELF(Excuteable and Linkable Format)
window PE(Portable Excutable)
库的虚拟化
linux 安装 WINE 可以实现 windows程序在lilnux上运行
windows 安装 Cywin 可以实现 linux程序在widnows上运行
# API:Application Programming Interface 应用程序的开发环境
linux 是支持POSIX协议: Portable OS
- 程序编译的一般过程
程序源代码-->预处理-->编译-->汇编-->链接
#同时程序可分为静态编译和动态编译
静态编译:将所需要的库文件全部编译到应用程序内部,可以实现移植应用程序还可以运行,但是多个应用程序会占用很多内存 静态库文件以.a结尾
动态编译 只编译应用程序本身,将库编译成共享对象(.so),这样可以是实现,多个应用程序可以使用同一个库文件,运行时,可以尽量减少内存的占用
#在linux中 查看二进制程序所依赖的库文件
ldd binary_file
#管理及查看本机装载的库文件
ldconfig 加载库文件
-p:显示本机已经缓存的所有可用库文件
库文件的配置关系
配置文件 /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件 /etc/ld.so.cache
- 程序包管理器
功能:将编译好的应用程序的各组成文件打包一个或几个
程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
# 编译好的二进制程序的组成部分
二进制文件,库文件,配置文件,帮助文件
# 在linux中常见的包管理器(但是不会很好解决依赖关系)
debian: deb 文件,dpkg包管理器
redhat: rpm 文件 ,rpm 包管理器
# 解决依赖关系的包管理器
yum: rpm包管理器的前端工具
apt-get: deb包管理器的前端工具
zypper: suse 上的rpm前端工具
dnf: Fedora 18+ rpm包管理器前端管理工具
- rpm 包管理器的使用
安装、卸载、升级、查询、校验、数据库维护
# 安装
-i 安装
-v 显示过程
-h 以#显示程序包管理执行进度
--test: 测试安装,但不真正 执行安装,即dry run 模式
--nodeps :忽略依赖关系
--replacepkgs | replacefiles
--nosignature: 不检查来源合法性
--nodigest :不检查包完整性
--noscripts :不执行 程序包脚本
%pre: ; 安装前脚本; --nopre
%post: ; 安装后脚本; --nopost
%preun: ; 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopostun
# 升级
-U 安装有旧版本程序包,则升级,没有,则安装
-F 安装有旧版本程序包,则升级,没有,则不安装升级
--oldpackage 降级
--force 强制安装
注意
1 不要对内核做升级操作;Linux 支持多内核版本并存,因此,对直接安装新版本内核
2 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)
# 查询
-q 查询
-a 所有包
-c: 查询程序的配置文件
-d: 查询程序的文档
-i: information
-l: 查看指定的程序包安装后生成的所有文件
-R: 查询指定的程序包所依赖的CAPABILITY
-f 查询指定的文件是由哪个程序包生成安装
--whatprovides CAPABILITY :查询指定的 CAPABILITY由哪个包所提供
--whatrequires CAPABILITY :查询指定的 CAPABILITY 被哪个包所依赖
--scripts :程序包自带的脚本
--provides: 列出指定程序包所提供的CAPABILITY
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” ”
- 包校验
包来源合法性验证及完整性验证
完整新验证 SHA256
来源合法性验证 RSA
公钥加密
对称加密 加密和解密的使用同一密钥
非对称加密 密钥是成对的
public key 公钥 公开所有人
secret key 私钥 不能公开
导入所需要的公钥
rpm -K|checksig rpm 检查包的完整性和签名
rpm --import 导入公钥
rpm -qa "gpg-pubkey" 查看已经导入的公钥
rpm -e "gpg-pubkey-f4a80eb5-53a7ff4b" 卸载导入的公钥
2 yum的配置
由于rpm的工具不能解决包依赖关系,所以引用yum(rpm前端包管理器)
yum的基本命令
yum repolist [all|enable|disable] 列出yum的源的信息
yum list package_name... 可以列出所匹配到的包
yum install 安装包
yum reinstall 重新安装包
yum ckeck-update 检查更新
yum remove 移除
yum info 查看包的 information(信息)
yum search key 可以根据关键字查找程序包和summary(摘要)
yum deplist 查看指定包依赖的特性
yum history 事务历史
[info|list|redo|undo|summary] 信息 列表 重做 回滚 摘要
yum源的配置
[base]
name=base
# 源的url
baseurl=http://172.16.0.1/centos/CentOS-6.9-x86_64/
#是否进行gpg检查
gpgcheck=1
# 是否可用
enabled=1
#gpg-key的url
gpgkey=http://172.16.0.1/centos/CentOS-6.9-x86_64/RPM-GPG-KEY-CentOS-6
[epel]
name=epel
baseurl=http://172.16.0.1/fedora-epel/6/x86_64/
enabled=1
gpgcheck=0
编译安装的一般步骤,一般大程序包含的原文件很多会有项目管理器管理 make|maven|cmake
开发工具:
autoconf: 生成configure 脚本
automake :生成Makefile.in
1 首先下载 源码包解压,文件中会有Makefile.in文件,使用configure脚本生成Makefile文件,注意安装前查看INSTALL,README
./configure
通过configure 选项传递参数,指定启用特性,安装路径,执行configure 会依据Makefile.in生成Makefile文件
2 make 根据Makefile文件 构建应用程序
3 make install 复制文件到指定路径
4 导出二进制程序目录到PATH环境中
编辑/etc/profile.d/name.sh
export PATH=/path/to/bin:$PATH
5 导出库文件路径
编辑/etc/ld.so.conf.d/name.conf
添加新的库文件所在目录至此文件中
让系统重新生成缓存
ldconfig [-v]
6 导入头文件 基于链接的方式实现
ln -sv
7 导入帮助手册
centos6 编辑/etc/man.conf 添加MANPATH
centos7 编辑/etc/man_db.conf 添加MANPATH
3 磁盘管理
磁盘接口
并行接口(serial): ide(133MB/s) scsi(640MB/s)
串行接口(parallel): sata(6Gps) sas(6Gps) usb(480MB/s)
磁盘存储术语
head 磁头
track 磁道
cylinder 柱面
sector 扇区 512bytes
区位记录磁盘扇区结构
ZBR(Zone Bit Recording)
磁盘寻址架构
CHS (cylinder head sector)
采用24bit位寻址 其中前10位表示cylinder,中间8位表示head(即盘面),后面6 位表示sector。最大寻址空间8GB
LBA (logical block addressing) 逻辑块地址
LBA 是一个整数,通过转换成CHS 格式完成磁盘具体寻址
LBA 采用48 个bit 位寻址
最大寻址空间128PB
由于CHS 寻址方式的寻址空间在大概8GB 以内,所以在磁盘容量小于8GB时,可以使用CHS 寻址方式或是LBA 寻址方式;在磁盘容量大于8GB时,则只能使用LBA
# 为什么要分区
优化I/O 性能
实现磁盘空间配额限制
提高修复速度
隔离系统和程序
安装多个OS
采用不同文件系统
# 两种分区格式 MBR,GPT
两种分区方式:MBR ,GPT
MBR: Master Boot Record ,1982年,使用32位表示扇区数 , 分区不超过2T
# 如何分区:按柱面
0 磁道0 扇区:512bytes
446bytes: boot loader
64bytes :分区表
16bytes: 标识一个分区
2bytes: 55AA
4 个主分区;3 主分区+1 扩展(N 个逻辑分区)
使用fdisk 分区
# GPT:GUID (Globals Unique Identifiers)partitiontable 支持128个 个 分区,使用64 位,支持8Z( (512Byte/block )64Z ( ( 4096Byte/block) )
使用128 位UUID(Universally Unique Identifier) 表示磁盘区 和分区 GPT 分区表自动备份在头和尾两份,并有CRC 校验位
# UEFI ( 统一扩展固件接口) 硬件支持GPT
使用gdisk 分区
# 同步分区
新增分区 centos6
partx -a device
删除分区
partx -d --nr m-n device
partx -d device
centos5,7
partprobe device
# 查看系统所支持的文件系统
/lib/modules/`uname -r`/kernel/fs
Linux 文件系统:ext2(Extended file system), ext3,ext4,xfs (SGI ), btrfs (Oracle ), reiserfs, jfs( (AIX ), swap
光盘:iso9660
Windows :FAT32, exFAT,NTFS
Unix: FFS (fast ), UFS (unix ), JFS2
网络文件系统:NFS, CIFS
集群文件系统:GFS2, OCFS2 (oracle)
分布式文件系统: fastdfs,ceph, moosefs, mogilefs,glusterfs, Lustre
RAW:未经处理或者未经格式化产生的文件系统
创建ext系列文件系统
mke2fs :ext 系列文件系统专用管理工具
-t {ext2|ext3|ext4}
-b {1024|2048|4096}
-L 'LABEL'
-j: 于 相当于 -t ext3
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i #: 为数据空间中每多少个字节创建一个inode ;此大小不应该小于block 的大小
-N # :指定分区中创建多少个inode
-I 一个inode 记录占用的磁盘空间大小,128---4096
-m #: 默认5%, 为管理人员预留空间占总空间的百分比
-O FEATURE[,...] :启用指定特性
-O ^FEATURE
tune2fs :重新设定ext 系列文件系统可调整参数的值
-l :查看指定文件系统超级块信息;super block
-L 'LABEL' :修改卷标
-m # :修预留给管理员的空间百分比
-j: 将ext2 升级为ext3
-O: 文件系统属性启用或禁用, –O ^has_journal
-o: 调整文件系统的默认挂载选项,–o ^acl
-U UUID: 修改UUID号 号
dumpe2fs: :
块分组管理,32768块 块
-h :查看超级块信息,不显示分组信息
文件系统检测和修复
常发生于死机或者非正常关机之后
挂载为文件系统标记为“no clean” ”
注意:一定不要在挂载状态下修复
fsck: File System Check
fsck.FS_TYPE
fsck -t FS_TYPE
-p: 自动修复错误
-r: 交互式修复错误
FS_TYPE 一定要与分区上已经文件类型相同
e2fsck: ext 系列文件专用的检测修复工具
-y: 自动回答为yes
-f: 强制修复
mount 常用选项命令
-t vfstype :指定要挂载的设备上的文件系统类型
-r: readonly ,只读挂载
-w: read and write, 读写挂载
-n: 不更新/etc/mtab ,mount 不可见
-a :自动挂载所有支持自动挂载的设备( 定义在了/etc/fstab
文件中,且挂载选项中有auto 功能)
-L 'LABEL': 以卷标指定挂载设备
-U 'UUID': 以UUID 指定要挂载的设备
-B, --bind: 绑定目录到另一个目录上
查看内核追踪到的已挂载的所有设备
cat /proc/mounts
-o options :( 挂载文件系统的选项) ,多个选项使用逗号分隔
async :异步模式
sync :同步模式, 内存更改时,同时写磁盘
atime/noatime :包含目录和文件
diratime/nodiratime :目录的访问时间戳
auto/noauto :是否支持自动挂载, 是否支持-a 选项
exec/noexec :是否支持将文件系统上运行应用程序
dev/nodev :是否支持在此文件系统上使用设备文件
suid/nosuid :不否支持suid 和sgid 权限
remount :重新挂载
ro :只读
rw: : 读写
user/nouser :是否允许普通用户挂载此设备,/etc/fstab 使用
acl :启用此文件系统上的acl 功能
loop: 使用loop 设备
defaults :相当于rw, nosuid, dev, exec, auto, nouser, async
处理交换文件和分区
交换分区是系统RAM 的补充
基本设置包括:
创建交换分区或者文件
使用mkswap 写入特殊签名
在/etc/fstab 文件中添加适当的条目(pri=value) 使用优先级
使用swapon -a
4 sed 文本文件工具
sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed 命令处理缓冲区中的内容处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed [option] ... 'script' inputfile...
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份并原处编辑
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/ :被此处模式所能够匹配到的每一行
(3) 地址范围:
#,# :从指定行到指定行
#,+# :从指定行加到几行
/pat1/,/pat2/ :被此处模式所能够匹配到的,到另个模式匹配的行,可以多段
#,/pat1/
(4) ~ :步进
1~2 奇数行
2~2 偶数行
编辑命令:
d: 删除模式空间匹配的行,并立即启用下一轮循环
p: : 打印 当前模式空间内容,追加到默认输出 之后
a [\]text :在指定行后面追加文本支持使用\n 实现多行追加
i [\]text :在行前面插入文本
c [\]text :替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile :读取指定文件的文本至模式空间中
匹配到的行后
=: 为模式空间中的行打印行号
!:
高级编辑命令
P :打印模式 空间开端至\n 内容 ,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H :把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G :从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行 覆盖 至模式空间
N :读取匹配到的行的下一行 追加 至模式空间
d: 删除模式空间中的行
D :如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本 , 并 不会 读取新的 输入行,而使用 合成的模式空间 重新 启动 循环。如果 模式空间不包含换行符,则会像发出d 命令那样启动正常的新 循环
练习
1 、删除centos7 系统/etc/grub2.cfg 文件中所有以空白开头
的行行首的空白字符
sed -ir 's@^[[:space:]]+@@' /etc/grub2.cfg
2 、删除/etc/fstab 文件中所有以# 开头,后面至少跟一个空
白字符的行的行首的# 和空白字符
sed -ir 's@^#[[:space:]]+@@'
3 、在centos6 系统/root/install.log 每一行行首增加#号
sed -i 's@^@#@' /root/install.log
4 、在/etc/fstab 文件中不以# 开头的行的行首增加#号
sed -i 's@^[^#]@#@' /etc/fstab
5 、处理/etc/fstab 路径, 使用sed 命令取出其目录名和基名
echo "/etc/rc.d" | sed -r 's@^(/.*/)([^/]+)/?@\1@g'
echo "/etc/rc.d" | sed -r 's@^(/.*/)([^/]+)/?@\2@g'
6 、利用sed 取出ifconfig 命令中本机的IPv4 地址
ifconfig | sed -rn "/\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>/p;g" | sed -r 's@[[:alpha:]:]+@@g' | sed -r 's@[[:space:]]+@\n@g' | sed -r '/^$/d'
7 、统计centos 安装光盘中Package 目录下的所有rpm 文件的以. 分隔倒数第二个字段的重复次数
ls *.rpm | sed -r 's@.*[.](.*)[.]rpm@\1@' | sort | uniq -c
8 、统计/etc/init.d/functions 文件中每个单词的出现次数,
并排序(用grep 和sed 两种方法分别实现)
cat /etc/init.d/functions | egrep -o "\<[[:alpha:]]+\>" | sort| uniq -c
cat /etc/init.d/functions | sed -r 's@[^[:alpha:]]@\n@g' |sed '/^$/d' |sort | uniq -c
9 、将文本文件的n 和n+1 行合并为一行,n为奇数行
cat fstab | sed 'N;s@\n@@g'