linux基础

linux基础

一、基本命令及文件管理

1.查看网卡配置,激活网卡,关闭防火墙和SElinux
设置运行级别为3(命令行模式)
systemctl set-default multi-user.targer

Linux系统启动流程:
1.加载内核(/boot下的内核文件)
2.启动初始化进程(init)
3.确定运行级别
4.加载开机启动程序(/etc/init.d)
5.用户登录

shell脚本:
shell就是一个用户跟操作系统之间交互的命令解释器,位于操作系统和应用程序之间,负责将应用程序输入的命令信息解释给操作系统,分为图形界面shell和命令行shell
脚本:本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解释器解析指令并执行
shell脚本:就是Linux命令的组合

&  表示任务在后台执行,如要在后台运行redis-server,则有  redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'    
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"

查看Linux内核版本:
cat /proc/version
uname -r
uname -a
查看Linux系统版本:
cat /etc/issue
lsb_release -a

四层负载均衡和七层负载均衡的区别:
四层负载,说的是基于IP+端口的负载均衡;七层负载,说的是基于WEB请求,URL等应用信息的负载均衡。
四层常见软件是haproxy,LVS,七层常见软件是nginx。
Nginx优缺点:
优点:开源软件,简单易部署;功能强大,七层负载基本可以满足所有需求。
缺点:仅支持http,https,Email协议;对后端服务器的检测,仅通过IP+端口来检查,不可以通过URL来检查;不支持会话session保持的一致行,但可以通过IP+HASH来解决。
LVS优缺点:
优点:工作在4层,仅做分发作用,没有流量产生,因此。负载性能最强,对内存和cpu消耗率更低;
缺点:不支持正则表达式,不支持动静分离。
haproxy优缺点
优点:支持session会话保持一致,四层和七层都支持;支持通过URL来检测后端服务器的状态。
缺点:在七层转发支持上,不如nginx强大。

查看网卡配置
ip addr show

激活网卡
nmcli connection up ens33

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

关闭selinux
setenforce 0

vim /etc/systemctl/
SELINUX=disabled




设置文本3
[root@local ~]# systemctl set-default multi-user.target 
查看
[root@local ~]# systemctl get-default 

补齐
[root@local ~]# yum -y install bash-doc.x86_64 

2.终端操作
切换终端:
ctrl+alt+F2-F6   tty2-6
alt+F1

终端配置:
编辑 --->配置首选项 --->字体
编辑--->配置首选项---->颜色

终端快捷键:
shift+ctrl  +  放大
ctrl        -  缩小
shift+ctrl  n  开启新终端
alt         F4 关闭终端
shift+ctrl  t  开启终端标签
alt       1--  切换标签
shift+ctrl  w  关闭标签
shift+ctrl  c  复制
shift+ctrl  v  粘贴
3.基本命令
ls  list 列表
cp  copy 复制
  cp 源文件地址  目标地址
  cp /root/cc.txt /
  cp /root/cc.txt /tmp/kk.txt  拷贝的过程中重命名
  cp -r /root/x/ /tmp/  拷贝目录
mv  move 移动或者重命名
  mv 源文件地址  目标地址
  mv /root/aa.txt /tmp/
  mv /root/tt.txt /tmp/ll.txt
  mv /root/a/ /tmp/   剪切目录
  mv c3.txt nnnn.txt  当前目录下重命名
cd  change directory 切换目录
mkdir  make directory 创建目录
  mkdir aa
  mkdir cc tt
  mkdir abc{1..5}
  mkdir {x,y,z}{..5}
  mkdir -p /root/x/y/z
  mkdir -pv /root/a/b/c   -p 第归 -v 显示创建过程
touch 创建文件
  touch aa.txt
  touch cc.txt tt.txt
  touch abc{1..5}.txt
  touch {a,b,c}{1..3}.txt
删除:
rmdir /root/c/  只能删除空目录
rm /root/a1.txt
rm -f /root/cc.txt
rm -f *.txt     *表示所有文件名
rm -rf /root/tt/  删除目录
rm -rf /root/abc* 

命令组成
命令 [-选项(参数)] [对象(file)]
基本命令:
ls -l 显示文件详细信息
-a 显示所有文件(包括隐藏文件)
  .filename  ----->隐藏文件
  . 当前目录
  .. 上层目录
-A 显示所有文件(包括隐藏文件,不包含.和..)
-d 显示目录信息
-h 按最大单位显示:
-t 按时间排序:
-r 逆序输出:
-S 按大小排序:
-R 递归显示:

[root@localhost ~]# ls -l anaconda-ks.cfg 
-#rw-------#. #1 #root #root# 1527 #5月  15 2017# anaconda-ks.cfg

第一段: 文件类型
第二段: 基本权限
第三段: 是否在开启selinux的状态创建
第四段: 硬链接数
第五段: 拥有者
第六段: 所属组
第七段: 大小(字节)
第八段: 最后一次修改时间
第九段: 文件名

文件类型:(7)
- 普通文件  file
d 目录文件 directory
c 字符设备文件   character
b 块设备文件  block
s 套接字文件 socket
p 管道文件  pipe
l 符号链接文件(软链接) symbolic
4.获取帮助
help:
ls --help

info:
info ls

man手册:
man ls

man 1 用户命令   *
man 2 系统调用
man 3 库调用
man 4 特殊文件
man 5 配置文件   *
man 6 游戏
man 7 杂项
mna 8 系统命令   *

man -f passwd  显示passwd 在那些章节有描述
man -k pass   模糊查询
5.目录
pwd  查看当前家目录位置

cd  切换目录
cd /usr/local
cd . 刷新目录
cd .. 回到上层目录
cd ../.. 上层的上层
cd ~  和  cd   回到家
cd - 上次工作目录

绝对路径: 从/开始的路径 
相对路径: 从当前目录开始路径

/目录下每个目录的作用:
bin  用户可执行目录(命令  root 和 普通) 
sbin 系统可执行目录(命令  root)
lib  库文件目录(32) 
lib64  库文件目录(64)
dev  设备文件目录
usr  应用程序目录
var  服务器数据目录(数据 日志)
srv  服务器数据目录
etc  配置文件目录
tmp  临时文件目录
boot 服务器启动目录(内核和启动文件)
media 媒介目录(u盘,cdrom)
mnt  其他挂在点
opt  第三方应用程序目录
proc 伪文件系统(内核参数,进程信息,硬件信息)
sys  伪文件系统(内核参数,进程信息,硬件信息)
run  进程锁目录
root root管理员家目录
home 普通用户家目录
6.文件管理
查看文件内容:
more:
more /root/anaconda-ks.cfg
显示文件的百分比
空格  下一页
b  上一页
回车  下一行

less:
less /root/anaconda-ks.cfg
上键  上一行
下键  下一行
pageup    上一页
pagedown  下一页

head:
head /root/anaconda-ks.cfg
默认文件前10行
head -n 20 /root/anaconda-ks.cfg 
head -20 /root/anaconda-ks.cfg 

tail:
tail /root/anaconda-ks.cfg
默认文件后10行
tail -n 20 /root/anaconda-ks.cfg
tail -20 /root/anaconda-ks.cfg 
tail -f /var/log/messages  动态监控日志文件

cat:
cat /root/anaconda-ks.cfg
cat -n /root/anaconda-ks.cfg
cat -n /root/anaconda-ks.cfg |less
7.练习
1.说出ls指令参数的作用?
-a  显示所有文件(包括隐藏文件)
-l   显示文件详细信息
-d  显示目录信息
-t   按时间排序
-S  按文件大小排序
-h  按最大单位展示
-R  递归显示
-r   逆序输出

2.文件的类型有几种?分别是什么?
7种
- 普通文件
d 目录文件
c 字符设备文件
b 块设备文件
s 套接字文件
p 管道文件
l 符号链接文件(软链接)

3.ls -l  /etc/passwd说出每个字段的含义?
-rw-r--r--. 1 root root 2283 Oct 13  2020 /etc/passwd
第一段: 文件类型
第二段: 基本权限
第三段: 是否在开启selinux的状态创建
第四段: 硬链接数
第五段: 拥有者
第六段: 所属组
第七段: 大小(字节)
第八段: 最后一次修改时间
第九段: 文件名

4.说出下列参数的功能?
cd ../.. 返回上层目录的上层目录
cd . 当前目录
cd ~ 返回家目录
cd - 返回上次工作的目录

5.列举查看文件的指令有那些?监控日志应该怎么操作?
如何查看一个文件的前25行内容,如何查看文件的后25行内容
more  less  head  tail  cat  
动态监控日志 tail -f /var/log/messages
head -25 /etc/passwd
tail -25 /etc/passwd

6.查看/etc/passwd文件的10-25行如何操作?
head -25 /etc/passwd | tail -15

7.说出一下目录的作用?
/etc   /root  /var  /usr /bin /sbin  /home  /boot
/bin  用户可执行目录(命令  root 和 普通) 
/sbin 系统可执行目录(命令  root)
/usr  应用程序目录
/var  服务器数据目录(数据 日志)
/etc  配置文件目录
/boot 服务器启动目录(内核和启动文件)
/root root管理员家目录
/home 普通用户家目录

8.创建文件使用什么指令?如何在/tmp下创建abc1.txt-abc100.txt这100个文件?
touch
touch /tmp/abc{1..100}.txt

9.如何递归创建目录 如:/tmp/aa/cc/tt
mkdir -p /tmp/aa/cc/tt

10.拷贝/tmp/abc1-abc100这100个文件到/root/下
cp /tmp/abc*.txt /root/

11.如何删除/root/abc1-abc100 这100个文件
rm -f /root/abc*.txt

tree显示目录的树形结构
yum install tree
tree /aa
-L 显示几层目录
tree -L 1 /
tree -L 2 /

练习:
1.建立以下目录结构:
            /aa
           /   \
         ba/    bb/
       /     \       \
    ca/      cb/     cc/
可否一条命令创建?
mkdir -p /aa/b{a/c{a,b},b/cc}
tree /aa

2.将系统中/etc/hosts 拷贝到/aa/ba/ca目录?使用2种方法(当前目录为/)相对路径和绝对路径
cp /etc/hosts /aa/ba/ca

3.将/aa/ba/ca/hosts文件移动到/aa/bb/cc/目录下并且重命名位test.txt,2种方法(当前目录为ca)
mv hosts /aa/bb/cc/test.txt

mv hosts /aa/bb/cc/
mv /aa/bb/cc/hosts /aa/bb/cc/test.txt

二、vim文本编辑器

1.vim编辑器创建/打开文件
[root@localhost ~]# vim /root/aa.txt
可以打开已有的或者新创建一个文件
2.输入模式(编辑模式)
进入vim编辑器默认是命令模式
命令模式进入输入模式方法:
a 当前字符后输入
A 当前行行尾输入
i 当前字符前输入
I 当前行行首输入
o 当前行下一行输入
O 当前行上一行输入
s 删除当前字符后输入
S 删除当前行后输入
HOME键   行首
END键    行尾
3.命令模式(一般模式)
命令模式下的基本操作:
yy复制  p(当前行下一行)  P(当前行的上一行)   50yy  
dd剪切  p              P                100dd
dd删除 
p 粘贴
^ 行首  $ 行尾
d^  删除当前字符到行首(不包含当前字符)
d$  删除当前字符到行尾(包含当前字符)
y^  复制当前字符到行首(不包含当前字符)
y$  复制当前字符到行尾(包含当前字符)

35G 定位到35行
gg 首行
G 最后一行

dgg 从当前行删除到首行(包含当前行)
dG 删除当前行到尾行(不包含当前行)

u 撤销一部操作
ctrl+r 重做
4.末行模式(命令行模式)
进入输入模式:shift+:
输入模式下的基本操作:
:wq 保存退出
:q 退出 
:w! 强制保存
:q! 强制退出
:wq! 强制保存退出
:w /tmp/cc.txt 另存
:1,3w /tmp/new.txt 另存1-3行
:e /root/aa.txt 打开一个文件
:e! 重新打开当前文件
:X  加密文件

:set nu 显示行号
:set nonu   去掉行号

:set list 显示空格或者制表符
:set nolist 去掉空格或者制表符

文件中所有的制表符都设置为16个空格长度
:set tabstop=16

只更改设置之后的制表符长度
:set softtabstop=16

自动缩进
:set autoindent
:set noautoindent

搜索忽略大小写
:set ignorecase smartcase

w下一个单词的首字符
dw  yw

J 合并行

vim配置文件:
永久开启行号功能
vim /etc/vimrc
set nu
	
查找
/关键字
n 下一个 N 上一个
?关键字
n 上一个 N 下一个

替换  :s /要替换的字符串/替换后的字符串/
:s/ab/xx/  替换当前行第一个匹配字符串
:s/ab/xx/g 替换当前行所有匹配字符串
:%s/ab/xx/g 替换所有行中所有匹配字符串
:%s/ab/xx/gc 交互式替换所有行中所有匹配字符串   s 替换  g 全局  % 所有行 c交互式 
:3,5s/ab/xx/gc  3到5行
替换练习:
 abcdefg 1231hi  jklmnab

    abc defghij  klmn/ab
abc123 1def ghijk122/3lmnab
    
     abc/defg  hijk/l234mnab
abcdefghi234jklmnab
    
  abcdefgh  ijkl/mnab


练习:
1.替换文件中所有的a为 X
:%s/a/X/g
2.删除文件中所有开头的空格
:%s/^ *//
3.删除文件中所有的空格
:%s/ *//g
4.删除空行
:5d
:3,5d
:g/^$/d
5.删除只含有空格或者制表符的行
:g/^\s*$/d  #\s表示空白符     
6,在每一行开头家一个#表示注释这些行
:%s/^/#/
7.将文件中所有/换成-
:%s/\//-/g
:%s#/#-#g
8.删除文件中所有的数字
:%s/[0-9]//g
5.vim其他模式
可视化模式:v
选中操作内容  y 复制  d删除

可视化块模式:ctrl+v
注释某几行:
ctrl+v选中-->shift+i---->输入#----->两下ESC


多文件操作:
创建多个文件进行操作
vim  aa.txt cc.txt tt.txt
:next  下一个文件
:prev  上一个文件
:last  最后一个
:first 第一个
ctrl+^ 在上一次打开的文件和当前打开的文件之间进行切换
:wqa 保存所有的文件退出

vimdiff aa.txt cc.txt tt.txt
ctrl+w+w
:wqa
横向排序
vim -O aa.txt cc.txt tt.txt
竖向排列
vim -o aa.txt cc.txt tt.txt 

格式转换:将Linux里的文件格式转换成与Windows中一样
yum install unix2dos
unix2dos anaconda-ks.cfg 

file命令:显示文件的类型
[root@localhost ~]# file test
test: ASCII text

[root@localhost ~]# file a1 
a1: empty

[root@localhost ~]# file data 
data: data


Linux和Windows传文件使用(通过Xshell)
yum install lrzsz
[root@localhost ~]# yum -y install lrzsz 

rz  从windos到linux
sz 从linux到windows

6.练习
1.列举vim的三种常用模式
输入模式,命令模式,末行模式

2.由命令模式进入输入模式时a  i  o  O 分别代表什么意思?
a 当前字符后输入
i 当前字符前输入
o 当前行的下一行输入
O 当前行的上一行输入

3.在命令模式下如何复制100行 如何删除50行 如何粘贴?
100yy
50dd
p当前行的下一行粘贴
P当前行的上一行粘贴

4.在命令模式下如何定位到第75行
75G

5.在命令模式下如何删除当前行到首行,如何删除当前行到尾行?
d^删除当前行到首行
d$删除当前行到尾行

6.末行模式如何保存? 如何强制保存退出?
:w 保存
:wq!强制保存退出

7.末行模式下如何将100-200行另存一个新文件?
:100,200w 文件名

8.末行模式下如何开启行号?如何开启忽略大小写设置?
:set nu
:set ignorecase smartcase

9.vim的配置文件是哪个文件?
/etc/vimrc

10.vim如何查找在一个文件中查找abc字段?
/abc
?abc

11.在vim中如何同屏内查看多个文件?
vimdiff 要查看的文件的文件名
vim -o 横向排列 
vim -O 纵向排列

12.通过vimtutor查看vim的手册
[root@localhost ~]# vimtutor 



13.按要求完成以下题目
文本:
 abcdefg 1231hi  jklmnab

    abc defghij  klmn/ab
abc123 1def ghijk122/3lmnab
    
     abc/defg  hijk/l234mnab
abcdefghi234jklmnab
    
  abcdefgh  ijkl/mnab

题目:
1.替换文件中所有的a为 X
:%s/a/X/g

2.删除文件中所有开头的空格
:%s/^ *//

3.删除文件中所有的空格
:%s/ *//g

4.删除空行
:g/^$/d

5.删除只含有空格或者制表符的行
:g/^\s*$/d

6,在每一行开头家一个#表示注释这些行
:%s/^/#/

7.将文件中所有/换成-
:%s/\//-/g
:%s#/#-#g

8.删除文件中所有的数字
:%s/[0-9]//g

三、用户管理

1.账号管理

uid (0-60000)

管理员账号 root 0

系统账号 1-999

普通账号 1000-60000

添加账号
[root@localhost ~]# useradd robin
[root@localhost ~]# id robin
uid=1001(robin) gid=1001(robin) groups=1001(robin)

用户信息文件
[root@localhost ~]# vim /etc/passwd
robin:x:1001:1001:robin:/home/robin:/bin/bash
第一段: 用户名
第二段: 密码占位符 去掉则无密码
第三段: uid
第四段: gid
第五段: 描述
第六段: 家目录
第七段: shell

创建用户时的选项
-u uid 指定UID
-g gid 指定GID
-c (comment)描述信息
-d home 指定家目录
-s shell 指定shell种类

修改用户信息:
usermod 
usermod -u 2500 jack
usermod -g upup jack
usermod -c 'test user' jack
usermod -s /bin/tcsh jack

修改家目录:
方法1:
usermod -d /tmp/jack jack
mv /home/jack/ /tmp/
方法2:
usermod -m -d /home/jack jack
-m 移动用户主页的内容目录到新位置

锁定帐号
usermod -L robin
usermod -U robin
锁定密码
passwd -l robin
passwd -S robin 报告指定帐户的密码状态(仅限root用户)
passwd -u robin 解锁指定帐户的密码(仅限root用户)

删除用户:
userdel -r king  -r 连同家目录一起删除

再创建一个管理员
[root@localhost ~]# useradd -o -u 0 admin

2.组管理

组ID(0-60000)

管理员组 root 0

系统组 1-999

普通组 1000-60000

添加组
[root@localhost ~]# groupadd -g 5000 haha
创建用户hehe,组为haha
[root@localhost ~]# useradd -u 5000 -g 5000 -c 'ceshi' -d /tmp -s /bin/tcsh hehe

组信息文件
[root@localhost ~]# vim /etc/group
upup:x:2006:
第一段: 组名
第二段: 组密码占位符号
第三段: gid
第四段: 用户列表

修改组信息
groupmod
groupmod -g 3500 uplooking
groupmod -n newuplooking uplooking

删除组:
groupdel uplooking
组里面有用户则无法删除

附加组:
附加组用于权限匹配
主组:
主组用于确定用户创建的文件所属组
-G 指定附属组 -a 将用户添加到补充组(追加),仅与-G选项一起使用
usermod -a -G upup robin

组密码:
groupadd yw
groupadd kf
useradd wg
usermod -a -G yw,kf  wg
groupadd boss
gpasswd boss
su - wg
sg boss 临时切换组
3.密码管理
添加密码
交互式修改密码
[root@localhost ~]# passwd hehe
Changing password for user hehe.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
非交互式修改密码
[root@localhost ~]# echo 123 | passwd --stdin hehe

密码保存文件
[root@localhost ~]# vim /etc/shadow
hehe1:!!:18549:0:99999:7:::
第一列: 用户名
第二列: 密码(有密码状态,无密码状态,!!帐号锁定,* 该帐号永久不能登陆系统)
第三列: 密码的最后一次修改时间
第四列: 密码的最小时间(密码修改相隔时间)
第五列: 密码的最大时间(密码有效期)  99999表示永久不过期
第六列: 密码过期前警告时间
第七列: 密码过期后帐号过期
第八列: 帐号有效期
第九列: 保留列

练习:
创建两个帐号  tom  jerry  密码都设置为123
锁定tom的帐号
锁定jerry的密码
登陆tom和jerry  查看返回信息是否相同? 相同
查看shadow找到tom和jerry密码位有什么不同?
!  锁定帐号
!! 锁定密码

[root@localhost ~]# useradd tom
[root@localhost ~]# useradd jerry
[root@localhost ~]# for i in tom jerry;do echo 123 |passwd --stdin $i;done 
Changing password for user tom.
passwd: all authentication tokens updated successfully.
Changing password for user jerry.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# usermod -L tom
[root@localhost ~]# passwd -l jerry
[root@localhost ~]# vim /etc/shadow

配置文件:
/etc/login.defs (uid,gid范围)

/etc/default/useradd 修改添加用户有关的配置文件
HOME=/home
SHELL=/bin/bash
SKEL=/etc/skel   (环境变量模板目录)
4.手动管理账号
直接修改配置文件进行创建

groupadd  redhat
vim /etc/group
redhat:x:9999:

useradd  -g redhat  rose
vim /etc/passwd
rose:x:9999:9999:test user:/home/rose:/bin/bash
mkdir /home/rose
将家目录中需要的几个隐藏文件cp过来
cp /etc/skel/.bash* /home/rose/ 

passwd rose   设置密码,只能通过命令,不能直接修改配置文件
vim /etc/shadow
rose::17303:0:99999:7:::

echo 123 | passwd --stdin rose
5.修改root密码
物理机
重起系统
按e编辑
找到linux那一行(删除ro后的东西)加rd.break consol=tty0
ctrl+x启动系统
mount -o remount,rw /sysroot
chroot /sysroot 切换根目录
echo 密码 | passwd --stdin root 修改密码
touch /.autorelabel
sync
两次exit重起正常进入系统

