命令及概念
作者:互联网
命令
netstat
Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
netstat常见参数
-a (all) 显示所有选项,默认不显示LISTEN相关。
-t (tcp) 仅显示tcp相关选项。
-u (udp) 仅显示udp相关选项。
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服务状态。
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
LISTEN和LISTENING的状态只有用-a或者-l才能看到。
常用netstat相关命令
1、列出所有端口 #netstat -a
2、列出所有 tcp 端口 #netstat -at
3、列出所有 udp 端口 #netstat -au
4、只显示监听端口 #netstat -l
5、只列出所有监听 tcp 端口 #netstat -lt
6、只列出所有监听 udp 端口 #netstat -lu
7、列出所有监听 UNIX 端口 #netstat -lx
8、显示所有端口的统计信息 #netstat -s
9、显示 TCP 或 UDP 端口的统计信息 #netstat -st 或 -su
10、 输出中显示 PID 和进程名称 #netstat -p
11、netstat 输出中不显示主机,端口和用户名 (host, port or user)
当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。
同样可以加速输出,因为不用进行比对查询。
#netstat -an
如果只是不想让这三个名称中的一个被显示,使用以下命令
# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users
12、持续输出 netstat 信息 #netstat -c
13、找出程序运行的端口 #netstat -ap | grep ':80'
14、查看连接某服务端口最多的的IP地址(前20个)
#netstat -nat | grep "10.1.62.23:443" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
15、TCP各种状态列表
#netstat -nat |awk '{print $6}'
统计数量
#netstat -nat |awk '{print $6}'|sort|uniq -c
排序
#netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
16、直接统计tcp数量监听的数量
#netstat -ant | wc -l
wc
Linux wc命令用于计算字数。
利用wc指令我们可以计算文件的Byte数、字数、或是列数
-c或--bytes或--chars 只显示Bytes数。
-l或--lines 显示行数。
-w或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息。
cp
一、cp 命令简介
cp 命令主要用于复制文件或目录。即用来将一个或多个源文件或者目录复制到指定的目的文件或目录。
cp 命令可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。
cp 命令支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
二、cp 命令语法
cp [-options] source_file dest_file
source_file:源文件,制定源文件列表。cp 命令默认情况下不能复制目录,除非使用 -r/-R选项。
dest_file:目标文件,指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。
三、参数说明:
-a :等于 “dpR” 参数组合,通常在复制目录时保留链接、文件属性,并复制目录下的所有内容。
-b:覆盖已存在的文件目标前将目标文件备份;
-d :复制时保留符号链接。
-f :强行复制文件或目录,覆盖已经存在的目标文件而不给出提示。
-i :与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖。
-l :不复制文件,只是生成源文件的硬链接文件。
-p :复制文件时保留源文件或目录的属性。
-r :递归复制目录,即复制该目录及其所有的子目录和文件。
-R :同 -r 选项参数。
-s:对源文件建立符号连接,而非复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-u:同步复制源文件文件,只在源文件更新时或目标文件不存在时复制。
-v:详细显示命令执行的操作。
du
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的.
1.命令格式:
du [选项][文件]
2.命令功能:
显示每个文件和目录的磁盘使用空间。
3.命令参数:
-a或-all 显示目录中个别文件的大小。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k或--kilobytes 以KB(1024bytes)为单位输出。
-m或--megabytes 以MB为单位输出。
-s或--summarize 仅显示总计,只列出最后加总的值。
-h或--human-readable 以K,M,G为单位,提高信息的可读性。
-x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
-S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
-X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
--exclude=<目录或文件> 略过指定的目录或文件。
-D或--dereference-args 显示指定符号链接的源文件大小。
-H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
-l或--count-links 重复计算硬件链接的文件
echo
echo命令用于在屏幕上输出指定内容,通常用于打印变量值,默认换行打印。
常用选项:
-n 不换行打印
-e 解释转义字符
echo显示带颜色,echo命令(带参数-e)
格式如下:
echo -e "\033[字背景颜色;文字颜色m 字符串 \033[0m"
或者
echo -e "\e[字背景颜色;文字颜色m 字符串 \e[0m"
例如:
echo -e "\033[41;36m something here \033[0m"
其中41的位置代表底色, 36的位置是代表字的颜色
1、字背景颜色和文字颜色之间是英文的;
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
4、echo -e 后是英文的""
字颜色:30—–37
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
字背景颜色范围:40—–47
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
最后面控制选项说明
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
例:
让字体变为红色并且不停的闪烁
echo -e "\033[31m \033[05m 请确认您的操作,输入 [Y/N] \033[0m"
或
echo -e "\033[5;31m 请确认您的操作,输入 [Y/N] \033[0m"
另一种写法:
echo -e "\033[47;5;31m 请确认您的操作,输入 [Y/N] \033[0m"
linux下EOF写法梳理
在平时的运维工作中,我们经常会碰到这样一个场景:
执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!
这个时候,就可以使用EOF结合cat命令进行行内容的追加了。
下面就对EOF的用法进行梳理:
EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.
EOF一般会配合cat能够多行文本输出.
其用法如下:
<<EOF //开始
....
EOF //结束
还可以自定义,比如自定义:
<<BBB //开始
....
BBB //结束
通过cat配合重定向能够生成文件并追加操作,在它之前先熟悉几个特殊符号:
< :输入重定向
> :输出重定向
>> :输出重定向,进行追加,不会覆盖之前内容
<< :标准输入来自命令行的一对分隔号的中间内容.
下面通过具体实例来感受下EOF用法的妙处:
1)向文件test.sh里输入内容。
[root@slave-server opt]# cat << EOF >test.sh
> 123123123
> 3452354345
> asdfasdfs
> EOF
[root@slave-server opt]# cat test.sh
123123123
3452354345
asdfasdfs
追加内容
[root@slave-server opt]# cat << EOF >>test.sh
> 7777
> 8888
> EOF
[root@slave-server opt]# cat test.sh
123123123
3452354345
asdfasdfs
7777
8888
覆盖
[root@slave-server opt]# cat << EOF >test.sh
> 55555
> EOF
[root@slave-server opt]# cat test.sh
55555
2)自定义EOF,比如自定义为wang
[root@slave-server opt]# cat << wang > haha.txt
> ggggggg
> 4444444
> 6666666
> wang
[root@slave-server opt]# cat haha.txt
ggggggg
4444444
6666666
3)可以编写脚本,向一个文件输入多行内容
root@slave-server opt]# touch /usr/local/mysql/my.cnf //文件不提前创建也行,如果不存在,EOF命令中也会自动创建
[root@slave-server opt]# vim test.sh
#!/bin/bash
cat > /usr/local/mysql/my.cnf << EOF //或者cat << EOF > /usr/local/mysql/my.cnf
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
EOF
[root@slave-server opt]# sh test.sh //执行上面脚本
[root@slave-server opt]# cat /usr/local/mysql/my.cnf //检查脚本中的EOF是否写入成功
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
下面分享一个自动新建分区并挂载的脚本:
[root@es-node1 ~]# cat auto_add_disk.sh
#!/bin/bash
fdisk /dev/sdb <<EOF
n
p
1
wq
EOF
/sbin/mkfs.ext4 /dev/sdb1 && /bin/mkdir -p /data && /bin/mount /dev/sdb1 /data
echo 'LABEL=data_disk /data ext4 defaults 0 2' >> /etc/fstab
seq
seq命令可以输出连续的数字,或者输出固定间隔的数字,或者输出指定格式的数字,这样说比较模糊,看示例就很容易理解。
s 指定输出的分隔符,默认为\n,即默认为回车换行
-w 指定为定宽输出,不能和-f一起用
-f 按照指定的格式输出,不能和-w一起使用
[root@localhost opt]# seq 1 5
1
2
3
4
5
seq命令还可以实现步进输出 ,比如从1 开始,每次步进 2 ,最大到10,效果如下。
[root@localhost opt]# seq 1 2 10
1
3
5
7
9
-s选项:指定分隔符,下图示例为指定加号为分隔符,输出的数字将会使用"+"连接,默认情况下回车换行(\n)为分隔符。
[root@localhost opt]# seq -s + 1 10
1+2+3+4+5+6+7+8+9+10
-w 选项:指定为定宽输出,例如下图,最大值为15,是两位数,那么不到两位的数前面自动用0补全,当然,如果指定的位数最大为三位数字,那么一位数和两位数前面的位数都会用0补全,也就是说,以最大值的位数为标准宽度,不足标准宽度的数字将会用0补位,示例如下图。
[root@localhost opt]# seq -w 1 15
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
[root@localhost opt]# seq -w 90 110
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
-f选项:按照指定的格式输出生成的数字,在没有使用-f选项指定格式时,默认格式为%g,可以理解为使用-f 指定模式为"%g",跟不指定格式没有任何区别
[root@localhost opt]# seq 8 11
8
9
10
11
[root@localhost opt]# seq -f '%g' 8 11
8
9
10
11
上述示例中,输出的数字没有任何区别,因为在不指定格式的情况下,默认格式为'%g'
那么除了上述的默认格式,我们经常还会使用如下常用格式,"%3g"这种格式表示指定"位宽"为三位,那么数字位数不足部分用空格补位,如下示例中,编号1对应的命令使用的格式为默认格式,与不指定任何格式输出的结果相同,编号2对应的命令使用的格式表示输出的数字位宽固定为3位(三位数),不足三位的数字用空格在数字左侧补齐。
[root@localhost opt]# seq -f '%g' 8 11
8
9
10
11
[root@localhost opt]# seq -f '%3g' 8 11
8
9
10
11
"%02g" 表示指定位宽为两位,数字位数不足用0补位,这种写法跟上述提到的-w选项类似,只不过-w是以指定的最大值的位数为最大位数,而 -f 选项可以直接指定位数,在下例中,我们也对比了-w选项与-f选项的区别。
[root@localhost opt]# seq -w 8 11
08
09
10
11
[root@localhost opt]# seq -f '%02g' 8 11
08
09
10
11
[root@localhost opt]# seq -f '%03g' 8 11
008
009
010
011
[root@localhost opt]# seq -f '%04g' 8 11
0008
0009
0010
0011
上述例子中的格式中,都包含一个'%',其实 % 前面还可以指定字符串。
例如在屏幕上打印5个名为dir1 , dir2 .. dir5 的字符串,这时候就用到这种写法。
[root@localhost opt]# seq -f 'dir%g' 8 11
dir8
dir9
dir10
dir11
所以,结合上述示例中的seq命令的特性,再结合其他命令,就能为我们带来许多方便。
例如一次性创建5个名为dir001 , dir002 .. dir005 的目录,这时候就用到这种写法。
mkdir $(seq -f 'dir%03g' 1 10)
或者如下命令,与上述命令的效果相同。
seq -f 'dir%03g' 1 5 | xargs mkdir
yum
yum的全称为 Yellow dog Updater, Modified,是一个软件包管理器,能够从指定的服务器自动下载rpm包进行安装并且自动处理依赖性关系,yum优点提供了查找、安装、删除某一个、一组甚至全部软件包的命令,并且命令简洁便于使用。
yum clean all ##清除原有yum缓存
yum repolist ##列出仓库信息
yum install software ##安装
yum update ##更新
yum list software ##查看软件
yum list all ##查看所有软件
yum list installed ##列出已安装软件
yum list available ##列出可安装软件
yum reinstall software ##重新安装
yum remove software ##卸载
yum info software ##查看软件信息
yum search software ##根据软件信息查找软件
yum whatprovides file ##根据文件找出包含此文件的软件
yum history ##查看系统中软件管理信息
yum history info 数字 ##对该数字为id的信息进行显示
yum groups list ##列出软件组
yum groups info ##查看软件组的信息
yum groups install sfgroup ##安装软甲组
yum groups remove sfgroup ##卸载软件组
yum install lrzsz --downloadonly --downloaddir=/opt/lrzsz 下载不安装
配置内网yum
- 一个完整包的centos7镜像(镜像下载链接:http://mirrors.aliyun.com/centos/7/isos/x86_64/)
上传镜像到主机空闲路径
一、yum server端配置:
1、安装好nginx或者apache
yum install -y nginx
2、修改nginx配置文件,server配置中增加autoindex on;
[root@localhost yum]# vim /etc/nginx/nginx.conf
server {
listen 80;
listen [::]:80;
server_name _;
autoindex on;
root /usr/share/nginx/html;
Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location server 或 http段中加入
autoindex on;
另外两个参数最好也加上去:
autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间
3、启动nginx服务
systemctl start nginx
4、nginx 的默认文件路径为:/usr/share/nginx/html,在这个目录下 新增一个文件夹,起名为centos7。下面我们会把iso镜像文件挂载在这个目录下
[root@localhost yum]# cd /usr/share/nginx/html/
[root@localhost html]# mkdir centos7
5、上传下载好的镜像到主机上
[root@localhost yum]# pwd
/opt/yum
[root@localhost yum]# ls
CentOS-7-x86_64-Everything-2009.iso
6、挂载iso镜像文件,挂载成功后,可以看到 目录/usr/share/nginx/html/centos7/ 为iso镜像里面的内容。
mount -o loop /opt/yum/CentOS-7-x86_64-Everything-2009.iso /usr/share/nginx/html/centos7/
-o loop:用来把一个文件当成硬盘分区挂接上系统
7、然后用浏览器访问 http://主机ip/centos7/,就能看到我们刚才的挂载的镜像内容了
二、通过镜像配置本地yum源
1、sevser端配置yum
[root@localhost centos7]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir bak
[root@localhost yum.repos.d]# mv *.repo bak
[root@localhost yum.repos.d]# vim local.repo
[base]
name=centos7
baseurl=file///usr/share/nginx/html/centos7
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
2、客户端配置
[root@localhost centos7]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir bak
[root@localhost yum.repos.d]# mv *.repo bak
[root@localhost yum.repos.d]# vim local.repo
[base]
name=centos7
baseurl=http://192.168.1.1/centos7
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
3、每台机器都执行
清除缓存
yum clean all
把服务器的包信息下载到本地缓存起来
yum makecache
Centos7 yum更改为阿里源
下载wget
yum -y install wget
首先备份本地yum源
cd /etc/yum.repos.d/
mkdir bak
mv C* bak/
获取阿里yum源配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
epel源,里面包含一些yum源没有的软件,这里选择这一条命令执行。
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
重新生成yum缓存
yum clean all
yum makecache
centos7最小化安装后优化包
yum install tree nmap dos2unix lrzsz nc lsof wget tcpdump htop iftop iotop sysstat nethogs psmisc net-tools bash-completion vim-enhanced -y
mount
用于挂载Linux系统外的文件
1、mount [-t vfstype] [-o options] 镜像 目录
-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs
2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
3.device 要挂接(mount)的设备。
4.dir设备在系统上的挂接点(mount point)。
3、其他参数
-a:将 /etc/fstab 中定义的所有档案系统挂上。
-F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
-f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
-v:显示较讯息,通常和 -f 用来除错。
umount
umount 用来卸载设备
-a:卸除/etc/mtab中记录的所有文件系统;
-h:显示帮助;
-n:卸除时不要将信息存入/etc/mtab文件中;
-r:若无法成功卸除,则尝试以只读的方式重新挂入文件系统;
-t<文件系统类型>:仅卸除选项中所指定的文件系统;
-v:执行时显示详细的信息; -V:显示版本信息。
–l:并不是马上umount,而是在该目录空闲后再umount。
-f:使用强制卸载
umount -v /dev/sda1 通过设备名卸载
umount -v /mnt/mymount/ 通过挂载点卸载
umount -vl /mnt/mymount/ 延迟卸载
如果报device is busy ,说明你在这个目录下卸载自己 这样肯定不行 退出目录卸载可行 或者 执行延迟卸载
chage
chage命令用于密码实效管理,用来修改帐号和密码的有效期限。它可以修改账号和密码的有效期。
参数 描叙
-d 指定密码最后修改日期
-E 密码到期的日期,过了这天,此账号将不可用。0表示马上过期,-1表示永不过期。
-h 显示帮助信息并退出
-l 列出用户以及密码的有效期
-i 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-m 密码可以更改的最小天数。为零代表任何时候都可以更改密码。
-M 密码保持有效的最大天数。
-W 密码过期前,提前收到警告信息的天数。
设置mysql用户60天后密码过期,至少7天后才能修改密码,密码过期前7天开始收到告警信息。
chage -M 60 -m 7 -W 7 mysql
1、可以编辑/etc/login.defs来设定几个参数,以后设置口令默认就按照参数设定为准:
/etc/login.defs 是设置用户帐号限制的文件。该文件里的配置对root用户无效。/etc/login.defs 文件用于在Linux创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。
需要注意的是,该文件的用户默认配置对 root 用户无效。并且,当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs
PASS_MAX_DAYS 99999 #密码最大有效期
PASS_MIN_DAYS 0 #两次修改密码的最小间隔时间
PASS_MIN_LEN 5 #密码最小长度,对于root无效
PASS_WARN_AGE 7 #密码过期前多少天开始提示
指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
/etc/pam.d/system-auth
2、当然在/etc/default/useradd可以找到如下2个参数进行设置:
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
通过修改配置文件,能对之后新建用户起作用,而目前系统已经存在的用户,则直接用chage来配置。
ping
ping命令用来测试主机之间网络的连通性。执行ping指令会使用ICMP(Internet控制消息协议)传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
命令格式:
ping [参数] [主机名或IP地址]
选项
-d:使用Socket的SO_DEBUG功能;
-c<完成次数>:设置完成要求回应的次数;
-f:极限检测;
-i<间隔秒数>:指定收发信息的间隔时间;
-I<网络界面>:使用指定的网络界面送出数据包;
-l<前置载入>:设置在送出要求信息之前,先行发出的数据包;
-n:只输出数值;
-p<范本样式>:设置填满数据包的范本样式;
-q:不显示指令执行过程,开头和结尾的相关信息除外;
-r:忽略普通的Routing Table,直接将数据包送到远端主机上;
-R:记录路由过程;
-s<数据包大小>:设置数据包的大小;
-t<存活数值>:设置存活数值TTL的大小;
-v:详细显示指令的执行过程。
2秒内ping主机3次
ping -c3 -i2 主机名或IP地址
vim复制粘帖格式错乱问题
Vim 复制粘帖格式错乱问题的解决办法
有时候,复制文本(尤其是代码)到 Vim,会出现格式错乱的问题。看样子,应该是自动缩进惹得祸。
1. paste 模式
运行如下命令,进入 paste 模式:
:set paste
进入 paste 模式后,按 i 键进入插入模式,然后再粘帖,文本格式不会错乱了。但粘帖后还需要按
:set nopaste
修改主机名
临时修改主机名
hostname 名字
bash
永久修改主机名
hostnamectl set-hostname 名字
cat /etc/hostname
文本处理工具
cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt
general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中
grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug"
grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇
grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行
grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug"
sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2"
sed '/^$/d' example.txt 从example.txt文件中删除所有空白行
sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行
echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容
sed -e '1d' result.txt 从文件example.txt 中排除第一行
sed -n '/stringa1/p' 查看只包含词汇 "string1"的行
sed -e 's/ *$//' example.txt 删除每一行最后的空白字符
sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部
sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容
sed -n '5p;5q' example.txt 查看第5行
sed -e 's/00*/0/g' example.txt 用单个零替换多个零
cat -n file1 标示文件的行数
cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行
echo a b c | awk '{print $1}' 查看一行第一栏
echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏
paste file1 file2 合并两个文件或两栏的内容
paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分
sort file1 file2 排序两个文件的内容
sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u 删除交集,留下其他的行
sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容
comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容
comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分
ssh免密登录
copy公钥:
ssh-copy-id -i /root/.ssh/id_rsa.pub root@139.199.228.59
SSH 三步解决免密登录
1.客户端生成公私钥
2.上传公钥到服务器
3.测试免密登录
1.客户端生成公私钥
本地客户端生成公私钥:(一路回车默认即可)
ssh-keygen
上面这个命令会在用户目录.ssh文件夹下创建公私钥
cd ~/.ssh
ls
下创建两个密钥:
- id_rsa (私钥)
- id_rsa.pub (公钥)
2.上传公钥到服务器
这里测试用的服务器地址为:192.168.235.22
用户为:root
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.235.22
上面这条命令是写到服务器上的ssh目录下去了
cd ~/.ssh
cat authorized_keys
可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容。
3、测试免密登录
客户端通过ssh连接远程服务器,就可以免密登录了。
ssh root@192.168.235.22
主机防火墙firewalld
查看防火墙规则:
firewall-cmd --list-all
开放10.11访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.11/32" accept"
开放10.11访问端口22
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.11" port port=22 protocol=tcp accept"
重新载入
firewall-cmd --reload
firewalld配置日志
一,用途:
在生产环境中,firewalld的默认配置是不记录日志
我们通过日志记录下防火墙过滤时拒绝的非法ip,
可以主动把这些有攻击性的ip加入到黑名单,
防患于未然
二,配置firewalld记录被reject包的日志:
修改firewalld的配置文件
[root@blog log]# vi /etc/firewalld/firewalld.conf
设置下面一项的值:
LogDenied=all
说明:
默认值是off,即不记录被拒的包
设置为all,表示记录所有被拒的包
重启firewalld服务,使日志配置生效
[root@blog log]# systemctl restart firewalld.service
验证配置是否生效:
--get-log-denied: 得到记录被拒日志的配置项的值
[root@blog ~]# firewall-cmd --get-log-denied
all
说明配置已生效
三,测试firewalld被拒数据包后是否记录日志
另外找一台机器,telnet到firewalld所在服务器上一个不开放的端口
[lhd@web2 ~]$ telnet 121.122.123.47 22
Trying 121.122.123.47...
telnet: connect to address 121.122.123.47: No route to host
回到原服务器查看denied日志:
[root@blog ~]# dmesg | grep -i reject
[11761159.473094] FINAL_REJECT: IN=eth0 OUT= MAC=00:16:3e:16:7c:a5:ee:ff:ff:ff:ff:ff:08:00 SRC=121.122.123.87 DST=172.17.11.21 LEN=52 TOS=0x10 PREC=0x00 TTL=56 ID=45900 DF PROTO=TCP SPT=28477 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0
...
可以看到未连接成功的请求也被记录下来了
说明:如果是ecs外部有云服务的防火墙,请求到不了主机则不会记录失败的请求
四,配置firewalld的运行时日志到指定的文件:
1,创建firewalld的运行时日志文件
[root@blog log]# vi /etc/rsyslog.d/firewalld.conf
内容:指定日志的路径
kern.* /var/log/firewalld.log
2,配置日志的滚动
[root@blog log]# vi /etc/logrotate.d/syslog
内容:把上面指定的firewalld.log加入进去即可
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/firewalld.log
/var/log/spooler
{
missingok
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}
3,修改完成后重启rsyslog服务
[root@blog rsyslog.d]# systemctl restart rsyslog.service
4,查看日志:
[root@blog log]# more /var/log/firewalld.log
May 25 17:01:15 blog kernel: FINAL_REJECT: IN=eth0 OUT= MAC=00:16:3e:16:7c:a5:ee:ff:ff:ff:ff:ff:08:00 SRC=93.235.100.170 DST=172.17.11.21 LEN=44 TOS=0x14 PREC=0x00 TTL=241 ID=54321 PROTO=TCP SPT=58690 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
...
可以发现有对22端口的试探
因为firewalld未开放22端口,所以被拒绝的同时记录到了日志
centos7磁盘分区、格式化、挂载
fdisk
1、分区:
a. 查看磁盘分区表:
fdisk -l
b. 查看指定磁盘分区表:
fdisk -l /dev/sdb
c. 分区命令:
fdisk /dev/sdb
常用命令:
n:创建新分区
d:删除已有分区
t:修改分区类型
l:查看所有支持的类型
p:显示现有分区信息
w:保存并退出
q:不保存并退出
m:查看帮助信息
d. 创建分区:
#fdisk /dev/sdb
Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
回车
回车
w
2、格式化:
# mkfs #有这么多格式可以参考
#mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat #mkfs.xfs
# 格式化为ext4
mkfs.ext4 /dev/sdb1
3、挂载:
a. 建立一个挂载用的文件夹:
mkdir /data
b. 手动挂载:
mount /dev/sdb1 /data
c. 开机自动挂载:
blkid /dev/sdb1 #查看磁盘UUID
vim /etc/fstab
UUID=dbd975ac-0857-4372-84cf-d707d3638cd6 /data xfs defaults 0 0 #把这个添加进去
# mount -a
parted
为什么我们要用 parted 而不是 fdisk? 它们有什么区别?
parted 支持用户在大于 2TB 的硬盘上创建硬盘分区, 但 fdisk 命令不支持
对比 fdisk 来说,parted 是一个更高级的工具
支持更多的分区表类型,包括 GPT (LCTT 译注:全局唯一标识分区表)
它允许用户调整分区大小, 但当缩减分区空间的时候,它没有如我意料的工作,多数情况下我会得到错误消息。所以我会建议用户不要用 parted 来缩减分区大小。
概念
cpu
逻辑CPU数量 = 物理CPU数量 x CPU核数
查看物理cpu个数
grep 'physical id' /proc/cpuinfo | sort -u | wc -l
查看核心数量
grep 'core id' /proc/cpuinfo | sort -u | wc -l
查看线程数
grep 'processor' /proc/cpuinfo | sort -u | wc -l
1.物理cpu数:主板上实际插入的cpu数量,可以数不重复的 physical id 有几个(physical id)
2.cpu核数:单块CPU上面能处理数据的芯片组的数量,如双核、四核等 (cpu cores)
3.逻辑cpu数:一般情况下,逻辑cpu=物理CPU个数×每颗核数,如果不相等的话,则表示服务器的CPU支持超线程技术(HT:简单来说,它可使处理器中的1 颗内核如2 颗内核那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑cpu=物理CPU个数×每颗核数x2)
swap
swap交换分区:当系统物理内存不足时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。
进程和线程
进程是指在系统中正在运行的一个应用程序,程序一旦运行就是进程。进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间。一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。
进程之间的通信
进程间通信 IPC(管道,信号量,共享内存,消息队列)。
线程是进程的一个实体,是进程的一条执行路径。线程是CPU独立运行和独立调度的基本单位。
线程之间的通信
线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
超线程是在把一个CPU的核变成两个虚拟核用,提高了CPU的运行效率。
进程关联线程数统计说明
1、
通过 /proc/$PID/status 进行查看
通过 /proc/$PID/task 目录下的目录数判断线程数量
2、
ps hH p $PID | wc -l
IO的五种模型
用户空间和内核空间
操作系统的核心是内核,它独立于普通的应用程序,可以访问受保护的内核空间,也有访问底层硬件设备的所有权限。为了保护内核的安全,现在操作系统一般都强制用户进程不能直接操作内核,所以操作系统把内存空间划分成了两个部分:内核空间和用户空间。
所以,当我们使用 TCP 发送数据的时候,需要先将数据从用户空间拷贝到内核空间,再由内核操作将数据从内核空间发送出去;当我们使用 TCP 读取数据的时候,数据先在内核空间准备好,再从内核空间拷贝到用户空间供用户进程使用。
所以,一次 IO 的读取操作分为两个阶段(写入操作类似):
- 等待内核空间数据准备阶段
- 数据从内核空间拷贝到用户空间
为此,Unix 根据这两个阶段又把 IO 分成了以下五种 IO 模型:
- 阻塞型 IO
- 非阻塞型 IO
- IO 多路复用
- 信号驱动 IO
- 异步 IO
阻塞型 IO
阻塞型 IO,即当用户进程发起请求时,一直阻塞直到数据拷贝到用户空间为止才返回。
阻塞型 IO 在两个阶段是连续阻塞着的,直到数据返回。
非阻塞型 IO
非阻塞型 IO,用户进程不断询问内核,数据准备好了吗?一直重试,直到内核说数据准备好了,然后把数据从内核空间拷贝到用户空间,返回成功,开始处理数据。
非阻塞型 IO 第一阶段不阻塞,第二阶段阻塞。
IO 多路复用
IO 多路复用,多个 IO 操作共同使用一个 selector(选择器)去询问哪些 IO 准备好了,selector 负责通知那些数据准备好了的 IO,它们再自己去请求内核数据。
IO 多路复用,第一阶段会阻塞在 selector 上,第二阶段拷贝数据也会阻塞。
信号驱动 IO
信号驱动 IO,用户进程发起读取请求之前先注册一个信号给内核说明自己需要什么数据,这个注册请求立即返回,等内核数据准备好了,主动通知用户进程,用户进程再去请求读取数据,此时,需要等待数据从内核空间拷贝到用户空间再返回。
信号驱动,第一阶段不阻塞,第二阶段阻塞。
异步 IO
异步 IO,用户进程发起读取请求后立马返回,当数据完全拷贝到用户空间后通知用户直接使用数据。
异步 IO,两个阶段都不阻塞。
同步,调用者会被阻塞直到 IO 操作完成,调用的结果随着请求的结束而返回。
异步,调用者不会被阻塞,调用的结果不随着请求的结束而返回,而是通过通知或回调函数的形式返回。
阻塞 / 非阻塞,更关心的是当前线程是不是被挂起。
同步 / 异步,更关心的是调用结果是不是随着请求结束而返回。
所以,阻塞型 IO、非阻塞型、IO 多路复用、信号驱动 IO 都是同步 IO,只有最后一种才是异步 IO。
什么不选择异步 IO?
通过上面的分析,异步 IO 才是最牛的 IO 模型,那么,我们为什么不选择异步 IO 呢?
那是因为异步 IO 在 linux 上还不成熟,而我们的服务器通常都是 linux,所以现在大部分框架都不是很支持异步 IO,包括 Netty 之前实现了一版,但是后面给废弃掉了。
socket阻塞式IO和非阻塞式IO
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
同步:
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。
异步:
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
状态码
3 重定向
301 - 资源(网页等)被永久转移到其它URL
4 请求错误
400 - 客户端请求的语法错误,服务器无法理解
401 - 请求要求用户的身份认证
403 - 服务器理解请求客户端的请求,但是拒绝执行此请求
404 - 请求的资源(网页等)不存在
5 服务器错误
500 - 内部服务器错误
504 - 充当网关或代理的服务器,未及时从远端服务器获取请求
stdin 从标准输入管道读入新的密码
echo “新密码”|passwd 用户名 --stdin
进程
R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思。它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如 进程的描述符、PID 等)。
S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中断进程用
D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
除了以上 5 个状态,进程还包括下面这2 个状态。
第一个是 T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。向一个进程发送 SIGSTOP 信号{使进程暂停(使用SIGCONT让进程重新激活,SIGSTOP不可以捕获)}。,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行)。而当你用调试器(如 gdb)调试一个进程时,在使用断点中断进程后,进程就会变成跟踪状态,这其实也是一种特殊的暂停状态,只不过你可以用调试器来跟踪并按需要控制进程的运行。
另一个是 X,也就是 Dead 的缩写,表示进程已经消亡,所以你不会在 top 或者 ps 命令中看到它。
了解了这些,
HTTP无状态协议
HTTP无状态协议是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
无状态协议是指比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
会话跟踪技术:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
TCP/UDP
概念:
我们常用的网络通讯,比如浏览网页、软件聊天、以及观看的视频都是通过这两种协议来进行数据传输的。
TCP协议和UDP协议都工作在传输层,他们的目标都是在程序之间传输数据。数据可以是文本文件可以是视频,也可以是图片,对于TCP协议和UDP协议来说,都是一堆二进制数,并没有多大的区别。
TCP基于连接:打电话
1、电话接通
2、互相通话
3、结束挂断
UDP基于非连接:写信:
1、对方是否能收到
2、内容是否完整
3、顺序是都正确
区别:
UDP发送数据就是简单的把数据包封装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系。正因为UDP这种简单的处理方式,导致它的性能损耗非常少,对于cpu、内存资源的占用也远小于TCP,但是对于网络传输过程中产生的丢包,UDP协议并不能保证,所以UDP在传输稳定性上要弱于TCP。
TCP:传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如传输文件、发送邮件、浏览网页等
UDP:速度快,但是可能产生丢包,所以适用于对实时性要求较高,但是对少量丢包,并没有太大要求的场景,比如域名查询、语音通话、视频直播等,UDP还有一个非常重要的应用场景,就是隧道网络,如VPN。
TCP的三次握手:
目的是为了建立可靠的通信连接
(1)第一次握手:当客户端向服务端发起连接时,会先发一包连接请求数据,过去询问一下,能否与你建立连接,这包数据我们称之为SYN包,并进入SYN_SEND状态,等待服务端确认。
(2)第二次握手:如果对端同意连接,则回复一包SYN+ACK包,此时服务端进入SYN_RECV状态(SYN_RECEIVED 正在处于连接的初始同步状态[收到对方的SYN,但还没收到自己发过去的SYN的ACK])。
(3)第三次握手:客户端收到后,回复一包ACK包,连接建立,客户端和服务端进入ESTABLISHED状态,完成三次握手。
为什么要三次握手而不是两次握手
服务端回复完SYN+ACK之后就建立连接,这是为了防止因为已失效的请求报文突然又传到服务器引起错误。
假设采用两次握手建立连接,客户端向服务端发送了一个SYN包,来请求建立连接,因为某些未知的原因,并没有到达服务器,在中间某个网络节点产生了滞留,为了建立连接,客户端会重发SYN包,这次的数据包正常送达,服务端回复SYN+ACK之后建立起了连接,但是第一包数据阻塞的网络节点突然恢复,第一包SYN包又送达到服务端,这是服务端会误认为是客户端又发起了一个新的连接,从而在两次握手之后,进入等待数据状态。服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致。如果在三次握手的情况下,服务端收不到最后的ACK包,自然不会认为连接建立成功,所以三次握手本质上来说就是为了解决网络信道不可靠的问题,为了能在不可靠的信道上,建立起可靠的连接。
TCP的四次挥手
为了保证在不可靠的网络链路中,进行可靠的连接断开确认。
处于连接状态的客户端和服务端,都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭
1、第一次挥手:假设客户端主动发起连接关闭请求,他需要向服务端发起一包FIN包,表示要关闭连接,自己进入终止等待1状态(FIN_WAIT_1)。
2、第二次挥手:服务端收到FIN包,发送一包ACK包,表示自己进入了关闭等待状态,客户端进入终止等待 2状态(FIN_WAIT_2)。
3、第三次挥手:服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送一包FIN包,进入最后确认状态(LAST_ACK)。
4、第四次挥手:客户端收到之后回复ACK包,进入超时等待状态(TIME_WAIT),经过超时时间(持续2MSL时间长度)后关闭连接,而服务端收到ACK包后,立即关闭连接
为什么要等待2MSL?
MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。
有以下两个原因:
第一点:保证TCP协议的全双工连接能够可靠关闭:
第二点:保证这次连接的重复数据段从网络中消失
为什么连接的时候是三次握手,关闭的时候却是四次握手?
建立连接时因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。所以建立连接只需要三次握手。
由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式。
这就意味着,关闭连接时,当Client端发出FIN报文段时,只是表示Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报文并返回ACK报文段,表示它已经知道Client端没有数据发送了,但是Server端还是可以发送数据到Client端的,所以Server很可能并不会立即关闭SOCKET,直到Server端把数据也发送完毕。
当Server端也发送了FIN报文段时,这个时候就表示Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
raid卡
在单机时代,采用单块磁盘进行数据存储和读写的方式,由于寻址和读写的时间消耗,导致I/O性能非常低,且存储容量还会受到限制。另外,单块磁盘极其容易出现物理故障,经常导致数据的丢失。因此大家就在想,有没有一种办法将多块独立的磁盘结合在一起组成一个技术方案,来提高数据的可靠性和I/O性能呢。
在这种情况下,RAID技术就应运而生了。
一、RAID 是什么?
RAID ( Redundant Array of Independent Disks )即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。
二、RAID 有哪些?
RAID方案常见的可以分为:
- RAID0
- RAID1
- RAID5
- RAID6
- RAID10
三、下面来分别介绍一下。
RAID0
RAID0 是一种非常简单的的方式,它将多块磁盘组合在一起形成一个大容量的存储。当我们要写数据的时候,会将数据分为N份,以独立的方式实现N块磁盘的读写,那么这N份数据会同时并发的写到磁盘中,因此执行性能非常的高。
RAID0 的读写性能理论上是单块磁盘的N倍(仅限理论,因为实际中磁盘的寻址时间也是性能占用的大头)
但RAID0的问题是,它并不提供数据校验或冗余备份,因此一旦某块磁盘损坏了,数据就直接丢失,无法恢复了。因此RAID0就不可能用于高要求的业务中,但可以用在对可靠性要求不高,对读写性能要求高的场景中。
那有没有可以让存储可靠性变高的方案呢?
有的,下面的RAID1就是。
RAID1
RAID1 是磁盘阵列中单位成本最高的一种方式。因为它的原理是在往磁盘写数据的时候,将同一份数据无差别的写两份到磁盘,分别写到工作磁盘和镜像磁盘,那么它的实际空间使用率只有50%了,两块磁盘当做一块用,这是一种比较昂贵的方案。
RAID1其实与RAID0效果刚好相反。RAID1 这种写双份的做法,就给数据做了一个冗余备份。这样的话,任何一块磁盘损坏了,都可以再基于另外一块磁盘去恢复数据,数据的可靠性非常强,但性能就没那么好了。
了解了RAID0和RAID1之后,我们发现这两个方案都不完美啊。
这时候就该 性能又好、可靠性也高 的方案 RAID5 登场了。
RAID5
这是目前用的最多的一种方式。
因为 RAID5 是一种将 存储性能、数据安全、存储成本 兼顾的一种方案。
在了解RAID5之前,我们可以先简单看一下RAID3,虽然RAID3用的很少,但弄清楚了RAID3就很容易明白RAID5的思路。
RAID3的方式是:将数据按照RAID0的形式,分成多份同时写入多块磁盘,但是还会另外再留出一块磁盘用于写「奇偶校验码」。例如总共有N块磁盘,那么就会让其中额度N-1块用来并发的写数据,第N块磁盘用记录校验码数据。一旦某一块磁盘坏掉了,就可以利用其它的N-1块磁盘去恢复数据。
但是由于第N块磁盘是校验码磁盘,因此有任何数据的写入都会要去更新这块磁盘,导致这块磁盘的读写是最频繁的,也就非常的容易损坏。
RAID5的方式可以说是对RAID3进行了改进。
RAID5模式中,不再需要用单独的磁盘写校验码了。它把校验码信息分布到各个磁盘上。例如,总共有N块磁盘,那么会将要写入的数据分成N份,并发的写入到N块磁盘中,同时还将数据的校验码信息也写入到这N块磁盘中(数据与对应的校验码信息必须得分开存储在不同的磁盘上)。一旦某一块磁盘损坏了,就可以用剩下的数据和对应的奇偶校验码信息去恢复损坏的数据。
RAID5校验位算法原理:P = D1 xor D2 xor D3 … xor Dn (D1,D2,D3 … Dn为数据块,P为校验,xor为异或运算)
RAID5的方式,最少需要三块磁盘来组建磁盘阵列,允许最多同时坏一块磁盘。如果有两块磁盘同时损坏了,那数据就无法恢复了。
RAID6
为了进一步提高存储的高可用,聪明的人们又提出了RAID6方案,可以在有两块磁盘同时损坏的情况下,也能保障数据可恢复。
为什么RAID6这么牛呢,因为RAID6在RAID5的基础上再次改进,引入了双重校验的概念。
RAID6除了每块磁盘上都有同级数据XOR校验区以外,还有针对每个数据块的XOR校验区,这样的话,相当于每个数据块有两个校验保护措施,因此数据的冗余性更高了。
但是RAID6的这种设计也带来了很高的复杂度,虽然数据冗余性好,读取的效率也比较高,但是写数据的性能就很差。因此RAID6在实际环境中应用的比较少。
RAID10
RAID10其实就是RAID1与RAID0的一个合体。
RAID10兼备了RAID1和RAID0的有优点。首先基于RAID1模式将磁盘分为2份,当要写入数据的时候,将所有的数据在两份磁盘上同时写入,相当于写了双份数据,起到了数据保障的作用。且在每一份磁盘上又会基于RAID0技术讲数据分为N份并发的读写,这样也保障了数据的效率。
但也可以看出RAID10模式是有一半的磁盘空间用于存储冗余数据的,浪费的很严重,因此用的也不是很多。
标签:文件,概念,命令,yum,IO,磁盘,033,root 来源: https://www.cnblogs.com/heer22/p/16159999.html