linux系统性基础学习
重置root密码
重启 Linux 系统主机并出现引导界面时,选择好内核,按下键盘上的 e 键进入内核编辑界面,在 linux16 参数这行的最后面追加"init=/bin/sh"参数,然后按下 Ctrl + X 组合键来运行修改过的内核程序,进入到系统紧急求援模式,一次输入以下指令完成密码更改:
mount -o remount,rw /
passwd
touch /.autorelabel
exec /sbin/init
linux开机过程
开机自检BIOS→进入引导程序→加载内核→内核初始化→启动初始化进程→用户登录使用
rhel6以前init初始化进程服务是单独启动机制,开机速度缓慢
rhel7以后systemd初始化进程服务采用了并发启动机制,开机速度得到了很大的提升
rhel6和rhel7服务管理指令
- RHEL6 服务管理 --- --RHEL7服务管理 ---------------------作用
service foo start-----systemctl start foo.service-------启动服务
service foo restart---systemctl restartfoo.service------重启服务
service foo stop------systemctl stop foo.service--------停止服务
service foo reload----systemctl reload foo.service------重新加载配置文件(不终止服务)
service foo status----systemctl status foo.service------查看服务状态
chkconfig foo on------systemctl enable foo.service------开机自动启动
chkconfig foo off-----systemctl disable foo.service------开机不自动启动
chkconfig foo---------systemctl is-enabled foo.service----查看特定服务是否为开机自动启动
chkconfig --list------systemctl list-unit-files --type=service---查看各个级别下服务的启动与禁用情况
linux常用指令
rpm软件包指令
rpm -ivh filename.rpm #安装软件的命令格式
rpm -Uvh filename.rpm #升级软件的命令格式
rpm -e filename.rpm #卸载软件的命令格式
rpm -qpi filename.rpm #查询软件描述信息的命令格式
rpm -qpl filename.rpm #列出软件文件信息的命令格式
rpm -qf filename #查询文件属于哪个 RPM 的命令格式
yum指令
yum repolist all #列出所有仓库
yum list all #列出仓库中所有软件包
yum info #软件包名称 查看软件包信息
yum install #软件包名称 安装软件包
yum reinstall #软件包名称 重新安装软件包
yum update #软件包名称 升级软件包
yum remove #软件包 移除软件包
yum clean all #清除所有仓库缓存
yum check-update #检查可更新的软件包
yum grouplist #查看系统中已经安装的软件包组
yum groupinstall #软件包组 安装指定的软件包组
yum groupremove #软件包组 移除指定的软件包组
yum groupinfo #软件包组 查询指定的软件包组信息
查看某个命令属于哪个软件包
rpm包类型用:yum provides "*bin/命令" #查找会释放命令文件的软件包
yum包类型用:yum whatprovides 命令 或 yum provides '*bin/命令'
deb包类型用:apt-file search 命令 #apt-file默认没安装,好像效果也一般
vi/vim内操作
Ctrl+u:向文件首翻半屏;
Ctrl+d:向文件尾翻半屏;
Ctrl+f:向文件尾翻一屏;
Ctrl+b:向文件首翻一屏;
x或X:删除一个字符,x删除光标后的,而X删除光标前的;
D:删除从当前光标到光标所在行尾的全部字符;
a:在当前字符后添加文本;
:e文件名:在命令模式下,打开并编辑指定名称的文件;
vi里面执行外部命令
:!后面直接跟指令,无需空格
:!ls /root/
VMware-VCSA-all-6.0.0-3634788.iso
Press ENTER or type command to continue
vi里面更改内容
:s/one/two 将当前光标所在行的第一个 one 替换成 two
:s/one/two/g 将当前光标所在行的所有 one 替换成 two
:%s/one/two/g 将全文中的所有 one 替换成 two
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
vi里面关键词操作
/ 从上至下搜索某个关键词,如"/linux"
? 从下至上搜索某个关键词,如"?linux"
n 定位到下一个搜索到的关键词
N 定位到上一个搜索到的关键词
帮助指令help/man
--help
-h
man cp #查看cp命令的帮助信息
ifconfig
主要看网卡配置、名称、IP地址、mac地址、RX接收的数据包和TX发送的数据包个数和累计流量
[root@vm10-0-0-29 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.29 netmask 255.255.255.0 broadcast 10.0.0.255
ether fa:16:3e:57:e3:10 txqueuelen 1000 (Ethernet)
RX packets 776765 bytes 336921965 (321.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 778196 bytes 131433412 (125.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 4136 bytes 231616 (226.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4136 bytes 231616 (226.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
uptime查看系统负载信息
uptime显示当前系统时间、系统运行时间、启动终端数量以及平均负载;平均负载是系统在最近1分钟、5分钟、15分钟的压力情况;值越低越好,尽量不要长期超过1,在生产环境中不要超过5。
[root@localhost ~]# uptime
08:07:40 up 6 min, 1 user, load average: 0.08, 0.25, 0.16
free查看内存信息
[root@localhost ~]# free -h
内存总量 已使用量 可用内存 进程共享的内存 磁盘缓存内存 缓存的内存量
total used free shared buff/cache available
Mem: 3.9G 1.6G 1.7G 11M 592M 2.1G
Swap: 2.0G 0B 2.0G
last查看系统的登录信息
[root@localhost ~]# last | grep 15
用户 登录方式 登录ip 时间
root pts/1 10.72.42.201 Wed Jul 15 08:23 still logged in
root pts/0 10.72.42.1 Wed Jul 15 08:03 still logged in
reboot system boot 3.10.0-1127.13.1 Wed Jul 15 16:01 - 08:26 (-7:-34)
reboot system boot 3.10.0-1127.13.1 Wed Jul 15 01:32 - 08:26 (06:53)
reboot system boot 3.10.0-1127.13.1 Wed Jul 15 01:27 - 17:29 (-7:-58)
reboot system boot 3.10.0-1127.13.1 Wed Jul 15 01:23 - 17:29 (-7:-53)
reboot system boot 3.10.0-1127.13.1 Wed Jul 15 00:56 - 17:29 (-7:-27)
history历史指令
[root@localhost ~]# history #查看历史指令
[root@localhost ~]# cat .bash_history #历史指令存放文件
[root@localhost ~]# history -c #清空当前用户在本机上执行的命令记录
tr文件文本内容替换
[root@localhost ~]# cat q.txt
1122334241253534665674124
214124gdfdjsjymtymum
zzzzdwqdqfsjsjykngfk
[root@localhost ~]# cat q.txt | tr 1 P > a.txt #将文本里面的1替换为大写的P
[root@localhost ~]# cat a.txt
PP2233424P253534665674P24
2P4P24gdfdjsjymtymum
zzzzdwqdqfsjsjykngfk
cut按列提取文本字符
[root@vm10-0-0-29 ~]# head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@vm10-0-0-29 ~]# cut -d: -f1,2 /etc/passwd | head -5 #-d: 以冒号分割;-f1,2代表打印第1列和第2列的信息
root:x
bin:x
daemon:x
adm:x
lp:x
例子1:默认以空格分割
cut -f1,2 filename #不加-d,默认以空格分割
例子2:查看tcp链接并排序
[root@vm10-0-0-29 ~]# netstat -antp | awk '{print $5}' | cut -d: -f1 | uniq -c | sort -r
3 0.0.0.0
2 183.17.228.54
2
1 and
1 Address
1 120.92.212.184
diff -c 对比两个文件的差异化
[root@vm10-0-0-29 ~]# cat q.txt
111
222
333
aaa
ccc
[root@vm10-0-0-29 ~]# cat a.txt
111
222
123a
aaa
ccc
[root@vm10-0-0-29 ~]# diff -c q.txt a.txt #-c参数会用!号标记哪一行不同
*** q.txt 2020-07-15 15:19:15.420023360 +0800
--- a.txt 2020-07-15 15:20:01.384028840 +0800
***************
*** 1,5 ****
111
222
! 333
aaa
ccc
--- 1,5 ----
111
222
! 123a
aaa
ccc
touch修改文件时间
touch -r 新文件 目标文件 #创建新文件的时间与目标文件时间相同
touch -t 时间串 目标文件 #更改文件为指定时间;格式如:201608011234,年月日时分秒
touch -a filename #修改文件读取时间(atime)
touch -m filename #修改文件的修改时间(mtime)
touch -d filename #同时修改atime和mtime
mkdir创建目录
mkdir -vp 在xueshen目录下创建lisi、wangwei、zhangshan目录以及各子级目录并显示详细过程
[root@vm10-0-0-29 ~]# pwd
/root
[root@vm10-0-0-29 ~]# mkdir -vp xueshen/{zhangsan/zuoye/doc/},lisi/{biji/txt/},wangwei/{kaoshiti/daan/}}
mkdir: created directory 'xueshen'
mkdir: created directory 'xueshen/zhangsan'
mkdir: created directory 'xueshen/zhangsan/zuoye'
mkdir: created directory 'xueshen/zhangsan/zuoye/doc'
mkdir: created directory 'xueshen/zhangsan/zuoye/doc/}'
mkdir: created directory 'xueshen/lisi'
mkdir: created directory 'xueshen/lisi/{biji'
mkdir: created directory 'xueshen/lisi/{biji/txt'
mkdir: created directory 'xueshen/lisi/{biji/txt/}'
mkdir: created directory 'xueshen/wangwei'
mkdir: created directory 'xueshen/wangwei/{kaoshiti'
mkdir: created directory 'xueshen/wangwei/{kaoshiti/daan'
mkdir: created directory 'xueshen/wangwei/{kaoshiti/daan/}'
[root@vm10-0-0-29 ~]# ls
xueshen
[root@vm10-0-0-29 ~]# tree xueshen
xueshen
├── lisi
│ └── {biji
│ └── txt
│ └── }
├── wangwei
│ └── {kaoshiti
│ └── daan
│ └── }
└── zhangsan
└── zuoye
└── doc
└── }
cp -a 复制文件
cp -a filename #不管是目录、文件、链接文件都复制
file查看文件类型
语法:file 目标
tar打包压缩
tar -czvf 文件格式.tar.gz 目标
tar -xf 目标 -C 需要存入的目录 #大写字母-C指定存放路径
shell脚本
常用的字符串比较运算符
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
符号的认识
$( )中放的是命令
${ }和[]中放的是变量
$(())和$[ ]都是对内部内容进行数学运算
$[ ]这个运算中不能有小数点,有小数点的只能在bc中运算
${ }中放的是变量,例如echo ${PATH}取PATH变量的值并打印,也可以不加括号比如$PATH。
$(())对内部内容进行整数运算$((var1*var2))。或将其他进制转换为十进制$((N#var)),其中N为进制
可用的整数比较运算符
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于
$(())和$[ ]是对数字的运算
$[ ] 这个运算中不能有小数点,有小数点的只能在bc中运算
4个常用的转义符
? 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
? 单引号(''):转义其中所有的变量为单纯的字符串。
? 双引号(""):保留其中的变量属性,不进行转义处理。
? 反引号(``):把其中的命令执行后返回结果
脚本取free内存可用量
NR==表示指定行号
[root@vm10-0-0-29 ~]# free -m | awk 'NR==2{print $4}'
735
[root@vm10-0-0-29 ~]# vim free.sh
#!/bin/bash
i=`free -m | awk 'NR==2{print $4}'`
echo "当前内存剩余$i M"
[root@vm10-0-0-29 ~]# sh free.sh
当前内存剩余734 M
脚本取disk磁盘已使用量
[root@vm10-0-0-29 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 2.6G 16G 14% /
devtmpfs 909M 0 909M 0% /dev
tmpfs 920M 16K 920M 1% /dev/shm
tmpfs 920M 97M 823M 11% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
tmpfs 184M 0 184M 0% /run/user/0
[root@vm10-0-0-29 ~]# df -h | awk 'NR==2{print $5}'
14%
[root@vm10-0-0-29 ~]# vim use-disk.sh
#!/bin/bash
i=`df -h | awk 'NR==2{print $5}'`
echo "/dev/vda1已使用$i"
[root@vm10-0-0-29 ~]# sh use-disk.sh
/dev/vda1磁盘已使用14%
脚本取uptime系统负载
cut取列;-d,以逗号分割;-f1第1列
[root@vm10-0-0-29 ~]# uptime
19:15:42 up 8 days, 4:36, 2 users, load average: 0.00, 0.01, 0.05
[root@vm10-0-0-29 ~]# uptime | awk -F: '{print $5}' | cut -d, -f1
0.00
[root@vm10-0-0-29 ~]# uptime | awk -F: '{print $5}' | cut -d, -f2
0.01
[root@vm10-0-0-29 ~]# uptime | awk -F: '{print $5}' | cut -d, -f3
0.05
[root@vm10-0-0-29 ~]# vim load.sh
#!/bin/bash
load1=`uptime | awk -F: '{print $5}' | cut -d, -f1`
load5=`uptime | awk -F: '{print $5}' | cut -d, -f2`
load15=`uptime | awk -F: '{print $5}' | cut -d, -f3`
echo "当前系统1分钟负载$load1"
echo "当前系统5分钟负载$load5"
echo "当前系统15分钟负载$load15"
[root@vm10-0-0-29 ~]# sh load.sh
当前系统1分钟负载 0.00
当前系统5分钟负载 0.01
当前系统15分钟负载 0.05
脚本取ifconfig系统IP
[root@vm10-0-0-29 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.29 netmask 255.255.255.0 broadcast 10.0.0.255
ether fa:16:3e:57:e3:10 txqueuelen 1000 (Ethernet)
RX packets 881297 bytes 363119554 (346.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 882980 bytes 150797184 (143.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@vm10-0-0-29 ~]# ifconfig | awk 'NR==2{print $2}'
10.0.0.29
[root@vm10-0-0-29 ~]# vim ip.sh
#!/bin/bash
i=`ifconfig | awk 'NR==2{print $2}'`
echo "当前系统IP为:$i"
[root@vm10-0-0-29 ~]# sh ip.sh
当前系统IP为:10.0.0.29
if条件测试语句
语法:
if 条件测试操作
then 命令序列
fi
if单分支语句例子:
if 如果目录不存在
then 创建该目录
fi
实战-测试目录是否存在
把/test/test目录赋值给变量DIR
-e测试文件是否存在,如果不存在则执行下面语句;注意[]两端的缩进
vim mktest.sh
#!/bin/bash
DIR="/test/test"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
if双分支语句
语法:
if 条件测试操作
then 执行命令序列1
else 执行命令序列2
fi
if双分支语句例子
if 服务器能ping通
then
echo "服务器在线"
else
echo "服务器不在线"
fi
实战-测试主机是否在线
-c指定次数,-i指定间隔时间,-w指定超时时间,$1调用终端输入的位置参数,&> /dev/null是返回值重定向到空设备
[root@vm10-0-0-29 ~]# ping -c 3 -i 1 -w 6 baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=52 time=4.25 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=52 time=4.20 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=52 time=4.19 ms
[root@vm10-0-0-29 ~]# vim chkhost.sh
#!/bin/bash
ping -c 3 -i 1 -w 6 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is on-line."
else
echo "Host $1 is off-line."
fi
[root@vm10-0-0-29 ~]# sh chkhost.sh baidu.com
Host baidu.com is on-line.
[root@vm10-0-0-29 ~]# sh chkhost.sh 10.72.42.1
Host 10.72.42.1 is off-line.
if多分支结构语句
语法:
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
if多分支语句例子
if 分数在85-100之间
then 成绩优秀
elif 分数在70-84之间
then 成绩合格
else
成绩不合格
fi
实战-成绩评级
read -p读取并提示用户输入相应的信息
-ge大于或等于,-le小于或等于
[root@vm10-0-0-29 ~]# read -p "please enter you score (0-100):"
please enter you score (0-100):
[root@vm10-0-0-29 ~]# vim chkscore.sh
#!/bin/bash
read -p "Please Enter you score (0-100):" score #score的前面有个空格
if [ $score -ge 85 ] && [ $score -le 100 ]
then echo "成绩优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then echo "成绩合格"
else
echo "成绩不合格"
fi
[root@vm10-0-0-29 ~]# sh chkscore.sh
Please Enter you score (0-100):20
成绩不合格
[root@vm10-0-0-29 ~]# sh chkscore.sh
Please Enter you score (0-100):86
成绩优秀
[root@vm10-0-0-29 ~]# sh chkscore.sh
Please Enter you score (0-100):72
成绩合格
[root@vm10-0-0-29 ~]# sh chkscore.sh
Please Enter you score (0-100):101
成绩不合格
for循环语句
语法:
for 变量名 in 取值列表
do
命令序列
done
for循环例子
for 用户名 in 列表文件
do
创建用户并设置密码
done
实战-批量创建用户
创建用户文件
[root@vm10-0-0-29 ~]# cat users.txt
zhangs
an
lisi
wangwu
andy
wjl
read -p提示用户按要求输入信息,id uname检测用户id是否存在,passwd --stdin uname设置用户密码
[root@vm10-0-0-29 ~]# vim useradd.sh
#!/bin/bash
read -p "Please Enter the users Password:" passwd
for uname in `cat users.txt`
do
id $uname &> /dev/null
if [ $? -eq 0 ]
then
echo "$uname用户已存在"
else
useradd $uname &> /dev/null
echo "$passwd" | passwd --stdin $uname &>/dev/null
if [ $? -eq 0 ]
then
echo "$uname create success"
else
echo "$uname create failed"
fi
fi
done
创建用户wjl
[root@vm10-0-0-29 ~]# useradd wjl
[root@vm10-0-0-29 ~]# passwd wjl
Changing password for user wjl.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
脚本执行效果
[root@vm10-0-0-29 ~]# sh useradd.sh
Please Enter the users Password:zaqxsw
zhangs create success
an create success
lisi create success
wangwu create success
andy create success
wjl用户已存在
[root@vm10-0-0-29 ~]# tail -6 /etc/passwd
wjl:x:1000:1000::/home/wjl:/bin/bash
zhangs:x:1001:1001::/home/zhangs:/bin/bash
an:x:1002:1002::/home/an:/bin/bash
lisi:x:1003:1003::/home/lisi:/bin/bash
wangwu:x:1004:1004::/home/wangwu:/bin/bash
andy:x:1005:1005::/home/andy:/bin/bash
实战批量测试IP是否在线
创建IP文件
[root@vm10-0-0-29 ~]# cat test-ip-on-line.txt
baidu.com
114.114.114.114
8.8.8.8
10.72.42.1
编写脚本测试效果
-w超时时间不能低于执行-c次数时间,可以设置大一点
[root@vm10-0-0-29 ~]# vim test-ip-on-line.sh
#!/bin/bash
#iplist=$(cat /root/test-ip-on-line.txt)
iplist=`cat /root/test-ip-on-line.txt`
for ip in $iplist
do
ping -c 3 -w 6 $ip &> /dev/null
if [ $? -eq 0 ] ; then
echo "$ip is on line"
else
echo "$ip is not on line"
fi
done
[root@vm10-0-0-29 ~]# sh test-ip-on-line.sh
baidu.com is on line
114.114.114.114 is on line
8.8.8.8 is on line
10.72.42.1 is not on line
case条件测试语句
省略号位置可以继续匹配
*代表不在匹配模式内,就执行默认命令序列
语法:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
......
*)
默认命令序列
esac
case例子
case 输入字符 in
[a-z] | [A-Z])
提示为字母。
;;
[0-9])
提示为数字。
;;
......
*)
提示为特殊字符
esac
case实战
[root@vm10-0-0-29 ~]# vim tishi.sh
#!/bin/bash
read -p "请输入一个字符,并按回车键确认:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "你输入的是字母。"
;;
[0-9])
echo "你输入的是数字。"
;;
*)
echo "你输入的是功能键、空格或其他特殊字符。"
esac
执行效果
[root@vm10-0-0-29 ~]# sh tishi.sh
请输入一个字符,并按回车键确认:1
你输入的是数字。
[root@vm10-0-0-29 ~]# sh tishi.sh
请输入一个字符,并按回车键确认:a
你输入的是字母。
[root@vm10-0-0-29 ~]# sh tishi.sh
请输入一个字符,并按回车键确认:/
你输入的是功能键、空格或其他特殊字符。
计划任务
一次性计划任务
长期性计划任务
at一次性计划任务
语法1: at 时间回车,输入指令后,ctrl+d结束编写计划
语法2: echo"需要执行的指令" | at 时间
一次性计划任务文件存放在/var/spool/at/a开头的文件
at -l #查看还未执行的一次性计划任务
atrm 任务序号 #删除对应序号的计划任务
at -c 任务序号 #查看任务的具体内容
[root@vm10-0-0-29 ~]# echo "systemctl restart sshd" | at 23:00
job 1 at Fri Jul 17 23:00:00 2020
[root@vm10-0-0-29 ~]# at -l
1 Fri Jul 17 23:00:00 2020 a root
[root@vm10-0-0-29 ~]# echo "reboot" | at 23:10
job 2 at Fri Jul 17 23:10:00 2020
[root@vm10-0-0-29 ~]# at -l
1 Fri Jul 17 23:00:00 2020 a root
2 Fri Jul 17 23:10:00 2020 a root
[root@vm10-0-0-29 ~]# at 23:20
at> reboot
at> <EOT>
job 3 at Fri Jul 17 23:20:00 2020
[root@vm10-0-0-29 ~]# at -l
1 Fri Jul 17 23:00:00 2020 a root
3 Fri Jul 17 23:20:00 2020 a root
2 Fri Jul 17 23:10:00 2020 a root
一次性计划任务权限管理
/etc/at.deny:只有该名单里面的人不可以使用
/etc/at.allow:只有该名单里面的人可以使用
周期性计划任务
添加周期性计划任务
echo "command" /etc/crontab
或
vim /etc/crontab
分 取值为 0~59 的整数
时 取值为 0~23 的任意整数
日 取值为 1~31 的任意整数
月 取值为 1~12 的任意整数
周 取值为 0~7 的任意整数,其中 0 与 7 均为星期日
命令 要执行的命令或程序脚本
(,)逗号表示多个时间段执行
(-)减号表示一段连续的时间周期
(/)除号表示执行任务的间隔时间
分的位置不能为空或者※号,可以写0
日和周不能同时为※号,否则会发生冲突,日可以写*号,周可以写1-7
用户身份与文件权限
用户分类
UID为0:系统管理员用户
UID为1-999:系统用户,默认的服务程序会有独立的系统用户负责运行,避免遭破坏
UID>=100:普通用户,由管理员创建,用于日常工作
useradd创建用户
-D 改变新建用户的预设值
-c 添加备注文字
-d 新用户每次登陆时所使用的家目录
-e 用户终止日期,日期的格式为YYYY-MM-DD
-f 用户过期几日后永久停权。当值为0时用户立即被停权,而值为-1时则关闭此功能,预设值为-1
-g 指定用户对应的用户组,必须已存在
-G 定义此用户为多个不同组的成员
-m 用户目录不存在时则自动创建
-M 不建立用户家目录,优先于/etc/login.defs文件设定
-n 取消建立以用户名称为名的群组
-r 建立系统帐号
-u 指定用户uid
#不创建家目录,并且禁止登陆
[root@localhost ~]#useradd -M -s /sbin/nologin linuxcool
#添加新用户linuxcool,指定UID为888,指定归属用户组为root,cool成员,其
[root@localhost ~]#useradd -u 888 -s /bin/sh -G root,cool shell类型为/bin/sh linuxcool
#添加新用户linuxcool,设置家目录为/tmp/linuxcool,用户过期时间为2019/05/01.过期后两天停权
[root@localhost ~]#useradd -e "2019/05/01" -f 2 -d /tmp/linuxcool linuxcool
groupadd创建用户组
语法:groupadd 组名
usermod修改用户属性
-c 填写用户账户的备注信息
-d -m 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为 YYYY-MM-DD
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的 UID
passwd修改用户密码
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
--stdin 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username
-d 使该用户可用空密码登录系统
-e 强制用户在下次登录时修改密码
-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称
userdel删除用户
-f 强制删除用户
-r 同时删除用户及用户家目录
文件权限与归属
-:普通文件。d:目录文件。l:链接文件。b:块设备文件。c:字符设备文件。p:管道文件
修改文件权限语法:chmod 参数 filename
文件权限的字符与数字表示
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
权限分配 文件所有者 文件所属组 其他用户
权限项 读 写 执行 读 写 执行 读 写 执行
字符表示 r w x r w x r w x
数字表示 4 2 1 4 2 1 4 2 1
[root@vm10-0-0-29 ~]# ls -l chkscore.sh
-rw-r--r-- 1 root root 234 Jul 16 15:12 chkscore.sh
最前面的(-减号)是文件类型,后者rw是文件的访问权限
第二个r所属组的权限
第三个r其他用户的权限
第一个root是文件所属者
第二个root是文件所属组
占用磁盘大小234字节
最后一次修改时间是Jul 16 15:12
文件名是chkscore.sh
语法:
chmod u/g/o/a +/- r/w/x file/directory
文件基本权限
chgrp:更改文件属组
语法:
chgrp -R 属组名 文件名
chown:更改文件属主,也可以同时更改文件属组
语法:
chown --R 属主名 文件名
chown -R 属主名:属组名 文件名
文件的特殊权限
SUID SGID SBIT
suid特殊权限
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主权限(仅对拥有执行权限的二进制程序有效);
所属者有文件rwx权限的时候,如果给了suid特殊权限,那么就会变为rws,是小s;
当所属者只有有文件rw权限,这时给suid特殊权限,文件就会变为rwS,是大S
添加suid特殊权限
[root@localhost ~]# ll 1.txt
-rw-r--r--. 1 root root 6056 7月 20 15:06 1.txt
[root@localhost ~]#
[root@localhost ~]# chmod u+s 1.txt
[root@localhost ~]#
[root@localhost ~]# ll 1.txt
-rwSr--r--. 1 root root 6056 7月 20 15:06 1.txt
减去suid特殊权限
[root@localhost ~]# chmod u-s 1.txt
[root@localhost ~]# ll 1.txt
-rw-r--r--. 1 root root 6056 7月 20 15:06 1.txt
[root@localhost ~]#
[root@localhost ~]# chmod 4600 1.txt #4表示特殊权限s位
[root@localhost ~]#
[root@localhost ~]# ll 1.txt
-rwS------. 1 root root 6056 7月 20 15:06 1.txt
sgid特殊权限
让执行者临时拥有属组执行权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置);
添加sgid特殊权限
[root@localhost ~]# ls -ald check-port/
drwxr--r--. 2 root root 54 7月 20 15:06 check-port/
[root@localhost ~]#
[root@localhost ~]# chmod g+s check-port/ #添加sgid权限
[root@localhost ~]#
[root@localhost ~]# ls -ald check-port/
drwxr-Sr--. 2 root root 54 7月 20 15:06 check-port/
[root@localhost ~]#
[root@localhost ~]# chmod g-s check-port/ #取消sgid权限
[root@localhost ~]#
[root@localhost ~]# ls -ald check-port/
drwxr--r--. 2 root root 54 7月 20 15:06 check-port/
[root@localhost ~]#
[root@localhost ~]# chmod 2744 check-port/ #2代表sgid特殊权限位
[root@localhost ~]#
[root@localhost ~]# ls -ald check-port/
drwxr-Sr--. 2 root root 54 7月 20 15:06 check-port/
特殊权限SBIT
当目录被设置 SBIT 特殊权限位后,原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成 T;
SBIT 特殊权限位可确保用户只能删除自己的文件,而
不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了;
因此除非是该目录的所有者,否则无法删除这里面的文件;
把一个文件夹的权限都打开,然后共享文件,像/tmp一样,但是 生产环境一般不使用
[root@localhost ~]# ls -ald check-port/
drwxr--r--. 2 root root 54 7月 20 15:06 check-port/
[root@localhost ~]#
[root@localhost ~]# chmod o+t check-port/ #添加sbit特殊权限
[root@localhost ~]#
[root@localhost ~]# ls -ald check-port/
drwxr--r-T. 2 root root 54 7月 20 15:06 check-port/
[root@localhost ~]#
[root@localhost ~]# chmod o-t check-port/ #取消sbit特殊权限
[root@localhost ~]# ls -ald check-port/
drwxr--r--. 2 root root 54 7月 20 15:06 check-port/
[root@localhost ~]#
[root@localhost ~]# chmod 1744 check-port/ #1代表sbit特殊权限位
[root@localhost ~]# ls -ald check-port/
drwxr--r-T. 2 root root 54 7月 20 15:06 check-port/
文件的隐藏属性
linux系统中的文件除了具备一般权限和特殊权限外,还有一种隐藏权限,默认情况下不能被用户直接发觉
chattr设置文件隐藏权限无法删除文件
语法:
chattr 参数 对象
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而 不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用 dump 命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
X 可以直接访问压缩文件中的内容
[root@localhost ~]# ll 1.txt
-rw-------. 1 root root 6056 7月 20 15:06 1.txt
[root@localhost ~]# chattr +a 1.txt #添加隐藏权限a
[root@localhost ~]# rm -rf 1.txt
rm: 无法删除"1.txt": 不允许的操作
lsattr查看隐藏文件
[root@localhost ~]# lsattr 1.txt #查看文件的隐藏权限
-----a---------- 1.txt
[root@localhost ~]# chattr -a 1.txt #取消隐藏权限a
[root@localhost ~]# lsattr 1.txt
---------------- 1.txt
[root@localhost ~]# rm -rf 1.txt
[root@localhost ~]# echo $?
0
文件访问控制列表
linux系统,一般权限、特殊权限、隐藏权限是针对某一类用户设置的,如果希望对指定用户进行单独的权限控制,就需要用到文件访问控制列表ACL;
ACL是针对用户或用户组或目录的操作权限
setfacl设置文件访问控制权限
语法:
setfacl 参数 文件名称
-R #是针对目录文件需要使用的递归参数;
-m #针对普通文件使用-m参数;
-b #删除某个文件的ACL
[root@localhost ~]# useradd test
[root@localhost ~]# passwd test
更改用户 test 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#
[root@localhost ~]# setfacl -Rm u:test:rw /root/ #授权test用户对root目录的读写权限
[root@localhost ~]# su test
[test@localhost root]$ cd /root/
bash: cd: /root/: 权限不够
[test@localhost root]$ exit
exit
[root@localhost ~]# setfacl -Rm u:test:rwx /root/ #授权读写执行权限
[root@localhost ~]# su test
[test@localhost root]$ cd /root/ #验证可以访问了
getfacl显示文件上设置的ACL信息
[test@localhost root]$ getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:test:rwx
group::r-x
mask::rwx
other::---
umask值
对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减去umask(umask的各个位数字也不能大于6,如,077就不符合条件)的掩码数值;重点在接下来的内容,如果umask的部分位或全部位为奇数,那么,在对应为奇数的文件权限位计算结果分别再加1就是最终文件权限值。
案例一、目录umask值测试计算:
777-umask值=真实目录权限
[root@localhost ~]# umask #查看当前umask值
0022
[root@localhost ~]# umask 044 #更改umask值未044
[root@localhost ~]# mkdir umask_test #创建测试目录
[root@localhost ~]# ls -ld umask_test #查看目录权限
drwx-wx-wx 2 root root 6 7月 3 09:56 umask_test
# 777-044=733,所以umask_test目录权限为733
案例二、umask值为全偶数或部分位是偶数文件权限计算方法:
666-umask值=文件真实权限
1)假设umask值为:044(所有位为偶数)
666 ==>文件的起始权限值
044 - ==>umask的值
---------
622==>真实文件权限
例子:
[root@localhost ~]# umask #查看当前umask值
0044
[root@localhost ~]# touch umask_test.txt #创建测试文件
[root@localhost ~]# ls -l umask_test.txt #查看测试文件权限
-rw--w--w- 1 root root 0 7月 3 10:03 umask_test.txt
#666-044=622,所以umask_test.txt文件权限为622
案例三、umask值为全奇数或部分是奇数文件权限的计算方法
666-umask值+001=文件真实权限
2)假设umask值为:045(其他用户组位为奇数)
666 ==>文件的起始权限值
045 - ==>umask的值
---------
621 ==>计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
001 +
---------
622 ==>真实文件权限
例子:
[root@localhost ~]# umask 045 #改umask值为045
[root@localhost ~]# touch umask_test1.txt #创建测试文件
[root@localhost ~]# ls -l umask_test1.txt #查看文件权限
-rw--w--w- 1 root root 0 7月 3 10:25 umask_test1.txt
666-045+001=622,所以umask_test1.txt文件权限为622
sudo对用户操作权限管理
限制用户执行指定的命令;
记录用户执行的每一条指令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码
通过sudo可以提高普通用户的操作权限
更改文件后,会自动检测语法,配置错误会有提示信息
语法:
sudo 参数 命令名称
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或 UID 值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语
查看系统某个命令文件在哪
[root@localhost ~]# which setfacl
/usr/bin/setfacl
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
[root@localhost ~]# which cd
/usr/bin/cd
[root@localhost ~]# which touch
/usr/bin/touch
[root@localhost ~]# which nmap
/usr/bin/nmap
sudo授权test用户
[root@localhost ~]# whoami
root
[root@localhost ~]# su test
[test@localhost root]$ pwd
/root
[test@localhost root]$ ls
ls: 无法打开目录.: 权限不够
[test@localhost root]$ exit
exit
[root@localhost ~]#
授权test用户
[root@localhost ~]# visudo
#找到以下位置,在下面增加test的权限,保存退出
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
test localhost= /usr/bin/ls
test添加sudo ls权限之后再测试
[root@localhost ~]# su test
[test@localhost root]$ pwd
/root
[test@localhost root]$ ls
ls: 无法打开目录.: 权限不够
[test@localhost root]$ sudo ls
[sudo] test 的密码:
1.txt anaconda-ks.cfg check-port #已查到文件
[test@localhost root]$ exit
exit
[root@localhost ~]#
取消输入密码
[test@localhost root]$ visudo
把test用户授权信息改为,增加NOPASSWD,注意后面有:之后保存退出
test localhost=NOPASSWD: /usr/bin/ls
之后测试
#就不需要密码了
[test@localhost root]$ pwd
/root
[test@localhost root]$ sudo ls
1.txt anaconda-ks.cfg check-port
查看sudo日志记录
touch /var/log/sudo
[root@localhost ~]# find / -name syslog.conf
/etc/audisp/plugins.d/syslog.conf
/usr/share/doc/sudo-1.8.19p2/examples/syslog.conf
#找到,日志存放路径
auth.debug /var/log/auth
存储结构与磁盘规划
Linux 系统中常见的目录名称以及相应内容
/boot 开机所需文件 --- 内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户家目录
/bin 存放单用户模式下还可以操作的命令
/lib 开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的"共享"临时目录
/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux 系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里
常见的硬件设备及其文件名称
IDE 设备 /dev/hd[a-d]
SCSI/SATA/U 盘 /dev/sd[a-p]
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0 或/dev/ht0
磁盘的划分
1、/dev/sda等这些编号是是有系统内核识别决定的,而不是由物理机的插槽来决定的;
2、/dev/sd*存储设备的编号,有可能是手工指定的,也有可能是按照顺序顺延下来的
磁盘的设备是由大量的扇区组成,每个扇区的容量为512字节,第一个扇区最重要,里面存着主引导记录和分区信息,主引导记录占用446字节,分区表信息占用64字节,结束符占用2个字节,总共512字节;
分区中每记录一个分区信息就需要16字节,一个扇区最多可以写4个分区信息,4个分区一般分为3个主分区,一个扩展分区,当分区不够用的时候就用扩展分区创建数个逻辑分区,这样就能解决分区不够用的现象。
文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
常见的文件系统:
ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误
ext4:Ext3 的改进版本,作为 RHEL 6 系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系统能够批量分配 block 块,从而极大地提高了读写效率
xfs:是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的
优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的
日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB
内核中的VFS
vfs虚拟文件系统:linux内核中的软件层为用户提供vfs虚拟文件系统接口,为了使用户在读取或写入文件时不用关心底层的磁盘结构;当用在操作文件时就是操作vfs系统;
VFS示意图:
用户进程 ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←用户界面
↓
系统调用界面 ←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓ ↓
虚拟文件系统(VFS) ↓
ext3、ext4、xfs、ntfs、Dos FS、minix ←←←←←←←←内核层
↓ ↑
缓存 ↑
↓ ↑
系统驱动程序 ←←←←←←←←←←←←←←←←←←←←←←←←←←←←
↓
硬盘设备控制器 ←←←←←←←←←←←←←←←←←←←←←←←←硬件层
mount挂在硬件设备
-a 挂载所有在/etc/fstab 中定义的文件系统
-t 指定文件系统的类型
umount取消已经挂载的文件设备
fdisk磁盘管理命令
在linux系统中,fdisk是磁盘管理工具;提供了添加,删除,转换分区等功能;
fdisk参数及作用
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区类型
t 改变某个分区的类型
p 查看分区信息
w 保存并退出
q 不保存直接退出
fdisk磁盘分区
语法:
fdisk 磁盘名称
如:
fdisk /dev/sda
fdisk给新磁盘分区及使用
需要添加一块新磁盘
[root@localhost ~]# fdisk /dev/sdb
命令(输入 m 获取帮助):p #打印当前磁盘分区信息
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xcf28b7bc
设备 Boot Start End Blocks Id System
命令(输入 m 获取帮助):n #新建分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1): #默认分区编号
起始 扇区 (2048-41943039,默认为 2048): #默认起始扇区大小。回车就好
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039): #这里默认给了所有的容量
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):p #再次查看分区信息
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xcf28b7bc
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 83 Linux
命令(输入 m 获取帮助):w #保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
partprobe同步磁盘分区信息
查看是否同步ok
[root@localhost ~]# file /dev/sdb1
/dev/sdb1: cannot open (No such file or directory) #系统没有自动同步给内核;如果同步成功则不用执行下面同步指令
[root@localhost ~]# partprobe #同步分区信息
[root@localhost ~]# file /dev/sdb1 #再次查看文件属性
/dev/sdb1: block special
mkfs格式化新分区
格式化之前先查看文件系统类型,这里是xfs
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda5 xfs 98G 1.5G 96G 2% /
devtmpfs devtmpfs 981M 0 981M 0% /dev
tmpfs tmpfs 992M 0 992M 0% /dev/shm
tmpfs tmpfs 992M 9.6M 982M 1% /run
tmpfs tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sda2 xfs 997M 124M 874M 13% /boot
tmpfs tmpfs 199M 0 199M 0% /run/user/0
在 Shell 终端中输入 mkfs 名后再敲击两下用于补齐命令的 Tab键,会有如下所示的效果
[root@localhost ~]# mkfs
mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs
mkfs.xfs执行格式化操作
[root@localhost ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
创建新目录,挂在新分区,即可使用
[root@localhost ~]# mkdir -p /mnt/newsdb1
[root@localhost ~]# mount /dev/sdb1 /mnt/newsdb1/
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda5 98G 1.5G 96G 2% /
devtmpfs 981M 0 981M 0% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 992M 9.6M 982M 1% /run
tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sda2 997M 124M 874M 13% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb1 20G 33M 20G 1% /mnt/newsdb1
把设备文件加入fstab永久有效,防止重启之后失效
[root@localhost ~]# cat /etc/fstab | tail -1
/dev/sdb1 /mnt/newsdb1 xfs defaults 0 0
添加交换分区
swap交换分区,是在硬盘中预先规划一定的空间,然后将内存中暂时不常用的数据临时存放到硬盘中,腾出空间让更活跃的程序使用内存,解决物理内存不足的问题
由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
在生产环境中,交换分区一般为物理内存的1.5~2倍。
交换分区的创建过程与前文的挂载并使用存储设备的过程非常相似。
[root@localhost ~]# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 /dev/sda5 /dev/sdb /dev/sdb1 /dev/sdc
[root@localhost ~]# fdisk /dev/sdc
[root@localhost ~]# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x85e34af1 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+4M #前面有个+号,不然会失败
分区 1 已设置为 Linux 类型,大小设为 4 MiB
命令(输入 m 获取帮助):p
磁盘 /dev/sdc:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x85e34af1
设备 Boot Start End Blocks Id System
/dev/sdc1 2048 10239 4096 83 Linux
[root@localhost ~]# ls /dev/sdc*
/dev/sdc /dev/sdc1
mkswap格式化新分区为交换分区
[root@localhost ~]# mkswap /dev/sdc1
正在设置交换空间版本 1,大小 = 4092 KiB
无标签,UUID=58c89997-ba3e-492f-bc1d-23e7b4fbaa28
开机自动挂载使用
[root@localhost ~]# cat /etc/fstab | tail -1
/dev/sdc1 swap swap defaults 0 0
磁盘容量配额
安装工具
yum -y install quota
软限制:当达到软限制值时会提示用户,但仍允许用户在限定额度内继续使用;
应限制:当达到应限制值是会提示用户,且强制执行用户的操作
对boot目录开启配额:
[root@localhost ~]# cat /etc/fstab | grep sdb1
/dev/sdb1 /mnt/newsdb1 xfs defaults,uquota 0 0 #在defaults加上uquota用逗号隔开
重启系统
[root@localhost ~]# reboot
[root@localhost ~]# mount | grep sdb1
/dev/sdb1 on /mnt/newsdb1 type xfs (rw,relatime,attr2,inode64,usrquota)
授权用户检查磁盘容量
[root@localhost ~]# chmod -Rf o+w /mnt/newsdb1/
xfs_quota管理文件系统
[root@localhost ~]# xfs_quota -x -c 'limit bsoft=300m bhard=600m isoft=3 ihard=6 test' /mnt/newsdb1/
-x参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置;
-c 参数用于以参数的形式设置要执行的命令:
bsoft=300m:磁盘用量的软限制300MB;
bhard=600m:磁盘用量的硬限制600MB;
创建文件数量的软限制和硬限制分别为3个和6个;
test:是一个用户;
/mnt/newsdb1/:限制用量文件系统的名称
查看配额及限制信息
[root@localhost ~]# xfs_quota -x -c report /mnt/newsdb1/
User quota on /mnt/newsdb1 (/dev/sdb1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 0 0 0 00 [--------]
test 0 307200 614400 00 [--------]
配置好后,进入登录test用户进行dd测试
if:指定输出文件;of:指定输入文件;bs:指定大小;count:指定文件数
[root@localhost ~]# su - test
[test@localhost newsdb1]$ dd if=/dev/zero of=hhh bs=550M count=1
记录了1+0 的读入
记录了1+0 的写出
576716800字节(577 MB)已复制,0.322011 秒,1.8 GB/秒
[test@localhost newsdb1]$ du -sh hhh
550M hhh
[test@localhost newsdb1]$ dd if=/dev/zero of=hhh2 bs=51M count=1; #把zero文件内容输入51MB的数据到hhh2文件里
dd: 写入"hhh2" 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
51118080字节(51 MB)已复制,0.0210862 秒,2.4 GB/秒
edquota编辑管理配额限制
yum provides "*bin/edquota"
yum -y install quota
[root@localhost ~]# edquota -u test #加大对应参数即可。
Disk quotas for user test (uid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 613120 307200 614400 2 3 6
-u:设置用户的quota,这是预设的参数;
-g:设置群组的quota;
-p<源用户名称>:将源用户的quota设置套用至其他用户或群组;
-t:设置宽限期限。
软硬链接
硬链接(hard link):硬链接文件与原始文件其实是同一个文件,只是名字不同。
软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件
也将失效
ln创建链接文件
-s 创建"符号链接"(如果不带-s 参数,则默认创建硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程
创建软连接:ln -s 源文件 目标文件
创建硬链接:ln 源文件 目标文件
RAID与LVM磁盘阵列技术
RAID阵列
raid的三个关键技术:
1、大容量:能存储大数据;
2、高性能:读写速度快;
3、安全可靠:数据不易丢失。
常用的几种raid技术:raid0;raid1;raid5;raid6;raid10;raid50。
阵列类型 磁盘数量 利用空间 特性
raid0 2+ 100% 读写快,不容错
raid1 2 50% 读写快,容错
raid5 3+ (n-1)/n 读写快,容错,允许坏一块盘
raid6 4+ (n-2)/n 读写快,容错,允许坏2块盘
raid10 4 50% 读写快,容错,拥有raid0的高速和raid1的安全
raid50 6 (n-2)/n 读写快,容错,拥有raid0的高速和raid5的安全
实战raid10
添加4个磁盘做raid10;sdb、sdc、sdd、sde
[root@localhost ~]# ll /dev/sd*
brw-rw---- 1 root disk 8, 0 7月 23 18:04 /dev/sda
brw-rw---- 1 root disk 8, 1 7月 23 18:04 /dev/sda1
brw-rw---- 1 root disk 8, 2 7月 23 18:04 /dev/sda2
brw-rw---- 1 root disk 8, 3 7月 23 18:04 /dev/sda3
brw-rw---- 1 root disk 8, 4 7月 23 18:04 /dev/sda4
brw-rw---- 1 root disk 8, 5 7月 23 18:04 /dev/sda5
brw-rw---- 1 root disk 8, 16 7月 23 18:04 /dev/sdb
brw-rw---- 1 root disk 8, 32 7月 23 18:04 /dev/sdc
brw-rw---- 1 root disk 8, 48 7月 23 18:04 /dev/sdd
brw-rw---- 1 root disk 8, 64 7月 23 18:04 /dev/sde
mdadm阵列管理工具
-a 检测设备名称
-n 指定设备数量
-l 指定 RAID 级别
-C 创建,大C
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止 RAID 磁盘阵列
mdadm指令创建raid10名称为md0
[root@localhost ~]# yum -y install mdadm
[root@localhost ~]# mdadm -Cv /dev/md10 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
把制作好的md0格式化xfs文件系统
[root@localhost ~]# mkfs.xfs /dev/md10
meta-data=/dev/md0 isize=512 agcount=16, agsize=1637248 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26195968, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12792, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
创建md10挂在目录
[root@localhost ~]# mkdir /mnt/raid10
[root@localhost ~]# mount /dev/md10 /mnt/raid10/
[root@localhost ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 980M 0 980M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 9.6M 981M 1% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda5 xfs 48G 5.9G 42G 13% /
/dev/sda2 xfs 997M 152M 846M 16% /boot
tmpfs tmpfs 199M 0 199M 0% /run/user/0
/dev/md0 xfs 100G 33M 100G 1% /mnt/raid10
查看阵列信息
[root@localhost ~]# mdadm -D /dev/md10
/dev/md0:
Version : 1.2
Creation Time : Thu Jul 23 18:20:36 2020
Raid Level : raid10
Array Size : 104790016 (99.94 GiB 107.30 GB)
Used Dev Size : 52395008 (49.97 GiB 53.65 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Thu Jul 23 18:29:23 2020
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : ccad8231:1d6381ca:7dc4cfcf:aee53aeb
Events : 21
Number Major Minor RaidDevice State
0 8 16 0 active sync set-A /dev/sdb
1 8 32 1 active sync set-B /dev/sdc
2 8 48 2 active sync set-A /dev/sdd
3 8 64 3 active sync set-B /dev/sde
把阵列加入fstab文件,使其永久生效
[root@localhost ~]# echo "/dev/md10 /mnt/raid10/ xfs defaults 0 0" >> /etc/fstab
模拟磁盘损坏
-f:模拟设备故障
[root@localhost ~]# mdadm /dev/md10 -f /dev/sde
mdadm: set /dev/sde faulty in /dev/md10
[root@localhost ~]# mdadm -D /dev/md10
/dev/md10:
Version : 1.2
Creation Time : Fri Jul 24 17:04:12 2020
Raid Level : raid10
Array Size : 104790016 (99.94 GiB 107.30 GB)
Used Dev Size : 52395008 (49.97 GiB 53.65 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Jul 24 17:34:22 2020
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Consistency Policy : resync
Name : localhost.localdomain:10 (local to host localhost.localdomain)
UUID : 673c50b2:83956422:a1ac4f55:628a5b15
Events : 28
Number Major Minor RaidDevice State
0 8 16 0 active sync set-A /dev/sdb
1 8 32 1 active sync set-B /dev/sdc
2 8 48 2 active sync set-A /dev/sdd
- 0 0 3 removed
3 8 64 - faulty /dev/sde
重启系统再把/dev/sde磁盘添加的raid10中
[root@localhost ~]# umount /mnt/raid10
[root@localhost ~]# mdadm /dev/md10 -a /dev/sde
mdadm: added /dev/sde
[root@localhost ~]# mount /dev/md10 /mnt/raid10/
raid5+备份盘
创建raid5最少需要3块盘,还需要加1块备份盘,总计4块盘;
[root@localhost ~]# ls /dev/sd* | grep -v sda #查看磁盘数量
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
/dev/sdf
/dev/sdg
/dev/sdh
/dev/sdi
创建raid5+1块备份盘
-C:大C,创建;-v显示创建过程;md5:raid5的名称;-n指定磁盘数;-l:指定raid级别;-x:指定备份盘数量;
[root@localhost ~]# mdadm -Cv /dev/md5 -n 3 -l 5 -x 1 /dev/{sdf,sdg,sdh,sdi}
[root@localhost ~]# mdadm -D /dev/md5 #查看raid5的时候,可以看到有一块盘在等待中
将raid5格式化为xfs文件类型,挂载使用
[root@localhost ~]# mkfs.xfs /dev/md5
创建raid5挂载目录
[root@localhost ~]# mkdir /mnt/raid5
[root@localhost ~]# mount /dev/md5 /mnt/raid5/
[root@localhost ~]# echo "/dev/md5 /mnt/raid5/ xfs defaults 0 0" >> /etc/fstab
[root@localhost ~]# cat /etc/fstab
模拟故障盘,重启系统之后,使用-a参数加入阵列就好
[root@localhost ~]# mdadm /dev/md5 -f /dev/sdf #-f 故障模拟
mdadm: set /dev/sdf faulty in /dev/md5
[root@localhost ~]# mdadm -D /dev/md5 #再次查看,sdi盘自动加入raid5了
/dev/md5:
Version : 1.2
Creation Time : Fri Jul 31 09:05:37 2020
Raid Level : raid5
Array Size : 104790016 (99.94 GiB 107.30 GB)
Used Dev Size : 52395008 (49.97 GiB 53.65 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Jul 31 09:18:46 2020
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Rebuild Status : 5% complete
Name : localhost.localdomain:5 (local to host localhost.localdomain)
UUID : 02301a69:928ee66b:cb5da017:1580ba25
Events : 20
Number Major Minor RaidDevice State
3 8 128 0 spare rebuilding /dev/sdi
1 8 96 1 active sync /dev/sdg
4 8 112 2 active sync /dev/sdh
0 8 80 - faulty /dev/sdf
硬raid需要把新硬盘加到hot spare或global hot spare组,分别是只能某个阵列用的热备盘和全局热备盘
LVM(逻辑卷管理器)
LVM允许用户对硬盘资源进行动态调整;传统的硬盘分区进行强制扩容或缩容是可行的,但可能会对数据造成丢失;而LVM是在硬盘和文件系统之间加了一个逻辑层,提供了一块抽象的卷组,可以把多块磁盘进行卷组合并;这样就可以实现对硬盘分区的动态调整。
LVM架构图
文件 mkfs.xfs 格式化挂载使用 文件层
↑ ↑ ↑ ↑
LV lvcreate 创建逻辑卷 LVM层
↑ ↑ ↑ ↑
VG vgcreate 创建卷组 LVM层
↑ ↑ ↑ ↑
sdb sde pvcreate 创建物理卷 物理层
LVM相关操作命令
功能/命令 物理卷管理 卷组管理 逻辑卷管理
扫描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
显示 pvdisplay/pvs vgdispaly/vgs lvdispaly/lvs
删除 pvremove vgremove lvremove
扩展 vgextend lvextentd
缩小 vgreduce lvreduce
LVM部署步骤
1、添加两块磁盘支持LVM
[jms-wjl@localhost ~]$ ls /dev/{sdj,sdk}
/dev/sdj /dev/sdk
2、创建物理卷
[root@localhost ~]# pvcreate /dev/{sdj,sdk}
Physical volume "/dev/sdj" successfully created.
Physical volume "/dev/sdk" successfully created.
3、创建卷组storage,并把两块磁盘加入到卷组中
[root@localhost ~]# pvcreate /dev/{sdj,sdk}
Physical volume "/dev/sdj" successfully created.
Physical volume "/dev/sdk" successfully created.
[root@localhost ~]# vgcreate storage /dev/{sdj,sdk}
Volume group "storage" successfully created
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name storage
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 59.99 GiB
PE Size 4.00 MiB
Total PE 15358
Alloc PE / Size 0 / 0
Free PE / Size 15358 / 59.99 GiB
VG UUID N5l6ms-eryp-V1Vm-TT1q-tI0E-BitA-xxkw7a
4、创建500M的逻辑卷,名为lv1
-n执行逻辑卷名称;-l以基本单元个数为单位,默认为4M;-L以容量为单位,指定容量大小及单位
[root@localhost ~]# lvcreate -n lv1 -L 500M storage
Logical volume "lv1" created.
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/storage/lv1
LV Name lv1
VG Name storage
LV UUID 2Vlj0X-zbE0-fC65-tr7B-aK1E-yZwR-JrX3PJ
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2020-08-03 10:07:33 +0800
LV Status available
# open 0
LV Size 500.00 MiB
Current LE 125
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
5、格式化逻辑卷,挂载使用
[root@localhost ~]# mkf
mkfifo mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.xfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.minix
[root@localhost ~]# mkfs.xfs /dev/storage/lv1
meta-data=/dev/storage/lv1 isize=512 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mkdir /mnt/lv1
[root@localhost ~]# mount /dev/storage/lv1 /mnt/lv1/
[root@localhost ~]# df -TH
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.1G 0 1.1G 0% /dev
tmpfs tmpfs 1.1G 0 1.1G 0% /dev/shm
tmpfs tmpfs 1.1G 11M 1.1G 1% /run
tmpfs tmpfs 1.1G 0 1.1G 0% /sys/fs/cgroup
/dev/sda5 xfs 51G 6.2G 45G 13% /
/dev/md5 xfs 108G 35M 108G 1% /mnt/raid5
/dev/md10 xfs 108G 35M 108G 1% /mnt/raid10
/dev/sda2 xfs 1.1G 159M 887M 16% /boot
tmpfs tmpfs 208M 0 208M 0% /run/user/1000
/dev/mapper/storage-lv1 xfs 521M 27M 495M 6% /mnt/lv1
[root@localhost ~]# echo "/dev/storage/lv1 /mnt/lv1/ xfs defaults 0 0" >> /etc/fstab
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue May 12 08:48:55 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=a3940110-a6f1-4799-b2c2-cd627ff9b9e2 / xfs defaults 0 0
UUID=5c3a9d67-9f07-4a8c-97f0-eb254eb5f4e7 /boot xfs defaults 0 0
UUID=0f294586-76b1-4999-8254-d19d0971e7dd swap swap defaults 0 0
/dev/md10 /mnt/raid10/ xfs defaults 0 0
/dev/md5 /mnt/raid5/ xfs defaults 0 0
/dev/storage/lv1 /mnt/lv1/ xfs defaults 0 0
扩容逻辑卷
需求扩容lv1逻辑卷至1200M,xfs扩容不用取消挂载
1、lvextend逻辑卷扩容指令
[root@localhost ~]# lvextend -L 1200M /dev/storage/lv1
Size of logical volume storage/lv1 changed from 500.00 MiB (125 extents) to 1000.00 MiB (250 exten
ts).
Logical volume storage/lv1 successfully resized.
2、xfs文件系统扩容之后调整分区
resize2fs /dev/storage/lv1 #centos6.x调整分区命令
xfs_growfs /dev/storage/lv1 #centos7.x调整分区命令
[root@localhost ~]# xfs_growfs /dev/storage/lv1
meta-data=/dev/mapper/storage-lv1 isize=512 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 128000 to 307200
4、查看验证,是否扩容成功
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda5 48G 5.8G 42G 13% /
/dev/md5 100G 33M 100G 1% /mnt/raid5
/dev/md10 100G 33M 100G 1% /mnt/raid10
/dev/sda2 997M 152M 846M 16% /boot
tmpfs 199M 0 199M 0% /run/user/1000
/dev/mapper/storage-lv1 1.2G 26M 1.2G 3% /mnt/lv1
逻辑卷缩容
1、缩容前先备份文件
2、取消挂载
[root@localhost ~]# umount /mnt/lv1
3、lvreduce逻辑卷缩容指令
[root@localhost ~]# lvreduce -L 800M /dev/storage/lv1
WARNING: Reducing active and open logical volume to 800.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage/lv1? [y/n]: y
Size of logical volume storage/lv1 changed from 1.17 GiB (300 extents) to 800.00 MiB (200 extents).
Logical volume storage/lv1 successfully resized.
4、-f 重新强制格式化
[root@localhost ~]# mkfs.xfs -f /dev/storage/lv1
meta-data=/dev/storage/lv1 isize=512 agcount=4, agsize=51200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=204800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
5、挂载使用
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda5 48G 5.8G 42G 13% /
/dev/md10 100G 33M 100G 1% /mnt/raid10
/dev/md5 100G 33M 100G 1% /mnt/raid5
/dev/sda2 997M 152M 846M 16% /boot
tmpfs 199M 0 199M 0% /run/user/1000
/dev/mapper/storage-lv1 797M 33M 765M 5% /mnt/lv1
创建逻辑卷快照
1、创建文件1.txt
[root@localhost ~]# echo "www.medevops.com" > /mnt/lv1/1.txt
[root@localhost ~]# ll /mnt/lv1/1.txt
-rw-r--r-- 1 root root 17 8月 3 13:53 /mnt/lv1/1.txt
2、创建逻辑卷快照
-L 指定大小;-s 生成快照;-n 命名
[root@localhost ~]# ls /dev/storage/lv1
/dev/storage/lv1
[root@localhost ~]# lvcreate -L 800 -s -n lv1-snap /dev/storage/lv1
Logical volume "lv1-snap" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 storage owi-aos--- 800.00m
lv1-snap storage swi-a-s--- 800.00m lv1 0.00
[root@localhost ~]# ls /dev/storage/
lv1 lv1-snap
恢复快照
恢复快照前,要先取消逻辑卷与目录的挂载
[root@localhost ~]# umount /mnt/lv1
[root@localhost ~]# lvconvert --merge /dev/storage/lv1-snap
删除快照
[root@localhost ~]# lvremove /dev/storage/lv1-bak
Do you really want to remove active logical volume storage/lv1-bak? [y/n]: y
Logical volume "lv1-bak" successfully removed
删除逻辑卷、卷组、物理卷
1、先清除/etc/fstab文件对逻辑卷的配置项
[root@localhost ~]# cat /etc/fstab | tail -1
/dev/storage/lv1 /mnt/lv1/ xfs defaults 0 0
2、删除逻辑卷设备
[root@localhost ~]# lvremove /dev/storage/lv1
Do you really want to remove active logical volume lv1? [y/n]: y
Logical volume "lv1" successfully removed
3、删除卷组
[root@localhost ~]# vgremove storage
Volume group "storage" successfully removed
4、删除物理卷
[root@localhost ~]# pvremove /dev/sd
/dev/sdj /dev/sdk
[root@localhost ~]# pvremove /dev/sd*
iptables与firewalld防火墙
firewalld
RHEL7,linux'系统的动态防火墙管理器;基于cli命令行和gui图形界面管理方式。
默认策略规则
trusted 允许所有的数据包
home拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh、mdns、ipp-client、
amba-client 与 dhcpv6-client 服务相关,则允许流量
internal 等同于 home 区域
work拒绝流入的流量,除非与流出的流量数相关;而如果流量与 ssh、ipp-client 与
dhcpv6-client 服务相关,则允许流量
public拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh、dhcpv6-client 服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh 服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh 服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关
终端管理工具
firewalld-cmd 是 firewalld 防火墙配置管理工具的 CLI(命令行界面)版本。
命令使用参数:
--state 显示当前服务运行状态
--zone=public --list-ports 查看所有打开运行的端口
--reload 不重启立即加载
--list-all-zones 查看区域信息情况
--panic-on 拒绝所有包
--panic-off 取消拒绝状态
--query-panic 查看是否拒绝
--get-default-zone 查询默认的区域名称
--get-zones 显示可用的区域
--get-services 显示预先定义的服务
--get-active-zones 显示当前正在使用的区域与网卡名称
--add-source= 将源自此 IP 或子网的流量导向指定的区域
--remove-source= 不再将源自此 IP 或子网的流量导向某个指定区域
--add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
--add-service=<服务名> 设置默认区域允许该服务的流量
--add-port=<端口号/协议> 设置默认区域允许该端口的流量
--remove-service=<服务名> 设置默认区域不再允许该服务的流量
--remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
--reload 让"永久生效"的配置规则立即生效,并覆盖当前的配置规则
--panic-on 开启应急状况模式
--panic-off 关闭应急状况模式
--permanent 永久生效
查看firewalld服务当前所使用的区域
[root@vm10-0-0-29 ~]# firewall-cmd --get-default-zone
publi
查看eth0网卡在firewalld中的区域
[root@vm10-0-0-29 ~]# firewall-cmd --get-zone-of-interface=eth0
no zone
把 firewalld 服务的当前默认区域设置为 public
[root@linuxprobe ~]# firewall-cmd --set-default-zone=public
success
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
启动/关闭 firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器
时请慎用)
[root@linuxprobe ~]# firewall-cmd --panic-on
success
[root@linuxprobe ~]# firewall-cmd --panic-off
succes
查询 public 区域是否允许请求 SSH 和 HTTPS 协议的流量
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --query-service=https
no
把 firewalld 服务中请求 HTTPS 协议的流量设置为永久允许,并立即生效
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --add-service=https
success
[root@vm10-0-0-29 ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@vm10-0-0-29 ~]# firewall-cmd --reload
success
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --list-services --permanent #查看服务是否永久生效
ssh dhcpv6-client https
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --list-services
ssh dhcpv6-client https
把 firewalld 服务中请求 HTTP 协议的流量设置为永久允许,并立即生效
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --query-service=http
no
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --add-service=http
success
[root@vm10-0-0-29 ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@vm10-0-0-29 ~]# firewall-cmd --reload
success
把 firewalld 服务中请求 HTTP 协议的流量设置为永久拒绝,并立即生效
[root@vm10-0-0-29 ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@vm10-0-0-29 ~]# firewall-cmd --reload
success
设置访问 8080 和 8081 端口的流量策略为允许,但仅限当前生效
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@vm10-0-0-29 ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
把原本访问本机 888 端口的流量转发到 999 端口,要且求当前和长期均有效
语法:
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标 IP 地址>
[root@vm10-0-0-29 ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=999:toaddr=10.0.0.29
success
[root@vm10-0-0-29 ~]# firewall-cmd --list-forward-ports
port=888:proto=tcp:toport=999:toaddr=10.0.0.29
在 172.25.0.0/24 网络中的系统,访问 server0 的本地端口 5423 将被转发到 80 此设置必须永久有效
[root@server0 ~]# firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=172.25.0.0/24 forward-port port=5423 protocol=tcp to-port=80'
[root@server0 ~]# firewall-cmd --reload
[root@server0 ~]# systemctl enable firewalld
删除端口转发
语法:
firewall-cmd --remove-forward-port=port=转发规则
[root@vm10-0-0-29 ~]# firewall-cmd --list-forward-ports port=888:proto=tcp:toport=999:toaddr=10.0.0.29
[root@vm10-0-0-29 ~]# firewall-cmd --remove-forward-port=port=888:proto=tcp:toport=999:toaddr=10.0.0.29
success
[root@vm10-0-0-29 ~]# firewall-cmd --list-forward-ports
iptables
iptables在centos7.2之前的系统使用;之后就换firewall
iptables命令选项输入顺序
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
iptables基本指令参数
-t<表>:指定要操纵的表;
-A:从尾部向规则链中添加条目;
-D:从规则链中删除条目;
-I:从头部向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清除规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;大P
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;小p
-s:指定要匹配的数据包源ip地址;
-d:匹配目标地址
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口
--dport:匹配目标端口
--sport:匹配来源端口
--line-numbers:显示规则编号
iptables四表
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量。
net:地址转换,用于网关路由器。
filter:包过滤,用于防火墙规则。
iptables五链
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。
iptables动作
accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
把 INPUT 规则链的默认策略设置为拒绝
iptables -P INPUT DROP #-p 设置默认策略
当把 INPUT 链设置为默认拒绝后,就要在防火墙策略中写入允许策略了,否则所有到来的流量都会被拒绝掉。另外,需要注意的是,规则链的默认拒绝动作只能是 DROP,而不能是 REJECT
向 INPUT 链中添加允许 ICMP 流量进入的策略规则
iptables -I INPUT -p icmp -j ACCEPT #-I 在规则链头部加入新规则;-j 指定要跳转的目标
把默认策略设置为允许
iptables -P INPUT ACCEPT
将 INPUT 规则链设置为只允许指定网段的主机访问本机的 22 端口
-I 在INPUT规则链加入新策略;-s 匹配数据包源ip地址;-p:小p,匹配协议类型;-j 跳转目标;ACCEPT 接收数据包
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
拒绝来自其他所有主机的流量访问22号端口
iptables -A INPUT -p tcp --dport 22 -j REJECT #-A 向规则链中添加策略;-p:协议类型;--dorp 拒绝;-j 跳转;REJECT 彻底拒绝
向 INPUT 规则链中添加拒绝所有人访问本机 12345 端口的策略规则
iptables -I INPUT -p tcp --dport 12345 -j REJECT
iptables -I INPUT -p udp --dport 12345 -j REJECT
向 INPUT 规则链中添加拒绝 192.168.10.5 主机访问本机 80 端口(Web 服务)的策略
规则;REJECT 彻底拒绝
iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
向 INPUT 规则链中添加拒绝所有主机访问本机 1000~1024 端口的策略规则
iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
加入新规则需要保存
service iptables save
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
将所有iptables以序号标记显示,执行
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行
iptables -D INPUT 8
允许自己ping别人,但是别人ping自己ping不通
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).为了达到目的,需要8出去,允许0进来
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
多端口限制
1、连续端口,iptables默认就支持多个连续端口的规则,ip也可以拿逗号隔开
iptables -A INPUT -s 192.168.122.0/23 -p tcp --dport 21:23 -j ACCEPT #端口21 22 23
2、不连续的端口,iptables有一个mutiport的模块,需要手动指定加载一下
iptables -A INPUT -s 192.168.122.0/23 -p tcp -m multiport --dport 21,23,27,44 -j ACCEPT #端口21 23 27 44
bonding/team聚合链路使网卡负载均衡
[root@server0 ~]# nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'
[root@server0 ~]# nmcli connection add type team-slave con-name team0-eth1 ifname eth1 master team0
[root@server0 ~]# nmcli connection add type team-slave con-name team0-eth2 ifname eth2 master team0
配置IP地址和子网掩码
[root@server0 network-scripts]# vim /etc/sysconfig/network-scripts/ifcfg-team0
BOOTPROTO=static #修改
IPADDR=172.16.0.20 #增加
NETMASK=255.255.255.0 #增加
或
nmcli connection modify team0 ipv4.method manual ipv4.addresses "172.16.0.20/24"
重启服务
模拟down一块网卡
[root@desktop0 ~]# ip link set eth2 up
[root@desktop0 ~]# teamdctl team0 stat
或者手动编辑聚合链路
Vim /etc/sysconfig/network-scripts/网卡名称 #编辑配置第一张网卡
DEVICE=eth0 #网卡名称
BOOTPROTO=none #静态获取ip
ONBOOT=yes #开机启动时激活网卡
HOTPLUG=no #不支持热插拔
MASTER=bond1 #指定此网卡的主配置文件,将这块网卡绑定到bond1这块虚拟网口上
NM_CONTROLLED=no # network mamager的参数,实时生效,不需要重启
USERCTL=no #不允许非root用户控制改设备
SLAVE=yes #表示这块网卡附属于bond1虚拟网口
Vim /etc/sysconfig/network-scripts/网卡名称 #编辑配置第二张网卡
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
HOTPLUG=no
MASTER=bond1
NM_CONTROLLED=no
USERCTL=no
SLAVE=yes
生成bond虚拟网口
1、nmcli connection add type bond ifname bond1 mode 4 #创建bond虚拟网卡名称为bond1,使其负载均衡
2、nmcli connection add type bond-slave ifname 网卡1 master bond1 #添加网卡1到bond1中
3、nmcli connection add type bond-slave ifname 网卡2 master bond1 #添加网卡2到bond1中
4、nmcli connection show #查看详细的链接信息
5、cd /etc/sysconfig/network-scripts/
6、ls
Vim /etc/sysconfig/network-scripts/bond文件 #编辑配置bond文件
DEVICE=bond1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="mode=4 miimon=100 ad_select=1 updelay=200 xmit_hash_policy=2"
IPV6INIT=no
TYPE=Unknown
NM_CONTROLLED=no #不时时生效,打开会导致网络不通
IPADDR= 内网IP
NETMASK= 子网掩码
GATEWAY= 网关地址
远程控制服务
ssh服务
基于口令的验证 --- 用账户和密码来验证登录;
基于密钥的验证 --- 需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全
sshd配置文件中的参数及作用
Port 22 默认的 sshd 服务端口
ListenAddress 0.0.0.0 设定 sshd 服务器监听的 IP 地址
Protocol 2 SSH 协议的版本号
HostKey /etc/ssh/ssh_host_key SSH 协议版本为 1 时,DES 私钥存放的位置
HostKey /etc/ssh/ssh_host_rsa_key SSH 协议版本为 2 时,RSA 私钥存放的位置
HostKey /etc/ssh/ssh_host_dsa_key SSH 协议版本为 2 时,DSA 私钥存放的位置
PermitRootLogin yes 设定是否允许 root 管理员直接登录,改之后需要重启
StrictModes yes 当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6 最大密码尝试次数
MaxSessions 10 最大终端数
PasswordAuthentication yes 是否允许密码验证
PermitEmptyPasswords no 是否允许空密码登录(很不安全)
UseDNS no 不进行dns解析
PasswordAuthentication yes 设置只允许密钥验证登录
安全密钥免密登录
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):按回车键或设置密钥的存储路径
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 直接按回车键或设置密钥的密码
Enter same passphrase again: 再次按回车键或设置密钥的密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
40:32:48:18:e4:ac:c0:c3:c1:ba:7c:6c:3a:a8:b5:22 root@linuxprobe.com
The key's randomart image is:
+--[ RSA 2048]----+
|+*..o . |
|*.o + |
|o* . |
|+ . . |
|o.. S |
|.. + |
|. = |
|E+ . |
|+.o |
+-----------------+
把客户端主机中生成的公钥文件传送至远程主机
[root@localhost ~]# ssh-copy-id 192.168.208.149
The authenticity of host '192.168.208.149 (192.168.208.149)' can't be established.
ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter
out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are
prompted now it is to install the new keys
root@192.168.208.149's password:此处输入远程服务器密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.208.149'"
and check to make sure that only the key(s) you wanted were added
scp远程传输指令
-v 显示详细的连接进度
-P 指定远程主机的 sshd 端口号
-r 用于传送文件夹
-6 使用 IPv6 协议
语法格式:
scp 参数 本地文件 user@ip:存放路径
screen远程会话管理
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num 指定历史回滚缓冲区大小为num行
-list|-ls 列出现有screen会话,格式为pid.tty.host
-d -m 启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname 创建screen会话时为会话指定一个名字
-v 显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话
安装screen
[root@localhost ~]# yum list screen
操作演示
[root@localhost ~]# cd /etc/
[root@localhost /etc]# pwd
/etc
[root@localhost /etc]# screen -S test1 #创建会话窗口test1
[root@localhost /etc]# cd /dev/
[root@localhost /dev]# ls sda*
sda sda1 sda2 sda3 sda4 sda5
[root@localhost /dev]# screen -S test2 #创建会话窗口test2
[root@localhost /dev]# cd /home/
[root@localhost /home]# pwd
/home
[root@localhost /home]# screen -ls #查看有哪些会话窗口
There are screens on:
4402.test2 (Attached)
4383.test1 (Attached)
2 Sockets in /var/run/screen/S-root.
[root@localhost ~]# screen -d 4402 #断开这个会话窗口
[root@localhost ~]# screen -d 4383 #断开这个会话窗口
[root@localhost /etc]# screen -ls #查看有哪些会话窗口
There are screens on:
4402.test2 (Detached)
4383.test1 (Detached)
2 Sockets in /var/run/screen/S-root.
[root@localhost ~]# screen -r test1 #回到test1会话窗口;-r指定窗口名
[root@localhost ~]# screen -r test2
文件传输服务ftp
ftp文件传输协议
20号端口:用于数据传输;
21号端口:接受客户端发出的命令和相关参数;
ftp普遍部署在内网中,容易搭建,方便管理;
ftp两种传输模式
1、主动传输模式:服务器主动连接客户端传输
2、被动传输模式:服务器等待客户端连接
主动模式工作原理:
客户端连接到服务端的21号端口,发送用户和密码,客户端随机开放一个端口1024以上,最后服务器20号端口和客户端的开放端口连接传送数据
被动模式工作原理:
客户端连接服务端所监听的21号端口,发送用户和密码,服务器随机开放1024以上的端口,然后客户端连接服务端所开放的随机端口传送数据
三种访问方式
1、匿名用户访问:是一种不安全的访问,任何人都无需账户和密码直接登录;
2、本地用户访问:通过本地账户和密码认证访问,相对安全;
3、虚拟用户访问:三种访问方式中最安全的一种,需要单独创建用户数据文件,虚拟出口令验证的账户信息,账户信息在服务器上不存在;
实验环境
服务端:192.168.208.128 安装vsftp
客户端:192.168.208.151 安装lftp
关闭防火墙,或放行端口
如不关闭防火墙就放行端口
[root@vsftp /etc/vsftpd]# systemctl start firewalld.service
[root@vsftp /etc/vsftpd]# firewall-cmd --permanent --add-port=1024-65535/tcp
success
[root@vsftp /etc/vsftpd]# firewall-cmd --reload
success
[root@vsftp /etc/vsftpd]# firewall-cmd --list-ports
21/tcp 21/udp 20/tcp 20/udp 1024-65535/tcp
安装配置ftp
服务端安装:
[root@vsftp ~]# yum -y install vsftpd
客户端安装:
[root@ftp ~]# yum -y install lftp
注:从 CentOS 开始,系统镜像中默认没有 ftp 客户端命令。取而代之的是 lftp 命令。
Linux 客户端:
lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp、ftps、http、https、hftp、fish(其
中 ftps 和 https 需要在编译的时候包含 openssl 库),llftp 的界面非常类似一个 Shell,有命令补全、历
史记录、允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进
程下载、等功能
服务端配置文件位置:
/etc/vsftpd/vsftpd.conf #vsftpd核心配置文件
/etc/vsftpd/ftpusers #用于指定哪些用户不能访问 FTP 服务器,即黑名单
/etc/vsftpd/user_list #指定允许使用 VSFTP 的用户列表文件,即白名单
/etc/vsftpd/vsftpd_conf_migrate.sh #是 vsftpd 操作的一些变量和设置脚本
/var/ftp/ #默认情况下匿名用户的根目录
服务端常用配置参数
listen=[YES|NO] 是否以独立运行的方式监听服务
listen_address=IP 地址 设置要监听的 IP 地址
listen_port=21 设置 FTP 服务的监听端口
download_enable=[YES|NO] 是否允许下载文件
userlist_enable=[YES|NO]
userlist_deny=[YES|NO]
设置用户列表为"允许"还是"禁止"操作
max_clients=0 最大客户端连接数,0 为不限制
max_per_ip=0 同一 IP 地址的最大连接数,0 为不限制
anonymous_enable=[YES|NO] 是否允许匿名用户访问
anon_upload_enable=[YES|NO] 是否允许匿名用户上传文件
anon_umask=022 匿名用户上传文件的 umask 值
anon_root=/var/ftp 匿名用户的 FTP 根目录
anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO]
是否开放匿名用户的其他写入权限(包括重命名、删
除等操作权限)
anon_max_rate=0 匿名用户的最大传输速率(字节/秒),0 为不限制
local_enable=[YES|NO] 是否允许本地用户登录 FTP
local_umask=022 本地用户上传文件的 umask 值
local_root=/var/ftp 本地用户的 FTP 根目录
chroot_local_user=[YES|NO] 是否将用户权限禁锢在 FTP 目录,以确保安全
local_max_rate=0 本地用户最大传输速率(字节/秒),0 为不限制
启动ftp服务
[root@vsftp ~]# systemctl start vsftpd
[root@vsftp ~]# systemctl enable vsftpd
[root@vsftp ~]# netstat -natup | grep ftp
tcp6 0 0 :::21 :::* LISTEN 1634/vsftpd
修改ftp共享目录的属主和属组
[root@vsftp ~]# chown -R ftp.ftp /var/ftp/pub/
linux系统客户端连接常用指令
get #从服务端下载单个文件
mger #从服务端批量下载文件
put #从客户端上传单个文件
mput #从客户端上传多个文件
bye #断开两端的链接
rename #重命名远程文件
user username #登录指定用户
其他需求指令跟linux系统操作一样
启用匿名用户访问
[root@vsftp ~]# cd /etc/vsftpd/
[root@vsftp /etc/vsftpd]# cp vsftpd.conf vsftpd.conf.bak
[root@vsftp /etc/vsftpd]# vim vsftpd.conf
找到打开一下配置项
anonymous_enable=YES/NO #允许匿名用户访问/禁止
anon_upload_enable=YES #允许匿名用户上传文件
anon_mkdir_write_enable=YES #允许匿名用户创建目录
anon_other_write_enable=YES #匿名用户修改或删除;如:修改目录;不添加会包550 permission denied没有权限;对自己创建的文件有读写执行权限,
不可以更改删除其他权限
[root@vsftp /etc/vsftpd]# systemctl restart vsftpd
1、浏览器或windows电脑访问ftp://ip;如:ftp://192.168.208.128
2、linux系统客户端访问lftp ip ;如:ftp 192.168.208.128
3、linux系统客户端请勿拿ftp ip访问,lftp比ftp功能多方便
4、以上就是匿名用户常用配置项
本地用户常用参数
这里未有演示
anonymous_enable=NO 禁止匿名访问模式
local_enable=YES 允许本地用户模式
write_enable=YES 设置可写权限
local_umask=022 本地用户模式创建文件的 umask 值
userlist_enable=YES 启用"禁止用户名单",名单文件为 ftpusers 和 user_list
userlist_deny=YES 开启用户作用名单文件功能
虚拟用户方式访问
这种方式是ftp最安全的访问方式
1、创建虚拟用户数据库
需要使用PAM用户数据库来验证虚拟用户,为此要建立一个采用通用数据库格式(db)的文件来存储用户名和密码
①:建立包含虚拟用户名和密码的文本文件。文件中奇数行为用户名,偶数行为对应的密码,用户abc、def的对应密码123、456
[root@vsftp /etc/vsftpd]# pwd
/etc/vsftpd
[root@vsftp /etc/vsftpd]# vim login.txt
[root@vsftp /etc/vsftpd]# cat login.txt
abc
123
def
456
②:将包含虚拟用户的文本文件转换成数据库文件
vsftp服务端检查
1、检查本地ftp是否能链接上,这里本地没问题
[root@vsftp ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
2、检查防火墙;或者关闭防火墙
[root@vsftp ~]# firewall-cmd --list-ports #防火墙未放行端口
[root@vsftp ~]# firewall-cmd --permanent --zone=public --add-port=21/tcp
success
[root@vsftp ~]# firewall-cmd --permanent --zone=public --add-port=21/udp
success
[root@vsftp ~]# firewall-cmd --reload
success
[root@vsftp ~]# firewall-cmd --list-ports
21/tcp 21/udp
ftp客户端再次链接
客户端执行 ftp 命令连接到远程的 FTP 服务器,匿名账户anonymous,密码为空
[root@localhost ~]# ftp 192.168.208.128
Connected to 192.168.208.128 (192.168.208.128).
220 (vsFTPd 3.0.2)
Name (192.168.208.128:root): anonymous #匿名用户登录
331 Please specify the password.
Password:
230 Login successful. #登录成功
只做匿名和虚拟用户登录实验,ftp