6.练习
1.普通用户uid范围是多少?gid范围是多少?
1000-60000 0-60000

2.如何添加一个账号tom?
[root@localhost ~]# useradd tom
还可以进行手动创建(修改配置文件)

3.说出一下添加账号时参数的含义?-u -g -c -d -s
-u uid 指定UID
-g gid 指定GID
-c (comment)描述信息
-d home 指定家目录
-s shell 指定shell种类

4.如何添加一个组redhat?指定gid为3000?
[root@localhost ~]# groupadd -g 3000 redhat

5.当passwd文件的第二列为空时登录系统是否需要密码?
不需要

6.写出保存用户信息,组信息,密码信息的文件分别是什么?
用户信息/etc/passwd
组信息/etc/group
密码信息/etc/shadow

7.修改用户信息的指令是什么?修改组信息的指令是什么?
usermod
groupmod

8.删除组upup时失败,可能是什么原因造成的?写出你的想法
组中有其他用户
组不存在

9.锁定账号robin应该怎么操作?锁定密码应该怎么操作?
[root@localhost ~]# usermod -L robin
[root@localhost ~]# passwd -l robin

10.手动添加组upup
    手动添加账号ben,属于upup组
    使账号ben可以登上系统
[root@localhost ~]# vim /etc/group
upup:x:9999:
[root@localhost ~]# vim /etc/passwd
ben:x:1001:9999:upup:/home/ben:/bin/bash
[root@localhost ~]# mkdir /home/ben
[root@localhost ~]# cp /etc/skel/.bash* /home/ben/
[root@localhost ~]# echo 123 |passwd --stdin ben 

11.修改uid默认范围应该修改哪个文件?
[root@localhost ~]# vim /etc/login.defs 

12.修改默认家目录,默认shell应该修改哪个文件?
[root@localhost ~]# vim /etc/default/useradd 

13.修改用户的附加组应该怎么操作?如: 用户king 主组king 附加组king 添加新的附加组blue
[root@localhost ~]# groupadd blue
[root@localhost ~]# usermod -G blue king 

14.简述在root密码丢失时,修改root密码的过程
重起系统
按e编辑
找到linux那一行删除ro后的东西加rd.break
ctrl+x启动系统
mount -o remount,rw /sysroot
chroot /sysroot 切换根目录
echo 密码 | passwd --stdin root 修改密码
touch /.autorelabel
sync
两次exit重起正常进入系统

四、基本权限

1.权限
[root@localhost ~]# ll aa.txt 
-rw-r--r--. 1 root root 226 Oct 14 19:37 aa.txt
权限位:
r 读   w 写   x执行
前3位:拥有者的权限
中间3位:所属组的权限
后面3位:其他人的权限

2.权限操作
修改文件或者目录的权限
chmod
u表示拥有者 
g表示所属组
o表示其他人(组外成员)
a表示所有成员
+赋予权限 
-去除权限 
=给权限
[root@localhost ~]# chmod u+x aa.txt 
[root@localhost ~]# chmod u-rw aa.txt 
[root@localhost ~]# chmod u+r,g+w,o+x aa.txt 
[root@localhost ~]# chmod ug+rw aa.txt 
[root@localhost ~]# chmod ugo+rwx aa.txt 
[root@localhost ~]# chmod a-rwx aa.txt 
[root@localhost ~]# chmod u=r aa.txt 
[root@localhost ~]# chmod g=rw aa.txt 
[root@localhost ~]# chmod g=rw,o=r aa.txt 
[root@localhost ~]# chmod g-rw,o=r aa.txt 

练习:
  1.创建文件/tmp/aa.txt
  要求:
       拥有者没权限
       所属组读写权限
       其他人执行权限
chmod u-rw,g+w,o-r,o+x /tmp/aa.txt
chmod u=-,g=rw,o=x /tmp/aa.txt
  2.创建目录/tmp/test
  要求:
       拥有者可以查看文件名
       所属组可以创建删除文件
       其他人无权限
chmod u-wx,g-r,g+w,o-rx /tmp/test/
chmod u=r,g=wx,o=- /tmp/test

3.有文件/tmp/kkk/aa.txt 权限为rwxrwxrwx  问robin用户能不能删除?为什么?
看kkk有什么权限,一个文件能否被删除取决于上层目录的权限

4./tmp/test/        rwxr-xr-x
   /tmp/test/dir    rwxr-xr--
   /tmp/test/dir/aa/     rwxrwxrwx
   /tmp/test/dir/aa/tt.txt  rwxrwxrwx    
 robin能不能删除 /tmp/test/dir/aa/tt.txt
 不能
 
3.权限的数字转换
查看以下目录或者文件权限:
/etc/passwd                 rw-r--r--      644
/etc/shadow                 ---------      000
/tmp                        rwxrwxrwt      1777
/root                       r-xr-x---      550
/home/robin                 rwx------      700
/                           r-xr-xr-x      555
/etc                        rwxr-xr-x      755
root用户创建文件默认权限 rw-r--r--   644
root用户创建目录默认权限 rwxr-xr-x   755
普通用户创建文件默认权限  rw-rw-r--   664
普通用户创建目录默认权限  rwxrwxr-x   775
 
数字表示权限:
对应关系
111111111
rwxrwxrwx
用2进制数字表示,有权限则为1,无权限则为0,每3位转一个十进制数

r  --------  4
w  --------  2
x  --------  1
rw  4+2  6
wx  2+1  3 
rwx 4+2+1 =7 

321 -wx-w---x
456 r--r-xrw-

4.umask
umask是权限反掩码
设置umask
umask 0022

文件权限 666-022=644    做减不太准
目录权限 777-022=755 

umask 0023
666-023=643
ll kk.txt 
-rw-r--r--. 1 root root 0 517 15:30 kk.txt

023
000 010  011
111 101  100   --取反

666 
110 110  110     做与运算
111 101  100  
110 100  100
6     4     4

练习:
创建文件 642   umask=?   做同或运算
666
110 110 110

642
110 100 010

110 110 110
111 101 011  ----> 000 010 100 ---> 024
110 100 010       

umask=0024

5.时间
查看时间,修改时间,同步时间
[root@localhost ~]# date +%Y
2020
[root@localhost ~]# date +%Y-%M
2020-35
[root@localhost ~]# date +%Y-%m
2020-10
[root@localhost ~]# date +%Y-%m-%d
2020-10-19
[root@localhost ~]# date +'%Y-%m-%d %h'
2020-10-19 Oct
[root@localhost ~]# date +'%Y-%m-%d %H'
2020-10-19 10
[root@localhost ~]# date +'%Y-%m-%d %H:%M'
2020-10-19 10:36
[root@localhost ~]# date +'%Y-%m-%d %H:%M:%S'
2020-10-19 10:36:40
[root@localhost ~]# date +'%Y-%m-%d %H:%M:%s'
2020-10-19 10:36:1603075006
[root@localhost tmp]# date
2017年 05月 17日 星期三 23:55:07 CST
[root@localhost tmp]# date -s '20170517 16:02:40'
2017年 05月 17日 星期三 16:02:40 CST
[root@localhost ~]# hwclock 
Mon 19 Oct 2020 10:33:27 AM CST  -0.399588 seconds
[root@localhost ~]# date
Mon Oct 19 10:33:36 CST 2020
[root@localhost ~]# hwclock -s    从硬件时间写到系统
[root@localhost ~]# hwclock 
Mon 19 Oct 2020 10:34:24 AM CST  -0.540249 seconds
[root@localhost ~]# hwclock -w    从系统写到硬件时间
[root@localhost ~]# hwclock 
Mon 19 Oct 2020 10:34:38 AM CST  -0.226812 seconds

查看时间信息
[root@localhost ~]# timedatectl
修改时区
[root@localhost ~]# timedatectl set-timezone Asia/Shanghai 

6.修改拥有者和所属组
使用chown命令
格式:chown 新拥有者:新组 文件或者目录

查看/tmp/test.txt的信息,修改拥有者,所属组
/tmp/test.txt   rw-r--r--  robin root
robin robin --->  other

chown robin /tmp/test.txt
chgrp  upup /tmp/test.txt

chown .upup /tmp/test.txt
chown :upup /tmp/test.txt

chown robin.upup /tmp/test.txt
chown robin.upup /tmp/dir/

chown -R robin.upup /tmp/dir
chmod -R 777 /tmp/dir          -R递归修改

7.练习
1.基本权限的操作对象有几个?分别是什么?
三个
拥有者,所属组,其他人

2.给文件拥有者添加rwx权限时,应该如何操作?
chmod u+rwx 文件名
chmod u=rwx 文件名

3.目录的拥有者读写权限, 所属组读权限,其他人无权限应该怎么操作?
chmod u=rw,g=r,o=- 目录名

4.创建文件/tmp/aa.txt
  要求:
       拥有者没权限
       所属组读写权限
       其他人执行权限
[root@localhost ~]# touch /tmp/aa.txt
[root@localhost ~]# chmod u=-,g=rw,o=x /tmp/aa.txt 
[root@localhost ~]# ll /tmp/aa.txt 
----rw---x. 1 root root 0 Oct 19 14:11 /tmp/aa.txt

5.创建目录/tmp/test
  要求:
       拥有者可以查看文件名
       所属组可以创建删除文件
       其他人无权限
[root@localhost ~]# chmod u=r,g=wx,o=- /tmp/test/

6.有文件/tmp/kkk/aa.txt 权限为rwxrwxrwx  问robin用户能不能删除?为什么?
不能,一个文件能否被删除取决于上层目录的权限
[root@localhost ~]# mkdir /tmp/kkk/
[root@localhost ~]# touch /tmp/kkk/aa.txt
[root@localhost ~]# chmod 777 /tmp/kkk/aa.txt 
[robin@localhost ~]$ rm -f /tmp/kkk/aa.txt 
rm: cannot remove ‘/tmp/kkk/aa.txt’: Permission denied

7./tmp/test/        rwxr-xr-x
   /tmp/test/dir    rwxr-xr--
   /tmp/test/dir/aa/     rwxrwxrwx
   /tmp/test/dir/aa/tt.txt  rwxrwxrwx
    
   robin能不能删除 /tmp/test/dir/aa/tt.txt? 为什么?
   不能,robin对dir目录没有执行权限
   
8.写出如下数字对应的权限
   123 --x-w--wx 
   456 r--r-xrw-
   735 rwx-wxr-x
   
9.写出如下权限对应的数字
  r---wx--x 531
  rwxr---w- 742
  r-xrw-r-- 564
  
10.按要求完成权限配置
  有文件test.txt 要求:
  boss不可读写,所有员工都可以读写
[root@localhost ~]# chmod 066 test.txt 
  
11.在/root目录下创建文件abc.txt(root目录拥有者不可以改动)
     同时完成以下要求:
     robin用户可以读写abc.txt 但是不可以删除
     zorro用户只可以读abc.txt,但是不可以删除
     king用户不可以读写abc.txt,但是可以删除
     
    /root   root  root  r-xrwxr-x     
    /root/abc.txt  robin zorro  rw-r-----
    
    robin
    zorro
    king     
    
     chown robin /root/abc.txt
     chown .zorro /root/abc.txt
     chmod o= /root/abc.txt   
     
     chmod o=rx /root
     chmod g=rwx /root
     usermod -a -G root king
     
        
12.附加题 
     要求robin用户创建的默认文件权限都是624,求umask值是多少?
     042

五、高级权限

1.SUID( set user id )

作用:任何用户在运行拥有suid权限的命令(二进制可执行文件)时,都以该命令拥有者的身份执行
作用位置:user
作用对象:文件(二进制可执行文件)

添加SUID权限:
chmod u+s 文件名

实验:
添加用户robin
su - robin
cat /etc/shadow  能不能看到内容? 不能
使用suid权限,怎么看到? 添加SUID权限
chmod u+s /bin/cat

查看二进制文件所在的位置
[root@localhost ~]# which useradd
/usr/sbin/useradd

2.SGID(set group id)

作用:任何用户在拥有sgid权限的目录下,创建的文件都要继承目录的组

作用位置:group
作用对象:目录

添加SGID权限:
chmod g+s 目录名

实验:
1.添加帐号robin  robin组
创建目录/tmp/test  权限设置为777   目录拥有者root  所属组root
robin帐号在/tmp/test下创建  aa.txt  问:所属组是谁?
robin
[root@localhost ~]# useradd robin
[root@localhost ~]# mkdir /tmp/test/
[root@localhost ~]# chmod 777 /tmp/test/
[root@localhost ~]# su - robin 
[robin@localhost ~]$ touch /tmp/test/aa.txt
[robin@localhost ~]$ ll /tmp/test/
total 0
-rw-rw-r--. 1 robin robin 0 Oct 19 11:50 aa.txt

2.给/tmp/test目录添加sgid权限
robin帐号在/tmp/test下创建  cc.txt  问:所属组是谁?
root
[root@localhost ~]# chmod g+s /tmp/test/
[root@localhost ~]# su - robin
Last login: Mon Oct 19 11:50:45 CST 2020 on pts/2
[robin@localhost ~]$ touch /tmp/test/cc.txt
[robin@localhost ~]$ ll /tmp/test/
total 0
-rw-rw-r--. 1 robin robin 0 Oct 19 11:50 aa.txt
-rw-rw-r--. 1 robin root  0 Oct 19 11:53 cc.txt


3.添加组upup
修改/tmp/test目录的所属组为upup 
chown .upup /tmp/test
robin帐号在/tmp/test下创建  tt.txt  问:所属组是谁?  cc.txt所属组会不会变化?
upup    没变
root帐号在/tmp/test下创建 abc.txt 所属组是谁? root受不受sgid限制?
upup  受限
[root@localhost ~]# groupadd upup
[root@localhost ~]# chown :upup /tmp/test/
[root@localhost ~]# su - robin
Last login: Mon Oct 19 11:52:51 CST 2020 on pts/2
[robin@localhost ~]$ touch /tmp/test/tt.txt
[robin@localhost ~]$ ll /tmp/test/
total 0
-rw-rw-r--. 1 robin robin 0 Oct 19 11:50 aa.txt
-rw-rw-r--. 1 robin root  0 Oct 19 11:53 cc.txt
-rw-rw-r--. 1 robin upup  0 Oct 19 11:54 tt.txt

[root@localhost ~]# touch /tmp/test/abc.txt
[root@localhost ~]# ll /tmp/test/
total 0
-rw-rw-r--. 1 robin robin 0 Oct 19 11:50 aa.txt
-rw-r--r--. 1 root  upup  0 Oct 19 11:55 abc.txt
-rw-rw-r--. 1 robin root  0 Oct 19 11:53 cc.txt
-rw-rw-r--. 1 robin upup  0 Oct 19 11:54 tt.txt

3.STICKY

作用:任何用户在拥有t权限目录下创建的文件,只能自己删除,其他人无权删除

作用位置:other
作用对象:目录

添加sticky权限:
chmod o+t 目录名

实验:
1.添加帐号robin 和  zorro
创建目录/tmp/test 权限设置为 777
robin在/tmp/test/目录下创建文件 aa.txt   zorro帐号能不能删除aa.txt?
可以
[root@localhost ~]# mkdir /tmp/test
[root@localhost ~]# chmod 777 /tmp/test/
[robin@localhost ~]$ touch /tmp/test/aa.txt
[zorro@localhost ~]$ rm -f /tmp/test/aa.txt 

2.在/tmp/test目录上添加t权限
robin在/tmp/test/目录下创建文件 aa.txt   zorro帐号能不能删除aa.txt?
不能 t权限
[root@localhost ~]# chmod o+t /tmp/test/
[robin@localhost ~]$ touch /tmp/test/aa.txt
[zorro@localhost ~]$ rm -f /tmp/test/aa.txt 
rm: cannot remove ‘/tmp/test/aa.txt’: Operation not permitted

3.root帐号能不能删除/tmp/test/目录下的文件?
可以  root不受约束
[root@localhost ~]# rm -f /tmp/test/aa.txt 

4.添加帐号king  设置/tmp/test目录的拥有者为king 
chown king /tmp/test
king帐号能不能删除/tmp/test/目录下的文件?
可以 
[root@localhost ~]# useradd king
[root@localhost ~]# chown king /tmp/test/
[robin@localhost ~]$ touch /tmp/test/aa.txt
[king@localhost ~]$ rm -f /tmp/test/aa.txt 

4.高级权限数字表示
高级权限的数字表示是第一个十进制数
例如 /tmp    1777
111111111111
前3位是高级权限,后面9为是ugo的权限
   高级权限大小写区分是否具有x权限:如果没有x权限,则高级权限在x权限位显示为大写

5.练习
1.列举高级权限都有哪些?并解释每个权限的功能
SUID:任何用户在运行拥有suid权限的命令(二进制可执行文件)时,都以该命令拥有者的身份执行
SGID:任何用户在拥有sgid权限的目录下,创建的文件都要继承目录的组
STICKY:任何用户在拥有t权限目录下创建的文件,只能自己删除,其他人无权删除

2.哪个高级权限可以限制root账号?
SGID

3.分别写出每个高级权限的数字表示方法
SUID    4
SGID    2
STICKY  1

4.写出以下数字表示的权限
1777 rwxrwxrwt
2777 rwxrwsrwx
4777 rwsrwxrwx
3777 rwxrwsrwt
5.当高级权限位显示为大写时表示什么含义?
高级权限大小写区分是否具有x权限:如果没有x权限,则高级权限在x权限位显示为大写

六、软件包管理

1.rpm包安装
挂载镜像文件
[root@localhost Packages]# mount -t iso9660 /dev/sr0 /mnt/
mount -t iso9660 /var/ftp/CentOS7-2.iso /mnt
mount /var/ftp/CentOS7-2.iso /mnt
卸载
umount /mnt
mount /var/ftp/CentOS7-2.iso /mnt
umount /var/ftp/CentOS7-2.iso 
umount -l  /mnt  强制卸载
mount 查看挂在信息

nmap-6.40-7.el7.x86_64.rpm
包名-版本.平台.系统版本.rpm

安装软件:
rpm -ivh /mnt/Packages/nmap-6.40-7.el7.x86_64.rpm
-i 安装
-v 显示过程
-h 显示%

查询是否安装
rpm -q nmap

查询包的信息
rpm -qi nmap

查询安装位置
rpm -ql nmap

查看配置文件
rpm -qc nmap

查看帮助文档的位置
rpm -qd nmap

查询文件对应的软件包
which tcpdump
rpm -qf /usr/sbin/tcpdump
或者
rpm -qf `which tcpdump`

查询和vim相关软件
rpm -qa  | grep vim

卸载
rpm -e nmap

查看未安装的软件
rpm -qpi httpd-2.4.6-40.el7.centos.x86_64.rpm 
rpm -qpl httpd-2.4.6-40.el7.centos.x86_64.rpm


手动解决依赖关系
[root@localhost Packages]# rpm -ivh httpd-2.4.6-90.el7.centos.x86_64.rpm 
warning: httpd-2.4.6-90.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
error: Failed dependencies:
	/etc/mime.types is needed by httpd-2.4.6-90.el7.centos.x86_64
	httpd-tools = 2.4.6-90.el7.centos is needed by httpd-2.4.6-90.el7.centos.x86_64
	libapr-1.so.0()(64bit) is needed by httpd-2.4.6-90.el7.centos.x86_64
	libaprutil-1.so.0()(64bit) is needed by httpd-2.4.6-90.el7.centos.x86_64
[root@localhost Packages]# rpm -ivh httpd-tools-2.4.6-90.el7.centos.x86_64.rpm 
warning: httpd-tools-2.4.6-90.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
error: Failed dependencies:
	libapr-1.so.0()(64bit) is needed by httpd-tools-2.4.6-90.el7.centos.x86_64
	libaprutil-1.so.0()(64bit) is needed by httpd-tools-2.4.6-90.el7.centos.x86_64
[root@localhost Packages]# rpm -ivh apr-util-1.5.2-6.el7.x86_64.rpm 
warning: apr-util-1.5.2-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
error: Failed dependencies:
	libapr-1.so.0()(64bit) is needed by apr-util-1.5.2-6.el7.x86_64
[root@localhost Packages]# rpm -ivh apr-1.4.8-5.el7.x86_64.rpm 
warning: apr-1.4.8-5.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:apr-1.4.8-5.el7                  ################################# [100%]
[root@localhost Packages]# rpm -ivh apr-util-1.5.2-6.el7.x86_64.rpm 
warning: apr-util-1.5.2-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:apr-util-1.5.2-6.el7             ################################# [100%]
[root@localhost Packages]# rpm -ivh mailcap-2.1.41-2.el7.noarch.rpm 
warning: mailcap-2.1.41-2.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:mailcap-2.1.41-2.el7             ################################# [100%]
[root@localhost Packages]# rpm -ivh httpd-tools-2.4.6-90.el7.centos.x86_64.rpm 
warning: httpd-tools-2.4.6-90.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:httpd-tools-2.4.6-90.el7.centos  ################################# [100%]
[root@localhost Packages]# rpm -ivh httpd-2.4.6-90.el7.centos.x86_64.rpm 
warning: httpd-2.4.6-90.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:httpd-2.4.6-90.el7.centos        ################################# [100%]

强制安装:现有的文件不动,补充缺失的文件
rpm -ivh httpd-2.4.6-40.el7.centos.x86_64.rpm --force

不检查依赖关系卸载
rpm -e httpd-tools --nodeps


yum库,主要解决rpm的依赖关系
查看提供文件的包
[root@localhost test]# yum provides /etc/mime.types
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
mailcap-2.1.41-2.el7.noarch : Helper application and MIME type associations
                            : for file types
源    :CentOS7-2
匹配来源:
文件名    :/etc/mime.types


yum库的使用
从光盘导入key
rpm -import /mnt/RPM-GPG-KEY-Centos7

1.进入到yum库的配置文件目录: /etc/yum.repos.d/
[root@localhost yum.repos.d]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir old
[root@localhost yum.repos.d]# mv *.repo old/   将原来的repo放入old
[root@localhost yum.repos.d]# vim local.repo  重新创建一个

