虚拟机
网络适配器
桥接模式:利用本地真实网卡让虚拟机和真实机通信
NAT模式:使用 虚拟网卡8(VMware Network Adapter VMnet8) 来进行通信和使用的
仅主机模式:使用 虚拟网卡1(VMware Network Adapter VMnet1) 来进行通信和使用的
连接方式 | 连接网卡 | 是否能连接本机 | 是否能连接局域网 | 是否能连接公网 |
---|---|---|---|---|
桥接 | 本地真实网卡 | 可以 | 可以 | 可以 |
NAT | VMnet8 | 可以 | 不能 | 可以 |
仅主机 | VMnet1 | 可以 | 不能 | 不能 |
桥接模式:默认自动桥接,可能桥接无线网卡也可能桥接有线网卡,可以去虚拟网络编辑器进行修改
分区
-
磁盘分区
磁盘分区使用分区编辑器在磁盘上划分几个逻辑部分,不同类的目录与文件可以存储进不同的分区
MBR分区表:最大支持2.1TB硬盘,最多支持4个分区
GPT分区表(全局唯一标示分区表):GPT支持9.4ZB硬盘(1ZB-1024PB,1PB=1024EB,1EB=1024TB),理论上支持的分区没有限制,但windows限制128个主分区
- 主分区:最多能有4个
- 扩展分区:
- 最多只能由1个
- 主分区加扩展分区最多有4个
- 不能写入数据,只能包含逻辑分区
- 逻辑分区
-
格式化
格式化又称逻辑格式化,它是根据用户选定的文件系统(如FAT16、FAT32、NTFS、EXT2、EXT3、EXT4等),在磁盘的特定区域写入特定数据,在分区中划出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间
-
硬件设备文件名
硬件 设备文件名 IDE硬盘 /dev/hd[a-d] SCSI/SATA/USB硬盘 /dev/sd[a-p] 光驱 /dev/cdrom 或 /dev/sr() 软盘 /dev/fd[0-1] 打印机(25针) /dev/lp[0-2] 打印机(USB) /dev/usb/lp[0-15] 鼠标 /dev/mouse /dev/sdb5 第二块 SATA 接口硬盘的第一个逻辑分区
-
挂载点(Linux使用已经存在的空目录作为挂载点)(Windows盘符)
挂载:把硬件设备名和它的挂载点(空目录)连起来的过程(相当于Window 给存储设备分配盘符)
所有的空目录,包括新建目录都可以作为挂载点,但是/bin/、/lib/、/etc/ 除外
- 必须分区
- / (根分区)
- swap 分区 (交换分区) (理解成虚拟内存)
- 如果真实内存小于4GB,swap是内存的两倍
- 如果真实内存大于4GB,swap和内存一致
- 实验环境,不大于2GB
- 推荐分区
- /boot (启动分区,1GB)
- 常用分区
- /home (用于文件服务器)
- /www (用于Web服务器)
- 必须分区
配置IP地址
- setup #通过setup工具设置IP地址,注意激活onboot=yes
- service network restart
安装日志
-
/root/install.log:存储了安装在系统中的软件包及其版本信息
-
/root/install.log.syslog:存储了安装过程中留下的事件记录
-
/root/anaconda-ks.cfg:以Kickstart配置文件的格式记录安装过程中设置的选项信息
挂载点 | 大小 |
---|---|
/home | 2000 |
/boot | 200 |
swap | 256 |
/ | 使用全部空间 |
注意事项
Linux不靠拓展名区分文件类型
- 压缩包:Linux 下常见的压缩文件有 *.gz、*.bz2、 *.zip、 *.tar.bz2、 *.tar.bz2、 *.tgz等。
- 二进制软件包:CeenOS中所有使用的二进制安装包是 RPM 包 “.rpm”
- 程序文件:Shell脚本一般用".sh"
- 网页文件:".html" “.php”
Linux中所有的存储设备都必须挂载之后才能使用
Linux中所有的存储设备都有自己的设备文件名,这些设备文件必须挂载之后才能使用,包括硬盘、U盘和光盘。挂载其实就是给这些存储设备分配盘符,只不过Windows中的盘符用英文字母表示,而Linux中的盘符则是一个已经建立的空目录,我们把这些空目录叫做挂载点(可以理解为Windows的盘符),把设备文件(如/dev/sdb)和挂载点(已经建立的空目录)连接的过程叫做挂载
一级目录使用
目录名 | 目录的作用 |
---|---|
/bin/ | 存放系统命令的目录,普通用户和超级用户都可以执行。是/usr/bin/目录的软链接 |
/sbin/ | 存放系统命令的目录,只有超级用户才可以执行。是/usr/sbin/目录的软链接 |
/usr/bin/ | 存放系统命令的目录,普通用户和超级用户都可以执行 |
/usr/sbin/ | 存放系统命令的目录,只有超级用户才可以执行 |
/boot/ | 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等 |
/dev/ | 设备文件保存位置 |
/etc/ | 配置文件保存位置,系统内所有采用默认安装方式(rpm安装)的服务配置文件全部保存在此目录中,如用户信息、服务的启动脚本、常用服务的配置文件等 |
/home/ | 普通用户的家目录。在创建用户时,每个用户都要有一个默认登录和保存自己数据的位置,就是用户的家目录,所有普通用户的宿主目录是在/home/下建立一个和用户名相同的目录。 |
/lib/ | 系统调用的函数库保存位置。是/usr/lib/的软链接 |
/lib64/ | 64位函数库保存位置。是/usr/lib64/的软链接 |
/lost+found/ | 当系统以外崩溃或机器以外关机,而产生一些问价碎片在这里。当系统启动的过程中 fsck 工具会检查这里,并修复已经损坏的文件系统 |
/media/ | 挂载目录。系统建议是用来挂载媒体设备的,如软盘和光盘 |
/misc/ | 挂载目录。系统建议是用来挂载NFS服务的共享目录 |
/mnt/ | 挂载目录。系统建议是用来挂载额外的设备,如U盘、移动硬盘和其他操作系统的分区 |
/opt/ | 第三方安装的软件保存目录。/usr/local/目录也可以装软件 |
/proc/ | 虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存在内存中。主要保存系统的内核、进程、外部设备状态和网络状态等。 |
/sys/ | 虚拟文件系统。和/proc/相似。主要保存与内核相关的信息 |
/root/ | root的宿主目录 |
/srv/ | 服务数据目录。一些服务启动之后,可以在这个目录中保存所需要的数据 |
/tmp/ | 临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入 |
selinux | 限制root权限 |
/run/ | 系统运行时产生的数据,如 ssid、pid等相关数据 |
/usr/ | 系统软件资源目录。usr是 “UNIX Software Resource”,系统中安装的软件大多数保存在这里 |
二级目录作用
目录名 | 目录作用 |
---|---|
/usr/lib/ | 应用程序调用的函数库保存位置 |
/usr/local/ | 手工安装的软件保存位置,建议软件安装在这个位置 |
/usr/share/ | 应用程序的资源保存位置,如帮助文档、使用说明和字体目录 |
/usr/src/ | 源码包保存位置。把手工下载的源码保存到/usr/local/src/目录中,把内核源码保存到/usr/src/kernels/目录中 |
/usr/src/kernels/ | 内核源码保存位置 |
/var/ | 动态数据保存位置。主要保存缓存、日志以及软件运行所产生的文件 |
/var/www/html/ | RPM包安装的Apache的网页主目录 |
/var/lib/ | 程序运行中需要调用或改变的数据保存位置。如MySQL的数据库保存在/var/lib/mysqyl/目录中 |
/var/log/ | 系统日志保存位置 |
/var/run/ | 一些服务和程序运行后,它们的PID(进程ID)保存位置 |
/var/run/ | 放置队列数据的目录。就是排队等待其他程序使用的数据,比如邮件队列和打印机队列 |
/var/spool/mail/ | 新收到的邮件队列保存位置。系统收到的邮件会保存在此目录中 |
/var/spool/cron/ | 系统的定时任务队列保存位置。系统的计划任务保存在这里 |
Linux命令
[root@localhost ~]#
- []:提示符的分隔符号,没有特殊含义
- root:显示当前的登录用户
- @:分割符号,没有特殊含义
- localhost:当前系统的简写主机名(完整:localhost,localdomain)
- ~:用户当前所在的目录
- #:命令提示符。超级用户时#,普通用户时$
目录操作命令
-
ls 命令(list)
作用:显示目录下的内容
-a:显示所有文件
–color=when:支持颜色输出,when的默认是always(总是显示颜色),也可以是never(从不显示颜色)和auto(自动)
-d:显示目录信息,而不是目录下的文件
-h:人性化显示,按照我们习惯的单位显示文件大小
-i:显示文件的i节点号
-l:长格式显示
-R:递归列出子目录
[root@localhost ~]# ls -l 总用量 44 -rw-------. 1 root root 1207 1月14 18:18 anaconda-ks.cfg # 权限 引用计数 所有者 所属组 大小 文件修改时间 文件名
-
cd 命令(change directory)
作用:切换所在目录
~
代表用户的家目录-
代表上次所在目录.
代表当前目录..
代表上级目录 -
pwd 命令(print name of working directory)
作用:查询所在目录
-
mkdir 命令(make directories)
作用:创建目录
-p:递归创建所需目录
-
rmdir 命令(remove empty directories)
作用:删除目录
rm -rf
不论删除的文件还是目录extundelete
可实现Linux下文件/文件夹数据恢复
文件操作命令
-
touch 命令
作用:创建空文件或修改文件时间
-
stat 命令(display file or file system status)
作用:查看文件详细信息
[root@localhost ~]# stat anaconda-ks.cfg 文件:"anaconda-ks.cfg" 大小:1453 块:8 IO 块:4096 普通文件 设备:803h/2051d Inode:33574991 硬链接:1 权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root) 环境:system_u:object_r:admin_home_t:s0 最近访问:2018-11-06 23:22:23.409038121 +0800 最近更改:2018-10-24 00:53:08.760018638 +0800 # 数据修改时间 最近改动:2018-10-24 00:53:08.760018638 +0800 # 状态修改时间 创建时间:-
-
cat 命令(concatenate files and print on the standard output)
作用:查看文件内容
[root@localhost ~]# cat [选项] 文件名 选项: -A: 相当于-vET 选项的整合,用于列出所有隐藏符号 -E: 列出每行结尾的回车符$ -n: 显示行号 -T: 把 Tab 键用^I 显示出来 -v: 列出特殊字符
-
more 命令
作用:分屏显示文件
空格键:向下翻页
b:向上翻页
回车键:向下滚动一行
/字符串:搜索指定的字符串
q:退出
-
less 命令
作用:分行显示文件
-
head 命令
作用:显示文件开头
-n 行数:从文件头开始,显示指定行数
-v:显示文件名
-
tail 命令
作用:显示文件结尾
-n 行数:从文件头开始,显示指定行数
-f:监听文件的新增内容
-
In 命令
作用:在文件之间建立链接
ln [选项] 源文件 目标文件
-s:建立软链接文件。如果不加“-s”选项,则建立硬链接文件(soft)
-f:强制。如果目标文件已经存在,则删除目标文件后建立链接文件
硬链接与软链接的特征
硬链接特征:
- 源文件和硬链接文件拥有相同的 Inode 和 Block
- 修改任意一个文件,另一个都改变
- 删除任意一个文件,另一个都能使用
- 硬链接标记不清,很难确认硬链接文件位置,不建议使用
- 硬链接不能链接目录
- 硬链接不能跨分区
软链接特征:
- 软链接和源文件拥有不同的 Inode 和 Block
- 两个文件修改任意一个,另一个都改变
- 删除软链接,源文件不受影响;删除源文件,软链接不能使用
- 软链接没有实际数据,只保存源文件的 Inode,不论源文件多大,软链接大小不变
- 软链接的权限是最大权限 lrwxrwxrwx.,但是由于没有实际数据,最终访问需要参考源文件权限
- 软链接可以链接目录
- 软链接可以跨分区
- 软链接特征明显,建议使用软链接
目录和文件都能操作的命令
-
rm 命令
作用:删除文件或目录
[root@localhost ~]# rm [选项] 文件或目录 选项: -f: 强制删除(force) -i: 交互删除,在删除之前会询问用户
常用:
rm -rf /tmp/*
-
cp 命令
作用:复制文件或目录
[root@localhost ~]# cp [选项] 源文件 目标文件 选项: -a: 相当于-dpr 选项的集合,这几个选项我们一一介绍 -d: 如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接 -i: 询问,如果目标文件已经存在,则会询问是否覆盖 -p: 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间) -r: 递归复制,用于复制目录
-
mv 命令
作用:移动文件或改名
特殊:没有-r
[root@localhost ~]# mv [选项] 源文件 目标文件 选项: -f: 强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖 -i: 交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项) -v: 显示详细信息
基本权限管理
-
第1位代表文件类型,详细情况可以使用"info ls"命令查看
- “-”:普通文件
- “b”:块设备文件,如/dev/sda1
- “c”:字符设备文件,如鼠标、键盘
- “d”:目录文件
- “l”:软链接文件
- “p”:管道符问阿金
- “s”:套接字文件,如Socket
-
第2~4位代表文件所有者的权限
- r:read
- w:write
- x:execute
如果有字母,则代表拥有对应的权限:如果是“-”,则代表没有对应的权限
-
第5~7位代表文件所属组的权限
-
第8~10位代表其他人的权限
基本权限作用
权限对文件的作用:
- 读(r):一旦对文件有读(r)权限,就可以对文件执行 cat 、more 、less 、head 、tail 等文件查看命令
- 写(w):一旦对文件有写(w)权限,就可以对文件执行 vim 、echo 等修改文件数据的命令
- 执行(x):只要文件有执行(x)权限,这个文件就是执行文件了
权限对目录的作用:
- 读(r):一旦对目录拥有了读(r)权限,就可以在目录下执行 ls 命令,查看目录下的内容了
- 写(w):一旦对目录拥有了写(w)权限,就可以在目录下执行 touch 、rm 、cp 、mv 命令
- 执行(x):如果把权限对应到命令上,那么一旦对目录拥有了执行(x)权限,就可以对目录执行 cd 命令,进入目录
目录可用权限
- 0:任何权限都不赋予
- 5:基本的目录浏览和进入权限
- 7:完全权限
基本权限命令
-
chmod 命令(change file mode bits)
作用:修改文件的权限模式
-
用户身份
- u:代表所有者(user)
- g:代表所属组(group)
- o:代表其他人(other)
- a:代表全部身份(all)
-
赋予方式
- +:加入权限
- -:减去权限
- =:设置权限
-
权限
- r:读取权限(read)
- w:写权限(write)
- x:执行权限(execute)
-
数字权限
- 4:代表“r”权限
- 2:代表“w”权限
- 1:代表“x”权限
-
常用权限
- 644:文件基本权限
- 755:文件的执行权限和目录的基本权限
- 777:最大权限
所有者和所属组命令
-
chmod 755 文件名
添加用户组:useradd 用户名
设置密码:passwd 用户名
-
chown 命令(change file owner and group)
作用:修改文件和目录的所有者和所属组
-
chgrp 命令(change group ownership)
作用:修改文件和目录的所属组
umask默认权限
-
对文件来讲,新建文件的默认最大权限是 666,没有执行(x)权限。这是因为执行权限对文件来讲比较危险,不能在新建文件的时候默认赋予,而必须通过用户手工赋予
-
对目录来讲,新建目录的默认最大权限是 777。这是因为对目录而言,执行(x)权限仅仅代表进入目录,所以即使建立新文件时直接默认赋予,也没有什么危险。
-
文件的默认权限最大只能是 666,而 umask 的值是 022
“-rw-rw-rw-”减去 “-----w–w-”等于“-rw-r–r—” -
目录的默认权限最大可以是 777,而 umask 的值是 022
“drwxrwxrwx”减去“d----w–w-”等于“drwx-r-xr-x
/etc/profile 环境变量配置文件
帮助命令
-
man 命令(manual)
作用:显示联机帮助手册
-f:查看命令拥有哪个级别的帮助
-k:查看和命令相关的所有帮助
man -f 命令 或 whatis 命令
查看命令拥有哪个级别的帮助
man -k 命令 或 apropos 命令
查看和命令相关的所有帮助
快 捷 键 作 用 上箭头 向上移动一行 下箭头 向下移动一行 PgUp 向上翻一页 PgDn 向下翻一页 g 移动到第一页 G 移动到最后一页 q 退出 /字符串 从当前页向下搜索字符串 ?字符串 从当前页向上搜索字符串 n 当搜索字符串时,可以使用 n 键找到下一个字符串 N 当搜索字符串时,使用 N 键反向查询字符串 -
info 命令
完整资料
-
help 命令
只能获取Shell内置命令的帮助,可以用type命令来区分内置命令和外部命令
-
–help 命令
搜索命令
-
whereis 命令
作用:查找二进制命令、源文件和帮助文档,不能搜索普通文件只能所有系统命令
-
which 命令
作用:列出命令所在路径,不能搜索普通文件只能所有系统命令
- 查找二进制命令的同时,查到帮助文档的位置
- 如果这个命令有别名,还可以找到别名命令
alias ls=‘ls --color=auto’
-
locate 命令
作用:按照文件名搜索文件,只能搜普通文件
优点:按照数据库搜索,速度快,数据库位置/var/lib/mlocate/mlocate.db,可以使用updatedb命令强制更新数据库
[root@localhost ~]# vi /etc/updatedb.conf PRUNE_BIND_MOUNTS = "yes" # 开启搜索限制,也就是让这个配置文件生效 PRUNEFS = "……" # 在 locate 执行搜索时,禁止搜索这些文件系统类型 PRUNENAMES = "……" # 在 locate 执行搜索时,禁止搜索带有这些扩展名的文件 PRUNEPATHS = "……" # 在 locate 执行搜索时,禁止搜索这些系统目录
-
find 命令
作用:在目录中搜索文件
一些示例:
[root@localhost ~]# find 搜索路径 [选项] 搜索内容 选项: # 按照文件名搜索 -name: 按照文件名搜索 -iname: 按照文件名搜索,不区分文件名大小写 -inum: 按照 inode 号搜索 # 按照文件大小搜索 -size [+|-]大小: 按照指定大小搜索文件 # 按照修改时间搜索 -atime [+|-]时间: 按照文件访问时间搜索 -mtime [+|-]时间: 按照文件数据修改时间搜索 -ctime [+|-]时间: 按照文件状态修改时间搜索 # 按照权限搜索 -perm 权限模式: 查找文件权限刚好等于“权限模式”的文件 -perm -权限模式: 查找文件权限全部包含“权限模式”的文件 -perm +权限模式: 查找文件权限包含“权限模式”的任意一个权限的文件 # 按照所有者和所属组搜索 -uid 用户 ID: 按照用户 ID 查找所有者是指定 ID 的文件 -gid 组 ID: 按照用户组 ID 查找所属组是指定 ID 的文件 -user 用户名: 按照用户名查找所有者是指定用户的文件 -group 组名: 按照组名查找所属组是指定用户组的文件 -nouser: 查找没有所有者的文件 # 按照文件类型搜索 -type d: 查找目录 -type f: 查找普通文件 -type l: 查找软链接文件 # 逻辑运算符 -a: and 逻辑与 -o: or 逻辑或 -not: not 逻辑非 [root@localhost ~]# find . -size +2k -a -type f # 在当前目录下搜索大于 2KB ,并且文件类型是普通文件的文件 # 其他选项 1)-exec 选项 [root@localhost ~]# find 搜索路径 [选项] 搜索内容 -exec 命令 2 {} \; # 把 find 命令的结果交给由“-exec”调用的命令 2 来处理。“{}”就代表 find 命令的查找结果 2)-ok 选项 # “-ok”的命令 2 在处理前会先询问用户是否这样处理,在得到确认命令后,才会执行
# find命令的单位 -size n[cwbkMG] File uses n units of space. The following suffixes can be used: 'b' for 512-byte blocks (this is the default if no suffix is used) # 这是默认单位,如果单位为 b 或不写单位,则按照 512 Byte 搜索 'c' for bytes # 搜索单位是 c ,按照字节搜索 'w' for two-byte words # 搜索单位是 w ,按照双字节(中文)搜索 'k' for Kilobytes (units of 1024 bytes) # 按照 KB 单位搜索,必须是小写的 k 'M' for Megabytes (units of 1048576 bytes) # 按照 MB 单位搜索,必须是大写的 M 'G' for Gigabytes (units of 1073741824 bytes) # 按照 GB 单位搜索,必须是大写的
mtime 数据修改时间 [+-]的含义 -5:代表 5 天内修改的文件。 5:代表前 5~6 天那一天修改的文件。 +5:代表 6 天前修改的文件
-
grep 命令:补充命令
[root@localhost ~]# grep [选项] "搜索内容" 文件名 选项: -A 数字: 列出符合条件的行,并列出后续的 n 行 -B 数字: 列出符合条件的行,并列出前面的 n 行 -c: 统计找到的符合条件的字符串的次数 -i: 忽略大小写 -n: 输出行号 -v: 反向查找,匹配不包括的所有行 --color=auto 搜索出的关键字用颜色显示
find 命令用于在系统中搜索符合条件的文件名,如果需要模糊查询,则使用通配符进行匹配,通配符是完全匹配
grep 命令用于在文件中搜索符合条件的字符串,如果需要模糊查询,则使用正则表达式进行匹配,正则表达式是包含匹配
通配符:用于匹配文件名,完全匹配
通 配 符 作 用 ? 匹配一个任意字符 * 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容 [] 配中括号中任意一个字符。例如,[abc]代表一定匹配一个字符,或者是 a,或者是 b,或者是 c [-] 匹配中括号中任意一个字符,-代表一个范围。例如,[a-z]代表匹配一个小写字母 [^] 逻辑非,表示匹配不是中括号内的一个字符。例如,[^0-9]代表匹配一个不是数字的字符 正则表达式:用于匹配字符串,包含匹配
正 则 符 作 用 ? 匹配前一个字符重复 0 次,或 1 次(?是扩展正则,需要使用 egrep 命令) shell中只能用egrep,因为这个是扩展正则 * 匹配前一个字符重复 0 次,或任意多次 [] 匹配中括号中任意一个字符。例如,[abc]代表一定匹配一个字符,或者是 a,或者是 b,或者是 c [-] 匹配中括号中任意一个字符,-代表一个范围。例如,[a-z]代表匹配一个小写字母 [^] 逻辑非,表示匹配不是中括号内的一个字符。例如,[^0-9]代表匹配一个不是数字的字符 ^ 匹配行首 $ 匹配行尾 -
管道符:补充命令
命令格式: 命令1 | 命令
作用:命令 1 的正确输出作为命令 2 的操作对象
例子1:经常使用"ll"查看文件的长格式,不过有些目录文件众多,希望分屏显示
# 用输出重定向,把 ll 命令的输出保存到 /root/testfile 文件中 ll -a /etc/ > /root/testfile # 既然 testfile 是文件,当然可以用 more 命令分屏显示了 more /root/testfile # 使用管道符 ll -a /etc/ | more
例子2:命令ll /etc/结果中搜索yum的文件名
ll -a /etc/ | grep yum
例子3:netstat命令
常用:
netstat -tuln
[root@localhost ~]# netstat [选项] 选项: -a: 列出所有网络状态,包括 Socket 程序 -c 秒数: 指定每隔几秒刷新一次网络状态 -n: 使用 IP 地址和端口号显示,不使用域名与服务名 -p: 显示 PID 和程序名 -t: 显示使用 TCP 协议端口的连接状况 -u: 显示使用 UDP 协议端口的连接状况 -l: 仅显示监听状态的连接 -r: 显示路由表
# 如果想知道具体的网络连接数量,就可以再使用 wc 命令统计行数 netstat -an | grep "ESTABLISHED" | wc -l
例子4:统计文件夹、文件数量的命令
# 查看当前目录下的文件数量(不包含子目录中的文件) ls -l | grep "-" | wc -l # 查看当前目录下的文件数量(包含子目录中的文件) 注意:R,代表子目录 ls -lR | grep "^-" | wc -l # 查看当前目录下的文件夹目录个数(不包含子目录中的目录),同上述理,如果需要查看子目录的,加上R ls -l | grep "^d" | wc -l
例子5(附加):查看文件树结构
# 安装tree命令 yum install tree -y tree -d 只显示目录 tree -L 1 只显示第一层目录。
-
命令别名:补充命令
命令格式: [root@localhost ~]# alias #查询命令别名 [root@localhost ~]# alias 别名='原命令' #设定命令别名 例如: [root@localhost ~]# alias ser='service network restart' #用 ser 别名,替代 service network restart 命令 #用 ll 别名,替代 ls -l --color=auto 命令
用命令定义的别名,是临时生效的,要想永久生效,需要写入环境变量配置文件~/.bashrc
-
常见快捷键:补充命令
快捷键 作 用 Tab 键 命令或文件补全 ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用 ctrl+E 把光标移动到命令行结尾 ctrl+C 强制终止当前的命令 ctrl+L 清屏,相当于 clear 命令 ctrl+U 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便 ctrl+Y 粘贴 ctrl+U 剪切的内容
Shell脚本
Bash基本功能
-
历史命令
[root@localhost ~]# history [选项] [历史命令保存文件] 选项: -c: 清空历史命令 -w: 把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文 件,则放入默认历史命令保存文件~/.bash_history 中 [root@localhost ~]# history -c #清空历史命令
[root@localhost ~]# vi /etc/profile …省略部分输出… # 默认保存条数 HISTSIZE=1000 …省略部分输出…
-
命令与文件的补全 tab
-
命令别名 alias
-
Bash常用快捷键
-
输入输出重定向
Bash 的标准输入输出
设备 设备文件名 文件描述符 类型 键盘 /dev/stdin 0 标准输入 显示器 /dev/stdout 1 标准输出 显示器 /dev/stderr 2 标准错误输出 输出重定向
符合 作用 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中 命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中 错误命令 2>文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 错误命令 2>>文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 命令 &>文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 命令 &>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 命令>>文件 1 2>>文件 2 把正确的输出追加到文件 1 中,把错误的输出追加到文件 2 中 输入重定向
[root@localhost ~]# wc [选项] [文件名] 选项: -c 统计字节数 -w 统计单词数 -l 统计行数
-
多命令顺序执行
多命令执行符 格式 作 用 ; 命令 1 ;命令 2 多个命令顺序执行,命令之间没有任何逻辑联系 && 命令 1 &&命令 2 当命令 1 正确执行( ? = 0 ) , 则 命 令 2 才 会 执 行 < b r > 当 命 令 1 执 行 不 正 确 ( ?=0),则命令 2 才会执行<br>当命令 1 执行不正确( ?=0),则命令2才会执行<br>当命令1执行不正确(? ≠ 0),则命令 2 不会执行 || 命令 1 ||命令 2 当命令 1 执行不正确( ? ≠ 0 ) , 则 命 令 2 才 会 执 行 < b r / > 当 命 令 1 正 确 执 行 ( ? ≠ 0),则命令 2 才会执行<br/>当命令 1 正确执行( ?=0),则命令2才会执行<br/>当命令1正确执行(?=0),则命令 2 不会执行 -
管道符
-
通配符
-
Bash中其他特殊符号
符 号 作 用 ‘’ 单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义 “” 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义 `` 反引号。反引号括起来的内容是系统命令,在 Bash 中会先执行它。和 ( ) 作 用 一 样 , 不 过 推 荐 使 用 ()作用一样,不过推荐使用 ()作用一样,不过推荐使用(),因为反引号非常容易看错 $() 和反引号作用一样,用来引用系统命令 () 用于一串命令执行时,()中的命令会在子 Shell 中运行 {} 用于一串命令执行时,{}中的命令会在当前 Shell 中执行。也可以用于变量变形与替换 [] 用于变量的测试 # 在 Shell 脚本中,#开头的行代表注释 $ 用于调用变量的值,如需要调用变量 name 的值时,需要用$name 的方式得到变量的值 \ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用 ()执行一串命令时,需要重新开一个子 shell 进行执行
{}执行一串命令时,是在当前 shell 执行
name=src echo $name # src (name=li;echo $name) # li echo $name # src { name=li;echo $name; } # li echo $name # li
Bash的变量
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头
-
在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型
-
变量用等号连接值,等号左右两侧不能有空格
-
变量的值如果有空格,需要使用单引号或双引号包括
-
在变量的值中,可以使用“\”转义符
-
如果需要增加变量的值,那么可以进行变量的叠加。不过变量需要用双引号包含" 变 量 名 " 或 用 变量名"或用 变量名"或用{变量名}包含变量名,例如:变量值的叠加可以使用两种格式:“ 变 量 名 ” 或 变量名”或 变量名”或{变量名}
-
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
[root@localhost ~]# test=123
[root@localhost ~]# test="$test"456
[root@localhost ~]# echo $test
# 123456
[root@localhost ~]# test=$(date)
[root@localhost ~]# echo $test
#2018 年 10 月 21 日 星期一 20:27:50 CST
字符截取和替换命令
-
cut 提取命令
[root@localhost ~]# cut [选项] 文件名 选项: -f 列号: 提取第几列 -d 分隔符: 按照指定分隔符分割列 -c 字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段提取。“n-”表示从第 n 个字符到行尾;“n-m”从第 n 个字符到第 m个字符;“-m”表示从第 1 个字符到第 m 个字符。
[root@localhost ~]# vi student.txt ID Name gender Mark 1 Liming M 86 2 Sc M 90 3 Tg M 83 # 提取第二列内容 cut -f 2 student.txt # 提取除Name的行并提取第二列内容 grep -v "Name" 123 | cut -f 2 #以“:”作为分隔符,提取/etc/passwd 文件的第一列和第三列 cut -d ":" -f 1,3 /etc/passwd
-
awk编程
printf格式化输出
[root@localhost ~]# printf ‘输出类型输出格式’ 输出内容 输出类型: %ns: 输出字符串。n 是数字指代输出几个字符 %ni: 输出整数。n 是数字指代输出几个数字 %m.nf: 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如%8.2f 代表共输出 8 位数,其中 2 位是小数,6 位是整数。 输出格式: \a: 输出警告声音 \b: 输出退格键,也就是 Backspace 键 \f: 清除屏幕 \n: 换行 \r: 回车,也就是 Enter 键 \t: 水平输出退格键,也就是 Tab 键 \v: 垂直输出退格键,也就是 Tab 键 printf '%s\t %s\t %s\t %s\t \n' $(cat student.txt) #输出第二列和第四列 awk '{printf $2 "\t" $4 "\n"}' student.txt
awk内置变量
awk内置变量 作 用 $0 代表目前 awk 所读入的整行数据。我们已知 awk 是一行一行读入数据的,$0 就代表当前读入行的整行数据 $n 代表目前读入行的第 n 个字段 NF 当前行拥有的字段(列)总数 NR 当前 awk 所处理的行,是总数据的第几行 FS 用户定义分隔符。awk 的默认分隔符是任何空格,如果想要使用其他分隔符(如“:”),就需要 FS 变量定义 cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\t 行号:" NR "\t 字段数:" NF "\n"}' #解释下 awk 命令 #开始执行{分隔符是“:”} {输出第一字段和第三字段 输出行号(NR 值) 字段数(NF 值)} root 0 行号:1 字段数:7 user1 501 行号:2 字段数:7
-
sed命令
sed主要是用来将数据进行选取、替换、删除、新增的命令
[root@localhost ~]# sed [选项] ‘[动作]’ 文件名 选项: -n: 一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过 sed 命令处理的行输出到屏幕。 -e: 允许对输入数据应用多条 sed 命令编辑。 -f 脚本文件名: 从 sed 脚本中读入 sed 操作。和 awk 命令的-f 非常类似。 -r: 在 sed 中支持扩展正则表达式 -i: 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作: a \: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结 c \: 行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结 i \: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结 d: 删除,删除指定的行 p: 打印,输出指定的行 s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/旧字串/新字串/g”(和 vim 中的替换格式类似)。
# 行数据操作,可以利用“p”动作 sed -n '2p' student.txt #删除第二行到第四行的数据 sed '2,4d' student.txt #在第二行后加入 hell sed '2a hello' student.txt #在第二行前插入两行数据 sed '2i helloworld' student.txt #在第三行中,把 74 换成 99 sed '3s/74/99/g' student.txt #同时把“Liming”和“Tg”替换为空 sed -e 's/Liming//g ; s/Tg//g' student.txt #分行书写 sed -e 's/Liming//g > s/Tg//g' student.txt
-
排序命令 sort
[root@localhost ~]# sort [选项] 文件名 选项: -f: 忽略大小写 -b: 忽略每行前面的空白部分 -n: 以数值型进行排序,默认使用字符串型排序 -r: 反向排序 -u: 删除重复行。就是 uniq 命令 -t: 指定分隔符,默认是分隔符是制表符 -k n[,m]: 按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾
#指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序 sort -n -t ":" -k 3,3 /etc/passwd
-
uniq
uniq 命令是用来取消重复行的命令,其实和“sort -u”选项是一样的
[root@localhost ~]# uniq [选项] 文件名 选项: -i: 忽略大小写
条件判断
文件表达式
测试选项 | 作用 |
---|---|
-e | 如果filename存在,则为真 |
-d | 如果filename为目录,则为真 |
-f | 如果filename为普通文件,则为真 |
-L | 如果filename为符号链接,则为真 |
-r | 如果filename可读,则为真 |
-w | 如果filename可写,则为真 |
-x | 如果filename可执行,则为真 |
-s | 如果文件长度不为0,则为真 |
-h | 如果文件是软链接,则为真 |
文件 1 -nt 文件 2 | 如果 filename1比 filename2新,则为真 |
文件 1 -ot 文件 2 | 如果 filename1比 filename2旧,则为真 |
整数变量表达式
测试选项 | 作用 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-ge | 大于等于 |
-lt | 小于 |
-le | 小于等于 |
字符串变量表达式
测试选项 | 作用 |
---|---|
-z 字符串 | 判断字符串是否为空(为空返回真) |
-n 字符串 | 判断字符串是否为非空(非空返回真) |
字串 1 ==字串 2 | 判断字符串 1 是否和字符串 2 相等(相等返回真) |
字串 1 != 字串 2 | 判断字符串 1 是否和字符串 2 不相等(不相等返回真) |
逻辑与或非
测试选项 | 作用 |
---|---|
判断 1 -a 判断 2 | 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真 |
判断 1 -o 判断 2 | 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真 |
!判断 | 逻辑非,使原始的判断式取反 |
流程控制
-
if条件判断
if语句使用fi结尾,和一般语言使用大括号结尾不同
单分支if条件语句
if [ 条件判断式 ] then 程序 fi
df -h | grep /dev/sda3 | awk '{print $5}' | cut -d "%" -f 1 #!/bin/bash rate=$(df -h | grep /dev/sda3 | awk '{print $5}' | cut -d "%" -f 1) if [ rate -ge 10 ] then echo "Warning! /dev/sda3 is full!!" fi
双分支if条件语句
if [ 条件判断式 ] then 条件成立时,执行的程序 else 条件不成立时,执行的另一个程序 fi
多分支if条件语句
if [ 条件判断式 1 ] then 当条件判断式 1 成立时,执行程序 1 elif [ 条件判断式 2 ] then 当条件判断式 2 成立时,执行程序 2 …省略更多条件… else 当所有条件都不成立时,最后执行此程序 fi
-
多分支 case 条件语句
case $变量名 in "值 1") 如果变量的值等于值 1,则执行程序 1 ;; "值 2") 如果变量的值等于值 2,则执行程序 2 :: …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
-
for循环
语法一: for 变量 in 值 1 值 2 值 3… do 程序 done 语法二: for (( 初始值;循环控制条件;变量变化 )) do 程序 done
批量修改文件名
批量创建文件/文件夹
#!/bin/bash
if [ ! -d bcd ];
then
mkdir -p bcd
fi
for (( i=1;i<=5;i=i+1 ))
do
# touch bcd/stu_102999_${i}_finished.jpg
mkdir bcd/stu_102999_${i}_finished
done
# 创建.sh文件
vi mkd.sh
# 改权限
chmod 755 mkd.sh
# 运行
./mkd.sh
用for循环去掉指定字符串
#!/bin/bash
cd \bcd
#for file in `ls ./*.jpg`
for file in `ls ./*`
do
mv ${file} `echo ${file} | sed 's/_/-/g'`
done
TCP/IP 五层常见协议
内网(局域网)可通过内网IP直接访问,外网则需要有公网IP进行访问,公网一般使用域名+端口
网络地址:互联网协议地址(IP地址)为互联网每一个网络或主机分配一个逻辑地址,IP地址工作在网络层
物理地址:物理地址(MAC地址)为每一个设备设置一个固定的硬件地址,MAC地址工作在链路层
OSI层 | 功能 | TCP/IP协议 |
---|---|---|
应用层 | 文件传输、电子邮件、文件服务 | FTP、HTTP、SMTP、Telnet、DNS等 |
传输层 | 提供端对端的接口 | TCP(可靠,面向连接,用于绝大多数常见网络协议)、UDP(不可靠,面向无连接,快速实时性高,比如:QQ聊天 |
网络层 | 为数据包选择路由 | IP、ICMP |
数据链路层 | 传输有地址的帧、错误检测功能 | ARP(IP->MAC)、RARP(MAC->IP) |
物理层 | 物理媒体 | 1000BASE-SX等 |
TCP三次握手
TCP三次握手,A发出前需要确认,B不在就不给发。面向连接是指两个之间都有沟通,B如果发现A发的包是错的,会让A重新发一遍
TCP三次握手通俗理解,C→S:在不在,S→C:我在你在不在,C→S:我在
TCP四次挥手
TCP四次挥手通俗理解,C→S:我要走了,S→C:等下,我看看还有没有数据要传输,C→S:好了,没事了,挂了吧(已经挂了),C→S:挂了
Socket
Socket编程,二进制 + IP + 端口通讯的一种模式
requests -> urlib -> socket
# socket_server.py
import socket
import threading
# 获取主机地址
host = socket.gethostname()
port = 8000
# 创建 TCP/IP 套接字 AF_INET (用于 Internet 进程间通信) AF_UNIX(用于一台机器进程间通信)
# SOCK_STREAM (流式套接字,主要用于TCP协议) SOCK_DGRAM (数据报套接字,主要用于UDP协议)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址 (host, 8000) 到套接字
server.bind((host, 8000))
# 设置最多连接数量
server.listen(1)
def handle_sock(sock, addr):
while True:
# send_data 类型是 str
send_data = input('输入发送内容:')
# send 发送的是 byte类型,需要encode()转换成 byte
sock.send(send_data.encode('utf8'))
# 接受客户端数据 client.recv(1024) 接受的是byte类型,需要decode()转换成文字
print(sock.recv(1024).decode('utf8'))
if send_data == 'byebye':
break
while True:
# 被动接受 TCP 客户端连接
sock, addr = server.accept()
print('连接已经建立')
# 用线程去处理接收的连接(用户)
client_thread = threading.Thread(target=handle_sock, args=(sock, addr))
client_thread.start()
sock.close()
server.close()
# socket_client.py
import socket
host = socket.gethostname()
port = 8000
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, 8000))
print('已连接')
while True:
send_data = input('输入发送内容:')
client.send(send_data.encode('utf8'))
print(client.recv(1024).decode('utf8'))
if send_data == 'byebye':
break
client.close()
网络端口
端口配置文件:/etc/service
端口号 | 服务 | 功能 |
---|---|---|
20/21 | ftp服务 | 文件共享 |
22 | ssh服务 | 安全远程管理 |
23 | telnet服务 | 不安全远程管理 |
25 | smtp:简单邮件传输协议 | 发信 |
465 | smtp(ssl) | 加密发信 |
110 | pop3:邮件协议 | 收信 |
143 | imap4 | 收信 |
993 | imap4(ssl) | 加密收信 |
80 | www服务(http://) | 网页访问 |
443 | www服务(https:// ) | 加密网页访问 |
3306 | mysql端口 | 数据库连接端口 |
53 | DNS端口 | 域名解析端口 |
网关和路由
路由:
- 不同网段数据转发
- 路由选择
网关:
- 不同网段数据转发
- 路由选择
- 默认路由
- NAT转换
route -n
查看系统的路由表信息
临时:
-
添加: route add default gw ip
-
删除: route del default gw ip
永久:
vim
进入之后添加 /etc/sysconfig/network-scripts/ifcfg-eth0 之后 wq(保存并退出)
setup
启动图形设置系统 ,配置好后,之后需要重启一下服务 service network restart
DNS命令
局部: /etc/sysconfig/network-scripts/ifcfg-eth0 之后写 DNS=ip
全局: /etc/resolv.conf 之后写 nameserver ip
-
nslookup 域名解析测试命令
nslookup www.baidu.com
-
netstat 查看系统的网络连接状态、路由信息、接口等
常用选项:
- -a 显示所有活动连接
- -n 以数字形式显示
- -t 查看TCP协议相关信息
- -u 查看UDP协议相关信息
- -p 显示PID和进程名
- -l 监听
-
traceroute:测试从当前主机到目的主机之间经过的网络节点数,用于追踪数据包在网络上传输时的全部路径,它默认发送的数据包大学是40字节,默认使用ICMP协议
常用选项:
- -p 使用UDP端口进行测试,默认端口为33434
- -q3 指定测试时发送的数据包个数(即测试次数)
- -n 以IP的方式进行连接测试,避开DNS的解析
注意:该命令在使用NAT模式时无法实现效果,请切换桥接模式
-
ping:测试网络连通性
常用选项:
- -i 指定间隔时间
- -c 指定Ping的次数
- -s 指定数据包的大小
-
arp:地址解析协议,将ip地址解析成MAC地址
常用选项:
- -a 查看所有
- -d ip地址,删除某条ARP记录
-
nmap:网络探测扫描命令 #次命令默认未安装
常用选项:
- -sP 探测某网段内有哪些主机是存活的
- -sT 探测某主机上开启了哪些TCP端口
远程连接工具
-
Windows -> Linux Xshell、SecureCRT等
-
Linux -> Windows rdesktop命令(图形界面)
-
Linux -> Linux ssh命令
alias vi='vim'
定义别名
SSH
ssh(Secure Shell),是建立在应用层上的安全远程管理协议。ssh是目前较为可靠的传输协议,专为远程登录会话和其他网络服务提供安全性。默认使用22端口,采用密文的形式在网络中传输数据。
密钥对验证流程
- 首先需要在 Client 上创建一对密钥,并需要把公钥放在需要访问的 Server 上
- 当 Client 需要连接 Server 时,Client 端的软件就会向 Server 端发出登录请求,请求是使用密钥对中的公钥进行比较
- Server 收到请求之后,会在该用户的家目录下查询公钥文件,拿 Client 发送过来的公钥和自己家目录下的公钥进行比较
- 如果两个公钥一致,Server 就用公钥加密“challenge(质疑)”,并把它发送给Client 软件。 Client 收到加密内容之后,使用本地私钥进行解密,再把解密结果发给 Server 端, Server 端验证成功后,允许登录
用户密码验证
记得要修改 hostname 要不只能通过 ifconfig 中 ip 来区分
远程主机 ssh root@192.168.88.20
密钥对验证
-
客户端生成密钥对文件
客户端生成密钥对文件ssh-keygen -t rsa -b 2048
- -t 指定加密类型 (rsa/dsa等) (加密 rsa 1024位以内可以暴力破解)
- -b 指定密钥加密长度
- 询问1:执行过程中会询问位置,一般默认保存在当前用户家目录的.ssh/目录下
- 是否对密钥文件进行加密
- 加密:若加密,则在调用密钥文件时需要先验证密钥的密码,密码正确才能使用密钥文件
- 不加密:若不加密,则密钥文件可以直接被调用,整个登录验证过程无需输入任何密码,即为免密登录
-
将公钥文件上传服务器
ssh-copy-id root@192.168.88.20
cd .ssh/
ls
有一个authorized keys -
客户端尝试登录服务器
ssh root@192.168.88.20
工具 —— 新建用户密钥生成向导 —— RSA 2048
vim命令 set nu
为 vim 设置行号, 公钥是一行
**scp:**安全的远程文件复制命令
scp(Secure Copy),用于在Linux下进行远程拷贝文件的命令,类似于命令有cp,scp传输时加密的,所以可能会稍微影响一点速度。scp非常不占资源,不会提高多少系统负荷
scp 本地文件 用户名@服务器IP:目录
scp root@192.168.80.20:/tmp
**sftp:**安全的文件传输协议
sftp(Secure FileTransferProtocol),安全文件传送协议。由于这种传输方式使用了加密/解密技术,所以sftp比ftp更安全一些,但传输效率比普通的FTP要低得多
DHCP
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),是一个工作在应用层的局域网网络协议,数据传输时使用 UDP 不可靠传输协议工作,通常被应用在大型的局域网环境中,主要作用是集中的管理、分配网络资源的管理、分配网络资源,使用网络环境汇总的主机能动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率
-
→ DHCP Discover →
-
← DHCP Offer ←
-
→ DHCP Request →
-
← DHCP ACK(NAK) ←
-
DHCP 客户端进行 IP 请求
当一个DHCP客户机启动时,会自动将自己的IP地址配置0.0.0.0,由于使用0.0.0.0不能进行正常通信,所以客户机就必须通过DHCP服务器来获取一个合法的地址。由于客户机不知道DHCP服务器的IP地址,所以它使用0.0.0.0的地址作为源地址,使用255.255.255.255作为目标地址,使用UDP 67端口来广播请求IP地址信息。广播信息DHCP Discover 中包含了DHCP客户机的MAC地址和计算机名,以便使DHCP服务器确定哪个是客户机发送的请求
-
DHCP服务器响应请求
当DHCP服务器接收到客户机请求IP地址的信息时,它就在自己的IP地址中查找是否有合法的IP地址提供给客户机。如果有,DHCP服务器就讲此IP地址做上标记,加入DHCP Offer的消息中,然后DHCP服务器就广播一则包括下列信息的DHCP Offer信息
DHCP客户机的MAC地址;DHCP服务器提供的合法IP地址;子网掩码;默认网关(路由);租约的期限;DHCP服务器的IP地址——MAC
因为DHCP客户机没有IP地址,所以DHCP服务器使用自己的IP地址作为源地址,使用255.255.255.255作为目标地址,使用UDP68端口作为源端扣来广播DHCP Offer信息
-
DHCP客户机选择IP
DHCP客户机从接收到的第一个DHCP Offer消息中选择IP地址,发出IP地址的DHCP服务器将该地址保留,这样该地址就不能提供给另一个DHCP客户机。当客户机从第一个DHCP服务器接收DHCP Offer并选择IP地址后,DHCP租约的第三过程发生。客户机将DHCP request消息广播到所有的DHCP服务器,表明它接受提供的内容。DHCP request消息包括为该客户机提供IP配置的服务器的服务标识符(IP地址)。DHCP服务器查看服务器标识符字段,以确定它自己是否被选择为指定的客户机提供IP地址,如果那些DHCP Offer被拒绝,则DHCP服务器会取消提供并保留其IP地址以用于下一个IP租约请求。
在客户机选择IP的过程中,虽然客户机选择了IP地址,但是还没有配置IP地址,而在一个网络中可能有几个DHCP服务器,所以 客户机仍然使用 0.0.0.0 的地址作为源地址,使用 255.255.255.255 作为目标地址,使用 UDP 67 端口作为目的端口来广播 DHCP REQUEST 信息 -
DHCP服务器确认租约
服务器确认租约: DHCP ACK
DHCP服务器接收到DHCP request消息后,以DHCP ACK消息的形式向客户机广播成功的确认,该消息包含有IP地址的有效租约和其他可能配置的信息。虽然服务器确认了客户机的租约请求,但是客户机还没有收到服务器的DHCP ACK消息,所以 服务器仍然使用自己的 IP 地址作为源地址,使用 255.255.255.255 作为目标地址,使用 UDP 68 端口作为 源端口来广播 DHCP ACK 信息。当客户机收到DHCP ACK消息时,它就配置了IP地址,完成了TCP/IP的初始化。
服务器 拒绝 租约: DHCP NACK ( DHCP NAK )
如果DHCP request不成功,例如客户机试图租约先前的IP地址,但该IP地址不再可用,或者因为客户机移到其他子网,该IP无效时,DHCP服务器将广播否定确认消息DHCP NACK。当客户机接收到不成功的确认时,它将重新开始DHCP租约过程。
DNS
域名系统(Domain Name System,DNS)是互联网的一项服务。名解析是把域名指向网站空间 IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP 地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替 IP 地址标识站点地址。域名解析就是域名到 IP 地址的转换过程。域名的解析工作由 DNS 服务器完成。可以理解为 DNS 就是翻译官。
正向解析:域名 --> IP 地址
反向解析:IP 地址 --> 域名
域名解析的过程
- 客户机首先查看查找本地 hosts 文件,如果有则返回,否则进行下一步
- 客户机查看本地缓存,是否存在本条目的缓存,如果有则直接返回,否则进行下一步。
- 将请求转发给指向的 DNS 服务器。
- 查看域名是否本地解析,是则本地解析返回,否则进行下一步。
- 本地 DNS 服务器首先在缓存中查找,有则返回,无则进行下一步。
- 向全球 13 个根域服务器发起 DNS 请求,根域返回 org 域的地址列表。
- 使用某一个 org 域的 IP 地址,发起 DNS 请求,org 域返回 kernel 域服务器地址列表。
- 使用某一个 kernel 域 IP 地址,发起 DNS 请求,kernel 域返回 www.kernel.org 主机的 IP 地址,本
地 DNS 服务收到后,返回给客户机,并在本地 DNS 服务器保存一份。
分布式DNS服务器
- 分布式:同一任务,有图步骤共同完成的过程就叫分布式(生产车间中的某一条流水线,流水线上有很多步骤,不同步骤之间就叫分布式)
- 负载均衡:将用户的请求,分配到多个功能相同的 服务器上(一个生产车间中的多条相同功能的流水线)
FTP
FTP(File Transfer Protocol)文件传输协议,用于Internet上的文件的双向传输。使用明文传输
VSFTP(Very SecureFTP)虽然变安全了,但还是使用明文传输
21端口一直处于监听状态
控制连接(持续连接) -> TCP21(命令信道) -> 用户收发FTP命令
数据连接(按需连接) -> TCP20(数据信道) -> 用于上传下载数据
LAMP
Linux + Apache + MySQL + PHP
Apache:实现网页共享传输
MySQL:实现数据存储
PHP:实现网页解析的解析器
yum安装:
- 优点:安装部署便捷,快速
- 缺点:软件版本固定,且版本较低
源码安装:
- 优点:版本可自选,可自定义性强
- 缺点:难度较大,维护相对困难
Apache
支持SSL技术,支持多个虚拟主机。
**HTML语言:**超文本标记语言,使用html语言编写的文本叫超文本,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
**HTTP协议:**超文本传输协议
- HTTP使用统一资源标识符(URL)来建立连接和传输数据。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议
**URL:**统一资源定位符
- 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
客户端通过随机端口连接到Apache的80端口,服务器开启线程进程请求处理,匹配用户的请求是静态还是动态:
- 静态:服务器直接回传页面给客户端
- 动态:服务器 -> PHP -> 回传解析后的页面给客户端
工作模式:Apache一共有3种稳定的MPM模式(多进程处理模块),它们分别是 perfork 、 worker 、event
perfork 工作模式
预先fork一些子进程,然后等待请求进来,之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间内,只能处理一个请求
-
优点:成熟稳定,兼容所有新老模块,同时,不需要担心线程安全的问题
-
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求
worker模式
预先fork几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起perfork有更多的可用线程,表现会更优秀一些
- 优点:占据更少的内存,高并发下更优秀
- 缺点:必须考虑线程安全的问题
event模式
类似worker模式,它解决了keep-alive
在http早期,每个http请求都要求打开一个tcp-socket连接,并且使用一次之后就断开这个tcp连接。设置keepalive_timeout
Nginx
同步和异步的重点在消息通知的方式上,也就是调用结果的通知方式不同。
**同步:**当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行
**异步:**当一个异步调用发出去后,调用者不比一直等待调用结果的返回,异步调用,要想获得结果,一般有两种方式:
- 主动轮询异步调用的结果
- 被调用方通过callback(回调通知)来通知调用方调用结果
实例解释:
同步取快递:小明收到快递将送达的短信,在楼下一直等到快递送达
异步去快递:小明收到快递将送达的短信,快递到楼下后,小明再下楼去取
-
不停的电话问快递小哥到了没有,即主动轮询
-
快递小哥到楼下后,打电话通知小哥,然后小明下楼取快递,即回调通知
阻塞和非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态,还是非挂起状态
- **阻塞:**调用在发出去后,在消息返回之前,当前进进/线程会被挂起,直倒有消息返回,当前进/线程才会被激活
- **非阻塞:**调用在发出去后,不会阻塞当前进/线程,而会立即返回
实例解释:
阻塞取快递:小明收到快递即将送达的消息后,什么事都不做,一直专门等快递
非阻塞去快递:小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信
同步与异步,重点在于消息通知的方式;阻塞和非阻塞,重点在于等消息时候的行为
- 同步阻塞:小明收到信息后,啥都不干,等快递 (Apache默认使用)
- 同步非阻塞:小明收到信息后,边刷微博、边等着取快递
- 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递
- 异步非阻塞:小明收到信息后,边刷微博、边等着快递员通知他取快递 (Nginx默认使用)
大部分程序的 I/O 模型都是同步阻塞的,单个进程每次只能在一个文件描述上执行 I/O 操作,每次 I/O 系统调用都会阻塞,直倒完成数据传输。传统的服务器采用就是同步阻塞的多进程模型。一个 server 采用一个进程负责一个 request 的方式,一个进程负责一个 request ,直到会话结束,进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发
Nginx 采用异步非阻塞的工作方式, I/O 多路复用中的 epoll 模型
当连接有 I/O 事件产生的时候,epoll 就会去告诉进程哪个连接有 I/O 事件产生,然后进程就去处理这个事件
例如:小明家楼下有一个收发室,每次有快递到了,门卫就先代收并做了标记,然后通知小明去取快递
为什么Nginx 比其他 web服务器并发高(Nginx工作原理)
Nginx配置 use epoll后,以异步非阻塞方式工作,能轻松处理百万级的并发连接
处理过程:每次来一个 request,会有一个 worker 进程处理。但不是全程连接,处理可能发生阻塞的地方。比如向后端服务器转发 request,等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的 request 进来,他就会很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件, worker 才会来接手,这个 request 才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的
Nginx是一个高性能HTTP和反向代理web服务器,同时也提供 IMAP/POP3/SMTP 服务
Nginx支持PHP
- Nginx支持fastCGI功能(默认支持)
- PHP编译时开启FPM服务(编译时指定)
- 在Nginx配置文件中添加配置规则(匹配后缀是php)(修改nginx.conf)
nginx有两种工作模式:master-worker模式和单进程模式。在 master-worker 模式下,有一个 master 进程和至少一个的 worker 进程,单进程顾名思义只有一个进程
master-worker模式
该模式下,nginx启动成功后,会有一个 master 进程和至少一个的 worker 进程。 master 进程负责处理系统信号,加载配置,管理 worker 进程(启动,杀死,监控,发送信息/信号灯)。 worker 进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是 worker 进程。生成环境下一般使用这种模式,因为这种模式有以下优点
- 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个 worker 进程挂掉 master 进程会立即启动一个新的 worker 进程,保证 worker 进程数量不变,降低服务中断的概率
- 配合 linux 的 cpu亲和性配置,可以充分利用多核 cpu 的优势,提升性能
- 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热启动)
数据库
数据库:存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据安装一定数据模型组织、描述和存,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享,总结为以下几点:
- 数据结构化
- 数据的共享性高,冗余度低,易扩展
- 数据独立性高
- 数据由DBMS统一管理和控制(安全性、完整性、并发控制、故障恢复)
DBMS数据库管理系统(能够操作和管理数据库的大型软件)
数据库与文件系统区别:
-
管理对象不同:文件系统管理对象是文件,并非直接对数据进行管理,不同的数据结构需要使用不同的文件类型进行保存;而数据库直接对数据进行存储和管理
-
存储方式不同:文件系统使用不同的文件将数据分类(.doc/.mp4/.jpg)保存在外部存储上;数据库系统使用标准统一的数据类型进行数据保存(字母、数字、符号、时间)
-
调用数据的方式不同:文件系统使用不同的软件打开不同类型的文件;数据库系统由DBMS统一调用和管理,如下图:
优缺点总结:
- 由于 DBMS 的存在,用户不需要了解数据存储和其他实现的细节,直接通过DBMS就能获取数据,为数据的使用带来极大便利
- 具有以数据为单位的共享性,具有数据的并发访问能力,DBMS 保证了并发访问时数据的一致性
- 低延时访问,典型例子就是线下支付系统的应用,支付规模巨大的时候,数据库系统的表现远远优于文件系统
- 能够较为频繁的对数据进行修改,在需要频繁修改数据的数据的场景下,数据库系统可以依赖 DBMS 来对数据进行操作且对性能的消耗相比文件系统比文件系统比较少
- 对事务的支持。DBMS 支持事务,即一系列对数据的操作集合要么都完成,要么都不完成。在DBMS上对数据的各种操作都是原子级的
文件系统:
- 表示层:文件(文件类型.txt…)
- 逻辑层:文件系统类型(EXT4/NTFS/xfs)
- 物理层:分区块(数据块 data block) --> 扇区
数据库系统:
- 表示层:数据块-数据表-记录(字段)
- 逻辑层:数据库的存储引擎
- 物理层:数据块文件(*.sql)
数据库物理层相当于文件系统的表示层
常见的数据库
- 关系型数据库
- 关系数据库是建立在关系模型基础上的数据库,借助于代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及各种联系均用关系模型来表示。简单说,关系型数据库是由多张互相连接的二维行列表格组成的数据库
- 关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。当前主流的关系型数据库有 Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、浪潮 K-DB 等。
- 实体关系模型,检测E-R模型,是一套数据库的设计工具,他运用真实世界中事物与关系的观念,来解释数据库中的抽象的数据架构
- 非关系型数据库
- 非关系型数据库:又称NoSQL,是一种轻量、开源、不兼容SQL功能的数据库,对NoSQL最普遍的定义是“非关联型的”,强调 Key-Value 存储和文档数据库的优点,而不是单纯地反对 RDBMS(关系型数据库管理系统)
关系型数据库的发展历程
-
层次模型
-
网络模型
-
关系模型
在关系模型中基本数据结构就是二维表,不像层次或网络那样的链接指针,记录之间的联系是通过不同关系中同名属性来体现的
关系型数据的组成和名词解释
数据以表格的形式出现,每行为单独的一条记录,每列为一个单独的字段,许多的记录和字段组成一张表达(table),若干的表达组成库(database)
-
记录(一条数据)
在数据库中,表当中的行称为记录
-
字段(id name …)
在数据库中,表当中的列称为字段
-
MySQL数据类型
- 字符串类型(CHAR(0-255固定长度)),VARCHAR(0-255可变长度)
- 数值类型(INT(整数型)、FLOAT(浮点型))
- 日期和时间类型(DATE(年月日)、TME(时分秒))
MySQL约束类型
约束是一种限制,它通过表的行或列的数据做出限制,来确保表的数据的完整性、唯一性
- 主键约束 primary key:相当于唯一约束 + 非空约束的组合,主键约束不允许重复,也不允许出现空值。每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引
- 外键约束 foreign key:保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段的参照关系
- 唯一约束 unique:指定 table 的列或列组合不能重复,保证数据的唯一性。唯一约束不允许出现重复的值,如果可以为多个null。同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。唯一约束不仅可以在一个表内创建,而且可以同时多表创建唯一约束
- 非空约束 not null 与默认值 default:用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。Null类型特征:所有的类型的值都可以是null,包括int、float等数据类型
MySQL索引,建立合理的索引,就能加速数据的检索过程
MySQL锁
-
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制可能会读取和存储不正确的数据,破坏数据库的一致性。
-
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据进行更新操作
MySQL的存储引擎
-
MYUSAM:默认引擎、插入和查询速度较快,支持全文索引,不支持事务、行级锁和外键约束等功能
-
INNODE:支持事务、行级锁和外键约束等功能
-
MEMORY:工作在内存中,通过散列字段保存数据,速度快、不能永久保存数据
事务(Transaction)是并发控制的基本单位
- 可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行