软件包管理

包命名

源代码:name-VERSION.tar.gz|bz2|xz rpm包命名方式: name-VERSION-release.arch.rpm release:release

包命名和工具

包之间:可能存在依赖关系,甚至循环依赖

解决依赖包管理工具:

yum:rpm包管理的前端工具

apt:dep包管理器前端工具

zypper:suse上的rpm前端管理工具

dnf:Fedora 18+ rpm包管理器前端管理工具

库文件

查看二进制程序所依赖的库文件 ldd /PATH/TO/BINARY_FILE 管理及查看本机装载的库文件 laconfig 加载配置文件中指定的库文件

/sbin/ldconfig-p 显示本机已经缓存的可用的库文件及文件路径

映射关系

配置文件:/etc/ld.so.conf,/etc/ld.conf.d/*.conf

缓存文件:/etc/ld.so.cache

包管理器

程序包管理器:

功能:将编译好的应用程序的各组成文件打包成一个或多个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级校验等管理操作

包文件组成

RPM包内的文件

RPM的元数据,如名称,版本,依赖性,描述等

数据库(公共):/var/lib/rpm

依赖关系 功能说明 包安装后生成的各文件路径及校验码信息

程序包的来源

管理程序包的方式

使用包管理器:rpm

使用前端工具:yum,dnf

获取程序包的途径:

(1)系统发版的路径的光盘或官方的服务器

CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com

(2)项目官方站点

(3)第三方组织

Fedora-EPEL

搜索引擎

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

https://sourceforge.net/ (4)自己制作

rpm包管理

[install-option]

--test :测试安装,但不真正安装,即dry run模式

--nodeps:忽略依赖关系

--replacepkgs|replacefiles

--nosignature:不检查来源合法性

--nodigest:不检查包完整性

--noscript:不执行程序包脚本

%pre:安装前脚本 --nopre

%post:安装后脚本 --nopost

%preun:卸载后脚本 --nopreun

%postun:卸载后脚本 --nopostun

rpm包升级

升级:

rpm{-U|--upgrade}

rpm{-F|--freshen}

upgrade:安装有旧版程序包,则升级。 如果不存在旧版程序包,则安装

freshen:安装有旧版程序包,则升级。 如果不存在旧版程序包 ,则不执行升级操作

rpm -Uvh rpm -Fvh --oldfapackage:降级

--force:强制安装

包查询

rpm {-q|--query} [select-options] [query-options]

[select-options]:

-a:所有包

-f:查看指定的文件由哪个程序包安装生成

-p rpfile:针对尚未安的程序包做查询操作

--whatprovideos CAPABILITY:由哪个包所提供

--whatrequires CAPABILITY:被哪个包所依赖

rpm2cpio 包文件|cpio -itv 预览包内文件

rpm2cpio 包文件|cpio -id “*.conf” 释放包内文件

--changelog:查询rpm包的changelog

-c:查询程序的配置文件

-d:查询程序的文档

-i:information

-l:查看指定的程序包安装后生成的所有文件

--script:程序包自带的脚本

--provides:列出指定程序包所提供的CAPABILTY

-R:查询指定的程序包所依赖的CAPABILITY

常用查询用法:

-qi PACKAGE,-qf FILE,-ql PACKAGE

-qpi PACKAGE_FILE,-qpl PACKAGE_FILE

-qa

包卸载:

rpm{-e|--erase}[--allmatches][--nodeps][--noscripts][--notriggers][--test]PACKAGE_NAME

当包卸载时,对应的配置文件不会删除,以FILENAME.rpmsave形式保留

rpm数据库

数据库重建:

/var/lib/rpm

rpm{--initdb|--rebuliddb}

initdb;初始化

如果事先不存在,则新建之否则,不执行任何操作

rebuilddb:重建已安装的包头的数据索引目录

yum

yum:rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包

yum repository:yum repo,存储了众多rpm包,以及包的相关的元数据

文件(放置于特定目录repodata下)

文件服务器:

http://

https://

ftp://

file://

yum的配置文件

/etc/yum.conf:为所有仓库提供公共配置

/etc/yum.repos.d/.*repoS:为仓库的指向提供配置

仓库的指向定义:

[base]

name=

baseurl=url://path/to/repository/

enabled={1|0}

gpgcheck={1|0}

enablegroups={roundrobin|priority}

roundrobin:意为随机挑选,默认值

priority:按顺序访问

cost= 默认为1000

yum仓库

yum的repo配置文件中可用的变量: $releaserver:当前os的发行版的主板型号

$arch:平台,i386,i486,x86_64等

$basearch:基础平台;i386,x86_64

$YUM0-$YUM9:自定义变量

实例

http://server/centos/$releasever/$basearch/

http://server/centos/7/x86_64

http://server/centos/6/i386

yum源

阿里云repo文件

http://mirrors.aliyun.com/repo/

Centos系统的源

阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/

清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/

EPEL的yum源

阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64

阿里巴巴开源软件:

https://opsx.alibaba.com/

yum-config-manaager

生成172.16.0.1_cobbler_ks_CentOS-X-x86_64_.repo

yum-config-manager --add-repo=http://172.16.0.1/cobbler/ks_mirror/7/

yum-config-manager -disable "仓库名" 禁用仓库

yum-config-manager--enable "仓库名" 启用仓库

yum命令

yum命令的用法: yum[options][command][package...]

显示仓库列表:

yum repolist[all|enabled|disabled]

显示程序包:

yum list

yum list [all|glob_exp1][glop2][...]

yum list {available|installed|updates}[glob_exp1][...]

安装程序包:

yum install package1 [package2] [...]

yum reinstall package1 [package2]...

升级程序包:

yum update [package1][package2][...]

yum downgrade package1 [package2]...

检查可用升级:

yum check-update

卸载程序包:

yum remove | erase package1 [package2] [...]

查看程序包information:

yum info[...]

查看指定的特性是由哪个程序包所提供:

yum provides | whatprovides feature1 [feature][...]

清理本地缓存:

清除/var/cache/yum/$basearch/$releasever缓存

yum clean [packages | metadata | expire-cache | rpmdb | plugins | all]

构建缓存: yum makecache

搜索:yum search string1 [string2] [...]以指定的关键字搜索程序包名及summary信息

查看指定包所依赖的capabilities:

yum deplist package1 [package2] [...]

查看yum事务历史:

yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

yum history

yum history info 6

yum history undo 6

日志:/var/log/yum.log

安装及升级本地程序包:

yum localinstall rpmfile1 ...

yum localupdate rpmfile1 [...] (用update替代)

包组管理的相关命令:

yum groupinstall group1 [...]

yum groupupdate group1 [...]

yum grouplist [hidden] [groupwildcard] [...]

yum groupremove group1 [...]

yum groupinfo group1 [...]

yum的命令行选项:

--nogpgcheck:禁止进行gpg check

-y:自动回答yes -q:静默模式

--disablerepo=repoidglob:临时禁用此处指定的repo

--enablerepo=repoidglob:临时启用此处指定的repo

--noplugins”禁用所有插件

系统光盘yum仓库

系统安装光盘作为本地yum仓库: 挂载光盘至某目录,例如/mnt/cdrom

mount /dev/cdorm /mnt/cdorm

(2)创建配置文件

[CenOS7]

name=

baseurl=

gpgcheck=

enabled=

创建yum仓库:

createrepo [options] < directory >

程序包编译

程序包编译安装:

源代码-->预处理-->编译-->汇编-->链接-->执行

源代码组织格式:

多文件:文件中的代码之间,很可能存在跨文件依赖关系

c、c++:make项目管理器

configure脚本-->Makefile.in-->Make.file

java:maven

c语言源代码编译安装三步骤:

  1. ./configure

(1)通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefiile.in文件生成Makefile

(2)检查依赖到的外部环境,如依赖的软件包

2、开发工具:

autoconf:生成configure脚本

automake:生成Makefile.in

注意:安装前查看INSTALL,README

开源程序源代码的获取:

官方自建站点:

apache.org

mariadb.org

代码托管:

SourceForge.net

Github.com

code.goole.com

c/c++编译器:gcc

编译c源代码:

准备:提供开发工具及环境

开发工具:make,gcc等

开发环境:开发库,头文件

glibc:标准库

实现:通过“包组”提供开发组件

Development Tools

Server Platform Development

生产实践:(基于最小化安装的系统)

yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree screen lsof tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils

安装步骤:

第一步:configure脚本

选项:指定安装位置、指定启用的特性

--help:获取其支持使用的选项

选项分类:

安装路径设定:

--prefix=/PATH:指定默认安装位置,默认为/usr/local/

--sysconfdir=/PATH:配置文件安装位置

System types:支持交叉编译

Optional Features:可选特性

--disable-FEATURE

--enable-FEATURE[=ARG]

Optional Packages:可选包

--with-PACKAGE[=ARG] 依赖包

--without-PACKAGE 禁用依赖关系

第二步:make

第三步:make install

安装后的配置:

(1)二进制程序目录导入至PATH环境变量中

编辑文件/etc/profile.d/NAME.sh

export PATH=/PATH/TO/BIN:$PATH

(2)导入帮助手册

编辑/etc/man.config|man_db.conf文件 添加一个MANPATH

磁盘分区和文件系统

设备文件

I/O Ports:I/O设备地址

一切皆文件:open(),write(),read(),close()

设备类型

块设备:block,存取单位“块”,磁盘分

字符设备:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信

设备文件

磁盘设备的设备文件命名:/dev/DEV_FILE

磁盘分区:/dev/vd、/dev/xvd

不同磁盘标识:a-z

同一设备上的不同分区:1,2...

使用分区空间

设备识别

设备分区

创建文件系统

标记文件系统

在/etc/fstab文件中创建条目

挂载新的文件系统

为什么磁盘分区

优化I/O性能

实现磁盘空间ee额配限制

提高修复速度

隔离系统和程序

安装多个OS

采用不同文件系统

分区

两种分区方式:MBR,GPT

MBR:Master Boot Record,1982年,使用32位表示扇区数,分区一般不超过2T

如何分区:按柱面

MBR分区中一块硬盘最多有4个分区,也可以3个主区+1扩展(N个逻辑分区)

管理分区

列出块设备:

lsblk

创建分区使用:

fdisk 创建MBR分区

gdisk 创建GPT分区

parted 高级分区操作

重新设置内存中的内核分区表版本

partprode

parted命令

parted的操作都是实时生效的,小心使用

用法:parted[选项] [设备[命令[参数]...]...]

parted /dev/sdb mklabel gpt|msdos

parted /dev/sdb print

parted /dev/sdb mkpart primary 1200(默认M)

parted /dev/sdb rm1

parted -l 列出分区信息

分区工具fdisk和gdisk

gdisk /dev/sdb 类fdisk的GPT分区工具

fdisk -l [-u] [device]查看分区

fdisk /dev/sdb 管理分区

子命令:

p 分区列表

t 更新分区类型

n 创建新分区

d 删除分区

v 校验分区

u 转换单位

w 保存并退出

q 不保存并退出

同步分区列表

查看内核是否已经识别新的分区

cat /proc/partations

centos6 通知内核重新读取硬盘分区列表

新增分区用:

partx -a /dev/DEVICE

kpartx -a /dev/DEVICE -f:force

删除分区:

partx -d --nr M-N /dev/DEVICE

centos5 , 7 :使用partprobe

partproe[/dev/DEVICE]

文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理 和存储文件信息的软件结构称为文件管理系统,简称文件系统

从系统角度来看,文件系统是对于文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体说,它负责为用户建立文件,存入,读出,修改,转储文件的存取,安全控制,日志,压缩。加密等

支持的文件系:/lib/modules/uname-r/kernel/fs

各种文件系统: https://en.wikipedia.org/wiki/Comparison_of_file_systems

文件系统类型

Linux文件系统

ext2:适用于那些分区容量不是太大,更新页不频繁的情况,列入/boot分区

ext3:是ext2的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复。它通常被用作同用的文件系统

ext4:是ext文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件、最大1EB的文件系统,以及速度的提升

xfs:SGI,支持最大8EB的文件系统

btrfs,reiserfs,jfs,swap

光盘:iso9660

文件系统分类

根据是否支持“journal”功能:

日志文件系统:ext3,ext4,xfs...

非日志文件系统:ext2,vfat

文件系统的组成部分:

内核中的模块:ext4,xfs,vfat

用户空间的管理工具:mkfs.ext4,mkfs.xfs,mkfs.vfat

Linux的虚拟文件系统:VFS

查前支持的文件系统: cat/proc/filesystems

创建文件系统

mkfs命令:

(1)mkfs.FS_TYPE /dev/DEVICE

ext4

xfs

btrfs

vfat

(2)mkfs -t FS_TYPE /dev/DEVICE

-L 'LABEL' 设定卷标

创建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 # 为数据空间中每多少个字节创建一个indoe;不应该小于block大小

-N # 指定分区中创建多少个inode

-I 一个inode记录占用的磁盘空间大小,128--4096

-m # 默认%5,为管理人员预留空间占总空间的百分比

-O FEATURE[,...] 启用指定特性

-O ^FEATURE 关闭指定特性

文件系统标签

指向设备的另一种方法。与设备无关

blkid:块设备属性信息查看

blkid[OPTION]...[DEVICE]

-U UUID 根据指定的UUID来查找对应的设备

-L LABEL 根据指定的LABEL来查找对应的设备

e2label:管理ext系列文件的LABEL

e2label DEVICE[LABEL]

findfs:查找分区

findfs[options]LABEL =< label >

findfs [options] UUID=< uuid >

tune2fs

tune2fs:重新设定ext系列文件系统可调整参数的值

-I 查看指定文件系统超级块信息;super block

-L ‘LABLE’ 修改卷标

—m # 修预留给管理员的空间百分比

-j 将ext2升级为ext3

-O 文件系统属性启用或禁用,-O ^has_journal

-o 调整文件系统的默认挂载选项,-o ^acl

-U UUID 修改UUID号

dumpe2fs:将磁盘块分组管理

-h:查看超级块信息,不显示分组信息

文件系统检查和修复

常发生于死机或者非正常关机之后

挂载为文件系统标记为:"no clean"

注意:一定不要在挂在状态下修复

fsck:File System Check

fsck.FS_TYPE

fsck -t FS_TYPE

-p 自动修复错误

-r 交叉式修复错误

FS_TYPE 一定要与分区上已经文件类型相同

e2fsck:ext系列文件专用的检测修复工具

-y 自动回答yes

-f强行修复

挂载mount

挂载:将额外文件系统与根文件系统某现存的目录建立建立起关联,进而使得此目录做为其他文件访问入口的行为

卸载:为解除次关联关系的过程

把设备关联挂载点:mount Point mount

卸载时:可使用设备,也可以使用挂载点 umount 设备名|挂载点

挂载点下原有文件在挂在完成后会被临时隐藏

挂载点目录一般为

用mount命令挂在文件系统

挂载方法:mount DEVICE MOUNT_POINT

mount:通过查看/etc/mtab文件显示当前已挂载的所有设备

mount [-fnrsvw] [-t vfstype] [-o options] device dir

device:指明要挂载的设备;

(1)设备文件:例如/dev/sda1 (2)卷标:-L ‘LABEL’;例如-L ‘MYDATA’

(3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e785c0-a126711d406e'

(4)伪文件系统名称:proc,sysfs。devtmpfs,configfs

dir:挂载点

事先存在,建议使用空目录 进程正在使用中的设备无法被卸载

mount常用命令选项

-t vsftype 指定要挂在的设备上的文件系统类型

-r readonly 只读挂载

-w read and write 读写挂载

-n 不更新/etc/mtab, ,mount不可见

-a 自动挂载所有支持自动挂载的设备

-L ‘LABLE’ 以卷标指定挂载设备

-U ‘UUID’ 以UUID指定要挂载的设备

-B,--bind 绑定目录到另一个目录上

查看内核追踪到的已挂载的所有设备

cat /proc/mounts

-o options (挂在文件系统的选项),多个选项使用逗号分隔

卸载命令

查看挂载情况

findmnt MOUNT_POINT|device

查看正在访问指定文件系统的进程

lsof

fuser

终止所有正在访问指定的文件系统的进程

fuser -km

卸载 umount DEVICE

umount MOUNT_POINT

挂载点和/etc/fstab

配置文件系统体系

被mount、fsck和其他程序使用

系统重启时保留文件系统体系

使用mount -a 命令挂载/etc/fstab中的所有文件系统

文件挂载配置文件

/etc/fstab每行定义一个要挂载的文件系统

1、要挂载的设备或伪文件系统

设备文件

LABEL:LABEL=“”

UUID:UUID=“”

伪文件系统名称:proc,sysfs

2、挂载点

3、文件系统类型:ext4,xfs,iso9660,nfs,none

4、挂载选项:defaults,acl,bind

5、转储频率:0:不做备份 1:每天存储 2:每隔一天转储

6:fsck检查的文件系统的顺序:允许的数字是0 1 2

0:不自检

1:首先自检;一般只有rootfs才用

2:非rootfs使用

处理交换文件和分区

swap交换分区是系统RAM的补充,Swap分区支持虚拟内存。当没有足够的RAM保存系统处理的数据时会将数据写入swap分区

当系统缺乏swap空间时,内核会因为RAM内存耗尽而终止进程。配置过多swap空间会造成存储设备处于分配状态但闲置,造成浪费,过多swap空间还会掩盖内存泄露

挂载交换分区

基本设置包括:

创建交换分区或者文件

使用mkswap写入特殊签名

在/etc/fstab文件中添加适当的条目

使用swapon -a激活交换空间:swapon

swapon [OPTION]

-a: 激活所有的交换分区

-p :制定优先级

/etc/fstab 在第四列中pri=value

禁用:swapoff[OPTION]

SWAP优先级

可以指定swap分区0到32767的优先级,值越大优先级越高 如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一

先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级永远高于核心缺省指定的优先级

优化性能:分布存放,高性能磁盘存放

移动介质

挂载意为着使外来的文件系统看起来如同是主目录树的一部分

访问前,介质必须被挂载

摘除时,介质必须被卸载

按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软盘、USB等)

挂载点通常在/media 或/mnt下

使用光盘

在图形环境下自动启动挂载/run/media/< user >/< lable >

否则就必须被手工挂载

mount /dev/cdrom /mnt/

操作光盘:eject弹出光盘

eject -t 弹入光盘

创建ISO文件

cp /dev/cdrom /root/centos.iso

mkisofs -r -o /root/etc.iso /etc

刻录光盘

wodim -v -eject centos.iso

挂载USB介质

查看USB设备是否识别

lsusb

被内核探测为SCSI设备

/dev/sdaX、/dev/sdb或类似的设备文件

在图形环境中自动挂载

图标在[ 计算机 ]窗口中创建

挂在/run/media /< user >/< label >

手动挂载

mount /dev/sdb1 /mnt

常见工具

文件系统空间占用等信息的查看工具

df -H 以10为单位

-T 文件系统类型

-h human-readable

-i inodes instead of blocks

-P 以 Posix兼容的格式输出

查看某总目录总体空间占用状态

du

-h 可读

-s 总结

--max-depth=# 指定最大目录层级

工具dd

dd:转换和复制文件

用法:

dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#

if=file 从所命名文件读取而不是从标准输入

of=file 写到所命名的文件而不是到标准输出

ibs=size 一次读size个byte

obs=# 一次写#个byte

bs =# block #,指定块大小

cbc=# 一次转化#个byte

skip=# 从开头忽略#个ibs大小的块

seek=# 从开头忽略#个obs大小的块

count=n 复制n个bs

conv=conversion [,concersion]用指定的参数转换文件

转换参数:

ascii转换EBCDIC为ASCII

ebcdic转换ASCII为EBCDIC

lcase 把大写字符转换为小写字符

ucase 把小写字符转换为大写字符

nocreat不创建输出文件

noerror 出错时不停止

notrunc 不截短输出文件

sync 把每个输入块填充到ibs个字节,不足部分(NUL)字符补齐

Fdatasync 写完成前,物理写入输出文件

备份MBR

dd if=/dev/sda of=/tmp/mbr.bak bs =512 count=1

破坏MBR中的booterloader

dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

备份:

dd if=/dev/sdx of=/dev/sdy :将/dev/sdx整盘备份到/dev/sdy

dd if=/dev/sdx of=/path/to/image :将/dev/sdx全盘数据备份到指定路径的image文件

dd if=/dev/sdx |gzip > /path/to/image.gz :备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径

恢复:

dd if=/path/to/image of=/dev/sdx :将备份文件恢复到指定的盘

gzip-dc /path/to/image.gz | dd of=/dev/sdx :将压缩的备份文件恢复到指定盘

拷贝:

拷贝内存资料到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024 :将内存里的数据拷贝到root目录下的mem.bin文件

将光盘拷贝iso镜像

dd if=/dev/cdrom of=/root/cd.iso 拷贝光盘数据到root文件下,并保存为cd.iso文件

销毁磁盘数据

dd if=/dev/urandom of=/dev/sda1 利用随机的数据填充硬盘,在某些必要的场合可以用来销毁证据,执行次操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行

测试硬盘写速度

dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

测试硬盘读速度

dd if=/root/1Gb.file bs=64k | dd of =/dev/null