Linux系统管理笔记
linux发展史+安装+注意事项
Unix的发展
- Multics(油呢可帝特死)工程计划:最初的Unix
1965年,美国麻省理工学院(MIT)、 通用电气公司(GE)及AT&T的贝尔实验室联合 开发Multics工程计划,其目标是开发一种交互式的具有多道程序处理能为的分时操作系统,但因 Multics追求的目标过于庞大复杂,项目进度远远 落后于计划,最后贝尔实验室宣布退出。
1969年,美国贝尔实验室的肯•汤普森 在DEC PDP-7机器上开发出了UNIX系统。
- 常见的Unix---全球Unix三大运营商
a) AIX系统:由IBM公司在Unix的内核上开发出来的系统
b) HP-UX:由HP戴尔公司在Unix的内核上开发出来的系统
c) Solaris(蛇牢瑞死):由SUN微软公司在Unix的内核上开发出来的系统
Linux的版本分类
- 内核版:内核版是由Linux创始人带领的团队负责更新升级,公司网址:www.kernel.org
a) Redhat 6.x 2.6.x (瑞的汉的)
b) Redhat7.x 3.10.x
- 发行版:只要系统中的内核是Linux的,其操作跟Linux有百分90%相似
a) Redhat系列
- 企业版:RHEL RedHat Enterprise Linux (安特谱来死里牛死)
- 个人版:Fedora(肥多啦),全功能版本
b) Debian系列
- Fedora,RedHat,centOS,SUSE,Gentoo,红旗,Mandriva,Turbolinux,RHEL,enterprise
- centOS 5.5 2.6.18 网址:www.kernel.org 3.1.14
- Debian,Ubunto
Linux:主要发行版本
c) Redhat (瑞的汉的)系列
- centOS (汕头OS)
- SUSE (苏谁)
- Fedoro (肥多啦)
- Gentoolinux (真吐)
- 红旗Linux (淘汰了)
- Mandriva (忙拽我)
- Turbolinux (特谱里牛死)
d) Debian (爹饼)系列
- Ubuntu (乌斑图)
- Knopplx(坑佛死)
常见开源软件:
e) Apache:web服务器
f) Nginx(Ng克死):web服务器
g) Mysql:数据库
h) PHP:脚本语言
i) Samba(伤八):Linux跟Windows之间的内网文件服务器
j) Python:脚本语言
k) Ruby(如比):脚本语言(日本开发)
l) Sphinx(斯分克丝):中文分词
m) MongoDB(NO谁库):NOSQL数据库
n) Redis(瑞地死):Linux中的辅助数据库
注意:Redis是用来辅助Mysql数据库的,用来优化SQL性能
GPT:开源软件规范(拥有法律效率)
查看服务器排名网址:www.netcraft.com
Windows格式化续
- o) 分出一小块空间来做统计块,统计你有多少块块组,块组里多少以经占有的Black,多少空闲没用。有多少Inode占有,有多少空闲。就是一个统计信息用的,剩下的空间,分成一块块块组,一个块组按你的分区格式不同,大小不同。在把块组分成二部,上部分一点空间放Ionde,剩下的空间分给下部放Black
Linux系统文件格式
p) EXT2
q) EXT3
r) EXT4
s) XFS
Linux分区表类别
a) MBR分区表:主引导记录分区表,最大只支持2.1T硬盘,最多支持4个分区。
b) GPT分区表:全局唯一标示分区表,支持9.4ZB硬盘,(1ZB=1024PB,1PB=1024EB,1EB=1024TB)理论上GPT支持无限制分区。
- MBR分区类型
a) 主分区:最多只能有4个
b) 扩展分区:最多只能有1个,主分区加扩展分区最多有4个,不能写入数据,只能包含逻辑分区
c) 逻辑分区:在扩展分区能多支持多个逻辑分区,至少10个以上,可以写入数据。
注意:Linux跟windows的二个分区表同样的
Linux分区步骤
t) 分区
u) 格式化
v) 设备文件名:给分区写入设备文件名,有了设备文件名才可以给挂载点
w) 挂载点:使用已经建立的空目录作为挂载点(任何目录都可以,除了/bin/ /etc/ /lib/)
- 挂载点是Linux访问分区的一个入口,跟windows的盘符相同意思
- Windows:是用ABCD字母来做盘符标志
- Linux是用数字来做挂载点标志的、
注意:Linux下一切皆为文件
swap(死我扑)
分区设备名
x) 设备文件名:
- /dev/hda1 (IDE硬盘接口,理论速度:133Mbps)
- /dev/sda1 (SCSI硬盘接口,理论速度:200Mbps)(SATA硬盘接口,理论速度:500Mbps)
注意:/是Linux的根目录,叫根,是Linux的最高一级目录
Linux是树型结构,根目录下放一级目录,一级目录下放二级目录等。
Windows也是树型结构,不过他是先分 我的电脑—磁盘—目录等。
dex是专门用来放硬件设备的目录,所以里面放的内容大多是硬件特殊设备的
hda1跟sda1,中的a字母是代表你当前是第几块硬盘,要是2块硬盘a字母就会变成b字母
hda1跟sda1,中的1数字是代表你当前是第几个分区,要是第二分区1数字就会变成2数字
1-4数据的标志一定是给主分区跟扩展分区的,无论逻辑分区怎么分,都会从5数字开始
Linux分区
y) 必须分区:不分不能装系统
- / (根分区,一定要分,单独分)
- swap分区(死我扑):(交换分区)
- 可以当成是虚拟内存,当真实内存不够用的时候,拿出swap硬盘分区当内存用,是为了提升系统性能的。
- Swap,如果真实内存小于4G,swap位内存的两倍。如果真实内存大于4G,swop和内存大小一致。实验环境,不大于2G
z) 推荐分区
- /boot (启动分区,200MB)要是硬盘满了,没有分配启动分区,就系统在也开不起来了
- /home:这是用来保存文件数据的,跟根分区隔开
- /www:可以自己创建分区类别,但是实际用途这是要服务器来决定的
注意:如果有单独的分区,他会有单独的存储空间,可以往里面写入数据,是不会写在根目录里的,是写在自己的空间里的。也就是说从系统上来看,他们是从属关系,根是最高目录。如果从硬盘来看,要单独分区,他就会有单独的存储空间。所以才叫单独分区
Linux安装
- 安装或升级 √
- 没有图形界面的简易安装
- 安全模式
- 从硬盘启动
- 内存检测
Desktop 图形界面
Minimal Desktop (秘你楼) 图形界面
Minimal 最小化安装
Basic server(贝思客) 基本服务
Database server(达特备四) 集成MySQL数据库
Web server 集成Apache web服务
Virtual host (我的有豪斯特) 集成虚拟化主机
Software deveiopment workstation集成软件开发环境
centOS的版本分类
aa) Desktop:图形界面
ab) Minimal Desktop:图形界面
ac) Minimal(咪呢NO):最小化安装
ad) Basic server(A谁库谁我):基本服务
ae) Database server(爹可呗死谁我)数据中心服务,会装Mysql
af) Web server:里面会装Apache
ag) Virtual Host(我涛好死)涛说本地话:装虚拟机主键
ah) Software Developmaent Workstation:装开发环境
远程登录管理工具
- Putty:古老的远程管理工具,是绿色化工具,不需要安装,双击打开就能用,但是因为是很多年开发的,所以他的设置,字体,颜色都比较老化,收费。
- Seret:目前比较主流的工具,也是很强大的一个工具,各方面的设置都很不错,收费。
- Xshell:目前比较主流也是最新的工具,可以选择收费企业版或免费个人版,各方面的设置都很不错。
Linux IP地址配置
- 输入:setup进入设置页面,第三行,第一行,回车,设静态IP地址,oh boot这个服务要启动,点OK,后保存退出
- 输入:service(服务) network(网卡) restart(重启):重启网卡服务
- 以下步骤只针对虚拟机,虚拟机网卡设置为桥接
- 桥接到有线网卡
- 输入:serivce(服务) network(网卡) restart(重启):重启网卡服务
- 要是以上的设置后还不行,检查IP,要是检查了IP没问题,那就可能是UUID冲突,
- UUID冲突(唯一识别符,只针对复制镜像生效)
- 输入:vi /etc/sysconfig/network-scripts/ifcfg-etho:删除MAC地址行
- 输入:rm –rf /etc/udev/rules.d/70-persistent-net.rvles:删除MAC地址和UUID绑定文件
- 输入:reboot :重启Linux系统
一点注意事项
- 家目录用~代表的
- #:代表超级用户
- $:代表普通用户
- Linux严格区分大小写,“命令”都是小写的,“-”选项是大写。
- 函数:要是名称后面有“.so.4”的就是函数
- 虚拟文件系统:不可以在里面存储数据,因为重启后里面的数据就会被清空
- /OPT/:要把软件放置到/usr/local/目录当中
- 清空数据:rm –rf /目录/* 注意后面一定要加“*”号
- /tmp/:临时目录,一般要清空的时候要先看一下目录,因为要是装了PHP跟Mysql的软件,他们会自动在这目录中新建他们的目录,一旦删除了PHP跟Mysql的目录,PHP跟Mysql他们会自己崩溃。应对方案:在PHP跟Mysql安装的过程,是可以更改安装路径,这样就可以更改到别的目录里面。
- 源码包:一般存放在/usr/local/src/目录中
- 内核源码包:一般存放在/usr/src/linux/目录中
- rar目录:是放可变数据的
- /var/www/html/目录:存储网页可变数据的
- 目前建议能做实验的目录:/root/,/tmp/,中
- Windows下的程序不能直接在Linux上安装使用,因为Linux中的软件需要开源软件,windows的软件是要不开源的软件,所以双方的软件无法通用
- 在Linux中:“.”是代表当前目录,“..”是代表上级目录
- 服务器上不能出现777权限,777为Linux系统中的最高权限
Linux中硬盘和光盘
- Linux中所有内容都是以文件形式保存的,包括硬件
- 硬盘文件是:/dev/sd[a-p]
- 光盘文件是/dev/sro/等
Linux不靠扩展名区分文件类型
- 压缩包:“*.gz”,“*.bz2”,“tar.bz2”,“*.tgz”
- 二进制软件包:“*.rpm”
- 网页文件:“*.html”,“*.php”
- 脚本文件:“*.sh”
- 配置文件:“*.conf”,配置文件一定要加扩展名不加系统识别不了
注意:建议要是有以上的文件在,一定要加扩展名,因为Linux系统不止你一个人在维护,这个也会好分类,容易分得清楚
Linux的存储设备挂载
- Liunx所有的存储设备都必须挂载之后,用户才能使用,包括了硬盘,U盘,移动硬盘,光盘等
a) Windows下的存储设备全自动分配盘符,但是全都要手动弹出设备 (盘符=挂载点)
b) Linux中只有硬盘是自动挂载的,其它的存储设备全需要手动挂载,但是全都要手动弹出设备。
注意:在Linux系统中可以设置自动挂载存储设备,但是一旦设置了自动挂载,要是开机的话,系统没有检测到存储设备,那系统会调动全都的运算能力来分析为什么没有,因而死机
服务器注意事项
- 远程服务器不允许直接关机,只能重启。
- 准备重启时应该关闭所有服务后才重启。这样可以保护硬盘防止损坏数据
- 不要在服务器访问高峰运行高负载命令,例:大数据的查询,备份,拷备等
- 远程配置防火墙时不要把自己踢出服务器,应对方案:配置前先设置定时任务,每几分钟自动清理一下防火墙,建议按自身的能力来设置时间。
- 指定合理的密码规范并定期更新
- 合理的分配权限,不要随便加大权限,默认权限的是比较合理的权限分配,没必要的时候不要去更改默认权限。注意:能不给编程人员动服务器就别让他们动。
- 服务器上不能出现777权限,777为Linux系统中的最高权限
CentOS 6.* 安装流程 & 远程登录 请看附件
*************************************
linux常用命令
Linux 文件的命名规则
- 除了 / 之外,所有的字符都合法,但有些字符最好不用,如空格符、制表符、退格符和字符 @ # $ & ( ) - 等
- 避免使用 “ . ” 作为普通文件名的第一个字符
- 大小写敏感,严格区分大小写(包括文件命名、命令、命令选项、用户名等)
Linux命令的格式(ls)
- 命令的【选项】【参数】。
a) 选项:是用于调整命令的功能的,不加权限只能执行,加了权限就可以执行更复杂的功能
b) 参数:是命令的操作对象,省略参数的原因是默认参数
c) 当有多个选项时,可以写在一起
d) 两个特殊的目录 . 和 .. ,分别代表当前目录和当前目录的父目录
e) 个别命令不遵循此格式
ls命令
ls (选项)(参数)
默认别名:(ll:显示目录下所有文件的配套信息)
常用:
ls :显示目录文件 路径:/bin/ls/ 权限:所有用户。
ls –a /目录/ :显示所有文件
ls –color=nerern /目录/ :不显示颜色显示目录下内容
ls –lh :显示文件大小单位
ls –l :显示目录下所有文件的配套信息
可以用(ll命令)作用一样
ls –ld :只显示当前输入的目录信息,不显示该目录下的子目录
ls –i :显示文件的inode号i节点
man ls :查看ls下的短选项跟长选项
选项:
-a :显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);
-A:显示除影藏文件“.”和“..”以外的所有文件列表;
-C:多列显示输出结果。这是默认选项;
-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列;
-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;
-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;
-c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间;
-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;
-i:显示文件索引节点号(inode)。一个索引节点代表一个文件;
--file-type:与“-F”选项的功能相同,但是不显示“*”;
-k:以KB(千字节)为单位显示文件大小;
-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;
-m:用“,”号区隔每个文件和目录的名称;
-n:以用户识别码和群组识别码替代其名称;
-r:以文件名反序排列并输出目录内容列表;
-s:显示文件和目录的大小,以区块为单位;
-t:用文件和目录的更改时间排序;
-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
--full-time:列出完整的日期与时间;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。
参数:
目录:指定要显示列表的目录,也可以是具体的文件。
- ll :显示目录文件的配套信息
文件格式的意思
- 第一项:drwxr_xr_x. 代表权限位
- 第二项:2 代表引用计数
a) 引用计数分类
- 文件:代表此文件的硬链接个数
- 目录:代表此目录下一级子目录的个数,要是该目录下没有子目录,就不显示。
- 第三项:root 代表所有者(属主)是那个用户
- 第四项:root 代表所属组
- 第五项:4090 代表文件大小,单位字节Byst
- 第六项:28 20:16 代表文件最后一次修改时间
- 第七项:123 代表文件名称
目录操作命令(cd,pwd,mkdin,rmdir,rm,tree)
- cd:切换目录
a) cd :切换目录,路径:shell内置命令,权限:所有用户
b) cd ~ :进入家目录,或用cd直接进入
c) cd – :进入上次目录
d) cd . :进入当前目录
e) cd .. : 进入上级目录
- pwd :显示当前所在目录,路径:/bin/pwd,权限:所有用户
- mkdir :建立目录
a) mkdir :建立目录,路径:/bin/mkdir/,权限:所有用户
b) mkdir –p :递归建立目录,一级过一级的建立
- rmdir :删除目录,路径:/bin/rmdir/,权限:所有用户
- rm:删除
a) rm :删除文件,路径:/bin/rm/,权限:所有用户
b) rm –rf :删除文件跟目录
c) -r :递归,删除目录
d) -f :强制
- tree(吹):目录名显示指定目录下所有内容的目录树,路径:/bin/tree/,权限:所有用户
相对路径跟绝对路径
1. 相对路径:参照当前所在的目录,进行查找,一定要确实当前所有的目录,从当前位置开始查找打开。
2. 绝对路径:从根目录开始指定,一级一级递归查找。在任何目录下,都能进入指定位置,从根目录开始查找打开。
文件操作命令(touch,rm,cat,more,less,head,tail,echo)
- touch(踏刺):创建空文件或修改文件时间,路径:/bin/touch/,权限:所有用户,注意:touch也称为触摸,要是文件不存在,建立新文件。要是存在,会修改文件的最后修改时间
拓展:
echo “hello” > 文件名
> 会覆盖源文件的内容
>> 追加内容到源文件中
touch {5..10}.txt
- rm:删除
a) rm :删除文件,路径:/bin/rm/,权限:所有用户
b) rm –rf :删除文件跟目录
c) -r :递归,删除目录
d) -f :强制
- cat(卡特) :查看文件内容,从头到尾。路径:/bin/cat/,权限:所有用户,加“-n”:列出行号
拓展:
-n 列出行号
cat 显示多个文件的内容
cat 将多个文件合并(按照文件先后顺序)
- more(莫儿) :分屏显示文件内容。路径:/bin/more/。权限:所有用户,
操作方式:
空格键向下翻页,b键向上翻页?,q键退出,,Enter键换行
拓展:
head -n 显示文件前n行
tail -n 显示文件最后n行
tail -f 实时监控文件尾部变化
- less(烈死) :分行显示文件内容,路径:/bin/less/,权限:所有用户,操作方式:空格键换行,q键退出。
- head(吓的)(吓用本地话说) :显示文件头
a) head :默认显示文件头10行。路径:/bin/head/。权限:所有用户,
b) head -n 20 文件名 :显示文件头20行
- tail(菜O) :默认显示文件尾
a) tail :默认显示文件尾10行。路径:/bin/tail/。权限:所有用户,
b) tail -n 20 文件名 :显示文件尾20行
c) tail –f 文件名:监听文件尾,不退出,适合监听实时文件
- echo(唉扣) 输入或插入的内容 》》 /目录名/文件名: 是输出命令,可以插入文件内容,会写在文件最后面,从最后开始写起
文件和目录都能操作的命令(rm,cp,mv,shell,type,ln)
- rm:删除文件或目录
a) rm :删除文件,路径:/bin/rm/,权限:所有用户
b) rm –rf :删除文件跟目录
c) -r :递归,删除目录
d) -f :强制
- cp :复制
a) cp 源文件 目标位置:复制。路径:/bin/cp/。权限:所有用户
b) cp -a 源文件 目标位置:相当有-r -p -d 这三个的功能
c) cp –r 源文件 目标位置:复制目录
d) cp -p 源文件 目标位置:连带文件属性复制,包括时间等
e) cp -d 源文件 目标位置:若源文件是链接文件则复制链接属性
f) cp 源文件 /目标目录/:原名复制
g) cp 源文件 /目标目录/新文件名:改名复制
- mv:剪切或改名。路径:/bin/mv/。权限:所有用户
a) mv 文件 /目标目录/:剪切
b) mv 文件 .新文件名:改名,用“.”来代表当前目录
- shell(谁欧) :命令解释器,路径:/bin/bash linux标准shell/
a) 内部命令:shell自带的。没有明确的可执行文件
b) 外部命令:后期开发。有可执行文件
- type(菜谱) 命令 :用来区分命令类型
- ln :链接文件:路径:/bin/ln/。权限:所有用户
a) ln 源文件 目标文件:硬链接
b) ln –s 源文件 目标文件:软链接,文件名都必须要写绝对路径
软链接跟硬链接的分类
- 软链接
a) 类似windows快捷方式
b) 软链接拥有自己的I节点和Block块,但是数据块中只保存原文件的文件名和I节点,并没有实际的文件数据
c) 软链接的权限为1rwxrwxrwx。为系统中最高权限
d) 修改任何一个文件,另一个都改变
e) 删除链接文件,源文件不爱影响。删除原文件,软链接无法访问
f) 软链接可以连接文件,也可以连接目录,可以跨分区
g) ln 源文件 目标文件:硬链接
- 硬链接
a) 拥有相同的I节点和存储Block块,可以看做是同一个文件
b) 修改任何一个文件,另一个都改变
c) 删除任何一个文件,另一个都能访问
d) 硬链接文件和原文件的Inode号一致,只有这个标记代表硬链接,很不容易找到
e) 不能链接目录,不能跨分区
f) 删除源文件,快捷方式文件还可以访问,这就是跟软链接的区别
g) ln –s 源文件 目标文件:软链接,文件名都必须要写绝对路径
alias:别名
alias(a里儿死) :别名(照顾管理员的使用习惯)
alias :查询系统现有别名
alias ser(别名)=“命令” :给命令起个别名,方便使用
注意事项
命令行临时生效,永久生效需要写入对应的系统文件
别名的优先级高于系统命令,除非必要时不能和命令名重叠
权限位
- “.”权限图后面的.是SELinux,用来限制管理员的权限,保护系统
权限位为10位
- 第一位:文件类型
a) - :普通文件
b) d :目录文件
c) l :链接文件
d) b :块设备文件
e) c :字符设备文件
f) s :套接字
g) p :管道
注意:常用是前三个文件类型,后四个是特殊文件类型
- 后九位才是权限
a) 后九位分类
- 前三位为:属主或所有者权限,“u”代表
- 中三位为:属组权限,“g”代表
- 后三位为:其他人权限,“o”代表
b) 三位权限分类
- “r”:读,“4”代表
- “w”:写,“2”代表
- “x”:执行,“1”代表
修改权限(chmod)
- chmod(撑技莫的) :修改权限。路径:/bin/chmod/。执行权限:所有用户
a) chmod 权限 文件名:修改权限
b) chmod 755 abc
c) chmod 644 abc
chmod u+x aa 给aa文件的所有者添加x权限
chmod g+w,o+w aa 给aa文件的所属组和其他人添加w权限
chmod u=rwx aa 给aa文件的所有者赋予rwx权限
chmod 644 aa 修改aa文件的权限为755,对应为rw-r--r--
常见权限
- 644权限:标准文件权限
- 755权限
a) 文件:执行权限
b) 目录:标准权限
- 777权限:代表最大权限。服务器不允许出现最大权限
- 467权限:代表最小权限。只有在实验中使用
权限的意义(读写执行基本权限)
- 权限对文件的含义
a) r :读取文件内容(cat,more.head,tail)
b) w :编辑,新增,修改文件内容,但是不包含删除文件,要是要删除文件,需要在文件的当前目录中删除文件(vi,echo)
c) x :文件可执行
注意:要想删除文件需要拥有w目录的权限,因为删除文件是在目录中删的
- 权限对目录的含义
a) r :可以查询目录下文件名
b) w :具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(tovch,rm,mv,cp)
c) x :可以进入目录(cd)
对文件有写权限,只代表可以修改这个文件的内容;要想删除文件,需要对文件所在目录有写权限
只要对目录有写权限,目录中的文件,就算是root创建的,普通用户一样能删除
目录一般都同时有r-x权限,如果一个目录只有r却没有x,你能用ls查看,却不能cd 进去!(用普通用户测试)
权限命令
- chown(撑技O能):属主和属组命令,路径:/bin/chown/,权限:所有用户
a) chown 用户名 文件名 :改变文件属主者/所有者。 (例:chown user1 aa )user1必须存在
b) chown :用户名 文件名:修改属组者(例:chown :user1 aa)
c) chown 用户名:用户名 文件名 :改变属主/所有者同时改变属组,(例:chown user1:user1 aa)
例:
chown user1 aa :将aa文件的所有者修改为user1用户
chown user1:user1 aa :将aa文件的所有者修改为user1用户并且所属组修改为user1组
chown :user1 aa:将aa文件的所属组修改为user1组
- chgrp 属组名 文件名:改变属组,路径:/bin/chgrp/,权限:所有用户
例:
chgrp adm file1:改变文件file1的所属组为adm
用户的建立
- whoami(好咪) :查询当前用户的等级,是普通用户还是管理员
- user(优蛇)add(按的) 用户名 :建立用户
- passwd 用户名 :创建密码
退出远程管理:logout (落狗儿刺)
权限的注意事项
- 文件目录的最大权限
a) 文件最大权限:x权限
b) 目录最大权限:w权限
- 目录可用权限
a) 0:最小权限
b) 5:基本权限,可进入,可查看。
c) 7:完整权限
- 普通用户可以改文件和目录,前提是普通用户对文件或目录有所有者权限,要是要转移文件,就要有超级用户同意。
- 普通用户能改权限,不能改所有者是谁,管理员可以更改
- 管理员拥有最高权限
- 注意:文件是谁建立的,所有者的权限就是谁的,要是一个用户在一个文件拥有所有者跟属组。那所有者的权限优先。(所有者的权限是给创建文件的人,属组者是给普通用户的)
系统文件目录默认权限
- umask(u骂死可) 权限:修改系统文件和目录的默认权限,路径:shell内置命令,权限:所有用户。(umask 644 临时修改umask值)
- umask :查看当前系统文件跟目录的默认权限。 (-S(大写)以字母显示权限)
- umask所在的环境变量配置文件:/etc/profile
- 文件跟目录
a) 文件:
- 666减去022等于644,按下面的计算
- –wr-wr-wr- 减去 -----w--w- 等于 –wr--r--r-
b) 目录:
- 777减去022等于755,按下面的计算
- wrxwrxwrx 减去 -----w--w- 等于 wrx-rx-rx
- 系统文件的默认权限是:644
- 系统目录的默认权限是:755
- 普通用户的umask值是500
- 超级用户的umask值是0
总结:Linux的安全机制,不给新建文件x权限。
帮助命令(help,lnfo,man)
- help(虾O破 虾:说本地话) 命令,路径:Shell内置命令
a) help 内部命令 :查看内部命令帮助
b) 命令 --help :查看命令的常见选项
- -q 隐藏文件名
- -v 显示文件名
- -c 显示字节数
- -n 显示的行数
- Info (音否) 命令
a) 回车:进入子帮助页面(带有*号标记)
b) u :进入上层页面
c) n :进入下一个帮助小节
d) p :进入上一个帮助小节
e) q :退出
- man(慢的)命令,路径:/bin/man/
a) man 命令 :查看命令帮助
b) man 级别 命令 :查看命令在级别分类中的命令
c) whatis 命令 :查看命令拥有那些特别的帮助
查找命令
- which(划去 划:说本地话) 命令名 :查找命令的命令,能看到相关别名跟路径,路径:/usr/bin/which。
- whereis 命令名 :查找命令的命令,同时看到帮助文档位置,路径/usr/bin/whereis。
- locate (露K刺) 文件名 :按照文件名查找,按照数据库查找,路径:/usr/bin/locate
a) updatedb(O破强) :强制更新数据库
b) /var/lib/mlocate :命令所搜索的后台数据库
c) /etc/updated.conf :配置文件,用于定义locate命令
d) PRUNE_BIND_MOUNTS=”yes”:开启搜索限制
e) PRUNEFS= :搜索时,不搜索的文件系统
f) PRUNENAMES= :搜索时,不搜索的文件类型
g) PRUNEPATHS= :搜索时,不搜索的路径
注意:有些系统文件打开后出现的是乱码,这是为了保护系统安全
find 搜索命令
- 按照文件名查找
a) find(返的) 查找位置 –name 文件名 :按照文件名查找(例:find / -name aabbcc)
- 按照时间查找
a) –ctime :按照文件状态修改时间(天)change
b) –mtime :按照文件数据修改时间 modify
c) –atime :按照访问时间 acces
注意:-4指的是前三天
+4指的是前五天
d) 例:find / -ctime +4
按天 :ctime atime mtime
按分钟 :cmin amin mmin
c change #表示属性被修改过:所有者、所属组、权限
a access #被访问过(被查看过)
m modify #表示内容被修改过
例:
find /etc -mmin -120 :120分钟内内容被修改过的
find /etc -ctime +7 :七天之前属性被修改过的文件
- 按照用户
a) –uid 数字 :按照用户属主ID查找文件
b) –gid 数字 :按照属组组ID查找文件
c) –user 用户名 :按照属主用户名查找文件
例
find /home -user lisi
在/home中,查找所有lisi用户的文件
注意,在系统中需要存在此用户,否则报错
d) –group 组名 :按照属组组名查找文件
e) –nouser :找没有属主的文件(常用)
f) 例:find / -nouser
- 按照文件权限
a) –name :按照文件名
b) –size :按照文件大小,不能加小数点,(单位:k(小写),M(大写))(+50k:大于50k。-50k:小于50k。50k:等于50k。)(例:find / -size +50k )
单位是数据块 一块是512字节
1M -> 1024k -> 2048块 (1块是0.5k 也就是512字节)
100M -> 102400k -> 204800块
例:
find /etc -size -10k 查找小于10k的文件
find /etc -size +2M 查找大于2M的文件
注意+-号,如果没有,是精确这么大,通常都会带上+或-号,表示一个范围
c) –type 类型 :按文件类型查找,(f:普通。d:目录。l:链接)
d) –perm 755: 按照权限查找(例:find . –perm 644) (-400:只要比这个权限大,包含在内的就会列出所有来) (+400:只要有一个包含你写的权限就会显现出来)
e) –inum :按照i节点查询 (例:find . inum 节点数)
f) –iname :按照文件名查找,不区分大小写
通配符跟正则表达式
- 通配符:用于匹配文件名,完全匹配
a) * :用于匹配任意内容
b) ?:用于匹配任意一个内容,必须有一个,不然是出不来的
c) [] :用于匹配中括号内任意一个内容:[a-z]任意一个小写字母,[A-Za-z] 任意一个字母,[0-9]任意一个数字
- 正则表达式:用于匹配文件中的字符串,是包含匹配
a) * :前一个字符重复任意多次
b) ?:前一个字符重复1次或0次
c) [] :匹配中括号中任意一个内容:[a-z]任意一个小写字母,[A-Za-z] 任意一个字母,[0-9]任意一个数字
Linux没有所有者的正常文件
- 外来文件(光盘,U盘,移动硬盘,网络文件)注意:目录显示包含30120的目录不是垃圾文件,是正常文件
- 极少数的内核直接产生的文件(/proc/sys/net)
注意:要是不在这2行内的文件,要很注意。有可能是入侵文件
-exec命令的叠加查询
-exec :find 目录 –perm(第一种命令) -444 -exec ls(第二种命令) –l {} \ ;
命令一的执行结果作为命令二的操作对象
例:find . –size +5k -exec ls -lh {}\;
find ... -exec 命令 {} \;
{}表示find查询的结果集
\是转义符,不使用命令别名,直接使用命令本身
;分号是表示语句的结束
注意:固定格式,只能这样写。注意中间的空格。
逻辑跟运算
find . –type f -a -size +2k 注意(-a=AMD)
逻辑与运算,两个条件都成立才成立
find . –type f -o -size +2k 注意(-o=OR)
逻辑或运算,两个条件成立一个,就成立
逻辑连接符:
-a (and 逻辑与)
-o (or 逻辑或)
例:find /etc -size +1k -a -size -10k
在etc目录下查找大于1k并且小于10k的文件
find跟grep的意义
- find:在系统当中,搜索符全条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配。
- grep:在文件当中,搜索符合条件的字符串,如果需要匹配,使用正则表达式匹配,正则表达式是包含匹配
grep
- grep “字符串” 文件名 :查找符合条件的字串行,路径:/bin/grep/。(例:grep “root” /etc/passwd)
- grep -i “字符串” 文件名 :查找的时候忽略大小写 (例:grep -i “root” /etc/passwd)
- grep -v “字符串” 文件名 :查找的时候反向查询 (例:grep -v “root” /etc/passwd)
- grep -o “字符串” 文件名 : 统计有几个关键字 (例:grep -v “root” /etc/passwd)
注意事项:
尽量不要在根目录/中查找,查找得慢,会占用太多服务器资源
如果需要在服务器中全盘查找,可以写一条计划任务在凌晨执行(计划任务后面讲)
查找范围越小越好,匹配条件,越精准越好
转义符的作用是什么?
在linux中有一个别名机制,如rm删除文件,执行的却是rm -i(用which rm 可以查看命令别名),使用rm删除文件前会提示,就是因为rm -i这个参数。如果想使用命令原意,可以在加\转义,
如:\rm test.txt 则不会提示,直接删除
管道符
cat install.log | grep lib
在显示文件的结果中,grep搜索含有lib的行
命令1 | 命令2 命令1的结果,作为命令2的操作对象
管道符例子
- || /etc/ | more
把第一个命令的结果放在一个临时文件里,第二个命令处理这临时文件,这临时文件本来是不存在的
- || /etc/ | grep yum
第二个命令从第一个命令的临时文件中搜索包含“yum”这个的文件名
- netstat -auln | grep 80
如何按关键字查询端口
- netsat -an | grep EATBLISHED | ws -l
第一命令查询系统网络状态,第二命令用第一命令的查询结果来查询关键字,第三个命令用第二命令的结果来统计数量
判断服务器正在连接的有多少统计
netstat查看系统网络连接状态
- netstat:查看系统网络状态
a) –t:查看tcp协议端口
b) –u:查看udp
c) –l:监听
d) –n:以ip和端口号显示,而不是主机名和协议名
e) -a 显示所有socket,包括正在监听的。
f) -c 每隔1秒就重新显示一遍,直到用户中断它。
g) -i 显示所有网络接口的信息,格式同“ifconfig -e”。
h) -r 显示核心路由表,格式同“route -e”。
i) -v 显示正在进行的工作。
ps aux :查看进程
- 常见网络端口:
a) 20 21 :ftp服务,文件共享
b) 22 :SSH服务,安全运维网络管理
c) 23 :telnet服务
d) 25 :smtp:简单邮件传输协议,发信
e) 110 :pop3:邮局协议,收信
f) 80 :www:网页服务
g) 3306 :Mysql端口
h) 3389 :windows终端服务
i) 53 : DNS端口
- /ect/services :所有系统常见端口
a) 端口数量:
- Tcp :65535
- Udp :65535
- telnet ip 端口 测试端口是否可以正常连接
a) ctrl+] ------------ quit 退出方式
- netstat -tlun :查看本机所有监听端口
a) –t tcp -u udp -l 监听 -n 以IP和端口号显示
压缩和解压缩
“.zip” “.gz” “.bz2” Linux可以识别的压缩格式
常见压缩格式:
.zip .gz .bz2 linux可以识别的常见压缩格式
.tar.gz .tar.bz2 常见的压缩和打包格式
- “.zip”( Z破)格式,路径:/usr/bin/zip
a) zip :是为了跟windows通用的一种格式,用的不多
b) zip 压缩文件名 压缩文件 :压缩,不删除原文件
c) zip -r 压缩目录名 压缩目录 :压缩目录 (例:zip -r test.zip /test ) -r:压缩目录
d) unzip 压缩包 :解压缩。路径:/usr/bin/unzip
- “.gz”格式,路径:/bin/gzip/
a) “.gz”格式 :不会打包,要是强制打包,只会打包目录下的所有文件
b) gzip 源文件名 :压缩,不会保存源文件。
c) gzip -c 源文件名 > 压缩文件 :强制保留源文件。(例:gzip -c cangls > cangls.gz)
d) gzip -r 源目录 :不能压缩目录,压缩目录下所有内容
e) gzip -d 压缩包 :解压缩
- “.bz2”格式,路径:/usr/bin/bzip
a) “.bz2”格式:不能压缩目录。
b) bzip2 源文件 :压缩 (例bzip2 aa)
c) bzip2 -k 源文件 :压缩之后保留源文件
d) bzip2 -d 压缩文件 :解压,(例:bzip2 -d aa.bz2) -k保留压缩文件。
- “tar”打包命令,路径:/bin/tar/
a) 不压缩,只打包
- tac -cvf 打包文件名 源文件 :打包 (例:tar -cvf aa.tar aa )-c打包,-v显示打包过程,-f指定生产的文件名
- tar -xvf :打包文件名 (例:tar -xvf aa.tar) -x 解打包
b) 压缩同时打包“tar.gz”/”.gz”格式
- tar -zcvf 压缩文件名 源文件 :压缩时打包 (例:tar -zcvf aa.tar.gz aa) -z 识别.gz格式
- tar -zxvf 压缩文件名 :解压缩同时解打包 (例:tar -zxvf aa.tar.bz2 )
c) 压缩同时打包“tar.bz2”/”.bz2”格式
- tar -jcvf 压缩文件名 源文件 :压缩同时打包 (例:tar -jcvf aa.tar.bz2 aa)
- tar -jxvf 压缩文件名:解打包同时解压缩 (例:tar -jxvf aa.tar.bz2 aa)
d) 查看不解包
- tar -ztvf 压缩文件名 :只查看,不解压 (例:tar -ztvf aa.tar.gz)tar.gz格式
- tar -jtvf 压缩文件名 :只查看,不解压 (例:tar -jtvf aa.tar.bz2)tar.bz2格式
- -z 识别.gz格式
- –j :识别 .bz2
- –v : 显示打包过程
- –f :指定打包后的文件名
- –t :只查看,不解压
e) 指定解压缩文件位置
- tar -jxvf 压缩包 -C /目标目录/ :指定解压缩位置(例:tar -jxvf toot.tar.bz2 -C /tmp/ )
- tar -jxvf 压缩包 -C /要解压的文件名/ :解压指定文件。
注意:按上面例子,压缩包 –C之间只能有一个空格,多个空格报错。
常用网络命令
- w :查询当前登录服务器的所有用户,路径:/usr/bin/w
a) 登录终端
- 本地终端:
- tty1-tty6:本地字符终端:相当可以在开6个实际的操作界面,切换:按Alt+F1-F6
- tty7:本地图形终端:要求安装Linux图形界面,可以拥有另一个操作界面,切换:Ctrl+Alt+F7要按住3秒
- 远程终端:
- pts0-pts255 :远程终端最多支持255个
- who :查询登录用户的详细,路径:/usr/bin/who
- last :列出登录系统的相关信息,路径:/usr/bin/last
- lastlog :显示所有帐户最后一次登录时间,路径/usr/bin/lastlog
- write 用户名 :给在线用户写信息,路径:/usr/bin/write
a) 例:write root tty1 :写内容给tty1登录的root,
b) 按ctrl+d,保存,发送
- wall :对所有在线用户说话,路径:/usr/bin/wall/
a) 按ctrl+d,保存,发送
- ping :测试网络连通性,/bin/ping/
a) ping -c 次数 ip :探测网络通畅
b) ping -s 65536 ip :指定探测数据包的大小
c) ctrl+c :强制终止
d) 虚拟机不同:
- 确实IP地址
- 防火墙
- 确实虚拟机网卡连接方式
- ifconfig :查询本机网络信息,/sbin/ifconfig/,权限:root
a) ifconfig eth0 192.168.140.252.netmask 255.255.255.0 临时生效。 eth0,eth0:0第一块网卡和第一模拟网卡
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
ifconfig eth0 192.168.1.1/24
ifconfig eth0:0 192.168.1.2 设置网卡子端口
ifconfig命令
ifconfig (参数)
add<地址>:设置网络设备IPv6的ip地址;
del<地址>:删除网络设备IPv6的IP地址;
down:关闭指定的网络设备;
<hw<网络设备类型><硬件地址>:设置网络设备的类型与硬件地址;
io_addr<I/O地址>:设置网络设备的I/O地址;
irq<IRQ地址>:设置网络设备的IRQ;
media<网络媒介类型>:设置网络设备的媒介类型;
mem_start<内存地址>:设置网络设备在主内存所占用的起始地址;
metric<数目>:指定在计算数据包的转送次数时,所要加上的数目;
mtu<字节>:设置网络设备的MTU;
netmask<子网掩码>:设置网络设备的子网掩码;
tunnel<地址>:建立IPv4与IPv6之间的隧道通信地址;
up:启动指定的网络设备;
-broadcast<地址>:将要送往指定地址的数据包当成广播数据包来处理;
-pointopoint<地址>:与指定地址的网络设备建立直接连线,此模式具有保密功能;
-promisc:关闭或启动指定网络设备的promiscuous模式;
IP地址:指定网络设备的IP地址;
网络设备:指定网络设备的名称。
启动关闭指定网卡:
ifconfig eth0 up
ifconfig eth0 down
为网卡配置和删除IPv6地址:
ifconfig eth0 add 33ffe:3240:800:1005::2/64 #为网卡eth0配置IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/64 #为网卡eth0删除IPv6地址
用ifconfig修改MAC地址:
ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE
配置IP地址:
[root@localhost ~]# ifconfig eth0 192.168.2.10
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
启用和关闭arp协议:
ifconfig eth0 arp #开启网卡eth0 的arp协议
ifconfig eth0 -arp #关闭网卡eth0 的arp协议
设置最大传输单元:
ifconfig eth0 mtu 1500 #设置能通过的最大数据包大小为 1500 bytes
mail(收信,发信)
a) mail :收信
- 1,2:查看对应邮件
- h :列出邮件标题
- q :退出
b) 邮件保存位置:/var/spool/mail/root/
- 没看邮件保存位置:/var/spool/mail/root/(老式)
- 看过邮件保存位置:~/mbox/(老式)
c) mail 用户名 :发信
- 标题
- 内容
- 按Ctrl+d 发送
shell中的发信
直接调用mail命令发送邮件
echo "mail test" |mail -s "tsest a" destination@csair.com
发送带附件的邮件, -a 参数
echo "jboss log of yesterday as attachment" |mail -s "jboss server logs" -a $logDir.tar.gz destination@csair.com
模拟网卡
- cd /etc/sysconfig/netnork-scripts/:进入网卡配置目录
- cp ifcfg-etho ifcfg-eth0:0 :复制新的网卡配置文件
- vi ifcfg-eth0:0 :进入配置文件
- DEVICE=eth0:0 IP地址 :更改DEVICE和当前IP地址
- service network restart :重启网卡服务
关机-重启命令
- 关机命令
a) sync :数据同步,把内存中数据强制保存进硬盘,建议关机前使用
b) shutdown -h now :关机命令,建议使用。路径:/sbin/ shutdown/,权限:root
- shutdown -h 05:50 :定时关机
c) init 0 :关机
d) halt :关机
e) poweroff :关机
- 重启命令
a) shutdown -r now :重启命令
- Shutdown -r 05:50:定时重启,不建议使用
b) reboot :重启命令,路径/sbin/reboot/,权限:root
c) init 6 :重启命令
挂载命令
Linux所有存储设备都必须挂载使用,包括硬盘
常见的存储设备:
/dev/sda1 第一个scsi硬盘的第一分区
/dev/cdrom 光盘
/dev/sr0 光盘 centos 6.x
常用挂载点:
/mnt
/media
/cdrom
- mount :挂载,路径:/bin/mount/
- mount -a :依据配置文件/etc/fstab的内容,自动挂载
挂载格式:
mount [-t 文件系统类型] [-o 特殊选项] 设备文件名 挂载点
选项:
-t :文件系统:加入文件系统类型来指定挂载的类型,可以ext3、ext4、iso9660 等文件系统。
-o :特殊选项:可以指定挂载的额外选项,比如读写权限、同步异步等,如果不指定则默认值生效。
-o loop :挂载光盘文件
- \ :换行符,代表这一行没有写完,换行
- mount :查看系统中已经挂载的文件系统,注意有虚拟文件系统
- noexec/exec:权限
a) mount -o remount,noexec /boot :重新挂载/boot分区目录,并使用noexec禁止使用执行文件权限
b) mount -o remount,exec /boot :重新挂载/boot分区目录,并使用exec恢复使用执行文件权限
- mkdir /mnt/disk1 :建立挂载点目录
- mount /dev/sdb1 /mnt/disk1 :挂载分区
光盘挂载
- 光盘设备名:
a) Redhat5.x 以前 /dev/hdc
b) Redhat6.x 以后 /dev/sr0
- mount -t 文件系统 设备描述文件 挂载点(已经存在空目录):挂载光盘 (例:mount -t iso9660 /dev/cdrom /mnt/cdrom)
- mount /dev/sr0/ /mnt/cdrom/ :挂载光盘
- umount /dev/cdrom:卸载光盘。强调:退出挂载目录,才能卸载
U盘挂载
- fdisk -l :查看所有分区。确实存储设备的设备文件名
- mkdir /mnt/usb/ :建立挂载点(手工随意指定)
- mount -t vfat /dev/sdb1 /mnt/usb :使用vfat文件系统,挂载第二块scsi硬盘的第二个分区(U盘被识别为sdb1)
- mount /dev/sdb1 /mot/usb :挂载U盘
- umount /dev/sdb1:退出U盘
- mount -o iocharset=utf8 /dev/sdb1 /mnt/usb :挂载的时候,修改为中文字幕
注意:Linux默认不识别windows的NTFS文件格式,如果要使用必须重新编译内核
卸载:
umount 设备名称或者是挂载点
#所有的挂载的设备卸载方式都一样
挂载注意事项
- 挂载建议使用原目录,因为软链接目录在修复模式,特殊模式等无法使用
- 如果挂载的目录里面有数据,那一旦挂载原目录的数据会隐藏,简单说,就是挂载后系统把目录的名称给了挂载点作为入口使用,所以原目录就失去了目录名称,所有系统就找不到原目录的位置。原目录的数据,要等到卸载挂载点后才可以找到
Shell使用小技巧:
- 补齐功能
a) 补齐功能允许用户输入命令名或文件名起始的若干个字母后,按Tab键补齐命令名或文件名。
- 命令历史
a) 命令历史允许用户浏览先前输入的命令并重新调用它们,用history命令可以显示命令列表,按方向键↑和↓可查找以前执行过的命令。!命令前缀
- 命令别名定义:
a) 范例:
- alias copy=cp
- alias dirrm= ‘rm -rf ’
- .bashrc 永久生效(家)
- 查看别名信息:alias
- 删除别名:unalias copy
Linux的驱动
- 直接集成到内核
- 保存在硬盘,以模块的方式加载
- 保存在硬盘上。以模块形式保存,但是默认加载(NTFS需要重新编译内核)
- 手工安装驱动,一般不需要手工安装,如果需要手工安装的就百分之80安装不了
注意事项
- 中文支持
a) 安装中文字体和编码
b) 终端或传输协议需要支持的‘
- echo $LANG :显示当前字体
- LANG=zh_CN.UTF-8 :强制更改为中文字幕
配置文件:
a) /etc/fstab :自动挂载配置文件
b) /var/lib/mlocate/mlocate.db
c) /etc/updated.confl
服务器管理规范:
越是安全等级要求高的服务器,越是严格限制用户等级,不能所有人都是root,远程服务器不能关机+重启。
服务器不允许在负载高峰执行高负载命令。例如杀毒、大数据压缩解压缩,复制,全盘搜索
*************************************
VIM编辑器
Vim编辑器简介
Linux图形化界面下的文本编辑器
gedit 、 libre office 、 evince PDF阅读器
①gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。它使用GTK+编写而成,因此它十分的简单易用,有良好的语法高亮,对中文支持很好,支持包括gb2312、gbk在内的多种字符编码。gedit是一个自由软件。
②LibreOffice是OpenOffice.org 办公套件衍生版, 同样免费开源,以Mozilla Public License V2.0许可证分发源代码,但相比OpenOffice增加了很多特色功能。LibreOffice拥有强大的数据导入和导出功能,能直接导入PDF文档、微软Works、LotusWord,支持主要的OpenXML格式。软件本身并不局限于Debian和Ubuntu平台,OpenXML格式Windows、Mac、PRM packageLinux等多个系统平台。
③Evince是一套文件阅读工具,可以用来阅读许多种格式的资料,像是Postscript、PDF 或是其他格式的文件
文本编辑器的作用:
创建或者修改文本文件
维护Linux系统中的各种配置文件
常用版本
a) vi :类Unix系统中默认的文本编辑器
b) vim :vi编辑器的增强版本,习惯上也称为vi
c) vim 全屏幕纯文本编辑器
d) vim 是vi的升级版
vim的使用
命令模式、输入模式、末行模式
三种模式之间的互相切换方式
插入命令
e) a :在光标所有字符后插入,(追加)
f) A :在光标所有行尾插入
g) i :在光标所有字符前插入,(插入)
h) I :在光标所有行行首插入
i) o :在光标下插入新行,打开新行
j) O :在光标上插入新行
命令模式操作
k) 移动光标
- h :向左移动
- j :向下移动
- k :向上移动
- l :向右移动
l) 把光标移动到文件头或文件尾
- gg :移动光标到文件头
- G :移动光标到文件尾
- shift+g :移动光标到文件尾
m) 把光标移动到行首或行尾
- shift+^ :移动到行首
- shift+$ :移动到行尾
n) :n :移动到第几行 (例: :30 :移动到第30行)
- o) 删除字母
- x :删除单个字母
- nx :删除n个字母(例:要删除5个,先按数字5在按x)
p) 删除整行,剪切,(删除相当剪切)
- dd :删除单行
- :n1,n2d :删除指定范围的行 (例:2,5d :删除第二行到第五行的数据)
- ndd :删除多行 (要删除5行,先按数字5在按dd)
- p :粘贴 (粘贴刚刚删除的数据,删除相当剪切)
- P大 :粘贴到光标前(粘贴刚刚删除的数据,删除相当剪切)
q) 复制(用p/P粘贴)
- yy :复制一行
- nyy :复制多行 (要复制5行,先按数字5在按yy)
- dG :从光标所有行删除到文件尾
r) 撤销
- windows
- ctrl+z :撤销
- ctrl+y :反撤销
- Linux
- U :撤销
- ctrl+r :反撤销
s) 替换
- r :替换光标所在处的字符
- R :从光标所在处开始替换字符,按ESC结束
t) 显示行号
- :set nu :显示行号(临时设置,要永久就要去配置文件:~/.vimrc里面设置)
- :set nonu :不显示行号
u) 颜色开头
- :syntax off :关闭颜色
- :syntax on :开启颜色
v) 查找,掌握
- / :查找内容,默认向下查找
- n :下一个
- N :上一个
w) 批量替换
- 1,10s/old/new/g :替换1到10行的所有old为new
- %s/old/new/g :替换整个文件的old为new
注意:g 的范围内所有old换为new
x) 批量注释
- :1,5s/^/#/g :注释1到5行
- :1.5g/^#//g :取消注释
- :1.5s/^/\/\//g :文件头加入//注释
- :1,5s/^/\/\//g :文件头取消//注释
vim 使用技巧
y) 在vim中导入其他文件内容或命令结果
- :r 文件名 :导入其他文件内容,要在命令模式
- :! 命令 :在vim中执行系统命令
- :r !命令 :导入命令执行后的结果
vim 多文件模式
z) vim -o 文件1 文件2 :同时打开二个文件(列表模式)。按ctrl + w + 向下键 切换
aa) vim -o 文件1 文件2 :同时打开二个文件(对列模式)。按ctrl + w + 向右键 切换
配置文件
ab) ~/.vimrc :vim的配置文件,注意:刚开始的话,些文件是不存在的,是新建立的
ac) ~/.bashrc :环境变量配置文件:别名
快捷键
ad) :map 快捷键 快捷键执行的命令 :设定快捷键执行的命令
例:
注意:临时生效,要永久生效,需要写入 ~/.vimrc 文件里
例1:
:map ^P I#<esc>
当输入ctrl+p快捷键时,执行在首行添加#注释
^P 不能手动输入,需要执行ctrl+V+P 来定义。或者ctrl+V,然后ctrl+P
例2:
:map ^B ^x
当输入ctrl+B快捷键时,光标会移动到行首,然后删除一个字符
例3:
:ab mymail liuchuan@itxdl.cn
注:如果想让这些快捷键永久生效,可以写入vim的配置文件。
替换
ae) :ab 源字符 替换字符 :替换,按空格键或回车键替换
af) :ab mymail shenchao@lampbrother.net
ag) 输入mymail 时按回车键就会变成shenchao@lampbrother.net
注意:临时生效,要永久生效,需要写入 ~/.vimrc 文件里
*************************************
软件安装
软件包分类
- 源码包
- 二进制包
- 脚本安装包:不算
软件包类型
- 二进制包(二进制封装包)
a) rpm软件包 扩展名为“.rpm”
b) dpkg软件包 扩展名为“.deb”
- 源代码包(tar包)
a) 一般为“.tar.gz”、“.tar.bz2”等格式的压缩包,包含程序的原始代码
- 附带安装程序的软件包
a) 在压缩包内提供install.sh、setup等脚本安装程序
b) 绿色免安装软件包
c) 在压缩包内提供已编译好的执行程序,解压到指定位置即可直接使用
源码包的特点
二进制包的分类
- 分类
a) DPKG包
DPGK是Debian Packager的简写,Debian提供的一种软件包管理系统,用于安装、卸载、升级等操作,以*.deb作为软件包的后缀名。
b) RPM包
RPM是Red Hat Package Manager的缩写,Red Hat提供的一种软件包管理系统,用于安装、卸载、升级等操作,以*.rpm作为软件包的后缀名。
RPM优缺点
c) 优点
d) 缺点
二进制软件包的特点
专门的工具进行安装、卸载、升级和管理软件
安装简洁、速度快
经过封装,无法直接获取源代码
功能选择性差,功能定制不灵活
软件包的选择
- 如果软件包是给大量客户端访问的,建议源码包,因为源码包效率高(如LAMP)
- 如果软件是给本机访问的,或少量用户访问,建议RPM包
Linux软件包的命名
Linux软件包的命名也有一定的规律,一般遵循:名称-版本-修正版-类型
tree-1.2.3-4.x86_64.tar.gz
tree-1.2.3-4.el6.x86.rpm
软件名:tree
版本号:1.2.3
修订次数:4
适用系统:el5 el6 el7
应用平台:i386 i686 x86 x86_64 amd64 noarch不区分平台
软件类型:.rpm .deb .tar.gz 等
二进制软件包安装位置
/etc/ 配置文件保存位置
/usr/bin/ 软件命令保存位置
/usr/lib/ 函数文件保存位置
/usr/share/doc/ 使用手册保存位置
/usr/share/man/ 帮助文档保存位置
RPM包的依赖
- 树型依赖
- 环型依赖
- 模块依赖
a) 模块依赖:是安装包安装的时候指定的一个安装包,需要人们去官方网站:www.rpmfing.net 中查找
包名和包全名的区别
- 包全名:操作的是未安装软件包,使用包全名,并且需要绝对路径
- 包名 :操作的是已经安装的软件包,使用包名,可以不使用绝对路径,因为包名记录在rpm数据库中
rpm包的命名含义
- 包命名
rpm包的默认安装位置
rpm包安装命令
- rpm –ivh 包全名 :安装rpm包,注意一定要包命名
a) –i :install安装(install)
b) –v :显示理详细的信息(verbose)
c) -h :打包#显示安装进度(hash)
d) --test :测试安装,只是检测一下依赖性,不会实际安装
e) --force :强制安装。不管是否已经安装,都重新安装。就是--replacefi/es 和 –replacepkgs的综合,注意:用来要是系统中软件中的一个文件丢失可用--force修复,--force是只替换软件中没有的文件,其它文件的配置等都会保留
以下的可以作为参考,不建议使用
RPM包服务启动
- service 服务名 start :启动服务
- start :启动服务
- stop :停止服务
- restart :重启服务
- status :查看服务状态
- httpd服务的启动
a) service httpd start :启动服务
b) /etc/rc.d/init.d/httpd start :Linux各个版本通用的服务启动方法
c) 网页目录:/var/www/html/.index.html
d) 配置目录:/etc/httpd/conf/httpd.conf
e) 日志文件:/var/log/httgp/
注意:服务的标准启动方式:/目录/启动文件 restart
RPM包升级
升级命令:
格式:
rpm –Uvh 软件包全名
-U 升级安装,若没安装,则直接安装,若安装有旧版本,则升级安装
-F 升级安装,若没安装,则不安装,必须有旧版本,才进行升级安装
RPM包的卸载
- rpm -e 包名 :卸载,要是有依赖性就需要把包全都一一的卸载
a) --nodeps :不检查依赖性,不能使用
RPM包的查询
- 查询是否安装
a) rpm -q 包名 :查询包是否安装 (-q query)
b) rpm -qa 包名 :列出系统所有以安装包 (-a all)
c) rpm -qa | wc -l :查询一共多少包
d) rpm -qa | grep httpd :显示所有安装包
- 查询软件信息
a) rpm -qi 包名 :查询以安装包的信息
- -p :未安装包
b) Rpm -qip 包全名 :查询没有安装包的信息
- 查询包安装位置
a) rpm -ql 包名 :查询以安装包中间件的安装位置(-l list)
b) rpm -qlp 包全名 :查询未安装包打算安装到那位置的信息
- 查询系统文件属于那个包
a) rpm -qf 系统文件名 :查询系统文件属于那个包 (-f file)
- 查询包依赖的软件包
a) rpm -qR 包名 :查询已安装包的依赖包 (-R:requires)
b) rpm -qRp 包全名 :查询未安装包依赖包
RPM的验证
1. rpm -V 已安装的包名 :检验指定RPM包中的文件(v: verify)
指定软件安装后的完整性,及文件的元数据是否发生变化
2. rpm -Va :检验本机已经安装的所有软件包
3. rpm -Vf 系统文件名 :检验某个文件是否被修改
校验例证:
[root@lchuan ~]rpm -V httpd
.......T. c /etc/httpd/conf/httpd.conf
打印到屏幕上的信息共分为3部分:
第一部分为验证结果;第二部分为文件类型;第三部分为文件位置。
对称加密跟非对称加密
- 对称加密:
a) 自己把自己的文件加密,别人想要看这个文件,就需要跟所有者就是加密这个文件的人,索取密码
b) 相当于跟人共用一个密码,安全级别较低,安全系数在128-512之间
- 非对称加密
a) A跟B都有自己的公钥和私钥跟密码,公钥代表锁,私钥代表钥匙,密码代表密码锁。
b) A持有B的公钥,A给B发文件时用B的公钥加密,B就可以用自己的私钥和密码打开,因为是用B的公钥加密,所以这个加密文件就只有B才能打开
c) A持有B的公钥,A给B发文件时同时A跟B的公钥加密,这样A跟B都可以单独的打开加密文件。
d) 个人拥有密码,不怕外露
e) 加密等级较高,安全系数是1024左右
f) 验证公钥时需要安装CA数字证书,所有的公钥都是经过CA认证的才能拥有CA数字证书
g) 由第三方CA认证来保障公钥的可信度和安全度
数字证书
数字证书
刚刚的校验方法只能对已经安装的RPM包中的文件进行校验,但如果RPM包本身就被动过手脚,那校验就不能解决问题了,我们就必须使用数字证书验证。
数字证书的使用:
² 首先必须找到原厂的公钥文件,然后进行安装
² 然后安装RPM包时,会去提取RPM包中的证书信息,然后和本机安装的原厂证书进行验证
² 如果验证通过,则允许安装;如果验证不通过,则不允许安装并警告
RPM包中文件的提取
- 提取RPM包中的文件,提取指定包中指定文件
- rpm2cpio 包全名 | cpio -div .文件绝对路径
a) rpm2cpio :将rpm包转换为cpio格式的命令
b) cpio ß:是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
c) –idv :还原
d) .文件绝对路径:一定要有“.” 要是没有“.”就会覆盖系统路径,“.”是代表当前目录
- rpm2cpio 要提取的包全名 | cpio -div .要覆盖的文件路径(提取到当前目录)
- cp .刚刚提取文件路径 . 要覆盖的文件路径 (用刚才提取的文件复制到实际软件路径)
- cpio -idv :用于解决文件内容的错误
注意:要是命令中有2,就代表从2前的格式转换成2后的格式(例:rpm2cpio rpm格式 转换 cpio格式)
cpio命令主要是用来建立或者还原备份的工具,cpio命令可以复制文件到归档包中(压缩),或者从归档包中导出文件(解压缩)。
cpio的三种模式:
备份
格式:cpio –ovcB > [文件|设备]
-o:进入copy-out模式(压缩)
-v:显示过程
-c:使用portable format存储方式
-B:设定输入输出块为512bytes
例子:
cpio备份:
find /etc -print | cpio –ocvB > /root/etc.cpio
#利用find 找出/etc 然后备份到/root下
还原:
格式:cpio –idvcu < [cpio文件]
-i:进入copy-in模式(解压)
-d:恢复到指定位置(视压缩方式恢复)
-v:显示过程
-c:使用portable format存储方式
-u:替换所有文件,无提示
例子:
cpio还原
cpio –idvcu < /root/etc.cpio
注:由于备份时备份的路径使用的是绝对路径,所有恢复时会按照绝对路径恢复回去,所以不会在/root下生成文件。
例子2:
备份:
cd /etc #切换到/etc下
find . –print | cpio -ocvB > /root/etc.cpio
#以相对路径方式进行备份
恢复:
cd /root #切换到/root
mkdir test #创建恢复目录
cd test #进入恢复目录
cpio -idvcu < /root/etc.cpio
#恢复以相对路径备份的etc.cpio文件,内容会被恢复到/root/test/目录下。
10)rpm2cpio 提取RPM软件包中的文件
格式:rpm2cpio 包全名 | cpio –idv ./命令绝对路径
# ./ 是当前目录 + 命令的绝对路径是which查询出的绝对路径(必须)
例子:
假设不小心把系统下的/bin/ls 命令删除了,使用时报错了,需要恢复。
方案:
A、重新安装ls命令,使用--force选项强制执行
B、从相对应的软件包内提取ls 命令
步骤:
² 先确定ls 命令属于哪一个软件包
² 先模拟出ls命令被删除的样子
² 提取RPM包中的ls命令,并恢复到/bin 目录下(站到/目录下进行恢复)
yum常用命令
- yum -y install 包名 :安装
- yum -y remove 包名 :卸载,卸载带有依赖性,(如果卸载某个包,也许这个包就会有依赖性,就会把这个包被依赖的包卸载。)很危险
- yum -y update 包名 :升级,前提是要有新版本
- yum list :查询所有可以安装的包
- yum list 包名 :查询yum源服务器中是否包含某个软件包
- yum search 关键字 :搜索yum源服务器上所有和关键字相关的包
- yum info samba :查询指定软件包的信息
- yum list :查询yum源加更新数据库
yum组管理命令
- 查询可以安装的软件组
a) yum grouplist :列出所有可用的软件组列表
- 查询软件组内包含的软件
a) yum groupinfo 软件组名 :列出软件组中包含的软件 (例:yum groupinfo "Web Server" :查询软件组"Web Server"中包含的软件)
- 安装软件组
a) yum groupinstall 软件组名 :安装指定软件组 (例:yum groupinstall " Web Server " :安装网页服务软件组)
- 卸载软件组
a) yum groupremove 软件组名 :卸载指定软件组
yum搭建方式:
² 本地光盘源
² 局域网yum源
² 互联网yum源
搭建光盘yum源
- cd /etc/yum.repos.d/ :找到系统下的默认yum源
- mv CentOS-Base.repo CentOS-BS.repo.bak :更改系统默认yu源,可以用更改名称让系统识别不到。
注意:一般需要禁止的系统执行文件,基本都用改名来处理
a) 解释下yum源文件
- [base] :容器名称,一定要放在[]中
- name :容器说明,可以自己随便写
- mirrorlist :镜像站点,这个可以注释掉
- baseurl :我们的 yum 源服务器的地址。默认是 CentOS 官方的 yum 源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的 yum 源地址
- enabled :此容器是否生效,如果不写或写成 enable=1 都是生效,写成enable=0 就是不生效
- gpgcheck :如果是 1 是指 RPM 的数字证书生效,如果是 0 则不生效
- gpgkey :数字证书的公钥文件保存位置。不用修改
- mount /dev/sr0 /mnt/cdrom :挂载光盘
- vi /etc/yum.repos.d/CentOS-Media.rpo :进入光盘yum源的配置文件
a) baseurl=file:///mnt/cdrom/ :将第一行修改为光盘路径,要是有剩行就一一注释
注意:///:前//是代表协议,后/是代表根目录
b) enabled=1 :设置yum源文件生效
- yum list :查询yum源加更新数据库
- pkill -9 yum-updatesd :如果yum报错正在升级,执行此命令,强制杀死升级进程
- yum -y install gcc :gcc是c语言编译器,不装gcc,源码包不能安装
源码包安装问题
- 是否可以安装rpm包的Apache,又安装源码包的Apache?
a) 答案:可以的,因为安装的路径位置不同
- 在生产环境下,是否会同时安装两个Apache?
a) 答案:不会,因为系统只能启动一个
- 端口,是否可以修改?
a) 如果服务是给大量客户端访问的,不建议修改端口,如Apache
b) 如果服务只是给内部用户访问,建议修改端口,如ssh
- 到底选安装那个?
a) 答案:建议源码包
RPM包跟源码包的配置文件
- RPM包:Apache。用rpm -ql 包名 :查询包名的路径
a) 配置文件 :/etc/httpd/conf/httpd.conf
b) 启动脚本 :/etc/rc.d/init.d/httpd
c) 网页 :/var/www/html/
d) 日志 :/var/log/httpd/
e) 启动方式 :
- Service httpd start :启动
- /etc/rc.d/init.d/httpd start :启动
f) RPM包的伪用户:daemon
- 源码包:Apache。所有的源码包都在/usr/local/apache2/
a) 配置文件 :/usr/local/apache2/conf/httpd.conf
b) 启动脚本 :/usr/local/apache2/bin/apachectl
c) 网页 :/usr/local/apache2/htdocs/
d) 日志 :/usr/local/apache2/logs/
e) 启动方式 :
- /usr/local/apache2/bin/apachectl start
f) 源码包的伪用户:apache
源代码软件包特点:
最新的软件版本
根据用户需要,灵活定制软件功能
应用场合举例:
安装较新版本的应用程序时
当二进制软件无法满足需要时
编译安装可由用户自行修改、定制功能
需要为应用程序添加新的功能时
make命令
make命令是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率。
注意:使用前要先安装gcc(c语言编译包)
make (选项) (参数)
选项:
-f:指定“makefile”文件;
-i:忽略命令执行返回的出错信息;
-s:沉默模式,在执行之前不输出相应的命令行信息;
-r:禁止使用build-in规则;
-n:非执行模式,输出所有执行命令,但并不执行;
-t:更新目标文件;
-q:make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息;
-p:输出所有宏定义和目标文件描述;
-d:Debug模式,输出有关文件和检测时间的详细信息。
源码包安装
注意:一定要指定安装位置(除非指定安装位置会报错)
安装源码包前必须先安装gcc,gcc是c语言编译器
安装方式:yum -y install gcc
- 远程传输工具
a) winscp :绿化版工具,目前主流
b) xshell自带的文件传输工具:
- rpm -ivh /mnt/cdrom/packages/lrzsz-0.12.20.27.1.e16.i686:安装传输工具包
- rz :上传文件
- sz :下传文件
- 安装
a) 解压
b) cd 解压目录
c) 查看安装文档
- INSTALL :安装文档
- README :说明文档
- 编译前准备:
a) ./configure --prefix=/usr/local/apache2/
b) –prefix :指定安装位置
c) 检查系统环境是否符合安装要求
d) 自定义功能,最后生成Makefile文件
- 如何判断报错
a) 安装必须停止
b) 是否出现error,warning,no等关键字
- 编译 :make
a) 如果安装报错,就必须先用make clean命令,才能重新安装
- 编译安装:make install
a) 如果安装报错,不止要用make clean命令,还要删除安装位置注意error warning等错误报警
- 启动 :/usr/local/apache2/bin/apachectl start
a) 如何启动可以在安装文档中查询
b) 启动时有报错不用理
- 删除 :直接删除安装目录
源码包安装举例
准备环境:
yum 仓库
确认源代码编译环境
需安装支持 C/C++程序语言的 编译器
gcc-4.1.1-52.el5、gcc-c++-4.1.1-52.el5
make-3.81-1.1.i386 ……
安装步骤:
补丁
- 补丁的生成
a) diff 选项 old new :比较 old 和 new 文件的不同
b) 选项:
- -a 将任何文档当做文本文档处理
- -b 忽略空格造成的不同
- -B 忽略空白行造成的不同
- -I 忽略大小写造成的不同
- -N 当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件
- -r 当比较目录时,递归比较子目录
- -u 使用同一的输出格式
- 实验:
a) 分别创建old 和 new 两个文本文件,有相同的内容,也有不同的内容,形成对比。、
b) #创建两个文件,内容要有差别
c) diff -Naur /test/old.txt /test/new.txt > ./txt.patch
d) 打开生成的txt.patch,会发现new 比 old 多出来的两行被单独标记出来(用+号)
e) 比较下两个文件的不同,并生成补丁文件
- diff -Naur /root/test/old.txt /root/test/new.txt > txt.patch:比较两个文件的不同,同时生成 txt.patch 补丁文件
- 打入补丁
a) patch –pn < 补丁文件:按照补丁文件进行更新(例:patch -p3 < txt.patch patching file old.txt)
b) 选项:
- –pn n 为数字。代表按照补丁文件中的路径,指定更新文件的位置。
- -p:设置要剥离的目录层数
c) –p3 :用来删除补丁文件里面的目录,如/tmp/texe,删除:根,tmp,texe,三个目录,所以就是-p3
d) “-pn”不好理解,我们说明下。补丁文件是要打入旧文件的,但是你当前所在的目录和补丁文件中的记录的目录是不一定匹配的,所以就需要“-pn”来同步两个目录。比如我当前是在“/root/test”目录中(我要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为“/root/test/old.txt”,这时如果写入“-p1”(在补丁文件目录中取消一级目录)那么补丁文件就会打入“/root/test/root/test/old.txt”文件中,这显然是不对的。那如果写入的是“-p2”(在补丁文件目录中取消二级目录)那么补丁文件打入的就是“/root/test/test/old.txt”,这显然也不对。如果写入的是“-p3”(在补丁文件目录中取消三级目录)那么补丁文件就是打入的“/root/test/old.txt”,我们的 old.txt 文件就在这个目录下,所以就应该是“-p3”
实验:
patch -p2 < txt.patch
#按照补丁文件对old.txt 进行更新
脚本安装程序
- 脚本安装
a) webmin:是通过网页来管理Linux系统
b) ./setup.sh
- 安装时出现的选项意思
a) 安装位置
b) 日志位置
c) Perl安装位置
d) 端口
e) 管理员名
f) 管理员密码
g) 是否开启:自动启动
h) ssl:不启动
函数库管理
- 函数库分类
a) 静态函数库
- 函数库文件一般以“*.a”扩展名结尾。这种函数库在被程序调用时会被直接整合到程序当中
- 优点:程序执行时,不需要再调用外部数据,可以直接执行
- 缺点: 因为把所有内容都整合到程序中,所以编译生成的文件会比较大升级比较困难,需要把整个程序都从新编译
b) 动态函数库
- 函数库文件通常以“*.so”扩展名结尾。这种函数库被程序调用时,并没有直接整合到程序当中,当程序需要用到函数库的功能时,再去读取函数库。在程序中只保存了函数库的指向
- 函数库管理
a) 查询
- ldd -v 可执行文件名 :查询执行程序调用了那个函数库 (例:ldd /bin/ls :查询 ls 命令调用了哪些函数库)
- -v 显示详细版本信息
函数库一般可以直接在网上下载到,那么应该如何安装呢?
一般情况下函数库文件的存放位置是在/usr/lib/ 或 /lib 下;然后会在/etc/ld.so.conf 配置文件中记录 这两个目录或者新增加的目录,这个配置文件中只记录函数库存放目录,不记录实际函数库名称
b) 安装
- 安装介绍:我们新安装了一个函数库,如何让它被系统识别呢?其实软件如果是正常安装,是不需要手工调整函数库的,它们都会被正常安装。但是万一没有安装正确,需要手工安装呢?那也很简单,只要把函数库放入指定位置,一般我们都放在“/usr/lib”或“/lib”中,然后把函数库所在目录写入“/etc/ld.so.conf”文件。注意是把函数库所在目录名写入,而不是函数库的文件名
- 函数库存放目录:/usr/lib
- 函数库的写入文件:/etc/ld.so.conf
- cp *.so /usr/lib/ :把函数库拷贝入/usr/lib 目录
由于/usr/lib/已经被/etc/ld.so.conf配置文件记录所以不需要重写
3. 假有新的目录需要改写到/etc/ld.so.conf配置文件中,写完后需要刷新下缓存
ldconfig 刷新函数库配置文件缓存
-p 列出缓存中识别的所有的函数库
- vi /etc/ld.so.conf :修改函数库配置文件
- include ld.so.conf.d/*.conf :写入函数库所在目录(其实/usr/lib 目录默认已经被识别)
- ldconfig :从/etc/ld.so.conf 中把函数库读入缓存
- ldconfig –p:查询列出系统缓存中所有识别的函数库
补充
- date
a) date :查看系统时间
b) date –s 日期/时间 :修改系统日期,时间要另外在修改
c) date -s 时间/日期 :修改系统时间,日期要另外在修改
- ll -h 目录名:只能统计文件大小,不能统计目录,要是强制统计目录,只会统计目录的i节点和Block块的大小
- du
a) du -h 目录名 :查看目录下文件的大小,并统计目录的大小(统计文件大小,要是和df的结果不一样,建议重启系统)
b) du -sh 目录名 :只查看目录大小(统计文件大小,要是和df的结果不一样,建议重启系统)
- df -h :查看分区,是统计空间
- df跟du的区别
a) df :统计占用的空间大小,统计剩余空间是准确的
b) du :统计文件大小。统计的文件大小是准确的
*************************************
用户管理
Linux是基于用户身份对系统的资源进行管理的操作系统
用户和组的类型
用户帐号:UID(User Identity,用户标识号)
超级用户 UID:0 UID:0
系统用户 UID:1-499 UID:1-999
普通用户 UID:500-65535 UID:1000-65535
组帐号:GID(Group Identify,组标识号)
初始组(私有组)
附加组(公共组)
用户的六个信息文件
- 用户信息文件:/etc/passwd
- 影子文件 :/etc/shadow
- 组信息文件 :/etc/group
- 组密码文件:/etc/gshadow
- 用户邮箱目录 :/var/spool/mail
- 用户模板目录:/etc/skel/
用户信息文件:/etc/passwd
- 第一列:用户名
- 第二列:密码位
- 第三列:用户 ID
a) 用户 ID :0 超级用户 UID。如果用户 UID 为 0,代表这个账号是管理员账号。 那 Linux 中如何把普通用户升级成为管理员呢?就是把其他用户的 UID 修改为 0 就可以了,这点和 Windows 是不同的。不过不建议建 立多个管理员账号。
b) 用户 ID :1-499 系统用户(伪用户)UID。这些UID账号是系统保留给系统用户的UID,也就是说 UID 是 1-499 范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中 1-99 是系统保留的账号,系统自动创建。100-499 是预留给用户创建系统账号的。
c) 用户 ID :500-65535 普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 65535。这些用户足够使用了,但是如果不够也不用害怕,2.6.x 内核以后的Linux 系统用户 UID 已经可以支持 232 这么多了。
- 第四列:组 ID GID 添加用户时,如果不指定用户所属的初始组,那么会建立和用户名相同的组
添加用户时,如果不指定用户的初始组,则会自动创建和用户名相同的组。
- 第五列:用户说明
- 第六列:用户家目录 : 超级管理员root的家目录/root/;普通用户的家目录 /home/***
- 第七列:登录 shell /bin/bash
如何把普通用户变成超级用户:把用户 UID 改为 0
/bin/bash 能登录系统;/sbin/nologin 不能登录系统
影子文件 :/etc/shadow
- 第一列: 用户名
- 第二列: 加密密码
a) 我们也可以在密码前人为的加入“!”或“*”改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。
b) 注意所有伪用户的密码都是“!!”或“*”,代表没有密码是不能登录的。
c) 当然我新创建的用户如果不设定密码,它的密码项也是“!!”,代表这个用户没有密码,不能登录
- 第三列: 密码最近更改时间, 1970 年 1 月 1 日作为标准时间
a) 时间戳转日期
- [root@localhost ~]# date -d "1970-01-01 15775 days"
- 2013 年 03 月 11 日 星期一 00:00:00 CST
b) 日期转时间戳
- [root@localhost ~]# echo $(($(date --date="2013/03/11" +%s)/86400+1))
- 1577
- 第四列: 两次密码的修改间隔时间(和第 3 字段相比)密码最短有效期
- 第五例: 密码有效期(和第 3 字段相比)密码最长有效期
- 第六列: 密码修改到期前的警告天数(和第 5 字段相比)
- 第七列: 密码过期后的宽限天数(和第 5 字段相比)
- 第八列: 密码失效时间
a) 这里同样要写时间戳,也就是用 1970 年 1 月 1 日进行时间换算。如果超过了失效时间,就算密码没有过期,用户也就失效无法使用了
- 第九列: 保留
组信息文件 :/etc/group
- 第一列: 组名
- 第二列: 组密码位
- 第三列: GID 组ID号(GID)
- 第四列: 此组中支持的其他用户.附加组是此组的用户
a) 初始组:每个用户初始组只能有一个,初始组只能有一个,一般都是和用户名相同的组作为初始组
b) 附加组:每个用户可以属于多个附加组。要把用户加入组,都是加入附加组
组密码文件:/etc/gshadow
- 如果我给用户组设定了组管理员,并给该用户组设定了组密码,组密码就保存在这个文件当中。组管理员就可以利用这个密码管理这个用户组了。
用户的家目录
- 超级用户:默认在:/root 中
- 普通用户:默认在:/home/下的目录
用户邮箱目录
- 这 个 邮 箱 在 /var/spool/mail 目 录 当 中 ,
- 例 如 lamp 用 户 的 邮 箱 就 是/var/spool/mail/lamp 文件
用户模板目录
- /etc/skel/ :用来设置建立用户时的默认设置
添加用户:useradd 命令
- useradd 用户名 :创建用户
- useradd 选项 用户名
a) 选项:
- -u 550 指定 UID
- -g 组名 指定初始组 不要手工指定
- -G 组名 指定附加组,把用户加入组,使用附加组
- -c 说明 添加说明
6-d 目录 手工指定家目录,目录不需要事先建立
- -s shell /bin/bash.
b) 例:useradd -u 550 -g lamp1 -G root -d /home/lamp1 -c "test user" -s /bin/bash lamp1 :(建立用户 lamp1 的同时指定了 UID(550),初始组(lamp1),附加组(root),家目录(/home/lamp1),用户说明(test user)和用户登录 shell(/bin/bash))
- useradd -G user1 aa 添加用户 aa,指定附加组为 user1
useradd 默认值文件
- useradd 添加用户时参考的默认值文件主要有两个,分别是/etc/default/useradd 和/etc/login.defs
/etc/default/useradd
a) GROUP=100 :这个选项是建立用户的默认组,也就是说添加每个用户时,用户的初始组就是 GID 为100 的这个用户组。目前我们采用的机制私有用户组机制。
b) HOME=/home :这个选项是用户的家目录的默认位置,所以所有的新建用户的家目录默认都在/home/下。
c) INACTIVE=-1 :
- 这个选项就是密码过期后的宽限天数,也就是/etc/shadow 文件的第七个字段。如果是天数,
- 比如 10 代表密码过期后 10 天后失效;
- 如果是 0,代表密码过期后立即失效;
- 如果是-1,则代表密码永远不会失效。
- 这里默认值是-1,所以所有新建立的用户密码都不会失效。
d) EXPIRE= :
- 这个选项是密码失效时间,也就是/etc/shadow 文件的第八个字段。
- 也就说用户到达这个日期后就会直接失效。当然这里也是使用时间戳来表示日期的。默
- 认值是空,所以所有新建用户没有失效时间,永久有效。
e) SHELL=/bin/bash :
- 这个选项是用户的默认 shell 的。/bin/bash 是 Linux 的标志 shell,
- 所以所有新建立的用户默认都具备 shell 赋予的权限。
f) SKEL=/etc/skel :这个选项就是定义用户的模板目录的位置,/etc/skel/目录中的文件都会复制到新建用户的家目录当中。
g) CREATE_MAIL_SPOOL=yes :
- 这个选项定义是否给新建用户建立邮箱,默认是创建,
- 也就是说所有的新建用户系统都会新建一个邮箱,
- 放在/var/spool/mail/下和用户名相同。
/etc/login.defs
h) MAIL_DIR /var/spool/mail :
- 这行指定了新建用户的默认邮箱位置。比如 lamp用户的 邮箱是就是/var/spool/mail/lamp。
i) PASS_MAX_DAYS 99999 :
- 这行指定的是密码的有效期,也就是/etc/shadow 文件的第五字段。代表多少天之后必须修改密码,默认值是 99999。
j) PASS_MIN_DAYS 0 :
- 这行指定的是两次密码的修改间隔时间,也就是/etc/shadow 文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是 0。
k) PASS_MIN_LEN 5 :
- 这行代表密码的最小长度,默认不小于 5 位。但是我们现在用户登录时验证已经被 PAM模块取代,所以这个选项并不生效。
l) PASS_WARN_AGE 7 :
- 这行代表密码修改到期前的警告天数,也就是/etc/shadow 文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是 7 天。
m) UID_MIN 500
n) UID_MAX 60000
- 这两行代表创建用户时,最小 UID 和最大的 UID 的范围。我们 2.6.x 内核开始,Linux用户的 UID 最大可以支持 232 这么多,但是真正使用时最大范围是 60000。还要注意如果我手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕500-549 之间的 UID 没有使用(小于 500 的 UID 是给伪用户预留的)。
- o) GID_MIN 500
p) GID_MAX 60000
- 这两行指定了 GID 的最小值和最大值之间的范围。
q) CREATE_HOME yes :
- 这行指定建立用户时是否自动建立用户的家目录,默认是建立
r) UMASK 077 :
- 这行指定的是建立的用户家目录的默认权限,因为 umask 值是 077,所以新建的用户家目录的权限是 700,umask 的具体作用和修改方法我们可以参考下一章权限设定章节。
s) USERGROUPS_ENAB yes :
- 这行指定的是使用命令 userdel 删除用户时,是否删除用户的初始组,默认是删除。
t) ENCRYPT_METHOD SHA512 :
- 这行指定 Linux 用户的密码使用 SHA512 散列模式加密,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 方式加密
设定密码
- passwd 用户名 :更改密码,root可以更改任何一个用户的密码
- passwd :更改密码,主要是给普通用户更改本身的密码
- passwd 选项 用户名
a) 选项:
- -l 锁定用户密码,用户不允许登录
- -u 解锁
- -S(大) 用户名 #查看用户帐号的状态(是否被锁定)
- --stdin 允许管道符输入密码
- 例:echo "123456" | passwd --stdin user2
- 主要是用来写脚本的
第一次对用户使用时是为此用户创建密码,第二次使用时是修改密码。
root身份执行passwd
1、可以给任何用户设置或修改密码
2、在进行密码修改时不需要提供原始密码
普通用户执行passwd
1、默认只能给自己修改密码
2、给自己修改密码时需要提供用户的当前密码
非交互式密码设置:
echo “123123” | passwd --stdin user1
用户信息修改
- usermod 选项 用户名 :修改已经存在的用户信息
a) 选项:
- -u 550 指定 UID
- -g 组名 指定初始组 不要手工指定
- -G 组名 指定附加组,把用户加入组,使用附加组
- -c 说明 添加说明
- -d 目录 手工指定家目录,目录不需要事先建立
-d 目录 #结合 -m 选项直接对源家目录进行改名实现修改家目录
usermod –m –d /home/u4 user4 (用户user的原家目录是/home/user4)
- -s shell 类型 : 修改用户的登录shell类型 /bin/bash.
- Usermod -G 组名 用户名 :把用户加进组
- usermod -L(大) 用户名 : 锁定用户
- usermod -U(大) 用户名 : 解锁
- usermod -l 新名 旧名 : 用户改名
删除用户
1. userdel -r 用户名 :删除用户
-r :连带家目录一起删除
添加删除组
- groupadd 组名 :添加组,
- groupdel 组名 :在组中删除用户 注意:必须是空组
把已经存在的用户加入组
- usermod -G 组名 用户名 :用户加入组
- gpasswd -a 用户名 组名 : 用户加入组
- gpasswd -d 用户名 组名 : 把用户从组中删除
用户相关命令
- id 用户名 :显示用户的 UID,初始组,和附加组
- su - 用户名 : 切换用户身份
a) “-“ 连带环境变量一起切换
改变有效组的命令
- 假设 aa 用户即属于 aa 组,也属于 group1 组,如果有效组是 aa 组,那么 aa用户建立文件时,文件默认属组是 aa 组。如果有效组是 group1 组,那么aa 用户建立文件时,文件默认属组是 group1 组
- aa 身份登录:
- newgrp group1 aa必须属于group1组,改变aa的有效组为group1
- aa 创建的新文件,默认属组伪 group1,而不再是 aa
用户权限赋予
- /test 目录,要求 aa,bb,cc 用户对此目录有 rwx。其他人没有权限
- groupadd testgrp 建立组
- gpasswd -a aa testgrp 把 aa,bb,cc 加入组
- bb
- cc
- chmod 770 /test 修改组权限
- chgrp testgrp /test 修改属组
补上
- env :查询系统下已经生成或生效的环境变量
- echo $PATH :$PATH环境变量,里面存放着命令
其他相关命令
1、id 用户名
#显示用户的UID、初始组、附加组列表
2、su 用户名
#切换用户身份
su - 用户名
#连带环境变量一起切换
3、newgrp 组名
#修改用户的有效组,切换到普通用户之后,执行命令
有效组定义:用户创建文件或目录时使用哪个组作为文件的所属组,就是有效组。
注:
初始组、附加组:是用户和组之间的关系
有效组:用户和文件之间的关系
*************************************
权限管理
ACL权限
ACL 概述
ACL(Access Control Lists),为单一的用户或者组设置对文件或者目录的独立rwx权限,对于有些特殊需求非常有帮助。
- ACL查询
a) dumpe2fs -h 分区文件 :查询指定分区详细文件系统信息
- -h :仅显示超级块中信息,而不显示磁盘块组的详细信息
ACL基本命令
查询
b) getfacl
- getfacl 文件名 :查询文件的 acl 权限
- setfacl 选项 文件名 : 设定 acl 权限
- -m :设定权限
- -b :删除权限
- –x :删除指定权限
建立
- setfacl -m u:用户名:权限 文件名 :给用户额外加文件权限。
- 例:setfacl -m u:aa:rwx /test :给test目录赋予 aa 是读写执行的 acl 权限
- setfacl -m g:组名:权限 文件名 :给组额外加文件权限。
- 例:setfacl -m g:aa:rwx /test :给test目录赋予 aa 是读写执行的 acl 权限
- setfacl -m u:用户名:权限 -R 目录名 :赋予递归 acl 权限,只能赋予目录 (例:setfacl -m u:cc:rx -R soft/)
- -R :递归
- setfacl -m d:u:用户名:权限 -R /test : acl 默认权限。 注意:默认权限只能赋予目录,就是给目录下的新建文件赋予默认权限 (例:setfacl -m d:u:aa:rwx -R /test)
- setfacl -m m:权限 project/:设定 mask 权限为 r-x。使用“m:权限”格式 (例:setfacl -m m:rx project/)
注意:如果给目录赋予 acl 权限,两条命令都要输入
-R 递归·
-m u:用户名:权限 :只对已经存在的文件生效
-m d:u:用户名:权限 :只对未来要新建的文件生效
删除
- setfacl -b 文件名 : 删除 acl 权限 (例:setfacl -b project/)
- setfacl -x u:用户名 /project/ :删除指定用户和用户组的 ACL 权限 (例:setfacl -x u:st /project/)
手工开启ACL 权限
a) mount -o remount,acl / :重新挂载根分区,并挂载加入 acl 权限 (临时生效)
- vi /etc/fstab
- UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults ,acl 1 1
- 永久生效
Sudo授权权限
sudo简介和原则
- Sudo是管理员将部分只有管理员才能执行的命令授权给普通用户。
- 超级用户赋予普通用户,部分只能超级用户才能执行的命令
- Sudo是用户针对命令的权限
- 普通用户得到的权限,必须是由超级用户赋予的
- 原则
a) 命令越详细,得到的权限就越小
b) 命令越粗略,得到的权限就越大
root 身份 visudo命令
- visudo :赋予普通用户权限命令,命令执行后和 vi 一样使用
a) root ALL=(ALL) ALL
b) 用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
c) %wheel ALL=(ALL) ALL
d) %组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
- 用户名/组名:
- 代表 root 给哪个用户或用户组赋予命令,
- 注意组名前加“%”用户可以用指定的命令管理指定 IP 地址的服务器。
- 如果写 ALL,代表可以管理任何主机,如果写固定 IP,代表用户可以管理指定的服务器。(这里真的很奇怪啊,超哥一直认为这里的 IP 地址管理的是登录者来源的 IP 地址,查了很多资料也都是这样的。直到有一天超哥查看“man 5 sudoers”帮助,才发现大家原来都理解错误了,这里的 IP 指定的是用户可以管理哪个 IP 地址的服务器。
- 那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。
- 如果我们这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而代表指定的用户可以从任何 IP 地址来管理当前服务器。
- 可使用身份:
- 就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略
- 授权命令:
- 代表 root 把什么命令授权给普通用户。默认是 ALL,代表任何命令,这个当然不行。
- 如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径
举例
- 设置重启命令给普通用户使用
a) visudo :打开配置文件
b) 用户名 ALL= /sbin/shutdown –r now
c) sudo -l :查看当前用户可用的授权
- 设置普通用户管理Web服务器
a) 首先要分析授权用户管理 Apache 至少要实现哪些基本授权:
- 可以使用 Apache 管理脚本
- 可以修改 Apache 配置文件
- 可以更新网页内容
- 假设 Aapche 管理脚本程序为/etc/rc.d/init.d/httpd 。
b) 第一种方法
- visudo
- lamp 192.168.0.156=/etc/rc.d/init.d/httpd reload,\/etc/rc.d/init.d/httpd configtest
- 授权用户 lamp 可以连接 192.168.0.156 上的 Apache 服务器,通过 Apache 管理脚本重新读取配置文件让更改的设置生效(reload)和可以检测 Apache 配置文件语法错误(configtest),但不允许其执行关闭(stop)、重启(restart)等操作。(“\”的意思是一行没有完成,下面的内容和上一行是同一行。)
c) 第二种方法
- visudo
- lamp 192.168.0.156=/binvi /etc/httpd/conf/httpd.conf
- 授权用户lamp可以用root身份使用vi编辑Apache 配置文件
注意:以上两种 sudo 的设置,要特别注意,很多朋友使用 sudo 会犯两个错误:第一,授权命令没有细化到选项和参数;第二,认为只能授权管理员执行的命令
d) 条件三则比较简单,假设网页存放目录为/var/www/html ,则只需要授权 lamp 对此目录具有写权限或者索性更改目录所有者为 lamp 即可。如果需要,还可以设置 lamp 可以通过 FTP等文件共享服务更新网页
- 授权普通用户可以添加其他普通用户
a) visudo
b) aa ALL=/usr/sbin/useradd :赋予 aa 添加用户权限.命令必须写入绝对路径
- 授权普通用户可以改密码并取消对root密码的修改
a) visudo
b) aa ALL=/usr/bin/passwd :赋予改密码权限
c) aa ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root :赋予改密码权限并取消对 root 的密码修改
- 普通用户使用 sudo 命令执行超级用户命令
a) sudo /usr/sbin/useradd ee :普通用户使用 sudo 命令执行超级用户命令
三大文件特殊权限
分类
- SetUID :只针对文件
- SetGID :针对文件也针对目录
- Sticky BIT :只针对目录
设定文件特殊权限
- 特殊权限这样来表示:
a) 4 :代表 SUID
b) 2 :代表 SGID
c) 1 :代表 SBIT
SetUID
SetUID是什么,功能
- SetUID 的功能可以这样理解:
a) 只有可以执行的二进制程序才能设定 SUID 权限
b) 命令执行者要对该程序拥有 x(执行)权限
c) 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
d) SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
SetUID的作用介绍
- /usr/bin/passwd 命令拥有特殊权限 SetUID ,也就是在属主的权限位的执行权限上是 s。
- 可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,
- 用户执行这个文件时将以文件所有者的身份执行。/usr/bin/passwd 命令具有 SetUID 权限,所有者为 root(Linux中的命令默认所有者都是 root),
- 也就是说当普通用户使用 passwd 更改自己密码的时候,那一瞬间突然灵魂附体了,实际是在用 passwd 命令所有者 root 的身份在执行 passwd 命令,
- root 当然可以将密码写入/etc/shadow 文件(不要忘记 root 这个家伙是 superman 什么事都可以干),所以普通用户也可以修改/etc/shadow 文件,命令执行完成后该身份也随之消失
注意:如果取消 SetUID 权限,则普通用户就不能修改自己的密码了
SetUID的命令
- chmod u+s 执行文件 :手工添加SUID权限
a) 例:chmod u+s /usr/bin/vim
- ll /usr/bin/vim
- -rwsr-xr-x. 1 root root 1847752 4 月 5 2012 /usr/bin/vim
SetUID的几点建议
- 关键目录应严格控制写权限。比如“/”、“/usr”等;
- 用户的密码设置要严格遵守密码三原则;
- 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限
检测SetUID 的脚本???
SetGID
SetGID的作用
- 针对文件的作用:SGID 即可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。如果针对文件,
a) SGID 的含义如下:
- 只有可执行的二进制程序才能设置 SGID 权限
- 命令执行者要对该程序拥有 x(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
b) 当普通用户 lamp 执行 locate 命令时,会发生如下事情:
- /usr/bin/locate 是可执行二进制程序,可以赋予 SGID
- 执行用户 lamp 对/usr/bin/locate 命令拥有执行权限
- 执行/usr/bin/locate 命令时,组身份会升级为 slocate 组,而 slocate 组对/var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用 locate命令查询 mlocate.db 数据库
- 命令结束,lamp 用户的组身份返回为 lamp 组
- 针对目录的作用
a) 如果 SGID 针对目录设置,含义如下:
- 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组
b) 举例
- cd /tmp/ :进入临时目录做此实验。因为临时目录才允许普通用户修改
- mkdir dtes :建立测试目录
- chmod g+s dtest :给测试目录赋予 SGID
- ll –d dtest/ :查看SGID 是否生效
- chmod 777 dtest/ :给测试目录权限,让普通用户可以写
- su – lamp :切换成普通用户 lamp
- cd /tmp/dtest/ :普通用户进入测试目录
- touch abc :普通用户建立 abc 文件
- ll :查看
SetGID命令
- chmod g+s dtest :给目录赋予SGID权限
- chmod g+s /usr/bin/locate :给文件赋予SGID权限
文件特殊权限之Sticky BIT
Sticky BIT的作用
- Sticky BIT 粘着位,也简称为 SBIT。SBIT 目前仅针对目录有效,它的作用如下:
a) 粘着位目前只对目录有效
b) 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
c) 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
文件系统属性 chattr 权限
命令格式
a) [+-=]
- +: 增加权限
- -: 删除权限
- =: 等于某权限
b) [选项]
- i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
- a: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除
- e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消 e 属性。
查看文件系统属性 lsattr
- lsattr 选项 文件名 :查看文件系统属性
a) 选项
- -a :显示所有文件和目录
- -d :若目标是目录,仅列出目录本身的属性,而不是子文件的
举例
- 例1 :
a) 给文件赋予 i 属性
- touch ftest :建立测试文件
- chattr +I ftest :赋予chattr 权限
- rm -rf ftest :删除,赋予 i 属性后,root 也不能删除
- echo 111 >> ftest :不能修改文件的数据
b) #给目录赋予 i 属性
- mkdir dtest :建立测试目录
- touch dtest/abc :再建立一个测试文件 abc
- chattr +I dtest/ :给目录赋予 i 属性
- cd dtest/ :进入/dtest/
- touch bcd :建立文件, dtest 目录不能新建文件
- echo 11 >> abc :写入数据,但是可以修改文件内容
- cat abc :查看数据,“11“
- rm -rf abc :删除,不能删除
- 例2:
a) mkdir -p /back/log :建立备份目录
b) chattr +a /back/log/ :赋予 a 属性
c) cp /var/log/messages /back/log/ :可以复制文件和新建文件到指定目录
d) rm -rf /back/log/messages :但是不允许删除
*************************************
文件系统管理
*************************************
文件系统管理-初级
硬盘结构
- 硬盘的逻辑结构
a) 硬盘的逻辑结构分二种
- 磁道:是用来存储数据的
- 扇区:是磁盘的最小存贮单位,为512Byte。每个扇区的容量是固定的
b) 硬盘的大小是使用“磁头数×柱面数×扇区数×每个扇区的大小”这样的公式来计算的。其中磁头数(Heads)表示硬盘总共有几个磁头,也可以理解成为硬盘有几个盘面,然后乘以二;柱面数(Cylinders)表示硬盘每一面盘片有几条磁道;扇区数(Sectors)表示每条磁道上有几个扇区;每个扇区的大小一般是 512Byte。
- 硬盘分类
a) 机械硬盘
b) 固态硬盘
文件系统
- super block(超级块):
a) 记录整个文件系统的信息,包括 block 与 inode 的总量,已经使用的 inode 和 block 的数量,未使用的 inode 和 block 的数量,block与 inode 的大小,文件系统的挂载时间,最近一次的写入时间,最近一次的磁盘检验时间等。
- date block(数据块,也称作 block):
a) 用来实际保存数据的(柜子的隔断),block的大小(1KB、2KB 或 4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化(制作柜子的时候,隔断大小就已经决定,不能更改,除非重新制作柜子)。
b) 每个 blcok 只能保存一个文件的数据,要是文件数据小于一个 block 块,那么这个block 的剩余空间不能被其他文件是要;要是文件数据大于一个 block 块,则占用多个 block 块。
c) Windows 中磁盘碎片整理工具的原理就是把一个文件占用的多个block 块尽量整理到一起,这样可以加快读写速度。
- inode(i 节点,柜子门上的标签):
a) 用来记录文件的权限(r、w、x),文件的所有者和属组,文件的大小,文件的状态改变时间(ctime),文件的最近一次读取时间(atime),文件的最近一次修改时间(mtime),文件的数据真正保存的 block 编号。每个文件需要占用一个 inode
常用的硬盘管理命令
df跟du命令和区别
- df 命令
a) df –ahT
- -a :显示特殊文件系统,这些文件系统几乎都是保存在内存中的。如/proc,因为是挂载在内存中,所以占用量都是 0
- -h :单位不再只用 KB,而是换算成习惯单位
- –T大写 :多出了文件系统类型一列
- du 命令
a) du [选项] [目录或文件名]
- -a :显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
- -h :使用习惯单位显示磁盘占用量,如 KB,MB 或 GB 等
- -s :统计总占用量,而不列出子目录和子文件的占用量
du 与 df 的区别:
lsof | grep deleted :查看被删除的文件,然后一个进程一个进程的手工 kill 也是可以的
这些文件在必要的情况下,可以谨慎的选择无用文件删除,要是全都的文件被删除,系统就会崩溃、
在非必要情况下重启就可以解决垃圾文件的问题,就没必要去手工删除。手工删除危险性高。
fsck 文件系统修复命令
b) fsck –y /dev/sdb1 :无需手工启动,这命令系统启动时会自动启动。如果开机启动修复失败了,那手工启动修复也没用
显示磁盘状态dumpe2fs
c) dumpe2fs /dev/sda3
- Filesystem volume name: <none> ß 卷标名
- Last mounted on: / ß 挂载点
- Default mount options: user_xattr acl 挂载参数
- Filesystem state: clean ß 文件系统状态正常
- Inode count: 1826816 ß inode总数
- Block count: 7300864 ß块总素
- Block size: 4096 ß 块大小
- Inode size: 256 ßinode 的大小
- Group 0: (Blocks 0-32767) [ITABLE_ZEROED] ß第一个数据组的内容
查看文件的详细时间
d) stat 文件名 : 查看文件的详细时间
a) Access: 2011-10-29 22:27:45.000000000 +0800 :访问时间
b) Modify: 2011-09-14 18:02:00.000000000 +0800 :数据修改时间
c) Change: 2011-10-25 22:21:44.000000000 +0800 :状态修改时间
判断文件类型
e) file 文件名 判断文件类型
f) type 命令名 判断命令类型
fdisk 命令手工分区
fdisk磁盘分区模式
- fdisk -l :查看系统所有硬盘及分区
- fdisk /dev/sdb :进行磁盘分区(分区还没有分区号)
安装步骤
a) 新建主分区
- fdisk /dev/sdb :进入硬盘分区模式
- n :新建分区
- p :建立主分区
- 1 :设置分区号
- 回车键:起始柱面,从最初的开始
- +2G :始终柱面,分区大小
- W :保存退出
b) 新建扩展分区
- fdisk /dev/sdb :进入硬盘分区模式
- n :新建分区
- e :新建扩展分区
- 2 :设置分区号
- 回车键:起始柱面,从最初的开始
- 回车键 :始终柱面,把剩余的全都给扩展分区
- w :保存退出
c) 新建扩展分区
- fdisk /dev/sdb :进入硬盘分区模式
- n :新建分区
- e :新建逻辑分区
- 不用指定分区号
- 回车键:起始柱面,从最初的开始
- +2G :始终柱面,
- w :保存退出
注意:要是出现以上二个图片中的内容
如果新建分区后没有重启系统的情况下在新建分区就会出错,出错信息:有可能是因为系统的分区表正在被占用,需要重启系统后才能生效,
partprobe
d) 强制重读所有分区文件,重新挂载分区文件内所有分区。这不是分区必须命令,
e) 如果没有提示重启,可以不执行,也可以重启系统( Warning: Unable to open /dev/hdc read-write (Read-only file system)./dev/hdc has been opened read-only.光盘只读挂载,不是错误,不用紧张)
f) 如果这个命令不存在请安装 parted-2.1-18.el6.i686 这个软件包
注意:目前partprobe被淘汰了,6.8以后没有效果
格式化
- 格式化:建立文件系统 ext3 是 linux 默认文件系统
- mkfs -t 文件类型 分区设备文件名 :格式化分区
a) mkfs 命令非常简单易用,不过是不能调整分区的默认参数的(比如块大小是 4096),这些默认参数除非特殊情况,否则不需要调整,如果想要调整就需要使用 mke2fs 命令进行重新格式化
- mkfs [选项] 分区设备文件名
a) 选项:
- -t 文件系统: 指定格式化成哪个文件系统,如 ext2,ext3,ext4
- -b 字节: 指定 block 块的大小
- -i 字节: 指定“字节/inode”的比例,也就是多少个字节分配一个 inode
- -j: 建立带有 ext3 日志功能的文件系统
- -L 卷标名: 给文件系统设置卷标名,就不使用 e2label 命令设定了
- 例:mke2fs -t ext4 -b 2048 /dev/sdb6 :格式化分区,并指定 block 的大小为 2048
建立挂载点
g) mkdir 挂载目录 :建立挂载目录
挂载
h) mount 分区设备文件名 挂载目录 :挂载目录
i) mount :查询当前系统以挂载的设备
自动挂载
j) 修改分区自动挂载文件
k) vi /etc/fstab 注意:此文件直接参与系统启动,如果修改错误,系统启动报错
l) 第一列:设备文件名
m) 第二列: 挂载点
n) 第三列: 文件系统
- o) 第四列: 挂载选项
p) 第五列: 1 是否可以被备份 0不备份 1每天备份 2不定期备份
q) 第六列: 2是否检测磁盘 fsck 0 不检测 1 启动时检测 2 启动后检测
- 可以使用 UUID 进行挂载,UUID(硬盘 通用唯一识别码,可以理解为硬盘的 ID )这个字段在 CentOS 5.5 的系统当中是写入分区的卷标名或分区设备文件名的,现在变成了硬盘的 UUID。这样做的好处是当硬盘增加了新的分区,或者分区的顺序改变,再或者内核升级后,任然能够保证分区能够正确的加载,而不至于造成启动障碍
r) dumpe2fs 分区设备文件名 :可以查看UUID
重启
s) 要是全都做好没问题的话
t) 重启测试 或 mount -a 重新挂载所有内容,用它进行测试
/etc/fstab/文件修复
- 如果在/etc/fstab/输入错误,重启的时候系统出错
- 提示输入 root 密码
- 成功进入系统,输入/etc/fstab 文件修改回来
- 提示是没有写权限,那么只要把/分区重新挂载下,挂载为读写权限不就可以修改了
a) mount -o remount,rw / :重新挂载,并读写分区
b) 修改/etc/fstab 文件,把它改回来就可以正常启动了
parted 命令分区
分区表
- 我们 Linux 系统中有两种常见的分区表 MBR 分区表(主引导记录分区表)和 GPT 分区表(GUID 分区表),
- MBR 分区表:支持的最大分区是 2TB(1TB=1024GB);最多支持 4 个主分区,或 3个主分区 1 个扩展分区
- GPT 分区表:支持最18EB 的分区(1EB=1024PB=1024*1024TB);最多支持 128 个分区,其中 1 个系统保留分区,127 个用户自定义分区
- 不过parted命令也有点小问题,
- 就是命令自身分区的时候只能格式化成ext2文件系统,不支持 ext3 文件系统,
- 那就更不用说 ext4 文件系统了(截止到 CentOS 6.3 还是这样,
- 这里只是指不能用 parted 命令把分区格式化成 ext4 文件系统,
- 但是 parted 命令还是可以识别 ext4 文件系统的)。不过这没有太多的影响,
- 因为我们可以先分区再用 mkfs 进行格式化嘛!
parted 交互模式
- parted /dev/sdb :进入parted 交互模式
查看分区
- print :在parted 交互模式中输入
- 使用 print 可以查看分区表信息,包括硬盘参数,硬盘大小,扇区大小,分区表类型和分区信息。分区信息总共七列,分别是:
- Number:分区号
- Start:分区起始位置,这里不再像 fdisk 用柱面表示,而是使用 Byte 更加直观
- End:分区结束位置
- Size:分区大小
- Type:分区类型
- File system:文件系统类型。我不是说 parted 不支持 ext4 文件系统吗?注意,
- 我一直都是说 parted 不能直接把分区直接格式化成 ext4 文件系统,但是它是可以
- 识别的。
- 标志:Flags,就是分区的标记
修改成 GPT 分区表
- mklabel gpt : 修改分区表命令
- 修改了分区表,如果这块硬盘已经有分区了,那么原有分区和分区中的数据都会消失,而且需要重启系统才会生效。还有我们转换分区表的目的是为了支持大于 2TB 的分区,如果分区并没有大于 2TB,那么这步是可以不执行的
注意:一定要把/etc/fstab 文件中和原有分区的内容删除掉,才能重启动。要不系统启动就一定会报错的
建立分区
- 因为修改过了分区表,所以/dev/sdb 中的所有数据都消失了,所以我们可以重新对这块硬盘分区了。不过建立分区时,默认文件系统就只能建立成 ext2 了
- mkpart :创建分区命令,在parted交互模式中使用
- 不知道大家注意到了吗?
- 我们现在的 print 查看的分区,和第一次查看 MBR 分区表的分区时有些不一样了,
- 少了 Type 这个字段,也就是分区类型的字段,
- 多了 Name 分区名字段。分区类型是标识主分区、扩展分区和逻辑分区的,
- 不过这种标识只在 MBR 分区表中使用,我们现在已经变成了 GPT 分区表了,所以就不再有 Type 类型了。
- 也就说折磨我们很久的主分区、扩展分区和逻辑分区的概念不再有用了
建立文件系统
- 分区分完了,我们还需要格式化。不过我们已经知道如果使用 parted 交互命令格式化的话,只能格式化成 ext2 文件系统。我们这里是要演示下 parted 命令的格式化方法,所以就格式化成 ext2 吧。
- mkfs :格式化命令,在parted交互模式中使用
- 格式完了是ext2文件系统,如果要ext4的文件系统,也是用mkfs命令(注意不是 parted 交互命令中的mkfs,而是系统命令 mkfs) mkfs -t ext4 分区设备文件名
调整分区大小
- parted 命令还有一大优势,就是可以调整分区的大小(windows 中也可以实现,不过要不需要转换成动态磁盘,要不需要依赖第三方工具,如硬盘分区魔术师)。起始 Linux 中 LVM和 RAID 是可以支持分区调整的,不过这两种方法也可以看成是动态磁盘方法,使用 parted 命令调整分区要更加简单
- 注意:parted 调整已经挂载使用的分区时,是不会影响分区中的数据的,也就是说数据不会丢失。但是一定要 先卸载分区,再调整分区大小,否则数据是会出现问题的。还有要调整大小的分区必须已经建立了文件系统(格式化),否则会报错
- resize :调整分区大小,在parted交互模式下使用
注意:如果不是ext2模式的不可以调整分区大小
删除分区
- rm :删除分区,在pared交互模式中使用
注意:还有件事要注意,parted 中所有的操作都是立即生效,没有保存生效的概念。这点和fdisk 交互命令明显不同,所以所做的所有操作大家要倍加小心
swap 分区
分区
a) fdisk /dev/sdb :进行磁盘分区
- 新建主分区
- fdisk /dev/sdb :进入硬盘分区模式
- n :新建分区
- p :建立主分区
- 1 :设置分区号
- 回车键:起始柱面,从最初的开始
- +1G :始终柱面,分区大小
- W :保存退出
修改swap分区ID
b) t :修改分区ID,在硬盘分区模式中使用
c) 只有一个分区,所以不用选择分区了
d) 82 :改为 swap 的 ID
格式化
e) mkswap /dev/sdb1 :swqp分区专属的格式命令
查看内存信息
f) free :查看内存信息
- Mem :内存
- total :内存总大小
- used :目前使用量
- free :剩余空间
- shared :空闲空间
- buffer :缓冲 :是增加数据写入速度
- cached :缓存 :是增加数据读取速度
- -/+ buffers/cache :
- used :实际内存使用容量
- free :提升性能
swap分区挂载
g) swapon 分区设备文件名 :挂载,swap分区的专用挂载
- 例:swapon /dev/sdb1
swap 分区自动挂载
h) vi /etc/fstab :配置自动挂载数据
*************************************
文件系统管理-高级
磁盘配额的概念
由于Linux是一个多用户管理的操作系统,而Linux默认情况下并不限制每个用户使用磁盘空间的大小,假如某个用户疏忽或者恶意占满磁盘空间,将导致系统磁盘无法写入甚至崩溃;为了保证系统磁盘的有足够的剩余空间,我们需要对用户和组进行磁盘空间使用限制。
磁盘配额限制类型:
1. 限制用户和组对磁盘空间的使用量
2. 限制用户和组在磁盘内创建文件的个数
磁盘配额限制级别:
- 软限制:低级限制,此限制可以突破,突破时会被警告,超出部分会有宽限天数,宽限天数到期后超出部分被清空,软限制不能超过硬限制
- 硬限制:绝对限制,此限制不会被突破,达到指定限制后无法使用更多空间
- 宽限天数:当有数据超过软限制后,超出部分会被计时,宽限天数到期后超出部分数据将被清空,宽限天数默认是7天
注:磁盘配额是针对分区进行设置的,无法实现“某用户在系统中共计只能使用50MB磁盘空间”只能设置某用户在/home分区能使用30M这样的限制。切记:磁盘配额是针对分区的!
磁盘配额开启条件
内核是否支持磁盘配额?
#grep "CONFIG_QUOTA" /boot/config-2.6.32-431.el6.x86_64
磁盘配额相关命令是否安装?
#rpm -q quota
磁盘配额实验规划
ü 准备足够大小的分区,要远大于实验的需求空间
ü 创建实验用户和组
用户:cj、bd、xz、
组:thot
ü 磁盘配额规划
thot:硬:500M 软:450M 文件数不限制
cj: 硬:50M 软:40M 硬:10个 软:8个
bd: 硬:250M 软:200M 文件数不限制
xz: 硬:250M 软:200M 文件数不限制
ü 宽限天数修改为8天
磁盘配额实验流程
环境准备
操作系统,额外的磁盘,内核是否支持
查看系统是否支持磁盘配额
#grep "CONFIG_QUOTA" /boot/config-2.6.32-431.el6.x86_64
查看分区的挂载属性是否满足
dumpe2fs –h /dev/sdb1 | grep "Default mount options"
注:无法查看分区是否支持用户和组的磁盘配额,需要使用mount 查看
查看结果中是否包含usrquota、grpquota两个挂载属性?
如果没有两个挂载属性,则需要重新挂载并添加两个属性,并写入自动挂载
创建分区、用户、用户组
分区大小要远大于实验要求大小,避免影响实验结果
用户:cj、bd、xz
组:thot
注:创建用户时,指定thot为初始组
SELinux 必须关闭才能进行下面的实验!
保证用户创建的文件能消耗组额度
Useradd –g thot cj
quotacheck :生成用户和组的配置文件
quotacheck 选项
-a 扫描/etc/mtab文件中所有启用磁盘配额功能的分区。如果加入此参数,命令后面就不需要加入分区名了
-u 建立用户配额的配置文件,即生成aquota.user
-g 建立组配额的配置文件,即aquota.group
-v 显示扫描过程
-c 清除原有的配置文件,重新建立新的配置文件
quotacheck -avug
注:若报错没有权限生成文件,则需要关闭SELinux
编辑配置文件、设置指定限制大小
edquota 选项 用户名或组名
-u 用户名
-g 组名
-t 设定宽限时间
-p 复制磁盘配额规则,不需要每一个用户或者组都手动设置一遍
# edquota -p 模板用户 -u 目标用户
注:配置文件中所写大小默认单位KB
启动和关闭磁盘配额
启动:
quotaon 选项
-a 根据/etc/mtab文件启动所有分区的磁盘配额(不写分区名)
-u 启动用户的磁盘配额
-g 启动组的磁盘配额
-v 显示启动过程信息
quotaon -avug
关闭:
quotaoff 选项 分区名
-a 根据/etc/mtab文件关闭所有分区的磁盘配额(不写分区名)
-u 关闭用户的磁盘配额
-g 关闭组的磁盘配额
-v 显示启动过程信息
quotaoff -avug
查看磁盘配额的信息
查询指定用户和组的配额:
quota 选项 用户或组名
-u 用户名
-g 组名
-v 显示详细信息
-s 以常见单位显示大小
quota -uvs 用户名
quota -gvs 组名
查询指定分区的磁盘配额:
repquota 选项 分区名
-u 查询用户配额
-g 查询组配额
-v 显示详情
-s 以常见单位显示
repquota -uvs 查询用户配额
repquota -gvs 查询组配额
验证磁盘配额是否生效
切换到执行用户,以预设用户身份进行文件创建(su)
测试工具:
dd 生成指定大小的文件(dd命令详解见下面或附件)
dd if=/dev/zero of=/分区名/testfile bs=1M count=60
注意:用户的测试需要切换到指定用户身份,而组磁盘配额的验证需要?
非交互设置磁盘配额
setquota -u 用户名 软(容) 硬(容) 软(数) 硬(数) 分区名
注:同样,这样的非交互式的命令更适合写入脚本,而且,假如有很多用户的磁盘配额配置相同也可以用复制来实现。
磁盘配额关键属性
usrquota
grpquota
SELinux关闭
在用redhat linux操作系统下怎样关闭SElinux呢?由于在默认情况下,SElinux是默认开启的,即SElinux的状态为enable。对于实验环境下,有时候SElinux的存在很让人头疼。
1.怎样查看iptables和SElinux状态:
#service iptables status
#getenforce
2、关闭iptables和SElinux:
#service iptables stop #临时关闭防火墙
#chkconfig iptables off #永久关闭防火墙,开机不自启动,想自启动改成on
#setenforce 0 #临时关闭SElinux,临时打开SElinux状态命令:setenforce 1
3、永久关闭SElinux
#vim /etc/selinux/config,然后将改成SELINUX=disabled,这样即使重启操作系统SElinux也是关闭状态。
查看SElinux状态:
#/usr/sbin/sestatus -v
临时关闭:setenforce 0
伪设备文件
/dev/zero :产生无限个0
用来测试
dd if=/dev/zero of=/分区名/testfile bs=1M count=60
/dev/null :位桶(垃圾桶)
可以让不想显示打印在界面的,可以用 >> /dev/null 来吞掉
/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
/dev/null——它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
LVM逻辑卷管理
LVM(Logical Volume Manager)逻辑卷管理,它是Linux环境下对磁盘分区进行管理的一种机制。
普通的磁盘分区管理方式在分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。
简单来说LVM就是将物理磁盘融合成一个或几个大的虚拟磁盘存储池,按照我们的需求去存储池划分空间来使用,由于是虚拟的存储池,所以划分空间时可以自由的调整大小,如下图:
LVM的组成部分
ü 物理卷(PV,Physical Volume):由磁盘或分区转化而成
ü 卷组(VG,Volume Group):将多个物理卷组合在一起组成了卷组,组成同一个卷组的可以是同一个硬盘的不同分区,也可以是不同硬盘上的不同分区,我们通常把卷组理解为一块硬盘。
ü 逻辑卷(LV,Logical Volume):把卷组理解为硬盘的话,那么我们的逻辑卷则是硬盘上的分区,逻辑卷可以进行格式化,存储数据。
ü 物理扩展(PE,Physical Extend):PE卷组的最小存储单元,PE所在的位置是VG卷组,即硬盘上,那么我们可以把PE理解为硬盘上的扇区,默认是4MB,可自由配置。
创建LVM
ü 将物理磁盘分区,或整块磁盘分成一个区
ü 将物理磁盘上的分区建立成物理卷(PV)
ü 将创建好的物理卷组合成卷组(VG),通过添加或者删除一块物理卷,来实现卷组大小的调整。
ü 最后将卷组划分成逻辑卷(LV),逻辑卷也是可以随意调整大小的,逻辑卷相当于真正的分区,那么要使用必须进行格式化和挂载。
物理卷管理
- 使用fdisk 来进行分区,分区的系统ID需要使用t选项修改为8e
- 创建物理卷--pvcreate
- 查看物理卷—pvscan & pvdisplay
- 删除物理卷—pvremove
卷组管理
创建卷组vgcreate
格式:vgcreate 选项 卷组名 物理卷名(可以写多个,空格分开)
-s 大小:指定VG的PE大小
查看卷组
vgscan :查看简单信息
vgdisplay :查看详细信息
增加卷组容量vgextend
格式:vgextend 卷组名 物理卷名
减小卷组容量--vgreduce
格式:vgreduce 卷组名 物理卷名
vgreduce –a 卷组
#删除指定卷组内所有空的物理卷
删除卷组
vgremove
逻辑卷管理
创建逻辑卷--lvcreate
格式:lvcreate 选项 -n 逻辑卷名 卷组名
-L 容量:指定创建的逻辑卷大小,单位:MB,GB,TB等
-l(小) 个数:按照PE个数来指定逻辑卷大小
-n 逻辑卷名:指定逻辑卷叫什么名
注:因为逻辑卷相当于是分区,所以需要进行格式化和挂载才能使用,及自启动
查看逻辑卷
lvscan :查看简单信息
lvdisplay :查看详细信息
增加逻辑卷容量--lvextend
注:修改lv及文件系统的大小,必须先将lv及文件系统卸载(umount)
eg.
lvextend -L +10G /dev/testvg/testlv #先增加lv的大小
resize2fs -f /dev/testvg/testlv 30G #再修改文件系统的大小
减小逻辑卷容量—lvreduce
注:减少lv空间的操作是有风险的,操作之前一定要做好备份,以免数据丢失。
eg.
e2fsck -f /dev/vg/lv #检查文件系统
resize2fs /dev/vg/lv newsize #减少后文件系统大小
lvreduce -L newsize /dev/vg/lv #减少后lv大小
RAID磁盘阵列
定义:独立磁盘构成的具有冗余能力的阵列
磁盘阵列分类:
一是外接式磁盘阵列柜、
二是内接式磁盘阵列卡,
三是利用软件来仿真
1.通过把多个磁盘组织在一起作为一个逻辑卷提供磁盘跨越功能
2.通过把数据分成多个数据块(Block)并行写入/读出多个磁盘以提高访问磁盘的速度
3.通过镜像或校验操作提供容错能力
RAID磁盘阵列主要为了保证硬件损坏的情况下业务不会终止,无法防止误操作
硬-软raid
硬raid :独立的管理系统
软raid :借助系统来管理
RAID磁盘阵列简介
RAID 0:没有奇偶校验的条带卷
RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求
RAID 1:独立磁盘冗余阵列(镜像卷)
RAID 1通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。
RAID 10:镜象阵列条带
Raid 10是一个Raid 1与Raid0的组合体,它是利用奇偶校验实现条带集镜像,所以它继承了Raid0的快速和Raid1的安全。
先建raid1 在建raid0
损坏一块磁盘时的损坏率:0% (raid01 :0%)
损坏二块磁盘时的损坏率:三分之一 (raid01 :三分之二)
损坏三块磁盘时的损坏率:百分百 (raid01 :百分百)
RAID5:分布式奇偶校验的独立磁盘结构
RAID 5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。 RAID 5可以理解为是RAID 0和RAID 1的折中方案。
等分成几分之一,用来存储备份。
Raid 5 阵列搭建流程
准备物理磁盘
创建raid5阵列
mdadm -Cv 阵列名称(md*) -l5 -n3 磁盘 -x1 磁盘
-C:create
-v:显示详细信息
eg.
mdadm -Cv /dev/md0 -l5 -n3 /dev/sdb1 /dev/sdb2 /dev/sdb3 -x1 /dev/sdb5
记得要格式化并挂载才能使用,还有自动挂载
查看raid5阵列信息
mdadm –D 设备名
生成raid5阵列配置文件
模拟raid5阵列磁盘损坏
mdadm /dev/md0 –f /dev/sdb3
#标记阵列中某磁盘损坏,并查看磁盘状态
移除故障磁盘,添加新磁盘
mdadm /dev/md0 --remove /dev/sdb3
#移除故障磁盘
mdadm /dev/md0 --add /dev/sdb6
#添加新的磁盘,恢复正常热备
*************************************
dd扩展
dd:用指定大小的块拷贝一个文件。
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
dd应用实例
1.将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
2.将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image
3.将备份文件恢复到指定盘
dd if=/root/image of=/dev/hdb
4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd if=/dev/hdb | gzip > /root/image.gz
5.将压缩的备份文件恢复到指定盘
gzip -dc /root/image.gz | dd of=/dev/hdb
6.备份与恢复MBR
a.备份磁盘开始的512个字节大小的MBR信息到指定文件:
dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
b.恢复:
dd if=/root/image of=/dev/had
将备份的MBR信息写到磁盘开始部分
7.拷贝内存内容到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)
8.拷贝光盘内容到指定文件夹,并保存为cd.iso文件
dd if=/dev/cdrom(sr0) of=/root/cd.iso
9.增加swap分区文件大小
第一步:创建一个大小为256M的文件:
dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件:
mkswap /swapfile
第三步:启用这个swap文件:
swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0
10.销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1
注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。
11.测试硬盘的读写速度
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。
12.确定硬盘的最佳块大小:
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。
伪设备文件
/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
/dev/null——它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
*************************************
Shell脚本
*************************************
shell基础
Shell 概念
- Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
- 实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shel编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
- Shell 是系统跟应用程序的双向翻译官,用来双向解析的
Shell 的分类
- Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三种shell各有优缺点。
- Bourne shell是UNⅨ最初使用的shell,并且在每种UNⅨ上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
- Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
- C shell是一种比Bourne shell更适于编程的shell,它的语法与C语言很相似。Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法,它不仅和Bash shell是提示符兼容,而且还提供比Bash shell更多的提示符参数。
- Korn shell集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。
查询Linux中支持的shell类型
a) cat /etc/shells :查询Linux中支持的shell类型
Shell的执行方式
解析器解析
- 给执行权限:chmod +x *.sh(*.bash)
- 使用解析器解析:bash *.sh(不需要给权限)
相对路径和绝对路径的“执行方式”
- ./文件名:以相对路径查询,需要进入文件的上级目录才能执行
- /文件名 :以绝对路径查询,需要输入绝对路径才能执行
source
- source 文件名 :加载文件(可以用于执行shell文件)
- . 文件名:加载文件 跟source功能一样
shell 脚本
- 创建shell脚本文件,一般以 .sh 结尾
- shell 脚本作为一种脚本文件,如何运行?
a) 添加x 执行权限(相对或绝对路径执行)
b) 用bash命令,调用脚本文件
Bash历史命令的基本功能
Bash_history:查看历史命令缓存记录文件
记录用户使用命令的文件,需要用户正常退出的情况下才会记录到文件里面,这文件在家目录下的bash_history
历史命令
历史命令的查看
命令:history [选项]
-c 清空历史命令
-w 把缓存中的历史命令保存到历史命令配置文件
历史命令的调用
调用之前使用过的历史命令有以下几种办法:
ü 使用上、下光标键调用
ü 使用“!n”,重复执行第n条历史命令
ü 使用“!!”,重复执行上一条命令
ü 使用“!字符”,重复执行最近一条以此字符开头的命令
命令与文件名的补全
Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能
命令别名
命令:alias 别名=’原命令 [选项]’
两个配置文件:
单个用户:~/.bashrc
所有用户:/etc/bashrc
注:别名命令的优先级更高
注意:配置文件修改后需要重新加载,让新添加的内容立刻生效
source /etc/bashrc
source . /etc/bashrc(这个点不是当前路径的意思)
kernel 2.6.32 前:
alias grep='grep --color=auto'
需要人为添加到配置文件
kernel 3.10 后
配置文件中默认包含
快捷方式的几个方法
- 软连接:ln –s /usr/local/apache2/bin/apachectl /usr/local/bin/
因为apachectl 在/usr/local/bin/在环境变量目录下,所以可以在执行就可以了
- 别名:alias str=’/usr/local/apache2/bin/apachectl start’
alias sto=’/usr/local/apache2/bin/apachectl stop’
注意事项:不要使用已经存在的命令,要是别名的做作用跟命令的一样,就可以用命令作为别名的名称,例((alias grep='grep --color=auto'))
- 变量叠加: 将制定目录加入 PATH 环境变量中
命令执行的顺序:
NO.1 用绝对路径或相对的方式执行命令
NO.2 别名命令
NO.3 bash 内置命令
NO.4 根据环境变量定义的目录查询找到的命令
Bash 常用快捷键
输入输出重定向
bash的标准输入输出
设备 |
设备文件名 |
文件描述符 |
类型 |
键盘 |
/dev/stdin |
0 |
标准输入 |
显示器 |
/dev/stdout |
1 |
标准正确输出 |
显示器 |
/dev/stderr |
2 |
标准错误输出 |
- 输出:
a) 标准输出:(/dev/stdout)
- 向显示器打印信息
b) 重定向输出
- 将原来要打印到显示器上的信息,重新定向,打印到制定设备或文本中
- > 覆盖式
- >> 追加式
- 重定向输出默认只接受正确输出的结果
- & >> :无论正确或错误输出,都会执行
c) 输出类型:
- 正确输出:/dev/stdout 1
- 错误输出:/dev/stderr 2
d) 输入
- wc <
- cpio <
- patch <
输出重定向
输入重定向
命令:wc [选项] [文件名]
-c 统计字数(字符)
-w 统计单词数(字符串)
-l 统计行数
多命令顺序执行
echo命令: 用于字符串的输出
用于字符串的输出
1. echo [选项] [输出内容]
-e 支持反斜线控制的字符转换
-n 取消输出后行尾的换行符号
echo –e :支持反斜线支持的控制转换
常用控制字符
- 输出“\a”本身,并发出警告声?
- 删除“\b” 前的字符,然后输出结果?
- 使用 \t 制表符 和 \n 换行,实现特殊格式?
- 按照八进制和十六进制的ASCII编码输出?
显示颜色
- \e[ ; m …… \e[;m
“\e[1”代表颜色输入开始;“\e[0m” 代表颜色输入结束;固定格式!
- 文字颜色:30=黑色,31=红色,32=绿色,33=黄色,34=蓝色,35=洋红,36=青色,37=白色,39=结束
- 底纹颜色:40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=洋红,46=青色,47=白色,49=结束
特殊的控制显示
- \e[ ; m …… \e[;m
a) \e[0m 关闭所有属性
b) \e[1m 设置高亮度
c) \e[4m 下划线
d) \e[5m 闪烁
e) \e[7m 反显
f) \e[8m 消隐
grep命令
命令:grep [选项] “关键词” 文件名 #行提取命令
-A 数字:列出符合条件的行,并将连续列出后续n行
-B 数字:列出符合条件的行,并将连续列出前面n行
-c :统计包含字符串的行一共几行!
-i :忽略大小写
-n :输出行号
-v :反向查找(取反)
--color=auto:搜索出的关键词高亮显示
find 和 grep 的区别
find 是在系统中查找符合条件的文件名,是完全匹配,如果需要模糊查找使用通配符。
#搜索时,只有完全匹配的才会被查找出来。
grep 是在文件中查找符合条件的字符串,是包含匹配,如果需要精确查询,需要使用正则表达式
#查询关键词时,只要包含关键词的行都被显示
管道符
格式:命令1 | 命令2
将命令1的标准输出作为命令2的标准输入
ls –l /etc | more
/etc 目录下内容较多,长格式显示后一页显示不全,用more分页显示下
Xargs命令
xargs是实现“将标准输出作为命令的参数”
eg:
echo "--help" | cat
echo “--help” | xargs cat
echo "--help" |xargs cat --help:当做了命令的选项
如果在特殊情况下xargs是用命令1的关键字做为命令2的选项
正常情况下,是用于fing命令的
fing:这一类输出结果一条条的命令,不能直接使用“|”管道符进行内容传递,需要使用xargs
find ./ -name "*.sh" -exec ls -l {} \;
find ./ -name "*.sh" |xargs ls –l
以上二条命令输出的结果相同
通配符
?:匹配一个任意字符,如a?匹配的结果都是以a开头及a后面紧跟一个字符的
* :匹配0个或任意多个任意字符,也就是说可以匹配任何内容,
如a*,匹配的结果是,只要开头是a都匹配
[] :匹配括号内的任意一个字符(除了-外,不能使用分割符号)
[0-9] :0-9 任意一个
[a-z] :小写24个字母任意一个
[A-Z] :大写24个字母任意一个
[a-Z] 和 [a-zA-Z] :结果相同,大小写24个字母任意一个
若有n在[]中,n会被作为匹配对象
实验
Bash 中其他特殊符号
'':所有在单引号中出现的,都以原格式输出,特殊符号没有作用
字符串整体,所有字符串都没有特殊含义,echo ‘$PATH’
"" :几乎所有的在双引号中出现的,都以原格式输出,除了( $ \ `` )
字符串整体,大部分在“”中无特殊含义 除了$ \ `` echo“$PARH”
``:写入到反引号中的命令,会被反引号调用出命令的结果
反引号:将命令的结果赋给某变量(a=`date`)
$() a=`date` == a=$(date) :跟``功能一样
():在小括号中执行的命令(是在新的子shell中执行的,结果不影响当前shell中的内容)
作用:变量测试+替换
()中最后一个命令可不用”;”结尾
{}:在大括号中执行的,和不加大括号结果一样,没有区别,只是大括号的使用(特殊)格式:{ name=zs;echo $name;}
~/.bash_profile --> ~/.bashrc --> /etc/bashrc
[ -f /etc/bashrc ] && . /etc/bashrc ]
作用:变量测试+替换
[]:用于变量的测试
[ == ]:判断符号两侧,括号两侧必须有空格[ "$a" == "$b" ]
[ != ]:注意:> < >= <= 不能直接套用以上格式。
[ "$a" == "$b" ] && echo "yes" || echo "no"]
单引号&双引号 :
单引号当中的特殊符号没有特殊含义,双引号里面的特殊符号也没有特殊含义,但是 $ 和 ` 和 \ 是例外!
反引号 :
小括号、中括号、大括号
bash是可以手动开启的,每bash一下就是开启一个shell ,相应的就会有父shell 和 子 shell
bash 前
bash后:
注:最明显的感觉就是当你新开启一个shell后,你刚才执行的历史命令调用不出来。
大括号{ } 和 小括号( )
区别:
² ()执行一串命令时,需要重新开一个子shell进行执行
² {}执行一串命令时,是在当前shell执行
² ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
² ()最后一个命令可以不用分号
² {}最后一个命令要用分号
² {}的第一个命令和左括号之间必须要有一个空格
² ()里的各命令不必和括号有空格
实验:
² () 中执行命令时,新开启shell 进行
² { } 执行命令时,就在本shell中进行
注释
脚本注释: # // ;
编程器注释:/* $$$ */ <!-- $$$ -->
Bash的变量和运算符
变量是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问,在指令式语言中,变量通常是可变的.
赋值符号:=
两侧不能有空格
值:
若值当中有空格,则需要将整个值用引号(单、双、反)作为一个整体
a='123'
b="echo $x"
c=`date`
查看:
set 所有生效了的变量
定义变量的规范:
² 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格。如果变量名是“2name”则是错误的。
² 如果当中有空格,则需要将整个值用引号作为一个整体 (单,双,反)
² 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
² 变量用等号连接值,等号左右两侧不能有空格。
² 变量的值如果有空格,需要使用单引号或双引号包括。如:“test="hello world!"”。其中双引号括起来的内容“$”、“\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。
² 双引号“ ”括起来的 $ \ `` 都有特殊含:
² 单引号括起来的都是普通字符
在变量的值中,可以使用“\”转义符。
² 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含 "$变量名" 或用 ${变量名} 包含变量名。
² 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
² 环境变量名建议大写,易于区分
set:查看变量 / 自定义变量 / 取消变量:
包含env环境变量
遵循设置规范:变量的设置规范(数字、字母、下划线)
set 变量 :查看变量
set :
set -u +u
/etc/bashrc
/etc/profile
set-u :设置后,如果调用没有声明的变量或没有的变量就会报错,如rm删除等,临时设置,要永久需要更改/etc/bashrc,,/ect/prfile,中的文件,二选一
set -x +x
在输出命令结果之前,将命令本身输出一次,辅助功能
unset :取消变量,只能取消临时变量
环境变量
² 环境变量设置
export AGE=18
export 声明的是环境变量
² 环境变量查询和删除
env命令:查看环境变量
env命令和set命令的区别是,set命令可以查看所有变量,而env命令只能查看环境变量。
ü 系统默认的环境变量
env 现实所有环境变量
env命令可以查询到所有的环境变量,可是还有一些变量虽然不是环境变量,却是和Bash操作接口相关的变量,这些变量也对我们的Bash操作终端起到了重要的作用。这些变量就只能用set命令来查看了。
PATH变量
保存所有存放命令路径的变量,(变量叠加)
ü PATH变量:系统查找命令的路径
PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。
我们可以考虑把自己写的脚本放入这些目录,实现直接调用(当命令使用)
或者:
我们修改PATH变量的值,而不是把程序脚本复制到/bin/目录中,以后所有写入这个目录的脚本都可以直接执行。
上边写的这些变量的定义啊,叠加啊,修改啊,什么的都是临时的。
PS1变量 (使用单引号)
ü PS1变量:命令提示符设置
PS1是用来定义命令行的提示符的,可以安装我们自己的需求来定义自己 喜欢的提示符。PS1可以支持以下这些选项:
u \d:显示日期,格式为“星期月日”Ø
u \H:显示完整的主机名。如默认主机名“localhost.localdomain”
u \h:显示简写主机名。如默认主机名“localhost”
u \t:显示24小时制时间,格式为“HH:MM:SS”
u \T:显示12小时制时间,格式为“HH:MM:SS”
u \A:显示24小时制时间,格式为“HH:MM”
u \@:显示12小时制时间,格式为“HH:MM am/pm”
u \u:显示当前用户名
u \v:显示Bash的版本信息
u \w:显示当前所在目录的完整名称
u \W:显示当前所在目录的最后一个目录
u \#:执行的第几个命令
u \$:提示符。如果是root提示符为“#”,如果是普通用户提示符为“$”
想要使用这些必须先知道定义的规范,来看下官方的PS1:
定义ps1的值时需要注意单引号,否则不生效
随便玩,玩坏了记得改回来!
LANG语系变量
echo LANG :查看当前系统语系
LANG定义的是Linux 的主语系环境变量:
这是因为我们Linux安装时,选择的是中文安装,所以默认的主语系变量是“zh_CN.UTF-8”。那么Linux中到底支持多少语系呢?我们可以使用以下命令查询:
或者 用 wc –l 统计下一共支持多少!
我们当前是什么语系可以用locale 直接查询!
配置文件也能查询到我们的默认语系:
这又是当前系统语系,又是默认语系,有没有快晕倒的感觉。解释下吧,我们可以这样理解,默认语系是下次重启之后系统所使用的语系,而当前系统语系是当前系统使用的语系。如果系统重启,会从默认语系配置文件/etc/sysconfig/i18n中读出语系,然后赋予变量LANG让这个语系生效。也就是说,LANG定义的语系只对当前系统生效,要想永久生效就要修改/etc/sysconfig/i18n文件了。
说到这里,我们需要解释下Linux中文支持的问题。是不是我们只要定义了语系为中文语系,如zh_CN.UTF-8就可以正确显示中文了呢?这要分情况,如果我们是在图形界面中,或者是使用远程连接工具(如SecureCRT),只要正确设置了语系,那么是可以正确显示中文的。当然远程连接工具也要配置正确的语系环境,具体配置方式可以参考Linux系统安装章节。
那么如果是纯字符界面(本地终端tty1 -tty6)是不能显示中文的,因为Linux的纯字符界面时不能显示中文这么复杂的编码的。如果我们非要在纯字符界面显示中文,那么只能安装中文插件,如zhcon等。
远程连接的显示:
字符终端的显示:
安装有图形界面的Linux,所以,那些乱码就是我的中文目录。
位置参数变量
$@ $* 都是接收除了命令本身以外的所有参数,接收方式不同:
$*: 将所有参数当成一个整体(一个值)进行接收
$@: 将每一个参数分别接收到自己的变量中
脚本1:
·
脚本2:
v $*显示所有参数(作为整体接收)
v $@显示所有参数(分开接收)
v $#显示参数个数
预定义变量
$? 根据返回值判断上一条命令的执行结果
$$ 获取当前bash解析器的PID
$! 获取当前终端最后一条正在后台执行的进行PID号
v $? 错误数值是非0 的,正确的是0
v $$ 当前进程的PID
$! 最后一个后台执行的命令的进程
read接收键盘输入
read [选项] [变量名]
-p “提示信息”:在read等待时输入的信息
-t 秒数 :read等待的秒数
-n 字符数:read最多能接收的字符数(达标即执行)
-s :隐藏输入信息
假如因为特殊选项不换行,用echo 来实现换行。
变量名定义:
ü 变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY
ü 如果只提供了一个变量名,则整个输入行赋予该变量
ü 如果提供了一个以上的变量名,则输入行分为若干字,一个接一 个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值
declare声明变量类型
命令:declare [+/-] [选项] 变量
- : 给变量设定类型
+ : 取消变量的类型
-a : 将变量声明成数组型
-i : 将变量声明成整数型
-r : 将变量声明成只读(变量值不能修改,也不能删除,更不能取消只读选项)
-x : 将变量声明成环境变量
-p : 显示指定变量的类型及内容
数组型
数组,其实是多个相同类型的元素组成的集合,用于解决复杂的数据统计和计算,我们在shell中基本不会涉及到太多的算法和计算,所以数组了解下就可以了。数组的名字即变量的名字是同一个变量名,我们在变量名后面加上编号来区分单个变量,数组变量又称下标变量。
注:数组的下标从0开始,调用数组的元素时要使用${数组[下标]}的格式
我们刚才貌似没有使用declare 声明
当我们使用“变量名[下标]” 这样的格式定义变量时,自动识别成数组
整数型
之前我们曾经写过让两个数字相加的脚本,但是貌似结果不尽人意,那么我们现在将我们的变量声明成整数型再来试试。。。
shell种如果想进行数值运算,暂时只能先这样了。
环境变量
我们可以用declare 将变量声明成环境变量,和我们的export是同样的效果。
declare –x 变量名 (环境变量的名字尽量大写)
写完后可以使用env命令查看下!
只读变量
只要对变量设置了只读属性,这个变量只能进行调用,不能进行修改和删除,甚至不能进行取消只读选项。坑爹啊。。。
这个流氓,怎么办?。。。
查询变量和取消变量属性
变量属性查询可以使用-p,会列出变量设置时使用的参数;变量属性的取消使用 + 来实现。
使用expr 或 let 数值运算个工具
这两个是直接声明运算是数值运算,而不是通过声明变量的方式,所以相对简单,但是要注意格式:
expr 使用时需要注意的是,在运算符两边要有空格,否则不会正常运算。,
let 则相对简单易用,原理相同,格式略微变化:
let 还能进行自增增减,或者指定增加减少多少 !
自增&自减
指定增减量
不管是expr 还是 let 都能实现数值运算,看个人使用习惯。
ü 使用“$((运算式))”或“$[运算式]”格式进行运算
同样两种格式都能实现数值运算,看个人喜欢,习惯。
以上三种数值运算方式选择哪一种都可以,在脚本中常见的是$((运算式))。
shell 常用运算符
运算符的优先级,就是当有多个运算符同时存在时,谁先进行数值计算, 但是有时也是有特殊情况的比如:
加减乘除
、
按照表格的优先级是乘除优先于加减,但是由于加减被()调用,所以,括号的优 先级高于乘除。
取模运算
取模运算和取余运算绝大部分是重叠的,但是一个是计算机术语,一个是数学概念, 区别在于取模运算对负数处理不太一样。
逻辑与
变量的测试与内容置换(作为了解即可)
例1:x=${y-新值}
当没有:时,y不存在时x=新值,y为空时x=空,y有值时x=$y
当有:时,y不存在时x=新值,y为空时x=新值,y有值时x=$y
注:x=${y+新值} 与 x=${y-新值} 相反!
环境变量的配置
source命令
刷新修改过的配置文件使其生效
环境变量配置文件
登录系统时生效的环境变量配置文件
² /etc/profile
² /etc/profile.d/*.sh
² ~/.bash_profile
² ~/.bashrc
² /etc/bashrc
文件的调用顺序是:
在用户登录过程先调用/etc/profile文件在这个环境变量配置文件中会定义这些默认环境变量:
² USER变量:根据登录的用户,给这个变量赋值(就是让USER变量的值是当前用户)。
² LOGNAME变量:根据USER变量的值,给这个变量赋值。
² MAIL变量:根据登录的用户,定义用户的邮箱为/var/spool/mail/用户名。
² PATH变量:根据登录用户的UID是否为0,判断PATH变量是否包含/sbin、/usr/sbin和/usr/local/sbin这三个系统命令目录。
² HOSTNAME变量:更改主机名,给这个变量赋值。
² HISTSIZE变量:定义历史命令的保存条数。
² umask:定义umask默认权限掩码。注意/etc/profile文件中的umask权限是在“有用户登录过程(也就是输入了用户名和密码)”时才会生效。
² 调用/etc/profile.d/*.sh文件,也就是调用/etc/profile.d/目录下所有以.sh结尾的文件。
由/etc/profile文件调用/etc/profile.d/*.sh文件
² 这个目录中所有以.sh结尾的文件都会被/etc/profile文件调用,这里最常用的就是lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件。/etc/sysconfig/i18n这个文件眼熟吗?就是我们前面讲过的默认语系配置文件。
由/etc/profile文件调用~/.bash_profile文件。 ~/.bash_profile文件就没有 那么复杂了,这个文件主要实现了两个功能:
² 调用了~/.bashrc文件。
² 在PATH变量后面加入了“:$HOME/bin”这个目录。那也就是说,如果我们在自己的家目录中建立bin目录,然后把自己的脚本放入“~/bin”目录,就可以直接执行脚本,而不用通过目录执行了。
由~/.bash_profile文件调用~/.bashrc文件
在~/.bashrc文件中主要实现了:
² 定义默认别名,所以我们把自己定义的别名也放入了这个文件。
² 调用/etc/bashrc
由~/.bashrc调用了/etc/bashrc文件在/etc/bashrc文件中主要定 义了这些内容:
² PS1变量:也就是用户的提示符,如果我们想要永久修改提示符,就要在这个文件中修改
² umask:定义umask默认权限。这个文件中定义的umask是针对“没有登录过程(也就是不需要输入用户名和密码时,比如从一个终端切换到另一个终端,或进入子Shell)”时生效的。如果是“有用户登录过程”,则是/etc/profile文件中的umask生效。
² PATH变量:会给PATH变量追加值,当然也是在“没有登录过程”时才生效。
² 调用/etc/profile.d/*.sh文件,这也是在“没有用户登录过程”是才调用。在“有用户登录过程”时,/etc/profile.d/*.sh文件已经被/etc/profile文件调用过了。
这样这五个环境变量配置文件会被依次调用,那么如果是我们自己定义的环境变量应该放入哪个文件呢?如果你的修改是打算对所有用户生效的,那么可以放入/etc/profile环境变量配置文件;如果你的修改只是给自己使用的,那么可以放入~/.bash_profile或~/.bashrc这两个配置文件中的任一个。
可是如果我们误删除了这些环境变量,比如删除了/etc/bashrc文件,或删除了~/.bashrc文件,那么这些文件中配置就会失效(~/.bashrc文件会调用/etc/bashrc文件)。那么我们的提示符就会变成:
注销时生效的环境变量配置文件
在用户退出登录时,只会调用一个环境变量配置文件,就是~/.bash_logout。这个文件默认没有写入任何内容,可是如果我们希望再退出登录时执行一些操作,比如清除历史命令,备份某些数据,就可以把命令写入这个文件。
其他配置文件
还有一些环节变量配置文件,最常见的就是~/.bash_history文件,也就是历史命令保存文件。这个文件已经讲过了,这里我们只是把它归入环境变量配置文件小节而已。
shell登录信息
/etc/issue
我们在登录tty1 -tty6这六个本地终端时,会有几行的欢迎界面。这些欢迎信息是保存在哪里的?可以修改吗?当然可以修改,这些欢迎信息是保存在/etc/issue文件中,我们查看下这个文件:
\r \m 等是支持的转义符,查询可用man agetty
\d :显示当前系统时间
\s :显示操作系统名称
\l :显示登录的终端号
\m :显示硬件体系结构,如i386、i686等
\n :显示主机名
\o :显示域名
\r :显示内核版本
\t :显示当前系统时间
\u :显示当前登录用户的序列号
/etc/issue.net
etc/issue是在本地终端登录是显示欢迎信息的,如果是远程登录(如ssh 远程登录,或telnet远程登录)需要显示欢迎信息,则需要配置 /etc/issue.net这个文件了。使用这个文件时由两点需要注意:
- 首先,在/etc/issue文件中支持的转义符,在/etc/issue.net文件中不能使用。
- 其次,ssh远程登录是否显示/etc/issue.net文件中的欢迎信息,是由ssh的配置文件决定的。
如果我们需要ssh远程登录可以查看/etc/issue.net的欢迎信息,那么首先需要修改ssh的配置文件/etc/ssh/sshd_config,加入如下内容:
然后定义/etc/issue.net 后就能显示欢迎信息了。
/etc/motd
/etc/motd文件中也是显示欢迎信息的,这个文件和/etc/issue及 /etc/issue.net文件的区别是:/etc/issue及/etc/issue.net是在用户登录之前显示欢迎信息,而/etc/motd是在用户输入用户名和密码,正确登录之后显示欢迎信息。在/etc/motd文件中的欢迎信息,不论是本地登 录,还是远程登录都可以显示。
定义bash快捷键
查看所有已存在的快捷键
修改快捷键
stty 关键词 快捷键
*************************************
shell高级
正则表达式
概述
在上一章说过正则表达式和通配符的区别(正则表达式用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名)吗?其实这种区别只在Shell当中适用,因为用来在文件当中搜索字符串的命令,如grep、awk、sed等命令可以支持正则表达式,而在系统当中搜索文件的命令,如ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。
基础正则表达式(grep命令)
v 匹配练习
* :前一个字符匹配0次或任意多次(连续)
如果正则表达式写成“aa*” 代表匹配至少包含有一个a的行
. :匹配换行符以外的任意一个字符
正则表达式“.”只能匹配一个字符,可以是任意字符
^ :匹配行首,
$ :匹配行尾
用“^$”匹配空白行
[ ] :会匹配中括号中指定任意一个字符,注意只能匹配一个字符。比如[ao]要不匹配一个a字符,要不匹配一个o字符
[0-9] [a-z] [A-Z] 类似这样的都可以,指定匹配的范围
[^0-9]匹配除了数字以外的任意一个字符
^[^a-zA-Z]这个代表啥呢??
\ :转义符
将特殊符号转义成普通符号,比如我们的 .
\{n\} 表示前面的字符恰好出现n次
\{n,\} 表示其前面的字符出现不小于n次
\{n,m\} 匹配其前面的字符出现不小于n次,最多出现m次
扩展正则表达式(egrep命令或grep -E)
熟悉正则表达式的童鞋应该很疑惑,在正则表达式中应该还可以支持一些元字符,比如“+”“ ? ”“|”“( )”。 其 实Linux是支持这些元字符的,只是grep命令默认不支持而已。如果要想支持这些元字符,必须使•命令或grep -E选项,所以我们又把这些元字符称作扩展元字符。
如果查询grep的帮助,对egrep的说明就是和grep -E选项一样的命令,所以我们可以把两个命令当做别名来对待。通过下面表格来看看Shell中支持的扩展元字符:
使用egrep或grep –E 时,不需要转义符
cut列提取命令
cut [选项] 文件名
-f 列号:提取第几列
-d 分隔符:按照指定的分割符进行分割
-c 字符范围:不依赖分割符来分割,而是通过字符范围进行字段提取(“-m”表示从第一个字符提取到第m个,“n-m”表示从第n提取到第m个字符,“n-”表示从第n个字符开始提取到结尾。)
注意:空格被默认为字符,所有不支持,只能使用(Tab键)
手动创建文本,添加内容列之间用制表符分割
#假如用空格隔开,那么可能会别认定为是同一列。
我们可以使用-d 指定分割符号,比如/etc/passwd
#通过指定分割符的方式来确定如何额进行分割,我们把/etc/passwd按照:分割,截取第一个第七字段,就能统计哪些用户能登录系统,哪些不能登录。
cut 可以按照字符数进行截取,按照我们上面的格式写就OK了
now,我们来截取下df –h 命令的结果!
cut 命令默认的分割符是制表符,即tab键,对于空格的支持比较差
printf 格式化输出
print 和 printf 的主要区别在有 printf 是标准的格式化输出,必须手动指定换行和tab。
输出格式类型:
printf 和 print 的区别
#查看df 的真实分区的使用情况,不看光盘和虚拟磁盘
使用printf输出下我们的表格文件
printf输出下
printf ‘ %s ’ $(cat bg.sh)
printf命令,如果不指定输出格式,则会把所有输出内容连在一起输出。其实文本的输出本身就是这样的,cat等文本输出命令之所以可以按照格式漂亮的输出,那是因为cat命令已经设定了输出格式。那么为了用printf输出合理的格式,应该这样做:
printf ‘%s\t%s\t%s\t%s\t\n‘ $(cat bg.sh)
我们要按照整数型和浮点型输出,则需要修改为:
printf ‘%i\t%s\t%8.2f\t%s\t\n‘ $(cat bg.sh | grep –v ID)
awk命令
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。
awk基本使用
awk ‘条件1{动作1} 条件2{动作2} ……’ 文件名
条件:一般使用关系表达式作为条件
x>10 判断x变量是否大于10
x==y 判断变量x是否等于变量y
A ~ B 判断字符串A中是否包含能匹配B表达式的字符串
A!~ B 判断字符串A中是否不包含能匹配B表达式的字符串
动作:格式化输出
显示bg.sh 中的第二和第三列信息
还记的cut 来截取df –h 的结果吗?用我们的awk试试吧!
awk的条件
BEGIN:处理文件之前执行
BEGIN是awk的保留字,是一种特殊的条件类型。BEGIN的执行时机是“在awk程序一开始时,尚未读取任何数据之前执行”。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据,BEGIN的条件就不再成立,所以BEGIN定义的动作只能被执行一次。例如:
整个动作定义了两个动作,先打印“this is a transcript”,然后输出过滤后的2和4列
END:处理文件之后执行
END也是awk保留字,不过刚好和BEGIN相反。END是在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。例如
其实就是和BEGIN正好相反!
关系运算符
设定条件,符合条件的才会进行相应动作,不满足不运行
设定条件为>=30岁的列出。
u awk是列提取命令,第一步的动作却是先读入第一行,整个执行步骤:
Ø 如果有BEGIN条件,则先执行BEGIN定义动作
Ø 如果没有BEGIN条件,则先读入第一行,把第一行的数据依次赋成$0 $1 $2 $3 …等变量,$0 代表整行数据,$1 则为第一个字段,依次类推。
Ø 读入下一行,重复赋值变量
正则表达式、刚才看到了,我们识别字符串用的是// 这是awk 的正则
awk内置变量
注意:
- awk中变量不能用$
- 多条件中间用空格。指条件{动作}间
- 一个动作内多条命令时用”;”间隔
- 用 == 进行判断
- 用 = 赋值
#BEGIN的作用,不写的时候直接输出$0 即第一行。
#将上述命令中的grep “/bin/bash”去掉,sshd是伪用户。
awk流程控制
先准备好操作文档,如下
在awk中定义和调用变量
在awk编程中,因为命令语句非常长,输入格式时需要注意以下内容:
² 多个条件{动作}可以用空格分割,也可以用回车分割。
² 在一个动作中,如果需要执行多个命令,需要用“;”分割,或用回车分割。
² 在awk中,变量的赋值与调用都不需要加入“$”符。
² 条件中判断两个值是否相同,请使用“==”,以便和变量赋值进行区分。
假如年龄小于25岁,则输出 $2 is young man
、
按照成绩来过滤,并显示相应信息。
awk函数
awk在编程时允许使用函数,函数定义方法:
function 函数名 (参数列表){
函数体
}
通过定义的函数格式,去匹配并传递参数。
awk中调用脚本
对于小的单行程序来说,将脚本作为命令行自变量传递给awk是非常简单的,而对于多行程序就比较难处理。当程序是多行的时候,使用外部脚本是很适合的。首先在外部文件中写好脚本,然后可以使用awk的-f选项,使其读入脚本并且执
awk –f pass.awk /etc/passwd
例
- awk 'BEGIN{FS=":"} $3>30{printf $2"\t"$4"\n"}' name.txt
有BEGIN,先指定BEGIN对应的动作,再读取指定文本进行处
- awk '$2~/sc/{printf $2"\n"}' name.txt
当读取要处理的数据时,按照一行一行的方式进行顺序读取,根据默认的或指定的分割符进行 分割赋值
- df -h|awk '/\/dev\/sda[0-9]/{printf $0"\n"}'
根据条件进行判断,将符合条件的对象按照 指定格式输出 (printf)
- awk'NR==2{a1=$3} NR==3{a2=$3} NR==4{a3=$3;a=a1+a2+a3;printf "zs+sc+lc="a"\n"}' name.txt
所有数据都处理完成后,最终执行END对用的动作,结束
- awk -F : '$3<500{printf $1"\t"$7"\n"}' /etc/passwd
- awk '{print $1}' logfile | sort| uniq -c |sort -rn
第一个 sort 的目的是重新排序,为uniq -c 做准备,sort -rn 的目的是按访问量从大到小进行排序
sed命令
sed主要是来进行数据选取,替换,删除,新增的命令
非交互式文本处理器
Sed会把所有输出默认定向到屏幕
用-i才能保存文件
选项:
u -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
u -e:允许对输入数据应用多条sed命令编辑。
u -f 脚本文件名:从sed脚本中读入sed操作。和awk命令的-f非常类似。
u -r:在sed中支持扩展正则表达式。
一般使用在进行匹配是 要求使用正则表达式时 加入
基础正则表达式可以直接使用,不加 -r
扩展正则表达式,则必须使用 -r 选项声明才能调用
u -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
u p:打印,输出指定的行。
u a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
u i \:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
u c \:整行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。
u d:删除,删除指定的行。
u s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/ 旧字串/新字串/g”( 和vim中的替换格式类似)
对sed命令我们要知道的是,它所有的修改都不会直接修改文件的内容,而是在内存中进行处理然后打印到屏幕上,使用 -i 选项才会保存到文本中。
实例:
行数据操作
显示某行的信息
sed ‘2p’文件
-n 显示时只显示指定的行进行显示
删除数据
sed ‘2,4d’文件
用sed 删除掉的文件内容并没有真的修改文件
追加、插入数据
sed ‘2[ a | i ]’ 文件名
a 在指定行后面追加,i 在指定行前面插入
假如要追加多行,则需要用 \ 作为一行的结束,最后一行不需要。
-n 的作用是只显示追加部分!
整行替换数据
sed ‘2c No such person’
上面我们做了很多操作,但是所有的操作都没有保存到源文件中,假如你确定你就是要修改此文档,请在sed 后面跟上-i 选项,但请一定要小心,(最好是先不带i 预先设置看下结果,然后再加上i选项)
字符串替换
c 进行整行替换,假如想进行关键词替换(一行中的一部分),我们需要用s 来进行替换,格式:
sed ‘ns/old/new/g’ 文件名 #n代表第几行
顺便把sc 的成绩注销掉,让他补考去吧!
将指定内容替换成空
sed 要进行多行操作时,只能通过-e 写多条操作语句,用;或回车分隔。
sort字符处理命令
sort 排序命令
sort 选项 文件名
-f 忽略大小写
-b 忽略每行前的空白部分
-n 以数值型进行排序,默认使用字符串类型排序
-r 反向排序
按照关键词前的统计结果进行排序(-n 用数值型排序)
-u 删除重复行(=下面的uniq)
-t 指定分隔符,默认分割符是制表符
-k n[,m] 按照指定字段范围排序,从n字段开始到m字段结束。
sort 将每一行当做一个整体,多行之间进行对比,对比方式:逐个字符比较,按照ASCII编码升序进行 排列
若要按照标准的英语ASCII编码进行排序,需要取消掉当前的语系类型(unset LANG;sort -f /test/b >> a.txt)
例
sort b.txt | uniq -c | sort -rn
sort 为了将重复行排列到一起
uniq -c 统计重复行出现的次数
sort 命令默认使用每行开头第一个字符进行排序
假如 要进行反向排序则需要加-r 选项
按照指定的排序字段进行排序,使用-t 指定分割符 , 并且使用-k 指定段号
#有问题!排序并不是0 1 2 3 。。。
oh,好了,看来之前的排序方式是字符排序,而加上-n 之后成为了数值排序。
指定范围时我们可以写 –k 3,5 也可以写3,3 ==
uniq取消重复行
必先sort在uniq,因重复行不连续时uniq不处理!!!
uniq用来取消重复行,与sort –u 是一样的,格式:
uniq 选项 文件名
- i 忽略大小写
- c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。
统计连续的重复行出现次数(将统计结果标记在关键词 前)
- d 只显示重复行。
- u 只显示文件中不重复的各行。
- n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
- f n 与- n相同,这里n是字段数。
- s n 与+n相同,这里n是字符数。
需要注意的是,当重复行不连续时,uniq是不生效的,需要先排序,再执行
统计命令WC
wc [选项] 文件
c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数
sleep命令 :延时执行
sleep 1 :睡眠1秒
sleep 1s :睡眠1秒
sleep 1m : 睡眠1分
sleep 1h :睡眠1小时
实例
#!/bin/bash
b=' '
for ((i=0;$i<=100;i++))
do
printf "Progress:[%-100s]%d%%\r" $b $i
sleep 0.1s
b=#$b
done
按照文件类型进行判断
使用 [ ] 括号来进行判断,利用 $? 来检测判断结果
#注意 [ ] 中内容和括号之间有空格
#我们可以结合之前所学的&& 和 || 实现
按照文件权限进行判断
测试:
两个文件之间进行比较
判断下我们的硬链接
两个整数之间进行比较
测试
字符串的判断
上面是判断字符串,若是要判断变量,就要加双引号
判断变量是否为空要用双引号“”,
测试
#字符为空和没有赋值都为空
多重条件判断
测试:逻辑与
逻辑非
-n 变量不为空,则为真
! 加入后,判断取反,所以变量为空才是真
if条件判断
单分支if条件语句
单分支条件语句比较简单,只需要一个判断条件,符合则执行,不符合则直接退出。
格式:
if [ 条件判断式 ];then
程序
fi
注意事项:
- if 语句使用fi结尾,和一般语言使用大括号结尾不一样
- [ 条件判断式 ] 就是使用test 命令进行判断,所以中括号和条件判断式之间必须有空格
- then 后面跟符合条件后执行的程序,可以放在 [ ] 之后,加;隔开。也可以使用换行写入(用换行就不必写;了)
if [ 条件判断式 ]
then
程序
fi
统计根分区使用率?
双分支if条件语句
格式:
if [条件判断式]
then
条件成立,执行的程序
else
条件不成立,执行的程序
fi
多分支if分支语句
格式:
if [条件判断式1]
then
条件判断式1成立,执行程序1
elif [条件判断式2]
then
条件判断式2成立,执行程序2
更多………
else
都不成立,则执行此程序
fi
练习:判断文件是什么类型的文件的脚本!
case分支语句
case语句和if...elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case语句语法如下:
case $变量名 in
“值1”)
变量的值等于值1,则执行程序1
;;
“值2”)
变量的值等于2,则执行程序2
;;
省略多个分支…………
*)
变量的值都不匹配上面的值,则执行此程序
;;
esac
注意事项:
- case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不符,则依次比较下一个值。如果所有的值都不符合,则执行“*)”(“*”代表所有其他值)中的程序。
- case 语句以case开头,以esac结尾(切记……)
- 每一个分支需要用;; 结束,注意是everyone!!!
练习:写一个源码apache的启动管理脚本
for循环
for循环是固定循环,循环次数是有限的次数,也叫计数循环。
语法一:
for 变量 in 值1 值2 值3 ……
do
程序
done
注:这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,依次类推。
练习:计算1+2+3+..+10的结果?
语法二:
for ((初始值;循环控制条件;变量变化))
do
程序
done
注:
- 初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;
- 循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;
- 变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。
练习:计算1+2+3+..+100的值?
while循环
只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。
语法:
while [ 条件判断式 ]
do
程序
done
练习:还是1+2+3+..+100=?
until循环
until循环和while循环相反,只要条件判断式不成立,则一直循环,什么时候成立,什么时候结束循环
语法:
until [ 条件判断式 ]
do
程序
done
函数
语法:
function 函数名 () {
程序
}
练习:将1+2+3+..+n写成函数!
注意:function在shell中可以不用输
特殊流程控制语句
exit退出脚本
系统中的exit是退出当前登录 , 但是在shell中则只是退出脚本,后续不再进行执行。
exit [ 值 ]
exit 退出时如果定义好了返回值,那么我们可以通过“$?”来查看
break退出循环
当程序执行到break 语句时,会结束当前的循环,直接退出。
continue跳出循环
continue只会结束当前的单次循环,将本次跳出继续下次循环。
true跟false
true:什么都不做,只设置退出码为0
false:什么都不做,只设置退出码为1
在Linux底下,每个程序执行完毕都会返回一个退出码给调用者,一般情况下0表示成功,其他值表明有问题
引导装载程序设备
- U盘安装时,默认u盘为/dev/sda,硬盘为/dev/sdb,
- 引导文件一定要安装至/dev/sdb(光盘只读不存在这种问题)
a) 虽然系统安装到了硬盘,但引导文件还在u盘上,拔走u盘后开机还会显示无法加载,需引导
*************************************
shell扩展
1.awk NF 变量的特殊使用方式:
head –3 /etc/passwd|awk -F ":" '{printf $(NF=5)"\n"}'
head –n 3 /etc/passwd|awk -F ":" '{printf $(NF=5)"\n"}'
或
head –3 /etc/passwd|awk -F ":" '{printf $(NF-2)"\n"}'
head –n 3 /etc/passwd|awk -F ":" '{printf $(NF-2)"\n"}'
或
awk –F : ‘{printf $wf-2 “\n”}’ /etc/passwd
2.shell计算:
echo `seq 1 10`
取1-10范围内的整数(可直接应用于for的循环结构中)
echo ‘seq 1 10’
可把1-10输出至一行
seq 10 -0.5 -5
也可以实现
seq -f “3g” 1 10
3g:指定数字的位数为3
seq -f “03g” 1 10
03g:指定数字位数为3,不足用0补
seq -w 5 10
指定输出宽度一致,与最大数位数保持一致,不足用0补
不能与-f同时用
seq -f “s*r9003g” 5 10
90前制定字符串,输出:
s*005
s*006--- s*010
seq -s “ ” 5 10
指定分隔符与空格默认为换行
echo可以把\n设为空格,需要外加\t
浮点运算
c=$(echo "5.01-4*2.0"|bc)
echo $c
-2.99
c=$(awk 'BEGIN{print 7.01*5-4.01 }')
echo $c
31.04
BEGIN必须要用,不然会等待输入文件名
数组声明:
declare -a abc :可有可无
abc[0]=1 , abc[1]=2
unset abc :删除整个数组所有信息
unset abc[1] :只删除单个数据,其它数据下标不变
数组赋值:
a、abc=(1 2 3)47
b、a="1 2 3"
abc=($a)
调用数组所有值
echo ${abc[*]}
echo ${abc[@]}
相等
数组长度获取:(元素数,指的是值的数量个数)
数组长度:
$(#abc{@}) 等同于 ${#abc[*]}
元素长度:
echo ${abc[1]} | wc -L
echo -n ${abc[1]} | wc -L
#去掉换行符再统计
数组遍历:
abc=(1 2 3)
a=0
for i in ${abc[@]}
do
echo "第$a个元素的值为:$(i)"
let a++
done
数组元素修改:
abc=(1 2 3)
abc[3]=10
abc=(1 2 3)
bcd=(${abc}[*] 4)
echo $(bcd[*])
数组切片:
abc=(1 2 3 4 5 6 7)
${abc[@]} 等于 ${abc[*]}
${abc[@]:1}
#从下标为1的位置开启取值,直到结尾
并且哪怕开了“set -u”,使用下标超界也不会报错
关键没有任何提示 !!!危险
${abc[@]::3}
#从下标为0的位置连续取3个值
${abc[@]:2:3}
#从下标为2的位置连续取3个值
${abc[@]:(-2):2}
#从倒数第二个下标位连续取2个值
只显示2个值,因第3值不存在,但无任何报错!!!
bcd=(${abc[@]:(-2):2})
#将之前的处理结果赋值给新的数组变量
切片后赋值新数组
元素切片:
abc=(zhangsan lisi laowang laosong)
${abc[0]}
##取第一个元素的所有字符
${abc[0]:1}
#从第一个元素的下标为1位置开始,取剩余所有字符
${abc[0]::3}
#从第一个元素的下标为0位置开始,连续取三个字符串
${abc[0]:2:3}
#从第一个元素的下标为2位置开始,连续取三个字符串
数组替换:
abc=(one two three four)
${abc[@]/e/E}
#每个被匹配元素只替换一次
每个元素中只替换匹配到的第一个字符“e”换为“E”
${abc[@]//e/E}
#每个被匹配元素替换多次
每个元素中替换所有匹配到的“e”换为“E”
${abc[@]/e/}
#每个被匹配元素只删除一个字符
每个元素中删除第一个匹配到的字符“e”
${abc[@]/e/}
#每个被匹配元素删除多个字符
每个元素中删除所有匹配到的字符“e”
abc=(zhangsan lisi laowang laosong)
${abc[0]/#z/Z}
#将数组内第一个元素的首字符z替换成Z
${abc[0]/%n/N}
#将数组内第一个元素的尾字符n替换成N
#若想实现每一个都智能替换,要使用很复杂的循环,暂不建议现在编写
实例:
将1个字符串拆分为多个字符串
a=`echo 2018-04-28_12:15:30_ABC.log |awk -F "." '{printf $1}'| sed -r 's/[-_:]/ /g' | tr -d "[a-zA-Z]"`
abc=(${a})
for i in ${abc[@]}
do
echo $i
done
echo 2018-04-28_12:15:30_ABC.log | sed -r 's/[-_:]/ /g' | grep -v “[a-Z]”
echo 2018-04-28_12:15:30_ABC.log | sed “[a-Z]//g” | sed -r 's/[-_:]/ /g'
利用数组求最大值
a=(34 78 3 95 62 59 100)
max=${a[0]}
len=${#a[@]}
for ((i=1;i<$len;i++))
do
if [[ ${a[i]} -gt ${max} ]]
then
max=${a[i]}
fi
done
echo "数组中最大值为:$max"
注意:
单中括号与双中括号区别:
1. 单中括号的test(?)命令才会对变量进行单词分离
a=”a b” [ $a = “a b” ] && echo yes (需用”$a”)
2. 双中括号的test(?)命令不会对变量进行单词分离
a=”a b” [[ $a = “a b” ]] && echo yes
*************************************
shell注意事项
- $ :调用变量值
- 建议安装时修改主机名,因装机时各种文件记录中会记录文件名,建后修改,主机名会在文件中记录的之前的主机名发生冲突,导致部分功能报错
- win中:局域网内主机名一致会直接报错
- linux 中:若多个服务器日志保存到一个位置,最好通过主机名来区分
- 安装依赖包会用到yum,(主要包,还是要求源码包安装)
- 当文件设置acl权限后,其所属组位置不再显示所属组权限,显示的权限位mask权限。
*************************************
Linux启动管理
启动流程自解
如果电脑不支持虚拟器,重启本机电脑,打开BIOS,把物理CPU是否支持虚拟化的开头(打开)
加电自检
- 插电后第一通电的是:主板BIOS程序加载(从内存中加载)
- 检查所有硬件是否正常工作
- 可以通过BIOS程序调整硬件的工作模式
- 要是主板上有二个频率不一致的话,默认是按低频的CPU算的
- 引导项 (BOOT memu):所有可加载的存储设备
- U盘,光盘,硬盘,软盘,网卡等
引导程序加载(boot loader)
- 加载引导菜单提供选择操作系统的选项
- 选择进入操作系统时,进入模式的7种
- 基本上runlevel分为0-6 ,7个等级:
- 0:关机,shutdown
- 1:单用户模式(sigle user),root用户,无须认证;维护模式;。
- 2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
- 3:多用户模式(multi user),完全功能模式;文本字符界面;
- 4:预留级别:目前无特别使用目的,但习惯同3级别使用;
- 5:多用户模式(multi user),完全功能模式,图形界面;
- 6:重启模式,
- 如何找打kernel文件所在位置?
- root (hd0,0)
- 内核如何找到驱动文件&模块文件,模块区分内核版本
- kernel /vmlinuz-2.6.32-642.el6.x86_64 ro
- initrd /initramfs-2.6.32-642.el6.x86_64.img
加载内核(kernel)
所有硬件设备的驱动
系统所需的功能模块(*.ko)
确认系统启动的默认级别(/etc/inittab)
守护进程(内核启动只会加载守护进程)
系统的守护进程(init)
内核启动只加载守护进程
内核3.*前:init
大多自动启动受init管理
内核3.*和3.*以后:systemd
几乎所有的手动或自动启动都受到systemd管理
加载需要开机自启的服务
依靠系统的守护进程init启动各类服务进程
根据系统启动级别确认哪些软件开机自启(/etc/rc.d/rcN.d)(k开头不自启;s开头开机自启)
启动流程详细
按下电源键
插电后第一个设备通电的就是主板BIOS
BIOS自检
BIOS程序加载(从内存里加载)
第一阶段:POST(Power-on-self test),主要检测主机硬件设备如:CPU、内存、硬盘、显卡等是否正常;
在第一阶段完成后会按BIOS中设置的系统启动顺序来搜索可启动的磁盘设备。如:光盘、硬盘、U盘等;搜到第一个可启动的设备后就读取该设备的第一个扇区的内容并执行。到此为止BIOS的任务就完成了。
检查所有硬件是否正常工作
通过BIOS程序可以调整硬件的工作模式
如果主板有二个频率不一致的CPU,默认是按低频率的CPU
系统引导
MBR(Master Boot Record):硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)
加载引导菜单,提供选择操作的系统的选项
选择进入操作系统时,进入模式(7种)也是启动级别
看下面的登录系统
Linux内核启动。
Bootloader为引导加载程序,它的主要功能为:
1、 提供菜单,允许用户选择要启动的系统或不同的内核版本;
2、 加载选定的内核到内存中,解压、展开,而后把系统的控制权交给内核;目前Linux中最常用的Bootloader 为GRUB;
GRUB引导
主要有三个阶段:
stage1:作用很简单就是把第一个扇区读取到内存中,但注意stage1是没有识别文件系统的能力的。
stage1.5:作为stage1和stage2的中间桥梁,stage1.5是有识别文件系统的能力的,此后grub才能去访问/boot/grub目录下的stage2文件,并将stage2载入内存中执行。
stage2:被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。而内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。
初始化系统
内核被加载到内存中并且取得了系统的控制权,在取得控制权后内核会立即初始化系统中的设备,包括CPU、I/O、存储等;
守护进程
关于Linux的设备驱动程序的加载,可能会需要initrd(ramdisk)。因为有一部分驱动程序会被直接编译进内核文件中,另一部分会被以模块的形式放在initrd中;在初始化硬件及加载各硬件驱动程序后,内核会以只读的方式挂载根文件系统,并且运行第一个程序/sbin/init。此后系统的控制权就交给了/sbin/init进程了。
内核3.*前:init
大多自动启动受init管理
内核3.*和3.*以后:systemd
几乎所有的手动或自动启动都受到systemd管理
登录系统
/sbin/init进程是系统第一个启动的程序,它是其他所有进程的父进程。当它接管了系统的控制权先之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。
在niittab中有一个很重要的设置选项runlevel。根据runlevel的不同启动不同的服务,让Linux的使用环境不同。
基本上runlevel分为0-6 ,7个等级:
0:关机,shutdown
1:单用户模式(sigle user),root用户,无须认证;维护模式;。
2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式(multi user),完全功能模式;文本字符界面;
4:预留级别:目前无特别使用目的,但习惯同3级别使用;
5:多用户模式(multi user),完全功能模式,图形界面;
6:重启模式,
系统启动脚本配置文件
系统初始化的过程主要是执行一些脚本配置文件来完成的:
1、执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式 挂载 根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。
2、执行/etc/rc.d/rc脚本。该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rc*.d(*=0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rc*.d下的文件。
3、执行用户自定义引导程序/etc/rc.d/rc.local完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。
最后一步输入用户名及密码就可以登入系统了。
如果看不清楚 请看附件
配置文件
grub.conf
grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动。
default
default:定义默认启动的操作系统
timeout
timeout:定义选择操作系统菜单的等待时间
splashimage
splashimage:指定我们选择kernel或操作系统菜单后面那张图片。如果定义,这张图片需要用linux自带的软件xmp制作,在图形界面可以打开。图片的特点为:
1,必须是xpm的格式
2,必须用gzip压缩
3,最多使用14位的颜色位数
4,分辨率640*480
hiddenmenu
hiddenmenu:表示隐藏选择k操作系统的菜单,只有出现等待界面后按下enter键才会出现。如果没有这个字段,则每次系统启动都会出现这个选择菜单。
title identify:指定一个操作系统,linux中可以有多个title;identify是这个操作系统的识别符,可以随意写。
root:用于指定grub所能识别的根,而不是根文件系统。
kernel:用于指定系统的内核文件的位置
initrd:帮助kernel完成系统的启动,例如加载根文件系统所在分区的驱动等。如果kernel本身有相应强大的功能,则不需要initrd
password
password:设定密码。放在title外表示进入操作系统等待菜单的编辑模式需要密码,而放在title内表示启动对应的操作系统需要密码,密码可以是明文或是用MD5进行加密过的。可以防止其他人进入编辑kernel菜单进入单用户模式启动我们的系统
实验:
背景图片的位置:
splashimage=(hd0,0)/grub/splash.xpm.gz
grub是以hd来识别磁盘的,第一磁盘为hd0,第二个磁盘为hd1...,
而hd0,0表示第一个磁盘的第一个分区,hd0,1表示第一个磁盘的第二个分区...,并且grub是直接读分区来找到对应的文件;
而我的系统上只有一块硬盘,并且/boot是一个单独的分区,并且为系统的第一个分区,grub等文件在这个分区上。(如果你的系统上/是一个独立分区,并且boot,grub和其中的文件都在/这个分区中,则这段应该是: splashimage=(hd0,0)/boot/grub/splash.xpm.gz)所以它的意思是:grub在第一个分区中找到grub这个目录,再找到这个图片文件作为背景.
修改背景图片:
生成所需的xpm格式的图片文件
使用ImageMagick命令将普通的.jpg.bmp等生成xpm文件
- convert –resize 640x480 -colors 14 源文件 生成文件
- gzip 文件名
- 将生成的文件导入到/boot/grub/下(导入前先将源文件备份)
grub 加密:
password --md5 $1$UrprW0$UzN7ozenwICzcPCQgiFts1
表示要想进入kernel的编辑菜单,需要输入密码。这个密码可以通过命令grub-md5-crypt生成。
密码添加在title前面
将密码放在这个位置时,在选择grub菜单时就需要输入密码了。
密码添加在title后面
密码在这个位置时,选择完操作系统后,在进入系统引导时才需要输入密码。
root密码找回
- 重启系统后出现GRUB界面在引导装载程序菜单上,用上下方向键选择你忘记密码的那个系统键入“e” 来进入编辑模式。
- 接下来你可以看到如下图所示的画面,然后你再用上下键选择最新的内核(这里是第二行,kernel..),然后继续按“e”键。
- 然后在编辑界面rhgb quiet后面加“空格”,然后键入“single”,或者直接输入数字的“1”并回车确定。
- 回车后,按“b”键启动进入单用户模式,在这里修改root的密码。
手动安装grub
一般在grub被覆盖的情况下我们需要进行手动的安装grub到我们的MBR中,那现在的问题是grub已经损坏了,我们没有一个可以交互写命令的地方了,应该怎么设置呢?so…我们要借助光盘上的拯救模式。
根据提示加载光盘上的虚拟系统后,我们需要手动安装下grub
a. chroot /mnt/sysimage
由于是光盘启动的救援模式,so….它的根目录是虚拟的,我们需要用chroot命令将真根目录挂载回来
b. 执行grub 进入交互界面
root (hd0,0) #设置grub的主目录
setup (hd0) #直接将grub安装到MBR中,不需要指定分区(硬盘开头)
quit
c. 重启
内核模块
模块位置:
/lib/modules/2.6******/kernel/
模块保存文件:
/lib/modules/2.6******/modules.dep
depmod:模块同步到modules.dep中
depmod
-a 扫描所有,并写入*.dep
-A 扫描新模块,并写入*.dep
-n 显示到屏幕,不写入*.dep
查看内核模块
lsmod 查询所有模块的信息
modinfo 查询某模块的简单信息
添加删除内核模块
modprobe [选项] 模块
a. 下载到相应的模块
b. 复制到指定位置,一般/ib/modules/2.6******/kernel/
c. 用depmod进行扫描,将新模块写入modules.dep文件中
d. 用modprobe进行安装
*************************************
Linux服务管理
服务分类
二进制包
1. 快速安装、卸载、升级和管理软件
2. 安装简洁、速度快
3. 经过封装,无法直接获取源代码
4. 功能选择性差,功能定制不灵活
源码包
1. 获得最新的软件版本,及时修复bug
2. 根据用户需要,灵活定制软件功能
RPM包的服务管理
RPM包所安装的软件有特定的管理命令,管理方式分为两种:
独立服务:
所谓的独立启动,就是可以自行管理启动,和其他的软件的启动与否没有关系,不依赖其他软件的启动,此类软件当被调用时会直接响应,处理请求的速度快。目前Linux中绝大多数服务为独立服务。
手动启动:
- 启动脚本启动,/etc/init.d/某服务脚本文件
/etc/init.d/httpd start
2. service服务管理工具
service httpd start | stop | restart
service 服务名 start|stop|restart|reload|......
/etc/init.d/脚本名 start|stop|restart|reload|......
注:服务名=脚本名
自动启动:
1. 使用chkconfig服务自启动工具管理
查看软件的自启动:
chkconfig –list | grep 服务名
chkconfig --list 服务名
设置某服务的自启动:
chkconfig [--level 级别] [独立服务名] [on | off]
chkconfig --list | 2345 服务名 on-off
2. 使用ntsysv工具设置自启动软件
netsysv --level 级别
设置某级别下软件是否自启动
F1 :显示服务的说明信息
在脚本中添加两行信息:
chkconfig:2345 45 55
description: httpd server.
注:两个数字不得大于99
chkconfig --add 脚本名 将脚本添加到自启动管理序列中
chkconfig --del 脚本名 将脚本删除到自启动管理序列中
基于xinetd的服务:
此类服务无法独立启动,必须依赖某一管理服务来启动或者关闭,这个管理服务就是我们xinetd服务了,此服务是Linux的超级守护进程,专门用来管理那些无法自行启动的服务,当客户端请求服务启动时,请求会先被xinetd服务接受,然后xinetd去唤醒对应的服务,打到启动某服务的目的。这类服务不会一直处于开启状态,只有在xinetd服务接受到请求的时候才会唤醒对应服务,处理完后服务关闭,这样大大节省了服务器的资源,但是对应的软件的反应速度没有独立服务反应快。
基于xinetd服务的—telnet
rpm 中集中管理模式
一个大服务:管理多个小服务
此处我们用telnet服务来举栗子!telnet是远程管理命令,但由于传输过程是明文,so… 我们不选用他,我们使用更安全的ssh,telnet的端口是23,我们借助xinetd来启动下我们的telnet。
手动启动xinetd中的某服务
vim /etc/xinetd.d/telnet
此处我们只需要将disable = yes 修改成 no 即可!
然后重新启动xinetd服务(注意我们现在是借助xinetd来管理的telnet)
设置xinetd内的服务自启动
同样借助chkconfig 和 ntsysv 来实现自启动,但是这个地方我们需要注意的是,我们不是设置某个具体服务的自启动,而是设置的xinetd的自启动。
telnet
服务端包装包名:telnet-server
客户端包装包名:telnet
源码包的服务管理
手动启动源码包服务—指定路径启动
eg. /usr/local/apache2/bin/apachectl start | stop | restart …………
绝对路径:
/usr/local/apache2/bin/apachectl start | stop .......
自动启动源码包服务
借助/etc/rc.d/rc.local 或者 /etc/rc.local 实现开机自启
写入手动启动命令即可
借助/etc/rc.local,实现开机自启
vim /etc/rc.local
/usr/local/apache2/bin/apachectl start &
自己编写管理脚本
/etc/init.d/
service + chkconfig
让系统识别源码包
对照刚才看的RPM包安装的httpd的启动脚本文件我们自己写一个让系统识别我们的源码软件。
注意:脚本中有两句话必须存在!作用让chkconfig识别此脚本,并能执行。
tcpdump命令
tcpdump命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析
tcpdump(选项)
-a:尝试将网络和广播地址转换成名称;
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-e:在每列倾倒资料上显示连接层级的文件头;
-f:用数字显示网际网络地址;
-F<表达文件>:指定内含表达方式的文件;
-i<网络界面>:使用指定的网络截面送出数据包;
-l:使用标准输出列的缓冲区;
-n:不把主机的网络地址转换成名字;
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件读取数据包数据;
-s<数据包大小>:设置每个数据包的大小;
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间戳记;
-tt: 在每列倾倒资料上显示未经格式化的时间戳记;
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-x:用十六进制字码列出数据包资料;
-w<数据包文件>:把数据包数据写入指定的文件。
实例
直接启动tcpdump将监视第一个网络接口上所有流过的数据包
tcpdump
监视指定网络接口的数据包
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。
监视指定主机的数据包
打印所有进入或离开sundown的数据包。
tcpdump host sundown
也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包
tcpdump host 210.27.48.1
打印helios 与 hot 或者与 ace 之间通信的数据包
tcpdump host helios and \( hot or ace \)
截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
tcpdump ip host ace and not helios
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截获主机hostname发送的所有数据
tcpdump -i eth0 src host hostname
监视所有送到主机hostname的数据包
tcpdump -i eth0 dst host hostname
监视指定主机和端口的数据包
如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令
tcpdump tcp port 23 host 210.27.48.1
对本机的udp 123 端口进行监视 123 为ntp的服务端口
tcpdump udp port 123
监视指定网络的数据包
打印本地主机与Berkeley网络上的主机之间的所有通信数据包
tcpdump net ucb-ether
ucb-ether此处可理解为“Berkeley网络”的网络地址,此表达式最原始的含义可表达为:打印网络地址为ucb-ether的所有数据包
打印所有通过网关snup的ftp数据包
tcpdump 'gateway snup and (port ftp or ftp-data)'
注意:表达式被单引号括起来了,这可以防止shell对其中的括号进行错误解析
打印所有源地址或目标地址是本地主机的IP数据包
tcpdump ip and not net localne
tcpdump –i eth0 –nn –X –vv tcp port 21 and ip host 来源ip
*************************************
Linux系统管理
进程管理
什么是程序?
代替人管理操作系统,完成特定任务,解决特定问题的一段代码集合。
一个看得到,摸得着的代码集合体
什么是进程?
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动。
进程由程序打开后产生的载体
什么是线程?
线程是进程中的一个实体,被称为轻量级进程,是程序执行流的最小单元。
一个线程只能处理一个请求,多个线程可以同时处理多个请求
进程是载体,线程才是负责干活的
进程的作用
- 判断服务器的健康状态:我们可以通过观察服务器的CPU 内存等占用率来提前发现问题,及时解决,避免发生宕机或者服务卡死!
- 查看系统内的进程是否合法:我们要经常过滤进程中查看是否有非法进程在运行,避免信息的泄露或损坏
进程的查看
ps命令(aux跟-le)查看当前一瞬间的进程的状态信息
ps 命令(aux,-le)
静态查看系统中的进程,查询的是命令执行一瞬间的进程的状态。
aux 以BSD操作系统的格式输出
-le 以Linux标准格式输出
选项详解:
a 显示一个终端的所有进程
u 显示进程的归属用户及内存的使用情况
x 显示没有控制终端的进程
l 长格式显示,更加详细的信息
e 显示所有进程 与a的作用一致
ps aux:结果分析
USER:该进程的运行用户,或者理解为产生进程的用户
PID: 进程的PID号
%CPU:进程占用的cpu的百分比
%MEM:进程占用物理内存的百分比
VSZ: 占用的虚拟内存的大小(KB)
RSS: 占用物理内存的大小(KB)
tty:登录终端(Alt+F1-F6)
STAT:
D 无法中断的休眠状态(通常 IO 的进程)
R 正在运行的进程
S 处于休眠状态
T 停止或被追踪
W 进入内存交换(从内核2.6开始无效)
X 死掉的进程(基本很少见 )
Z 僵尸进程
< 优先级高的进程
N 优先级较低的进程
L 被锁进内存的进程
s 进程的领导者(在它之下有子进程)
l 多进程的
+ 位于后台的进程组
START:进程启动时间
TIME:进程运行的时间(总时间),非系统时间
COMMAND:产生此进程的命令
ps-le结果分析
F:进程标志,说明进程有那些权限
1:进程可以复制
4:进程使用超级用户权限
S:进程状态
PPID:进程的父进程ID号
C:cpu占比 %
PRI:进程优先级,数字越小优先级越高,越快被调用执行
NI:进程优先级,数字越小越先被调用
ADDR:进程存在内存的位置
SZ: 进程占用的内存大小
WCHAN:进程是否运行(-代表正在运行)
top 命令 默认每隔二秒刷新一次
top 命令
选项:
-d 秒数:指定刷新频率
-b :使用批处理模式,和-n结合将top的结果重定
向到文本
-n 次数:指定top 次数,和-b结合
-p :指定查看某的PID的进程
-s :使top在安全模式下运行,避免在交互模式下
出现错误
-u 用户名:只查看(监听)某一个用户的进程
在交互模式下使用的命令:
?或h:帮助信息
P:按照CPU使用率排序
M:按照内存使用率排序
N:按照PID号排序
T:按照cpu运算时间排序
k:按照PID号给予某一个进程信发送指令,可用于杀
死进程
r:按照PID给某个进程重设优先级(Nice)值
q:退出交互模式
top 结果分析
第一行信息:
第二行信息:
第三行信息:
第四行信息:
第五行信息:
剩下的选项基本和我们的PS是相同的。
htop
需要安装命令,命令整体跟top差不多,比top智能
拓展:pstree进程树
-p 显示PID
-u 显示运行用户
进程处理命令:
Kill
1. kill 进程号
kill -l #查看kill 所支持的信号
常用的信号:
HUP(1): 复位,重新加载配置
INT (2): 中断(同 Ctrl + C)
TERM(15): 终止(正常退出)
KILL(9): 强制终止
CONT(18):继续(与STOP相反)
STOP(19): 暂停(同 Ctrl + Z)
ps aux | grep “vi” | grep -v“grep”
service httpd reload
kill -1 25606
重新加载配置文件,但不重启进程(保证进程号不改变,保证进程持续工作)软重启 平滑重启
killall
2. killall 进程名
killall -i #交互式,询问是否杀死
killall -I(大) #忽略大小写
常用的信号:
HUP(1): 复位,重新加载配置
INT (2): 中断(同 Ctrl + C)
TERM(15): 终止(正常退出)
KILL(9): 强制终止
CONT(18):继续(与STOP相反)
STOP(19): 暂停(同 Ctrl + Z)
pkill
3. pkill 终端号
pkill -9 -t 终端号 #强制杀死某登录终端
常用的信号:
HUP(1): 复位,重新加载配置
INT (2): 中断(同 Ctrl + C)
TERM(15): 终止(正常退出)
KILL(9): 强制终止
CONT(18):继续(与STOP相反)
STOP(19): 暂停(同 Ctrl + Z)
进程优先级(ps–le)
ps –le 可以查看到进程的优先级
PRI代表的是Priority,NI代表nice 两个都是优先级,但是PRI不能修改,因为这是内核内定义的,无法人为修改,但是我们能修改NI 。
公式:
PRI(最终值)=PRI(初始值)+NI值
76=80+(-4)
我们可以通过这样的方式改变优先级,但是NI也有限制。
NI值总范围
NI值总范围:-20 到 19
普通用户的NI值 : 0 到 19,普通用户只能调高NI值,不能降低;root可以随意调整,包含其他用户的进程
nice跟renice用于修改NI值的命令
nice 命令
nice 命令(只能在启动或重启时)
nice –n -5 service httpd start
ps –le | grep “httpd” | grep –v “grep”
renice
renice 命令(修改启动状态进程的NI值)
renice -10 PID
工作管理
工作类型:
前台:当前终端正在进行标准输出到显示器上的工作
当前终端的工作只能当前终端管理,其它终端不能管理
后台:不用将命令执行过程标准输出到显示器的工作
放入后台的工作必须是能持续运行的,否则程序会被暂停。
bg 恢复到后台运行
fg 恢复到前台运行
详细请看下面的:后台工作的管理
如何将工作放到后台
1. 命令 & :将工作到到后台,并持续执行
2. ctrl + z :将工作放到后台,并暂停执行
后台工作的管理:
查看:jobs
-l :显示工作进程PID
将后台暂停的工作恢复到前台继续执行
fg %工作号:%可省略,主要是却别PID的
将后台暂停的工作恢复到后台继续执行
bg %工作号
让后台的工作脱离终端进行运行
a. /etc/rc.local 文件
b. 定时计划任务(下边)
系统资源查看
vmstat:监控系统资源
vmstat:监控系统资源
结果分析:
Procs(进程):
r:运行队列中进程数量
b: 阻塞的进程
Memory(内存):
swpd: 虚拟内存已使用的大小
free: 空闲的物理内存的大小
buff: 用作缓冲的内存大小(系统)
cache: 用作缓存的内存大小(被调用资源)
Swap:
si: 每秒从磁盘读入虚拟 内存的大小
so: 每秒虚拟内存写入磁盘的大小
注:如果这个值大于0,表示物理内存不够用
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
系统:
in: 每秒CPU中断数,包括时钟中断。
cs: 每秒上下文切换数(资源调用的次数,如:函
数)。
CPU(以百分比表示):
us: 用户进程执行消耗cpu时间(user time)
sy: 系统进程消耗cpu时间(system time)
id: 空闲时间(包括IO等待时间)
wa: 等待IO时间
st: 虚拟机偷取时间(不为0则代表cpu被其他虚拟
机所调用)
dmesg:内核的检测信息
dmesg:内核的检测信息
查看开始是内核的检测信息(/var/log/dmesg)
free:查看内存使用情况
free 查看内存使用情况
-b 以字节为单位显示
-k 以KB为单位(默认)
-m 以MB为单位
-g 以GB为单位
显示信息解释:
第一行:
total: 总计物理内存的大小
used: 已使用内存大小
free: 空闲内存大小
shared: 共享内存,一般系统不会用到
Buffers/cached:未使用的缓存大小
第二行:(-/+ buffers/cached)
(-buffers/cache)used内存数:
第一部分Mem行中的 used – buffers – cached
(+buffers/cache)free内存数:
第一部分Mem行中的 free + buffers + cached
注:可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是空闲的内存总数。
第三行:swap的前面有!
虚拟内存:就是把一些硬盘空间转化为虚拟内存空间
查看cpu信息
查看cpu信息
逻辑CPU个数
cat /proc/cpuinfo | grep "processor" | wc –l
物理CPU个数:
cat /proc/cpuinfo | grep "physical id" | sort -u | wc –l
每个物理CPU中Core的个数:
cat /proc/cpuinfo | grep "cpu cores" | uniq | awk -F: '{print $2}'
查看core id的数量,即为所有物理CPU上的core的个数
cat /proc/cpuinfo | grep "core id" | uniq | wc –l
uptime:系统启动时间和平均负载
uptime:系统启动时间和平均负载
系统启动时间和平均负载(一般用top)
uname查看系统与内核相关信息
uname : 查看系统与内核相关信息
-a 查看所有相关信息
-r 查看内核版本
-s 查看内核名称
lsb_release-a查看当前发行版
lsb_release -a 查看当前发行版
lsof:列出进程打开或正在使用的文件信息
lsof:列出进程打开或正在使用的文件信息
lsof -p 进程号 :查看某进程运行所调用的资源
lsof -u :查看用户运行的进程调用了哪些文件
系统定时任务
at:单次计划任务命令
at:单次计划任务命令
at命令的执行需要依托atd服务
service atd start
chkconfig atd on
限制用户使用at命令
/etc/at.allow #白名单
/etc/at.deny #黑名单
白名单的优先级大于黑名单
假如黑白名单都不存在,只有root能使用at命令
at命令
at [选项] 时间
-m :执行结束发送通知邮件(执行此命令的用户)
atq :查看计划任务
atrm :删除计划任务
-c 工作号 :查看对应工作号的详细信息
at时间格式:
[HH:MM] [yyyy-mm-dd] (now + 2minutes)
写完后用ctrl + d 结束并保存任务
crontab 循环计划任务命令
crontab 循环计划任务命令
按照预先设置好的时间周期,定期执行特殊动作(命令、脚本)
格式:
编辑:crontab -e :添加循环计划任务
查看:crontab -l :查看已存在的计划任务
删除:crontab -r :删除已存在的计划任务
crontab时间格式:
* :表示该范围内的任意时间
, :表示间隔的多个不连续时间点
- :表示一个连续的时间范围
/ : 指定间隔的时间频率
例子:
0 17 * * 1-5 :周一到周五每天17:00
30 8 * * 1,3,5 :每周一、三、五的8点30分
0 8-18/2 * * * :8点到18点之间每隔2小时
0 * */3 * * :每隔3天
Kdump:内核崩溃转储机制
kdump 是 Linux Kernel 崩溃时的转储机制,简单理解就是在系统启动过程中如果 Kernel 因为某些原因崩溃了,kdump 就会负责记录日志以便排查原因。在 CentOS 6 等 Linux 发行版中,即便采用最小化安装, kdump 也会作为服务安装到系统中
详细请看:
https://www.ibm.com/developerworks/cn/linux/l-cn-kdump1/
*************************************
Linux日志管理
Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。完成这个过程的程序就是syslog。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。默认配置下,日志文件通常都保存在“/var/log”目录下。
日志管理
管理哪些日志:
目的:根据产生的日志类型,进行分析,日志类型,日志等级
将指定的日志类型和日志等级根据rsyslog.conf配置文件记录的方式位置保存
系统:
系统类型:登录,安全,邮件(系统用户访问),开机过程内核检查
/var/log/:被rsyslog所管理
rpm和源码安装的第三方服务
记录用户访问:/var/log/httpd/access_log
记录服务器运行错误:/var/log/httpd/error_log
根据服务的配置文件
/etc/httpd/conf/httpd.conf(自己管理自己的日志)
以apache做比如
rpm:
/var/log/服务名/
源码:
/PREFIX/logs/
如何收集到的日志信息:
rsyslog的日志管理服务(日子分析,分类存放)
/etc/rsyslog.conf(根据此配置文件的规则进行分类存放)
规则:
日志的类型.等级 存放位置
日志的类型.等级 存放位置
如何管理日志
rsyslog
rsyslog.conf
客户端:修改配置文件,修改日志存放位置为:@@192.168.88.20:514
服务端:修改配置文件,开启TCP协议514端口,用于接收来自于客户端的日志
防止日志文件过大
- 设置轮替规则:时间,大小,时间或大小
a) logro tate
b) logro tate.conf(规则配置文件)
- 全局规则
a) 周期,保留的备份数量,创建新的日志文件
b) 是否要压缩,修改文件的后缀
- 局部规则
a) 针对某些特定的日志(wtm/btmp)
避免日志文件过大:
轮替:
提前防止避免日志文件过大
logrotate
/etc/logrotate.conf
weekly 每周对日志进行依次轮替
rotate 保存日志的数量
create 在轮替过程中,自动创建新的文件
dateext 使用日期作为日志文件的后缀
compress 是否压缩进行轮替的日志
非系统服务:rpm | 源码安装的httpd
rotatelogs 的命令进行轮替
切割:
用于日志文件过大时的解决方案
split
-b 按照指定大小切割
-l 按照指定行数切割
主机名修改
主机名修改:内核2.6.32前
临时:hostname bj-xdl-y26(www.linuxlc.com)
永久:/etc/sysconfig/network
HOSTNAME=www.linuxlc.com
日志相关服务
CentOS 6.X 以后日志的管理服务从syslog 升级成为了 rsyslog ,增强了部分功能。
基于TCP网络协议传输日志信息
更安全的网络传输方式
有日志消息的及时分析框架
后台数据库
配置文件可以写一些简单的逻辑判断
兼容syslog配置文件
常见的日志文件
这些都是系统默认的日志,以及存放位置,那么除此之外我们还有一些RPM或者源码的软件安装产生的日志。
那么源码的日志则存放在了指定安装的位置下。
rsyslog 服务
rsyslog 服务
日志的格式:
只要是通过rsyslog记录的日志,格式是相同的,包含以下内容:
发生时间
服务器的主机名
服务名或者程序名
事件具体信息
rsyslog 配置文件:
/etc/rsyslog.conf
第一列为日志类型和日志优先级的组合,每个类型和优先级的组合称为一个选择器;
后面一列为保存日志的文件、服务器,或输出日志的终端。syslog 进程根据选择器决定如何操作日志。
对配置文件的几点说明:
u 日志类型和优先级由点号(.)分开,例如 kern.debug 表示由内核产生的调试信息。
u kern.debug 的优先级大于 debug。
u 星号(*)表示所有,例如 *.debug 表示所有类型的调试信息, kern.*表示由内核产生的所有消息。
u 可以使用逗号(,)分隔多个日志类型,使用分号(;)分隔多个选择器。
对日志的操作包括:
u 将日志输出到文件,例如 /var/log/maillog 或 /dev/console。
u 将消息发送给用户,多个用户用逗号(,)分隔,例如 root, amrood。
u 通过管道将消息发送给用户程序,注意程序要放在管道符(|)后面。
u 将消息发送给其他主机上的 syslog 进程,这时 /etc/syslog.conf文件后面一列为以@开头的主机名(IP) 例:@192.168.88.30
rsyslog 识别的服务才能写到配置文件中
连接符号:
日志服务 [连接符号] 日志等级 日志记录位置
“.” :代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代 表cron服务产生的日志,只要日志等级大于等于info级别,就记录
“.=”代表只记录所需等级的日志,其他等级的都不记录。比如:“*.=emerg”代表人和日志服务产生的日志,只要等级是emerg等级就记录。这种用法及少见,了解就好
“.!”代表不等于,也就是除了该等级的日志外,其他等级的日志都记录。
日志等级:
特殊等级:none 不记录任何等级,相当于忽略该服务
日志记录位置:
日志文件的绝对路径。这是最常见的日志保存方法,如“/var/log/secure”就是保存系统验证和授权信息日志的。
系统设备文件。如“/dev/lp0”代表第一台打印机,如果日志保存位置是打印机设备的话,当有日志时就会在打印机打印(不太符合可持续发展战略哦-_-!)。
转发给远程主机。因为可以选择使用TCP协议和UDP协议传输日志信息,所以有两种发送格式。如使用
“@192.168.0.210:514”,就会把日志内容使用UDP协议发送到192.168.0.210的UDP 514端口上;如果使用
“@@192.168.0.210:514”就会把日志内容使用TCP协议发送192.168.0.210的TCP 514端口上,其中514是日志服务默认端口。当然只要192.168.0.210同意接收此日志,就可以把日志内容保存在日志服务器上。
用户名。如“root”,就会把日志发送给root用户,当然root要在在线,否则就收不到日志信息了。发送日志给用户时,可以使用“*”代表发送给所有在线用户,如“mail.* *”就会把mail服务产生的所有级别的日志发送给所
有在线用户。如果需要把日志发送给多个在线用户,用户名之间用“,”分隔。忽略或丢弃日志。如果接受日志的对象是“”,代表这个日志不会记录,而被直接丢弃。如“local3.* ~”代表忽略local3服务类型所有的日志都不记录。
自定义日志记录:
vi /etc/rsyslog.conf
*.crit /var/log/alert.log
将所有临界点以上的错误都记录到alert日志中
修改完成,重启rsyslog服务,检查下有没有生成文件。
日志服务器搭建:
接收端:
配置文件:(有UDP和TCP)
取消后二行注释,让接受端口生效。
重启服务,然后查看端口是否生成
发送端:
修改配置文件:
添加:
*.* @192.168.110.111:514
注意:可以使用UDP 用一个@ ; 也可以使用TCP 要用两个@@
重启服务,OK
测试:
在发送端,创建用户,然后检查接收端,查看日志/var/log/secure
注意事项:都知道Linux不依靠主机名识别,但是日志服务器需要根据主机 来识别,so。。。我们如果一台记录多台的日志信息,需要修改主机名。
日志轮替
主要目的防止单个日志文件过大,按照我们的规则对日志进行相应处理
主要依赖/etc/logrotate.conf配置文件中的dateext参数实现日志的处理。
主要参数解释:
weekly 每周对日志进行依次轮替
rotate 保存日志的数量
create 在轮替过程中,自动创建新的文件
dateext 使用日期作为日志文件的后缀
compress 是否压缩进行轮替的日志
系统自动定期进行日志轮替的原因:
/etc/cron.daily/ 有一个脚本,每天都会运行,查看是否有符合轮替的日志,然后进行相应处理
我们尝试在rsyslog配置文件中添加自己的日志记录,然后并且强制执行轮替,看会不会产生轮替文件
1. 先在配置文件中写入自己的日志轮替规则(参照原文中的)
2. 强制执行日志轮替(不管符不符合规定时间)
logrotate –vf /etc/logrotate.conf
*************************************
Linux备份管理
Linux中哪些数据需要备份?
1.Linux系统重要数据
v /root/目录:/root目录是管理员的家目录,很多管理员会习惯于在这个目录中保存一些相关数据,那么当进行数据备份时,需要备份此目录。
v /home/目录:/home/目录是普通用户的家目录,如果是生产服务器,这个目录中也会保存大量的重要数据,应该备份。
v /var/spool/mail/目录: 默认情况下,所有的用户未读的邮件会保存在/var/spool/mail/目录中和用户名相同的邮箱文件中,已读的邮件会保存在用户家目录中mbox文件中(mail命令默认是如此保存,不过如果使用了hold命令,那么不管邮件是否已读,都保存在/var/spool/mail/目录中,可以使用mbox命令恢复已读邮件保存在“~/mbox”文件中)。一般情况下,用户的邮件也是需要备份的重要数据。
v /etc/目录:系统重要的配置文件保存目录,当然需要备份。
v 其他目录:更具你的系统的具体情况,备份自己认为的重要目录。比如我们的系统中有重要的日志,或者安装了RPM包的mysql服务器(RPM包安装的mysql,数据库保存在/var/lib/mysql/目录中),那么/var/目录就需要备份。如果我们服务器中安装了多个操作系统,或编译过新的内核,那么/boot/目录就需要备份。
2.安装服务和软件的数据
apache需要备份如下内容:
网页存放路径
v 配置文件。RPM包安装的apache,需要备份/etc/httpd/conf/httpd.conf;源码包安装的apache则备份/usr/local/apache2/conf/httpd.conf。
v 网页主目录。RPM包安装的apache,需要备份/var/www/html/目录中所有数据;源码包安装的apache需要备份/usr/local/apache2/htdocs/目录中所有数据。
v 日志文件。RPM包安装的apache,需要备份/var/log/httpd/目录中所有日志;源码包安装的apache需要备份/usr/local/apache2/logs/目录中所有日志。
mysql服务需要备份如下内容:
数据库文件的保存位置
v mysql需要备份的内容就没有apache多了,主要需要备份的就是数据库内容。
v 源码包安装的mysql,数据库安装/usr/local/mysql/data/目录中,只要备份此目录即可
v RPM包安装的mysql,数据库默认安装到了/var/lib/mysql/目录中,如果需要备份则需要备份这个目录。
ftp:服务
ftp: 用户上传文件的目录
常见备份策略
完整备份
完全备份就是指把所有需要备份的数据全部备份,当然完全备份可以备份整块硬盘,整个分区或某个具体的目录。完全备份的好处是数据恢复方便,因为所有的数据都在同一个备份中,所以只要恢复完全备份,所有的数据都会被恢复。如果完全备份备份的是整块硬盘,那么甚至都不需要数据恢复,只要把备份硬盘安装上,服务器就会恢复正常。可是完全备份的缺点也很明显,那就是需要备份的数据量较大,备份时间较长,占用的空间较多,所以完全备份不可能每天执行。
我们一般会对关键服务器进行整盘完全备份,如果出现问题,可以很快的使用备份硬盘进行替换,从而减少损失。甚至会对关键服务器搭设一台一模一样的服务器,这样只要远程几个命令(或使用shell脚本自动检测,自动进行服务器替换),备份服务器就会接替原本的服务器,使我们的故障响应时间缩短为最短。
增量备份
完全备份随着数据量的加大,备份耗费的时间和占用的空间会越来越多,所以完全备份不会也不能每天进行。这时增量备份的作用就体现了出来。增量备份是指先进行一次完全备份,服务器运行一段时间之后,比较当前系统和完全备份的备份数据之间的差异,只备份有差异的数据而已。服务器继续运行,再经过一段运行时间之后,进行第二次增量备份,第二次增量备份时,当前系统是和第一次增量备份的数据进行比较,也是只备份有差异的数据。第三次增量备份是和第二次增量备份的数据
假设我们第一天时,进行一次完全备份。第二天增量备份时,只会备份第二天和第一天之间的差异数据,但是第二天的总备份数据是完全备份加第第一次增量备份的数据。第三天增量备份,只会备份第三天和第二天之间的差异数据,第三天的总备份数据是完全备份,加第一次增量备份的数据,再加第二次增量备份的数据。当然第四天增量备份时,只会备份第四天和第三天的差异数据,数据时完全备份加第一次增量备份加第二次增量备份加第三次增量备份的数据。这种备份的好处是每次备份需要备份的数据较少,耗时较少,占用的空间较少。坏处是数据恢复比较麻烦,如果是上图的例子,那么当数据恢复时,就要先恢复完全备份的数据,再依次恢复第一次增量备份的数据,第二次增量备份的数据和第三次增量备份的数据,最终才能恢复所有的数据。
差异备份
差异备份相比较而言,既不要像完全备份一样把所有数据都进行备份,也不像增量备份数据恢复时那么麻烦。只要先恢复完全备份的数据,再恢复差异备份的数据即可。不过随着时间的增加,和完全备份相比,变动的数据越来越多,那么差异备份也可能会变得数据庞大,备份缓慢,占用空间较大。
备份策略:
地点:
同端备份:复制 恢复快、不安全
多端备份:移动硬盘、光盘、其他机器 安全性较高
异地备份:不同地点(容灾) 安全性很高
云端备份:对象存储空间 安全有隐患
时间:
时间交叉备份==高频率备份
完整备份:服务器压力较小的时间
备份类型:
冷备份:完全停止数据的更新,进行备份
温备份:保证数据的正常读取,但无法写入,进行备份
热备份:保证数据正常读取的同时,进行数据备份
压缩:
1.空间小
2.传输快
策略监控执行:
检查备份策略是否执行
检查备份的文件是否可用:
尝试恢复备份
备份与恢复工具:dump 和 restore
dump(备份)
dump 支持0-9十个备份级别,0指完整备份,1-9指增量备份
我们备份一个数据时,第一次备份应该使用0级别,会把所有数据完全备份一次。第二次备份时就可以使用1级别了,它会和0级别比较,把0级别备份之后变化的数据进行备份。第三次备份时,使用2级别,2级别是和1级别比较,把1级别备份之后变化的数据进行备份,以此类推。需要注意的是,只有备份整个分区或整块硬盘时,才能支持1-9的增量备份级别。而如果只是备份某个文件或不是分区的目录,则只能使用0级别进行完全备份。
dump [选项] 备份之后的文件名 源文件名
例:dump -0uj -f /root/boot.bak.bz2 /boot
级别:
0-9十个备份级别
0 完整备份
1-9 增量1到增量9
-f 文件名 :指定备份后的文件名(.dump)
-u :备份文件系统时(分区),把备份时间记录在
/etc/dumpdates中
备份时,记录备份时间
-v :显示详细信息
-j :调用bzlib库压缩备份文件,(.bz2)压缩等级2
备份时,进行压缩(bz2)
-W :查看备份的最近时间
注:备份目录时,则不能写-u选项,否则无法正常备份
备份分区:
df –h 查询当前能进行备份的分区信息
dump -0uj -f /root/boot.bak.bz2 /boot
#第一次先进行完整备份,并且压缩写入备份时间
cat /etc/dumpdates
#查看备份时间
修改/boot/分区内的信息,进行第二次备份
dump -1uj -f /root/boot.bak1.bz2 /boot/
#进行第二次备份,使用1级别,即增量备份
dump -W
查询系统内进行过dump备份的分区,以及级别和时间。
注意:目录的备份只能使用完整备份,无法使用增量备份。
restore(恢复)
restore [模式选择] [选项]
例: restore -r -f *.dump.bz2 #完全恢复
restore -i -f *.dump.bz2 #交互式部分恢复
模式:
-C :比较备份数据和实际数据的变化。如果实际数据中的现有数据发生了变化,这个选项能够检测这个变化。但是如果实际数据新增了数据,这个选项是不能检测到变化的。
对比现实中的目录是否比备份时的数据减少了,若减少,则提示哪个文件丢失了,但现实中增加的数据不会被检查到
-r :还原模式,还原数据
-i :交互模式,一般进行恢复时文件选择
add 文件名 :标记
delete 文件名 :取消标记
extract 仅恢复标记的文件
1 确认恢复
n 不重设恢复文件的 所属和权限
quit 退出
-t :查看模式,查看备份文档中的内容
-f :指定备份文件的名称
比较备份数据和实际数据的区别,根据刚才我们的备份,进行对比
首先创建新的文件
touch /boot/a.txt
进行数据的比对
restore -C -f /root/boot.bak.bz2
注意:这样的比较无法比较出新增的信息,只能比对出减少的和修改的。
查看模式:
restore –t –f /root/boot.bak.bz2
还原模式
首先创建恢复目录,然后进行恢复
restore -r –f /root/boot.bak.bz2
第一次是恢复原始数据
restore -r –f /root/boot.bak1.bz2
第二次进行增量备份的恢复
新命令
eject :弹出光驱