2.配置
[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost yum.repos.d]# vim /etc/yum.repos.d/local.repo
[local]       yum库的名字
name=local    描述信息
baseurl=file:///mnt   路径(本地file  网络http)
enabled=1     1开启,0不开启
gpgcheck=0    1校验,0不校验  校验key

3.测试
清空yum缓存
[root@localhost yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, langpacks
Cleaning repos: local
Cleaning up list of fastest mirrors
Other repos take up 630 M of disk space (use --verbose for details)

(快速)建立缓存
[root@localhost yum.repos.d]# yum makecache fast
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
local                                                 | 3.6 kB     00:00     
(1/2): local/group_gz                                   | 165 kB   00:00     
(2/2): local/primary_db                                 | 3.2 MB   00:00     
Metadata Cache Created

[root@localhost yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id                             repo name                          status
local                               local                              4,067
repolist: 4,067

安装
yum install httpd-devel   
yum -y install httpd-devel

覆盖安装的包
yum reinstall httpd-devel

搜素相关的软件包
yum search vim 

查找文件相关的软件包
yum provides /etc/mime.types

卸载软件包
yum remove httpd

查看yum历史
yum history

检查库
yum check
3

分组列出/集组安装
yum grouplist
yum groupinstall "开发工具"


yum可支持多库安装(库文件必须正确,有一个错误则全错)
yum 本地源,自建库,网络源(互联网,局域网)
同一个配置文件中配置多库
[root@localhost yum.repos.d]# cat iso.repo 
[CentOS7.2]
name=centos7.2
baseurl=file:///yum
enabled=1
gpgcheck=0

[test]
name=test
baseurl=ftp://172.16.8.100/rhel7u2
enabled=1
gpgcheck=0

多个配置文件配置多库
[root@localhost yum.repos.d]# ls
iso.repo  test  test.repo
[root@localhost yum.repos.d]# cat iso.repo 
[CentOS7.2]
name=centos7.2
baseurl=file:///yum
enabled=1
gpgcheck=0

[root@localhost yum.repos.d]# cat test.repo
[test]
name=test
baseurl=ftp://172.16.8.100/rhel7u2
enabled=1
gpgcheck=0


手动建立yum库
[root@localhost yum.repos.d]# mkdir /zijian
[root@localhost yum.repos.d]# cp /mnt/Packages/* /zijian/
[root@localhost yum.repos.d]# rpm -qf `which createrepo`
[root@localhost yum.repos.d]# yum -y install createrepo
[root@localhost yum.repos.d]# createrepo /zijian/
[root@localhost yum.repos.d]# vim zijian.repo
[zijian]
name=zijian
baseurl=file:///zijian
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, langpacks
Cleaning repos: local zijian
Cleaning up list of fastest mirrors
Other repos take up 630 M of disk space (use --verbose for details)
[root@localhost yum.repos.d]# yum makecache fast
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
local                                                 | 3.6 kB     00:00     
zijian                                                | 2.9 kB     00:00     
(1/3): local/group_gz                                   | 165 kB   00:00     
(2/3): zijian/primary_db                                | 509 kB   00:00     
(3/3): local/primary_db                                 | 3.2 MB   00:00     
Metadata Cache Created
[root@localhost yum.repos.d]# yum repolist 
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id                             repo name                          status
local                               local                              4,067
zijian                              zijian                               691
repolist: 4,758

默认的是网络源
如果要换源,百度阿里/华为源,进行替换即可


练习:
1.写出挂载光盘或者镜像时的完整命令
mount -t iso9660 /dev/sr0 /mnt/

2.解释以下安装软件时参数的功能
-ivh  i安装 v显示安装过程 h显示安装进度
-q  查看是否安装
-qi  查看包的信息
-ql  查看安装的位置
-qf  查看文件对应的软件包
-qa  查看相应的软件包
-qc  查看配置文件
-qd  查看帮助文档位置
-e   卸载

3.写出配置光盘或者镜像作为安装源的yum库配置过程
挂载镜像
[root@localhost ~]# mount /dev/cdrom /mnt/
配置yum库
[root@localhost yum.repos.d]# vim /etc/yum.repos.d/local.repo
[local]       yum库的名字
name=local    描述信息
baseurl=file:///mnt   路径(本地file  网络http)
enabled=1     1开启,0不开启
gpgcheck=0    1校验,0不校验  校验key
清空yum缓存
[root@localhost yum.repos.d]# yum clean all
建立缓存
[root@localhost yum.repos.d]# yum makecache fast

4.解释以下yum的参数分别代表什么含义
install 安装软件包 
reinstall 覆盖安装的软件包
provides 查找文件对应的软件包
remove 卸载软件包
grouplist 按分组列出软件包
groupinstall 按分组安装软件包

5.手动建库时需要哪个命令支持?
createrepo

2.压缩打包
视屏,音频,图片,已经压缩过的文件不能压缩
压缩(只针对文件)
dd制作大文件
[root@localhost tmp]# dd if=/dev/zero of=/tmp/data bs=1M count=200
du命令
du /tmp/data
du -sh /etc/  -h最大单位显示  -sh查看总大小

gzip
gzip data 
gunzip data.gz

bzip2
bzip2 data
bunzip2 data.bz2 

打包
1.可以将琐碎文件,打包成一个文件.方便管理
2.可以提升传输速度

tar
打包
tar -cvf boot.tar /boot/
c打包 v显示过程 f文件
查看包的内容
tar -tvf boot.tar 
追加打包
tar -rvf boot.tar /tmp/data
解包
tar -xvf boot.tar

指定包的存储路径
tar -cvf /home/boot.tar /boot/
解包指定路径
tar -xvf boot.tar -C /home/

压缩打包gzip:
tar -zcvf /tmp/boot.tar.gz /boot/
查看
tar -ztvf /tmp/boot.tar.gz 
解压缩包
tar -zxvf /tmp/boot.tar.gz -C /home/


压缩打包bzip2:
tar -jcvf /tmp/boot.tar.bzip2 /boot/
查看
tar -jtvf /tmp/boot.tar.bzip2 
解压缩包
tar -jxvf /tmp/boot.tar.bzip2 -C /home/

test.tgz  test.tbz



练习:
1.压缩命令有哪些?分别对应的扩展名是什么?
gzip  gz
bzip2 bz2

2.使用tar命令打包时的这些参数分别什么含义
   -c创建  -v显示过程  -f文件  -t查看  -r追加打包  -x解包
3.指定解包目录用什么参数?
-C

4.写出将/boot 打包使用gzip 压缩,并将压缩包放在/tmp下的完整命令(包的名字为test.tar.gz)
tar -zcvf /tmp/test.tar.gz /boot

5.将/tmp/test.tar.gz解压缩到/opt下
tar -zxvf /tmp/test.tar.gz -C /opt

3.源码包安装
解压源码包
解压后的源码包放在/usr/local/src/
tar -xvf lftp-4.7.7.tar.gz -C /usr/local/src/

安装前配置和检测:                             指定目录
[root@localhost lftp-4.7.7]# ./configure --prefix=/usr/local/lftp
编译:
[root@localhost lftp-4.7.7]# make
编译安装:
[root@localhost lftp-4.7.7]# make install
清除编译痕迹
[root@localhost lftp-4.7.7]# make clean


报错:
configure: error: no acceptable C compiler found in $PATH
解决:
yum install gcc gcc-c++

报错:
configure: error: No terminfo, termcap or curses library found. Install ncurses-devel
解决
yum install termcap ncurses-devel

报错:
configure: error: cannot find readline library, install readline-devel package
解决
yum install readline-devel

报错:
configure: error: Package requirements (gnutls >= 1.0.0) were not met:
解决:
yum install gnutls-devel



测试:
rpm -e lftp

[root@localhost ~]# /usr/local/lftp/bin/lftp 172.16.110.1
lftp 172.16.110.1:/> get biji.txt      下载文件
lftp 172.16.110.1:/> mirror video   下载目录

[root@localhost /]# /usr/local/lftp/bin/lftp 172.16.110.1
lftp 172.16.110.1:~> lcd /root/
lcd 成功, 本地目录=/root
lftp 172.16.110.1:~> lcd /tmp
lcd 成功, 本地目录=/tmp
lftp 172.16.110.1:~> 

lftp 172.16.110.1:/> mirror video/ -O /tmp/   指定路径下载


修改环境配置文件:
[root@localhost /]# vim /etc/bashrc 
PATH=$PATH:/usr/local/lftp/bin
export PATH


卸载
rm -rf /usr/local/lftp


练习:
1.简述源码包编译过程,并解释每个步骤的功能?
解压源码包
解压后的源码包放在/usr/local/src/
tar -xvf lftp-4.7.7.tar.gz -C /usr/local/src/
安装前配置和检测:                             
[root@localhost lftp-4.7.7]# ./configure --prefix=/usr/local/lftp
根据检测结果安装相应的软件包
编译:
[root@localhost lftp-4.7.7]# make
编译安装:
[root@localhost lftp-4.7.7]# make install
清除编译痕迹
[root@localhost lftp-4.7.7]# make clean

2.解释源码包和rpm包的区别是什么?
RPM包是二进制包,源码包是C语言文件
RPM包的安装位置是多个位置,是由RPM包的作者指定
RPM包安装后访问效率较低,源码包访问效率高

3.删除lftp软件,重新编译lftp软件并安装到/tmp下


4.其他类型软件包
二进制bin包:
[root@localhost software]# ./RealPlayer\&reg\;\ 11\ for\ Linux\ RealPlayer11GOLD.bin

[root@localhost software]# yum install glibc-2.17-157.el7_3.1.i686

[root@localhost software]# yum remove libstdc++-4.8.5-4.el7.x86_64

[root@localhost software]# yum install libstdc++-4.8.5-11.el7.i686

[root@localhost software]# realplay

解决运行前需要的软件包:
[root@localhost software]# yum install libgdk-x11-2.0.so.0
[root@localhost software]# yum install gtk2-2.24.28-8.el7.i686

[root@localhost ~]# rpm -ivh pangox-compat-0.0.2-2.el7.i686.rpm

[root@localhost software]# yum install libcanberra-gtk2-0.30-5.el7.i686



半源码半rpm
[root@localhost ~]# rm -rf /usr/local/lftp/
lftp-3.5.1-2.fc6.src.rpm

安装:
[root@localhost software]# rpm -ivh lftp-3.5.1-2.fc6.src.rpm
生成:
[root@localhost ~]# ls -d /root/rpmbuild/

SOURCES  源代码和补丁
SPECS/lftp.spec  制作rpm包的配置文件

编译成rpm包
[root@localhost rpmbuild]# rpmbuild -bb /root/rpmbuild/SPECS/lftp.spec 

[root@localhost rpmbuild]# ls /root/rpmbuild/RPMS/x86_64/lftp-*
/root/rpmbuild/RPMS/x86_64/lftp-3.5.1-2.el7.centos.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/lftp-debuginfo-3.5.1-2.el7.centos.x86_64.rpm

[root@localhost rpmbuild]# rpm -ivh /root/rpmbuild/RPMS/x86_64/lftp-3.5.1-2.el7.centos.x86_64.rpm

[root@localhost rpmbuild]# yum install perl-String-CRC32
[root@localhost ftp]# rpm -ivh /var/ftp/perl-String-CRC32-1.4-19.el7.x86_64.rpm

[root@localhost rpmbuild]# yum install perl-Digest-MD5

打补丁
patch 源文件 补丁包

七、进程管理

1.守护进程
[root@localhost ~]# ps
   PID TTY          TIME CMD
  2857 pts/0    00:00:00 bash
  3753 pts/0    00:00:00 ps

PID  进程编号
TTY  占用的终端
TIME  占用CPU的时间
CMD  执行命令

ps  
-e  系统中所有的进程
-f   详细信息

[root@localhost ~]# ps -ef | head
UID         PID   PPID  C STIME TTY          TIME CMD

UID 进程拥有者
PID 进程编号
PPID 父进程
C 占用cpu的百分比
STIME 进程启动时间
TTY 在那个终端上运行的
TIME 占用CPU的时间
CMD 执行命令

BSD
ps
a   所有在终端运行进程
u   详细信息
x   所有进程

[root@localhost ~]# ps aux | head
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

USER 进程拥有者
PID  进程编号
%CPU  占用CPU的百分比
%MEM  占用物理内存的百分比
VSZ 预设内存(虚拟内存)
RSS 真实内存
TTY 运行终端
STAT 进程状态
START 进程启动时间
TIME  占用CPU时间
COMMAND 进程名称


top 动态查看进程信息
top - 14:20:12 up 42 min,  4 users,  load average: 0.30, 0.27, 0.25
当前系统时间        运行了多久   登录用户   CPU平均负载
Tasks: 419 total,   2 running, 417 sleeping,   0 stopped,   0 zombie
进程总数                运行进程      417个休眠           停止                僵尸 
%Cpu(s):  9.8 us,  3.0 sy,  0.0 ni, 83.5 id,  3.5 wa,  0.0 hi,  0.1 si,  0.0 st
                用户态    内核泰   调整nice   空闲    等待io     硬中断  软中断   虚拟化偷取
KiB Mem :  4031780 total,  2625064 free,   580228 used,   826488 buff/cache
KiB Swap:  1023996 total,  1023996 free,        0 used.  3210724 avail Mem 


杀进程:
kill -15 4302  正常结束
kill -9 4349   强制结束
pkill httpd
killall httpd
xkill


前后台切换
[root@localhost ~]# yum install xclock

前台
[root@localhost ~]# xclock  -update 1
后台
[root@localhost ~]# xclock  -update 1 &
脱离终端运行
[root@localhost ~]# nohup xclock  -update 1 &

[root@localhost ~]# xclock  -update 1
ctrl+z 停止前台运行,在后台挂起
[root@localhost ~]# jobs   查看后台挂起进程
[1]+  已停止               xclock -update 1
[root@localhost ~]# bg 1   后台运行挂起进程
[root@localhost ~]# fg 1   前台运行挂起进程

杀后台进程:kill %
2.进程状态
PROCESS STATE CODES
D    uninterruptible sleep (usually IO)
      不可中断休眠状态(通常IO)
R    running or runnable (on run queue)
      运行状态 
S    interruptible sleep (waiting for an event to complete)
      可中断的休眠状态
T    stopped by job control signal
      切换后台
t    stopped by debugger during the tracing   
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

 <    high-priority (not nice to other users)
       高优先级
 N    low-priority (nice to other users)
       低优先级
 L    has pages locked into memory (for real-time and custom IO)
       被锁
 s    is a session leader
       会话领导者
 l    is multi-threaded (using CLONE_THREAD, like NPTL  pthreads do)
       多线程
 +    is in the foreground process group
       位于前台进程组
       
       
nice调整
nice范围 -20~19  越低优先级越高
[root@localhost ~]# nice -n -20 xclock -update 1
[root@localhost ~]# renice 15 -p 5858


proc目录   进程
cat /proc/cpuinfo    cpu文件
lm   ---> 64位系统
vmx|svm  ----> 虚拟化
3.练习
1.什么是守护进程?
2.ps -ef  解释每个字段的含义
-e 系统中所有进程
-f 详细信息

3.ps aux解释每个字段的含义
a 所有在终端运行的进程
u 详细信息
x 所有进程

4.top每个字段的含义
top - 14:20:12 up 42 min,  4 users,  load average: 0.30, 0.27, 0.25
当前系统时间        运行了多久   登录用户   CPU平均负载
Tasks: 419 total,   2 running, 417 sleeping,   0 stopped,   0 zombie
进程总数                运行进程      417个休眠           停止                僵尸 
%Cpu(s):  9.8 us,  3.0 sy,  0.0 ni, 83.5 id,  3.5 wa,  0.0 hi,  0.1 si,  0.0 st
                用户态    内核泰   调整nice   空闲    等待io     硬中断  软中断   虚拟化偷取
KiB Mem :  4031780 total,  2625064 free,   580228 used,   826488 buff/cache
KiB Swap:  1023996 total,  1023996 free,        0 used.  3210724 avail Mem 

5.解释前后台切换时这些指令的功能
ctrl+z  停止前台进程,在后台挂起
jobs    查看挂起进程
bg      后台运行挂起进程
fg      前台运行挂起进程
kill %1 杀死挂起进程
6.解释以下字符代表什么状态?
D 不可中断休眠状态   
R 运行状态
S 可中断休眠状态
T 切换后台
t    
W 
X 
Z 
< 高优先级 
N 低优先级
L 被锁
s 会话领导者
l 多线程
+ 位于前台进程组
7.nice值得范围是多少?启动进程时如何定义nice值?如何重置nice值?
-20~19
nice -n -nice值 进程
renice nice值 -p 进程号

八、高级命令

1.wc计数
wc
-l 统计行数
-c 统计字符
-w 统计单词数(连续的字符串)
[root@localhost ~]# wc -l test.txt
1 test.txt
[root@localhost ~]# wc -c test.txt 
21 test.txt
[root@localhost ~]# wc -w test.txt 
1 test.txt



[root@localhost ~]# cat -n /etc/passwd | head -20  |tail -2 |rev
rev 左右颠倒
[root@localhost ~]# cat -n /etc/passwd | head -20  |tail -2 | tac
tac 上下颠倒
2.cut截取
-d 分割符
-f 取字段
-c 取字符
[root@localhost ~]# head -1 /etc/passwd |cut -d: -f 1-3
root:x:0
[root@localhost ~]# head -1 /etc/passwd |cut -d: -f 1,3
root:0
[root@localhost ~]# head -1 /etc/passwd |cut -d: -f 1
root
[root@localhost ~]# head -1 /etc/passwd |cut -c 10 第10个
0
[root@localhost ~]# head -1 /etc/passwd |cut -c 1-10 第1个到第10个
root:x:0:0
[root@localhost ~]# head -1 /etc/passwd |cut -c 1,10 第1个和第10个
r0

3.grep过滤
[root@localhost ~]# grep 'root' /etc/passwd 含有root的行
[root@localhost ~]# cat -n /etc/passwd | grep 'root'
[root@localhost ~]# grep -n 'root' /etc/passwd 显示行号
[root@localhost ~]# grep -v 'root' /etc/passwd 取反
[root@localhost ~]# grep ^'root' /etc/passwd
[root@localhost ~]# grep 'halt'$ /etc/passwd
-A 3 找到匹配行向后显示3行
-B 3 找到匹配行向前显示3行
-C 3 找到匹配行前后各显示3行
-i 忽略大小写
-x 完全匹配
4.stat查看文件变动
[root@localhost ~]# stat aa.txt 
  文件:"aa.txt"
  大小:4         	块:8          IO 块:4096   普通文件
设备:802h/2050d	Inode:77530278    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2017-05-22 11:43:11.545941923 +0800
最近更改:2017-05-22 11:43:09.819870359 +0800
最近改动:2017-05-22 11:43:09.821870442 +0800
创建时间:-
5.sort排序
[root@localhost ~]# sort aa.txt   默认按首字符排序
[root@localhost ~]# sort -n aa.txt  按整个数字排序
[root@localhost ~]# sort -n -u aa.txt   -u 去掉重复行
[root@localhost ~]# sort -n -u -r aa.txt  -r  逆序输出
-t 分隔符  -k 排序列
-d 只考虑空白和字母数字字符
6.uniq去掉重复行
[root@localhost ~]# uniq aa.txt 默认去掉连续重复行
[root@localhost ~]# uniq -d aa.txt  显示重复行
[root@localhost ~]# uniq -d -c aa.txt  -c 显示重复次数
-u 显示没有连续重复的行

7.练习
1.统计你当前系统中可登录用户的数量
[root@localhost ~]# grep bash$ /etc/passwd | wc -l
6
[root@localhost ~]# grep -c bash$ /etc/passwd 
6
[root@localhost ~]# cat /etc/passwd | cut -d: -f 7| sort  | uniq -c


2.[root@localhost ~]# ifconfig eno16777736 | awk -F' +' '/broadcast/{print $3}'
172.16.110.247
制作别名myip  显示ip地址
[root@localhost ~]# ifconfig ens33 |head -2|tail -1 |cut -d' ' -f 10
192.168.33.130
[root@localhost ~]#  ifconfig eno16777736 |grep broadcast| cut -d' ' -f 10
172.16.110.247

[root@localhost ~]# alias myip="ifconfig ens33 |head -2|tail -1 |cut -d' ' -f 10"
[root@localhost ~]# myip
192.168.33.130


3.
[root@localhost ~]# stat aa.txt 
  文件:"aa.txt"
  大小:4         	块:8          IO 块:4096   普通文件
设备:802h/2050d	Inode:77530278    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2017-05-22 11:43:11.545941923 +0800
最近更改:2017-05-22 11:43:09.819870359 +0800
最近改动:2017-05-22 11:43:09.821870442 +0800
创建时间:-

取出
11:43:11
11:43:09
11:43:09

[root@localhost ~]# stat aa.txt | grep +0800 |cut -d' ' -f 3|cut -d'.' -f 1
13:49:43
13:49:43
13:49:43

[root@localhost ~]# stat aa.txt |awk -F' |[.]' '/+0800/{print $2}'
13:48:17
13:48:16
13:48:16

1.求passwd文件中uid最大用户的名字
[root@localhost ~]# sort -t':' -k 3 -n /etc/passwd | tail -1 |cut -d: -f 1
nfsnobody

2.求group文件中gid最小的组名和gid
[root@localhost ~]# sort -t':' -k 3 -n /etc/group | head -1 |cut -d: -f 1,3
root:0

3.求出系统中所有网卡的ip地址 (ifconfig获取所有网卡信息)
[root@localhost ~]# ifconfig |grep netmask| cut -d' ' -f 10
192.168.33.130
127.0.0.1
192.168.122.1

九、环境变量配置文件

1.环境变量
环境变量
env 查环境变量
HISTSIZE=1000  历史命名保存的数量
USER=root  
PWD=/home/robin
HOME=/root
OLDPWD=/root

set 环境变量和非环境变量(自定义变量)
环境变量:父进程定义的环境变量,子进程可以继承  export
自定义变量:父进程定义的自定义变量,子进程不可以继承 bash



.bashrc  保存用户定义的别名和函数

.bash_profile 保存用户搜索命令的路径
PATH

.bash_history  保存历史命令文件(当用户退出时记录)
.bash_logout 保存用户退出时执行的命令

vim .bash_logout
echo "byebye"

当用户退出时清除执行过的历史命令
rm -rf ~/.bash_history

重新加载
[root@localhost ~]# source /etc/profile


实验:
mkdir /home/robin/test/
vim /home/robin/test/test.sh
\#!/bin/bash
echo "hello world"
chmod +x /home/robin/test/test.sh

vim /home/robin/.bash_profile
PATH=$PATH:/home/robin/test
export PATH

测试
su - robin
test.sh


.bashrc        shell级别环境变量配置文件
.bash_profile  登录级别环境变量配置文件
/etc/bashrc  全局shell级别环境配置文件
/etc/profile  全局登录级别环境配置文件

登录用户时环境配置文件加载顺序
/etc/profile
.bash_profile
.bashrc
/etc/bashrc


su  robin  和  su - robin的区别:
su robin  shell级别的切换,只加载两个shell级别的文件
.bashrc 
/etc/bashrc

su - robin  登录级别的切换,4个文件都加载
/etc/profile
.bash_profile 
.bashrc
/etc/bashrc
2.练习
1.当用户退出时,清除自己的操作痕迹
[root@localhost ~]# vim /home/robin/.bash_logout 
history -c
rm -rf ~/.bash_history

2.将lftp软件加入到搜索路径,对所有用户生效
[root@localhost ~]# vim /etc/profile
PATH=$PATH:/usr/local/lftp/bin
export PATH
[root@localhost ~]# source /etc/profile

3.定义别名la相当于ls -alh 只针对tom用户
[root@localhost ~]# vim /home/tom/.bashrc 
alias la="ls -alh"
[root@localhost ~]# su - tom 
[tom@localhost ~]$ la


1.环境变量和非环境变量如何查询?
env  set
2.如何定义环境变量和非环境变量?
export bash
3.环境变量和非环境变量的区别是什么?
环境变量:父进程定义的环境变量,子进程可以继承 
自定义变量:父进程定义的自定义变量,子进程不可以继承 

4.解释一下文件的功能?
.bash_history 保存历史命令文件
.bash_logout 保存用户退出时执行的命令
.bashrc 保存用户定义的别名和函数       shell级别
.bash_profile 保存用户搜索命令的路径   登录级别
/etc/bashrc 全局定义的别名和函数       shell级别
/etc/profile 全局定义搜索命令的路径    登录级别

5.将源码包安装的lftp软件命令的搜索路径添加到所有用户可以执行的环境配置文件
在/etc/profile中添加
PATH=$PATH:/usr/local/lftp/bin
export PATH
[root@localhost ~]# source /etc/profile

6.将高级命令作业中,查看所有网卡的命令,做成别名放到root的环境配置中
[root@localhost ~]# vim /etc/bashrc 
alias zkq='ifconfig'
[root@localhost ~]# source /etc/bashrc 
[root@localhost ~]# zkq

十、shell基础

1.bash特性
yum -y install bash-com* 
tab制表符的补齐功能:补齐命令 | 补齐文件名
[root@localhost ~]# systemctl restart vsftpd

history 查看执行过的历史命令

[root@localhost ~]# !1039   在执行一次第1039条命令
[root@localhost ~]# !!  在执行一次上一条命令
[root@localhost ~]# !sys  在执行一次以sys开头的命令

[root@localhost ~]# ls /etc/sysconfig/network-scripts/ifcfg-eno16777736 
/etc/sysconfig/network-scripts/ifcfg-eno16777736
[root@localhost ~]# vim !$  上一条最后一个参数
vim /etc/sysconfig/network-scripts/ifcfg-eno16777736

2.shell坏境变量
env 查看环境
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $USER
root
[root@localhost ~]# echo $SHELL

[root@localhost ~]# set 环境与非环境变量

环境变量:子进程可以继承父进程定义的环境变量,非环境变量不可以进程
环境变量:export  x=100
自定义:x=100
  
环境变量的配置文件:
用户自己的环境变量配置文件:
~/.bashrc                 shell级别环境变量配置文件
~/.bash_profile         登录级别环境变量配置文件
全局环境变量配置文件:
/etc/bashrc              全局shell级别环境变量配置文件
/etc/profile              全局登录级别环境变量配置文件
3.定向符
> : 表示覆盖写入  1>
>>: 表示追加写入  1>>
1,2文件描述符号:
1 :  标准正确输出
2 :  标准错误输出
1>:  标准正确输出,如果文件存在则覆盖,如果文件不存在则创建
1>>: 标准正确输出,如果文件存在则追加,如果文件不存在则创建
2>:  标准错误输出,如果文件存在则覆盖,如果文件不存在则创建
2>>: 标准错误输出,如果文件存在则追加,如果文件不存在则创建
&> 标准正确和标准错误 
2>&1 标准错误定向到表正确输出  afdas 1>/tmp/aa.txt 2>&1
4.shell脚本
判断语法:
[root@localhost ~]# cat if.sh 
#!/bin/bash        声明命令解释器
# the scripts is test!!
if [ -f /tmp/kk.txt ]
then 
    echo  "文件存在,显示详细信息.稍等......"
    sleep 1
    ls -l '/tmp/kk.txt'
else
    echo "文件不存在,创建文件,稍等......"
    sleep 1
    touch /tmp/kk.txt
    echo "创建成功"
fi

循环语法:
#!/bin/bash
#查找未使用的ip地址
for i in {1..254}
do
        ( if ping -c 1 172.16.110.$i &> /dev/null
        then
                echo "172.16.110.$i is used"
        else
                echo "172.16.110.$i is free"
        fi ) &
done
5.练习
1.解释以下名词
1>
1>>
2>
2>>
&>

2.1 2什么名字? >什么名字?

十一、磁盘管理

1.主/扩展/逻辑分区
查看磁盘
[root@localhost ~]# fdisk -l

[root@localhost ~]# df -Th 

分区:
[root@localhost ~]# fdisk /dev/sda
命令(输入 m 获取帮助):m
d   delete a partition  删除分区
l   list known partition types 列出
m   print this menu 获取帮助
n   add a new partition  添加
p   print the partition table  打印分区表
q   quit without saving changes 退出
w   write table to disk and exit 保存退出
t   change a partition's system id 修改类型


分区:
命令(输入 m 获取帮助):n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): p
已选择分区 4
起始 扇区 (37890048-41943039,默认为 37890048):
将使用默认值 37890048
Last 扇区, +扇区 or +size{K,M,G} (37890048-41943039,默认为 41943039):+1G
分区 4 已设置为 Linux 类型,大小设为 1 GiB
命令(输入 m 获取帮助):w

同步分区表,产生新的分区对应的文件
[root@localhost ~]# ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3
[root@localhost ~]# partx -a /dev/sda
partx: /dev/sda: error adding partitions 1-3
[root@localhost ~]# ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4

格式化:
[root@localhost ~]# mkfs.xfs  /dev/sda4
挂载使用:
[root@localhost ~]# mount /dev/sda4 /mnt/
 

删除分区:
卸载分区:
[root@localhost ~]# umount /mnt

[root@localhost ~]# fdisk /dev/sda
命令(输入 m 获取帮助):d
分区号 (1-4,默认 4):4
分区 4 已删除

命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000f1b58

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    35842047    17408000   83  Linux
/dev/sda3        35842048    37890047     1024000   82  Linux swap / Solaris

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。

[root@localhost ~]# ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4

[root@localhost ~]# partx -d /dev/sda
partx: /dev/sda: error deleting partitions 1-3
[root@localhost ~]# ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3

划分扩展和逻辑分区
命令(输入 m 获取帮助):n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
已选择分区 4
起始 扇区 (37890048-41943039,默认为 37890048):
将使用默认值 37890048
Last 扇区, +扇区 or +size{K,M,G} (37890048-41943039,默认为 41943039):
将使用默认值 41943039
分区 4 已设置为 Extended 类型,大小设为 2 GiB


命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000f1b58

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    35842047    17408000   83  Linux
/dev/sda3        35842048    37890047     1024000   82  Linux swap / Solaris
/dev/sda4        37890048    41943039     2026496    5  Extended

划分逻辑分区
命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区 5
起始 扇区 (37892096-41943039,默认为 37892096): 
将使用默认值 37892096
Last 扇区, +扇区 or +size{K,M,G} (37892096-41943039,默认为 41943039):+1G 
分区 5 已设置为 Linux 类型,大小设为 1 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000f1b58

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    35842047    17408000   83  Linux
/dev/sda3        35842048    37890047     1024000   82  Linux swap / Solaris
/dev/sda4        37890048    41943039     2026496    5  Extended
/dev/sda5        37892096    39989247     1048576   83  Linux

命令(输入 m 获取帮助):
命令(输入 m 获取帮助):w

[root@localhost ~]# partx -a /dev/sda
partx: /dev/sda: error adding partitions 1-3
[root@localhost ~]# ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4  /dev/sda5



练习:
1.划分分区
3主分区 每个大小200M
1扩展分区,所有剩余空间
划分4个逻辑分区100M
[root@localhost ~]# fdisk /dev/sdb


2.将sdb5 和 sdb6格式化为xfs文件系统
[root@localhost ~]# mkfs.xfs /dev/sdb5
[root@localhost ~]# mkfs.xfs /dev/sdb6

挂载sdb5到/mnt目录 在/mnt目录下创建文件test.txt
[root@localhost ~]# touch /mnt/test.txt
挂载sdb6到/mnt目录 问能不能挂载?  如果可以,还能不能看到test.txt文件?
能,看不到
[root@localhost ~]# mount /dev/sdb6 /mnt/
[root@localhost ~]# ls /mnt/

挂载在sdb5到/mnt目录  再将sdb5挂载到/opt目录 是否可以? 在/mnt和/opt下是不是都可以看到test.txt文件?
都可以
[root@localhost ~]# mount /dev/sdb5 /mnt/
[root@localhost ~]# ls /mnt/
test.txt
[root@localhost ~]# mount /dev/sdb5 /opt/
[root@localhost ~]# ls /opt/
test.txt

3.删除逻辑分区sdb7 查看哪个分区消失了?想想为什么?
sdb8消失,sdb8的编号变成了sdb7


1.理解磁盘的各种关键字扇区,磁道,柱面
2.理解什么是主分区,扩展分区,逻辑分区  msdos
3.简述划分主分区的过程 
用fdisk进行创建,fdisk /dev/sdb
p打印
n创建
p选主分区
配置大小
w保存退出

4.简述划分扩展分区的过程
用fdisk进行创建,fdisk /dev/sdb
p打印
n创建
e选主分区
配置大小
w保存退出

5.简述划分逻辑分区的过程
用fdisk进行创建,fdisk /dev/sdb
p打印
n创建
配置大小
w保存退出

6.将sdb划分为
3个主分区
一个扩展分区
3个逻辑分区

用fdisk创建即可
2.自动挂载
mount
命令格式
mount  -t  文件系统类型   被挂载的设备   挂载点
[root@localhost ~]# mount /dev/sda5 /mnt/
[root@localhost ~]# umount /dev/sda5
[root@localhost ~]# umount /mnt
[root@localhost ~]# umount -l /opt/
[root@localhost ~]# mount -o rw,remount /opt/  重新挂载
[root@localhost ~]# mount -o bind /root/ /tmp/  将一个目录挂载到另外的目录
mount -t tmpfs size=500M /mnt/ 挂载内存
mount -t sysfs sys /mnt/  挂载服务
mount -t procfs sys /mnt/ 


自动挂载:
1./etc/rc.local(进入系统前,最后一个启动脚本)
mount -t xfs /dev/sda5 /mnt
mount  -t iso9660 /var/ftp/CentOS7-2.iso /yum
添加执行权限
chmod a+x /etc/rc.d/rc.local
重启测试

2./etc/fstab 
/dev/sda5 /mnt xfs defaults  0 0
/var/ftp/CentOS7-2.iso  /yum/ iso9660 defaults 0 0
被挂载的设备  挂载点   文件系统   参数   dump备份  fsck检查

测试mount -a

3.autofs(按需挂载服务)
安装软件:
[root@localhost etc]# yum install autofs
创建目录
[root@localhost ~]# mkdir /test

主配置文件(定义按需挂载目录,定义对该目录挂载设备的文件)
[root@localhost etc]# vim /etc/auto.master
/test   /etc/auto.test
目录     配置文件

[root@localhost etc]# vim /etc/auto.test
disk-5  -fstype=xfs,rw  :/dev/sda5
触发目录  文件系统类型  被挂载设备

重启autofs服务
[root@localhost etc]# systemctl restart autofs
测试
[root@localhost ~]# cd /test
[root@localhost test]# ls 
[root@localhost test]# ls iso
CentOS_BuildTag  GPL       LiveOS    RPM-GPG-KEY-CentOS-7
EFI              images    Packages  RPM-GPG-KEY-CentOS-Testing-7
EULA             isolinux  repodata  TRANS.TBL
[root@localhost test]# ls
iso

自动卸载:
[root@localhost etc]# vim /etc/autofs.conf
timeout = 300    

自定义卸载时间
vim /etc/auto.master
/test   /etc/auto.test --timeout=10

每隔1妙执行一次mount命令
[root@localhost /]# watch -n 1 mount 


作业:
使用autofs+yum结合使用
配置autofs
auto实现镜像  按需挂载    /test/iso
[root@localhost ~]# mkdir /test
[root@localhost ~]# vim /etc/auto.master
/test /etc/auto.test
[root@localhost ~]# vim /etc/auto.test
iso -fstype=iso9660,ro :/dev/cdrom
[root@localhost ~]# systemctl restart autofs
[root@localhost ~]# cd /test/
[root@localhost test]# ls iso
CentOS_BuildTag  GPL       LiveOS    RPM-GPG-KEY-CentOS-7
EFI              images    Packages  RPM-GPG-KEY-CentOS-Testing-7
EULA             isolinux  repodata  TRANS.TBL
[root@localhost test]# ls
iso


配置yum
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim yum.repo
[yum]
name=autofs_yum
baseurl=file:///test/iso
enabled=1
gpgcheck=0

[root@localhost ~]# yum makecache




练习:(sdb5和sdb6 一定有文件系统)
将分区sdb5通过rc.local文件实现自动挂载,挂载到/opt目录
将分区sdb6通过fstab文件实现自动挂载,挂载到/mnt目录
重启系统测试是否成功?
[root@localhost ~]# vim /etc/rc.local 
mount -t xfs /dev/sdb5 /opt
[root@localhost ~]# vim /etc/fstab 
/dev/sdb6 /mnt xfs defaults 0 0
[root@localhost ~]# mount -a

练习:
1.将上一章5,6,7这个三个逻辑分区,使用不同的方法实现自动挂载
如:
格式化sdb5,6,7为xfs格式
sdb5    rc.local方式
[root@localhost ~]# vim /etc/rc.local 
mount -t xfs /dev/sdb5 /mnt
[root@localhost ~]# chmod a+x /etc/rc.d/rc.local 
重启生效

sdb6    fstab方式
[root@localhost ~]# vim /etc/fstab 
/dev/sdb6 /opt xfs defaults 0 0
[root@localhost ~]# mount -a

sdb7    autofs方式
[root@localhost ~]# yum -y install autofs
[root@localhost ~]# mkdir /lj7
[root@localhost ~]# vim /etc/auto.master
/lj7 /etc/auto.lj7
[root@localhost ~]# vim /etc/auto.lj7
luoji7 -fstype=xfs,rw :/dev/sdb7
[root@localhost ~]# systemctl restart autofs
[root@localhost ~]# cd /lj7/
[root@localhost lj7]# ls luoji7
[root@localhost lj7]# ls
luoji7

3.交换分区扩大缩小
扩大交换分区:
1.分区
2.格式化
[root@localhost ~]# mkswap /dev/sda6
正在设置交换空间版本 1,大小 = 511996 KiB
无标签,UUID=266ce265-7659-4e77-971e-44de60c5ab2d
3.激活新的交换分区
[root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        4031780      888876      108384       12016     3034520     2897392
Swap:       1023996           0     1023996
[root@localhost ~]# swapon /dev/sda6
[root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        4031780      889560      107496       12068     3034724     2896656
Swap:       1535992           0     1535992

[root@localhost ~]# swapon -s
文件名				类型		大小	已用	权限
/dev/sda3                              	partition	1023996	0	-1
/dev/sda6                              	partition	511996	0	-2


新交换分区永久生效
方法1:
vim /etc/rc.local
swapon /dev/sda6

方法2: UUID
blkid  /dev/sda6  查UUID
vim /etc/fstab
/dev/sda6 swap swap  defaults 0 0

修改分区编号:
[root@localhost ~]# fdisk /dev/sda
命令(输入 m 获取帮助):t  
分区号 (1-6,默认 6):6
Hex 代码(输入 L 列出所有代码):82
已将分区“Linux”的类型更改为“Linux swap / Solaris”
命令(输入 m 获取帮助):w
命令(输入 m 获取帮助):p


缩小交换分区:
1.
[root@localhost ~]# swapoff /dev/sda6 取消激活交换分区
2.
删除永久激活设置
3.删除分区



练习:
1.查看你当前的交换分区大小  free -m
[root@localhost test]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972         394         143          10         434         422
Swap:          1023           0        1023
2.将交换分区扩大1G,并保证重启后依然有效
[root@localhost ~]# fdisk /dev/sdb
创建一个1G的分区,类型为82
[root@localhost ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 204796 KiB
no label, UUID=e640d0a9-4401-4bfc-9ddf-155c91d749f8
[root@localhost ~]# swapon /dev/sdb1
[root@localhost ~]# swapon
NAME      TYPE       SIZE USED PRIO
/dev/dm-1 partition 1024M   0B   -2
/dev/sdb1 partition  200M   0B   -3
[root@localhost ~]# vim /etc/fstab 
/dev/sdb1 swap swap defaults 0 0

3.将交换分区还原
[root@localhost ~]# swapoff /dev/sdb1
删除永久激活设置
删除分区



1.什么是交换分区?它的作用是什么?
linux交换分区即是linux的SWAP分区 SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用

2.将你当前的交换分区扩大到2GB,在缩小到1GB
[root@localhost ~]# fdisk /dev/sdb
创建一个1G的分区,类型为82
[root@localhost ~]# mkswap /dev/sdb1
[root@localhost ~]# swapon /dev/sdb1
[root@localhost ~]# vim /etc/fstab 
/dev/sdb1 swap swap defaults 0 0
[root@localhost ~]# swapoff /dev/sdb1


4.raid磁盘阵列
多块硬盘做raid
磁盘阵列:
1.数据冗余 
2.读写加速

raid的级别
level 0             #速度
作用:  条带化
数量: 2(最少)
size:500G     1T     2n

level 1
作用:  镜像          #冗余
数量: 2(最少)
size: 500G    500G    n/2

level 5
作用: 带奇偶数校验的条带化
数量: 3(最少)
size:500G   n-1  1T

level 10
作用:  raid1+raid0
数量: 4(最少)
size:500G  1T      n/2


软raid(使用软件模拟)
创建raid 0
mdadm -C -n 2 -l 0 /dev/md0 /dev/sda5 /dev/sda6 
      创建 数量 级别  名称       磁盘
 
查询
mdadm -D /dev/md0 
显示扫描信息
mdadm -Ds
永久化软raid  
[root@localhost ~]# vim /etc/mdadm.conf
DEVICE /dev/sdb5 /dev/sdb6
[root@localhost ~]# mdadm -Ds >> /etc/mdadm.conf  #详细见后面
[root@localhost ~]# vim /etc/mdadm.conf
DEVICE /dev/sdb5 /dev/sdb6
ARRAY /dev/md0 metadata=1.2 name=localhost.localdomain:0 UUID=4554cd1e:17c73a67:9bcf5739:c921f89c

停止
mdadm -S /dev/md0
激活阵列
mdadm -A /dev/md0 /dev/sda5 /dev/sda6


删除:
mdadm -S /dev/md0
rm -rf /dev/md0
rm -rf /etc/mdadm.conf
清除超级块信息
mdadm --zero-superblock /dev/sda5 /dev/sda6



raid1:
mdadm -C -n 2 -l 1 /dev/md1 /dev/sda5 /dev/sda6 

raid5:
mdadm -C -n 3 -l 5 /dev/md5 /dev/sda5 /dev/sda6 /dev/sda7

rai10:
mdadm -C -n 4 -l 10 /dev/md5 /dev/sda5 /dev/sda6 /dev/sda7 /dev/sda8


模拟损坏:
创建
mdadm -C -n 3 -l 5 /dev/md5 /dev/sda{5,6,7}
格式化,挂载,使用磁盘后模拟
mkfs.xfs /dev/md5
mount /dev/md5 /mnt
损坏
mdadm -f /dev/md5 /dev/sda5
查询
mdadm -D /dev/md5
移除
mdadm -r /dev/md5 /dev/sda5
添加
mdadm -a /dev/md5 /dev/sda8


备用盘:
mdadm -C -n 3 -l 5 /dev/md5 /dev/sda{5,6,7} -x 1 /dev/sda8
mdadm -D /dev/md5


永久生效:
mdadm -C -n 3 -l 5 /dev/md5 /dev/sda{5,6,7} -x 1 /dev/sda8

[root@localhost ~]# vim /etc/mdadm.conf
DEVICE /dev/sda5 /dev/sda6 /dev/sda7 /dev/sda8
[root@localhost ~]# mdadm -Ds >> /etc/mdadm.conf

[root@localhost ~]# cat /etc/mdadm.conf
DEVICE /dev/sda5 /dev/sda6 /dev/sda7 /dev/sda8   #手动添加
ARRAY /dev/md5 metadata=1.2 spares=1 name=localhost:5 UUID=5249b8cf:c2a5b49f:405a4a2c:2247d8c9
[root@localhost ~]# 




1.卸载
2.停止
3.删除
4.清除超级块


练习
1.简述raid0 raid1 raid5 raid10 各有什么功能?
2.分别做raid0 raid1 raid5 raid10 实验, 并模拟损坏
5.lvm管理
逻辑卷
lvm功能:
1.整合磁盘空间
2.在线扩容

操作
pv    物理卷
1.创建pv
pvcreate /dev/sda6
pvcreate /dev/sda7

2.查询pv
pvs
pvdisplay 


vg         卷组
1.创建vg   
vgcreate vg0 /dev/sda6 /dev/sda7
-s 指定pe大小,4的倍数
2.查询vg
vgs
vgdisplay


lv         逻辑卷
1.创建   
lvcreate -L 700M -n lv0 vg0
-L size
-l pe块个数
-n  name

2.查询 
lvs
lvdisplay 


格式化
mkfs.xfs /dev/vg0/lv0
挂载
mount /dev/vg0/lv0 /mnt/


在线扩容lv
1.lvm块设备在线扩容
2.文件系统的在线扩容

lvm块设备在线扩容
前提vg是有可用空间
lvextend -L +200M /dev/vg0/lv0 

文件系统的在线扩容
xfs_growfs /dev/vg0/lv0


在线扩容vg
1.有额外分区或者磁盘
2.创建成pv
3.扩容
 vgextend vg0 /dev/sda8

数据迁移(必须在一个vg下)
1.指定设备移动数据 
pvmove /dev/sda6 /dev/sdb

2.不指定设备移动数据
pvmove /dev/sda7

vg移除pv
vgreduce vg0 /dev/sda{6,7,8}


删除lv
1.umount /dev/vg0/lv0
2.lvremove /dev/vg0/lv0
3.vgremove vg0
4.pvremove /dev/sda{6,7,8}


lvm快照snapshot
vgcreate vg0 /dev/sdb
lvcreate -L 500M -n /dev/vg0/lv0 vg0 
mkfs.xfs /dev/vg0/lv0 
mount /dev/vg0/lv0 /mnt/

创建快照 COW(copy on write)
lvcreate -L 52M -s -n /dev/vg0/lv0-s0 lv0
-s 快照
1.只使用快照,源lv不动
快照内文件修改,不影响源lv数据,快照空间使用100%,快照自动损坏

创建lv0,挂载,添加数据
创建快照
挂载快照
在快照内添加数据,达到%100,快照损毁
 


2.只使用源lv,快照作为备份  只适合临时备份
随着源lv的变动,快照也随着变大,但是快照中只显示源数据,而不会变动

快照作为备份,空间最好大于数据大小,还要注意选择服务器最空闲时间
多用备份

创建lv0,挂载,添加数据
创建快照,作为备份
删除原lv0内的内容
使用快照恢复数据

注意
再备份过程中,如原lv有大量数据写入,可能造成快照使用率达到100%,损毁
快照大小,要大于备份数据大小
快照大小要足够大...





EXT4文件系统(centos)
pvcreate /dev/sda6 /dev/sda7
vgcreate vg0 /dev/sda{6,7}
lvcreate -L 500M -n lv0 vg0
mkfs.ext4 /dev/vg0/lv0 
mount /dev/vg0/lv0 /mnt/

lvextend -L +200M /dev/vg0/lv0 

在线扩容
lvextend -L +200M /dev/vg0/lv0 
 resize2fs /dev/vg0/lv0 600M   指定大小
 resize2fs /dev/vg0/lv0 扩大lv的空间
 
离线缩小
umount /mnt/
e2fsck -f /dev/vg0/lv0
resize2fs /dev/vg0/lv0  200M
lvresize -L 200M /dev/vg0/lv0

快照同时挂载
 lvcreate -L 50M -s -n /dev/vg0/lv0-s0 /dev/vg0/lv0
 mount /dev/vg0/lv0 /mnt/
mount /dev/vg0/lv0-s0 /opt/




练习
1.简述lvm的功能和作用
整合磁盘空间
在线扩容

2.使用硬盘sdb sdc sdd创建lvm,并实现在线扩容lv 和 在线扩容vg

准备分区5快,每块200M
用fdisk创建5个磁盘

创建raid 5
[root@localhost ~]# mdadm -C -n 3 -l 5 /dev/md5 /dev/sdb{1,2,3}

创建raid 1
[root@localhost ~]# mdadm -C -n 2 -l 1 /dev/md1 /dev/sdb{5,6}



[root@localhost ~]# mdadm -S /dev/md1
mdadm: stopped /dev/md1
[root@localhost ~]# mdadm -S /dev/md5
mdadm: stopped /dev/md5
[root@localhost ~]# rm -rf /dev/md1
[root@localhost ~]# rm -rf /dev/md5
[root@localhost ~]# mdadm --zero-superblock /dev/sdb{1,2,3,5,6}

做成lv0 300M
[root@localhost ~]# pvcreate /dev/sdb{1,2,3}
[root@localhost ~]# vgcreate vg0 /dev/sdb{1,2,3}
[root@localhost ~]# lvcreate -L 300M -n lv0 vg0

格式化,挂载
[root@localhost ~]# mkfs.xfs /dev/vg0/lv0 
[root@localhost ~]# mount /dev/vg0/lv0 /mnt/

在线扩容到500M
[root@localhost ~]# lvextend -L +200M /dev/vg0/lv0 
[root@localhost ~]# xfs_growfs /dev/vg0/lv0 

做快照52M
[root@localhost ~]# lvcreate -L 52M -s -n /dev/vg0/lv0-s0 lv0

还原
[root@localhost ~]# lvremove /dev/vg0/lv0-s0 
[root@localhost ~]# umount /mnt 
[root@localhost ~]# lvremove /dev/vg0/lv0
[root@localhost ~]# vgremove vg0
[root@localhost ~]# pvremove /dev/sdb{1,2,3}

6.facl使用方法
文件系统属性
i  不允许对文件做以下操作:
不能删除
不能修改
不能剪切
不能重命名
如果是目录: 不能创建新文件
chattr +i  file/dir   
lsattr file/dir
a  不允许对文件做以下操作:
不能删除
不能修改
不能剪切
不能重命名
可以追加新内容
如果是目录: 可以创建新文件
chattr +a file/dir

facl(文件访问控制列表)

xfs的facl(xfs默认支持facl)
+ 表示设置facl权限了
getfacl 获取facl信息
setfacl 设置facl信息

setfacl -m u:robin:rw aa.txt   设置用户
setfacl -m u:zorro:rw aa.txt
setfacl -m g:upup:rw aa.txt   设置组
setfacl -m m:r aa.txt              设置mask

setfacl -x robin aa.txt   删除某个用户额外的权限
setfacl -x g:upup aa.txt  删除组的额外权限
setfacl -b aa.txt   删除所有额外权限及取消+标记


练习:
建立三个普通用户 seker,zorro,shrek.用 root 用户在/root 目录中建立一个文件 abc.txt使 seker 用户既能读又能写 abc.txt 文件,但不能删除
使 zorro 用户只能读取,不能写也不能删这个文件
使 shrek 用户只能删除,不能读写这个文件.
以上三个条件同时成立

/root   r-xrwxr-x  root root
/root/abc.txt  rw-r-----   seker zorro

seker  seker
zorro  zorro
shrek  shrek

chown seker /root/abc.txt
chown .zorro /root/abc.txt
chmod 640 /root/abc.txt

chmod g+w /root
usermod -a -G root  shrek
chmod o+rx /root


用facl完成上题:
[root@localhost ~]# setfacl -m u:seker:rw /root/abc.txt 
[root@localhost ~]# setfacl -m u:seker:rx /root/

[root@localhost ~]# setfacl -m u:zorro:r /root/abc.txt 
[root@localhost ~]# setfacl -m u:zorro:rx /root/

[root@localhost ~]# setfacl -m u:shrek:- /root/abc.txt 
[root@localhost ~]# setfacl -m u:shrek:rwx /root/


继承权限:(设置两次先普通,在加-d或者d:)
setfacl -m u:robin:rwx dir
setfacl -m d:u:robin:rwx dir

----------------------
ext4文件facl(centos5.x )
mount -o facl /dev/sda5 /mnt


练习
1.简述setfacl能解决什么问题?
进行文件访问控制
2.在/tmp目录下创建文件aa.txt,拥有者root 所属组root  权限600
   要求:
   robin用户可以读写/tmp/aa.txt
   zorro用户可以读写/tmp/aa.txt
   upup组的tom和jerry只可以读aa.txt文件
[root@localhost ~]# setfacl -m u:robin:rw /tmp/aa.txt 
[root@localhost ~]# setfacl -m u:zorro:rw /tmp/aa.txt 
[root@localhost ~]# setfacl -m g:upup:r /tmp/aa.txt 

3.在/tmp目录下创建目录test,
  要求:
  robin用户可以读写删除/tmp/test下的所有新建文件
[root@localhost ~]# mkdir /tmp/test
[root@localhost ~]# ll /tmp/
drwxr-xr-x. 2 root root             6 Oct 28 17:28 test
[root@localhost ~]# setfacl -m u:robin:rwx /tmp/test


7.quota磁盘配额的使用
quota磁盘配额(user)
1.开启配额功能:
[root@localhost /]# mount -o usrquota /dev/sda5 /mnt/
2.设置用户配额:
[root@localhost /]# edquota -u robin /mnt
Disk quotas for user robin (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda5                         0          50M         100M         0        10        20
3.查询配额的使用情况
[root@localhost /]# repquota -u /mnt
4.启动配额:
[root@localhost mnt]# quotaon /mnt/

测试:
测试空间配额
su - robin
dd if=/dev/zero of=/mnt/data  bs=120M count=1

dd: 写入"/mnt/data" 出错: 超出磁盘限额

测试文件个数配额
touch /mnt/abc{1..25}.txt


group配额:
group upup
useradd -g upup king
useradd -g upup zorro

1.开启组配额
[root@localhost /]# mount -o grpquota /dev/sda5 /mnt/
2.配置组配额
[root@localhost /]# edquota -g upup
Disk quotas for group upup (gid 1002):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda5                         0      51200     102400          0       10       20

3.查询配额的使用情况
[root@localhost /]# repquota -g /mnt
4.激活组配额
[root@localhost /]# quotaon -g /mnt/

测试:
[root@localhost ~]# su - king
[king@localhost mnt]$ dd  if=/dev/zero of=/mnt/data1 bs=80M count=1

[root@localhost ~]# su - zorro
[zorro@localhost ~]$ dd  if=/dev/zero of=/mnt/data2 bs=80M count=1

测试配额空间为共用

组和用户一起挂:
[root@localhost ~]# mount -o usrquota,grpquota /dev/sdb5 /mnt/


设置宽限时间
[root@localhost ~]# edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/sda5                     30seconds                  7days


测试:
1.开启配额功能:
[root@localhost /]# mount -o usrquota /dev/sda5 /mnt/
2.设置用户配额:
[root@localhost /]# edquota -u robin /mnt
Disk quotas for user robin (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda5                         0          50M         100M         0        10        20
3.查询配额的使用情况
[root@localhost /]# repquota -u /mnt
4.启动配额:
[root@localhost mnt]# quotaon /mnt/

测试:
测试空间配额
su - robin
激活软限
dd if=/dev/zero of=/mnt/data1  bs=60M count=1

repquota 去查看quota的信息 grace时间变成none

repquota /mnt  查看配额情况
改宽限时间
edquota -t


剩余40M 不可用

删除文件到软限以下

恢复可用空间

复制配额:-p
edquota -gqu -p robin zorro


练习:
准备组easthome 用户robin zorro 都属于easthome组
robin用户在/mnt下配额为40M,60M  10,20
zorro用户在/mnt下配额为40M,60M  10,20  拷贝robin的配额
要求easthome组在/mnt下大小配额为80M,100M  10,20
用户配的宽限时间修改为3小时
[root@localhost ~]# mount -o usrquota,grpquota /dev/sdb5 /mnt/
[root@localhost ~]# edquota -u robin /mnt/
[root@localhost ~]# edquota -u -p robin zorro
[root@localhost ~]# edquota -u zorro /mnt/
[root@localhost ~]# edquota -g easthome 
[root@localhost ~]# edquota -t
[root@localhost ~]# quotaon /mnt/


练习
1.解释磁盘配额的功能?可以对什么进行限制?
对用户和组进行限制,限制创建的文件总大小和数量

2.对分区sdb1进行配额
   robin用户最多可以使用100M空间,软限制自定义
   zorro用户最多可以创建100个文件,软限制自定义
[root@localhost ~]# mount -o usrquota /dev/sdb1 /mnt/
[root@localhost ~]# edquota -u robin /mnt/
Disk quotas for user robin (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0      51200     102400          0        0        0
[root@localhost ~]# edquota -u zorro /mnt/
Disk quotas for user zorro (uid 1002):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0          0          0          0       80      100
[root@localhost ~]# quotaon /mnt/
切换到robin用户和zorro用户下进行测试

8.GPT分区
[root@localhost /]# parted /dev/sdb    ---------------------------------分区命令
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel             ------------------------------------------------选择分区表类型
新的磁盘标签类型? gpt                                                                                                      
(parted) print                        ------------------------------------------打印分区表信息
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  标志

(parted) mkpart 
分区名称?  []? sdb1
文件系统类型?  [ext2]? xfs
起始点? 1                                                                
结束点? 500M                                                             
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name  标志
 1      1049kB  500MB  499MB  xfs          sdb1

(parted) mkpart 
分区名称?  []? sdb2
文件系统类型?  [ext2]? xfs                                               
起始点? 500M                                                             
结束点? 1000M                                                            
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size   File system  Name  标志
 1      1049kB  500MB   499MB  xfs          sdb1
 2      500MB   1000MB  500MB               sdb2

mkfs.xfs -f /dev/sdb1
mount /dev/sdb1 /mnt/
umount /dev/sdb1
 
 
删除
[root@localhost /]# parted /dev/sdb
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space,
        all found partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU
        Parted
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size   File system  Name  标志
 1      1049kB  500MB   499MB  xfs          sdb1
 2      500MB   1000MB  500MB               sdb2

(parted) rm 2
(parted) rm 1                                                             
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  标志

(parted)    
 
 [root@localhost /]# ls /dev/sdb*
/dev/sdb
9.ext4和xfs文件系统
ext4文件系统
查看超级块信息
tune2fs -l /dev/vg0/lv0
e2label /dev/vg0/lv0 test
mount LABEL=test /opt

最大挂载次数
tune2fs -c 20 /dev/vg0/lv0
当前挂载次数
tune2fs -C 1 /dev/vg0/lv0
更改卷标 
tune2fs -L xxxx /dev/vg0/lv0
添加支持acl功能
tune2fs -o acl /dev/vg0/lv0
取消acl
tune2fs -o ^acl /dev/vg0/lv0


dumpe2fs  /dev/sda8



xfs

EXT家族对文件格式化时预先规划出所有的inode/block及中介数据等,未来系统就可以直接取用,不需再分配。早期的磁盘容量不太大的时候这就可以,但随着时代的发展,数据量越来越大,磁盘容量越来越大。现在都已经说到PB,EB的数据了,那么TB以上等级的传统ext 
家族文件系统在格式化的时候就得废掉好多时间。。

另外一个原因,虚拟化的应用现在越来越广泛,作为虚拟化磁盘来源的巨型文件(单一文件好几个G及以上)也就越来越常见。这种巨型文件在处理上需要考虑到效能的问题,否则虚拟磁盘的效率就会不太好看。

所以,从centos开始,预设的文件系统由EXT4变成了xfs这个较适合高容 
量磁盘与巨型文件效能较佳的文件系统了。

XFS文件系统的配置

基本上XFS就是一个日志式文件系统,之所以现在把它当预设的文件系统 
是因为它原本就是被开发用于高容量磁盘以及高性能文件系统之用的,相当适合于现在的环境。此外,几乎所有EXT4文件系统具有的功能,xfs都具备。

xfs文件系统在资料的分布上,主要规划为三个部分:资料区(data section),文件系统活动登录区(log section),实时运作(realtime section)。具体如下:

1资料区(data section)

这个区域基本上与之前说的EXT家族一样,包括inode、block、superblock等数据都放在这个区块。这个数据区与ext家族的block group类似,分多个储存区群组(allocation groups)。每个储存区群组中都包含了整个文件系统的superblock,剩余空间的管理机制,inode的分配与追踪。此外,inode,block都是系统需要用到时才会动态配置产生,所以格式化动作较EXT家族快了很多。

其实,只需要把这个数据区的储存区群组当成ext的block群组就可以了,只是inode与block是动态产生的,并非一开始于格式化就完成配置的。

2文件系统活动登录区(log section)

这个区域主要被用来记录文件系统的变化,具体原理和之前说的相同。 
因为系统所有的动作都会在这个区域做个记录所以这个区域的磁盘活动是相当频繁的,xfs的设计在这里有一个巧妙之处,你可以指定外部的磁盘来作为xfs文件系统的日志管理区块。例如,你可以将SSD磁盘作为xfs的文件系统活动登录区,这样,当系统需要进行任何活动时,就可以更迅速的工作。

3实时运作区(realtime section)

当有文件要被建立时,xfs会在这个区段里找一个到数个extent区块,将文件放置在这个区块中,等到分配完毕后,再写入到data section的inode和block中。这个extent区块的大小得要在格式化的时候就先指定,最小值为4K最大可到1G。一般非磁盘阵列的磁盘默认为64K容量,而具有类似磁盘阵列的stripe情况下,则建议extent设定为与stripe一样大较佳。这个extent最好不要乱动,因为可能会影响到实体磁盘的效能。


下面解释一下以上输出的信息:

isize : inode的容量,这里为256bytes。
agcount:储存区群组的个数,这里有4个。
agsize : 每个储存区群组里的block个数,这里为32000个。
sectsz:逻辑扇区(sector)的容量,这里为512bytes。
bsize:每个block的容量为4 k。
blocks:共有128000个block在这个文件系统内。
sunit,swidth:与磁盘阵列的stripe相关性较高,这里暂时不说明。
internal,指这个登录区的位置在文件系统内,而不是外部系统的意思,占用了4K * 853空间。
第9行:realtime区域,extent容量为4k,none=>不过目前没有使用。



xfs有个写入屏障,在有缓存的情况下开启barrier功能,保证数据安全,如果没有缓存可以关闭这个参数
mount -o nobarrier /dev/device /mount/point  



xfs支持的配额:
xfs_quota
usrquota
groupquota
project

用户,组配额
[root@localhost ~]# mount -o usrquota,grpquota /dev/sda3 /mnt/
[root@localhost ~]# xfs_quota -x -c 'report' /mnt/
User quota on /mnt (/dev/sda3)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root                4          0          0     00 [--------]

Group quota on /mnt (/dev/sda3)
                               Blocks                     
Group ID         Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root                4          0          0     00 [--------]

[root@localhost ~]# xfs_quota -x -c 'limit bsoft=50K bhard=100K robin' /mnt
[root@localhost ~]# xfs_quota -x -c 'report' /mnt/
User quota on /mnt (/dev/sda3)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root                4          0          0     00 [--------]
robin               0         52        100     00 [--------]

Group quota on /mnt (/dev/sda3)
                               Blocks                     
Group ID         Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root                4          0          0     00 [--------]


xfs_quota -x -c 'limit -g bsoft=1000m bhard=1200m accounting' /target/path


prject配额(对目录配额)
mkdir /quota  #创建配额目录
mount -o prjquota /dev/sda8 /quota  #挂载设备,开启支持目录配额
mkdir /quota/test  #创建测试目录
mount
/dev/sda8 on /quota type xfs (rw,relatime,attr2,inode64,prjquota)
[root@localhost ~]# echo 50:/quota/test >> /etc/projects #配置project的id和对应的目录
[root@localhost ~]# echo test:50 >> /etc/projid #项目名称和对应的id
[root@localhost ~]# cat /etc/projects
50:/quota/test
[root@localhost ~]# cat /etc/projid
test:50
xfs_quota -x -c 'project -s -p /quota/test 50' #项目名称
xfs_quota -x -c 'limit -p bhard=100M 50' /quota #限制目录大小
查询
xfs_quota -x -c 'report' /quot #查询




xfs局限性
1.XFS是一个单节点文件系统,如果需要多节点同时访问需要考虑使用GFS2文件系统
2.XFS支持16EB文件系统,而redhat仅支持100TB文件系统
3.XFS较少的适用在单线程元数据密集的工作负荷,在单线程创建删除巨大数量的小文件的工作负荷下,其他文件系统(ext4)表现的会更好一些
4.xfs文件在操作元数据时可能会使用2倍的CPU资源,在CPU资源有限制的情况下可以研究使用不同文件系统
5.xfs更多适用的特大文件的系统快速存储,ext4在小文件的系统或系统存储带宽有限的情况下表现的更好



[root@node6 ~]# yum install xfsprogs -y

[root@node6 ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1       	isize=256    	agcount=4, agsize=6016 blks
         	 =                       	sectsz=512   	attr=2, projid32bit=0
data     	 =                       	bsize=4096   	blocks=24064, imaxpct=25
         	 =                       	sunit=0      	swidth=0 blks
naming    =version 2              bsize=4096   	ascii-ci=0
log      	=internal log           bsize=4096   	blocks=1200, version=2
         	=                       	sectsz=512   	sunit=0 blks, lazy-count=1
realtime  =none            		extsz=4096   	blocks=0, rtextents=0


日志分离
[root@node6 ~]# mkfs.xfs -l logdev=/dev/vdb2 /dev/vdb1 -f
meta-data=/dev/vdb1   	isize=256    	agcount=4, agsize=6016 blks
         	 =                       	sectsz=512   	attr=2, projid32bit=0
data    	 =                       	bsize=4096   	blocks=24064, imaxpct=25
        	 =                       	sunit=0      	swidth=0 blks
naming     =version 2       	bsize=4096   	ascii-ci=0
log      	 =/dev/vdb2      	bsize=4096   	blocks=24576, version=2
         	 =                       	sectsz=512   	sunit=0 blks, lazy-count=1
realtime 	=none                  	extsz=4096   	blocks=0, rtextents=0
[root@node6 ~]# mount -o logdev=/dev/vdb2 /dev/vdb1 /xfs/



lvm在线扩容和文件系统扩容
[root@node6 ~]# pvcreate /dev/vdb1 /dev/vdb2 
[root@node6 ~]# vgcreate vgxfs /dev/vdb2 /dev/vdb1
[root@node6 ~]# lvcreate -l 25 -n lvxfs vgxfs
  Logical volume "lvxfs" created
[root@node6 ~]# mkfs.xfs /dev/vgxfs/lvxfs 
meta-data=/dev/vgxfs/lvxfs       	isize=256    	agcount=4, agsize=6400 blks
         	 =                       		sectsz=512   	attr=2, projid32bit=0
data     	 =                       		bsize=4096   	blocks=25600, imaxpct=25
         	 =                       		sunit=0      	swidth=0 blks
naming     =version 2              	bsize=4096   	ascii-ci=0
log      	 =internal log           	bsize=4096   	blocks=1200, version=2
         	 =                       		sectsz=512   	sunit=0 blks, lazy-count=1
realtime =none                   		extsz=4096   	blocks=0, rtextents=0

[root@node6 ~]# mount /dev/vgxfs/lvxfs /xfs/

[root@node6 ~]# lvextend -l +100%FREE /dev/vgxfs/lvxfs 

[root@node6 ~]# xfs_growfs /xfs/
meta-data=/dev/mapper/vgxfs-lvxfs 	isize=256    	agcount=4, agsize=6400 blks
         	 =                       			sectsz=512   	attr=2, projid32bit=0
data     	 =                       			bsize=4096   	blocks=25600, imaxpct=25
       	 	 =                       			sunit=0      	swidth=0 blks
naming 	 =version 2              		bsize=4096   	ascii-ci=0
log     	 =internal               		bsize=4096  	blocks=1200, version=2
       		 =                       			sectsz=512   	sunit=0 blks, lazy-count=1
realtime	 =none                   			extsz=4096  	 blocks=0, rtextents=0
data blocks changed from 25600 to 47104


修复文件系统
[root@node6 ~]# umount /xfs
[root@node6 ~]# xfs_repair /dev/vgxfs/lvxfs 
做日志分离后
[root@node6 ~]# xfs_repair -l /dev/sdb6 /dev/vgxfs/lvxfs 


磁盘碎片整理
[root@node6 ~]# mkfs.xfs -l logdev=/dev/vdb2 /dev/vdb1
[root@node6 ~]# mount -o logdev=/dev/vdb2 /dev/vdb1 /xfs
[root@node6 ~]# for FILE in file{0..3} ; do dd if=/dev/zero of=/xfs/${FILE} bs=4M count=100 & done
[root@node6 ~]# filefrag /xfs/file*
                            xfs_db -c frag -r /dev/sda2   磁盘碎片当前状态
[root@node6 ~]# xfs_fsr -v


[root@node6 ~]# umount /xfs

[root@node6 ~]# xfs_repair -n -l /dev/vdb2 /dev/vdb1 
Phase 1 - find and verify superblock...
Phase 2 - using external log on /dev/vdb2
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan (but don't clear) agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.
[root@node6 ~]# 
[root@node6 ~]# xfs_repair -l /dev/vdb2 /dev/vdb1 
Phase 1 - find and verify superblock...
Phase 2 - using external log on /dev/vdb2
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done



备份
物理备份 逻辑备份
离线备份 在线备份
冷备份   热备份

完全备份
增量备份
差异备份

[root@localhost ~]# mount -o logdev=/dev/vdb2 /dev/vdb1 /xfs
[root@localhost ~]# yum install xfsdump

[root@localhost ~]# xfsdump -L all -M dumpfile -l 0 - /mnt | xz > /tmp/xfs.$(date +%Y%m%d).all0.xz
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.7 (dump format 3.0)
xfsdump: level 0 dump of localhost.localdomain:/mnt
xfsdump: dump date: Thu Oct 29 10:57:34 2020
xfsdump: session id: 74b04de2-c87d-432b-9c7d-2fc484603b7e
xfsdump: session label: "all"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 25216 bytes
xfsdump: /var/lib/xfsdump/inventory created
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 22208 bytes
xfsdump: dump size (non-dir files) : 544 bytes
xfsdump: dump complete: 0 seconds elapsed
xfsdump: Dump Status: SUCCESS

[root@localhost ~]# xfsdump -I  #查看备份记录
file system 0:
	fs id:		ae09270a-4ad3-42e5-96f7-ae276e65ef9b
	session 0:
		mount point:	localhost.localdomain:/mnt
		device:		localhost.localdomain:/dev/sdb1
		time:		Thu Oct 29 10:57:34 2020
		session label:	"all"
		session id:	74b04de2-c87d-432b-9c7d-2fc484603b7e
		level:		0
		resumed:	NO
		subtree:	NO
		streams:	1
		stream 0:
			pathname:	stdio
			start:		ino 67 offset 0
			end:		ino 68 offset 0
			interrupted:	NO
			media files:	1
			media file 0:
				mfile index:	0
				mfile type:	data
				mfile size:	22208
				mfile start:	ino 67 offset 0
				mfile end:	ino 68 offset 0
				media label:	"dumpfile"
				media id:	02cee739-d33c-4951-8980-27d348729459
xfsdump: Dump Status: SUCCESS


[root@localhost mnt]# rm -rf *
[root@localhost mnt]# xzcat /tmp/xfs.20201029.all0.xz | xfsrestore - /mnt/  #完全恢复
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (dump format 3.0)
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description: 
xfsrestore: hostname: localhost.localdomain
xfsrestore: mount point: /mnt
xfsrestore: volume: /dev/sdb1
xfsrestore: session time: Thu Oct 29 10:57:34 2020
xfsrestore: level: 0
xfsrestore: session label: "all"
xfsrestore: media label: "dumpfile"
xfsrestore: file system id: ae09270a-4ad3-42e5-96f7-ae276e65ef9b
xfsrestore: session id: 74b04de2-c87d-432b-9c7d-2fc484603b7e
xfsrestore: media id: 02cee739-d33c-4951-8980-27d348729459
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 1 directories and 1 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Status: SUCCESS



全备份 
[root@localhost mnt]# echo aaa >> a.txt
[root@localhost ~]# xfsdump -L all -M dumpfile -l 0 - /mnt | xz > /tmp/xfs.$(date +%Y%m%d).all0.xz
[root@localhost mnt]# xzcat /tmp/xfs.20201029.all0.xz | xfsrestore - /mnt/

增量 
[root@localhost mnt]# echo bbb > b.txt
[root@localhost mnt]# xfsdump -L add -M dumpfile -l 1 - /mnt | xz > /tmp/xfs.$(date +%Y%m%d).add1.xz 
[root@localhost mnt]# xzcat /tmp/xfs.20201029.all0.xz | xfsrestore - /mnt/
[root@localhost mnt]# xzcat /tmp/xfs.20201029.add1.xz | xfsrestore - /mnt/
[root@localhost mnt]# echo cccc > c.txt
[root@localhost mnt]# xfsdump -L add -M dumpfile -l 2 - /mnt | xz > /tmp/xfs.$(date +%Y%m%d).add2.xz 
[root@localhost mnt]# xzcat /tmp/xfs.20201029.add2.xz | xfsrestore - /mnt/
[root@localhost mnt]# echo ddd > d.txt
[root@localhost mnt]# xfsdump -L add -M dumpfile -l 3 - /mnt | xz > /tmp/xfs.$(date +%Y%m%d).add3.xz 
[root@localhost mnt]# xzcat /tmp/xfs.20201029.add3.xz | xfsrestore - /mnt/

差异 
[root@localhost mnt]# xfsdump -L cha -M dumpfile -l 1 - /mnt | xz > /tmp/xfs.$(date +%Y%m%d).cha1.xz 
[root@localhost mnt]# xzcat /tmp/xfs.20201029.cha1.xz | xfsrestore - /mnt/


完全恢复+增量恢复 
xzcat /home/xfs.20170609.all0.xz | xfsrestore - /mnt/
ls
xzcat /home/xfs.20170609.add1.xz | xfsrestore - /mnt/
ls
xzcat /home/xfs.20170609.add2.xz | xfsrestore - /mnt/
ls
xzcat /home/xfs.20170609.add3.xz | xfsrestore - /mnt/
ls

完全恢复+差异恢复
[root@localhost mnt]# xzcat /tmp/xfs.20201029.all0.xz | xfsrestore - /mnt/
[root@localhost mnt]# ls
a.txt  b.txt
[root@localhost mnt]# xzcat /tmp/xfs.20201029.cha1.xz | xfsrestore - /mnt/
[root@localhost mnt]# ls
a.txt  b.txt  c.txt  d.txt

清楚备份记录
rm -rf /var/lib/xfsdump/inventory/*


练习
将/dev/sdb硬盘数据做完全备份
添加新文件1.txt
做增量备份
添加新文件2.txt
做增量备份
添加新文件3.txt
做增量备份
做差异备份


删除所有数据
方法1 恢复数据
全备+增量

方法2 恢复数据
全备+差异
10.符号链接和硬链接
文件链接方式 :
符号连接(软链接)
ln -s /tmp/passwd /home/
硬链接 
ln /tmp/passwd /tmp/passwd.link


区别:
1.命令相同 参数不同 
   软链接在创建必须绝对路径
   硬链接都可以
2.硬链接的权限和源文件完全一致
   软链接的链接文件权限永远是777 和源文件权限不同
3.硬链接可以删除,移动源文件 
   软链接不可以删除,移动源文件
4.软链接inode和源文件不同
  硬链接的inode的源文件相同
5.软链接可以对目录生效 
  硬链接只可以对文件操作
6.软链接可以跨文件系统
  硬链接不可以跨文件系统

unlink  链接文件名 取消链接


练习
1.简述 软连接和硬链接区别. 如何操作

十二、网络管理

1.配置文件配置网络
ifconfig
ip addr show
route -n  查看路由

ping
ping -c 1  

traceroute www.sina.com
arping -I eno16777736 192.168.200.54  查看ip地址是否冲突
arp -n


vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
NAME="eno16777736"
DEVICE="eno16777736"
ONBOOT=yes  ---------------------------->是否在开机或重起时启动网卡 
NETBOOT=yes
UUID="4dcebd9d-42ec-4f10-87c1-ac5708adee2d"
IPV6INIT=yes
BOOTPROTO=none  -----------------------------> dhcp  static none
TYPE=Ethernet
IPADDR=192.168.200.222 ------------------------------->  ip地址
NETMASK=255.255.255.0(PREFIX=24) ----------------------->  子网掩码 
GATEWAY=192.168.200.1 ------------------------------>  网关 

重起网卡,重新加载配置文件
systemctl restart network

配置临时别名
ifconfig eno16777736:0  10.10.10.10/24

永久别名
systemctl stop NetworkManager 
cd /etc/sysconfig/network-scripts/
cp ifcfg-eno16777736 ifcfg-eno16777736:0
[root@localhost network-scripts]# vim ifcfg-eno16777736:0
NAME="eno16777736:0"
DEVICE="eno16777736:0"
ONBOOT=yes
NETBOOT=yes
IPV6INIT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=10.10.10.10
NETMASK=255.255.255.0

2.NetworkManager使用
Red Hat Enterprise Linux 7 与 CentOS 7 中默认的网络服务由 NetworkManager 提供,这是动态控制及配置网络的守护进程,它用于保持当前网络设备及连接处于工作状态,同时也支持传统的 ifcfg 类型的配置文件

可以用命令行工具 nmcli 来控制 NetworkManager。

nmcli[ OPTIONS ] OBJECT { COMMAND | help }

OBJECT和COMMAND可以用全称也可以用简称,最少可以只用一个字母,建议用头三个字母。OBJECT里面我们平时用的最多的就是connection和device,这里需要简单区分一下connection和device。

device叫网络接口,是物理设备
nmcli device help

connection是连接,偏重于逻辑设置
nmcli connection help

多个connection可以应用到同一个device,但同一时间只能启用其中一个connection。这样的好处是针对一个网络接口,我们可以设置多个网络连接,比如静态IP和动态IP,再根据需要up相应connection


nmcli dev status   列出所有设备
nmcli con show  列出所有链接
nmcli con up  "id" 激活一个链接
nmcli con down  "id" 取消激活链接
nmcli dev dis "dev"  down一个网卡和临时关闭一个链接
nmcli net off  关闭所有管理接口
nmcli con add  添加一个新的链接
nmcli con mod 修改一个链接
nmcli con del  "id"  删除一个链接

修改配置文件执行生效: systemctl restart network 或 nmcli con reload
nmcli命令生效:nmcli con down eth0 ; nmcli con up eth0

显示所有包括不活动连接
nmcli con show

显示所有活动连接
nmcli con show –active

显示设备状态
nmcli dev status

显示网络接口属性
nmcli dev show eno16777736


示例
添加静态ip
[root@localhost ~]# nmcli connection add con-name ens33-static ifname ens33 type ethernet ipv4.addresses 192.168.33.250/24 ipv4.gateway 192.168.33.1 ipv4.dns 114.114.114.114 ipv4.method manual connection.autoconnect yes
Connection 'ens33-static' (43db0ac5-07e1-46a8-84de-cdabeeb32b99) successfully added.
添加动态ip
[root@localhost ~]# nmcli connection add con-name ens33-dhcp ifname ens33 type ethernet ipv4.method auto connection.autoconnect yes
Connection 'ens33-dhcp' (25bc6c90-f9c8-486a-82d1-639b33d99b0c) successfully added.
会自动生成配置文件

con add – 添加新的连接
con-name – 连接名
type – 设备类型
ifname – 接口名
autoconnect no – 禁止开机自动启动


创建以个名字为home的,类型为以太网卡,绑定网卡为eth1,开机自动启动,定义ipv4地址和网关
nmcli con add con-name home ifname eno16777736 autoconnect yes type Ethernet ip4 192.168.100.1/24 gw4 192.168.100.254

查看网卡绑定信息
nmcli con show 

启动home链接
nmcli con up home

这样,home接口已经生效,可以正常使用。但同一时间只能绑定在一个接口上。平时如果工作需要,可以多设置几套配置文件,环境需要时可以进行临时的切换。

当不需要再用时可以使用:nmcli connection delete home删除


练习:
添加一块新网卡
通过networkmanager  给信网卡设置ip地址
一个自动获取 
一个静态ip  IP地址为192.168.0.100


修改连接设置
nmcli con mod“static” connection.autoconnect no
nmcli con mod “static” ipv4.dns 172.25.X.254
nmcli con mod “static” +ipv4.dns 8.8.8.8
nmcli con mod “static” -ipv4.dns 8.8.8.8
nmcli con mod “static” ipv4.addresses “172.25.X.10/24 172.25.X.254”
nmcli con mod “static” +ipv4.addresses 10.10.10.10/16

激活网卡:
nmcli connection up ens33-static   查看ip地址
nmcli connection up ens33-dhcp    查看ip地址
nmcli connection up ens33  查看ip地址
 
修改网卡信息:
nmcli connection modify ens33-static ipv4.method manual


添加额外ip(持久有效)
nmcli connection modify ens33 +ipv4.addresses 100.100.100.100/24

nmcli connection up ens33  激活

3.修改主机名
主机名:
[root@zhangkeqiang ~]# hostnamectl set-hostname zhangkeqiang.com
当前主机名和永久主机名

[root@zhangkeqiang ~]# hostname
zhangkeqiang.com

[root@zhangkeqiang ~]# vim /etc/hostname 
zhangkeqiang.com

必须做主机名解析,修改hosts文件
[root@zhangkeqiang ~]# vim /etc/hosts
192.168.33.133 zhangkeqinag.com


添加默认网关
route add default gw 192.168.200.222
route del default gw 192.168.200.222
4.练习
1.添加新网卡
  通过手动修改配置文件将IP地址设置为 172.16.10.100/16
  NAME
  TYPE
  DEVICE
  BOOTPROTO
  ONBOOT
  IPADDR
  NETMASK
  GATEWAY
  DNS1
  DNS2  
  
  
2.添加新网卡
  通过NetworkManager 设置两个配置文件一个 static  一个dhcp获取
  
3.写出A,B,C3类地址的范围,并写出每类地址的私有地址范围?
4.192.168.1.24/28 和 192.168.1.36/28 这两个地址可不可以通信?

十三、系统修复维护

1.root丢失
解决方法
重起系统
选择系统标题 ------->e 编辑
选择以下行 
linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=1874f157-368e-4ead-    8ab2-2ef4a81e2019 ro rhgb quiet LANG=zh_CN.UTF-8   init=/bin/bash

ctrl+x 进入系统单用户模式
2.修复模式
方法1:
修改bios,选择光盘启动 
选择troubleshooting  ------>  rescue file system
进入修复模式 
mount /dev/sda2 /mnt    /mnt就是硬盘系统/目录
也可以选择使用 chroot /mnt 命令 切换到原来的系统

如果没有光盘,可以制作u盘启动盘 
UltraISO(以管理员身份运行) ----> 打开iso ---> 启动------->写入硬盘映像


方法2:
通过网络上的live盘,进行修复 


远程拷贝:
ssh 192.168.200.216
scp /etc/passwd 192.168.200.222:/tmp    

不登录拷贝
scp 192.168.200.216:/etc/hosts /tmp/


模式修改(启动级别) 
获取当前系统模式 
systemctl get-default

设置当前系统为文本模式=level3
systemctl set-default multi-user.target
systemctl set-default graphical.target        === 5级别
 
/usr/lib/systemd/system/runlevel0.target    关机 
/usr/lib/systemd/system/runlevel1.target    单用户 
/usr/lib/systemd/system/runlevel2.target    无网络文本  
/usr/lib/systemd/system/runlevel3.target    有网络文本 
/usr/lib/systemd/system/runlevel4.target    保留
/usr/lib/systemd/system/runlevel5.target    图像
/usr/lib/systemd/system/runlevel6.target    重启

 

bootloader  
grub,设置grub密码
lilo


系统启动过程
1.加电
2.bios系统(基本输入输出系统)   boot(硬盘 u盘 网络 光盘)
3.引导程序(0磁道0扇区 512字节)  446引导程序 64分区表 2字节 magic number
4.通过boot分区 vmlinuz内核 initramfs硬件驱动  0号进程
5.1号进程(init ---- inittab----运行级别(0-6))  fstab
   0关机  1单用户  2无网络的文本模式  3有网络文件模式 4保留 5图形 6重启
6.进程启动.....
7.rc.local
8.加载文本资源(终端)
9.加载图形资源

3.练习
1.简述单用户模式进入方式
2.简述光盘修复模式的进入方式
3.在光盘修复模式下,修改自己的密码为空

十四、模块管理

1.内核
内核
uname -r
3.10.0-327.el7.x86_64
主版本号.次版本号-修订版本号.系统版本.平台
次版本号(奇数)  测试版
次版本号 (偶数) 发行版


内核模块module
lsmod  查看当前系统中已加载模块
modinfo ext4  查看模块信息
insmod /lib/modules/3.10.0-327.el7.x86_64/kernel/fs/ext4/ext4.ko  静态加载模块
rmmod  ext4  卸载 
modprobe ext4  动态加载

ls /lib/modules/3.10.0-327.el7.x86_64/
modules.dep    存放模块依赖关系的文件,自动生成
modules.dep.bin


depmod -a 可以创建modules.dep文件




内核参数
1.打开路由转发参数
echo 1 > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward

永久保存内核参数
vim /usr/lib/sysctl.d/00-system.conf
net.ipv4.ip_forward = 1

直接生效
sysctl -p /usr/lib/sysctl.d/00-system.conf


练习:两台不同网段主机通信
A: 192.168.1.200/24
B: 10.10.3.61/24
1.通过静态路由
A:
    ip route  add 10.10.3.0/24 dev  eno16777736
B:
    ip route  add 192.168.1.0/24 dev  eno16777736

2. 通过网关通信
C:
    网卡1:  192.168.1.1/24
    网卡2:  10.10.3.76/24
    开启路由转发:    echo 1 > /proc/sys/net/ipv4/ip_forward
A:192.168.1.200/24
    删除现有的默认网关
    添加网关:  ip route  add default via 192.168.1.1/24 dev eno16777736
B:10.10.3.61/24
    删除现有的默认网关
    添加网关:  ip route  add default via 10.10.3.76/24 dev eno16777736

2.禁止其他人对我执行ping
2.禁止其他人对我执行ping
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
cat /proc/sys/net/ipv4/icmp_echo_ignore_all
3.练习
1.准备3个虚拟机 按下图设置ip地址

虚拟机1                                        虚拟机2                                       虚拟机3
网卡1                             网卡1                     网卡2                           网卡1
192.168.100.100/24     192.168.100.1/24     172.16.10.1/24       172.16.10.100/24


通过静态路由让虚拟机1和虚拟机3通信
通过网关虚拟机2让虚拟机1 和 虚拟机3通信

十五、查找命令

1.which
查找命令所在路径
[root@robin ~]# which useradd
/usr/sbin/useradd

2.whereis
[root@robin ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.g

3.grep
例:
[root@robin ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@robin ~]# 
4.locate
[root@robin ~]# locate aa.txt
/home/aa.txt
/root/aa.txt
[root@robin ~]# rm -rf /root/aa.txt 
[root@robin ~]# locate aa.txt
/home/aa.txt
/root/aa.txt

updatedb  维护locate的索引
[root@robin ~]# locate aa.txt
/home/aa.txt

5.find
命令  路径  [参数]   []

根据文件名
find / -name aa.txt

根据拥有者
find / -user robin
find / -user robin -ls

所属组
find / -group upup -ls

条件  -a 和  -o 或
find / \( -user king -a -group upup \)  -ls
find / \( -user king -o -group upup \)  -ls

按类型
find / -type p -ls


按硬链接数
find / -links 20 -ls

按大小
[root@robin tmp]# find /tmp -size 30M
/tmp/30M
[root@robin tmp]# find /tmp -size +30M   #大于30M
/tmp/40M
/tmp/50M

[root@robin tmp]# find /tmp -size -30M   #小于30M
/tmp/10M
/tmp/20M

[root@robin tmp]# find /tmp -size +15M -a -size -45M
/tmp/20M
/tmp/30M
/tmp/40M

[root@robin tmp]# find /tmp -size -15M -o -size +45M

按时间:
find /tmp/ -mtime 3   正好3天 

find /tmp/ -mtime +3  3天以前

find /tmp/ -mtime -3   3天以内

find /tmp -mtime +2 -a -mtime -5


按权限
find /tmp/ -perm 420   完全匹配
find /tmp/ -perm /+240 -ls  任意匹配
find /tmp/ -perm -240 -ls   子集匹配
 
 
exec 和 ok
find /tmp -name  aa.txt  -exec rm -rf {} \;

[root@robin tmp]# find /tmp -name  cc.txt  -ok rm -rf {} \;
< rm ... /tmp/cc.txt > ? no 
[root@robin tmp]# find /tmp -name  cc.txt  -ok rm -rf {} \;
< rm ... /tmp/cc.txt > ? yes 

避免返回字符长度过长
 find / -type f | xargs file
 

cut -d: -f 1 /etc/passwd | xargs
cut -d: -f 1 /etc/passwd | xargs mkdir

6.其他
whoami    当前用户身份 
who i am   原始登录用户身份

who
w
7.练习
查找系统中 最近1天修改过的文件 并拷贝到/tmp目录下
find / -mtime -1 -exec cp -r {} /tmp \;
查找系统中大于100k 小于200k的文件并拷贝到/tmp目录下
[root@local ~]# find / \(-size +100k -a -size -200k\) -exec cp -a {} /tmp/ \;


1.列举查找命令有哪些?各有什么功能?
which 查找命令路径
whereis 查找命令
grep 过滤
locate 查找文件
find 查找

2.查找系统中size大于10M的文件
[root@local ~]# find / -size +10M 

3.查找系统中10天以前并且是普通文件的文件
[root@local ~]# find / -mtime +10 -type f 

4.找到系统中名字中含有root的文件
[root@local ~]# find / f -name *root*

十六、服务管理

1.计划任务
一.at(24小时内计划任务)
创建计划任务 
[root@robin tmp]# at 12:41
at> touch /tmp/at.txt
at> echo 123 >> /tmp/at.txt
at> <EOT>  ------------------------------------>ctrl + d
job 1 at Tue Jun 13 12:41:00 2017

查询
[root@robin tmp]# at -l
1	Tue Jun 13 12:41:00 2017 a root

删除
[root@robin tmp]# atrm 2 

存储位置
[root@robin tmp]# cat /var/spool/at/a00003017cca62


二.crond服务
用户计划任务
创建计划任务
* * * * *
分(0-59)(0-23)(1-31)(1-12)(0-7)
* * * * *  date >> /tmp/date.txt    每分钟 
5 * * * *  date >> /tmp/date.txt    每小时第5分钟
*/5 * * * *  date >> /tmp/date.txt  每5分钟
10 10 * * *  date >> /tmp/date.txt 每天的10点10分
10 10 10 * *  date >> /tmp/date.txt 每月10号10点10分
10 10 10 10 *  date >> /tmp/date.txt  每年的10月10号10点10分
10 10 10 10 6  date >> /tmp/date.txt  或者每周6的10点10分

10 10,15,20 10 * *  date >> /tmp/date.txt  每月10号10点10分  15点10分  20点10分
10 10-20 10 * *  date >> /tmp/date.txt     每月10号10点-20点 10分


练习:
使用tar命令 对你的boot目录备份
要求:你当前系统时间晚2分钟
备份文件放在/tmp目录下, 备份文件名字是当前系统时间  月-日-时-分-boot.tar.gz

[root@local ~]# vim /tmp/backup.sh
#!/bin/bash
tar -zcvf /tmp/$(date +%m-%d-%H-%M)-boot.tar.gz /boot
[root@local ~]# chmod a+x /tmp/backup.sh 
[root@local ~]# crontab -e
13 10 * * * /tmp/backup.sh


 crontab -l 查询计划任务
 crontab -r  删除所有计划任务
 
计划任务的保存位置 
[root@robin home]# cat /var/spool/cron/root 
* * * * * date >> /tmp/date.txt


系统计划任务
cron.monthly/   每月要执行的
cron.weekly/     每周要执行的
cron.daily/         每天要执行的
cron.hourly/      每小时要执行的

访问控制文件:/etc/cron.deny 
写入该文件的用户不可以使用计划任务

日志: /var/log/cron

练习:
要求:
备份sdb文件系统  xfsdump
周1  全备
周2  增量
周3  增量
周四 差异
周5  增量
周6  增量
周7  增量
周1  全备
[root@local tmp]# vim num.txt 
0
[root@local tmp]# vim add.sh 
#!/bin/bash
num=`cat /tmp/num.txt`
new_num=$(($num+1))
xfsdump -L add -M dumpfile -l $new_num - /mnt |xz > /tmp/xfs.$(date +%w).add$new_num.xz
touch /mnt/$new_num.txt
echo $new_num > /tmp/num.txt
while (($new_num>4))
do
        new_num=0
        echo $new_num > /tmp/num.txt
done

[root@local tmp]# vim all.sh 
#!/bin/bash
xfsdump -L all -M dumpfile -l 0 - /mnt |xz > /tmp/xfs.$(date +%w).all0.xz
touch /mnt/aaaa.txt

[root@local tmp]# vim cha.sh 
#!/bin/bash
xfsdump -L cha -M dumpfile -l 1 - /mnt |xz > /tmp/xfs.$(date +%w).cha1.xz

[root@local tmp]# crontab -e
42 11 * * * /tmp/all.sh
44 11 * * * /tmp/add.sh
46 11 * * * /tmp/cha.sh

2.日志服务
rpm包日志目录:/var/log

日志服务的启动:
systemctl restart rsyslog
配置文件:
/etc/rsyslog.conf 
日志默认存放位置:
/var/log


日志文件配置格式:
AAAA.BBBB        CCCC

AAAA  产生日志的设备(接口,对象,类型)
BBBB  日志的级别
CCCC   保存日志的位置

产生日志的设备:authpriv mail cron uucp news  local0-7用户自定义
日志级别:
debug   调试
info  正常 
notice  稍微注意
warning 警告
error 错误信息
crit   危机信息
alert  必须注意
emergency(panic)  紧急信息

例:
mail.info   表示记录日志时 记录info级别以上
mail.=info  只要info级别
mail.!=info  除了info级别

存放日志的位置:
1.发送终端上
*.info;mail.none;authpriv.none;cron.none                 /dev/tty3
2.发送给用户
*.info;mail.none;authpriv.none;cron.none                 robin
3.发送到文件
*.info;mail.none;authpriv.none;cron.none                 /tmp/log.log


日志的集中管理:
服务端 
 vim /etc/rsyslog.conf
UDP
$ModLoad imudp
$UDPServerRun 514

systemctl restart rsyslog

客户端
UDP
vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none                 @192.168.200.222

systemctl restart rsyslog


服务端
TCP
 vim /etc/rsyslog.conf 
$ModLoad imtcp
$InputTCPServerRun 514

systemctl restart rsyslog

客户端
TCP
vim /etc/rsyslog.conf 
*.info;mail.none;authpriv.none;cron.none                 @@192.168.200.222

systemctl restart rsyslog


实验:
UDP 接收 message日志 重启autofs测试
TCP 接收  secure日志 ssh 127.0.0.1测试


OSI七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

tcp/ip4层 5层
应用层
传输层
网络层
数据链路层
物理层



日志的轮转  logrotate
[root@robin logrotate.d]# cp yum test
[root@robin logrotate.d]# vim test
/tmp/test.log {
    missingok        丢失不提示
    notifempty       空日志不切
    dateext            日期格式
    daily             按天
    rotate 7          保留7个 
    olddir /oldlog 
    create 0777 root root
}1121

logrotate  -f /etc/logrotate.d/test

自己定义日志
自己定义接口
vim /etc/rsyslog.conf
local6.*                      /var/log/test.log
systemctl restart rsyslog
logger命令产生日志
logger -p local6.info "hello world"

cat test.sh
#!/bin/bash
#logger -p local6.info "hello world 1"
echo "hello python" >> /var/log/test.log
sleep 2
/root/test.sh

练习:
1.解释日志服务配置文件的内容?
2.开启日志服务的远程日志(日志集中管理)
   将mail的日志使用udp传输
   将secure的日志使用tcp传输
3.对/tmp/robin.log文件设置轮转配置
要求:
1.丢失不提示
2.空文件不轮转
3.保存7分
4.新建日志文件权限 777  拥有者为robin 所属组为robin
5.按天轮转

3.DHCP
动态分配IP地址

实验环境
服务器和客户端仅主机方式连接

DHCP:
安装包:
yum install dhcp
端口(udp):67
配置文件:/etc/dhcp/dhcpd.conf
cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf 
启动服务: systemctl restart dhcpd
日志:/var/log/messages

工作原理:
C ---------DHCP DISCOVER --------> S
C<--------DHCP OFFER --------------  S
C----------DHCP REQUEST----------> S
C<--------DHCP ACK -----------------  S


配置:
[root@servera ~]# vim /etc/dhcp/dhcpd.conf 
subnet dhcp网段 netmask 子网掩码 {
  range 172.16.100.101 172.16.100.200; #范围
  option domain-name-servers 114.114.114.114; #dns
  #option domain-name "internal.example.org"; 
  option routers 172.16.100.1; #网关
  #option broadcast-address 172.16.100.255; #最后一个ip
  default-lease-time 600; #默认租赁时间
  max-lease-time 7200; #最大租赁时间
}

[root@servera ~]# systemctl restart dhcpd
[root@servera ~]# ss -anpltu | grep :67

客户端:
重启网络
ip addr s


租约文件:
服务端:/var/lib/dhcpd/dhcpd.leases
客户端:/var/lib/dhclient/

指定ip地址分配 
[root@servera ~]# vim /etc/dhcp/dhcpd.conf 
 host client1 {
   hardware ethernet 00:0c:29:64:d6:87;
   fixed-address 172.16.100.250;
 }
[root@servera ~]# systemctl restart dhcpd


练习:
1.搭建dhcp服务器
要求:
1.分配192.168.100.0/24网段ip
2.分配地址范围192.168.100.50-192.168.100.100

4.SSHD
SSHD 远程登陆服务
安装包:
openssh-server-6.6.1p1-22.el7.x86_64
openssh-clients-6.6.1p1-22.el7.x86_64
配置文件:
/etc/ssh/sshd_config
端口:
22
启动服务:
systemctl restart sshd
日志:/var/log/secure 


客户端
客户端登陆
ssh 192.168.200.227   使用的当前帐号作为登陆用户
ssh robin@192.168.200.227   指定用户身份登陆

远程拷贝
scp /root/anaconda-ks.cfg 192.168.200.222:/tmp/
不登陆拷贝
scp 192.168.200.227:/etc/hosts /tmp/
远程执行命令
ssh 192.168.200.227 'useradd robin;echo 123 | passwd --stdin robin'

配置文件
服务端:
vim /etc/ssh/sshd_config 
Port 22222 #指定端口
PermitRootLogin yes #是否允许root用户登录
UseDNS no #是否进行主机名解析
PasswordAuthentication yes #是否允许密码验证

客户端
ssh 192.168.200.222 -p 22222
远程拷贝
scp -P 22222 /etc/man_db.conf 192.168.200.222:/tmp/

自定义sshd日志(sshd rsyslog)
vim /etc/ssh/sshd_config 
#SyslogFacility AUTHPRIV
SyslogFacility local5

vim /etc/rsyslog.conf 
local5.*                                                /var/log/ssh.log
systemctl restart rsyslog

允许登陆帐号
Allowusers robin zorro


密钥登陆
1.生成密钥
[root@localhost ~]# ssh-keygen 
2.将公钥拷贝到服务器 
ssh-copy-id -i 192.168.200.227

服务器公钥名称
authorized_keys


服务器建立互信
1.ssh-keygen
2.拷贝公钥给自己
ssh-copy-id -i 192.168.200.222



多台服务器建立互信
方法一:
生成密钥
[root@servera ~]# ssh-keygen 
拷贝公钥给自己
[root@servera ~]# ssh-copy-id -i 192.168.33.137
拷贝.ssh目录给别的服务器
[root@servera ~]# scp -r /root/.ssh/ 192.168.33.138:/root/
通过ssh进行测试
加载私钥
[root@localhost ~]# ssh-add

方法二:
每个主机做公钥私钥
[root@servera ~]# ssh-keygen 
[root@serverb ~]# ssh-keygen 
主机1拷贝公钥给主机2 
[root@servera ~]# ssh-copy-id -i 192.168.33.138
主机2将自己的公钥追加到/root/.ssh/authorized_keys
[root@serverb .ssh]# cat id_rsa.pub >> authorized_keys 
主机2将/root/.ssh/authorized_keys拷贝给主机1
[root@serverb .ssh]# scp -r /root/.ssh/authorized_keys 192.168.33.137:/root/.ssh/
通过ssh进行测试


练习:
1.给两台虚拟机 建立sshd的密钥互信
5.文件服务器
1)NFS
NFS
网络文件系统:
安装包:
setup-2.8.71-6.el7.noarch
配置文件:
/etc/exports
端口:
2049
启动服务:(依赖服务rpcbind)
systemctl  restart nfs


服务端:
配置:
[root@servera ~]# mkdir /nfs
[root@servera ~]# vim /etc/exports
/nfs *(rw,sync)  #共享给所有人
/nfs 192.168.200.0/24(rw,sync) #共享给192.168.200网段
/nfs 192.168.200.0/24(rw,sync) 10.10.10.0/24(ro)
/nfs 192.168.200.225(rw,sync) #共享给某个主机

/nfs 权限 

/nfs *(rw,sync,no_root_squash)


客户端
装包nfs-utils
[root@serverb ~]# yum -y install nfs-utils
showmount -e ip地址 #查看nfs服务器
[root@serverb ~]# showmount -e 192.168.33.137
Export list for 192.168.33.137:
/nfs *
[root@serverb ~]# mount -t nfs 192.168.33.137:/nfs /mnt
[root@serverb ~]# ls /mnt/


作业:
1.3种方式实现nfs自动自动挂载
fstab
[root@serverb ~]# mkdir /mnt/tab
[root@serverb ~]# vim /etc/fstab 
192.168.33.137:/nfs /mnt/tab nfs defaults 0 0

autofs
[root@serverb ~]# yum -y install autofs
[root@serverb ~]# vim /etc/auto.master
/mnt    /etc/auto.mnt
[root@serverb ~]# vim /etc/auto.mnt
auto -fstype=nfs,rw 192.168.33.137:/nfs
(*   -rw,vers=3  classroom.example.com:/home/guests/&[root@serverb mnt]# ls auto
111

rc.local
[root@serverb ~]# mkdir /mnt/rc
[root@serverb ~]# vim /etc/rc.local 
mount -t nfs 192.168.33.137:/nfs /mnt
[root@serverb ~]# chmod a+x /etc/rc.d/rc.local 


2.NAS服务器(网络附加存储)
raid+lvm+nfs   

3块硬盘
raid5
[root@localhost ~]# mdadm -C -n 3 -l 5 /dev/md5 /dev/sdb /dev/sdc /dev/sdd

lvm
[root@localhost ~]# pvcreate /dev/md5
[root@localhost ~]# vgcreate vg0 /dev/md5
[root@localhost ~]# lvcreate -L 1.5G -n lv0 vg0

/nas NFS SMB
[root@localhost ~]# mkfs.xfs /dev/vg0/lv0 
[root@localhost ~]# mount /dev/vg0/lv0 /nas/
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# systemctl restart nfs

raid5+lvm---->mount point----->nfs---------------->mount使用

2)SAMBA
samba可以实现挂载 
samba可以实现与windos共享

安装软件:
yum install samba
配置文件:
/etc/samba/smb.conf
启动服务:
systemctl restart smb


配置:
匿名模式: (share)
服务端:
vim /etc/samba/smb.conf
security = user       Cenost6之前 security = share

CentOS7 匿名模式
mkdir /smb  

security = user
map to guest = bad user

[test]                                          #共享名
        comment =  test smb server              #描述
        path = /smb                                     #访问路径
        writable = yes                                  #可写
        browseable = yes                                #是否可见
        public = yes                                    #公共
        guest  ok  = yes                                #来宾用户

启动服务systemctl restart smb

客户端:
[root@servera ~]# yum -y install samba-client
[root@servera ~]# yum -y install cifs-utils
smbclient -L //192.168.200.222  查看
smbclient //192.168.200.222/test  登录

测试:
挂载
[root@servera ~]# mount -t cifs //192.168.33.132/test /mnt


验证模式:(user)
服务端
mkdir /share

security = user

[share]
        comment = test smb server
        path = /share
        writable = yes
        valid users = robin @east  #有效账号或组

[root@local smb]# useradd robin
[root@local smb]# smbpasswd -a robin


客户端
smbclient -L //192.168.200.222
[root@servera ~]# smbclient -U robin%1234 //192.168.33.132/share
[root@servera ~]# mount -t cifs -o username=robin,password=1234 //192.168.33.132/share /mnt/



写用户少
 [share]
         comment = test smb server
         path = /share
         write list = robin  @upup
         valid users = robin zorro  @upup

读用户少
[share]
        comment = test smb server
        path = /share
        writable = yes
        valid users = robin zorro
        read list = zorro


查询所有的smb帐号
pdbedit -L
 
删除samba帐号 
smbpasswd -x zorro


作业:
1.3种方式挂载smb     匿名 和  user模式
2.NAS

3.

练习:
公司有以下需求:
boss  king  zorro  jean
hr   king   jack  rose
yw  zorro  tom  jerry
kf   jean   robin  ben

1.有一个boss的目录 boss可写  其他部门经理只读
2.各部门都一个目录(hr  yw kf) 各部门经理可写, 其他人只读, boss也可以查看
3.还有一个目录,全公司员工都可以写,boss没有任何权限



[boss]
        comment = boss use 
        path = /company/boss
        write list = boss
        valid users = boss king zorro jean

[hr]
        comment = hr use 
        path = /company/hr
        write list = king
        valid users = king jack rose boss

[yw]
        comment = yw use 
        path = /company/yw
        valid users = zorro tom jerry boss
        write list = zorro

[kf]
         comment = kf use 
         path = /company/kf
         valid users = jean robin ben boss
         write list = jean

[pub]
        comment = test smb server
        path = /company/pub
        writable = yes 
        valid users = @hr @yw @kf 
                                              



练习:
使用samba完成NAS  并且实现3种自动挂载
验证
/etc/fstab
//192.168.33.132/share /mnt cifs defaults,username=robin,password=123 0 0
匿名
//192.168.33.132/share /mnt cifs defaults,username=nobady,password= 0 0

samba匿名自动挂载
[root@test ~]# cat /etc/samba/smbpass
username=root
password=

cat /etc/fstab
//192.168.1.1/smb	/mnt	cifs	defaults,multiuser,credentials=/etc/samba/smbpass 0 0

3)VSFTPD
vsftpd:文件共享服务

vsftpd:  服务名称
ftp:协议名称 
lftp:客户端

安装软件:
服务端
yum install vsftpd
客户端:
yum  install  lftp

端口:
port(主动)模式    21  20
pasv(被动)模式   21   随即端口

21 控制端口 
20 或  随即   数据端口

配置文件: /etc/vsftpd/vsftpd.conf
数据保存位置:/var/ftp
启动服务: systemctl restart vsftpd

工作模式 :
port模式(主动)
C                           S
1024+m---------->21
       1024+n----->
1024+n<----------20

pasv模式(被动)
C                           S
1024+m---------->21
1024+m<----- 1024+n
1024+x--------->1024+n

模式选择客户端决定

man 5 vsftpd.conf
配置:
匿名模式访问
anonymous_enable=YES
允许上传
anon_upload_enable=YES
anon_mkdir_write_enable=YES
允许删除
anon_other_write_enable=YES
上传文件允许下载
anon_umask=022
限速
anon_max_rate=20000
vsftpd更改数据目录位置:
anon_root=/home


客户端:
lftp 192.168.200.226
lftp 192.168.200.226:/> ls
lftp 192.168.200.226:/> get anaconda-ks.cfg   下载文件
lftp 192.168.200.226:/> mirror pub/    下载目录
lftp 192.168.200.226:/> put /etc/passwd
lftp 192.168.200.226:/pub> mirror -R /tmp/



用户模式访问(基于系统帐号)
useradd robin
passwd  robin
家目录权限修改为755

本地登陆
local_enable=YES
上传文件允许下载
local_umask=022
限速
local_max_rate=20000
限制用户切换目录(登陆目录不能有写权限)
#allow_writeable_chroot=YES  允许家目录权限700的情况下登录
chroot_local_user=YES     限制所有帐号不能切换目录

chroot_local_user=YES 
chroot_list_enable=YES      开启名单功能(写入以下文件的用户可以切换)
chroot_list_file=/etc/vsftpd/chroot_list   


chroot_local_user=NO(默认)
chroot_list_enable=YES      开启名单功能(写入以下文件的用户不可以切换)
chroot_list_file=/etc/vsftpd/chroot_list   




 /etc/vsftpd/ftpusers  写入用户名 禁止用户登陆ftp



黑白名单禁止用户登陆
userlist_enable=YES
userlist_deny=YES
/etc/vsftpd/user_list   黑名单

userlist_enable=YES
userlist_deny=NO
/etc/vsftpd/user_list   白名单

改变本地用户登陆位置
local_root=/nfs

客户端
lftp -u robin,123 192.168.200.226











======================================



虚拟帐号:
1.建立用户数据库文件
vim /etc/vsftpd/vftpuser.txt 
test111
pass111
test222
pass222
 
2.安装数据库转换工具
yum install libdb-utils-5.3.21-19.el7.x86_64
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vsftpd_login.db

3.建立验证模式文件
# mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
# vi /etc/pam.d/vsftpd
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

4.建立一个所有虚拟用户使用的系统用户
# useradd -d /home/vsftp virtual
# chmod 755 /home/vsftp

5.修改配置文件启用虚拟用户
guest_enable=YES # 开启虚拟用户功能
guest_username=virtual # 指定虚拟用户使用的系统用户
pam_service_name=vsftpd # 以/etc/pam.d/验证模式文件名相同

客户端测试登陆
lftp -u test111,pass111 192.168.200.226
lftp -u test222,pass222 192.168.200.226

-----------
为虚拟用户设置不同权限
方法一.
虚拟用户使用与本地用户相同权限
virtual_use_local_privs=YES
虚拟用户使用与匿名用户相同权限
virtual_use_local_privs=NO

方法二.
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftp_user_conf

mkdir /etc/vsftpd/vsftp_user_conf


[root@client nfs]# cat /etc/vsftpd/vsftp_user_conf/test111 
write_enable=NO
local_max_rate=20000
local_root=/nfs

[root@client nfs]# cat /etc/vsftpd/vsftp_user_conf/test222
local_max_rate=100000
local_root=/nfs

6.web服务器
HTTPD(apache web服务器)
安装包:httpd-2.4.6-45.el7.centos.4.x86_64.rpm
         httpd-manual-2.4.6-45.el7.centos.4.noarch.rpm  文档
端口: 80 443
配置文件: /etc/httpd/conf/httpd.conf
	        /etc/httpd/conf.d/
	        /etc/httpd/conf.modules.d
数据目录:/var/www/html
启动服务:systemctl restart httpd
日至存放目录:/var/log/httpd/
客户端访问
elinks 172.16.10.30
elinks --dump 172.16.10.30  显示在终端上
curl 10.10.3.76

netstat -anplt
netstat -anlpu

http: 超文本传输协议: hyper text tranfer protocol
html:超文本标记语言:hyper text markup langue


vim /var/www/html/index.html
<html>
        <head>
                <title>welcome !!!!</title>
        </head>
        <body>
                <h1></h1>
                <img src='dog.jpg'>
                <h2>风景</h2>
                <img src='timg.jpg'>
        </body>
</html>


apache 工作模式 
prefork
worker
event

查看工作模式
httpd -V

1. prefork MPM
Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

2.worker MPM
worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些

优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用

3. event MPM
这个是Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

注意一点,event MPM需要Linux系统(Linux 2.6+)对EPoll的支持,才能启用

切换方式
vim /etc/httpd/conf.modules.d/00-mpm.conf 
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so  #进程模式
<IfModule mpm_prefork_module>
    StartServers            10
    MinSpareServers         10
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>


#LoadModule mpm_worker_module modules/mod_mpm_worker.so  #线程模式
<IfModule mpm_worker_module>
    StartServers             10
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>


#LoadModule mpm_event_module modules/mod_mpm_event.so  #event模式
<IfModule mpm_event_module>
    StartServers             15
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>



保持连接(长连接)
KeepAlive On
KeepAliveTimeout 15
MaxKeepAliveRequests 100


修改http访问默认位置
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak 
#DocumentRoot "/var/www/html"
DocumentRoot "/etc"
<Directory "/etc">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

其他方法
方法1:
cp -r /boot  /var/www/html
方法2:
ln -s /boot/  /var/www/html


别名
alias /down /home
<directory /home>
        options indexes    #如果有index,优先显示,没有则显示目录
        Require all granted
</directory>

alias /upup /var
<Directory "/var">
        options indexes
        require all granted
</Directory>


个人主页
vim /etc/httpd/conf.d/userdir.conf 
<IfModule mod_userdir.c>
#UserDir disabled
UserDir public_html     #开启个人主页
</IfModule>

useradd robin
useradd zorro
mkdir /home/robin/public_html
mkdir /home/zorro/public_html
echo "robin home" > /home/robin/public_html/index.html
echo "zorro home" > /home/zorro/public_html/index.html
chmod 705 /home/robin/
chmod 705 /home/zorro/
客户端测试
http://172.16.10.1/~zorro/
http://172.16.10.1/~robin/


访问控制
例1:允许所有访问请求
Apache2.4下的配置:
<Directory xxx/www/yoursite>
        Require all granted
</Directory>  
例2:拒绝所有访问请求
Apache2.4下的配置:
<Directory xxx/www/yoursite>
        Require all denied
</Directory> 
例3:只允许来自特定域名主机的访问请求,其他请求将被拒绝
Apache2.4下的配置:
<Directory xxx/www/yoursite>
        Require host google.com
</Directory> 
例4:只允许来自特定IP或IP段的访问请求,其他请求将被拒绝
Apache2.4下的配置:
<Directory xxx/www/yoursite>
        Require ip 192.168.33
</Directory> 
例5:允许所有访问请求,但拒绝来自特定IP或IP段的访问请求(阻止恶意IP或恶意爬虫网段的访问)
Apache2.4下的配置:
<Directory xxx/www/yoursite>
    <RequireAll>
        Require all granted
        Require not ip 192.168.1.1
        Require not ip 192.120 192.168.100
    </RequireAll>
</Directory> 

验证方式登录
alias /down     /var/ftp
<directory /var/ftp>
        options indexes
        AuthType Basic                        #验证
        AuthName "welcome"                    #提示语
        AuthBasicProvider file                #文件验证
        AuthUserFile /etc/httpd/conf/passwd   #验证的文件
        Require user robin                    #允许的用户
</directory>

htpasswd -c -b /etc/httpd/conf/passwd robin 123  创建新帐号
htpasswd -b /etc/httpd/conf/passwd zorro 123   添加新帐号

全部有效帐号 
alias /upup /var
<Directory "/var">
        Options indexes FollowSymLinks
        AuthType Basic
        AuthName "welcome!!!!!"
        AuthBasicProvider file
        AuthUserFile /etc/httpd/conf/http_passwd
        Require valid-user
</Directory>


发布cgi脚本
脚本发布目录:/var/www/cgi-bin

#!/bin/bash
echo -e "content-type: text/html\n"
date
echo "<br>"
uname -r

http://172.16.10.1/cgi-bin/cgi.sh


#!/bin/bash
echo -e "Content-type: text/html\n"
for i in {1..100}
do
	sleep 1
	echo $i
done



虚拟主机(基于域名 基于ip)
基于域名虚拟主机
[root@local ~]# vim /etc/httpd/conf.d/vhost.conf
NameVirtualHost *:80
<VirtualHost *:80>
     ServerName www.youku.com
     DocumentRoot /srv/youku/
</VirtualHost>
<Directory "/srv/youku">
     Require all granted
</Directory>
<VirtualHost *:80>
     ServerName www.tudou.com
     DocumentRoot /srv/tudou/
</VirtualHost>
<Directory "/srv/tudou">
     Require all granted
</Directory>
[root@local ~]# mkdir /srv/youku
[root@local ~]# mkdir /srv/tudou
[root@local ~]# echo "youku" > /srv/youku/index.html
[root@local ~]# echo "tudou" > /srv/tudou/index.html
[root@local ~]# systemctl restart httpd

客户端
vim /etc/hosts
172.16.10.1     www.youku.com
172.16.10.1     www.tudou.com

linux中
http://www.tudou.com
http://www.youku.com
[root@local ~]# curl www.youku.com
[root@local ~]# curl www.tudou.com
elinks --dump

Windows里修改hosts文件


基于ip虚拟主机
ifconfig eno16777736:0 10.10.10.5/24

<VirtualHost 192.168.0.5:80>
     ServerName www.youku.com
     DocumentRoot /srv/youku/
</VirtualHost>
<Directory "/srv/youku">
     Require all granted
</Directory>
<VirtualHost 10.10.10.5:80>
     ServerName www.tudou.com
     DocumentRoot /srv/tudou/
</VirtualHost>
<Directory "/srv/tudou">
     Require all granted
</Directory>


客户端
vim /etc/hosts
192.168.0.5     www.youku.com
10.10.10.5     www.tudou.com




练习
做虚拟主机
www.gogle.com  需要用户king  密码123 才能登陆访问
www.baidu.com  只有你的宿主机才能访问
[root@local ~]# mkdir /srv/gogle
[root@local ~]# mkdir /srv/baidu
[root@local ~]# echo "gogle" > /srv/gogle/index.html
[root@local ~]# echo "baidu" > /srv/baidu/index.html
[root@local ~]# vim /etc/httpd/conf.d/vhost.conf 
NameVirtualHost *:80
<VirtualHost *:80>
     ServerName www.gogle.com
     DocumentRoot /srv/gogle/
</VirtualHost>
<Directory "/srv/gogle">
        options indexes
        AuthType Basic
        AuthName "welcome"
        AuthBasicProvider file
        AuthUserFile /etc/httpd/conf/passwd
        Require user king
</Directory>
<VirtualHost *:80>
     ServerName www.baidu.com
     DocumentRoot /srv/baidu/
</VirtualHost>
<Directory "/srv/baidu">
        options indexes
        Require ip 192.168.33.138
</Directory>
[root@local ~]# htpasswd -b /etc/httpd/conf/passwd king 123
[root@local ~]# vim /etc/hosts

7.DNS
1)DNS域名解析服务器
DNS:domain name server  域名解析服务器

安装与配置
安装软件:bind-9.9.4-29.el7.x86_64.rpm
端口:53
配置文件:
/etc/named.conf 
/etc/named.rfc1912.zones
/var/named/
启动服务:systemctl restart named

正向解析
1.vim /etc/named.conf
listen-on port 53 { any; };
allow-query     { any; };

2.vim /etc/named.rfc1912.zones
zone "east.com" IN {
        type master;
        file "east.com.zone";
};


3.touch /var/named/east.com.zone 
chmod 640 /var/named/east.com.zone 
chown .named /var/named/east.com.zone
[root@local named]# vim east.com.zone 
$TTL 1D
@       IN SOA  dns.east.com. root. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   dns.east.com.
dns     IN A    192.168.33.132
www     IN A    192.168.33.132
aaa     IN A    192.168.33.137



客户端测试:
[root@local ~]# vim /etc/resolv.conf   #指定动态ip的dns
[root@client ~]# host www.douniwan.com
www.douniwan.com has address 192.168.200.226

[root@client ~]# nslookup www.douniwan.com
Server:		192.168.200.222
Address:	192.168.200.222#53 

Name:	www.douniwan.com
Address: 192.168.200.226

[root@client ~]# dig www.douniwan.com


反向解析:
1.vim /etc/named.conf
listen-on port 53 { any; };
allow-query     { any; };

2.vim /etc/named.rfc1912.zones
zone "200.192.168.in-addr.arpa " IN {
        type master;
        file "192.168.200.arpa";
};

3.
touch /var/named/192.168.200.arpa
chmod 640 /var/named/192.168.200.arpa
chown .named /var/named/192.168.200.arpa

vim /var/named/192.168.200.arpa
$TTL 1D
@       IN SOA  dns.king.com. root. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   dns.king.com.
dns    IN A    192.168.200.222
226     IN PTR  test.king.com.


各种写法
$TTL 1D
@       IN SOA  dns.douniwan.com.       root. ( 0 1D 1H 1W 3H )
        IN NS dns.douniwan.com.
dns IN A 192.168.200.222
ww IN CNAME www
wwww IN CNAME www
www IN A 192.168.200.226
@   IN A 192.168.200.226
ftp.douniwan.com. IN CNAME www.douniwan.com.
*  IN A 192.168.200.226             #泛解析
   IN MX 5 mail.douniwan.com.
mail IN A 192.168.200.226
$GENERATE 1-254 stu$ IN A 192.168.1.$  #连续解析


转发服务器
vim /etc/named.conf
options {
        listen-on port 53 { any; };
		allow-query     { any; };


forward first;         #先从DNS服务器里找,再从根域找
forwarders { 192.168.200.222; };

forward only;    #只从DNS服务器里面找
forwarders { 192.168.200.222; };


DNS主从服务器(时间必须同步):
主服务器配置
1.vim /etc/named.conf 
listen-on port 53 { any; };
allow-query     { any; };

2.vim /etc/named.rfc1912.zones 
zone "east.com" IN {
        type master;    #主服务器
        file "east.com.zone";
        allow-transfer { 192.168.33.137; };   #允许传输数据
};


3.
vim /var/named/east.com.zone 
$TTL 1D
@       IN SOA  dns1.east.com. root. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   dns1.east.com.
        IN NS   dns2.east.com.
dns1    IN A    192.168.33.132
dns2    IN A    192.168.33.137
www     IN A    192.168.33.137

chown .named /var/named/east.com.zone
chmod 640 /var/named/east.com.zone

从服务器
1.vim /etc/named.conf 
listen-on port 53 { any; };
allow-query     { any; };

2.
[root@servera named]# vim /etc/named.rfc1912.zones 
zone "east.com" IN {
        type slave;     #从服务器
        file "slaves/east.com.zone";
        masters { 192.168.33.132; };
};


同步数据
$TTL 1D
@       IN SOA  dns1.east.com. root. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   dns1.east.com.
        IN NS   dns2.east.com.
dns1    IN A    192.168.33.132
dns2    IN A    192.168.33.137
www     IN A    192.168.33.137



dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
TSIG方式传输
主
key robinkey {
        algorithm hmac-md5;
        secret "YBMMsomw64S8BmK6/JbVaA==";
};

zone "upup.com" IN {
        type master;
        file "upup.com.zone";
        allow-transfer  { key robinkey; };
};


从
key robinkey {
        algorithm hmac-md5;
        secret "YBMMsomw64S8BmK6/JbVaA==";
};

zone "upup.com" IN {
        type slave;
        file "slaves/upup.com.zone";
        masters { 192.168.200.222 key robinkey; };
};
               




子域授权
父域
1.vim /etc/named.conf 
listen-on port 53 { any; };
allow-query     { any; };

2.vim /etc/named.rfc1912.zones 
zone "robin.com" IN {
        type master;
        file "robin.com.zone";
};

3.
vim /var/named/robin.com.zone 
$TTL 1D
@       IN SOA  dns.robin.com.  root. ( 0 1D 1H 1W 3H )
        IN NS dns.robin.com.
dns IN A 192.168.200.222
music.robin.com. IN NS dns.music.robin.com.
dns.music.robin.com. IN A 192.168.200.226
www IN A 192.168.200.226
@   IN A 192.168.200.226

chmod 640 /var/named/robin.com.zone
chown .named /var/named/robin.com.zone


子域
1.vim /etc/named.conf 
listen-on port 53 { any; };
allow-query     { any; };

2.vim /etc/named.rfc1912.zones
zone "music.robin.com" IN {
        type master;
        file "music.robin.com.zone";
};

3.
chmod 640 /var/named/music.robin.com.zone 
chown .named /var/named/music.robin.com.zone
vim /var/named/music.robin.com.zone
$TTL 1D
@       IN SOA  dns.music.robin.com.  root. ( 0 1D 1H 1W 3H )
        IN NS dns.music.robin.com.
dns IN A 192.168.200.222
www IN A 192.168.200.226
@   IN A 192.168.200.226



2)练习
一个Apache服务器, www.hello.com   www.world.com
一个nas        挂载到Apache上
一个DNS服务器
用window进行测试


8.NTP时间服务器
同步时间
从bios设置系统时间
hwclock -s
从系统时间设置bios
hwclock -w


NTP服务器的概念:
网络时间协议(英语:Network Time Protocol,NTP)是以分组交换把两台电脑的时钟同步化的网络传输协议。NTP使用UDP端口123作为传输层。它是用作抵销可变延迟的影响。 
NTP是仍在使用中的最古老的网络传输协议之一(在1985年前开始)。NTP最初由特拉华大学的Dave Mills 设计,他与一群志愿者仍在维护NTP。 

NTP 网络时间协议用来同步网络上不同主机的系统时间。你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间。而另一方面,一个 NTP 服务器会将它的时间和任意公共 NTP 服务器,或者你选定的服务器同步。由 NTP 管理的所有系统时钟都会同步精确到毫秒级。
在公司环境中,如果他们不想为 NTP 传输打开防火墙,就有必要设置一个内部 NTP 服务器,然后让员工使用内部服务器而不是公共 NTP 服务器。


1.安装时间服务器
yum install ntp ntpdate -y

2.查找时间同步服务器
http://www.pool.ntp.org/zone/asia

3.配置时间服务器
vim /etc/ntp.conf
server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server 3.asia.pool.ntp.org
server 127.127.1.0 iburst
restrict 192.168.33.0 mask 255.255.255.0

4.启动服务器并测试
systemc start ntpd
ntpd -p
date -R

客户端测试
ntpdate  192.168.33.132

计划任务保证时间同步



timedatectl

查看系统时钟与时区
使用timedatectl
使用列出可用的时区
timedatectl list-timezones
设定系统时钟与时区
timedatectl set-timezone 
timezonetimedatectl set-time hour:min:sec
设定是否启用网络时间同步
timedatectl set-ntp true|false

chrony
RHEL8使用chrony同步时间,
不再使用ntp服务
chronyd服务通过与配置的NTP服务器同步配置方式
修改配置文件:/etc/chrony.conf
图形界面: system-config-date

配置文件/etc/chrony.conf     server 指定网络时钟服务器,类似ntp

查看当前网络时钟服务器信息chronyc sources -v


server(链接互联网时间服务器)
server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst 
server 2.asia.pool.ntp.org iburst
server 3.asia.pool.ntp.org iburst
allow 192.168.33.0/24


client(设置10.10.11.251为时间服务器)
[root@servera ~]# vim /etc/chrony.conf 
server 10.10.11.251 iburst
[root@servera ~]# systemctl restart chronyd
[root@servera ~]# chronyc sources -v
[root@servera ~]# timedatectl 

9.XINETD
xinetd 超级代理服务
安装xinetd服务
yum install xinetd
安装telnet服务
yum install telnet-server    服务端
yum install telnet 客户端
端口:23

启动服务 
systemctl start telnet.socket
systemctl enable telnet.socket
systemctl start xinetd
systemctl enable xinetd

客户端:
telnet 172.16.90.245

注意,不能使用root帐号直接登陆


tftp服务
安装软件:
yum install tftp-server 
yum install tftp
配置文件:
/etc/xinetd.d/tftp
端口:69
数据目录:
/var/lib/tftpboot/


配置
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

客户端:
[root@localhost ~]# tftp 172.16.90.245
tftp> get hosts

10.MAIL
邮件服务器:
MUA:邮件用户代理     foxmail  outlook
MTA:邮件传输代理      sendmail   postfix
MDA:邮件投递代理     
SMTP:简单邮件传输协议 

postfix
安装:
yum install postfix
配置文件:
 /etc/postfix/main.cf 
端口:25
启动服务:systemctl restart postfix
日志:/var/log/maillog
邮件保存位置:/var/spool/mail/


配置:
hostnamectl set-hostname mail.robin.com
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.90.245	mail.robin.com

配置发送
vim /etc/postfix/main.cf
myhostname = mail.robin.com
mydomain = robin.com
inet_interfaces = all
#inet_interfaces = localhost

systemctl restart postfix

测试:
[root@localhost ~]# telnet mail.robin.com 25  连接25端口
Trying 172.16.90.245...
Connected to mail.robin.com.
Escape character is '^]'.
220 mail.robin.com ESMTP Postfix
ehlo mail.robin.com   ------------------------------------------- 和服务器测试连接
250-mail.robin.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:robin@mail.robin.com   ----------------------------------- 发件人
250 2.1.0 Ok
rcpt to:zorro@mail.robin.com  ----------------------------------------  收件人
250 2.1.5 Ok
data  --------------------------------------------------------------------------内容
354 End data with <CR><LF>.<CR><LF>
hello i am robin!!!!!!
.    ---------------------------------------------------------------------------------------结束
250 2.0.0 Ok: queued as EFB753165BF3
quit -------------------------------------------------------------------------- 退出
221 2.0.0 Bye


非交互式
echo 123456 | mail -s test zorro@mail.robin.com


接受邮件:
安装软件:
yum install dovecot
配置文件:
 /etc/dovecot/dovecot.conf 
 /etc/dovecot/conf.d/
端口:pop3:110     imap:143
启动服务:systemctl restart dovecot

配置:
vim /etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp

vim /etc/dovecot/conf.d/10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u


mkdir  -p /home/zorro/mail/.imap/INBOX
chown -R zorro.zorro /home/zorro/
 

测试接受邮件:
[root@localhost ~]# telnet mail.robin.com 110     连接 110
Trying 172.16.90.245...
Connected to mail.robin.com.
Escape character is '^]'.
+OK Dovecot ready.
user zorro -------------------------------------------------- 用户
+OK
pass 123  --------------------------------------------------  密码
+OK Logged in.
list  -------------------------------------------------------- 列出
+OK 2 messages:
1 456  
2 538
.
retr 1  ----------------------------------------------------- 查看
+OK 456 octets
Return-Path: <robin@mail.robin.com>
X-Original-To: zorro@mail.robin.com
Delivered-To: zorro@mail.robin.com
Received: from mail.robin.com (mail.robin.com [172.16.90.245])
	by mail.robin.com (Postfix) with ESMTP id EFB753165BF3
	for <zorro@mail.robin.com>; Thu, 22 Jun 2017 10:58:31 +0800 (CST)
Message-Id: <20170622025842.EFB753165BF3@mail.robin.com>
Date: Thu, 22 Jun 2017 10:58:31 +0800 (CST)
From: robin@mail.robin.com

hello i am robin!!!!!!
.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值